зеркало из https://github.com/microsoft/git.git
Merge branch 'ci/forbid-unwanted-current-branch-update'
* ci/forbid-unwanted-current-branch-update: branch --set-upstream: regression fix
This commit is contained in:
Коммит
c103e9529c
17
branch.c
17
branch.c
|
@ -135,23 +135,25 @@ static int setup_tracking(const char *new_ref, const char *orig_ref,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int validate_new_branchname(const char *name, struct strbuf *ref, int force)
|
int validate_new_branchname(const char *name, struct strbuf *ref,
|
||||||
|
int force, int attr_only)
|
||||||
{
|
{
|
||||||
const char *head;
|
|
||||||
unsigned char sha1[20];
|
|
||||||
|
|
||||||
if (strbuf_check_branch_ref(ref, name))
|
if (strbuf_check_branch_ref(ref, name))
|
||||||
die("'%s' is not a valid branch name.", name);
|
die("'%s' is not a valid branch name.", name);
|
||||||
|
|
||||||
if (!ref_exists(ref->buf))
|
if (!ref_exists(ref->buf))
|
||||||
return 0;
|
return 0;
|
||||||
else if (!force)
|
else if (!force && !attr_only)
|
||||||
die("A branch named '%s' already exists.", ref->buf + strlen("refs/heads/"));
|
die("A branch named '%s' already exists.", ref->buf + strlen("refs/heads/"));
|
||||||
|
|
||||||
|
if (!attr_only) {
|
||||||
|
const char *head;
|
||||||
|
unsigned char sha1[20];
|
||||||
|
|
||||||
head = resolve_ref("HEAD", sha1, 0, NULL);
|
head = resolve_ref("HEAD", sha1, 0, NULL);
|
||||||
if (!is_bare_repository() && head && !strcmp(head, ref->buf))
|
if (!is_bare_repository() && head && !strcmp(head, ref->buf))
|
||||||
die("Cannot force update the current branch.");
|
die("Cannot force update the current branch.");
|
||||||
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -171,7 +173,8 @@ void create_branch(const char *head,
|
||||||
if (track == BRANCH_TRACK_EXPLICIT || track == BRANCH_TRACK_OVERRIDE)
|
if (track == BRANCH_TRACK_EXPLICIT || track == BRANCH_TRACK_OVERRIDE)
|
||||||
explicit_tracking = 1;
|
explicit_tracking = 1;
|
||||||
|
|
||||||
if (validate_new_branchname(name, &ref, force || track == BRANCH_TRACK_OVERRIDE)) {
|
if (validate_new_branchname(name, &ref, force,
|
||||||
|
track == BRANCH_TRACK_OVERRIDE)) {
|
||||||
if (!force)
|
if (!force)
|
||||||
dont_change_ref = 1;
|
dont_change_ref = 1;
|
||||||
else
|
else
|
||||||
|
|
12
branch.h
12
branch.h
|
@ -20,8 +20,18 @@ void create_branch(const char *head, const char *name, const char *start_name,
|
||||||
* interpreted ref in ref, force indicates whether (non-head) branches
|
* interpreted ref in ref, force indicates whether (non-head) branches
|
||||||
* may be overwritten. A non-zero return value indicates that the force
|
* may be overwritten. A non-zero return value indicates that the force
|
||||||
* parameter was non-zero and the branch already exists.
|
* parameter was non-zero and the branch already exists.
|
||||||
|
*
|
||||||
|
* Contrary to all of the above, when attr_only is 1, the caller is
|
||||||
|
* not interested in verifying if it is Ok to update the named
|
||||||
|
* branch to point at a potentially different commit. It is merely
|
||||||
|
* asking if it is OK to change some attribute for the named branch
|
||||||
|
* (e.g. tracking upstream).
|
||||||
|
*
|
||||||
|
* NEEDSWORK: This needs to be split into two separate functions in the
|
||||||
|
* longer run for sanity.
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
int validate_new_branchname(const char *name, struct strbuf *ref, int force);
|
int validate_new_branchname(const char *name, struct strbuf *ref, int force, int attr_only);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Remove information about the state of working on the current
|
* Remove information about the state of working on the current
|
||||||
|
|
|
@ -566,7 +566,7 @@ static void rename_branch(const char *oldname, const char *newname, int force)
|
||||||
die(_("Invalid branch name: '%s'"), oldname);
|
die(_("Invalid branch name: '%s'"), oldname);
|
||||||
}
|
}
|
||||||
|
|
||||||
validate_new_branchname(newname, &newref, force);
|
validate_new_branchname(newname, &newref, force, 0);
|
||||||
|
|
||||||
strbuf_addf(&logmsg, "Branch: renamed %s to %s",
|
strbuf_addf(&logmsg, "Branch: renamed %s to %s",
|
||||||
oldref.buf, newref.buf);
|
oldref.buf, newref.buf);
|
||||||
|
|
|
@ -1073,7 +1073,8 @@ int cmd_checkout(int argc, const char **argv, const char *prefix)
|
||||||
if (opts.new_branch) {
|
if (opts.new_branch) {
|
||||||
struct strbuf buf = STRBUF_INIT;
|
struct strbuf buf = STRBUF_INIT;
|
||||||
|
|
||||||
opts.branch_exists = validate_new_branchname(opts.new_branch, &buf, !!opts.new_branch_force);
|
opts.branch_exists = validate_new_branchname(opts.new_branch, &buf,
|
||||||
|
!!opts.new_branch_force, 0);
|
||||||
|
|
||||||
strbuf_release(&buf);
|
strbuf_release(&buf);
|
||||||
}
|
}
|
||||||
|
|
|
@ -554,4 +554,17 @@ test_expect_success 'attempt to delete a branch merged to its base' '
|
||||||
test_must_fail git branch -d my10
|
test_must_fail git branch -d my10
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'use set-upstream on the current branch' '
|
||||||
|
git checkout master &&
|
||||||
|
git --bare init myupstream.git &&
|
||||||
|
git push myupstream.git master:refs/heads/frotz &&
|
||||||
|
git remote add origin myupstream.git &&
|
||||||
|
git fetch &&
|
||||||
|
git branch --set-upstream master origin/frotz &&
|
||||||
|
|
||||||
|
test "z$(git config branch.master.remote)" = "zorigin" &&
|
||||||
|
test "z$(git config branch.master.merge)" = "zrefs/heads/frotz"
|
||||||
|
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
|
Загрузка…
Ссылка в новой задаче