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