diff options
| -rw-r--r-- | refs.c | 16 | ||||
| -rwxr-xr-x | t/t1400-update-ref.sh | 4 |
2 files changed, 15 insertions, 5 deletions
@@ -681,9 +681,19 @@ static int write_pseudoref(const char *pseudoref, const struct object_id *oid, if (old_oid) { struct object_id actual_old_oid; - if (read_ref(pseudoref, &actual_old_oid)) - die("could not read ref '%s'", pseudoref); - if (oidcmp(&actual_old_oid, old_oid)) { + if (read_ref(pseudoref, &actual_old_oid)) { + if (!is_null_oid(old_oid)) { + strbuf_addf(err, "could not read ref '%s'", + pseudoref); + rollback_lock_file(&lock); + goto done; + } + } else if (is_null_oid(old_oid)) { + strbuf_addf(err, "ref '%s' already exists", + pseudoref); + rollback_lock_file(&lock); + goto done; + } else if (oidcmp(&actual_old_oid, old_oid)) { strbuf_addf(err, "unexpected object ID when writing '%s'", pseudoref); rollback_lock_file(&lock); diff --git a/t/t1400-update-ref.sh b/t/t1400-update-ref.sh index 3996109ba4..faf0dfe993 100755 --- a/t/t1400-update-ref.sh +++ b/t/t1400-update-ref.sh @@ -503,12 +503,12 @@ test_expect_success 'delete pseudoref with correct old value' ' test_path_is_missing .git/PSEUDOREF ' -test_expect_failure 'create pseudoref with old OID zero' ' +test_expect_success 'create pseudoref with old OID zero' ' git update-ref PSEUDOREF $A $Z && test $A = $(cat .git/PSEUDOREF) ' -test_expect_failure 'do not overwrite pseudoref with old OID zero' ' +test_expect_success 'do not overwrite pseudoref with old OID zero' ' test_when_finished git update-ref -d PSEUDOREF && test_must_fail git update-ref PSEUDOREF $B $Z 2>err && test $A = $(cat .git/PSEUDOREF) && |
