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