fetch: drop unused DISPLAY_FORMAT_UNKNOWN enum value
[alt-git.git] / refs.c
blobd2a98e1c21f4e9e0be61070aeec48446b0335efc
1 /*
2 * The backend-independent part of the reference module.
3 */
5 #include "git-compat-util.h"
6 #include "advice.h"
7 #include "alloc.h"
8 #include "config.h"
9 #include "environment.h"
10 #include "hashmap.h"
11 #include "gettext.h"
12 #include "hex.h"
13 #include "lockfile.h"
14 #include "iterator.h"
15 #include "refs.h"
16 #include "refs/refs-internal.h"
17 #include "run-command.h"
18 #include "hook.h"
19 #include "object-name.h"
20 #include "object-store.h"
21 #include "object.h"
22 #include "tag.h"
23 #include "submodule.h"
24 #include "worktree.h"
25 #include "strvec.h"
26 #include "repository.h"
27 #include "setup.h"
28 #include "sigchain.h"
29 #include "date.h"
30 #include "commit.h"
31 #include "wrapper.h"
34 * List of all available backends
36 static struct ref_storage_be *refs_backends = &refs_be_files;
38 static struct ref_storage_be *find_ref_storage_backend(const char *name)
40 struct ref_storage_be *be;
41 for (be = refs_backends; be; be = be->next)
42 if (!strcmp(be->name, name))
43 return be;
44 return NULL;
48 * How to handle various characters in refnames:
49 * 0: An acceptable character for refs
50 * 1: End-of-component
51 * 2: ., look for a preceding . to reject .. in refs
52 * 3: {, look for a preceding @ to reject @{ in refs
53 * 4: A bad character: ASCII control characters, and
54 * ":", "?", "[", "\", "^", "~", SP, or TAB
55 * 5: *, reject unless REFNAME_REFSPEC_PATTERN is set
57 static unsigned char refname_disposition[256] = {
58 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
59 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
60 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 2, 1,
61 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 4,
62 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
63 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 4, 0,
64 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
65 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 4, 4
68 struct ref_namespace_info ref_namespace[] = {
69 [NAMESPACE_HEAD] = {
70 .ref = "HEAD",
71 .decoration = DECORATION_REF_HEAD,
72 .exact = 1,
74 [NAMESPACE_BRANCHES] = {
75 .ref = "refs/heads/",
76 .decoration = DECORATION_REF_LOCAL,
78 [NAMESPACE_TAGS] = {
79 .ref = "refs/tags/",
80 .decoration = DECORATION_REF_TAG,
82 [NAMESPACE_REMOTE_REFS] = {
84 * The default refspec for new remotes copies refs from
85 * refs/heads/ on the remote into refs/remotes/<remote>/.
86 * As such, "refs/remotes/" has special handling.
88 .ref = "refs/remotes/",
89 .decoration = DECORATION_REF_REMOTE,
91 [NAMESPACE_STASH] = {
93 * The single ref "refs/stash" stores the latest stash.
94 * Older stashes can be found in the reflog.
96 .ref = "refs/stash",
97 .exact = 1,
98 .decoration = DECORATION_REF_STASH,
100 [NAMESPACE_REPLACE] = {
102 * This namespace allows Git to act as if one object ID
103 * points to the content of another. Unlike the other
104 * ref namespaces, this one can be changed by the
105 * GIT_REPLACE_REF_BASE environment variable. This
106 * .namespace value will be overwritten in setup_git_env().
108 .ref = "refs/replace/",
109 .decoration = DECORATION_GRAFTED,
111 [NAMESPACE_NOTES] = {
113 * The refs/notes/commit ref points to the tip of a
114 * parallel commit history that adds metadata to commits
115 * in the normal history. This ref can be overwritten
116 * by the core.notesRef config variable or the
117 * GIT_NOTES_REFS environment variable.
119 .ref = "refs/notes/commit",
120 .exact = 1,
122 [NAMESPACE_PREFETCH] = {
124 * Prefetch refs are written by the background 'fetch'
125 * maintenance task. It allows faster foreground fetches
126 * by advertising these previously-downloaded tips without
127 * updating refs/remotes/ without user intervention.
129 .ref = "refs/prefetch/",
131 [NAMESPACE_REWRITTEN] = {
133 * Rewritten refs are used by the 'label' command in the
134 * sequencer. These are particularly useful during an
135 * interactive rebase that uses the 'merge' command.
137 .ref = "refs/rewritten/",
141 void update_ref_namespace(enum ref_namespace namespace, char *ref)
143 struct ref_namespace_info *info = &ref_namespace[namespace];
144 if (info->ref_updated)
145 free(info->ref);
146 info->ref = ref;
147 info->ref_updated = 1;
151 * Try to read one refname component from the front of refname.
152 * Return the length of the component found, or -1 if the component is
153 * not legal. It is legal if it is something reasonable to have under
154 * ".git/refs/"; We do not like it if:
156 * - it begins with ".", or
157 * - it has double dots "..", or
158 * - it has ASCII control characters, or
159 * - it has ":", "?", "[", "\", "^", "~", SP, or TAB anywhere, or
160 * - it has "*" anywhere unless REFNAME_REFSPEC_PATTERN is set, or
161 * - it ends with a "/", or
162 * - it ends with ".lock", or
163 * - it contains a "@{" portion
165 * When sanitized is not NULL, instead of rejecting the input refname
166 * as an error, try to come up with a usable replacement for the input
167 * refname in it.
169 static int check_refname_component(const char *refname, int *flags,
170 struct strbuf *sanitized)
172 const char *cp;
173 char last = '\0';
174 size_t component_start = 0; /* garbage - not a reasonable initial value */
176 if (sanitized)
177 component_start = sanitized->len;
179 for (cp = refname; ; cp++) {
180 int ch = *cp & 255;
181 unsigned char disp = refname_disposition[ch];
183 if (sanitized && disp != 1)
184 strbuf_addch(sanitized, ch);
186 switch (disp) {
187 case 1:
188 goto out;
189 case 2:
190 if (last == '.') { /* Refname contains "..". */
191 if (sanitized)
192 /* collapse ".." to single "." */
193 strbuf_setlen(sanitized, sanitized->len - 1);
194 else
195 return -1;
197 break;
198 case 3:
199 if (last == '@') { /* Refname contains "@{". */
200 if (sanitized)
201 sanitized->buf[sanitized->len-1] = '-';
202 else
203 return -1;
205 break;
206 case 4:
207 /* forbidden char */
208 if (sanitized)
209 sanitized->buf[sanitized->len-1] = '-';
210 else
211 return -1;
212 break;
213 case 5:
214 if (!(*flags & REFNAME_REFSPEC_PATTERN)) {
215 /* refspec can't be a pattern */
216 if (sanitized)
217 sanitized->buf[sanitized->len-1] = '-';
218 else
219 return -1;
223 * Unset the pattern flag so that we only accept
224 * a single asterisk for one side of refspec.
226 *flags &= ~ REFNAME_REFSPEC_PATTERN;
227 break;
229 last = ch;
231 out:
232 if (cp == refname)
233 return 0; /* Component has zero length. */
235 if (refname[0] == '.') { /* Component starts with '.'. */
236 if (sanitized)
237 sanitized->buf[component_start] = '-';
238 else
239 return -1;
241 if (cp - refname >= LOCK_SUFFIX_LEN &&
242 !memcmp(cp - LOCK_SUFFIX_LEN, LOCK_SUFFIX, LOCK_SUFFIX_LEN)) {
243 if (!sanitized)
244 return -1;
245 /* Refname ends with ".lock". */
246 while (strbuf_strip_suffix(sanitized, LOCK_SUFFIX)) {
247 /* try again in case we have .lock.lock */
250 return cp - refname;
253 static int check_or_sanitize_refname(const char *refname, int flags,
254 struct strbuf *sanitized)
256 int component_len, component_count = 0;
258 if (!strcmp(refname, "@")) {
259 /* Refname is a single character '@'. */
260 if (sanitized)
261 strbuf_addch(sanitized, '-');
262 else
263 return -1;
266 while (1) {
267 if (sanitized && sanitized->len)
268 strbuf_complete(sanitized, '/');
270 /* We are at the start of a path component. */
271 component_len = check_refname_component(refname, &flags,
272 sanitized);
273 if (sanitized && component_len == 0)
274 ; /* OK, omit empty component */
275 else if (component_len <= 0)
276 return -1;
278 component_count++;
279 if (refname[component_len] == '\0')
280 break;
281 /* Skip to next component. */
282 refname += component_len + 1;
285 if (refname[component_len - 1] == '.') {
286 /* Refname ends with '.'. */
287 if (sanitized)
288 ; /* omit ending dot */
289 else
290 return -1;
292 if (!(flags & REFNAME_ALLOW_ONELEVEL) && component_count < 2)
293 return -1; /* Refname has only one component. */
294 return 0;
297 int check_refname_format(const char *refname, int flags)
299 return check_or_sanitize_refname(refname, flags, NULL);
302 void sanitize_refname_component(const char *refname, struct strbuf *out)
304 if (check_or_sanitize_refname(refname, REFNAME_ALLOW_ONELEVEL, out))
305 BUG("sanitizing refname '%s' check returned error", refname);
308 int refname_is_safe(const char *refname)
310 const char *rest;
312 if (skip_prefix(refname, "refs/", &rest)) {
313 char *buf;
314 int result;
315 size_t restlen = strlen(rest);
317 /* rest must not be empty, or start or end with "/" */
318 if (!restlen || *rest == '/' || rest[restlen - 1] == '/')
319 return 0;
322 * Does the refname try to escape refs/?
323 * For example: refs/foo/../bar is safe but refs/foo/../../bar
324 * is not.
326 buf = xmallocz(restlen);
327 result = !normalize_path_copy(buf, rest) && !strcmp(buf, rest);
328 free(buf);
329 return result;
332 do {
333 if (!isupper(*refname) && *refname != '_')
334 return 0;
335 refname++;
336 } while (*refname);
337 return 1;
341 * Return true if refname, which has the specified oid and flags, can
342 * be resolved to an object in the database. If the referred-to object
343 * does not exist, emit a warning and return false.
345 int ref_resolves_to_object(const char *refname,
346 struct repository *repo,
347 const struct object_id *oid,
348 unsigned int flags)
350 if (flags & REF_ISBROKEN)
351 return 0;
352 if (!repo_has_object_file(repo, oid)) {
353 error(_("%s does not point to a valid object!"), refname);
354 return 0;
356 return 1;
359 char *refs_resolve_refdup(struct ref_store *refs,
360 const char *refname, int resolve_flags,
361 struct object_id *oid, int *flags)
363 const char *result;
365 result = refs_resolve_ref_unsafe(refs, refname, resolve_flags,
366 oid, flags);
367 return xstrdup_or_null(result);
370 char *resolve_refdup(const char *refname, int resolve_flags,
371 struct object_id *oid, int *flags)
373 return refs_resolve_refdup(get_main_ref_store(the_repository),
374 refname, resolve_flags,
375 oid, flags);
378 /* The argument to filter_refs */
379 struct ref_filter {
380 const char *pattern;
381 const char *prefix;
382 each_ref_fn *fn;
383 void *cb_data;
386 int read_ref_full(const char *refname, int resolve_flags, struct object_id *oid, int *flags)
388 struct ref_store *refs = get_main_ref_store(the_repository);
390 if (refs_resolve_ref_unsafe(refs, refname, resolve_flags,
391 oid, flags))
392 return 0;
393 return -1;
396 int read_ref(const char *refname, struct object_id *oid)
398 return read_ref_full(refname, RESOLVE_REF_READING, oid, NULL);
401 int refs_ref_exists(struct ref_store *refs, const char *refname)
403 return !!refs_resolve_ref_unsafe(refs, refname, RESOLVE_REF_READING,
404 NULL, NULL);
407 int ref_exists(const char *refname)
409 return refs_ref_exists(get_main_ref_store(the_repository), refname);
412 static int filter_refs(const char *refname, const struct object_id *oid,
413 int flags, void *data)
415 struct ref_filter *filter = (struct ref_filter *)data;
417 if (wildmatch(filter->pattern, refname, 0))
418 return 0;
419 if (filter->prefix)
420 skip_prefix(refname, filter->prefix, &refname);
421 return filter->fn(refname, oid, flags, filter->cb_data);
424 enum peel_status peel_object(const struct object_id *name, struct object_id *oid)
426 struct object *o = lookup_unknown_object(the_repository, name);
428 if (o->type == OBJ_NONE) {
429 int type = oid_object_info(the_repository, name, NULL);
430 if (type < 0 || !object_as_type(o, type, 0))
431 return PEEL_INVALID;
434 if (o->type != OBJ_TAG)
435 return PEEL_NON_TAG;
437 o = deref_tag_noverify(o);
438 if (!o)
439 return PEEL_INVALID;
441 oidcpy(oid, &o->oid);
442 return PEEL_PEELED;
445 struct warn_if_dangling_data {
446 FILE *fp;
447 const char *refname;
448 const struct string_list *refnames;
449 const char *msg_fmt;
452 static int warn_if_dangling_symref(const char *refname,
453 const struct object_id *oid UNUSED,
454 int flags, void *cb_data)
456 struct warn_if_dangling_data *d = cb_data;
457 const char *resolves_to;
459 if (!(flags & REF_ISSYMREF))
460 return 0;
462 resolves_to = resolve_ref_unsafe(refname, 0, NULL, NULL);
463 if (!resolves_to
464 || (d->refname
465 ? strcmp(resolves_to, d->refname)
466 : !string_list_has_string(d->refnames, resolves_to))) {
467 return 0;
470 fprintf(d->fp, d->msg_fmt, refname);
471 fputc('\n', d->fp);
472 return 0;
475 void warn_dangling_symref(FILE *fp, const char *msg_fmt, const char *refname)
477 struct warn_if_dangling_data data;
479 data.fp = fp;
480 data.refname = refname;
481 data.refnames = NULL;
482 data.msg_fmt = msg_fmt;
483 for_each_rawref(warn_if_dangling_symref, &data);
486 void warn_dangling_symrefs(FILE *fp, const char *msg_fmt, const struct string_list *refnames)
488 struct warn_if_dangling_data data;
490 data.fp = fp;
491 data.refname = NULL;
492 data.refnames = refnames;
493 data.msg_fmt = msg_fmt;
494 for_each_rawref(warn_if_dangling_symref, &data);
497 int refs_for_each_tag_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
499 return refs_for_each_ref_in(refs, "refs/tags/", fn, cb_data);
502 int for_each_tag_ref(each_ref_fn fn, void *cb_data)
504 return refs_for_each_tag_ref(get_main_ref_store(the_repository), fn, cb_data);
507 int refs_for_each_branch_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
509 return refs_for_each_ref_in(refs, "refs/heads/", fn, cb_data);
512 int for_each_branch_ref(each_ref_fn fn, void *cb_data)
514 return refs_for_each_branch_ref(get_main_ref_store(the_repository), fn, cb_data);
517 int refs_for_each_remote_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
519 return refs_for_each_ref_in(refs, "refs/remotes/", fn, cb_data);
522 int for_each_remote_ref(each_ref_fn fn, void *cb_data)
524 return refs_for_each_remote_ref(get_main_ref_store(the_repository), fn, cb_data);
527 int head_ref_namespaced(each_ref_fn fn, void *cb_data)
529 struct strbuf buf = STRBUF_INIT;
530 int ret = 0;
531 struct object_id oid;
532 int flag;
534 strbuf_addf(&buf, "%sHEAD", get_git_namespace());
535 if (!read_ref_full(buf.buf, RESOLVE_REF_READING, &oid, &flag))
536 ret = fn(buf.buf, &oid, flag, cb_data);
537 strbuf_release(&buf);
539 return ret;
542 void normalize_glob_ref(struct string_list_item *item, const char *prefix,
543 const char *pattern)
545 struct strbuf normalized_pattern = STRBUF_INIT;
547 if (*pattern == '/')
548 BUG("pattern must not start with '/'");
550 if (prefix)
551 strbuf_addstr(&normalized_pattern, prefix);
552 else if (!starts_with(pattern, "refs/") &&
553 strcmp(pattern, "HEAD"))
554 strbuf_addstr(&normalized_pattern, "refs/");
556 * NEEDSWORK: Special case other symrefs such as REBASE_HEAD,
557 * MERGE_HEAD, etc.
560 strbuf_addstr(&normalized_pattern, pattern);
561 strbuf_strip_suffix(&normalized_pattern, "/");
563 item->string = strbuf_detach(&normalized_pattern, NULL);
564 item->util = has_glob_specials(pattern) ? NULL : item->string;
565 strbuf_release(&normalized_pattern);
568 int for_each_glob_ref_in(each_ref_fn fn, const char *pattern,
569 const char *prefix, void *cb_data)
571 struct strbuf real_pattern = STRBUF_INIT;
572 struct ref_filter filter;
573 int ret;
575 if (!prefix && !starts_with(pattern, "refs/"))
576 strbuf_addstr(&real_pattern, "refs/");
577 else if (prefix)
578 strbuf_addstr(&real_pattern, prefix);
579 strbuf_addstr(&real_pattern, pattern);
581 if (!has_glob_specials(pattern)) {
582 /* Append implied '/' '*' if not present. */
583 strbuf_complete(&real_pattern, '/');
584 /* No need to check for '*', there is none. */
585 strbuf_addch(&real_pattern, '*');
588 filter.pattern = real_pattern.buf;
589 filter.prefix = prefix;
590 filter.fn = fn;
591 filter.cb_data = cb_data;
592 ret = for_each_ref(filter_refs, &filter);
594 strbuf_release(&real_pattern);
595 return ret;
598 int for_each_glob_ref(each_ref_fn fn, const char *pattern, void *cb_data)
600 return for_each_glob_ref_in(fn, pattern, NULL, cb_data);
603 const char *prettify_refname(const char *name)
605 if (skip_prefix(name, "refs/heads/", &name) ||
606 skip_prefix(name, "refs/tags/", &name) ||
607 skip_prefix(name, "refs/remotes/", &name))
608 ; /* nothing */
609 return name;
612 static const char *ref_rev_parse_rules[] = {
613 "%.*s",
614 "refs/%.*s",
615 "refs/tags/%.*s",
616 "refs/heads/%.*s",
617 "refs/remotes/%.*s",
618 "refs/remotes/%.*s/HEAD",
619 NULL
622 #define NUM_REV_PARSE_RULES (ARRAY_SIZE(ref_rev_parse_rules) - 1)
625 * Is it possible that the caller meant full_name with abbrev_name?
626 * If so return a non-zero value to signal "yes"; the magnitude of
627 * the returned value gives the precedence used for disambiguation.
629 * If abbrev_name cannot mean full_name, return 0.
631 int refname_match(const char *abbrev_name, const char *full_name)
633 const char **p;
634 const int abbrev_name_len = strlen(abbrev_name);
635 const int num_rules = NUM_REV_PARSE_RULES;
637 for (p = ref_rev_parse_rules; *p; p++)
638 if (!strcmp(full_name, mkpath(*p, abbrev_name_len, abbrev_name)))
639 return &ref_rev_parse_rules[num_rules] - p;
641 return 0;
645 * Given a 'prefix' expand it by the rules in 'ref_rev_parse_rules' and add
646 * the results to 'prefixes'
648 void expand_ref_prefix(struct strvec *prefixes, const char *prefix)
650 const char **p;
651 int len = strlen(prefix);
653 for (p = ref_rev_parse_rules; *p; p++)
654 strvec_pushf(prefixes, *p, len, prefix);
657 static const char default_branch_name_advice[] = N_(
658 "Using '%s' as the name for the initial branch. This default branch name\n"
659 "is subject to change. To configure the initial branch name to use in all\n"
660 "of your new repositories, which will suppress this warning, call:\n"
661 "\n"
662 "\tgit config --global init.defaultBranch <name>\n"
663 "\n"
664 "Names commonly chosen instead of 'master' are 'main', 'trunk' and\n"
665 "'development'. The just-created branch can be renamed via this command:\n"
666 "\n"
667 "\tgit branch -m <name>\n"
670 char *repo_default_branch_name(struct repository *r, int quiet)
672 const char *config_key = "init.defaultbranch";
673 const char *config_display_key = "init.defaultBranch";
674 char *ret = NULL, *full_ref;
675 const char *env = getenv("GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME");
677 if (env && *env)
678 ret = xstrdup(env);
679 else if (repo_config_get_string(r, config_key, &ret) < 0)
680 die(_("could not retrieve `%s`"), config_display_key);
682 if (!ret) {
683 ret = xstrdup("master");
684 if (!quiet)
685 advise(_(default_branch_name_advice), ret);
688 full_ref = xstrfmt("refs/heads/%s", ret);
689 if (check_refname_format(full_ref, 0))
690 die(_("invalid branch name: %s = %s"), config_display_key, ret);
691 free(full_ref);
693 return ret;
696 const char *git_default_branch_name(int quiet)
698 static char *ret;
700 if (!ret)
701 ret = repo_default_branch_name(the_repository, quiet);
703 return ret;
707 * *string and *len will only be substituted, and *string returned (for
708 * later free()ing) if the string passed in is a magic short-hand form
709 * to name a branch.
711 static char *substitute_branch_name(struct repository *r,
712 const char **string, int *len,
713 int nonfatal_dangling_mark)
715 struct strbuf buf = STRBUF_INIT;
716 struct interpret_branch_name_options options = {
717 .nonfatal_dangling_mark = nonfatal_dangling_mark
719 int ret = repo_interpret_branch_name(r, *string, *len, &buf, &options);
721 if (ret == *len) {
722 size_t size;
723 *string = strbuf_detach(&buf, &size);
724 *len = size;
725 return (char *)*string;
728 return NULL;
731 int repo_dwim_ref(struct repository *r, const char *str, int len,
732 struct object_id *oid, char **ref, int nonfatal_dangling_mark)
734 char *last_branch = substitute_branch_name(r, &str, &len,
735 nonfatal_dangling_mark);
736 int refs_found = expand_ref(r, str, len, oid, ref);
737 free(last_branch);
738 return refs_found;
741 int expand_ref(struct repository *repo, const char *str, int len,
742 struct object_id *oid, char **ref)
744 const char **p, *r;
745 int refs_found = 0;
746 struct strbuf fullref = STRBUF_INIT;
748 *ref = NULL;
749 for (p = ref_rev_parse_rules; *p; p++) {
750 struct object_id oid_from_ref;
751 struct object_id *this_result;
752 int flag;
753 struct ref_store *refs = get_main_ref_store(repo);
755 this_result = refs_found ? &oid_from_ref : oid;
756 strbuf_reset(&fullref);
757 strbuf_addf(&fullref, *p, len, str);
758 r = refs_resolve_ref_unsafe(refs, fullref.buf,
759 RESOLVE_REF_READING,
760 this_result, &flag);
761 if (r) {
762 if (!refs_found++)
763 *ref = xstrdup(r);
764 if (!warn_ambiguous_refs)
765 break;
766 } else if ((flag & REF_ISSYMREF) && strcmp(fullref.buf, "HEAD")) {
767 warning(_("ignoring dangling symref %s"), fullref.buf);
768 } else if ((flag & REF_ISBROKEN) && strchr(fullref.buf, '/')) {
769 warning(_("ignoring broken ref %s"), fullref.buf);
772 strbuf_release(&fullref);
773 return refs_found;
776 int repo_dwim_log(struct repository *r, const char *str, int len,
777 struct object_id *oid, char **log)
779 struct ref_store *refs = get_main_ref_store(r);
780 char *last_branch = substitute_branch_name(r, &str, &len, 0);
781 const char **p;
782 int logs_found = 0;
783 struct strbuf path = STRBUF_INIT;
785 *log = NULL;
786 for (p = ref_rev_parse_rules; *p; p++) {
787 struct object_id hash;
788 const char *ref, *it;
790 strbuf_reset(&path);
791 strbuf_addf(&path, *p, len, str);
792 ref = refs_resolve_ref_unsafe(refs, path.buf,
793 RESOLVE_REF_READING,
794 oid ? &hash : NULL, NULL);
795 if (!ref)
796 continue;
797 if (refs_reflog_exists(refs, path.buf))
798 it = path.buf;
799 else if (strcmp(ref, path.buf) &&
800 refs_reflog_exists(refs, ref))
801 it = ref;
802 else
803 continue;
804 if (!logs_found++) {
805 *log = xstrdup(it);
806 if (oid)
807 oidcpy(oid, &hash);
809 if (!warn_ambiguous_refs)
810 break;
812 strbuf_release(&path);
813 free(last_branch);
814 return logs_found;
817 int dwim_log(const char *str, int len, struct object_id *oid, char **log)
819 return repo_dwim_log(the_repository, str, len, oid, log);
822 int is_per_worktree_ref(const char *refname)
824 return starts_with(refname, "refs/worktree/") ||
825 starts_with(refname, "refs/bisect/") ||
826 starts_with(refname, "refs/rewritten/");
829 static int is_pseudoref_syntax(const char *refname)
831 const char *c;
833 for (c = refname; *c; c++) {
834 if (!isupper(*c) && *c != '-' && *c != '_')
835 return 0;
839 * HEAD is not a pseudoref, but it certainly uses the
840 * pseudoref syntax.
842 return 1;
845 static int is_current_worktree_ref(const char *ref) {
846 return is_pseudoref_syntax(ref) || is_per_worktree_ref(ref);
849 enum ref_worktree_type parse_worktree_ref(const char *maybe_worktree_ref,
850 const char **worktree_name, int *worktree_name_length,
851 const char **bare_refname)
853 const char *name_dummy;
854 int name_length_dummy;
855 const char *ref_dummy;
857 if (!worktree_name)
858 worktree_name = &name_dummy;
859 if (!worktree_name_length)
860 worktree_name_length = &name_length_dummy;
861 if (!bare_refname)
862 bare_refname = &ref_dummy;
864 if (skip_prefix(maybe_worktree_ref, "worktrees/", bare_refname)) {
865 const char *slash = strchr(*bare_refname, '/');
867 *worktree_name = *bare_refname;
868 if (!slash) {
869 *worktree_name_length = strlen(*worktree_name);
871 /* This is an error condition, and the caller tell because the bare_refname is "" */
872 *bare_refname = *worktree_name + *worktree_name_length;
873 return REF_WORKTREE_OTHER;
876 *worktree_name_length = slash - *bare_refname;
877 *bare_refname = slash + 1;
879 if (is_current_worktree_ref(*bare_refname))
880 return REF_WORKTREE_OTHER;
883 *worktree_name = NULL;
884 *worktree_name_length = 0;
886 if (skip_prefix(maybe_worktree_ref, "main-worktree/", bare_refname)
887 && is_current_worktree_ref(*bare_refname))
888 return REF_WORKTREE_MAIN;
890 *bare_refname = maybe_worktree_ref;
891 if (is_current_worktree_ref(maybe_worktree_ref))
892 return REF_WORKTREE_CURRENT;
894 return REF_WORKTREE_SHARED;
897 long get_files_ref_lock_timeout_ms(void)
899 static int configured = 0;
901 /* The default timeout is 100 ms: */
902 static int timeout_ms = 100;
904 if (!configured) {
905 git_config_get_int("core.filesreflocktimeout", &timeout_ms);
906 configured = 1;
909 return timeout_ms;
912 int refs_delete_ref(struct ref_store *refs, const char *msg,
913 const char *refname,
914 const struct object_id *old_oid,
915 unsigned int flags)
917 struct ref_transaction *transaction;
918 struct strbuf err = STRBUF_INIT;
920 transaction = ref_store_transaction_begin(refs, &err);
921 if (!transaction ||
922 ref_transaction_delete(transaction, refname, old_oid,
923 flags, msg, &err) ||
924 ref_transaction_commit(transaction, &err)) {
925 error("%s", err.buf);
926 ref_transaction_free(transaction);
927 strbuf_release(&err);
928 return 1;
930 ref_transaction_free(transaction);
931 strbuf_release(&err);
932 return 0;
935 int delete_ref(const char *msg, const char *refname,
936 const struct object_id *old_oid, unsigned int flags)
938 return refs_delete_ref(get_main_ref_store(the_repository), msg, refname,
939 old_oid, flags);
942 static void copy_reflog_msg(struct strbuf *sb, const char *msg)
944 char c;
945 int wasspace = 1;
947 while ((c = *msg++)) {
948 if (wasspace && isspace(c))
949 continue;
950 wasspace = isspace(c);
951 if (wasspace)
952 c = ' ';
953 strbuf_addch(sb, c);
955 strbuf_rtrim(sb);
958 static char *normalize_reflog_message(const char *msg)
960 struct strbuf sb = STRBUF_INIT;
962 if (msg && *msg)
963 copy_reflog_msg(&sb, msg);
964 return strbuf_detach(&sb, NULL);
967 int should_autocreate_reflog(const char *refname)
969 switch (log_all_ref_updates) {
970 case LOG_REFS_ALWAYS:
971 return 1;
972 case LOG_REFS_NORMAL:
973 return starts_with(refname, "refs/heads/") ||
974 starts_with(refname, "refs/remotes/") ||
975 starts_with(refname, "refs/notes/") ||
976 !strcmp(refname, "HEAD");
977 default:
978 return 0;
982 int is_branch(const char *refname)
984 return !strcmp(refname, "HEAD") || starts_with(refname, "refs/heads/");
987 struct read_ref_at_cb {
988 const char *refname;
989 timestamp_t at_time;
990 int cnt;
991 int reccnt;
992 struct object_id *oid;
993 int found_it;
995 struct object_id ooid;
996 struct object_id noid;
997 int tz;
998 timestamp_t date;
999 char **msg;
1000 timestamp_t *cutoff_time;
1001 int *cutoff_tz;
1002 int *cutoff_cnt;
1005 static void set_read_ref_cutoffs(struct read_ref_at_cb *cb,
1006 timestamp_t timestamp, int tz, const char *message)
1008 if (cb->msg)
1009 *cb->msg = xstrdup(message);
1010 if (cb->cutoff_time)
1011 *cb->cutoff_time = timestamp;
1012 if (cb->cutoff_tz)
1013 *cb->cutoff_tz = tz;
1014 if (cb->cutoff_cnt)
1015 *cb->cutoff_cnt = cb->reccnt;
1018 static int read_ref_at_ent(struct object_id *ooid, struct object_id *noid,
1019 const char *email UNUSED,
1020 timestamp_t timestamp, int tz,
1021 const char *message, void *cb_data)
1023 struct read_ref_at_cb *cb = cb_data;
1024 int reached_count;
1026 cb->tz = tz;
1027 cb->date = timestamp;
1030 * It is not possible for cb->cnt == 0 on the first iteration because
1031 * that special case is handled in read_ref_at().
1033 if (cb->cnt > 0)
1034 cb->cnt--;
1035 reached_count = cb->cnt == 0 && !is_null_oid(ooid);
1036 if (timestamp <= cb->at_time || reached_count) {
1037 set_read_ref_cutoffs(cb, timestamp, tz, message);
1039 * we have not yet updated cb->[n|o]oid so they still
1040 * hold the values for the previous record.
1042 if (!is_null_oid(&cb->ooid) && !oideq(&cb->ooid, noid))
1043 warning(_("log for ref %s has gap after %s"),
1044 cb->refname, show_date(cb->date, cb->tz, DATE_MODE(RFC2822)));
1045 if (reached_count)
1046 oidcpy(cb->oid, ooid);
1047 else if (!is_null_oid(&cb->ooid) || cb->date == cb->at_time)
1048 oidcpy(cb->oid, noid);
1049 else if (!oideq(noid, cb->oid))
1050 warning(_("log for ref %s unexpectedly ended on %s"),
1051 cb->refname, show_date(cb->date, cb->tz,
1052 DATE_MODE(RFC2822)));
1053 cb->found_it = 1;
1055 cb->reccnt++;
1056 oidcpy(&cb->ooid, ooid);
1057 oidcpy(&cb->noid, noid);
1058 return cb->found_it;
1061 static int read_ref_at_ent_newest(struct object_id *ooid UNUSED,
1062 struct object_id *noid,
1063 const char *email UNUSED,
1064 timestamp_t timestamp, int tz,
1065 const char *message, void *cb_data)
1067 struct read_ref_at_cb *cb = cb_data;
1069 set_read_ref_cutoffs(cb, timestamp, tz, message);
1070 oidcpy(cb->oid, noid);
1071 /* We just want the first entry */
1072 return 1;
1075 static int read_ref_at_ent_oldest(struct object_id *ooid, struct object_id *noid,
1076 const char *email UNUSED,
1077 timestamp_t timestamp, int tz,
1078 const char *message, void *cb_data)
1080 struct read_ref_at_cb *cb = cb_data;
1082 set_read_ref_cutoffs(cb, timestamp, tz, message);
1083 oidcpy(cb->oid, ooid);
1084 if (is_null_oid(cb->oid))
1085 oidcpy(cb->oid, noid);
1086 /* We just want the first entry */
1087 return 1;
1090 int read_ref_at(struct ref_store *refs, const char *refname,
1091 unsigned int flags, timestamp_t at_time, int cnt,
1092 struct object_id *oid, char **msg,
1093 timestamp_t *cutoff_time, int *cutoff_tz, int *cutoff_cnt)
1095 struct read_ref_at_cb cb;
1097 memset(&cb, 0, sizeof(cb));
1098 cb.refname = refname;
1099 cb.at_time = at_time;
1100 cb.cnt = cnt;
1101 cb.msg = msg;
1102 cb.cutoff_time = cutoff_time;
1103 cb.cutoff_tz = cutoff_tz;
1104 cb.cutoff_cnt = cutoff_cnt;
1105 cb.oid = oid;
1107 if (cb.cnt == 0) {
1108 refs_for_each_reflog_ent_reverse(refs, refname, read_ref_at_ent_newest, &cb);
1109 return 0;
1112 refs_for_each_reflog_ent_reverse(refs, refname, read_ref_at_ent, &cb);
1114 if (!cb.reccnt) {
1115 if (flags & GET_OID_QUIETLY)
1116 exit(128);
1117 else
1118 die(_("log for %s is empty"), refname);
1120 if (cb.found_it)
1121 return 0;
1123 refs_for_each_reflog_ent(refs, refname, read_ref_at_ent_oldest, &cb);
1125 return 1;
1128 struct ref_transaction *ref_store_transaction_begin(struct ref_store *refs,
1129 struct strbuf *err)
1131 struct ref_transaction *tr;
1132 assert(err);
1134 CALLOC_ARRAY(tr, 1);
1135 tr->ref_store = refs;
1136 return tr;
1139 struct ref_transaction *ref_transaction_begin(struct strbuf *err)
1141 return ref_store_transaction_begin(get_main_ref_store(the_repository), err);
1144 void ref_transaction_free(struct ref_transaction *transaction)
1146 size_t i;
1148 if (!transaction)
1149 return;
1151 switch (transaction->state) {
1152 case REF_TRANSACTION_OPEN:
1153 case REF_TRANSACTION_CLOSED:
1154 /* OK */
1155 break;
1156 case REF_TRANSACTION_PREPARED:
1157 BUG("free called on a prepared reference transaction");
1158 break;
1159 default:
1160 BUG("unexpected reference transaction state");
1161 break;
1164 for (i = 0; i < transaction->nr; i++) {
1165 free(transaction->updates[i]->msg);
1166 free(transaction->updates[i]);
1168 free(transaction->updates);
1169 free(transaction);
1172 struct ref_update *ref_transaction_add_update(
1173 struct ref_transaction *transaction,
1174 const char *refname, unsigned int flags,
1175 const struct object_id *new_oid,
1176 const struct object_id *old_oid,
1177 const char *msg)
1179 struct ref_update *update;
1181 if (transaction->state != REF_TRANSACTION_OPEN)
1182 BUG("update called for transaction that is not open");
1184 FLEX_ALLOC_STR(update, refname, refname);
1185 ALLOC_GROW(transaction->updates, transaction->nr + 1, transaction->alloc);
1186 transaction->updates[transaction->nr++] = update;
1188 update->flags = flags;
1190 if (flags & REF_HAVE_NEW)
1191 oidcpy(&update->new_oid, new_oid);
1192 if (flags & REF_HAVE_OLD)
1193 oidcpy(&update->old_oid, old_oid);
1194 update->msg = normalize_reflog_message(msg);
1195 return update;
1198 int ref_transaction_update(struct ref_transaction *transaction,
1199 const char *refname,
1200 const struct object_id *new_oid,
1201 const struct object_id *old_oid,
1202 unsigned int flags, const char *msg,
1203 struct strbuf *err)
1205 assert(err);
1207 if (!(flags & REF_SKIP_REFNAME_VERIFICATION) &&
1208 ((new_oid && !is_null_oid(new_oid)) ?
1209 check_refname_format(refname, REFNAME_ALLOW_ONELEVEL) :
1210 !refname_is_safe(refname))) {
1211 strbuf_addf(err, _("refusing to update ref with bad name '%s'"),
1212 refname);
1213 return -1;
1216 if (flags & ~REF_TRANSACTION_UPDATE_ALLOWED_FLAGS)
1217 BUG("illegal flags 0x%x passed to ref_transaction_update()", flags);
1220 * Clear flags outside the allowed set; this should be a noop because
1221 * of the BUG() check above, but it works around a -Wnonnull warning
1222 * with some versions of "gcc -O3".
1224 flags &= REF_TRANSACTION_UPDATE_ALLOWED_FLAGS;
1226 flags |= (new_oid ? REF_HAVE_NEW : 0) | (old_oid ? REF_HAVE_OLD : 0);
1228 ref_transaction_add_update(transaction, refname, flags,
1229 new_oid, old_oid, msg);
1230 return 0;
1233 int ref_transaction_create(struct ref_transaction *transaction,
1234 const char *refname,
1235 const struct object_id *new_oid,
1236 unsigned int flags, const char *msg,
1237 struct strbuf *err)
1239 if (!new_oid || is_null_oid(new_oid)) {
1240 strbuf_addf(err, "'%s' has a null OID", refname);
1241 return 1;
1243 return ref_transaction_update(transaction, refname, new_oid,
1244 null_oid(), flags, msg, err);
1247 int ref_transaction_delete(struct ref_transaction *transaction,
1248 const char *refname,
1249 const struct object_id *old_oid,
1250 unsigned int flags, const char *msg,
1251 struct strbuf *err)
1253 if (old_oid && is_null_oid(old_oid))
1254 BUG("delete called with old_oid set to zeros");
1255 return ref_transaction_update(transaction, refname,
1256 null_oid(), old_oid,
1257 flags, msg, err);
1260 int ref_transaction_verify(struct ref_transaction *transaction,
1261 const char *refname,
1262 const struct object_id *old_oid,
1263 unsigned int flags,
1264 struct strbuf *err)
1266 if (!old_oid)
1267 BUG("verify called with old_oid set to NULL");
1268 return ref_transaction_update(transaction, refname,
1269 NULL, old_oid,
1270 flags, NULL, err);
1273 int refs_update_ref(struct ref_store *refs, const char *msg,
1274 const char *refname, const struct object_id *new_oid,
1275 const struct object_id *old_oid, unsigned int flags,
1276 enum action_on_err onerr)
1278 struct ref_transaction *t = NULL;
1279 struct strbuf err = STRBUF_INIT;
1280 int ret = 0;
1282 t = ref_store_transaction_begin(refs, &err);
1283 if (!t ||
1284 ref_transaction_update(t, refname, new_oid, old_oid, flags, msg,
1285 &err) ||
1286 ref_transaction_commit(t, &err)) {
1287 ret = 1;
1288 ref_transaction_free(t);
1290 if (ret) {
1291 const char *str = _("update_ref failed for ref '%s': %s");
1293 switch (onerr) {
1294 case UPDATE_REFS_MSG_ON_ERR:
1295 error(str, refname, err.buf);
1296 break;
1297 case UPDATE_REFS_DIE_ON_ERR:
1298 die(str, refname, err.buf);
1299 break;
1300 case UPDATE_REFS_QUIET_ON_ERR:
1301 break;
1303 strbuf_release(&err);
1304 return 1;
1306 strbuf_release(&err);
1307 if (t)
1308 ref_transaction_free(t);
1309 return 0;
1312 int update_ref(const char *msg, const char *refname,
1313 const struct object_id *new_oid,
1314 const struct object_id *old_oid,
1315 unsigned int flags, enum action_on_err onerr)
1317 return refs_update_ref(get_main_ref_store(the_repository), msg, refname, new_oid,
1318 old_oid, flags, onerr);
1322 * Check that the string refname matches a rule of the form
1323 * "{prefix}%.*s{suffix}". So "foo/bar/baz" would match the rule
1324 * "foo/%.*s/baz", and return the string "bar".
1326 static const char *match_parse_rule(const char *refname, const char *rule,
1327 size_t *len)
1330 * Check that rule matches refname up to the first percent in the rule.
1331 * We can bail immediately if not, but otherwise we leave "rule" at the
1332 * %-placeholder, and "refname" at the start of the potential matched
1333 * name.
1335 while (*rule != '%') {
1336 if (!*rule)
1337 BUG("rev-parse rule did not have percent");
1338 if (*refname++ != *rule++)
1339 return NULL;
1343 * Check that our "%" is the expected placeholder. This assumes there
1344 * are no other percents (placeholder or quoted) in the string, but
1345 * that is sufficient for our rev-parse rules.
1347 if (!skip_prefix(rule, "%.*s", &rule))
1348 return NULL;
1351 * And now check that our suffix (if any) matches.
1353 if (!strip_suffix(refname, rule, len))
1354 return NULL;
1356 return refname; /* len set by strip_suffix() */
1359 char *refs_shorten_unambiguous_ref(struct ref_store *refs,
1360 const char *refname, int strict)
1362 int i;
1363 struct strbuf resolved_buf = STRBUF_INIT;
1365 /* skip first rule, it will always match */
1366 for (i = NUM_REV_PARSE_RULES - 1; i > 0 ; --i) {
1367 int j;
1368 int rules_to_fail = i;
1369 const char *short_name;
1370 size_t short_name_len;
1372 short_name = match_parse_rule(refname, ref_rev_parse_rules[i],
1373 &short_name_len);
1374 if (!short_name)
1375 continue;
1378 * in strict mode, all (except the matched one) rules
1379 * must fail to resolve to a valid non-ambiguous ref
1381 if (strict)
1382 rules_to_fail = NUM_REV_PARSE_RULES;
1385 * check if the short name resolves to a valid ref,
1386 * but use only rules prior to the matched one
1388 for (j = 0; j < rules_to_fail; j++) {
1389 const char *rule = ref_rev_parse_rules[j];
1391 /* skip matched rule */
1392 if (i == j)
1393 continue;
1396 * the short name is ambiguous, if it resolves
1397 * (with this previous rule) to a valid ref
1398 * read_ref() returns 0 on success
1400 strbuf_reset(&resolved_buf);
1401 strbuf_addf(&resolved_buf, rule,
1402 cast_size_t_to_int(short_name_len),
1403 short_name);
1404 if (refs_ref_exists(refs, resolved_buf.buf))
1405 break;
1409 * short name is non-ambiguous if all previous rules
1410 * haven't resolved to a valid ref
1412 if (j == rules_to_fail) {
1413 strbuf_release(&resolved_buf);
1414 return xmemdupz(short_name, short_name_len);
1418 strbuf_release(&resolved_buf);
1419 return xstrdup(refname);
1422 char *shorten_unambiguous_ref(const char *refname, int strict)
1424 return refs_shorten_unambiguous_ref(get_main_ref_store(the_repository),
1425 refname, strict);
1428 int parse_hide_refs_config(const char *var, const char *value, const char *section,
1429 struct string_list *hide_refs)
1431 const char *key;
1432 if (!strcmp("transfer.hiderefs", var) ||
1433 (!parse_config_key(var, section, NULL, NULL, &key) &&
1434 !strcmp(key, "hiderefs"))) {
1435 char *ref;
1436 int len;
1438 if (!value)
1439 return config_error_nonbool(var);
1440 ref = xstrdup(value);
1441 len = strlen(ref);
1442 while (len && ref[len - 1] == '/')
1443 ref[--len] = '\0';
1444 string_list_append_nodup(hide_refs, ref);
1446 return 0;
1449 int ref_is_hidden(const char *refname, const char *refname_full,
1450 const struct string_list *hide_refs)
1452 int i;
1454 for (i = hide_refs->nr - 1; i >= 0; i--) {
1455 const char *match = hide_refs->items[i].string;
1456 const char *subject;
1457 int neg = 0;
1458 const char *p;
1460 if (*match == '!') {
1461 neg = 1;
1462 match++;
1465 if (*match == '^') {
1466 subject = refname_full;
1467 match++;
1468 } else {
1469 subject = refname;
1472 /* refname can be NULL when namespaces are used. */
1473 if (subject &&
1474 skip_prefix(subject, match, &p) &&
1475 (!*p || *p == '/'))
1476 return !neg;
1478 return 0;
1481 const char *find_descendant_ref(const char *dirname,
1482 const struct string_list *extras,
1483 const struct string_list *skip)
1485 int pos;
1487 if (!extras)
1488 return NULL;
1491 * Look at the place where dirname would be inserted into
1492 * extras. If there is an entry at that position that starts
1493 * with dirname (remember, dirname includes the trailing
1494 * slash) and is not in skip, then we have a conflict.
1496 for (pos = string_list_find_insert_index(extras, dirname, 0);
1497 pos < extras->nr; pos++) {
1498 const char *extra_refname = extras->items[pos].string;
1500 if (!starts_with(extra_refname, dirname))
1501 break;
1503 if (!skip || !string_list_has_string(skip, extra_refname))
1504 return extra_refname;
1506 return NULL;
1509 int refs_head_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
1511 struct object_id oid;
1512 int flag;
1514 if (refs_resolve_ref_unsafe(refs, "HEAD", RESOLVE_REF_READING,
1515 &oid, &flag))
1516 return fn("HEAD", &oid, flag, cb_data);
1518 return 0;
1521 int head_ref(each_ref_fn fn, void *cb_data)
1523 return refs_head_ref(get_main_ref_store(the_repository), fn, cb_data);
1526 struct ref_iterator *refs_ref_iterator_begin(
1527 struct ref_store *refs,
1528 const char *prefix, int trim,
1529 enum do_for_each_ref_flags flags)
1531 struct ref_iterator *iter;
1533 if (!(flags & DO_FOR_EACH_INCLUDE_BROKEN)) {
1534 static int ref_paranoia = -1;
1536 if (ref_paranoia < 0)
1537 ref_paranoia = git_env_bool("GIT_REF_PARANOIA", 1);
1538 if (ref_paranoia) {
1539 flags |= DO_FOR_EACH_INCLUDE_BROKEN;
1540 flags |= DO_FOR_EACH_OMIT_DANGLING_SYMREFS;
1544 iter = refs->be->iterator_begin(refs, prefix, flags);
1547 * `iterator_begin()` already takes care of prefix, but we
1548 * might need to do some trimming:
1550 if (trim)
1551 iter = prefix_ref_iterator_begin(iter, "", trim);
1553 /* Sanity check for subclasses: */
1554 if (!iter->ordered)
1555 BUG("reference iterator is not ordered");
1557 return iter;
1561 * Call fn for each reference in the specified submodule for which the
1562 * refname begins with prefix. If trim is non-zero, then trim that
1563 * many characters off the beginning of each refname before passing
1564 * the refname to fn. flags can be DO_FOR_EACH_INCLUDE_BROKEN to
1565 * include broken references in the iteration. If fn ever returns a
1566 * non-zero value, stop the iteration and return that value;
1567 * otherwise, return 0.
1569 static int do_for_each_repo_ref(struct repository *r, const char *prefix,
1570 each_repo_ref_fn fn, int trim, int flags,
1571 void *cb_data)
1573 struct ref_iterator *iter;
1574 struct ref_store *refs = get_main_ref_store(r);
1576 if (!refs)
1577 return 0;
1579 iter = refs_ref_iterator_begin(refs, prefix, trim, flags);
1581 return do_for_each_repo_ref_iterator(r, iter, fn, cb_data);
1584 struct do_for_each_ref_help {
1585 each_ref_fn *fn;
1586 void *cb_data;
1589 static int do_for_each_ref_helper(struct repository *r,
1590 const char *refname,
1591 const struct object_id *oid,
1592 int flags,
1593 void *cb_data)
1595 struct do_for_each_ref_help *hp = cb_data;
1597 return hp->fn(refname, oid, flags, hp->cb_data);
1600 static int do_for_each_ref(struct ref_store *refs, const char *prefix,
1601 each_ref_fn fn, int trim,
1602 enum do_for_each_ref_flags flags, void *cb_data)
1604 struct ref_iterator *iter;
1605 struct do_for_each_ref_help hp = { fn, cb_data };
1607 if (!refs)
1608 return 0;
1610 iter = refs_ref_iterator_begin(refs, prefix, trim, flags);
1612 return do_for_each_repo_ref_iterator(the_repository, iter,
1613 do_for_each_ref_helper, &hp);
1616 int refs_for_each_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
1618 return do_for_each_ref(refs, "", fn, 0, 0, cb_data);
1621 int for_each_ref(each_ref_fn fn, void *cb_data)
1623 return refs_for_each_ref(get_main_ref_store(the_repository), fn, cb_data);
1626 int refs_for_each_ref_in(struct ref_store *refs, const char *prefix,
1627 each_ref_fn fn, void *cb_data)
1629 return do_for_each_ref(refs, prefix, fn, strlen(prefix), 0, cb_data);
1632 int for_each_ref_in(const char *prefix, each_ref_fn fn, void *cb_data)
1634 return refs_for_each_ref_in(get_main_ref_store(the_repository), prefix, fn, cb_data);
1637 int for_each_fullref_in(const char *prefix, each_ref_fn fn, void *cb_data)
1639 return do_for_each_ref(get_main_ref_store(the_repository),
1640 prefix, fn, 0, 0, cb_data);
1643 int refs_for_each_fullref_in(struct ref_store *refs, const char *prefix,
1644 each_ref_fn fn, void *cb_data)
1646 return do_for_each_ref(refs, prefix, fn, 0, 0, cb_data);
1649 int for_each_replace_ref(struct repository *r, each_repo_ref_fn fn, void *cb_data)
1651 const char *git_replace_ref_base = ref_namespace[NAMESPACE_REPLACE].ref;
1652 return do_for_each_repo_ref(r, git_replace_ref_base, fn,
1653 strlen(git_replace_ref_base),
1654 DO_FOR_EACH_INCLUDE_BROKEN, cb_data);
1657 int for_each_namespaced_ref(each_ref_fn fn, void *cb_data)
1659 struct strbuf buf = STRBUF_INIT;
1660 int ret;
1661 strbuf_addf(&buf, "%srefs/", get_git_namespace());
1662 ret = do_for_each_ref(get_main_ref_store(the_repository),
1663 buf.buf, fn, 0, 0, cb_data);
1664 strbuf_release(&buf);
1665 return ret;
1668 int refs_for_each_rawref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
1670 return do_for_each_ref(refs, "", fn, 0,
1671 DO_FOR_EACH_INCLUDE_BROKEN, cb_data);
1674 int for_each_rawref(each_ref_fn fn, void *cb_data)
1676 return refs_for_each_rawref(get_main_ref_store(the_repository), fn, cb_data);
1679 static int qsort_strcmp(const void *va, const void *vb)
1681 const char *a = *(const char **)va;
1682 const char *b = *(const char **)vb;
1684 return strcmp(a, b);
1687 static void find_longest_prefixes_1(struct string_list *out,
1688 struct strbuf *prefix,
1689 const char **patterns, size_t nr)
1691 size_t i;
1693 for (i = 0; i < nr; i++) {
1694 char c = patterns[i][prefix->len];
1695 if (!c || is_glob_special(c)) {
1696 string_list_append(out, prefix->buf);
1697 return;
1701 i = 0;
1702 while (i < nr) {
1703 size_t end;
1706 * Set "end" to the index of the element _after_ the last one
1707 * in our group.
1709 for (end = i + 1; end < nr; end++) {
1710 if (patterns[i][prefix->len] != patterns[end][prefix->len])
1711 break;
1714 strbuf_addch(prefix, patterns[i][prefix->len]);
1715 find_longest_prefixes_1(out, prefix, patterns + i, end - i);
1716 strbuf_setlen(prefix, prefix->len - 1);
1718 i = end;
1722 static void find_longest_prefixes(struct string_list *out,
1723 const char **patterns)
1725 struct strvec sorted = STRVEC_INIT;
1726 struct strbuf prefix = STRBUF_INIT;
1728 strvec_pushv(&sorted, patterns);
1729 QSORT(sorted.v, sorted.nr, qsort_strcmp);
1731 find_longest_prefixes_1(out, &prefix, sorted.v, sorted.nr);
1733 strvec_clear(&sorted);
1734 strbuf_release(&prefix);
1737 int refs_for_each_fullref_in_prefixes(struct ref_store *ref_store,
1738 const char *namespace,
1739 const char **patterns,
1740 each_ref_fn fn, void *cb_data)
1742 struct string_list prefixes = STRING_LIST_INIT_DUP;
1743 struct string_list_item *prefix;
1744 struct strbuf buf = STRBUF_INIT;
1745 int ret = 0, namespace_len;
1747 find_longest_prefixes(&prefixes, patterns);
1749 if (namespace)
1750 strbuf_addstr(&buf, namespace);
1751 namespace_len = buf.len;
1753 for_each_string_list_item(prefix, &prefixes) {
1754 strbuf_addstr(&buf, prefix->string);
1755 ret = refs_for_each_fullref_in(ref_store, buf.buf, fn, cb_data);
1756 if (ret)
1757 break;
1758 strbuf_setlen(&buf, namespace_len);
1761 string_list_clear(&prefixes, 0);
1762 strbuf_release(&buf);
1763 return ret;
1766 static int refs_read_special_head(struct ref_store *ref_store,
1767 const char *refname, struct object_id *oid,
1768 struct strbuf *referent, unsigned int *type,
1769 int *failure_errno)
1771 struct strbuf full_path = STRBUF_INIT;
1772 struct strbuf content = STRBUF_INIT;
1773 int result = -1;
1774 strbuf_addf(&full_path, "%s/%s", ref_store->gitdir, refname);
1776 if (strbuf_read_file(&content, full_path.buf, 0) < 0)
1777 goto done;
1779 result = parse_loose_ref_contents(content.buf, oid, referent, type,
1780 failure_errno);
1782 done:
1783 strbuf_release(&full_path);
1784 strbuf_release(&content);
1785 return result;
1788 int refs_read_raw_ref(struct ref_store *ref_store, const char *refname,
1789 struct object_id *oid, struct strbuf *referent,
1790 unsigned int *type, int *failure_errno)
1792 assert(failure_errno);
1793 if (!strcmp(refname, "FETCH_HEAD") || !strcmp(refname, "MERGE_HEAD")) {
1794 return refs_read_special_head(ref_store, refname, oid, referent,
1795 type, failure_errno);
1798 return ref_store->be->read_raw_ref(ref_store, refname, oid, referent,
1799 type, failure_errno);
1802 int refs_read_symbolic_ref(struct ref_store *ref_store, const char *refname,
1803 struct strbuf *referent)
1805 return ref_store->be->read_symbolic_ref(ref_store, refname, referent);
1808 const char *refs_resolve_ref_unsafe(struct ref_store *refs,
1809 const char *refname,
1810 int resolve_flags,
1811 struct object_id *oid,
1812 int *flags)
1814 static struct strbuf sb_refname = STRBUF_INIT;
1815 struct object_id unused_oid;
1816 int unused_flags;
1817 int symref_count;
1819 if (!oid)
1820 oid = &unused_oid;
1821 if (!flags)
1822 flags = &unused_flags;
1824 *flags = 0;
1826 if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
1827 if (!(resolve_flags & RESOLVE_REF_ALLOW_BAD_NAME) ||
1828 !refname_is_safe(refname))
1829 return NULL;
1832 * repo_dwim_ref() uses REF_ISBROKEN to distinguish between
1833 * missing refs and refs that were present but invalid,
1834 * to complain about the latter to stderr.
1836 * We don't know whether the ref exists, so don't set
1837 * REF_ISBROKEN yet.
1839 *flags |= REF_BAD_NAME;
1842 for (symref_count = 0; symref_count < SYMREF_MAXDEPTH; symref_count++) {
1843 unsigned int read_flags = 0;
1844 int failure_errno;
1846 if (refs_read_raw_ref(refs, refname, oid, &sb_refname,
1847 &read_flags, &failure_errno)) {
1848 *flags |= read_flags;
1850 /* In reading mode, refs must eventually resolve */
1851 if (resolve_flags & RESOLVE_REF_READING)
1852 return NULL;
1855 * Otherwise a missing ref is OK. But the files backend
1856 * may show errors besides ENOENT if there are
1857 * similarly-named refs.
1859 if (failure_errno != ENOENT &&
1860 failure_errno != EISDIR &&
1861 failure_errno != ENOTDIR)
1862 return NULL;
1864 oidclr(oid);
1865 if (*flags & REF_BAD_NAME)
1866 *flags |= REF_ISBROKEN;
1867 return refname;
1870 *flags |= read_flags;
1872 if (!(read_flags & REF_ISSYMREF)) {
1873 if (*flags & REF_BAD_NAME) {
1874 oidclr(oid);
1875 *flags |= REF_ISBROKEN;
1877 return refname;
1880 refname = sb_refname.buf;
1881 if (resolve_flags & RESOLVE_REF_NO_RECURSE) {
1882 oidclr(oid);
1883 return refname;
1885 if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
1886 if (!(resolve_flags & RESOLVE_REF_ALLOW_BAD_NAME) ||
1887 !refname_is_safe(refname))
1888 return NULL;
1890 *flags |= REF_ISBROKEN | REF_BAD_NAME;
1894 return NULL;
1897 /* backend functions */
1898 int refs_init_db(struct strbuf *err)
1900 struct ref_store *refs = get_main_ref_store(the_repository);
1902 return refs->be->init_db(refs, err);
1905 const char *resolve_ref_unsafe(const char *refname, int resolve_flags,
1906 struct object_id *oid, int *flags)
1908 return refs_resolve_ref_unsafe(get_main_ref_store(the_repository), refname,
1909 resolve_flags, oid, flags);
1912 int resolve_gitlink_ref(const char *submodule, const char *refname,
1913 struct object_id *oid)
1915 struct ref_store *refs;
1916 int flags;
1918 refs = get_submodule_ref_store(submodule);
1920 if (!refs)
1921 return -1;
1923 if (!refs_resolve_ref_unsafe(refs, refname, 0, oid, &flags) ||
1924 is_null_oid(oid))
1925 return -1;
1926 return 0;
1929 struct ref_store_hash_entry
1931 struct hashmap_entry ent;
1933 struct ref_store *refs;
1935 /* NUL-terminated identifier of the ref store: */
1936 char name[FLEX_ARRAY];
1939 static int ref_store_hash_cmp(const void *cmp_data UNUSED,
1940 const struct hashmap_entry *eptr,
1941 const struct hashmap_entry *entry_or_key,
1942 const void *keydata)
1944 const struct ref_store_hash_entry *e1, *e2;
1945 const char *name;
1947 e1 = container_of(eptr, const struct ref_store_hash_entry, ent);
1948 e2 = container_of(entry_or_key, const struct ref_store_hash_entry, ent);
1949 name = keydata ? keydata : e2->name;
1951 return strcmp(e1->name, name);
1954 static struct ref_store_hash_entry *alloc_ref_store_hash_entry(
1955 const char *name, struct ref_store *refs)
1957 struct ref_store_hash_entry *entry;
1959 FLEX_ALLOC_STR(entry, name, name);
1960 hashmap_entry_init(&entry->ent, strhash(name));
1961 entry->refs = refs;
1962 return entry;
1965 /* A hashmap of ref_stores, stored by submodule name: */
1966 static struct hashmap submodule_ref_stores;
1968 /* A hashmap of ref_stores, stored by worktree id: */
1969 static struct hashmap worktree_ref_stores;
1972 * Look up a ref store by name. If that ref_store hasn't been
1973 * registered yet, return NULL.
1975 static struct ref_store *lookup_ref_store_map(struct hashmap *map,
1976 const char *name)
1978 struct ref_store_hash_entry *entry;
1979 unsigned int hash;
1981 if (!map->tablesize)
1982 /* It's initialized on demand in register_ref_store(). */
1983 return NULL;
1985 hash = strhash(name);
1986 entry = hashmap_get_entry_from_hash(map, hash, name,
1987 struct ref_store_hash_entry, ent);
1988 return entry ? entry->refs : NULL;
1992 * Create, record, and return a ref_store instance for the specified
1993 * gitdir.
1995 static struct ref_store *ref_store_init(struct repository *repo,
1996 const char *gitdir,
1997 unsigned int flags)
1999 const char *be_name = "files";
2000 struct ref_storage_be *be = find_ref_storage_backend(be_name);
2001 struct ref_store *refs;
2003 if (!be)
2004 BUG("reference backend %s is unknown", be_name);
2006 refs = be->init(repo, gitdir, flags);
2007 return refs;
2010 struct ref_store *get_main_ref_store(struct repository *r)
2012 if (r->refs_private)
2013 return r->refs_private;
2015 if (!r->gitdir)
2016 BUG("attempting to get main_ref_store outside of repository");
2018 r->refs_private = ref_store_init(r, r->gitdir, REF_STORE_ALL_CAPS);
2019 r->refs_private = maybe_debug_wrap_ref_store(r->gitdir, r->refs_private);
2020 return r->refs_private;
2024 * Associate a ref store with a name. It is a fatal error to call this
2025 * function twice for the same name.
2027 static void register_ref_store_map(struct hashmap *map,
2028 const char *type,
2029 struct ref_store *refs,
2030 const char *name)
2032 struct ref_store_hash_entry *entry;
2034 if (!map->tablesize)
2035 hashmap_init(map, ref_store_hash_cmp, NULL, 0);
2037 entry = alloc_ref_store_hash_entry(name, refs);
2038 if (hashmap_put(map, &entry->ent))
2039 BUG("%s ref_store '%s' initialized twice", type, name);
2042 struct ref_store *get_submodule_ref_store(const char *submodule)
2044 struct strbuf submodule_sb = STRBUF_INIT;
2045 struct ref_store *refs;
2046 char *to_free = NULL;
2047 size_t len;
2048 struct repository *subrepo;
2050 if (!submodule)
2051 return NULL;
2053 len = strlen(submodule);
2054 while (len && is_dir_sep(submodule[len - 1]))
2055 len--;
2056 if (!len)
2057 return NULL;
2059 if (submodule[len])
2060 /* We need to strip off one or more trailing slashes */
2061 submodule = to_free = xmemdupz(submodule, len);
2063 refs = lookup_ref_store_map(&submodule_ref_stores, submodule);
2064 if (refs)
2065 goto done;
2067 strbuf_addstr(&submodule_sb, submodule);
2068 if (!is_nonbare_repository_dir(&submodule_sb))
2069 goto done;
2071 if (submodule_to_gitdir(&submodule_sb, submodule))
2072 goto done;
2074 subrepo = xmalloc(sizeof(*subrepo));
2076 * NEEDSWORK: Make get_submodule_ref_store() work with arbitrary
2077 * superprojects other than the_repository. This probably should be
2078 * done by making it take a struct repository * parameter instead of a
2079 * submodule path.
2081 if (repo_submodule_init(subrepo, the_repository, submodule,
2082 null_oid())) {
2083 free(subrepo);
2084 goto done;
2086 refs = ref_store_init(subrepo, submodule_sb.buf,
2087 REF_STORE_READ | REF_STORE_ODB);
2088 register_ref_store_map(&submodule_ref_stores, "submodule",
2089 refs, submodule);
2091 done:
2092 strbuf_release(&submodule_sb);
2093 free(to_free);
2095 return refs;
2098 struct ref_store *get_worktree_ref_store(const struct worktree *wt)
2100 struct ref_store *refs;
2101 const char *id;
2103 if (wt->is_current)
2104 return get_main_ref_store(the_repository);
2106 id = wt->id ? wt->id : "/";
2107 refs = lookup_ref_store_map(&worktree_ref_stores, id);
2108 if (refs)
2109 return refs;
2111 if (wt->id)
2112 refs = ref_store_init(the_repository,
2113 git_common_path("worktrees/%s", wt->id),
2114 REF_STORE_ALL_CAPS);
2115 else
2116 refs = ref_store_init(the_repository,
2117 get_git_common_dir(),
2118 REF_STORE_ALL_CAPS);
2120 if (refs)
2121 register_ref_store_map(&worktree_ref_stores, "worktree",
2122 refs, id);
2123 return refs;
2126 void base_ref_store_init(struct ref_store *refs, struct repository *repo,
2127 const char *path, const struct ref_storage_be *be)
2129 refs->be = be;
2130 refs->repo = repo;
2131 refs->gitdir = xstrdup(path);
2134 /* backend functions */
2135 int refs_pack_refs(struct ref_store *refs, unsigned int flags)
2137 return refs->be->pack_refs(refs, flags);
2140 int peel_iterated_oid(const struct object_id *base, struct object_id *peeled)
2142 if (current_ref_iter &&
2143 (current_ref_iter->oid == base ||
2144 oideq(current_ref_iter->oid, base)))
2145 return ref_iterator_peel(current_ref_iter, peeled);
2147 return peel_object(base, peeled) ? -1 : 0;
2150 int refs_create_symref(struct ref_store *refs,
2151 const char *ref_target,
2152 const char *refs_heads_master,
2153 const char *logmsg)
2155 char *msg;
2156 int retval;
2158 msg = normalize_reflog_message(logmsg);
2159 retval = refs->be->create_symref(refs, ref_target, refs_heads_master,
2160 msg);
2161 free(msg);
2162 return retval;
2165 int create_symref(const char *ref_target, const char *refs_heads_master,
2166 const char *logmsg)
2168 return refs_create_symref(get_main_ref_store(the_repository), ref_target,
2169 refs_heads_master, logmsg);
2172 int ref_update_reject_duplicates(struct string_list *refnames,
2173 struct strbuf *err)
2175 size_t i, n = refnames->nr;
2177 assert(err);
2179 for (i = 1; i < n; i++) {
2180 int cmp = strcmp(refnames->items[i - 1].string,
2181 refnames->items[i].string);
2183 if (!cmp) {
2184 strbuf_addf(err,
2185 _("multiple updates for ref '%s' not allowed"),
2186 refnames->items[i].string);
2187 return 1;
2188 } else if (cmp > 0) {
2189 BUG("ref_update_reject_duplicates() received unsorted list");
2192 return 0;
2195 static int run_transaction_hook(struct ref_transaction *transaction,
2196 const char *state)
2198 struct child_process proc = CHILD_PROCESS_INIT;
2199 struct strbuf buf = STRBUF_INIT;
2200 const char *hook;
2201 int ret = 0, i;
2203 hook = find_hook("reference-transaction");
2204 if (!hook)
2205 return ret;
2207 strvec_pushl(&proc.args, hook, state, NULL);
2208 proc.in = -1;
2209 proc.stdout_to_stderr = 1;
2210 proc.trace2_hook_name = "reference-transaction";
2212 ret = start_command(&proc);
2213 if (ret)
2214 return ret;
2216 sigchain_push(SIGPIPE, SIG_IGN);
2218 for (i = 0; i < transaction->nr; i++) {
2219 struct ref_update *update = transaction->updates[i];
2221 strbuf_reset(&buf);
2222 strbuf_addf(&buf, "%s %s %s\n",
2223 oid_to_hex(&update->old_oid),
2224 oid_to_hex(&update->new_oid),
2225 update->refname);
2227 if (write_in_full(proc.in, buf.buf, buf.len) < 0) {
2228 if (errno != EPIPE) {
2229 /* Don't leak errno outside this API */
2230 errno = 0;
2231 ret = -1;
2233 break;
2237 close(proc.in);
2238 sigchain_pop(SIGPIPE);
2239 strbuf_release(&buf);
2241 ret |= finish_command(&proc);
2242 return ret;
2245 int ref_transaction_prepare(struct ref_transaction *transaction,
2246 struct strbuf *err)
2248 struct ref_store *refs = transaction->ref_store;
2249 int ret;
2251 switch (transaction->state) {
2252 case REF_TRANSACTION_OPEN:
2253 /* Good. */
2254 break;
2255 case REF_TRANSACTION_PREPARED:
2256 BUG("prepare called twice on reference transaction");
2257 break;
2258 case REF_TRANSACTION_CLOSED:
2259 BUG("prepare called on a closed reference transaction");
2260 break;
2261 default:
2262 BUG("unexpected reference transaction state");
2263 break;
2266 if (refs->repo->objects->odb->disable_ref_updates) {
2267 strbuf_addstr(err,
2268 _("ref updates forbidden inside quarantine environment"));
2269 return -1;
2272 ret = refs->be->transaction_prepare(refs, transaction, err);
2273 if (ret)
2274 return ret;
2276 ret = run_transaction_hook(transaction, "prepared");
2277 if (ret) {
2278 ref_transaction_abort(transaction, err);
2279 die(_("ref updates aborted by hook"));
2282 return 0;
2285 int ref_transaction_abort(struct ref_transaction *transaction,
2286 struct strbuf *err)
2288 struct ref_store *refs = transaction->ref_store;
2289 int ret = 0;
2291 switch (transaction->state) {
2292 case REF_TRANSACTION_OPEN:
2293 /* No need to abort explicitly. */
2294 break;
2295 case REF_TRANSACTION_PREPARED:
2296 ret = refs->be->transaction_abort(refs, transaction, err);
2297 break;
2298 case REF_TRANSACTION_CLOSED:
2299 BUG("abort called on a closed reference transaction");
2300 break;
2301 default:
2302 BUG("unexpected reference transaction state");
2303 break;
2306 run_transaction_hook(transaction, "aborted");
2308 ref_transaction_free(transaction);
2309 return ret;
2312 int ref_transaction_commit(struct ref_transaction *transaction,
2313 struct strbuf *err)
2315 struct ref_store *refs = transaction->ref_store;
2316 int ret;
2318 switch (transaction->state) {
2319 case REF_TRANSACTION_OPEN:
2320 /* Need to prepare first. */
2321 ret = ref_transaction_prepare(transaction, err);
2322 if (ret)
2323 return ret;
2324 break;
2325 case REF_TRANSACTION_PREPARED:
2326 /* Fall through to finish. */
2327 break;
2328 case REF_TRANSACTION_CLOSED:
2329 BUG("commit called on a closed reference transaction");
2330 break;
2331 default:
2332 BUG("unexpected reference transaction state");
2333 break;
2336 ret = refs->be->transaction_finish(refs, transaction, err);
2337 if (!ret)
2338 run_transaction_hook(transaction, "committed");
2339 return ret;
2342 int refs_verify_refname_available(struct ref_store *refs,
2343 const char *refname,
2344 const struct string_list *extras,
2345 const struct string_list *skip,
2346 struct strbuf *err)
2348 const char *slash;
2349 const char *extra_refname;
2350 struct strbuf dirname = STRBUF_INIT;
2351 struct strbuf referent = STRBUF_INIT;
2352 struct object_id oid;
2353 unsigned int type;
2354 struct ref_iterator *iter;
2355 int ok;
2356 int ret = -1;
2359 * For the sake of comments in this function, suppose that
2360 * refname is "refs/foo/bar".
2363 assert(err);
2365 strbuf_grow(&dirname, strlen(refname) + 1);
2366 for (slash = strchr(refname, '/'); slash; slash = strchr(slash + 1, '/')) {
2368 * Just saying "Is a directory" when we e.g. can't
2369 * lock some multi-level ref isn't very informative,
2370 * the user won't be told *what* is a directory, so
2371 * let's not use strerror() below.
2373 int ignore_errno;
2374 /* Expand dirname to the new prefix, not including the trailing slash: */
2375 strbuf_add(&dirname, refname + dirname.len, slash - refname - dirname.len);
2378 * We are still at a leading dir of the refname (e.g.,
2379 * "refs/foo"; if there is a reference with that name,
2380 * it is a conflict, *unless* it is in skip.
2382 if (skip && string_list_has_string(skip, dirname.buf))
2383 continue;
2385 if (!refs_read_raw_ref(refs, dirname.buf, &oid, &referent,
2386 &type, &ignore_errno)) {
2387 strbuf_addf(err, _("'%s' exists; cannot create '%s'"),
2388 dirname.buf, refname);
2389 goto cleanup;
2392 if (extras && string_list_has_string(extras, dirname.buf)) {
2393 strbuf_addf(err, _("cannot process '%s' and '%s' at the same time"),
2394 refname, dirname.buf);
2395 goto cleanup;
2400 * We are at the leaf of our refname (e.g., "refs/foo/bar").
2401 * There is no point in searching for a reference with that
2402 * name, because a refname isn't considered to conflict with
2403 * itself. But we still need to check for references whose
2404 * names are in the "refs/foo/bar/" namespace, because they
2405 * *do* conflict.
2407 strbuf_addstr(&dirname, refname + dirname.len);
2408 strbuf_addch(&dirname, '/');
2410 iter = refs_ref_iterator_begin(refs, dirname.buf, 0,
2411 DO_FOR_EACH_INCLUDE_BROKEN);
2412 while ((ok = ref_iterator_advance(iter)) == ITER_OK) {
2413 if (skip &&
2414 string_list_has_string(skip, iter->refname))
2415 continue;
2417 strbuf_addf(err, _("'%s' exists; cannot create '%s'"),
2418 iter->refname, refname);
2419 ref_iterator_abort(iter);
2420 goto cleanup;
2423 if (ok != ITER_DONE)
2424 BUG("error while iterating over references");
2426 extra_refname = find_descendant_ref(dirname.buf, extras, skip);
2427 if (extra_refname)
2428 strbuf_addf(err, _("cannot process '%s' and '%s' at the same time"),
2429 refname, extra_refname);
2430 else
2431 ret = 0;
2433 cleanup:
2434 strbuf_release(&referent);
2435 strbuf_release(&dirname);
2436 return ret;
2439 int refs_for_each_reflog(struct ref_store *refs, each_ref_fn fn, void *cb_data)
2441 struct ref_iterator *iter;
2442 struct do_for_each_ref_help hp = { fn, cb_data };
2444 iter = refs->be->reflog_iterator_begin(refs);
2446 return do_for_each_repo_ref_iterator(the_repository, iter,
2447 do_for_each_ref_helper, &hp);
2450 int for_each_reflog(each_ref_fn fn, void *cb_data)
2452 return refs_for_each_reflog(get_main_ref_store(the_repository), fn, cb_data);
2455 int refs_for_each_reflog_ent_reverse(struct ref_store *refs,
2456 const char *refname,
2457 each_reflog_ent_fn fn,
2458 void *cb_data)
2460 return refs->be->for_each_reflog_ent_reverse(refs, refname,
2461 fn, cb_data);
2464 int for_each_reflog_ent_reverse(const char *refname, each_reflog_ent_fn fn,
2465 void *cb_data)
2467 return refs_for_each_reflog_ent_reverse(get_main_ref_store(the_repository),
2468 refname, fn, cb_data);
2471 int refs_for_each_reflog_ent(struct ref_store *refs, const char *refname,
2472 each_reflog_ent_fn fn, void *cb_data)
2474 return refs->be->for_each_reflog_ent(refs, refname, fn, cb_data);
2477 int for_each_reflog_ent(const char *refname, each_reflog_ent_fn fn,
2478 void *cb_data)
2480 return refs_for_each_reflog_ent(get_main_ref_store(the_repository), refname,
2481 fn, cb_data);
2484 int refs_reflog_exists(struct ref_store *refs, const char *refname)
2486 return refs->be->reflog_exists(refs, refname);
2489 int reflog_exists(const char *refname)
2491 return refs_reflog_exists(get_main_ref_store(the_repository), refname);
2494 int refs_create_reflog(struct ref_store *refs, const char *refname,
2495 struct strbuf *err)
2497 return refs->be->create_reflog(refs, refname, err);
2500 int safe_create_reflog(const char *refname, struct strbuf *err)
2502 return refs_create_reflog(get_main_ref_store(the_repository), refname,
2503 err);
2506 int refs_delete_reflog(struct ref_store *refs, const char *refname)
2508 return refs->be->delete_reflog(refs, refname);
2511 int delete_reflog(const char *refname)
2513 return refs_delete_reflog(get_main_ref_store(the_repository), refname);
2516 int refs_reflog_expire(struct ref_store *refs,
2517 const char *refname,
2518 unsigned int flags,
2519 reflog_expiry_prepare_fn prepare_fn,
2520 reflog_expiry_should_prune_fn should_prune_fn,
2521 reflog_expiry_cleanup_fn cleanup_fn,
2522 void *policy_cb_data)
2524 return refs->be->reflog_expire(refs, refname, flags,
2525 prepare_fn, should_prune_fn,
2526 cleanup_fn, policy_cb_data);
2529 int reflog_expire(const char *refname,
2530 unsigned int flags,
2531 reflog_expiry_prepare_fn prepare_fn,
2532 reflog_expiry_should_prune_fn should_prune_fn,
2533 reflog_expiry_cleanup_fn cleanup_fn,
2534 void *policy_cb_data)
2536 return refs_reflog_expire(get_main_ref_store(the_repository),
2537 refname, flags,
2538 prepare_fn, should_prune_fn,
2539 cleanup_fn, policy_cb_data);
2542 int initial_ref_transaction_commit(struct ref_transaction *transaction,
2543 struct strbuf *err)
2545 struct ref_store *refs = transaction->ref_store;
2547 return refs->be->initial_transaction_commit(refs, transaction, err);
2550 void ref_transaction_for_each_queued_update(struct ref_transaction *transaction,
2551 ref_transaction_for_each_queued_update_fn cb,
2552 void *cb_data)
2554 int i;
2556 for (i = 0; i < transaction->nr; i++) {
2557 struct ref_update *update = transaction->updates[i];
2559 cb(update->refname,
2560 (update->flags & REF_HAVE_OLD) ? &update->old_oid : NULL,
2561 (update->flags & REF_HAVE_NEW) ? &update->new_oid : NULL,
2562 cb_data);
2566 int refs_delete_refs(struct ref_store *refs, const char *logmsg,
2567 struct string_list *refnames, unsigned int flags)
2569 char *msg;
2570 int retval;
2572 msg = normalize_reflog_message(logmsg);
2573 retval = refs->be->delete_refs(refs, msg, refnames, flags);
2574 free(msg);
2575 return retval;
2578 int delete_refs(const char *msg, struct string_list *refnames,
2579 unsigned int flags)
2581 return refs_delete_refs(get_main_ref_store(the_repository), msg, refnames, flags);
2584 int refs_rename_ref(struct ref_store *refs, const char *oldref,
2585 const char *newref, const char *logmsg)
2587 char *msg;
2588 int retval;
2590 msg = normalize_reflog_message(logmsg);
2591 retval = refs->be->rename_ref(refs, oldref, newref, msg);
2592 free(msg);
2593 return retval;
2596 int rename_ref(const char *oldref, const char *newref, const char *logmsg)
2598 return refs_rename_ref(get_main_ref_store(the_repository), oldref, newref, logmsg);
2601 int refs_copy_existing_ref(struct ref_store *refs, const char *oldref,
2602 const char *newref, const char *logmsg)
2604 char *msg;
2605 int retval;
2607 msg = normalize_reflog_message(logmsg);
2608 retval = refs->be->copy_ref(refs, oldref, newref, msg);
2609 free(msg);
2610 return retval;
2613 int copy_existing_ref(const char *oldref, const char *newref, const char *logmsg)
2615 return refs_copy_existing_ref(get_main_ref_store(the_repository), oldref, newref, logmsg);