On 10/09/2017 03:11 AM, brian m. carlson wrote:
> Convert update_ref, refs_update_ref, and write_pseudoref to use struct
> object_id. Update the existing callers as well. Remove update_ref_oid,
> as it is no longer needed.
>
> Signed-off-by: brian m. carlson <[email protected]>
> ---
> bisect.c | 5 +++--
> builtin/am.c | 14 +++++++-------
> builtin/checkout.c | 3 +--
> builtin/clone.c | 14 +++++++-------
> builtin/merge.c | 13 ++++++-------
> builtin/notes.c | 10 +++++-----
> builtin/pull.c | 2 +-
> builtin/reset.c | 4 ++--
> builtin/update-ref.c | 2 +-
> notes-cache.c | 2 +-
> notes-utils.c | 2 +-
> refs.c | 40 ++++++++++++++++------------------------
> refs.h | 5 +----
> sequencer.c | 9 +++------
> t/helper/test-ref-store.c | 10 +++++-----
> transport-helper.c | 3 ++-
> transport.c | 4 ++--
> 17 files changed, 64 insertions(+), 78 deletions(-)
>
> [...]
> diff --git a/refs.c b/refs.c
> index 0a5b68d6fb..51942df7b3 100644
> --- a/refs.c
> +++ b/refs.c
> [...]
> @@ -1003,12 +995,12 @@ int refs_update_ref(struct ref_store *refs, const char
> *msg,
> int ret = 0;
>
> if (ref_type(refname) == REF_TYPE_PSEUDOREF) {
> - assert(refs == get_main_ref_store());
Was the deletion of the line above intentional?
> - ret = write_pseudoref(refname, new_sha1, old_sha1, &err);
> + ret = write_pseudoref(refname, new_oid, old_oid, &err);
This is not new to your code, but I just noticed a problem here.
`refs_update_ref()` is documented, via its reference to
`ref_transaction_update()`, to allow `new_sha1` (i.e., now `new_oid`) to
be NULL. (NULL signifies that the value of the reference shouldn't be
changed.)
But `write_pseudoref()` dereferences its `oid` argument unconditionally,
so this call would fail if `new_oid` is NULL.
This has all been the case since `write_pseudoref()` was introduced in
74ec19d4be (pseudorefs: create and use pseudoref update and delete
functions, 2015-07-31).
In my opinion, `write_pseudoref()` is broken. It should accept NULL as
its `oid` argument.
> } else {
> t = ref_store_transaction_begin(refs, &err);
> if (!t ||
> - ref_transaction_update(t, refname, new_sha1, old_sha1,
> + ref_transaction_update(t, refname, new_oid ? new_oid->hash
> : NULL,
> + old_oid ? old_oid->hash : NULL,
> flags, msg, &err) ||
> ref_transaction_commit(t, &err)) {
> ret = 1;
> [...]
Michael