-
Notifications
You must be signed in to change notification settings - Fork 140
Remove special casing for PSEUDOREF updates #673
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -708,10 +708,9 @@ int dwim_log(const char *str, int len, struct object_id *oid, char **log) | |
|
||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. On the Git mailing list, Junio C Hamano wrote (reply to this):
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. On the Git mailing list, Han-Wen Nienhuys wrote (reply to this):
|
||
static int is_per_worktree_ref(const char *refname) | ||
{ | ||
return !strcmp(refname, "HEAD") || | ||
starts_with(refname, "refs/worktree/") || | ||
starts_with(refname, "refs/bisect/") || | ||
starts_with(refname, "refs/rewritten/"); | ||
return starts_with(refname, "refs/worktree/") || | ||
starts_with(refname, "refs/bisect/") || | ||
starts_with(refname, "refs/rewritten/"); | ||
} | ||
|
||
static int is_pseudoref_syntax(const char *refname) | ||
|
@@ -771,102 +770,6 @@ long get_files_ref_lock_timeout_ms(void) | |
return timeout_ms; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. On the Git mailing list, Junio C Hamano wrote (reply to this):
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. On the Git mailing list, Han-Wen Nienhuys wrote (reply to this):
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. On the Git mailing list, Junio C Hamano wrote (reply to this):
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. On the Git mailing list, Han-Wen Nienhuys wrote (reply to this):
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. On the Git mailing list, Junio C Hamano wrote (reply to this):
|
||
} | ||
|
||
static int write_pseudoref(const char *pseudoref, const struct object_id *oid, | ||
const struct object_id *old_oid, struct strbuf *err) | ||
{ | ||
const char *filename; | ||
int fd; | ||
struct lock_file lock = LOCK_INIT; | ||
struct strbuf buf = STRBUF_INIT; | ||
int ret = -1; | ||
|
||
if (!oid) | ||
return 0; | ||
|
||
strbuf_addf(&buf, "%s\n", oid_to_hex(oid)); | ||
|
||
filename = git_path("%s", pseudoref); | ||
fd = hold_lock_file_for_update_timeout(&lock, filename, 0, | ||
get_files_ref_lock_timeout_ms()); | ||
if (fd < 0) { | ||
strbuf_addf(err, _("could not open '%s' for writing: %s"), | ||
filename, strerror(errno)); | ||
goto done; | ||
} | ||
|
||
if (old_oid) { | ||
struct object_id actual_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 (!oideq(&actual_old_oid, old_oid)) { | ||
strbuf_addf(err, _("unexpected object ID when writing '%s'"), | ||
pseudoref); | ||
rollback_lock_file(&lock); | ||
goto done; | ||
} | ||
} | ||
|
||
if (write_in_full(fd, buf.buf, buf.len) < 0) { | ||
strbuf_addf(err, _("could not write to '%s'"), filename); | ||
rollback_lock_file(&lock); | ||
goto done; | ||
} | ||
|
||
commit_lock_file(&lock); | ||
ret = 0; | ||
done: | ||
strbuf_release(&buf); | ||
return ret; | ||
} | ||
|
||
static int delete_pseudoref(const char *pseudoref, const struct object_id *old_oid) | ||
{ | ||
const char *filename; | ||
|
||
filename = git_path("%s", pseudoref); | ||
|
||
if (old_oid && !is_null_oid(old_oid)) { | ||
struct lock_file lock = LOCK_INIT; | ||
int fd; | ||
struct object_id actual_old_oid; | ||
|
||
fd = hold_lock_file_for_update_timeout( | ||
&lock, filename, 0, | ||
get_files_ref_lock_timeout_ms()); | ||
if (fd < 0) { | ||
error_errno(_("could not open '%s' for writing"), | ||
filename); | ||
return -1; | ||
} | ||
if (read_ref(pseudoref, &actual_old_oid)) | ||
die(_("could not read ref '%s'"), pseudoref); | ||
if (!oideq(&actual_old_oid, old_oid)) { | ||
error(_("unexpected object ID when deleting '%s'"), | ||
pseudoref); | ||
rollback_lock_file(&lock); | ||
return -1; | ||
} | ||
|
||
unlink(filename); | ||
rollback_lock_file(&lock); | ||
} else { | ||
unlink(filename); | ||
} | ||
|
||
return 0; | ||
} | ||
|
||
int refs_delete_ref(struct ref_store *refs, const char *msg, | ||
const char *refname, | ||
const struct object_id *old_oid, | ||
|
@@ -875,11 +778,6 @@ int refs_delete_ref(struct ref_store *refs, const char *msg, | |
struct ref_transaction *transaction; | ||
struct strbuf err = STRBUF_INIT; | ||
|
||
if (ref_type(refname) == REF_TYPE_PSEUDOREF) { | ||
assert(refs == get_main_ref_store(the_repository)); | ||
return delete_pseudoref(refname, old_oid); | ||
} | ||
|
||
transaction = ref_store_transaction_begin(refs, &err); | ||
if (!transaction || | ||
ref_transaction_delete(transaction, refname, old_oid, | ||
|
@@ -1202,18 +1100,13 @@ int refs_update_ref(struct ref_store *refs, const char *msg, | |
struct strbuf err = STRBUF_INIT; | ||
int ret = 0; | ||
|
||
if (ref_type(refname) == REF_TYPE_PSEUDOREF) { | ||
assert(refs == get_main_ref_store(the_repository)); | ||
ret = write_pseudoref(refname, new_oid, old_oid, &err); | ||
} else { | ||
t = ref_store_transaction_begin(refs, &err); | ||
if (!t || | ||
ref_transaction_update(t, refname, new_oid, old_oid, | ||
flags, msg, &err) || | ||
ref_transaction_commit(t, &err)) { | ||
ret = 1; | ||
ref_transaction_free(t); | ||
} | ||
t = ref_store_transaction_begin(refs, &err); | ||
if (!t || | ||
ref_transaction_update(t, refname, new_oid, old_oid, flags, msg, | ||
&err) || | ||
ref_transaction_commit(t, &err)) { | ||
ret = 1; | ||
ref_transaction_free(t); | ||
} | ||
if (ret) { | ||
const char *str = _("update_ref failed for ref '%s': %s"); | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
On the Git mailing list, Johannes Schindelin wrote (reply to this):
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
On the Git mailing list, Han-Wen Nienhuys wrote (reply to this):