Skip to content

Commit

Permalink
git branch -m: forbid renaming of a symref
Browse files Browse the repository at this point in the history
There may be cases where one would really want to rename the symbolic
ref without changing its value, but "git branch -m" is not such a
use-case.

Signed-off-by: Miklos Vajna <vmiklos@frugalware.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Miklos Vajna authored and Junio C Hamano committed Oct 30, 2008
1 parent 569740b commit fa58186
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 20 deletions.
29 changes: 13 additions & 16 deletions refs.c
Original file line number Diff line number Diff line change
Expand Up @@ -964,14 +964,14 @@ int rename_ref(const char *oldref, const char *newref, const char *logmsg)
struct stat loginfo;
int log = !lstat(git_path("logs/%s", oldref), &loginfo);
const char *symref = NULL;
int is_symref = 0;

if (log && S_ISLNK(loginfo.st_mode))
return error("reflog for %s is a symlink", oldref);

symref = resolve_ref(oldref, orig_sha1, 1, &flag);
if (flag & REF_ISSYMREF)
is_symref = 1;
return error("refname %s is a symbolic ref, renaming it is not supported",
oldref);
if (!symref)
return error("refname %s not found", oldref);

Expand Down Expand Up @@ -1035,20 +1035,17 @@ int rename_ref(const char *oldref, const char *newref, const char *logmsg)
}
logmoved = log;

if (!is_symref) {
lock = lock_ref_sha1_basic(newref, NULL, 0, NULL);
if (!lock) {
error("unable to lock %s for update", newref);
goto rollback;
}
lock->force_write = 1;
hashcpy(lock->old_sha1, orig_sha1);
if (write_ref_sha1(lock, orig_sha1, logmsg)) {
error("unable to write current sha1 into %s", newref);
goto rollback;
}
} else
create_symref(newref, symref, logmsg);
lock = lock_ref_sha1_basic(newref, NULL, 0, NULL);
if (!lock) {
error("unable to lock %s for update", newref);
goto rollback;
}
lock->force_write = 1;
hashcpy(lock->old_sha1, orig_sha1);
if (write_ref_sha1(lock, orig_sha1, logmsg)) {
error("unable to write current sha1 into %s", newref);
goto rollback;
}

return 0;

Expand Down
8 changes: 4 additions & 4 deletions t/t3200-branch.sh
Original file line number Diff line number Diff line change
Expand Up @@ -112,13 +112,13 @@ test_expect_success 'config information was renamed, too' \
"test $(git config branch.s.dummy) = Hello &&
test_must_fail git config branch.s/s/dummy"

test_expect_success 'renaming a symref' \
test_expect_success 'renaming a symref is not allowed' \
'
git symbolic-ref refs/heads/master2 refs/heads/master &&
git branch -m master2 master3 &&
git symbolic-ref refs/heads/master3 &&
test_must_fail git branch -m master2 master3 &&
git symbolic-ref refs/heads/master2 &&
test -f .git/refs/heads/master &&
! test -f .git/refs/heads/master2
! test -f .git/refs/heads/master3
'

test_expect_success \
Expand Down

0 comments on commit fa58186

Please sign in to comment.