refs.c 42.8 KB
Newer Older
1 2 3 4
/*
 * The backend-independent part of the reference module.
 */

D
Daniel Barkalow 已提交
5
#include "cache.h"
6
#include "hashmap.h"
7
#include "lockfile.h"
8
#include "refs.h"
9
#include "refs/refs-internal.h"
10 11
#include "object.h"
#include "tag.h"
12
#include "submodule.h"
13

14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
/*
 * List of all available backends
 */
static struct ref_storage_be *refs_backends = &refs_be_files;

static struct ref_storage_be *find_ref_storage_backend(const char *name)
{
	struct ref_storage_be *be;
	for (be = refs_backends; be; be = be->next)
		if (!strcmp(be->name, name))
			return be;
	return NULL;
}

int ref_storage_backend_exists(const char *name)
{
	return find_ref_storage_backend(name) != NULL;
}

33
/*
34 35
 * How to handle various characters in refnames:
 * 0: An acceptable character for refs
36 37 38
 * 1: End-of-component
 * 2: ., look for a preceding . to reject .. in refs
 * 3: {, look for a preceding @ to reject @{ in refs
39
 * 4: A bad character: ASCII control characters, and
40 41
 *    ":", "?", "[", "\", "^", "~", SP, or TAB
 * 5: *, reject unless REFNAME_REFSPEC_PATTERN is set
42 43
 */
static unsigned char refname_disposition[256] = {
44 45
	1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
	4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
46
	4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 2, 1,
47
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 4,
48
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
49 50 51
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 4, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 4, 4
52 53 54 55 56 57 58
};

/*
 * Try to read one refname component from the front of refname.
 * Return the length of the component found, or -1 if the component is
 * not legal.  It is legal if it is something reasonable to have under
 * ".git/refs/"; We do not like it if:
59 60 61
 *
 * - any path component of it begins with ".", or
 * - it has double dots "..", or
62
 * - it has ASCII control characters, or
63 64
 * - it has ":", "?", "[", "\", "^", "~", SP, or TAB anywhere, or
 * - it has "*" anywhere unless REFNAME_REFSPEC_PATTERN is set, or
65 66 67
 * - it ends with a "/", or
 * - it ends with ".lock", or
 * - it contains a "@{" portion
68
 */
69
static int check_refname_component(const char *refname, int *flags)
70 71 72 73 74
{
	const char *cp;
	char last = '\0';

	for (cp = refname; ; cp++) {
75 76 77
		int ch = *cp & 255;
		unsigned char disp = refname_disposition[ch];
		switch (disp) {
78
		case 1:
79
			goto out;
80
		case 2:
81 82 83
			if (last == '.')
				return -1; /* Refname contains "..". */
			break;
84
		case 3:
85 86
			if (last == '@')
				return -1; /* Refname contains "@{". */
87
			break;
88
		case 4:
89
			return -1;
90 91 92 93 94 95 96 97 98 99
		case 5:
			if (!(*flags & REFNAME_REFSPEC_PATTERN))
				return -1; /* refspec can't be a pattern */

			/*
			 * Unset the pattern flag so that we only accept
			 * a single asterisk for one side of refspec.
			 */
			*flags &= ~ REFNAME_REFSPEC_PATTERN;
			break;
100
		}
101 102
		last = ch;
	}
103
out:
104
	if (cp == refname)
105
		return 0; /* Component has zero length. */
106 107
	if (refname[0] == '.')
		return -1; /* Component starts with '.'. */
108 109
	if (cp - refname >= LOCK_SUFFIX_LEN &&
	    !memcmp(cp - LOCK_SUFFIX_LEN, LOCK_SUFFIX, LOCK_SUFFIX_LEN))
110 111 112 113
		return -1; /* Refname ends with ".lock". */
	return cp - refname;
}

114
int check_refname_format(const char *refname, int flags)
115 116 117
{
	int component_len, component_count = 0;

F
Felipe Contreras 已提交
118 119 120 121
	if (!strcmp(refname, "@"))
		/* Refname is a single character '@'. */
		return -1;

122 123
	while (1) {
		/* We are at the start of a path component. */
124 125 126 127
		component_len = check_refname_component(refname, &flags);
		if (component_len <= 0)
			return -1;

128 129 130 131 132 133 134 135 136 137 138 139 140 141
		component_count++;
		if (refname[component_len] == '\0')
			break;
		/* Skip to next component. */
		refname += component_len + 1;
	}

	if (refname[component_len - 1] == '.')
		return -1; /* Refname ends with '.'. */
	if (!(flags & REFNAME_ALLOW_ONELEVEL) && component_count < 2)
		return -1; /* Refname has only one component. */
	return 0;
}

142
int refname_is_safe(const char *refname)
143
{
144 145 146
	const char *rest;

	if (skip_prefix(refname, "refs/", &rest)) {
147 148
		char *buf;
		int result;
149 150 151 152 153
		size_t restlen = strlen(rest);

		/* rest must not be empty, or start or end with "/" */
		if (!restlen || *rest == '/' || rest[restlen - 1] == '/')
			return 0;
154 155 156 157 158 159

		/*
		 * Does the refname try to escape refs/?
		 * For example: refs/foo/../bar is safe but refs/foo/../../bar
		 * is not.
		 */
160 161
		buf = xmallocz(restlen);
		result = !normalize_path_copy(buf, rest) && !strcmp(buf, rest);
162 163 164
		free(buf);
		return result;
	}
165 166

	do {
167 168 169
		if (!isupper(*refname) && *refname != '_')
			return 0;
		refname++;
170
	} while (*refname);
171 172 173
	return 1;
}

174 175 176 177 178 179 180 181 182 183 184
char *refs_resolve_refdup(struct ref_store *refs,
			  const char *refname, int resolve_flags,
			  unsigned char *sha1, int *flags)
{
	const char *result;

	result = refs_resolve_ref_unsafe(refs, refname, resolve_flags,
					 sha1, flags);
	return xstrdup_or_null(result);
}

185 186
char *resolve_refdup(const char *refname, int resolve_flags,
		     unsigned char *sha1, int *flags)
187
{
188 189 190
	return refs_resolve_refdup(get_main_ref_store(),
				   refname, resolve_flags,
				   sha1, flags);
191 192
}

193 194 195 196 197 198
/* The argument to filter_refs */
struct ref_filter {
	const char *pattern;
	each_ref_fn *fn;
	void *cb_data;
};
199

200 201
int refs_read_ref_full(struct ref_store *refs, const char *refname,
		       int resolve_flags, unsigned char *sha1, int *flags)
202
{
203
	if (refs_resolve_ref_unsafe(refs, refname, resolve_flags, sha1, flags))
204 205
		return 0;
	return -1;
206 207
}

208 209 210 211 212 213
int read_ref_full(const char *refname, int resolve_flags, unsigned char *sha1, int *flags)
{
	return refs_read_ref_full(get_main_ref_store(), refname,
				  resolve_flags, sha1, flags);
}

214
int read_ref(const char *refname, unsigned char *sha1)
215
{
216
	return read_ref_full(refname, RESOLVE_REF_READING, sha1, NULL);
217 218
}

219
int ref_exists(const char *refname)
220
{
221 222
	unsigned char sha1[20];
	return !!resolve_ref_unsafe(refname, RESOLVE_REF_READING, sha1, NULL);
223 224
}

225 226
static int filter_refs(const char *refname, const struct object_id *oid,
			   int flags, void *data)
227
{
228 229 230 231 232
	struct ref_filter *filter = (struct ref_filter *)data;

	if (wildmatch(filter->pattern, refname, 0, NULL))
		return 0;
	return filter->fn(refname, oid, flags, filter->cb_data);
233 234
}

235
enum peel_status peel_object(const unsigned char *name, unsigned char *sha1)
236
{
237
	struct object *o = lookup_unknown_object(name);
238

239 240 241 242 243
	if (o->type == OBJ_NONE) {
		int type = sha1_object_info(name, NULL);
		if (type < 0 || !object_as_type(o, type, 0))
			return PEEL_INVALID;
	}
244

245 246
	if (o->type != OBJ_TAG)
		return PEEL_NON_TAG;
247

248 249 250 251
	o = deref_tag_noverify(o);
	if (!o)
		return PEEL_INVALID;

J
Junio C Hamano 已提交
252
	hashcpy(sha1, o->oid.hash);
253
	return PEEL_PEELED;
254 255
}

256 257 258 259 260 261
struct warn_if_dangling_data {
	FILE *fp;
	const char *refname;
	const struct string_list *refnames;
	const char *msg_fmt;
};
262

263 264 265 266 267 268
static int warn_if_dangling_symref(const char *refname, const struct object_id *oid,
				   int flags, void *cb_data)
{
	struct warn_if_dangling_data *d = cb_data;
	const char *resolves_to;
	struct object_id junk;
269

270 271
	if (!(flags & REF_ISSYMREF))
		return 0;
272

273 274 275 276 277 278 279
	resolves_to = resolve_ref_unsafe(refname, 0, junk.hash, NULL);
	if (!resolves_to
	    || (d->refname
		? strcmp(resolves_to, d->refname)
		: !string_list_has_string(d->refnames, resolves_to))) {
		return 0;
	}
280

281 282 283
	fprintf(d->fp, d->msg_fmt, refname);
	fputc('\n', d->fp);
	return 0;
284 285
}

286
void warn_dangling_symref(FILE *fp, const char *msg_fmt, const char *refname)
287
{
288 289 290 291 292 293 294
	struct warn_if_dangling_data data;

	data.fp = fp;
	data.refname = refname;
	data.refnames = NULL;
	data.msg_fmt = msg_fmt;
	for_each_rawref(warn_if_dangling_symref, &data);
295 296
}

297
void warn_dangling_symrefs(FILE *fp, const char *msg_fmt, const struct string_list *refnames)
298
{
299
	struct warn_if_dangling_data data;
300

301 302 303 304 305
	data.fp = fp;
	data.refname = NULL;
	data.refnames = refnames;
	data.msg_fmt = msg_fmt;
	for_each_rawref(warn_if_dangling_symref, &data);
306 307
}

308 309 310 311 312
int refs_for_each_tag_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
{
	return refs_for_each_ref_in(refs, "refs/tags/", fn, cb_data);
}

313
int for_each_tag_ref(each_ref_fn fn, void *cb_data)
314
{
315
	return refs_for_each_tag_ref(get_main_ref_store(), fn, cb_data);
316 317
}

318
int for_each_tag_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data)
319
{
320 321 322 323 324 325 326
	return refs_for_each_tag_ref(get_submodule_ref_store(submodule),
				     fn, cb_data);
}

int refs_for_each_branch_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
{
	return refs_for_each_ref_in(refs, "refs/heads/", fn, cb_data);
327 328
}

329
int for_each_branch_ref(each_ref_fn fn, void *cb_data)
330
{
331
	return refs_for_each_branch_ref(get_main_ref_store(), fn, cb_data);
332 333
}

334
int for_each_branch_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data)
335
{
336 337 338 339 340 341 342
	return refs_for_each_branch_ref(get_submodule_ref_store(submodule),
					fn, cb_data);
}

int refs_for_each_remote_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
{
	return refs_for_each_ref_in(refs, "refs/remotes/", fn, cb_data);
343
}
344

345
int for_each_remote_ref(each_ref_fn fn, void *cb_data)
346
{
347
	return refs_for_each_remote_ref(get_main_ref_store(), fn, cb_data);
348 349
}

350
int for_each_remote_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data)
351
{
352 353
	return refs_for_each_remote_ref(get_submodule_ref_store(submodule),
					fn, cb_data);
354
}
355

356 357 358 359 360 361
int head_ref_namespaced(each_ref_fn fn, void *cb_data)
{
	struct strbuf buf = STRBUF_INIT;
	int ret = 0;
	struct object_id oid;
	int flag;
362

363 364 365 366
	strbuf_addf(&buf, "%sHEAD", get_git_namespace());
	if (!read_ref_full(buf.buf, RESOLVE_REF_READING, oid.hash, &flag))
		ret = fn(buf.buf, &oid, flag, cb_data);
	strbuf_release(&buf);
367

368
	return ret;
369
}
370

371 372
int for_each_glob_ref_in(each_ref_fn fn, const char *pattern,
	const char *prefix, void *cb_data)
373
{
374 375 376
	struct strbuf real_pattern = STRBUF_INIT;
	struct ref_filter filter;
	int ret;
I
Ilari Liusvaara 已提交
377

378
	if (!prefix && !starts_with(pattern, "refs/"))
I
Ilari Liusvaara 已提交
379
		strbuf_addstr(&real_pattern, "refs/");
380 381
	else if (prefix)
		strbuf_addstr(&real_pattern, prefix);
I
Ilari Liusvaara 已提交
382 383
	strbuf_addstr(&real_pattern, pattern);

384
	if (!has_glob_specials(pattern)) {
385
		/* Append implied '/' '*' if not present. */
386
		strbuf_complete(&real_pattern, '/');
I
Ilari Liusvaara 已提交
387 388 389 390 391 392 393 394 395 396 397 398 399
		/* No need to check for '*', there is none. */
		strbuf_addch(&real_pattern, '*');
	}

	filter.pattern = real_pattern.buf;
	filter.fn = fn;
	filter.cb_data = cb_data;
	ret = for_each_ref(filter_refs, &filter);

	strbuf_release(&real_pattern);
	return ret;
}

400 401 402 403 404
int for_each_glob_ref(each_ref_fn fn, const char *pattern, void *cb_data)
{
	return for_each_glob_ref_in(fn, pattern, NULL, cb_data);
}

405
const char *prettify_refname(const char *name)
406 407
{
	return name + (
408 409 410
		starts_with(name, "refs/heads/") ? 11 :
		starts_with(name, "refs/tags/") ? 10 :
		starts_with(name, "refs/remotes/") ? 13 :
411 412 413
		0);
}

414
static const char *ref_rev_parse_rules[] = {
S
Steffen Prohaska 已提交
415 416 417 418 419 420 421 422 423
	"%.*s",
	"refs/%.*s",
	"refs/tags/%.*s",
	"refs/heads/%.*s",
	"refs/remotes/%.*s",
	"refs/remotes/%.*s/HEAD",
	NULL
};

424
int refname_match(const char *abbrev_name, const char *full_name)
S
Steffen Prohaska 已提交
425 426 427 428
{
	const char **p;
	const int abbrev_name_len = strlen(abbrev_name);

429
	for (p = ref_rev_parse_rules; *p; p++) {
S
Steffen Prohaska 已提交
430 431 432 433 434 435 436 437
		if (!strcmp(full_name, mkpath(*p, abbrev_name_len, abbrev_name))) {
			return 1;
		}
	}

	return 0;
}

438 439 440 441 442 443 444 445
/*
 * *string and *len will only be substituted, and *string returned (for
 * later free()ing) if the string passed in is a magic short-hand form
 * to name a branch.
 */
static char *substitute_branch_name(const char **string, int *len)
{
	struct strbuf buf = STRBUF_INIT;
446
	int ret = interpret_branch_name(*string, *len, &buf, 0);
447 448 449 450 451 452 453 454 455 456 457 458 459 460

	if (ret == *len) {
		size_t size;
		*string = strbuf_detach(&buf, &size);
		*len = size;
		return (char *)*string;
	}

	return NULL;
}

int dwim_ref(const char *str, int len, unsigned char *sha1, char **ref)
{
	char *last_branch = substitute_branch_name(&str, &len);
461 462 463 464 465 466 467
	int   refs_found  = expand_ref(str, len, sha1, ref);
	free(last_branch);
	return refs_found;
}

int expand_ref(const char *str, int len, unsigned char *sha1, char **ref)
{
468 469 470 471 472 473 474 475 476 477 478 479
	const char **p, *r;
	int refs_found = 0;

	*ref = NULL;
	for (p = ref_rev_parse_rules; *p; p++) {
		char fullref[PATH_MAX];
		unsigned char sha1_from_ref[20];
		unsigned char *this_result;
		int flag;

		this_result = refs_found ? sha1_from_ref : sha1;
		mksnpath(fullref, sizeof(fullref), *p, len, str);
480 481
		r = resolve_ref_unsafe(fullref, RESOLVE_REF_READING,
				       this_result, &flag);
482 483 484 485 486
		if (r) {
			if (!refs_found++)
				*ref = xstrdup(r);
			if (!warn_ambiguous_refs)
				break;
487
		} else if ((flag & REF_ISSYMREF) && strcmp(fullref, "HEAD")) {
488
			warning("ignoring dangling symref %s.", fullref);
489 490 491
		} else if ((flag & REF_ISBROKEN) && strchr(fullref, '/')) {
			warning("ignoring broken ref %s.", fullref);
		}
492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508
	}
	return refs_found;
}

int dwim_log(const char *str, int len, unsigned char *sha1, char **log)
{
	char *last_branch = substitute_branch_name(&str, &len);
	const char **p;
	int logs_found = 0;

	*log = NULL;
	for (p = ref_rev_parse_rules; *p; p++) {
		unsigned char hash[20];
		char path[PATH_MAX];
		const char *ref, *it;

		mksnpath(path, sizeof(path), *p, len, str);
509 510
		ref = resolve_ref_unsafe(path, RESOLVE_REF_READING,
					 hash, NULL);
511 512
		if (!ref)
			continue;
513
		if (reflog_exists(path))
514
			it = path;
515
		else if (strcmp(ref, path) && reflog_exists(ref))
516 517 518 519 520 521 522
			it = ref;
		else
			continue;
		if (!logs_found++) {
			*log = xstrdup(it);
			hashcpy(sha1, hash);
		}
523 524
		if (!warn_ambiguous_refs)
			break;
J
Junio C Hamano 已提交
525
	}
526 527
	free(last_branch);
	return logs_found;
528 529
}

D
David Turner 已提交
530 531
static int is_per_worktree_ref(const char *refname)
{
532 533
	return !strcmp(refname, "HEAD") ||
		starts_with(refname, "refs/bisect/");
D
David Turner 已提交
534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556
}

static int is_pseudoref_syntax(const char *refname)
{
	const char *c;

	for (c = refname; *c; c++) {
		if (!isupper(*c) && *c != '-' && *c != '_')
			return 0;
	}

	return 1;
}

enum ref_type ref_type(const char *refname)
{
	if (is_per_worktree_ref(refname))
		return REF_TYPE_PER_WORKTREE;
	if (is_pseudoref_syntax(refname))
		return REF_TYPE_PSEUDOREF;
       return REF_TYPE_NORMAL;
}

557 558 559 560 561 562 563 564 565 566 567 568 569 570
static int write_pseudoref(const char *pseudoref, const unsigned char *sha1,
			   const unsigned char *old_sha1, struct strbuf *err)
{
	const char *filename;
	int fd;
	static struct lock_file lock;
	struct strbuf buf = STRBUF_INIT;
	int ret = -1;

	strbuf_addf(&buf, "%s\n", sha1_to_hex(sha1));

	filename = git_path("%s", pseudoref);
	fd = hold_lock_file_for_update(&lock, filename, LOCK_DIE_ON_ERROR);
	if (fd < 0) {
571
		strbuf_addf(err, "could not open '%s' for writing: %s",
572 573 574 575 576 577
			    filename, strerror(errno));
		return -1;
	}

	if (old_sha1) {
		unsigned char actual_old_sha1[20];
578 579 580

		if (read_ref(pseudoref, actual_old_sha1))
			die("could not read ref '%s'", pseudoref);
581
		if (hashcmp(actual_old_sha1, old_sha1)) {
582
			strbuf_addf(err, "unexpected sha1 when writing '%s'", pseudoref);
583 584 585 586 587 588
			rollback_lock_file(&lock);
			goto done;
		}
	}

	if (write_in_full(fd, buf.buf, buf.len) != buf.len) {
589
		strbuf_addf(err, "could not write to '%s'", filename);
590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615
		rollback_lock_file(&lock);
		goto done;
	}

	commit_lock_file(&lock);
	ret = 0;
done:
	strbuf_release(&buf);
	return ret;
}

static int delete_pseudoref(const char *pseudoref, const unsigned char *old_sha1)
{
	static struct lock_file lock;
	const char *filename;

	filename = git_path("%s", pseudoref);

	if (old_sha1 && !is_null_sha1(old_sha1)) {
		int fd;
		unsigned char actual_old_sha1[20];

		fd = hold_lock_file_for_update(&lock, filename,
					       LOCK_DIE_ON_ERROR);
		if (fd < 0)
			die_errno(_("Could not open '%s' for writing"), filename);
616 617
		if (read_ref(pseudoref, actual_old_sha1))
			die("could not read ref '%s'", pseudoref);
618 619 620 621
		if (hashcmp(actual_old_sha1, old_sha1)) {
			warning("Unexpected sha1 when deleting %s", pseudoref);
			rollback_lock_file(&lock);
			return -1;
622
		}
623 624 625 626 627

		unlink(filename);
		rollback_lock_file(&lock);
	} else {
		unlink(filename);
628
	}
629

630
	return 0;
D
Daniel Barkalow 已提交
631
}
632

633 634
int delete_ref(const char *msg, const char *refname,
	       const unsigned char *old_sha1, unsigned int flags)
635
{
636
	struct ref_transaction *transaction;
637
	struct strbuf err = STRBUF_INIT;
638

639
	if (ref_type(refname) == REF_TYPE_PSEUDOREF)
J
Junio C Hamano 已提交
640
		return delete_pseudoref(refname, old_sha1);
641

642 643
	transaction = ref_transaction_begin(&err);
	if (!transaction ||
644
	    ref_transaction_delete(transaction, refname, old_sha1,
645
				   flags, msg, &err) ||
646
	    ref_transaction_commit(transaction, &err)) {
647 648 649
		error("%s", err.buf);
		ref_transaction_free(transaction);
		strbuf_release(&err);
J
Junio C Hamano 已提交
650
		return 1;
651
	}
652 653
	ref_transaction_free(transaction);
	strbuf_release(&err);
654 655
	return 0;
}
656

657
int copy_reflog_msg(char *buf, const char *msg)
658 659 660 661
{
	char *cp = buf;
	char c;
	int wasspace = 1;
662

663 664 665 666 667 668 669 670
	*cp++ = '\t';
	while ((c = *msg++)) {
		if (wasspace && isspace(c))
			continue;
		wasspace = isspace(c);
		if (wasspace)
			c = ' ';
		*cp++ = c;
671
	}
672 673 674 675 676
	while (buf < cp && isspace(cp[-1]))
		cp--;
	*cp++ = '\n';
	return cp - buf;
}
677

678
int should_autocreate_reflog(const char *refname)
679
{
680 681 682 683 684 685 686 687 688
	switch (log_all_ref_updates) {
	case LOG_REFS_ALWAYS:
		return 1;
	case LOG_REFS_NORMAL:
		return starts_with(refname, "refs/heads/") ||
			starts_with(refname, "refs/remotes/") ||
			starts_with(refname, "refs/notes/") ||
			!strcmp(refname, "HEAD");
	default:
689
		return 0;
690
	}
691 692
}

693
int is_branch(const char *refname)
694
{
695
	return !strcmp(refname, "HEAD") || starts_with(refname, "refs/heads/");
696 697
}

698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715
struct read_ref_at_cb {
	const char *refname;
	unsigned long at_time;
	int cnt;
	int reccnt;
	unsigned char *sha1;
	int found_it;

	unsigned char osha1[20];
	unsigned char nsha1[20];
	int tz;
	unsigned long date;
	char **msg;
	unsigned long *cutoff_time;
	int *cutoff_tz;
	int *cutoff_cnt;
};

716
static int read_ref_at_ent(struct object_id *ooid, struct object_id *noid,
717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739
		const char *email, unsigned long timestamp, int tz,
		const char *message, void *cb_data)
{
	struct read_ref_at_cb *cb = cb_data;

	cb->reccnt++;
	cb->tz = tz;
	cb->date = timestamp;

	if (timestamp <= cb->at_time || cb->cnt == 0) {
		if (cb->msg)
			*cb->msg = xstrdup(message);
		if (cb->cutoff_time)
			*cb->cutoff_time = timestamp;
		if (cb->cutoff_tz)
			*cb->cutoff_tz = tz;
		if (cb->cutoff_cnt)
			*cb->cutoff_cnt = cb->reccnt - 1;
		/*
		 * we have not yet updated cb->[n|o]sha1 so they still
		 * hold the values for the previous record.
		 */
		if (!is_null_sha1(cb->osha1)) {
740 741
			hashcpy(cb->sha1, noid->hash);
			if (hashcmp(cb->osha1, noid->hash))
742
				warning("Log for ref %s has gap after %s.",
743
					cb->refname, show_date(cb->date, cb->tz, DATE_MODE(RFC2822)));
744 745
		}
		else if (cb->date == cb->at_time)
746 747
			hashcpy(cb->sha1, noid->hash);
		else if (hashcmp(noid->hash, cb->sha1))
748 749
			warning("Log for ref %s unexpectedly ended on %s.",
				cb->refname, show_date(cb->date, cb->tz,
750
						       DATE_MODE(RFC2822)));
751 752
		hashcpy(cb->osha1, ooid->hash);
		hashcpy(cb->nsha1, noid->hash);
753 754 755
		cb->found_it = 1;
		return 1;
	}
756 757
	hashcpy(cb->osha1, ooid->hash);
	hashcpy(cb->nsha1, noid->hash);
758 759 760 761 762
	if (cb->cnt > 0)
		cb->cnt--;
	return 0;
}

763
static int read_ref_at_ent_oldest(struct object_id *ooid, struct object_id *noid,
764 765 766 767 768 769 770 771 772 773 774 775 776
				  const char *email, unsigned long timestamp,
				  int tz, const char *message, void *cb_data)
{
	struct read_ref_at_cb *cb = cb_data;

	if (cb->msg)
		*cb->msg = xstrdup(message);
	if (cb->cutoff_time)
		*cb->cutoff_time = timestamp;
	if (cb->cutoff_tz)
		*cb->cutoff_tz = tz;
	if (cb->cutoff_cnt)
		*cb->cutoff_cnt = cb->reccnt;
777
	hashcpy(cb->sha1, ooid->hash);
778
	if (is_null_sha1(cb->sha1))
779
		hashcpy(cb->sha1, noid->hash);
780 781
	/* We just want the first entry */
	return 1;
782 783
}

784
int read_ref_at(const char *refname, unsigned int flags, unsigned long at_time, int cnt,
785 786
		unsigned char *sha1, char **msg,
		unsigned long *cutoff_time, int *cutoff_tz, int *cutoff_cnt)
787
{
788
	struct read_ref_at_cb cb;
789

790 791 792 793 794 795 796 797 798 799 800 801
	memset(&cb, 0, sizeof(cb));
	cb.refname = refname;
	cb.at_time = at_time;
	cb.cnt = cnt;
	cb.msg = msg;
	cb.cutoff_time = cutoff_time;
	cb.cutoff_tz = cutoff_tz;
	cb.cutoff_cnt = cutoff_cnt;
	cb.sha1 = sha1;

	for_each_reflog_ent_reverse(refname, read_ref_at_ent, &cb);

802 803 804 805 806 807
	if (!cb.reccnt) {
		if (flags & GET_SHA1_QUIETLY)
			exit(128);
		else
			die("Log for %s is empty.", refname);
	}
808 809 810 811
	if (cb.found_it)
		return 0;

	for_each_reflog_ent(refname, read_ref_at_ent_oldest, &cb);
812

813
	return 1;
814
}
815

816
struct ref_transaction *ref_transaction_begin(struct strbuf *err)
817
{
818 819
	assert(err);

820 821 822
	return xcalloc(1, sizeof(struct ref_transaction));
}

823
void ref_transaction_free(struct ref_transaction *transaction)
824 825 826
{
	int i;

827 828 829
	if (!transaction)
		return;

830 831
	for (i = 0; i < transaction->nr; i++) {
		free(transaction->updates[i]->msg);
832
		free(transaction->updates[i]);
833
	}
834 835 836 837
	free(transaction->updates);
	free(transaction);
}

838 839 840 841 842 843
struct ref_update *ref_transaction_add_update(
		struct ref_transaction *transaction,
		const char *refname, unsigned int flags,
		const unsigned char *new_sha1,
		const unsigned char *old_sha1,
		const char *msg)
844
{
845
	struct ref_update *update;
846 847 848 849 850 851 852

	if (transaction->state != REF_TRANSACTION_OPEN)
		die("BUG: update called for transaction that is not open");

	if ((flags & REF_ISPRUNING) && !(flags & REF_NODEREF))
		die("BUG: REF_ISPRUNING set without REF_NODEREF");

853
	FLEX_ALLOC_STR(update, refname, refname);
854 855
	ALLOC_GROW(transaction->updates, transaction->nr + 1, transaction->alloc);
	transaction->updates[transaction->nr++] = update;
856 857 858 859 860 861 862

	update->flags = flags;

	if (flags & REF_HAVE_NEW)
		hashcpy(update->new_sha1, new_sha1);
	if (flags & REF_HAVE_OLD)
		hashcpy(update->old_sha1, old_sha1);
863
	update->msg = xstrdup_or_null(msg);
864 865 866
	return update;
}

867 868 869 870
int ref_transaction_update(struct ref_transaction *transaction,
			   const char *refname,
			   const unsigned char *new_sha1,
			   const unsigned char *old_sha1,
871
			   unsigned int flags, const char *msg,
872
			   struct strbuf *err)
873
{
874 875
	assert(err);

876 877 878
	if ((new_sha1 && !is_null_sha1(new_sha1)) ?
	    check_refname_format(refname, REFNAME_ALLOW_ONELEVEL) :
	    !refname_is_safe(refname)) {
879
		strbuf_addf(err, "refusing to update ref with bad name '%s'",
880 881 882 883
			    refname);
		return -1;
	}

884 885 886 887
	flags |= (new_sha1 ? REF_HAVE_NEW : 0) | (old_sha1 ? REF_HAVE_OLD : 0);

	ref_transaction_add_update(transaction, refname, flags,
				   new_sha1, old_sha1, msg);
888
	return 0;
889 890
}

891 892 893
int ref_transaction_create(struct ref_transaction *transaction,
			   const char *refname,
			   const unsigned char *new_sha1,
894
			   unsigned int flags, const char *msg,
895
			   struct strbuf *err)
896
{
897 898
	if (!new_sha1 || is_null_sha1(new_sha1))
		die("BUG: create called without valid new_sha1");
899
	return ref_transaction_update(transaction, refname, new_sha1,
900
				      null_sha1, flags, msg, err);
901 902
}

903 904 905
int ref_transaction_delete(struct ref_transaction *transaction,
			   const char *refname,
			   const unsigned char *old_sha1,
906
			   unsigned int flags, const char *msg,
907
			   struct strbuf *err)
908
{
909 910
	if (old_sha1 && is_null_sha1(old_sha1))
		die("BUG: delete called with old_sha1 set to zeros");
911
	return ref_transaction_update(transaction, refname,
912
				      null_sha1, old_sha1,
913
				      flags, msg, err);
914 915
}

916 917 918 919 920 921 922 923 924 925 926 927 928
int ref_transaction_verify(struct ref_transaction *transaction,
			   const char *refname,
			   const unsigned char *old_sha1,
			   unsigned int flags,
			   struct strbuf *err)
{
	if (!old_sha1)
		die("BUG: verify called with old_sha1 set to NULL");
	return ref_transaction_update(transaction, refname,
				      NULL, old_sha1,
				      flags, NULL, err);
}

929 930 931 932 933 934 935 936
int update_ref_oid(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)
{
	return update_ref(msg, refname, new_oid ? new_oid->hash : NULL,
		old_oid ? old_oid->hash : NULL, flags, onerr);
}

937 938
int update_ref(const char *msg, const char *refname,
	       const unsigned char *new_sha1, const unsigned char *old_sha1,
939
	       unsigned int flags, enum action_on_err onerr)
940
{
941
	struct ref_transaction *t = NULL;
942
	struct strbuf err = STRBUF_INIT;
943
	int ret = 0;
944

945 946 947 948 949 950 951 952 953 954 955 956 957
	if (ref_type(refname) == REF_TYPE_PSEUDOREF) {
		ret = write_pseudoref(refname, new_sha1, old_sha1, &err);
	} else {
		t = ref_transaction_begin(&err);
		if (!t ||
		    ref_transaction_update(t, refname, new_sha1, old_sha1,
					   flags, msg, &err) ||
		    ref_transaction_commit(t, &err)) {
			ret = 1;
			ref_transaction_free(t);
		}
	}
	if (ret) {
958 959 960 961 962 963 964 965 966 967 968 969 970
		const char *str = "update_ref failed for ref '%s': %s";

		switch (onerr) {
		case UPDATE_REFS_MSG_ON_ERR:
			error(str, refname, err.buf);
			break;
		case UPDATE_REFS_DIE_ON_ERR:
			die(str, refname, err.buf);
			break;
		case UPDATE_REFS_QUIET_ON_ERR:
			break;
		}
		strbuf_release(&err);
971
		return 1;
972 973
	}
	strbuf_release(&err);
974 975
	if (t)
		ref_transaction_free(t);
976
	return 0;
977 978
}

979
char *shorten_unambiguous_ref(const char *refname, int strict)
J
Jeff King 已提交
980 981 982 983 984 985 986
{
	int i;
	static char **scanf_fmts;
	static int nr_rules;
	char *short_name;

	if (!nr_rules) {
987 988 989 990 991 992
		/*
		 * Pre-generate scanf formats from ref_rev_parse_rules[].
		 * Generate a format suitable for scanf from a
		 * ref_rev_parse_rules rule by interpolating "%s" at the
		 * location of the "%.*s".
		 */
J
Jeff King 已提交
993
		size_t total_len = 0;
994
		size_t offset = 0;
J
Jeff King 已提交
995 996

		/* the rule list is NULL terminated, count them first */
J
Jeff King 已提交
997
		for (nr_rules = 0; ref_rev_parse_rules[nr_rules]; nr_rules++)
998 999
			/* -2 for strlen("%.*s") - strlen("%s"); +1 for NUL */
			total_len += strlen(ref_rev_parse_rules[nr_rules]) - 2 + 1;
J
Jeff King 已提交
1000

1001
		scanf_fmts = xmalloc(st_add(st_mult(sizeof(char *), nr_rules), total_len));
J
Jeff King 已提交
1002

1003
		offset = 0;
J
Jeff King 已提交
1004
		for (i = 0; i < nr_rules; i++) {
1005
			assert(offset < total_len);
1006
			scanf_fmts[i] = (char *)&scanf_fmts[nr_rules] + offset;
1007 1008
			offset += snprintf(scanf_fmts[i], total_len - offset,
					   ref_rev_parse_rules[i], 2, "%s") + 1;
J
Jeff King 已提交
1009 1010 1011 1012 1013
		}
	}

	/* bail out if there are no rules */
	if (!nr_rules)
1014
		return xstrdup(refname);
J
Jeff King 已提交
1015

1016 1017
	/* buffer for scanf result, at most refname must fit */
	short_name = xstrdup(refname);
J
Jeff King 已提交
1018 1019 1020 1021

	/* skip first rule, it will always match */
	for (i = nr_rules - 1; i > 0 ; --i) {
		int j;
1022
		int rules_to_fail = i;
J
Jeff King 已提交
1023 1024
		int short_name_len;

1025
		if (1 != sscanf(refname, scanf_fmts[i], short_name))
J
Jeff King 已提交
1026 1027 1028 1029
			continue;

		short_name_len = strlen(short_name);

1030 1031 1032 1033 1034 1035 1036
		/*
		 * in strict mode, all (except the matched one) rules
		 * must fail to resolve to a valid non-ambiguous ref
		 */
		if (strict)
			rules_to_fail = nr_rules;

J
Jeff King 已提交
1037 1038 1039 1040
		/*
		 * check if the short name resolves to a valid ref,
		 * but use only rules prior to the matched one
		 */
1041
		for (j = 0; j < rules_to_fail; j++) {
J
Jeff King 已提交
1042 1043 1044
			const char *rule = ref_rev_parse_rules[j];
			char refname[PATH_MAX];

1045 1046 1047 1048
			/* skip matched rule */
			if (i == j)
				continue;

J
Jeff King 已提交
1049 1050 1051 1052 1053 1054 1055
			/*
			 * the short name is ambiguous, if it resolves
			 * (with this previous rule) to a valid ref
			 * read_ref() returns 0 on success
			 */
			mksnpath(refname, sizeof(refname),
				 rule, short_name_len, short_name);
1056
			if (ref_exists(refname))
J
Jeff King 已提交
1057 1058 1059 1060 1061 1062 1063
				break;
		}

		/*
		 * short name is non-ambiguous if all previous rules
		 * haven't resolved to a valid ref
		 */
1064
		if (j == rules_to_fail)
J
Jeff King 已提交
1065 1066 1067 1068
			return short_name;
	}

	free(short_name);
1069
	return xstrdup(refname);
J
Jeff King 已提交
1070
}
1071 1072 1073 1074 1075

static struct string_list *hide_refs;

int parse_hide_refs_config(const char *var, const char *value, const char *section)
{
1076
	const char *key;
1077
	if (!strcmp("transfer.hiderefs", var) ||
1078 1079
	    (!parse_config_key(var, section, NULL, NULL, &key) &&
	     !strcmp(key, "hiderefs"))) {
1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097
		char *ref;
		int len;

		if (!value)
			return config_error_nonbool(var);
		ref = xstrdup(value);
		len = strlen(ref);
		while (len && ref[len - 1] == '/')
			ref[--len] = '\0';
		if (!hide_refs) {
			hide_refs = xcalloc(1, sizeof(*hide_refs));
			hide_refs->strdup_strings = 1;
		}
		string_list_append(hide_refs, ref);
	}
	return 0;
}

1098
int ref_is_hidden(const char *refname, const char *refname_full)
1099
{
1100
	int i;
1101 1102 1103

	if (!hide_refs)
		return 0;
1104 1105
	for (i = hide_refs->nr - 1; i >= 0; i--) {
		const char *match = hide_refs->items[i].string;
1106
		const char *subject;
1107
		int neg = 0;
1108
		int len;
1109 1110 1111 1112 1113 1114

		if (*match == '!') {
			neg = 1;
			match++;
		}

1115 1116 1117 1118 1119 1120 1121 1122 1123
		if (*match == '^') {
			subject = refname_full;
			match++;
		} else {
			subject = refname;
		}

		/* refname can be NULL when namespaces are used. */
		if (!subject || !starts_with(subject, match))
1124
			continue;
1125
		len = strlen(match);
1126
		if (!subject[len] || subject[len] == '/')
1127
			return !neg;
1128 1129 1130
	}
	return 0;
}
1131

D
David Turner 已提交
1132 1133 1134
const char *find_descendant_ref(const char *dirname,
				const struct string_list *extras,
				const struct string_list *skip)
1135
{
D
David Turner 已提交
1136
	int pos;
1137

D
David Turner 已提交
1138 1139
	if (!extras)
		return NULL;
1140 1141

	/*
D
David Turner 已提交
1142 1143 1144 1145
	 * Look at the place where dirname would be inserted into
	 * extras. If there is an entry at that position that starts
	 * with dirname (remember, dirname includes the trailing
	 * slash) and is not in skip, then we have a conflict.
1146
	 */
D
David Turner 已提交
1147 1148 1149
	for (pos = string_list_find_insert_index(extras, dirname, 0);
	     pos < extras->nr; pos++) {
		const char *extra_refname = extras->items[pos].string;
1150

D
David Turner 已提交
1151 1152 1153 1154 1155
		if (!starts_with(extra_refname, dirname))
			break;

		if (!skip || !string_list_has_string(skip, extra_refname))
			return extra_refname;
1156
	}
D
David Turner 已提交
1157 1158
	return NULL;
}
1159

1160 1161 1162
int refs_rename_ref_available(struct ref_store *refs,
			      const char *old_refname,
			      const char *new_refname)
D
David Turner 已提交
1163 1164 1165
{
	struct string_list skip = STRING_LIST_INIT_NODUP;
	struct strbuf err = STRBUF_INIT;
1166
	int ok;
1167

1168
	string_list_insert(&skip, old_refname);
1169 1170
	ok = !refs_verify_refname_available(refs, new_refname,
					    NULL, &skip, &err);
1171
	if (!ok)
D
David Turner 已提交
1172 1173 1174 1175
		error("%s", err.buf);

	string_list_clear(&skip, 0);
	strbuf_release(&err);
1176
	return ok;
1177
}
1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200

int head_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data)
{
	struct object_id oid;
	int flag;

	if (submodule) {
		if (resolve_gitlink_ref(submodule, "HEAD", oid.hash) == 0)
			return fn("HEAD", &oid, 0, cb_data);

		return 0;
	}

	if (!read_ref_full("HEAD", RESOLVE_REF_READING, oid.hash, &flag))
		return fn("HEAD", &oid, flag, cb_data);

	return 0;
}

int head_ref(each_ref_fn fn, void *cb_data)
{
	return head_ref_submodule(NULL, fn, cb_data);
}
1201

1202 1203 1204 1205 1206 1207 1208 1209 1210
/*
 * Call fn for each reference in the specified submodule for which the
 * refname begins with prefix. If trim is non-zero, then trim that
 * many characters off the beginning of each refname before passing
 * the refname to fn. flags can be DO_FOR_EACH_INCLUDE_BROKEN to
 * include broken references in the iteration. If fn ever returns a
 * non-zero value, stop the iteration and return that value;
 * otherwise, return 0.
 */
1211
static int do_for_each_ref(struct ref_store *refs, const char *prefix,
1212 1213 1214 1215
			   each_ref_fn fn, int trim, int flags, void *cb_data)
{
	struct ref_iterator *iter;

1216 1217 1218
	if (!refs)
		return 0;

1219
	iter = refs->be->iterator_begin(refs, prefix, flags);
1220 1221 1222 1223 1224
	iter = prefix_ref_iterator_begin(iter, prefix, trim);

	return do_for_each_ref_iterator(iter, fn, cb_data);
}

1225 1226 1227 1228 1229
int refs_for_each_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
{
	return do_for_each_ref(refs, "", fn, 0, 0, cb_data);
}

1230 1231
int for_each_ref(each_ref_fn fn, void *cb_data)
{
1232
	return refs_for_each_ref(get_main_ref_store(), fn, cb_data);
1233 1234 1235 1236
}

int for_each_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data)
{
1237 1238 1239 1240 1241 1242 1243
	return refs_for_each_ref(get_submodule_ref_store(submodule), fn, cb_data);
}

int refs_for_each_ref_in(struct ref_store *refs, const char *prefix,
			 each_ref_fn fn, void *cb_data)
{
	return do_for_each_ref(refs, prefix, fn, strlen(prefix), 0, cb_data);
1244 1245 1246 1247
}

int for_each_ref_in(const char *prefix, each_ref_fn fn, void *cb_data)
{
1248
	return refs_for_each_ref_in(get_main_ref_store(), prefix, fn, cb_data);
1249 1250 1251 1252 1253 1254 1255 1256
}

int for_each_fullref_in(const char *prefix, each_ref_fn fn, void *cb_data, unsigned int broken)
{
	unsigned int flag = 0;

	if (broken)
		flag = DO_FOR_EACH_INCLUDE_BROKEN;
1257 1258
	return do_for_each_ref(get_main_ref_store(),
			       prefix, fn, 0, flag, cb_data);
1259 1260 1261
}

int for_each_ref_in_submodule(const char *submodule, const char *prefix,
1262
			      each_ref_fn fn, void *cb_data)
1263
{
1264 1265
	return refs_for_each_ref_in(get_submodule_ref_store(submodule),
				    prefix, fn, cb_data);
1266 1267 1268 1269
}

int for_each_replace_ref(each_ref_fn fn, void *cb_data)
{
1270 1271 1272 1273
	return do_for_each_ref(get_main_ref_store(),
			       git_replace_ref_base, fn,
			       strlen(git_replace_ref_base),
			       0, cb_data);
1274 1275 1276 1277 1278 1279 1280
}

int for_each_namespaced_ref(each_ref_fn fn, void *cb_data)
{
	struct strbuf buf = STRBUF_INIT;
	int ret;
	strbuf_addf(&buf, "%srefs/", get_git_namespace());
1281 1282
	ret = do_for_each_ref(get_main_ref_store(),
			      buf.buf, fn, 0, 0, cb_data);
1283 1284 1285 1286
	strbuf_release(&buf);
	return ret;
}

1287
int refs_for_each_rawref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
1288
{
1289
	return do_for_each_ref(refs, "", fn, 0,
1290 1291
			       DO_FOR_EACH_INCLUDE_BROKEN, cb_data);
}
1292

1293 1294 1295 1296 1297
int for_each_rawref(each_ref_fn fn, void *cb_data)
{
	return refs_for_each_rawref(get_main_ref_store(), fn, cb_data);
}

1298
/* This function needs to return a meaningful errno on failure */
1299
const char *refs_resolve_ref_unsafe(struct ref_store *refs,
1300 1301 1302
				    const char *refname,
				    int resolve_flags,
				    unsigned char *sha1, int *flags)
1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333
{
	static struct strbuf sb_refname = STRBUF_INIT;
	int unused_flags;
	int symref_count;

	if (!flags)
		flags = &unused_flags;

	*flags = 0;

	if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
		if (!(resolve_flags & RESOLVE_REF_ALLOW_BAD_NAME) ||
		    !refname_is_safe(refname)) {
			errno = EINVAL;
			return NULL;
		}

		/*
		 * dwim_ref() uses REF_ISBROKEN to distinguish between
		 * missing refs and refs that were present but invalid,
		 * to complain about the latter to stderr.
		 *
		 * We don't know whether the ref exists, so don't set
		 * REF_ISBROKEN yet.
		 */
		*flags |= REF_BAD_NAME;
	}

	for (symref_count = 0; symref_count < SYMREF_MAXDEPTH; symref_count++) {
		unsigned int read_flags = 0;

1334 1335
		if (refs->be->read_raw_ref(refs, refname,
					   sha1, &sb_refname, &read_flags)) {
1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373
			*flags |= read_flags;
			if (errno != ENOENT || (resolve_flags & RESOLVE_REF_READING))
				return NULL;
			hashclr(sha1);
			if (*flags & REF_BAD_NAME)
				*flags |= REF_ISBROKEN;
			return refname;
		}

		*flags |= read_flags;

		if (!(read_flags & REF_ISSYMREF)) {
			if (*flags & REF_BAD_NAME) {
				hashclr(sha1);
				*flags |= REF_ISBROKEN;
			}
			return refname;
		}

		refname = sb_refname.buf;
		if (resolve_flags & RESOLVE_REF_NO_RECURSE) {
			hashclr(sha1);
			return refname;
		}
		if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
			if (!(resolve_flags & RESOLVE_REF_ALLOW_BAD_NAME) ||
			    !refname_is_safe(refname)) {
				errno = EINVAL;
				return NULL;
			}

			*flags |= REF_ISBROKEN | REF_BAD_NAME;
		}
	}

	errno = ELOOP;
	return NULL;
}
1374

D
David Turner 已提交
1375 1376 1377
/* backend functions */
int refs_init_db(struct strbuf *err)
{
1378
	struct ref_store *refs = get_main_ref_store();
D
David Turner 已提交
1379 1380 1381 1382

	return refs->be->init_db(refs, err);
}

1383 1384 1385
const char *resolve_ref_unsafe(const char *refname, int resolve_flags,
			       unsigned char *sha1, int *flags)
{
1386
	return refs_resolve_ref_unsafe(get_main_ref_store(), refname,
1387 1388 1389
				       resolve_flags, sha1, flags);
}

1390 1391
int resolve_gitlink_ref(const char *submodule, const char *refname,
			unsigned char *sha1)
1392
{
1393
	size_t len = strlen(submodule);
1394 1395 1396
	struct ref_store *refs;
	int flags;

1397
	while (len && submodule[len - 1] == '/')
1398
		len--;
1399

1400 1401 1402
	if (!len)
		return -1;

1403
	if (submodule[len]) {
1404
		/* We need to strip off one or more trailing slashes */
1405
		char *stripped = xmemdupz(submodule, len);
1406

1407
		refs = get_submodule_ref_store(stripped);
1408 1409
		free(stripped);
	} else {
1410
		refs = get_submodule_ref_store(submodule);
1411 1412
	}

1413 1414 1415
	if (!refs)
		return -1;

1416
	if (!refs_resolve_ref_unsafe(refs, refname, 0, sha1, &flags) ||
1417 1418 1419 1420 1421
	    is_null_sha1(sha1))
		return -1;
	return 0;
}

1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451
struct submodule_hash_entry
{
	struct hashmap_entry ent; /* must be the first member! */

	struct ref_store *refs;

	/* NUL-terminated name of submodule: */
	char submodule[FLEX_ARRAY];
};

static int submodule_hash_cmp(const void *entry, const void *entry_or_key,
			      const void *keydata)
{
	const struct submodule_hash_entry *e1 = entry, *e2 = entry_or_key;
	const char *submodule = keydata ? keydata : e2->submodule;

	return strcmp(e1->submodule, submodule);
}

static struct submodule_hash_entry *alloc_submodule_hash_entry(
		const char *submodule, struct ref_store *refs)
{
	struct submodule_hash_entry *entry;

	FLEX_ALLOC_STR(entry, submodule, submodule);
	hashmap_entry_init(entry, strhash(submodule));
	entry->refs = refs;
	return entry;
}

1452 1453 1454
/* A pointer to the ref_store for the main repository: */
static struct ref_store *main_ref_store;

1455 1456
/* A hashmap of ref_stores, stored by submodule name: */
static struct hashmap submodule_ref_stores;
1457

1458
/*
1459 1460
 * Return the ref_store instance for the specified submodule. If that
 * ref_store hasn't been initialized yet, return NULL.
1461
 */
1462
static struct ref_store *lookup_submodule_ref_store(const char *submodule)
1463
{
1464
	struct submodule_hash_entry *entry;
1465

1466 1467 1468
	if (!submodule_ref_stores.tablesize)
		/* It's initialized on demand in register_ref_store(). */
		return NULL;
1469

1470 1471 1472
	entry = hashmap_get_from_hash(&submodule_ref_stores,
				      strhash(submodule), submodule);
	return entry ? entry->refs : NULL;
1473 1474
}

1475 1476
/*
 * Create, record, and return a ref_store instance for the specified
1477
 * gitdir.
1478
 */
1479 1480
static struct ref_store *ref_store_init(const char *gitdir,
					unsigned int flags)
1481 1482 1483
{
	const char *be_name = "files";
	struct ref_storage_be *be = find_ref_storage_backend(be_name);
1484
	struct ref_store *refs;
1485 1486 1487 1488

	if (!be)
		die("BUG: reference backend %s is unknown", be_name);

1489
	refs = be->init(gitdir, flags);
1490
	return refs;
1491 1492
}

1493
struct ref_store *get_main_ref_store(void)
1494 1495 1496 1497
{
	if (main_ref_store)
		return main_ref_store;

1498 1499 1500 1501 1502
	main_ref_store = ref_store_init(get_git_dir(),
					(REF_STORE_READ |
					 REF_STORE_WRITE |
					 REF_STORE_ODB |
					 REF_STORE_MAIN));
1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520
	return main_ref_store;
}

/*
 * Register the specified ref_store to be the one that should be used
 * for submodule. It is a fatal error to call this function twice for
 * the same submodule.
 */
static void register_submodule_ref_store(struct ref_store *refs,
					 const char *submodule)
{
	if (!submodule_ref_stores.tablesize)
		hashmap_init(&submodule_ref_stores, submodule_hash_cmp, 0);

	if (hashmap_put(&submodule_ref_stores,
			alloc_submodule_hash_entry(submodule, refs)))
		die("BUG: ref_store for submodule '%s' initialized twice",
		    submodule);
1521 1522
}

1523
struct ref_store *get_submodule_ref_store(const char *submodule)
1524
{
1525
	struct strbuf submodule_sb = STRBUF_INIT;
1526
	struct ref_store *refs;
1527
	int ret;
1528 1529

	if (!submodule || !*submodule) {
1530 1531 1532 1533
		/*
		 * FIXME: This case is ideally not allowed. But that
		 * can't happen until we clean up all the callers.
		 */
1534
		return get_main_ref_store();
1535
	}
1536

1537 1538 1539
	refs = lookup_submodule_ref_store(submodule);
	if (refs)
		return refs;
1540

1541 1542 1543 1544 1545 1546
	strbuf_addstr(&submodule_sb, submodule);
	ret = is_nonbare_repository_dir(&submodule_sb);
	strbuf_release(&submodule_sb);
	if (!ret)
		return NULL;

1547 1548 1549 1550 1551 1552
	ret = submodule_to_gitdir(&submodule_sb, submodule);
	if (ret) {
		strbuf_release(&submodule_sb);
		return NULL;
	}

1553 1554 1555
	/* assume that add_submodule_odb() has been called */
	refs = ref_store_init(submodule_sb.buf,
			      REF_STORE_READ | REF_STORE_ODB);
1556
	register_submodule_ref_store(refs, submodule);
1557 1558

	strbuf_release(&submodule_sb);
1559 1560 1561
	return refs;
}

1562
void base_ref_store_init(struct ref_store *refs,
1563
			 const struct ref_storage_be *be)
1564
{
1565
	refs->be = be;
1566
}
1567 1568

/* backend functions */
1569 1570 1571 1572 1573
int refs_pack_refs(struct ref_store *refs, unsigned int flags)
{
	return refs->be->pack_refs(refs, flags);
}

1574 1575
int pack_refs(unsigned int flags)
{
1576 1577
	return refs_pack_refs(get_main_ref_store(), flags);
}
1578

1579 1580 1581 1582
int refs_peel_ref(struct ref_store *refs, const char *refname,
		  unsigned char *sha1)
{
	return refs->be->peel_ref(refs, refname, sha1);
1583 1584
}

M
Michael Haggerty 已提交
1585 1586
int peel_ref(const char *refname, unsigned char *sha1)
{
1587 1588
	return refs_peel_ref(get_main_ref_store(), refname, sha1);
}
M
Michael Haggerty 已提交
1589

1590 1591 1592 1593 1594 1595 1596 1597
int refs_create_symref(struct ref_store *refs,
		       const char *ref_target,
		       const char *refs_heads_master,
		       const char *logmsg)
{
	return refs->be->create_symref(refs, ref_target,
				       refs_heads_master,
				       logmsg);
M
Michael Haggerty 已提交
1598 1599
}

1600 1601 1602
int create_symref(const char *ref_target, const char *refs_heads_master,
		  const char *logmsg)
{
1603 1604
	return refs_create_symref(get_main_ref_store(), ref_target,
				  refs_heads_master, logmsg);
1605 1606
}

1607 1608 1609
int ref_transaction_commit(struct ref_transaction *transaction,
			   struct strbuf *err)
{
1610
	struct ref_store *refs = get_main_ref_store();
1611 1612 1613

	return refs->be->transaction_commit(refs, transaction, err);
}
1614

1615 1616 1617 1618 1619
int refs_verify_refname_available(struct ref_store *refs,
				  const char *refname,
				  const struct string_list *extra,
				  const struct string_list *skip,
				  struct strbuf *err)
1620 1621 1622
{
	return refs->be->verify_refname_available(refs, refname, extra, skip, err);
}
D
David Turner 已提交
1623

1624
int refs_for_each_reflog(struct ref_store *refs, each_ref_fn fn, void *cb_data)
D
David Turner 已提交
1625 1626 1627 1628 1629 1630 1631 1632
{
	struct ref_iterator *iter;

	iter = refs->be->reflog_iterator_begin(refs);

	return do_for_each_ref_iterator(iter, fn, cb_data);
}

1633
int for_each_reflog(each_ref_fn fn, void *cb_data)
D
David Turner 已提交
1634
{
1635 1636
	return refs_for_each_reflog(get_main_ref_store(), fn, cb_data);
}
D
David Turner 已提交
1637

1638 1639 1640 1641 1642
int refs_for_each_reflog_ent_reverse(struct ref_store *refs,
				     const char *refname,
				     each_reflog_ent_fn fn,
				     void *cb_data)
{
D
David Turner 已提交
1643 1644 1645 1646
	return refs->be->for_each_reflog_ent_reverse(refs, refname,
						     fn, cb_data);
}

1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659
int for_each_reflog_ent_reverse(const char *refname, each_reflog_ent_fn fn,
				void *cb_data)
{
	return refs_for_each_reflog_ent_reverse(get_main_ref_store(),
						refname, fn, cb_data);
}

int refs_for_each_reflog_ent(struct ref_store *refs, const char *refname,
			     each_reflog_ent_fn fn, void *cb_data)
{
	return refs->be->for_each_reflog_ent(refs, refname, fn, cb_data);
}

D
David Turner 已提交
1660 1661 1662
int for_each_reflog_ent(const char *refname, each_reflog_ent_fn fn,
			void *cb_data)
{
1663 1664 1665
	return refs_for_each_reflog_ent(get_main_ref_store(), refname,
					fn, cb_data);
}
D
David Turner 已提交
1666

1667 1668 1669
int refs_reflog_exists(struct ref_store *refs, const char *refname)
{
	return refs->be->reflog_exists(refs, refname);
D
David Turner 已提交
1670 1671 1672 1673
}

int reflog_exists(const char *refname)
{
1674 1675
	return refs_reflog_exists(get_main_ref_store(), refname);
}
D
David Turner 已提交
1676

1677 1678 1679 1680
int refs_create_reflog(struct ref_store *refs, const char *refname,
		       int force_create, struct strbuf *err)
{
	return refs->be->create_reflog(refs, refname, force_create, err);
D
David Turner 已提交
1681 1682 1683 1684 1685
}

int safe_create_reflog(const char *refname, int force_create,
		       struct strbuf *err)
{
1686 1687 1688
	return refs_create_reflog(get_main_ref_store(), refname,
				  force_create, err);
}
D
David Turner 已提交
1689

1690 1691 1692
int refs_delete_reflog(struct ref_store *refs, const char *refname)
{
	return refs->be->delete_reflog(refs, refname);
D
David Turner 已提交
1693 1694 1695 1696
}

int delete_reflog(const char *refname)
{
1697 1698
	return refs_delete_reflog(get_main_ref_store(), refname);
}
D
David Turner 已提交
1699

1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710
int refs_reflog_expire(struct ref_store *refs,
		       const char *refname, const unsigned char *sha1,
		       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)
{
	return refs->be->reflog_expire(refs, refname, sha1, flags,
				       prepare_fn, should_prune_fn,
				       cleanup_fn, policy_cb_data);
D
David Turner 已提交
1711 1712 1713 1714 1715 1716 1717 1718 1719
}

int reflog_expire(const char *refname, const unsigned char *sha1,
		  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)
{
1720 1721 1722 1723
	return refs_reflog_expire(get_main_ref_store(),
				  refname, sha1, flags,
				  prepare_fn, should_prune_fn,
				  cleanup_fn, policy_cb_data);
D
David Turner 已提交
1724
}
1725 1726 1727 1728

int initial_ref_transaction_commit(struct ref_transaction *transaction,
				   struct strbuf *err)
{
1729
	struct ref_store *refs = get_main_ref_store();
1730 1731 1732

	return refs->be->initial_transaction_commit(refs, transaction, err);
}
D
David Turner 已提交
1733

1734 1735
int refs_delete_refs(struct ref_store *refs, struct string_list *refnames,
		     unsigned int flags)
D
David Turner 已提交
1736 1737 1738
{
	return refs->be->delete_refs(refs, refnames, flags);
}
D
David Turner 已提交
1739

1740
int delete_refs(struct string_list *refnames, unsigned int flags)
D
David Turner 已提交
1741
{
1742 1743
	return refs_delete_refs(get_main_ref_store(), refnames, flags);
}
D
David Turner 已提交
1744

1745 1746 1747
int refs_rename_ref(struct ref_store *refs, const char *oldref,
		    const char *newref, const char *logmsg)
{
D
David Turner 已提交
1748 1749
	return refs->be->rename_ref(refs, oldref, newref, logmsg);
}
1750 1751 1752 1753 1754

int rename_ref(const char *oldref, const char *newref, const char *logmsg)
{
	return refs_rename_ref(get_main_ref_store(), oldref, newref, logmsg);
}