]> git.ipfire.org Git - thirdparty/git.git/blame_incremental - refs.c
hook.[ch]: move find_hook() from run-command.c to hook.c
[thirdparty/git.git] / refs.c
... / ...
CommitLineData
1/*
2 * The backend-independent part of the reference module.
3 */
4
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"
22
23/*
24 * List of all available backends
25 */
26static struct ref_storage_be *refs_backends = &refs_be_files;
27
28static struct ref_storage_be *find_ref_storage_backend(const char *name)
29{
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;
35}
36
37int ref_storage_backend_exists(const char *name)
38{
39 return find_ref_storage_backend(name) != NULL;
40}
41
42/*
43 * How to handle various characters in refnames:
44 * 0: An acceptable character for refs
45 * 1: End-of-component
46 * 2: ., look for a preceding . to reject .. in refs
47 * 3: {, look for a preceding @ to reject @{ in refs
48 * 4: A bad character: ASCII control characters, and
49 * ":", "?", "[", "\", "^", "~", SP, or TAB
50 * 5: *, reject unless REFNAME_REFSPEC_PATTERN is set
51 */
52static unsigned char refname_disposition[256] = {
53 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
54 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
55 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 2, 1,
56 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 4,
57 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
58 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 4, 0,
59 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
60 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 4, 4
61};
62
63/*
64 * Try to read one refname component from the front of refname.
65 * Return the length of the component found, or -1 if the component is
66 * not legal. It is legal if it is something reasonable to have under
67 * ".git/refs/"; We do not like it if:
68 *
69 * - it begins with ".", or
70 * - it has double dots "..", or
71 * - it has ASCII control characters, or
72 * - it has ":", "?", "[", "\", "^", "~", SP, or TAB anywhere, or
73 * - it has "*" anywhere unless REFNAME_REFSPEC_PATTERN is set, or
74 * - it ends with a "/", or
75 * - it ends with ".lock", or
76 * - it contains a "@{" portion
77 *
78 * When sanitized is not NULL, instead of rejecting the input refname
79 * as an error, try to come up with a usable replacement for the input
80 * refname in it.
81 */
82static int check_refname_component(const char *refname, int *flags,
83 struct strbuf *sanitized)
84{
85 const char *cp;
86 char last = '\0';
87 size_t component_start = 0; /* garbage - not a reasonable initial value */
88
89 if (sanitized)
90 component_start = sanitized->len;
91
92 for (cp = refname; ; cp++) {
93 int ch = *cp & 255;
94 unsigned char disp = refname_disposition[ch];
95
96 if (sanitized && disp != 1)
97 strbuf_addch(sanitized, ch);
98
99 switch (disp) {
100 case 1:
101 goto out;
102 case 2:
103 if (last == '.') { /* Refname contains "..". */
104 if (sanitized)
105 /* collapse ".." to single "." */
106 strbuf_setlen(sanitized, sanitized->len - 1);
107 else
108 return -1;
109 }
110 break;
111 case 3:
112 if (last == '@') { /* Refname contains "@{". */
113 if (sanitized)
114 sanitized->buf[sanitized->len-1] = '-';
115 else
116 return -1;
117 }
118 break;
119 case 4:
120 /* forbidden char */
121 if (sanitized)
122 sanitized->buf[sanitized->len-1] = '-';
123 else
124 return -1;
125 break;
126 case 5:
127 if (!(*flags & REFNAME_REFSPEC_PATTERN)) {
128 /* refspec can't be a pattern */
129 if (sanitized)
130 sanitized->buf[sanitized->len-1] = '-';
131 else
132 return -1;
133 }
134
135 /*
136 * Unset the pattern flag so that we only accept
137 * a single asterisk for one side of refspec.
138 */
139 *flags &= ~ REFNAME_REFSPEC_PATTERN;
140 break;
141 }
142 last = ch;
143 }
144out:
145 if (cp == refname)
146 return 0; /* Component has zero length. */
147
148 if (refname[0] == '.') { /* Component starts with '.'. */
149 if (sanitized)
150 sanitized->buf[component_start] = '-';
151 else
152 return -1;
153 }
154 if (cp - refname >= LOCK_SUFFIX_LEN &&
155 !memcmp(cp - LOCK_SUFFIX_LEN, LOCK_SUFFIX, LOCK_SUFFIX_LEN)) {
156 if (!sanitized)
157 return -1;
158 /* Refname ends with ".lock". */
159 while (strbuf_strip_suffix(sanitized, LOCK_SUFFIX)) {
160 /* try again in case we have .lock.lock */
161 }
162 }
163 return cp - refname;
164}
165
166static int check_or_sanitize_refname(const char *refname, int flags,
167 struct strbuf *sanitized)
168{
169 int component_len, component_count = 0;
170
171 if (!strcmp(refname, "@")) {
172 /* Refname is a single character '@'. */
173 if (sanitized)
174 strbuf_addch(sanitized, '-');
175 else
176 return -1;
177 }
178
179 while (1) {
180 if (sanitized && sanitized->len)
181 strbuf_complete(sanitized, '/');
182
183 /* We are at the start of a path component. */
184 component_len = check_refname_component(refname, &flags,
185 sanitized);
186 if (sanitized && component_len == 0)
187 ; /* OK, omit empty component */
188 else if (component_len <= 0)
189 return -1;
190
191 component_count++;
192 if (refname[component_len] == '\0')
193 break;
194 /* Skip to next component. */
195 refname += component_len + 1;
196 }
197
198 if (refname[component_len - 1] == '.') {
199 /* Refname ends with '.'. */
200 if (sanitized)
201 ; /* omit ending dot */
202 else
203 return -1;
204 }
205 if (!(flags & REFNAME_ALLOW_ONELEVEL) && component_count < 2)
206 return -1; /* Refname has only one component. */
207 return 0;
208}
209
210int check_refname_format(const char *refname, int flags)
211{
212 return check_or_sanitize_refname(refname, flags, NULL);
213}
214
215void sanitize_refname_component(const char *refname, struct strbuf *out)
216{
217 if (check_or_sanitize_refname(refname, REFNAME_ALLOW_ONELEVEL, out))
218 BUG("sanitizing refname '%s' check returned error", refname);
219}
220
221int refname_is_safe(const char *refname)
222{
223 const char *rest;
224
225 if (skip_prefix(refname, "refs/", &rest)) {
226 char *buf;
227 int result;
228 size_t restlen = strlen(rest);
229
230 /* rest must not be empty, or start or end with "/" */
231 if (!restlen || *rest == '/' || rest[restlen - 1] == '/')
232 return 0;
233
234 /*
235 * Does the refname try to escape refs/?
236 * For example: refs/foo/../bar is safe but refs/foo/../../bar
237 * is not.
238 */
239 buf = xmallocz(restlen);
240 result = !normalize_path_copy(buf, rest) && !strcmp(buf, rest);
241 free(buf);
242 return result;
243 }
244
245 do {
246 if (!isupper(*refname) && *refname != '_')
247 return 0;
248 refname++;
249 } while (*refname);
250 return 1;
251}
252
253/*
254 * Return true if refname, which has the specified oid and flags, can
255 * be resolved to an object in the database. If the referred-to object
256 * does not exist, emit a warning and return false.
257 */
258int ref_resolves_to_object(const char *refname,
259 const struct object_id *oid,
260 unsigned int flags)
261{
262 if (flags & REF_ISBROKEN)
263 return 0;
264 if (!has_object_file(oid)) {
265 error(_("%s does not point to a valid object!"), refname);
266 return 0;
267 }
268 return 1;
269}
270
271char *refs_resolve_refdup(struct ref_store *refs,
272 const char *refname, int resolve_flags,
273 struct object_id *oid, int *flags)
274{
275 const char *result;
276
277 result = refs_resolve_ref_unsafe(refs, refname, resolve_flags,
278 oid, flags);
279 return xstrdup_or_null(result);
280}
281
282char *resolve_refdup(const char *refname, int resolve_flags,
283 struct object_id *oid, int *flags)
284{
285 return refs_resolve_refdup(get_main_ref_store(the_repository),
286 refname, resolve_flags,
287 oid, flags);
288}
289
290/* The argument to filter_refs */
291struct ref_filter {
292 const char *pattern;
293 const char *prefix;
294 each_ref_fn *fn;
295 void *cb_data;
296};
297
298int refs_read_ref_full(struct ref_store *refs, const char *refname,
299 int resolve_flags, struct object_id *oid, int *flags)
300{
301 if (refs_resolve_ref_unsafe(refs, refname, resolve_flags, oid, flags))
302 return 0;
303 return -1;
304}
305
306int read_ref_full(const char *refname, int resolve_flags, struct object_id *oid, int *flags)
307{
308 return refs_read_ref_full(get_main_ref_store(the_repository), refname,
309 resolve_flags, oid, flags);
310}
311
312int read_ref(const char *refname, struct object_id *oid)
313{
314 return read_ref_full(refname, RESOLVE_REF_READING, oid, NULL);
315}
316
317int refs_ref_exists(struct ref_store *refs, const char *refname)
318{
319 return !!refs_resolve_ref_unsafe(refs, refname, RESOLVE_REF_READING, NULL, NULL);
320}
321
322int ref_exists(const char *refname)
323{
324 return refs_ref_exists(get_main_ref_store(the_repository), refname);
325}
326
327static int filter_refs(const char *refname, const struct object_id *oid,
328 int flags, void *data)
329{
330 struct ref_filter *filter = (struct ref_filter *)data;
331
332 if (wildmatch(filter->pattern, refname, 0))
333 return 0;
334 if (filter->prefix)
335 skip_prefix(refname, filter->prefix, &refname);
336 return filter->fn(refname, oid, flags, filter->cb_data);
337}
338
339enum peel_status peel_object(const struct object_id *name, struct object_id *oid)
340{
341 struct object *o = lookup_unknown_object(the_repository, name);
342
343 if (o->type == OBJ_NONE) {
344 int type = oid_object_info(the_repository, name, NULL);
345 if (type < 0 || !object_as_type(o, type, 0))
346 return PEEL_INVALID;
347 }
348
349 if (o->type != OBJ_TAG)
350 return PEEL_NON_TAG;
351
352 o = deref_tag_noverify(o);
353 if (!o)
354 return PEEL_INVALID;
355
356 oidcpy(oid, &o->oid);
357 return PEEL_PEELED;
358}
359
360struct warn_if_dangling_data {
361 FILE *fp;
362 const char *refname;
363 const struct string_list *refnames;
364 const char *msg_fmt;
365};
366
367static int warn_if_dangling_symref(const char *refname, const struct object_id *oid,
368 int flags, void *cb_data)
369{
370 struct warn_if_dangling_data *d = cb_data;
371 const char *resolves_to;
372
373 if (!(flags & REF_ISSYMREF))
374 return 0;
375
376 resolves_to = resolve_ref_unsafe(refname, 0, NULL, NULL);
377 if (!resolves_to
378 || (d->refname
379 ? strcmp(resolves_to, d->refname)
380 : !string_list_has_string(d->refnames, resolves_to))) {
381 return 0;
382 }
383
384 fprintf(d->fp, d->msg_fmt, refname);
385 fputc('\n', d->fp);
386 return 0;
387}
388
389void warn_dangling_symref(FILE *fp, const char *msg_fmt, const char *refname)
390{
391 struct warn_if_dangling_data data;
392
393 data.fp = fp;
394 data.refname = refname;
395 data.refnames = NULL;
396 data.msg_fmt = msg_fmt;
397 for_each_rawref(warn_if_dangling_symref, &data);
398}
399
400void warn_dangling_symrefs(FILE *fp, const char *msg_fmt, const struct string_list *refnames)
401{
402 struct warn_if_dangling_data data;
403
404 data.fp = fp;
405 data.refname = NULL;
406 data.refnames = refnames;
407 data.msg_fmt = msg_fmt;
408 for_each_rawref(warn_if_dangling_symref, &data);
409}
410
411int refs_for_each_tag_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
412{
413 return refs_for_each_ref_in(refs, "refs/tags/", fn, cb_data);
414}
415
416int for_each_tag_ref(each_ref_fn fn, void *cb_data)
417{
418 return refs_for_each_tag_ref(get_main_ref_store(the_repository), fn, cb_data);
419}
420
421int refs_for_each_branch_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
422{
423 return refs_for_each_ref_in(refs, "refs/heads/", fn, cb_data);
424}
425
426int for_each_branch_ref(each_ref_fn fn, void *cb_data)
427{
428 return refs_for_each_branch_ref(get_main_ref_store(the_repository), fn, cb_data);
429}
430
431int refs_for_each_remote_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
432{
433 return refs_for_each_ref_in(refs, "refs/remotes/", fn, cb_data);
434}
435
436int for_each_remote_ref(each_ref_fn fn, void *cb_data)
437{
438 return refs_for_each_remote_ref(get_main_ref_store(the_repository), fn, cb_data);
439}
440
441int head_ref_namespaced(each_ref_fn fn, void *cb_data)
442{
443 struct strbuf buf = STRBUF_INIT;
444 int ret = 0;
445 struct object_id oid;
446 int flag;
447
448 strbuf_addf(&buf, "%sHEAD", get_git_namespace());
449 if (!read_ref_full(buf.buf, RESOLVE_REF_READING, &oid, &flag))
450 ret = fn(buf.buf, &oid, flag, cb_data);
451 strbuf_release(&buf);
452
453 return ret;
454}
455
456void normalize_glob_ref(struct string_list_item *item, const char *prefix,
457 const char *pattern)
458{
459 struct strbuf normalized_pattern = STRBUF_INIT;
460
461 if (*pattern == '/')
462 BUG("pattern must not start with '/'");
463
464 if (prefix) {
465 strbuf_addstr(&normalized_pattern, prefix);
466 }
467 else if (!starts_with(pattern, "refs/"))
468 strbuf_addstr(&normalized_pattern, "refs/");
469 strbuf_addstr(&normalized_pattern, pattern);
470 strbuf_strip_suffix(&normalized_pattern, "/");
471
472 item->string = strbuf_detach(&normalized_pattern, NULL);
473 item->util = has_glob_specials(pattern) ? NULL : item->string;
474 strbuf_release(&normalized_pattern);
475}
476
477int for_each_glob_ref_in(each_ref_fn fn, const char *pattern,
478 const char *prefix, void *cb_data)
479{
480 struct strbuf real_pattern = STRBUF_INIT;
481 struct ref_filter filter;
482 int ret;
483
484 if (!prefix && !starts_with(pattern, "refs/"))
485 strbuf_addstr(&real_pattern, "refs/");
486 else if (prefix)
487 strbuf_addstr(&real_pattern, prefix);
488 strbuf_addstr(&real_pattern, pattern);
489
490 if (!has_glob_specials(pattern)) {
491 /* Append implied '/' '*' if not present. */
492 strbuf_complete(&real_pattern, '/');
493 /* No need to check for '*', there is none. */
494 strbuf_addch(&real_pattern, '*');
495 }
496
497 filter.pattern = real_pattern.buf;
498 filter.prefix = prefix;
499 filter.fn = fn;
500 filter.cb_data = cb_data;
501 ret = for_each_ref(filter_refs, &filter);
502
503 strbuf_release(&real_pattern);
504 return ret;
505}
506
507int for_each_glob_ref(each_ref_fn fn, const char *pattern, void *cb_data)
508{
509 return for_each_glob_ref_in(fn, pattern, NULL, cb_data);
510}
511
512const char *prettify_refname(const char *name)
513{
514 if (skip_prefix(name, "refs/heads/", &name) ||
515 skip_prefix(name, "refs/tags/", &name) ||
516 skip_prefix(name, "refs/remotes/", &name))
517 ; /* nothing */
518 return name;
519}
520
521static const char *ref_rev_parse_rules[] = {
522 "%.*s",
523 "refs/%.*s",
524 "refs/tags/%.*s",
525 "refs/heads/%.*s",
526 "refs/remotes/%.*s",
527 "refs/remotes/%.*s/HEAD",
528 NULL
529};
530
531#define NUM_REV_PARSE_RULES (ARRAY_SIZE(ref_rev_parse_rules) - 1)
532
533/*
534 * Is it possible that the caller meant full_name with abbrev_name?
535 * If so return a non-zero value to signal "yes"; the magnitude of
536 * the returned value gives the precedence used for disambiguation.
537 *
538 * If abbrev_name cannot mean full_name, return 0.
539 */
540int refname_match(const char *abbrev_name, const char *full_name)
541{
542 const char **p;
543 const int abbrev_name_len = strlen(abbrev_name);
544 const int num_rules = NUM_REV_PARSE_RULES;
545
546 for (p = ref_rev_parse_rules; *p; p++)
547 if (!strcmp(full_name, mkpath(*p, abbrev_name_len, abbrev_name)))
548 return &ref_rev_parse_rules[num_rules] - p;
549
550 return 0;
551}
552
553/*
554 * Given a 'prefix' expand it by the rules in 'ref_rev_parse_rules' and add
555 * the results to 'prefixes'
556 */
557void expand_ref_prefix(struct strvec *prefixes, const char *prefix)
558{
559 const char **p;
560 int len = strlen(prefix);
561
562 for (p = ref_rev_parse_rules; *p; p++)
563 strvec_pushf(prefixes, *p, len, prefix);
564}
565
566static const char default_branch_name_advice[] = N_(
567"Using '%s' as the name for the initial branch. This default branch name\n"
568"is subject to change. To configure the initial branch name to use in all\n"
569"of your new repositories, which will suppress this warning, call:\n"
570"\n"
571"\tgit config --global init.defaultBranch <name>\n"
572"\n"
573"Names commonly chosen instead of 'master' are 'main', 'trunk' and\n"
574"'development'. The just-created branch can be renamed via this command:\n"
575"\n"
576"\tgit branch -m <name>\n"
577);
578
579char *repo_default_branch_name(struct repository *r, int quiet)
580{
581 const char *config_key = "init.defaultbranch";
582 const char *config_display_key = "init.defaultBranch";
583 char *ret = NULL, *full_ref;
584 const char *env = getenv("GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME");
585
586 if (env && *env)
587 ret = xstrdup(env);
588 else if (repo_config_get_string(r, config_key, &ret) < 0)
589 die(_("could not retrieve `%s`"), config_display_key);
590
591 if (!ret) {
592 ret = xstrdup("master");
593 if (!quiet)
594 advise(_(default_branch_name_advice), ret);
595 }
596
597 full_ref = xstrfmt("refs/heads/%s", ret);
598 if (check_refname_format(full_ref, 0))
599 die(_("invalid branch name: %s = %s"), config_display_key, ret);
600 free(full_ref);
601
602 return ret;
603}
604
605const char *git_default_branch_name(int quiet)
606{
607 static char *ret;
608
609 if (!ret)
610 ret = repo_default_branch_name(the_repository, quiet);
611
612 return ret;
613}
614
615/*
616 * *string and *len will only be substituted, and *string returned (for
617 * later free()ing) if the string passed in is a magic short-hand form
618 * to name a branch.
619 */
620static char *substitute_branch_name(struct repository *r,
621 const char **string, int *len,
622 int nonfatal_dangling_mark)
623{
624 struct strbuf buf = STRBUF_INIT;
625 struct interpret_branch_name_options options = {
626 .nonfatal_dangling_mark = nonfatal_dangling_mark
627 };
628 int ret = repo_interpret_branch_name(r, *string, *len, &buf, &options);
629
630 if (ret == *len) {
631 size_t size;
632 *string = strbuf_detach(&buf, &size);
633 *len = size;
634 return (char *)*string;
635 }
636
637 return NULL;
638}
639
640int repo_dwim_ref(struct repository *r, const char *str, int len,
641 struct object_id *oid, char **ref, int nonfatal_dangling_mark)
642{
643 char *last_branch = substitute_branch_name(r, &str, &len,
644 nonfatal_dangling_mark);
645 int refs_found = expand_ref(r, str, len, oid, ref);
646 free(last_branch);
647 return refs_found;
648}
649
650int expand_ref(struct repository *repo, const char *str, int len,
651 struct object_id *oid, char **ref)
652{
653 const char **p, *r;
654 int refs_found = 0;
655 struct strbuf fullref = STRBUF_INIT;
656
657 *ref = NULL;
658 for (p = ref_rev_parse_rules; *p; p++) {
659 struct object_id oid_from_ref;
660 struct object_id *this_result;
661 int flag;
662
663 this_result = refs_found ? &oid_from_ref : oid;
664 strbuf_reset(&fullref);
665 strbuf_addf(&fullref, *p, len, str);
666 r = refs_resolve_ref_unsafe(get_main_ref_store(repo),
667 fullref.buf, RESOLVE_REF_READING,
668 this_result, &flag);
669 if (r) {
670 if (!refs_found++)
671 *ref = xstrdup(r);
672 if (!warn_ambiguous_refs)
673 break;
674 } else if ((flag & REF_ISSYMREF) && strcmp(fullref.buf, "HEAD")) {
675 warning(_("ignoring dangling symref %s"), fullref.buf);
676 } else if ((flag & REF_ISBROKEN) && strchr(fullref.buf, '/')) {
677 warning(_("ignoring broken ref %s"), fullref.buf);
678 }
679 }
680 strbuf_release(&fullref);
681 return refs_found;
682}
683
684int repo_dwim_log(struct repository *r, const char *str, int len,
685 struct object_id *oid, char **log)
686{
687 struct ref_store *refs = get_main_ref_store(r);
688 char *last_branch = substitute_branch_name(r, &str, &len, 0);
689 const char **p;
690 int logs_found = 0;
691 struct strbuf path = STRBUF_INIT;
692
693 *log = NULL;
694 for (p = ref_rev_parse_rules; *p; p++) {
695 struct object_id hash;
696 const char *ref, *it;
697
698 strbuf_reset(&path);
699 strbuf_addf(&path, *p, len, str);
700 ref = refs_resolve_ref_unsafe(refs, path.buf,
701 RESOLVE_REF_READING,
702 &hash, NULL);
703 if (!ref)
704 continue;
705 if (refs_reflog_exists(refs, path.buf))
706 it = path.buf;
707 else if (strcmp(ref, path.buf) &&
708 refs_reflog_exists(refs, ref))
709 it = ref;
710 else
711 continue;
712 if (!logs_found++) {
713 *log = xstrdup(it);
714 oidcpy(oid, &hash);
715 }
716 if (!warn_ambiguous_refs)
717 break;
718 }
719 strbuf_release(&path);
720 free(last_branch);
721 return logs_found;
722}
723
724int dwim_log(const char *str, int len, struct object_id *oid, char **log)
725{
726 return repo_dwim_log(the_repository, str, len, oid, log);
727}
728
729static int is_per_worktree_ref(const char *refname)
730{
731 return starts_with(refname, "refs/worktree/") ||
732 starts_with(refname, "refs/bisect/") ||
733 starts_with(refname, "refs/rewritten/");
734}
735
736static int is_pseudoref_syntax(const char *refname)
737{
738 const char *c;
739
740 for (c = refname; *c; c++) {
741 if (!isupper(*c) && *c != '-' && *c != '_')
742 return 0;
743 }
744
745 return 1;
746}
747
748static int is_main_pseudoref_syntax(const char *refname)
749{
750 return skip_prefix(refname, "main-worktree/", &refname) &&
751 *refname &&
752 is_pseudoref_syntax(refname);
753}
754
755static int is_other_pseudoref_syntax(const char *refname)
756{
757 if (!skip_prefix(refname, "worktrees/", &refname))
758 return 0;
759 refname = strchr(refname, '/');
760 if (!refname || !refname[1])
761 return 0;
762 return is_pseudoref_syntax(refname + 1);
763}
764
765enum ref_type ref_type(const char *refname)
766{
767 if (is_per_worktree_ref(refname))
768 return REF_TYPE_PER_WORKTREE;
769 if (is_pseudoref_syntax(refname))
770 return REF_TYPE_PSEUDOREF;
771 if (is_main_pseudoref_syntax(refname))
772 return REF_TYPE_MAIN_PSEUDOREF;
773 if (is_other_pseudoref_syntax(refname))
774 return REF_TYPE_OTHER_PSEUDOREF;
775 return REF_TYPE_NORMAL;
776}
777
778long get_files_ref_lock_timeout_ms(void)
779{
780 static int configured = 0;
781
782 /* The default timeout is 100 ms: */
783 static int timeout_ms = 100;
784
785 if (!configured) {
786 git_config_get_int("core.filesreflocktimeout", &timeout_ms);
787 configured = 1;
788 }
789
790 return timeout_ms;
791}
792
793int refs_delete_ref(struct ref_store *refs, const char *msg,
794 const char *refname,
795 const struct object_id *old_oid,
796 unsigned int flags)
797{
798 struct ref_transaction *transaction;
799 struct strbuf err = STRBUF_INIT;
800
801 transaction = ref_store_transaction_begin(refs, &err);
802 if (!transaction ||
803 ref_transaction_delete(transaction, refname, old_oid,
804 flags, msg, &err) ||
805 ref_transaction_commit(transaction, &err)) {
806 error("%s", err.buf);
807 ref_transaction_free(transaction);
808 strbuf_release(&err);
809 return 1;
810 }
811 ref_transaction_free(transaction);
812 strbuf_release(&err);
813 return 0;
814}
815
816int delete_ref(const char *msg, const char *refname,
817 const struct object_id *old_oid, unsigned int flags)
818{
819 return refs_delete_ref(get_main_ref_store(the_repository), msg, refname,
820 old_oid, flags);
821}
822
823static void copy_reflog_msg(struct strbuf *sb, const char *msg)
824{
825 char c;
826 int wasspace = 1;
827
828 while ((c = *msg++)) {
829 if (wasspace && isspace(c))
830 continue;
831 wasspace = isspace(c);
832 if (wasspace)
833 c = ' ';
834 strbuf_addch(sb, c);
835 }
836 strbuf_rtrim(sb);
837}
838
839static char *normalize_reflog_message(const char *msg)
840{
841 struct strbuf sb = STRBUF_INIT;
842
843 if (msg && *msg)
844 copy_reflog_msg(&sb, msg);
845 return strbuf_detach(&sb, NULL);
846}
847
848int should_autocreate_reflog(const char *refname)
849{
850 switch (log_all_ref_updates) {
851 case LOG_REFS_ALWAYS:
852 return 1;
853 case LOG_REFS_NORMAL:
854 return starts_with(refname, "refs/heads/") ||
855 starts_with(refname, "refs/remotes/") ||
856 starts_with(refname, "refs/notes/") ||
857 !strcmp(refname, "HEAD");
858 default:
859 return 0;
860 }
861}
862
863int is_branch(const char *refname)
864{
865 return !strcmp(refname, "HEAD") || starts_with(refname, "refs/heads/");
866}
867
868struct read_ref_at_cb {
869 const char *refname;
870 timestamp_t at_time;
871 int cnt;
872 int reccnt;
873 struct object_id *oid;
874 int found_it;
875
876 struct object_id ooid;
877 struct object_id noid;
878 int tz;
879 timestamp_t date;
880 char **msg;
881 timestamp_t *cutoff_time;
882 int *cutoff_tz;
883 int *cutoff_cnt;
884};
885
886static void set_read_ref_cutoffs(struct read_ref_at_cb *cb,
887 timestamp_t timestamp, int tz, const char *message)
888{
889 if (cb->msg)
890 *cb->msg = xstrdup(message);
891 if (cb->cutoff_time)
892 *cb->cutoff_time = timestamp;
893 if (cb->cutoff_tz)
894 *cb->cutoff_tz = tz;
895 if (cb->cutoff_cnt)
896 *cb->cutoff_cnt = cb->reccnt;
897}
898
899static int read_ref_at_ent(struct object_id *ooid, struct object_id *noid,
900 const char *email, timestamp_t timestamp, int tz,
901 const char *message, void *cb_data)
902{
903 struct read_ref_at_cb *cb = cb_data;
904 int reached_count;
905
906 cb->tz = tz;
907 cb->date = timestamp;
908
909 /*
910 * It is not possible for cb->cnt == 0 on the first iteration because
911 * that special case is handled in read_ref_at().
912 */
913 if (cb->cnt > 0)
914 cb->cnt--;
915 reached_count = cb->cnt == 0 && !is_null_oid(ooid);
916 if (timestamp <= cb->at_time || reached_count) {
917 set_read_ref_cutoffs(cb, timestamp, tz, message);
918 /*
919 * we have not yet updated cb->[n|o]oid so they still
920 * hold the values for the previous record.
921 */
922 if (!is_null_oid(&cb->ooid) && !oideq(&cb->ooid, noid))
923 warning(_("log for ref %s has gap after %s"),
924 cb->refname, show_date(cb->date, cb->tz, DATE_MODE(RFC2822)));
925 if (reached_count)
926 oidcpy(cb->oid, ooid);
927 else if (!is_null_oid(&cb->ooid) || cb->date == cb->at_time)
928 oidcpy(cb->oid, noid);
929 else if (!oideq(noid, cb->oid))
930 warning(_("log for ref %s unexpectedly ended on %s"),
931 cb->refname, show_date(cb->date, cb->tz,
932 DATE_MODE(RFC2822)));
933 cb->found_it = 1;
934 }
935 cb->reccnt++;
936 oidcpy(&cb->ooid, ooid);
937 oidcpy(&cb->noid, noid);
938 return cb->found_it;
939}
940
941static int read_ref_at_ent_newest(struct object_id *ooid, struct object_id *noid,
942 const char *email, timestamp_t timestamp,
943 int tz, const char *message, void *cb_data)
944{
945 struct read_ref_at_cb *cb = cb_data;
946
947 set_read_ref_cutoffs(cb, timestamp, tz, message);
948 oidcpy(cb->oid, noid);
949 /* We just want the first entry */
950 return 1;
951}
952
953static int read_ref_at_ent_oldest(struct object_id *ooid, struct object_id *noid,
954 const char *email, timestamp_t timestamp,
955 int tz, const char *message, void *cb_data)
956{
957 struct read_ref_at_cb *cb = cb_data;
958
959 set_read_ref_cutoffs(cb, timestamp, tz, message);
960 oidcpy(cb->oid, ooid);
961 if (is_null_oid(cb->oid))
962 oidcpy(cb->oid, noid);
963 /* We just want the first entry */
964 return 1;
965}
966
967int read_ref_at(struct ref_store *refs, const char *refname,
968 unsigned int flags, timestamp_t at_time, int cnt,
969 struct object_id *oid, char **msg,
970 timestamp_t *cutoff_time, int *cutoff_tz, int *cutoff_cnt)
971{
972 struct read_ref_at_cb cb;
973
974 memset(&cb, 0, sizeof(cb));
975 cb.refname = refname;
976 cb.at_time = at_time;
977 cb.cnt = cnt;
978 cb.msg = msg;
979 cb.cutoff_time = cutoff_time;
980 cb.cutoff_tz = cutoff_tz;
981 cb.cutoff_cnt = cutoff_cnt;
982 cb.oid = oid;
983
984 if (cb.cnt == 0) {
985 refs_for_each_reflog_ent_reverse(refs, refname, read_ref_at_ent_newest, &cb);
986 return 0;
987 }
988
989 refs_for_each_reflog_ent_reverse(refs, refname, read_ref_at_ent, &cb);
990
991 if (!cb.reccnt) {
992 if (flags & GET_OID_QUIETLY)
993 exit(128);
994 else
995 die(_("log for %s is empty"), refname);
996 }
997 if (cb.found_it)
998 return 0;
999
1000 refs_for_each_reflog_ent(refs, refname, read_ref_at_ent_oldest, &cb);
1001
1002 return 1;
1003}
1004
1005struct ref_transaction *ref_store_transaction_begin(struct ref_store *refs,
1006 struct strbuf *err)
1007{
1008 struct ref_transaction *tr;
1009 assert(err);
1010
1011 CALLOC_ARRAY(tr, 1);
1012 tr->ref_store = refs;
1013 return tr;
1014}
1015
1016struct ref_transaction *ref_transaction_begin(struct strbuf *err)
1017{
1018 return ref_store_transaction_begin(get_main_ref_store(the_repository), err);
1019}
1020
1021void ref_transaction_free(struct ref_transaction *transaction)
1022{
1023 size_t i;
1024
1025 if (!transaction)
1026 return;
1027
1028 switch (transaction->state) {
1029 case REF_TRANSACTION_OPEN:
1030 case REF_TRANSACTION_CLOSED:
1031 /* OK */
1032 break;
1033 case REF_TRANSACTION_PREPARED:
1034 BUG("free called on a prepared reference transaction");
1035 break;
1036 default:
1037 BUG("unexpected reference transaction state");
1038 break;
1039 }
1040
1041 for (i = 0; i < transaction->nr; i++) {
1042 free(transaction->updates[i]->msg);
1043 free(transaction->updates[i]);
1044 }
1045 free(transaction->updates);
1046 free(transaction);
1047}
1048
1049struct ref_update *ref_transaction_add_update(
1050 struct ref_transaction *transaction,
1051 const char *refname, unsigned int flags,
1052 const struct object_id *new_oid,
1053 const struct object_id *old_oid,
1054 const char *msg)
1055{
1056 struct ref_update *update;
1057
1058 if (transaction->state != REF_TRANSACTION_OPEN)
1059 BUG("update called for transaction that is not open");
1060
1061 FLEX_ALLOC_STR(update, refname, refname);
1062 ALLOC_GROW(transaction->updates, transaction->nr + 1, transaction->alloc);
1063 transaction->updates[transaction->nr++] = update;
1064
1065 update->flags = flags;
1066
1067 if (flags & REF_HAVE_NEW)
1068 oidcpy(&update->new_oid, new_oid);
1069 if (flags & REF_HAVE_OLD)
1070 oidcpy(&update->old_oid, old_oid);
1071 update->msg = normalize_reflog_message(msg);
1072 return update;
1073}
1074
1075int ref_transaction_update(struct ref_transaction *transaction,
1076 const char *refname,
1077 const struct object_id *new_oid,
1078 const struct object_id *old_oid,
1079 unsigned int flags, const char *msg,
1080 struct strbuf *err)
1081{
1082 assert(err);
1083
1084 if ((new_oid && !is_null_oid(new_oid)) ?
1085 check_refname_format(refname, REFNAME_ALLOW_ONELEVEL) :
1086 !refname_is_safe(refname)) {
1087 strbuf_addf(err, _("refusing to update ref with bad name '%s'"),
1088 refname);
1089 return -1;
1090 }
1091
1092 if (flags & ~REF_TRANSACTION_UPDATE_ALLOWED_FLAGS)
1093 BUG("illegal flags 0x%x passed to ref_transaction_update()", flags);
1094
1095 flags |= (new_oid ? REF_HAVE_NEW : 0) | (old_oid ? REF_HAVE_OLD : 0);
1096
1097 ref_transaction_add_update(transaction, refname, flags,
1098 new_oid, old_oid, msg);
1099 return 0;
1100}
1101
1102int ref_transaction_create(struct ref_transaction *transaction,
1103 const char *refname,
1104 const struct object_id *new_oid,
1105 unsigned int flags, const char *msg,
1106 struct strbuf *err)
1107{
1108 if (!new_oid || is_null_oid(new_oid))
1109 BUG("create called without valid new_oid");
1110 return ref_transaction_update(transaction, refname, new_oid,
1111 null_oid(), flags, msg, err);
1112}
1113
1114int ref_transaction_delete(struct ref_transaction *transaction,
1115 const char *refname,
1116 const struct object_id *old_oid,
1117 unsigned int flags, const char *msg,
1118 struct strbuf *err)
1119{
1120 if (old_oid && is_null_oid(old_oid))
1121 BUG("delete called with old_oid set to zeros");
1122 return ref_transaction_update(transaction, refname,
1123 null_oid(), old_oid,
1124 flags, msg, err);
1125}
1126
1127int ref_transaction_verify(struct ref_transaction *transaction,
1128 const char *refname,
1129 const struct object_id *old_oid,
1130 unsigned int flags,
1131 struct strbuf *err)
1132{
1133 if (!old_oid)
1134 BUG("verify called with old_oid set to NULL");
1135 return ref_transaction_update(transaction, refname,
1136 NULL, old_oid,
1137 flags, NULL, err);
1138}
1139
1140int refs_update_ref(struct ref_store *refs, const char *msg,
1141 const char *refname, const struct object_id *new_oid,
1142 const struct object_id *old_oid, unsigned int flags,
1143 enum action_on_err onerr)
1144{
1145 struct ref_transaction *t = NULL;
1146 struct strbuf err = STRBUF_INIT;
1147 int ret = 0;
1148
1149 t = ref_store_transaction_begin(refs, &err);
1150 if (!t ||
1151 ref_transaction_update(t, refname, new_oid, old_oid, flags, msg,
1152 &err) ||
1153 ref_transaction_commit(t, &err)) {
1154 ret = 1;
1155 ref_transaction_free(t);
1156 }
1157 if (ret) {
1158 const char *str = _("update_ref failed for ref '%s': %s");
1159
1160 switch (onerr) {
1161 case UPDATE_REFS_MSG_ON_ERR:
1162 error(str, refname, err.buf);
1163 break;
1164 case UPDATE_REFS_DIE_ON_ERR:
1165 die(str, refname, err.buf);
1166 break;
1167 case UPDATE_REFS_QUIET_ON_ERR:
1168 break;
1169 }
1170 strbuf_release(&err);
1171 return 1;
1172 }
1173 strbuf_release(&err);
1174 if (t)
1175 ref_transaction_free(t);
1176 return 0;
1177}
1178
1179int update_ref(const char *msg, const char *refname,
1180 const struct object_id *new_oid,
1181 const struct object_id *old_oid,
1182 unsigned int flags, enum action_on_err onerr)
1183{
1184 return refs_update_ref(get_main_ref_store(the_repository), msg, refname, new_oid,
1185 old_oid, flags, onerr);
1186}
1187
1188char *refs_shorten_unambiguous_ref(struct ref_store *refs,
1189 const char *refname, int strict)
1190{
1191 int i;
1192 static char **scanf_fmts;
1193 static int nr_rules;
1194 char *short_name;
1195 struct strbuf resolved_buf = STRBUF_INIT;
1196
1197 if (!nr_rules) {
1198 /*
1199 * Pre-generate scanf formats from ref_rev_parse_rules[].
1200 * Generate a format suitable for scanf from a
1201 * ref_rev_parse_rules rule by interpolating "%s" at the
1202 * location of the "%.*s".
1203 */
1204 size_t total_len = 0;
1205 size_t offset = 0;
1206
1207 /* the rule list is NULL terminated, count them first */
1208 for (nr_rules = 0; ref_rev_parse_rules[nr_rules]; nr_rules++)
1209 /* -2 for strlen("%.*s") - strlen("%s"); +1 for NUL */
1210 total_len += strlen(ref_rev_parse_rules[nr_rules]) - 2 + 1;
1211
1212 scanf_fmts = xmalloc(st_add(st_mult(sizeof(char *), nr_rules), total_len));
1213
1214 offset = 0;
1215 for (i = 0; i < nr_rules; i++) {
1216 assert(offset < total_len);
1217 scanf_fmts[i] = (char *)&scanf_fmts[nr_rules] + offset;
1218 offset += xsnprintf(scanf_fmts[i], total_len - offset,
1219 ref_rev_parse_rules[i], 2, "%s") + 1;
1220 }
1221 }
1222
1223 /* bail out if there are no rules */
1224 if (!nr_rules)
1225 return xstrdup(refname);
1226
1227 /* buffer for scanf result, at most refname must fit */
1228 short_name = xstrdup(refname);
1229
1230 /* skip first rule, it will always match */
1231 for (i = nr_rules - 1; i > 0 ; --i) {
1232 int j;
1233 int rules_to_fail = i;
1234 int short_name_len;
1235
1236 if (1 != sscanf(refname, scanf_fmts[i], short_name))
1237 continue;
1238
1239 short_name_len = strlen(short_name);
1240
1241 /*
1242 * in strict mode, all (except the matched one) rules
1243 * must fail to resolve to a valid non-ambiguous ref
1244 */
1245 if (strict)
1246 rules_to_fail = nr_rules;
1247
1248 /*
1249 * check if the short name resolves to a valid ref,
1250 * but use only rules prior to the matched one
1251 */
1252 for (j = 0; j < rules_to_fail; j++) {
1253 const char *rule = ref_rev_parse_rules[j];
1254
1255 /* skip matched rule */
1256 if (i == j)
1257 continue;
1258
1259 /*
1260 * the short name is ambiguous, if it resolves
1261 * (with this previous rule) to a valid ref
1262 * read_ref() returns 0 on success
1263 */
1264 strbuf_reset(&resolved_buf);
1265 strbuf_addf(&resolved_buf, rule,
1266 short_name_len, short_name);
1267 if (refs_ref_exists(refs, resolved_buf.buf))
1268 break;
1269 }
1270
1271 /*
1272 * short name is non-ambiguous if all previous rules
1273 * haven't resolved to a valid ref
1274 */
1275 if (j == rules_to_fail) {
1276 strbuf_release(&resolved_buf);
1277 return short_name;
1278 }
1279 }
1280
1281 strbuf_release(&resolved_buf);
1282 free(short_name);
1283 return xstrdup(refname);
1284}
1285
1286char *shorten_unambiguous_ref(const char *refname, int strict)
1287{
1288 return refs_shorten_unambiguous_ref(get_main_ref_store(the_repository),
1289 refname, strict);
1290}
1291
1292static struct string_list *hide_refs;
1293
1294int parse_hide_refs_config(const char *var, const char *value, const char *section)
1295{
1296 const char *key;
1297 if (!strcmp("transfer.hiderefs", var) ||
1298 (!parse_config_key(var, section, NULL, NULL, &key) &&
1299 !strcmp(key, "hiderefs"))) {
1300 char *ref;
1301 int len;
1302
1303 if (!value)
1304 return config_error_nonbool(var);
1305 ref = xstrdup(value);
1306 len = strlen(ref);
1307 while (len && ref[len - 1] == '/')
1308 ref[--len] = '\0';
1309 if (!hide_refs) {
1310 CALLOC_ARRAY(hide_refs, 1);
1311 hide_refs->strdup_strings = 1;
1312 }
1313 string_list_append(hide_refs, ref);
1314 }
1315 return 0;
1316}
1317
1318int ref_is_hidden(const char *refname, const char *refname_full)
1319{
1320 int i;
1321
1322 if (!hide_refs)
1323 return 0;
1324 for (i = hide_refs->nr - 1; i >= 0; i--) {
1325 const char *match = hide_refs->items[i].string;
1326 const char *subject;
1327 int neg = 0;
1328 const char *p;
1329
1330 if (*match == '!') {
1331 neg = 1;
1332 match++;
1333 }
1334
1335 if (*match == '^') {
1336 subject = refname_full;
1337 match++;
1338 } else {
1339 subject = refname;
1340 }
1341
1342 /* refname can be NULL when namespaces are used. */
1343 if (subject &&
1344 skip_prefix(subject, match, &p) &&
1345 (!*p || *p == '/'))
1346 return !neg;
1347 }
1348 return 0;
1349}
1350
1351const char *find_descendant_ref(const char *dirname,
1352 const struct string_list *extras,
1353 const struct string_list *skip)
1354{
1355 int pos;
1356
1357 if (!extras)
1358 return NULL;
1359
1360 /*
1361 * Look at the place where dirname would be inserted into
1362 * extras. If there is an entry at that position that starts
1363 * with dirname (remember, dirname includes the trailing
1364 * slash) and is not in skip, then we have a conflict.
1365 */
1366 for (pos = string_list_find_insert_index(extras, dirname, 0);
1367 pos < extras->nr; pos++) {
1368 const char *extra_refname = extras->items[pos].string;
1369
1370 if (!starts_with(extra_refname, dirname))
1371 break;
1372
1373 if (!skip || !string_list_has_string(skip, extra_refname))
1374 return extra_refname;
1375 }
1376 return NULL;
1377}
1378
1379int refs_rename_ref_available(struct ref_store *refs,
1380 const char *old_refname,
1381 const char *new_refname)
1382{
1383 struct string_list skip = STRING_LIST_INIT_NODUP;
1384 struct strbuf err = STRBUF_INIT;
1385 int ok;
1386
1387 string_list_insert(&skip, old_refname);
1388 ok = !refs_verify_refname_available(refs, new_refname,
1389 NULL, &skip, &err);
1390 if (!ok)
1391 error("%s", err.buf);
1392
1393 string_list_clear(&skip, 0);
1394 strbuf_release(&err);
1395 return ok;
1396}
1397
1398int refs_head_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
1399{
1400 struct object_id oid;
1401 int flag;
1402
1403 if (!refs_read_ref_full(refs, "HEAD", RESOLVE_REF_READING,
1404 &oid, &flag))
1405 return fn("HEAD", &oid, flag, cb_data);
1406
1407 return 0;
1408}
1409
1410int head_ref(each_ref_fn fn, void *cb_data)
1411{
1412 return refs_head_ref(get_main_ref_store(the_repository), fn, cb_data);
1413}
1414
1415struct ref_iterator *refs_ref_iterator_begin(
1416 struct ref_store *refs,
1417 const char *prefix, int trim, int flags)
1418{
1419 struct ref_iterator *iter;
1420
1421 if (ref_paranoia < 0)
1422 ref_paranoia = git_env_bool("GIT_REF_PARANOIA", 0);
1423 if (ref_paranoia)
1424 flags |= DO_FOR_EACH_INCLUDE_BROKEN;
1425
1426 iter = refs->be->iterator_begin(refs, prefix, flags);
1427
1428 /*
1429 * `iterator_begin()` already takes care of prefix, but we
1430 * might need to do some trimming:
1431 */
1432 if (trim)
1433 iter = prefix_ref_iterator_begin(iter, "", trim);
1434
1435 /* Sanity check for subclasses: */
1436 if (!iter->ordered)
1437 BUG("reference iterator is not ordered");
1438
1439 return iter;
1440}
1441
1442/*
1443 * Call fn for each reference in the specified submodule for which the
1444 * refname begins with prefix. If trim is non-zero, then trim that
1445 * many characters off the beginning of each refname before passing
1446 * the refname to fn. flags can be DO_FOR_EACH_INCLUDE_BROKEN to
1447 * include broken references in the iteration. If fn ever returns a
1448 * non-zero value, stop the iteration and return that value;
1449 * otherwise, return 0.
1450 */
1451static int do_for_each_repo_ref(struct repository *r, const char *prefix,
1452 each_repo_ref_fn fn, int trim, int flags,
1453 void *cb_data)
1454{
1455 struct ref_iterator *iter;
1456 struct ref_store *refs = get_main_ref_store(r);
1457
1458 if (!refs)
1459 return 0;
1460
1461 iter = refs_ref_iterator_begin(refs, prefix, trim, flags);
1462
1463 return do_for_each_repo_ref_iterator(r, iter, fn, cb_data);
1464}
1465
1466struct do_for_each_ref_help {
1467 each_ref_fn *fn;
1468 void *cb_data;
1469};
1470
1471static int do_for_each_ref_helper(struct repository *r,
1472 const char *refname,
1473 const struct object_id *oid,
1474 int flags,
1475 void *cb_data)
1476{
1477 struct do_for_each_ref_help *hp = cb_data;
1478
1479 return hp->fn(refname, oid, flags, hp->cb_data);
1480}
1481
1482static int do_for_each_ref(struct ref_store *refs, const char *prefix,
1483 each_ref_fn fn, int trim, int flags, void *cb_data)
1484{
1485 struct ref_iterator *iter;
1486 struct do_for_each_ref_help hp = { fn, cb_data };
1487
1488 if (!refs)
1489 return 0;
1490
1491 iter = refs_ref_iterator_begin(refs, prefix, trim, flags);
1492
1493 return do_for_each_repo_ref_iterator(the_repository, iter,
1494 do_for_each_ref_helper, &hp);
1495}
1496
1497int refs_for_each_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
1498{
1499 return do_for_each_ref(refs, "", fn, 0, 0, cb_data);
1500}
1501
1502int for_each_ref(each_ref_fn fn, void *cb_data)
1503{
1504 return refs_for_each_ref(get_main_ref_store(the_repository), fn, cb_data);
1505}
1506
1507int refs_for_each_ref_in(struct ref_store *refs, const char *prefix,
1508 each_ref_fn fn, void *cb_data)
1509{
1510 return do_for_each_ref(refs, prefix, fn, strlen(prefix), 0, cb_data);
1511}
1512
1513int for_each_ref_in(const char *prefix, each_ref_fn fn, void *cb_data)
1514{
1515 return refs_for_each_ref_in(get_main_ref_store(the_repository), prefix, fn, cb_data);
1516}
1517
1518int for_each_fullref_in(const char *prefix, each_ref_fn fn, void *cb_data, unsigned int broken)
1519{
1520 unsigned int flag = 0;
1521
1522 if (broken)
1523 flag = DO_FOR_EACH_INCLUDE_BROKEN;
1524 return do_for_each_ref(get_main_ref_store(the_repository),
1525 prefix, fn, 0, flag, cb_data);
1526}
1527
1528int refs_for_each_fullref_in(struct ref_store *refs, const char *prefix,
1529 each_ref_fn fn, void *cb_data,
1530 unsigned int broken)
1531{
1532 unsigned int flag = 0;
1533
1534 if (broken)
1535 flag = DO_FOR_EACH_INCLUDE_BROKEN;
1536 return do_for_each_ref(refs, prefix, fn, 0, flag, cb_data);
1537}
1538
1539int for_each_replace_ref(struct repository *r, each_repo_ref_fn fn, void *cb_data)
1540{
1541 return do_for_each_repo_ref(r, git_replace_ref_base, fn,
1542 strlen(git_replace_ref_base),
1543 DO_FOR_EACH_INCLUDE_BROKEN, cb_data);
1544}
1545
1546int for_each_namespaced_ref(each_ref_fn fn, void *cb_data)
1547{
1548 struct strbuf buf = STRBUF_INIT;
1549 int ret;
1550 strbuf_addf(&buf, "%srefs/", get_git_namespace());
1551 ret = do_for_each_ref(get_main_ref_store(the_repository),
1552 buf.buf, fn, 0, 0, cb_data);
1553 strbuf_release(&buf);
1554 return ret;
1555}
1556
1557int refs_for_each_rawref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
1558{
1559 return do_for_each_ref(refs, "", fn, 0,
1560 DO_FOR_EACH_INCLUDE_BROKEN, cb_data);
1561}
1562
1563int for_each_rawref(each_ref_fn fn, void *cb_data)
1564{
1565 return refs_for_each_rawref(get_main_ref_store(the_repository), fn, cb_data);
1566}
1567
1568static int qsort_strcmp(const void *va, const void *vb)
1569{
1570 const char *a = *(const char **)va;
1571 const char *b = *(const char **)vb;
1572
1573 return strcmp(a, b);
1574}
1575
1576static void find_longest_prefixes_1(struct string_list *out,
1577 struct strbuf *prefix,
1578 const char **patterns, size_t nr)
1579{
1580 size_t i;
1581
1582 for (i = 0; i < nr; i++) {
1583 char c = patterns[i][prefix->len];
1584 if (!c || is_glob_special(c)) {
1585 string_list_append(out, prefix->buf);
1586 return;
1587 }
1588 }
1589
1590 i = 0;
1591 while (i < nr) {
1592 size_t end;
1593
1594 /*
1595 * Set "end" to the index of the element _after_ the last one
1596 * in our group.
1597 */
1598 for (end = i + 1; end < nr; end++) {
1599 if (patterns[i][prefix->len] != patterns[end][prefix->len])
1600 break;
1601 }
1602
1603 strbuf_addch(prefix, patterns[i][prefix->len]);
1604 find_longest_prefixes_1(out, prefix, patterns + i, end - i);
1605 strbuf_setlen(prefix, prefix->len - 1);
1606
1607 i = end;
1608 }
1609}
1610
1611static void find_longest_prefixes(struct string_list *out,
1612 const char **patterns)
1613{
1614 struct strvec sorted = STRVEC_INIT;
1615 struct strbuf prefix = STRBUF_INIT;
1616
1617 strvec_pushv(&sorted, patterns);
1618 QSORT(sorted.v, sorted.nr, qsort_strcmp);
1619
1620 find_longest_prefixes_1(out, &prefix, sorted.v, sorted.nr);
1621
1622 strvec_clear(&sorted);
1623 strbuf_release(&prefix);
1624}
1625
1626int for_each_fullref_in_prefixes(const char *namespace,
1627 const char **patterns,
1628 each_ref_fn fn, void *cb_data,
1629 unsigned int broken)
1630{
1631 struct string_list prefixes = STRING_LIST_INIT_DUP;
1632 struct string_list_item *prefix;
1633 struct strbuf buf = STRBUF_INIT;
1634 int ret = 0, namespace_len;
1635
1636 find_longest_prefixes(&prefixes, patterns);
1637
1638 if (namespace)
1639 strbuf_addstr(&buf, namespace);
1640 namespace_len = buf.len;
1641
1642 for_each_string_list_item(prefix, &prefixes) {
1643 strbuf_addstr(&buf, prefix->string);
1644 ret = for_each_fullref_in(buf.buf, fn, cb_data, broken);
1645 if (ret)
1646 break;
1647 strbuf_setlen(&buf, namespace_len);
1648 }
1649
1650 string_list_clear(&prefixes, 0);
1651 strbuf_release(&buf);
1652 return ret;
1653}
1654
1655static int refs_read_special_head(struct ref_store *ref_store,
1656 const char *refname, struct object_id *oid,
1657 struct strbuf *referent, unsigned int *type)
1658{
1659 struct strbuf full_path = STRBUF_INIT;
1660 struct strbuf content = STRBUF_INIT;
1661 int result = -1;
1662 strbuf_addf(&full_path, "%s/%s", ref_store->gitdir, refname);
1663
1664 if (strbuf_read_file(&content, full_path.buf, 0) < 0)
1665 goto done;
1666
1667 result = parse_loose_ref_contents(content.buf, oid, referent, type);
1668
1669done:
1670 strbuf_release(&full_path);
1671 strbuf_release(&content);
1672 return result;
1673}
1674
1675int refs_read_raw_ref(struct ref_store *ref_store,
1676 const char *refname, struct object_id *oid,
1677 struct strbuf *referent, unsigned int *type)
1678{
1679 if (!strcmp(refname, "FETCH_HEAD") || !strcmp(refname, "MERGE_HEAD")) {
1680 return refs_read_special_head(ref_store, refname, oid, referent,
1681 type);
1682 }
1683
1684 return ref_store->be->read_raw_ref(ref_store, refname, oid, referent,
1685 type);
1686}
1687
1688/* This function needs to return a meaningful errno on failure */
1689const char *refs_resolve_ref_unsafe(struct ref_store *refs,
1690 const char *refname,
1691 int resolve_flags,
1692 struct object_id *oid, int *flags)
1693{
1694 static struct strbuf sb_refname = STRBUF_INIT;
1695 struct object_id unused_oid;
1696 int unused_flags;
1697 int symref_count;
1698
1699 if (!oid)
1700 oid = &unused_oid;
1701 if (!flags)
1702 flags = &unused_flags;
1703
1704 *flags = 0;
1705
1706 if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
1707 if (!(resolve_flags & RESOLVE_REF_ALLOW_BAD_NAME) ||
1708 !refname_is_safe(refname)) {
1709 errno = EINVAL;
1710 return NULL;
1711 }
1712
1713 /*
1714 * dwim_ref() uses REF_ISBROKEN to distinguish between
1715 * missing refs and refs that were present but invalid,
1716 * to complain about the latter to stderr.
1717 *
1718 * We don't know whether the ref exists, so don't set
1719 * REF_ISBROKEN yet.
1720 */
1721 *flags |= REF_BAD_NAME;
1722 }
1723
1724 for (symref_count = 0; symref_count < SYMREF_MAXDEPTH; symref_count++) {
1725 unsigned int read_flags = 0;
1726
1727 if (refs_read_raw_ref(refs, refname,
1728 oid, &sb_refname, &read_flags)) {
1729 *flags |= read_flags;
1730
1731 /* In reading mode, refs must eventually resolve */
1732 if (resolve_flags & RESOLVE_REF_READING)
1733 return NULL;
1734
1735 /*
1736 * Otherwise a missing ref is OK. But the files backend
1737 * may show errors besides ENOENT if there are
1738 * similarly-named refs.
1739 */
1740 if (errno != ENOENT &&
1741 errno != EISDIR &&
1742 errno != ENOTDIR)
1743 return NULL;
1744
1745 oidclr(oid);
1746 if (*flags & REF_BAD_NAME)
1747 *flags |= REF_ISBROKEN;
1748 return refname;
1749 }
1750
1751 *flags |= read_flags;
1752
1753 if (!(read_flags & REF_ISSYMREF)) {
1754 if (*flags & REF_BAD_NAME) {
1755 oidclr(oid);
1756 *flags |= REF_ISBROKEN;
1757 }
1758 return refname;
1759 }
1760
1761 refname = sb_refname.buf;
1762 if (resolve_flags & RESOLVE_REF_NO_RECURSE) {
1763 oidclr(oid);
1764 return refname;
1765 }
1766 if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
1767 if (!(resolve_flags & RESOLVE_REF_ALLOW_BAD_NAME) ||
1768 !refname_is_safe(refname)) {
1769 errno = EINVAL;
1770 return NULL;
1771 }
1772
1773 *flags |= REF_ISBROKEN | REF_BAD_NAME;
1774 }
1775 }
1776
1777 errno = ELOOP;
1778 return NULL;
1779}
1780
1781/* backend functions */
1782int refs_init_db(struct strbuf *err)
1783{
1784 struct ref_store *refs = get_main_ref_store(the_repository);
1785
1786 return refs->be->init_db(refs, err);
1787}
1788
1789const char *resolve_ref_unsafe(const char *refname, int resolve_flags,
1790 struct object_id *oid, int *flags)
1791{
1792 return refs_resolve_ref_unsafe(get_main_ref_store(the_repository), refname,
1793 resolve_flags, oid, flags);
1794}
1795
1796int resolve_gitlink_ref(const char *submodule, const char *refname,
1797 struct object_id *oid)
1798{
1799 struct ref_store *refs;
1800 int flags;
1801
1802 refs = get_submodule_ref_store(submodule);
1803
1804 if (!refs)
1805 return -1;
1806
1807 if (!refs_resolve_ref_unsafe(refs, refname, 0, oid, &flags) ||
1808 is_null_oid(oid))
1809 return -1;
1810 return 0;
1811}
1812
1813struct ref_store_hash_entry
1814{
1815 struct hashmap_entry ent;
1816
1817 struct ref_store *refs;
1818
1819 /* NUL-terminated identifier of the ref store: */
1820 char name[FLEX_ARRAY];
1821};
1822
1823static int ref_store_hash_cmp(const void *unused_cmp_data,
1824 const struct hashmap_entry *eptr,
1825 const struct hashmap_entry *entry_or_key,
1826 const void *keydata)
1827{
1828 const struct ref_store_hash_entry *e1, *e2;
1829 const char *name;
1830
1831 e1 = container_of(eptr, const struct ref_store_hash_entry, ent);
1832 e2 = container_of(entry_or_key, const struct ref_store_hash_entry, ent);
1833 name = keydata ? keydata : e2->name;
1834
1835 return strcmp(e1->name, name);
1836}
1837
1838static struct ref_store_hash_entry *alloc_ref_store_hash_entry(
1839 const char *name, struct ref_store *refs)
1840{
1841 struct ref_store_hash_entry *entry;
1842
1843 FLEX_ALLOC_STR(entry, name, name);
1844 hashmap_entry_init(&entry->ent, strhash(name));
1845 entry->refs = refs;
1846 return entry;
1847}
1848
1849/* A hashmap of ref_stores, stored by submodule name: */
1850static struct hashmap submodule_ref_stores;
1851
1852/* A hashmap of ref_stores, stored by worktree id: */
1853static struct hashmap worktree_ref_stores;
1854
1855/*
1856 * Look up a ref store by name. If that ref_store hasn't been
1857 * registered yet, return NULL.
1858 */
1859static struct ref_store *lookup_ref_store_map(struct hashmap *map,
1860 const char *name)
1861{
1862 struct ref_store_hash_entry *entry;
1863 unsigned int hash;
1864
1865 if (!map->tablesize)
1866 /* It's initialized on demand in register_ref_store(). */
1867 return NULL;
1868
1869 hash = strhash(name);
1870 entry = hashmap_get_entry_from_hash(map, hash, name,
1871 struct ref_store_hash_entry, ent);
1872 return entry ? entry->refs : NULL;
1873}
1874
1875/*
1876 * Create, record, and return a ref_store instance for the specified
1877 * gitdir.
1878 */
1879static struct ref_store *ref_store_init(const char *gitdir,
1880 unsigned int flags)
1881{
1882 const char *be_name = "files";
1883 struct ref_storage_be *be = find_ref_storage_backend(be_name);
1884 struct ref_store *refs;
1885
1886 if (!be)
1887 BUG("reference backend %s is unknown", be_name);
1888
1889 refs = be->init(gitdir, flags);
1890 return refs;
1891}
1892
1893struct ref_store *get_main_ref_store(struct repository *r)
1894{
1895 if (r->refs_private)
1896 return r->refs_private;
1897
1898 if (!r->gitdir)
1899 BUG("attempting to get main_ref_store outside of repository");
1900
1901 r->refs_private = ref_store_init(r->gitdir, REF_STORE_ALL_CAPS);
1902 r->refs_private = maybe_debug_wrap_ref_store(r->gitdir, r->refs_private);
1903 return r->refs_private;
1904}
1905
1906/*
1907 * Associate a ref store with a name. It is a fatal error to call this
1908 * function twice for the same name.
1909 */
1910static void register_ref_store_map(struct hashmap *map,
1911 const char *type,
1912 struct ref_store *refs,
1913 const char *name)
1914{
1915 struct ref_store_hash_entry *entry;
1916
1917 if (!map->tablesize)
1918 hashmap_init(map, ref_store_hash_cmp, NULL, 0);
1919
1920 entry = alloc_ref_store_hash_entry(name, refs);
1921 if (hashmap_put(map, &entry->ent))
1922 BUG("%s ref_store '%s' initialized twice", type, name);
1923}
1924
1925struct ref_store *get_submodule_ref_store(const char *submodule)
1926{
1927 struct strbuf submodule_sb = STRBUF_INIT;
1928 struct ref_store *refs;
1929 char *to_free = NULL;
1930 size_t len;
1931
1932 if (!submodule)
1933 return NULL;
1934
1935 len = strlen(submodule);
1936 while (len && is_dir_sep(submodule[len - 1]))
1937 len--;
1938 if (!len)
1939 return NULL;
1940
1941 if (submodule[len])
1942 /* We need to strip off one or more trailing slashes */
1943 submodule = to_free = xmemdupz(submodule, len);
1944
1945 refs = lookup_ref_store_map(&submodule_ref_stores, submodule);
1946 if (refs)
1947 goto done;
1948
1949 strbuf_addstr(&submodule_sb, submodule);
1950 if (!is_nonbare_repository_dir(&submodule_sb))
1951 goto done;
1952
1953 if (submodule_to_gitdir(&submodule_sb, submodule))
1954 goto done;
1955
1956 /* assume that add_submodule_odb() has been called */
1957 refs = ref_store_init(submodule_sb.buf,
1958 REF_STORE_READ | REF_STORE_ODB);
1959 register_ref_store_map(&submodule_ref_stores, "submodule",
1960 refs, submodule);
1961
1962done:
1963 strbuf_release(&submodule_sb);
1964 free(to_free);
1965
1966 return refs;
1967}
1968
1969struct ref_store *get_worktree_ref_store(const struct worktree *wt)
1970{
1971 struct ref_store *refs;
1972 const char *id;
1973
1974 if (wt->is_current)
1975 return get_main_ref_store(the_repository);
1976
1977 id = wt->id ? wt->id : "/";
1978 refs = lookup_ref_store_map(&worktree_ref_stores, id);
1979 if (refs)
1980 return refs;
1981
1982 if (wt->id)
1983 refs = ref_store_init(git_common_path("worktrees/%s", wt->id),
1984 REF_STORE_ALL_CAPS);
1985 else
1986 refs = ref_store_init(get_git_common_dir(),
1987 REF_STORE_ALL_CAPS);
1988
1989 if (refs)
1990 register_ref_store_map(&worktree_ref_stores, "worktree",
1991 refs, id);
1992 return refs;
1993}
1994
1995void base_ref_store_init(struct ref_store *refs,
1996 const struct ref_storage_be *be)
1997{
1998 refs->be = be;
1999}
2000
2001/* backend functions */
2002int refs_pack_refs(struct ref_store *refs, unsigned int flags)
2003{
2004 return refs->be->pack_refs(refs, flags);
2005}
2006
2007int peel_iterated_oid(const struct object_id *base, struct object_id *peeled)
2008{
2009 if (current_ref_iter &&
2010 (current_ref_iter->oid == base ||
2011 oideq(current_ref_iter->oid, base)))
2012 return ref_iterator_peel(current_ref_iter, peeled);
2013
2014 return peel_object(base, peeled) ? -1 : 0;
2015}
2016
2017int refs_create_symref(struct ref_store *refs,
2018 const char *ref_target,
2019 const char *refs_heads_master,
2020 const char *logmsg)
2021{
2022 char *msg;
2023 int retval;
2024
2025 msg = normalize_reflog_message(logmsg);
2026 retval = refs->be->create_symref(refs, ref_target, refs_heads_master,
2027 msg);
2028 free(msg);
2029 return retval;
2030}
2031
2032int create_symref(const char *ref_target, const char *refs_heads_master,
2033 const char *logmsg)
2034{
2035 return refs_create_symref(get_main_ref_store(the_repository), ref_target,
2036 refs_heads_master, logmsg);
2037}
2038
2039int ref_update_reject_duplicates(struct string_list *refnames,
2040 struct strbuf *err)
2041{
2042 size_t i, n = refnames->nr;
2043
2044 assert(err);
2045
2046 for (i = 1; i < n; i++) {
2047 int cmp = strcmp(refnames->items[i - 1].string,
2048 refnames->items[i].string);
2049
2050 if (!cmp) {
2051 strbuf_addf(err,
2052 _("multiple updates for ref '%s' not allowed"),
2053 refnames->items[i].string);
2054 return 1;
2055 } else if (cmp > 0) {
2056 BUG("ref_update_reject_duplicates() received unsorted list");
2057 }
2058 }
2059 return 0;
2060}
2061
2062static int run_transaction_hook(struct ref_transaction *transaction,
2063 const char *state)
2064{
2065 struct child_process proc = CHILD_PROCESS_INIT;
2066 struct strbuf buf = STRBUF_INIT;
2067 const char *hook;
2068 int ret = 0, i;
2069
2070 hook = find_hook("reference-transaction");
2071 if (!hook)
2072 return ret;
2073
2074 strvec_pushl(&proc.args, hook, state, NULL);
2075 proc.in = -1;
2076 proc.stdout_to_stderr = 1;
2077 proc.trace2_hook_name = "reference-transaction";
2078
2079 ret = start_command(&proc);
2080 if (ret)
2081 return ret;
2082
2083 sigchain_push(SIGPIPE, SIG_IGN);
2084
2085 for (i = 0; i < transaction->nr; i++) {
2086 struct ref_update *update = transaction->updates[i];
2087
2088 strbuf_reset(&buf);
2089 strbuf_addf(&buf, "%s %s %s\n",
2090 oid_to_hex(&update->old_oid),
2091 oid_to_hex(&update->new_oid),
2092 update->refname);
2093
2094 if (write_in_full(proc.in, buf.buf, buf.len) < 0) {
2095 if (errno != EPIPE)
2096 ret = -1;
2097 break;
2098 }
2099 }
2100
2101 close(proc.in);
2102 sigchain_pop(SIGPIPE);
2103 strbuf_release(&buf);
2104
2105 ret |= finish_command(&proc);
2106 return ret;
2107}
2108
2109int ref_transaction_prepare(struct ref_transaction *transaction,
2110 struct strbuf *err)
2111{
2112 struct ref_store *refs = transaction->ref_store;
2113 int ret;
2114
2115 switch (transaction->state) {
2116 case REF_TRANSACTION_OPEN:
2117 /* Good. */
2118 break;
2119 case REF_TRANSACTION_PREPARED:
2120 BUG("prepare called twice on reference transaction");
2121 break;
2122 case REF_TRANSACTION_CLOSED:
2123 BUG("prepare called on a closed reference transaction");
2124 break;
2125 default:
2126 BUG("unexpected reference transaction state");
2127 break;
2128 }
2129
2130 if (getenv(GIT_QUARANTINE_ENVIRONMENT)) {
2131 strbuf_addstr(err,
2132 _("ref updates forbidden inside quarantine environment"));
2133 return -1;
2134 }
2135
2136 ret = refs->be->transaction_prepare(refs, transaction, err);
2137 if (ret)
2138 return ret;
2139
2140 ret = run_transaction_hook(transaction, "prepared");
2141 if (ret) {
2142 ref_transaction_abort(transaction, err);
2143 die(_("ref updates aborted by hook"));
2144 }
2145
2146 return 0;
2147}
2148
2149int ref_transaction_abort(struct ref_transaction *transaction,
2150 struct strbuf *err)
2151{
2152 struct ref_store *refs = transaction->ref_store;
2153 int ret = 0;
2154
2155 switch (transaction->state) {
2156 case REF_TRANSACTION_OPEN:
2157 /* No need to abort explicitly. */
2158 break;
2159 case REF_TRANSACTION_PREPARED:
2160 ret = refs->be->transaction_abort(refs, transaction, err);
2161 break;
2162 case REF_TRANSACTION_CLOSED:
2163 BUG("abort called on a closed reference transaction");
2164 break;
2165 default:
2166 BUG("unexpected reference transaction state");
2167 break;
2168 }
2169
2170 run_transaction_hook(transaction, "aborted");
2171
2172 ref_transaction_free(transaction);
2173 return ret;
2174}
2175
2176int ref_transaction_commit(struct ref_transaction *transaction,
2177 struct strbuf *err)
2178{
2179 struct ref_store *refs = transaction->ref_store;
2180 int ret;
2181
2182 switch (transaction->state) {
2183 case REF_TRANSACTION_OPEN:
2184 /* Need to prepare first. */
2185 ret = ref_transaction_prepare(transaction, err);
2186 if (ret)
2187 return ret;
2188 break;
2189 case REF_TRANSACTION_PREPARED:
2190 /* Fall through to finish. */
2191 break;
2192 case REF_TRANSACTION_CLOSED:
2193 BUG("commit called on a closed reference transaction");
2194 break;
2195 default:
2196 BUG("unexpected reference transaction state");
2197 break;
2198 }
2199
2200 ret = refs->be->transaction_finish(refs, transaction, err);
2201 if (!ret)
2202 run_transaction_hook(transaction, "committed");
2203 return ret;
2204}
2205
2206int refs_verify_refname_available(struct ref_store *refs,
2207 const char *refname,
2208 const struct string_list *extras,
2209 const struct string_list *skip,
2210 struct strbuf *err)
2211{
2212 const char *slash;
2213 const char *extra_refname;
2214 struct strbuf dirname = STRBUF_INIT;
2215 struct strbuf referent = STRBUF_INIT;
2216 struct object_id oid;
2217 unsigned int type;
2218 struct ref_iterator *iter;
2219 int ok;
2220 int ret = -1;
2221
2222 /*
2223 * For the sake of comments in this function, suppose that
2224 * refname is "refs/foo/bar".
2225 */
2226
2227 assert(err);
2228
2229 strbuf_grow(&dirname, strlen(refname) + 1);
2230 for (slash = strchr(refname, '/'); slash; slash = strchr(slash + 1, '/')) {
2231 /* Expand dirname to the new prefix, not including the trailing slash: */
2232 strbuf_add(&dirname, refname + dirname.len, slash - refname - dirname.len);
2233
2234 /*
2235 * We are still at a leading dir of the refname (e.g.,
2236 * "refs/foo"; if there is a reference with that name,
2237 * it is a conflict, *unless* it is in skip.
2238 */
2239 if (skip && string_list_has_string(skip, dirname.buf))
2240 continue;
2241
2242 if (!refs_read_raw_ref(refs, dirname.buf, &oid, &referent, &type)) {
2243 strbuf_addf(err, _("'%s' exists; cannot create '%s'"),
2244 dirname.buf, refname);
2245 goto cleanup;
2246 }
2247
2248 if (extras && string_list_has_string(extras, dirname.buf)) {
2249 strbuf_addf(err, _("cannot process '%s' and '%s' at the same time"),
2250 refname, dirname.buf);
2251 goto cleanup;
2252 }
2253 }
2254
2255 /*
2256 * We are at the leaf of our refname (e.g., "refs/foo/bar").
2257 * There is no point in searching for a reference with that
2258 * name, because a refname isn't considered to conflict with
2259 * itself. But we still need to check for references whose
2260 * names are in the "refs/foo/bar/" namespace, because they
2261 * *do* conflict.
2262 */
2263 strbuf_addstr(&dirname, refname + dirname.len);
2264 strbuf_addch(&dirname, '/');
2265
2266 iter = refs_ref_iterator_begin(refs, dirname.buf, 0,
2267 DO_FOR_EACH_INCLUDE_BROKEN);
2268 while ((ok = ref_iterator_advance(iter)) == ITER_OK) {
2269 if (skip &&
2270 string_list_has_string(skip, iter->refname))
2271 continue;
2272
2273 strbuf_addf(err, _("'%s' exists; cannot create '%s'"),
2274 iter->refname, refname);
2275 ref_iterator_abort(iter);
2276 goto cleanup;
2277 }
2278
2279 if (ok != ITER_DONE)
2280 BUG("error while iterating over references");
2281
2282 extra_refname = find_descendant_ref(dirname.buf, extras, skip);
2283 if (extra_refname)
2284 strbuf_addf(err, _("cannot process '%s' and '%s' at the same time"),
2285 refname, extra_refname);
2286 else
2287 ret = 0;
2288
2289cleanup:
2290 strbuf_release(&referent);
2291 strbuf_release(&dirname);
2292 return ret;
2293}
2294
2295int refs_for_each_reflog(struct ref_store *refs, each_ref_fn fn, void *cb_data)
2296{
2297 struct ref_iterator *iter;
2298 struct do_for_each_ref_help hp = { fn, cb_data };
2299
2300 iter = refs->be->reflog_iterator_begin(refs);
2301
2302 return do_for_each_repo_ref_iterator(the_repository, iter,
2303 do_for_each_ref_helper, &hp);
2304}
2305
2306int for_each_reflog(each_ref_fn fn, void *cb_data)
2307{
2308 return refs_for_each_reflog(get_main_ref_store(the_repository), fn, cb_data);
2309}
2310
2311int refs_for_each_reflog_ent_reverse(struct ref_store *refs,
2312 const char *refname,
2313 each_reflog_ent_fn fn,
2314 void *cb_data)
2315{
2316 return refs->be->for_each_reflog_ent_reverse(refs, refname,
2317 fn, cb_data);
2318}
2319
2320int for_each_reflog_ent_reverse(const char *refname, each_reflog_ent_fn fn,
2321 void *cb_data)
2322{
2323 return refs_for_each_reflog_ent_reverse(get_main_ref_store(the_repository),
2324 refname, fn, cb_data);
2325}
2326
2327int refs_for_each_reflog_ent(struct ref_store *refs, const char *refname,
2328 each_reflog_ent_fn fn, void *cb_data)
2329{
2330 return refs->be->for_each_reflog_ent(refs, refname, fn, cb_data);
2331}
2332
2333int for_each_reflog_ent(const char *refname, each_reflog_ent_fn fn,
2334 void *cb_data)
2335{
2336 return refs_for_each_reflog_ent(get_main_ref_store(the_repository), refname,
2337 fn, cb_data);
2338}
2339
2340int refs_reflog_exists(struct ref_store *refs, const char *refname)
2341{
2342 return refs->be->reflog_exists(refs, refname);
2343}
2344
2345int reflog_exists(const char *refname)
2346{
2347 return refs_reflog_exists(get_main_ref_store(the_repository), refname);
2348}
2349
2350int refs_create_reflog(struct ref_store *refs, const char *refname,
2351 int force_create, struct strbuf *err)
2352{
2353 return refs->be->create_reflog(refs, refname, force_create, err);
2354}
2355
2356int safe_create_reflog(const char *refname, int force_create,
2357 struct strbuf *err)
2358{
2359 return refs_create_reflog(get_main_ref_store(the_repository), refname,
2360 force_create, err);
2361}
2362
2363int refs_delete_reflog(struct ref_store *refs, const char *refname)
2364{
2365 return refs->be->delete_reflog(refs, refname);
2366}
2367
2368int delete_reflog(const char *refname)
2369{
2370 return refs_delete_reflog(get_main_ref_store(the_repository), refname);
2371}
2372
2373int refs_reflog_expire(struct ref_store *refs,
2374 const char *refname, const struct object_id *oid,
2375 unsigned int flags,
2376 reflog_expiry_prepare_fn prepare_fn,
2377 reflog_expiry_should_prune_fn should_prune_fn,
2378 reflog_expiry_cleanup_fn cleanup_fn,
2379 void *policy_cb_data)
2380{
2381 return refs->be->reflog_expire(refs, refname, oid, flags,
2382 prepare_fn, should_prune_fn,
2383 cleanup_fn, policy_cb_data);
2384}
2385
2386int reflog_expire(const char *refname, const struct object_id *oid,
2387 unsigned int flags,
2388 reflog_expiry_prepare_fn prepare_fn,
2389 reflog_expiry_should_prune_fn should_prune_fn,
2390 reflog_expiry_cleanup_fn cleanup_fn,
2391 void *policy_cb_data)
2392{
2393 return refs_reflog_expire(get_main_ref_store(the_repository),
2394 refname, oid, flags,
2395 prepare_fn, should_prune_fn,
2396 cleanup_fn, policy_cb_data);
2397}
2398
2399int initial_ref_transaction_commit(struct ref_transaction *transaction,
2400 struct strbuf *err)
2401{
2402 struct ref_store *refs = transaction->ref_store;
2403
2404 return refs->be->initial_transaction_commit(refs, transaction, err);
2405}
2406
2407int refs_delete_refs(struct ref_store *refs, const char *logmsg,
2408 struct string_list *refnames, unsigned int flags)
2409{
2410 char *msg;
2411 int retval;
2412
2413 msg = normalize_reflog_message(logmsg);
2414 retval = refs->be->delete_refs(refs, msg, refnames, flags);
2415 free(msg);
2416 return retval;
2417}
2418
2419int delete_refs(const char *msg, struct string_list *refnames,
2420 unsigned int flags)
2421{
2422 return refs_delete_refs(get_main_ref_store(the_repository), msg, refnames, flags);
2423}
2424
2425int refs_rename_ref(struct ref_store *refs, const char *oldref,
2426 const char *newref, const char *logmsg)
2427{
2428 char *msg;
2429 int retval;
2430
2431 msg = normalize_reflog_message(logmsg);
2432 retval = refs->be->rename_ref(refs, oldref, newref, msg);
2433 free(msg);
2434 return retval;
2435}
2436
2437int rename_ref(const char *oldref, const char *newref, const char *logmsg)
2438{
2439 return refs_rename_ref(get_main_ref_store(the_repository), oldref, newref, logmsg);
2440}
2441
2442int refs_copy_existing_ref(struct ref_store *refs, const char *oldref,
2443 const char *newref, const char *logmsg)
2444{
2445 char *msg;
2446 int retval;
2447
2448 msg = normalize_reflog_message(logmsg);
2449 retval = refs->be->copy_ref(refs, oldref, newref, msg);
2450 free(msg);
2451 return retval;
2452}
2453
2454int copy_existing_ref(const char *oldref, const char *newref, const char *logmsg)
2455{
2456 return refs_copy_existing_ref(get_main_ref_store(the_repository), oldref, newref, logmsg);
2457}