builtin.h: remove unneccessary includes
[alt-git.git] / refs.c
blob6d657e3bb46a52b34e9fe2c0c72c0f5340039c36
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 "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 "wrapper.h"
35 * List of all available backends
37 static struct ref_storage_be *refs_backends = &refs_be_files;
39 static struct ref_storage_be *find_ref_storage_backend(const char *name)
41 struct ref_storage_be *be;
42 for (be = refs_backends; be; be = be->next)
43 if (!strcmp(be->name, name))
44 return be;
45 return NULL;
49 * How to handle various characters in refnames:
50 * 0: An acceptable character for refs
51 * 1: End-of-component
52 * 2: ., look for a preceding . to reject .. in refs
53 * 3: {, look for a preceding @ to reject @{ in refs
54 * 4: A bad character: ASCII control characters, and
55 * ":", "?", "[", "\", "^", "~", SP, or TAB
56 * 5: *, reject unless REFNAME_REFSPEC_PATTERN is set
58 static unsigned char refname_disposition[256] = {
59 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
60 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
61 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 2, 1,
62 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 4,
63 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
64 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 4, 0,
65 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
66 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 4, 4
69 struct ref_namespace_info ref_namespace[] = {
70 [NAMESPACE_HEAD] = {
71 .ref = "HEAD",
72 .decoration = DECORATION_REF_HEAD,
73 .exact = 1,
75 [NAMESPACE_BRANCHES] = {
76 .ref = "refs/heads/",
77 .decoration = DECORATION_REF_LOCAL,
79 [NAMESPACE_TAGS] = {
80 .ref = "refs/tags/",
81 .decoration = DECORATION_REF_TAG,
83 [NAMESPACE_REMOTE_REFS] = {
85 * The default refspec for new remotes copies refs from
86 * refs/heads/ on the remote into refs/remotes/<remote>/.
87 * As such, "refs/remotes/" has special handling.
89 .ref = "refs/remotes/",
90 .decoration = DECORATION_REF_REMOTE,
92 [NAMESPACE_STASH] = {
94 * The single ref "refs/stash" stores the latest stash.
95 * Older stashes can be found in the reflog.
97 .ref = "refs/stash",
98 .exact = 1,
99 .decoration = DECORATION_REF_STASH,
101 [NAMESPACE_REPLACE] = {
103 * This namespace allows Git to act as if one object ID
104 * points to the content of another. Unlike the other
105 * ref namespaces, this one can be changed by the
106 * GIT_REPLACE_REF_BASE environment variable. This
107 * .namespace value will be overwritten in setup_git_env().
109 .ref = "refs/replace/",
110 .decoration = DECORATION_GRAFTED,
112 [NAMESPACE_NOTES] = {
114 * The refs/notes/commit ref points to the tip of a
115 * parallel commit history that adds metadata to commits
116 * in the normal history. This ref can be overwritten
117 * by the core.notesRef config variable or the
118 * GIT_NOTES_REFS environment variable.
120 .ref = "refs/notes/commit",
121 .exact = 1,
123 [NAMESPACE_PREFETCH] = {
125 * Prefetch refs are written by the background 'fetch'
126 * maintenance task. It allows faster foreground fetches
127 * by advertising these previously-downloaded tips without
128 * updating refs/remotes/ without user intervention.
130 .ref = "refs/prefetch/",
132 [NAMESPACE_REWRITTEN] = {
134 * Rewritten refs are used by the 'label' command in the
135 * sequencer. These are particularly useful during an
136 * interactive rebase that uses the 'merge' command.
138 .ref = "refs/rewritten/",
142 void update_ref_namespace(enum ref_namespace namespace, char *ref)
144 struct ref_namespace_info *info = &ref_namespace[namespace];
145 if (info->ref_updated)
146 free(info->ref);
147 info->ref = ref;
148 info->ref_updated = 1;
152 * Try to read one refname component from the front of refname.
153 * Return the length of the component found, or -1 if the component is
154 * not legal. It is legal if it is something reasonable to have under
155 * ".git/refs/"; We do not like it if:
157 * - it begins with ".", or
158 * - it has double dots "..", or
159 * - it has ASCII control characters, or
160 * - it has ":", "?", "[", "\", "^", "~", SP, or TAB anywhere, or
161 * - it has "*" anywhere unless REFNAME_REFSPEC_PATTERN is set, or
162 * - it ends with a "/", or
163 * - it ends with ".lock", or
164 * - it contains a "@{" portion
166 * When sanitized is not NULL, instead of rejecting the input refname
167 * as an error, try to come up with a usable replacement for the input
168 * refname in it.
170 static int check_refname_component(const char *refname, int *flags,
171 struct strbuf *sanitized)
173 const char *cp;
174 char last = '\0';
175 size_t component_start = 0; /* garbage - not a reasonable initial value */
177 if (sanitized)
178 component_start = sanitized->len;
180 for (cp = refname; ; cp++) {
181 int ch = *cp & 255;
182 unsigned char disp = refname_disposition[ch];
184 if (sanitized && disp != 1)
185 strbuf_addch(sanitized, ch);
187 switch (disp) {
188 case 1:
189 goto out;
190 case 2:
191 if (last == '.') { /* Refname contains "..". */
192 if (sanitized)
193 /* collapse ".." to single "." */
194 strbuf_setlen(sanitized, sanitized->len - 1);
195 else
196 return -1;
198 break;
199 case 3:
200 if (last == '@') { /* Refname contains "@{". */
201 if (sanitized)
202 sanitized->buf[sanitized->len-1] = '-';
203 else
204 return -1;
206 break;
207 case 4:
208 /* forbidden char */
209 if (sanitized)
210 sanitized->buf[sanitized->len-1] = '-';
211 else
212 return -1;
213 break;
214 case 5:
215 if (!(*flags & REFNAME_REFSPEC_PATTERN)) {
216 /* refspec can't be a pattern */
217 if (sanitized)
218 sanitized->buf[sanitized->len-1] = '-';
219 else
220 return -1;
224 * Unset the pattern flag so that we only accept
225 * a single asterisk for one side of refspec.
227 *flags &= ~ REFNAME_REFSPEC_PATTERN;
228 break;
230 last = ch;
232 out:
233 if (cp == refname)
234 return 0; /* Component has zero length. */
236 if (refname[0] == '.') { /* Component starts with '.'. */
237 if (sanitized)
238 sanitized->buf[component_start] = '-';
239 else
240 return -1;
242 if (cp - refname >= LOCK_SUFFIX_LEN &&
243 !memcmp(cp - LOCK_SUFFIX_LEN, LOCK_SUFFIX, LOCK_SUFFIX_LEN)) {
244 if (!sanitized)
245 return -1;
246 /* Refname ends with ".lock". */
247 while (strbuf_strip_suffix(sanitized, LOCK_SUFFIX)) {
248 /* try again in case we have .lock.lock */
251 return cp - refname;
254 static int check_or_sanitize_refname(const char *refname, int flags,
255 struct strbuf *sanitized)
257 int component_len, component_count = 0;
259 if (!strcmp(refname, "@")) {
260 /* Refname is a single character '@'. */
261 if (sanitized)
262 strbuf_addch(sanitized, '-');
263 else
264 return -1;
267 while (1) {
268 if (sanitized && sanitized->len)
269 strbuf_complete(sanitized, '/');
271 /* We are at the start of a path component. */
272 component_len = check_refname_component(refname, &flags,
273 sanitized);
274 if (sanitized && component_len == 0)
275 ; /* OK, omit empty component */
276 else if (component_len <= 0)
277 return -1;
279 component_count++;
280 if (refname[component_len] == '\0')
281 break;
282 /* Skip to next component. */
283 refname += component_len + 1;
286 if (refname[component_len - 1] == '.') {
287 /* Refname ends with '.'. */
288 if (sanitized)
289 ; /* omit ending dot */
290 else
291 return -1;
293 if (!(flags & REFNAME_ALLOW_ONELEVEL) && component_count < 2)
294 return -1; /* Refname has only one component. */
295 return 0;
298 int check_refname_format(const char *refname, int flags)
300 return check_or_sanitize_refname(refname, flags, NULL);
303 void sanitize_refname_component(const char *refname, struct strbuf *out)
305 if (check_or_sanitize_refname(refname, REFNAME_ALLOW_ONELEVEL, out))
306 BUG("sanitizing refname '%s' check returned error", refname);
309 int refname_is_safe(const char *refname)
311 const char *rest;
313 if (skip_prefix(refname, "refs/", &rest)) {
314 char *buf;
315 int result;
316 size_t restlen = strlen(rest);
318 /* rest must not be empty, or start or end with "/" */
319 if (!restlen || *rest == '/' || rest[restlen - 1] == '/')
320 return 0;
323 * Does the refname try to escape refs/?
324 * For example: refs/foo/../bar is safe but refs/foo/../../bar
325 * is not.
327 buf = xmallocz(restlen);
328 result = !normalize_path_copy(buf, rest) && !strcmp(buf, rest);
329 free(buf);
330 return result;
333 do {
334 if (!isupper(*refname) && *refname != '_')
335 return 0;
336 refname++;
337 } while (*refname);
338 return 1;
342 * Return true if refname, which has the specified oid and flags, can
343 * be resolved to an object in the database. If the referred-to object
344 * does not exist, emit a warning and return false.
346 int ref_resolves_to_object(const char *refname,
347 struct repository *repo,
348 const struct object_id *oid,
349 unsigned int flags)
351 if (flags & REF_ISBROKEN)
352 return 0;
353 if (!repo_has_object_file(repo, oid)) {
354 error(_("%s does not point to a valid object!"), refname);
355 return 0;
357 return 1;
360 char *refs_resolve_refdup(struct ref_store *refs,
361 const char *refname, int resolve_flags,
362 struct object_id *oid, int *flags)
364 const char *result;
366 result = refs_resolve_ref_unsafe(refs, refname, resolve_flags,
367 oid, flags);
368 return xstrdup_or_null(result);
371 char *resolve_refdup(const char *refname, int resolve_flags,
372 struct object_id *oid, int *flags)
374 return refs_resolve_refdup(get_main_ref_store(the_repository),
375 refname, resolve_flags,
376 oid, flags);
379 /* The argument to filter_refs */
380 struct ref_filter {
381 const char *pattern;
382 const char *prefix;
383 each_ref_fn *fn;
384 void *cb_data;
387 int read_ref_full(const char *refname, int resolve_flags, struct object_id *oid, int *flags)
389 struct ref_store *refs = get_main_ref_store(the_repository);
391 if (refs_resolve_ref_unsafe(refs, refname, resolve_flags,
392 oid, flags))
393 return 0;
394 return -1;
397 int read_ref(const char *refname, struct object_id *oid)
399 return read_ref_full(refname, RESOLVE_REF_READING, oid, NULL);
402 int refs_ref_exists(struct ref_store *refs, const char *refname)
404 return !!refs_resolve_ref_unsafe(refs, refname, RESOLVE_REF_READING,
405 NULL, NULL);
408 int ref_exists(const char *refname)
410 return refs_ref_exists(get_main_ref_store(the_repository), refname);
413 static int filter_refs(const char *refname, const struct object_id *oid,
414 int flags, void *data)
416 struct ref_filter *filter = (struct ref_filter *)data;
418 if (wildmatch(filter->pattern, refname, 0))
419 return 0;
420 if (filter->prefix)
421 skip_prefix(refname, filter->prefix, &refname);
422 return filter->fn(refname, oid, flags, filter->cb_data);
425 enum peel_status peel_object(const struct object_id *name, struct object_id *oid)
427 struct object *o = lookup_unknown_object(the_repository, name);
429 if (o->type == OBJ_NONE) {
430 int type = oid_object_info(the_repository, name, NULL);
431 if (type < 0 || !object_as_type(o, type, 0))
432 return PEEL_INVALID;
435 if (o->type != OBJ_TAG)
436 return PEEL_NON_TAG;
438 o = deref_tag_noverify(o);
439 if (!o)
440 return PEEL_INVALID;
442 oidcpy(oid, &o->oid);
443 return PEEL_PEELED;
446 struct warn_if_dangling_data {
447 FILE *fp;
448 const char *refname;
449 const struct string_list *refnames;
450 const char *msg_fmt;
453 static int warn_if_dangling_symref(const char *refname,
454 const struct object_id *oid UNUSED,
455 int flags, void *cb_data)
457 struct warn_if_dangling_data *d = cb_data;
458 const char *resolves_to;
460 if (!(flags & REF_ISSYMREF))
461 return 0;
463 resolves_to = resolve_ref_unsafe(refname, 0, NULL, NULL);
464 if (!resolves_to
465 || (d->refname
466 ? strcmp(resolves_to, d->refname)
467 : !string_list_has_string(d->refnames, resolves_to))) {
468 return 0;
471 fprintf(d->fp, d->msg_fmt, refname);
472 fputc('\n', d->fp);
473 return 0;
476 void warn_dangling_symref(FILE *fp, const char *msg_fmt, const char *refname)
478 struct warn_if_dangling_data data;
480 data.fp = fp;
481 data.refname = refname;
482 data.refnames = NULL;
483 data.msg_fmt = msg_fmt;
484 for_each_rawref(warn_if_dangling_symref, &data);
487 void warn_dangling_symrefs(FILE *fp, const char *msg_fmt, const struct string_list *refnames)
489 struct warn_if_dangling_data data;
491 data.fp = fp;
492 data.refname = NULL;
493 data.refnames = refnames;
494 data.msg_fmt = msg_fmt;
495 for_each_rawref(warn_if_dangling_symref, &data);
498 int refs_for_each_tag_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
500 return refs_for_each_ref_in(refs, "refs/tags/", fn, cb_data);
503 int for_each_tag_ref(each_ref_fn fn, void *cb_data)
505 return refs_for_each_tag_ref(get_main_ref_store(the_repository), fn, cb_data);
508 int refs_for_each_branch_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
510 return refs_for_each_ref_in(refs, "refs/heads/", fn, cb_data);
513 int for_each_branch_ref(each_ref_fn fn, void *cb_data)
515 return refs_for_each_branch_ref(get_main_ref_store(the_repository), fn, cb_data);
518 int refs_for_each_remote_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
520 return refs_for_each_ref_in(refs, "refs/remotes/", fn, cb_data);
523 int for_each_remote_ref(each_ref_fn fn, void *cb_data)
525 return refs_for_each_remote_ref(get_main_ref_store(the_repository), fn, cb_data);
528 int head_ref_namespaced(each_ref_fn fn, void *cb_data)
530 struct strbuf buf = STRBUF_INIT;
531 int ret = 0;
532 struct object_id oid;
533 int flag;
535 strbuf_addf(&buf, "%sHEAD", get_git_namespace());
536 if (!read_ref_full(buf.buf, RESOLVE_REF_READING, &oid, &flag))
537 ret = fn(buf.buf, &oid, flag, cb_data);
538 strbuf_release(&buf);
540 return ret;
543 void normalize_glob_ref(struct string_list_item *item, const char *prefix,
544 const char *pattern)
546 struct strbuf normalized_pattern = STRBUF_INIT;
548 if (*pattern == '/')
549 BUG("pattern must not start with '/'");
551 if (prefix)
552 strbuf_addstr(&normalized_pattern, prefix);
553 else if (!starts_with(pattern, "refs/") &&
554 strcmp(pattern, "HEAD"))
555 strbuf_addstr(&normalized_pattern, "refs/");
557 * NEEDSWORK: Special case other symrefs such as REBASE_HEAD,
558 * MERGE_HEAD, etc.
561 strbuf_addstr(&normalized_pattern, pattern);
562 strbuf_strip_suffix(&normalized_pattern, "/");
564 item->string = strbuf_detach(&normalized_pattern, NULL);
565 item->util = has_glob_specials(pattern) ? NULL : item->string;
566 strbuf_release(&normalized_pattern);
569 int for_each_glob_ref_in(each_ref_fn fn, const char *pattern,
570 const char *prefix, void *cb_data)
572 struct strbuf real_pattern = STRBUF_INIT;
573 struct ref_filter filter;
574 int ret;
576 if (!prefix && !starts_with(pattern, "refs/"))
577 strbuf_addstr(&real_pattern, "refs/");
578 else if (prefix)
579 strbuf_addstr(&real_pattern, prefix);
580 strbuf_addstr(&real_pattern, pattern);
582 if (!has_glob_specials(pattern)) {
583 /* Append implied '/' '*' if not present. */
584 strbuf_complete(&real_pattern, '/');
585 /* No need to check for '*', there is none. */
586 strbuf_addch(&real_pattern, '*');
589 filter.pattern = real_pattern.buf;
590 filter.prefix = prefix;
591 filter.fn = fn;
592 filter.cb_data = cb_data;
593 ret = for_each_ref(filter_refs, &filter);
595 strbuf_release(&real_pattern);
596 return ret;
599 int for_each_glob_ref(each_ref_fn fn, const char *pattern, void *cb_data)
601 return for_each_glob_ref_in(fn, pattern, NULL, cb_data);
604 const char *prettify_refname(const char *name)
606 if (skip_prefix(name, "refs/heads/", &name) ||
607 skip_prefix(name, "refs/tags/", &name) ||
608 skip_prefix(name, "refs/remotes/", &name))
609 ; /* nothing */
610 return name;
613 static const char *ref_rev_parse_rules[] = {
614 "%.*s",
615 "refs/%.*s",
616 "refs/tags/%.*s",
617 "refs/heads/%.*s",
618 "refs/remotes/%.*s",
619 "refs/remotes/%.*s/HEAD",
620 NULL
623 #define NUM_REV_PARSE_RULES (ARRAY_SIZE(ref_rev_parse_rules) - 1)
626 * Is it possible that the caller meant full_name with abbrev_name?
627 * If so return a non-zero value to signal "yes"; the magnitude of
628 * the returned value gives the precedence used for disambiguation.
630 * If abbrev_name cannot mean full_name, return 0.
632 int refname_match(const char *abbrev_name, const char *full_name)
634 const char **p;
635 const int abbrev_name_len = strlen(abbrev_name);
636 const int num_rules = NUM_REV_PARSE_RULES;
638 for (p = ref_rev_parse_rules; *p; p++)
639 if (!strcmp(full_name, mkpath(*p, abbrev_name_len, abbrev_name)))
640 return &ref_rev_parse_rules[num_rules] - p;
642 return 0;
646 * Given a 'prefix' expand it by the rules in 'ref_rev_parse_rules' and add
647 * the results to 'prefixes'
649 void expand_ref_prefix(struct strvec *prefixes, const char *prefix)
651 const char **p;
652 int len = strlen(prefix);
654 for (p = ref_rev_parse_rules; *p; p++)
655 strvec_pushf(prefixes, *p, len, prefix);
658 static const char default_branch_name_advice[] = N_(
659 "Using '%s' as the name for the initial branch. This default branch name\n"
660 "is subject to change. To configure the initial branch name to use in all\n"
661 "of your new repositories, which will suppress this warning, call:\n"
662 "\n"
663 "\tgit config --global init.defaultBranch <name>\n"
664 "\n"
665 "Names commonly chosen instead of 'master' are 'main', 'trunk' and\n"
666 "'development'. The just-created branch can be renamed via this command:\n"
667 "\n"
668 "\tgit branch -m <name>\n"
671 char *repo_default_branch_name(struct repository *r, int quiet)
673 const char *config_key = "init.defaultbranch";
674 const char *config_display_key = "init.defaultBranch";
675 char *ret = NULL, *full_ref;
676 const char *env = getenv("GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME");
678 if (env && *env)
679 ret = xstrdup(env);
680 else if (repo_config_get_string(r, config_key, &ret) < 0)
681 die(_("could not retrieve `%s`"), config_display_key);
683 if (!ret) {
684 ret = xstrdup("master");
685 if (!quiet)
686 advise(_(default_branch_name_advice), ret);
689 full_ref = xstrfmt("refs/heads/%s", ret);
690 if (check_refname_format(full_ref, 0))
691 die(_("invalid branch name: %s = %s"), config_display_key, ret);
692 free(full_ref);
694 return ret;
697 const char *git_default_branch_name(int quiet)
699 static char *ret;
701 if (!ret)
702 ret = repo_default_branch_name(the_repository, quiet);
704 return ret;
708 * *string and *len will only be substituted, and *string returned (for
709 * later free()ing) if the string passed in is a magic short-hand form
710 * to name a branch.
712 static char *substitute_branch_name(struct repository *r,
713 const char **string, int *len,
714 int nonfatal_dangling_mark)
716 struct strbuf buf = STRBUF_INIT;
717 struct interpret_branch_name_options options = {
718 .nonfatal_dangling_mark = nonfatal_dangling_mark
720 int ret = repo_interpret_branch_name(r, *string, *len, &buf, &options);
722 if (ret == *len) {
723 size_t size;
724 *string = strbuf_detach(&buf, &size);
725 *len = size;
726 return (char *)*string;
729 return NULL;
732 int repo_dwim_ref(struct repository *r, const char *str, int len,
733 struct object_id *oid, char **ref, int nonfatal_dangling_mark)
735 char *last_branch = substitute_branch_name(r, &str, &len,
736 nonfatal_dangling_mark);
737 int refs_found = expand_ref(r, str, len, oid, ref);
738 free(last_branch);
739 return refs_found;
742 int expand_ref(struct repository *repo, const char *str, int len,
743 struct object_id *oid, char **ref)
745 const char **p, *r;
746 int refs_found = 0;
747 struct strbuf fullref = STRBUF_INIT;
749 *ref = NULL;
750 for (p = ref_rev_parse_rules; *p; p++) {
751 struct object_id oid_from_ref;
752 struct object_id *this_result;
753 int flag;
754 struct ref_store *refs = get_main_ref_store(repo);
756 this_result = refs_found ? &oid_from_ref : oid;
757 strbuf_reset(&fullref);
758 strbuf_addf(&fullref, *p, len, str);
759 r = refs_resolve_ref_unsafe(refs, fullref.buf,
760 RESOLVE_REF_READING,
761 this_result, &flag);
762 if (r) {
763 if (!refs_found++)
764 *ref = xstrdup(r);
765 if (!warn_ambiguous_refs)
766 break;
767 } else if ((flag & REF_ISSYMREF) && strcmp(fullref.buf, "HEAD")) {
768 warning(_("ignoring dangling symref %s"), fullref.buf);
769 } else if ((flag & REF_ISBROKEN) && strchr(fullref.buf, '/')) {
770 warning(_("ignoring broken ref %s"), fullref.buf);
773 strbuf_release(&fullref);
774 return refs_found;
777 int repo_dwim_log(struct repository *r, const char *str, int len,
778 struct object_id *oid, char **log)
780 struct ref_store *refs = get_main_ref_store(r);
781 char *last_branch = substitute_branch_name(r, &str, &len, 0);
782 const char **p;
783 int logs_found = 0;
784 struct strbuf path = STRBUF_INIT;
786 *log = NULL;
787 for (p = ref_rev_parse_rules; *p; p++) {
788 struct object_id hash;
789 const char *ref, *it;
791 strbuf_reset(&path);
792 strbuf_addf(&path, *p, len, str);
793 ref = refs_resolve_ref_unsafe(refs, path.buf,
794 RESOLVE_REF_READING,
795 oid ? &hash : NULL, NULL);
796 if (!ref)
797 continue;
798 if (refs_reflog_exists(refs, path.buf))
799 it = path.buf;
800 else if (strcmp(ref, path.buf) &&
801 refs_reflog_exists(refs, ref))
802 it = ref;
803 else
804 continue;
805 if (!logs_found++) {
806 *log = xstrdup(it);
807 if (oid)
808 oidcpy(oid, &hash);
810 if (!warn_ambiguous_refs)
811 break;
813 strbuf_release(&path);
814 free(last_branch);
815 return logs_found;
818 int dwim_log(const char *str, int len, struct object_id *oid, char **log)
820 return repo_dwim_log(the_repository, str, len, oid, log);
823 int is_per_worktree_ref(const char *refname)
825 return starts_with(refname, "refs/worktree/") ||
826 starts_with(refname, "refs/bisect/") ||
827 starts_with(refname, "refs/rewritten/");
830 static int is_pseudoref_syntax(const char *refname)
832 const char *c;
834 for (c = refname; *c; c++) {
835 if (!isupper(*c) && *c != '-' && *c != '_')
836 return 0;
840 * HEAD is not a pseudoref, but it certainly uses the
841 * pseudoref syntax.
843 return 1;
846 static int is_current_worktree_ref(const char *ref) {
847 return is_pseudoref_syntax(ref) || is_per_worktree_ref(ref);
850 enum ref_worktree_type parse_worktree_ref(const char *maybe_worktree_ref,
851 const char **worktree_name, int *worktree_name_length,
852 const char **bare_refname)
854 const char *name_dummy;
855 int name_length_dummy;
856 const char *ref_dummy;
858 if (!worktree_name)
859 worktree_name = &name_dummy;
860 if (!worktree_name_length)
861 worktree_name_length = &name_length_dummy;
862 if (!bare_refname)
863 bare_refname = &ref_dummy;
865 if (skip_prefix(maybe_worktree_ref, "worktrees/", bare_refname)) {
866 const char *slash = strchr(*bare_refname, '/');
868 *worktree_name = *bare_refname;
869 if (!slash) {
870 *worktree_name_length = strlen(*worktree_name);
872 /* This is an error condition, and the caller tell because the bare_refname is "" */
873 *bare_refname = *worktree_name + *worktree_name_length;
874 return REF_WORKTREE_OTHER;
877 *worktree_name_length = slash - *bare_refname;
878 *bare_refname = slash + 1;
880 if (is_current_worktree_ref(*bare_refname))
881 return REF_WORKTREE_OTHER;
884 *worktree_name = NULL;
885 *worktree_name_length = 0;
887 if (skip_prefix(maybe_worktree_ref, "main-worktree/", bare_refname)
888 && is_current_worktree_ref(*bare_refname))
889 return REF_WORKTREE_MAIN;
891 *bare_refname = maybe_worktree_ref;
892 if (is_current_worktree_ref(maybe_worktree_ref))
893 return REF_WORKTREE_CURRENT;
895 return REF_WORKTREE_SHARED;
898 long get_files_ref_lock_timeout_ms(void)
900 static int configured = 0;
902 /* The default timeout is 100 ms: */
903 static int timeout_ms = 100;
905 if (!configured) {
906 git_config_get_int("core.filesreflocktimeout", &timeout_ms);
907 configured = 1;
910 return timeout_ms;
913 int refs_delete_ref(struct ref_store *refs, const char *msg,
914 const char *refname,
915 const struct object_id *old_oid,
916 unsigned int flags)
918 struct ref_transaction *transaction;
919 struct strbuf err = STRBUF_INIT;
921 transaction = ref_store_transaction_begin(refs, &err);
922 if (!transaction ||
923 ref_transaction_delete(transaction, refname, old_oid,
924 flags, msg, &err) ||
925 ref_transaction_commit(transaction, &err)) {
926 error("%s", err.buf);
927 ref_transaction_free(transaction);
928 strbuf_release(&err);
929 return 1;
931 ref_transaction_free(transaction);
932 strbuf_release(&err);
933 return 0;
936 int delete_ref(const char *msg, const char *refname,
937 const struct object_id *old_oid, unsigned int flags)
939 return refs_delete_ref(get_main_ref_store(the_repository), msg, refname,
940 old_oid, flags);
943 static void copy_reflog_msg(struct strbuf *sb, const char *msg)
945 char c;
946 int wasspace = 1;
948 while ((c = *msg++)) {
949 if (wasspace && isspace(c))
950 continue;
951 wasspace = isspace(c);
952 if (wasspace)
953 c = ' ';
954 strbuf_addch(sb, c);
956 strbuf_rtrim(sb);
959 static char *normalize_reflog_message(const char *msg)
961 struct strbuf sb = STRBUF_INIT;
963 if (msg && *msg)
964 copy_reflog_msg(&sb, msg);
965 return strbuf_detach(&sb, NULL);
968 int should_autocreate_reflog(const char *refname)
970 switch (log_all_ref_updates) {
971 case LOG_REFS_ALWAYS:
972 return 1;
973 case LOG_REFS_NORMAL:
974 return starts_with(refname, "refs/heads/") ||
975 starts_with(refname, "refs/remotes/") ||
976 starts_with(refname, "refs/notes/") ||
977 !strcmp(refname, "HEAD");
978 default:
979 return 0;
983 int is_branch(const char *refname)
985 return !strcmp(refname, "HEAD") || starts_with(refname, "refs/heads/");
988 struct read_ref_at_cb {
989 const char *refname;
990 timestamp_t at_time;
991 int cnt;
992 int reccnt;
993 struct object_id *oid;
994 int found_it;
996 struct object_id ooid;
997 struct object_id noid;
998 int tz;
999 timestamp_t date;
1000 char **msg;
1001 timestamp_t *cutoff_time;
1002 int *cutoff_tz;
1003 int *cutoff_cnt;
1006 static void set_read_ref_cutoffs(struct read_ref_at_cb *cb,
1007 timestamp_t timestamp, int tz, const char *message)
1009 if (cb->msg)
1010 *cb->msg = xstrdup(message);
1011 if (cb->cutoff_time)
1012 *cb->cutoff_time = timestamp;
1013 if (cb->cutoff_tz)
1014 *cb->cutoff_tz = tz;
1015 if (cb->cutoff_cnt)
1016 *cb->cutoff_cnt = cb->reccnt;
1019 static int read_ref_at_ent(struct object_id *ooid, struct object_id *noid,
1020 const char *email UNUSED,
1021 timestamp_t timestamp, int tz,
1022 const char *message, void *cb_data)
1024 struct read_ref_at_cb *cb = cb_data;
1025 int reached_count;
1027 cb->tz = tz;
1028 cb->date = timestamp;
1031 * It is not possible for cb->cnt == 0 on the first iteration because
1032 * that special case is handled in read_ref_at().
1034 if (cb->cnt > 0)
1035 cb->cnt--;
1036 reached_count = cb->cnt == 0 && !is_null_oid(ooid);
1037 if (timestamp <= cb->at_time || reached_count) {
1038 set_read_ref_cutoffs(cb, timestamp, tz, message);
1040 * we have not yet updated cb->[n|o]oid so they still
1041 * hold the values for the previous record.
1043 if (!is_null_oid(&cb->ooid) && !oideq(&cb->ooid, noid))
1044 warning(_("log for ref %s has gap after %s"),
1045 cb->refname, show_date(cb->date, cb->tz, DATE_MODE(RFC2822)));
1046 if (reached_count)
1047 oidcpy(cb->oid, ooid);
1048 else if (!is_null_oid(&cb->ooid) || cb->date == cb->at_time)
1049 oidcpy(cb->oid, noid);
1050 else if (!oideq(noid, cb->oid))
1051 warning(_("log for ref %s unexpectedly ended on %s"),
1052 cb->refname, show_date(cb->date, cb->tz,
1053 DATE_MODE(RFC2822)));
1054 cb->found_it = 1;
1056 cb->reccnt++;
1057 oidcpy(&cb->ooid, ooid);
1058 oidcpy(&cb->noid, noid);
1059 return cb->found_it;
1062 static int read_ref_at_ent_newest(struct object_id *ooid UNUSED,
1063 struct object_id *noid,
1064 const char *email UNUSED,
1065 timestamp_t timestamp, int tz,
1066 const char *message, void *cb_data)
1068 struct read_ref_at_cb *cb = cb_data;
1070 set_read_ref_cutoffs(cb, timestamp, tz, message);
1071 oidcpy(cb->oid, noid);
1072 /* We just want the first entry */
1073 return 1;
1076 static int read_ref_at_ent_oldest(struct object_id *ooid, struct object_id *noid,
1077 const char *email UNUSED,
1078 timestamp_t timestamp, int tz,
1079 const char *message, void *cb_data)
1081 struct read_ref_at_cb *cb = cb_data;
1083 set_read_ref_cutoffs(cb, timestamp, tz, message);
1084 oidcpy(cb->oid, ooid);
1085 if (is_null_oid(cb->oid))
1086 oidcpy(cb->oid, noid);
1087 /* We just want the first entry */
1088 return 1;
1091 int read_ref_at(struct ref_store *refs, const char *refname,
1092 unsigned int flags, timestamp_t at_time, int cnt,
1093 struct object_id *oid, char **msg,
1094 timestamp_t *cutoff_time, int *cutoff_tz, int *cutoff_cnt)
1096 struct read_ref_at_cb cb;
1098 memset(&cb, 0, sizeof(cb));
1099 cb.refname = refname;
1100 cb.at_time = at_time;
1101 cb.cnt = cnt;
1102 cb.msg = msg;
1103 cb.cutoff_time = cutoff_time;
1104 cb.cutoff_tz = cutoff_tz;
1105 cb.cutoff_cnt = cutoff_cnt;
1106 cb.oid = oid;
1108 if (cb.cnt == 0) {
1109 refs_for_each_reflog_ent_reverse(refs, refname, read_ref_at_ent_newest, &cb);
1110 return 0;
1113 refs_for_each_reflog_ent_reverse(refs, refname, read_ref_at_ent, &cb);
1115 if (!cb.reccnt) {
1116 if (flags & GET_OID_QUIETLY)
1117 exit(128);
1118 else
1119 die(_("log for %s is empty"), refname);
1121 if (cb.found_it)
1122 return 0;
1124 refs_for_each_reflog_ent(refs, refname, read_ref_at_ent_oldest, &cb);
1126 return 1;
1129 struct ref_transaction *ref_store_transaction_begin(struct ref_store *refs,
1130 struct strbuf *err)
1132 struct ref_transaction *tr;
1133 assert(err);
1135 CALLOC_ARRAY(tr, 1);
1136 tr->ref_store = refs;
1137 return tr;
1140 struct ref_transaction *ref_transaction_begin(struct strbuf *err)
1142 return ref_store_transaction_begin(get_main_ref_store(the_repository), err);
1145 void ref_transaction_free(struct ref_transaction *transaction)
1147 size_t i;
1149 if (!transaction)
1150 return;
1152 switch (transaction->state) {
1153 case REF_TRANSACTION_OPEN:
1154 case REF_TRANSACTION_CLOSED:
1155 /* OK */
1156 break;
1157 case REF_TRANSACTION_PREPARED:
1158 BUG("free called on a prepared reference transaction");
1159 break;
1160 default:
1161 BUG("unexpected reference transaction state");
1162 break;
1165 for (i = 0; i < transaction->nr; i++) {
1166 free(transaction->updates[i]->msg);
1167 free(transaction->updates[i]);
1169 free(transaction->updates);
1170 free(transaction);
1173 struct ref_update *ref_transaction_add_update(
1174 struct ref_transaction *transaction,
1175 const char *refname, unsigned int flags,
1176 const struct object_id *new_oid,
1177 const struct object_id *old_oid,
1178 const char *msg)
1180 struct ref_update *update;
1182 if (transaction->state != REF_TRANSACTION_OPEN)
1183 BUG("update called for transaction that is not open");
1185 FLEX_ALLOC_STR(update, refname, refname);
1186 ALLOC_GROW(transaction->updates, transaction->nr + 1, transaction->alloc);
1187 transaction->updates[transaction->nr++] = update;
1189 update->flags = flags;
1191 if (flags & REF_HAVE_NEW)
1192 oidcpy(&update->new_oid, new_oid);
1193 if (flags & REF_HAVE_OLD)
1194 oidcpy(&update->old_oid, old_oid);
1195 update->msg = normalize_reflog_message(msg);
1196 return update;
1199 int ref_transaction_update(struct ref_transaction *transaction,
1200 const char *refname,
1201 const struct object_id *new_oid,
1202 const struct object_id *old_oid,
1203 unsigned int flags, const char *msg,
1204 struct strbuf *err)
1206 assert(err);
1208 if (!(flags & REF_SKIP_REFNAME_VERIFICATION) &&
1209 ((new_oid && !is_null_oid(new_oid)) ?
1210 check_refname_format(refname, REFNAME_ALLOW_ONELEVEL) :
1211 !refname_is_safe(refname))) {
1212 strbuf_addf(err, _("refusing to update ref with bad name '%s'"),
1213 refname);
1214 return -1;
1217 if (flags & ~REF_TRANSACTION_UPDATE_ALLOWED_FLAGS)
1218 BUG("illegal flags 0x%x passed to ref_transaction_update()", flags);
1221 * Clear flags outside the allowed set; this should be a noop because
1222 * of the BUG() check above, but it works around a -Wnonnull warning
1223 * with some versions of "gcc -O3".
1225 flags &= REF_TRANSACTION_UPDATE_ALLOWED_FLAGS;
1227 flags |= (new_oid ? REF_HAVE_NEW : 0) | (old_oid ? REF_HAVE_OLD : 0);
1229 ref_transaction_add_update(transaction, refname, flags,
1230 new_oid, old_oid, msg);
1231 return 0;
1234 int ref_transaction_create(struct ref_transaction *transaction,
1235 const char *refname,
1236 const struct object_id *new_oid,
1237 unsigned int flags, const char *msg,
1238 struct strbuf *err)
1240 if (!new_oid || is_null_oid(new_oid)) {
1241 strbuf_addf(err, "'%s' has a null OID", refname);
1242 return 1;
1244 return ref_transaction_update(transaction, refname, new_oid,
1245 null_oid(), flags, msg, err);
1248 int ref_transaction_delete(struct ref_transaction *transaction,
1249 const char *refname,
1250 const struct object_id *old_oid,
1251 unsigned int flags, const char *msg,
1252 struct strbuf *err)
1254 if (old_oid && is_null_oid(old_oid))
1255 BUG("delete called with old_oid set to zeros");
1256 return ref_transaction_update(transaction, refname,
1257 null_oid(), old_oid,
1258 flags, msg, err);
1261 int ref_transaction_verify(struct ref_transaction *transaction,
1262 const char *refname,
1263 const struct object_id *old_oid,
1264 unsigned int flags,
1265 struct strbuf *err)
1267 if (!old_oid)
1268 BUG("verify called with old_oid set to NULL");
1269 return ref_transaction_update(transaction, refname,
1270 NULL, old_oid,
1271 flags, NULL, err);
1274 int refs_update_ref(struct ref_store *refs, const char *msg,
1275 const char *refname, const struct object_id *new_oid,
1276 const struct object_id *old_oid, unsigned int flags,
1277 enum action_on_err onerr)
1279 struct ref_transaction *t = NULL;
1280 struct strbuf err = STRBUF_INIT;
1281 int ret = 0;
1283 t = ref_store_transaction_begin(refs, &err);
1284 if (!t ||
1285 ref_transaction_update(t, refname, new_oid, old_oid, flags, msg,
1286 &err) ||
1287 ref_transaction_commit(t, &err)) {
1288 ret = 1;
1289 ref_transaction_free(t);
1291 if (ret) {
1292 const char *str = _("update_ref failed for ref '%s': %s");
1294 switch (onerr) {
1295 case UPDATE_REFS_MSG_ON_ERR:
1296 error(str, refname, err.buf);
1297 break;
1298 case UPDATE_REFS_DIE_ON_ERR:
1299 die(str, refname, err.buf);
1300 break;
1301 case UPDATE_REFS_QUIET_ON_ERR:
1302 break;
1304 strbuf_release(&err);
1305 return 1;
1307 strbuf_release(&err);
1308 if (t)
1309 ref_transaction_free(t);
1310 return 0;
1313 int update_ref(const char *msg, const char *refname,
1314 const struct object_id *new_oid,
1315 const struct object_id *old_oid,
1316 unsigned int flags, enum action_on_err onerr)
1318 return refs_update_ref(get_main_ref_store(the_repository), msg, refname, new_oid,
1319 old_oid, flags, onerr);
1323 * Check that the string refname matches a rule of the form
1324 * "{prefix}%.*s{suffix}". So "foo/bar/baz" would match the rule
1325 * "foo/%.*s/baz", and return the string "bar".
1327 static const char *match_parse_rule(const char *refname, const char *rule,
1328 size_t *len)
1331 * Check that rule matches refname up to the first percent in the rule.
1332 * We can bail immediately if not, but otherwise we leave "rule" at the
1333 * %-placeholder, and "refname" at the start of the potential matched
1334 * name.
1336 while (*rule != '%') {
1337 if (!*rule)
1338 BUG("rev-parse rule did not have percent");
1339 if (*refname++ != *rule++)
1340 return NULL;
1344 * Check that our "%" is the expected placeholder. This assumes there
1345 * are no other percents (placeholder or quoted) in the string, but
1346 * that is sufficient for our rev-parse rules.
1348 if (!skip_prefix(rule, "%.*s", &rule))
1349 return NULL;
1352 * And now check that our suffix (if any) matches.
1354 if (!strip_suffix(refname, rule, len))
1355 return NULL;
1357 return refname; /* len set by strip_suffix() */
1360 char *refs_shorten_unambiguous_ref(struct ref_store *refs,
1361 const char *refname, int strict)
1363 int i;
1364 struct strbuf resolved_buf = STRBUF_INIT;
1366 /* skip first rule, it will always match */
1367 for (i = NUM_REV_PARSE_RULES - 1; i > 0 ; --i) {
1368 int j;
1369 int rules_to_fail = i;
1370 const char *short_name;
1371 size_t short_name_len;
1373 short_name = match_parse_rule(refname, ref_rev_parse_rules[i],
1374 &short_name_len);
1375 if (!short_name)
1376 continue;
1379 * in strict mode, all (except the matched one) rules
1380 * must fail to resolve to a valid non-ambiguous ref
1382 if (strict)
1383 rules_to_fail = NUM_REV_PARSE_RULES;
1386 * check if the short name resolves to a valid ref,
1387 * but use only rules prior to the matched one
1389 for (j = 0; j < rules_to_fail; j++) {
1390 const char *rule = ref_rev_parse_rules[j];
1392 /* skip matched rule */
1393 if (i == j)
1394 continue;
1397 * the short name is ambiguous, if it resolves
1398 * (with this previous rule) to a valid ref
1399 * read_ref() returns 0 on success
1401 strbuf_reset(&resolved_buf);
1402 strbuf_addf(&resolved_buf, rule,
1403 cast_size_t_to_int(short_name_len),
1404 short_name);
1405 if (refs_ref_exists(refs, resolved_buf.buf))
1406 break;
1410 * short name is non-ambiguous if all previous rules
1411 * haven't resolved to a valid ref
1413 if (j == rules_to_fail) {
1414 strbuf_release(&resolved_buf);
1415 return xmemdupz(short_name, short_name_len);
1419 strbuf_release(&resolved_buf);
1420 return xstrdup(refname);
1423 char *shorten_unambiguous_ref(const char *refname, int strict)
1425 return refs_shorten_unambiguous_ref(get_main_ref_store(the_repository),
1426 refname, strict);
1429 int parse_hide_refs_config(const char *var, const char *value, const char *section,
1430 struct string_list *hide_refs)
1432 const char *key;
1433 if (!strcmp("transfer.hiderefs", var) ||
1434 (!parse_config_key(var, section, NULL, NULL, &key) &&
1435 !strcmp(key, "hiderefs"))) {
1436 char *ref;
1437 int len;
1439 if (!value)
1440 return config_error_nonbool(var);
1441 ref = xstrdup(value);
1442 len = strlen(ref);
1443 while (len && ref[len - 1] == '/')
1444 ref[--len] = '\0';
1445 string_list_append_nodup(hide_refs, ref);
1447 return 0;
1450 int ref_is_hidden(const char *refname, const char *refname_full,
1451 const struct string_list *hide_refs)
1453 int i;
1455 for (i = hide_refs->nr - 1; i >= 0; i--) {
1456 const char *match = hide_refs->items[i].string;
1457 const char *subject;
1458 int neg = 0;
1459 const char *p;
1461 if (*match == '!') {
1462 neg = 1;
1463 match++;
1466 if (*match == '^') {
1467 subject = refname_full;
1468 match++;
1469 } else {
1470 subject = refname;
1473 /* refname can be NULL when namespaces are used. */
1474 if (subject &&
1475 skip_prefix(subject, match, &p) &&
1476 (!*p || *p == '/'))
1477 return !neg;
1479 return 0;
1482 const char *find_descendant_ref(const char *dirname,
1483 const struct string_list *extras,
1484 const struct string_list *skip)
1486 int pos;
1488 if (!extras)
1489 return NULL;
1492 * Look at the place where dirname would be inserted into
1493 * extras. If there is an entry at that position that starts
1494 * with dirname (remember, dirname includes the trailing
1495 * slash) and is not in skip, then we have a conflict.
1497 for (pos = string_list_find_insert_index(extras, dirname, 0);
1498 pos < extras->nr; pos++) {
1499 const char *extra_refname = extras->items[pos].string;
1501 if (!starts_with(extra_refname, dirname))
1502 break;
1504 if (!skip || !string_list_has_string(skip, extra_refname))
1505 return extra_refname;
1507 return NULL;
1510 int refs_head_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
1512 struct object_id oid;
1513 int flag;
1515 if (refs_resolve_ref_unsafe(refs, "HEAD", RESOLVE_REF_READING,
1516 &oid, &flag))
1517 return fn("HEAD", &oid, flag, cb_data);
1519 return 0;
1522 int head_ref(each_ref_fn fn, void *cb_data)
1524 return refs_head_ref(get_main_ref_store(the_repository), fn, cb_data);
1527 struct ref_iterator *refs_ref_iterator_begin(
1528 struct ref_store *refs,
1529 const char *prefix, int trim,
1530 enum do_for_each_ref_flags flags)
1532 struct ref_iterator *iter;
1534 if (!(flags & DO_FOR_EACH_INCLUDE_BROKEN)) {
1535 static int ref_paranoia = -1;
1537 if (ref_paranoia < 0)
1538 ref_paranoia = git_env_bool("GIT_REF_PARANOIA", 1);
1539 if (ref_paranoia) {
1540 flags |= DO_FOR_EACH_INCLUDE_BROKEN;
1541 flags |= DO_FOR_EACH_OMIT_DANGLING_SYMREFS;
1545 iter = refs->be->iterator_begin(refs, prefix, flags);
1548 * `iterator_begin()` already takes care of prefix, but we
1549 * might need to do some trimming:
1551 if (trim)
1552 iter = prefix_ref_iterator_begin(iter, "", trim);
1554 /* Sanity check for subclasses: */
1555 if (!iter->ordered)
1556 BUG("reference iterator is not ordered");
1558 return iter;
1562 * Call fn for each reference in the specified submodule for which the
1563 * refname begins with prefix. If trim is non-zero, then trim that
1564 * many characters off the beginning of each refname before passing
1565 * the refname to fn. flags can be DO_FOR_EACH_INCLUDE_BROKEN to
1566 * include broken references in the iteration. If fn ever returns a
1567 * non-zero value, stop the iteration and return that value;
1568 * otherwise, return 0.
1570 static int do_for_each_repo_ref(struct repository *r, const char *prefix,
1571 each_repo_ref_fn fn, int trim, int flags,
1572 void *cb_data)
1574 struct ref_iterator *iter;
1575 struct ref_store *refs = get_main_ref_store(r);
1577 if (!refs)
1578 return 0;
1580 iter = refs_ref_iterator_begin(refs, prefix, trim, flags);
1582 return do_for_each_repo_ref_iterator(r, iter, fn, cb_data);
1585 struct do_for_each_ref_help {
1586 each_ref_fn *fn;
1587 void *cb_data;
1590 static int do_for_each_ref_helper(struct repository *r,
1591 const char *refname,
1592 const struct object_id *oid,
1593 int flags,
1594 void *cb_data)
1596 struct do_for_each_ref_help *hp = cb_data;
1598 return hp->fn(refname, oid, flags, hp->cb_data);
1601 static int do_for_each_ref(struct ref_store *refs, const char *prefix,
1602 each_ref_fn fn, int trim,
1603 enum do_for_each_ref_flags flags, void *cb_data)
1605 struct ref_iterator *iter;
1606 struct do_for_each_ref_help hp = { fn, cb_data };
1608 if (!refs)
1609 return 0;
1611 iter = refs_ref_iterator_begin(refs, prefix, trim, flags);
1613 return do_for_each_repo_ref_iterator(the_repository, iter,
1614 do_for_each_ref_helper, &hp);
1617 int refs_for_each_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
1619 return do_for_each_ref(refs, "", fn, 0, 0, cb_data);
1622 int for_each_ref(each_ref_fn fn, void *cb_data)
1624 return refs_for_each_ref(get_main_ref_store(the_repository), fn, cb_data);
1627 int refs_for_each_ref_in(struct ref_store *refs, const char *prefix,
1628 each_ref_fn fn, void *cb_data)
1630 return do_for_each_ref(refs, prefix, fn, strlen(prefix), 0, cb_data);
1633 int for_each_ref_in(const char *prefix, each_ref_fn fn, void *cb_data)
1635 return refs_for_each_ref_in(get_main_ref_store(the_repository), prefix, fn, cb_data);
1638 int for_each_fullref_in(const char *prefix, each_ref_fn fn, void *cb_data)
1640 return do_for_each_ref(get_main_ref_store(the_repository),
1641 prefix, fn, 0, 0, cb_data);
1644 int refs_for_each_fullref_in(struct ref_store *refs, const char *prefix,
1645 each_ref_fn fn, void *cb_data)
1647 return do_for_each_ref(refs, prefix, fn, 0, 0, cb_data);
1650 int for_each_replace_ref(struct repository *r, each_repo_ref_fn fn, void *cb_data)
1652 const char *git_replace_ref_base = ref_namespace[NAMESPACE_REPLACE].ref;
1653 return do_for_each_repo_ref(r, git_replace_ref_base, fn,
1654 strlen(git_replace_ref_base),
1655 DO_FOR_EACH_INCLUDE_BROKEN, cb_data);
1658 int for_each_namespaced_ref(each_ref_fn fn, void *cb_data)
1660 struct strbuf buf = STRBUF_INIT;
1661 int ret;
1662 strbuf_addf(&buf, "%srefs/", get_git_namespace());
1663 ret = do_for_each_ref(get_main_ref_store(the_repository),
1664 buf.buf, fn, 0, 0, cb_data);
1665 strbuf_release(&buf);
1666 return ret;
1669 int refs_for_each_rawref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
1671 return do_for_each_ref(refs, "", fn, 0,
1672 DO_FOR_EACH_INCLUDE_BROKEN, cb_data);
1675 int for_each_rawref(each_ref_fn fn, void *cb_data)
1677 return refs_for_each_rawref(get_main_ref_store(the_repository), fn, cb_data);
1680 static int qsort_strcmp(const void *va, const void *vb)
1682 const char *a = *(const char **)va;
1683 const char *b = *(const char **)vb;
1685 return strcmp(a, b);
1688 static void find_longest_prefixes_1(struct string_list *out,
1689 struct strbuf *prefix,
1690 const char **patterns, size_t nr)
1692 size_t i;
1694 for (i = 0; i < nr; i++) {
1695 char c = patterns[i][prefix->len];
1696 if (!c || is_glob_special(c)) {
1697 string_list_append(out, prefix->buf);
1698 return;
1702 i = 0;
1703 while (i < nr) {
1704 size_t end;
1707 * Set "end" to the index of the element _after_ the last one
1708 * in our group.
1710 for (end = i + 1; end < nr; end++) {
1711 if (patterns[i][prefix->len] != patterns[end][prefix->len])
1712 break;
1715 strbuf_addch(prefix, patterns[i][prefix->len]);
1716 find_longest_prefixes_1(out, prefix, patterns + i, end - i);
1717 strbuf_setlen(prefix, prefix->len - 1);
1719 i = end;
1723 static void find_longest_prefixes(struct string_list *out,
1724 const char **patterns)
1726 struct strvec sorted = STRVEC_INIT;
1727 struct strbuf prefix = STRBUF_INIT;
1729 strvec_pushv(&sorted, patterns);
1730 QSORT(sorted.v, sorted.nr, qsort_strcmp);
1732 find_longest_prefixes_1(out, &prefix, sorted.v, sorted.nr);
1734 strvec_clear(&sorted);
1735 strbuf_release(&prefix);
1738 int refs_for_each_fullref_in_prefixes(struct ref_store *ref_store,
1739 const char *namespace,
1740 const char **patterns,
1741 each_ref_fn fn, void *cb_data)
1743 struct string_list prefixes = STRING_LIST_INIT_DUP;
1744 struct string_list_item *prefix;
1745 struct strbuf buf = STRBUF_INIT;
1746 int ret = 0, namespace_len;
1748 find_longest_prefixes(&prefixes, patterns);
1750 if (namespace)
1751 strbuf_addstr(&buf, namespace);
1752 namespace_len = buf.len;
1754 for_each_string_list_item(prefix, &prefixes) {
1755 strbuf_addstr(&buf, prefix->string);
1756 ret = refs_for_each_fullref_in(ref_store, buf.buf, fn, cb_data);
1757 if (ret)
1758 break;
1759 strbuf_setlen(&buf, namespace_len);
1762 string_list_clear(&prefixes, 0);
1763 strbuf_release(&buf);
1764 return ret;
1767 static int refs_read_special_head(struct ref_store *ref_store,
1768 const char *refname, struct object_id *oid,
1769 struct strbuf *referent, unsigned int *type,
1770 int *failure_errno)
1772 struct strbuf full_path = STRBUF_INIT;
1773 struct strbuf content = STRBUF_INIT;
1774 int result = -1;
1775 strbuf_addf(&full_path, "%s/%s", ref_store->gitdir, refname);
1777 if (strbuf_read_file(&content, full_path.buf, 0) < 0)
1778 goto done;
1780 result = parse_loose_ref_contents(content.buf, oid, referent, type,
1781 failure_errno);
1783 done:
1784 strbuf_release(&full_path);
1785 strbuf_release(&content);
1786 return result;
1789 int refs_read_raw_ref(struct ref_store *ref_store, const char *refname,
1790 struct object_id *oid, struct strbuf *referent,
1791 unsigned int *type, int *failure_errno)
1793 assert(failure_errno);
1794 if (!strcmp(refname, "FETCH_HEAD") || !strcmp(refname, "MERGE_HEAD")) {
1795 return refs_read_special_head(ref_store, refname, oid, referent,
1796 type, failure_errno);
1799 return ref_store->be->read_raw_ref(ref_store, refname, oid, referent,
1800 type, failure_errno);
1803 int refs_read_symbolic_ref(struct ref_store *ref_store, const char *refname,
1804 struct strbuf *referent)
1806 return ref_store->be->read_symbolic_ref(ref_store, refname, referent);
1809 const char *refs_resolve_ref_unsafe(struct ref_store *refs,
1810 const char *refname,
1811 int resolve_flags,
1812 struct object_id *oid,
1813 int *flags)
1815 static struct strbuf sb_refname = STRBUF_INIT;
1816 struct object_id unused_oid;
1817 int unused_flags;
1818 int symref_count;
1820 if (!oid)
1821 oid = &unused_oid;
1822 if (!flags)
1823 flags = &unused_flags;
1825 *flags = 0;
1827 if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
1828 if (!(resolve_flags & RESOLVE_REF_ALLOW_BAD_NAME) ||
1829 !refname_is_safe(refname))
1830 return NULL;
1833 * repo_dwim_ref() uses REF_ISBROKEN to distinguish between
1834 * missing refs and refs that were present but invalid,
1835 * to complain about the latter to stderr.
1837 * We don't know whether the ref exists, so don't set
1838 * REF_ISBROKEN yet.
1840 *flags |= REF_BAD_NAME;
1843 for (symref_count = 0; symref_count < SYMREF_MAXDEPTH; symref_count++) {
1844 unsigned int read_flags = 0;
1845 int failure_errno;
1847 if (refs_read_raw_ref(refs, refname, oid, &sb_refname,
1848 &read_flags, &failure_errno)) {
1849 *flags |= read_flags;
1851 /* In reading mode, refs must eventually resolve */
1852 if (resolve_flags & RESOLVE_REF_READING)
1853 return NULL;
1856 * Otherwise a missing ref is OK. But the files backend
1857 * may show errors besides ENOENT if there are
1858 * similarly-named refs.
1860 if (failure_errno != ENOENT &&
1861 failure_errno != EISDIR &&
1862 failure_errno != ENOTDIR)
1863 return NULL;
1865 oidclr(oid);
1866 if (*flags & REF_BAD_NAME)
1867 *flags |= REF_ISBROKEN;
1868 return refname;
1871 *flags |= read_flags;
1873 if (!(read_flags & REF_ISSYMREF)) {
1874 if (*flags & REF_BAD_NAME) {
1875 oidclr(oid);
1876 *flags |= REF_ISBROKEN;
1878 return refname;
1881 refname = sb_refname.buf;
1882 if (resolve_flags & RESOLVE_REF_NO_RECURSE) {
1883 oidclr(oid);
1884 return refname;
1886 if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
1887 if (!(resolve_flags & RESOLVE_REF_ALLOW_BAD_NAME) ||
1888 !refname_is_safe(refname))
1889 return NULL;
1891 *flags |= REF_ISBROKEN | REF_BAD_NAME;
1895 return NULL;
1898 /* backend functions */
1899 int refs_init_db(struct strbuf *err)
1901 struct ref_store *refs = get_main_ref_store(the_repository);
1903 return refs->be->init_db(refs, err);
1906 const char *resolve_ref_unsafe(const char *refname, int resolve_flags,
1907 struct object_id *oid, int *flags)
1909 return refs_resolve_ref_unsafe(get_main_ref_store(the_repository), refname,
1910 resolve_flags, oid, flags);
1913 int resolve_gitlink_ref(const char *submodule, const char *refname,
1914 struct object_id *oid)
1916 struct ref_store *refs;
1917 int flags;
1919 refs = get_submodule_ref_store(submodule);
1921 if (!refs)
1922 return -1;
1924 if (!refs_resolve_ref_unsafe(refs, refname, 0, oid, &flags) ||
1925 is_null_oid(oid))
1926 return -1;
1927 return 0;
1930 struct ref_store_hash_entry
1932 struct hashmap_entry ent;
1934 struct ref_store *refs;
1936 /* NUL-terminated identifier of the ref store: */
1937 char name[FLEX_ARRAY];
1940 static int ref_store_hash_cmp(const void *cmp_data UNUSED,
1941 const struct hashmap_entry *eptr,
1942 const struct hashmap_entry *entry_or_key,
1943 const void *keydata)
1945 const struct ref_store_hash_entry *e1, *e2;
1946 const char *name;
1948 e1 = container_of(eptr, const struct ref_store_hash_entry, ent);
1949 e2 = container_of(entry_or_key, const struct ref_store_hash_entry, ent);
1950 name = keydata ? keydata : e2->name;
1952 return strcmp(e1->name, name);
1955 static struct ref_store_hash_entry *alloc_ref_store_hash_entry(
1956 const char *name, struct ref_store *refs)
1958 struct ref_store_hash_entry *entry;
1960 FLEX_ALLOC_STR(entry, name, name);
1961 hashmap_entry_init(&entry->ent, strhash(name));
1962 entry->refs = refs;
1963 return entry;
1966 /* A hashmap of ref_stores, stored by submodule name: */
1967 static struct hashmap submodule_ref_stores;
1969 /* A hashmap of ref_stores, stored by worktree id: */
1970 static struct hashmap worktree_ref_stores;
1973 * Look up a ref store by name. If that ref_store hasn't been
1974 * registered yet, return NULL.
1976 static struct ref_store *lookup_ref_store_map(struct hashmap *map,
1977 const char *name)
1979 struct ref_store_hash_entry *entry;
1980 unsigned int hash;
1982 if (!map->tablesize)
1983 /* It's initialized on demand in register_ref_store(). */
1984 return NULL;
1986 hash = strhash(name);
1987 entry = hashmap_get_entry_from_hash(map, hash, name,
1988 struct ref_store_hash_entry, ent);
1989 return entry ? entry->refs : NULL;
1993 * Create, record, and return a ref_store instance for the specified
1994 * gitdir.
1996 static struct ref_store *ref_store_init(struct repository *repo,
1997 const char *gitdir,
1998 unsigned int flags)
2000 const char *be_name = "files";
2001 struct ref_storage_be *be = find_ref_storage_backend(be_name);
2002 struct ref_store *refs;
2004 if (!be)
2005 BUG("reference backend %s is unknown", be_name);
2007 refs = be->init(repo, gitdir, flags);
2008 return refs;
2011 struct ref_store *get_main_ref_store(struct repository *r)
2013 if (r->refs_private)
2014 return r->refs_private;
2016 if (!r->gitdir)
2017 BUG("attempting to get main_ref_store outside of repository");
2019 r->refs_private = ref_store_init(r, r->gitdir, REF_STORE_ALL_CAPS);
2020 r->refs_private = maybe_debug_wrap_ref_store(r->gitdir, r->refs_private);
2021 return r->refs_private;
2025 * Associate a ref store with a name. It is a fatal error to call this
2026 * function twice for the same name.
2028 static void register_ref_store_map(struct hashmap *map,
2029 const char *type,
2030 struct ref_store *refs,
2031 const char *name)
2033 struct ref_store_hash_entry *entry;
2035 if (!map->tablesize)
2036 hashmap_init(map, ref_store_hash_cmp, NULL, 0);
2038 entry = alloc_ref_store_hash_entry(name, refs);
2039 if (hashmap_put(map, &entry->ent))
2040 BUG("%s ref_store '%s' initialized twice", type, name);
2043 struct ref_store *get_submodule_ref_store(const char *submodule)
2045 struct strbuf submodule_sb = STRBUF_INIT;
2046 struct ref_store *refs;
2047 char *to_free = NULL;
2048 size_t len;
2049 struct repository *subrepo;
2051 if (!submodule)
2052 return NULL;
2054 len = strlen(submodule);
2055 while (len && is_dir_sep(submodule[len - 1]))
2056 len--;
2057 if (!len)
2058 return NULL;
2060 if (submodule[len])
2061 /* We need to strip off one or more trailing slashes */
2062 submodule = to_free = xmemdupz(submodule, len);
2064 refs = lookup_ref_store_map(&submodule_ref_stores, submodule);
2065 if (refs)
2066 goto done;
2068 strbuf_addstr(&submodule_sb, submodule);
2069 if (!is_nonbare_repository_dir(&submodule_sb))
2070 goto done;
2072 if (submodule_to_gitdir(&submodule_sb, submodule))
2073 goto done;
2075 subrepo = xmalloc(sizeof(*subrepo));
2077 * NEEDSWORK: Make get_submodule_ref_store() work with arbitrary
2078 * superprojects other than the_repository. This probably should be
2079 * done by making it take a struct repository * parameter instead of a
2080 * submodule path.
2082 if (repo_submodule_init(subrepo, the_repository, submodule,
2083 null_oid())) {
2084 free(subrepo);
2085 goto done;
2087 refs = ref_store_init(subrepo, submodule_sb.buf,
2088 REF_STORE_READ | REF_STORE_ODB);
2089 register_ref_store_map(&submodule_ref_stores, "submodule",
2090 refs, submodule);
2092 done:
2093 strbuf_release(&submodule_sb);
2094 free(to_free);
2096 return refs;
2099 struct ref_store *get_worktree_ref_store(const struct worktree *wt)
2101 struct ref_store *refs;
2102 const char *id;
2104 if (wt->is_current)
2105 return get_main_ref_store(the_repository);
2107 id = wt->id ? wt->id : "/";
2108 refs = lookup_ref_store_map(&worktree_ref_stores, id);
2109 if (refs)
2110 return refs;
2112 if (wt->id)
2113 refs = ref_store_init(the_repository,
2114 git_common_path("worktrees/%s", wt->id),
2115 REF_STORE_ALL_CAPS);
2116 else
2117 refs = ref_store_init(the_repository,
2118 get_git_common_dir(),
2119 REF_STORE_ALL_CAPS);
2121 if (refs)
2122 register_ref_store_map(&worktree_ref_stores, "worktree",
2123 refs, id);
2124 return refs;
2127 void base_ref_store_init(struct ref_store *refs, struct repository *repo,
2128 const char *path, const struct ref_storage_be *be)
2130 refs->be = be;
2131 refs->repo = repo;
2132 refs->gitdir = xstrdup(path);
2135 /* backend functions */
2136 int refs_pack_refs(struct ref_store *refs, struct pack_refs_opts *opts)
2138 return refs->be->pack_refs(refs, opts);
2141 int peel_iterated_oid(const struct object_id *base, struct object_id *peeled)
2143 if (current_ref_iter &&
2144 (current_ref_iter->oid == base ||
2145 oideq(current_ref_iter->oid, base)))
2146 return ref_iterator_peel(current_ref_iter, peeled);
2148 return peel_object(base, peeled) ? -1 : 0;
2151 int refs_create_symref(struct ref_store *refs,
2152 const char *ref_target,
2153 const char *refs_heads_master,
2154 const char *logmsg)
2156 char *msg;
2157 int retval;
2159 msg = normalize_reflog_message(logmsg);
2160 retval = refs->be->create_symref(refs, ref_target, refs_heads_master,
2161 msg);
2162 free(msg);
2163 return retval;
2166 int create_symref(const char *ref_target, const char *refs_heads_master,
2167 const char *logmsg)
2169 return refs_create_symref(get_main_ref_store(the_repository), ref_target,
2170 refs_heads_master, logmsg);
2173 int ref_update_reject_duplicates(struct string_list *refnames,
2174 struct strbuf *err)
2176 size_t i, n = refnames->nr;
2178 assert(err);
2180 for (i = 1; i < n; i++) {
2181 int cmp = strcmp(refnames->items[i - 1].string,
2182 refnames->items[i].string);
2184 if (!cmp) {
2185 strbuf_addf(err,
2186 _("multiple updates for ref '%s' not allowed"),
2187 refnames->items[i].string);
2188 return 1;
2189 } else if (cmp > 0) {
2190 BUG("ref_update_reject_duplicates() received unsorted list");
2193 return 0;
2196 static int run_transaction_hook(struct ref_transaction *transaction,
2197 const char *state)
2199 struct child_process proc = CHILD_PROCESS_INIT;
2200 struct strbuf buf = STRBUF_INIT;
2201 const char *hook;
2202 int ret = 0, i;
2204 hook = find_hook("reference-transaction");
2205 if (!hook)
2206 return ret;
2208 strvec_pushl(&proc.args, hook, state, NULL);
2209 proc.in = -1;
2210 proc.stdout_to_stderr = 1;
2211 proc.trace2_hook_name = "reference-transaction";
2213 ret = start_command(&proc);
2214 if (ret)
2215 return ret;
2217 sigchain_push(SIGPIPE, SIG_IGN);
2219 for (i = 0; i < transaction->nr; i++) {
2220 struct ref_update *update = transaction->updates[i];
2222 strbuf_reset(&buf);
2223 strbuf_addf(&buf, "%s %s %s\n",
2224 oid_to_hex(&update->old_oid),
2225 oid_to_hex(&update->new_oid),
2226 update->refname);
2228 if (write_in_full(proc.in, buf.buf, buf.len) < 0) {
2229 if (errno != EPIPE) {
2230 /* Don't leak errno outside this API */
2231 errno = 0;
2232 ret = -1;
2234 break;
2238 close(proc.in);
2239 sigchain_pop(SIGPIPE);
2240 strbuf_release(&buf);
2242 ret |= finish_command(&proc);
2243 return ret;
2246 int ref_transaction_prepare(struct ref_transaction *transaction,
2247 struct strbuf *err)
2249 struct ref_store *refs = transaction->ref_store;
2250 int ret;
2252 switch (transaction->state) {
2253 case REF_TRANSACTION_OPEN:
2254 /* Good. */
2255 break;
2256 case REF_TRANSACTION_PREPARED:
2257 BUG("prepare called twice on reference transaction");
2258 break;
2259 case REF_TRANSACTION_CLOSED:
2260 BUG("prepare called on a closed reference transaction");
2261 break;
2262 default:
2263 BUG("unexpected reference transaction state");
2264 break;
2267 if (refs->repo->objects->odb->disable_ref_updates) {
2268 strbuf_addstr(err,
2269 _("ref updates forbidden inside quarantine environment"));
2270 return -1;
2273 ret = refs->be->transaction_prepare(refs, transaction, err);
2274 if (ret)
2275 return ret;
2277 ret = run_transaction_hook(transaction, "prepared");
2278 if (ret) {
2279 ref_transaction_abort(transaction, err);
2280 die(_("ref updates aborted by hook"));
2283 return 0;
2286 int ref_transaction_abort(struct ref_transaction *transaction,
2287 struct strbuf *err)
2289 struct ref_store *refs = transaction->ref_store;
2290 int ret = 0;
2292 switch (transaction->state) {
2293 case REF_TRANSACTION_OPEN:
2294 /* No need to abort explicitly. */
2295 break;
2296 case REF_TRANSACTION_PREPARED:
2297 ret = refs->be->transaction_abort(refs, transaction, err);
2298 break;
2299 case REF_TRANSACTION_CLOSED:
2300 BUG("abort called on a closed reference transaction");
2301 break;
2302 default:
2303 BUG("unexpected reference transaction state");
2304 break;
2307 run_transaction_hook(transaction, "aborted");
2309 ref_transaction_free(transaction);
2310 return ret;
2313 int ref_transaction_commit(struct ref_transaction *transaction,
2314 struct strbuf *err)
2316 struct ref_store *refs = transaction->ref_store;
2317 int ret;
2319 switch (transaction->state) {
2320 case REF_TRANSACTION_OPEN:
2321 /* Need to prepare first. */
2322 ret = ref_transaction_prepare(transaction, err);
2323 if (ret)
2324 return ret;
2325 break;
2326 case REF_TRANSACTION_PREPARED:
2327 /* Fall through to finish. */
2328 break;
2329 case REF_TRANSACTION_CLOSED:
2330 BUG("commit called on a closed reference transaction");
2331 break;
2332 default:
2333 BUG("unexpected reference transaction state");
2334 break;
2337 ret = refs->be->transaction_finish(refs, transaction, err);
2338 if (!ret)
2339 run_transaction_hook(transaction, "committed");
2340 return ret;
2343 int refs_verify_refname_available(struct ref_store *refs,
2344 const char *refname,
2345 const struct string_list *extras,
2346 const struct string_list *skip,
2347 struct strbuf *err)
2349 const char *slash;
2350 const char *extra_refname;
2351 struct strbuf dirname = STRBUF_INIT;
2352 struct strbuf referent = STRBUF_INIT;
2353 struct object_id oid;
2354 unsigned int type;
2355 struct ref_iterator *iter;
2356 int ok;
2357 int ret = -1;
2360 * For the sake of comments in this function, suppose that
2361 * refname is "refs/foo/bar".
2364 assert(err);
2366 strbuf_grow(&dirname, strlen(refname) + 1);
2367 for (slash = strchr(refname, '/'); slash; slash = strchr(slash + 1, '/')) {
2369 * Just saying "Is a directory" when we e.g. can't
2370 * lock some multi-level ref isn't very informative,
2371 * the user won't be told *what* is a directory, so
2372 * let's not use strerror() below.
2374 int ignore_errno;
2375 /* Expand dirname to the new prefix, not including the trailing slash: */
2376 strbuf_add(&dirname, refname + dirname.len, slash - refname - dirname.len);
2379 * We are still at a leading dir of the refname (e.g.,
2380 * "refs/foo"; if there is a reference with that name,
2381 * it is a conflict, *unless* it is in skip.
2383 if (skip && string_list_has_string(skip, dirname.buf))
2384 continue;
2386 if (!refs_read_raw_ref(refs, dirname.buf, &oid, &referent,
2387 &type, &ignore_errno)) {
2388 strbuf_addf(err, _("'%s' exists; cannot create '%s'"),
2389 dirname.buf, refname);
2390 goto cleanup;
2393 if (extras && string_list_has_string(extras, dirname.buf)) {
2394 strbuf_addf(err, _("cannot process '%s' and '%s' at the same time"),
2395 refname, dirname.buf);
2396 goto cleanup;
2401 * We are at the leaf of our refname (e.g., "refs/foo/bar").
2402 * There is no point in searching for a reference with that
2403 * name, because a refname isn't considered to conflict with
2404 * itself. But we still need to check for references whose
2405 * names are in the "refs/foo/bar/" namespace, because they
2406 * *do* conflict.
2408 strbuf_addstr(&dirname, refname + dirname.len);
2409 strbuf_addch(&dirname, '/');
2411 iter = refs_ref_iterator_begin(refs, dirname.buf, 0,
2412 DO_FOR_EACH_INCLUDE_BROKEN);
2413 while ((ok = ref_iterator_advance(iter)) == ITER_OK) {
2414 if (skip &&
2415 string_list_has_string(skip, iter->refname))
2416 continue;
2418 strbuf_addf(err, _("'%s' exists; cannot create '%s'"),
2419 iter->refname, refname);
2420 ref_iterator_abort(iter);
2421 goto cleanup;
2424 if (ok != ITER_DONE)
2425 BUG("error while iterating over references");
2427 extra_refname = find_descendant_ref(dirname.buf, extras, skip);
2428 if (extra_refname)
2429 strbuf_addf(err, _("cannot process '%s' and '%s' at the same time"),
2430 refname, extra_refname);
2431 else
2432 ret = 0;
2434 cleanup:
2435 strbuf_release(&referent);
2436 strbuf_release(&dirname);
2437 return ret;
2440 int refs_for_each_reflog(struct ref_store *refs, each_ref_fn fn, void *cb_data)
2442 struct ref_iterator *iter;
2443 struct do_for_each_ref_help hp = { fn, cb_data };
2445 iter = refs->be->reflog_iterator_begin(refs);
2447 return do_for_each_repo_ref_iterator(the_repository, iter,
2448 do_for_each_ref_helper, &hp);
2451 int for_each_reflog(each_ref_fn fn, void *cb_data)
2453 return refs_for_each_reflog(get_main_ref_store(the_repository), fn, cb_data);
2456 int refs_for_each_reflog_ent_reverse(struct ref_store *refs,
2457 const char *refname,
2458 each_reflog_ent_fn fn,
2459 void *cb_data)
2461 return refs->be->for_each_reflog_ent_reverse(refs, refname,
2462 fn, cb_data);
2465 int for_each_reflog_ent_reverse(const char *refname, each_reflog_ent_fn fn,
2466 void *cb_data)
2468 return refs_for_each_reflog_ent_reverse(get_main_ref_store(the_repository),
2469 refname, fn, cb_data);
2472 int refs_for_each_reflog_ent(struct ref_store *refs, const char *refname,
2473 each_reflog_ent_fn fn, void *cb_data)
2475 return refs->be->for_each_reflog_ent(refs, refname, fn, cb_data);
2478 int for_each_reflog_ent(const char *refname, each_reflog_ent_fn fn,
2479 void *cb_data)
2481 return refs_for_each_reflog_ent(get_main_ref_store(the_repository), refname,
2482 fn, cb_data);
2485 int refs_reflog_exists(struct ref_store *refs, const char *refname)
2487 return refs->be->reflog_exists(refs, refname);
2490 int reflog_exists(const char *refname)
2492 return refs_reflog_exists(get_main_ref_store(the_repository), refname);
2495 int refs_create_reflog(struct ref_store *refs, const char *refname,
2496 struct strbuf *err)
2498 return refs->be->create_reflog(refs, refname, err);
2501 int safe_create_reflog(const char *refname, struct strbuf *err)
2503 return refs_create_reflog(get_main_ref_store(the_repository), refname,
2504 err);
2507 int refs_delete_reflog(struct ref_store *refs, const char *refname)
2509 return refs->be->delete_reflog(refs, refname);
2512 int delete_reflog(const char *refname)
2514 return refs_delete_reflog(get_main_ref_store(the_repository), refname);
2517 int refs_reflog_expire(struct ref_store *refs,
2518 const char *refname,
2519 unsigned int flags,
2520 reflog_expiry_prepare_fn prepare_fn,
2521 reflog_expiry_should_prune_fn should_prune_fn,
2522 reflog_expiry_cleanup_fn cleanup_fn,
2523 void *policy_cb_data)
2525 return refs->be->reflog_expire(refs, refname, flags,
2526 prepare_fn, should_prune_fn,
2527 cleanup_fn, policy_cb_data);
2530 int reflog_expire(const char *refname,
2531 unsigned int flags,
2532 reflog_expiry_prepare_fn prepare_fn,
2533 reflog_expiry_should_prune_fn should_prune_fn,
2534 reflog_expiry_cleanup_fn cleanup_fn,
2535 void *policy_cb_data)
2537 return refs_reflog_expire(get_main_ref_store(the_repository),
2538 refname, flags,
2539 prepare_fn, should_prune_fn,
2540 cleanup_fn, policy_cb_data);
2543 int initial_ref_transaction_commit(struct ref_transaction *transaction,
2544 struct strbuf *err)
2546 struct ref_store *refs = transaction->ref_store;
2548 return refs->be->initial_transaction_commit(refs, transaction, err);
2551 void ref_transaction_for_each_queued_update(struct ref_transaction *transaction,
2552 ref_transaction_for_each_queued_update_fn cb,
2553 void *cb_data)
2555 int i;
2557 for (i = 0; i < transaction->nr; i++) {
2558 struct ref_update *update = transaction->updates[i];
2560 cb(update->refname,
2561 (update->flags & REF_HAVE_OLD) ? &update->old_oid : NULL,
2562 (update->flags & REF_HAVE_NEW) ? &update->new_oid : NULL,
2563 cb_data);
2567 int refs_delete_refs(struct ref_store *refs, const char *logmsg,
2568 struct string_list *refnames, unsigned int flags)
2570 char *msg;
2571 int retval;
2573 msg = normalize_reflog_message(logmsg);
2574 retval = refs->be->delete_refs(refs, msg, refnames, flags);
2575 free(msg);
2576 return retval;
2579 int delete_refs(const char *msg, struct string_list *refnames,
2580 unsigned int flags)
2582 return refs_delete_refs(get_main_ref_store(the_repository), msg, refnames, flags);
2585 int refs_rename_ref(struct ref_store *refs, const char *oldref,
2586 const char *newref, const char *logmsg)
2588 char *msg;
2589 int retval;
2591 msg = normalize_reflog_message(logmsg);
2592 retval = refs->be->rename_ref(refs, oldref, newref, msg);
2593 free(msg);
2594 return retval;
2597 int rename_ref(const char *oldref, const char *newref, const char *logmsg)
2599 return refs_rename_ref(get_main_ref_store(the_repository), oldref, newref, logmsg);
2602 int refs_copy_existing_ref(struct ref_store *refs, const char *oldref,
2603 const char *newref, const char *logmsg)
2605 char *msg;
2606 int retval;
2608 msg = normalize_reflog_message(logmsg);
2609 retval = refs->be->copy_ref(refs, oldref, newref, msg);
2610 free(msg);
2611 return retval;
2614 int copy_existing_ref(const char *oldref, const char *newref, const char *logmsg)
2616 return refs_copy_existing_ref(get_main_ref_store(the_repository), oldref, newref, logmsg);