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