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