]> git.ipfire.org Git - thirdparty/git.git/blob - refs.c
reftable: fix resource leak blocksource.c
[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 ((new_oid && !is_null_oid(new_oid)) ?
1087 check_refname_format(refname, REFNAME_ALLOW_ONELEVEL) :
1088 !refname_is_safe(refname)) {
1089 strbuf_addf(err, _("refusing to update ref with bad name '%s'"),
1090 refname);
1091 return -1;
1092 }
1093
1094 if (flags & ~REF_TRANSACTION_UPDATE_ALLOWED_FLAGS)
1095 BUG("illegal flags 0x%x passed to ref_transaction_update()", flags);
1096
1097 flags |= (new_oid ? REF_HAVE_NEW : 0) | (old_oid ? REF_HAVE_OLD : 0);
1098
1099 ref_transaction_add_update(transaction, refname, flags,
1100 new_oid, old_oid, msg);
1101 return 0;
1102 }
1103
1104 int ref_transaction_create(struct ref_transaction *transaction,
1105 const char *refname,
1106 const struct object_id *new_oid,
1107 unsigned int flags, const char *msg,
1108 struct strbuf *err)
1109 {
1110 if (!new_oid || is_null_oid(new_oid))
1111 BUG("create called without valid new_oid");
1112 return ref_transaction_update(transaction, refname, new_oid,
1113 null_oid(), flags, msg, err);
1114 }
1115
1116 int ref_transaction_delete(struct ref_transaction *transaction,
1117 const char *refname,
1118 const struct object_id *old_oid,
1119 unsigned int flags, const char *msg,
1120 struct strbuf *err)
1121 {
1122 if (old_oid && is_null_oid(old_oid))
1123 BUG("delete called with old_oid set to zeros");
1124 return ref_transaction_update(transaction, refname,
1125 null_oid(), old_oid,
1126 flags, msg, err);
1127 }
1128
1129 int ref_transaction_verify(struct ref_transaction *transaction,
1130 const char *refname,
1131 const struct object_id *old_oid,
1132 unsigned int flags,
1133 struct strbuf *err)
1134 {
1135 if (!old_oid)
1136 BUG("verify called with old_oid set to NULL");
1137 return ref_transaction_update(transaction, refname,
1138 NULL, old_oid,
1139 flags, NULL, err);
1140 }
1141
1142 int refs_update_ref(struct ref_store *refs, const char *msg,
1143 const char *refname, const struct object_id *new_oid,
1144 const struct object_id *old_oid, unsigned int flags,
1145 enum action_on_err onerr)
1146 {
1147 struct ref_transaction *t = NULL;
1148 struct strbuf err = STRBUF_INIT;
1149 int ret = 0;
1150
1151 t = ref_store_transaction_begin(refs, &err);
1152 if (!t ||
1153 ref_transaction_update(t, refname, new_oid, old_oid, flags, msg,
1154 &err) ||
1155 ref_transaction_commit(t, &err)) {
1156 ret = 1;
1157 ref_transaction_free(t);
1158 }
1159 if (ret) {
1160 const char *str = _("update_ref failed for ref '%s': %s");
1161
1162 switch (onerr) {
1163 case UPDATE_REFS_MSG_ON_ERR:
1164 error(str, refname, err.buf);
1165 break;
1166 case UPDATE_REFS_DIE_ON_ERR:
1167 die(str, refname, err.buf);
1168 break;
1169 case UPDATE_REFS_QUIET_ON_ERR:
1170 break;
1171 }
1172 strbuf_release(&err);
1173 return 1;
1174 }
1175 strbuf_release(&err);
1176 if (t)
1177 ref_transaction_free(t);
1178 return 0;
1179 }
1180
1181 int update_ref(const char *msg, const char *refname,
1182 const struct object_id *new_oid,
1183 const struct object_id *old_oid,
1184 unsigned int flags, enum action_on_err onerr)
1185 {
1186 return refs_update_ref(get_main_ref_store(the_repository), msg, refname, new_oid,
1187 old_oid, flags, onerr);
1188 }
1189
1190 char *refs_shorten_unambiguous_ref(struct ref_store *refs,
1191 const char *refname, int strict)
1192 {
1193 int i;
1194 static char **scanf_fmts;
1195 static int nr_rules;
1196 char *short_name;
1197 struct strbuf resolved_buf = STRBUF_INIT;
1198
1199 if (!nr_rules) {
1200 /*
1201 * Pre-generate scanf formats from ref_rev_parse_rules[].
1202 * Generate a format suitable for scanf from a
1203 * ref_rev_parse_rules rule by interpolating "%s" at the
1204 * location of the "%.*s".
1205 */
1206 size_t total_len = 0;
1207 size_t offset = 0;
1208
1209 /* the rule list is NULL terminated, count them first */
1210 for (nr_rules = 0; ref_rev_parse_rules[nr_rules]; nr_rules++)
1211 /* -2 for strlen("%.*s") - strlen("%s"); +1 for NUL */
1212 total_len += strlen(ref_rev_parse_rules[nr_rules]) - 2 + 1;
1213
1214 scanf_fmts = xmalloc(st_add(st_mult(sizeof(char *), nr_rules), total_len));
1215
1216 offset = 0;
1217 for (i = 0; i < nr_rules; i++) {
1218 assert(offset < total_len);
1219 scanf_fmts[i] = (char *)&scanf_fmts[nr_rules] + offset;
1220 offset += xsnprintf(scanf_fmts[i], total_len - offset,
1221 ref_rev_parse_rules[i], 2, "%s") + 1;
1222 }
1223 }
1224
1225 /* bail out if there are no rules */
1226 if (!nr_rules)
1227 return xstrdup(refname);
1228
1229 /* buffer for scanf result, at most refname must fit */
1230 short_name = xstrdup(refname);
1231
1232 /* skip first rule, it will always match */
1233 for (i = nr_rules - 1; i > 0 ; --i) {
1234 int j;
1235 int rules_to_fail = i;
1236 int short_name_len;
1237
1238 if (1 != sscanf(refname, scanf_fmts[i], short_name))
1239 continue;
1240
1241 short_name_len = strlen(short_name);
1242
1243 /*
1244 * in strict mode, all (except the matched one) rules
1245 * must fail to resolve to a valid non-ambiguous ref
1246 */
1247 if (strict)
1248 rules_to_fail = nr_rules;
1249
1250 /*
1251 * check if the short name resolves to a valid ref,
1252 * but use only rules prior to the matched one
1253 */
1254 for (j = 0; j < rules_to_fail; j++) {
1255 const char *rule = ref_rev_parse_rules[j];
1256
1257 /* skip matched rule */
1258 if (i == j)
1259 continue;
1260
1261 /*
1262 * the short name is ambiguous, if it resolves
1263 * (with this previous rule) to a valid ref
1264 * read_ref() returns 0 on success
1265 */
1266 strbuf_reset(&resolved_buf);
1267 strbuf_addf(&resolved_buf, rule,
1268 short_name_len, short_name);
1269 if (refs_ref_exists(refs, resolved_buf.buf))
1270 break;
1271 }
1272
1273 /*
1274 * short name is non-ambiguous if all previous rules
1275 * haven't resolved to a valid ref
1276 */
1277 if (j == rules_to_fail) {
1278 strbuf_release(&resolved_buf);
1279 return short_name;
1280 }
1281 }
1282
1283 strbuf_release(&resolved_buf);
1284 free(short_name);
1285 return xstrdup(refname);
1286 }
1287
1288 char *shorten_unambiguous_ref(const char *refname, int strict)
1289 {
1290 return refs_shorten_unambiguous_ref(get_main_ref_store(the_repository),
1291 refname, strict);
1292 }
1293
1294 static struct string_list *hide_refs;
1295
1296 int parse_hide_refs_config(const char *var, const char *value, const char *section)
1297 {
1298 const char *key;
1299 if (!strcmp("transfer.hiderefs", var) ||
1300 (!parse_config_key(var, section, NULL, NULL, &key) &&
1301 !strcmp(key, "hiderefs"))) {
1302 char *ref;
1303 int len;
1304
1305 if (!value)
1306 return config_error_nonbool(var);
1307 ref = xstrdup(value);
1308 len = strlen(ref);
1309 while (len && ref[len - 1] == '/')
1310 ref[--len] = '\0';
1311 if (!hide_refs) {
1312 CALLOC_ARRAY(hide_refs, 1);
1313 hide_refs->strdup_strings = 1;
1314 }
1315 string_list_append(hide_refs, ref);
1316 }
1317 return 0;
1318 }
1319
1320 int ref_is_hidden(const char *refname, const char *refname_full)
1321 {
1322 int i;
1323
1324 if (!hide_refs)
1325 return 0;
1326 for (i = hide_refs->nr - 1; i >= 0; i--) {
1327 const char *match = hide_refs->items[i].string;
1328 const char *subject;
1329 int neg = 0;
1330 const char *p;
1331
1332 if (*match == '!') {
1333 neg = 1;
1334 match++;
1335 }
1336
1337 if (*match == '^') {
1338 subject = refname_full;
1339 match++;
1340 } else {
1341 subject = refname;
1342 }
1343
1344 /* refname can be NULL when namespaces are used. */
1345 if (subject &&
1346 skip_prefix(subject, match, &p) &&
1347 (!*p || *p == '/'))
1348 return !neg;
1349 }
1350 return 0;
1351 }
1352
1353 const char *find_descendant_ref(const char *dirname,
1354 const struct string_list *extras,
1355 const struct string_list *skip)
1356 {
1357 int pos;
1358
1359 if (!extras)
1360 return NULL;
1361
1362 /*
1363 * Look at the place where dirname would be inserted into
1364 * extras. If there is an entry at that position that starts
1365 * with dirname (remember, dirname includes the trailing
1366 * slash) and is not in skip, then we have a conflict.
1367 */
1368 for (pos = string_list_find_insert_index(extras, dirname, 0);
1369 pos < extras->nr; pos++) {
1370 const char *extra_refname = extras->items[pos].string;
1371
1372 if (!starts_with(extra_refname, dirname))
1373 break;
1374
1375 if (!skip || !string_list_has_string(skip, extra_refname))
1376 return extra_refname;
1377 }
1378 return NULL;
1379 }
1380
1381 int refs_head_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
1382 {
1383 struct object_id oid;
1384 int flag;
1385 int ignore_errno;
1386
1387 if (refs_resolve_ref_unsafe(refs, "HEAD", RESOLVE_REF_READING,
1388 &oid, &flag, &ignore_errno))
1389 return fn("HEAD", &oid, flag, cb_data);
1390
1391 return 0;
1392 }
1393
1394 int head_ref(each_ref_fn fn, void *cb_data)
1395 {
1396 return refs_head_ref(get_main_ref_store(the_repository), fn, cb_data);
1397 }
1398
1399 struct ref_iterator *refs_ref_iterator_begin(
1400 struct ref_store *refs,
1401 const char *prefix, int trim,
1402 enum do_for_each_ref_flags flags)
1403 {
1404 struct ref_iterator *iter;
1405
1406 if (!(flags & DO_FOR_EACH_INCLUDE_BROKEN)) {
1407 static int ref_paranoia = -1;
1408
1409 if (ref_paranoia < 0)
1410 ref_paranoia = git_env_bool("GIT_REF_PARANOIA", 1);
1411 if (ref_paranoia) {
1412 flags |= DO_FOR_EACH_INCLUDE_BROKEN;
1413 flags |= DO_FOR_EACH_OMIT_DANGLING_SYMREFS;
1414 }
1415 }
1416
1417 iter = refs->be->iterator_begin(refs, prefix, flags);
1418
1419 /*
1420 * `iterator_begin()` already takes care of prefix, but we
1421 * might need to do some trimming:
1422 */
1423 if (trim)
1424 iter = prefix_ref_iterator_begin(iter, "", trim);
1425
1426 /* Sanity check for subclasses: */
1427 if (!iter->ordered)
1428 BUG("reference iterator is not ordered");
1429
1430 return iter;
1431 }
1432
1433 /*
1434 * Call fn for each reference in the specified submodule for which the
1435 * refname begins with prefix. If trim is non-zero, then trim that
1436 * many characters off the beginning of each refname before passing
1437 * the refname to fn. flags can be DO_FOR_EACH_INCLUDE_BROKEN to
1438 * include broken references in the iteration. If fn ever returns a
1439 * non-zero value, stop the iteration and return that value;
1440 * otherwise, return 0.
1441 */
1442 static int do_for_each_repo_ref(struct repository *r, const char *prefix,
1443 each_repo_ref_fn fn, int trim, int flags,
1444 void *cb_data)
1445 {
1446 struct ref_iterator *iter;
1447 struct ref_store *refs = get_main_ref_store(r);
1448
1449 if (!refs)
1450 return 0;
1451
1452 iter = refs_ref_iterator_begin(refs, prefix, trim, flags);
1453
1454 return do_for_each_repo_ref_iterator(r, iter, fn, cb_data);
1455 }
1456
1457 struct do_for_each_ref_help {
1458 each_ref_fn *fn;
1459 void *cb_data;
1460 };
1461
1462 static int do_for_each_ref_helper(struct repository *r,
1463 const char *refname,
1464 const struct object_id *oid,
1465 int flags,
1466 void *cb_data)
1467 {
1468 struct do_for_each_ref_help *hp = cb_data;
1469
1470 return hp->fn(refname, oid, flags, hp->cb_data);
1471 }
1472
1473 static int do_for_each_ref(struct ref_store *refs, const char *prefix,
1474 each_ref_fn fn, int trim,
1475 enum do_for_each_ref_flags flags, void *cb_data)
1476 {
1477 struct ref_iterator *iter;
1478 struct do_for_each_ref_help hp = { fn, cb_data };
1479
1480 if (!refs)
1481 return 0;
1482
1483 iter = refs_ref_iterator_begin(refs, prefix, trim, flags);
1484
1485 return do_for_each_repo_ref_iterator(the_repository, iter,
1486 do_for_each_ref_helper, &hp);
1487 }
1488
1489 int refs_for_each_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
1490 {
1491 return do_for_each_ref(refs, "", fn, 0, 0, cb_data);
1492 }
1493
1494 int for_each_ref(each_ref_fn fn, void *cb_data)
1495 {
1496 return refs_for_each_ref(get_main_ref_store(the_repository), fn, cb_data);
1497 }
1498
1499 int refs_for_each_ref_in(struct ref_store *refs, const char *prefix,
1500 each_ref_fn fn, void *cb_data)
1501 {
1502 return do_for_each_ref(refs, prefix, fn, strlen(prefix), 0, cb_data);
1503 }
1504
1505 int for_each_ref_in(const char *prefix, each_ref_fn fn, void *cb_data)
1506 {
1507 return refs_for_each_ref_in(get_main_ref_store(the_repository), prefix, fn, cb_data);
1508 }
1509
1510 int for_each_fullref_in(const char *prefix, each_ref_fn fn, void *cb_data)
1511 {
1512 return do_for_each_ref(get_main_ref_store(the_repository),
1513 prefix, fn, 0, 0, cb_data);
1514 }
1515
1516 int refs_for_each_fullref_in(struct ref_store *refs, const char *prefix,
1517 each_ref_fn fn, void *cb_data)
1518 {
1519 return do_for_each_ref(refs, prefix, fn, 0, 0, cb_data);
1520 }
1521
1522 int for_each_replace_ref(struct repository *r, each_repo_ref_fn fn, void *cb_data)
1523 {
1524 return do_for_each_repo_ref(r, git_replace_ref_base, fn,
1525 strlen(git_replace_ref_base),
1526 DO_FOR_EACH_INCLUDE_BROKEN, cb_data);
1527 }
1528
1529 int for_each_namespaced_ref(each_ref_fn fn, void *cb_data)
1530 {
1531 struct strbuf buf = STRBUF_INIT;
1532 int ret;
1533 strbuf_addf(&buf, "%srefs/", get_git_namespace());
1534 ret = do_for_each_ref(get_main_ref_store(the_repository),
1535 buf.buf, fn, 0, 0, cb_data);
1536 strbuf_release(&buf);
1537 return ret;
1538 }
1539
1540 int refs_for_each_rawref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
1541 {
1542 return do_for_each_ref(refs, "", fn, 0,
1543 DO_FOR_EACH_INCLUDE_BROKEN, cb_data);
1544 }
1545
1546 int for_each_rawref(each_ref_fn fn, void *cb_data)
1547 {
1548 return refs_for_each_rawref(get_main_ref_store(the_repository), fn, cb_data);
1549 }
1550
1551 static int qsort_strcmp(const void *va, const void *vb)
1552 {
1553 const char *a = *(const char **)va;
1554 const char *b = *(const char **)vb;
1555
1556 return strcmp(a, b);
1557 }
1558
1559 static void find_longest_prefixes_1(struct string_list *out,
1560 struct strbuf *prefix,
1561 const char **patterns, size_t nr)
1562 {
1563 size_t i;
1564
1565 for (i = 0; i < nr; i++) {
1566 char c = patterns[i][prefix->len];
1567 if (!c || is_glob_special(c)) {
1568 string_list_append(out, prefix->buf);
1569 return;
1570 }
1571 }
1572
1573 i = 0;
1574 while (i < nr) {
1575 size_t end;
1576
1577 /*
1578 * Set "end" to the index of the element _after_ the last one
1579 * in our group.
1580 */
1581 for (end = i + 1; end < nr; end++) {
1582 if (patterns[i][prefix->len] != patterns[end][prefix->len])
1583 break;
1584 }
1585
1586 strbuf_addch(prefix, patterns[i][prefix->len]);
1587 find_longest_prefixes_1(out, prefix, patterns + i, end - i);
1588 strbuf_setlen(prefix, prefix->len - 1);
1589
1590 i = end;
1591 }
1592 }
1593
1594 static void find_longest_prefixes(struct string_list *out,
1595 const char **patterns)
1596 {
1597 struct strvec sorted = STRVEC_INIT;
1598 struct strbuf prefix = STRBUF_INIT;
1599
1600 strvec_pushv(&sorted, patterns);
1601 QSORT(sorted.v, sorted.nr, qsort_strcmp);
1602
1603 find_longest_prefixes_1(out, &prefix, sorted.v, sorted.nr);
1604
1605 strvec_clear(&sorted);
1606 strbuf_release(&prefix);
1607 }
1608
1609 int for_each_fullref_in_prefixes(const char *namespace,
1610 const char **patterns,
1611 each_ref_fn fn, void *cb_data)
1612 {
1613 struct string_list prefixes = STRING_LIST_INIT_DUP;
1614 struct string_list_item *prefix;
1615 struct strbuf buf = STRBUF_INIT;
1616 int ret = 0, namespace_len;
1617
1618 find_longest_prefixes(&prefixes, patterns);
1619
1620 if (namespace)
1621 strbuf_addstr(&buf, namespace);
1622 namespace_len = buf.len;
1623
1624 for_each_string_list_item(prefix, &prefixes) {
1625 strbuf_addstr(&buf, prefix->string);
1626 ret = for_each_fullref_in(buf.buf, fn, cb_data);
1627 if (ret)
1628 break;
1629 strbuf_setlen(&buf, namespace_len);
1630 }
1631
1632 string_list_clear(&prefixes, 0);
1633 strbuf_release(&buf);
1634 return ret;
1635 }
1636
1637 static int refs_read_special_head(struct ref_store *ref_store,
1638 const char *refname, struct object_id *oid,
1639 struct strbuf *referent, unsigned int *type,
1640 int *failure_errno)
1641 {
1642 struct strbuf full_path = STRBUF_INIT;
1643 struct strbuf content = STRBUF_INIT;
1644 int result = -1;
1645 strbuf_addf(&full_path, "%s/%s", ref_store->gitdir, refname);
1646
1647 if (strbuf_read_file(&content, full_path.buf, 0) < 0)
1648 goto done;
1649
1650 result = parse_loose_ref_contents(content.buf, oid, referent, type,
1651 failure_errno);
1652
1653 done:
1654 strbuf_release(&full_path);
1655 strbuf_release(&content);
1656 return result;
1657 }
1658
1659 int refs_read_raw_ref(struct ref_store *ref_store, const char *refname,
1660 struct object_id *oid, struct strbuf *referent,
1661 unsigned int *type, int *failure_errno)
1662 {
1663 assert(failure_errno);
1664 if (!strcmp(refname, "FETCH_HEAD") || !strcmp(refname, "MERGE_HEAD")) {
1665 return refs_read_special_head(ref_store, refname, oid, referent,
1666 type, failure_errno);
1667 }
1668
1669 return ref_store->be->read_raw_ref(ref_store, refname, oid, referent,
1670 type, failure_errno);
1671 }
1672
1673 const char *refs_resolve_ref_unsafe(struct ref_store *refs,
1674 const char *refname,
1675 int resolve_flags,
1676 struct object_id *oid,
1677 int *flags, int *failure_errno)
1678 {
1679 static struct strbuf sb_refname = STRBUF_INIT;
1680 struct object_id unused_oid;
1681 int unused_flags;
1682 int symref_count;
1683
1684 assert(failure_errno);
1685
1686 if (!oid)
1687 oid = &unused_oid;
1688 if (!flags)
1689 flags = &unused_flags;
1690
1691 *flags = 0;
1692
1693 if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
1694 if (!(resolve_flags & RESOLVE_REF_ALLOW_BAD_NAME) ||
1695 !refname_is_safe(refname)) {
1696 *failure_errno = EINVAL;
1697 return NULL;
1698 }
1699
1700 /*
1701 * dwim_ref() uses REF_ISBROKEN to distinguish between
1702 * missing refs and refs that were present but invalid,
1703 * to complain about the latter to stderr.
1704 *
1705 * We don't know whether the ref exists, so don't set
1706 * REF_ISBROKEN yet.
1707 */
1708 *flags |= REF_BAD_NAME;
1709 }
1710
1711 for (symref_count = 0; symref_count < SYMREF_MAXDEPTH; symref_count++) {
1712 unsigned int read_flags = 0;
1713
1714 if (refs_read_raw_ref(refs, refname, oid, &sb_refname,
1715 &read_flags, failure_errno)) {
1716 *flags |= read_flags;
1717 if (errno)
1718 *failure_errno = errno;
1719
1720 /* In reading mode, refs must eventually resolve */
1721 if (resolve_flags & RESOLVE_REF_READING)
1722 return NULL;
1723
1724 /*
1725 * Otherwise a missing ref is OK. But the files backend
1726 * may show errors besides ENOENT if there are
1727 * similarly-named refs.
1728 */
1729 if (*failure_errno != ENOENT &&
1730 *failure_errno != EISDIR &&
1731 *failure_errno != ENOTDIR)
1732 return NULL;
1733
1734 oidclr(oid);
1735 if (*flags & REF_BAD_NAME)
1736 *flags |= REF_ISBROKEN;
1737 return refname;
1738 }
1739
1740 *flags |= read_flags;
1741
1742 if (!(read_flags & REF_ISSYMREF)) {
1743 if (*flags & REF_BAD_NAME) {
1744 oidclr(oid);
1745 *flags |= REF_ISBROKEN;
1746 }
1747 return refname;
1748 }
1749
1750 refname = sb_refname.buf;
1751 if (resolve_flags & RESOLVE_REF_NO_RECURSE) {
1752 oidclr(oid);
1753 return refname;
1754 }
1755 if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
1756 if (!(resolve_flags & RESOLVE_REF_ALLOW_BAD_NAME) ||
1757 !refname_is_safe(refname)) {
1758 *failure_errno = EINVAL;
1759 return NULL;
1760 }
1761
1762 *flags |= REF_ISBROKEN | REF_BAD_NAME;
1763 }
1764 }
1765
1766 *failure_errno = ELOOP;
1767 return NULL;
1768 }
1769
1770 /* backend functions */
1771 int refs_init_db(struct strbuf *err)
1772 {
1773 struct ref_store *refs = get_main_ref_store(the_repository);
1774
1775 return refs->be->init_db(refs, err);
1776 }
1777
1778 const char *resolve_ref_unsafe(const char *refname, int resolve_flags,
1779 struct object_id *oid, int *flags)
1780 {
1781 int ignore_errno;
1782
1783 return refs_resolve_ref_unsafe(get_main_ref_store(the_repository), refname,
1784 resolve_flags, oid, flags, &ignore_errno);
1785 }
1786
1787 int resolve_gitlink_ref(const char *submodule, const char *refname,
1788 struct object_id *oid)
1789 {
1790 struct ref_store *refs;
1791 int flags;
1792 int ignore_errno;
1793
1794 refs = get_submodule_ref_store(submodule);
1795
1796 if (!refs)
1797 return -1;
1798
1799 if (!refs_resolve_ref_unsafe(refs, refname, 0, oid, &flags,
1800 &ignore_errno) || is_null_oid(oid))
1801 return -1;
1802 return 0;
1803 }
1804
1805 struct ref_store_hash_entry
1806 {
1807 struct hashmap_entry ent;
1808
1809 struct ref_store *refs;
1810
1811 /* NUL-terminated identifier of the ref store: */
1812 char name[FLEX_ARRAY];
1813 };
1814
1815 static int ref_store_hash_cmp(const void *unused_cmp_data,
1816 const struct hashmap_entry *eptr,
1817 const struct hashmap_entry *entry_or_key,
1818 const void *keydata)
1819 {
1820 const struct ref_store_hash_entry *e1, *e2;
1821 const char *name;
1822
1823 e1 = container_of(eptr, const struct ref_store_hash_entry, ent);
1824 e2 = container_of(entry_or_key, const struct ref_store_hash_entry, ent);
1825 name = keydata ? keydata : e2->name;
1826
1827 return strcmp(e1->name, name);
1828 }
1829
1830 static struct ref_store_hash_entry *alloc_ref_store_hash_entry(
1831 const char *name, struct ref_store *refs)
1832 {
1833 struct ref_store_hash_entry *entry;
1834
1835 FLEX_ALLOC_STR(entry, name, name);
1836 hashmap_entry_init(&entry->ent, strhash(name));
1837 entry->refs = refs;
1838 return entry;
1839 }
1840
1841 /* A hashmap of ref_stores, stored by submodule name: */
1842 static struct hashmap submodule_ref_stores;
1843
1844 /* A hashmap of ref_stores, stored by worktree id: */
1845 static struct hashmap worktree_ref_stores;
1846
1847 /*
1848 * Look up a ref store by name. If that ref_store hasn't been
1849 * registered yet, return NULL.
1850 */
1851 static struct ref_store *lookup_ref_store_map(struct hashmap *map,
1852 const char *name)
1853 {
1854 struct ref_store_hash_entry *entry;
1855 unsigned int hash;
1856
1857 if (!map->tablesize)
1858 /* It's initialized on demand in register_ref_store(). */
1859 return NULL;
1860
1861 hash = strhash(name);
1862 entry = hashmap_get_entry_from_hash(map, hash, name,
1863 struct ref_store_hash_entry, ent);
1864 return entry ? entry->refs : NULL;
1865 }
1866
1867 /*
1868 * Create, record, and return a ref_store instance for the specified
1869 * gitdir.
1870 */
1871 static struct ref_store *ref_store_init(struct repository *repo,
1872 const char *gitdir,
1873 unsigned int flags)
1874 {
1875 const char *be_name = "files";
1876 struct ref_storage_be *be = find_ref_storage_backend(be_name);
1877 struct ref_store *refs;
1878
1879 if (!be)
1880 BUG("reference backend %s is unknown", be_name);
1881
1882 refs = be->init(repo, gitdir, flags);
1883 return refs;
1884 }
1885
1886 struct ref_store *get_main_ref_store(struct repository *r)
1887 {
1888 if (r->refs_private)
1889 return r->refs_private;
1890
1891 if (!r->gitdir)
1892 BUG("attempting to get main_ref_store outside of repository");
1893
1894 r->refs_private = ref_store_init(r, r->gitdir, REF_STORE_ALL_CAPS);
1895 r->refs_private = maybe_debug_wrap_ref_store(r->gitdir, r->refs_private);
1896 return r->refs_private;
1897 }
1898
1899 /*
1900 * Associate a ref store with a name. It is a fatal error to call this
1901 * function twice for the same name.
1902 */
1903 static void register_ref_store_map(struct hashmap *map,
1904 const char *type,
1905 struct ref_store *refs,
1906 const char *name)
1907 {
1908 struct ref_store_hash_entry *entry;
1909
1910 if (!map->tablesize)
1911 hashmap_init(map, ref_store_hash_cmp, NULL, 0);
1912
1913 entry = alloc_ref_store_hash_entry(name, refs);
1914 if (hashmap_put(map, &entry->ent))
1915 BUG("%s ref_store '%s' initialized twice", type, name);
1916 }
1917
1918 struct ref_store *get_submodule_ref_store(const char *submodule)
1919 {
1920 struct strbuf submodule_sb = STRBUF_INIT;
1921 struct ref_store *refs;
1922 char *to_free = NULL;
1923 size_t len;
1924 struct repository *subrepo;
1925
1926 if (!submodule)
1927 return NULL;
1928
1929 len = strlen(submodule);
1930 while (len && is_dir_sep(submodule[len - 1]))
1931 len--;
1932 if (!len)
1933 return NULL;
1934
1935 if (submodule[len])
1936 /* We need to strip off one or more trailing slashes */
1937 submodule = to_free = xmemdupz(submodule, len);
1938
1939 refs = lookup_ref_store_map(&submodule_ref_stores, submodule);
1940 if (refs)
1941 goto done;
1942
1943 strbuf_addstr(&submodule_sb, submodule);
1944 if (!is_nonbare_repository_dir(&submodule_sb))
1945 goto done;
1946
1947 if (submodule_to_gitdir(&submodule_sb, submodule))
1948 goto done;
1949
1950 subrepo = xmalloc(sizeof(*subrepo));
1951 /*
1952 * NEEDSWORK: Make get_submodule_ref_store() work with arbitrary
1953 * superprojects other than the_repository. This probably should be
1954 * done by making it take a struct repository * parameter instead of a
1955 * submodule path.
1956 */
1957 if (repo_submodule_init(subrepo, the_repository, submodule,
1958 null_oid())) {
1959 free(subrepo);
1960 goto done;
1961 }
1962 refs = ref_store_init(subrepo, submodule_sb.buf,
1963 REF_STORE_READ | REF_STORE_ODB);
1964 register_ref_store_map(&submodule_ref_stores, "submodule",
1965 refs, submodule);
1966
1967 done:
1968 strbuf_release(&submodule_sb);
1969 free(to_free);
1970
1971 return refs;
1972 }
1973
1974 struct ref_store *get_worktree_ref_store(const struct worktree *wt)
1975 {
1976 struct ref_store *refs;
1977 const char *id;
1978
1979 if (wt->is_current)
1980 return get_main_ref_store(the_repository);
1981
1982 id = wt->id ? wt->id : "/";
1983 refs = lookup_ref_store_map(&worktree_ref_stores, id);
1984 if (refs)
1985 return refs;
1986
1987 if (wt->id)
1988 refs = ref_store_init(the_repository,
1989 git_common_path("worktrees/%s", wt->id),
1990 REF_STORE_ALL_CAPS);
1991 else
1992 refs = ref_store_init(the_repository,
1993 get_git_common_dir(),
1994 REF_STORE_ALL_CAPS);
1995
1996 if (refs)
1997 register_ref_store_map(&worktree_ref_stores, "worktree",
1998 refs, id);
1999 return refs;
2000 }
2001
2002 void base_ref_store_init(struct ref_store *refs,
2003 const struct ref_storage_be *be)
2004 {
2005 refs->be = be;
2006 }
2007
2008 /* backend functions */
2009 int refs_pack_refs(struct ref_store *refs, unsigned int flags)
2010 {
2011 return refs->be->pack_refs(refs, flags);
2012 }
2013
2014 int peel_iterated_oid(const struct object_id *base, struct object_id *peeled)
2015 {
2016 if (current_ref_iter &&
2017 (current_ref_iter->oid == base ||
2018 oideq(current_ref_iter->oid, base)))
2019 return ref_iterator_peel(current_ref_iter, peeled);
2020
2021 return peel_object(base, peeled) ? -1 : 0;
2022 }
2023
2024 int refs_create_symref(struct ref_store *refs,
2025 const char *ref_target,
2026 const char *refs_heads_master,
2027 const char *logmsg)
2028 {
2029 char *msg;
2030 int retval;
2031
2032 msg = normalize_reflog_message(logmsg);
2033 retval = refs->be->create_symref(refs, ref_target, refs_heads_master,
2034 msg);
2035 free(msg);
2036 return retval;
2037 }
2038
2039 int create_symref(const char *ref_target, const char *refs_heads_master,
2040 const char *logmsg)
2041 {
2042 return refs_create_symref(get_main_ref_store(the_repository), ref_target,
2043 refs_heads_master, logmsg);
2044 }
2045
2046 int ref_update_reject_duplicates(struct string_list *refnames,
2047 struct strbuf *err)
2048 {
2049 size_t i, n = refnames->nr;
2050
2051 assert(err);
2052
2053 for (i = 1; i < n; i++) {
2054 int cmp = strcmp(refnames->items[i - 1].string,
2055 refnames->items[i].string);
2056
2057 if (!cmp) {
2058 strbuf_addf(err,
2059 _("multiple updates for ref '%s' not allowed"),
2060 refnames->items[i].string);
2061 return 1;
2062 } else if (cmp > 0) {
2063 BUG("ref_update_reject_duplicates() received unsorted list");
2064 }
2065 }
2066 return 0;
2067 }
2068
2069 static int run_transaction_hook(struct ref_transaction *transaction,
2070 const char *state)
2071 {
2072 struct child_process proc = CHILD_PROCESS_INIT;
2073 struct strbuf buf = STRBUF_INIT;
2074 const char *hook;
2075 int ret = 0, i;
2076
2077 hook = find_hook("reference-transaction");
2078 if (!hook)
2079 return ret;
2080
2081 strvec_pushl(&proc.args, hook, state, NULL);
2082 proc.in = -1;
2083 proc.stdout_to_stderr = 1;
2084 proc.trace2_hook_name = "reference-transaction";
2085
2086 ret = start_command(&proc);
2087 if (ret)
2088 return ret;
2089
2090 sigchain_push(SIGPIPE, SIG_IGN);
2091
2092 for (i = 0; i < transaction->nr; i++) {
2093 struct ref_update *update = transaction->updates[i];
2094
2095 strbuf_reset(&buf);
2096 strbuf_addf(&buf, "%s %s %s\n",
2097 oid_to_hex(&update->old_oid),
2098 oid_to_hex(&update->new_oid),
2099 update->refname);
2100
2101 if (write_in_full(proc.in, buf.buf, buf.len) < 0) {
2102 if (errno != EPIPE) {
2103 /* Don't leak errno outside this API */
2104 errno = 0;
2105 ret = -1;
2106 }
2107 break;
2108 }
2109 }
2110
2111 close(proc.in);
2112 sigchain_pop(SIGPIPE);
2113 strbuf_release(&buf);
2114
2115 ret |= finish_command(&proc);
2116 return ret;
2117 }
2118
2119 int ref_transaction_prepare(struct ref_transaction *transaction,
2120 struct strbuf *err)
2121 {
2122 struct ref_store *refs = transaction->ref_store;
2123 int ret;
2124
2125 switch (transaction->state) {
2126 case REF_TRANSACTION_OPEN:
2127 /* Good. */
2128 break;
2129 case REF_TRANSACTION_PREPARED:
2130 BUG("prepare called twice on reference transaction");
2131 break;
2132 case REF_TRANSACTION_CLOSED:
2133 BUG("prepare called on a closed reference transaction");
2134 break;
2135 default:
2136 BUG("unexpected reference transaction state");
2137 break;
2138 }
2139
2140 if (getenv(GIT_QUARANTINE_ENVIRONMENT)) {
2141 strbuf_addstr(err,
2142 _("ref updates forbidden inside quarantine environment"));
2143 return -1;
2144 }
2145
2146 ret = refs->be->transaction_prepare(refs, transaction, err);
2147 if (ret)
2148 return ret;
2149
2150 ret = run_transaction_hook(transaction, "prepared");
2151 if (ret) {
2152 ref_transaction_abort(transaction, err);
2153 die(_("ref updates aborted by hook"));
2154 }
2155
2156 return 0;
2157 }
2158
2159 int ref_transaction_abort(struct ref_transaction *transaction,
2160 struct strbuf *err)
2161 {
2162 struct ref_store *refs = transaction->ref_store;
2163 int ret = 0;
2164
2165 switch (transaction->state) {
2166 case REF_TRANSACTION_OPEN:
2167 /* No need to abort explicitly. */
2168 break;
2169 case REF_TRANSACTION_PREPARED:
2170 ret = refs->be->transaction_abort(refs, transaction, err);
2171 break;
2172 case REF_TRANSACTION_CLOSED:
2173 BUG("abort called on a closed reference transaction");
2174 break;
2175 default:
2176 BUG("unexpected reference transaction state");
2177 break;
2178 }
2179
2180 run_transaction_hook(transaction, "aborted");
2181
2182 ref_transaction_free(transaction);
2183 return ret;
2184 }
2185
2186 int ref_transaction_commit(struct ref_transaction *transaction,
2187 struct strbuf *err)
2188 {
2189 struct ref_store *refs = transaction->ref_store;
2190 int ret;
2191
2192 switch (transaction->state) {
2193 case REF_TRANSACTION_OPEN:
2194 /* Need to prepare first. */
2195 ret = ref_transaction_prepare(transaction, err);
2196 if (ret)
2197 return ret;
2198 break;
2199 case REF_TRANSACTION_PREPARED:
2200 /* Fall through to finish. */
2201 break;
2202 case REF_TRANSACTION_CLOSED:
2203 BUG("commit called on a closed reference transaction");
2204 break;
2205 default:
2206 BUG("unexpected reference transaction state");
2207 break;
2208 }
2209
2210 ret = refs->be->transaction_finish(refs, transaction, err);
2211 if (!ret)
2212 run_transaction_hook(transaction, "committed");
2213 return ret;
2214 }
2215
2216 int refs_verify_refname_available(struct ref_store *refs,
2217 const char *refname,
2218 const struct string_list *extras,
2219 const struct string_list *skip,
2220 struct strbuf *err)
2221 {
2222 const char *slash;
2223 const char *extra_refname;
2224 struct strbuf dirname = STRBUF_INIT;
2225 struct strbuf referent = STRBUF_INIT;
2226 struct object_id oid;
2227 unsigned int type;
2228 struct ref_iterator *iter;
2229 int ok;
2230 int ret = -1;
2231
2232 /*
2233 * For the sake of comments in this function, suppose that
2234 * refname is "refs/foo/bar".
2235 */
2236
2237 assert(err);
2238
2239 strbuf_grow(&dirname, strlen(refname) + 1);
2240 for (slash = strchr(refname, '/'); slash; slash = strchr(slash + 1, '/')) {
2241 /*
2242 * Just saying "Is a directory" when we e.g. can't
2243 * lock some multi-level ref isn't very informative,
2244 * the user won't be told *what* is a directory, so
2245 * let's not use strerror() below.
2246 */
2247 int ignore_errno;
2248 /* Expand dirname to the new prefix, not including the trailing slash: */
2249 strbuf_add(&dirname, refname + dirname.len, slash - refname - dirname.len);
2250
2251 /*
2252 * We are still at a leading dir of the refname (e.g.,
2253 * "refs/foo"; if there is a reference with that name,
2254 * it is a conflict, *unless* it is in skip.
2255 */
2256 if (skip && string_list_has_string(skip, dirname.buf))
2257 continue;
2258
2259 if (!refs_read_raw_ref(refs, dirname.buf, &oid, &referent,
2260 &type, &ignore_errno)) {
2261 strbuf_addf(err, _("'%s' exists; cannot create '%s'"),
2262 dirname.buf, refname);
2263 goto cleanup;
2264 }
2265
2266 if (extras && string_list_has_string(extras, dirname.buf)) {
2267 strbuf_addf(err, _("cannot process '%s' and '%s' at the same time"),
2268 refname, dirname.buf);
2269 goto cleanup;
2270 }
2271 }
2272
2273 /*
2274 * We are at the leaf of our refname (e.g., "refs/foo/bar").
2275 * There is no point in searching for a reference with that
2276 * name, because a refname isn't considered to conflict with
2277 * itself. But we still need to check for references whose
2278 * names are in the "refs/foo/bar/" namespace, because they
2279 * *do* conflict.
2280 */
2281 strbuf_addstr(&dirname, refname + dirname.len);
2282 strbuf_addch(&dirname, '/');
2283
2284 iter = refs_ref_iterator_begin(refs, dirname.buf, 0,
2285 DO_FOR_EACH_INCLUDE_BROKEN);
2286 while ((ok = ref_iterator_advance(iter)) == ITER_OK) {
2287 if (skip &&
2288 string_list_has_string(skip, iter->refname))
2289 continue;
2290
2291 strbuf_addf(err, _("'%s' exists; cannot create '%s'"),
2292 iter->refname, refname);
2293 ref_iterator_abort(iter);
2294 goto cleanup;
2295 }
2296
2297 if (ok != ITER_DONE)
2298 BUG("error while iterating over references");
2299
2300 extra_refname = find_descendant_ref(dirname.buf, extras, skip);
2301 if (extra_refname)
2302 strbuf_addf(err, _("cannot process '%s' and '%s' at the same time"),
2303 refname, extra_refname);
2304 else
2305 ret = 0;
2306
2307 cleanup:
2308 strbuf_release(&referent);
2309 strbuf_release(&dirname);
2310 return ret;
2311 }
2312
2313 int refs_for_each_reflog(struct ref_store *refs, each_ref_fn fn, void *cb_data)
2314 {
2315 struct ref_iterator *iter;
2316 struct do_for_each_ref_help hp = { fn, cb_data };
2317
2318 iter = refs->be->reflog_iterator_begin(refs);
2319
2320 return do_for_each_repo_ref_iterator(the_repository, iter,
2321 do_for_each_ref_helper, &hp);
2322 }
2323
2324 int for_each_reflog(each_ref_fn fn, void *cb_data)
2325 {
2326 return refs_for_each_reflog(get_main_ref_store(the_repository), fn, cb_data);
2327 }
2328
2329 int refs_for_each_reflog_ent_reverse(struct ref_store *refs,
2330 const char *refname,
2331 each_reflog_ent_fn fn,
2332 void *cb_data)
2333 {
2334 return refs->be->for_each_reflog_ent_reverse(refs, refname,
2335 fn, cb_data);
2336 }
2337
2338 int for_each_reflog_ent_reverse(const char *refname, each_reflog_ent_fn fn,
2339 void *cb_data)
2340 {
2341 return refs_for_each_reflog_ent_reverse(get_main_ref_store(the_repository),
2342 refname, fn, cb_data);
2343 }
2344
2345 int refs_for_each_reflog_ent(struct ref_store *refs, const char *refname,
2346 each_reflog_ent_fn fn, void *cb_data)
2347 {
2348 return refs->be->for_each_reflog_ent(refs, refname, fn, cb_data);
2349 }
2350
2351 int for_each_reflog_ent(const char *refname, each_reflog_ent_fn fn,
2352 void *cb_data)
2353 {
2354 return refs_for_each_reflog_ent(get_main_ref_store(the_repository), refname,
2355 fn, cb_data);
2356 }
2357
2358 int refs_reflog_exists(struct ref_store *refs, const char *refname)
2359 {
2360 return refs->be->reflog_exists(refs, refname);
2361 }
2362
2363 int reflog_exists(const char *refname)
2364 {
2365 return refs_reflog_exists(get_main_ref_store(the_repository), refname);
2366 }
2367
2368 int refs_create_reflog(struct ref_store *refs, const char *refname,
2369 struct strbuf *err)
2370 {
2371 return refs->be->create_reflog(refs, refname, err);
2372 }
2373
2374 int safe_create_reflog(const char *refname, struct strbuf *err)
2375 {
2376 return refs_create_reflog(get_main_ref_store(the_repository), refname,
2377 err);
2378 }
2379
2380 int refs_delete_reflog(struct ref_store *refs, const char *refname)
2381 {
2382 return refs->be->delete_reflog(refs, refname);
2383 }
2384
2385 int delete_reflog(const char *refname)
2386 {
2387 return refs_delete_reflog(get_main_ref_store(the_repository), refname);
2388 }
2389
2390 int refs_reflog_expire(struct ref_store *refs,
2391 const char *refname,
2392 unsigned int flags,
2393 reflog_expiry_prepare_fn prepare_fn,
2394 reflog_expiry_should_prune_fn should_prune_fn,
2395 reflog_expiry_cleanup_fn cleanup_fn,
2396 void *policy_cb_data)
2397 {
2398 return refs->be->reflog_expire(refs, refname, flags,
2399 prepare_fn, should_prune_fn,
2400 cleanup_fn, policy_cb_data);
2401 }
2402
2403 int reflog_expire(const char *refname,
2404 unsigned int flags,
2405 reflog_expiry_prepare_fn prepare_fn,
2406 reflog_expiry_should_prune_fn should_prune_fn,
2407 reflog_expiry_cleanup_fn cleanup_fn,
2408 void *policy_cb_data)
2409 {
2410 return refs_reflog_expire(get_main_ref_store(the_repository),
2411 refname, flags,
2412 prepare_fn, should_prune_fn,
2413 cleanup_fn, policy_cb_data);
2414 }
2415
2416 int initial_ref_transaction_commit(struct ref_transaction *transaction,
2417 struct strbuf *err)
2418 {
2419 struct ref_store *refs = transaction->ref_store;
2420
2421 return refs->be->initial_transaction_commit(refs, transaction, err);
2422 }
2423
2424 int refs_delete_refs(struct ref_store *refs, const char *logmsg,
2425 struct string_list *refnames, unsigned int flags)
2426 {
2427 char *msg;
2428 int retval;
2429
2430 msg = normalize_reflog_message(logmsg);
2431 retval = refs->be->delete_refs(refs, msg, refnames, flags);
2432 free(msg);
2433 return retval;
2434 }
2435
2436 int delete_refs(const char *msg, struct string_list *refnames,
2437 unsigned int flags)
2438 {
2439 return refs_delete_refs(get_main_ref_store(the_repository), msg, refnames, flags);
2440 }
2441
2442 int refs_rename_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->rename_ref(refs, oldref, newref, msg);
2450 free(msg);
2451 return retval;
2452 }
2453
2454 int rename_ref(const char *oldref, const char *newref, const char *logmsg)
2455 {
2456 return refs_rename_ref(get_main_ref_store(the_repository), oldref, newref, logmsg);
2457 }
2458
2459 int refs_copy_existing_ref(struct ref_store *refs, const char *oldref,
2460 const char *newref, const char *logmsg)
2461 {
2462 char *msg;
2463 int retval;
2464
2465 msg = normalize_reflog_message(logmsg);
2466 retval = refs->be->copy_ref(refs, oldref, newref, msg);
2467 free(msg);
2468 return retval;
2469 }
2470
2471 int copy_existing_ref(const char *oldref, const char *newref, const char *logmsg)
2472 {
2473 return refs_copy_existing_ref(get_main_ref_store(the_repository), oldref, newref, logmsg);
2474 }