]> git.ipfire.org Git - thirdparty/git.git/blame - refs.c
refs: reorder some function definitions
[thirdparty/git.git] / refs.c
CommitLineData
7bd9bcf3
MH
1/*
2 * The backend-independent part of the reference module.
3 */
4
95fc7512 5#include "cache.h"
697cc8ef 6#include "lockfile.h"
85023577 7#include "refs.h"
4cb77009 8#include "refs/refs-internal.h"
cf0adba7
JH
9#include "object.h"
10#include "tag.h"
3581d793 11
3dce444f
RS
12/*
13 * List of all available backends
14 */
15static struct ref_storage_be *refs_backends = &refs_be_files;
16
17static struct ref_storage_be *find_ref_storage_backend(const char *name)
18{
19 struct ref_storage_be *be;
20 for (be = refs_backends; be; be = be->next)
21 if (!strcmp(be->name, name))
22 return be;
23 return NULL;
24}
25
26int ref_storage_backend_exists(const char *name)
27{
28 return find_ref_storage_backend(name) != NULL;
29}
30
bc5fd6d3 31/*
dde8a902
DT
32 * How to handle various characters in refnames:
33 * 0: An acceptable character for refs
5e650228
JH
34 * 1: End-of-component
35 * 2: ., look for a preceding . to reject .. in refs
36 * 3: {, look for a preceding @ to reject @{ in refs
53a8555e 37 * 4: A bad character: ASCII control characters, and
cd377f45
JK
38 * ":", "?", "[", "\", "^", "~", SP, or TAB
39 * 5: *, reject unless REFNAME_REFSPEC_PATTERN is set
dde8a902
DT
40 */
41static unsigned char refname_disposition[256] = {
5e650228
JH
42 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
43 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
cd377f45 44 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 2, 1,
5e650228 45 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 4,
dde8a902 46 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
5e650228
JH
47 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 4, 0,
48 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
49 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 4, 4
dde8a902
DT
50};
51
52/*
53 * Try to read one refname component from the front of refname.
54 * Return the length of the component found, or -1 if the component is
55 * not legal. It is legal if it is something reasonable to have under
56 * ".git/refs/"; We do not like it if:
bc5fd6d3
MH
57 *
58 * - any path component of it begins with ".", or
59 * - it has double dots "..", or
53a8555e 60 * - it has ASCII control characters, or
cd377f45
JK
61 * - it has ":", "?", "[", "\", "^", "~", SP, or TAB anywhere, or
62 * - it has "*" anywhere unless REFNAME_REFSPEC_PATTERN is set, or
53a8555e
JK
63 * - it ends with a "/", or
64 * - it ends with ".lock", or
65 * - it contains a "@{" portion
bc5fd6d3 66 */
cd377f45 67static int check_refname_component(const char *refname, int *flags)
bc5fd6d3
MH
68{
69 const char *cp;
70 char last = '\0';
71
72 for (cp = refname; ; cp++) {
dde8a902
DT
73 int ch = *cp & 255;
74 unsigned char disp = refname_disposition[ch];
75 switch (disp) {
5e650228 76 case 1:
dde8a902 77 goto out;
5e650228 78 case 2:
dde8a902
DT
79 if (last == '.')
80 return -1; /* Refname contains "..". */
81 break;
5e650228 82 case 3:
dde8a902
DT
83 if (last == '@')
84 return -1; /* Refname contains "@{". */
bc5fd6d3 85 break;
5e650228 86 case 4:
dde8a902 87 return -1;
cd377f45
JK
88 case 5:
89 if (!(*flags & REFNAME_REFSPEC_PATTERN))
90 return -1; /* refspec can't be a pattern */
91
92 /*
93 * Unset the pattern flag so that we only accept
94 * a single asterisk for one side of refspec.
95 */
96 *flags &= ~ REFNAME_REFSPEC_PATTERN;
97 break;
dde8a902 98 }
bc5fd6d3
MH
99 last = ch;
100 }
dde8a902 101out:
bc5fd6d3 102 if (cp == refname)
dac529e4 103 return 0; /* Component has zero length. */
f3cc52d8
JN
104 if (refname[0] == '.')
105 return -1; /* Component starts with '.'. */
7108ad23
MH
106 if (cp - refname >= LOCK_SUFFIX_LEN &&
107 !memcmp(cp - LOCK_SUFFIX_LEN, LOCK_SUFFIX, LOCK_SUFFIX_LEN))
bc5fd6d3
MH
108 return -1; /* Refname ends with ".lock". */
109 return cp - refname;
110}
111
5e650228 112int check_refname_format(const char *refname, int flags)
bc5fd6d3
MH
113{
114 int component_len, component_count = 0;
115
9ba89f48
FC
116 if (!strcmp(refname, "@"))
117 /* Refname is a single character '@'. */
118 return -1;
119
bc5fd6d3
MH
120 while (1) {
121 /* We are at the start of a path component. */
cd377f45
JK
122 component_len = check_refname_component(refname, &flags);
123 if (component_len <= 0)
124 return -1;
125
bc5fd6d3
MH
126 component_count++;
127 if (refname[component_len] == '\0')
128 break;
129 /* Skip to next component. */
130 refname += component_len + 1;
131 }
132
133 if (refname[component_len - 1] == '.')
134 return -1; /* Refname ends with '.'. */
135 if (!(flags & REFNAME_ALLOW_ONELEVEL) && component_count < 2)
136 return -1; /* Refname has only one component. */
137 return 0;
138}
139
4cb77009 140int refname_is_safe(const char *refname)
d0f810f0 141{
39950fef
MH
142 const char *rest;
143
144 if (skip_prefix(refname, "refs/", &rest)) {
d0f810f0
RS
145 char *buf;
146 int result;
e40f3557
MH
147 size_t restlen = strlen(rest);
148
149 /* rest must not be empty, or start or end with "/" */
150 if (!restlen || *rest == '/' || rest[restlen - 1] == '/')
151 return 0;
d0f810f0 152
d0f810f0
RS
153 /*
154 * Does the refname try to escape refs/?
155 * For example: refs/foo/../bar is safe but refs/foo/../../bar
156 * is not.
157 */
e40f3557
MH
158 buf = xmallocz(restlen);
159 result = !normalize_path_copy(buf, rest) && !strcmp(buf, rest);
d0f810f0
RS
160 free(buf);
161 return result;
162 }
35db25c6
MH
163
164 do {
d0f810f0
RS
165 if (!isupper(*refname) && *refname != '_')
166 return 0;
167 refname++;
35db25c6 168 } while (*refname);
d0f810f0
RS
169 return 1;
170}
171
7bd9bcf3
MH
172char *resolve_refdup(const char *refname, int resolve_flags,
173 unsigned char *sha1, int *flags)
e1e22e37 174{
7bd9bcf3
MH
175 return xstrdup_or_null(resolve_ref_unsafe(refname, resolve_flags,
176 sha1, flags));
cddc4258
MH
177}
178
7bd9bcf3
MH
179/* The argument to filter_refs */
180struct ref_filter {
181 const char *pattern;
182 each_ref_fn *fn;
183 void *cb_data;
184};
432ad41e 185
7bd9bcf3 186int read_ref_full(const char *refname, int resolve_flags, unsigned char *sha1, int *flags)
732134ed 187{
7bd9bcf3
MH
188 if (resolve_ref_unsafe(refname, resolve_flags, sha1, flags))
189 return 0;
190 return -1;
732134ed
MH
191}
192
7bd9bcf3 193int read_ref(const char *refname, unsigned char *sha1)
cddc4258 194{
7bd9bcf3 195 return read_ref_full(refname, RESOLVE_REF_READING, sha1, NULL);
c774aab9
JP
196}
197
7bd9bcf3 198int ref_exists(const char *refname)
bc5fd6d3 199{
7bd9bcf3
MH
200 unsigned char sha1[20];
201 return !!resolve_ref_unsafe(refname, RESOLVE_REF_READING, sha1, NULL);
bc5fd6d3
MH
202}
203
7bd9bcf3
MH
204static int filter_refs(const char *refname, const struct object_id *oid,
205 int flags, void *data)
432ad41e 206{
7bd9bcf3
MH
207 struct ref_filter *filter = (struct ref_filter *)data;
208
209 if (wildmatch(filter->pattern, refname, 0, NULL))
210 return 0;
211 return filter->fn(refname, oid, flags, filter->cb_data);
432ad41e
MH
212}
213
7bd9bcf3 214enum peel_status peel_object(const unsigned char *name, unsigned char *sha1)
c774aab9 215{
7bd9bcf3 216 struct object *o = lookup_unknown_object(name);
c774aab9 217
7bd9bcf3
MH
218 if (o->type == OBJ_NONE) {
219 int type = sha1_object_info(name, NULL);
220 if (type < 0 || !object_as_type(o, type, 0))
221 return PEEL_INVALID;
222 }
bc5fd6d3 223
7bd9bcf3
MH
224 if (o->type != OBJ_TAG)
225 return PEEL_NON_TAG;
e1980c9d 226
7bd9bcf3
MH
227 o = deref_tag_noverify(o);
228 if (!o)
229 return PEEL_INVALID;
230
844a9ce4 231 hashcpy(sha1, o->oid.hash);
7bd9bcf3 232 return PEEL_PEELED;
e1980c9d
JH
233}
234
7bd9bcf3
MH
235struct warn_if_dangling_data {
236 FILE *fp;
237 const char *refname;
238 const struct string_list *refnames;
239 const char *msg_fmt;
240};
bc5fd6d3 241
7bd9bcf3
MH
242static int warn_if_dangling_symref(const char *refname, const struct object_id *oid,
243 int flags, void *cb_data)
244{
245 struct warn_if_dangling_data *d = cb_data;
246 const char *resolves_to;
247 struct object_id junk;
bc5fd6d3 248
7bd9bcf3
MH
249 if (!(flags & REF_ISSYMREF))
250 return 0;
bc5fd6d3 251
7bd9bcf3
MH
252 resolves_to = resolve_ref_unsafe(refname, 0, junk.hash, NULL);
253 if (!resolves_to
254 || (d->refname
255 ? strcmp(resolves_to, d->refname)
256 : !string_list_has_string(d->refnames, resolves_to))) {
257 return 0;
258 }
bc5fd6d3 259
7bd9bcf3
MH
260 fprintf(d->fp, d->msg_fmt, refname);
261 fputc('\n', d->fp);
262 return 0;
bc5fd6d3
MH
263}
264
7bd9bcf3 265void warn_dangling_symref(FILE *fp, const char *msg_fmt, const char *refname)
f348ac92 266{
7bd9bcf3
MH
267 struct warn_if_dangling_data data;
268
269 data.fp = fp;
270 data.refname = refname;
271 data.refnames = NULL;
272 data.msg_fmt = msg_fmt;
273 for_each_rawref(warn_if_dangling_symref, &data);
f348ac92
MH
274}
275
7bd9bcf3 276void warn_dangling_symrefs(FILE *fp, const char *msg_fmt, const struct string_list *refnames)
432ad41e 277{
7bd9bcf3 278 struct warn_if_dangling_data data;
432ad41e 279
7bd9bcf3
MH
280 data.fp = fp;
281 data.refname = NULL;
282 data.refnames = refnames;
283 data.msg_fmt = msg_fmt;
284 for_each_rawref(warn_if_dangling_symref, &data);
432ad41e
MH
285}
286
7bd9bcf3 287int for_each_tag_ref(each_ref_fn fn, void *cb_data)
432ad41e 288{
7bd9bcf3 289 return for_each_ref_in("refs/tags/", fn, cb_data);
432ad41e
MH
290}
291
7bd9bcf3 292int for_each_tag_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data)
506a760d 293{
7bd9bcf3 294 return for_each_ref_in_submodule(submodule, "refs/tags/", fn, cb_data);
432ad41e
MH
295}
296
7bd9bcf3 297int for_each_branch_ref(each_ref_fn fn, void *cb_data)
432ad41e 298{
7bd9bcf3 299 return for_each_ref_in("refs/heads/", fn, cb_data);
432ad41e
MH
300}
301
7bd9bcf3 302int for_each_branch_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data)
202a56a9 303{
7bd9bcf3 304 return for_each_ref_in_submodule(submodule, "refs/heads/", fn, cb_data);
202a56a9 305}
432ad41e 306
7bd9bcf3 307int for_each_remote_ref(each_ref_fn fn, void *cb_data)
e9c4c111 308{
7bd9bcf3 309 return for_each_ref_in("refs/remotes/", fn, cb_data);
202a56a9
MH
310}
311
7bd9bcf3 312int for_each_remote_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data)
e9c4c111 313{
7bd9bcf3 314 return for_each_ref_in_submodule(submodule, "refs/remotes/", fn, cb_data);
662428f4 315}
c774aab9 316
7bd9bcf3
MH
317int head_ref_namespaced(each_ref_fn fn, void *cb_data)
318{
319 struct strbuf buf = STRBUF_INIT;
320 int ret = 0;
321 struct object_id oid;
322 int flag;
c774aab9 323
7bd9bcf3
MH
324 strbuf_addf(&buf, "%sHEAD", get_git_namespace());
325 if (!read_ref_full(buf.buf, RESOLVE_REF_READING, oid.hash, &flag))
326 ret = fn(buf.buf, &oid, flag, cb_data);
327 strbuf_release(&buf);
c774aab9 328
7bd9bcf3 329 return ret;
e9c4c111 330}
c774aab9 331
7bd9bcf3
MH
332int for_each_glob_ref_in(each_ref_fn fn, const char *pattern,
333 const char *prefix, void *cb_data)
662428f4 334{
7bd9bcf3
MH
335 struct strbuf real_pattern = STRBUF_INIT;
336 struct ref_filter filter;
337 int ret;
d08bae7e 338
59556548 339 if (!prefix && !starts_with(pattern, "refs/"))
d08bae7e 340 strbuf_addstr(&real_pattern, "refs/");
b09fe971
IL
341 else if (prefix)
342 strbuf_addstr(&real_pattern, prefix);
d08bae7e
IL
343 strbuf_addstr(&real_pattern, pattern);
344
894a9d33 345 if (!has_glob_specials(pattern)) {
9517e6b8 346 /* Append implied '/' '*' if not present. */
00b6c178 347 strbuf_complete(&real_pattern, '/');
d08bae7e
IL
348 /* No need to check for '*', there is none. */
349 strbuf_addch(&real_pattern, '*');
350 }
351
352 filter.pattern = real_pattern.buf;
353 filter.fn = fn;
354 filter.cb_data = cb_data;
355 ret = for_each_ref(filter_refs, &filter);
356
357 strbuf_release(&real_pattern);
358 return ret;
359}
360
b09fe971
IL
361int for_each_glob_ref(each_ref_fn fn, const char *pattern, void *cb_data)
362{
363 return for_each_glob_ref_in(fn, pattern, NULL, cb_data);
364}
365
4577e483 366const char *prettify_refname(const char *name)
a9c37a72 367{
a9c37a72 368 return name + (
59556548
CC
369 starts_with(name, "refs/heads/") ? 11 :
370 starts_with(name, "refs/tags/") ? 10 :
371 starts_with(name, "refs/remotes/") ? 13 :
a9c37a72
DB
372 0);
373}
374
54457fe5 375static const char *ref_rev_parse_rules[] = {
79803322
SP
376 "%.*s",
377 "refs/%.*s",
378 "refs/tags/%.*s",
379 "refs/heads/%.*s",
380 "refs/remotes/%.*s",
381 "refs/remotes/%.*s/HEAD",
382 NULL
383};
384
54457fe5 385int refname_match(const char *abbrev_name, const char *full_name)
79803322
SP
386{
387 const char **p;
388 const int abbrev_name_len = strlen(abbrev_name);
389
54457fe5 390 for (p = ref_rev_parse_rules; *p; p++) {
79803322
SP
391 if (!strcmp(full_name, mkpath(*p, abbrev_name_len, abbrev_name))) {
392 return 1;
393 }
394 }
395
396 return 0;
397}
398
ff74f7f1
JH
399/*
400 * *string and *len will only be substituted, and *string returned (for
401 * later free()ing) if the string passed in is a magic short-hand form
402 * to name a branch.
403 */
404static char *substitute_branch_name(const char **string, int *len)
405{
406 struct strbuf buf = STRBUF_INIT;
cf99a761 407 int ret = interpret_branch_name(*string, *len, &buf);
ff74f7f1
JH
408
409 if (ret == *len) {
410 size_t size;
411 *string = strbuf_detach(&buf, &size);
412 *len = size;
413 return (char *)*string;
414 }
415
416 return NULL;
417}
418
419int dwim_ref(const char *str, int len, unsigned char *sha1, char **ref)
420{
421 char *last_branch = substitute_branch_name(&str, &len);
41da7111
NTND
422 int refs_found = expand_ref(str, len, sha1, ref);
423 free(last_branch);
424 return refs_found;
425}
426
427int expand_ref(const char *str, int len, unsigned char *sha1, char **ref)
428{
ff74f7f1
JH
429 const char **p, *r;
430 int refs_found = 0;
431
432 *ref = NULL;
433 for (p = ref_rev_parse_rules; *p; p++) {
434 char fullref[PATH_MAX];
435 unsigned char sha1_from_ref[20];
436 unsigned char *this_result;
437 int flag;
438
439 this_result = refs_found ? sha1_from_ref : sha1;
440 mksnpath(fullref, sizeof(fullref), *p, len, str);
7695d118
RS
441 r = resolve_ref_unsafe(fullref, RESOLVE_REF_READING,
442 this_result, &flag);
ff74f7f1
JH
443 if (r) {
444 if (!refs_found++)
445 *ref = xstrdup(r);
446 if (!warn_ambiguous_refs)
447 break;
55956350 448 } else if ((flag & REF_ISSYMREF) && strcmp(fullref, "HEAD")) {
ff74f7f1 449 warning("ignoring dangling symref %s.", fullref);
55956350
JH
450 } else if ((flag & REF_ISBROKEN) && strchr(fullref, '/')) {
451 warning("ignoring broken ref %s.", fullref);
452 }
ff74f7f1 453 }
ff74f7f1
JH
454 return refs_found;
455}
456
457int dwim_log(const char *str, int len, unsigned char *sha1, char **log)
458{
459 char *last_branch = substitute_branch_name(&str, &len);
460 const char **p;
461 int logs_found = 0;
462
463 *log = NULL;
464 for (p = ref_rev_parse_rules; *p; p++) {
ff74f7f1
JH
465 unsigned char hash[20];
466 char path[PATH_MAX];
467 const char *ref, *it;
468
469 mksnpath(path, sizeof(path), *p, len, str);
7695d118
RS
470 ref = resolve_ref_unsafe(path, RESOLVE_REF_READING,
471 hash, NULL);
ff74f7f1
JH
472 if (!ref)
473 continue;
4da58835 474 if (reflog_exists(path))
ff74f7f1 475 it = path;
4da58835 476 else if (strcmp(ref, path) && reflog_exists(ref))
ff74f7f1
JH
477 it = ref;
478 else
479 continue;
480 if (!logs_found++) {
481 *log = xstrdup(it);
482 hashcpy(sha1, hash);
483 }
7bd9bcf3
MH
484 if (!warn_ambiguous_refs)
485 break;
c0277d15 486 }
7bd9bcf3
MH
487 free(last_branch);
488 return logs_found;
2ddb5d17
BK
489}
490
266b1827
DT
491static int is_per_worktree_ref(const char *refname)
492{
ce414b33
DT
493 return !strcmp(refname, "HEAD") ||
494 starts_with(refname, "refs/bisect/");
266b1827
DT
495}
496
497static int is_pseudoref_syntax(const char *refname)
498{
499 const char *c;
500
501 for (c = refname; *c; c++) {
502 if (!isupper(*c) && *c != '-' && *c != '_')
503 return 0;
504 }
505
506 return 1;
507}
508
509enum ref_type ref_type(const char *refname)
510{
511 if (is_per_worktree_ref(refname))
512 return REF_TYPE_PER_WORKTREE;
513 if (is_pseudoref_syntax(refname))
514 return REF_TYPE_PSEUDOREF;
515 return REF_TYPE_NORMAL;
516}
517
74ec19d4
DT
518static int write_pseudoref(const char *pseudoref, const unsigned char *sha1,
519 const unsigned char *old_sha1, struct strbuf *err)
520{
521 const char *filename;
522 int fd;
523 static struct lock_file lock;
524 struct strbuf buf = STRBUF_INIT;
525 int ret = -1;
526
527 strbuf_addf(&buf, "%s\n", sha1_to_hex(sha1));
528
529 filename = git_path("%s", pseudoref);
530 fd = hold_lock_file_for_update(&lock, filename, LOCK_DIE_ON_ERROR);
531 if (fd < 0) {
0568c8e9 532 strbuf_addf(err, "could not open '%s' for writing: %s",
74ec19d4
DT
533 filename, strerror(errno));
534 return -1;
535 }
536
537 if (old_sha1) {
538 unsigned char actual_old_sha1[20];
2c3aed13
DT
539
540 if (read_ref(pseudoref, actual_old_sha1))
541 die("could not read ref '%s'", pseudoref);
74ec19d4 542 if (hashcmp(actual_old_sha1, old_sha1)) {
0568c8e9 543 strbuf_addf(err, "unexpected sha1 when writing '%s'", pseudoref);
74ec19d4
DT
544 rollback_lock_file(&lock);
545 goto done;
546 }
547 }
548
549 if (write_in_full(fd, buf.buf, buf.len) != buf.len) {
0568c8e9 550 strbuf_addf(err, "could not write to '%s'", filename);
74ec19d4
DT
551 rollback_lock_file(&lock);
552 goto done;
553 }
554
555 commit_lock_file(&lock);
556 ret = 0;
557done:
558 strbuf_release(&buf);
559 return ret;
560}
561
562static int delete_pseudoref(const char *pseudoref, const unsigned char *old_sha1)
563{
564 static struct lock_file lock;
565 const char *filename;
566
567 filename = git_path("%s", pseudoref);
568
569 if (old_sha1 && !is_null_sha1(old_sha1)) {
570 int fd;
571 unsigned char actual_old_sha1[20];
572
573 fd = hold_lock_file_for_update(&lock, filename,
574 LOCK_DIE_ON_ERROR);
575 if (fd < 0)
576 die_errno(_("Could not open '%s' for writing"), filename);
2c3aed13
DT
577 if (read_ref(pseudoref, actual_old_sha1))
578 die("could not read ref '%s'", pseudoref);
74ec19d4
DT
579 if (hashcmp(actual_old_sha1, old_sha1)) {
580 warning("Unexpected sha1 when deleting %s", pseudoref);
581 rollback_lock_file(&lock);
582 return -1;
a4c653df 583 }
74ec19d4
DT
584
585 unlink(filename);
586 rollback_lock_file(&lock);
587 } else {
588 unlink(filename);
4bd18c43 589 }
a4c653df 590
4bd18c43 591 return 0;
95fc7512 592}
d556fae2 593
fc1c2168
MH
594int delete_ref(const char *refname, const unsigned char *old_sha1,
595 unsigned int flags)
41b625b0 596{
7521cc46 597 struct ref_transaction *transaction;
a4c653df 598 struct strbuf err = STRBUF_INIT;
8b5157e4 599
74ec19d4 600 if (ref_type(refname) == REF_TYPE_PSEUDOREF)
080cc646 601 return delete_pseudoref(refname, old_sha1);
d48744d1 602
7521cc46
RS
603 transaction = ref_transaction_begin(&err);
604 if (!transaction ||
fc67a082 605 ref_transaction_delete(transaction, refname, old_sha1,
fb5a6bb6 606 flags, NULL, &err) ||
db7516ab 607 ref_transaction_commit(transaction, &err)) {
7521cc46
RS
608 error("%s", err.buf);
609 ref_transaction_free(transaction);
610 strbuf_release(&err);
c0277d15 611 return 1;
41b625b0 612 }
7bd9bcf3
MH
613 ref_transaction_free(transaction);
614 strbuf_release(&err);
b531394d
BC
615 return 0;
616}
41b625b0 617
4cb77009 618int copy_reflog_msg(char *buf, const char *msg)
0ec29a47
JH
619{
620 char *cp = buf;
621 char c;
622 int wasspace = 1;
8b5157e4 623
0ec29a47
JH
624 *cp++ = '\t';
625 while ((c = *msg++)) {
626 if (wasspace && isspace(c))
627 continue;
628 wasspace = isspace(c);
629 if (wasspace)
630 c = ' ';
631 *cp++ = c;
a4c653df 632 }
0ec29a47
JH
633 while (buf < cp && isspace(cp[-1]))
634 cp--;
635 *cp++ = '\n';
636 return cp - buf;
637}
8b5157e4 638
4cb77009 639int should_autocreate_reflog(const char *refname)
4e2bef57
DT
640{
641 if (!log_all_ref_updates)
642 return 0;
643 return starts_with(refname, "refs/heads/") ||
644 starts_with(refname, "refs/remotes/") ||
645 starts_with(refname, "refs/notes/") ||
646 !strcmp(refname, "HEAD");
647}
648
e7e0f26e 649int is_branch(const char *refname)
c3b0dec5 650{
59556548 651 return !strcmp(refname, "HEAD") || starts_with(refname, "refs/heads/");
41b625b0
NP
652}
653
4207ed28
RS
654struct read_ref_at_cb {
655 const char *refname;
656 unsigned long at_time;
657 int cnt;
658 int reccnt;
659 unsigned char *sha1;
660 int found_it;
661
662 unsigned char osha1[20];
663 unsigned char nsha1[20];
664 int tz;
665 unsigned long date;
666 char **msg;
667 unsigned long *cutoff_time;
668 int *cutoff_tz;
669 int *cutoff_cnt;
670};
671
672static int read_ref_at_ent(unsigned char *osha1, unsigned char *nsha1,
673 const char *email, unsigned long timestamp, int tz,
674 const char *message, void *cb_data)
675{
676 struct read_ref_at_cb *cb = cb_data;
677
678 cb->reccnt++;
679 cb->tz = tz;
680 cb->date = timestamp;
681
682 if (timestamp <= cb->at_time || cb->cnt == 0) {
683 if (cb->msg)
684 *cb->msg = xstrdup(message);
685 if (cb->cutoff_time)
686 *cb->cutoff_time = timestamp;
687 if (cb->cutoff_tz)
688 *cb->cutoff_tz = tz;
689 if (cb->cutoff_cnt)
690 *cb->cutoff_cnt = cb->reccnt - 1;
691 /*
692 * we have not yet updated cb->[n|o]sha1 so they still
693 * hold the values for the previous record.
694 */
695 if (!is_null_sha1(cb->osha1)) {
696 hashcpy(cb->sha1, nsha1);
697 if (hashcmp(cb->osha1, nsha1))
698 warning("Log for ref %s has gap after %s.",
a5481a6c 699 cb->refname, show_date(cb->date, cb->tz, DATE_MODE(RFC2822)));
4207ed28
RS
700 }
701 else if (cb->date == cb->at_time)
702 hashcpy(cb->sha1, nsha1);
703 else if (hashcmp(nsha1, cb->sha1))
704 warning("Log for ref %s unexpectedly ended on %s.",
705 cb->refname, show_date(cb->date, cb->tz,
a5481a6c 706 DATE_MODE(RFC2822)));
4207ed28
RS
707 hashcpy(cb->osha1, osha1);
708 hashcpy(cb->nsha1, nsha1);
709 cb->found_it = 1;
710 return 1;
711 }
712 hashcpy(cb->osha1, osha1);
713 hashcpy(cb->nsha1, nsha1);
714 if (cb->cnt > 0)
715 cb->cnt--;
716 return 0;
717}
718
719static int read_ref_at_ent_oldest(unsigned char *osha1, unsigned char *nsha1,
720 const char *email, unsigned long timestamp,
721 int tz, const char *message, void *cb_data)
722{
723 struct read_ref_at_cb *cb = cb_data;
724
725 if (cb->msg)
726 *cb->msg = xstrdup(message);
727 if (cb->cutoff_time)
728 *cb->cutoff_time = timestamp;
729 if (cb->cutoff_tz)
730 *cb->cutoff_tz = tz;
731 if (cb->cutoff_cnt)
732 *cb->cutoff_cnt = cb->reccnt;
733 hashcpy(cb->sha1, osha1);
734 if (is_null_sha1(cb->sha1))
735 hashcpy(cb->sha1, nsha1);
736 /* We just want the first entry */
737 return 1;
16d7cc90
JH
738}
739
c41a87dd 740int read_ref_at(const char *refname, unsigned int flags, unsigned long at_time, int cnt,
dfefa935
MH
741 unsigned char *sha1, char **msg,
742 unsigned long *cutoff_time, int *cutoff_tz, int *cutoff_cnt)
d556fae2 743{
4207ed28 744 struct read_ref_at_cb cb;
d556fae2 745
4207ed28
RS
746 memset(&cb, 0, sizeof(cb));
747 cb.refname = refname;
748 cb.at_time = at_time;
749 cb.cnt = cnt;
750 cb.msg = msg;
751 cb.cutoff_time = cutoff_time;
752 cb.cutoff_tz = cutoff_tz;
753 cb.cutoff_cnt = cutoff_cnt;
754 cb.sha1 = sha1;
755
756 for_each_reflog_ent_reverse(refname, read_ref_at_ent, &cb);
757
c41a87dd
DA
758 if (!cb.reccnt) {
759 if (flags & GET_SHA1_QUIETLY)
760 exit(128);
761 else
762 die("Log for %s is empty.", refname);
763 }
4207ed28
RS
764 if (cb.found_it)
765 return 0;
766
767 for_each_reflog_ent(refname, read_ref_at_ent_oldest, &cb);
d556fae2 768
16d7cc90 769 return 1;
d556fae2 770}
2ff81662 771
93a644ea 772struct ref_transaction *ref_transaction_begin(struct strbuf *err)
caa4046c 773{
5a603b04
JN
774 assert(err);
775
caa4046c
MH
776 return xcalloc(1, sizeof(struct ref_transaction));
777}
778
026bd1d3 779void ref_transaction_free(struct ref_transaction *transaction)
caa4046c
MH
780{
781 int i;
782
1b07255c
RS
783 if (!transaction)
784 return;
785
db7516ab
RS
786 for (i = 0; i < transaction->nr; i++) {
787 free(transaction->updates[i]->msg);
88615910 788 free(transaction->updates[i]);
db7516ab 789 }
caa4046c
MH
790 free(transaction->updates);
791 free(transaction);
792}
793
71564516
MH
794struct ref_update *ref_transaction_add_update(
795 struct ref_transaction *transaction,
796 const char *refname, unsigned int flags,
797 const unsigned char *new_sha1,
798 const unsigned char *old_sha1,
799 const char *msg)
caa4046c 800{
96ffc06f 801 struct ref_update *update;
71564516
MH
802
803 if (transaction->state != REF_TRANSACTION_OPEN)
804 die("BUG: update called for transaction that is not open");
805
806 if ((flags & REF_ISPRUNING) && !(flags & REF_NODEREF))
807 die("BUG: REF_ISPRUNING set without REF_NODEREF");
808
96ffc06f 809 FLEX_ALLOC_STR(update, refname, refname);
caa4046c
MH
810 ALLOC_GROW(transaction->updates, transaction->nr + 1, transaction->alloc);
811 transaction->updates[transaction->nr++] = update;
71564516
MH
812
813 update->flags = flags;
814
815 if (flags & REF_HAVE_NEW)
816 hashcpy(update->new_sha1, new_sha1);
817 if (flags & REF_HAVE_OLD)
818 hashcpy(update->old_sha1, old_sha1);
13092a91 819 update->msg = xstrdup_or_null(msg);
caa4046c
MH
820 return update;
821}
822
8e34800e
RS
823int ref_transaction_update(struct ref_transaction *transaction,
824 const char *refname,
825 const unsigned char *new_sha1,
826 const unsigned char *old_sha1,
1d147bdf 827 unsigned int flags, const char *msg,
8e34800e 828 struct strbuf *err)
caa4046c 829{
5a603b04
JN
830 assert(err);
831
8a679de6
MH
832 if ((new_sha1 && !is_null_sha1(new_sha1)) ?
833 check_refname_format(refname, REFNAME_ALLOW_ONELEVEL) :
834 !refname_is_safe(refname)) {
0568c8e9 835 strbuf_addf(err, "refusing to update ref with bad name '%s'",
d0f810f0
RS
836 refname);
837 return -1;
838 }
839
71564516
MH
840 flags |= (new_sha1 ? REF_HAVE_NEW : 0) | (old_sha1 ? REF_HAVE_OLD : 0);
841
842 ref_transaction_add_update(transaction, refname, flags,
843 new_sha1, old_sha1, msg);
8e34800e 844 return 0;
caa4046c
MH
845}
846
b416af5b
RS
847int ref_transaction_create(struct ref_transaction *transaction,
848 const char *refname,
849 const unsigned char *new_sha1,
fec14ec3 850 unsigned int flags, const char *msg,
b416af5b 851 struct strbuf *err)
caa4046c 852{
f04c5b55
MH
853 if (!new_sha1 || is_null_sha1(new_sha1))
854 die("BUG: create called without valid new_sha1");
bc9f2925 855 return ref_transaction_update(transaction, refname, new_sha1,
1d147bdf 856 null_sha1, flags, msg, err);
caa4046c
MH
857}
858
8c8bdc0d
RS
859int ref_transaction_delete(struct ref_transaction *transaction,
860 const char *refname,
861 const unsigned char *old_sha1,
fb5a6bb6 862 unsigned int flags, const char *msg,
8c8bdc0d 863 struct strbuf *err)
caa4046c 864{
60294596
MH
865 if (old_sha1 && is_null_sha1(old_sha1))
866 die("BUG: delete called with old_sha1 set to zeros");
1d147bdf 867 return ref_transaction_update(transaction, refname,
fb5a6bb6 868 null_sha1, old_sha1,
1d147bdf 869 flags, msg, err);
caa4046c
MH
870}
871
16180334
MH
872int ref_transaction_verify(struct ref_transaction *transaction,
873 const char *refname,
874 const unsigned char *old_sha1,
875 unsigned int flags,
876 struct strbuf *err)
877{
878 if (!old_sha1)
879 die("BUG: verify called with old_sha1 set to NULL");
880 return ref_transaction_update(transaction, refname,
881 NULL, old_sha1,
882 flags, NULL, err);
883}
884
8f6dc7e3 885int update_ref_oid(const char *msg, const char *refname,
886 const struct object_id *new_oid, const struct object_id *old_oid,
887 unsigned int flags, enum action_on_err onerr)
888{
889 return update_ref(msg, refname, new_oid ? new_oid->hash : NULL,
890 old_oid ? old_oid->hash : NULL, flags, onerr);
891}
892
4b7b520b
MH
893int update_ref(const char *msg, const char *refname,
894 const unsigned char *new_sha1, const unsigned char *old_sha1,
fec14ec3 895 unsigned int flags, enum action_on_err onerr)
4738a333 896{
74ec19d4 897 struct ref_transaction *t = NULL;
b4d75ac1 898 struct strbuf err = STRBUF_INIT;
74ec19d4 899 int ret = 0;
b4d75ac1 900
74ec19d4
DT
901 if (ref_type(refname) == REF_TYPE_PSEUDOREF) {
902 ret = write_pseudoref(refname, new_sha1, old_sha1, &err);
903 } else {
904 t = ref_transaction_begin(&err);
905 if (!t ||
906 ref_transaction_update(t, refname, new_sha1, old_sha1,
907 flags, msg, &err) ||
908 ref_transaction_commit(t, &err)) {
909 ret = 1;
910 ref_transaction_free(t);
911 }
912 }
913 if (ret) {
b4d75ac1
RS
914 const char *str = "update_ref failed for ref '%s': %s";
915
b4d75ac1
RS
916 switch (onerr) {
917 case UPDATE_REFS_MSG_ON_ERR:
918 error(str, refname, err.buf);
919 break;
920 case UPDATE_REFS_DIE_ON_ERR:
921 die(str, refname, err.buf);
922 break;
923 case UPDATE_REFS_QUIET_ON_ERR:
924 break;
925 }
926 strbuf_release(&err);
4738a333 927 return 1;
b4d75ac1
RS
928 }
929 strbuf_release(&err);
74ec19d4
DT
930 if (t)
931 ref_transaction_free(t);
b4d75ac1 932 return 0;
4738a333
BK
933}
934
dfefa935 935char *shorten_unambiguous_ref(const char *refname, int strict)
7c2b3029
JK
936{
937 int i;
938 static char **scanf_fmts;
939 static int nr_rules;
940 char *short_name;
941
7c2b3029 942 if (!nr_rules) {
4346663a
MH
943 /*
944 * Pre-generate scanf formats from ref_rev_parse_rules[].
945 * Generate a format suitable for scanf from a
946 * ref_rev_parse_rules rule by interpolating "%s" at the
947 * location of the "%.*s".
948 */
7c2b3029 949 size_t total_len = 0;
84d5633f 950 size_t offset = 0;
7c2b3029
JK
951
952 /* the rule list is NULL terminated, count them first */
a4165851 953 for (nr_rules = 0; ref_rev_parse_rules[nr_rules]; nr_rules++)
7902fe03
MH
954 /* -2 for strlen("%.*s") - strlen("%s"); +1 for NUL */
955 total_len += strlen(ref_rev_parse_rules[nr_rules]) - 2 + 1;
7c2b3029 956
50492f7b 957 scanf_fmts = xmalloc(st_add(st_mult(sizeof(char *), nr_rules), total_len));
7c2b3029 958
84d5633f 959 offset = 0;
7c2b3029 960 for (i = 0; i < nr_rules; i++) {
4346663a 961 assert(offset < total_len);
84d5633f 962 scanf_fmts[i] = (char *)&scanf_fmts[nr_rules] + offset;
4346663a
MH
963 offset += snprintf(scanf_fmts[i], total_len - offset,
964 ref_rev_parse_rules[i], 2, "%s") + 1;
7c2b3029
JK
965 }
966 }
967
968 /* bail out if there are no rules */
969 if (!nr_rules)
dfefa935 970 return xstrdup(refname);
7c2b3029 971
dfefa935
MH
972 /* buffer for scanf result, at most refname must fit */
973 short_name = xstrdup(refname);
7c2b3029
JK
974
975 /* skip first rule, it will always match */
976 for (i = nr_rules - 1; i > 0 ; --i) {
977 int j;
6e7b3309 978 int rules_to_fail = i;
7c2b3029
JK
979 int short_name_len;
980
dfefa935 981 if (1 != sscanf(refname, scanf_fmts[i], short_name))
7c2b3029
JK
982 continue;
983
984 short_name_len = strlen(short_name);
985
6e7b3309
BW
986 /*
987 * in strict mode, all (except the matched one) rules
988 * must fail to resolve to a valid non-ambiguous ref
989 */
990 if (strict)
991 rules_to_fail = nr_rules;
992
7c2b3029
JK
993 /*
994 * check if the short name resolves to a valid ref,
995 * but use only rules prior to the matched one
996 */
6e7b3309 997 for (j = 0; j < rules_to_fail; j++) {
7c2b3029 998 const char *rule = ref_rev_parse_rules[j];
7c2b3029
JK
999 char refname[PATH_MAX];
1000
6e7b3309
BW
1001 /* skip matched rule */
1002 if (i == j)
1003 continue;
1004
7c2b3029
JK
1005 /*
1006 * the short name is ambiguous, if it resolves
1007 * (with this previous rule) to a valid ref
1008 * read_ref() returns 0 on success
1009 */
1010 mksnpath(refname, sizeof(refname),
1011 rule, short_name_len, short_name);
c6893323 1012 if (ref_exists(refname))
7c2b3029
JK
1013 break;
1014 }
1015
1016 /*
1017 * short name is non-ambiguous if all previous rules
1018 * haven't resolved to a valid ref
1019 */
6e7b3309 1020 if (j == rules_to_fail)
7c2b3029
JK
1021 return short_name;
1022 }
1023
1024 free(short_name);
dfefa935 1025 return xstrdup(refname);
7c2b3029 1026}
daebaa78
JH
1027
1028static struct string_list *hide_refs;
1029
1030int parse_hide_refs_config(const char *var, const char *value, const char *section)
1031{
1032 if (!strcmp("transfer.hiderefs", var) ||
1033 /* NEEDSWORK: use parse_config_key() once both are merged */
59556548 1034 (starts_with(var, section) && var[strlen(section)] == '.' &&
daebaa78
JH
1035 !strcmp(var + strlen(section), ".hiderefs"))) {
1036 char *ref;
1037 int len;
1038
1039 if (!value)
1040 return config_error_nonbool(var);
1041 ref = xstrdup(value);
1042 len = strlen(ref);
1043 while (len && ref[len - 1] == '/')
1044 ref[--len] = '\0';
1045 if (!hide_refs) {
1046 hide_refs = xcalloc(1, sizeof(*hide_refs));
1047 hide_refs->strdup_strings = 1;
1048 }
1049 string_list_append(hide_refs, ref);
1050 }
1051 return 0;
1052}
1053
78a766ab 1054int ref_is_hidden(const char *refname, const char *refname_full)
daebaa78 1055{
2bc31d16 1056 int i;
daebaa78
JH
1057
1058 if (!hide_refs)
1059 return 0;
2bc31d16
JK
1060 for (i = hide_refs->nr - 1; i >= 0; i--) {
1061 const char *match = hide_refs->items[i].string;
78a766ab 1062 const char *subject;
2bc31d16 1063 int neg = 0;
daebaa78 1064 int len;
2bc31d16
JK
1065
1066 if (*match == '!') {
1067 neg = 1;
1068 match++;
1069 }
1070
78a766ab
LF
1071 if (*match == '^') {
1072 subject = refname_full;
1073 match++;
1074 } else {
1075 subject = refname;
1076 }
1077
1078 /* refname can be NULL when namespaces are used. */
1079 if (!subject || !starts_with(subject, match))
daebaa78 1080 continue;
2bc31d16 1081 len = strlen(match);
78a766ab 1082 if (!subject[len] || subject[len] == '/')
2bc31d16 1083 return !neg;
daebaa78
JH
1084 }
1085 return 0;
1086}
fa5b1830 1087
0845122c
DT
1088const char *find_descendant_ref(const char *dirname,
1089 const struct string_list *extras,
1090 const struct string_list *skip)
fa5b1830 1091{
0845122c 1092 int pos;
fa5b1830 1093
0845122c
DT
1094 if (!extras)
1095 return NULL;
fa5b1830
MH
1096
1097 /*
0845122c
DT
1098 * Look at the place where dirname would be inserted into
1099 * extras. If there is an entry at that position that starts
1100 * with dirname (remember, dirname includes the trailing
1101 * slash) and is not in skip, then we have a conflict.
fa5b1830 1102 */
0845122c
DT
1103 for (pos = string_list_find_insert_index(extras, dirname, 0);
1104 pos < extras->nr; pos++) {
1105 const char *extra_refname = extras->items[pos].string;
fa5b1830 1106
0845122c
DT
1107 if (!starts_with(extra_refname, dirname))
1108 break;
1109
1110 if (!skip || !string_list_has_string(skip, extra_refname))
1111 return extra_refname;
fa5b1830 1112 }
0845122c
DT
1113 return NULL;
1114}
fa5b1830 1115
ff3a299c 1116int rename_ref_available(const char *old_refname, const char *new_refname)
0845122c
DT
1117{
1118 struct string_list skip = STRING_LIST_INIT_NODUP;
1119 struct strbuf err = STRBUF_INIT;
ff3a299c 1120 int ok;
fa5b1830 1121
ff3a299c
DT
1122 string_list_insert(&skip, old_refname);
1123 ok = !verify_refname_available(new_refname, NULL, &skip, &err);
1124 if (!ok)
0845122c
DT
1125 error("%s", err.buf);
1126
1127 string_list_clear(&skip, 0);
1128 strbuf_release(&err);
ff3a299c 1129 return ok;
fa5b1830 1130}
2bf68ed5
DT
1131
1132int head_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data)
1133{
1134 struct object_id oid;
1135 int flag;
1136
1137 if (submodule) {
1138 if (resolve_gitlink_ref(submodule, "HEAD", oid.hash) == 0)
1139 return fn("HEAD", &oid, 0, cb_data);
1140
1141 return 0;
1142 }
1143
1144 if (!read_ref_full("HEAD", RESOLVE_REF_READING, oid.hash, &flag))
1145 return fn("HEAD", &oid, flag, cb_data);
1146
1147 return 0;
1148}
1149
1150int head_ref(each_ref_fn fn, void *cb_data)
1151{
1152 return head_ref_submodule(NULL, fn, cb_data);
1153}
93770590 1154
4c4de895
MH
1155/*
1156 * Call fn for each reference in the specified submodule for which the
1157 * refname begins with prefix. If trim is non-zero, then trim that
1158 * many characters off the beginning of each refname before passing
1159 * the refname to fn. flags can be DO_FOR_EACH_INCLUDE_BROKEN to
1160 * include broken references in the iteration. If fn ever returns a
1161 * non-zero value, stop the iteration and return that value;
1162 * otherwise, return 0.
1163 */
1164static int do_for_each_ref(const char *submodule, const char *prefix,
1165 each_ref_fn fn, int trim, int flags, void *cb_data)
1166{
00eebe35 1167 struct ref_store *refs = get_ref_store(submodule);
4c4de895
MH
1168 struct ref_iterator *iter;
1169
00eebe35
MH
1170 if (!refs)
1171 return 0;
1172
1a769003 1173 iter = refs->be->iterator_begin(refs, prefix, flags);
4c4de895
MH
1174 iter = prefix_ref_iterator_begin(iter, prefix, trim);
1175
1176 return do_for_each_ref_iterator(iter, fn, cb_data);
1177}
1178
93770590
DT
1179int for_each_ref(each_ref_fn fn, void *cb_data)
1180{
1181 return do_for_each_ref(NULL, "", fn, 0, 0, cb_data);
1182}
1183
1184int for_each_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data)
1185{
1186 return do_for_each_ref(submodule, "", fn, 0, 0, cb_data);
1187}
1188
1189int for_each_ref_in(const char *prefix, each_ref_fn fn, void *cb_data)
1190{
1191 return do_for_each_ref(NULL, prefix, fn, strlen(prefix), 0, cb_data);
1192}
1193
1194int for_each_fullref_in(const char *prefix, each_ref_fn fn, void *cb_data, unsigned int broken)
1195{
1196 unsigned int flag = 0;
1197
1198 if (broken)
1199 flag = DO_FOR_EACH_INCLUDE_BROKEN;
1200 return do_for_each_ref(NULL, prefix, fn, 0, flag, cb_data);
1201}
1202
1203int for_each_ref_in_submodule(const char *submodule, const char *prefix,
1204 each_ref_fn fn, void *cb_data)
1205{
1206 return do_for_each_ref(submodule, prefix, fn, strlen(prefix), 0, cb_data);
1207}
1208
1209int for_each_replace_ref(each_ref_fn fn, void *cb_data)
1210{
1211 return do_for_each_ref(NULL, git_replace_ref_base, fn,
1212 strlen(git_replace_ref_base), 0, cb_data);
1213}
1214
1215int for_each_namespaced_ref(each_ref_fn fn, void *cb_data)
1216{
1217 struct strbuf buf = STRBUF_INIT;
1218 int ret;
1219 strbuf_addf(&buf, "%srefs/", get_git_namespace());
1220 ret = do_for_each_ref(NULL, buf.buf, fn, 0, 0, cb_data);
1221 strbuf_release(&buf);
1222 return ret;
1223}
1224
1225int for_each_rawref(each_ref_fn fn, void *cb_data)
1226{
1227 return do_for_each_ref(NULL, "", fn, 0,
1228 DO_FOR_EACH_INCLUDE_BROKEN, cb_data);
1229}
2d0663b2
DT
1230
1231/* This function needs to return a meaningful errno on failure */
bd40dcda
MH
1232static const char *resolve_ref_recursively(struct ref_store *refs,
1233 const char *refname,
1234 int resolve_flags,
1235 unsigned char *sha1, int *flags)
2d0663b2
DT
1236{
1237 static struct strbuf sb_refname = STRBUF_INIT;
1238 int unused_flags;
1239 int symref_count;
1240
1241 if (!flags)
1242 flags = &unused_flags;
1243
1244 *flags = 0;
1245
1246 if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
1247 if (!(resolve_flags & RESOLVE_REF_ALLOW_BAD_NAME) ||
1248 !refname_is_safe(refname)) {
1249 errno = EINVAL;
1250 return NULL;
1251 }
1252
1253 /*
1254 * dwim_ref() uses REF_ISBROKEN to distinguish between
1255 * missing refs and refs that were present but invalid,
1256 * to complain about the latter to stderr.
1257 *
1258 * We don't know whether the ref exists, so don't set
1259 * REF_ISBROKEN yet.
1260 */
1261 *flags |= REF_BAD_NAME;
1262 }
1263
1264 for (symref_count = 0; symref_count < SYMREF_MAXDEPTH; symref_count++) {
1265 unsigned int read_flags = 0;
1266
e1e33b72
MH
1267 if (refs->be->read_raw_ref(refs, refname,
1268 sha1, &sb_refname, &read_flags)) {
2d0663b2
DT
1269 *flags |= read_flags;
1270 if (errno != ENOENT || (resolve_flags & RESOLVE_REF_READING))
1271 return NULL;
1272 hashclr(sha1);
1273 if (*flags & REF_BAD_NAME)
1274 *flags |= REF_ISBROKEN;
1275 return refname;
1276 }
1277
1278 *flags |= read_flags;
1279
1280 if (!(read_flags & REF_ISSYMREF)) {
1281 if (*flags & REF_BAD_NAME) {
1282 hashclr(sha1);
1283 *flags |= REF_ISBROKEN;
1284 }
1285 return refname;
1286 }
1287
1288 refname = sb_refname.buf;
1289 if (resolve_flags & RESOLVE_REF_NO_RECURSE) {
1290 hashclr(sha1);
1291 return refname;
1292 }
1293 if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
1294 if (!(resolve_flags & RESOLVE_REF_ALLOW_BAD_NAME) ||
1295 !refname_is_safe(refname)) {
1296 errno = EINVAL;
1297 return NULL;
1298 }
1299
1300 *flags |= REF_ISBROKEN | REF_BAD_NAME;
1301 }
1302 }
1303
1304 errno = ELOOP;
1305 return NULL;
1306}
00eebe35 1307
6fb5acfd
DT
1308/* backend functions */
1309int refs_init_db(struct strbuf *err)
1310{
1311 struct ref_store *refs = get_ref_store(NULL);
1312
1313 return refs->be->init_db(refs, err);
1314}
1315
bd40dcda
MH
1316const char *resolve_ref_unsafe(const char *refname, int resolve_flags,
1317 unsigned char *sha1, int *flags)
1318{
1319 return resolve_ref_recursively(get_ref_store(NULL), refname,
1320 resolve_flags, sha1, flags);
1321}
1322
a8355bb7
MH
1323int resolve_gitlink_ref(const char *submodule, const char *refname,
1324 unsigned char *sha1)
424dcc76 1325{
a8355bb7 1326 size_t len = strlen(submodule);
424dcc76
MH
1327 struct ref_store *refs;
1328 int flags;
1329
a8355bb7 1330 while (len && submodule[len - 1] == '/')
424dcc76 1331 len--;
48a8475f 1332
424dcc76
MH
1333 if (!len)
1334 return -1;
1335
a8355bb7 1336 if (submodule[len]) {
48a8475f 1337 /* We need to strip off one or more trailing slashes */
a8355bb7 1338 char *stripped = xmemdupz(submodule, len);
48a8475f
MH
1339
1340 refs = get_ref_store(stripped);
1341 free(stripped);
1342 } else {
a8355bb7 1343 refs = get_ref_store(submodule);
48a8475f
MH
1344 }
1345
424dcc76
MH
1346 if (!refs)
1347 return -1;
1348
1349 if (!resolve_ref_recursively(refs, refname, 0, sha1, &flags) ||
1350 is_null_sha1(sha1))
1351 return -1;
1352 return 0;
1353}
1354
00eebe35
MH
1355/* A pointer to the ref_store for the main repository: */
1356static struct ref_store *main_ref_store;
1357
1358/* A linked list of ref_stores for submodules: */
1359static struct ref_store *submodule_ref_stores;
1360
620a66b9 1361struct ref_store *lookup_ref_store(const char *submodule)
00eebe35 1362{
620a66b9 1363 struct ref_store *refs;
00eebe35 1364
620a66b9
MH
1365 if (!submodule || !*submodule)
1366 return main_ref_store;
00eebe35 1367
620a66b9
MH
1368 for (refs = submodule_ref_stores; refs; refs = refs->next) {
1369 if (!strcmp(submodule, refs->submodule))
1370 return refs;
00eebe35 1371 }
620a66b9
MH
1372
1373 return NULL;
00eebe35
MH
1374}
1375
1376struct ref_store *ref_store_init(const char *submodule)
1377{
1378 const char *be_name = "files";
1379 struct ref_storage_be *be = find_ref_storage_backend(be_name);
1380
1381 if (!be)
1382 die("BUG: reference backend %s is unknown", be_name);
1383
1384 if (!submodule || !*submodule)
1385 return be->init(NULL);
1386 else
1387 return be->init(submodule);
1388}
1389
00eebe35
MH
1390struct ref_store *get_ref_store(const char *submodule)
1391{
1392 struct ref_store *refs;
1393
1394 if (!submodule || !*submodule) {
1395 refs = lookup_ref_store(NULL);
1396
1397 if (!refs)
1398 refs = ref_store_init(NULL);
1399 } else {
1400 refs = lookup_ref_store(submodule);
1401
1402 if (!refs) {
1403 struct strbuf submodule_sb = STRBUF_INIT;
1404
1405 strbuf_addstr(&submodule_sb, submodule);
1406 if (is_nonbare_repository_dir(&submodule_sb))
1407 refs = ref_store_init(submodule);
1408 strbuf_release(&submodule_sb);
1409 }
1410 }
1411
1412 return refs;
1413}
1414
620a66b9
MH
1415void base_ref_store_init(struct ref_store *refs,
1416 const struct ref_storage_be *be,
1417 const char *submodule)
1418{
1419 refs->be = be;
1420 if (!submodule) {
1421 if (main_ref_store)
1422 die("BUG: main_ref_store initialized twice");
1423
1424 refs->submodule = "";
1425 refs->next = NULL;
1426 main_ref_store = refs;
1427 } else {
1428 if (lookup_ref_store(submodule))
1429 die("BUG: ref_store for submodule '%s' initialized twice",
1430 submodule);
1431
1432 refs->submodule = xstrdup(submodule);
1433 refs->next = submodule_ref_stores;
1434 submodule_ref_stores = refs;
1435 }
1436}
1437
00eebe35
MH
1438void assert_main_repository(struct ref_store *refs, const char *caller)
1439{
1440 if (*refs->submodule)
1441 die("BUG: %s called for a submodule", caller);
1442}
127b42a1
RS
1443
1444/* backend functions */
8231527e
MH
1445int pack_refs(unsigned int flags)
1446{
1447 struct ref_store *refs = get_ref_store(NULL);
1448
1449 return refs->be->pack_refs(refs, flags);
1450}
1451
bd427cf2
MH
1452int peel_ref(const char *refname, unsigned char *sha1)
1453{
1454 struct ref_store *refs = get_ref_store(NULL);
1455
1456 return refs->be->peel_ref(refs, refname, sha1);
1457}
1458
284689ba
MH
1459int create_symref(const char *ref_target, const char *refs_heads_master,
1460 const char *logmsg)
1461{
1462 struct ref_store *refs = get_ref_store(NULL);
1463
1464 return refs->be->create_symref(refs, ref_target, refs_heads_master,
1465 logmsg);
1466}
1467
127b42a1
RS
1468int ref_transaction_commit(struct ref_transaction *transaction,
1469 struct strbuf *err)
1470{
1471 struct ref_store *refs = get_ref_store(NULL);
1472
1473 return refs->be->transaction_commit(refs, transaction, err);
1474}
62665823
MH
1475
1476int verify_refname_available(const char *refname,
1477 const struct string_list *extra,
1478 const struct string_list *skip,
1479 struct strbuf *err)
1480{
1481 struct ref_store *refs = get_ref_store(NULL);
1482
1483 return refs->be->verify_refname_available(refs, refname, extra, skip, err);
1484}
e3688bd6
DT
1485
1486int for_each_reflog(each_ref_fn fn, void *cb_data)
1487{
1488 struct ref_store *refs = get_ref_store(NULL);
1489 struct ref_iterator *iter;
1490
1491 iter = refs->be->reflog_iterator_begin(refs);
1492
1493 return do_for_each_ref_iterator(iter, fn, cb_data);
1494}
1495
1496int for_each_reflog_ent_reverse(const char *refname, each_reflog_ent_fn fn,
1497 void *cb_data)
1498{
1499 struct ref_store *refs = get_ref_store(NULL);
1500
1501 return refs->be->for_each_reflog_ent_reverse(refs, refname,
1502 fn, cb_data);
1503}
1504
1505int for_each_reflog_ent(const char *refname, each_reflog_ent_fn fn,
1506 void *cb_data)
1507{
1508 struct ref_store *refs = get_ref_store(NULL);
1509
1510 return refs->be->for_each_reflog_ent(refs, refname, fn, cb_data);
1511}
1512
1513int reflog_exists(const char *refname)
1514{
1515 struct ref_store *refs = get_ref_store(NULL);
1516
1517 return refs->be->reflog_exists(refs, refname);
1518}
1519
1520int safe_create_reflog(const char *refname, int force_create,
1521 struct strbuf *err)
1522{
1523 struct ref_store *refs = get_ref_store(NULL);
1524
1525 return refs->be->create_reflog(refs, refname, force_create, err);
1526}
1527
1528int delete_reflog(const char *refname)
1529{
1530 struct ref_store *refs = get_ref_store(NULL);
1531
1532 return refs->be->delete_reflog(refs, refname);
1533}
1534
1535int reflog_expire(const char *refname, const unsigned char *sha1,
1536 unsigned int flags,
1537 reflog_expiry_prepare_fn prepare_fn,
1538 reflog_expiry_should_prune_fn should_prune_fn,
1539 reflog_expiry_cleanup_fn cleanup_fn,
1540 void *policy_cb_data)
1541{
1542 struct ref_store *refs = get_ref_store(NULL);
1543
1544 return refs->be->reflog_expire(refs, refname, sha1, flags,
1545 prepare_fn, should_prune_fn,
1546 cleanup_fn, policy_cb_data);
1547}
fc681463
DT
1548
1549int initial_ref_transaction_commit(struct ref_transaction *transaction,
1550 struct strbuf *err)
1551{
1552 struct ref_store *refs = get_ref_store(NULL);
1553
1554 return refs->be->initial_transaction_commit(refs, transaction, err);
1555}
a27dcf89
DT
1556
1557int delete_refs(struct string_list *refnames, unsigned int flags)
1558{
1559 struct ref_store *refs = get_ref_store(NULL);
1560
1561 return refs->be->delete_refs(refs, refnames, flags);
1562}
9b6b40d9
DT
1563
1564int rename_ref(const char *oldref, const char *newref, const char *logmsg)
1565{
1566 struct ref_store *refs = get_ref_store(NULL);
1567
1568 return refs->be->rename_ref(refs, oldref, newref, logmsg);
1569}