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