refs: add interface to iterate over queued transactional updates
[git.git] / refs.c
blob7dc6c35ebc8dc59fd6f7f0fb4ed23f12ca46d207
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;
273 result = refs_resolve_ref_unsafe(refs, refname, resolve_flags,
274 oid, flags);
275 return xstrdup_or_null(result);
278 char *resolve_refdup(const char *refname, int resolve_flags,
279 struct object_id *oid, int *flags)
281 return refs_resolve_refdup(get_main_ref_store(the_repository),
282 refname, resolve_flags,
283 oid, flags);
286 /* The argument to filter_refs */
287 struct ref_filter {
288 const char *pattern;
289 const char *prefix;
290 each_ref_fn *fn;
291 void *cb_data;
294 int read_ref_full(const char *refname, int resolve_flags, struct object_id *oid, int *flags)
296 struct ref_store *refs = get_main_ref_store(the_repository);
298 if (refs_resolve_ref_unsafe(refs, refname, resolve_flags,
299 oid, flags))
300 return 0;
301 return -1;
304 int read_ref(const char *refname, struct object_id *oid)
306 return read_ref_full(refname, RESOLVE_REF_READING, oid, NULL);
309 int refs_ref_exists(struct ref_store *refs, const char *refname)
311 return !!refs_resolve_ref_unsafe(refs, refname, RESOLVE_REF_READING,
312 NULL, NULL);
315 int ref_exists(const char *refname)
317 return refs_ref_exists(get_main_ref_store(the_repository), refname);
320 static int filter_refs(const char *refname, const struct object_id *oid,
321 int flags, void *data)
323 struct ref_filter *filter = (struct ref_filter *)data;
325 if (wildmatch(filter->pattern, refname, 0))
326 return 0;
327 if (filter->prefix)
328 skip_prefix(refname, filter->prefix, &refname);
329 return filter->fn(refname, oid, flags, filter->cb_data);
332 enum peel_status peel_object(const struct object_id *name, struct object_id *oid)
334 struct object *o = lookup_unknown_object(the_repository, name);
336 if (o->type == OBJ_NONE) {
337 int type = oid_object_info(the_repository, name, NULL);
338 if (type < 0 || !object_as_type(o, type, 0))
339 return PEEL_INVALID;
342 if (o->type != OBJ_TAG)
343 return PEEL_NON_TAG;
345 o = deref_tag_noverify(o);
346 if (!o)
347 return PEEL_INVALID;
349 oidcpy(oid, &o->oid);
350 return PEEL_PEELED;
353 struct warn_if_dangling_data {
354 FILE *fp;
355 const char *refname;
356 const struct string_list *refnames;
357 const char *msg_fmt;
360 static int warn_if_dangling_symref(const char *refname, const struct object_id *oid,
361 int flags, void *cb_data)
363 struct warn_if_dangling_data *d = cb_data;
364 const char *resolves_to;
366 if (!(flags & REF_ISSYMREF))
367 return 0;
369 resolves_to = resolve_ref_unsafe(refname, 0, NULL, NULL);
370 if (!resolves_to
371 || (d->refname
372 ? strcmp(resolves_to, d->refname)
373 : !string_list_has_string(d->refnames, resolves_to))) {
374 return 0;
377 fprintf(d->fp, d->msg_fmt, refname);
378 fputc('\n', d->fp);
379 return 0;
382 void warn_dangling_symref(FILE *fp, const char *msg_fmt, const char *refname)
384 struct warn_if_dangling_data data;
386 data.fp = fp;
387 data.refname = refname;
388 data.refnames = NULL;
389 data.msg_fmt = msg_fmt;
390 for_each_rawref(warn_if_dangling_symref, &data);
393 void warn_dangling_symrefs(FILE *fp, const char *msg_fmt, const struct string_list *refnames)
395 struct warn_if_dangling_data data;
397 data.fp = fp;
398 data.refname = NULL;
399 data.refnames = refnames;
400 data.msg_fmt = msg_fmt;
401 for_each_rawref(warn_if_dangling_symref, &data);
404 int refs_for_each_tag_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
406 return refs_for_each_ref_in(refs, "refs/tags/", fn, cb_data);
409 int for_each_tag_ref(each_ref_fn fn, void *cb_data)
411 return refs_for_each_tag_ref(get_main_ref_store(the_repository), fn, cb_data);
414 int refs_for_each_branch_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
416 return refs_for_each_ref_in(refs, "refs/heads/", fn, cb_data);
419 int for_each_branch_ref(each_ref_fn fn, void *cb_data)
421 return refs_for_each_branch_ref(get_main_ref_store(the_repository), fn, cb_data);
424 int refs_for_each_remote_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
426 return refs_for_each_ref_in(refs, "refs/remotes/", fn, cb_data);
429 int for_each_remote_ref(each_ref_fn fn, void *cb_data)
431 return refs_for_each_remote_ref(get_main_ref_store(the_repository), fn, cb_data);
434 int head_ref_namespaced(each_ref_fn fn, void *cb_data)
436 struct strbuf buf = STRBUF_INIT;
437 int ret = 0;
438 struct object_id oid;
439 int flag;
441 strbuf_addf(&buf, "%sHEAD", get_git_namespace());
442 if (!read_ref_full(buf.buf, RESOLVE_REF_READING, &oid, &flag))
443 ret = fn(buf.buf, &oid, flag, cb_data);
444 strbuf_release(&buf);
446 return ret;
449 void normalize_glob_ref(struct string_list_item *item, const char *prefix,
450 const char *pattern)
452 struct strbuf normalized_pattern = STRBUF_INIT;
454 if (*pattern == '/')
455 BUG("pattern must not start with '/'");
457 if (prefix) {
458 strbuf_addstr(&normalized_pattern, prefix);
460 else if (!starts_with(pattern, "refs/"))
461 strbuf_addstr(&normalized_pattern, "refs/");
462 strbuf_addstr(&normalized_pattern, pattern);
463 strbuf_strip_suffix(&normalized_pattern, "/");
465 item->string = strbuf_detach(&normalized_pattern, NULL);
466 item->util = has_glob_specials(pattern) ? NULL : item->string;
467 strbuf_release(&normalized_pattern);
470 int for_each_glob_ref_in(each_ref_fn fn, const char *pattern,
471 const char *prefix, void *cb_data)
473 struct strbuf real_pattern = STRBUF_INIT;
474 struct ref_filter filter;
475 int ret;
477 if (!prefix && !starts_with(pattern, "refs/"))
478 strbuf_addstr(&real_pattern, "refs/");
479 else if (prefix)
480 strbuf_addstr(&real_pattern, prefix);
481 strbuf_addstr(&real_pattern, pattern);
483 if (!has_glob_specials(pattern)) {
484 /* Append implied '/' '*' if not present. */
485 strbuf_complete(&real_pattern, '/');
486 /* No need to check for '*', there is none. */
487 strbuf_addch(&real_pattern, '*');
490 filter.pattern = real_pattern.buf;
491 filter.prefix = prefix;
492 filter.fn = fn;
493 filter.cb_data = cb_data;
494 ret = for_each_ref(filter_refs, &filter);
496 strbuf_release(&real_pattern);
497 return ret;
500 int for_each_glob_ref(each_ref_fn fn, const char *pattern, void *cb_data)
502 return for_each_glob_ref_in(fn, pattern, NULL, cb_data);
505 const char *prettify_refname(const char *name)
507 if (skip_prefix(name, "refs/heads/", &name) ||
508 skip_prefix(name, "refs/tags/", &name) ||
509 skip_prefix(name, "refs/remotes/", &name))
510 ; /* nothing */
511 return name;
514 static const char *ref_rev_parse_rules[] = {
515 "%.*s",
516 "refs/%.*s",
517 "refs/tags/%.*s",
518 "refs/heads/%.*s",
519 "refs/remotes/%.*s",
520 "refs/remotes/%.*s/HEAD",
521 NULL
524 #define NUM_REV_PARSE_RULES (ARRAY_SIZE(ref_rev_parse_rules) - 1)
527 * Is it possible that the caller meant full_name with abbrev_name?
528 * If so return a non-zero value to signal "yes"; the magnitude of
529 * the returned value gives the precedence used for disambiguation.
531 * If abbrev_name cannot mean full_name, return 0.
533 int refname_match(const char *abbrev_name, const char *full_name)
535 const char **p;
536 const int abbrev_name_len = strlen(abbrev_name);
537 const int num_rules = NUM_REV_PARSE_RULES;
539 for (p = ref_rev_parse_rules; *p; p++)
540 if (!strcmp(full_name, mkpath(*p, abbrev_name_len, abbrev_name)))
541 return &ref_rev_parse_rules[num_rules] - p;
543 return 0;
547 * Given a 'prefix' expand it by the rules in 'ref_rev_parse_rules' and add
548 * the results to 'prefixes'
550 void expand_ref_prefix(struct strvec *prefixes, const char *prefix)
552 const char **p;
553 int len = strlen(prefix);
555 for (p = ref_rev_parse_rules; *p; p++)
556 strvec_pushf(prefixes, *p, len, prefix);
559 static const char default_branch_name_advice[] = N_(
560 "Using '%s' as the name for the initial branch. This default branch name\n"
561 "is subject to change. To configure the initial branch name to use in all\n"
562 "of your new repositories, which will suppress this warning, call:\n"
563 "\n"
564 "\tgit config --global init.defaultBranch <name>\n"
565 "\n"
566 "Names commonly chosen instead of 'master' are 'main', 'trunk' and\n"
567 "'development'. The just-created branch can be renamed via this command:\n"
568 "\n"
569 "\tgit branch -m <name>\n"
572 char *repo_default_branch_name(struct repository *r, int quiet)
574 const char *config_key = "init.defaultbranch";
575 const char *config_display_key = "init.defaultBranch";
576 char *ret = NULL, *full_ref;
577 const char *env = getenv("GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME");
579 if (env && *env)
580 ret = xstrdup(env);
581 else if (repo_config_get_string(r, config_key, &ret) < 0)
582 die(_("could not retrieve `%s`"), config_display_key);
584 if (!ret) {
585 ret = xstrdup("master");
586 if (!quiet)
587 advise(_(default_branch_name_advice), ret);
590 full_ref = xstrfmt("refs/heads/%s", ret);
591 if (check_refname_format(full_ref, 0))
592 die(_("invalid branch name: %s = %s"), config_display_key, ret);
593 free(full_ref);
595 return ret;
598 const char *git_default_branch_name(int quiet)
600 static char *ret;
602 if (!ret)
603 ret = repo_default_branch_name(the_repository, quiet);
605 return ret;
609 * *string and *len will only be substituted, and *string returned (for
610 * later free()ing) if the string passed in is a magic short-hand form
611 * to name a branch.
613 static char *substitute_branch_name(struct repository *r,
614 const char **string, int *len,
615 int nonfatal_dangling_mark)
617 struct strbuf buf = STRBUF_INIT;
618 struct interpret_branch_name_options options = {
619 .nonfatal_dangling_mark = nonfatal_dangling_mark
621 int ret = repo_interpret_branch_name(r, *string, *len, &buf, &options);
623 if (ret == *len) {
624 size_t size;
625 *string = strbuf_detach(&buf, &size);
626 *len = size;
627 return (char *)*string;
630 return NULL;
633 int repo_dwim_ref(struct repository *r, const char *str, int len,
634 struct object_id *oid, char **ref, int nonfatal_dangling_mark)
636 char *last_branch = substitute_branch_name(r, &str, &len,
637 nonfatal_dangling_mark);
638 int refs_found = expand_ref(r, str, len, oid, ref);
639 free(last_branch);
640 return refs_found;
643 int expand_ref(struct repository *repo, const char *str, int len,
644 struct object_id *oid, char **ref)
646 const char **p, *r;
647 int refs_found = 0;
648 struct strbuf fullref = STRBUF_INIT;
650 *ref = NULL;
651 for (p = ref_rev_parse_rules; *p; p++) {
652 struct object_id oid_from_ref;
653 struct object_id *this_result;
654 int flag;
655 struct ref_store *refs = get_main_ref_store(repo);
657 this_result = refs_found ? &oid_from_ref : oid;
658 strbuf_reset(&fullref);
659 strbuf_addf(&fullref, *p, len, str);
660 r = refs_resolve_ref_unsafe(refs, fullref.buf,
661 RESOLVE_REF_READING,
662 this_result, &flag);
663 if (r) {
664 if (!refs_found++)
665 *ref = xstrdup(r);
666 if (!warn_ambiguous_refs)
667 break;
668 } else if ((flag & REF_ISSYMREF) && strcmp(fullref.buf, "HEAD")) {
669 warning(_("ignoring dangling symref %s"), fullref.buf);
670 } else if ((flag & REF_ISBROKEN) && strchr(fullref.buf, '/')) {
671 warning(_("ignoring broken ref %s"), fullref.buf);
674 strbuf_release(&fullref);
675 return refs_found;
678 int repo_dwim_log(struct repository *r, const char *str, int len,
679 struct object_id *oid, char **log)
681 struct ref_store *refs = get_main_ref_store(r);
682 char *last_branch = substitute_branch_name(r, &str, &len, 0);
683 const char **p;
684 int logs_found = 0;
685 struct strbuf path = STRBUF_INIT;
687 *log = NULL;
688 for (p = ref_rev_parse_rules; *p; p++) {
689 struct object_id hash;
690 const char *ref, *it;
692 strbuf_reset(&path);
693 strbuf_addf(&path, *p, len, str);
694 ref = refs_resolve_ref_unsafe(refs, path.buf,
695 RESOLVE_REF_READING,
696 oid ? &hash : NULL, NULL);
697 if (!ref)
698 continue;
699 if (refs_reflog_exists(refs, path.buf))
700 it = path.buf;
701 else if (strcmp(ref, path.buf) &&
702 refs_reflog_exists(refs, ref))
703 it = ref;
704 else
705 continue;
706 if (!logs_found++) {
707 *log = xstrdup(it);
708 if (oid)
709 oidcpy(oid, &hash);
711 if (!warn_ambiguous_refs)
712 break;
714 strbuf_release(&path);
715 free(last_branch);
716 return logs_found;
719 int dwim_log(const char *str, int len, struct object_id *oid, char **log)
721 return repo_dwim_log(the_repository, str, len, oid, log);
724 static int is_per_worktree_ref(const char *refname)
726 return starts_with(refname, "refs/worktree/") ||
727 starts_with(refname, "refs/bisect/") ||
728 starts_with(refname, "refs/rewritten/");
731 static int is_pseudoref_syntax(const char *refname)
733 const char *c;
735 for (c = refname; *c; c++) {
736 if (!isupper(*c) && *c != '-' && *c != '_')
737 return 0;
740 return 1;
743 static int is_main_pseudoref_syntax(const char *refname)
745 return skip_prefix(refname, "main-worktree/", &refname) &&
746 *refname &&
747 is_pseudoref_syntax(refname);
750 static int is_other_pseudoref_syntax(const char *refname)
752 if (!skip_prefix(refname, "worktrees/", &refname))
753 return 0;
754 refname = strchr(refname, '/');
755 if (!refname || !refname[1])
756 return 0;
757 return is_pseudoref_syntax(refname + 1);
760 enum ref_type ref_type(const char *refname)
762 if (is_per_worktree_ref(refname))
763 return REF_TYPE_PER_WORKTREE;
764 if (is_pseudoref_syntax(refname))
765 return REF_TYPE_PSEUDOREF;
766 if (is_main_pseudoref_syntax(refname))
767 return REF_TYPE_MAIN_PSEUDOREF;
768 if (is_other_pseudoref_syntax(refname))
769 return REF_TYPE_OTHER_PSEUDOREF;
770 return REF_TYPE_NORMAL;
773 long get_files_ref_lock_timeout_ms(void)
775 static int configured = 0;
777 /* The default timeout is 100 ms: */
778 static int timeout_ms = 100;
780 if (!configured) {
781 git_config_get_int("core.filesreflocktimeout", &timeout_ms);
782 configured = 1;
785 return timeout_ms;
788 int refs_delete_ref(struct ref_store *refs, const char *msg,
789 const char *refname,
790 const struct object_id *old_oid,
791 unsigned int flags)
793 struct ref_transaction *transaction;
794 struct strbuf err = STRBUF_INIT;
796 transaction = ref_store_transaction_begin(refs, &err);
797 if (!transaction ||
798 ref_transaction_delete(transaction, refname, old_oid,
799 flags, msg, &err) ||
800 ref_transaction_commit(transaction, &err)) {
801 error("%s", err.buf);
802 ref_transaction_free(transaction);
803 strbuf_release(&err);
804 return 1;
806 ref_transaction_free(transaction);
807 strbuf_release(&err);
808 return 0;
811 int delete_ref(const char *msg, const char *refname,
812 const struct object_id *old_oid, unsigned int flags)
814 return refs_delete_ref(get_main_ref_store(the_repository), msg, refname,
815 old_oid, flags);
818 static void copy_reflog_msg(struct strbuf *sb, const char *msg)
820 char c;
821 int wasspace = 1;
823 while ((c = *msg++)) {
824 if (wasspace && isspace(c))
825 continue;
826 wasspace = isspace(c);
827 if (wasspace)
828 c = ' ';
829 strbuf_addch(sb, c);
831 strbuf_rtrim(sb);
834 static char *normalize_reflog_message(const char *msg)
836 struct strbuf sb = STRBUF_INIT;
838 if (msg && *msg)
839 copy_reflog_msg(&sb, msg);
840 return strbuf_detach(&sb, NULL);
843 int should_autocreate_reflog(const char *refname)
845 switch (log_all_ref_updates) {
846 case LOG_REFS_ALWAYS:
847 return 1;
848 case LOG_REFS_NORMAL:
849 return starts_with(refname, "refs/heads/") ||
850 starts_with(refname, "refs/remotes/") ||
851 starts_with(refname, "refs/notes/") ||
852 !strcmp(refname, "HEAD");
853 default:
854 return 0;
858 int is_branch(const char *refname)
860 return !strcmp(refname, "HEAD") || starts_with(refname, "refs/heads/");
863 struct read_ref_at_cb {
864 const char *refname;
865 timestamp_t at_time;
866 int cnt;
867 int reccnt;
868 struct object_id *oid;
869 int found_it;
871 struct object_id ooid;
872 struct object_id noid;
873 int tz;
874 timestamp_t date;
875 char **msg;
876 timestamp_t *cutoff_time;
877 int *cutoff_tz;
878 int *cutoff_cnt;
881 static void set_read_ref_cutoffs(struct read_ref_at_cb *cb,
882 timestamp_t timestamp, int tz, const char *message)
884 if (cb->msg)
885 *cb->msg = xstrdup(message);
886 if (cb->cutoff_time)
887 *cb->cutoff_time = timestamp;
888 if (cb->cutoff_tz)
889 *cb->cutoff_tz = tz;
890 if (cb->cutoff_cnt)
891 *cb->cutoff_cnt = cb->reccnt;
894 static int read_ref_at_ent(struct object_id *ooid, struct object_id *noid,
895 const char *email, timestamp_t timestamp, int tz,
896 const char *message, void *cb_data)
898 struct read_ref_at_cb *cb = cb_data;
899 int reached_count;
901 cb->tz = tz;
902 cb->date = timestamp;
905 * It is not possible for cb->cnt == 0 on the first iteration because
906 * that special case is handled in read_ref_at().
908 if (cb->cnt > 0)
909 cb->cnt--;
910 reached_count = cb->cnt == 0 && !is_null_oid(ooid);
911 if (timestamp <= cb->at_time || reached_count) {
912 set_read_ref_cutoffs(cb, timestamp, tz, message);
914 * we have not yet updated cb->[n|o]oid so they still
915 * hold the values for the previous record.
917 if (!is_null_oid(&cb->ooid) && !oideq(&cb->ooid, noid))
918 warning(_("log for ref %s has gap after %s"),
919 cb->refname, show_date(cb->date, cb->tz, DATE_MODE(RFC2822)));
920 if (reached_count)
921 oidcpy(cb->oid, ooid);
922 else if (!is_null_oid(&cb->ooid) || cb->date == cb->at_time)
923 oidcpy(cb->oid, noid);
924 else if (!oideq(noid, cb->oid))
925 warning(_("log for ref %s unexpectedly ended on %s"),
926 cb->refname, show_date(cb->date, cb->tz,
927 DATE_MODE(RFC2822)));
928 cb->found_it = 1;
930 cb->reccnt++;
931 oidcpy(&cb->ooid, ooid);
932 oidcpy(&cb->noid, noid);
933 return cb->found_it;
936 static int read_ref_at_ent_newest(struct object_id *ooid, struct object_id *noid,
937 const char *email, timestamp_t timestamp,
938 int tz, const char *message, void *cb_data)
940 struct read_ref_at_cb *cb = cb_data;
942 set_read_ref_cutoffs(cb, timestamp, tz, message);
943 oidcpy(cb->oid, noid);
944 /* We just want the first entry */
945 return 1;
948 static int read_ref_at_ent_oldest(struct object_id *ooid, struct object_id *noid,
949 const char *email, timestamp_t timestamp,
950 int tz, const char *message, void *cb_data)
952 struct read_ref_at_cb *cb = cb_data;
954 set_read_ref_cutoffs(cb, timestamp, tz, message);
955 oidcpy(cb->oid, ooid);
956 if (is_null_oid(cb->oid))
957 oidcpy(cb->oid, noid);
958 /* We just want the first entry */
959 return 1;
962 int read_ref_at(struct ref_store *refs, const char *refname,
963 unsigned int flags, timestamp_t at_time, int cnt,
964 struct object_id *oid, char **msg,
965 timestamp_t *cutoff_time, int *cutoff_tz, int *cutoff_cnt)
967 struct read_ref_at_cb cb;
969 memset(&cb, 0, sizeof(cb));
970 cb.refname = refname;
971 cb.at_time = at_time;
972 cb.cnt = cnt;
973 cb.msg = msg;
974 cb.cutoff_time = cutoff_time;
975 cb.cutoff_tz = cutoff_tz;
976 cb.cutoff_cnt = cutoff_cnt;
977 cb.oid = oid;
979 if (cb.cnt == 0) {
980 refs_for_each_reflog_ent_reverse(refs, refname, read_ref_at_ent_newest, &cb);
981 return 0;
984 refs_for_each_reflog_ent_reverse(refs, refname, read_ref_at_ent, &cb);
986 if (!cb.reccnt) {
987 if (flags & GET_OID_QUIETLY)
988 exit(128);
989 else
990 die(_("log for %s is empty"), refname);
992 if (cb.found_it)
993 return 0;
995 refs_for_each_reflog_ent(refs, refname, read_ref_at_ent_oldest, &cb);
997 return 1;
1000 struct ref_transaction *ref_store_transaction_begin(struct ref_store *refs,
1001 struct strbuf *err)
1003 struct ref_transaction *tr;
1004 assert(err);
1006 CALLOC_ARRAY(tr, 1);
1007 tr->ref_store = refs;
1008 return tr;
1011 struct ref_transaction *ref_transaction_begin(struct strbuf *err)
1013 return ref_store_transaction_begin(get_main_ref_store(the_repository), err);
1016 void ref_transaction_free(struct ref_transaction *transaction)
1018 size_t i;
1020 if (!transaction)
1021 return;
1023 switch (transaction->state) {
1024 case REF_TRANSACTION_OPEN:
1025 case REF_TRANSACTION_CLOSED:
1026 /* OK */
1027 break;
1028 case REF_TRANSACTION_PREPARED:
1029 BUG("free called on a prepared reference transaction");
1030 break;
1031 default:
1032 BUG("unexpected reference transaction state");
1033 break;
1036 for (i = 0; i < transaction->nr; i++) {
1037 free(transaction->updates[i]->msg);
1038 free(transaction->updates[i]);
1040 free(transaction->updates);
1041 free(transaction);
1044 struct ref_update *ref_transaction_add_update(
1045 struct ref_transaction *transaction,
1046 const char *refname, unsigned int flags,
1047 const struct object_id *new_oid,
1048 const struct object_id *old_oid,
1049 const char *msg)
1051 struct ref_update *update;
1053 if (transaction->state != REF_TRANSACTION_OPEN)
1054 BUG("update called for transaction that is not open");
1056 FLEX_ALLOC_STR(update, refname, refname);
1057 ALLOC_GROW(transaction->updates, transaction->nr + 1, transaction->alloc);
1058 transaction->updates[transaction->nr++] = update;
1060 update->flags = flags;
1062 if (flags & REF_HAVE_NEW)
1063 oidcpy(&update->new_oid, new_oid);
1064 if (flags & REF_HAVE_OLD)
1065 oidcpy(&update->old_oid, old_oid);
1066 update->msg = normalize_reflog_message(msg);
1067 return update;
1070 int ref_transaction_update(struct ref_transaction *transaction,
1071 const char *refname,
1072 const struct object_id *new_oid,
1073 const struct object_id *old_oid,
1074 unsigned int flags, const char *msg,
1075 struct strbuf *err)
1077 assert(err);
1079 if (!(flags & REF_SKIP_REFNAME_VERIFICATION) &&
1080 ((new_oid && !is_null_oid(new_oid)) ?
1081 check_refname_format(refname, REFNAME_ALLOW_ONELEVEL) :
1082 !refname_is_safe(refname))) {
1083 strbuf_addf(err, _("refusing to update ref with bad name '%s'"),
1084 refname);
1085 return -1;
1088 if (flags & ~REF_TRANSACTION_UPDATE_ALLOWED_FLAGS)
1089 BUG("illegal flags 0x%x passed to ref_transaction_update()", flags);
1092 * Clear flags outside the allowed set; this should be a noop because
1093 * of the BUG() check above, but it works around a -Wnonnull warning
1094 * with some versions of "gcc -O3".
1096 flags &= REF_TRANSACTION_UPDATE_ALLOWED_FLAGS;
1098 flags |= (new_oid ? REF_HAVE_NEW : 0) | (old_oid ? REF_HAVE_OLD : 0);
1100 ref_transaction_add_update(transaction, refname, flags,
1101 new_oid, old_oid, msg);
1102 return 0;
1105 int ref_transaction_create(struct ref_transaction *transaction,
1106 const char *refname,
1107 const struct object_id *new_oid,
1108 unsigned int flags, const char *msg,
1109 struct strbuf *err)
1111 if (!new_oid || is_null_oid(new_oid))
1112 BUG("create called without valid new_oid");
1113 return ref_transaction_update(transaction, refname, new_oid,
1114 null_oid(), flags, msg, err);
1117 int ref_transaction_delete(struct ref_transaction *transaction,
1118 const char *refname,
1119 const struct object_id *old_oid,
1120 unsigned int flags, const char *msg,
1121 struct strbuf *err)
1123 if (old_oid && is_null_oid(old_oid))
1124 BUG("delete called with old_oid set to zeros");
1125 return ref_transaction_update(transaction, refname,
1126 null_oid(), old_oid,
1127 flags, msg, err);
1130 int ref_transaction_verify(struct ref_transaction *transaction,
1131 const char *refname,
1132 const struct object_id *old_oid,
1133 unsigned int flags,
1134 struct strbuf *err)
1136 if (!old_oid)
1137 BUG("verify called with old_oid set to NULL");
1138 return ref_transaction_update(transaction, refname,
1139 NULL, old_oid,
1140 flags, NULL, err);
1143 int refs_update_ref(struct ref_store *refs, const char *msg,
1144 const char *refname, const struct object_id *new_oid,
1145 const struct object_id *old_oid, unsigned int flags,
1146 enum action_on_err onerr)
1148 struct ref_transaction *t = NULL;
1149 struct strbuf err = STRBUF_INIT;
1150 int ret = 0;
1152 t = ref_store_transaction_begin(refs, &err);
1153 if (!t ||
1154 ref_transaction_update(t, refname, new_oid, old_oid, flags, msg,
1155 &err) ||
1156 ref_transaction_commit(t, &err)) {
1157 ret = 1;
1158 ref_transaction_free(t);
1160 if (ret) {
1161 const char *str = _("update_ref failed for ref '%s': %s");
1163 switch (onerr) {
1164 case UPDATE_REFS_MSG_ON_ERR:
1165 error(str, refname, err.buf);
1166 break;
1167 case UPDATE_REFS_DIE_ON_ERR:
1168 die(str, refname, err.buf);
1169 break;
1170 case UPDATE_REFS_QUIET_ON_ERR:
1171 break;
1173 strbuf_release(&err);
1174 return 1;
1176 strbuf_release(&err);
1177 if (t)
1178 ref_transaction_free(t);
1179 return 0;
1182 int update_ref(const char *msg, const char *refname,
1183 const struct object_id *new_oid,
1184 const struct object_id *old_oid,
1185 unsigned int flags, enum action_on_err onerr)
1187 return refs_update_ref(get_main_ref_store(the_repository), msg, refname, new_oid,
1188 old_oid, flags, onerr);
1191 char *refs_shorten_unambiguous_ref(struct ref_store *refs,
1192 const char *refname, int strict)
1194 int i;
1195 static char **scanf_fmts;
1196 static int nr_rules;
1197 char *short_name;
1198 struct strbuf resolved_buf = STRBUF_INIT;
1200 if (!nr_rules) {
1202 * Pre-generate scanf formats from ref_rev_parse_rules[].
1203 * Generate a format suitable for scanf from a
1204 * ref_rev_parse_rules rule by interpolating "%s" at the
1205 * location of the "%.*s".
1207 size_t total_len = 0;
1208 size_t offset = 0;
1210 /* the rule list is NULL terminated, count them first */
1211 for (nr_rules = 0; ref_rev_parse_rules[nr_rules]; nr_rules++)
1212 /* -2 for strlen("%.*s") - strlen("%s"); +1 for NUL */
1213 total_len += strlen(ref_rev_parse_rules[nr_rules]) - 2 + 1;
1215 scanf_fmts = xmalloc(st_add(st_mult(sizeof(char *), nr_rules), total_len));
1217 offset = 0;
1218 for (i = 0; i < nr_rules; i++) {
1219 assert(offset < total_len);
1220 scanf_fmts[i] = (char *)&scanf_fmts[nr_rules] + offset;
1221 offset += xsnprintf(scanf_fmts[i], total_len - offset,
1222 ref_rev_parse_rules[i], 2, "%s") + 1;
1226 /* bail out if there are no rules */
1227 if (!nr_rules)
1228 return xstrdup(refname);
1230 /* buffer for scanf result, at most refname must fit */
1231 short_name = xstrdup(refname);
1233 /* skip first rule, it will always match */
1234 for (i = nr_rules - 1; i > 0 ; --i) {
1235 int j;
1236 int rules_to_fail = i;
1237 int short_name_len;
1239 if (1 != sscanf(refname, scanf_fmts[i], short_name))
1240 continue;
1242 short_name_len = strlen(short_name);
1245 * in strict mode, all (except the matched one) rules
1246 * must fail to resolve to a valid non-ambiguous ref
1248 if (strict)
1249 rules_to_fail = nr_rules;
1252 * check if the short name resolves to a valid ref,
1253 * but use only rules prior to the matched one
1255 for (j = 0; j < rules_to_fail; j++) {
1256 const char *rule = ref_rev_parse_rules[j];
1258 /* skip matched rule */
1259 if (i == j)
1260 continue;
1263 * the short name is ambiguous, if it resolves
1264 * (with this previous rule) to a valid ref
1265 * read_ref() returns 0 on success
1267 strbuf_reset(&resolved_buf);
1268 strbuf_addf(&resolved_buf, rule,
1269 short_name_len, short_name);
1270 if (refs_ref_exists(refs, resolved_buf.buf))
1271 break;
1275 * short name is non-ambiguous if all previous rules
1276 * haven't resolved to a valid ref
1278 if (j == rules_to_fail) {
1279 strbuf_release(&resolved_buf);
1280 return short_name;
1284 strbuf_release(&resolved_buf);
1285 free(short_name);
1286 return xstrdup(refname);
1289 char *shorten_unambiguous_ref(const char *refname, int strict)
1291 return refs_shorten_unambiguous_ref(get_main_ref_store(the_repository),
1292 refname, strict);
1295 static struct string_list *hide_refs;
1297 int parse_hide_refs_config(const char *var, const char *value, const char *section)
1299 const char *key;
1300 if (!strcmp("transfer.hiderefs", var) ||
1301 (!parse_config_key(var, section, NULL, NULL, &key) &&
1302 !strcmp(key, "hiderefs"))) {
1303 char *ref;
1304 int len;
1306 if (!value)
1307 return config_error_nonbool(var);
1308 ref = xstrdup(value);
1309 len = strlen(ref);
1310 while (len && ref[len - 1] == '/')
1311 ref[--len] = '\0';
1312 if (!hide_refs) {
1313 CALLOC_ARRAY(hide_refs, 1);
1314 hide_refs->strdup_strings = 1;
1316 string_list_append(hide_refs, ref);
1318 return 0;
1321 int ref_is_hidden(const char *refname, const char *refname_full)
1323 int i;
1325 if (!hide_refs)
1326 return 0;
1327 for (i = hide_refs->nr - 1; i >= 0; i--) {
1328 const char *match = hide_refs->items[i].string;
1329 const char *subject;
1330 int neg = 0;
1331 const char *p;
1333 if (*match == '!') {
1334 neg = 1;
1335 match++;
1338 if (*match == '^') {
1339 subject = refname_full;
1340 match++;
1341 } else {
1342 subject = refname;
1345 /* refname can be NULL when namespaces are used. */
1346 if (subject &&
1347 skip_prefix(subject, match, &p) &&
1348 (!*p || *p == '/'))
1349 return !neg;
1351 return 0;
1354 const char *find_descendant_ref(const char *dirname,
1355 const struct string_list *extras,
1356 const struct string_list *skip)
1358 int pos;
1360 if (!extras)
1361 return NULL;
1364 * Look at the place where dirname would be inserted into
1365 * extras. If there is an entry at that position that starts
1366 * with dirname (remember, dirname includes the trailing
1367 * slash) and is not in skip, then we have a conflict.
1369 for (pos = string_list_find_insert_index(extras, dirname, 0);
1370 pos < extras->nr; pos++) {
1371 const char *extra_refname = extras->items[pos].string;
1373 if (!starts_with(extra_refname, dirname))
1374 break;
1376 if (!skip || !string_list_has_string(skip, extra_refname))
1377 return extra_refname;
1379 return NULL;
1382 int refs_head_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
1384 struct object_id oid;
1385 int flag;
1387 if (refs_resolve_ref_unsafe(refs, "HEAD", RESOLVE_REF_READING,
1388 &oid, &flag))
1389 return fn("HEAD", &oid, flag, cb_data);
1391 return 0;
1394 int head_ref(each_ref_fn fn, void *cb_data)
1396 return refs_head_ref(get_main_ref_store(the_repository), fn, cb_data);
1399 struct ref_iterator *refs_ref_iterator_begin(
1400 struct ref_store *refs,
1401 const char *prefix, int trim,
1402 enum do_for_each_ref_flags flags)
1404 struct ref_iterator *iter;
1406 if (!(flags & DO_FOR_EACH_INCLUDE_BROKEN)) {
1407 static int ref_paranoia = -1;
1409 if (ref_paranoia < 0)
1410 ref_paranoia = git_env_bool("GIT_REF_PARANOIA", 1);
1411 if (ref_paranoia) {
1412 flags |= DO_FOR_EACH_INCLUDE_BROKEN;
1413 flags |= DO_FOR_EACH_OMIT_DANGLING_SYMREFS;
1417 iter = refs->be->iterator_begin(refs, prefix, flags);
1420 * `iterator_begin()` already takes care of prefix, but we
1421 * might need to do some trimming:
1423 if (trim)
1424 iter = prefix_ref_iterator_begin(iter, "", trim);
1426 /* Sanity check for subclasses: */
1427 if (!iter->ordered)
1428 BUG("reference iterator is not ordered");
1430 return iter;
1434 * Call fn for each reference in the specified submodule for which the
1435 * refname begins with prefix. If trim is non-zero, then trim that
1436 * many characters off the beginning of each refname before passing
1437 * the refname to fn. flags can be DO_FOR_EACH_INCLUDE_BROKEN to
1438 * include broken references in the iteration. If fn ever returns a
1439 * non-zero value, stop the iteration and return that value;
1440 * otherwise, return 0.
1442 static int do_for_each_repo_ref(struct repository *r, const char *prefix,
1443 each_repo_ref_fn fn, int trim, int flags,
1444 void *cb_data)
1446 struct ref_iterator *iter;
1447 struct ref_store *refs = get_main_ref_store(r);
1449 if (!refs)
1450 return 0;
1452 iter = refs_ref_iterator_begin(refs, prefix, trim, flags);
1454 return do_for_each_repo_ref_iterator(r, iter, fn, cb_data);
1457 struct do_for_each_ref_help {
1458 each_ref_fn *fn;
1459 void *cb_data;
1462 static int do_for_each_ref_helper(struct repository *r,
1463 const char *refname,
1464 const struct object_id *oid,
1465 int flags,
1466 void *cb_data)
1468 struct do_for_each_ref_help *hp = cb_data;
1470 return hp->fn(refname, oid, flags, hp->cb_data);
1473 static int do_for_each_ref(struct ref_store *refs, const char *prefix,
1474 each_ref_fn fn, int trim,
1475 enum do_for_each_ref_flags flags, void *cb_data)
1477 struct ref_iterator *iter;
1478 struct do_for_each_ref_help hp = { fn, cb_data };
1480 if (!refs)
1481 return 0;
1483 iter = refs_ref_iterator_begin(refs, prefix, trim, flags);
1485 return do_for_each_repo_ref_iterator(the_repository, iter,
1486 do_for_each_ref_helper, &hp);
1489 int refs_for_each_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
1491 return do_for_each_ref(refs, "", fn, 0, 0, cb_data);
1494 int for_each_ref(each_ref_fn fn, void *cb_data)
1496 return refs_for_each_ref(get_main_ref_store(the_repository), fn, cb_data);
1499 int refs_for_each_ref_in(struct ref_store *refs, const char *prefix,
1500 each_ref_fn fn, void *cb_data)
1502 return do_for_each_ref(refs, prefix, fn, strlen(prefix), 0, cb_data);
1505 int for_each_ref_in(const char *prefix, each_ref_fn fn, void *cb_data)
1507 return refs_for_each_ref_in(get_main_ref_store(the_repository), prefix, fn, cb_data);
1510 int for_each_fullref_in(const char *prefix, each_ref_fn fn, void *cb_data)
1512 return do_for_each_ref(get_main_ref_store(the_repository),
1513 prefix, fn, 0, 0, cb_data);
1516 int refs_for_each_fullref_in(struct ref_store *refs, const char *prefix,
1517 each_ref_fn fn, void *cb_data)
1519 return do_for_each_ref(refs, prefix, fn, 0, 0, cb_data);
1522 int for_each_replace_ref(struct repository *r, each_repo_ref_fn fn, void *cb_data)
1524 return do_for_each_repo_ref(r, git_replace_ref_base, fn,
1525 strlen(git_replace_ref_base),
1526 DO_FOR_EACH_INCLUDE_BROKEN, cb_data);
1529 int for_each_namespaced_ref(each_ref_fn fn, void *cb_data)
1531 struct strbuf buf = STRBUF_INIT;
1532 int ret;
1533 strbuf_addf(&buf, "%srefs/", get_git_namespace());
1534 ret = do_for_each_ref(get_main_ref_store(the_repository),
1535 buf.buf, fn, 0, 0, cb_data);
1536 strbuf_release(&buf);
1537 return ret;
1540 int refs_for_each_rawref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
1542 return do_for_each_ref(refs, "", fn, 0,
1543 DO_FOR_EACH_INCLUDE_BROKEN, cb_data);
1546 int for_each_rawref(each_ref_fn fn, void *cb_data)
1548 return refs_for_each_rawref(get_main_ref_store(the_repository), fn, cb_data);
1551 static int qsort_strcmp(const void *va, const void *vb)
1553 const char *a = *(const char **)va;
1554 const char *b = *(const char **)vb;
1556 return strcmp(a, b);
1559 static void find_longest_prefixes_1(struct string_list *out,
1560 struct strbuf *prefix,
1561 const char **patterns, size_t nr)
1563 size_t i;
1565 for (i = 0; i < nr; i++) {
1566 char c = patterns[i][prefix->len];
1567 if (!c || is_glob_special(c)) {
1568 string_list_append(out, prefix->buf);
1569 return;
1573 i = 0;
1574 while (i < nr) {
1575 size_t end;
1578 * Set "end" to the index of the element _after_ the last one
1579 * in our group.
1581 for (end = i + 1; end < nr; end++) {
1582 if (patterns[i][prefix->len] != patterns[end][prefix->len])
1583 break;
1586 strbuf_addch(prefix, patterns[i][prefix->len]);
1587 find_longest_prefixes_1(out, prefix, patterns + i, end - i);
1588 strbuf_setlen(prefix, prefix->len - 1);
1590 i = end;
1594 static void find_longest_prefixes(struct string_list *out,
1595 const char **patterns)
1597 struct strvec sorted = STRVEC_INIT;
1598 struct strbuf prefix = STRBUF_INIT;
1600 strvec_pushv(&sorted, patterns);
1601 QSORT(sorted.v, sorted.nr, qsort_strcmp);
1603 find_longest_prefixes_1(out, &prefix, sorted.v, sorted.nr);
1605 strvec_clear(&sorted);
1606 strbuf_release(&prefix);
1609 int for_each_fullref_in_prefixes(const char *namespace,
1610 const char **patterns,
1611 each_ref_fn fn, void *cb_data)
1613 struct string_list prefixes = STRING_LIST_INIT_DUP;
1614 struct string_list_item *prefix;
1615 struct strbuf buf = STRBUF_INIT;
1616 int ret = 0, namespace_len;
1618 find_longest_prefixes(&prefixes, patterns);
1620 if (namespace)
1621 strbuf_addstr(&buf, namespace);
1622 namespace_len = buf.len;
1624 for_each_string_list_item(prefix, &prefixes) {
1625 strbuf_addstr(&buf, prefix->string);
1626 ret = for_each_fullref_in(buf.buf, fn, cb_data);
1627 if (ret)
1628 break;
1629 strbuf_setlen(&buf, namespace_len);
1632 string_list_clear(&prefixes, 0);
1633 strbuf_release(&buf);
1634 return ret;
1637 static int refs_read_special_head(struct ref_store *ref_store,
1638 const char *refname, struct object_id *oid,
1639 struct strbuf *referent, unsigned int *type,
1640 int *failure_errno)
1642 struct strbuf full_path = STRBUF_INIT;
1643 struct strbuf content = STRBUF_INIT;
1644 int result = -1;
1645 strbuf_addf(&full_path, "%s/%s", ref_store->gitdir, refname);
1647 if (strbuf_read_file(&content, full_path.buf, 0) < 0)
1648 goto done;
1650 result = parse_loose_ref_contents(content.buf, oid, referent, type,
1651 failure_errno);
1653 done:
1654 strbuf_release(&full_path);
1655 strbuf_release(&content);
1656 return result;
1659 int refs_read_raw_ref(struct ref_store *ref_store, const char *refname,
1660 struct object_id *oid, struct strbuf *referent,
1661 unsigned int *type, int *failure_errno)
1663 assert(failure_errno);
1664 if (!strcmp(refname, "FETCH_HEAD") || !strcmp(refname, "MERGE_HEAD")) {
1665 return refs_read_special_head(ref_store, refname, oid, referent,
1666 type, failure_errno);
1669 return ref_store->be->read_raw_ref(ref_store, refname, oid, referent,
1670 type, failure_errno);
1673 const char *refs_resolve_ref_unsafe(struct ref_store *refs,
1674 const char *refname,
1675 int resolve_flags,
1676 struct object_id *oid,
1677 int *flags)
1679 static struct strbuf sb_refname = STRBUF_INIT;
1680 struct object_id unused_oid;
1681 int unused_flags;
1682 int symref_count;
1684 if (!oid)
1685 oid = &unused_oid;
1686 if (!flags)
1687 flags = &unused_flags;
1689 *flags = 0;
1691 if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
1692 if (!(resolve_flags & RESOLVE_REF_ALLOW_BAD_NAME) ||
1693 !refname_is_safe(refname))
1694 return NULL;
1697 * dwim_ref() uses REF_ISBROKEN to distinguish between
1698 * missing refs and refs that were present but invalid,
1699 * to complain about the latter to stderr.
1701 * We don't know whether the ref exists, so don't set
1702 * REF_ISBROKEN yet.
1704 *flags |= REF_BAD_NAME;
1707 for (symref_count = 0; symref_count < SYMREF_MAXDEPTH; symref_count++) {
1708 unsigned int read_flags = 0;
1709 int failure_errno;
1711 if (refs_read_raw_ref(refs, refname, oid, &sb_refname,
1712 &read_flags, &failure_errno)) {
1713 *flags |= read_flags;
1715 /* In reading mode, refs must eventually resolve */
1716 if (resolve_flags & RESOLVE_REF_READING)
1717 return NULL;
1720 * Otherwise a missing ref is OK. But the files backend
1721 * may show errors besides ENOENT if there are
1722 * similarly-named refs.
1724 if (failure_errno != ENOENT &&
1725 failure_errno != EISDIR &&
1726 failure_errno != ENOTDIR)
1727 return NULL;
1729 oidclr(oid);
1730 if (*flags & REF_BAD_NAME)
1731 *flags |= REF_ISBROKEN;
1732 return refname;
1735 *flags |= read_flags;
1737 if (!(read_flags & REF_ISSYMREF)) {
1738 if (*flags & REF_BAD_NAME) {
1739 oidclr(oid);
1740 *flags |= REF_ISBROKEN;
1742 return refname;
1745 refname = sb_refname.buf;
1746 if (resolve_flags & RESOLVE_REF_NO_RECURSE) {
1747 oidclr(oid);
1748 return refname;
1750 if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
1751 if (!(resolve_flags & RESOLVE_REF_ALLOW_BAD_NAME) ||
1752 !refname_is_safe(refname))
1753 return NULL;
1755 *flags |= REF_ISBROKEN | REF_BAD_NAME;
1759 return NULL;
1762 /* backend functions */
1763 int refs_init_db(struct strbuf *err)
1765 struct ref_store *refs = get_main_ref_store(the_repository);
1767 return refs->be->init_db(refs, err);
1770 const char *resolve_ref_unsafe(const char *refname, int resolve_flags,
1771 struct object_id *oid, int *flags)
1773 return refs_resolve_ref_unsafe(get_main_ref_store(the_repository), refname,
1774 resolve_flags, oid, flags);
1777 int resolve_gitlink_ref(const char *submodule, const char *refname,
1778 struct object_id *oid)
1780 struct ref_store *refs;
1781 int flags;
1783 refs = get_submodule_ref_store(submodule);
1785 if (!refs)
1786 return -1;
1788 if (!refs_resolve_ref_unsafe(refs, refname, 0, oid, &flags) ||
1789 is_null_oid(oid))
1790 return -1;
1791 return 0;
1794 struct ref_store_hash_entry
1796 struct hashmap_entry ent;
1798 struct ref_store *refs;
1800 /* NUL-terminated identifier of the ref store: */
1801 char name[FLEX_ARRAY];
1804 static int ref_store_hash_cmp(const void *unused_cmp_data,
1805 const struct hashmap_entry *eptr,
1806 const struct hashmap_entry *entry_or_key,
1807 const void *keydata)
1809 const struct ref_store_hash_entry *e1, *e2;
1810 const char *name;
1812 e1 = container_of(eptr, const struct ref_store_hash_entry, ent);
1813 e2 = container_of(entry_or_key, const struct ref_store_hash_entry, ent);
1814 name = keydata ? keydata : e2->name;
1816 return strcmp(e1->name, name);
1819 static struct ref_store_hash_entry *alloc_ref_store_hash_entry(
1820 const char *name, struct ref_store *refs)
1822 struct ref_store_hash_entry *entry;
1824 FLEX_ALLOC_STR(entry, name, name);
1825 hashmap_entry_init(&entry->ent, strhash(name));
1826 entry->refs = refs;
1827 return entry;
1830 /* A hashmap of ref_stores, stored by submodule name: */
1831 static struct hashmap submodule_ref_stores;
1833 /* A hashmap of ref_stores, stored by worktree id: */
1834 static struct hashmap worktree_ref_stores;
1837 * Look up a ref store by name. If that ref_store hasn't been
1838 * registered yet, return NULL.
1840 static struct ref_store *lookup_ref_store_map(struct hashmap *map,
1841 const char *name)
1843 struct ref_store_hash_entry *entry;
1844 unsigned int hash;
1846 if (!map->tablesize)
1847 /* It's initialized on demand in register_ref_store(). */
1848 return NULL;
1850 hash = strhash(name);
1851 entry = hashmap_get_entry_from_hash(map, hash, name,
1852 struct ref_store_hash_entry, ent);
1853 return entry ? entry->refs : NULL;
1857 * Create, record, and return a ref_store instance for the specified
1858 * gitdir.
1860 static struct ref_store *ref_store_init(struct repository *repo,
1861 const char *gitdir,
1862 unsigned int flags)
1864 const char *be_name = "files";
1865 struct ref_storage_be *be = find_ref_storage_backend(be_name);
1866 struct ref_store *refs;
1868 if (!be)
1869 BUG("reference backend %s is unknown", be_name);
1871 refs = be->init(repo, gitdir, flags);
1872 return refs;
1875 struct ref_store *get_main_ref_store(struct repository *r)
1877 if (r->refs_private)
1878 return r->refs_private;
1880 if (!r->gitdir)
1881 BUG("attempting to get main_ref_store outside of repository");
1883 r->refs_private = ref_store_init(r, r->gitdir, REF_STORE_ALL_CAPS);
1884 r->refs_private = maybe_debug_wrap_ref_store(r->gitdir, r->refs_private);
1885 return r->refs_private;
1889 * Associate a ref store with a name. It is a fatal error to call this
1890 * function twice for the same name.
1892 static void register_ref_store_map(struct hashmap *map,
1893 const char *type,
1894 struct ref_store *refs,
1895 const char *name)
1897 struct ref_store_hash_entry *entry;
1899 if (!map->tablesize)
1900 hashmap_init(map, ref_store_hash_cmp, NULL, 0);
1902 entry = alloc_ref_store_hash_entry(name, refs);
1903 if (hashmap_put(map, &entry->ent))
1904 BUG("%s ref_store '%s' initialized twice", type, name);
1907 struct ref_store *get_submodule_ref_store(const char *submodule)
1909 struct strbuf submodule_sb = STRBUF_INIT;
1910 struct ref_store *refs;
1911 char *to_free = NULL;
1912 size_t len;
1913 struct repository *subrepo;
1915 if (!submodule)
1916 return NULL;
1918 len = strlen(submodule);
1919 while (len && is_dir_sep(submodule[len - 1]))
1920 len--;
1921 if (!len)
1922 return NULL;
1924 if (submodule[len])
1925 /* We need to strip off one or more trailing slashes */
1926 submodule = to_free = xmemdupz(submodule, len);
1928 refs = lookup_ref_store_map(&submodule_ref_stores, submodule);
1929 if (refs)
1930 goto done;
1932 strbuf_addstr(&submodule_sb, submodule);
1933 if (!is_nonbare_repository_dir(&submodule_sb))
1934 goto done;
1936 if (submodule_to_gitdir(&submodule_sb, submodule))
1937 goto done;
1939 subrepo = xmalloc(sizeof(*subrepo));
1941 * NEEDSWORK: Make get_submodule_ref_store() work with arbitrary
1942 * superprojects other than the_repository. This probably should be
1943 * done by making it take a struct repository * parameter instead of a
1944 * submodule path.
1946 if (repo_submodule_init(subrepo, the_repository, submodule,
1947 null_oid())) {
1948 free(subrepo);
1949 goto done;
1951 refs = ref_store_init(subrepo, submodule_sb.buf,
1952 REF_STORE_READ | REF_STORE_ODB);
1953 register_ref_store_map(&submodule_ref_stores, "submodule",
1954 refs, submodule);
1956 done:
1957 strbuf_release(&submodule_sb);
1958 free(to_free);
1960 return refs;
1963 struct ref_store *get_worktree_ref_store(const struct worktree *wt)
1965 struct ref_store *refs;
1966 const char *id;
1968 if (wt->is_current)
1969 return get_main_ref_store(the_repository);
1971 id = wt->id ? wt->id : "/";
1972 refs = lookup_ref_store_map(&worktree_ref_stores, id);
1973 if (refs)
1974 return refs;
1976 if (wt->id)
1977 refs = ref_store_init(the_repository,
1978 git_common_path("worktrees/%s", wt->id),
1979 REF_STORE_ALL_CAPS);
1980 else
1981 refs = ref_store_init(the_repository,
1982 get_git_common_dir(),
1983 REF_STORE_ALL_CAPS);
1985 if (refs)
1986 register_ref_store_map(&worktree_ref_stores, "worktree",
1987 refs, id);
1988 return refs;
1991 void base_ref_store_init(struct ref_store *refs, struct repository *repo,
1992 const char *path, const struct ref_storage_be *be)
1994 refs->be = be;
1995 refs->repo = repo;
1996 refs->gitdir = xstrdup(path);
1999 /* backend functions */
2000 int refs_pack_refs(struct ref_store *refs, unsigned int flags)
2002 return refs->be->pack_refs(refs, flags);
2005 int peel_iterated_oid(const struct object_id *base, struct object_id *peeled)
2007 if (current_ref_iter &&
2008 (current_ref_iter->oid == base ||
2009 oideq(current_ref_iter->oid, base)))
2010 return ref_iterator_peel(current_ref_iter, peeled);
2012 return peel_object(base, peeled) ? -1 : 0;
2015 int refs_create_symref(struct ref_store *refs,
2016 const char *ref_target,
2017 const char *refs_heads_master,
2018 const char *logmsg)
2020 char *msg;
2021 int retval;
2023 msg = normalize_reflog_message(logmsg);
2024 retval = refs->be->create_symref(refs, ref_target, refs_heads_master,
2025 msg);
2026 free(msg);
2027 return retval;
2030 int create_symref(const char *ref_target, const char *refs_heads_master,
2031 const char *logmsg)
2033 return refs_create_symref(get_main_ref_store(the_repository), ref_target,
2034 refs_heads_master, logmsg);
2037 int ref_update_reject_duplicates(struct string_list *refnames,
2038 struct strbuf *err)
2040 size_t i, n = refnames->nr;
2042 assert(err);
2044 for (i = 1; i < n; i++) {
2045 int cmp = strcmp(refnames->items[i - 1].string,
2046 refnames->items[i].string);
2048 if (!cmp) {
2049 strbuf_addf(err,
2050 _("multiple updates for ref '%s' not allowed"),
2051 refnames->items[i].string);
2052 return 1;
2053 } else if (cmp > 0) {
2054 BUG("ref_update_reject_duplicates() received unsorted list");
2057 return 0;
2060 static int run_transaction_hook(struct ref_transaction *transaction,
2061 const char *state)
2063 struct child_process proc = CHILD_PROCESS_INIT;
2064 struct strbuf buf = STRBUF_INIT;
2065 const char *hook;
2066 int ret = 0, i;
2068 hook = find_hook("reference-transaction");
2069 if (!hook)
2070 return ret;
2072 strvec_pushl(&proc.args, hook, state, NULL);
2073 proc.in = -1;
2074 proc.stdout_to_stderr = 1;
2075 proc.trace2_hook_name = "reference-transaction";
2077 ret = start_command(&proc);
2078 if (ret)
2079 return ret;
2081 sigchain_push(SIGPIPE, SIG_IGN);
2083 for (i = 0; i < transaction->nr; i++) {
2084 struct ref_update *update = transaction->updates[i];
2086 strbuf_reset(&buf);
2087 strbuf_addf(&buf, "%s %s %s\n",
2088 oid_to_hex(&update->old_oid),
2089 oid_to_hex(&update->new_oid),
2090 update->refname);
2092 if (write_in_full(proc.in, buf.buf, buf.len) < 0) {
2093 if (errno != EPIPE) {
2094 /* Don't leak errno outside this API */
2095 errno = 0;
2096 ret = -1;
2098 break;
2102 close(proc.in);
2103 sigchain_pop(SIGPIPE);
2104 strbuf_release(&buf);
2106 ret |= finish_command(&proc);
2107 return ret;
2110 int ref_transaction_prepare(struct ref_transaction *transaction,
2111 struct strbuf *err)
2113 struct ref_store *refs = transaction->ref_store;
2114 int ret;
2116 switch (transaction->state) {
2117 case REF_TRANSACTION_OPEN:
2118 /* Good. */
2119 break;
2120 case REF_TRANSACTION_PREPARED:
2121 BUG("prepare called twice on reference transaction");
2122 break;
2123 case REF_TRANSACTION_CLOSED:
2124 BUG("prepare called on a closed reference transaction");
2125 break;
2126 default:
2127 BUG("unexpected reference transaction state");
2128 break;
2131 if (refs->repo->objects->odb->disable_ref_updates) {
2132 strbuf_addstr(err,
2133 _("ref updates forbidden inside quarantine environment"));
2134 return -1;
2137 ret = refs->be->transaction_prepare(refs, transaction, err);
2138 if (ret)
2139 return ret;
2141 ret = run_transaction_hook(transaction, "prepared");
2142 if (ret) {
2143 ref_transaction_abort(transaction, err);
2144 die(_("ref updates aborted by hook"));
2147 return 0;
2150 int ref_transaction_abort(struct ref_transaction *transaction,
2151 struct strbuf *err)
2153 struct ref_store *refs = transaction->ref_store;
2154 int ret = 0;
2156 switch (transaction->state) {
2157 case REF_TRANSACTION_OPEN:
2158 /* No need to abort explicitly. */
2159 break;
2160 case REF_TRANSACTION_PREPARED:
2161 ret = refs->be->transaction_abort(refs, transaction, err);
2162 break;
2163 case REF_TRANSACTION_CLOSED:
2164 BUG("abort called on a closed reference transaction");
2165 break;
2166 default:
2167 BUG("unexpected reference transaction state");
2168 break;
2171 run_transaction_hook(transaction, "aborted");
2173 ref_transaction_free(transaction);
2174 return ret;
2177 int ref_transaction_commit(struct ref_transaction *transaction,
2178 struct strbuf *err)
2180 struct ref_store *refs = transaction->ref_store;
2181 int ret;
2183 switch (transaction->state) {
2184 case REF_TRANSACTION_OPEN:
2185 /* Need to prepare first. */
2186 ret = ref_transaction_prepare(transaction, err);
2187 if (ret)
2188 return ret;
2189 break;
2190 case REF_TRANSACTION_PREPARED:
2191 /* Fall through to finish. */
2192 break;
2193 case REF_TRANSACTION_CLOSED:
2194 BUG("commit called on a closed reference transaction");
2195 break;
2196 default:
2197 BUG("unexpected reference transaction state");
2198 break;
2201 ret = refs->be->transaction_finish(refs, transaction, err);
2202 if (!ret)
2203 run_transaction_hook(transaction, "committed");
2204 return ret;
2207 int refs_verify_refname_available(struct ref_store *refs,
2208 const char *refname,
2209 const struct string_list *extras,
2210 const struct string_list *skip,
2211 struct strbuf *err)
2213 const char *slash;
2214 const char *extra_refname;
2215 struct strbuf dirname = STRBUF_INIT;
2216 struct strbuf referent = STRBUF_INIT;
2217 struct object_id oid;
2218 unsigned int type;
2219 struct ref_iterator *iter;
2220 int ok;
2221 int ret = -1;
2224 * For the sake of comments in this function, suppose that
2225 * refname is "refs/foo/bar".
2228 assert(err);
2230 strbuf_grow(&dirname, strlen(refname) + 1);
2231 for (slash = strchr(refname, '/'); slash; slash = strchr(slash + 1, '/')) {
2233 * Just saying "Is a directory" when we e.g. can't
2234 * lock some multi-level ref isn't very informative,
2235 * the user won't be told *what* is a directory, so
2236 * let's not use strerror() below.
2238 int ignore_errno;
2239 /* Expand dirname to the new prefix, not including the trailing slash: */
2240 strbuf_add(&dirname, refname + dirname.len, slash - refname - dirname.len);
2243 * We are still at a leading dir of the refname (e.g.,
2244 * "refs/foo"; if there is a reference with that name,
2245 * it is a conflict, *unless* it is in skip.
2247 if (skip && string_list_has_string(skip, dirname.buf))
2248 continue;
2250 if (!refs_read_raw_ref(refs, dirname.buf, &oid, &referent,
2251 &type, &ignore_errno)) {
2252 strbuf_addf(err, _("'%s' exists; cannot create '%s'"),
2253 dirname.buf, refname);
2254 goto cleanup;
2257 if (extras && string_list_has_string(extras, dirname.buf)) {
2258 strbuf_addf(err, _("cannot process '%s' and '%s' at the same time"),
2259 refname, dirname.buf);
2260 goto cleanup;
2265 * We are at the leaf of our refname (e.g., "refs/foo/bar").
2266 * There is no point in searching for a reference with that
2267 * name, because a refname isn't considered to conflict with
2268 * itself. But we still need to check for references whose
2269 * names are in the "refs/foo/bar/" namespace, because they
2270 * *do* conflict.
2272 strbuf_addstr(&dirname, refname + dirname.len);
2273 strbuf_addch(&dirname, '/');
2275 iter = refs_ref_iterator_begin(refs, dirname.buf, 0,
2276 DO_FOR_EACH_INCLUDE_BROKEN);
2277 while ((ok = ref_iterator_advance(iter)) == ITER_OK) {
2278 if (skip &&
2279 string_list_has_string(skip, iter->refname))
2280 continue;
2282 strbuf_addf(err, _("'%s' exists; cannot create '%s'"),
2283 iter->refname, refname);
2284 ref_iterator_abort(iter);
2285 goto cleanup;
2288 if (ok != ITER_DONE)
2289 BUG("error while iterating over references");
2291 extra_refname = find_descendant_ref(dirname.buf, extras, skip);
2292 if (extra_refname)
2293 strbuf_addf(err, _("cannot process '%s' and '%s' at the same time"),
2294 refname, extra_refname);
2295 else
2296 ret = 0;
2298 cleanup:
2299 strbuf_release(&referent);
2300 strbuf_release(&dirname);
2301 return ret;
2304 int refs_for_each_reflog(struct ref_store *refs, each_ref_fn fn, void *cb_data)
2306 struct ref_iterator *iter;
2307 struct do_for_each_ref_help hp = { fn, cb_data };
2309 iter = refs->be->reflog_iterator_begin(refs);
2311 return do_for_each_repo_ref_iterator(the_repository, iter,
2312 do_for_each_ref_helper, &hp);
2315 int for_each_reflog(each_ref_fn fn, void *cb_data)
2317 return refs_for_each_reflog(get_main_ref_store(the_repository), fn, cb_data);
2320 int refs_for_each_reflog_ent_reverse(struct ref_store *refs,
2321 const char *refname,
2322 each_reflog_ent_fn fn,
2323 void *cb_data)
2325 return refs->be->for_each_reflog_ent_reverse(refs, refname,
2326 fn, cb_data);
2329 int for_each_reflog_ent_reverse(const char *refname, each_reflog_ent_fn fn,
2330 void *cb_data)
2332 return refs_for_each_reflog_ent_reverse(get_main_ref_store(the_repository),
2333 refname, fn, cb_data);
2336 int refs_for_each_reflog_ent(struct ref_store *refs, const char *refname,
2337 each_reflog_ent_fn fn, void *cb_data)
2339 return refs->be->for_each_reflog_ent(refs, refname, fn, cb_data);
2342 int for_each_reflog_ent(const char *refname, each_reflog_ent_fn fn,
2343 void *cb_data)
2345 return refs_for_each_reflog_ent(get_main_ref_store(the_repository), refname,
2346 fn, cb_data);
2349 int refs_reflog_exists(struct ref_store *refs, const char *refname)
2351 return refs->be->reflog_exists(refs, refname);
2354 int reflog_exists(const char *refname)
2356 return refs_reflog_exists(get_main_ref_store(the_repository), refname);
2359 int refs_create_reflog(struct ref_store *refs, const char *refname,
2360 struct strbuf *err)
2362 return refs->be->create_reflog(refs, refname, err);
2365 int safe_create_reflog(const char *refname, struct strbuf *err)
2367 return refs_create_reflog(get_main_ref_store(the_repository), refname,
2368 err);
2371 int refs_delete_reflog(struct ref_store *refs, const char *refname)
2373 return refs->be->delete_reflog(refs, refname);
2376 int delete_reflog(const char *refname)
2378 return refs_delete_reflog(get_main_ref_store(the_repository), refname);
2381 int refs_reflog_expire(struct ref_store *refs,
2382 const char *refname,
2383 unsigned int flags,
2384 reflog_expiry_prepare_fn prepare_fn,
2385 reflog_expiry_should_prune_fn should_prune_fn,
2386 reflog_expiry_cleanup_fn cleanup_fn,
2387 void *policy_cb_data)
2389 return refs->be->reflog_expire(refs, refname, flags,
2390 prepare_fn, should_prune_fn,
2391 cleanup_fn, policy_cb_data);
2394 int reflog_expire(const char *refname,
2395 unsigned int flags,
2396 reflog_expiry_prepare_fn prepare_fn,
2397 reflog_expiry_should_prune_fn should_prune_fn,
2398 reflog_expiry_cleanup_fn cleanup_fn,
2399 void *policy_cb_data)
2401 return refs_reflog_expire(get_main_ref_store(the_repository),
2402 refname, flags,
2403 prepare_fn, should_prune_fn,
2404 cleanup_fn, policy_cb_data);
2407 int initial_ref_transaction_commit(struct ref_transaction *transaction,
2408 struct strbuf *err)
2410 struct ref_store *refs = transaction->ref_store;
2412 return refs->be->initial_transaction_commit(refs, transaction, err);
2415 void ref_transaction_for_each_queued_update(struct ref_transaction *transaction,
2416 ref_transaction_for_each_queued_update_fn cb,
2417 void *cb_data)
2419 int i;
2421 for (i = 0; i < transaction->nr; i++) {
2422 struct ref_update *update = transaction->updates[i];
2424 cb(update->refname,
2425 (update->flags & REF_HAVE_OLD) ? &update->old_oid : NULL,
2426 (update->flags & REF_HAVE_NEW) ? &update->new_oid : NULL,
2427 cb_data);
2431 int refs_delete_refs(struct ref_store *refs, const char *logmsg,
2432 struct string_list *refnames, unsigned int flags)
2434 char *msg;
2435 int retval;
2437 msg = normalize_reflog_message(logmsg);
2438 retval = refs->be->delete_refs(refs, msg, refnames, flags);
2439 free(msg);
2440 return retval;
2443 int delete_refs(const char *msg, struct string_list *refnames,
2444 unsigned int flags)
2446 return refs_delete_refs(get_main_ref_store(the_repository), msg, refnames, flags);
2449 int refs_rename_ref(struct ref_store *refs, const char *oldref,
2450 const char *newref, const char *logmsg)
2452 char *msg;
2453 int retval;
2455 msg = normalize_reflog_message(logmsg);
2456 retval = refs->be->rename_ref(refs, oldref, newref, msg);
2457 free(msg);
2458 return retval;
2461 int rename_ref(const char *oldref, const char *newref, const char *logmsg)
2463 return refs_rename_ref(get_main_ref_store(the_repository), oldref, newref, logmsg);
2466 int refs_copy_existing_ref(struct ref_store *refs, const char *oldref,
2467 const char *newref, const char *logmsg)
2469 char *msg;
2470 int retval;
2472 msg = normalize_reflog_message(logmsg);
2473 retval = refs->be->copy_ref(refs, oldref, newref, msg);
2474 free(msg);
2475 return retval;
2478 int copy_existing_ref(const char *oldref, const char *newref, const char *logmsg)
2480 return refs_copy_existing_ref(get_main_ref_store(the_repository), oldref, newref, logmsg);