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