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