summaryrefslogtreecommitdiff
path: root/refs.c
diff options
context:
space:
mode:
authorRené Scharfe <rene.scharfe@lsrfire.ath.cx>2012-10-16 10:22:15 (GMT)
committerJunio C Hamano <gitster@pobox.com>2012-10-16 17:08:23 (GMT)
commit547d058fb6fefad147675a6d3fdb9439c57916a1 (patch)
tree65dc80d8a08aacc7e6e61ac394894bac02fcbdb7 /refs.c
parent0ce2e396ee9fb0fa07e8381b338e49859dbf03db (diff)
downloadgit-547d058fb6fefad147675a6d3fdb9439c57916a1.zip
git-547d058fb6fefad147675a6d3fdb9439c57916a1.tar.gz
git-547d058fb6fefad147675a6d3fdb9439c57916a1.tar.bz2
refs: lock symref that is to be deleted, not its target
When delete_ref is called on a symref then it locks its target and then either deletes the target or the symref, depending on whether the flag REF_NODEREF was set in the parameter delopt. Instead, simply pass the flag to lock_ref_sha1_basic, which will then either lock the target or the symref, and delete the locked ref. This reimplements part of eca35a25 (Fix git branch -m for symrefs.). Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'refs.c')
-rw-r--r--refs.c18
1 files changed, 5 insertions, 13 deletions
diff --git a/refs.c b/refs.c
index da74a2b..9d1685b 100644
--- a/refs.c
+++ b/refs.c
@@ -1753,26 +1753,18 @@ int delete_ref(const char *refname, const unsigned char *sha1, int delopt)
struct ref_lock *lock;
int err, i = 0, ret = 0, flag = 0;
- lock = lock_ref_sha1_basic(refname, sha1, 0, &flag);
+ lock = lock_ref_sha1_basic(refname, sha1, delopt, &flag);
if (!lock)
return 1;
if (!(flag & REF_ISPACKED) || flag & REF_ISSYMREF) {
/* loose */
- const char *path;
-
- if (!(delopt & REF_NODEREF)) {
- i = strlen(lock->lk->filename) - 5; /* .lock */
- lock->lk->filename[i] = 0;
- path = lock->lk->filename;
- } else {
- path = git_path("%s", refname);
- }
- err = unlink_or_warn(path);
+ i = strlen(lock->lk->filename) - 5; /* .lock */
+ lock->lk->filename[i] = 0;
+ err = unlink_or_warn(lock->lk->filename);
if (err && errno != ENOENT)
ret = 1;
- if (!(delopt & REF_NODEREF))
- lock->lk->filename[i] = '.';
+ lock->lk->filename[i] = '.';
}
/* removing the loose one could have resurrected an earlier
* packed one. Also, if it was not loose we need to repack