Merge branch 'jh/perf-remove-test-times'
[alt-git.git] / refs.c
blob7f019c2377effa49a90427ffec0451c400941e0c
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 const struct object_id *oid,
255 unsigned int flags)
257 if (flags & REF_ISBROKEN)
258 return 0;
259 if (!has_object_file(oid)) {
260 error(_("%s does not point to a valid object!"), refname);
261 return 0;
263 return 1;
266 char *refs_resolve_refdup(struct ref_store *refs,
267 const char *refname, int resolve_flags,
268 struct object_id *oid, int *flags)
270 const char *result;
272 result = refs_resolve_ref_unsafe(refs, refname, resolve_flags,
273 oid, flags);
274 return xstrdup_or_null(result);
277 char *resolve_refdup(const char *refname, int resolve_flags,
278 struct object_id *oid, int *flags)
280 return refs_resolve_refdup(get_main_ref_store(the_repository),
281 refname, resolve_flags,
282 oid, flags);
285 /* The argument to filter_refs */
286 struct ref_filter {
287 const char *pattern;
288 const char *prefix;
289 each_ref_fn *fn;
290 void *cb_data;
293 int refs_read_ref_full(struct ref_store *refs, const char *refname,
294 int resolve_flags, struct object_id *oid, int *flags)
296 if (refs_resolve_ref_unsafe(refs, refname, resolve_flags, oid, flags))
297 return 0;
298 return -1;
301 int read_ref_full(const char *refname, int resolve_flags, struct object_id *oid, int *flags)
303 return refs_read_ref_full(get_main_ref_store(the_repository), refname,
304 resolve_flags, oid, flags);
307 int read_ref(const char *refname, struct object_id *oid)
309 return read_ref_full(refname, RESOLVE_REF_READING, oid, NULL);
312 int refs_ref_exists(struct ref_store *refs, const char *refname)
314 return !!refs_resolve_ref_unsafe(refs, refname, RESOLVE_REF_READING, NULL, NULL);
317 int ref_exists(const char *refname)
319 return refs_ref_exists(get_main_ref_store(the_repository), refname);
322 static int filter_refs(const char *refname, const struct object_id *oid,
323 int flags, void *data)
325 struct ref_filter *filter = (struct ref_filter *)data;
327 if (wildmatch(filter->pattern, refname, 0))
328 return 0;
329 if (filter->prefix)
330 skip_prefix(refname, filter->prefix, &refname);
331 return filter->fn(refname, oid, flags, filter->cb_data);
334 enum peel_status peel_object(const struct object_id *name, struct object_id *oid)
336 struct object *o = lookup_unknown_object(the_repository, name);
338 if (o->type == OBJ_NONE) {
339 int type = oid_object_info(the_repository, name, NULL);
340 if (type < 0 || !object_as_type(o, type, 0))
341 return PEEL_INVALID;
344 if (o->type != OBJ_TAG)
345 return PEEL_NON_TAG;
347 o = deref_tag_noverify(o);
348 if (!o)
349 return PEEL_INVALID;
351 oidcpy(oid, &o->oid);
352 return PEEL_PEELED;
355 struct warn_if_dangling_data {
356 FILE *fp;
357 const char *refname;
358 const struct string_list *refnames;
359 const char *msg_fmt;
362 static int warn_if_dangling_symref(const char *refname, const struct object_id *oid,
363 int flags, void *cb_data)
365 struct warn_if_dangling_data *d = cb_data;
366 const char *resolves_to;
368 if (!(flags & REF_ISSYMREF))
369 return 0;
371 resolves_to = resolve_ref_unsafe(refname, 0, NULL, NULL);
372 if (!resolves_to
373 || (d->refname
374 ? strcmp(resolves_to, d->refname)
375 : !string_list_has_string(d->refnames, resolves_to))) {
376 return 0;
379 fprintf(d->fp, d->msg_fmt, refname);
380 fputc('\n', d->fp);
381 return 0;
384 void warn_dangling_symref(FILE *fp, const char *msg_fmt, const char *refname)
386 struct warn_if_dangling_data data;
388 data.fp = fp;
389 data.refname = refname;
390 data.refnames = NULL;
391 data.msg_fmt = msg_fmt;
392 for_each_rawref(warn_if_dangling_symref, &data);
395 void warn_dangling_symrefs(FILE *fp, const char *msg_fmt, const struct string_list *refnames)
397 struct warn_if_dangling_data data;
399 data.fp = fp;
400 data.refname = NULL;
401 data.refnames = refnames;
402 data.msg_fmt = msg_fmt;
403 for_each_rawref(warn_if_dangling_symref, &data);
406 int refs_for_each_tag_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
408 return refs_for_each_ref_in(refs, "refs/tags/", fn, cb_data);
411 int for_each_tag_ref(each_ref_fn fn, void *cb_data)
413 return refs_for_each_tag_ref(get_main_ref_store(the_repository), fn, cb_data);
416 int refs_for_each_branch_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
418 return refs_for_each_ref_in(refs, "refs/heads/", fn, cb_data);
421 int for_each_branch_ref(each_ref_fn fn, void *cb_data)
423 return refs_for_each_branch_ref(get_main_ref_store(the_repository), fn, cb_data);
426 int refs_for_each_remote_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
428 return refs_for_each_ref_in(refs, "refs/remotes/", fn, cb_data);
431 int for_each_remote_ref(each_ref_fn fn, void *cb_data)
433 return refs_for_each_remote_ref(get_main_ref_store(the_repository), fn, cb_data);
436 int head_ref_namespaced(each_ref_fn fn, void *cb_data)
438 struct strbuf buf = STRBUF_INIT;
439 int ret = 0;
440 struct object_id oid;
441 int flag;
443 strbuf_addf(&buf, "%sHEAD", get_git_namespace());
444 if (!read_ref_full(buf.buf, RESOLVE_REF_READING, &oid, &flag))
445 ret = fn(buf.buf, &oid, flag, cb_data);
446 strbuf_release(&buf);
448 return ret;
451 void normalize_glob_ref(struct string_list_item *item, const char *prefix,
452 const char *pattern)
454 struct strbuf normalized_pattern = STRBUF_INIT;
456 if (*pattern == '/')
457 BUG("pattern must not start with '/'");
459 if (prefix) {
460 strbuf_addstr(&normalized_pattern, prefix);
462 else if (!starts_with(pattern, "refs/"))
463 strbuf_addstr(&normalized_pattern, "refs/");
464 strbuf_addstr(&normalized_pattern, pattern);
465 strbuf_strip_suffix(&normalized_pattern, "/");
467 item->string = strbuf_detach(&normalized_pattern, NULL);
468 item->util = has_glob_specials(pattern) ? NULL : item->string;
469 strbuf_release(&normalized_pattern);
472 int for_each_glob_ref_in(each_ref_fn fn, const char *pattern,
473 const char *prefix, void *cb_data)
475 struct strbuf real_pattern = STRBUF_INIT;
476 struct ref_filter filter;
477 int ret;
479 if (!prefix && !starts_with(pattern, "refs/"))
480 strbuf_addstr(&real_pattern, "refs/");
481 else if (prefix)
482 strbuf_addstr(&real_pattern, prefix);
483 strbuf_addstr(&real_pattern, pattern);
485 if (!has_glob_specials(pattern)) {
486 /* Append implied '/' '*' if not present. */
487 strbuf_complete(&real_pattern, '/');
488 /* No need to check for '*', there is none. */
489 strbuf_addch(&real_pattern, '*');
492 filter.pattern = real_pattern.buf;
493 filter.prefix = prefix;
494 filter.fn = fn;
495 filter.cb_data = cb_data;
496 ret = for_each_ref(filter_refs, &filter);
498 strbuf_release(&real_pattern);
499 return ret;
502 int for_each_glob_ref(each_ref_fn fn, const char *pattern, void *cb_data)
504 return for_each_glob_ref_in(fn, pattern, NULL, cb_data);
507 const char *prettify_refname(const char *name)
509 if (skip_prefix(name, "refs/heads/", &name) ||
510 skip_prefix(name, "refs/tags/", &name) ||
511 skip_prefix(name, "refs/remotes/", &name))
512 ; /* nothing */
513 return name;
516 static const char *ref_rev_parse_rules[] = {
517 "%.*s",
518 "refs/%.*s",
519 "refs/tags/%.*s",
520 "refs/heads/%.*s",
521 "refs/remotes/%.*s",
522 "refs/remotes/%.*s/HEAD",
523 NULL
526 #define NUM_REV_PARSE_RULES (ARRAY_SIZE(ref_rev_parse_rules) - 1)
529 * Is it possible that the caller meant full_name with abbrev_name?
530 * If so return a non-zero value to signal "yes"; the magnitude of
531 * the returned value gives the precedence used for disambiguation.
533 * If abbrev_name cannot mean full_name, return 0.
535 int refname_match(const char *abbrev_name, const char *full_name)
537 const char **p;
538 const int abbrev_name_len = strlen(abbrev_name);
539 const int num_rules = NUM_REV_PARSE_RULES;
541 for (p = ref_rev_parse_rules; *p; p++)
542 if (!strcmp(full_name, mkpath(*p, abbrev_name_len, abbrev_name)))
543 return &ref_rev_parse_rules[num_rules] - p;
545 return 0;
549 * Given a 'prefix' expand it by the rules in 'ref_rev_parse_rules' and add
550 * the results to 'prefixes'
552 void expand_ref_prefix(struct strvec *prefixes, const char *prefix)
554 const char **p;
555 int len = strlen(prefix);
557 for (p = ref_rev_parse_rules; *p; p++)
558 strvec_pushf(prefixes, *p, len, prefix);
561 static const char default_branch_name_advice[] = N_(
562 "Using '%s' as the name for the initial branch. This default branch name\n"
563 "is subject to change. To configure the initial branch name to use in all\n"
564 "of your new repositories, which will suppress this warning, call:\n"
565 "\n"
566 "\tgit config --global init.defaultBranch <name>\n"
567 "\n"
568 "Names commonly chosen instead of 'master' are 'main', 'trunk' and\n"
569 "'development'. The just-created branch can be renamed via this command:\n"
570 "\n"
571 "\tgit branch -m <name>\n"
574 char *repo_default_branch_name(struct repository *r, int quiet)
576 const char *config_key = "init.defaultbranch";
577 const char *config_display_key = "init.defaultBranch";
578 char *ret = NULL, *full_ref;
579 const char *env = getenv("GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME");
581 if (env && *env)
582 ret = xstrdup(env);
583 else if (repo_config_get_string(r, config_key, &ret) < 0)
584 die(_("could not retrieve `%s`"), config_display_key);
586 if (!ret) {
587 ret = xstrdup("master");
588 if (!quiet)
589 advise(_(default_branch_name_advice), ret);
592 full_ref = xstrfmt("refs/heads/%s", ret);
593 if (check_refname_format(full_ref, 0))
594 die(_("invalid branch name: %s = %s"), config_display_key, ret);
595 free(full_ref);
597 return ret;
600 const char *git_default_branch_name(int quiet)
602 static char *ret;
604 if (!ret)
605 ret = repo_default_branch_name(the_repository, quiet);
607 return ret;
611 * *string and *len will only be substituted, and *string returned (for
612 * later free()ing) if the string passed in is a magic short-hand form
613 * to name a branch.
615 static char *substitute_branch_name(struct repository *r,
616 const char **string, int *len,
617 int nonfatal_dangling_mark)
619 struct strbuf buf = STRBUF_INIT;
620 struct interpret_branch_name_options options = {
621 .nonfatal_dangling_mark = nonfatal_dangling_mark
623 int ret = repo_interpret_branch_name(r, *string, *len, &buf, &options);
625 if (ret == *len) {
626 size_t size;
627 *string = strbuf_detach(&buf, &size);
628 *len = size;
629 return (char *)*string;
632 return NULL;
635 int repo_dwim_ref(struct repository *r, const char *str, int len,
636 struct object_id *oid, char **ref, int nonfatal_dangling_mark)
638 char *last_branch = substitute_branch_name(r, &str, &len,
639 nonfatal_dangling_mark);
640 int refs_found = expand_ref(r, str, len, oid, ref);
641 free(last_branch);
642 return refs_found;
645 int expand_ref(struct repository *repo, const char *str, int len,
646 struct object_id *oid, char **ref)
648 const char **p, *r;
649 int refs_found = 0;
650 struct strbuf fullref = STRBUF_INIT;
652 *ref = NULL;
653 for (p = ref_rev_parse_rules; *p; p++) {
654 struct object_id oid_from_ref;
655 struct object_id *this_result;
656 int flag;
658 this_result = refs_found ? &oid_from_ref : oid;
659 strbuf_reset(&fullref);
660 strbuf_addf(&fullref, *p, len, str);
661 r = refs_resolve_ref_unsafe(get_main_ref_store(repo),
662 fullref.buf, RESOLVE_REF_READING,
663 this_result, &flag);
664 if (r) {
665 if (!refs_found++)
666 *ref = xstrdup(r);
667 if (!warn_ambiguous_refs)
668 break;
669 } else if ((flag & REF_ISSYMREF) && strcmp(fullref.buf, "HEAD")) {
670 warning(_("ignoring dangling symref %s"), fullref.buf);
671 } else if ((flag & REF_ISBROKEN) && strchr(fullref.buf, '/')) {
672 warning(_("ignoring broken ref %s"), fullref.buf);
675 strbuf_release(&fullref);
676 return refs_found;
679 int repo_dwim_log(struct repository *r, const char *str, int len,
680 struct object_id *oid, char **log)
682 struct ref_store *refs = get_main_ref_store(r);
683 char *last_branch = substitute_branch_name(r, &str, &len, 0);
684 const char **p;
685 int logs_found = 0;
686 struct strbuf path = STRBUF_INIT;
688 *log = NULL;
689 for (p = ref_rev_parse_rules; *p; p++) {
690 struct object_id hash;
691 const char *ref, *it;
693 strbuf_reset(&path);
694 strbuf_addf(&path, *p, len, str);
695 ref = refs_resolve_ref_unsafe(refs, path.buf,
696 RESOLVE_REF_READING,
697 oid ? &hash : NULL, NULL);
698 if (!ref)
699 continue;
700 if (refs_reflog_exists(refs, path.buf))
701 it = path.buf;
702 else if (strcmp(ref, path.buf) &&
703 refs_reflog_exists(refs, ref))
704 it = ref;
705 else
706 continue;
707 if (!logs_found++) {
708 *log = xstrdup(it);
709 if (oid)
710 oidcpy(oid, &hash);
712 if (!warn_ambiguous_refs)
713 break;
715 strbuf_release(&path);
716 free(last_branch);
717 return logs_found;
720 int dwim_log(const char *str, int len, struct object_id *oid, char **log)
722 return repo_dwim_log(the_repository, str, len, oid, log);
725 static int is_per_worktree_ref(const char *refname)
727 return starts_with(refname, "refs/worktree/") ||
728 starts_with(refname, "refs/bisect/") ||
729 starts_with(refname, "refs/rewritten/");
732 static int is_pseudoref_syntax(const char *refname)
734 const char *c;
736 for (c = refname; *c; c++) {
737 if (!isupper(*c) && *c != '-' && *c != '_')
738 return 0;
741 return 1;
744 static int is_main_pseudoref_syntax(const char *refname)
746 return skip_prefix(refname, "main-worktree/", &refname) &&
747 *refname &&
748 is_pseudoref_syntax(refname);
751 static int is_other_pseudoref_syntax(const char *refname)
753 if (!skip_prefix(refname, "worktrees/", &refname))
754 return 0;
755 refname = strchr(refname, '/');
756 if (!refname || !refname[1])
757 return 0;
758 return is_pseudoref_syntax(refname + 1);
761 enum ref_type ref_type(const char *refname)
763 if (is_per_worktree_ref(refname))
764 return REF_TYPE_PER_WORKTREE;
765 if (is_pseudoref_syntax(refname))
766 return REF_TYPE_PSEUDOREF;
767 if (is_main_pseudoref_syntax(refname))
768 return REF_TYPE_MAIN_PSEUDOREF;
769 if (is_other_pseudoref_syntax(refname))
770 return REF_TYPE_OTHER_PSEUDOREF;
771 return REF_TYPE_NORMAL;
774 long get_files_ref_lock_timeout_ms(void)
776 static int configured = 0;
778 /* The default timeout is 100 ms: */
779 static int timeout_ms = 100;
781 if (!configured) {
782 git_config_get_int("core.filesreflocktimeout", &timeout_ms);
783 configured = 1;
786 return timeout_ms;
789 int refs_delete_ref(struct ref_store *refs, const char *msg,
790 const char *refname,
791 const struct object_id *old_oid,
792 unsigned int flags)
794 struct ref_transaction *transaction;
795 struct strbuf err = STRBUF_INIT;
797 transaction = ref_store_transaction_begin(refs, &err);
798 if (!transaction ||
799 ref_transaction_delete(transaction, refname, old_oid,
800 flags, msg, &err) ||
801 ref_transaction_commit(transaction, &err)) {
802 error("%s", err.buf);
803 ref_transaction_free(transaction);
804 strbuf_release(&err);
805 return 1;
807 ref_transaction_free(transaction);
808 strbuf_release(&err);
809 return 0;
812 int delete_ref(const char *msg, const char *refname,
813 const struct object_id *old_oid, unsigned int flags)
815 return refs_delete_ref(get_main_ref_store(the_repository), msg, refname,
816 old_oid, flags);
819 static void copy_reflog_msg(struct strbuf *sb, const char *msg)
821 char c;
822 int wasspace = 1;
824 while ((c = *msg++)) {
825 if (wasspace && isspace(c))
826 continue;
827 wasspace = isspace(c);
828 if (wasspace)
829 c = ' ';
830 strbuf_addch(sb, c);
832 strbuf_rtrim(sb);
835 static char *normalize_reflog_message(const char *msg)
837 struct strbuf sb = STRBUF_INIT;
839 if (msg && *msg)
840 copy_reflog_msg(&sb, msg);
841 return strbuf_detach(&sb, NULL);
844 int should_autocreate_reflog(const char *refname)
846 switch (log_all_ref_updates) {
847 case LOG_REFS_ALWAYS:
848 return 1;
849 case LOG_REFS_NORMAL:
850 return starts_with(refname, "refs/heads/") ||
851 starts_with(refname, "refs/remotes/") ||
852 starts_with(refname, "refs/notes/") ||
853 !strcmp(refname, "HEAD");
854 default:
855 return 0;
859 int is_branch(const char *refname)
861 return !strcmp(refname, "HEAD") || starts_with(refname, "refs/heads/");
864 struct read_ref_at_cb {
865 const char *refname;
866 timestamp_t at_time;
867 int cnt;
868 int reccnt;
869 struct object_id *oid;
870 int found_it;
872 struct object_id ooid;
873 struct object_id noid;
874 int tz;
875 timestamp_t date;
876 char **msg;
877 timestamp_t *cutoff_time;
878 int *cutoff_tz;
879 int *cutoff_cnt;
882 static void set_read_ref_cutoffs(struct read_ref_at_cb *cb,
883 timestamp_t timestamp, int tz, const char *message)
885 if (cb->msg)
886 *cb->msg = xstrdup(message);
887 if (cb->cutoff_time)
888 *cb->cutoff_time = timestamp;
889 if (cb->cutoff_tz)
890 *cb->cutoff_tz = tz;
891 if (cb->cutoff_cnt)
892 *cb->cutoff_cnt = cb->reccnt;
895 static int read_ref_at_ent(struct object_id *ooid, struct object_id *noid,
896 const char *email, timestamp_t timestamp, int tz,
897 const char *message, void *cb_data)
899 struct read_ref_at_cb *cb = cb_data;
900 int reached_count;
902 cb->tz = tz;
903 cb->date = timestamp;
906 * It is not possible for cb->cnt == 0 on the first iteration because
907 * that special case is handled in read_ref_at().
909 if (cb->cnt > 0)
910 cb->cnt--;
911 reached_count = cb->cnt == 0 && !is_null_oid(ooid);
912 if (timestamp <= cb->at_time || reached_count) {
913 set_read_ref_cutoffs(cb, timestamp, tz, message);
915 * we have not yet updated cb->[n|o]oid so they still
916 * hold the values for the previous record.
918 if (!is_null_oid(&cb->ooid) && !oideq(&cb->ooid, noid))
919 warning(_("log for ref %s has gap after %s"),
920 cb->refname, show_date(cb->date, cb->tz, DATE_MODE(RFC2822)));
921 if (reached_count)
922 oidcpy(cb->oid, ooid);
923 else if (!is_null_oid(&cb->ooid) || cb->date == cb->at_time)
924 oidcpy(cb->oid, noid);
925 else if (!oideq(noid, cb->oid))
926 warning(_("log for ref %s unexpectedly ended on %s"),
927 cb->refname, show_date(cb->date, cb->tz,
928 DATE_MODE(RFC2822)));
929 cb->found_it = 1;
931 cb->reccnt++;
932 oidcpy(&cb->ooid, ooid);
933 oidcpy(&cb->noid, noid);
934 return cb->found_it;
937 static int read_ref_at_ent_newest(struct object_id *ooid, struct object_id *noid,
938 const char *email, timestamp_t timestamp,
939 int tz, const char *message, void *cb_data)
941 struct read_ref_at_cb *cb = cb_data;
943 set_read_ref_cutoffs(cb, timestamp, tz, message);
944 oidcpy(cb->oid, noid);
945 /* We just want the first entry */
946 return 1;
949 static int read_ref_at_ent_oldest(struct object_id *ooid, struct object_id *noid,
950 const char *email, timestamp_t timestamp,
951 int tz, const char *message, void *cb_data)
953 struct read_ref_at_cb *cb = cb_data;
955 set_read_ref_cutoffs(cb, timestamp, tz, message);
956 oidcpy(cb->oid, ooid);
957 if (is_null_oid(cb->oid))
958 oidcpy(cb->oid, noid);
959 /* We just want the first entry */
960 return 1;
963 int read_ref_at(struct ref_store *refs, const char *refname,
964 unsigned int flags, timestamp_t at_time, int cnt,
965 struct object_id *oid, char **msg,
966 timestamp_t *cutoff_time, int *cutoff_tz, int *cutoff_cnt)
968 struct read_ref_at_cb cb;
970 memset(&cb, 0, sizeof(cb));
971 cb.refname = refname;
972 cb.at_time = at_time;
973 cb.cnt = cnt;
974 cb.msg = msg;
975 cb.cutoff_time = cutoff_time;
976 cb.cutoff_tz = cutoff_tz;
977 cb.cutoff_cnt = cutoff_cnt;
978 cb.oid = oid;
980 if (cb.cnt == 0) {
981 refs_for_each_reflog_ent_reverse(refs, refname, read_ref_at_ent_newest, &cb);
982 return 0;
985 refs_for_each_reflog_ent_reverse(refs, refname, read_ref_at_ent, &cb);
987 if (!cb.reccnt) {
988 if (flags & GET_OID_QUIETLY)
989 exit(128);
990 else
991 die(_("log for %s is empty"), refname);
993 if (cb.found_it)
994 return 0;
996 refs_for_each_reflog_ent(refs, refname, read_ref_at_ent_oldest, &cb);
998 return 1;
1001 struct ref_transaction *ref_store_transaction_begin(struct ref_store *refs,
1002 struct strbuf *err)
1004 struct ref_transaction *tr;
1005 assert(err);
1007 CALLOC_ARRAY(tr, 1);
1008 tr->ref_store = refs;
1009 return tr;
1012 struct ref_transaction *ref_transaction_begin(struct strbuf *err)
1014 return ref_store_transaction_begin(get_main_ref_store(the_repository), err);
1017 void ref_transaction_free(struct ref_transaction *transaction)
1019 size_t i;
1021 if (!transaction)
1022 return;
1024 switch (transaction->state) {
1025 case REF_TRANSACTION_OPEN:
1026 case REF_TRANSACTION_CLOSED:
1027 /* OK */
1028 break;
1029 case REF_TRANSACTION_PREPARED:
1030 BUG("free called on a prepared reference transaction");
1031 break;
1032 default:
1033 BUG("unexpected reference transaction state");
1034 break;
1037 for (i = 0; i < transaction->nr; i++) {
1038 free(transaction->updates[i]->msg);
1039 free(transaction->updates[i]);
1041 free(transaction->updates);
1042 free(transaction);
1045 struct ref_update *ref_transaction_add_update(
1046 struct ref_transaction *transaction,
1047 const char *refname, unsigned int flags,
1048 const struct object_id *new_oid,
1049 const struct object_id *old_oid,
1050 const char *msg)
1052 struct ref_update *update;
1054 if (transaction->state != REF_TRANSACTION_OPEN)
1055 BUG("update called for transaction that is not open");
1057 FLEX_ALLOC_STR(update, refname, refname);
1058 ALLOC_GROW(transaction->updates, transaction->nr + 1, transaction->alloc);
1059 transaction->updates[transaction->nr++] = update;
1061 update->flags = flags;
1063 if (flags & REF_HAVE_NEW)
1064 oidcpy(&update->new_oid, new_oid);
1065 if (flags & REF_HAVE_OLD)
1066 oidcpy(&update->old_oid, old_oid);
1067 update->msg = normalize_reflog_message(msg);
1068 return update;
1071 int ref_transaction_update(struct ref_transaction *transaction,
1072 const char *refname,
1073 const struct object_id *new_oid,
1074 const struct object_id *old_oid,
1075 unsigned int flags, const char *msg,
1076 struct strbuf *err)
1078 assert(err);
1080 if ((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);
1091 flags |= (new_oid ? REF_HAVE_NEW : 0) | (old_oid ? REF_HAVE_OLD : 0);
1093 ref_transaction_add_update(transaction, refname, flags,
1094 new_oid, old_oid, msg);
1095 return 0;
1098 int ref_transaction_create(struct ref_transaction *transaction,
1099 const char *refname,
1100 const struct object_id *new_oid,
1101 unsigned int flags, const char *msg,
1102 struct strbuf *err)
1104 if (!new_oid || is_null_oid(new_oid))
1105 BUG("create called without valid new_oid");
1106 return ref_transaction_update(transaction, refname, new_oid,
1107 null_oid(), flags, msg, err);
1110 int ref_transaction_delete(struct ref_transaction *transaction,
1111 const char *refname,
1112 const struct object_id *old_oid,
1113 unsigned int flags, const char *msg,
1114 struct strbuf *err)
1116 if (old_oid && is_null_oid(old_oid))
1117 BUG("delete called with old_oid set to zeros");
1118 return ref_transaction_update(transaction, refname,
1119 null_oid(), old_oid,
1120 flags, msg, err);
1123 int ref_transaction_verify(struct ref_transaction *transaction,
1124 const char *refname,
1125 const struct object_id *old_oid,
1126 unsigned int flags,
1127 struct strbuf *err)
1129 if (!old_oid)
1130 BUG("verify called with old_oid set to NULL");
1131 return ref_transaction_update(transaction, refname,
1132 NULL, old_oid,
1133 flags, NULL, err);
1136 int refs_update_ref(struct ref_store *refs, const char *msg,
1137 const char *refname, const struct object_id *new_oid,
1138 const struct object_id *old_oid, unsigned int flags,
1139 enum action_on_err onerr)
1141 struct ref_transaction *t = NULL;
1142 struct strbuf err = STRBUF_INIT;
1143 int ret = 0;
1145 t = ref_store_transaction_begin(refs, &err);
1146 if (!t ||
1147 ref_transaction_update(t, refname, new_oid, old_oid, flags, msg,
1148 &err) ||
1149 ref_transaction_commit(t, &err)) {
1150 ret = 1;
1151 ref_transaction_free(t);
1153 if (ret) {
1154 const char *str = _("update_ref failed for ref '%s': %s");
1156 switch (onerr) {
1157 case UPDATE_REFS_MSG_ON_ERR:
1158 error(str, refname, err.buf);
1159 break;
1160 case UPDATE_REFS_DIE_ON_ERR:
1161 die(str, refname, err.buf);
1162 break;
1163 case UPDATE_REFS_QUIET_ON_ERR:
1164 break;
1166 strbuf_release(&err);
1167 return 1;
1169 strbuf_release(&err);
1170 if (t)
1171 ref_transaction_free(t);
1172 return 0;
1175 int update_ref(const char *msg, const char *refname,
1176 const struct object_id *new_oid,
1177 const struct object_id *old_oid,
1178 unsigned int flags, enum action_on_err onerr)
1180 return refs_update_ref(get_main_ref_store(the_repository), msg, refname, new_oid,
1181 old_oid, flags, onerr);
1184 char *refs_shorten_unambiguous_ref(struct ref_store *refs,
1185 const char *refname, int strict)
1187 int i;
1188 static char **scanf_fmts;
1189 static int nr_rules;
1190 char *short_name;
1191 struct strbuf resolved_buf = STRBUF_INIT;
1193 if (!nr_rules) {
1195 * Pre-generate scanf formats from ref_rev_parse_rules[].
1196 * Generate a format suitable for scanf from a
1197 * ref_rev_parse_rules rule by interpolating "%s" at the
1198 * location of the "%.*s".
1200 size_t total_len = 0;
1201 size_t offset = 0;
1203 /* the rule list is NULL terminated, count them first */
1204 for (nr_rules = 0; ref_rev_parse_rules[nr_rules]; nr_rules++)
1205 /* -2 for strlen("%.*s") - strlen("%s"); +1 for NUL */
1206 total_len += strlen(ref_rev_parse_rules[nr_rules]) - 2 + 1;
1208 scanf_fmts = xmalloc(st_add(st_mult(sizeof(char *), nr_rules), total_len));
1210 offset = 0;
1211 for (i = 0; i < nr_rules; i++) {
1212 assert(offset < total_len);
1213 scanf_fmts[i] = (char *)&scanf_fmts[nr_rules] + offset;
1214 offset += xsnprintf(scanf_fmts[i], total_len - offset,
1215 ref_rev_parse_rules[i], 2, "%s") + 1;
1219 /* bail out if there are no rules */
1220 if (!nr_rules)
1221 return xstrdup(refname);
1223 /* buffer for scanf result, at most refname must fit */
1224 short_name = xstrdup(refname);
1226 /* skip first rule, it will always match */
1227 for (i = nr_rules - 1; i > 0 ; --i) {
1228 int j;
1229 int rules_to_fail = i;
1230 int short_name_len;
1232 if (1 != sscanf(refname, scanf_fmts[i], short_name))
1233 continue;
1235 short_name_len = strlen(short_name);
1238 * in strict mode, all (except the matched one) rules
1239 * must fail to resolve to a valid non-ambiguous ref
1241 if (strict)
1242 rules_to_fail = nr_rules;
1245 * check if the short name resolves to a valid ref,
1246 * but use only rules prior to the matched one
1248 for (j = 0; j < rules_to_fail; j++) {
1249 const char *rule = ref_rev_parse_rules[j];
1251 /* skip matched rule */
1252 if (i == j)
1253 continue;
1256 * the short name is ambiguous, if it resolves
1257 * (with this previous rule) to a valid ref
1258 * read_ref() returns 0 on success
1260 strbuf_reset(&resolved_buf);
1261 strbuf_addf(&resolved_buf, rule,
1262 short_name_len, short_name);
1263 if (refs_ref_exists(refs, resolved_buf.buf))
1264 break;
1268 * short name is non-ambiguous if all previous rules
1269 * haven't resolved to a valid ref
1271 if (j == rules_to_fail) {
1272 strbuf_release(&resolved_buf);
1273 return short_name;
1277 strbuf_release(&resolved_buf);
1278 free(short_name);
1279 return xstrdup(refname);
1282 char *shorten_unambiguous_ref(const char *refname, int strict)
1284 return refs_shorten_unambiguous_ref(get_main_ref_store(the_repository),
1285 refname, strict);
1288 static struct string_list *hide_refs;
1290 int parse_hide_refs_config(const char *var, const char *value, const char *section)
1292 const char *key;
1293 if (!strcmp("transfer.hiderefs", var) ||
1294 (!parse_config_key(var, section, NULL, NULL, &key) &&
1295 !strcmp(key, "hiderefs"))) {
1296 char *ref;
1297 int len;
1299 if (!value)
1300 return config_error_nonbool(var);
1301 ref = xstrdup(value);
1302 len = strlen(ref);
1303 while (len && ref[len - 1] == '/')
1304 ref[--len] = '\0';
1305 if (!hide_refs) {
1306 CALLOC_ARRAY(hide_refs, 1);
1307 hide_refs->strdup_strings = 1;
1309 string_list_append(hide_refs, ref);
1311 return 0;
1314 int ref_is_hidden(const char *refname, const char *refname_full)
1316 int i;
1318 if (!hide_refs)
1319 return 0;
1320 for (i = hide_refs->nr - 1; i >= 0; i--) {
1321 const char *match = hide_refs->items[i].string;
1322 const char *subject;
1323 int neg = 0;
1324 const char *p;
1326 if (*match == '!') {
1327 neg = 1;
1328 match++;
1331 if (*match == '^') {
1332 subject = refname_full;
1333 match++;
1334 } else {
1335 subject = refname;
1338 /* refname can be NULL when namespaces are used. */
1339 if (subject &&
1340 skip_prefix(subject, match, &p) &&
1341 (!*p || *p == '/'))
1342 return !neg;
1344 return 0;
1347 const char *find_descendant_ref(const char *dirname,
1348 const struct string_list *extras,
1349 const struct string_list *skip)
1351 int pos;
1353 if (!extras)
1354 return NULL;
1357 * Look at the place where dirname would be inserted into
1358 * extras. If there is an entry at that position that starts
1359 * with dirname (remember, dirname includes the trailing
1360 * slash) and is not in skip, then we have a conflict.
1362 for (pos = string_list_find_insert_index(extras, dirname, 0);
1363 pos < extras->nr; pos++) {
1364 const char *extra_refname = extras->items[pos].string;
1366 if (!starts_with(extra_refname, dirname))
1367 break;
1369 if (!skip || !string_list_has_string(skip, extra_refname))
1370 return extra_refname;
1372 return NULL;
1375 int refs_rename_ref_available(struct ref_store *refs,
1376 const char *old_refname,
1377 const char *new_refname)
1379 struct string_list skip = STRING_LIST_INIT_NODUP;
1380 struct strbuf err = STRBUF_INIT;
1381 int ok;
1383 string_list_insert(&skip, old_refname);
1384 ok = !refs_verify_refname_available(refs, new_refname,
1385 NULL, &skip, &err);
1386 if (!ok)
1387 error("%s", err.buf);
1389 string_list_clear(&skip, 0);
1390 strbuf_release(&err);
1391 return ok;
1394 int refs_head_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
1396 struct object_id oid;
1397 int flag;
1399 if (!refs_read_ref_full(refs, "HEAD", RESOLVE_REF_READING,
1400 &oid, &flag))
1401 return fn("HEAD", &oid, flag, cb_data);
1403 return 0;
1406 int head_ref(each_ref_fn fn, void *cb_data)
1408 return refs_head_ref(get_main_ref_store(the_repository), fn, cb_data);
1411 struct ref_iterator *refs_ref_iterator_begin(
1412 struct ref_store *refs,
1413 const char *prefix, int trim,
1414 enum do_for_each_ref_flags flags)
1416 struct ref_iterator *iter;
1418 if (!(flags & DO_FOR_EACH_INCLUDE_BROKEN)) {
1419 static int ref_paranoia = -1;
1421 if (ref_paranoia < 0)
1422 ref_paranoia = git_env_bool("GIT_REF_PARANOIA", 1);
1423 if (ref_paranoia) {
1424 flags |= DO_FOR_EACH_INCLUDE_BROKEN;
1425 flags |= DO_FOR_EACH_OMIT_DANGLING_SYMREFS;
1429 iter = refs->be->iterator_begin(refs, prefix, flags);
1432 * `iterator_begin()` already takes care of prefix, but we
1433 * might need to do some trimming:
1435 if (trim)
1436 iter = prefix_ref_iterator_begin(iter, "", trim);
1438 /* Sanity check for subclasses: */
1439 if (!iter->ordered)
1440 BUG("reference iterator is not ordered");
1442 return iter;
1446 * Call fn for each reference in the specified submodule for which the
1447 * refname begins with prefix. If trim is non-zero, then trim that
1448 * many characters off the beginning of each refname before passing
1449 * the refname to fn. flags can be DO_FOR_EACH_INCLUDE_BROKEN to
1450 * include broken references in the iteration. If fn ever returns a
1451 * non-zero value, stop the iteration and return that value;
1452 * otherwise, return 0.
1454 static int do_for_each_repo_ref(struct repository *r, const char *prefix,
1455 each_repo_ref_fn fn, int trim, int flags,
1456 void *cb_data)
1458 struct ref_iterator *iter;
1459 struct ref_store *refs = get_main_ref_store(r);
1461 if (!refs)
1462 return 0;
1464 iter = refs_ref_iterator_begin(refs, prefix, trim, flags);
1466 return do_for_each_repo_ref_iterator(r, iter, fn, cb_data);
1469 struct do_for_each_ref_help {
1470 each_ref_fn *fn;
1471 void *cb_data;
1474 static int do_for_each_ref_helper(struct repository *r,
1475 const char *refname,
1476 const struct object_id *oid,
1477 int flags,
1478 void *cb_data)
1480 struct do_for_each_ref_help *hp = cb_data;
1482 return hp->fn(refname, oid, flags, hp->cb_data);
1485 static int do_for_each_ref(struct ref_store *refs, const char *prefix,
1486 each_ref_fn fn, int trim,
1487 enum do_for_each_ref_flags flags, void *cb_data)
1489 struct ref_iterator *iter;
1490 struct do_for_each_ref_help hp = { fn, cb_data };
1492 if (!refs)
1493 return 0;
1495 iter = refs_ref_iterator_begin(refs, prefix, trim, flags);
1497 return do_for_each_repo_ref_iterator(the_repository, iter,
1498 do_for_each_ref_helper, &hp);
1501 int refs_for_each_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
1503 return do_for_each_ref(refs, "", fn, 0, 0, cb_data);
1506 int for_each_ref(each_ref_fn fn, void *cb_data)
1508 return refs_for_each_ref(get_main_ref_store(the_repository), fn, cb_data);
1511 int refs_for_each_ref_in(struct ref_store *refs, const char *prefix,
1512 each_ref_fn fn, void *cb_data)
1514 return do_for_each_ref(refs, prefix, fn, strlen(prefix), 0, cb_data);
1517 int for_each_ref_in(const char *prefix, each_ref_fn fn, void *cb_data)
1519 return refs_for_each_ref_in(get_main_ref_store(the_repository), prefix, fn, cb_data);
1522 int for_each_fullref_in(const char *prefix, each_ref_fn fn, void *cb_data)
1524 return do_for_each_ref(get_main_ref_store(the_repository),
1525 prefix, fn, 0, 0, cb_data);
1528 int refs_for_each_fullref_in(struct ref_store *refs, const char *prefix,
1529 each_ref_fn fn, void *cb_data)
1531 return do_for_each_ref(refs, prefix, fn, 0, 0, cb_data);
1534 int for_each_replace_ref(struct repository *r, each_repo_ref_fn fn, void *cb_data)
1536 return do_for_each_repo_ref(r, git_replace_ref_base, fn,
1537 strlen(git_replace_ref_base),
1538 DO_FOR_EACH_INCLUDE_BROKEN, cb_data);
1541 int for_each_namespaced_ref(each_ref_fn fn, void *cb_data)
1543 struct strbuf buf = STRBUF_INIT;
1544 int ret;
1545 strbuf_addf(&buf, "%srefs/", get_git_namespace());
1546 ret = do_for_each_ref(get_main_ref_store(the_repository),
1547 buf.buf, fn, 0, 0, cb_data);
1548 strbuf_release(&buf);
1549 return ret;
1552 int refs_for_each_rawref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
1554 return do_for_each_ref(refs, "", fn, 0,
1555 DO_FOR_EACH_INCLUDE_BROKEN, cb_data);
1558 int for_each_rawref(each_ref_fn fn, void *cb_data)
1560 return refs_for_each_rawref(get_main_ref_store(the_repository), fn, cb_data);
1563 static int qsort_strcmp(const void *va, const void *vb)
1565 const char *a = *(const char **)va;
1566 const char *b = *(const char **)vb;
1568 return strcmp(a, b);
1571 static void find_longest_prefixes_1(struct string_list *out,
1572 struct strbuf *prefix,
1573 const char **patterns, size_t nr)
1575 size_t i;
1577 for (i = 0; i < nr; i++) {
1578 char c = patterns[i][prefix->len];
1579 if (!c || is_glob_special(c)) {
1580 string_list_append(out, prefix->buf);
1581 return;
1585 i = 0;
1586 while (i < nr) {
1587 size_t end;
1590 * Set "end" to the index of the element _after_ the last one
1591 * in our group.
1593 for (end = i + 1; end < nr; end++) {
1594 if (patterns[i][prefix->len] != patterns[end][prefix->len])
1595 break;
1598 strbuf_addch(prefix, patterns[i][prefix->len]);
1599 find_longest_prefixes_1(out, prefix, patterns + i, end - i);
1600 strbuf_setlen(prefix, prefix->len - 1);
1602 i = end;
1606 static void find_longest_prefixes(struct string_list *out,
1607 const char **patterns)
1609 struct strvec sorted = STRVEC_INIT;
1610 struct strbuf prefix = STRBUF_INIT;
1612 strvec_pushv(&sorted, patterns);
1613 QSORT(sorted.v, sorted.nr, qsort_strcmp);
1615 find_longest_prefixes_1(out, &prefix, sorted.v, sorted.nr);
1617 strvec_clear(&sorted);
1618 strbuf_release(&prefix);
1621 int for_each_fullref_in_prefixes(const char *namespace,
1622 const char **patterns,
1623 each_ref_fn fn, void *cb_data)
1625 struct string_list prefixes = STRING_LIST_INIT_DUP;
1626 struct string_list_item *prefix;
1627 struct strbuf buf = STRBUF_INIT;
1628 int ret = 0, namespace_len;
1630 find_longest_prefixes(&prefixes, patterns);
1632 if (namespace)
1633 strbuf_addstr(&buf, namespace);
1634 namespace_len = buf.len;
1636 for_each_string_list_item(prefix, &prefixes) {
1637 strbuf_addstr(&buf, prefix->string);
1638 ret = for_each_fullref_in(buf.buf, fn, cb_data);
1639 if (ret)
1640 break;
1641 strbuf_setlen(&buf, namespace_len);
1644 string_list_clear(&prefixes, 0);
1645 strbuf_release(&buf);
1646 return ret;
1649 static int refs_read_special_head(struct ref_store *ref_store,
1650 const char *refname, struct object_id *oid,
1651 struct strbuf *referent, unsigned int *type)
1653 struct strbuf full_path = STRBUF_INIT;
1654 struct strbuf content = STRBUF_INIT;
1655 int result = -1;
1656 strbuf_addf(&full_path, "%s/%s", ref_store->gitdir, refname);
1658 if (strbuf_read_file(&content, full_path.buf, 0) < 0)
1659 goto done;
1661 result = parse_loose_ref_contents(content.buf, oid, referent, type);
1663 done:
1664 strbuf_release(&full_path);
1665 strbuf_release(&content);
1666 return result;
1669 int refs_read_raw_ref(struct ref_store *ref_store,
1670 const char *refname, struct object_id *oid,
1671 struct strbuf *referent, unsigned int *type)
1673 if (!strcmp(refname, "FETCH_HEAD") || !strcmp(refname, "MERGE_HEAD")) {
1674 return refs_read_special_head(ref_store, refname, oid, referent,
1675 type);
1678 return ref_store->be->read_raw_ref(ref_store, refname, oid, referent,
1679 type, &errno);
1682 /* This function needs to return a meaningful errno on failure */
1683 const char *refs_resolve_ref_unsafe(struct ref_store *refs,
1684 const char *refname,
1685 int resolve_flags,
1686 struct object_id *oid, int *flags)
1688 static struct strbuf sb_refname = STRBUF_INIT;
1689 struct object_id unused_oid;
1690 int unused_flags;
1691 int symref_count;
1693 if (!oid)
1694 oid = &unused_oid;
1695 if (!flags)
1696 flags = &unused_flags;
1698 *flags = 0;
1700 if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
1701 if (!(resolve_flags & RESOLVE_REF_ALLOW_BAD_NAME) ||
1702 !refname_is_safe(refname)) {
1703 errno = EINVAL;
1704 return NULL;
1708 * dwim_ref() uses REF_ISBROKEN to distinguish between
1709 * missing refs and refs that were present but invalid,
1710 * to complain about the latter to stderr.
1712 * We don't know whether the ref exists, so don't set
1713 * REF_ISBROKEN yet.
1715 *flags |= REF_BAD_NAME;
1718 for (symref_count = 0; symref_count < SYMREF_MAXDEPTH; symref_count++) {
1719 unsigned int read_flags = 0;
1721 if (refs_read_raw_ref(refs, refname,
1722 oid, &sb_refname, &read_flags)) {
1723 *flags |= read_flags;
1725 /* In reading mode, refs must eventually resolve */
1726 if (resolve_flags & RESOLVE_REF_READING)
1727 return NULL;
1730 * Otherwise a missing ref is OK. But the files backend
1731 * may show errors besides ENOENT if there are
1732 * similarly-named refs.
1734 if (errno != ENOENT &&
1735 errno != EISDIR &&
1736 errno != ENOTDIR)
1737 return NULL;
1739 oidclr(oid);
1740 if (*flags & REF_BAD_NAME)
1741 *flags |= REF_ISBROKEN;
1742 return refname;
1745 *flags |= read_flags;
1747 if (!(read_flags & REF_ISSYMREF)) {
1748 if (*flags & REF_BAD_NAME) {
1749 oidclr(oid);
1750 *flags |= REF_ISBROKEN;
1752 return refname;
1755 refname = sb_refname.buf;
1756 if (resolve_flags & RESOLVE_REF_NO_RECURSE) {
1757 oidclr(oid);
1758 return refname;
1760 if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
1761 if (!(resolve_flags & RESOLVE_REF_ALLOW_BAD_NAME) ||
1762 !refname_is_safe(refname)) {
1763 errno = EINVAL;
1764 return NULL;
1767 *flags |= REF_ISBROKEN | REF_BAD_NAME;
1771 errno = ELOOP;
1772 return NULL;
1775 /* backend functions */
1776 int refs_init_db(struct strbuf *err)
1778 struct ref_store *refs = get_main_ref_store(the_repository);
1780 return refs->be->init_db(refs, err);
1783 const char *resolve_ref_unsafe(const char *refname, int resolve_flags,
1784 struct object_id *oid, int *flags)
1786 return refs_resolve_ref_unsafe(get_main_ref_store(the_repository), refname,
1787 resolve_flags, oid, flags);
1790 int resolve_gitlink_ref(const char *submodule, const char *refname,
1791 struct object_id *oid)
1793 struct ref_store *refs;
1794 int flags;
1796 refs = get_submodule_ref_store(submodule);
1798 if (!refs)
1799 return -1;
1801 if (!refs_resolve_ref_unsafe(refs, refname, 0, oid, &flags) ||
1802 is_null_oid(oid))
1803 return -1;
1804 return 0;
1807 struct ref_store_hash_entry
1809 struct hashmap_entry ent;
1811 struct ref_store *refs;
1813 /* NUL-terminated identifier of the ref store: */
1814 char name[FLEX_ARRAY];
1817 static int ref_store_hash_cmp(const void *unused_cmp_data,
1818 const struct hashmap_entry *eptr,
1819 const struct hashmap_entry *entry_or_key,
1820 const void *keydata)
1822 const struct ref_store_hash_entry *e1, *e2;
1823 const char *name;
1825 e1 = container_of(eptr, const struct ref_store_hash_entry, ent);
1826 e2 = container_of(entry_or_key, const struct ref_store_hash_entry, ent);
1827 name = keydata ? keydata : e2->name;
1829 return strcmp(e1->name, name);
1832 static struct ref_store_hash_entry *alloc_ref_store_hash_entry(
1833 const char *name, struct ref_store *refs)
1835 struct ref_store_hash_entry *entry;
1837 FLEX_ALLOC_STR(entry, name, name);
1838 hashmap_entry_init(&entry->ent, strhash(name));
1839 entry->refs = refs;
1840 return entry;
1843 /* A hashmap of ref_stores, stored by submodule name: */
1844 static struct hashmap submodule_ref_stores;
1846 /* A hashmap of ref_stores, stored by worktree id: */
1847 static struct hashmap worktree_ref_stores;
1850 * Look up a ref store by name. If that ref_store hasn't been
1851 * registered yet, return NULL.
1853 static struct ref_store *lookup_ref_store_map(struct hashmap *map,
1854 const char *name)
1856 struct ref_store_hash_entry *entry;
1857 unsigned int hash;
1859 if (!map->tablesize)
1860 /* It's initialized on demand in register_ref_store(). */
1861 return NULL;
1863 hash = strhash(name);
1864 entry = hashmap_get_entry_from_hash(map, hash, name,
1865 struct ref_store_hash_entry, ent);
1866 return entry ? entry->refs : NULL;
1870 * Create, record, and return a ref_store instance for the specified
1871 * gitdir.
1873 static struct ref_store *ref_store_init(const char *gitdir,
1874 unsigned int flags)
1876 const char *be_name = "files";
1877 struct ref_storage_be *be = find_ref_storage_backend(be_name);
1878 struct ref_store *refs;
1880 if (!be)
1881 BUG("reference backend %s is unknown", be_name);
1883 refs = be->init(gitdir, flags);
1884 return refs;
1887 struct ref_store *get_main_ref_store(struct repository *r)
1889 if (r->refs_private)
1890 return r->refs_private;
1892 if (!r->gitdir)
1893 BUG("attempting to get main_ref_store outside of repository");
1895 r->refs_private = ref_store_init(r->gitdir, REF_STORE_ALL_CAPS);
1896 r->refs_private = maybe_debug_wrap_ref_store(r->gitdir, r->refs_private);
1897 return r->refs_private;
1901 * Associate a ref store with a name. It is a fatal error to call this
1902 * function twice for the same name.
1904 static void register_ref_store_map(struct hashmap *map,
1905 const char *type,
1906 struct ref_store *refs,
1907 const char *name)
1909 struct ref_store_hash_entry *entry;
1911 if (!map->tablesize)
1912 hashmap_init(map, ref_store_hash_cmp, NULL, 0);
1914 entry = alloc_ref_store_hash_entry(name, refs);
1915 if (hashmap_put(map, &entry->ent))
1916 BUG("%s ref_store '%s' initialized twice", type, name);
1919 struct ref_store *get_submodule_ref_store(const char *submodule)
1921 struct strbuf submodule_sb = STRBUF_INIT;
1922 struct ref_store *refs;
1923 char *to_free = NULL;
1924 size_t len;
1926 if (!submodule)
1927 return NULL;
1929 len = strlen(submodule);
1930 while (len && is_dir_sep(submodule[len - 1]))
1931 len--;
1932 if (!len)
1933 return NULL;
1935 if (submodule[len])
1936 /* We need to strip off one or more trailing slashes */
1937 submodule = to_free = xmemdupz(submodule, len);
1939 refs = lookup_ref_store_map(&submodule_ref_stores, submodule);
1940 if (refs)
1941 goto done;
1943 strbuf_addstr(&submodule_sb, submodule);
1944 if (!is_nonbare_repository_dir(&submodule_sb))
1945 goto done;
1947 if (submodule_to_gitdir(&submodule_sb, submodule))
1948 goto done;
1950 /* assume that add_submodule_odb() has been called */
1951 refs = ref_store_init(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(git_common_path("worktrees/%s", wt->id),
1978 REF_STORE_ALL_CAPS);
1979 else
1980 refs = ref_store_init(get_git_common_dir(),
1981 REF_STORE_ALL_CAPS);
1983 if (refs)
1984 register_ref_store_map(&worktree_ref_stores, "worktree",
1985 refs, id);
1986 return refs;
1989 void base_ref_store_init(struct ref_store *refs,
1990 const struct ref_storage_be *be)
1992 refs->be = be;
1995 /* backend functions */
1996 int refs_pack_refs(struct ref_store *refs, unsigned int flags)
1998 return refs->be->pack_refs(refs, flags);
2001 int peel_iterated_oid(const struct object_id *base, struct object_id *peeled)
2003 if (current_ref_iter &&
2004 (current_ref_iter->oid == base ||
2005 oideq(current_ref_iter->oid, base)))
2006 return ref_iterator_peel(current_ref_iter, peeled);
2008 return peel_object(base, peeled) ? -1 : 0;
2011 int refs_create_symref(struct ref_store *refs,
2012 const char *ref_target,
2013 const char *refs_heads_master,
2014 const char *logmsg)
2016 char *msg;
2017 int retval;
2019 msg = normalize_reflog_message(logmsg);
2020 retval = refs->be->create_symref(refs, ref_target, refs_heads_master,
2021 msg);
2022 free(msg);
2023 return retval;
2026 int create_symref(const char *ref_target, const char *refs_heads_master,
2027 const char *logmsg)
2029 return refs_create_symref(get_main_ref_store(the_repository), ref_target,
2030 refs_heads_master, logmsg);
2033 int ref_update_reject_duplicates(struct string_list *refnames,
2034 struct strbuf *err)
2036 size_t i, n = refnames->nr;
2038 assert(err);
2040 for (i = 1; i < n; i++) {
2041 int cmp = strcmp(refnames->items[i - 1].string,
2042 refnames->items[i].string);
2044 if (!cmp) {
2045 strbuf_addf(err,
2046 _("multiple updates for ref '%s' not allowed"),
2047 refnames->items[i].string);
2048 return 1;
2049 } else if (cmp > 0) {
2050 BUG("ref_update_reject_duplicates() received unsorted list");
2053 return 0;
2056 static int run_transaction_hook(struct ref_transaction *transaction,
2057 const char *state)
2059 struct child_process proc = CHILD_PROCESS_INIT;
2060 struct strbuf buf = STRBUF_INIT;
2061 const char *hook;
2062 int ret = 0, i;
2064 hook = find_hook("reference-transaction");
2065 if (!hook)
2066 return ret;
2068 strvec_pushl(&proc.args, hook, state, NULL);
2069 proc.in = -1;
2070 proc.stdout_to_stderr = 1;
2071 proc.trace2_hook_name = "reference-transaction";
2073 ret = start_command(&proc);
2074 if (ret)
2075 return ret;
2077 sigchain_push(SIGPIPE, SIG_IGN);
2079 for (i = 0; i < transaction->nr; i++) {
2080 struct ref_update *update = transaction->updates[i];
2082 strbuf_reset(&buf);
2083 strbuf_addf(&buf, "%s %s %s\n",
2084 oid_to_hex(&update->old_oid),
2085 oid_to_hex(&update->new_oid),
2086 update->refname);
2088 if (write_in_full(proc.in, buf.buf, buf.len) < 0) {
2089 if (errno != EPIPE)
2090 ret = -1;
2091 break;
2095 close(proc.in);
2096 sigchain_pop(SIGPIPE);
2097 strbuf_release(&buf);
2099 ret |= finish_command(&proc);
2100 return ret;
2103 int ref_transaction_prepare(struct ref_transaction *transaction,
2104 struct strbuf *err)
2106 struct ref_store *refs = transaction->ref_store;
2107 int ret;
2109 switch (transaction->state) {
2110 case REF_TRANSACTION_OPEN:
2111 /* Good. */
2112 break;
2113 case REF_TRANSACTION_PREPARED:
2114 BUG("prepare called twice on reference transaction");
2115 break;
2116 case REF_TRANSACTION_CLOSED:
2117 BUG("prepare called on a closed reference transaction");
2118 break;
2119 default:
2120 BUG("unexpected reference transaction state");
2121 break;
2124 if (getenv(GIT_QUARANTINE_ENVIRONMENT)) {
2125 strbuf_addstr(err,
2126 _("ref updates forbidden inside quarantine environment"));
2127 return -1;
2130 ret = refs->be->transaction_prepare(refs, transaction, err);
2131 if (ret)
2132 return ret;
2134 ret = run_transaction_hook(transaction, "prepared");
2135 if (ret) {
2136 ref_transaction_abort(transaction, err);
2137 die(_("ref updates aborted by hook"));
2140 return 0;
2143 int ref_transaction_abort(struct ref_transaction *transaction,
2144 struct strbuf *err)
2146 struct ref_store *refs = transaction->ref_store;
2147 int ret = 0;
2149 switch (transaction->state) {
2150 case REF_TRANSACTION_OPEN:
2151 /* No need to abort explicitly. */
2152 break;
2153 case REF_TRANSACTION_PREPARED:
2154 ret = refs->be->transaction_abort(refs, transaction, err);
2155 break;
2156 case REF_TRANSACTION_CLOSED:
2157 BUG("abort called on a closed reference transaction");
2158 break;
2159 default:
2160 BUG("unexpected reference transaction state");
2161 break;
2164 run_transaction_hook(transaction, "aborted");
2166 ref_transaction_free(transaction);
2167 return ret;
2170 int ref_transaction_commit(struct ref_transaction *transaction,
2171 struct strbuf *err)
2173 struct ref_store *refs = transaction->ref_store;
2174 int ret;
2176 switch (transaction->state) {
2177 case REF_TRANSACTION_OPEN:
2178 /* Need to prepare first. */
2179 ret = ref_transaction_prepare(transaction, err);
2180 if (ret)
2181 return ret;
2182 break;
2183 case REF_TRANSACTION_PREPARED:
2184 /* Fall through to finish. */
2185 break;
2186 case REF_TRANSACTION_CLOSED:
2187 BUG("commit called on a closed reference transaction");
2188 break;
2189 default:
2190 BUG("unexpected reference transaction state");
2191 break;
2194 ret = refs->be->transaction_finish(refs, transaction, err);
2195 if (!ret)
2196 run_transaction_hook(transaction, "committed");
2197 return ret;
2200 int refs_verify_refname_available(struct ref_store *refs,
2201 const char *refname,
2202 const struct string_list *extras,
2203 const struct string_list *skip,
2204 struct strbuf *err)
2206 const char *slash;
2207 const char *extra_refname;
2208 struct strbuf dirname = STRBUF_INIT;
2209 struct strbuf referent = STRBUF_INIT;
2210 struct object_id oid;
2211 unsigned int type;
2212 struct ref_iterator *iter;
2213 int ok;
2214 int ret = -1;
2217 * For the sake of comments in this function, suppose that
2218 * refname is "refs/foo/bar".
2221 assert(err);
2223 strbuf_grow(&dirname, strlen(refname) + 1);
2224 for (slash = strchr(refname, '/'); slash; slash = strchr(slash + 1, '/')) {
2225 /* Expand dirname to the new prefix, not including the trailing slash: */
2226 strbuf_add(&dirname, refname + dirname.len, slash - refname - dirname.len);
2229 * We are still at a leading dir of the refname (e.g.,
2230 * "refs/foo"; if there is a reference with that name,
2231 * it is a conflict, *unless* it is in skip.
2233 if (skip && string_list_has_string(skip, dirname.buf))
2234 continue;
2236 if (!refs_read_raw_ref(refs, dirname.buf, &oid, &referent, &type)) {
2237 strbuf_addf(err, _("'%s' exists; cannot create '%s'"),
2238 dirname.buf, refname);
2239 goto cleanup;
2242 if (extras && string_list_has_string(extras, dirname.buf)) {
2243 strbuf_addf(err, _("cannot process '%s' and '%s' at the same time"),
2244 refname, dirname.buf);
2245 goto cleanup;
2250 * We are at the leaf of our refname (e.g., "refs/foo/bar").
2251 * There is no point in searching for a reference with that
2252 * name, because a refname isn't considered to conflict with
2253 * itself. But we still need to check for references whose
2254 * names are in the "refs/foo/bar/" namespace, because they
2255 * *do* conflict.
2257 strbuf_addstr(&dirname, refname + dirname.len);
2258 strbuf_addch(&dirname, '/');
2260 iter = refs_ref_iterator_begin(refs, dirname.buf, 0,
2261 DO_FOR_EACH_INCLUDE_BROKEN);
2262 while ((ok = ref_iterator_advance(iter)) == ITER_OK) {
2263 if (skip &&
2264 string_list_has_string(skip, iter->refname))
2265 continue;
2267 strbuf_addf(err, _("'%s' exists; cannot create '%s'"),
2268 iter->refname, refname);
2269 ref_iterator_abort(iter);
2270 goto cleanup;
2273 if (ok != ITER_DONE)
2274 BUG("error while iterating over references");
2276 extra_refname = find_descendant_ref(dirname.buf, extras, skip);
2277 if (extra_refname)
2278 strbuf_addf(err, _("cannot process '%s' and '%s' at the same time"),
2279 refname, extra_refname);
2280 else
2281 ret = 0;
2283 cleanup:
2284 strbuf_release(&referent);
2285 strbuf_release(&dirname);
2286 return ret;
2289 int refs_for_each_reflog(struct ref_store *refs, each_ref_fn fn, void *cb_data)
2291 struct ref_iterator *iter;
2292 struct do_for_each_ref_help hp = { fn, cb_data };
2294 iter = refs->be->reflog_iterator_begin(refs);
2296 return do_for_each_repo_ref_iterator(the_repository, iter,
2297 do_for_each_ref_helper, &hp);
2300 int for_each_reflog(each_ref_fn fn, void *cb_data)
2302 return refs_for_each_reflog(get_main_ref_store(the_repository), fn, cb_data);
2305 int refs_for_each_reflog_ent_reverse(struct ref_store *refs,
2306 const char *refname,
2307 each_reflog_ent_fn fn,
2308 void *cb_data)
2310 return refs->be->for_each_reflog_ent_reverse(refs, refname,
2311 fn, cb_data);
2314 int for_each_reflog_ent_reverse(const char *refname, each_reflog_ent_fn fn,
2315 void *cb_data)
2317 return refs_for_each_reflog_ent_reverse(get_main_ref_store(the_repository),
2318 refname, fn, cb_data);
2321 int refs_for_each_reflog_ent(struct ref_store *refs, const char *refname,
2322 each_reflog_ent_fn fn, void *cb_data)
2324 return refs->be->for_each_reflog_ent(refs, refname, fn, cb_data);
2327 int for_each_reflog_ent(const char *refname, each_reflog_ent_fn fn,
2328 void *cb_data)
2330 return refs_for_each_reflog_ent(get_main_ref_store(the_repository), refname,
2331 fn, cb_data);
2334 int refs_reflog_exists(struct ref_store *refs, const char *refname)
2336 return refs->be->reflog_exists(refs, refname);
2339 int reflog_exists(const char *refname)
2341 return refs_reflog_exists(get_main_ref_store(the_repository), refname);
2344 int refs_create_reflog(struct ref_store *refs, const char *refname,
2345 int force_create, struct strbuf *err)
2347 return refs->be->create_reflog(refs, refname, force_create, err);
2350 int safe_create_reflog(const char *refname, int force_create,
2351 struct strbuf *err)
2353 return refs_create_reflog(get_main_ref_store(the_repository), refname,
2354 force_create, err);
2357 int refs_delete_reflog(struct ref_store *refs, const char *refname)
2359 return refs->be->delete_reflog(refs, refname);
2362 int delete_reflog(const char *refname)
2364 return refs_delete_reflog(get_main_ref_store(the_repository), refname);
2367 int refs_reflog_expire(struct ref_store *refs,
2368 const char *refname,
2369 unsigned int flags,
2370 reflog_expiry_prepare_fn prepare_fn,
2371 reflog_expiry_should_prune_fn should_prune_fn,
2372 reflog_expiry_cleanup_fn cleanup_fn,
2373 void *policy_cb_data)
2375 return refs->be->reflog_expire(refs, refname, flags,
2376 prepare_fn, should_prune_fn,
2377 cleanup_fn, policy_cb_data);
2380 int reflog_expire(const char *refname,
2381 unsigned int flags,
2382 reflog_expiry_prepare_fn prepare_fn,
2383 reflog_expiry_should_prune_fn should_prune_fn,
2384 reflog_expiry_cleanup_fn cleanup_fn,
2385 void *policy_cb_data)
2387 return refs_reflog_expire(get_main_ref_store(the_repository),
2388 refname, flags,
2389 prepare_fn, should_prune_fn,
2390 cleanup_fn, policy_cb_data);
2393 int initial_ref_transaction_commit(struct ref_transaction *transaction,
2394 struct strbuf *err)
2396 struct ref_store *refs = transaction->ref_store;
2398 return refs->be->initial_transaction_commit(refs, transaction, err);
2401 int refs_delete_refs(struct ref_store *refs, const char *logmsg,
2402 struct string_list *refnames, unsigned int flags)
2404 char *msg;
2405 int retval;
2407 msg = normalize_reflog_message(logmsg);
2408 retval = refs->be->delete_refs(refs, msg, refnames, flags);
2409 free(msg);
2410 return retval;
2413 int delete_refs(const char *msg, struct string_list *refnames,
2414 unsigned int flags)
2416 return refs_delete_refs(get_main_ref_store(the_repository), msg, refnames, flags);
2419 int refs_rename_ref(struct ref_store *refs, const char *oldref,
2420 const char *newref, const char *logmsg)
2422 char *msg;
2423 int retval;
2425 msg = normalize_reflog_message(logmsg);
2426 retval = refs->be->rename_ref(refs, oldref, newref, msg);
2427 free(msg);
2428 return retval;
2431 int rename_ref(const char *oldref, const char *newref, const char *logmsg)
2433 return refs_rename_ref(get_main_ref_store(the_repository), oldref, newref, logmsg);
2436 int refs_copy_existing_ref(struct ref_store *refs, const char *oldref,
2437 const char *newref, const char *logmsg)
2439 char *msg;
2440 int retval;
2442 msg = normalize_reflog_message(logmsg);
2443 retval = refs->be->copy_ref(refs, oldref, newref, msg);
2444 free(msg);
2445 return retval;
2448 int copy_existing_ref(const char *oldref, const char *newref, const char *logmsg)
2450 return refs_copy_existing_ref(get_main_ref_store(the_repository), oldref, newref, logmsg);