Merge branch 'rs/lock-correct-ref-during-delete'
authorJeff King <peff@peff.net>
Fri, 9 Nov 2012 17:42:28 +0000 (12:42 -0500)
committerJeff King <peff@peff.net>
Fri, 9 Nov 2012 17:42:28 +0000 (12:42 -0500)
When "update-ref -d --no-deref SYM" tried to delete a symbolic ref
SYM, it incorrectly locked the underlying reference pointed by SYM,
not the symbolic ref itself.

* rs/lock-correct-ref-during-delete:
refs: lock symref that is to be deleted, not its target

1  2 
refs.c
diff --combined refs.c
index 02e47b1157c367f9233ae88870b9a43cbe1a7d52,9d1685bcba4ca0381dd9d0990a97046b56324aed..726c53c540a94c6ac994aa768c1ffb355ca4538e
--- 1/refs.c
--- 2/refs.c
+++ b/refs.c
@@@ -1202,8 -1202,6 +1202,8 @@@ int peel_ref(const char *refname, unsig
        if (current_ref && (current_ref->name == refname
                || !strcmp(current_ref->name, refname))) {
                if (current_ref->flag & REF_KNOWS_PEELED) {
 +                      if (is_null_sha1(current_ref->u.value.peeled))
 +                          return -1;
                        hashcpy(sha1, current_ref->u.value.peeled);
                        return 0;
                }
        }
  
  fallback:
 -      o = parse_object(base);
 -      if (o && o->type == OBJ_TAG) {
 -              o = deref_tag(o, refname, 0);
 +      o = lookup_unknown_object(base);
 +      if (o->type == OBJ_NONE) {
 +              int type = sha1_object_info(base, NULL);
 +              if (type < 0)
 +                      return -1;
 +              o->type = type;
 +      }
 +
 +      if (o->type == OBJ_TAG) {
 +              o = deref_tag_noverify(o);
                if (o) {
                        hashcpy(sha1, o->sha1);
                        return 0;
@@@ -1762,26 -1753,18 +1762,18 @@@ int delete_ref(const char *refname, con
        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