lock_ref_sha1_basic(): only handle REF_NODEREF mode

Now lock_ref_sha1_basic() is only called with flags==REF_NODEREF. So we don't have to handle other cases anymore. This enables several simplifications, the most interesting of which come from the fact that ref_lock::orig_ref_name is now always the same as ref_lock::ref_name: * Remove ref_lock::orig_ref_name * Remove local variable orig_refname from lock_ref_sha1_basic() * ref_name can be initialize once and its value reused * commit_ref_update() never has to write to the reflog for lock->orig_ref_name Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>

Michael Haggerty committed Apr 22, 2016 at 15:25 UTC 7a418f3a17b95746eb94cfd55f4fe0385d058777
1 file changed +20 -34
refs/files-backend.c
+20 -34
@@ -7,7 +7,6 @@
7
8 struct ref_lock {
9 char *ref_name;
10 - char *orig_ref_name;
10 struct lock_file *lk;
11 struct object_id old_oid;
12 };
@@ -1522,7 +1521,6 @@ static void unlock_ref(struct ref_lock *lock)
1521 if (lock->lk)
1522 rollback_lock_file(lock->lk);
1523 free(lock->ref_name);
1525 - free(lock->orig_ref_name);
1524 free(lock);
1525 }
1526
@@ -1576,7 +1574,6 @@ static int lock_raw_ref(const char *refname, int mustexist,
1574 *lock_p = lock = xcalloc(1, sizeof(*lock));
1575
1576 lock->ref_name = xstrdup(refname);
1579 - lock->orig_ref_name = xstrdup(refname);
1577 strbuf_git_path(&ref_file, "%s", refname);
1578
1579 retry:
@@ -1969,14 +1966,13 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname,
1966 struct strbuf *err)
1967 {
1968 struct strbuf ref_file = STRBUF_INIT;
1972 - struct strbuf orig_ref_file = STRBUF_INIT;
1973 - const char *orig_refname = refname;
1969 struct ref_lock *lock;
1970 int last_errno = 0;
1976 - int lflags = 0;
1971 + int lflags = LOCK_NO_DEREF;
1972 int mustexist = (old_sha1 && !is_null_sha1(old_sha1));
1978 - int resolve_flags = 0;
1973 + int resolve_flags = RESOLVE_REF_NO_RECURSE;
1974 int attempts_remaining = 3;
1975 + int resolved;
1976
1977 assert(err);
1978
@@ -1986,46 +1982,39 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname,
1982 resolve_flags |= RESOLVE_REF_READING;
1983 if (flags & REF_DELETING)
1984 resolve_flags |= RESOLVE_REF_ALLOW_BAD_NAME;
1989 - if (flags & REF_NODEREF) {
1990 - resolve_flags |= RESOLVE_REF_NO_RECURSE;
1991 - lflags |= LOCK_NO_DEREF;
1992 - }
1985
1994 - refname = resolve_ref_unsafe(refname, resolve_flags,
1995 - lock->old_oid.hash, type);
1996 - if (!refname && errno == EISDIR) {
1986 + strbuf_git_path(&ref_file, "%s", refname);
1987 + resolved = !!resolve_ref_unsafe(refname, resolve_flags,
1988 + lock->old_oid.hash, type);
1989 + if (!resolved && errno == EISDIR) {
1990 /*
1991 * we are trying to lock foo but we used to
1992 * have foo/bar which now does not exist;
1993 * it is normal for the empty directory 'foo'
1994 * to remain.
1995 */
2003 - strbuf_git_path(&orig_ref_file, "%s", orig_refname);
2004 - if (remove_empty_directories(&orig_ref_file)) {
1996 + if (remove_empty_directories(&ref_file)) {
1997 last_errno = errno;
2006 - if (!verify_refname_available_dir(orig_refname, extras, skip,
1998 + if (!verify_refname_available_dir(refname, extras, skip,
1999 get_loose_refs(&ref_cache), err))
2000 strbuf_addf(err, "there are still refs under '%s'",
2009 - orig_refname);
2001 + refname);
2002 goto error_return;
2003 }
2012 - refname = resolve_ref_unsafe(orig_refname, resolve_flags,
2013 - lock->old_oid.hash, type);
2004 + resolved = !!resolve_ref_unsafe(refname, resolve_flags,
2005 + lock->old_oid.hash, type);
2006 }
2015 - if (!refname) {
2007 + if (!resolved) {
2008 last_errno = errno;
2009 if (last_errno != ENOTDIR ||
2018 - !verify_refname_available_dir(orig_refname, extras, skip,
2010 + !verify_refname_available_dir(refname, extras, skip,
2011 get_loose_refs(&ref_cache), err))
2012 strbuf_addf(err, "unable to resolve reference '%s': %s",
2021 - orig_refname, strerror(last_errno));
2013 + refname, strerror(last_errno));
2014
2015 goto error_return;
2016 }
2017
2026 - if (flags & REF_NODEREF)
2027 - refname = orig_refname;
2028 -
2018 /*
2019 * If the ref did not exist and we are creating it, make sure
2020 * there is no existing packed ref whose name begins with our
@@ -2042,8 +2031,6 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname,
2031 lock->lk = xcalloc(1, sizeof(struct lock_file));
2032
2033 lock->ref_name = xstrdup(refname);
2045 - lock->orig_ref_name = xstrdup(orig_refname);
2046 - strbuf_git_path(&ref_file, "%s", refname);
2034
2035 retry:
2036 switch (safe_create_leading_directories_const(ref_file.buf)) {
@@ -2086,7 +2073,6 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname,
2073
2074 out:
2075 strbuf_release(&ref_file);
2089 - strbuf_release(&orig_ref_file);
2076 errno = last_errno;
2077 return lock;
2078 }
@@ -2883,9 +2869,7 @@ static int commit_ref_update(struct ref_lock *lock,
2869 struct strbuf *err)
2870 {
2871 clear_loose_ref_cache(&ref_cache);
2886 - if (log_ref_write(lock->ref_name, lock->old_oid.hash, sha1, logmsg, 0, err) < 0 ||
2887 - (strcmp(lock->ref_name, lock->orig_ref_name) &&
2888 - log_ref_write(lock->orig_ref_name, lock->old_oid.hash, sha1, logmsg, 0, err) < 0)) {
2872 + if (log_ref_write(lock->ref_name, lock->old_oid.hash, sha1, logmsg, 0, err)) {
2873 char *old_msg = strbuf_detach(err, NULL);
2874 strbuf_addf(err, "cannot update the ref '%s': %s",
2875 lock->ref_name, old_msg);
@@ -2893,7 +2877,8 @@ static int commit_ref_update(struct ref_lock *lock,
2877 unlock_ref(lock);
2878 return -1;
2879 }
2896 - if (strcmp(lock->orig_ref_name, "HEAD") != 0) {
2880 +
2881 + if (strcmp(lock->ref_name, "HEAD") != 0) {
2882 /*
2883 * Special hack: If a branch is updated directly and HEAD
2884 * points to it (may happen on the remote side of a push
@@ -2909,6 +2894,7 @@ static int commit_ref_update(struct ref_lock *lock,
2894 unsigned char head_sha1[20];
2895 int head_flag;
2896 const char *head_ref;
2897 +
2898 head_ref = resolve_ref_unsafe("HEAD", RESOLVE_REF_READING,
2899 head_sha1, &head_flag);
2900 if (head_ref && (head_flag & REF_ISSYMREF) &&
@@ -2921,6 +2907,7 @@ static int commit_ref_update(struct ref_lock *lock,
2907 }
2908 }
2909 }
2910 +
2911 if (commit_ref(lock)) {
2912 strbuf_addf(err, "couldn't set '%s'", lock->ref_name);
2913 unlock_ref(lock);
@@ -3026,7 +3013,6 @@ int set_worktree_head_symref(const char *gitdir, const char *target)
3013 lock = xcalloc(1, sizeof(struct ref_lock));
3014 lock->lk = &head_lock;
3015 lock->ref_name = xstrdup(head_rel);
3029 - lock->orig_ref_name = xstrdup(head_rel);
3016
3017 ret = create_symref_locked(lock, head_rel, target, NULL);
3018