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