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