diff --git a/Documentation/git-show-ref.txt b/Documentation/git-show-ref.txt index ba7574700593e85ea65ac2e0e8516f286d11dcc8..9627b34b37fcf4fa64c846ffb94baf8ddf9dd3c0 100644 --- a/Documentation/git-show-ref.txt +++ b/Documentation/git-show-ref.txt @@ -10,7 +10,7 @@ SYNOPSIS [verse] 'git show-ref' [--head] [-d | --dereference] [-s | --hash[=]] [--abbrev[=]] [--tags] - [--heads] [--] [...] + [--heads] [--symbolic-name] [--] [...] 'git show-ref' --verify [-q | --quiet] [-d | --dereference] [-s | --hash[=]] [--abbrev[=]] [--] [...] @@ -58,6 +58,11 @@ OPTIONS Dereference tags into object IDs as well. They will be shown with `^{}` appended. +--symbolic-name:: + + Print out the value the reference points to without dereferencing. This + is useful to know the reference that a symbolic ref is pointing to. + -s:: --hash[=]:: @@ -146,6 +151,20 @@ $ git show-ref --heads --hash ... ----------------------------------------------------------------------------- +When using `--symbolic-name`, the output is in the format: + +----------- + SP SP +----------- + +For example, + +----------------------------------------------------------------------------- +$ git show-ref --symbolic-name +b75428bae1d090f60bdd4b67185f814bc8f0819d refs/heads/SYMBOLIC_REF ref:refs/heads/main +... +----------------------------------------------------------------------------- + EXAMPLES -------- diff --git a/builtin/replace.c b/builtin/replace.c index da59600ad22fda16155a278a210478fb55d0d94e..36fa58db82c011ed225742649e092d086034e6ce 100644 --- a/builtin/replace.c +++ b/builtin/replace.c @@ -48,6 +48,7 @@ struct show_data { }; static int show_reference(struct repository *r, const char *refname, + const char *referent UNUSED, const struct object_id *oid, int flag UNUSED, void *cb_data) { diff --git a/builtin/show-ref.c b/builtin/show-ref.c index 1c15421e6008e80b1983c168592998f17667bf58..1d681505eac0b04c97e889996f55d2ea87767020 100644 --- a/builtin/show-ref.c +++ b/builtin/show-ref.c @@ -12,7 +12,7 @@ static const char * const show_ref_usage[] = { N_("git show-ref [--head] [-d | --dereference]\n" " [-s | --hash[=]] [--abbrev[=]] [--tags]\n" - " [--heads] [--] [...]"), + " [--heads] [--symbolic-name] [--] [...]"), N_("git show-ref --verify [-q | --quiet] [-d | --dereference]\n" " [-s | --hash[=]] [--abbrev[=]]\n" " [--] [...]"), @@ -26,10 +26,13 @@ struct show_one_options { int hash_only; int abbrev; int deref_tags; + int symbolic_name; }; static void show_one(const struct show_one_options *opts, - const char *refname, const struct object_id *oid) + const char *refname, + const char *referent, + const struct object_id *oid, const int is_symref) { const char *hex; struct object_id peeled; @@ -44,7 +47,9 @@ static void show_one(const struct show_one_options *opts, hex = repo_find_unique_abbrev(the_repository, oid, opts->abbrev); if (opts->hash_only) printf("%s\n", hex); - else + else if (opts->symbolic_name & is_symref) { + printf("%s %s ref:%s\n", hex, refname, referent); + } else printf("%s %s\n", hex, refname); if (!opts->deref_tags) @@ -63,8 +68,11 @@ struct show_ref_data { int show_head; }; -static int show_ref(const char *refname, const struct object_id *oid, - int flag UNUSED, void *cbdata) +static int show_ref_referent(struct repository *repo UNUSED, + const char *refname, + const char *referent, + const struct object_id *oid, + int flag, void *cbdata) { struct show_ref_data *data = cbdata; @@ -91,11 +99,17 @@ static int show_ref(const char *refname, const struct object_id *oid, match: data->found_match++; - show_one(data->show_one_opts, refname, oid); + show_one(data->show_one_opts, refname, referent, oid, flag & REF_ISSYMREF); return 0; } +static int show_ref(const char *refname, const struct object_id *oid, + int flag, void *cbdata) +{ + return show_ref_referent(NULL, refname, NULL, oid, flag, cbdata); +} + static int add_existing(const char *refname, const struct object_id *oid UNUSED, int flag UNUSED, void *cbdata) @@ -171,10 +185,11 @@ static int cmd_show_ref__verify(const struct show_one_options *show_one_opts, while (*refs) { struct object_id oid; + int flags = 0; if ((starts_with(*refs, "refs/") || refname_is_safe(*refs)) && - !read_ref(*refs, &oid)) { - show_one(show_one_opts, *refs, &oid); + !read_ref_full(*refs, 0, &oid, &flags)) { + show_one(show_one_opts, *refs, NULL, &oid, flags & REF_ISSYMREF); } else if (!show_one_opts->quiet) die("'%s' - not a valid ref", *refs); @@ -208,11 +223,11 @@ static int cmd_show_ref__patterns(const struct patterns_options *opts, head_ref(show_ref, &show_ref_data); if (opts->heads_only || opts->tags_only) { if (opts->heads_only) - for_each_fullref_in("refs/heads/", show_ref, &show_ref_data); + for_each_ref_all("refs/heads/", show_ref_referent, &show_ref_data); if (opts->tags_only) - for_each_fullref_in("refs/tags/", show_ref, &show_ref_data); + for_each_ref_all("refs/tags/", show_ref_referent, &show_ref_data); } else { - for_each_ref(show_ref, &show_ref_data); + for_each_ref_all("", show_ref_referent, &show_ref_data); } if (!show_ref_data.found_match) return 1; @@ -289,6 +304,7 @@ int cmd_show_ref(int argc, const char **argv, const char *prefix) OPT_BOOL(0, "tags", &patterns_opts.tags_only, N_("only show tags (can be combined with heads)")), OPT_BOOL(0, "heads", &patterns_opts.heads_only, N_("only show heads (can be combined with tags)")), OPT_BOOL(0, "exists", &exists, N_("check for reference existence without resolving")), + OPT_BOOL(0, "symbolic-name", &show_one_opts.symbolic_name, N_("print out symbolic reference values")), OPT_BOOL(0, "verify", &verify, N_("stricter reference checking, " "requires exact ref path")), OPT_HIDDEN_BOOL('h', NULL, &patterns_opts.show_head, diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c index fda50f2af1e33277161f819f560b4d8164d284a0..cf9966b78271f71b87ca596c814ac007f6753fb9 100644 --- a/builtin/submodule--helper.c +++ b/builtin/submodule--helper.c @@ -45,7 +45,7 @@ static int repo_get_default_remote(struct repository *repo, char **default_remot char *dest = NULL; struct strbuf sb = STRBUF_INIT; struct ref_store *store = get_main_ref_store(repo); - const char *refname = refs_resolve_ref_unsafe(store, "HEAD", 0, NULL, + const char *refname = refs_resolve_ref_unsafe(store, "HEAD", NULL, 0, NULL, NULL); if (!refname) diff --git a/refs.c b/refs.c index 55d2e0b2cb9e959443e98eb329fdf97eff9073a9..af9e46ae56a75a14f390c9df24ab24c7932bab8e 100644 --- a/refs.c +++ b/refs.c @@ -379,7 +379,7 @@ char *refs_resolve_refdup(struct ref_store *refs, { const char *result; - result = refs_resolve_ref_unsafe(refs, refname, resolve_flags, + result = refs_resolve_ref_unsafe(refs, refname, NULL, resolve_flags, oid, flags); return xstrdup_or_null(result); } @@ -404,7 +404,7 @@ int read_ref_full(const char *refname, int resolve_flags, struct object_id *oid, { struct ref_store *refs = get_main_ref_store(the_repository); - if (refs_resolve_ref_unsafe(refs, refname, resolve_flags, + if (refs_resolve_ref_unsafe(refs, refname, NULL, resolve_flags, oid, flags)) return 0; return -1; @@ -417,7 +417,7 @@ int read_ref(const char *refname, struct object_id *oid) int refs_ref_exists(struct ref_store *refs, const char *refname) { - return !!refs_resolve_ref_unsafe(refs, refname, RESOLVE_REF_READING, + return !!refs_resolve_ref_unsafe(refs, refname, NULL, RESOLVE_REF_READING, NULL, NULL); } @@ -773,7 +773,7 @@ int expand_ref(struct repository *repo, const char *str, int len, this_result = refs_found ? &oid_from_ref : oid; strbuf_reset(&fullref); strbuf_addf(&fullref, *p, len, str); - r = refs_resolve_ref_unsafe(refs, fullref.buf, + r = refs_resolve_ref_unsafe(refs, fullref.buf, NULL, RESOLVE_REF_READING, this_result, &flag); if (r) { @@ -807,7 +807,7 @@ int repo_dwim_log(struct repository *r, const char *str, int len, strbuf_reset(&path); strbuf_addf(&path, *p, len, str); - ref = refs_resolve_ref_unsafe(refs, path.buf, + ref = refs_resolve_ref_unsafe(refs, path.buf, NULL, RESOLVE_REF_READING, oid ? &hash : NULL, NULL); if (!ref) @@ -876,7 +876,7 @@ int is_pseudoref(struct ref_store *refs, const char *refname) return 0; if (ends_with(refname, "_HEAD")) { - refs_resolve_ref_unsafe(refs, refname, + refs_resolve_ref_unsafe(refs, refname, NULL, RESOLVE_REF_READING | RESOLVE_REF_NO_RECURSE, &oid, NULL); return !is_null_oid(&oid); @@ -884,7 +884,7 @@ int is_pseudoref(struct ref_store *refs, const char *refname) for (i = 0; i < ARRAY_SIZE(irregular_pseudorefs); i++) if (!strcmp(refname, irregular_pseudorefs[i])) { - refs_resolve_ref_unsafe(refs, refname, + refs_resolve_ref_unsafe(refs, refname, NULL, RESOLVE_REF_READING | RESOLVE_REF_NO_RECURSE, &oid, NULL); return !is_null_oid(&oid); @@ -1590,7 +1590,7 @@ int refs_head_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data) struct object_id oid; int flag; - if (refs_resolve_ref_unsafe(refs, "HEAD", RESOLVE_REF_READING, + if (refs_resolve_ref_unsafe(refs, "HEAD", NULL, RESOLVE_REF_READING, &oid, &flag)) return fn("HEAD", &oid, flag, cb_data); @@ -1664,6 +1664,7 @@ struct do_for_each_ref_help { static int do_for_each_ref_helper(struct repository *r UNUSED, const char *refname, + const char *referent, const struct object_id *oid, int flags, void *cb_data) @@ -1733,6 +1734,12 @@ int for_each_replace_ref(struct repository *r, each_repo_ref_fn fn, void *cb_dat DO_FOR_EACH_INCLUDE_BROKEN, cb_data); } +int for_each_ref_all(const char *prefix, each_repo_ref_fn fn, void *cb_data) +{ + return do_for_each_repo_ref(the_repository, prefix, fn, 0, + 0, cb_data); +} + int for_each_namespaced_ref(const char **exclude_patterns, each_ref_fn fn, void *cb_data) { @@ -1928,6 +1935,7 @@ int refs_read_symbolic_ref(struct ref_store *ref_store, const char *refname, const char *refs_resolve_ref_unsafe(struct ref_store *refs, const char *refname, + struct strbuf *referent, int resolve_flags, struct object_id *oid, int *flags) @@ -1989,6 +1997,9 @@ const char *refs_resolve_ref_unsafe(struct ref_store *refs, } *flags |= read_flags; + if (referent && !referent->len && (read_flags & REF_ISSYMREF) && + sb_refname.len > 0) + referent->buf = sb_refname.buf; if (!(read_flags & REF_ISSYMREF)) { if (*flags & REF_BAD_NAME) { @@ -2024,7 +2035,7 @@ int refs_init_db(struct ref_store *refs, int flags, struct strbuf *err) const char *resolve_ref_unsafe(const char *refname, int resolve_flags, struct object_id *oid, int *flags) { - return refs_resolve_ref_unsafe(get_main_ref_store(the_repository), refname, + return refs_resolve_ref_unsafe(get_main_ref_store(the_repository), refname, NULL, resolve_flags, oid, flags); } @@ -2039,7 +2050,7 @@ int resolve_gitlink_ref(const char *submodule, const char *refname, if (!refs) return -1; - if (!refs_resolve_ref_unsafe(refs, refname, 0, oid, &flags) || + if (!refs_resolve_ref_unsafe(refs, refname, NULL, 0, oid, &flags) || is_null_oid(oid)) return -1; return 0; @@ -2562,6 +2573,7 @@ struct do_for_each_reflog_help { static int do_for_each_reflog_helper(struct repository *r UNUSED, const char *refname, + const char *referent, const struct object_id *oid UNUSED, int flags, void *cb_data) diff --git a/refs.h b/refs.h index 298caf6c6184cc3a23acf78d1a0e3dc8c7d8614c..b5cf27a8ada94a1e895ba125acc74cca0db3b591 100644 --- a/refs.h +++ b/refs.h @@ -71,9 +71,9 @@ struct pack_refs_opts { struct ref_exclusions *exclusions; struct string_list *includes; }; - const char *refs_resolve_ref_unsafe(struct ref_store *refs, const char *refname, + struct strbuf *referent, int resolve_flags, struct object_id *oid, int *flags); @@ -310,6 +310,7 @@ typedef int each_ref_fn(const char *refname, */ typedef int each_repo_ref_fn(struct repository *r, const char *refname, + const char *referent, const struct object_id *oid, int flags, void *cb_data); @@ -335,7 +336,6 @@ int refs_for_each_branch_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data); int refs_for_each_remote_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data); - /* just iterates the head ref. */ int head_ref(each_ref_fn fn, void *cb_data); @@ -379,6 +379,7 @@ int for_each_tag_ref(each_ref_fn fn, void *cb_data); int for_each_branch_ref(each_ref_fn fn, void *cb_data); int for_each_remote_ref(each_ref_fn fn, void *cb_data); int for_each_replace_ref(struct repository *r, each_repo_ref_fn fn, void *cb_data); +int for_each_ref_all(const char *prefix, each_repo_ref_fn fn, void *cb_data); /* iterates all refs that match the specified glob pattern. */ int for_each_glob_ref(each_ref_fn fn, const char *pattern, void *cb_data); diff --git a/refs/files-backend.c b/refs/files-backend.c index a098d14ea00ed6db449e5d3cc8dff28594228977..8c0918f5d22d5866697db2632d1b5cb700147282 100644 --- a/refs/files-backend.c +++ b/refs/files-backend.c @@ -235,8 +235,9 @@ static void loose_fill_ref_dir_regular_file(struct files_ref_store *refs, { struct object_id oid; int flag; + struct strbuf referent = STRBUF_INIT; - if (!refs_resolve_ref_unsafe(&refs->base, refname, RESOLVE_REF_READING, + if (!refs_resolve_ref_unsafe(&refs->base, refname, &referent, RESOLVE_REF_READING, &oid, &flag)) { oidclr(&oid); flag |= REF_ISBROKEN; @@ -258,7 +259,7 @@ static void loose_fill_ref_dir_regular_file(struct files_ref_store *refs, oidclr(&oid); flag |= REF_BAD_NAME | REF_ISBROKEN; } - add_entry_to_dir(dir, create_ref_entry(refname, &oid, flag)); + add_entry_to_dir(dir, create_ref_entry(refname, referent.buf, &oid, flag)); } /* @@ -843,6 +844,7 @@ static int files_ref_iterator_advance(struct ref_iterator *ref_iterator) continue; iter->base.refname = iter->iter0->refname; + iter->base.referent = iter->iter0->referent; iter->base.oid = iter->iter0->oid; iter->base.flags = iter->iter0->flags; return ITER_OK; @@ -1109,7 +1111,7 @@ static struct ref_lock *lock_ref_oid_basic(struct files_ref_store *refs, goto error_return; } - if (!refs_resolve_ref_unsafe(&refs->base, lock->ref_name, 0, + if (!refs_resolve_ref_unsafe(&refs->base, lock->ref_name, NULL, 0, &lock->old_oid, NULL)) oidclr(&lock->old_oid); goto out; @@ -1444,7 +1446,7 @@ static int files_copy_or_rename_ref(struct ref_store *ref_store, goto out; } - if (!refs_resolve_ref_unsafe(&refs->base, oldrefname, + if (!refs_resolve_ref_unsafe(&refs->base, oldrefname, NULL, RESOLVE_REF_READING | RESOLVE_REF_NO_RECURSE, &orig_oid, &flag)) { ret = error("refname %s not found", oldrefname); @@ -1490,7 +1492,7 @@ static int files_copy_or_rename_ref(struct ref_store *ref_store, * the safety anyway; we want to delete the reference whatever * its current value. */ - if (!copy && refs_resolve_ref_unsafe(&refs->base, newrefname, + if (!copy && refs_resolve_ref_unsafe(&refs->base, newrefname, NULL, RESOLVE_REF_READING | RESOLVE_REF_NO_RECURSE, NULL, NULL) && refs_delete_ref(&refs->base, NULL, newrefname, @@ -1863,7 +1865,7 @@ static int commit_ref_update(struct files_ref_store *refs, int head_flag; const char *head_ref; - head_ref = refs_resolve_ref_unsafe(&refs->base, "HEAD", + head_ref = refs_resolve_ref_unsafe(&refs->base, "HEAD", NULL, RESOLVE_REF_READING, NULL, &head_flag); if (head_ref && (head_flag & REF_ISSYMREF) && @@ -1911,7 +1913,7 @@ static void update_symref_reflog(struct files_ref_store *refs, struct object_id new_oid; if (logmsg && - refs_resolve_ref_unsafe(&refs->base, target, + refs_resolve_ref_unsafe(&refs->base, target, NULL, RESOLVE_REF_READING, &new_oid, NULL) && files_log_ref_write(refs, refname, &lock->old_oid, &new_oid, logmsg, 0, &err)) { @@ -2505,7 +2507,7 @@ static int lock_ref_for_update(struct files_ref_store *refs, * to record and possibly check old_oid: */ if (!refs_resolve_ref_unsafe(&refs->base, - referent.buf, 0, + referent.buf, NULL, 0, &lock->old_oid, NULL)) { if (update->flags & REF_HAVE_OLD) { strbuf_addf(err, "cannot lock ref '%s': " @@ -3200,7 +3202,7 @@ static int files_reflog_expire(struct ref_store *ref_store, int type; const char *ref; - ref = refs_resolve_ref_unsafe(&refs->base, refname, + ref = refs_resolve_ref_unsafe(&refs->base, refname, NULL, RESOLVE_REF_NO_RECURSE, NULL, &type); update = !!(ref && !(type & REF_ISSYMREF)); diff --git a/refs/iterator.c b/refs/iterator.c index 9db8b056d56d190fe9ea2087bc327f0154b6ecd2..7e04d8427a95ce004384d90cdfa4baec3df68019 100644 --- a/refs/iterator.c +++ b/refs/iterator.c @@ -199,6 +199,7 @@ static int merge_ref_iterator_advance(struct ref_iterator *ref_iterator) } if (selection & ITER_YIELD_CURRENT) { + iter->base.referent = (*iter->current)->referent; iter->base.refname = (*iter->current)->refname; iter->base.oid = (*iter->current)->oid; iter->base.flags = (*iter->current)->flags; @@ -448,7 +449,7 @@ int do_for_each_repo_ref_iterator(struct repository *r, struct ref_iterator *ite current_ref_iter = iter; while ((ok = ref_iterator_advance(iter)) == ITER_OK) { - retval = fn(r, iter->refname, iter->oid, iter->flags, cb_data); + retval = fn(r, iter->refname, iter->referent, iter->oid, iter->flags, cb_data); if (retval) { /* * If ref_iterator_abort() returns ITER_ERROR, diff --git a/refs/ref-cache.c b/refs/ref-cache.c index 9f9797209a4545576f3ce5c9a9327c47e3319df1..4c23b92414a47747150e04f70ca20ba2b05c4593 100644 --- a/refs/ref-cache.c +++ b/refs/ref-cache.c @@ -34,12 +34,14 @@ struct ref_dir *get_ref_dir(struct ref_entry *entry) } struct ref_entry *create_ref_entry(const char *refname, + const char *referent, const struct object_id *oid, int flag) { struct ref_entry *ref; FLEX_ALLOC_STR(ref, name, refname); oidcpy(&ref->u.value.oid, oid); + ref->u.value.referent = referent; ref->flag = flag; return ref; } @@ -428,6 +430,7 @@ static int cache_ref_iterator_advance(struct ref_iterator *ref_iterator) level->prefix_state = entry_prefix_state; level->index = -1; } else { + iter->base.referent = entry->u.value.referent; iter->base.refname = entry->name; iter->base.oid = &entry->u.value.oid; iter->base.flags = entry->flag; diff --git a/refs/ref-cache.h b/refs/ref-cache.h index 95c76e27c833112743b82a0b62f9a5423fb52259..12ddee4fddc0ccab6ecc4877392736b50fe8a47f 100644 --- a/refs/ref-cache.h +++ b/refs/ref-cache.h @@ -42,6 +42,7 @@ struct ref_value { * referred to by the last reference in the symlink chain. */ struct object_id oid; + const char *referent; }; /* @@ -173,6 +174,7 @@ struct ref_entry *create_dir_entry(struct ref_cache *cache, const char *dirname, size_t len); struct ref_entry *create_ref_entry(const char *refname, + const char *referent, const struct object_id *oid, int flag); /* diff --git a/refs/refs-internal.h b/refs/refs-internal.h index 56641aa57a138da17037307d37e1ca28baa2a1ee..a10363eccf4d427324c73f32507b2420d0a9ae3d 100644 --- a/refs/refs-internal.h +++ b/refs/refs-internal.h @@ -319,6 +319,7 @@ enum do_for_each_ref_flags { struct ref_iterator { struct ref_iterator_vtable *vtable; const char *refname; + const char *referent; const struct object_id *oid; unsigned int flags; }; diff --git a/refs/reftable-backend.c b/refs/reftable-backend.c index e206d5a073ced9c24d9020f03a674ca207abdd06..aac42cad3a8c2be0d78dab212871e909fcf444e3 100644 --- a/refs/reftable-backend.c +++ b/refs/reftable-backend.c @@ -339,6 +339,7 @@ static int reftable_ref_iterator_advance(struct ref_iterator *ref_iterator) struct reftable_ref_iterator *iter = (struct reftable_ref_iterator *)ref_iterator; struct reftable_ref_store *refs = iter->refs; + struct strbuf referent = STRBUF_INIT; while (!iter->err) { int flags = 0; @@ -377,9 +378,10 @@ static int reftable_ref_iterator_advance(struct ref_iterator *ref_iterator) oidread(&iter->oid, iter->ref.value.val2.value); break; case REFTABLE_REF_SYMREF: - if (!refs_resolve_ref_unsafe(&iter->refs->base, iter->ref.refname, + if (!refs_resolve_ref_unsafe(&iter->refs->base, iter->ref.refname, &referent, RESOLVE_REF_READING, &iter->oid, &flags)) oidclr(&iter->oid); + break; default: BUG("unhandled reference value type %d", iter->ref.value_type); @@ -406,6 +408,7 @@ static int reftable_ref_iterator_advance(struct ref_iterator *ref_iterator) continue; iter->base.refname = iter->ref.refname; + iter->base.referent = referent.buf; iter->base.oid = &iter->oid; iter->base.flags = flags; @@ -877,7 +880,7 @@ static int reftable_be_transaction_prepare(struct ref_store *ref_store, * so it is safe to call `refs_resolve_ref_unsafe()` * here without causing races. */ - const char *resolved = refs_resolve_ref_unsafe(&refs->base, u->refname, 0, + const char *resolved = refs_resolve_ref_unsafe(&refs->base, u->refname, NULL, 0, ¤t_oid, NULL); if (u->flags & REF_NO_DEREF) { @@ -1252,7 +1255,7 @@ static int write_create_symref_table(struct reftable_writer *writer, void *cb_da * never happens. */ if (!create->logmsg || - !refs_resolve_ref_unsafe(&create->refs->base, create->target, + !refs_resolve_ref_unsafe(&create->refs->base, create->target, NULL, RESOLVE_REF_READING, &new_oid, NULL) || !should_write_log(&create->refs->base, create->refname)) return 0; @@ -1263,7 +1266,7 @@ static int write_create_symref_table(struct reftable_writer *writer, void *cb_da log.value.update.message = xstrndup(create->logmsg, create->refs->write_options.block_size / 2); memcpy(log.value.update.new_hash, new_oid.hash, GIT_MAX_RAWSZ); - if (refs_resolve_ref_unsafe(&create->refs->base, create->refname, + if (refs_resolve_ref_unsafe(&create->refs->base, create->refname, NULL, RESOLVE_REF_READING, &old_oid, NULL)) memcpy(log.value.update.old_hash, old_oid.hash, GIT_MAX_RAWSZ); diff --git a/remote.c b/remote.c index 2b650b813b741f722a5f6c69f359a1f53249bcb1..36525451e9cf9ca15bfa8b04e065ebaab650908b 100644 --- a/remote.c +++ b/remote.c @@ -518,7 +518,7 @@ static void read_config(struct repository *repo, int early) repo->remote_state->current_branch = NULL; if (startup_info->have_repository && !early) { const char *head_ref = refs_resolve_ref_unsafe( - get_main_ref_store(repo), "HEAD", 0, NULL, &flag); + get_main_ref_store(repo), "HEAD", NULL, 0, NULL, &flag); if (head_ref && (flag & REF_ISSYMREF) && skip_prefix(head_ref, "refs/heads/", &head_ref)) { repo->remote_state->current_branch = make_branch( diff --git a/replace-object.c b/replace-object.c index 523215589de9221b0823aab9edbb06389ca52825..32d90f353272b14db53f06c6b62398d9d43e1e20 100644 --- a/replace-object.c +++ b/replace-object.c @@ -10,6 +10,7 @@ static int register_replace_ref(struct repository *r, const char *refname, + const char *referent UNUSED, const struct object_id *oid, int flag UNUSED, void *cb_data UNUSED) diff --git a/sequencer.c b/sequencer.c index fa838f264f5a98f48b923b0831782a864a5ccb0f..e9cc2a4fdf4be8371ffce3d2a72e8268c15e715d 100644 --- a/sequencer.c +++ b/sequencer.c @@ -1430,7 +1430,7 @@ void print_commit_summary(struct repository *r, diff_setup_done(&rev.diffopt); refs = get_main_ref_store(r); - head = refs_resolve_ref_unsafe(refs, "HEAD", 0, NULL, NULL); + head = refs_resolve_ref_unsafe(refs, "HEAD", NULL, 0, NULL, NULL); if (!head) die(_("unable to resolve HEAD after creating commit")); if (!strcmp(head, "HEAD")) @@ -4651,7 +4651,7 @@ static int apply_save_autostash_ref(struct repository *r, const char *refname, if (!refs_ref_exists(get_main_ref_store(r), refname)) return 0; - if (!refs_resolve_ref_unsafe(get_main_ref_store(r), refname, + if (!refs_resolve_ref_unsafe(get_main_ref_store(r), refname, NULL, RESOLVE_REF_READING, &stash_oid, &flag)) return -1; if (flag & REF_ISSYMREF) diff --git a/t/helper/test-ref-store.c b/t/helper/test-ref-store.c index 7a0f6cac53d2433ade595ce95ab2d30e214b2ede..bc501c5253c4cacfd7c8c592be9ef0361b3dde45 100644 --- a/t/helper/test-ref-store.c +++ b/t/helper/test-ref-store.c @@ -203,7 +203,7 @@ static int cmd_resolve_ref(struct ref_store *refs, const char **argv) int flags; const char *ref; - ref = refs_resolve_ref_unsafe(refs, refname, resolve_flags, + ref = refs_resolve_ref_unsafe(refs, refname, NULL, resolve_flags, &oid, &flags); printf("%s %s 0x%x\n", oid_to_hex(&oid), ref ? ref : "(null)", flags); return ref ? 0 : 1; diff --git a/t/t1403-show-ref.sh b/t/t1403-show-ref.sh index 33fb7a38ffff849db2a825de61eacbc34a8eb11d..0aebe709dca06f591979861ca88a1d0b6b1afa69 100755 --- a/t/t1403-show-ref.sh +++ b/t/t1403-show-ref.sh @@ -286,4 +286,24 @@ test_expect_success '--exists with existing special ref' ' git show-ref --exists FETCH_HEAD ' +test_expect_success '--symbolic-name with a non symbolic ref' ' + commit_oid=$(git rev-parse refs/heads/$GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME) && + cat >expect <<-EOF && + $commit_oid refs/heads/$GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + EOF + git show-ref --symbolic-name refs/heads/$GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME >actual && + test_cmp expect actual +' + +test_expect_success '--symbolic-name with symbolic ref' ' + test_when_finished "git symbolic-ref -d refs/heads/SYMBOLIC_REF_A" && + commit_oid=$(git rev-parse refs/heads/$GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME) && + cat >expect <<-EOF && + $commit_oid refs/heads/SYMBOLIC_REF_A ref:refs/heads/$GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + EOF + git symbolic-ref refs/heads/SYMBOLIC_REF_A refs/heads/$GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME && + git show-ref --symbolic-name SYMBOLIC_REF_A >actual && + test_cmp expect actual +' + test_done diff --git a/worktree.c b/worktree.c index b02a05a74a341157fa8dff7da22936127bebf18e..1fb865c2ae7f75c82a5a0413b2b12d7d1de4d543 100644 --- a/worktree.c +++ b/worktree.c @@ -42,6 +42,7 @@ static void add_head_info(struct worktree *wt) target = refs_resolve_ref_unsafe(get_worktree_ref_store(wt), "HEAD", + NULL, 0, &wt->head_oid, &flags); if (!target) @@ -446,7 +447,7 @@ int is_shared_symref(const struct worktree *wt, const char *symref, } refs = get_worktree_ref_store(wt); - symref_target = refs_resolve_ref_unsafe(refs, symref, 0, + symref_target = refs_resolve_ref_unsafe(refs, symref, NULL, 0, NULL, &flags); if ((flags & REF_ISSYMREF) && symref_target && !strcmp(symref_target, target)) @@ -547,6 +548,7 @@ int other_head_refs(each_ref_fn fn, void *cb_data) strbuf_worktree_ref(wt, &refname, "HEAD"); if (refs_resolve_ref_unsafe(get_main_ref_store(the_repository), refname.buf, + NULL, RESOLVE_REF_READING, &oid, &flag)) ret = fn(refname.buf, &oid, flag, cb_data);