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