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