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