sha1_name.c 39.6 KB
Newer Older
1
#include "cache.h"
J
Junio C Hamano 已提交
2
#include "tag.h"
3
#include "commit.h"
J
Junio C Hamano 已提交
4 5
#include "tree.h"
#include "blob.h"
6
#include "tree-walk.h"
7
#include "refs.h"
8
#include "remote.h"
9
#include "dir.h"
10
#include "sha1-array.h"
11

12 13
static int get_sha1_oneline(const char *, unsigned char *, struct commit_list *);

14 15 16
typedef int (*disambiguate_hint_fn)(const unsigned char *, void *);

struct disambiguate_state {
17
	int len; /* length of prefix in hex chars */
18
	char hex_pfx[GIT_SHA1_HEXSZ + 1];
19 20
	unsigned char bin_pfx[GIT_SHA1_RAWSZ];

21 22
	disambiguate_hint_fn fn;
	void *cb_data;
23
	unsigned char candidate[GIT_SHA1_RAWSZ];
24 25 26 27 28
	unsigned candidate_exists:1;
	unsigned candidate_checked:1;
	unsigned candidate_ok:1;
	unsigned disambiguate_fn_used:1;
	unsigned ambiguous:1;
29
	unsigned always_call_fn:1;
30 31 32 33
};

static void update_candidates(struct disambiguate_state *ds, const unsigned char *current)
{
34 35 36 37
	if (ds->always_call_fn) {
		ds->ambiguous = ds->fn(current, ds->cb_data) ? 1 : 0;
		return;
	}
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
	if (!ds->candidate_exists) {
		/* this is the first candidate */
		hashcpy(ds->candidate, current);
		ds->candidate_exists = 1;
		return;
	} else if (!hashcmp(ds->candidate, current)) {
		/* the same as what we already have seen */
		return;
	}

	if (!ds->fn) {
		/* cannot disambiguate between ds->candidate and current */
		ds->ambiguous = 1;
		return;
	}

	if (!ds->candidate_checked) {
		ds->candidate_ok = ds->fn(ds->candidate, ds->cb_data);
		ds->disambiguate_fn_used = 1;
		ds->candidate_checked = 1;
	}

	if (!ds->candidate_ok) {
O
Ondřej Bílka 已提交
61
		/* discard the candidate; we know it does not satisfy fn */
62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
		hashcpy(ds->candidate, current);
		ds->candidate_checked = 0;
		return;
	}

	/* if we reach this point, we know ds->candidate satisfies fn */
	if (ds->fn(current, ds->cb_data)) {
		/*
		 * if both current and candidate satisfy fn, we cannot
		 * disambiguate.
		 */
		ds->candidate_ok = 0;
		ds->ambiguous = 1;
	}

	/* otherwise, current can be discarded and candidate is still good */
}

80
static void find_short_object_filename(struct disambiguate_state *ds)
81
{
82
	struct alternate_object_database *alt;
83
	char hex[GIT_SHA1_HEXSZ];
84 85 86
	static struct alternate_object_database *fakeent;

	if (!fakeent) {
87 88 89 90 91 92 93
		/*
		 * Create a "fake" alternate object database that
		 * points to our own object database, to make it
		 * easier to get a temporary working space in
		 * alt->name/alt->base while iterating over the
		 * object databases including our own.
		 */
94
		fakeent = alloc_alt_odb(get_object_directory());
95 96
	}
	fakeent->next = alt_odb_list;
97

98
	xsnprintf(hex, sizeof(hex), "%.2s", ds->hex_pfx);
99
	for (alt = fakeent; alt && !ds->ambiguous; alt = alt->next) {
100
		struct strbuf *buf = alt_scratch_buf(alt);
101
		struct dirent *de;
102
		DIR *dir;
103

J
Junio C Hamano 已提交
104
		strbuf_addf(buf, "%.2s/", ds->hex_pfx);
105
		dir = opendir(buf->buf);
106 107
		if (!dir)
			continue;
108 109 110 111

		while (!ds->ambiguous && (de = readdir(dir)) != NULL) {
			unsigned char sha1[20];

112 113
			if (strlen(de->d_name) != 38)
				continue;
114
			if (memcmp(de->d_name, ds->hex_pfx + 2, ds->len - 2))
115
				continue;
116 117 118
			memcpy(hex + 2, de->d_name, 38);
			if (!get_sha1_hex(hex, sha1))
				update_candidates(ds, sha1);
119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
		}
		closedir(dir);
	}
}

static int match_sha(unsigned len, const unsigned char *a, const unsigned char *b)
{
	do {
		if (*a != *b)
			return 0;
		a++;
		b++;
		len -= 2;
	} while (len > 1);
	if (len)
		if ((*a ^ *b) & 0xf0)
			return 0;
	return 1;
}

139
static void unique_in_pack(struct packed_git *p,
140
			   struct disambiguate_state *ds)
141
{
142 143 144 145 146 147 148 149 150 151 152 153
	uint32_t num, last, i, first = 0;
	const unsigned char *current = NULL;

	open_pack_index(p);
	num = p->num_objects;
	last = num;
	while (first < last) {
		uint32_t mid = (first + last) / 2;
		const unsigned char *current;
		int cmp;

		current = nth_packed_object_sha1(p, mid);
154
		cmp = hashcmp(ds->bin_pfx, current);
155 156 157
		if (!cmp) {
			first = mid;
			break;
158
		}
159 160 161
		if (cmp > 0) {
			first = mid+1;
			continue;
162
		}
163 164 165 166 167
		last = mid;
	}

	/*
	 * At this point, "first" is the location of the lowest object
168
	 * with an object name that could match "bin_pfx".  See if we have
169 170
	 * 0, 1 or more objects that actually match(es).
	 */
171 172
	for (i = first; i < num && !ds->ambiguous; i++) {
		current = nth_packed_object_sha1(p, i);
173
		if (!match_sha(ds->len, ds->bin_pfx, current))
174
			break;
175
		update_candidates(ds, current);
176
	}
177 178
}

179
static void find_short_packed_object(struct disambiguate_state *ds)
180 181 182 183
{
	struct packed_git *p;

	prepare_packed_git();
184
	for (p = packed_git; p && !ds->ambiguous; p = p->next)
185
		unique_in_pack(p, ds);
186 187
}

188 189 190
#define SHORT_NAME_NOT_FOUND (-1)
#define SHORT_NAME_AMBIGUOUS (-2)

191 192
static int finish_object_disambiguation(struct disambiguate_state *ds,
					unsigned char *sha1)
193
{
194 195
	if (ds->ambiguous)
		return SHORT_NAME_AMBIGUOUS;
196

197
	if (!ds->candidate_exists)
198
		return SHORT_NAME_NOT_FOUND;
199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218

	if (!ds->candidate_checked)
		/*
		 * If this is the only candidate, there is no point
		 * calling the disambiguation hint callback.
		 *
		 * On the other hand, if the current candidate
		 * replaced an earlier candidate that did _not_ pass
		 * the disambiguation hint callback, then we do have
		 * more than one objects that match the short name
		 * given, so we should make sure this one matches;
		 * otherwise, if we discovered this one and the one
		 * that we previously discarded in the reverse order,
		 * we would end up showing different results in the
		 * same repository!
		 */
		ds->candidate_ok = (!ds->disambiguate_fn_used ||
				    ds->fn(ds->candidate, ds->cb_data));

	if (!ds->candidate_ok)
219
		return SHORT_NAME_AMBIGUOUS;
220 221

	hashcpy(sha1, ds->candidate);
222 223 224
	return 0;
}

225 226 227 228 229 230
static int disambiguate_commit_only(const unsigned char *sha1, void *cb_data_unused)
{
	int kind = sha1_object_info(sha1, NULL);
	return kind == OBJ_COMMIT;
}

231 232 233 234 235 236 237 238 239
static int disambiguate_committish_only(const unsigned char *sha1, void *cb_data_unused)
{
	struct object *obj;
	int kind;

	kind = sha1_object_info(sha1, NULL);
	if (kind == OBJ_COMMIT)
		return 1;
	if (kind != OBJ_TAG)
240
		return 0;
241 242

	/* We need to do this the hard way... */
243
	obj = deref_tag(parse_object(sha1), NULL, 0);
244 245
	if (obj && obj->type == OBJ_COMMIT)
		return 1;
246 247 248
	return 0;
}

249
static int disambiguate_tree_only(const unsigned char *sha1, void *cb_data_unused)
250
{
251 252 253
	int kind = sha1_object_info(sha1, NULL);
	return kind == OBJ_TREE;
}
254

255 256 257 258 259 260 261 262 263 264 265 266
static int disambiguate_treeish_only(const unsigned char *sha1, void *cb_data_unused)
{
	struct object *obj;
	int kind;

	kind = sha1_object_info(sha1, NULL);
	if (kind == OBJ_TREE || kind == OBJ_COMMIT)
		return 1;
	if (kind != OBJ_TAG)
		return 0;

	/* We need to do this the hard way... */
267
	obj = deref_tag(parse_object(sha1), NULL, 0);
268 269 270 271 272 273 274 275 276 277 278
	if (obj && (obj->type == OBJ_TREE || obj->type == OBJ_COMMIT))
		return 1;
	return 0;
}

static int disambiguate_blob_only(const unsigned char *sha1, void *cb_data_unused)
{
	int kind = sha1_object_info(sha1, NULL);
	return kind == OBJ_BLOB;
}

279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308
static disambiguate_hint_fn default_disambiguate_hint;

int set_disambiguate_hint_config(const char *var, const char *value)
{
	static const struct {
		const char *name;
		disambiguate_hint_fn fn;
	} hints[] = {
		{ "none", NULL },
		{ "commit", disambiguate_commit_only },
		{ "committish", disambiguate_committish_only },
		{ "tree", disambiguate_tree_only },
		{ "treeish", disambiguate_treeish_only },
		{ "blob", disambiguate_blob_only }
	};
	int i;

	if (!value)
		return config_error_nonbool(var);

	for (i = 0; i < ARRAY_SIZE(hints); i++) {
		if (!strcasecmp(value, hints[i].name)) {
			default_disambiguate_hint = hints[i].fn;
			return 0;
		}
	}

	return error("unknown hint type for '%s': %s", var, value);
}

309 310
static int init_object_disambiguation(const char *name, int len,
				      struct disambiguate_state *ds)
311
{
312
	int i;
313

314 315 316 317 318
	if (len < MINIMUM_ABBREV || len > GIT_SHA1_HEXSZ)
		return -1;

	memset(ds, 0, sizeof(*ds));

319
	for (i = 0; i < len ;i++) {
320 321 322 323 324 325 326 327 328 329 330 331
		unsigned char c = name[i];
		unsigned char val;
		if (c >= '0' && c <= '9')
			val = c - '0';
		else if (c >= 'a' && c <= 'f')
			val = c - 'a' + 10;
		else if (c >= 'A' && c <='F') {
			val = c - 'A' + 10;
			c -= 'A' - 'a';
		}
		else
			return -1;
332
		ds->hex_pfx[i] = c;
333 334
		if (!(i & 1))
			val <<= 4;
335
		ds->bin_pfx[i >> 1] |= val;
336
	}
337 338

	ds->len = len;
339
	ds->hex_pfx[len] = '\0';
340
	prepare_alt_odb();
341 342 343
	return 0;
}

344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375
static int show_ambiguous_object(const unsigned char *sha1, void *data)
{
	const struct disambiguate_state *ds = data;
	struct strbuf desc = STRBUF_INIT;
	int type;

	if (ds->fn && !ds->fn(sha1, ds->cb_data))
		return 0;

	type = sha1_object_info(sha1, NULL);
	if (type == OBJ_COMMIT) {
		struct commit *commit = lookup_commit(sha1);
		if (commit) {
			struct pretty_print_context pp = {0};
			pp.date_mode.type = DATE_SHORT;
			format_commit_message(commit, " %ad - %s", &desc, &pp);
		}
	} else if (type == OBJ_TAG) {
		struct tag *tag = lookup_tag(sha1);
		if (!parse_tag(tag) && tag->tag)
			strbuf_addf(&desc, " %s", tag->tag);
	}

	advise("  %s %s%s",
	       find_unique_abbrev(sha1, DEFAULT_ABBREV),
	       typename(type) ? typename(type) : "unknown type",
	       desc.buf);

	strbuf_release(&desc);
	return 0;
}

376 377 378 379 380 381 382
static int get_short_sha1(const char *name, int len, unsigned char *sha1,
			  unsigned flags)
{
	int status;
	struct disambiguate_state ds;
	int quietly = !!(flags & GET_SHA1_QUIETLY);

383
	if (init_object_disambiguation(name, len, &ds) < 0)
384
		return -1;
385

386 387 388
	if (HAS_MULTI_BITS(flags & GET_SHA1_DISAMBIGUATORS))
		die("BUG: multiple get_short_sha1 disambiguator flags");

389 390
	if (flags & GET_SHA1_COMMIT)
		ds.fn = disambiguate_commit_only;
391 392
	else if (flags & GET_SHA1_COMMITTISH)
		ds.fn = disambiguate_committish_only;
393 394 395 396 397 398
	else if (flags & GET_SHA1_TREE)
		ds.fn = disambiguate_tree_only;
	else if (flags & GET_SHA1_TREEISH)
		ds.fn = disambiguate_treeish_only;
	else if (flags & GET_SHA1_BLOB)
		ds.fn = disambiguate_blob_only;
399 400
	else
		ds.fn = default_disambiguate_hint;
401

402 403
	find_short_object_filename(&ds);
	find_short_packed_object(&ds);
404
	status = finish_object_disambiguation(&ds, sha1);
405

406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421
	if (!quietly && (status == SHORT_NAME_AMBIGUOUS)) {
		error(_("short SHA1 %s is ambiguous"), ds.hex_pfx);

		/*
		 * We may still have ambiguity if we simply saw a series of
		 * candidates that did not satisfy our hint function. In
		 * that case, we still want to show them, so disable the hint
		 * function entirely.
		 */
		if (!ds.ambiguous)
			ds.fn = NULL;

		advise(_("The candidates are:"));
		for_each_abbrev(ds.hex_pfx, show_ambiguous_object, &ds);
	}

422 423 424
	return status;
}

425 426 427 428 429 430
static int collect_ambiguous(const unsigned char *sha1, void *data)
{
	sha1_array_append(data, sha1);
	return 0;
}

431 432
int for_each_abbrev(const char *prefix, each_abbrev_fn fn, void *cb_data)
{
433
	struct sha1_array collect = SHA1_ARRAY_INIT;
434
	struct disambiguate_state ds;
435
	int ret;
436

437
	if (init_object_disambiguation(prefix, strlen(prefix), &ds) < 0)
438 439 440
		return -1;

	ds.always_call_fn = 1;
441 442
	ds.fn = collect_ambiguous;
	ds.cb_data = &collect;
443 444
	find_short_object_filename(&ds);
	find_short_packed_object(&ds);
445 446 447 448

	ret = sha1_array_for_each_unique(&collect, fn, cb_data);
	sha1_array_clear(&collect);
	return ret;
449 450
}

451 452 453 454 455 456 457 458 459 460 461 462 463
/*
 * Return the slot of the most-significant bit set in "val". There are various
 * ways to do this quickly with fls() or __builtin_clzl(), but speed is
 * probably not a big deal here.
 */
static unsigned msb(unsigned long val)
{
	unsigned r = 0;
	while (val >>= 1)
		r++;
	return r;
}

464
int find_unique_abbrev_r(char *hex, const unsigned char *sha1, int len)
465
{
466
	int status, exists;
J
Junio C Hamano 已提交
467

468
	if (len < 0) {
469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488
		unsigned long count = approximate_object_count();
		/*
		 * Add one because the MSB only tells us the highest bit set,
		 * not including the value of all the _other_ bits (so "15"
		 * is only one off of 2^4, but the MSB is the 3rd bit.
		 */
		len = msb(count) + 1;
		/*
		 * We now know we have on the order of 2^len objects, which
		 * expects a collision at 2^(len/2). But we also care about hex
		 * chars, not bits, and there are 4 bits per hex. So all
		 * together we need to divide by 2; but we also want to round
		 * odd numbers up, hence adding one before dividing.
		 */
		len = (len + 1) / 2;
		/*
		 * For very small repos, we stick with our regular fallback.
		 */
		if (len < FALLBACK_DEFAULT_ABBREV)
			len = FALLBACK_DEFAULT_ABBREV;
489
	}
490

491
	sha1_to_hex_r(hex, sha1);
492
	if (len == 40 || !len)
493
		return 40;
494
	exists = has_sha1_file(sha1);
495 496
	while (len < 40) {
		unsigned char sha1_ret[20];
497
		status = get_short_sha1(hex, len, sha1_ret, GET_SHA1_QUIETLY);
498 499 500
		if (exists
		    ? !status
		    : status == SHORT_NAME_NOT_FOUND) {
501
			hex[len] = 0;
502
			return len;
503 504 505
		}
		len++;
	}
506 507 508 509 510
	return len;
}

const char *find_unique_abbrev(const unsigned char *sha1, int len)
{
J
Jeff King 已提交
511 512
	static int bufno;
	static char hexbuffer[4][GIT_SHA1_HEXSZ + 1];
513 514
	char *hex = hexbuffer[bufno];
	bufno = (bufno + 1) % ARRAY_SIZE(hexbuffer);
515
	find_unique_abbrev_r(hex, sha1, len);
516
	return hex;
517 518
}

519
static int ambiguous_path(const char *path, int len)
520 521
{
	int slash = 1;
522
	int cnt;
523

524
	for (cnt = 0; cnt < len; cnt++) {
525 526 527 528 529 530 531 532 533 534 535 536 537 538
		switch (*path++) {
		case '\0':
			break;
		case '/':
			if (slash)
				break;
			slash = 1;
			continue;
		case '.':
			continue;
		default:
			slash = 0;
			continue;
		}
539
		break;
540
	}
541
	return slash;
542 543
}

J
Jeff King 已提交
544 545
static inline int at_mark(const char *string, int len,
			  const char **suffix, int nr)
546 547 548
{
	int i;

J
Jeff King 已提交
549
	for (i = 0; i < nr; i++) {
550 551 552 553 554 555 556 557
		int suffix_len = strlen(suffix[i]);
		if (suffix_len <= len
		    && !memcmp(string, suffix[i], suffix_len))
			return suffix_len;
	}
	return 0;
}

J
Jeff King 已提交
558 559 560 561 562 563
static inline int upstream_mark(const char *string, int len)
{
	const char *suffix[] = { "@{upstream}", "@{u}" };
	return at_mark(string, len, suffix, ARRAY_SIZE(suffix));
}

564 565 566 567 568 569
static inline int push_mark(const char *string, int len)
{
	const char *suffix[] = { "@{push}" };
	return at_mark(string, len, suffix, ARRAY_SIZE(suffix));
}

570
static int get_sha1_1(const char *name, int len, unsigned char *sha1, unsigned lookup_flags);
571
static int interpret_nth_prior_checkout(const char *name, int namelen, struct strbuf *buf);
572

573 574
static int get_sha1_basic(const char *str, int len, unsigned char *sha1,
			  unsigned int flags)
575
{
576
	static const char *warn_msg = "refname '%.*s' is ambiguous.";
577 578 579 580 581 582 583 584 585
	static const char *object_name_msg = N_(
	"Git normally never creates a ref that ends with 40 hex characters\n"
	"because it will be ignored when you just specify 40-hex. These refs\n"
	"may be created by mistake. For example,\n"
	"\n"
	"  git checkout -b $br $(git rev-parse ...)\n"
	"\n"
	"where \"$br\" is somehow empty and a 40-hex ref is created. Please\n"
	"examine these refs and maybe delete them. Turn this message off by\n"
586
	"running \"git config advice.objectNameWarning false\"");
587
	unsigned char tmp_sha1[20];
L
Linus Torvalds 已提交
588
	char *real_ref = NULL;
589
	int refs_found = 0;
590
	int at, reflog_len, nth_prior = 0;
591

592
	if (len == 40 && !get_sha1_hex(str, sha1)) {
593
		if (warn_ambiguous_refs && warn_on_object_refname_ambiguity) {
594
			refs_found = dwim_ref(str, len, tmp_sha1, &real_ref);
595
			if (refs_found > 0) {
596 597 598 599 600
				warning(warn_msg, len, str);
				if (advice_object_name_warning)
					fprintf(stderr, "%s\n", _(object_name_msg));
			}
			free(real_ref);
601
		}
602
		return 0;
603
	}
604

605
	/* basic@{time or number or -number} format to query ref-log */
606
	reflog_len = at = 0;
607
	if (len && str[len-1] == '}') {
608
		for (at = len-4; at >= 0; at--) {
609
			if (str[at] == '@' && str[at+1] == '{') {
610 611 612 613
				if (str[at+2] == '-') {
					if (at != 0)
						/* @{-N} not at start */
						return -1;
614 615 616
					nth_prior = 1;
					continue;
				}
617 618
				if (!upstream_mark(str + at, len - at) &&
				    !push_mark(str + at, len - at)) {
619 620 621
					reflog_len = (len-1) - (at+2);
					len = at;
				}
622 623
				break;
			}
624 625 626
		}
	}

627
	/* Accept only unambiguous ref paths. */
628
	if (len && ambiguous_path(str, len))
629 630
		return -1;

631
	if (nth_prior) {
632
		struct strbuf buf = STRBUF_INIT;
633 634
		int detached;

635
		if (interpret_nth_prior_checkout(str, len, &buf) > 0) {
636 637 638 639
			detached = (buf.len == 40 && !get_sha1_hex(buf.buf, sha1));
			strbuf_release(&buf);
			if (detached)
				return 0;
640
		}
641 642 643
	}

	if (!len && reflog_len)
644 645
		/* allow "@{...}" to mean the current branch reflog */
		refs_found = dwim_ref("HEAD", 4, sha1, &real_ref);
646
	else if (reflog_len)
647 648
		refs_found = dwim_log(str, len, sha1, &real_ref);
	else
649
		refs_found = dwim_ref(str, len, sha1, &real_ref);
650 651 652 653

	if (!refs_found)
		return -1;

654
	if (warn_ambiguous_refs && !(flags & GET_SHA1_QUIETLY) &&
655 656
	    (refs_found > 1 ||
	     !get_short_sha1(str, len, tmp_sha1, GET_SHA1_QUIETLY)))
657
		warning(warn_msg, len, str);
658

659 660 661
	if (reflog_len) {
		int nth, i;
		unsigned long at_time;
662 663 664
		unsigned long co_time;
		int co_tz, co_cnt;

665
		/* Is it asking for N-th entry, or approxidate? */
666 667 668 669 670 671 672
		for (i = nth = 0; 0 <= nth && i < reflog_len; i++) {
			char ch = str[at+2+i];
			if ('0' <= ch && ch <= '9')
				nth = nth * 10 + ch - '0';
			else
				nth = -1;
		}
673 674 675 676
		if (100000000 <= nth) {
			at_time = nth;
			nth = -1;
		} else if (0 <= nth)
677
			at_time = 0;
J
Jeff King 已提交
678
		else {
679
			int errors = 0;
J
Jeff King 已提交
680
			char *tmp = xstrndup(str + at + 2, reflog_len);
681
			at_time = approxidate_careful(tmp, &errors);
J
Jeff King 已提交
682
			free(tmp);
J
Jeff King 已提交
683 684
			if (errors) {
				free(real_ref);
685
				return -1;
J
Jeff King 已提交
686
			}
J
Jeff King 已提交
687
		}
688
		if (read_ref_at(real_ref, flags, at_time, nth, sha1, NULL,
689
				&co_time, &co_tz, &co_cnt)) {
690
			if (!len) {
691
				if (starts_with(real_ref, "refs/heads/")) {
692 693 694 695 696 697 698 699
					str = real_ref + 11;
					len = strlen(real_ref + 11);
				} else {
					/* detached HEAD */
					str = "HEAD";
					len = 4;
				}
			}
700 701 702 703
			if (at_time) {
				if (!(flags & GET_SHA1_QUIETLY)) {
					warning("Log for '%.*s' only goes "
						"back to %s.", len, str,
704
						show_date(co_time, co_tz, DATE_MODE(RFC2822)));
705 706 707 708 709
				}
			} else {
				if (flags & GET_SHA1_QUIETLY) {
					exit(128);
				}
710 711 712
				die("Log for '%.*s' only has %d entries.",
				    len, str, co_cnt);
			}
713
		}
714 715
	}

L
Linus Torvalds 已提交
716
	free(real_ref);
717
	return 0;
718 719 720 721 722 723
}

static int get_parent(const char *name, int len,
		      unsigned char *result, int idx)
{
	unsigned char sha1[20];
724
	int ret = get_sha1_1(name, len, sha1, GET_SHA1_COMMITTISH);
725 726 727 728 729 730 731 732 733
	struct commit *commit;
	struct commit_list *p;

	if (ret)
		return ret;
	commit = lookup_commit_reference(sha1);
	if (parse_commit(commit))
		return -1;
	if (!idx) {
B
brian m. carlson 已提交
734
		hashcpy(result, commit->object.oid.hash);
735 736 737 738 739
		return 0;
	}
	p = commit->parents;
	while (p) {
		if (!--idx) {
B
brian m. carlson 已提交
740
			hashcpy(result, p->item->object.oid.hash);
741 742 743 744 745 746 747
			return 0;
		}
		p = p->next;
	}
	return -1;
}

748 749 750 751
static int get_nth_ancestor(const char *name, int len,
			    unsigned char *result, int generation)
{
	unsigned char sha1[20];
752 753 754
	struct commit *commit;
	int ret;

755
	ret = get_sha1_1(name, len, sha1, GET_SHA1_COMMITTISH);
756 757
	if (ret)
		return ret;
758 759 760
	commit = lookup_commit_reference(sha1);
	if (!commit)
		return -1;
761 762

	while (generation--) {
763
		if (parse_commit(commit) || !commit->parents)
764
			return -1;
765
		commit = commit->parents->item;
766
	}
B
brian m. carlson 已提交
767
	hashcpy(result, commit->object.oid.hash);
768 769 770
	return 0;
}

771 772 773 774 775 776
struct object *peel_to_type(const char *name, int namelen,
			    struct object *o, enum object_type expected_type)
{
	if (name && !namelen)
		namelen = strlen(name);
	while (1) {
B
brian m. carlson 已提交
777
		if (!o || (!o->parsed && !parse_object(o->oid.hash)))
778
			return NULL;
779
		if (expected_type == OBJ_ANY || o->type == expected_type)
780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795
			return o;
		if (o->type == OBJ_TAG)
			o = ((struct tag*) o)->tagged;
		else if (o->type == OBJ_COMMIT)
			o = &(((struct commit *) o)->tree->object);
		else {
			if (name)
				error("%.*s: expected %s type, but the object "
				      "dereferences to %s type",
				      namelen, name, typename(expected_type),
				      typename(o->type));
			return NULL;
		}
	}
}

796 797
static int peel_onion(const char *name, int len, unsigned char *sha1,
		      unsigned lookup_flags)
J
Junio C Hamano 已提交
798 799 800
{
	unsigned char outer[20];
	const char *sp;
L
Linus Torvalds 已提交
801
	unsigned int expected_type = 0;
J
Junio C Hamano 已提交
802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823
	struct object *o;

	/*
	 * "ref^{type}" dereferences ref repeatedly until you cannot
	 * dereference anymore, or you get an object of given type,
	 * whichever comes first.  "ref^{}" means just dereference
	 * tags until you get a non-tag.  "ref^0" is a shorthand for
	 * "ref^{commit}".  "commit^{tree}" could be used to find the
	 * top-level tree of the given commit.
	 */
	if (len < 4 || name[len-1] != '}')
		return -1;

	for (sp = name + len - 1; name <= sp; sp--) {
		int ch = *sp;
		if (ch == '{' && name < sp && sp[-1] == '^')
			break;
	}
	if (sp <= name)
		return -1;

	sp++; /* beginning of type name, or closing brace for empty */
824
	if (starts_with(sp, "commit}"))
825
		expected_type = OBJ_COMMIT;
826
	else if (starts_with(sp, "tag}"))
827
		expected_type = OBJ_TAG;
828
	else if (starts_with(sp, "tree}"))
829
		expected_type = OBJ_TREE;
830
	else if (starts_with(sp, "blob}"))
831
		expected_type = OBJ_BLOB;
832
	else if (starts_with(sp, "object}"))
833
		expected_type = OBJ_ANY;
J
Junio C Hamano 已提交
834
	else if (sp[0] == '}')
835
		expected_type = OBJ_NONE;
836 837
	else if (sp[0] == '/')
		expected_type = OBJ_COMMIT;
J
Junio C Hamano 已提交
838 839 840
	else
		return -1;

841
	lookup_flags &= ~GET_SHA1_DISAMBIGUATORS;
842
	if (expected_type == OBJ_COMMIT)
843
		lookup_flags |= GET_SHA1_COMMITTISH;
844
	else if (expected_type == OBJ_TREE)
845
		lookup_flags |= GET_SHA1_TREEISH;
846 847

	if (get_sha1_1(name, sp - name - 2, outer, lookup_flags))
J
Junio C Hamano 已提交
848 849 850 851 852
		return -1;

	o = parse_object(outer);
	if (!o)
		return -1;
L
Linus Torvalds 已提交
853
	if (!expected_type) {
854
		o = deref_tag(o, name, sp - name - 2);
B
brian m. carlson 已提交
855
		if (!o || (!o->parsed && !parse_object(o->oid.hash)))
856
			return -1;
857
		hashcpy(sha1, o->oid.hash);
858
		return 0;
J
Junio C Hamano 已提交
859
	}
860 861 862 863 864 865 866 867

	/*
	 * At this point, the syntax look correct, so
	 * if we do not get the needed object, we should
	 * barf.
	 */
	o = peel_to_type(name, len, o, expected_type);
	if (!o)
868
		return -1;
869

B
brian m. carlson 已提交
870
	hashcpy(sha1, o->oid.hash);
871 872 873 874 875 876
	if (sp[0] == '/') {
		/* "$commit^{/foo}" */
		char *prefix;
		int ret;
		struct commit_list *list = NULL;

877
		/*
878 879
		 * $commit^{/}. Some regex implementation may reject.
		 * We don't need regex anyway. '' pattern always matches.
J
Junio C Hamano 已提交
880
		 */
881
		if (sp[1] == '}')
882
			return 0;
883

884 885 886 887 888
		prefix = xstrndup(sp + 1, name + len - 1 - (sp + 1));
		commit_list_insert((struct commit *)o, &list);
		ret = get_sha1_oneline(prefix, sha1, list);
		free(prefix);
		return ret;
J
Junio C Hamano 已提交
889 890 891 892
	}
	return 0;
}

893 894 895
static int get_describe_name(const char *name, int len, unsigned char *sha1)
{
	const char *cp;
896
	unsigned flags = GET_SHA1_QUIETLY | GET_SHA1_COMMIT;
897 898 899

	for (cp = name + len - 1; name + 2 <= cp; cp--) {
		char ch = *cp;
900
		if (!isxdigit(ch)) {
901 902 903 904 905 906
			/* We must be looking at g in "SOMETHING-g"
			 * for it to be describe output.
			 */
			if (ch == 'g' && cp[-1] == '-') {
				cp++;
				len -= cp - name;
907
				return get_short_sha1(cp, len, sha1, flags);
908 909 910 911 912 913
			}
		}
	}
	return -1;
}

914
static int get_sha1_1(const char *name, int len, unsigned char *sha1, unsigned lookup_flags)
915
{
916
	int ret, has_suffix;
917
	const char *cp;
918

919 920
	/*
	 * "name~3" is "name^^^", "name~" is "name~1", and "name^" is "name^1".
921
	 */
922
	has_suffix = 0;
923 924 925 926
	for (cp = name + len - 1; name <= cp; cp--) {
		int ch = *cp;
		if ('0' <= ch && ch <= '9')
			continue;
927 928
		if (ch == '~' || ch == '^')
			has_suffix = ch;
929 930
		break;
	}
931 932 933

	if (has_suffix) {
		int num = 0;
934 935 936
		int len1 = cp - name;
		cp++;
		while (cp < name + len)
937
			num = num * 10 + *cp++ - '0';
938 939 940
		if (!num && len1 == len - 1)
			num = 1;
		if (has_suffix == '^')
941 942 943
			return get_parent(name, len1, sha1, num);
		/* else if (has_suffix == '~') -- goes without saying */
		return get_nth_ancestor(name, len1, sha1, num);
944 945
	}

946
	ret = peel_onion(name, len, sha1, lookup_flags);
J
Junio C Hamano 已提交
947 948 949
	if (!ret)
		return 0;

950
	ret = get_sha1_basic(name, len, sha1, lookup_flags);
951 952
	if (!ret)
		return 0;
953 954 955 956 957 958

	/* It could be describe output that is "SOMETHING-gXXXX" */
	ret = get_describe_name(name, len, sha1);
	if (!ret)
		return 0;

959
	return get_short_sha1(name, len, sha1, lookup_flags);
960 961
}

962 963 964
/*
 * This interprets names like ':/Initial revision of "git"' by searching
 * through history and returning the first commit whose message starts
965
 * the given regular expression.
966
 *
967 968 969 970 971 972
 * For negative-matching, prefix the pattern-part with '!-', like: ':/!-WIP'.
 *
 * For a literal '!' character at the beginning of a pattern, you have to repeat
 * that, like: ':/!!foo'
 *
 * For future extension, all other sequences beginning with ':/!' are reserved.
973
 */
974 975

/* Remember to update object flag allocation in object.h */
976 977
#define ONELINE_SEEN (1u<<20)

978 979
static int handle_one_ref(const char *path, const struct object_id *oid,
			  int flag, void *cb_data)
980 981
{
	struct commit_list **list = cb_data;
982
	struct object *object = parse_object(oid->hash);
983 984
	if (!object)
		return 0;
985
	if (object->type == OBJ_TAG) {
986
		object = deref_tag(object, path, strlen(path));
987 988 989
		if (!object)
			return 0;
	}
990 991
	if (object->type != OBJ_COMMIT)
		return 0;
992
	commit_list_insert((struct commit *)object, list);
993 994 995
	return 0;
}

996 997
static int get_sha1_oneline(const char *prefix, unsigned char *sha1,
			    struct commit_list *list)
998
{
999
	struct commit_list *backup = NULL, *l;
1000
	int found = 0;
1001
	int negative = 0;
1002
	regex_t regex;
1003 1004 1005

	if (prefix[0] == '!') {
		prefix++;
1006 1007 1008 1009 1010

		if (prefix[0] == '-') {
			prefix++;
			negative = 1;
		} else if (prefix[0] != '!') {
1011
			return -1;
1012
		}
1013
	}
1014 1015

	if (regcomp(&regex, prefix, REG_EXTENDED))
1016
		return -1;
1017

1018 1019
	for (l = list; l; l = l->next) {
		l->item->object.flags |= ONELINE_SEEN;
1020
		commit_list_insert(l->item, &backup);
1021
	}
1022
	while (list) {
1023
		const char *p, *buf;
L
Linus Torvalds 已提交
1024
		struct commit *commit;
1025
		int matches;
1026 1027

		commit = pop_most_recent_commit(&list, ONELINE_SEEN);
B
brian m. carlson 已提交
1028
		if (!parse_object(commit->object.oid.hash))
1029
			continue;
1030
		buf = get_commit_buffer(commit, NULL);
1031
		p = strstr(buf, "\n\n");
1032
		matches = negative ^ (p && !regexec(&regex, p + 2, 0, NULL, 0));
1033
		unuse_commit_buffer(commit, buf);
1034 1035

		if (matches) {
B
brian m. carlson 已提交
1036
			hashcpy(sha1, commit->object.oid.hash);
1037
			found = 1;
1038 1039 1040
			break;
		}
	}
1041
	regfree(&regex);
1042 1043 1044
	free_commit_list(list);
	for (l = backup; l; l = l->next)
		clear_commit_marks(l->item, ONELINE_SEEN);
1045 1046
	free_commit_list(backup);
	return found ? 0 : -1;
1047 1048
}

1049
struct grab_nth_branch_switch_cbdata {
1050 1051
	int remaining;
	struct strbuf buf;
1052 1053 1054 1055 1056 1057 1058
};

static int grab_nth_branch_switch(unsigned char *osha1, unsigned char *nsha1,
				  const char *email, unsigned long timestamp, int tz,
				  const char *message, void *cb_data)
{
	struct grab_nth_branch_switch_cbdata *cb = cb_data;
T
Thomas Rast 已提交
1059 1060 1061
	const char *match = NULL, *target = NULL;
	size_t len;

1062
	if (skip_prefix(message, "checkout: moving from ", &match))
1063
		target = strstr(match, " to ");
1064

1065
	if (!match || !target)
1066
		return 0;
1067 1068 1069 1070 1071 1072
	if (--(cb->remaining) == 0) {
		len = target - match;
		strbuf_reset(&cb->buf);
		strbuf_add(&cb->buf, match, len);
		return 1; /* we are done */
	}
1073 1074 1075 1076
	return 0;
}

/*
1077 1078
 * Parse @{-N} syntax, return the number of characters parsed
 * if successful; otherwise signal an error with negative value.
1079
 */
1080 1081
static int interpret_nth_prior_checkout(const char *name, int namelen,
					struct strbuf *buf)
1082
{
1083
	long nth;
1084
	int retval;
1085
	struct grab_nth_branch_switch_cbdata cb;
T
Thomas Rast 已提交
1086 1087
	const char *brace;
	char *num_end;
1088

1089 1090
	if (namelen < 4)
		return -1;
1091 1092
	if (name[0] != '@' || name[1] != '{' || name[2] != '-')
		return -1;
1093
	brace = memchr(name, '}', namelen);
T
Thomas Rast 已提交
1094 1095
	if (!brace)
		return -1;
1096
	nth = strtol(name + 3, &num_end, 10);
T
Thomas Rast 已提交
1097
	if (num_end != brace)
1098
		return -1;
1099 1100
	if (nth <= 0)
		return -1;
1101 1102 1103
	cb.remaining = nth;
	strbuf_init(&cb.buf, 20);

1104
	retval = 0;
1105 1106
	if (0 < for_each_reflog_ent_reverse("HEAD", grab_nth_branch_switch, &cb)) {
		strbuf_reset(buf);
1107
		strbuf_addbuf(buf, &cb.buf);
1108 1109
		retval = brace - name + 1;
	}
T
Thomas Rast 已提交
1110

1111
	strbuf_release(&cb.buf);
1112
	return retval;
1113 1114
}

1115
int get_oid_mb(const char *name, struct object_id *oid)
1116 1117 1118
{
	struct commit *one, *two;
	struct commit_list *mbs;
1119
	struct object_id oid_tmp;
1120 1121 1122 1123 1124
	const char *dots;
	int st;

	dots = strstr(name, "...");
	if (!dots)
1125
		return get_oid(name, oid);
1126
	if (dots == name)
1127
		st = get_oid("HEAD", &oid_tmp);
1128 1129 1130 1131
	else {
		struct strbuf sb;
		strbuf_init(&sb, dots - name);
		strbuf_add(&sb, name, dots - name);
1132
		st = get_sha1_committish(sb.buf, oid_tmp.hash);
1133 1134 1135 1136
		strbuf_release(&sb);
	}
	if (st)
		return st;
1137
	one = lookup_commit_reference_gently(oid_tmp.hash, 0);
1138 1139 1140
	if (!one)
		return -1;

1141
	if (get_sha1_committish(dots[3] ? (dots + 3) : "HEAD", oid_tmp.hash))
1142
		return -1;
1143
	two = lookup_commit_reference_gently(oid_tmp.hash, 0);
1144 1145
	if (!two)
		return -1;
1146
	mbs = get_merge_bases(one, two);
1147 1148 1149 1150
	if (!mbs || mbs->next)
		st = -1;
	else {
		st = 0;
1151
		oidcpy(oid, &mbs->item->object.oid);
1152 1153 1154 1155 1156
	}
	free_commit_list(mbs);
	return st;
}

F
Felipe Contreras 已提交
1157 1158 1159 1160 1161 1162 1163 1164 1165
/* parse @something syntax, when 'something' is not {.*} */
static int interpret_empty_at(const char *name, int namelen, int len, struct strbuf *buf)
{
	const char *next;

	if (len || name[1] == '{')
		return -1;

	/* make sure it's a single @, or @@{.*}, not @foo */
1166
	next = memchr(name + len + 1, '@', namelen - len - 1);
F
Felipe Contreras 已提交
1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178
	if (next && next[1] != '{')
		return -1;
	if (!next)
		next = name + namelen;
	if (next != name + 1)
		return -1;

	strbuf_reset(buf);
	strbuf_add(buf, "HEAD", 4);
	return 1;
}

1179 1180
static int reinterpret(const char *name, int namelen, int len,
		       struct strbuf *buf, unsigned allowed)
1181 1182 1183 1184 1185 1186 1187
{
	/* we have extra data, which might need further processing */
	struct strbuf tmp = STRBUF_INIT;
	int used = buf->len;
	int ret;

	strbuf_add(buf, name + len, namelen - len);
1188
	ret = interpret_branch_name(buf->buf, buf->len, &tmp, allowed);
1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200
	/* that data was not interpreted, remove our cruft */
	if (ret < 0) {
		strbuf_setlen(buf, used);
		return len;
	}
	strbuf_reset(buf);
	strbuf_addbuf(buf, &tmp);
	strbuf_release(&tmp);
	/* tweak for size of {-N} versus expanded ref name */
	return ret - used + len;
}

1201 1202 1203 1204 1205 1206 1207 1208
static void set_shortened_ref(struct strbuf *buf, const char *ref)
{
	char *s = shorten_unambiguous_ref(ref, 0);
	strbuf_reset(buf);
	strbuf_addstr(buf, s);
	free(s);
}

1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223
static int branch_interpret_allowed(const char *refname, unsigned allowed)
{
	if (!allowed)
		return 1;

	if ((allowed & INTERPRET_BRANCH_LOCAL) &&
	    starts_with(refname, "refs/heads/"))
		return 1;
	if ((allowed & INTERPRET_BRANCH_REMOTE) &&
	    starts_with(refname, "refs/remotes/"))
		return 1;

	return 0;
}

1224 1225 1226 1227
static int interpret_branch_mark(const char *name, int namelen,
				 int at, struct strbuf *buf,
				 int (*get_mark)(const char *, int),
				 const char *(*get_data)(struct branch *,
1228 1229
							 struct strbuf *),
				 unsigned allowed)
1230 1231
{
	int len;
1232 1233 1234
	struct branch *branch;
	struct strbuf err = STRBUF_INIT;
	const char *value;
1235

1236
	len = get_mark(name + at, namelen - at);
1237 1238 1239
	if (!len)
		return -1;

1240 1241 1242
	if (memchr(name, ':', at))
		return -1;

1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253
	if (at) {
		char *name_str = xmemdupz(name, at);
		branch = branch_get(name_str);
		free(name_str);
	} else
		branch = branch_get(NULL);

	value = get_data(branch, &err);
	if (!value)
		die("%s", err.buf);

1254 1255 1256
	if (!branch_interpret_allowed(value, allowed))
		return -1;

1257
	set_shortened_ref(buf, value);
1258 1259 1260
	return len + at;
}

1261 1262
int interpret_branch_name(const char *name, int namelen, struct strbuf *buf,
			  unsigned allowed)
1263
{
1264
	char *at;
1265
	const char *start;
1266
	int len;
1267

1268 1269 1270
	if (!namelen)
		namelen = strlen(name);

1271 1272 1273 1274 1275 1276 1277 1278 1279 1280
	if (!allowed || (allowed & INTERPRET_BRANCH_LOCAL)) {
		len = interpret_nth_prior_checkout(name, namelen, buf);
		if (!len) {
			return len; /* syntax Ok, not enough switches */
		} else if (len > 0) {
			if (len == namelen)
				return len; /* consumed all */
			else
				return reinterpret(name, namelen, len, buf, allowed);
		}
J
Jeff King 已提交
1281 1282
	}

1283 1284 1285
	for (start = name;
	     (at = memchr(start, '@', namelen - (start - name)));
	     start = at + 1) {
F
Felipe Contreras 已提交
1286

1287 1288 1289 1290 1291 1292
		if (!allowed || (allowed & INTERPRET_BRANCH_HEAD)) {
			len = interpret_empty_at(name, namelen, at - name, buf);
			if (len > 0)
				return reinterpret(name, namelen, len, buf,
						   allowed);
		}
F
Felipe Contreras 已提交
1293

1294
		len = interpret_branch_mark(name, namelen, at - name, buf,
1295 1296
					    upstream_mark, branch_get_upstream,
					    allowed);
1297 1298
		if (len > 0)
			return len;
1299 1300

		len = interpret_branch_mark(name, namelen, at - name, buf,
1301 1302
					    push_mark, branch_get_push,
					    allowed);
1303 1304
		if (len > 0)
			return len;
1305
	}
F
Felipe Contreras 已提交
1306

1307
	return -1;
1308 1309
}

1310
void strbuf_branchname(struct strbuf *sb, const char *name, unsigned allowed)
1311 1312
{
	int len = strlen(name);
1313
	int used = interpret_branch_name(name, len, sb, allowed);
1314 1315 1316 1317

	if (used < 0)
		used = 0;
	strbuf_add(sb, name + used, len - used);
1318 1319 1320 1321
}

int strbuf_check_branch_ref(struct strbuf *sb, const char *name)
{
1322
	strbuf_branchname(sb, name, INTERPRET_BRANCH_LOCAL);
1323
	if (name[0] == '-')
1324
		return -1;
1325
	strbuf_splice(sb, 0, 0, "refs/heads/", 11);
1326
	return check_refname_format(sb->buf, 0);
1327 1328
}

1329 1330 1331 1332 1333 1334
/*
 * This is like "get_sha1_basic()", except it allows "sha1 expressions",
 * notably "xyz^" for "parent of xyz"
 */
int get_sha1(const char *name, unsigned char *sha1)
{
1335
	struct object_context unused;
1336
	return get_sha1_with_context(name, 0, sha1, &unused);
M
Martin Koegler 已提交
1337 1338
}

1339 1340 1341 1342 1343 1344 1345 1346 1347
/*
 * This is like "get_sha1()", but for struct object_id.
 */
int get_oid(const char *name, struct object_id *oid)
{
	return get_sha1(name, oid->hash);
}


1348
/*
1349
 * Many callers know that the user meant to name a commit-ish by
1350 1351
 * syntactical positions where the object name appears.  Calling this
 * function allows the machinery to disambiguate shorter-than-unique
1352
 * abbreviated object names between commit-ish and others.
1353 1354
 *
 * Note that this does NOT error out when the named object is not a
1355
 * commit-ish. It is merely to give a hint to the disambiguation
1356 1357 1358 1359 1360 1361 1362 1363 1364
 * machinery.
 */
int get_sha1_committish(const char *name, unsigned char *sha1)
{
	struct object_context unused;
	return get_sha1_with_context(name, GET_SHA1_COMMITTISH,
				     sha1, &unused);
}

1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390
int get_sha1_treeish(const char *name, unsigned char *sha1)
{
	struct object_context unused;
	return get_sha1_with_context(name, GET_SHA1_TREEISH,
				     sha1, &unused);
}

int get_sha1_commit(const char *name, unsigned char *sha1)
{
	struct object_context unused;
	return get_sha1_with_context(name, GET_SHA1_COMMIT,
				     sha1, &unused);
}

int get_sha1_tree(const char *name, unsigned char *sha1)
{
	struct object_context unused;
	return get_sha1_with_context(name, GET_SHA1_TREE,
				     sha1, &unused);
}

int get_sha1_blob(const char *name, unsigned char *sha1)
{
	struct object_context unused;
	return get_sha1_with_context(name, GET_SHA1_BLOB,
				     sha1, &unused);
M
Martin Koegler 已提交
1391 1392
}

1393 1394 1395 1396
/* Must be called only when object_name:filename doesn't exist. */
static void diagnose_invalid_sha1_path(const char *prefix,
				       const char *filename,
				       const unsigned char *tree_sha1,
1397 1398
				       const char *object_name,
				       int object_name_len)
1399 1400 1401 1402 1403 1404 1405
{
	unsigned char sha1[20];
	unsigned mode;

	if (!prefix)
		prefix = "";

1406
	if (file_exists(filename))
1407 1408
		die("Path '%s' exists on disk, but not in '%.*s'.",
		    filename, object_name_len, object_name);
1409
	if (errno == ENOENT || errno == ENOTDIR) {
1410
		char *fullname = xstrfmt("%s%s", prefix, filename);
1411 1412 1413 1414

		if (!get_tree_entry(tree_sha1, fullname,
				    sha1, &mode)) {
			die("Path '%s' exists, but not '%s'.\n"
1415
			    "Did you mean '%.*s:%s' aka '%.*s:./%s'?",
1416 1417
			    fullname,
			    filename,
1418
			    object_name_len, object_name,
1419
			    fullname,
1420
			    object_name_len, object_name,
1421
			    filename);
1422
		}
1423 1424
		die("Path '%s' does not exist in '%.*s'",
		    filename, object_name_len, object_name);
1425 1426 1427 1428 1429 1430 1431 1432
	}
}

/* Must be called only when :stage:filename doesn't exist. */
static void diagnose_invalid_index_path(int stage,
					const char *prefix,
					const char *filename)
{
1433
	const struct cache_entry *ce;
1434 1435
	int pos;
	unsigned namelen = strlen(filename);
1436
	struct strbuf fullname = STRBUF_INIT;
1437 1438 1439 1440 1441 1442 1443 1444

	if (!prefix)
		prefix = "";

	/* Wrong stage number? */
	pos = cache_name_pos(filename, namelen);
	if (pos < 0)
		pos = -pos - 1;
1445 1446 1447 1448 1449 1450 1451 1452 1453
	if (pos < active_nr) {
		ce = active_cache[pos];
		if (ce_namelen(ce) == namelen &&
		    !memcmp(ce->name, filename, namelen))
			die("Path '%s' is in the index, but not at stage %d.\n"
			    "Did you mean ':%d:%s'?",
			    filename, stage,
			    ce_stage(ce), filename);
	}
1454 1455

	/* Confusion between relative and absolute filenames? */
1456 1457 1458
	strbuf_addstr(&fullname, prefix);
	strbuf_addstr(&fullname, filename);
	pos = cache_name_pos(fullname.buf, fullname.len);
1459 1460
	if (pos < 0)
		pos = -pos - 1;
1461 1462
	if (pos < active_nr) {
		ce = active_cache[pos];
1463 1464
		if (ce_namelen(ce) == fullname.len &&
		    !memcmp(ce->name, fullname.buf, fullname.len))
1465
			die("Path '%s' is in the index, but not '%s'.\n"
1466
			    "Did you mean ':%d:%s' aka ':%d:./%s'?",
1467 1468
			    fullname.buf, filename,
			    ce_stage(ce), fullname.buf,
1469
			    ce_stage(ce), filename);
1470
	}
1471

1472
	if (file_exists(filename))
1473 1474 1475 1476 1477
		die("Path '%s' exists on disk, but not in the index.", filename);
	if (errno == ENOENT || errno == ENOTDIR)
		die("Path '%s' does not exist (neither on disk nor in the index).",
		    filename);

1478
	strbuf_release(&fullname);
1479 1480 1481
}


1482 1483
static char *resolve_relative_path(const char *rel)
{
1484
	if (!starts_with(rel, "./") && !starts_with(rel, "../"))
1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495
		return NULL;

	if (!is_inside_work_tree())
		die("relative path syntax can't be used outside working tree.");

	/* die() inside prefix_path() if resolved path is outside worktree */
	return prefix_path(startup_info->prefix,
			   startup_info->prefix ? strlen(startup_info->prefix) : 0,
			   rel);
}

1496 1497 1498 1499 1500
static int get_sha1_with_context_1(const char *name,
				   unsigned flags,
				   const char *prefix,
				   unsigned char *sha1,
				   struct object_context *oc)
M
Martin Koegler 已提交
1501 1502
{
	int ret, bracket_depth;
1503 1504
	int namelen = strlen(name);
	const char *cp;
1505
	int only_to_die = flags & GET_SHA1_ONLY_TO_DIE;
1506

1507 1508 1509
	if (only_to_die)
		flags |= GET_SHA1_QUIETLY;

1510 1511
	memset(oc, 0, sizeof(*oc));
	oc->mode = S_IFINVALID;
1512
	ret = get_sha1_1(name, namelen, sha1, flags);
1513 1514
	if (!ret)
		return ret;
1515 1516
	/*
	 * sha1:path --> object name of path in ent sha1
1517 1518
	 * :path -> object name of absolute path in index
	 * :./path -> object name of path relative to cwd in index
1519
	 * :[0-3]:path -> object name of path in index at stage
1520
	 * :/foo -> recent commit matching foo
1521 1522 1523
	 */
	if (name[0] == ':') {
		int stage = 0;
1524
		const struct cache_entry *ce;
1525
		char *new_path = NULL;
1526
		int pos;
1527
		if (!only_to_die && namelen > 2 && name[1] == '/') {
1528
			struct commit_list *list = NULL;
1529

1530
			for_each_ref(handle_one_ref, &list);
1531
			commit_list_sort_by_date(&list);
1532 1533
			return get_sha1_oneline(name + 2, sha1, list);
		}
1534 1535 1536 1537 1538 1539 1540
		if (namelen < 3 ||
		    name[2] != ':' ||
		    name[1] < '0' || '3' < name[1])
			cp = name + 1;
		else {
			stage = name[1] - '0';
			cp = name + 3;
1541
		}
1542 1543 1544 1545 1546 1547 1548
		new_path = resolve_relative_path(cp);
		if (!new_path) {
			namelen = namelen - (cp - name);
		} else {
			cp = new_path;
			namelen = strlen(cp);
		}
1549

1550
		strlcpy(oc->path, cp, sizeof(oc->path));
1551

1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562
		if (!active_cache)
			read_cache();
		pos = cache_name_pos(cp, namelen);
		if (pos < 0)
			pos = -pos - 1;
		while (pos < active_nr) {
			ce = active_cache[pos];
			if (ce_namelen(ce) != namelen ||
			    memcmp(ce->name, cp, namelen))
				break;
			if (ce_stage(ce) == stage) {
1563
				hashcpy(sha1, ce->oid.hash);
1564
				oc->mode = ce->ce_mode;
1565
				free(new_path);
1566 1567
				return 0;
			}
1568
			pos++;
1569
		}
1570
		if (only_to_die && name[1] && name[1] != '/')
1571
			diagnose_invalid_index_path(stage, prefix, cp);
1572
		free(new_path);
1573 1574
		return -1;
	}
1575 1576 1577 1578 1579 1580 1581 1582 1583
	for (cp = name, bracket_depth = 0; *cp; cp++) {
		if (*cp == '{')
			bracket_depth++;
		else if (bracket_depth && *cp == '}')
			bracket_depth--;
		else if (!bracket_depth && *cp == ':')
			break;
	}
	if (*cp == ':') {
1584
		unsigned char tree_sha1[20];
1585
		int len = cp - name;
1586 1587 1588 1589 1590 1591
		unsigned sub_flags = flags;

		sub_flags &= ~GET_SHA1_DISAMBIGUATORS;
		sub_flags |= GET_SHA1_TREEISH;

		if (!get_sha1_1(name, len, tree_sha1, sub_flags)) {
1592
			const char *filename = cp+1;
1593 1594 1595 1596 1597
			char *new_filename = NULL;

			new_filename = resolve_relative_path(filename);
			if (new_filename)
				filename = new_filename;
1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610
			if (flags & GET_SHA1_FOLLOW_SYMLINKS) {
				ret = get_tree_entry_follow_symlinks(tree_sha1,
					filename, sha1, &oc->symlink_path,
					&oc->mode);
			} else {
				ret = get_tree_entry(tree_sha1, filename,
						     sha1, &oc->mode);
				if (ret && only_to_die) {
					diagnose_invalid_sha1_path(prefix,
								   filename,
								   tree_sha1,
								   name, len);
				}
1611
			}
1612
			hashcpy(oc->tree, tree_sha1);
1613
			strlcpy(oc->path, filename, sizeof(oc->path));
1614

1615
			free(new_filename);
1616 1617
			return ret;
		} else {
1618
			if (only_to_die)
1619
				die("Invalid object name '%.*s'.", len, name);
1620
		}
1621 1622
	}
	return ret;
1623
}
1624

1625 1626 1627 1628 1629 1630 1631 1632
/*
 * Call this function when you know "name" given by the end user must
 * name an object but it doesn't; the function _may_ die with a better
 * diagnostic message than "no such object 'name'", e.g. "Path 'doc' does not
 * exist in 'HEAD'" when given "HEAD:doc", or it may return in which case
 * you have a chance to diagnose the error further.
 */
void maybe_die_on_misspelt_object_name(const char *name, const char *prefix)
1633 1634
{
	struct object_context oc;
1635
	unsigned char sha1[20];
1636
	get_sha1_with_context_1(name, GET_SHA1_ONLY_TO_DIE, prefix, sha1, &oc);
1637 1638
}

1639
int get_sha1_with_context(const char *str, unsigned flags, unsigned char *sha1, struct object_context *orc)
1640
{
1641 1642
	if (flags & GET_SHA1_FOLLOW_SYMLINKS && flags & GET_SHA1_ONLY_TO_DIE)
		die("BUG: incompatible flags for get_sha1_with_context");
1643
	return get_sha1_with_context_1(str, flags, NULL, sha1, orc);
1644
}