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