diff options
author | Ronnie Sahlberg <sahlberg@google.com> | 2014-11-03 08:55:57 -0800 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2014-11-03 11:18:35 -0800 |
commit | 986781fccb2eba058d11b432e5c5c6259989981d (patch) | |
tree | 6043e6d0f478d13650f54b81b01d213ddf9972fe /refs.c | |
parent | 6a0103dc112c3f8c0d3e3f401fbd33ea6e273b31 (diff) | |
download | git-rs/ref-transaction-reflog.tar.gz |
refs.c: allow deleting refs with a broken sha1rs/ref-transaction-reflog
Add back support to make it possible to delete refs that have a broken
sha1.
Add new internal flags REF_ALLOW_BROKEN and RESOLVE_REF_ALLOW_BAD_SHA1
to pass intent from branch.c that we are willing to allow
resolve_ref_unsafe and lock_ref_sha1_basic to allow broken refs.
Since these refs can not actually be resolved to a sha1, they instead resolve
to null_sha1 when these flags are used.
For example, the ref:
echo "Broken ref" > .git/refs/heads/foo-broken-1
can now be deleted using git branch -d foo-broken-1
Signed-off-by: Ronnie Sahlberg <sahlberg@google.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'refs.c')
-rw-r--r-- | refs.c | 6 |
1 files changed, 6 insertions, 0 deletions
@@ -1584,6 +1584,10 @@ const char *resolve_ref_unsafe(const char *refname, int resolve_flags, unsigned (buffer[40] != '\0' && !isspace(buffer[40]))) { if (flags) *flags |= REF_ISBROKEN; + if (resolve_flags & RESOLVE_REF_ALLOW_BAD_SHA1) { + hashclr(sha1); + return refname; + } errno = EINVAL; return NULL; } @@ -2265,6 +2269,8 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname, if (flags & REF_NODEREF) resolve_flags |= RESOLVE_REF_NO_RECURSE; } + if (flags & REF_ALLOW_BROKEN) + resolve_flags |= RESOLVE_REF_ALLOW_BAD_SHA1; refname = resolve_ref_unsafe(refname, resolve_flags, lock->old_sha1, &type); |