Merge branch 'rb/nonstop-lacks-uncompress2'
[git/debian.git] / refs.c
blobbd2546ae230dd614a4021537b2ad21956843f982
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;
1725 if (errno)
1726 *failure_errno = errno;
1728 /* In reading mode, refs must eventually resolve */
1729 if (resolve_flags & RESOLVE_REF_READING)
1730 return NULL;
1733 * Otherwise a missing ref is OK. But the files backend
1734 * may show errors besides ENOENT if there are
1735 * similarly-named refs.
1737 if (*failure_errno != ENOENT &&
1738 *failure_errno != EISDIR &&
1739 *failure_errno != ENOTDIR)
1740 return NULL;
1742 oidclr(oid);
1743 if (*flags & REF_BAD_NAME)
1744 *flags |= REF_ISBROKEN;
1745 return refname;
1748 *flags |= read_flags;
1750 if (!(read_flags & REF_ISSYMREF)) {
1751 if (*flags & REF_BAD_NAME) {
1752 oidclr(oid);
1753 *flags |= REF_ISBROKEN;
1755 return refname;
1758 refname = sb_refname.buf;
1759 if (resolve_flags & RESOLVE_REF_NO_RECURSE) {
1760 oidclr(oid);
1761 return refname;
1763 if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
1764 if (!(resolve_flags & RESOLVE_REF_ALLOW_BAD_NAME) ||
1765 !refname_is_safe(refname)) {
1766 *failure_errno = EINVAL;
1767 return NULL;
1770 *flags |= REF_ISBROKEN | REF_BAD_NAME;
1774 *failure_errno = ELOOP;
1775 return NULL;
1778 /* backend functions */
1779 int refs_init_db(struct strbuf *err)
1781 struct ref_store *refs = get_main_ref_store(the_repository);
1783 return refs->be->init_db(refs, err);
1786 const char *resolve_ref_unsafe(const char *refname, int resolve_flags,
1787 struct object_id *oid, int *flags)
1789 int ignore_errno;
1791 return refs_resolve_ref_unsafe(get_main_ref_store(the_repository), refname,
1792 resolve_flags, oid, flags, &ignore_errno);
1795 int resolve_gitlink_ref(const char *submodule, const char *refname,
1796 struct object_id *oid)
1798 struct ref_store *refs;
1799 int flags;
1800 int ignore_errno;
1802 refs = get_submodule_ref_store(submodule);
1804 if (!refs)
1805 return -1;
1807 if (!refs_resolve_ref_unsafe(refs, refname, 0, oid, &flags,
1808 &ignore_errno) || is_null_oid(oid))
1809 return -1;
1810 return 0;
1813 struct ref_store_hash_entry
1815 struct hashmap_entry ent;
1817 struct ref_store *refs;
1819 /* NUL-terminated identifier of the ref store: */
1820 char name[FLEX_ARRAY];
1823 static int ref_store_hash_cmp(const void *unused_cmp_data,
1824 const struct hashmap_entry *eptr,
1825 const struct hashmap_entry *entry_or_key,
1826 const void *keydata)
1828 const struct ref_store_hash_entry *e1, *e2;
1829 const char *name;
1831 e1 = container_of(eptr, const struct ref_store_hash_entry, ent);
1832 e2 = container_of(entry_or_key, const struct ref_store_hash_entry, ent);
1833 name = keydata ? keydata : e2->name;
1835 return strcmp(e1->name, name);
1838 static struct ref_store_hash_entry *alloc_ref_store_hash_entry(
1839 const char *name, struct ref_store *refs)
1841 struct ref_store_hash_entry *entry;
1843 FLEX_ALLOC_STR(entry, name, name);
1844 hashmap_entry_init(&entry->ent, strhash(name));
1845 entry->refs = refs;
1846 return entry;
1849 /* A hashmap of ref_stores, stored by submodule name: */
1850 static struct hashmap submodule_ref_stores;
1852 /* A hashmap of ref_stores, stored by worktree id: */
1853 static struct hashmap worktree_ref_stores;
1856 * Look up a ref store by name. If that ref_store hasn't been
1857 * registered yet, return NULL.
1859 static struct ref_store *lookup_ref_store_map(struct hashmap *map,
1860 const char *name)
1862 struct ref_store_hash_entry *entry;
1863 unsigned int hash;
1865 if (!map->tablesize)
1866 /* It's initialized on demand in register_ref_store(). */
1867 return NULL;
1869 hash = strhash(name);
1870 entry = hashmap_get_entry_from_hash(map, hash, name,
1871 struct ref_store_hash_entry, ent);
1872 return entry ? entry->refs : NULL;
1876 * Create, record, and return a ref_store instance for the specified
1877 * gitdir.
1879 static struct ref_store *ref_store_init(struct repository *repo,
1880 const char *gitdir,
1881 unsigned int flags)
1883 const char *be_name = "files";
1884 struct ref_storage_be *be = find_ref_storage_backend(be_name);
1885 struct ref_store *refs;
1887 if (!be)
1888 BUG("reference backend %s is unknown", be_name);
1890 refs = be->init(repo, gitdir, flags);
1891 return refs;
1894 struct ref_store *get_main_ref_store(struct repository *r)
1896 if (r->refs_private)
1897 return r->refs_private;
1899 if (!r->gitdir)
1900 BUG("attempting to get main_ref_store outside of repository");
1902 r->refs_private = ref_store_init(r, r->gitdir, REF_STORE_ALL_CAPS);
1903 r->refs_private = maybe_debug_wrap_ref_store(r->gitdir, r->refs_private);
1904 return r->refs_private;
1908 * Associate a ref store with a name. It is a fatal error to call this
1909 * function twice for the same name.
1911 static void register_ref_store_map(struct hashmap *map,
1912 const char *type,
1913 struct ref_store *refs,
1914 const char *name)
1916 struct ref_store_hash_entry *entry;
1918 if (!map->tablesize)
1919 hashmap_init(map, ref_store_hash_cmp, NULL, 0);
1921 entry = alloc_ref_store_hash_entry(name, refs);
1922 if (hashmap_put(map, &entry->ent))
1923 BUG("%s ref_store '%s' initialized twice", type, name);
1926 struct ref_store *get_submodule_ref_store(const char *submodule)
1928 struct strbuf submodule_sb = STRBUF_INIT;
1929 struct ref_store *refs;
1930 char *to_free = NULL;
1931 size_t len;
1932 struct repository *subrepo;
1934 if (!submodule)
1935 return NULL;
1937 len = strlen(submodule);
1938 while (len && is_dir_sep(submodule[len - 1]))
1939 len--;
1940 if (!len)
1941 return NULL;
1943 if (submodule[len])
1944 /* We need to strip off one or more trailing slashes */
1945 submodule = to_free = xmemdupz(submodule, len);
1947 refs = lookup_ref_store_map(&submodule_ref_stores, submodule);
1948 if (refs)
1949 goto done;
1951 strbuf_addstr(&submodule_sb, submodule);
1952 if (!is_nonbare_repository_dir(&submodule_sb))
1953 goto done;
1955 if (submodule_to_gitdir(&submodule_sb, submodule))
1956 goto done;
1958 subrepo = xmalloc(sizeof(*subrepo));
1960 * NEEDSWORK: Make get_submodule_ref_store() work with arbitrary
1961 * superprojects other than the_repository. This probably should be
1962 * done by making it take a struct repository * parameter instead of a
1963 * submodule path.
1965 if (repo_submodule_init(subrepo, the_repository, submodule,
1966 null_oid())) {
1967 free(subrepo);
1968 goto done;
1970 refs = ref_store_init(subrepo, submodule_sb.buf,
1971 REF_STORE_READ | REF_STORE_ODB);
1972 register_ref_store_map(&submodule_ref_stores, "submodule",
1973 refs, submodule);
1975 done:
1976 strbuf_release(&submodule_sb);
1977 free(to_free);
1979 return refs;
1982 struct ref_store *get_worktree_ref_store(const struct worktree *wt)
1984 struct ref_store *refs;
1985 const char *id;
1987 if (wt->is_current)
1988 return get_main_ref_store(the_repository);
1990 id = wt->id ? wt->id : "/";
1991 refs = lookup_ref_store_map(&worktree_ref_stores, id);
1992 if (refs)
1993 return refs;
1995 if (wt->id)
1996 refs = ref_store_init(the_repository,
1997 git_common_path("worktrees/%s", wt->id),
1998 REF_STORE_ALL_CAPS);
1999 else
2000 refs = ref_store_init(the_repository,
2001 get_git_common_dir(),
2002 REF_STORE_ALL_CAPS);
2004 if (refs)
2005 register_ref_store_map(&worktree_ref_stores, "worktree",
2006 refs, id);
2007 return refs;
2010 void base_ref_store_init(struct ref_store *refs, struct repository *repo,
2011 const char *path, const struct ref_storage_be *be)
2013 refs->be = be;
2014 refs->repo = repo;
2015 refs->gitdir = xstrdup(path);
2018 /* backend functions */
2019 int refs_pack_refs(struct ref_store *refs, unsigned int flags)
2021 return refs->be->pack_refs(refs, flags);
2024 int peel_iterated_oid(const struct object_id *base, struct object_id *peeled)
2026 if (current_ref_iter &&
2027 (current_ref_iter->oid == base ||
2028 oideq(current_ref_iter->oid, base)))
2029 return ref_iterator_peel(current_ref_iter, peeled);
2031 return peel_object(base, peeled) ? -1 : 0;
2034 int refs_create_symref(struct ref_store *refs,
2035 const char *ref_target,
2036 const char *refs_heads_master,
2037 const char *logmsg)
2039 char *msg;
2040 int retval;
2042 msg = normalize_reflog_message(logmsg);
2043 retval = refs->be->create_symref(refs, ref_target, refs_heads_master,
2044 msg);
2045 free(msg);
2046 return retval;
2049 int create_symref(const char *ref_target, const char *refs_heads_master,
2050 const char *logmsg)
2052 return refs_create_symref(get_main_ref_store(the_repository), ref_target,
2053 refs_heads_master, logmsg);
2056 int ref_update_reject_duplicates(struct string_list *refnames,
2057 struct strbuf *err)
2059 size_t i, n = refnames->nr;
2061 assert(err);
2063 for (i = 1; i < n; i++) {
2064 int cmp = strcmp(refnames->items[i - 1].string,
2065 refnames->items[i].string);
2067 if (!cmp) {
2068 strbuf_addf(err,
2069 _("multiple updates for ref '%s' not allowed"),
2070 refnames->items[i].string);
2071 return 1;
2072 } else if (cmp > 0) {
2073 BUG("ref_update_reject_duplicates() received unsorted list");
2076 return 0;
2079 static int run_transaction_hook(struct ref_transaction *transaction,
2080 const char *state)
2082 struct child_process proc = CHILD_PROCESS_INIT;
2083 struct strbuf buf = STRBUF_INIT;
2084 const char *hook;
2085 int ret = 0, i;
2087 hook = find_hook("reference-transaction");
2088 if (!hook)
2089 return ret;
2091 strvec_pushl(&proc.args, hook, state, NULL);
2092 proc.in = -1;
2093 proc.stdout_to_stderr = 1;
2094 proc.trace2_hook_name = "reference-transaction";
2096 ret = start_command(&proc);
2097 if (ret)
2098 return ret;
2100 sigchain_push(SIGPIPE, SIG_IGN);
2102 for (i = 0; i < transaction->nr; i++) {
2103 struct ref_update *update = transaction->updates[i];
2105 strbuf_reset(&buf);
2106 strbuf_addf(&buf, "%s %s %s\n",
2107 oid_to_hex(&update->old_oid),
2108 oid_to_hex(&update->new_oid),
2109 update->refname);
2111 if (write_in_full(proc.in, buf.buf, buf.len) < 0) {
2112 if (errno != EPIPE) {
2113 /* Don't leak errno outside this API */
2114 errno = 0;
2115 ret = -1;
2117 break;
2121 close(proc.in);
2122 sigchain_pop(SIGPIPE);
2123 strbuf_release(&buf);
2125 ret |= finish_command(&proc);
2126 return ret;
2129 int ref_transaction_prepare(struct ref_transaction *transaction,
2130 struct strbuf *err)
2132 struct ref_store *refs = transaction->ref_store;
2133 int ret;
2135 switch (transaction->state) {
2136 case REF_TRANSACTION_OPEN:
2137 /* Good. */
2138 break;
2139 case REF_TRANSACTION_PREPARED:
2140 BUG("prepare called twice on reference transaction");
2141 break;
2142 case REF_TRANSACTION_CLOSED:
2143 BUG("prepare called on a closed reference transaction");
2144 break;
2145 default:
2146 BUG("unexpected reference transaction state");
2147 break;
2150 if (refs->repo->objects->odb->disable_ref_updates) {
2151 strbuf_addstr(err,
2152 _("ref updates forbidden inside quarantine environment"));
2153 return -1;
2156 ret = refs->be->transaction_prepare(refs, transaction, err);
2157 if (ret)
2158 return ret;
2160 ret = run_transaction_hook(transaction, "prepared");
2161 if (ret) {
2162 ref_transaction_abort(transaction, err);
2163 die(_("ref updates aborted by hook"));
2166 return 0;
2169 int ref_transaction_abort(struct ref_transaction *transaction,
2170 struct strbuf *err)
2172 struct ref_store *refs = transaction->ref_store;
2173 int ret = 0;
2175 switch (transaction->state) {
2176 case REF_TRANSACTION_OPEN:
2177 /* No need to abort explicitly. */
2178 break;
2179 case REF_TRANSACTION_PREPARED:
2180 ret = refs->be->transaction_abort(refs, transaction, err);
2181 break;
2182 case REF_TRANSACTION_CLOSED:
2183 BUG("abort called on a closed reference transaction");
2184 break;
2185 default:
2186 BUG("unexpected reference transaction state");
2187 break;
2190 run_transaction_hook(transaction, "aborted");
2192 ref_transaction_free(transaction);
2193 return ret;
2196 int ref_transaction_commit(struct ref_transaction *transaction,
2197 struct strbuf *err)
2199 struct ref_store *refs = transaction->ref_store;
2200 int ret;
2202 switch (transaction->state) {
2203 case REF_TRANSACTION_OPEN:
2204 /* Need to prepare first. */
2205 ret = ref_transaction_prepare(transaction, err);
2206 if (ret)
2207 return ret;
2208 break;
2209 case REF_TRANSACTION_PREPARED:
2210 /* Fall through to finish. */
2211 break;
2212 case REF_TRANSACTION_CLOSED:
2213 BUG("commit called on a closed reference transaction");
2214 break;
2215 default:
2216 BUG("unexpected reference transaction state");
2217 break;
2220 ret = refs->be->transaction_finish(refs, transaction, err);
2221 if (!ret)
2222 run_transaction_hook(transaction, "committed");
2223 return ret;
2226 int refs_verify_refname_available(struct ref_store *refs,
2227 const char *refname,
2228 const struct string_list *extras,
2229 const struct string_list *skip,
2230 struct strbuf *err)
2232 const char *slash;
2233 const char *extra_refname;
2234 struct strbuf dirname = STRBUF_INIT;
2235 struct strbuf referent = STRBUF_INIT;
2236 struct object_id oid;
2237 unsigned int type;
2238 struct ref_iterator *iter;
2239 int ok;
2240 int ret = -1;
2243 * For the sake of comments in this function, suppose that
2244 * refname is "refs/foo/bar".
2247 assert(err);
2249 strbuf_grow(&dirname, strlen(refname) + 1);
2250 for (slash = strchr(refname, '/'); slash; slash = strchr(slash + 1, '/')) {
2252 * Just saying "Is a directory" when we e.g. can't
2253 * lock some multi-level ref isn't very informative,
2254 * the user won't be told *what* is a directory, so
2255 * let's not use strerror() below.
2257 int ignore_errno;
2258 /* Expand dirname to the new prefix, not including the trailing slash: */
2259 strbuf_add(&dirname, refname + dirname.len, slash - refname - dirname.len);
2262 * We are still at a leading dir of the refname (e.g.,
2263 * "refs/foo"; if there is a reference with that name,
2264 * it is a conflict, *unless* it is in skip.
2266 if (skip && string_list_has_string(skip, dirname.buf))
2267 continue;
2269 if (!refs_read_raw_ref(refs, dirname.buf, &oid, &referent,
2270 &type, &ignore_errno)) {
2271 strbuf_addf(err, _("'%s' exists; cannot create '%s'"),
2272 dirname.buf, refname);
2273 goto cleanup;
2276 if (extras && string_list_has_string(extras, dirname.buf)) {
2277 strbuf_addf(err, _("cannot process '%s' and '%s' at the same time"),
2278 refname, dirname.buf);
2279 goto cleanup;
2284 * We are at the leaf of our refname (e.g., "refs/foo/bar").
2285 * There is no point in searching for a reference with that
2286 * name, because a refname isn't considered to conflict with
2287 * itself. But we still need to check for references whose
2288 * names are in the "refs/foo/bar/" namespace, because they
2289 * *do* conflict.
2291 strbuf_addstr(&dirname, refname + dirname.len);
2292 strbuf_addch(&dirname, '/');
2294 iter = refs_ref_iterator_begin(refs, dirname.buf, 0,
2295 DO_FOR_EACH_INCLUDE_BROKEN);
2296 while ((ok = ref_iterator_advance(iter)) == ITER_OK) {
2297 if (skip &&
2298 string_list_has_string(skip, iter->refname))
2299 continue;
2301 strbuf_addf(err, _("'%s' exists; cannot create '%s'"),
2302 iter->refname, refname);
2303 ref_iterator_abort(iter);
2304 goto cleanup;
2307 if (ok != ITER_DONE)
2308 BUG("error while iterating over references");
2310 extra_refname = find_descendant_ref(dirname.buf, extras, skip);
2311 if (extra_refname)
2312 strbuf_addf(err, _("cannot process '%s' and '%s' at the same time"),
2313 refname, extra_refname);
2314 else
2315 ret = 0;
2317 cleanup:
2318 strbuf_release(&referent);
2319 strbuf_release(&dirname);
2320 return ret;
2323 int refs_for_each_reflog(struct ref_store *refs, each_ref_fn fn, void *cb_data)
2325 struct ref_iterator *iter;
2326 struct do_for_each_ref_help hp = { fn, cb_data };
2328 iter = refs->be->reflog_iterator_begin(refs);
2330 return do_for_each_repo_ref_iterator(the_repository, iter,
2331 do_for_each_ref_helper, &hp);
2334 int for_each_reflog(each_ref_fn fn, void *cb_data)
2336 return refs_for_each_reflog(get_main_ref_store(the_repository), fn, cb_data);
2339 int refs_for_each_reflog_ent_reverse(struct ref_store *refs,
2340 const char *refname,
2341 each_reflog_ent_fn fn,
2342 void *cb_data)
2344 return refs->be->for_each_reflog_ent_reverse(refs, refname,
2345 fn, cb_data);
2348 int for_each_reflog_ent_reverse(const char *refname, each_reflog_ent_fn fn,
2349 void *cb_data)
2351 return refs_for_each_reflog_ent_reverse(get_main_ref_store(the_repository),
2352 refname, fn, cb_data);
2355 int refs_for_each_reflog_ent(struct ref_store *refs, const char *refname,
2356 each_reflog_ent_fn fn, void *cb_data)
2358 return refs->be->for_each_reflog_ent(refs, refname, fn, cb_data);
2361 int for_each_reflog_ent(const char *refname, each_reflog_ent_fn fn,
2362 void *cb_data)
2364 return refs_for_each_reflog_ent(get_main_ref_store(the_repository), refname,
2365 fn, cb_data);
2368 int refs_reflog_exists(struct ref_store *refs, const char *refname)
2370 return refs->be->reflog_exists(refs, refname);
2373 int reflog_exists(const char *refname)
2375 return refs_reflog_exists(get_main_ref_store(the_repository), refname);
2378 int refs_create_reflog(struct ref_store *refs, const char *refname,
2379 struct strbuf *err)
2381 return refs->be->create_reflog(refs, refname, err);
2384 int safe_create_reflog(const char *refname, struct strbuf *err)
2386 return refs_create_reflog(get_main_ref_store(the_repository), refname,
2387 err);
2390 int refs_delete_reflog(struct ref_store *refs, const char *refname)
2392 return refs->be->delete_reflog(refs, refname);
2395 int delete_reflog(const char *refname)
2397 return refs_delete_reflog(get_main_ref_store(the_repository), refname);
2400 int refs_reflog_expire(struct ref_store *refs,
2401 const char *refname,
2402 unsigned int flags,
2403 reflog_expiry_prepare_fn prepare_fn,
2404 reflog_expiry_should_prune_fn should_prune_fn,
2405 reflog_expiry_cleanup_fn cleanup_fn,
2406 void *policy_cb_data)
2408 return refs->be->reflog_expire(refs, refname, flags,
2409 prepare_fn, should_prune_fn,
2410 cleanup_fn, policy_cb_data);
2413 int reflog_expire(const char *refname,
2414 unsigned int flags,
2415 reflog_expiry_prepare_fn prepare_fn,
2416 reflog_expiry_should_prune_fn should_prune_fn,
2417 reflog_expiry_cleanup_fn cleanup_fn,
2418 void *policy_cb_data)
2420 return refs_reflog_expire(get_main_ref_store(the_repository),
2421 refname, flags,
2422 prepare_fn, should_prune_fn,
2423 cleanup_fn, policy_cb_data);
2426 int initial_ref_transaction_commit(struct ref_transaction *transaction,
2427 struct strbuf *err)
2429 struct ref_store *refs = transaction->ref_store;
2431 return refs->be->initial_transaction_commit(refs, transaction, err);
2434 int refs_delete_refs(struct ref_store *refs, const char *logmsg,
2435 struct string_list *refnames, unsigned int flags)
2437 char *msg;
2438 int retval;
2440 msg = normalize_reflog_message(logmsg);
2441 retval = refs->be->delete_refs(refs, msg, refnames, flags);
2442 free(msg);
2443 return retval;
2446 int delete_refs(const char *msg, struct string_list *refnames,
2447 unsigned int flags)
2449 return refs_delete_refs(get_main_ref_store(the_repository), msg, refnames, flags);
2452 int refs_rename_ref(struct ref_store *refs, const char *oldref,
2453 const char *newref, const char *logmsg)
2455 char *msg;
2456 int retval;
2458 msg = normalize_reflog_message(logmsg);
2459 retval = refs->be->rename_ref(refs, oldref, newref, msg);
2460 free(msg);
2461 return retval;
2464 int rename_ref(const char *oldref, const char *newref, const char *logmsg)
2466 return refs_rename_ref(get_main_ref_store(the_repository), oldref, newref, logmsg);
2469 int refs_copy_existing_ref(struct ref_store *refs, const char *oldref,
2470 const char *newref, const char *logmsg)
2472 char *msg;
2473 int retval;
2475 msg = normalize_reflog_message(logmsg);
2476 retval = refs->be->copy_ref(refs, oldref, newref, msg);
2477 free(msg);
2478 return retval;
2481 int copy_existing_ref(const char *oldref, const char *newref, const char *logmsg)
2483 return refs_copy_existing_ref(get_main_ref_store(the_repository), oldref, newref, logmsg);