Merge branch 're/color-default-reset'
[git.git] / refs.c
blob4338875d86bb952af38067d91df86514dbaebd90
1 /*
2 * The backend-independent part of the reference module.
3 */
5 #include "cache.h"
6 #include "config.h"
7 #include "hashmap.h"
8 #include "lockfile.h"
9 #include "iterator.h"
10 #include "refs.h"
11 #include "refs/refs-internal.h"
12 #include "run-command.h"
13 #include "hook.h"
14 #include "object-store.h"
15 #include "object.h"
16 #include "tag.h"
17 #include "submodule.h"
18 #include "worktree.h"
19 #include "strvec.h"
20 #include "repository.h"
21 #include "sigchain.h"
24 * List of all available backends
26 static struct ref_storage_be *refs_backends = &refs_be_files;
28 static struct ref_storage_be *find_ref_storage_backend(const char *name)
30 struct ref_storage_be *be;
31 for (be = refs_backends; be; be = be->next)
32 if (!strcmp(be->name, name))
33 return be;
34 return NULL;
38 * How to handle various characters in refnames:
39 * 0: An acceptable character for refs
40 * 1: End-of-component
41 * 2: ., look for a preceding . to reject .. in refs
42 * 3: {, look for a preceding @ to reject @{ in refs
43 * 4: A bad character: ASCII control characters, and
44 * ":", "?", "[", "\", "^", "~", SP, or TAB
45 * 5: *, reject unless REFNAME_REFSPEC_PATTERN is set
47 static unsigned char refname_disposition[256] = {
48 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
49 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
50 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 2, 1,
51 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 4,
52 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
53 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 4, 0,
54 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
55 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 4, 4
59 * Try to read one refname component from the front of refname.
60 * Return the length of the component found, or -1 if the component is
61 * not legal. It is legal if it is something reasonable to have under
62 * ".git/refs/"; We do not like it if:
64 * - it begins with ".", or
65 * - it has double dots "..", or
66 * - it has ASCII control characters, or
67 * - it has ":", "?", "[", "\", "^", "~", SP, or TAB anywhere, or
68 * - it has "*" anywhere unless REFNAME_REFSPEC_PATTERN is set, or
69 * - it ends with a "/", or
70 * - it ends with ".lock", or
71 * - it contains a "@{" portion
73 * When sanitized is not NULL, instead of rejecting the input refname
74 * as an error, try to come up with a usable replacement for the input
75 * refname in it.
77 static int check_refname_component(const char *refname, int *flags,
78 struct strbuf *sanitized)
80 const char *cp;
81 char last = '\0';
82 size_t component_start = 0; /* garbage - not a reasonable initial value */
84 if (sanitized)
85 component_start = sanitized->len;
87 for (cp = refname; ; cp++) {
88 int ch = *cp & 255;
89 unsigned char disp = refname_disposition[ch];
91 if (sanitized && disp != 1)
92 strbuf_addch(sanitized, ch);
94 switch (disp) {
95 case 1:
96 goto out;
97 case 2:
98 if (last == '.') { /* Refname contains "..". */
99 if (sanitized)
100 /* collapse ".." to single "." */
101 strbuf_setlen(sanitized, sanitized->len - 1);
102 else
103 return -1;
105 break;
106 case 3:
107 if (last == '@') { /* Refname contains "@{". */
108 if (sanitized)
109 sanitized->buf[sanitized->len-1] = '-';
110 else
111 return -1;
113 break;
114 case 4:
115 /* forbidden char */
116 if (sanitized)
117 sanitized->buf[sanitized->len-1] = '-';
118 else
119 return -1;
120 break;
121 case 5:
122 if (!(*flags & REFNAME_REFSPEC_PATTERN)) {
123 /* refspec can't be a pattern */
124 if (sanitized)
125 sanitized->buf[sanitized->len-1] = '-';
126 else
127 return -1;
131 * Unset the pattern flag so that we only accept
132 * a single asterisk for one side of refspec.
134 *flags &= ~ REFNAME_REFSPEC_PATTERN;
135 break;
137 last = ch;
139 out:
140 if (cp == refname)
141 return 0; /* Component has zero length. */
143 if (refname[0] == '.') { /* Component starts with '.'. */
144 if (sanitized)
145 sanitized->buf[component_start] = '-';
146 else
147 return -1;
149 if (cp - refname >= LOCK_SUFFIX_LEN &&
150 !memcmp(cp - LOCK_SUFFIX_LEN, LOCK_SUFFIX, LOCK_SUFFIX_LEN)) {
151 if (!sanitized)
152 return -1;
153 /* Refname ends with ".lock". */
154 while (strbuf_strip_suffix(sanitized, LOCK_SUFFIX)) {
155 /* try again in case we have .lock.lock */
158 return cp - refname;
161 static int check_or_sanitize_refname(const char *refname, int flags,
162 struct strbuf *sanitized)
164 int component_len, component_count = 0;
166 if (!strcmp(refname, "@")) {
167 /* Refname is a single character '@'. */
168 if (sanitized)
169 strbuf_addch(sanitized, '-');
170 else
171 return -1;
174 while (1) {
175 if (sanitized && sanitized->len)
176 strbuf_complete(sanitized, '/');
178 /* We are at the start of a path component. */
179 component_len = check_refname_component(refname, &flags,
180 sanitized);
181 if (sanitized && component_len == 0)
182 ; /* OK, omit empty component */
183 else if (component_len <= 0)
184 return -1;
186 component_count++;
187 if (refname[component_len] == '\0')
188 break;
189 /* Skip to next component. */
190 refname += component_len + 1;
193 if (refname[component_len - 1] == '.') {
194 /* Refname ends with '.'. */
195 if (sanitized)
196 ; /* omit ending dot */
197 else
198 return -1;
200 if (!(flags & REFNAME_ALLOW_ONELEVEL) && component_count < 2)
201 return -1; /* Refname has only one component. */
202 return 0;
205 int check_refname_format(const char *refname, int flags)
207 return check_or_sanitize_refname(refname, flags, NULL);
210 void sanitize_refname_component(const char *refname, struct strbuf *out)
212 if (check_or_sanitize_refname(refname, REFNAME_ALLOW_ONELEVEL, out))
213 BUG("sanitizing refname '%s' check returned error", refname);
216 int refname_is_safe(const char *refname)
218 const char *rest;
220 if (skip_prefix(refname, "refs/", &rest)) {
221 char *buf;
222 int result;
223 size_t restlen = strlen(rest);
225 /* rest must not be empty, or start or end with "/" */
226 if (!restlen || *rest == '/' || rest[restlen - 1] == '/')
227 return 0;
230 * Does the refname try to escape refs/?
231 * For example: refs/foo/../bar is safe but refs/foo/../../bar
232 * is not.
234 buf = xmallocz(restlen);
235 result = !normalize_path_copy(buf, rest) && !strcmp(buf, rest);
236 free(buf);
237 return result;
240 do {
241 if (!isupper(*refname) && *refname != '_')
242 return 0;
243 refname++;
244 } while (*refname);
245 return 1;
249 * Return true if refname, which has the specified oid and flags, can
250 * be resolved to an object in the database. If the referred-to object
251 * does not exist, emit a warning and return false.
253 int ref_resolves_to_object(const char *refname,
254 struct repository *repo,
255 const struct object_id *oid,
256 unsigned int flags)
258 if (flags & REF_ISBROKEN)
259 return 0;
260 if (!repo_has_object_file(repo, oid)) {
261 error(_("%s does not point to a valid object!"), refname);
262 return 0;
264 return 1;
267 char *refs_resolve_refdup(struct ref_store *refs,
268 const char *refname, int resolve_flags,
269 struct object_id *oid, int *flags)
271 const char *result;
272 int ignore_errno;
274 result = refs_resolve_ref_unsafe(refs, refname, resolve_flags,
275 oid, flags, &ignore_errno);
276 return xstrdup_or_null(result);
279 char *resolve_refdup(const char *refname, int resolve_flags,
280 struct object_id *oid, int *flags)
282 return refs_resolve_refdup(get_main_ref_store(the_repository),
283 refname, resolve_flags,
284 oid, flags);
287 /* The argument to filter_refs */
288 struct ref_filter {
289 const char *pattern;
290 const char *prefix;
291 each_ref_fn *fn;
292 void *cb_data;
295 int read_ref_full(const char *refname, int resolve_flags, struct object_id *oid, int *flags)
297 int ignore_errno;
298 struct ref_store *refs = get_main_ref_store(the_repository);
300 if (refs_resolve_ref_unsafe(refs, refname, resolve_flags,
301 oid, flags, &ignore_errno))
302 return 0;
303 return -1;
306 int read_ref(const char *refname, struct object_id *oid)
308 return read_ref_full(refname, RESOLVE_REF_READING, oid, NULL);
311 int refs_ref_exists(struct ref_store *refs, const char *refname)
313 int ignore_errno;
314 return !!refs_resolve_ref_unsafe(refs, refname, RESOLVE_REF_READING,
315 NULL, NULL, &ignore_errno);
318 int ref_exists(const char *refname)
320 return refs_ref_exists(get_main_ref_store(the_repository), refname);
323 static int filter_refs(const char *refname, const struct object_id *oid,
324 int flags, void *data)
326 struct ref_filter *filter = (struct ref_filter *)data;
328 if (wildmatch(filter->pattern, refname, 0))
329 return 0;
330 if (filter->prefix)
331 skip_prefix(refname, filter->prefix, &refname);
332 return filter->fn(refname, oid, flags, filter->cb_data);
335 enum peel_status peel_object(const struct object_id *name, struct object_id *oid)
337 struct object *o = lookup_unknown_object(the_repository, name);
339 if (o->type == OBJ_NONE) {
340 int type = oid_object_info(the_repository, name, NULL);
341 if (type < 0 || !object_as_type(o, type, 0))
342 return PEEL_INVALID;
345 if (o->type != OBJ_TAG)
346 return PEEL_NON_TAG;
348 o = deref_tag_noverify(o);
349 if (!o)
350 return PEEL_INVALID;
352 oidcpy(oid, &o->oid);
353 return PEEL_PEELED;
356 struct warn_if_dangling_data {
357 FILE *fp;
358 const char *refname;
359 const struct string_list *refnames;
360 const char *msg_fmt;
363 static int warn_if_dangling_symref(const char *refname, const struct object_id *oid,
364 int flags, void *cb_data)
366 struct warn_if_dangling_data *d = cb_data;
367 const char *resolves_to;
369 if (!(flags & REF_ISSYMREF))
370 return 0;
372 resolves_to = resolve_ref_unsafe(refname, 0, NULL, NULL);
373 if (!resolves_to
374 || (d->refname
375 ? strcmp(resolves_to, d->refname)
376 : !string_list_has_string(d->refnames, resolves_to))) {
377 return 0;
380 fprintf(d->fp, d->msg_fmt, refname);
381 fputc('\n', d->fp);
382 return 0;
385 void warn_dangling_symref(FILE *fp, const char *msg_fmt, const char *refname)
387 struct warn_if_dangling_data data;
389 data.fp = fp;
390 data.refname = refname;
391 data.refnames = NULL;
392 data.msg_fmt = msg_fmt;
393 for_each_rawref(warn_if_dangling_symref, &data);
396 void warn_dangling_symrefs(FILE *fp, const char *msg_fmt, const struct string_list *refnames)
398 struct warn_if_dangling_data data;
400 data.fp = fp;
401 data.refname = NULL;
402 data.refnames = refnames;
403 data.msg_fmt = msg_fmt;
404 for_each_rawref(warn_if_dangling_symref, &data);
407 int refs_for_each_tag_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
409 return refs_for_each_ref_in(refs, "refs/tags/", fn, cb_data);
412 int for_each_tag_ref(each_ref_fn fn, void *cb_data)
414 return refs_for_each_tag_ref(get_main_ref_store(the_repository), fn, cb_data);
417 int refs_for_each_branch_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
419 return refs_for_each_ref_in(refs, "refs/heads/", fn, cb_data);
422 int for_each_branch_ref(each_ref_fn fn, void *cb_data)
424 return refs_for_each_branch_ref(get_main_ref_store(the_repository), fn, cb_data);
427 int refs_for_each_remote_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
429 return refs_for_each_ref_in(refs, "refs/remotes/", fn, cb_data);
432 int for_each_remote_ref(each_ref_fn fn, void *cb_data)
434 return refs_for_each_remote_ref(get_main_ref_store(the_repository), fn, cb_data);
437 int head_ref_namespaced(each_ref_fn fn, void *cb_data)
439 struct strbuf buf = STRBUF_INIT;
440 int ret = 0;
441 struct object_id oid;
442 int flag;
444 strbuf_addf(&buf, "%sHEAD", get_git_namespace());
445 if (!read_ref_full(buf.buf, RESOLVE_REF_READING, &oid, &flag))
446 ret = fn(buf.buf, &oid, flag, cb_data);
447 strbuf_release(&buf);
449 return ret;
452 void normalize_glob_ref(struct string_list_item *item, const char *prefix,
453 const char *pattern)
455 struct strbuf normalized_pattern = STRBUF_INIT;
457 if (*pattern == '/')
458 BUG("pattern must not start with '/'");
460 if (prefix) {
461 strbuf_addstr(&normalized_pattern, prefix);
463 else if (!starts_with(pattern, "refs/"))
464 strbuf_addstr(&normalized_pattern, "refs/");
465 strbuf_addstr(&normalized_pattern, pattern);
466 strbuf_strip_suffix(&normalized_pattern, "/");
468 item->string = strbuf_detach(&normalized_pattern, NULL);
469 item->util = has_glob_specials(pattern) ? NULL : item->string;
470 strbuf_release(&normalized_pattern);
473 int for_each_glob_ref_in(each_ref_fn fn, const char *pattern,
474 const char *prefix, void *cb_data)
476 struct strbuf real_pattern = STRBUF_INIT;
477 struct ref_filter filter;
478 int ret;
480 if (!prefix && !starts_with(pattern, "refs/"))
481 strbuf_addstr(&real_pattern, "refs/");
482 else if (prefix)
483 strbuf_addstr(&real_pattern, prefix);
484 strbuf_addstr(&real_pattern, pattern);
486 if (!has_glob_specials(pattern)) {
487 /* Append implied '/' '*' if not present. */
488 strbuf_complete(&real_pattern, '/');
489 /* No need to check for '*', there is none. */
490 strbuf_addch(&real_pattern, '*');
493 filter.pattern = real_pattern.buf;
494 filter.prefix = prefix;
495 filter.fn = fn;
496 filter.cb_data = cb_data;
497 ret = for_each_ref(filter_refs, &filter);
499 strbuf_release(&real_pattern);
500 return ret;
503 int for_each_glob_ref(each_ref_fn fn, const char *pattern, void *cb_data)
505 return for_each_glob_ref_in(fn, pattern, NULL, cb_data);
508 const char *prettify_refname(const char *name)
510 if (skip_prefix(name, "refs/heads/", &name) ||
511 skip_prefix(name, "refs/tags/", &name) ||
512 skip_prefix(name, "refs/remotes/", &name))
513 ; /* nothing */
514 return name;
517 static const char *ref_rev_parse_rules[] = {
518 "%.*s",
519 "refs/%.*s",
520 "refs/tags/%.*s",
521 "refs/heads/%.*s",
522 "refs/remotes/%.*s",
523 "refs/remotes/%.*s/HEAD",
524 NULL
527 #define NUM_REV_PARSE_RULES (ARRAY_SIZE(ref_rev_parse_rules) - 1)
530 * Is it possible that the caller meant full_name with abbrev_name?
531 * If so return a non-zero value to signal "yes"; the magnitude of
532 * the returned value gives the precedence used for disambiguation.
534 * If abbrev_name cannot mean full_name, return 0.
536 int refname_match(const char *abbrev_name, const char *full_name)
538 const char **p;
539 const int abbrev_name_len = strlen(abbrev_name);
540 const int num_rules = NUM_REV_PARSE_RULES;
542 for (p = ref_rev_parse_rules; *p; p++)
543 if (!strcmp(full_name, mkpath(*p, abbrev_name_len, abbrev_name)))
544 return &ref_rev_parse_rules[num_rules] - p;
546 return 0;
550 * Given a 'prefix' expand it by the rules in 'ref_rev_parse_rules' and add
551 * the results to 'prefixes'
553 void expand_ref_prefix(struct strvec *prefixes, const char *prefix)
555 const char **p;
556 int len = strlen(prefix);
558 for (p = ref_rev_parse_rules; *p; p++)
559 strvec_pushf(prefixes, *p, len, prefix);
562 static const char default_branch_name_advice[] = N_(
563 "Using '%s' as the name for the initial branch. This default branch name\n"
564 "is subject to change. To configure the initial branch name to use in all\n"
565 "of your new repositories, which will suppress this warning, call:\n"
566 "\n"
567 "\tgit config --global init.defaultBranch <name>\n"
568 "\n"
569 "Names commonly chosen instead of 'master' are 'main', 'trunk' and\n"
570 "'development'. The just-created branch can be renamed via this command:\n"
571 "\n"
572 "\tgit branch -m <name>\n"
575 char *repo_default_branch_name(struct repository *r, int quiet)
577 const char *config_key = "init.defaultbranch";
578 const char *config_display_key = "init.defaultBranch";
579 char *ret = NULL, *full_ref;
580 const char *env = getenv("GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME");
582 if (env && *env)
583 ret = xstrdup(env);
584 else if (repo_config_get_string(r, config_key, &ret) < 0)
585 die(_("could not retrieve `%s`"), config_display_key);
587 if (!ret) {
588 ret = xstrdup("master");
589 if (!quiet)
590 advise(_(default_branch_name_advice), ret);
593 full_ref = xstrfmt("refs/heads/%s", ret);
594 if (check_refname_format(full_ref, 0))
595 die(_("invalid branch name: %s = %s"), config_display_key, ret);
596 free(full_ref);
598 return ret;
601 const char *git_default_branch_name(int quiet)
603 static char *ret;
605 if (!ret)
606 ret = repo_default_branch_name(the_repository, quiet);
608 return ret;
612 * *string and *len will only be substituted, and *string returned (for
613 * later free()ing) if the string passed in is a magic short-hand form
614 * to name a branch.
616 static char *substitute_branch_name(struct repository *r,
617 const char **string, int *len,
618 int nonfatal_dangling_mark)
620 struct strbuf buf = STRBUF_INIT;
621 struct interpret_branch_name_options options = {
622 .nonfatal_dangling_mark = nonfatal_dangling_mark
624 int ret = repo_interpret_branch_name(r, *string, *len, &buf, &options);
626 if (ret == *len) {
627 size_t size;
628 *string = strbuf_detach(&buf, &size);
629 *len = size;
630 return (char *)*string;
633 return NULL;
636 int repo_dwim_ref(struct repository *r, const char *str, int len,
637 struct object_id *oid, char **ref, int nonfatal_dangling_mark)
639 char *last_branch = substitute_branch_name(r, &str, &len,
640 nonfatal_dangling_mark);
641 int refs_found = expand_ref(r, str, len, oid, ref);
642 free(last_branch);
643 return refs_found;
646 int expand_ref(struct repository *repo, const char *str, int len,
647 struct object_id *oid, char **ref)
649 const char **p, *r;
650 int refs_found = 0;
651 struct strbuf fullref = STRBUF_INIT;
653 *ref = NULL;
654 for (p = ref_rev_parse_rules; *p; p++) {
655 struct object_id oid_from_ref;
656 struct object_id *this_result;
657 int flag;
658 struct ref_store *refs = get_main_ref_store(repo);
659 int ignore_errno;
661 this_result = refs_found ? &oid_from_ref : oid;
662 strbuf_reset(&fullref);
663 strbuf_addf(&fullref, *p, len, str);
664 r = refs_resolve_ref_unsafe(refs, fullref.buf,
665 RESOLVE_REF_READING,
666 this_result, &flag,
667 &ignore_errno);
668 if (r) {
669 if (!refs_found++)
670 *ref = xstrdup(r);
671 if (!warn_ambiguous_refs)
672 break;
673 } else if ((flag & REF_ISSYMREF) && strcmp(fullref.buf, "HEAD")) {
674 warning(_("ignoring dangling symref %s"), fullref.buf);
675 } else if ((flag & REF_ISBROKEN) && strchr(fullref.buf, '/')) {
676 warning(_("ignoring broken ref %s"), fullref.buf);
679 strbuf_release(&fullref);
680 return refs_found;
683 int repo_dwim_log(struct repository *r, const char *str, int len,
684 struct object_id *oid, char **log)
686 struct ref_store *refs = get_main_ref_store(r);
687 char *last_branch = substitute_branch_name(r, &str, &len, 0);
688 const char **p;
689 int logs_found = 0;
690 struct strbuf path = STRBUF_INIT;
692 *log = NULL;
693 for (p = ref_rev_parse_rules; *p; p++) {
694 struct object_id hash;
695 const char *ref, *it;
696 int ignore_errno;
698 strbuf_reset(&path);
699 strbuf_addf(&path, *p, len, str);
700 ref = refs_resolve_ref_unsafe(refs, path.buf,
701 RESOLVE_REF_READING,
702 oid ? &hash : NULL, NULL,
703 &ignore_errno);
704 if (!ref)
705 continue;
706 if (refs_reflog_exists(refs, path.buf))
707 it = path.buf;
708 else if (strcmp(ref, path.buf) &&
709 refs_reflog_exists(refs, ref))
710 it = ref;
711 else
712 continue;
713 if (!logs_found++) {
714 *log = xstrdup(it);
715 if (oid)
716 oidcpy(oid, &hash);
718 if (!warn_ambiguous_refs)
719 break;
721 strbuf_release(&path);
722 free(last_branch);
723 return logs_found;
726 int dwim_log(const char *str, int len, struct object_id *oid, char **log)
728 return repo_dwim_log(the_repository, str, len, oid, log);
731 static int is_per_worktree_ref(const char *refname)
733 return starts_with(refname, "refs/worktree/") ||
734 starts_with(refname, "refs/bisect/") ||
735 starts_with(refname, "refs/rewritten/");
738 static int is_pseudoref_syntax(const char *refname)
740 const char *c;
742 for (c = refname; *c; c++) {
743 if (!isupper(*c) && *c != '-' && *c != '_')
744 return 0;
747 return 1;
750 static int is_main_pseudoref_syntax(const char *refname)
752 return skip_prefix(refname, "main-worktree/", &refname) &&
753 *refname &&
754 is_pseudoref_syntax(refname);
757 static int is_other_pseudoref_syntax(const char *refname)
759 if (!skip_prefix(refname, "worktrees/", &refname))
760 return 0;
761 refname = strchr(refname, '/');
762 if (!refname || !refname[1])
763 return 0;
764 return is_pseudoref_syntax(refname + 1);
767 enum ref_type ref_type(const char *refname)
769 if (is_per_worktree_ref(refname))
770 return REF_TYPE_PER_WORKTREE;
771 if (is_pseudoref_syntax(refname))
772 return REF_TYPE_PSEUDOREF;
773 if (is_main_pseudoref_syntax(refname))
774 return REF_TYPE_MAIN_PSEUDOREF;
775 if (is_other_pseudoref_syntax(refname))
776 return REF_TYPE_OTHER_PSEUDOREF;
777 return REF_TYPE_NORMAL;
780 long get_files_ref_lock_timeout_ms(void)
782 static int configured = 0;
784 /* The default timeout is 100 ms: */
785 static int timeout_ms = 100;
787 if (!configured) {
788 git_config_get_int("core.filesreflocktimeout", &timeout_ms);
789 configured = 1;
792 return timeout_ms;
795 int refs_delete_ref(struct ref_store *refs, const char *msg,
796 const char *refname,
797 const struct object_id *old_oid,
798 unsigned int flags)
800 struct ref_transaction *transaction;
801 struct strbuf err = STRBUF_INIT;
803 transaction = ref_store_transaction_begin(refs, &err);
804 if (!transaction ||
805 ref_transaction_delete(transaction, refname, old_oid,
806 flags, msg, &err) ||
807 ref_transaction_commit(transaction, &err)) {
808 error("%s", err.buf);
809 ref_transaction_free(transaction);
810 strbuf_release(&err);
811 return 1;
813 ref_transaction_free(transaction);
814 strbuf_release(&err);
815 return 0;
818 int delete_ref(const char *msg, const char *refname,
819 const struct object_id *old_oid, unsigned int flags)
821 return refs_delete_ref(get_main_ref_store(the_repository), msg, refname,
822 old_oid, flags);
825 static void copy_reflog_msg(struct strbuf *sb, const char *msg)
827 char c;
828 int wasspace = 1;
830 while ((c = *msg++)) {
831 if (wasspace && isspace(c))
832 continue;
833 wasspace = isspace(c);
834 if (wasspace)
835 c = ' ';
836 strbuf_addch(sb, c);
838 strbuf_rtrim(sb);
841 static char *normalize_reflog_message(const char *msg)
843 struct strbuf sb = STRBUF_INIT;
845 if (msg && *msg)
846 copy_reflog_msg(&sb, msg);
847 return strbuf_detach(&sb, NULL);
850 int should_autocreate_reflog(const char *refname)
852 switch (log_all_ref_updates) {
853 case LOG_REFS_ALWAYS:
854 return 1;
855 case LOG_REFS_NORMAL:
856 return starts_with(refname, "refs/heads/") ||
857 starts_with(refname, "refs/remotes/") ||
858 starts_with(refname, "refs/notes/") ||
859 !strcmp(refname, "HEAD");
860 default:
861 return 0;
865 int is_branch(const char *refname)
867 return !strcmp(refname, "HEAD") || starts_with(refname, "refs/heads/");
870 struct read_ref_at_cb {
871 const char *refname;
872 timestamp_t at_time;
873 int cnt;
874 int reccnt;
875 struct object_id *oid;
876 int found_it;
878 struct object_id ooid;
879 struct object_id noid;
880 int tz;
881 timestamp_t date;
882 char **msg;
883 timestamp_t *cutoff_time;
884 int *cutoff_tz;
885 int *cutoff_cnt;
888 static void set_read_ref_cutoffs(struct read_ref_at_cb *cb,
889 timestamp_t timestamp, int tz, const char *message)
891 if (cb->msg)
892 *cb->msg = xstrdup(message);
893 if (cb->cutoff_time)
894 *cb->cutoff_time = timestamp;
895 if (cb->cutoff_tz)
896 *cb->cutoff_tz = tz;
897 if (cb->cutoff_cnt)
898 *cb->cutoff_cnt = cb->reccnt;
901 static int read_ref_at_ent(struct object_id *ooid, struct object_id *noid,
902 const char *email, timestamp_t timestamp, int tz,
903 const char *message, void *cb_data)
905 struct read_ref_at_cb *cb = cb_data;
906 int reached_count;
908 cb->tz = tz;
909 cb->date = timestamp;
912 * It is not possible for cb->cnt == 0 on the first iteration because
913 * that special case is handled in read_ref_at().
915 if (cb->cnt > 0)
916 cb->cnt--;
917 reached_count = cb->cnt == 0 && !is_null_oid(ooid);
918 if (timestamp <= cb->at_time || reached_count) {
919 set_read_ref_cutoffs(cb, timestamp, tz, message);
921 * we have not yet updated cb->[n|o]oid so they still
922 * hold the values for the previous record.
924 if (!is_null_oid(&cb->ooid) && !oideq(&cb->ooid, noid))
925 warning(_("log for ref %s has gap after %s"),
926 cb->refname, show_date(cb->date, cb->tz, DATE_MODE(RFC2822)));
927 if (reached_count)
928 oidcpy(cb->oid, ooid);
929 else if (!is_null_oid(&cb->ooid) || cb->date == cb->at_time)
930 oidcpy(cb->oid, noid);
931 else if (!oideq(noid, cb->oid))
932 warning(_("log for ref %s unexpectedly ended on %s"),
933 cb->refname, show_date(cb->date, cb->tz,
934 DATE_MODE(RFC2822)));
935 cb->found_it = 1;
937 cb->reccnt++;
938 oidcpy(&cb->ooid, ooid);
939 oidcpy(&cb->noid, noid);
940 return cb->found_it;
943 static int read_ref_at_ent_newest(struct object_id *ooid, struct object_id *noid,
944 const char *email, timestamp_t timestamp,
945 int tz, const char *message, void *cb_data)
947 struct read_ref_at_cb *cb = cb_data;
949 set_read_ref_cutoffs(cb, timestamp, tz, message);
950 oidcpy(cb->oid, noid);
951 /* We just want the first entry */
952 return 1;
955 static int read_ref_at_ent_oldest(struct object_id *ooid, struct object_id *noid,
956 const char *email, timestamp_t timestamp,
957 int tz, const char *message, void *cb_data)
959 struct read_ref_at_cb *cb = cb_data;
961 set_read_ref_cutoffs(cb, timestamp, tz, message);
962 oidcpy(cb->oid, ooid);
963 if (is_null_oid(cb->oid))
964 oidcpy(cb->oid, noid);
965 /* We just want the first entry */
966 return 1;
969 int read_ref_at(struct ref_store *refs, const char *refname,
970 unsigned int flags, timestamp_t at_time, int cnt,
971 struct object_id *oid, char **msg,
972 timestamp_t *cutoff_time, int *cutoff_tz, int *cutoff_cnt)
974 struct read_ref_at_cb cb;
976 memset(&cb, 0, sizeof(cb));
977 cb.refname = refname;
978 cb.at_time = at_time;
979 cb.cnt = cnt;
980 cb.msg = msg;
981 cb.cutoff_time = cutoff_time;
982 cb.cutoff_tz = cutoff_tz;
983 cb.cutoff_cnt = cutoff_cnt;
984 cb.oid = oid;
986 if (cb.cnt == 0) {
987 refs_for_each_reflog_ent_reverse(refs, refname, read_ref_at_ent_newest, &cb);
988 return 0;
991 refs_for_each_reflog_ent_reverse(refs, refname, read_ref_at_ent, &cb);
993 if (!cb.reccnt) {
994 if (flags & GET_OID_QUIETLY)
995 exit(128);
996 else
997 die(_("log for %s is empty"), refname);
999 if (cb.found_it)
1000 return 0;
1002 refs_for_each_reflog_ent(refs, refname, read_ref_at_ent_oldest, &cb);
1004 return 1;
1007 struct ref_transaction *ref_store_transaction_begin(struct ref_store *refs,
1008 struct strbuf *err)
1010 struct ref_transaction *tr;
1011 assert(err);
1013 CALLOC_ARRAY(tr, 1);
1014 tr->ref_store = refs;
1015 return tr;
1018 struct ref_transaction *ref_transaction_begin(struct strbuf *err)
1020 return ref_store_transaction_begin(get_main_ref_store(the_repository), err);
1023 void ref_transaction_free(struct ref_transaction *transaction)
1025 size_t i;
1027 if (!transaction)
1028 return;
1030 switch (transaction->state) {
1031 case REF_TRANSACTION_OPEN:
1032 case REF_TRANSACTION_CLOSED:
1033 /* OK */
1034 break;
1035 case REF_TRANSACTION_PREPARED:
1036 BUG("free called on a prepared reference transaction");
1037 break;
1038 default:
1039 BUG("unexpected reference transaction state");
1040 break;
1043 for (i = 0; i < transaction->nr; i++) {
1044 free(transaction->updates[i]->msg);
1045 free(transaction->updates[i]);
1047 free(transaction->updates);
1048 free(transaction);
1051 struct ref_update *ref_transaction_add_update(
1052 struct ref_transaction *transaction,
1053 const char *refname, unsigned int flags,
1054 const struct object_id *new_oid,
1055 const struct object_id *old_oid,
1056 const char *msg)
1058 struct ref_update *update;
1060 if (transaction->state != REF_TRANSACTION_OPEN)
1061 BUG("update called for transaction that is not open");
1063 FLEX_ALLOC_STR(update, refname, refname);
1064 ALLOC_GROW(transaction->updates, transaction->nr + 1, transaction->alloc);
1065 transaction->updates[transaction->nr++] = update;
1067 update->flags = flags;
1069 if (flags & REF_HAVE_NEW)
1070 oidcpy(&update->new_oid, new_oid);
1071 if (flags & REF_HAVE_OLD)
1072 oidcpy(&update->old_oid, old_oid);
1073 update->msg = normalize_reflog_message(msg);
1074 return update;
1077 int ref_transaction_update(struct ref_transaction *transaction,
1078 const char *refname,
1079 const struct object_id *new_oid,
1080 const struct object_id *old_oid,
1081 unsigned int flags, const char *msg,
1082 struct strbuf *err)
1084 assert(err);
1086 if ((new_oid && !is_null_oid(new_oid)) ?
1087 check_refname_format(refname, REFNAME_ALLOW_ONELEVEL) :
1088 !refname_is_safe(refname)) {
1089 strbuf_addf(err, _("refusing to update ref with bad name '%s'"),
1090 refname);
1091 return -1;
1094 if (flags & ~REF_TRANSACTION_UPDATE_ALLOWED_FLAGS)
1095 BUG("illegal flags 0x%x passed to ref_transaction_update()", flags);
1098 * Clear flags outside the allowed set; this should be a noop because
1099 * of the BUG() check above, but it works around a -Wnonnull warning
1100 * with some versions of "gcc -O3".
1102 flags &= REF_TRANSACTION_UPDATE_ALLOWED_FLAGS;
1104 flags |= (new_oid ? REF_HAVE_NEW : 0) | (old_oid ? REF_HAVE_OLD : 0);
1106 ref_transaction_add_update(transaction, refname, flags,
1107 new_oid, old_oid, msg);
1108 return 0;
1111 int ref_transaction_create(struct ref_transaction *transaction,
1112 const char *refname,
1113 const struct object_id *new_oid,
1114 unsigned int flags, const char *msg,
1115 struct strbuf *err)
1117 if (!new_oid || is_null_oid(new_oid))
1118 BUG("create called without valid new_oid");
1119 return ref_transaction_update(transaction, refname, new_oid,
1120 null_oid(), flags, msg, err);
1123 int ref_transaction_delete(struct ref_transaction *transaction,
1124 const char *refname,
1125 const struct object_id *old_oid,
1126 unsigned int flags, const char *msg,
1127 struct strbuf *err)
1129 if (old_oid && is_null_oid(old_oid))
1130 BUG("delete called with old_oid set to zeros");
1131 return ref_transaction_update(transaction, refname,
1132 null_oid(), old_oid,
1133 flags, msg, err);
1136 int ref_transaction_verify(struct ref_transaction *transaction,
1137 const char *refname,
1138 const struct object_id *old_oid,
1139 unsigned int flags,
1140 struct strbuf *err)
1142 if (!old_oid)
1143 BUG("verify called with old_oid set to NULL");
1144 return ref_transaction_update(transaction, refname,
1145 NULL, old_oid,
1146 flags, NULL, err);
1149 int refs_update_ref(struct ref_store *refs, const char *msg,
1150 const char *refname, const struct object_id *new_oid,
1151 const struct object_id *old_oid, unsigned int flags,
1152 enum action_on_err onerr)
1154 struct ref_transaction *t = NULL;
1155 struct strbuf err = STRBUF_INIT;
1156 int ret = 0;
1158 t = ref_store_transaction_begin(refs, &err);
1159 if (!t ||
1160 ref_transaction_update(t, refname, new_oid, old_oid, flags, msg,
1161 &err) ||
1162 ref_transaction_commit(t, &err)) {
1163 ret = 1;
1164 ref_transaction_free(t);
1166 if (ret) {
1167 const char *str = _("update_ref failed for ref '%s': %s");
1169 switch (onerr) {
1170 case UPDATE_REFS_MSG_ON_ERR:
1171 error(str, refname, err.buf);
1172 break;
1173 case UPDATE_REFS_DIE_ON_ERR:
1174 die(str, refname, err.buf);
1175 break;
1176 case UPDATE_REFS_QUIET_ON_ERR:
1177 break;
1179 strbuf_release(&err);
1180 return 1;
1182 strbuf_release(&err);
1183 if (t)
1184 ref_transaction_free(t);
1185 return 0;
1188 int update_ref(const char *msg, const char *refname,
1189 const struct object_id *new_oid,
1190 const struct object_id *old_oid,
1191 unsigned int flags, enum action_on_err onerr)
1193 return refs_update_ref(get_main_ref_store(the_repository), msg, refname, new_oid,
1194 old_oid, flags, onerr);
1197 char *refs_shorten_unambiguous_ref(struct ref_store *refs,
1198 const char *refname, int strict)
1200 int i;
1201 static char **scanf_fmts;
1202 static int nr_rules;
1203 char *short_name;
1204 struct strbuf resolved_buf = STRBUF_INIT;
1206 if (!nr_rules) {
1208 * Pre-generate scanf formats from ref_rev_parse_rules[].
1209 * Generate a format suitable for scanf from a
1210 * ref_rev_parse_rules rule by interpolating "%s" at the
1211 * location of the "%.*s".
1213 size_t total_len = 0;
1214 size_t offset = 0;
1216 /* the rule list is NULL terminated, count them first */
1217 for (nr_rules = 0; ref_rev_parse_rules[nr_rules]; nr_rules++)
1218 /* -2 for strlen("%.*s") - strlen("%s"); +1 for NUL */
1219 total_len += strlen(ref_rev_parse_rules[nr_rules]) - 2 + 1;
1221 scanf_fmts = xmalloc(st_add(st_mult(sizeof(char *), nr_rules), total_len));
1223 offset = 0;
1224 for (i = 0; i < nr_rules; i++) {
1225 assert(offset < total_len);
1226 scanf_fmts[i] = (char *)&scanf_fmts[nr_rules] + offset;
1227 offset += xsnprintf(scanf_fmts[i], total_len - offset,
1228 ref_rev_parse_rules[i], 2, "%s") + 1;
1232 /* bail out if there are no rules */
1233 if (!nr_rules)
1234 return xstrdup(refname);
1236 /* buffer for scanf result, at most refname must fit */
1237 short_name = xstrdup(refname);
1239 /* skip first rule, it will always match */
1240 for (i = nr_rules - 1; i > 0 ; --i) {
1241 int j;
1242 int rules_to_fail = i;
1243 int short_name_len;
1245 if (1 != sscanf(refname, scanf_fmts[i], short_name))
1246 continue;
1248 short_name_len = strlen(short_name);
1251 * in strict mode, all (except the matched one) rules
1252 * must fail to resolve to a valid non-ambiguous ref
1254 if (strict)
1255 rules_to_fail = nr_rules;
1258 * check if the short name resolves to a valid ref,
1259 * but use only rules prior to the matched one
1261 for (j = 0; j < rules_to_fail; j++) {
1262 const char *rule = ref_rev_parse_rules[j];
1264 /* skip matched rule */
1265 if (i == j)
1266 continue;
1269 * the short name is ambiguous, if it resolves
1270 * (with this previous rule) to a valid ref
1271 * read_ref() returns 0 on success
1273 strbuf_reset(&resolved_buf);
1274 strbuf_addf(&resolved_buf, rule,
1275 short_name_len, short_name);
1276 if (refs_ref_exists(refs, resolved_buf.buf))
1277 break;
1281 * short name is non-ambiguous if all previous rules
1282 * haven't resolved to a valid ref
1284 if (j == rules_to_fail) {
1285 strbuf_release(&resolved_buf);
1286 return short_name;
1290 strbuf_release(&resolved_buf);
1291 free(short_name);
1292 return xstrdup(refname);
1295 char *shorten_unambiguous_ref(const char *refname, int strict)
1297 return refs_shorten_unambiguous_ref(get_main_ref_store(the_repository),
1298 refname, strict);
1301 static struct string_list *hide_refs;
1303 int parse_hide_refs_config(const char *var, const char *value, const char *section)
1305 const char *key;
1306 if (!strcmp("transfer.hiderefs", var) ||
1307 (!parse_config_key(var, section, NULL, NULL, &key) &&
1308 !strcmp(key, "hiderefs"))) {
1309 char *ref;
1310 int len;
1312 if (!value)
1313 return config_error_nonbool(var);
1314 ref = xstrdup(value);
1315 len = strlen(ref);
1316 while (len && ref[len - 1] == '/')
1317 ref[--len] = '\0';
1318 if (!hide_refs) {
1319 CALLOC_ARRAY(hide_refs, 1);
1320 hide_refs->strdup_strings = 1;
1322 string_list_append(hide_refs, ref);
1324 return 0;
1327 int ref_is_hidden(const char *refname, const char *refname_full)
1329 int i;
1331 if (!hide_refs)
1332 return 0;
1333 for (i = hide_refs->nr - 1; i >= 0; i--) {
1334 const char *match = hide_refs->items[i].string;
1335 const char *subject;
1336 int neg = 0;
1337 const char *p;
1339 if (*match == '!') {
1340 neg = 1;
1341 match++;
1344 if (*match == '^') {
1345 subject = refname_full;
1346 match++;
1347 } else {
1348 subject = refname;
1351 /* refname can be NULL when namespaces are used. */
1352 if (subject &&
1353 skip_prefix(subject, match, &p) &&
1354 (!*p || *p == '/'))
1355 return !neg;
1357 return 0;
1360 const char *find_descendant_ref(const char *dirname,
1361 const struct string_list *extras,
1362 const struct string_list *skip)
1364 int pos;
1366 if (!extras)
1367 return NULL;
1370 * Look at the place where dirname would be inserted into
1371 * extras. If there is an entry at that position that starts
1372 * with dirname (remember, dirname includes the trailing
1373 * slash) and is not in skip, then we have a conflict.
1375 for (pos = string_list_find_insert_index(extras, dirname, 0);
1376 pos < extras->nr; pos++) {
1377 const char *extra_refname = extras->items[pos].string;
1379 if (!starts_with(extra_refname, dirname))
1380 break;
1382 if (!skip || !string_list_has_string(skip, extra_refname))
1383 return extra_refname;
1385 return NULL;
1388 int refs_head_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
1390 struct object_id oid;
1391 int flag;
1392 int ignore_errno;
1394 if (refs_resolve_ref_unsafe(refs, "HEAD", RESOLVE_REF_READING,
1395 &oid, &flag, &ignore_errno))
1396 return fn("HEAD", &oid, flag, cb_data);
1398 return 0;
1401 int head_ref(each_ref_fn fn, void *cb_data)
1403 return refs_head_ref(get_main_ref_store(the_repository), fn, cb_data);
1406 struct ref_iterator *refs_ref_iterator_begin(
1407 struct ref_store *refs,
1408 const char *prefix, int trim,
1409 enum do_for_each_ref_flags flags)
1411 struct ref_iterator *iter;
1413 if (!(flags & DO_FOR_EACH_INCLUDE_BROKEN)) {
1414 static int ref_paranoia = -1;
1416 if (ref_paranoia < 0)
1417 ref_paranoia = git_env_bool("GIT_REF_PARANOIA", 1);
1418 if (ref_paranoia) {
1419 flags |= DO_FOR_EACH_INCLUDE_BROKEN;
1420 flags |= DO_FOR_EACH_OMIT_DANGLING_SYMREFS;
1424 iter = refs->be->iterator_begin(refs, prefix, flags);
1427 * `iterator_begin()` already takes care of prefix, but we
1428 * might need to do some trimming:
1430 if (trim)
1431 iter = prefix_ref_iterator_begin(iter, "", trim);
1433 /* Sanity check for subclasses: */
1434 if (!iter->ordered)
1435 BUG("reference iterator is not ordered");
1437 return iter;
1441 * Call fn for each reference in the specified submodule for which the
1442 * refname begins with prefix. If trim is non-zero, then trim that
1443 * many characters off the beginning of each refname before passing
1444 * the refname to fn. flags can be DO_FOR_EACH_INCLUDE_BROKEN to
1445 * include broken references in the iteration. If fn ever returns a
1446 * non-zero value, stop the iteration and return that value;
1447 * otherwise, return 0.
1449 static int do_for_each_repo_ref(struct repository *r, const char *prefix,
1450 each_repo_ref_fn fn, int trim, int flags,
1451 void *cb_data)
1453 struct ref_iterator *iter;
1454 struct ref_store *refs = get_main_ref_store(r);
1456 if (!refs)
1457 return 0;
1459 iter = refs_ref_iterator_begin(refs, prefix, trim, flags);
1461 return do_for_each_repo_ref_iterator(r, iter, fn, cb_data);
1464 struct do_for_each_ref_help {
1465 each_ref_fn *fn;
1466 void *cb_data;
1469 static int do_for_each_ref_helper(struct repository *r,
1470 const char *refname,
1471 const struct object_id *oid,
1472 int flags,
1473 void *cb_data)
1475 struct do_for_each_ref_help *hp = cb_data;
1477 return hp->fn(refname, oid, flags, hp->cb_data);
1480 static int do_for_each_ref(struct ref_store *refs, const char *prefix,
1481 each_ref_fn fn, int trim,
1482 enum do_for_each_ref_flags flags, void *cb_data)
1484 struct ref_iterator *iter;
1485 struct do_for_each_ref_help hp = { fn, cb_data };
1487 if (!refs)
1488 return 0;
1490 iter = refs_ref_iterator_begin(refs, prefix, trim, flags);
1492 return do_for_each_repo_ref_iterator(the_repository, iter,
1493 do_for_each_ref_helper, &hp);
1496 int refs_for_each_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
1498 return do_for_each_ref(refs, "", fn, 0, 0, cb_data);
1501 int for_each_ref(each_ref_fn fn, void *cb_data)
1503 return refs_for_each_ref(get_main_ref_store(the_repository), fn, cb_data);
1506 int refs_for_each_ref_in(struct ref_store *refs, const char *prefix,
1507 each_ref_fn fn, void *cb_data)
1509 return do_for_each_ref(refs, prefix, fn, strlen(prefix), 0, cb_data);
1512 int for_each_ref_in(const char *prefix, each_ref_fn fn, void *cb_data)
1514 return refs_for_each_ref_in(get_main_ref_store(the_repository), prefix, fn, cb_data);
1517 int for_each_fullref_in(const char *prefix, each_ref_fn fn, void *cb_data)
1519 return do_for_each_ref(get_main_ref_store(the_repository),
1520 prefix, fn, 0, 0, cb_data);
1523 int refs_for_each_fullref_in(struct ref_store *refs, const char *prefix,
1524 each_ref_fn fn, void *cb_data)
1526 return do_for_each_ref(refs, prefix, fn, 0, 0, cb_data);
1529 int for_each_replace_ref(struct repository *r, each_repo_ref_fn fn, void *cb_data)
1531 return do_for_each_repo_ref(r, git_replace_ref_base, fn,
1532 strlen(git_replace_ref_base),
1533 DO_FOR_EACH_INCLUDE_BROKEN, cb_data);
1536 int for_each_namespaced_ref(each_ref_fn fn, void *cb_data)
1538 struct strbuf buf = STRBUF_INIT;
1539 int ret;
1540 strbuf_addf(&buf, "%srefs/", get_git_namespace());
1541 ret = do_for_each_ref(get_main_ref_store(the_repository),
1542 buf.buf, fn, 0, 0, cb_data);
1543 strbuf_release(&buf);
1544 return ret;
1547 int refs_for_each_rawref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
1549 return do_for_each_ref(refs, "", fn, 0,
1550 DO_FOR_EACH_INCLUDE_BROKEN, cb_data);
1553 int for_each_rawref(each_ref_fn fn, void *cb_data)
1555 return refs_for_each_rawref(get_main_ref_store(the_repository), fn, cb_data);
1558 static int qsort_strcmp(const void *va, const void *vb)
1560 const char *a = *(const char **)va;
1561 const char *b = *(const char **)vb;
1563 return strcmp(a, b);
1566 static void find_longest_prefixes_1(struct string_list *out,
1567 struct strbuf *prefix,
1568 const char **patterns, size_t nr)
1570 size_t i;
1572 for (i = 0; i < nr; i++) {
1573 char c = patterns[i][prefix->len];
1574 if (!c || is_glob_special(c)) {
1575 string_list_append(out, prefix->buf);
1576 return;
1580 i = 0;
1581 while (i < nr) {
1582 size_t end;
1585 * Set "end" to the index of the element _after_ the last one
1586 * in our group.
1588 for (end = i + 1; end < nr; end++) {
1589 if (patterns[i][prefix->len] != patterns[end][prefix->len])
1590 break;
1593 strbuf_addch(prefix, patterns[i][prefix->len]);
1594 find_longest_prefixes_1(out, prefix, patterns + i, end - i);
1595 strbuf_setlen(prefix, prefix->len - 1);
1597 i = end;
1601 static void find_longest_prefixes(struct string_list *out,
1602 const char **patterns)
1604 struct strvec sorted = STRVEC_INIT;
1605 struct strbuf prefix = STRBUF_INIT;
1607 strvec_pushv(&sorted, patterns);
1608 QSORT(sorted.v, sorted.nr, qsort_strcmp);
1610 find_longest_prefixes_1(out, &prefix, sorted.v, sorted.nr);
1612 strvec_clear(&sorted);
1613 strbuf_release(&prefix);
1616 int for_each_fullref_in_prefixes(const char *namespace,
1617 const char **patterns,
1618 each_ref_fn fn, void *cb_data)
1620 struct string_list prefixes = STRING_LIST_INIT_DUP;
1621 struct string_list_item *prefix;
1622 struct strbuf buf = STRBUF_INIT;
1623 int ret = 0, namespace_len;
1625 find_longest_prefixes(&prefixes, patterns);
1627 if (namespace)
1628 strbuf_addstr(&buf, namespace);
1629 namespace_len = buf.len;
1631 for_each_string_list_item(prefix, &prefixes) {
1632 strbuf_addstr(&buf, prefix->string);
1633 ret = for_each_fullref_in(buf.buf, fn, cb_data);
1634 if (ret)
1635 break;
1636 strbuf_setlen(&buf, namespace_len);
1639 string_list_clear(&prefixes, 0);
1640 strbuf_release(&buf);
1641 return ret;
1644 static int refs_read_special_head(struct ref_store *ref_store,
1645 const char *refname, struct object_id *oid,
1646 struct strbuf *referent, unsigned int *type,
1647 int *failure_errno)
1649 struct strbuf full_path = STRBUF_INIT;
1650 struct strbuf content = STRBUF_INIT;
1651 int result = -1;
1652 strbuf_addf(&full_path, "%s/%s", ref_store->gitdir, refname);
1654 if (strbuf_read_file(&content, full_path.buf, 0) < 0)
1655 goto done;
1657 result = parse_loose_ref_contents(content.buf, oid, referent, type,
1658 failure_errno);
1660 done:
1661 strbuf_release(&full_path);
1662 strbuf_release(&content);
1663 return result;
1666 int refs_read_raw_ref(struct ref_store *ref_store, const char *refname,
1667 struct object_id *oid, struct strbuf *referent,
1668 unsigned int *type, int *failure_errno)
1670 assert(failure_errno);
1671 if (!strcmp(refname, "FETCH_HEAD") || !strcmp(refname, "MERGE_HEAD")) {
1672 return refs_read_special_head(ref_store, refname, oid, referent,
1673 type, failure_errno);
1676 return ref_store->be->read_raw_ref(ref_store, refname, oid, referent,
1677 type, failure_errno);
1680 const char *refs_resolve_ref_unsafe(struct ref_store *refs,
1681 const char *refname,
1682 int resolve_flags,
1683 struct object_id *oid,
1684 int *flags, int *failure_errno)
1686 static struct strbuf sb_refname = STRBUF_INIT;
1687 struct object_id unused_oid;
1688 int unused_flags;
1689 int symref_count;
1691 assert(failure_errno);
1693 if (!oid)
1694 oid = &unused_oid;
1695 if (!flags)
1696 flags = &unused_flags;
1698 *flags = 0;
1700 if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
1701 if (!(resolve_flags & RESOLVE_REF_ALLOW_BAD_NAME) ||
1702 !refname_is_safe(refname)) {
1703 *failure_errno = EINVAL;
1704 return NULL;
1708 * dwim_ref() uses REF_ISBROKEN to distinguish between
1709 * missing refs and refs that were present but invalid,
1710 * to complain about the latter to stderr.
1712 * We don't know whether the ref exists, so don't set
1713 * REF_ISBROKEN yet.
1715 *flags |= REF_BAD_NAME;
1718 for (symref_count = 0; symref_count < SYMREF_MAXDEPTH; symref_count++) {
1719 unsigned int read_flags = 0;
1721 if (refs_read_raw_ref(refs, refname, oid, &sb_refname,
1722 &read_flags, failure_errno)) {
1723 *flags |= read_flags;
1724 if (errno)
1725 *failure_errno = errno;
1727 /* In reading mode, refs must eventually resolve */
1728 if (resolve_flags & RESOLVE_REF_READING)
1729 return NULL;
1732 * Otherwise a missing ref is OK. But the files backend
1733 * may show errors besides ENOENT if there are
1734 * similarly-named refs.
1736 if (*failure_errno != ENOENT &&
1737 *failure_errno != EISDIR &&
1738 *failure_errno != ENOTDIR)
1739 return NULL;
1741 oidclr(oid);
1742 if (*flags & REF_BAD_NAME)
1743 *flags |= REF_ISBROKEN;
1744 return refname;
1747 *flags |= read_flags;
1749 if (!(read_flags & REF_ISSYMREF)) {
1750 if (*flags & REF_BAD_NAME) {
1751 oidclr(oid);
1752 *flags |= REF_ISBROKEN;
1754 return refname;
1757 refname = sb_refname.buf;
1758 if (resolve_flags & RESOLVE_REF_NO_RECURSE) {
1759 oidclr(oid);
1760 return refname;
1762 if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
1763 if (!(resolve_flags & RESOLVE_REF_ALLOW_BAD_NAME) ||
1764 !refname_is_safe(refname)) {
1765 *failure_errno = EINVAL;
1766 return NULL;
1769 *flags |= REF_ISBROKEN | REF_BAD_NAME;
1773 *failure_errno = ELOOP;
1774 return NULL;
1777 /* backend functions */
1778 int refs_init_db(struct strbuf *err)
1780 struct ref_store *refs = get_main_ref_store(the_repository);
1782 return refs->be->init_db(refs, err);
1785 const char *resolve_ref_unsafe(const char *refname, int resolve_flags,
1786 struct object_id *oid, int *flags)
1788 int ignore_errno;
1790 return refs_resolve_ref_unsafe(get_main_ref_store(the_repository), refname,
1791 resolve_flags, oid, flags, &ignore_errno);
1794 int resolve_gitlink_ref(const char *submodule, const char *refname,
1795 struct object_id *oid)
1797 struct ref_store *refs;
1798 int flags;
1799 int ignore_errno;
1801 refs = get_submodule_ref_store(submodule);
1803 if (!refs)
1804 return -1;
1806 if (!refs_resolve_ref_unsafe(refs, refname, 0, oid, &flags,
1807 &ignore_errno) || is_null_oid(oid))
1808 return -1;
1809 return 0;
1812 struct ref_store_hash_entry
1814 struct hashmap_entry ent;
1816 struct ref_store *refs;
1818 /* NUL-terminated identifier of the ref store: */
1819 char name[FLEX_ARRAY];
1822 static int ref_store_hash_cmp(const void *unused_cmp_data,
1823 const struct hashmap_entry *eptr,
1824 const struct hashmap_entry *entry_or_key,
1825 const void *keydata)
1827 const struct ref_store_hash_entry *e1, *e2;
1828 const char *name;
1830 e1 = container_of(eptr, const struct ref_store_hash_entry, ent);
1831 e2 = container_of(entry_or_key, const struct ref_store_hash_entry, ent);
1832 name = keydata ? keydata : e2->name;
1834 return strcmp(e1->name, name);
1837 static struct ref_store_hash_entry *alloc_ref_store_hash_entry(
1838 const char *name, struct ref_store *refs)
1840 struct ref_store_hash_entry *entry;
1842 FLEX_ALLOC_STR(entry, name, name);
1843 hashmap_entry_init(&entry->ent, strhash(name));
1844 entry->refs = refs;
1845 return entry;
1848 /* A hashmap of ref_stores, stored by submodule name: */
1849 static struct hashmap submodule_ref_stores;
1851 /* A hashmap of ref_stores, stored by worktree id: */
1852 static struct hashmap worktree_ref_stores;
1855 * Look up a ref store by name. If that ref_store hasn't been
1856 * registered yet, return NULL.
1858 static struct ref_store *lookup_ref_store_map(struct hashmap *map,
1859 const char *name)
1861 struct ref_store_hash_entry *entry;
1862 unsigned int hash;
1864 if (!map->tablesize)
1865 /* It's initialized on demand in register_ref_store(). */
1866 return NULL;
1868 hash = strhash(name);
1869 entry = hashmap_get_entry_from_hash(map, hash, name,
1870 struct ref_store_hash_entry, ent);
1871 return entry ? entry->refs : NULL;
1875 * Create, record, and return a ref_store instance for the specified
1876 * gitdir.
1878 static struct ref_store *ref_store_init(struct repository *repo,
1879 const char *gitdir,
1880 unsigned int flags)
1882 const char *be_name = "files";
1883 struct ref_storage_be *be = find_ref_storage_backend(be_name);
1884 struct ref_store *refs;
1886 if (!be)
1887 BUG("reference backend %s is unknown", be_name);
1889 refs = be->init(repo, gitdir, flags);
1890 return refs;
1893 struct ref_store *get_main_ref_store(struct repository *r)
1895 if (r->refs_private)
1896 return r->refs_private;
1898 if (!r->gitdir)
1899 BUG("attempting to get main_ref_store outside of repository");
1901 r->refs_private = ref_store_init(r, r->gitdir, REF_STORE_ALL_CAPS);
1902 r->refs_private = maybe_debug_wrap_ref_store(r->gitdir, r->refs_private);
1903 return r->refs_private;
1907 * Associate a ref store with a name. It is a fatal error to call this
1908 * function twice for the same name.
1910 static void register_ref_store_map(struct hashmap *map,
1911 const char *type,
1912 struct ref_store *refs,
1913 const char *name)
1915 struct ref_store_hash_entry *entry;
1917 if (!map->tablesize)
1918 hashmap_init(map, ref_store_hash_cmp, NULL, 0);
1920 entry = alloc_ref_store_hash_entry(name, refs);
1921 if (hashmap_put(map, &entry->ent))
1922 BUG("%s ref_store '%s' initialized twice", type, name);
1925 struct ref_store *get_submodule_ref_store(const char *submodule)
1927 struct strbuf submodule_sb = STRBUF_INIT;
1928 struct ref_store *refs;
1929 char *to_free = NULL;
1930 size_t len;
1931 struct repository *subrepo;
1933 if (!submodule)
1934 return NULL;
1936 len = strlen(submodule);
1937 while (len && is_dir_sep(submodule[len - 1]))
1938 len--;
1939 if (!len)
1940 return NULL;
1942 if (submodule[len])
1943 /* We need to strip off one or more trailing slashes */
1944 submodule = to_free = xmemdupz(submodule, len);
1946 refs = lookup_ref_store_map(&submodule_ref_stores, submodule);
1947 if (refs)
1948 goto done;
1950 strbuf_addstr(&submodule_sb, submodule);
1951 if (!is_nonbare_repository_dir(&submodule_sb))
1952 goto done;
1954 if (submodule_to_gitdir(&submodule_sb, submodule))
1955 goto done;
1957 subrepo = xmalloc(sizeof(*subrepo));
1959 * NEEDSWORK: Make get_submodule_ref_store() work with arbitrary
1960 * superprojects other than the_repository. This probably should be
1961 * done by making it take a struct repository * parameter instead of a
1962 * submodule path.
1964 if (repo_submodule_init(subrepo, the_repository, submodule,
1965 null_oid())) {
1966 free(subrepo);
1967 goto done;
1969 refs = ref_store_init(subrepo, submodule_sb.buf,
1970 REF_STORE_READ | REF_STORE_ODB);
1971 register_ref_store_map(&submodule_ref_stores, "submodule",
1972 refs, submodule);
1974 done:
1975 strbuf_release(&submodule_sb);
1976 free(to_free);
1978 return refs;
1981 struct ref_store *get_worktree_ref_store(const struct worktree *wt)
1983 struct ref_store *refs;
1984 const char *id;
1986 if (wt->is_current)
1987 return get_main_ref_store(the_repository);
1989 id = wt->id ? wt->id : "/";
1990 refs = lookup_ref_store_map(&worktree_ref_stores, id);
1991 if (refs)
1992 return refs;
1994 if (wt->id)
1995 refs = ref_store_init(the_repository,
1996 git_common_path("worktrees/%s", wt->id),
1997 REF_STORE_ALL_CAPS);
1998 else
1999 refs = ref_store_init(the_repository,
2000 get_git_common_dir(),
2001 REF_STORE_ALL_CAPS);
2003 if (refs)
2004 register_ref_store_map(&worktree_ref_stores, "worktree",
2005 refs, id);
2006 return refs;
2009 void base_ref_store_init(struct ref_store *refs,
2010 const struct ref_storage_be *be)
2012 refs->be = be;
2015 /* backend functions */
2016 int refs_pack_refs(struct ref_store *refs, unsigned int flags)
2018 return refs->be->pack_refs(refs, flags);
2021 int peel_iterated_oid(const struct object_id *base, struct object_id *peeled)
2023 if (current_ref_iter &&
2024 (current_ref_iter->oid == base ||
2025 oideq(current_ref_iter->oid, base)))
2026 return ref_iterator_peel(current_ref_iter, peeled);
2028 return peel_object(base, peeled) ? -1 : 0;
2031 int refs_create_symref(struct ref_store *refs,
2032 const char *ref_target,
2033 const char *refs_heads_master,
2034 const char *logmsg)
2036 char *msg;
2037 int retval;
2039 msg = normalize_reflog_message(logmsg);
2040 retval = refs->be->create_symref(refs, ref_target, refs_heads_master,
2041 msg);
2042 free(msg);
2043 return retval;
2046 int create_symref(const char *ref_target, const char *refs_heads_master,
2047 const char *logmsg)
2049 return refs_create_symref(get_main_ref_store(the_repository), ref_target,
2050 refs_heads_master, logmsg);
2053 int ref_update_reject_duplicates(struct string_list *refnames,
2054 struct strbuf *err)
2056 size_t i, n = refnames->nr;
2058 assert(err);
2060 for (i = 1; i < n; i++) {
2061 int cmp = strcmp(refnames->items[i - 1].string,
2062 refnames->items[i].string);
2064 if (!cmp) {
2065 strbuf_addf(err,
2066 _("multiple updates for ref '%s' not allowed"),
2067 refnames->items[i].string);
2068 return 1;
2069 } else if (cmp > 0) {
2070 BUG("ref_update_reject_duplicates() received unsorted list");
2073 return 0;
2076 static int run_transaction_hook(struct ref_transaction *transaction,
2077 const char *state)
2079 struct child_process proc = CHILD_PROCESS_INIT;
2080 struct strbuf buf = STRBUF_INIT;
2081 const char *hook;
2082 int ret = 0, i;
2084 hook = find_hook("reference-transaction");
2085 if (!hook)
2086 return ret;
2088 strvec_pushl(&proc.args, hook, state, NULL);
2089 proc.in = -1;
2090 proc.stdout_to_stderr = 1;
2091 proc.trace2_hook_name = "reference-transaction";
2093 ret = start_command(&proc);
2094 if (ret)
2095 return ret;
2097 sigchain_push(SIGPIPE, SIG_IGN);
2099 for (i = 0; i < transaction->nr; i++) {
2100 struct ref_update *update = transaction->updates[i];
2102 strbuf_reset(&buf);
2103 strbuf_addf(&buf, "%s %s %s\n",
2104 oid_to_hex(&update->old_oid),
2105 oid_to_hex(&update->new_oid),
2106 update->refname);
2108 if (write_in_full(proc.in, buf.buf, buf.len) < 0) {
2109 if (errno != EPIPE) {
2110 /* Don't leak errno outside this API */
2111 errno = 0;
2112 ret = -1;
2114 break;
2118 close(proc.in);
2119 sigchain_pop(SIGPIPE);
2120 strbuf_release(&buf);
2122 ret |= finish_command(&proc);
2123 return ret;
2126 int ref_transaction_prepare(struct ref_transaction *transaction,
2127 struct strbuf *err)
2129 struct ref_store *refs = transaction->ref_store;
2130 int ret;
2132 switch (transaction->state) {
2133 case REF_TRANSACTION_OPEN:
2134 /* Good. */
2135 break;
2136 case REF_TRANSACTION_PREPARED:
2137 BUG("prepare called twice on reference transaction");
2138 break;
2139 case REF_TRANSACTION_CLOSED:
2140 BUG("prepare called on a closed reference transaction");
2141 break;
2142 default:
2143 BUG("unexpected reference transaction state");
2144 break;
2147 if (getenv(GIT_QUARANTINE_ENVIRONMENT)) {
2148 strbuf_addstr(err,
2149 _("ref updates forbidden inside quarantine environment"));
2150 return -1;
2153 ret = refs->be->transaction_prepare(refs, transaction, err);
2154 if (ret)
2155 return ret;
2157 ret = run_transaction_hook(transaction, "prepared");
2158 if (ret) {
2159 ref_transaction_abort(transaction, err);
2160 die(_("ref updates aborted by hook"));
2163 return 0;
2166 int ref_transaction_abort(struct ref_transaction *transaction,
2167 struct strbuf *err)
2169 struct ref_store *refs = transaction->ref_store;
2170 int ret = 0;
2172 switch (transaction->state) {
2173 case REF_TRANSACTION_OPEN:
2174 /* No need to abort explicitly. */
2175 break;
2176 case REF_TRANSACTION_PREPARED:
2177 ret = refs->be->transaction_abort(refs, transaction, err);
2178 break;
2179 case REF_TRANSACTION_CLOSED:
2180 BUG("abort called on a closed reference transaction");
2181 break;
2182 default:
2183 BUG("unexpected reference transaction state");
2184 break;
2187 run_transaction_hook(transaction, "aborted");
2189 ref_transaction_free(transaction);
2190 return ret;
2193 int ref_transaction_commit(struct ref_transaction *transaction,
2194 struct strbuf *err)
2196 struct ref_store *refs = transaction->ref_store;
2197 int ret;
2199 switch (transaction->state) {
2200 case REF_TRANSACTION_OPEN:
2201 /* Need to prepare first. */
2202 ret = ref_transaction_prepare(transaction, err);
2203 if (ret)
2204 return ret;
2205 break;
2206 case REF_TRANSACTION_PREPARED:
2207 /* Fall through to finish. */
2208 break;
2209 case REF_TRANSACTION_CLOSED:
2210 BUG("commit called on a closed reference transaction");
2211 break;
2212 default:
2213 BUG("unexpected reference transaction state");
2214 break;
2217 ret = refs->be->transaction_finish(refs, transaction, err);
2218 if (!ret)
2219 run_transaction_hook(transaction, "committed");
2220 return ret;
2223 int refs_verify_refname_available(struct ref_store *refs,
2224 const char *refname,
2225 const struct string_list *extras,
2226 const struct string_list *skip,
2227 struct strbuf *err)
2229 const char *slash;
2230 const char *extra_refname;
2231 struct strbuf dirname = STRBUF_INIT;
2232 struct strbuf referent = STRBUF_INIT;
2233 struct object_id oid;
2234 unsigned int type;
2235 struct ref_iterator *iter;
2236 int ok;
2237 int ret = -1;
2240 * For the sake of comments in this function, suppose that
2241 * refname is "refs/foo/bar".
2244 assert(err);
2246 strbuf_grow(&dirname, strlen(refname) + 1);
2247 for (slash = strchr(refname, '/'); slash; slash = strchr(slash + 1, '/')) {
2249 * Just saying "Is a directory" when we e.g. can't
2250 * lock some multi-level ref isn't very informative,
2251 * the user won't be told *what* is a directory, so
2252 * let's not use strerror() below.
2254 int ignore_errno;
2255 /* Expand dirname to the new prefix, not including the trailing slash: */
2256 strbuf_add(&dirname, refname + dirname.len, slash - refname - dirname.len);
2259 * We are still at a leading dir of the refname (e.g.,
2260 * "refs/foo"; if there is a reference with that name,
2261 * it is a conflict, *unless* it is in skip.
2263 if (skip && string_list_has_string(skip, dirname.buf))
2264 continue;
2266 if (!refs_read_raw_ref(refs, dirname.buf, &oid, &referent,
2267 &type, &ignore_errno)) {
2268 strbuf_addf(err, _("'%s' exists; cannot create '%s'"),
2269 dirname.buf, refname);
2270 goto cleanup;
2273 if (extras && string_list_has_string(extras, dirname.buf)) {
2274 strbuf_addf(err, _("cannot process '%s' and '%s' at the same time"),
2275 refname, dirname.buf);
2276 goto cleanup;
2281 * We are at the leaf of our refname (e.g., "refs/foo/bar").
2282 * There is no point in searching for a reference with that
2283 * name, because a refname isn't considered to conflict with
2284 * itself. But we still need to check for references whose
2285 * names are in the "refs/foo/bar/" namespace, because they
2286 * *do* conflict.
2288 strbuf_addstr(&dirname, refname + dirname.len);
2289 strbuf_addch(&dirname, '/');
2291 iter = refs_ref_iterator_begin(refs, dirname.buf, 0,
2292 DO_FOR_EACH_INCLUDE_BROKEN);
2293 while ((ok = ref_iterator_advance(iter)) == ITER_OK) {
2294 if (skip &&
2295 string_list_has_string(skip, iter->refname))
2296 continue;
2298 strbuf_addf(err, _("'%s' exists; cannot create '%s'"),
2299 iter->refname, refname);
2300 ref_iterator_abort(iter);
2301 goto cleanup;
2304 if (ok != ITER_DONE)
2305 BUG("error while iterating over references");
2307 extra_refname = find_descendant_ref(dirname.buf, extras, skip);
2308 if (extra_refname)
2309 strbuf_addf(err, _("cannot process '%s' and '%s' at the same time"),
2310 refname, extra_refname);
2311 else
2312 ret = 0;
2314 cleanup:
2315 strbuf_release(&referent);
2316 strbuf_release(&dirname);
2317 return ret;
2320 int refs_for_each_reflog(struct ref_store *refs, each_ref_fn fn, void *cb_data)
2322 struct ref_iterator *iter;
2323 struct do_for_each_ref_help hp = { fn, cb_data };
2325 iter = refs->be->reflog_iterator_begin(refs);
2327 return do_for_each_repo_ref_iterator(the_repository, iter,
2328 do_for_each_ref_helper, &hp);
2331 int for_each_reflog(each_ref_fn fn, void *cb_data)
2333 return refs_for_each_reflog(get_main_ref_store(the_repository), fn, cb_data);
2336 int refs_for_each_reflog_ent_reverse(struct ref_store *refs,
2337 const char *refname,
2338 each_reflog_ent_fn fn,
2339 void *cb_data)
2341 return refs->be->for_each_reflog_ent_reverse(refs, refname,
2342 fn, cb_data);
2345 int for_each_reflog_ent_reverse(const char *refname, each_reflog_ent_fn fn,
2346 void *cb_data)
2348 return refs_for_each_reflog_ent_reverse(get_main_ref_store(the_repository),
2349 refname, fn, cb_data);
2352 int refs_for_each_reflog_ent(struct ref_store *refs, const char *refname,
2353 each_reflog_ent_fn fn, void *cb_data)
2355 return refs->be->for_each_reflog_ent(refs, refname, fn, cb_data);
2358 int for_each_reflog_ent(const char *refname, each_reflog_ent_fn fn,
2359 void *cb_data)
2361 return refs_for_each_reflog_ent(get_main_ref_store(the_repository), refname,
2362 fn, cb_data);
2365 int refs_reflog_exists(struct ref_store *refs, const char *refname)
2367 return refs->be->reflog_exists(refs, refname);
2370 int reflog_exists(const char *refname)
2372 return refs_reflog_exists(get_main_ref_store(the_repository), refname);
2375 int refs_create_reflog(struct ref_store *refs, const char *refname,
2376 struct strbuf *err)
2378 return refs->be->create_reflog(refs, refname, err);
2381 int safe_create_reflog(const char *refname, struct strbuf *err)
2383 return refs_create_reflog(get_main_ref_store(the_repository), refname,
2384 err);
2387 int refs_delete_reflog(struct ref_store *refs, const char *refname)
2389 return refs->be->delete_reflog(refs, refname);
2392 int delete_reflog(const char *refname)
2394 return refs_delete_reflog(get_main_ref_store(the_repository), refname);
2397 int refs_reflog_expire(struct ref_store *refs,
2398 const char *refname,
2399 unsigned int flags,
2400 reflog_expiry_prepare_fn prepare_fn,
2401 reflog_expiry_should_prune_fn should_prune_fn,
2402 reflog_expiry_cleanup_fn cleanup_fn,
2403 void *policy_cb_data)
2405 return refs->be->reflog_expire(refs, refname, flags,
2406 prepare_fn, should_prune_fn,
2407 cleanup_fn, policy_cb_data);
2410 int reflog_expire(const char *refname,
2411 unsigned int flags,
2412 reflog_expiry_prepare_fn prepare_fn,
2413 reflog_expiry_should_prune_fn should_prune_fn,
2414 reflog_expiry_cleanup_fn cleanup_fn,
2415 void *policy_cb_data)
2417 return refs_reflog_expire(get_main_ref_store(the_repository),
2418 refname, flags,
2419 prepare_fn, should_prune_fn,
2420 cleanup_fn, policy_cb_data);
2423 int initial_ref_transaction_commit(struct ref_transaction *transaction,
2424 struct strbuf *err)
2426 struct ref_store *refs = transaction->ref_store;
2428 return refs->be->initial_transaction_commit(refs, transaction, err);
2431 int refs_delete_refs(struct ref_store *refs, const char *logmsg,
2432 struct string_list *refnames, unsigned int flags)
2434 char *msg;
2435 int retval;
2437 msg = normalize_reflog_message(logmsg);
2438 retval = refs->be->delete_refs(refs, msg, refnames, flags);
2439 free(msg);
2440 return retval;
2443 int delete_refs(const char *msg, struct string_list *refnames,
2444 unsigned int flags)
2446 return refs_delete_refs(get_main_ref_store(the_repository), msg, refnames, flags);
2449 int refs_rename_ref(struct ref_store *refs, const char *oldref,
2450 const char *newref, const char *logmsg)
2452 char *msg;
2453 int retval;
2455 msg = normalize_reflog_message(logmsg);
2456 retval = refs->be->rename_ref(refs, oldref, newref, msg);
2457 free(msg);
2458 return retval;
2461 int rename_ref(const char *oldref, const char *newref, const char *logmsg)
2463 return refs_rename_ref(get_main_ref_store(the_repository), oldref, newref, logmsg);
2466 int refs_copy_existing_ref(struct ref_store *refs, const char *oldref,
2467 const char *newref, const char *logmsg)
2469 char *msg;
2470 int retval;
2472 msg = normalize_reflog_message(logmsg);
2473 retval = refs->be->copy_ref(refs, oldref, newref, msg);
2474 free(msg);
2475 return retval;
2478 int copy_existing_ref(const char *oldref, const char *newref, const char *logmsg)
2480 return refs_copy_existing_ref(get_main_ref_store(the_repository), oldref, newref, logmsg);