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