t/lib-gpg: reload gpg components after updating trustlist
[git.git] / refs.c
blobaddb26293b4ffc1b0c997379acce5d13d70991c8
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 (!(flags & REF_SKIP_REFNAME_VERIFICATION) &&
1087 ((new_oid && !is_null_oid(new_oid)) ?
1088 check_refname_format(refname, REFNAME_ALLOW_ONELEVEL) :
1089 !refname_is_safe(refname))) {
1090 strbuf_addf(err, _("refusing to update ref with bad name '%s'"),
1091 refname);
1092 return -1;
1095 if (flags & ~REF_TRANSACTION_UPDATE_ALLOWED_FLAGS)
1096 BUG("illegal flags 0x%x passed to ref_transaction_update()", flags);
1099 * Clear flags outside the allowed set; this should be a noop because
1100 * of the BUG() check above, but it works around a -Wnonnull warning
1101 * with some versions of "gcc -O3".
1103 flags &= REF_TRANSACTION_UPDATE_ALLOWED_FLAGS;
1105 flags |= (new_oid ? REF_HAVE_NEW : 0) | (old_oid ? REF_HAVE_OLD : 0);
1107 ref_transaction_add_update(transaction, refname, flags,
1108 new_oid, old_oid, msg);
1109 return 0;
1112 int ref_transaction_create(struct ref_transaction *transaction,
1113 const char *refname,
1114 const struct object_id *new_oid,
1115 unsigned int flags, const char *msg,
1116 struct strbuf *err)
1118 if (!new_oid || is_null_oid(new_oid))
1119 BUG("create called without valid new_oid");
1120 return ref_transaction_update(transaction, refname, new_oid,
1121 null_oid(), flags, msg, err);
1124 int ref_transaction_delete(struct ref_transaction *transaction,
1125 const char *refname,
1126 const struct object_id *old_oid,
1127 unsigned int flags, const char *msg,
1128 struct strbuf *err)
1130 if (old_oid && is_null_oid(old_oid))
1131 BUG("delete called with old_oid set to zeros");
1132 return ref_transaction_update(transaction, refname,
1133 null_oid(), old_oid,
1134 flags, msg, err);
1137 int ref_transaction_verify(struct ref_transaction *transaction,
1138 const char *refname,
1139 const struct object_id *old_oid,
1140 unsigned int flags,
1141 struct strbuf *err)
1143 if (!old_oid)
1144 BUG("verify called with old_oid set to NULL");
1145 return ref_transaction_update(transaction, refname,
1146 NULL, old_oid,
1147 flags, NULL, err);
1150 int refs_update_ref(struct ref_store *refs, const char *msg,
1151 const char *refname, const struct object_id *new_oid,
1152 const struct object_id *old_oid, unsigned int flags,
1153 enum action_on_err onerr)
1155 struct ref_transaction *t = NULL;
1156 struct strbuf err = STRBUF_INIT;
1157 int ret = 0;
1159 t = ref_store_transaction_begin(refs, &err);
1160 if (!t ||
1161 ref_transaction_update(t, refname, new_oid, old_oid, flags, msg,
1162 &err) ||
1163 ref_transaction_commit(t, &err)) {
1164 ret = 1;
1165 ref_transaction_free(t);
1167 if (ret) {
1168 const char *str = _("update_ref failed for ref '%s': %s");
1170 switch (onerr) {
1171 case UPDATE_REFS_MSG_ON_ERR:
1172 error(str, refname, err.buf);
1173 break;
1174 case UPDATE_REFS_DIE_ON_ERR:
1175 die(str, refname, err.buf);
1176 break;
1177 case UPDATE_REFS_QUIET_ON_ERR:
1178 break;
1180 strbuf_release(&err);
1181 return 1;
1183 strbuf_release(&err);
1184 if (t)
1185 ref_transaction_free(t);
1186 return 0;
1189 int update_ref(const char *msg, const char *refname,
1190 const struct object_id *new_oid,
1191 const struct object_id *old_oid,
1192 unsigned int flags, enum action_on_err onerr)
1194 return refs_update_ref(get_main_ref_store(the_repository), msg, refname, new_oid,
1195 old_oid, flags, onerr);
1198 char *refs_shorten_unambiguous_ref(struct ref_store *refs,
1199 const char *refname, int strict)
1201 int i;
1202 static char **scanf_fmts;
1203 static int nr_rules;
1204 char *short_name;
1205 struct strbuf resolved_buf = STRBUF_INIT;
1207 if (!nr_rules) {
1209 * Pre-generate scanf formats from ref_rev_parse_rules[].
1210 * Generate a format suitable for scanf from a
1211 * ref_rev_parse_rules rule by interpolating "%s" at the
1212 * location of the "%.*s".
1214 size_t total_len = 0;
1215 size_t offset = 0;
1217 /* the rule list is NULL terminated, count them first */
1218 for (nr_rules = 0; ref_rev_parse_rules[nr_rules]; nr_rules++)
1219 /* -2 for strlen("%.*s") - strlen("%s"); +1 for NUL */
1220 total_len += strlen(ref_rev_parse_rules[nr_rules]) - 2 + 1;
1222 scanf_fmts = xmalloc(st_add(st_mult(sizeof(char *), nr_rules), total_len));
1224 offset = 0;
1225 for (i = 0; i < nr_rules; i++) {
1226 assert(offset < total_len);
1227 scanf_fmts[i] = (char *)&scanf_fmts[nr_rules] + offset;
1228 offset += xsnprintf(scanf_fmts[i], total_len - offset,
1229 ref_rev_parse_rules[i], 2, "%s") + 1;
1233 /* bail out if there are no rules */
1234 if (!nr_rules)
1235 return xstrdup(refname);
1237 /* buffer for scanf result, at most refname must fit */
1238 short_name = xstrdup(refname);
1240 /* skip first rule, it will always match */
1241 for (i = nr_rules - 1; i > 0 ; --i) {
1242 int j;
1243 int rules_to_fail = i;
1244 int short_name_len;
1246 if (1 != sscanf(refname, scanf_fmts[i], short_name))
1247 continue;
1249 short_name_len = strlen(short_name);
1252 * in strict mode, all (except the matched one) rules
1253 * must fail to resolve to a valid non-ambiguous ref
1255 if (strict)
1256 rules_to_fail = nr_rules;
1259 * check if the short name resolves to a valid ref,
1260 * but use only rules prior to the matched one
1262 for (j = 0; j < rules_to_fail; j++) {
1263 const char *rule = ref_rev_parse_rules[j];
1265 /* skip matched rule */
1266 if (i == j)
1267 continue;
1270 * the short name is ambiguous, if it resolves
1271 * (with this previous rule) to a valid ref
1272 * read_ref() returns 0 on success
1274 strbuf_reset(&resolved_buf);
1275 strbuf_addf(&resolved_buf, rule,
1276 short_name_len, short_name);
1277 if (refs_ref_exists(refs, resolved_buf.buf))
1278 break;
1282 * short name is non-ambiguous if all previous rules
1283 * haven't resolved to a valid ref
1285 if (j == rules_to_fail) {
1286 strbuf_release(&resolved_buf);
1287 return short_name;
1291 strbuf_release(&resolved_buf);
1292 free(short_name);
1293 return xstrdup(refname);
1296 char *shorten_unambiguous_ref(const char *refname, int strict)
1298 return refs_shorten_unambiguous_ref(get_main_ref_store(the_repository),
1299 refname, strict);
1302 static struct string_list *hide_refs;
1304 int parse_hide_refs_config(const char *var, const char *value, const char *section)
1306 const char *key;
1307 if (!strcmp("transfer.hiderefs", var) ||
1308 (!parse_config_key(var, section, NULL, NULL, &key) &&
1309 !strcmp(key, "hiderefs"))) {
1310 char *ref;
1311 int len;
1313 if (!value)
1314 return config_error_nonbool(var);
1315 ref = xstrdup(value);
1316 len = strlen(ref);
1317 while (len && ref[len - 1] == '/')
1318 ref[--len] = '\0';
1319 if (!hide_refs) {
1320 CALLOC_ARRAY(hide_refs, 1);
1321 hide_refs->strdup_strings = 1;
1323 string_list_append(hide_refs, ref);
1325 return 0;
1328 int ref_is_hidden(const char *refname, const char *refname_full)
1330 int i;
1332 if (!hide_refs)
1333 return 0;
1334 for (i = hide_refs->nr - 1; i >= 0; i--) {
1335 const char *match = hide_refs->items[i].string;
1336 const char *subject;
1337 int neg = 0;
1338 const char *p;
1340 if (*match == '!') {
1341 neg = 1;
1342 match++;
1345 if (*match == '^') {
1346 subject = refname_full;
1347 match++;
1348 } else {
1349 subject = refname;
1352 /* refname can be NULL when namespaces are used. */
1353 if (subject &&
1354 skip_prefix(subject, match, &p) &&
1355 (!*p || *p == '/'))
1356 return !neg;
1358 return 0;
1361 const char *find_descendant_ref(const char *dirname,
1362 const struct string_list *extras,
1363 const struct string_list *skip)
1365 int pos;
1367 if (!extras)
1368 return NULL;
1371 * Look at the place where dirname would be inserted into
1372 * extras. If there is an entry at that position that starts
1373 * with dirname (remember, dirname includes the trailing
1374 * slash) and is not in skip, then we have a conflict.
1376 for (pos = string_list_find_insert_index(extras, dirname, 0);
1377 pos < extras->nr; pos++) {
1378 const char *extra_refname = extras->items[pos].string;
1380 if (!starts_with(extra_refname, dirname))
1381 break;
1383 if (!skip || !string_list_has_string(skip, extra_refname))
1384 return extra_refname;
1386 return NULL;
1389 int refs_head_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
1391 struct object_id oid;
1392 int flag;
1393 int ignore_errno;
1395 if (refs_resolve_ref_unsafe(refs, "HEAD", RESOLVE_REF_READING,
1396 &oid, &flag, &ignore_errno))
1397 return fn("HEAD", &oid, flag, cb_data);
1399 return 0;
1402 int head_ref(each_ref_fn fn, void *cb_data)
1404 return refs_head_ref(get_main_ref_store(the_repository), fn, cb_data);
1407 struct ref_iterator *refs_ref_iterator_begin(
1408 struct ref_store *refs,
1409 const char *prefix, int trim,
1410 enum do_for_each_ref_flags flags)
1412 struct ref_iterator *iter;
1414 if (!(flags & DO_FOR_EACH_INCLUDE_BROKEN)) {
1415 static int ref_paranoia = -1;
1417 if (ref_paranoia < 0)
1418 ref_paranoia = git_env_bool("GIT_REF_PARANOIA", 1);
1419 if (ref_paranoia) {
1420 flags |= DO_FOR_EACH_INCLUDE_BROKEN;
1421 flags |= DO_FOR_EACH_OMIT_DANGLING_SYMREFS;
1425 iter = refs->be->iterator_begin(refs, prefix, flags);
1428 * `iterator_begin()` already takes care of prefix, but we
1429 * might need to do some trimming:
1431 if (trim)
1432 iter = prefix_ref_iterator_begin(iter, "", trim);
1434 /* Sanity check for subclasses: */
1435 if (!iter->ordered)
1436 BUG("reference iterator is not ordered");
1438 return iter;
1442 * Call fn for each reference in the specified submodule for which the
1443 * refname begins with prefix. If trim is non-zero, then trim that
1444 * many characters off the beginning of each refname before passing
1445 * the refname to fn. flags can be DO_FOR_EACH_INCLUDE_BROKEN to
1446 * include broken references in the iteration. If fn ever returns a
1447 * non-zero value, stop the iteration and return that value;
1448 * otherwise, return 0.
1450 static int do_for_each_repo_ref(struct repository *r, const char *prefix,
1451 each_repo_ref_fn fn, int trim, int flags,
1452 void *cb_data)
1454 struct ref_iterator *iter;
1455 struct ref_store *refs = get_main_ref_store(r);
1457 if (!refs)
1458 return 0;
1460 iter = refs_ref_iterator_begin(refs, prefix, trim, flags);
1462 return do_for_each_repo_ref_iterator(r, iter, fn, cb_data);
1465 struct do_for_each_ref_help {
1466 each_ref_fn *fn;
1467 void *cb_data;
1470 static int do_for_each_ref_helper(struct repository *r,
1471 const char *refname,
1472 const struct object_id *oid,
1473 int flags,
1474 void *cb_data)
1476 struct do_for_each_ref_help *hp = cb_data;
1478 return hp->fn(refname, oid, flags, hp->cb_data);
1481 static int do_for_each_ref(struct ref_store *refs, const char *prefix,
1482 each_ref_fn fn, int trim,
1483 enum do_for_each_ref_flags flags, void *cb_data)
1485 struct ref_iterator *iter;
1486 struct do_for_each_ref_help hp = { fn, cb_data };
1488 if (!refs)
1489 return 0;
1491 iter = refs_ref_iterator_begin(refs, prefix, trim, flags);
1493 return do_for_each_repo_ref_iterator(the_repository, iter,
1494 do_for_each_ref_helper, &hp);
1497 int refs_for_each_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
1499 return do_for_each_ref(refs, "", fn, 0, 0, cb_data);
1502 int for_each_ref(each_ref_fn fn, void *cb_data)
1504 return refs_for_each_ref(get_main_ref_store(the_repository), fn, cb_data);
1507 int refs_for_each_ref_in(struct ref_store *refs, const char *prefix,
1508 each_ref_fn fn, void *cb_data)
1510 return do_for_each_ref(refs, prefix, fn, strlen(prefix), 0, cb_data);
1513 int for_each_ref_in(const char *prefix, each_ref_fn fn, void *cb_data)
1515 return refs_for_each_ref_in(get_main_ref_store(the_repository), prefix, fn, cb_data);
1518 int for_each_fullref_in(const char *prefix, each_ref_fn fn, void *cb_data)
1520 return do_for_each_ref(get_main_ref_store(the_repository),
1521 prefix, fn, 0, 0, cb_data);
1524 int refs_for_each_fullref_in(struct ref_store *refs, const char *prefix,
1525 each_ref_fn fn, void *cb_data)
1527 return do_for_each_ref(refs, prefix, fn, 0, 0, cb_data);
1530 int for_each_replace_ref(struct repository *r, each_repo_ref_fn fn, void *cb_data)
1532 return do_for_each_repo_ref(r, git_replace_ref_base, fn,
1533 strlen(git_replace_ref_base),
1534 DO_FOR_EACH_INCLUDE_BROKEN, cb_data);
1537 int for_each_namespaced_ref(each_ref_fn fn, void *cb_data)
1539 struct strbuf buf = STRBUF_INIT;
1540 int ret;
1541 strbuf_addf(&buf, "%srefs/", get_git_namespace());
1542 ret = do_for_each_ref(get_main_ref_store(the_repository),
1543 buf.buf, fn, 0, 0, cb_data);
1544 strbuf_release(&buf);
1545 return ret;
1548 int refs_for_each_rawref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
1550 return do_for_each_ref(refs, "", fn, 0,
1551 DO_FOR_EACH_INCLUDE_BROKEN, cb_data);
1554 int for_each_rawref(each_ref_fn fn, void *cb_data)
1556 return refs_for_each_rawref(get_main_ref_store(the_repository), fn, cb_data);
1559 static int qsort_strcmp(const void *va, const void *vb)
1561 const char *a = *(const char **)va;
1562 const char *b = *(const char **)vb;
1564 return strcmp(a, b);
1567 static void find_longest_prefixes_1(struct string_list *out,
1568 struct strbuf *prefix,
1569 const char **patterns, size_t nr)
1571 size_t i;
1573 for (i = 0; i < nr; i++) {
1574 char c = patterns[i][prefix->len];
1575 if (!c || is_glob_special(c)) {
1576 string_list_append(out, prefix->buf);
1577 return;
1581 i = 0;
1582 while (i < nr) {
1583 size_t end;
1586 * Set "end" to the index of the element _after_ the last one
1587 * in our group.
1589 for (end = i + 1; end < nr; end++) {
1590 if (patterns[i][prefix->len] != patterns[end][prefix->len])
1591 break;
1594 strbuf_addch(prefix, patterns[i][prefix->len]);
1595 find_longest_prefixes_1(out, prefix, patterns + i, end - i);
1596 strbuf_setlen(prefix, prefix->len - 1);
1598 i = end;
1602 static void find_longest_prefixes(struct string_list *out,
1603 const char **patterns)
1605 struct strvec sorted = STRVEC_INIT;
1606 struct strbuf prefix = STRBUF_INIT;
1608 strvec_pushv(&sorted, patterns);
1609 QSORT(sorted.v, sorted.nr, qsort_strcmp);
1611 find_longest_prefixes_1(out, &prefix, sorted.v, sorted.nr);
1613 strvec_clear(&sorted);
1614 strbuf_release(&prefix);
1617 int for_each_fullref_in_prefixes(const char *namespace,
1618 const char **patterns,
1619 each_ref_fn fn, void *cb_data)
1621 struct string_list prefixes = STRING_LIST_INIT_DUP;
1622 struct string_list_item *prefix;
1623 struct strbuf buf = STRBUF_INIT;
1624 int ret = 0, namespace_len;
1626 find_longest_prefixes(&prefixes, patterns);
1628 if (namespace)
1629 strbuf_addstr(&buf, namespace);
1630 namespace_len = buf.len;
1632 for_each_string_list_item(prefix, &prefixes) {
1633 strbuf_addstr(&buf, prefix->string);
1634 ret = for_each_fullref_in(buf.buf, fn, cb_data);
1635 if (ret)
1636 break;
1637 strbuf_setlen(&buf, namespace_len);
1640 string_list_clear(&prefixes, 0);
1641 strbuf_release(&buf);
1642 return ret;
1645 static int refs_read_special_head(struct ref_store *ref_store,
1646 const char *refname, struct object_id *oid,
1647 struct strbuf *referent, unsigned int *type,
1648 int *failure_errno)
1650 struct strbuf full_path = STRBUF_INIT;
1651 struct strbuf content = STRBUF_INIT;
1652 int result = -1;
1653 strbuf_addf(&full_path, "%s/%s", ref_store->gitdir, refname);
1655 if (strbuf_read_file(&content, full_path.buf, 0) < 0)
1656 goto done;
1658 result = parse_loose_ref_contents(content.buf, oid, referent, type,
1659 failure_errno);
1661 done:
1662 strbuf_release(&full_path);
1663 strbuf_release(&content);
1664 return result;
1667 int refs_read_raw_ref(struct ref_store *ref_store, const char *refname,
1668 struct object_id *oid, struct strbuf *referent,
1669 unsigned int *type, int *failure_errno)
1671 assert(failure_errno);
1672 if (!strcmp(refname, "FETCH_HEAD") || !strcmp(refname, "MERGE_HEAD")) {
1673 return refs_read_special_head(ref_store, refname, oid, referent,
1674 type, failure_errno);
1677 return ref_store->be->read_raw_ref(ref_store, refname, oid, referent,
1678 type, failure_errno);
1681 const char *refs_resolve_ref_unsafe(struct ref_store *refs,
1682 const char *refname,
1683 int resolve_flags,
1684 struct object_id *oid,
1685 int *flags, int *failure_errno)
1687 static struct strbuf sb_refname = STRBUF_INIT;
1688 struct object_id unused_oid;
1689 int unused_flags;
1690 int symref_count;
1692 assert(failure_errno);
1694 if (!oid)
1695 oid = &unused_oid;
1696 if (!flags)
1697 flags = &unused_flags;
1699 *flags = 0;
1701 if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
1702 if (!(resolve_flags & RESOLVE_REF_ALLOW_BAD_NAME) ||
1703 !refname_is_safe(refname)) {
1704 *failure_errno = EINVAL;
1705 return NULL;
1709 * dwim_ref() uses REF_ISBROKEN to distinguish between
1710 * missing refs and refs that were present but invalid,
1711 * to complain about the latter to stderr.
1713 * We don't know whether the ref exists, so don't set
1714 * REF_ISBROKEN yet.
1716 *flags |= REF_BAD_NAME;
1719 for (symref_count = 0; symref_count < SYMREF_MAXDEPTH; symref_count++) {
1720 unsigned int read_flags = 0;
1722 if (refs_read_raw_ref(refs, refname, oid, &sb_refname,
1723 &read_flags, failure_errno)) {
1724 *flags |= read_flags;
1726 /* In reading mode, refs must eventually resolve */
1727 if (resolve_flags & RESOLVE_REF_READING)
1728 return NULL;
1731 * Otherwise a missing ref is OK. But the files backend
1732 * may show errors besides ENOENT if there are
1733 * similarly-named refs.
1735 if (*failure_errno != ENOENT &&
1736 *failure_errno != EISDIR &&
1737 *failure_errno != ENOTDIR)
1738 return NULL;
1740 oidclr(oid);
1741 if (*flags & REF_BAD_NAME)
1742 *flags |= REF_ISBROKEN;
1743 return refname;
1746 *flags |= read_flags;
1748 if (!(read_flags & REF_ISSYMREF)) {
1749 if (*flags & REF_BAD_NAME) {
1750 oidclr(oid);
1751 *flags |= REF_ISBROKEN;
1753 return refname;
1756 refname = sb_refname.buf;
1757 if (resolve_flags & RESOLVE_REF_NO_RECURSE) {
1758 oidclr(oid);
1759 return refname;
1761 if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
1762 if (!(resolve_flags & RESOLVE_REF_ALLOW_BAD_NAME) ||
1763 !refname_is_safe(refname)) {
1764 *failure_errno = EINVAL;
1765 return NULL;
1768 *flags |= REF_ISBROKEN | REF_BAD_NAME;
1772 *failure_errno = ELOOP;
1773 return NULL;
1776 /* backend functions */
1777 int refs_init_db(struct strbuf *err)
1779 struct ref_store *refs = get_main_ref_store(the_repository);
1781 return refs->be->init_db(refs, err);
1784 const char *resolve_ref_unsafe(const char *refname, int resolve_flags,
1785 struct object_id *oid, int *flags)
1787 int ignore_errno;
1789 return refs_resolve_ref_unsafe(get_main_ref_store(the_repository), refname,
1790 resolve_flags, oid, flags, &ignore_errno);
1793 int resolve_gitlink_ref(const char *submodule, const char *refname,
1794 struct object_id *oid)
1796 struct ref_store *refs;
1797 int flags;
1798 int ignore_errno;
1800 refs = get_submodule_ref_store(submodule);
1802 if (!refs)
1803 return -1;
1805 if (!refs_resolve_ref_unsafe(refs, refname, 0, oid, &flags,
1806 &ignore_errno) || is_null_oid(oid))
1807 return -1;
1808 return 0;
1811 struct ref_store_hash_entry
1813 struct hashmap_entry ent;
1815 struct ref_store *refs;
1817 /* NUL-terminated identifier of the ref store: */
1818 char name[FLEX_ARRAY];
1821 static int ref_store_hash_cmp(const void *unused_cmp_data,
1822 const struct hashmap_entry *eptr,
1823 const struct hashmap_entry *entry_or_key,
1824 const void *keydata)
1826 const struct ref_store_hash_entry *e1, *e2;
1827 const char *name;
1829 e1 = container_of(eptr, const struct ref_store_hash_entry, ent);
1830 e2 = container_of(entry_or_key, const struct ref_store_hash_entry, ent);
1831 name = keydata ? keydata : e2->name;
1833 return strcmp(e1->name, name);
1836 static struct ref_store_hash_entry *alloc_ref_store_hash_entry(
1837 const char *name, struct ref_store *refs)
1839 struct ref_store_hash_entry *entry;
1841 FLEX_ALLOC_STR(entry, name, name);
1842 hashmap_entry_init(&entry->ent, strhash(name));
1843 entry->refs = refs;
1844 return entry;
1847 /* A hashmap of ref_stores, stored by submodule name: */
1848 static struct hashmap submodule_ref_stores;
1850 /* A hashmap of ref_stores, stored by worktree id: */
1851 static struct hashmap worktree_ref_stores;
1854 * Look up a ref store by name. If that ref_store hasn't been
1855 * registered yet, return NULL.
1857 static struct ref_store *lookup_ref_store_map(struct hashmap *map,
1858 const char *name)
1860 struct ref_store_hash_entry *entry;
1861 unsigned int hash;
1863 if (!map->tablesize)
1864 /* It's initialized on demand in register_ref_store(). */
1865 return NULL;
1867 hash = strhash(name);
1868 entry = hashmap_get_entry_from_hash(map, hash, name,
1869 struct ref_store_hash_entry, ent);
1870 return entry ? entry->refs : NULL;
1874 * Create, record, and return a ref_store instance for the specified
1875 * gitdir.
1877 static struct ref_store *ref_store_init(struct repository *repo,
1878 const char *gitdir,
1879 unsigned int flags)
1881 const char *be_name = "files";
1882 struct ref_storage_be *be = find_ref_storage_backend(be_name);
1883 struct ref_store *refs;
1885 if (!be)
1886 BUG("reference backend %s is unknown", be_name);
1888 refs = be->init(repo, gitdir, flags);
1889 return refs;
1892 struct ref_store *get_main_ref_store(struct repository *r)
1894 if (r->refs_private)
1895 return r->refs_private;
1897 if (!r->gitdir)
1898 BUG("attempting to get main_ref_store outside of repository");
1900 r->refs_private = ref_store_init(r, r->gitdir, REF_STORE_ALL_CAPS);
1901 r->refs_private = maybe_debug_wrap_ref_store(r->gitdir, r->refs_private);
1902 return r->refs_private;
1906 * Associate a ref store with a name. It is a fatal error to call this
1907 * function twice for the same name.
1909 static void register_ref_store_map(struct hashmap *map,
1910 const char *type,
1911 struct ref_store *refs,
1912 const char *name)
1914 struct ref_store_hash_entry *entry;
1916 if (!map->tablesize)
1917 hashmap_init(map, ref_store_hash_cmp, NULL, 0);
1919 entry = alloc_ref_store_hash_entry(name, refs);
1920 if (hashmap_put(map, &entry->ent))
1921 BUG("%s ref_store '%s' initialized twice", type, name);
1924 struct ref_store *get_submodule_ref_store(const char *submodule)
1926 struct strbuf submodule_sb = STRBUF_INIT;
1927 struct ref_store *refs;
1928 char *to_free = NULL;
1929 size_t len;
1930 struct repository *subrepo;
1932 if (!submodule)
1933 return NULL;
1935 len = strlen(submodule);
1936 while (len && is_dir_sep(submodule[len - 1]))
1937 len--;
1938 if (!len)
1939 return NULL;
1941 if (submodule[len])
1942 /* We need to strip off one or more trailing slashes */
1943 submodule = to_free = xmemdupz(submodule, len);
1945 refs = lookup_ref_store_map(&submodule_ref_stores, submodule);
1946 if (refs)
1947 goto done;
1949 strbuf_addstr(&submodule_sb, submodule);
1950 if (!is_nonbare_repository_dir(&submodule_sb))
1951 goto done;
1953 if (submodule_to_gitdir(&submodule_sb, submodule))
1954 goto done;
1956 subrepo = xmalloc(sizeof(*subrepo));
1958 * NEEDSWORK: Make get_submodule_ref_store() work with arbitrary
1959 * superprojects other than the_repository. This probably should be
1960 * done by making it take a struct repository * parameter instead of a
1961 * submodule path.
1963 if (repo_submodule_init(subrepo, the_repository, submodule,
1964 null_oid())) {
1965 free(subrepo);
1966 goto done;
1968 refs = ref_store_init(subrepo, submodule_sb.buf,
1969 REF_STORE_READ | REF_STORE_ODB);
1970 register_ref_store_map(&submodule_ref_stores, "submodule",
1971 refs, submodule);
1973 done:
1974 strbuf_release(&submodule_sb);
1975 free(to_free);
1977 return refs;
1980 struct ref_store *get_worktree_ref_store(const struct worktree *wt)
1982 struct ref_store *refs;
1983 const char *id;
1985 if (wt->is_current)
1986 return get_main_ref_store(the_repository);
1988 id = wt->id ? wt->id : "/";
1989 refs = lookup_ref_store_map(&worktree_ref_stores, id);
1990 if (refs)
1991 return refs;
1993 if (wt->id)
1994 refs = ref_store_init(the_repository,
1995 git_common_path("worktrees/%s", wt->id),
1996 REF_STORE_ALL_CAPS);
1997 else
1998 refs = ref_store_init(the_repository,
1999 get_git_common_dir(),
2000 REF_STORE_ALL_CAPS);
2002 if (refs)
2003 register_ref_store_map(&worktree_ref_stores, "worktree",
2004 refs, id);
2005 return refs;
2008 void base_ref_store_init(struct ref_store *refs, struct repository *repo,
2009 const char *path, const struct ref_storage_be *be)
2011 refs->be = be;
2012 refs->repo = repo;
2013 refs->gitdir = xstrdup(path);
2016 /* backend functions */
2017 int refs_pack_refs(struct ref_store *refs, unsigned int flags)
2019 return refs->be->pack_refs(refs, flags);
2022 int peel_iterated_oid(const struct object_id *base, struct object_id *peeled)
2024 if (current_ref_iter &&
2025 (current_ref_iter->oid == base ||
2026 oideq(current_ref_iter->oid, base)))
2027 return ref_iterator_peel(current_ref_iter, peeled);
2029 return peel_object(base, peeled) ? -1 : 0;
2032 int refs_create_symref(struct ref_store *refs,
2033 const char *ref_target,
2034 const char *refs_heads_master,
2035 const char *logmsg)
2037 char *msg;
2038 int retval;
2040 msg = normalize_reflog_message(logmsg);
2041 retval = refs->be->create_symref(refs, ref_target, refs_heads_master,
2042 msg);
2043 free(msg);
2044 return retval;
2047 int create_symref(const char *ref_target, const char *refs_heads_master,
2048 const char *logmsg)
2050 return refs_create_symref(get_main_ref_store(the_repository), ref_target,
2051 refs_heads_master, logmsg);
2054 int ref_update_reject_duplicates(struct string_list *refnames,
2055 struct strbuf *err)
2057 size_t i, n = refnames->nr;
2059 assert(err);
2061 for (i = 1; i < n; i++) {
2062 int cmp = strcmp(refnames->items[i - 1].string,
2063 refnames->items[i].string);
2065 if (!cmp) {
2066 strbuf_addf(err,
2067 _("multiple updates for ref '%s' not allowed"),
2068 refnames->items[i].string);
2069 return 1;
2070 } else if (cmp > 0) {
2071 BUG("ref_update_reject_duplicates() received unsorted list");
2074 return 0;
2077 static int run_transaction_hook(struct ref_transaction *transaction,
2078 const char *state)
2080 struct child_process proc = CHILD_PROCESS_INIT;
2081 struct strbuf buf = STRBUF_INIT;
2082 const char *hook;
2083 int ret = 0, i;
2085 hook = find_hook("reference-transaction");
2086 if (!hook)
2087 return ret;
2089 strvec_pushl(&proc.args, hook, state, NULL);
2090 proc.in = -1;
2091 proc.stdout_to_stderr = 1;
2092 proc.trace2_hook_name = "reference-transaction";
2094 ret = start_command(&proc);
2095 if (ret)
2096 return ret;
2098 sigchain_push(SIGPIPE, SIG_IGN);
2100 for (i = 0; i < transaction->nr; i++) {
2101 struct ref_update *update = transaction->updates[i];
2103 strbuf_reset(&buf);
2104 strbuf_addf(&buf, "%s %s %s\n",
2105 oid_to_hex(&update->old_oid),
2106 oid_to_hex(&update->new_oid),
2107 update->refname);
2109 if (write_in_full(proc.in, buf.buf, buf.len) < 0) {
2110 if (errno != EPIPE) {
2111 /* Don't leak errno outside this API */
2112 errno = 0;
2113 ret = -1;
2115 break;
2119 close(proc.in);
2120 sigchain_pop(SIGPIPE);
2121 strbuf_release(&buf);
2123 ret |= finish_command(&proc);
2124 return ret;
2127 int ref_transaction_prepare(struct ref_transaction *transaction,
2128 struct strbuf *err)
2130 struct ref_store *refs = transaction->ref_store;
2131 int ret;
2133 switch (transaction->state) {
2134 case REF_TRANSACTION_OPEN:
2135 /* Good. */
2136 break;
2137 case REF_TRANSACTION_PREPARED:
2138 BUG("prepare called twice on reference transaction");
2139 break;
2140 case REF_TRANSACTION_CLOSED:
2141 BUG("prepare called on a closed reference transaction");
2142 break;
2143 default:
2144 BUG("unexpected reference transaction state");
2145 break;
2148 if (refs->repo->objects->odb->disable_ref_updates) {
2149 strbuf_addstr(err,
2150 _("ref updates forbidden inside quarantine environment"));
2151 return -1;
2154 ret = refs->be->transaction_prepare(refs, transaction, err);
2155 if (ret)
2156 return ret;
2158 ret = run_transaction_hook(transaction, "prepared");
2159 if (ret) {
2160 ref_transaction_abort(transaction, err);
2161 die(_("ref updates aborted by hook"));
2164 return 0;
2167 int ref_transaction_abort(struct ref_transaction *transaction,
2168 struct strbuf *err)
2170 struct ref_store *refs = transaction->ref_store;
2171 int ret = 0;
2173 switch (transaction->state) {
2174 case REF_TRANSACTION_OPEN:
2175 /* No need to abort explicitly. */
2176 break;
2177 case REF_TRANSACTION_PREPARED:
2178 ret = refs->be->transaction_abort(refs, transaction, err);
2179 break;
2180 case REF_TRANSACTION_CLOSED:
2181 BUG("abort called on a closed reference transaction");
2182 break;
2183 default:
2184 BUG("unexpected reference transaction state");
2185 break;
2188 run_transaction_hook(transaction, "aborted");
2190 ref_transaction_free(transaction);
2191 return ret;
2194 int ref_transaction_commit(struct ref_transaction *transaction,
2195 struct strbuf *err)
2197 struct ref_store *refs = transaction->ref_store;
2198 int ret;
2200 switch (transaction->state) {
2201 case REF_TRANSACTION_OPEN:
2202 /* Need to prepare first. */
2203 ret = ref_transaction_prepare(transaction, err);
2204 if (ret)
2205 return ret;
2206 break;
2207 case REF_TRANSACTION_PREPARED:
2208 /* Fall through to finish. */
2209 break;
2210 case REF_TRANSACTION_CLOSED:
2211 BUG("commit called on a closed reference transaction");
2212 break;
2213 default:
2214 BUG("unexpected reference transaction state");
2215 break;
2218 ret = refs->be->transaction_finish(refs, transaction, err);
2219 if (!ret)
2220 run_transaction_hook(transaction, "committed");
2221 return ret;
2224 int refs_verify_refname_available(struct ref_store *refs,
2225 const char *refname,
2226 const struct string_list *extras,
2227 const struct string_list *skip,
2228 struct strbuf *err)
2230 const char *slash;
2231 const char *extra_refname;
2232 struct strbuf dirname = STRBUF_INIT;
2233 struct strbuf referent = STRBUF_INIT;
2234 struct object_id oid;
2235 unsigned int type;
2236 struct ref_iterator *iter;
2237 int ok;
2238 int ret = -1;
2241 * For the sake of comments in this function, suppose that
2242 * refname is "refs/foo/bar".
2245 assert(err);
2247 strbuf_grow(&dirname, strlen(refname) + 1);
2248 for (slash = strchr(refname, '/'); slash; slash = strchr(slash + 1, '/')) {
2250 * Just saying "Is a directory" when we e.g. can't
2251 * lock some multi-level ref isn't very informative,
2252 * the user won't be told *what* is a directory, so
2253 * let's not use strerror() below.
2255 int ignore_errno;
2256 /* Expand dirname to the new prefix, not including the trailing slash: */
2257 strbuf_add(&dirname, refname + dirname.len, slash - refname - dirname.len);
2260 * We are still at a leading dir of the refname (e.g.,
2261 * "refs/foo"; if there is a reference with that name,
2262 * it is a conflict, *unless* it is in skip.
2264 if (skip && string_list_has_string(skip, dirname.buf))
2265 continue;
2267 if (!refs_read_raw_ref(refs, dirname.buf, &oid, &referent,
2268 &type, &ignore_errno)) {
2269 strbuf_addf(err, _("'%s' exists; cannot create '%s'"),
2270 dirname.buf, refname);
2271 goto cleanup;
2274 if (extras && string_list_has_string(extras, dirname.buf)) {
2275 strbuf_addf(err, _("cannot process '%s' and '%s' at the same time"),
2276 refname, dirname.buf);
2277 goto cleanup;
2282 * We are at the leaf of our refname (e.g., "refs/foo/bar").
2283 * There is no point in searching for a reference with that
2284 * name, because a refname isn't considered to conflict with
2285 * itself. But we still need to check for references whose
2286 * names are in the "refs/foo/bar/" namespace, because they
2287 * *do* conflict.
2289 strbuf_addstr(&dirname, refname + dirname.len);
2290 strbuf_addch(&dirname, '/');
2292 iter = refs_ref_iterator_begin(refs, dirname.buf, 0,
2293 DO_FOR_EACH_INCLUDE_BROKEN);
2294 while ((ok = ref_iterator_advance(iter)) == ITER_OK) {
2295 if (skip &&
2296 string_list_has_string(skip, iter->refname))
2297 continue;
2299 strbuf_addf(err, _("'%s' exists; cannot create '%s'"),
2300 iter->refname, refname);
2301 ref_iterator_abort(iter);
2302 goto cleanup;
2305 if (ok != ITER_DONE)
2306 BUG("error while iterating over references");
2308 extra_refname = find_descendant_ref(dirname.buf, extras, skip);
2309 if (extra_refname)
2310 strbuf_addf(err, _("cannot process '%s' and '%s' at the same time"),
2311 refname, extra_refname);
2312 else
2313 ret = 0;
2315 cleanup:
2316 strbuf_release(&referent);
2317 strbuf_release(&dirname);
2318 return ret;
2321 int refs_for_each_reflog(struct ref_store *refs, each_ref_fn fn, void *cb_data)
2323 struct ref_iterator *iter;
2324 struct do_for_each_ref_help hp = { fn, cb_data };
2326 iter = refs->be->reflog_iterator_begin(refs);
2328 return do_for_each_repo_ref_iterator(the_repository, iter,
2329 do_for_each_ref_helper, &hp);
2332 int for_each_reflog(each_ref_fn fn, void *cb_data)
2334 return refs_for_each_reflog(get_main_ref_store(the_repository), fn, cb_data);
2337 int refs_for_each_reflog_ent_reverse(struct ref_store *refs,
2338 const char *refname,
2339 each_reflog_ent_fn fn,
2340 void *cb_data)
2342 return refs->be->for_each_reflog_ent_reverse(refs, refname,
2343 fn, cb_data);
2346 int for_each_reflog_ent_reverse(const char *refname, each_reflog_ent_fn fn,
2347 void *cb_data)
2349 return refs_for_each_reflog_ent_reverse(get_main_ref_store(the_repository),
2350 refname, fn, cb_data);
2353 int refs_for_each_reflog_ent(struct ref_store *refs, const char *refname,
2354 each_reflog_ent_fn fn, void *cb_data)
2356 return refs->be->for_each_reflog_ent(refs, refname, fn, cb_data);
2359 int for_each_reflog_ent(const char *refname, each_reflog_ent_fn fn,
2360 void *cb_data)
2362 return refs_for_each_reflog_ent(get_main_ref_store(the_repository), refname,
2363 fn, cb_data);
2366 int refs_reflog_exists(struct ref_store *refs, const char *refname)
2368 return refs->be->reflog_exists(refs, refname);
2371 int reflog_exists(const char *refname)
2373 return refs_reflog_exists(get_main_ref_store(the_repository), refname);
2376 int refs_create_reflog(struct ref_store *refs, const char *refname,
2377 struct strbuf *err)
2379 return refs->be->create_reflog(refs, refname, err);
2382 int safe_create_reflog(const char *refname, struct strbuf *err)
2384 return refs_create_reflog(get_main_ref_store(the_repository), refname,
2385 err);
2388 int refs_delete_reflog(struct ref_store *refs, const char *refname)
2390 return refs->be->delete_reflog(refs, refname);
2393 int delete_reflog(const char *refname)
2395 return refs_delete_reflog(get_main_ref_store(the_repository), refname);
2398 int refs_reflog_expire(struct ref_store *refs,
2399 const char *refname,
2400 unsigned int flags,
2401 reflog_expiry_prepare_fn prepare_fn,
2402 reflog_expiry_should_prune_fn should_prune_fn,
2403 reflog_expiry_cleanup_fn cleanup_fn,
2404 void *policy_cb_data)
2406 return refs->be->reflog_expire(refs, refname, flags,
2407 prepare_fn, should_prune_fn,
2408 cleanup_fn, policy_cb_data);
2411 int reflog_expire(const char *refname,
2412 unsigned int flags,
2413 reflog_expiry_prepare_fn prepare_fn,
2414 reflog_expiry_should_prune_fn should_prune_fn,
2415 reflog_expiry_cleanup_fn cleanup_fn,
2416 void *policy_cb_data)
2418 return refs_reflog_expire(get_main_ref_store(the_repository),
2419 refname, flags,
2420 prepare_fn, should_prune_fn,
2421 cleanup_fn, policy_cb_data);
2424 int initial_ref_transaction_commit(struct ref_transaction *transaction,
2425 struct strbuf *err)
2427 struct ref_store *refs = transaction->ref_store;
2429 return refs->be->initial_transaction_commit(refs, transaction, err);
2432 int refs_delete_refs(struct ref_store *refs, const char *logmsg,
2433 struct string_list *refnames, unsigned int flags)
2435 char *msg;
2436 int retval;
2438 msg = normalize_reflog_message(logmsg);
2439 retval = refs->be->delete_refs(refs, msg, refnames, flags);
2440 free(msg);
2441 return retval;
2444 int delete_refs(const char *msg, struct string_list *refnames,
2445 unsigned int flags)
2447 return refs_delete_refs(get_main_ref_store(the_repository), msg, refnames, flags);
2450 int refs_rename_ref(struct ref_store *refs, const char *oldref,
2451 const char *newref, const char *logmsg)
2453 char *msg;
2454 int retval;
2456 msg = normalize_reflog_message(logmsg);
2457 retval = refs->be->rename_ref(refs, oldref, newref, msg);
2458 free(msg);
2459 return retval;
2462 int rename_ref(const char *oldref, const char *newref, const char *logmsg)
2464 return refs_rename_ref(get_main_ref_store(the_repository), oldref, newref, logmsg);
2467 int refs_copy_existing_ref(struct ref_store *refs, const char *oldref,
2468 const char *newref, const char *logmsg)
2470 char *msg;
2471 int retval;
2473 msg = normalize_reflog_message(logmsg);
2474 retval = refs->be->copy_ref(refs, oldref, newref, msg);
2475 free(msg);
2476 return retval;
2479 int copy_existing_ref(const char *oldref, const char *newref, const char *logmsg)
2481 return refs_copy_existing_ref(get_main_ref_store(the_repository), oldref, newref, logmsg);