Merge branch 'en/header-split-cache-h-part-3'
[alt-git.git] / refs.c
blobc029f64982f2308ebef8e199e9ab926f36d32ae2
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-ll.h"
21 #include "object.h"
22 #include "path.h"
23 #include "tag.h"
24 #include "submodule.h"
25 #include "worktree.h"
26 #include "strvec.h"
27 #include "repository.h"
28 #include "setup.h"
29 #include "sigchain.h"
30 #include "date.h"
31 #include "commit.h"
32 #include "wildmatch.h"
33 #include "wrapper.h"
36 * List of all available backends
38 static struct ref_storage_be *refs_backends = &refs_be_files;
40 static struct ref_storage_be *find_ref_storage_backend(const char *name)
42 struct ref_storage_be *be;
43 for (be = refs_backends; be; be = be->next)
44 if (!strcmp(be->name, name))
45 return be;
46 return NULL;
50 * How to handle various characters in refnames:
51 * 0: An acceptable character for refs
52 * 1: End-of-component
53 * 2: ., look for a preceding . to reject .. in refs
54 * 3: {, look for a preceding @ to reject @{ in refs
55 * 4: A bad character: ASCII control characters, and
56 * ":", "?", "[", "\", "^", "~", SP, or TAB
57 * 5: *, reject unless REFNAME_REFSPEC_PATTERN is set
59 static unsigned char refname_disposition[256] = {
60 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
61 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
62 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 2, 1,
63 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 4,
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, 4, 4, 0, 4, 0,
66 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
67 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 4, 4
70 struct ref_namespace_info ref_namespace[] = {
71 [NAMESPACE_HEAD] = {
72 .ref = "HEAD",
73 .decoration = DECORATION_REF_HEAD,
74 .exact = 1,
76 [NAMESPACE_BRANCHES] = {
77 .ref = "refs/heads/",
78 .decoration = DECORATION_REF_LOCAL,
80 [NAMESPACE_TAGS] = {
81 .ref = "refs/tags/",
82 .decoration = DECORATION_REF_TAG,
84 [NAMESPACE_REMOTE_REFS] = {
86 * The default refspec for new remotes copies refs from
87 * refs/heads/ on the remote into refs/remotes/<remote>/.
88 * As such, "refs/remotes/" has special handling.
90 .ref = "refs/remotes/",
91 .decoration = DECORATION_REF_REMOTE,
93 [NAMESPACE_STASH] = {
95 * The single ref "refs/stash" stores the latest stash.
96 * Older stashes can be found in the reflog.
98 .ref = "refs/stash",
99 .exact = 1,
100 .decoration = DECORATION_REF_STASH,
102 [NAMESPACE_REPLACE] = {
104 * This namespace allows Git to act as if one object ID
105 * points to the content of another. Unlike the other
106 * ref namespaces, this one can be changed by the
107 * GIT_REPLACE_REF_BASE environment variable. This
108 * .namespace value will be overwritten in setup_git_env().
110 .ref = "refs/replace/",
111 .decoration = DECORATION_GRAFTED,
113 [NAMESPACE_NOTES] = {
115 * The refs/notes/commit ref points to the tip of a
116 * parallel commit history that adds metadata to commits
117 * in the normal history. This ref can be overwritten
118 * by the core.notesRef config variable or the
119 * GIT_NOTES_REFS environment variable.
121 .ref = "refs/notes/commit",
122 .exact = 1,
124 [NAMESPACE_PREFETCH] = {
126 * Prefetch refs are written by the background 'fetch'
127 * maintenance task. It allows faster foreground fetches
128 * by advertising these previously-downloaded tips without
129 * updating refs/remotes/ without user intervention.
131 .ref = "refs/prefetch/",
133 [NAMESPACE_REWRITTEN] = {
135 * Rewritten refs are used by the 'label' command in the
136 * sequencer. These are particularly useful during an
137 * interactive rebase that uses the 'merge' command.
139 .ref = "refs/rewritten/",
143 void update_ref_namespace(enum ref_namespace namespace, char *ref)
145 struct ref_namespace_info *info = &ref_namespace[namespace];
146 if (info->ref_updated)
147 free(info->ref);
148 info->ref = ref;
149 info->ref_updated = 1;
153 * Try to read one refname component from the front of refname.
154 * Return the length of the component found, or -1 if the component is
155 * not legal. It is legal if it is something reasonable to have under
156 * ".git/refs/"; We do not like it if:
158 * - it begins with ".", or
159 * - it has double dots "..", or
160 * - it has ASCII control characters, or
161 * - it has ":", "?", "[", "\", "^", "~", SP, or TAB anywhere, or
162 * - it has "*" anywhere unless REFNAME_REFSPEC_PATTERN is set, or
163 * - it ends with a "/", or
164 * - it ends with ".lock", or
165 * - it contains a "@{" portion
167 * When sanitized is not NULL, instead of rejecting the input refname
168 * as an error, try to come up with a usable replacement for the input
169 * refname in it.
171 static int check_refname_component(const char *refname, int *flags,
172 struct strbuf *sanitized)
174 const char *cp;
175 char last = '\0';
176 size_t component_start = 0; /* garbage - not a reasonable initial value */
178 if (sanitized)
179 component_start = sanitized->len;
181 for (cp = refname; ; cp++) {
182 int ch = *cp & 255;
183 unsigned char disp = refname_disposition[ch];
185 if (sanitized && disp != 1)
186 strbuf_addch(sanitized, ch);
188 switch (disp) {
189 case 1:
190 goto out;
191 case 2:
192 if (last == '.') { /* Refname contains "..". */
193 if (sanitized)
194 /* collapse ".." to single "." */
195 strbuf_setlen(sanitized, sanitized->len - 1);
196 else
197 return -1;
199 break;
200 case 3:
201 if (last == '@') { /* Refname contains "@{". */
202 if (sanitized)
203 sanitized->buf[sanitized->len-1] = '-';
204 else
205 return -1;
207 break;
208 case 4:
209 /* forbidden char */
210 if (sanitized)
211 sanitized->buf[sanitized->len-1] = '-';
212 else
213 return -1;
214 break;
215 case 5:
216 if (!(*flags & REFNAME_REFSPEC_PATTERN)) {
217 /* refspec can't be a pattern */
218 if (sanitized)
219 sanitized->buf[sanitized->len-1] = '-';
220 else
221 return -1;
225 * Unset the pattern flag so that we only accept
226 * a single asterisk for one side of refspec.
228 *flags &= ~ REFNAME_REFSPEC_PATTERN;
229 break;
231 last = ch;
233 out:
234 if (cp == refname)
235 return 0; /* Component has zero length. */
237 if (refname[0] == '.') { /* Component starts with '.'. */
238 if (sanitized)
239 sanitized->buf[component_start] = '-';
240 else
241 return -1;
243 if (cp - refname >= LOCK_SUFFIX_LEN &&
244 !memcmp(cp - LOCK_SUFFIX_LEN, LOCK_SUFFIX, LOCK_SUFFIX_LEN)) {
245 if (!sanitized)
246 return -1;
247 /* Refname ends with ".lock". */
248 while (strbuf_strip_suffix(sanitized, LOCK_SUFFIX)) {
249 /* try again in case we have .lock.lock */
252 return cp - refname;
255 static int check_or_sanitize_refname(const char *refname, int flags,
256 struct strbuf *sanitized)
258 int component_len, component_count = 0;
260 if (!strcmp(refname, "@")) {
261 /* Refname is a single character '@'. */
262 if (sanitized)
263 strbuf_addch(sanitized, '-');
264 else
265 return -1;
268 while (1) {
269 if (sanitized && sanitized->len)
270 strbuf_complete(sanitized, '/');
272 /* We are at the start of a path component. */
273 component_len = check_refname_component(refname, &flags,
274 sanitized);
275 if (sanitized && component_len == 0)
276 ; /* OK, omit empty component */
277 else if (component_len <= 0)
278 return -1;
280 component_count++;
281 if (refname[component_len] == '\0')
282 break;
283 /* Skip to next component. */
284 refname += component_len + 1;
287 if (refname[component_len - 1] == '.') {
288 /* Refname ends with '.'. */
289 if (sanitized)
290 ; /* omit ending dot */
291 else
292 return -1;
294 if (!(flags & REFNAME_ALLOW_ONELEVEL) && component_count < 2)
295 return -1; /* Refname has only one component. */
296 return 0;
299 int check_refname_format(const char *refname, int flags)
301 return check_or_sanitize_refname(refname, flags, NULL);
304 void sanitize_refname_component(const char *refname, struct strbuf *out)
306 if (check_or_sanitize_refname(refname, REFNAME_ALLOW_ONELEVEL, out))
307 BUG("sanitizing refname '%s' check returned error", refname);
310 int refname_is_safe(const char *refname)
312 const char *rest;
314 if (skip_prefix(refname, "refs/", &rest)) {
315 char *buf;
316 int result;
317 size_t restlen = strlen(rest);
319 /* rest must not be empty, or start or end with "/" */
320 if (!restlen || *rest == '/' || rest[restlen - 1] == '/')
321 return 0;
324 * Does the refname try to escape refs/?
325 * For example: refs/foo/../bar is safe but refs/foo/../../bar
326 * is not.
328 buf = xmallocz(restlen);
329 result = !normalize_path_copy(buf, rest) && !strcmp(buf, rest);
330 free(buf);
331 return result;
334 do {
335 if (!isupper(*refname) && *refname != '_')
336 return 0;
337 refname++;
338 } while (*refname);
339 return 1;
343 * Return true if refname, which has the specified oid and flags, can
344 * be resolved to an object in the database. If the referred-to object
345 * does not exist, emit a warning and return false.
347 int ref_resolves_to_object(const char *refname,
348 struct repository *repo,
349 const struct object_id *oid,
350 unsigned int flags)
352 if (flags & REF_ISBROKEN)
353 return 0;
354 if (!repo_has_object_file(repo, oid)) {
355 error(_("%s does not point to a valid object!"), refname);
356 return 0;
358 return 1;
361 char *refs_resolve_refdup(struct ref_store *refs,
362 const char *refname, int resolve_flags,
363 struct object_id *oid, int *flags)
365 const char *result;
367 result = refs_resolve_ref_unsafe(refs, refname, resolve_flags,
368 oid, flags);
369 return xstrdup_or_null(result);
372 char *resolve_refdup(const char *refname, int resolve_flags,
373 struct object_id *oid, int *flags)
375 return refs_resolve_refdup(get_main_ref_store(the_repository),
376 refname, resolve_flags,
377 oid, flags);
380 /* The argument to filter_refs */
381 struct ref_filter {
382 const char *pattern;
383 const char *prefix;
384 each_ref_fn *fn;
385 void *cb_data;
388 int read_ref_full(const char *refname, int resolve_flags, struct object_id *oid, int *flags)
390 struct ref_store *refs = get_main_ref_store(the_repository);
392 if (refs_resolve_ref_unsafe(refs, refname, resolve_flags,
393 oid, flags))
394 return 0;
395 return -1;
398 int read_ref(const char *refname, struct object_id *oid)
400 return read_ref_full(refname, RESOLVE_REF_READING, oid, NULL);
403 int refs_ref_exists(struct ref_store *refs, const char *refname)
405 return !!refs_resolve_ref_unsafe(refs, refname, RESOLVE_REF_READING,
406 NULL, NULL);
409 int ref_exists(const char *refname)
411 return refs_ref_exists(get_main_ref_store(the_repository), refname);
414 static int filter_refs(const char *refname, const struct object_id *oid,
415 int flags, void *data)
417 struct ref_filter *filter = (struct ref_filter *)data;
419 if (wildmatch(filter->pattern, refname, 0))
420 return 0;
421 if (filter->prefix)
422 skip_prefix(refname, filter->prefix, &refname);
423 return filter->fn(refname, oid, flags, filter->cb_data);
426 enum peel_status peel_object(const struct object_id *name, struct object_id *oid)
428 struct object *o = lookup_unknown_object(the_repository, name);
430 if (o->type == OBJ_NONE) {
431 int type = oid_object_info(the_repository, name, NULL);
432 if (type < 0 || !object_as_type(o, type, 0))
433 return PEEL_INVALID;
436 if (o->type != OBJ_TAG)
437 return PEEL_NON_TAG;
439 o = deref_tag_noverify(o);
440 if (!o)
441 return PEEL_INVALID;
443 oidcpy(oid, &o->oid);
444 return PEEL_PEELED;
447 struct warn_if_dangling_data {
448 FILE *fp;
449 const char *refname;
450 const struct string_list *refnames;
451 const char *msg_fmt;
454 static int warn_if_dangling_symref(const char *refname,
455 const struct object_id *oid UNUSED,
456 int flags, void *cb_data)
458 struct warn_if_dangling_data *d = cb_data;
459 const char *resolves_to;
461 if (!(flags & REF_ISSYMREF))
462 return 0;
464 resolves_to = resolve_ref_unsafe(refname, 0, NULL, NULL);
465 if (!resolves_to
466 || (d->refname
467 ? strcmp(resolves_to, d->refname)
468 : !string_list_has_string(d->refnames, resolves_to))) {
469 return 0;
472 fprintf(d->fp, d->msg_fmt, refname);
473 fputc('\n', d->fp);
474 return 0;
477 void warn_dangling_symref(FILE *fp, const char *msg_fmt, const char *refname)
479 struct warn_if_dangling_data data;
481 data.fp = fp;
482 data.refname = refname;
483 data.refnames = NULL;
484 data.msg_fmt = msg_fmt;
485 for_each_rawref(warn_if_dangling_symref, &data);
488 void warn_dangling_symrefs(FILE *fp, const char *msg_fmt, const struct string_list *refnames)
490 struct warn_if_dangling_data data;
492 data.fp = fp;
493 data.refname = NULL;
494 data.refnames = refnames;
495 data.msg_fmt = msg_fmt;
496 for_each_rawref(warn_if_dangling_symref, &data);
499 int refs_for_each_tag_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
501 return refs_for_each_ref_in(refs, "refs/tags/", fn, cb_data);
504 int for_each_tag_ref(each_ref_fn fn, void *cb_data)
506 return refs_for_each_tag_ref(get_main_ref_store(the_repository), fn, cb_data);
509 int refs_for_each_branch_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
511 return refs_for_each_ref_in(refs, "refs/heads/", fn, cb_data);
514 int for_each_branch_ref(each_ref_fn fn, void *cb_data)
516 return refs_for_each_branch_ref(get_main_ref_store(the_repository), fn, cb_data);
519 int refs_for_each_remote_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
521 return refs_for_each_ref_in(refs, "refs/remotes/", fn, cb_data);
524 int for_each_remote_ref(each_ref_fn fn, void *cb_data)
526 return refs_for_each_remote_ref(get_main_ref_store(the_repository), fn, cb_data);
529 int head_ref_namespaced(each_ref_fn fn, void *cb_data)
531 struct strbuf buf = STRBUF_INIT;
532 int ret = 0;
533 struct object_id oid;
534 int flag;
536 strbuf_addf(&buf, "%sHEAD", get_git_namespace());
537 if (!read_ref_full(buf.buf, RESOLVE_REF_READING, &oid, &flag))
538 ret = fn(buf.buf, &oid, flag, cb_data);
539 strbuf_release(&buf);
541 return ret;
544 void normalize_glob_ref(struct string_list_item *item, const char *prefix,
545 const char *pattern)
547 struct strbuf normalized_pattern = STRBUF_INIT;
549 if (*pattern == '/')
550 BUG("pattern must not start with '/'");
552 if (prefix)
553 strbuf_addstr(&normalized_pattern, prefix);
554 else if (!starts_with(pattern, "refs/") &&
555 strcmp(pattern, "HEAD"))
556 strbuf_addstr(&normalized_pattern, "refs/");
558 * NEEDSWORK: Special case other symrefs such as REBASE_HEAD,
559 * MERGE_HEAD, etc.
562 strbuf_addstr(&normalized_pattern, pattern);
563 strbuf_strip_suffix(&normalized_pattern, "/");
565 item->string = strbuf_detach(&normalized_pattern, NULL);
566 item->util = has_glob_specials(pattern) ? NULL : item->string;
567 strbuf_release(&normalized_pattern);
570 int for_each_glob_ref_in(each_ref_fn fn, const char *pattern,
571 const char *prefix, void *cb_data)
573 struct strbuf real_pattern = STRBUF_INIT;
574 struct ref_filter filter;
575 int ret;
577 if (!prefix && !starts_with(pattern, "refs/"))
578 strbuf_addstr(&real_pattern, "refs/");
579 else if (prefix)
580 strbuf_addstr(&real_pattern, prefix);
581 strbuf_addstr(&real_pattern, pattern);
583 if (!has_glob_specials(pattern)) {
584 /* Append implied '/' '*' if not present. */
585 strbuf_complete(&real_pattern, '/');
586 /* No need to check for '*', there is none. */
587 strbuf_addch(&real_pattern, '*');
590 filter.pattern = real_pattern.buf;
591 filter.prefix = prefix;
592 filter.fn = fn;
593 filter.cb_data = cb_data;
594 ret = for_each_ref(filter_refs, &filter);
596 strbuf_release(&real_pattern);
597 return ret;
600 int for_each_glob_ref(each_ref_fn fn, const char *pattern, void *cb_data)
602 return for_each_glob_ref_in(fn, pattern, NULL, cb_data);
605 const char *prettify_refname(const char *name)
607 if (skip_prefix(name, "refs/heads/", &name) ||
608 skip_prefix(name, "refs/tags/", &name) ||
609 skip_prefix(name, "refs/remotes/", &name))
610 ; /* nothing */
611 return name;
614 static const char *ref_rev_parse_rules[] = {
615 "%.*s",
616 "refs/%.*s",
617 "refs/tags/%.*s",
618 "refs/heads/%.*s",
619 "refs/remotes/%.*s",
620 "refs/remotes/%.*s/HEAD",
621 NULL
624 #define NUM_REV_PARSE_RULES (ARRAY_SIZE(ref_rev_parse_rules) - 1)
627 * Is it possible that the caller meant full_name with abbrev_name?
628 * If so return a non-zero value to signal "yes"; the magnitude of
629 * the returned value gives the precedence used for disambiguation.
631 * If abbrev_name cannot mean full_name, return 0.
633 int refname_match(const char *abbrev_name, const char *full_name)
635 const char **p;
636 const int abbrev_name_len = strlen(abbrev_name);
637 const int num_rules = NUM_REV_PARSE_RULES;
639 for (p = ref_rev_parse_rules; *p; p++)
640 if (!strcmp(full_name, mkpath(*p, abbrev_name_len, abbrev_name)))
641 return &ref_rev_parse_rules[num_rules] - p;
643 return 0;
647 * Given a 'prefix' expand it by the rules in 'ref_rev_parse_rules' and add
648 * the results to 'prefixes'
650 void expand_ref_prefix(struct strvec *prefixes, const char *prefix)
652 const char **p;
653 int len = strlen(prefix);
655 for (p = ref_rev_parse_rules; *p; p++)
656 strvec_pushf(prefixes, *p, len, prefix);
659 static const char default_branch_name_advice[] = N_(
660 "Using '%s' as the name for the initial branch. This default branch name\n"
661 "is subject to change. To configure the initial branch name to use in all\n"
662 "of your new repositories, which will suppress this warning, call:\n"
663 "\n"
664 "\tgit config --global init.defaultBranch <name>\n"
665 "\n"
666 "Names commonly chosen instead of 'master' are 'main', 'trunk' and\n"
667 "'development'. The just-created branch can be renamed via this command:\n"
668 "\n"
669 "\tgit branch -m <name>\n"
672 char *repo_default_branch_name(struct repository *r, int quiet)
674 const char *config_key = "init.defaultbranch";
675 const char *config_display_key = "init.defaultBranch";
676 char *ret = NULL, *full_ref;
677 const char *env = getenv("GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME");
679 if (env && *env)
680 ret = xstrdup(env);
681 else if (repo_config_get_string(r, config_key, &ret) < 0)
682 die(_("could not retrieve `%s`"), config_display_key);
684 if (!ret) {
685 ret = xstrdup("master");
686 if (!quiet)
687 advise(_(default_branch_name_advice), ret);
690 full_ref = xstrfmt("refs/heads/%s", ret);
691 if (check_refname_format(full_ref, 0))
692 die(_("invalid branch name: %s = %s"), config_display_key, ret);
693 free(full_ref);
695 return ret;
698 const char *git_default_branch_name(int quiet)
700 static char *ret;
702 if (!ret)
703 ret = repo_default_branch_name(the_repository, quiet);
705 return ret;
709 * *string and *len will only be substituted, and *string returned (for
710 * later free()ing) if the string passed in is a magic short-hand form
711 * to name a branch.
713 static char *substitute_branch_name(struct repository *r,
714 const char **string, int *len,
715 int nonfatal_dangling_mark)
717 struct strbuf buf = STRBUF_INIT;
718 struct interpret_branch_name_options options = {
719 .nonfatal_dangling_mark = nonfatal_dangling_mark
721 int ret = repo_interpret_branch_name(r, *string, *len, &buf, &options);
723 if (ret == *len) {
724 size_t size;
725 *string = strbuf_detach(&buf, &size);
726 *len = size;
727 return (char *)*string;
730 return NULL;
733 int repo_dwim_ref(struct repository *r, const char *str, int len,
734 struct object_id *oid, char **ref, int nonfatal_dangling_mark)
736 char *last_branch = substitute_branch_name(r, &str, &len,
737 nonfatal_dangling_mark);
738 int refs_found = expand_ref(r, str, len, oid, ref);
739 free(last_branch);
740 return refs_found;
743 int expand_ref(struct repository *repo, const char *str, int len,
744 struct object_id *oid, char **ref)
746 const char **p, *r;
747 int refs_found = 0;
748 struct strbuf fullref = STRBUF_INIT;
750 *ref = NULL;
751 for (p = ref_rev_parse_rules; *p; p++) {
752 struct object_id oid_from_ref;
753 struct object_id *this_result;
754 int flag;
755 struct ref_store *refs = get_main_ref_store(repo);
757 this_result = refs_found ? &oid_from_ref : oid;
758 strbuf_reset(&fullref);
759 strbuf_addf(&fullref, *p, len, str);
760 r = refs_resolve_ref_unsafe(refs, fullref.buf,
761 RESOLVE_REF_READING,
762 this_result, &flag);
763 if (r) {
764 if (!refs_found++)
765 *ref = xstrdup(r);
766 if (!warn_ambiguous_refs)
767 break;
768 } else if ((flag & REF_ISSYMREF) && strcmp(fullref.buf, "HEAD")) {
769 warning(_("ignoring dangling symref %s"), fullref.buf);
770 } else if ((flag & REF_ISBROKEN) && strchr(fullref.buf, '/')) {
771 warning(_("ignoring broken ref %s"), fullref.buf);
774 strbuf_release(&fullref);
775 return refs_found;
778 int repo_dwim_log(struct repository *r, const char *str, int len,
779 struct object_id *oid, char **log)
781 struct ref_store *refs = get_main_ref_store(r);
782 char *last_branch = substitute_branch_name(r, &str, &len, 0);
783 const char **p;
784 int logs_found = 0;
785 struct strbuf path = STRBUF_INIT;
787 *log = NULL;
788 for (p = ref_rev_parse_rules; *p; p++) {
789 struct object_id hash;
790 const char *ref, *it;
792 strbuf_reset(&path);
793 strbuf_addf(&path, *p, len, str);
794 ref = refs_resolve_ref_unsafe(refs, path.buf,
795 RESOLVE_REF_READING,
796 oid ? &hash : NULL, NULL);
797 if (!ref)
798 continue;
799 if (refs_reflog_exists(refs, path.buf))
800 it = path.buf;
801 else if (strcmp(ref, path.buf) &&
802 refs_reflog_exists(refs, ref))
803 it = ref;
804 else
805 continue;
806 if (!logs_found++) {
807 *log = xstrdup(it);
808 if (oid)
809 oidcpy(oid, &hash);
811 if (!warn_ambiguous_refs)
812 break;
814 strbuf_release(&path);
815 free(last_branch);
816 return logs_found;
819 int dwim_log(const char *str, int len, struct object_id *oid, char **log)
821 return repo_dwim_log(the_repository, str, len, oid, log);
824 int is_per_worktree_ref(const char *refname)
826 return starts_with(refname, "refs/worktree/") ||
827 starts_with(refname, "refs/bisect/") ||
828 starts_with(refname, "refs/rewritten/");
831 static int is_pseudoref_syntax(const char *refname)
833 const char *c;
835 for (c = refname; *c; c++) {
836 if (!isupper(*c) && *c != '-' && *c != '_')
837 return 0;
841 * HEAD is not a pseudoref, but it certainly uses the
842 * pseudoref syntax.
844 return 1;
847 static int is_current_worktree_ref(const char *ref) {
848 return is_pseudoref_syntax(ref) || is_per_worktree_ref(ref);
851 enum ref_worktree_type parse_worktree_ref(const char *maybe_worktree_ref,
852 const char **worktree_name, int *worktree_name_length,
853 const char **bare_refname)
855 const char *name_dummy;
856 int name_length_dummy;
857 const char *ref_dummy;
859 if (!worktree_name)
860 worktree_name = &name_dummy;
861 if (!worktree_name_length)
862 worktree_name_length = &name_length_dummy;
863 if (!bare_refname)
864 bare_refname = &ref_dummy;
866 if (skip_prefix(maybe_worktree_ref, "worktrees/", bare_refname)) {
867 const char *slash = strchr(*bare_refname, '/');
869 *worktree_name = *bare_refname;
870 if (!slash) {
871 *worktree_name_length = strlen(*worktree_name);
873 /* This is an error condition, and the caller tell because the bare_refname is "" */
874 *bare_refname = *worktree_name + *worktree_name_length;
875 return REF_WORKTREE_OTHER;
878 *worktree_name_length = slash - *bare_refname;
879 *bare_refname = slash + 1;
881 if (is_current_worktree_ref(*bare_refname))
882 return REF_WORKTREE_OTHER;
885 *worktree_name = NULL;
886 *worktree_name_length = 0;
888 if (skip_prefix(maybe_worktree_ref, "main-worktree/", bare_refname)
889 && is_current_worktree_ref(*bare_refname))
890 return REF_WORKTREE_MAIN;
892 *bare_refname = maybe_worktree_ref;
893 if (is_current_worktree_ref(maybe_worktree_ref))
894 return REF_WORKTREE_CURRENT;
896 return REF_WORKTREE_SHARED;
899 long get_files_ref_lock_timeout_ms(void)
901 static int configured = 0;
903 /* The default timeout is 100 ms: */
904 static int timeout_ms = 100;
906 if (!configured) {
907 git_config_get_int("core.filesreflocktimeout", &timeout_ms);
908 configured = 1;
911 return timeout_ms;
914 int refs_delete_ref(struct ref_store *refs, const char *msg,
915 const char *refname,
916 const struct object_id *old_oid,
917 unsigned int flags)
919 struct ref_transaction *transaction;
920 struct strbuf err = STRBUF_INIT;
922 transaction = ref_store_transaction_begin(refs, &err);
923 if (!transaction ||
924 ref_transaction_delete(transaction, refname, old_oid,
925 flags, msg, &err) ||
926 ref_transaction_commit(transaction, &err)) {
927 error("%s", err.buf);
928 ref_transaction_free(transaction);
929 strbuf_release(&err);
930 return 1;
932 ref_transaction_free(transaction);
933 strbuf_release(&err);
934 return 0;
937 int delete_ref(const char *msg, const char *refname,
938 const struct object_id *old_oid, unsigned int flags)
940 return refs_delete_ref(get_main_ref_store(the_repository), msg, refname,
941 old_oid, flags);
944 static void copy_reflog_msg(struct strbuf *sb, const char *msg)
946 char c;
947 int wasspace = 1;
949 while ((c = *msg++)) {
950 if (wasspace && isspace(c))
951 continue;
952 wasspace = isspace(c);
953 if (wasspace)
954 c = ' ';
955 strbuf_addch(sb, c);
957 strbuf_rtrim(sb);
960 static char *normalize_reflog_message(const char *msg)
962 struct strbuf sb = STRBUF_INIT;
964 if (msg && *msg)
965 copy_reflog_msg(&sb, msg);
966 return strbuf_detach(&sb, NULL);
969 int should_autocreate_reflog(const char *refname)
971 switch (log_all_ref_updates) {
972 case LOG_REFS_ALWAYS:
973 return 1;
974 case LOG_REFS_NORMAL:
975 return starts_with(refname, "refs/heads/") ||
976 starts_with(refname, "refs/remotes/") ||
977 starts_with(refname, "refs/notes/") ||
978 !strcmp(refname, "HEAD");
979 default:
980 return 0;
984 int is_branch(const char *refname)
986 return !strcmp(refname, "HEAD") || starts_with(refname, "refs/heads/");
989 struct read_ref_at_cb {
990 const char *refname;
991 timestamp_t at_time;
992 int cnt;
993 int reccnt;
994 struct object_id *oid;
995 int found_it;
997 struct object_id ooid;
998 struct object_id noid;
999 int tz;
1000 timestamp_t date;
1001 char **msg;
1002 timestamp_t *cutoff_time;
1003 int *cutoff_tz;
1004 int *cutoff_cnt;
1007 static void set_read_ref_cutoffs(struct read_ref_at_cb *cb,
1008 timestamp_t timestamp, int tz, const char *message)
1010 if (cb->msg)
1011 *cb->msg = xstrdup(message);
1012 if (cb->cutoff_time)
1013 *cb->cutoff_time = timestamp;
1014 if (cb->cutoff_tz)
1015 *cb->cutoff_tz = tz;
1016 if (cb->cutoff_cnt)
1017 *cb->cutoff_cnt = cb->reccnt;
1020 static int read_ref_at_ent(struct object_id *ooid, struct object_id *noid,
1021 const char *email UNUSED,
1022 timestamp_t timestamp, int tz,
1023 const char *message, void *cb_data)
1025 struct read_ref_at_cb *cb = cb_data;
1026 int reached_count;
1028 cb->tz = tz;
1029 cb->date = timestamp;
1032 * It is not possible for cb->cnt == 0 on the first iteration because
1033 * that special case is handled in read_ref_at().
1035 if (cb->cnt > 0)
1036 cb->cnt--;
1037 reached_count = cb->cnt == 0 && !is_null_oid(ooid);
1038 if (timestamp <= cb->at_time || reached_count) {
1039 set_read_ref_cutoffs(cb, timestamp, tz, message);
1041 * we have not yet updated cb->[n|o]oid so they still
1042 * hold the values for the previous record.
1044 if (!is_null_oid(&cb->ooid) && !oideq(&cb->ooid, noid))
1045 warning(_("log for ref %s has gap after %s"),
1046 cb->refname, show_date(cb->date, cb->tz, DATE_MODE(RFC2822)));
1047 if (reached_count)
1048 oidcpy(cb->oid, ooid);
1049 else if (!is_null_oid(&cb->ooid) || cb->date == cb->at_time)
1050 oidcpy(cb->oid, noid);
1051 else if (!oideq(noid, cb->oid))
1052 warning(_("log for ref %s unexpectedly ended on %s"),
1053 cb->refname, show_date(cb->date, cb->tz,
1054 DATE_MODE(RFC2822)));
1055 cb->found_it = 1;
1057 cb->reccnt++;
1058 oidcpy(&cb->ooid, ooid);
1059 oidcpy(&cb->noid, noid);
1060 return cb->found_it;
1063 static int read_ref_at_ent_newest(struct object_id *ooid UNUSED,
1064 struct object_id *noid,
1065 const char *email UNUSED,
1066 timestamp_t timestamp, int tz,
1067 const char *message, void *cb_data)
1069 struct read_ref_at_cb *cb = cb_data;
1071 set_read_ref_cutoffs(cb, timestamp, tz, message);
1072 oidcpy(cb->oid, noid);
1073 /* We just want the first entry */
1074 return 1;
1077 static int read_ref_at_ent_oldest(struct object_id *ooid, struct object_id *noid,
1078 const char *email UNUSED,
1079 timestamp_t timestamp, int tz,
1080 const char *message, void *cb_data)
1082 struct read_ref_at_cb *cb = cb_data;
1084 set_read_ref_cutoffs(cb, timestamp, tz, message);
1085 oidcpy(cb->oid, ooid);
1086 if (is_null_oid(cb->oid))
1087 oidcpy(cb->oid, noid);
1088 /* We just want the first entry */
1089 return 1;
1092 int read_ref_at(struct ref_store *refs, const char *refname,
1093 unsigned int flags, timestamp_t at_time, int cnt,
1094 struct object_id *oid, char **msg,
1095 timestamp_t *cutoff_time, int *cutoff_tz, int *cutoff_cnt)
1097 struct read_ref_at_cb cb;
1099 memset(&cb, 0, sizeof(cb));
1100 cb.refname = refname;
1101 cb.at_time = at_time;
1102 cb.cnt = cnt;
1103 cb.msg = msg;
1104 cb.cutoff_time = cutoff_time;
1105 cb.cutoff_tz = cutoff_tz;
1106 cb.cutoff_cnt = cutoff_cnt;
1107 cb.oid = oid;
1109 if (cb.cnt == 0) {
1110 refs_for_each_reflog_ent_reverse(refs, refname, read_ref_at_ent_newest, &cb);
1111 return 0;
1114 refs_for_each_reflog_ent_reverse(refs, refname, read_ref_at_ent, &cb);
1116 if (!cb.reccnt) {
1117 if (flags & GET_OID_QUIETLY)
1118 exit(128);
1119 else
1120 die(_("log for %s is empty"), refname);
1122 if (cb.found_it)
1123 return 0;
1125 refs_for_each_reflog_ent(refs, refname, read_ref_at_ent_oldest, &cb);
1127 return 1;
1130 struct ref_transaction *ref_store_transaction_begin(struct ref_store *refs,
1131 struct strbuf *err)
1133 struct ref_transaction *tr;
1134 assert(err);
1136 CALLOC_ARRAY(tr, 1);
1137 tr->ref_store = refs;
1138 return tr;
1141 struct ref_transaction *ref_transaction_begin(struct strbuf *err)
1143 return ref_store_transaction_begin(get_main_ref_store(the_repository), err);
1146 void ref_transaction_free(struct ref_transaction *transaction)
1148 size_t i;
1150 if (!transaction)
1151 return;
1153 switch (transaction->state) {
1154 case REF_TRANSACTION_OPEN:
1155 case REF_TRANSACTION_CLOSED:
1156 /* OK */
1157 break;
1158 case REF_TRANSACTION_PREPARED:
1159 BUG("free called on a prepared reference transaction");
1160 break;
1161 default:
1162 BUG("unexpected reference transaction state");
1163 break;
1166 for (i = 0; i < transaction->nr; i++) {
1167 free(transaction->updates[i]->msg);
1168 free(transaction->updates[i]);
1170 free(transaction->updates);
1171 free(transaction);
1174 struct ref_update *ref_transaction_add_update(
1175 struct ref_transaction *transaction,
1176 const char *refname, unsigned int flags,
1177 const struct object_id *new_oid,
1178 const struct object_id *old_oid,
1179 const char *msg)
1181 struct ref_update *update;
1183 if (transaction->state != REF_TRANSACTION_OPEN)
1184 BUG("update called for transaction that is not open");
1186 FLEX_ALLOC_STR(update, refname, refname);
1187 ALLOC_GROW(transaction->updates, transaction->nr + 1, transaction->alloc);
1188 transaction->updates[transaction->nr++] = update;
1190 update->flags = flags;
1192 if (flags & REF_HAVE_NEW)
1193 oidcpy(&update->new_oid, new_oid);
1194 if (flags & REF_HAVE_OLD)
1195 oidcpy(&update->old_oid, old_oid);
1196 update->msg = normalize_reflog_message(msg);
1197 return update;
1200 int ref_transaction_update(struct ref_transaction *transaction,
1201 const char *refname,
1202 const struct object_id *new_oid,
1203 const struct object_id *old_oid,
1204 unsigned int flags, const char *msg,
1205 struct strbuf *err)
1207 assert(err);
1209 if (!(flags & REF_SKIP_REFNAME_VERIFICATION) &&
1210 ((new_oid && !is_null_oid(new_oid)) ?
1211 check_refname_format(refname, REFNAME_ALLOW_ONELEVEL) :
1212 !refname_is_safe(refname))) {
1213 strbuf_addf(err, _("refusing to update ref with bad name '%s'"),
1214 refname);
1215 return -1;
1218 if (flags & ~REF_TRANSACTION_UPDATE_ALLOWED_FLAGS)
1219 BUG("illegal flags 0x%x passed to ref_transaction_update()", flags);
1222 * Clear flags outside the allowed set; this should be a noop because
1223 * of the BUG() check above, but it works around a -Wnonnull warning
1224 * with some versions of "gcc -O3".
1226 flags &= REF_TRANSACTION_UPDATE_ALLOWED_FLAGS;
1228 flags |= (new_oid ? REF_HAVE_NEW : 0) | (old_oid ? REF_HAVE_OLD : 0);
1230 ref_transaction_add_update(transaction, refname, flags,
1231 new_oid, old_oid, msg);
1232 return 0;
1235 int ref_transaction_create(struct ref_transaction *transaction,
1236 const char *refname,
1237 const struct object_id *new_oid,
1238 unsigned int flags, const char *msg,
1239 struct strbuf *err)
1241 if (!new_oid || is_null_oid(new_oid)) {
1242 strbuf_addf(err, "'%s' has a null OID", refname);
1243 return 1;
1245 return ref_transaction_update(transaction, refname, new_oid,
1246 null_oid(), flags, msg, err);
1249 int ref_transaction_delete(struct ref_transaction *transaction,
1250 const char *refname,
1251 const struct object_id *old_oid,
1252 unsigned int flags, const char *msg,
1253 struct strbuf *err)
1255 if (old_oid && is_null_oid(old_oid))
1256 BUG("delete called with old_oid set to zeros");
1257 return ref_transaction_update(transaction, refname,
1258 null_oid(), old_oid,
1259 flags, msg, err);
1262 int ref_transaction_verify(struct ref_transaction *transaction,
1263 const char *refname,
1264 const struct object_id *old_oid,
1265 unsigned int flags,
1266 struct strbuf *err)
1268 if (!old_oid)
1269 BUG("verify called with old_oid set to NULL");
1270 return ref_transaction_update(transaction, refname,
1271 NULL, old_oid,
1272 flags, NULL, err);
1275 int refs_update_ref(struct ref_store *refs, const char *msg,
1276 const char *refname, const struct object_id *new_oid,
1277 const struct object_id *old_oid, unsigned int flags,
1278 enum action_on_err onerr)
1280 struct ref_transaction *t = NULL;
1281 struct strbuf err = STRBUF_INIT;
1282 int ret = 0;
1284 t = ref_store_transaction_begin(refs, &err);
1285 if (!t ||
1286 ref_transaction_update(t, refname, new_oid, old_oid, flags, msg,
1287 &err) ||
1288 ref_transaction_commit(t, &err)) {
1289 ret = 1;
1290 ref_transaction_free(t);
1292 if (ret) {
1293 const char *str = _("update_ref failed for ref '%s': %s");
1295 switch (onerr) {
1296 case UPDATE_REFS_MSG_ON_ERR:
1297 error(str, refname, err.buf);
1298 break;
1299 case UPDATE_REFS_DIE_ON_ERR:
1300 die(str, refname, err.buf);
1301 break;
1302 case UPDATE_REFS_QUIET_ON_ERR:
1303 break;
1305 strbuf_release(&err);
1306 return 1;
1308 strbuf_release(&err);
1309 if (t)
1310 ref_transaction_free(t);
1311 return 0;
1314 int update_ref(const char *msg, const char *refname,
1315 const struct object_id *new_oid,
1316 const struct object_id *old_oid,
1317 unsigned int flags, enum action_on_err onerr)
1319 return refs_update_ref(get_main_ref_store(the_repository), msg, refname, new_oid,
1320 old_oid, flags, onerr);
1324 * Check that the string refname matches a rule of the form
1325 * "{prefix}%.*s{suffix}". So "foo/bar/baz" would match the rule
1326 * "foo/%.*s/baz", and return the string "bar".
1328 static const char *match_parse_rule(const char *refname, const char *rule,
1329 size_t *len)
1332 * Check that rule matches refname up to the first percent in the rule.
1333 * We can bail immediately if not, but otherwise we leave "rule" at the
1334 * %-placeholder, and "refname" at the start of the potential matched
1335 * name.
1337 while (*rule != '%') {
1338 if (!*rule)
1339 BUG("rev-parse rule did not have percent");
1340 if (*refname++ != *rule++)
1341 return NULL;
1345 * Check that our "%" is the expected placeholder. This assumes there
1346 * are no other percents (placeholder or quoted) in the string, but
1347 * that is sufficient for our rev-parse rules.
1349 if (!skip_prefix(rule, "%.*s", &rule))
1350 return NULL;
1353 * And now check that our suffix (if any) matches.
1355 if (!strip_suffix(refname, rule, len))
1356 return NULL;
1358 return refname; /* len set by strip_suffix() */
1361 char *refs_shorten_unambiguous_ref(struct ref_store *refs,
1362 const char *refname, int strict)
1364 int i;
1365 struct strbuf resolved_buf = STRBUF_INIT;
1367 /* skip first rule, it will always match */
1368 for (i = NUM_REV_PARSE_RULES - 1; i > 0 ; --i) {
1369 int j;
1370 int rules_to_fail = i;
1371 const char *short_name;
1372 size_t short_name_len;
1374 short_name = match_parse_rule(refname, ref_rev_parse_rules[i],
1375 &short_name_len);
1376 if (!short_name)
1377 continue;
1380 * in strict mode, all (except the matched one) rules
1381 * must fail to resolve to a valid non-ambiguous ref
1383 if (strict)
1384 rules_to_fail = NUM_REV_PARSE_RULES;
1387 * check if the short name resolves to a valid ref,
1388 * but use only rules prior to the matched one
1390 for (j = 0; j < rules_to_fail; j++) {
1391 const char *rule = ref_rev_parse_rules[j];
1393 /* skip matched rule */
1394 if (i == j)
1395 continue;
1398 * the short name is ambiguous, if it resolves
1399 * (with this previous rule) to a valid ref
1400 * read_ref() returns 0 on success
1402 strbuf_reset(&resolved_buf);
1403 strbuf_addf(&resolved_buf, rule,
1404 cast_size_t_to_int(short_name_len),
1405 short_name);
1406 if (refs_ref_exists(refs, resolved_buf.buf))
1407 break;
1411 * short name is non-ambiguous if all previous rules
1412 * haven't resolved to a valid ref
1414 if (j == rules_to_fail) {
1415 strbuf_release(&resolved_buf);
1416 return xmemdupz(short_name, short_name_len);
1420 strbuf_release(&resolved_buf);
1421 return xstrdup(refname);
1424 char *shorten_unambiguous_ref(const char *refname, int strict)
1426 return refs_shorten_unambiguous_ref(get_main_ref_store(the_repository),
1427 refname, strict);
1430 int parse_hide_refs_config(const char *var, const char *value, const char *section,
1431 struct string_list *hide_refs)
1433 const char *key;
1434 if (!strcmp("transfer.hiderefs", var) ||
1435 (!parse_config_key(var, section, NULL, NULL, &key) &&
1436 !strcmp(key, "hiderefs"))) {
1437 char *ref;
1438 int len;
1440 if (!value)
1441 return config_error_nonbool(var);
1442 ref = xstrdup(value);
1443 len = strlen(ref);
1444 while (len && ref[len - 1] == '/')
1445 ref[--len] = '\0';
1446 string_list_append_nodup(hide_refs, ref);
1448 return 0;
1451 int ref_is_hidden(const char *refname, const char *refname_full,
1452 const struct string_list *hide_refs)
1454 int i;
1456 for (i = hide_refs->nr - 1; i >= 0; i--) {
1457 const char *match = hide_refs->items[i].string;
1458 const char *subject;
1459 int neg = 0;
1460 const char *p;
1462 if (*match == '!') {
1463 neg = 1;
1464 match++;
1467 if (*match == '^') {
1468 subject = refname_full;
1469 match++;
1470 } else {
1471 subject = refname;
1474 /* refname can be NULL when namespaces are used. */
1475 if (subject &&
1476 skip_prefix(subject, match, &p) &&
1477 (!*p || *p == '/'))
1478 return !neg;
1480 return 0;
1483 const char *find_descendant_ref(const char *dirname,
1484 const struct string_list *extras,
1485 const struct string_list *skip)
1487 int pos;
1489 if (!extras)
1490 return NULL;
1493 * Look at the place where dirname would be inserted into
1494 * extras. If there is an entry at that position that starts
1495 * with dirname (remember, dirname includes the trailing
1496 * slash) and is not in skip, then we have a conflict.
1498 for (pos = string_list_find_insert_index(extras, dirname, 0);
1499 pos < extras->nr; pos++) {
1500 const char *extra_refname = extras->items[pos].string;
1502 if (!starts_with(extra_refname, dirname))
1503 break;
1505 if (!skip || !string_list_has_string(skip, extra_refname))
1506 return extra_refname;
1508 return NULL;
1511 int refs_head_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
1513 struct object_id oid;
1514 int flag;
1516 if (refs_resolve_ref_unsafe(refs, "HEAD", RESOLVE_REF_READING,
1517 &oid, &flag))
1518 return fn("HEAD", &oid, flag, cb_data);
1520 return 0;
1523 int head_ref(each_ref_fn fn, void *cb_data)
1525 return refs_head_ref(get_main_ref_store(the_repository), fn, cb_data);
1528 struct ref_iterator *refs_ref_iterator_begin(
1529 struct ref_store *refs,
1530 const char *prefix, int trim,
1531 enum do_for_each_ref_flags flags)
1533 struct ref_iterator *iter;
1535 if (!(flags & DO_FOR_EACH_INCLUDE_BROKEN)) {
1536 static int ref_paranoia = -1;
1538 if (ref_paranoia < 0)
1539 ref_paranoia = git_env_bool("GIT_REF_PARANOIA", 1);
1540 if (ref_paranoia) {
1541 flags |= DO_FOR_EACH_INCLUDE_BROKEN;
1542 flags |= DO_FOR_EACH_OMIT_DANGLING_SYMREFS;
1546 iter = refs->be->iterator_begin(refs, prefix, flags);
1549 * `iterator_begin()` already takes care of prefix, but we
1550 * might need to do some trimming:
1552 if (trim)
1553 iter = prefix_ref_iterator_begin(iter, "", trim);
1555 /* Sanity check for subclasses: */
1556 if (!iter->ordered)
1557 BUG("reference iterator is not ordered");
1559 return iter;
1563 * Call fn for each reference in the specified submodule for which the
1564 * refname begins with prefix. If trim is non-zero, then trim that
1565 * many characters off the beginning of each refname before passing
1566 * the refname to fn. flags can be DO_FOR_EACH_INCLUDE_BROKEN to
1567 * include broken references in the iteration. If fn ever returns a
1568 * non-zero value, stop the iteration and return that value;
1569 * otherwise, return 0.
1571 static int do_for_each_repo_ref(struct repository *r, const char *prefix,
1572 each_repo_ref_fn fn, int trim, int flags,
1573 void *cb_data)
1575 struct ref_iterator *iter;
1576 struct ref_store *refs = get_main_ref_store(r);
1578 if (!refs)
1579 return 0;
1581 iter = refs_ref_iterator_begin(refs, prefix, trim, flags);
1583 return do_for_each_repo_ref_iterator(r, iter, fn, cb_data);
1586 struct do_for_each_ref_help {
1587 each_ref_fn *fn;
1588 void *cb_data;
1591 static int do_for_each_ref_helper(struct repository *r,
1592 const char *refname,
1593 const struct object_id *oid,
1594 int flags,
1595 void *cb_data)
1597 struct do_for_each_ref_help *hp = cb_data;
1599 return hp->fn(refname, oid, flags, hp->cb_data);
1602 static int do_for_each_ref(struct ref_store *refs, const char *prefix,
1603 each_ref_fn fn, int trim,
1604 enum do_for_each_ref_flags flags, void *cb_data)
1606 struct ref_iterator *iter;
1607 struct do_for_each_ref_help hp = { fn, cb_data };
1609 if (!refs)
1610 return 0;
1612 iter = refs_ref_iterator_begin(refs, prefix, trim, flags);
1614 return do_for_each_repo_ref_iterator(the_repository, iter,
1615 do_for_each_ref_helper, &hp);
1618 int refs_for_each_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
1620 return do_for_each_ref(refs, "", fn, 0, 0, cb_data);
1623 int for_each_ref(each_ref_fn fn, void *cb_data)
1625 return refs_for_each_ref(get_main_ref_store(the_repository), fn, cb_data);
1628 int refs_for_each_ref_in(struct ref_store *refs, const char *prefix,
1629 each_ref_fn fn, void *cb_data)
1631 return do_for_each_ref(refs, prefix, fn, strlen(prefix), 0, cb_data);
1634 int for_each_ref_in(const char *prefix, each_ref_fn fn, void *cb_data)
1636 return refs_for_each_ref_in(get_main_ref_store(the_repository), prefix, fn, cb_data);
1639 int for_each_fullref_in(const char *prefix, each_ref_fn fn, void *cb_data)
1641 return do_for_each_ref(get_main_ref_store(the_repository),
1642 prefix, fn, 0, 0, cb_data);
1645 int refs_for_each_fullref_in(struct ref_store *refs, const char *prefix,
1646 each_ref_fn fn, void *cb_data)
1648 return do_for_each_ref(refs, prefix, fn, 0, 0, cb_data);
1651 int for_each_replace_ref(struct repository *r, each_repo_ref_fn fn, void *cb_data)
1653 const char *git_replace_ref_base = ref_namespace[NAMESPACE_REPLACE].ref;
1654 return do_for_each_repo_ref(r, git_replace_ref_base, fn,
1655 strlen(git_replace_ref_base),
1656 DO_FOR_EACH_INCLUDE_BROKEN, cb_data);
1659 int for_each_namespaced_ref(each_ref_fn fn, void *cb_data)
1661 struct strbuf buf = STRBUF_INIT;
1662 int ret;
1663 strbuf_addf(&buf, "%srefs/", get_git_namespace());
1664 ret = do_for_each_ref(get_main_ref_store(the_repository),
1665 buf.buf, fn, 0, 0, cb_data);
1666 strbuf_release(&buf);
1667 return ret;
1670 int refs_for_each_rawref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
1672 return do_for_each_ref(refs, "", fn, 0,
1673 DO_FOR_EACH_INCLUDE_BROKEN, cb_data);
1676 int for_each_rawref(each_ref_fn fn, void *cb_data)
1678 return refs_for_each_rawref(get_main_ref_store(the_repository), fn, cb_data);
1681 static int qsort_strcmp(const void *va, const void *vb)
1683 const char *a = *(const char **)va;
1684 const char *b = *(const char **)vb;
1686 return strcmp(a, b);
1689 static void find_longest_prefixes_1(struct string_list *out,
1690 struct strbuf *prefix,
1691 const char **patterns, size_t nr)
1693 size_t i;
1695 for (i = 0; i < nr; i++) {
1696 char c = patterns[i][prefix->len];
1697 if (!c || is_glob_special(c)) {
1698 string_list_append(out, prefix->buf);
1699 return;
1703 i = 0;
1704 while (i < nr) {
1705 size_t end;
1708 * Set "end" to the index of the element _after_ the last one
1709 * in our group.
1711 for (end = i + 1; end < nr; end++) {
1712 if (patterns[i][prefix->len] != patterns[end][prefix->len])
1713 break;
1716 strbuf_addch(prefix, patterns[i][prefix->len]);
1717 find_longest_prefixes_1(out, prefix, patterns + i, end - i);
1718 strbuf_setlen(prefix, prefix->len - 1);
1720 i = end;
1724 static void find_longest_prefixes(struct string_list *out,
1725 const char **patterns)
1727 struct strvec sorted = STRVEC_INIT;
1728 struct strbuf prefix = STRBUF_INIT;
1730 strvec_pushv(&sorted, patterns);
1731 QSORT(sorted.v, sorted.nr, qsort_strcmp);
1733 find_longest_prefixes_1(out, &prefix, sorted.v, sorted.nr);
1735 strvec_clear(&sorted);
1736 strbuf_release(&prefix);
1739 int refs_for_each_fullref_in_prefixes(struct ref_store *ref_store,
1740 const char *namespace,
1741 const char **patterns,
1742 each_ref_fn fn, void *cb_data)
1744 struct string_list prefixes = STRING_LIST_INIT_DUP;
1745 struct string_list_item *prefix;
1746 struct strbuf buf = STRBUF_INIT;
1747 int ret = 0, namespace_len;
1749 find_longest_prefixes(&prefixes, patterns);
1751 if (namespace)
1752 strbuf_addstr(&buf, namespace);
1753 namespace_len = buf.len;
1755 for_each_string_list_item(prefix, &prefixes) {
1756 strbuf_addstr(&buf, prefix->string);
1757 ret = refs_for_each_fullref_in(ref_store, buf.buf, fn, cb_data);
1758 if (ret)
1759 break;
1760 strbuf_setlen(&buf, namespace_len);
1763 string_list_clear(&prefixes, 0);
1764 strbuf_release(&buf);
1765 return ret;
1768 static int refs_read_special_head(struct ref_store *ref_store,
1769 const char *refname, struct object_id *oid,
1770 struct strbuf *referent, unsigned int *type,
1771 int *failure_errno)
1773 struct strbuf full_path = STRBUF_INIT;
1774 struct strbuf content = STRBUF_INIT;
1775 int result = -1;
1776 strbuf_addf(&full_path, "%s/%s", ref_store->gitdir, refname);
1778 if (strbuf_read_file(&content, full_path.buf, 0) < 0)
1779 goto done;
1781 result = parse_loose_ref_contents(content.buf, oid, referent, type,
1782 failure_errno);
1784 done:
1785 strbuf_release(&full_path);
1786 strbuf_release(&content);
1787 return result;
1790 int refs_read_raw_ref(struct ref_store *ref_store, const char *refname,
1791 struct object_id *oid, struct strbuf *referent,
1792 unsigned int *type, int *failure_errno)
1794 assert(failure_errno);
1795 if (!strcmp(refname, "FETCH_HEAD") || !strcmp(refname, "MERGE_HEAD")) {
1796 return refs_read_special_head(ref_store, refname, oid, referent,
1797 type, failure_errno);
1800 return ref_store->be->read_raw_ref(ref_store, refname, oid, referent,
1801 type, failure_errno);
1804 int refs_read_symbolic_ref(struct ref_store *ref_store, const char *refname,
1805 struct strbuf *referent)
1807 return ref_store->be->read_symbolic_ref(ref_store, refname, referent);
1810 const char *refs_resolve_ref_unsafe(struct ref_store *refs,
1811 const char *refname,
1812 int resolve_flags,
1813 struct object_id *oid,
1814 int *flags)
1816 static struct strbuf sb_refname = STRBUF_INIT;
1817 struct object_id unused_oid;
1818 int unused_flags;
1819 int symref_count;
1821 if (!oid)
1822 oid = &unused_oid;
1823 if (!flags)
1824 flags = &unused_flags;
1826 *flags = 0;
1828 if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
1829 if (!(resolve_flags & RESOLVE_REF_ALLOW_BAD_NAME) ||
1830 !refname_is_safe(refname))
1831 return NULL;
1834 * repo_dwim_ref() uses REF_ISBROKEN to distinguish between
1835 * missing refs and refs that were present but invalid,
1836 * to complain about the latter to stderr.
1838 * We don't know whether the ref exists, so don't set
1839 * REF_ISBROKEN yet.
1841 *flags |= REF_BAD_NAME;
1844 for (symref_count = 0; symref_count < SYMREF_MAXDEPTH; symref_count++) {
1845 unsigned int read_flags = 0;
1846 int failure_errno;
1848 if (refs_read_raw_ref(refs, refname, oid, &sb_refname,
1849 &read_flags, &failure_errno)) {
1850 *flags |= read_flags;
1852 /* In reading mode, refs must eventually resolve */
1853 if (resolve_flags & RESOLVE_REF_READING)
1854 return NULL;
1857 * Otherwise a missing ref is OK. But the files backend
1858 * may show errors besides ENOENT if there are
1859 * similarly-named refs.
1861 if (failure_errno != ENOENT &&
1862 failure_errno != EISDIR &&
1863 failure_errno != ENOTDIR)
1864 return NULL;
1866 oidclr(oid);
1867 if (*flags & REF_BAD_NAME)
1868 *flags |= REF_ISBROKEN;
1869 return refname;
1872 *flags |= read_flags;
1874 if (!(read_flags & REF_ISSYMREF)) {
1875 if (*flags & REF_BAD_NAME) {
1876 oidclr(oid);
1877 *flags |= REF_ISBROKEN;
1879 return refname;
1882 refname = sb_refname.buf;
1883 if (resolve_flags & RESOLVE_REF_NO_RECURSE) {
1884 oidclr(oid);
1885 return refname;
1887 if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
1888 if (!(resolve_flags & RESOLVE_REF_ALLOW_BAD_NAME) ||
1889 !refname_is_safe(refname))
1890 return NULL;
1892 *flags |= REF_ISBROKEN | REF_BAD_NAME;
1896 return NULL;
1899 /* backend functions */
1900 int refs_init_db(struct strbuf *err)
1902 struct ref_store *refs = get_main_ref_store(the_repository);
1904 return refs->be->init_db(refs, err);
1907 const char *resolve_ref_unsafe(const char *refname, int resolve_flags,
1908 struct object_id *oid, int *flags)
1910 return refs_resolve_ref_unsafe(get_main_ref_store(the_repository), refname,
1911 resolve_flags, oid, flags);
1914 int resolve_gitlink_ref(const char *submodule, const char *refname,
1915 struct object_id *oid)
1917 struct ref_store *refs;
1918 int flags;
1920 refs = get_submodule_ref_store(submodule);
1922 if (!refs)
1923 return -1;
1925 if (!refs_resolve_ref_unsafe(refs, refname, 0, oid, &flags) ||
1926 is_null_oid(oid))
1927 return -1;
1928 return 0;
1931 struct ref_store_hash_entry
1933 struct hashmap_entry ent;
1935 struct ref_store *refs;
1937 /* NUL-terminated identifier of the ref store: */
1938 char name[FLEX_ARRAY];
1941 static int ref_store_hash_cmp(const void *cmp_data UNUSED,
1942 const struct hashmap_entry *eptr,
1943 const struct hashmap_entry *entry_or_key,
1944 const void *keydata)
1946 const struct ref_store_hash_entry *e1, *e2;
1947 const char *name;
1949 e1 = container_of(eptr, const struct ref_store_hash_entry, ent);
1950 e2 = container_of(entry_or_key, const struct ref_store_hash_entry, ent);
1951 name = keydata ? keydata : e2->name;
1953 return strcmp(e1->name, name);
1956 static struct ref_store_hash_entry *alloc_ref_store_hash_entry(
1957 const char *name, struct ref_store *refs)
1959 struct ref_store_hash_entry *entry;
1961 FLEX_ALLOC_STR(entry, name, name);
1962 hashmap_entry_init(&entry->ent, strhash(name));
1963 entry->refs = refs;
1964 return entry;
1967 /* A hashmap of ref_stores, stored by submodule name: */
1968 static struct hashmap submodule_ref_stores;
1970 /* A hashmap of ref_stores, stored by worktree id: */
1971 static struct hashmap worktree_ref_stores;
1974 * Look up a ref store by name. If that ref_store hasn't been
1975 * registered yet, return NULL.
1977 static struct ref_store *lookup_ref_store_map(struct hashmap *map,
1978 const char *name)
1980 struct ref_store_hash_entry *entry;
1981 unsigned int hash;
1983 if (!map->tablesize)
1984 /* It's initialized on demand in register_ref_store(). */
1985 return NULL;
1987 hash = strhash(name);
1988 entry = hashmap_get_entry_from_hash(map, hash, name,
1989 struct ref_store_hash_entry, ent);
1990 return entry ? entry->refs : NULL;
1994 * Create, record, and return a ref_store instance for the specified
1995 * gitdir.
1997 static struct ref_store *ref_store_init(struct repository *repo,
1998 const char *gitdir,
1999 unsigned int flags)
2001 const char *be_name = "files";
2002 struct ref_storage_be *be = find_ref_storage_backend(be_name);
2003 struct ref_store *refs;
2005 if (!be)
2006 BUG("reference backend %s is unknown", be_name);
2008 refs = be->init(repo, gitdir, flags);
2009 return refs;
2012 struct ref_store *get_main_ref_store(struct repository *r)
2014 if (r->refs_private)
2015 return r->refs_private;
2017 if (!r->gitdir)
2018 BUG("attempting to get main_ref_store outside of repository");
2020 r->refs_private = ref_store_init(r, r->gitdir, REF_STORE_ALL_CAPS);
2021 r->refs_private = maybe_debug_wrap_ref_store(r->gitdir, r->refs_private);
2022 return r->refs_private;
2026 * Associate a ref store with a name. It is a fatal error to call this
2027 * function twice for the same name.
2029 static void register_ref_store_map(struct hashmap *map,
2030 const char *type,
2031 struct ref_store *refs,
2032 const char *name)
2034 struct ref_store_hash_entry *entry;
2036 if (!map->tablesize)
2037 hashmap_init(map, ref_store_hash_cmp, NULL, 0);
2039 entry = alloc_ref_store_hash_entry(name, refs);
2040 if (hashmap_put(map, &entry->ent))
2041 BUG("%s ref_store '%s' initialized twice", type, name);
2044 struct ref_store *get_submodule_ref_store(const char *submodule)
2046 struct strbuf submodule_sb = STRBUF_INIT;
2047 struct ref_store *refs;
2048 char *to_free = NULL;
2049 size_t len;
2050 struct repository *subrepo;
2052 if (!submodule)
2053 return NULL;
2055 len = strlen(submodule);
2056 while (len && is_dir_sep(submodule[len - 1]))
2057 len--;
2058 if (!len)
2059 return NULL;
2061 if (submodule[len])
2062 /* We need to strip off one or more trailing slashes */
2063 submodule = to_free = xmemdupz(submodule, len);
2065 refs = lookup_ref_store_map(&submodule_ref_stores, submodule);
2066 if (refs)
2067 goto done;
2069 strbuf_addstr(&submodule_sb, submodule);
2070 if (!is_nonbare_repository_dir(&submodule_sb))
2071 goto done;
2073 if (submodule_to_gitdir(&submodule_sb, submodule))
2074 goto done;
2076 subrepo = xmalloc(sizeof(*subrepo));
2078 * NEEDSWORK: Make get_submodule_ref_store() work with arbitrary
2079 * superprojects other than the_repository. This probably should be
2080 * done by making it take a struct repository * parameter instead of a
2081 * submodule path.
2083 if (repo_submodule_init(subrepo, the_repository, submodule,
2084 null_oid())) {
2085 free(subrepo);
2086 goto done;
2088 refs = ref_store_init(subrepo, submodule_sb.buf,
2089 REF_STORE_READ | REF_STORE_ODB);
2090 register_ref_store_map(&submodule_ref_stores, "submodule",
2091 refs, submodule);
2093 done:
2094 strbuf_release(&submodule_sb);
2095 free(to_free);
2097 return refs;
2100 struct ref_store *get_worktree_ref_store(const struct worktree *wt)
2102 struct ref_store *refs;
2103 const char *id;
2105 if (wt->is_current)
2106 return get_main_ref_store(the_repository);
2108 id = wt->id ? wt->id : "/";
2109 refs = lookup_ref_store_map(&worktree_ref_stores, id);
2110 if (refs)
2111 return refs;
2113 if (wt->id)
2114 refs = ref_store_init(the_repository,
2115 git_common_path("worktrees/%s", wt->id),
2116 REF_STORE_ALL_CAPS);
2117 else
2118 refs = ref_store_init(the_repository,
2119 get_git_common_dir(),
2120 REF_STORE_ALL_CAPS);
2122 if (refs)
2123 register_ref_store_map(&worktree_ref_stores, "worktree",
2124 refs, id);
2125 return refs;
2128 void base_ref_store_init(struct ref_store *refs, struct repository *repo,
2129 const char *path, const struct ref_storage_be *be)
2131 refs->be = be;
2132 refs->repo = repo;
2133 refs->gitdir = xstrdup(path);
2136 /* backend functions */
2137 int refs_pack_refs(struct ref_store *refs, struct pack_refs_opts *opts)
2139 return refs->be->pack_refs(refs, opts);
2142 int peel_iterated_oid(const struct object_id *base, struct object_id *peeled)
2144 if (current_ref_iter &&
2145 (current_ref_iter->oid == base ||
2146 oideq(current_ref_iter->oid, base)))
2147 return ref_iterator_peel(current_ref_iter, peeled);
2149 return peel_object(base, peeled) ? -1 : 0;
2152 int refs_create_symref(struct ref_store *refs,
2153 const char *ref_target,
2154 const char *refs_heads_master,
2155 const char *logmsg)
2157 char *msg;
2158 int retval;
2160 msg = normalize_reflog_message(logmsg);
2161 retval = refs->be->create_symref(refs, ref_target, refs_heads_master,
2162 msg);
2163 free(msg);
2164 return retval;
2167 int create_symref(const char *ref_target, const char *refs_heads_master,
2168 const char *logmsg)
2170 return refs_create_symref(get_main_ref_store(the_repository), ref_target,
2171 refs_heads_master, logmsg);
2174 int ref_update_reject_duplicates(struct string_list *refnames,
2175 struct strbuf *err)
2177 size_t i, n = refnames->nr;
2179 assert(err);
2181 for (i = 1; i < n; i++) {
2182 int cmp = strcmp(refnames->items[i - 1].string,
2183 refnames->items[i].string);
2185 if (!cmp) {
2186 strbuf_addf(err,
2187 _("multiple updates for ref '%s' not allowed"),
2188 refnames->items[i].string);
2189 return 1;
2190 } else if (cmp > 0) {
2191 BUG("ref_update_reject_duplicates() received unsorted list");
2194 return 0;
2197 static int run_transaction_hook(struct ref_transaction *transaction,
2198 const char *state)
2200 struct child_process proc = CHILD_PROCESS_INIT;
2201 struct strbuf buf = STRBUF_INIT;
2202 const char *hook;
2203 int ret = 0, i;
2205 hook = find_hook("reference-transaction");
2206 if (!hook)
2207 return ret;
2209 strvec_pushl(&proc.args, hook, state, NULL);
2210 proc.in = -1;
2211 proc.stdout_to_stderr = 1;
2212 proc.trace2_hook_name = "reference-transaction";
2214 ret = start_command(&proc);
2215 if (ret)
2216 return ret;
2218 sigchain_push(SIGPIPE, SIG_IGN);
2220 for (i = 0; i < transaction->nr; i++) {
2221 struct ref_update *update = transaction->updates[i];
2223 strbuf_reset(&buf);
2224 strbuf_addf(&buf, "%s %s %s\n",
2225 oid_to_hex(&update->old_oid),
2226 oid_to_hex(&update->new_oid),
2227 update->refname);
2229 if (write_in_full(proc.in, buf.buf, buf.len) < 0) {
2230 if (errno != EPIPE) {
2231 /* Don't leak errno outside this API */
2232 errno = 0;
2233 ret = -1;
2235 break;
2239 close(proc.in);
2240 sigchain_pop(SIGPIPE);
2241 strbuf_release(&buf);
2243 ret |= finish_command(&proc);
2244 return ret;
2247 int ref_transaction_prepare(struct ref_transaction *transaction,
2248 struct strbuf *err)
2250 struct ref_store *refs = transaction->ref_store;
2251 int ret;
2253 switch (transaction->state) {
2254 case REF_TRANSACTION_OPEN:
2255 /* Good. */
2256 break;
2257 case REF_TRANSACTION_PREPARED:
2258 BUG("prepare called twice on reference transaction");
2259 break;
2260 case REF_TRANSACTION_CLOSED:
2261 BUG("prepare called on a closed reference transaction");
2262 break;
2263 default:
2264 BUG("unexpected reference transaction state");
2265 break;
2268 if (refs->repo->objects->odb->disable_ref_updates) {
2269 strbuf_addstr(err,
2270 _("ref updates forbidden inside quarantine environment"));
2271 return -1;
2274 ret = refs->be->transaction_prepare(refs, transaction, err);
2275 if (ret)
2276 return ret;
2278 ret = run_transaction_hook(transaction, "prepared");
2279 if (ret) {
2280 ref_transaction_abort(transaction, err);
2281 die(_("ref updates aborted by hook"));
2284 return 0;
2287 int ref_transaction_abort(struct ref_transaction *transaction,
2288 struct strbuf *err)
2290 struct ref_store *refs = transaction->ref_store;
2291 int ret = 0;
2293 switch (transaction->state) {
2294 case REF_TRANSACTION_OPEN:
2295 /* No need to abort explicitly. */
2296 break;
2297 case REF_TRANSACTION_PREPARED:
2298 ret = refs->be->transaction_abort(refs, transaction, err);
2299 break;
2300 case REF_TRANSACTION_CLOSED:
2301 BUG("abort called on a closed reference transaction");
2302 break;
2303 default:
2304 BUG("unexpected reference transaction state");
2305 break;
2308 run_transaction_hook(transaction, "aborted");
2310 ref_transaction_free(transaction);
2311 return ret;
2314 int ref_transaction_commit(struct ref_transaction *transaction,
2315 struct strbuf *err)
2317 struct ref_store *refs = transaction->ref_store;
2318 int ret;
2320 switch (transaction->state) {
2321 case REF_TRANSACTION_OPEN:
2322 /* Need to prepare first. */
2323 ret = ref_transaction_prepare(transaction, err);
2324 if (ret)
2325 return ret;
2326 break;
2327 case REF_TRANSACTION_PREPARED:
2328 /* Fall through to finish. */
2329 break;
2330 case REF_TRANSACTION_CLOSED:
2331 BUG("commit called on a closed reference transaction");
2332 break;
2333 default:
2334 BUG("unexpected reference transaction state");
2335 break;
2338 ret = refs->be->transaction_finish(refs, transaction, err);
2339 if (!ret)
2340 run_transaction_hook(transaction, "committed");
2341 return ret;
2344 int refs_verify_refname_available(struct ref_store *refs,
2345 const char *refname,
2346 const struct string_list *extras,
2347 const struct string_list *skip,
2348 struct strbuf *err)
2350 const char *slash;
2351 const char *extra_refname;
2352 struct strbuf dirname = STRBUF_INIT;
2353 struct strbuf referent = STRBUF_INIT;
2354 struct object_id oid;
2355 unsigned int type;
2356 struct ref_iterator *iter;
2357 int ok;
2358 int ret = -1;
2361 * For the sake of comments in this function, suppose that
2362 * refname is "refs/foo/bar".
2365 assert(err);
2367 strbuf_grow(&dirname, strlen(refname) + 1);
2368 for (slash = strchr(refname, '/'); slash; slash = strchr(slash + 1, '/')) {
2370 * Just saying "Is a directory" when we e.g. can't
2371 * lock some multi-level ref isn't very informative,
2372 * the user won't be told *what* is a directory, so
2373 * let's not use strerror() below.
2375 int ignore_errno;
2376 /* Expand dirname to the new prefix, not including the trailing slash: */
2377 strbuf_add(&dirname, refname + dirname.len, slash - refname - dirname.len);
2380 * We are still at a leading dir of the refname (e.g.,
2381 * "refs/foo"; if there is a reference with that name,
2382 * it is a conflict, *unless* it is in skip.
2384 if (skip && string_list_has_string(skip, dirname.buf))
2385 continue;
2387 if (!refs_read_raw_ref(refs, dirname.buf, &oid, &referent,
2388 &type, &ignore_errno)) {
2389 strbuf_addf(err, _("'%s' exists; cannot create '%s'"),
2390 dirname.buf, refname);
2391 goto cleanup;
2394 if (extras && string_list_has_string(extras, dirname.buf)) {
2395 strbuf_addf(err, _("cannot process '%s' and '%s' at the same time"),
2396 refname, dirname.buf);
2397 goto cleanup;
2402 * We are at the leaf of our refname (e.g., "refs/foo/bar").
2403 * There is no point in searching for a reference with that
2404 * name, because a refname isn't considered to conflict with
2405 * itself. But we still need to check for references whose
2406 * names are in the "refs/foo/bar/" namespace, because they
2407 * *do* conflict.
2409 strbuf_addstr(&dirname, refname + dirname.len);
2410 strbuf_addch(&dirname, '/');
2412 iter = refs_ref_iterator_begin(refs, dirname.buf, 0,
2413 DO_FOR_EACH_INCLUDE_BROKEN);
2414 while ((ok = ref_iterator_advance(iter)) == ITER_OK) {
2415 if (skip &&
2416 string_list_has_string(skip, iter->refname))
2417 continue;
2419 strbuf_addf(err, _("'%s' exists; cannot create '%s'"),
2420 iter->refname, refname);
2421 ref_iterator_abort(iter);
2422 goto cleanup;
2425 if (ok != ITER_DONE)
2426 BUG("error while iterating over references");
2428 extra_refname = find_descendant_ref(dirname.buf, extras, skip);
2429 if (extra_refname)
2430 strbuf_addf(err, _("cannot process '%s' and '%s' at the same time"),
2431 refname, extra_refname);
2432 else
2433 ret = 0;
2435 cleanup:
2436 strbuf_release(&referent);
2437 strbuf_release(&dirname);
2438 return ret;
2441 int refs_for_each_reflog(struct ref_store *refs, each_ref_fn fn, void *cb_data)
2443 struct ref_iterator *iter;
2444 struct do_for_each_ref_help hp = { fn, cb_data };
2446 iter = refs->be->reflog_iterator_begin(refs);
2448 return do_for_each_repo_ref_iterator(the_repository, iter,
2449 do_for_each_ref_helper, &hp);
2452 int for_each_reflog(each_ref_fn fn, void *cb_data)
2454 return refs_for_each_reflog(get_main_ref_store(the_repository), fn, cb_data);
2457 int refs_for_each_reflog_ent_reverse(struct ref_store *refs,
2458 const char *refname,
2459 each_reflog_ent_fn fn,
2460 void *cb_data)
2462 return refs->be->for_each_reflog_ent_reverse(refs, refname,
2463 fn, cb_data);
2466 int for_each_reflog_ent_reverse(const char *refname, each_reflog_ent_fn fn,
2467 void *cb_data)
2469 return refs_for_each_reflog_ent_reverse(get_main_ref_store(the_repository),
2470 refname, fn, cb_data);
2473 int refs_for_each_reflog_ent(struct ref_store *refs, const char *refname,
2474 each_reflog_ent_fn fn, void *cb_data)
2476 return refs->be->for_each_reflog_ent(refs, refname, fn, cb_data);
2479 int for_each_reflog_ent(const char *refname, each_reflog_ent_fn fn,
2480 void *cb_data)
2482 return refs_for_each_reflog_ent(get_main_ref_store(the_repository), refname,
2483 fn, cb_data);
2486 int refs_reflog_exists(struct ref_store *refs, const char *refname)
2488 return refs->be->reflog_exists(refs, refname);
2491 int reflog_exists(const char *refname)
2493 return refs_reflog_exists(get_main_ref_store(the_repository), refname);
2496 int refs_create_reflog(struct ref_store *refs, const char *refname,
2497 struct strbuf *err)
2499 return refs->be->create_reflog(refs, refname, err);
2502 int safe_create_reflog(const char *refname, struct strbuf *err)
2504 return refs_create_reflog(get_main_ref_store(the_repository), refname,
2505 err);
2508 int refs_delete_reflog(struct ref_store *refs, const char *refname)
2510 return refs->be->delete_reflog(refs, refname);
2513 int delete_reflog(const char *refname)
2515 return refs_delete_reflog(get_main_ref_store(the_repository), refname);
2518 int refs_reflog_expire(struct ref_store *refs,
2519 const char *refname,
2520 unsigned int flags,
2521 reflog_expiry_prepare_fn prepare_fn,
2522 reflog_expiry_should_prune_fn should_prune_fn,
2523 reflog_expiry_cleanup_fn cleanup_fn,
2524 void *policy_cb_data)
2526 return refs->be->reflog_expire(refs, refname, flags,
2527 prepare_fn, should_prune_fn,
2528 cleanup_fn, policy_cb_data);
2531 int reflog_expire(const char *refname,
2532 unsigned int flags,
2533 reflog_expiry_prepare_fn prepare_fn,
2534 reflog_expiry_should_prune_fn should_prune_fn,
2535 reflog_expiry_cleanup_fn cleanup_fn,
2536 void *policy_cb_data)
2538 return refs_reflog_expire(get_main_ref_store(the_repository),
2539 refname, flags,
2540 prepare_fn, should_prune_fn,
2541 cleanup_fn, policy_cb_data);
2544 int initial_ref_transaction_commit(struct ref_transaction *transaction,
2545 struct strbuf *err)
2547 struct ref_store *refs = transaction->ref_store;
2549 return refs->be->initial_transaction_commit(refs, transaction, err);
2552 void ref_transaction_for_each_queued_update(struct ref_transaction *transaction,
2553 ref_transaction_for_each_queued_update_fn cb,
2554 void *cb_data)
2556 int i;
2558 for (i = 0; i < transaction->nr; i++) {
2559 struct ref_update *update = transaction->updates[i];
2561 cb(update->refname,
2562 (update->flags & REF_HAVE_OLD) ? &update->old_oid : NULL,
2563 (update->flags & REF_HAVE_NEW) ? &update->new_oid : NULL,
2564 cb_data);
2568 int refs_delete_refs(struct ref_store *refs, const char *logmsg,
2569 struct string_list *refnames, unsigned int flags)
2571 char *msg;
2572 int retval;
2574 msg = normalize_reflog_message(logmsg);
2575 retval = refs->be->delete_refs(refs, msg, refnames, flags);
2576 free(msg);
2577 return retval;
2580 int delete_refs(const char *msg, struct string_list *refnames,
2581 unsigned int flags)
2583 return refs_delete_refs(get_main_ref_store(the_repository), msg, refnames, flags);
2586 int refs_rename_ref(struct ref_store *refs, const char *oldref,
2587 const char *newref, const char *logmsg)
2589 char *msg;
2590 int retval;
2592 msg = normalize_reflog_message(logmsg);
2593 retval = refs->be->rename_ref(refs, oldref, newref, msg);
2594 free(msg);
2595 return retval;
2598 int rename_ref(const char *oldref, const char *newref, const char *logmsg)
2600 return refs_rename_ref(get_main_ref_store(the_repository), oldref, newref, logmsg);
2603 int refs_copy_existing_ref(struct ref_store *refs, const char *oldref,
2604 const char *newref, const char *logmsg)
2606 char *msg;
2607 int retval;
2609 msg = normalize_reflog_message(logmsg);
2610 retval = refs->be->copy_ref(refs, oldref, newref, msg);
2611 free(msg);
2612 return retval;
2615 int copy_existing_ref(const char *oldref, const char *newref, const char *logmsg)
2617 return refs_copy_existing_ref(get_main_ref_store(the_repository), oldref, newref, logmsg);