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