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