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