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