about summary refs log tree commit diff
path: root/third_party/git/sha1-name.c
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/git/sha1-name.c')
-rw-r--r--third_party/git/sha1-name.c87
1 files changed, 45 insertions, 42 deletions
diff --git a/third_party/git/sha1-name.c b/third_party/git/sha1-name.c
index 5bb006e5a9..2989e27b71 100644
--- a/third_party/git/sha1-name.c
+++ b/third_party/git/sha1-name.c
@@ -155,6 +155,7 @@ static void unique_in_pack(struct packed_git *p,
 			   struct disambiguate_state *ds)
 {
 	uint32_t num, i, first = 0;
+	const struct object_id *current = NULL;
 
 	if (p->multi_pack_index)
 		return;
@@ -172,10 +173,10 @@ static void unique_in_pack(struct packed_git *p,
 	 */
 	for (i = first; i < num && !ds->ambiguous; i++) {
 		struct object_id oid;
-		nth_packed_object_id(&oid, p, i);
-		if (!match_sha(ds->len, ds->bin_pfx.hash, oid.hash))
+		current = nth_packed_object_oid(&oid, p, i);
+		if (!match_sha(ds->len, ds->bin_pfx.hash, current->hash))
 			break;
-		update_candidates(ds, &oid);
+		update_candidates(ds, current);
 	}
 }
 
@@ -402,9 +403,9 @@ static int repo_collect_ambiguous(struct repository *r,
 	return collect_ambiguous(oid, data);
 }
 
-static int sort_ambiguous(const void *a, const void *b, void *ctx)
+static struct repository *sort_ambiguous_repo;
+static int sort_ambiguous(const void *a, const void *b)
 {
-	struct repository *sort_ambiguous_repo = ctx;
 	int a_type = oid_object_info(sort_ambiguous_repo, a, NULL);
 	int b_type = oid_object_info(sort_ambiguous_repo, b, NULL);
 	int a_type_sort;
@@ -433,7 +434,10 @@ static int sort_ambiguous(const void *a, const void *b, void *ctx)
 
 static void sort_ambiguous_oid_array(struct repository *r, struct oid_array *a)
 {
-	QSORT_S(a->oid, a->nr, sort_ambiguous, r);
+	/* mutex will be needed if this code is to be made thread safe */
+	sort_ambiguous_repo = r;
+	QSORT(a->oid, a->nr, sort_ambiguous);
+	sort_ambiguous_repo = NULL;
 }
 
 static enum get_oid_result get_short_oid(struct repository *r,
@@ -642,14 +646,14 @@ static void find_abbrev_len_for_pack(struct packed_git *p,
 	 */
 	mad->init_len = 0;
 	if (!match) {
-		if (!nth_packed_object_id(&oid, p, first))
+		if (nth_packed_object_oid(&oid, p, first))
 			extend_abbrev_len(&oid, mad);
 	} else if (first < num - 1) {
-		if (!nth_packed_object_id(&oid, p, first + 1))
+		if (nth_packed_object_oid(&oid, p, first + 1))
 			extend_abbrev_len(&oid, mad);
 	}
 	if (first > 0) {
-		if (!nth_packed_object_id(&oid, p, first - 1))
+		if (nth_packed_object_oid(&oid, p, first - 1))
 			extend_abbrev_len(&oid, mad);
 	}
 	mad->init_len = mad->cur_len;
@@ -907,21 +911,26 @@ static int get_oid_basic(struct repository *r, const char *str, int len,
 				real_ref, flags, at_time, nth, oid, NULL,
 				&co_time, &co_tz, &co_cnt)) {
 			if (!len) {
-				if (!skip_prefix(real_ref, "refs/heads/", &str))
+				if (starts_with(real_ref, "refs/heads/")) {
+					str = real_ref + 11;
+					len = strlen(real_ref + 11);
+				} else {
+					/* detached HEAD */
 					str = "HEAD";
-				len = strlen(str);
+					len = 4;
+				}
 			}
 			if (at_time) {
 				if (!(flags & GET_OID_QUIETLY)) {
-					warning(_("log for '%.*s' only goes back to %s"),
-						len, str,
+					warning("Log for '%.*s' only goes "
+						"back to %s.", len, str,
 						show_date(co_time, co_tz, DATE_MODE(RFC2822)));
 				}
 			} else {
 				if (flags & GET_OID_QUIETLY) {
 					exit(128);
 				}
-				die(_("log for '%.*s' only has %d entries"),
+				die("Log for '%.*s' only has %d entries.",
 				    len, str, co_cnt);
 			}
 		}
@@ -1154,22 +1163,13 @@ static enum get_oid_result get_oid_1(struct repository *r,
 	}
 
 	if (has_suffix) {
-		unsigned int num = 0;
+		int num = 0;
 		int len1 = cp - name;
 		cp++;
-		while (cp < name + len) {
-			unsigned int digit = *cp++ - '0';
-			if (unsigned_mult_overflows(num, 10))
-				return MISSING_OBJECT;
-			num *= 10;
-			if (unsigned_add_overflows(num, digit))
-				return MISSING_OBJECT;
-			num += digit;
-		}
+		while (cp < name + len)
+			num = num * 10 + *cp++ - '0';
 		if (!num && len1 == len - 1)
 			num = 1;
-		else if (num > INT_MAX)
-			return MISSING_OBJECT;
 		if (has_suffix == '^')
 			return get_parent(r, name, len1, oid, num);
 		/* else if (has_suffix == '~') -- goes without saying */
@@ -1289,7 +1289,7 @@ static int get_oid_oneline(struct repository *r,
 
 struct grab_nth_branch_switch_cbdata {
 	int remaining;
-	struct strbuf *sb;
+	struct strbuf buf;
 };
 
 static int grab_nth_branch_switch(struct object_id *ooid, struct object_id *noid,
@@ -1307,8 +1307,8 @@ static int grab_nth_branch_switch(struct object_id *ooid, struct object_id *noid
 		return 0;
 	if (--(cb->remaining) == 0) {
 		len = target - match;
-		strbuf_reset(cb->sb);
-		strbuf_add(cb->sb, match, len);
+		strbuf_reset(&cb->buf);
+		strbuf_add(&cb->buf, match, len);
 		return 1; /* we are done */
 	}
 	return 0;
@@ -1341,15 +1341,18 @@ static int interpret_nth_prior_checkout(struct repository *r,
 	if (nth <= 0)
 		return -1;
 	cb.remaining = nth;
-	cb.sb = buf;
+	strbuf_init(&cb.buf, 20);
 
 	retval = refs_for_each_reflog_ent_reverse(get_main_ref_store(r),
 			"HEAD", grab_nth_branch_switch, &cb);
 	if (0 < retval) {
+		strbuf_reset(buf);
+		strbuf_addbuf(buf, &cb.buf);
 		retval = brace - name + 1;
 	} else
 		retval = 0;
 
+	strbuf_release(&cb.buf);
 	return retval;
 }
 
@@ -1686,14 +1689,14 @@ static void diagnose_invalid_oid_path(struct repository *r,
 		prefix = "";
 
 	if (file_exists(filename))
-		die(_("path '%s' exists on disk, but not in '%.*s'"),
+		die("Path '%s' exists on disk, but not in '%.*s'.",
 		    filename, object_name_len, object_name);
 	if (is_missing_file_error(errno)) {
 		char *fullname = xstrfmt("%s%s", prefix, filename);
 
 		if (!get_tree_entry(r, tree_oid, fullname, &oid, &mode)) {
-			die(_("path '%s' exists, but not '%s'\n"
-			    "hint: Did you mean '%.*s:%s' aka '%.*s:./%s'?"),
+			die("Path '%s' exists, but not '%s'.\n"
+			    "Did you mean '%.*s:%s' aka '%.*s:./%s'?",
 			    fullname,
 			    filename,
 			    object_name_len, object_name,
@@ -1701,7 +1704,7 @@ static void diagnose_invalid_oid_path(struct repository *r,
 			    object_name_len, object_name,
 			    filename);
 		}
-		die(_("path '%s' does not exist in '%.*s'"),
+		die("Path '%s' does not exist in '%.*s'",
 		    filename, object_name_len, object_name);
 	}
 }
@@ -1729,8 +1732,8 @@ static void diagnose_invalid_index_path(struct repository *r,
 		ce = istate->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"
-			    "hint: Did you mean ':%d:%s'?"),
+			die("Path '%s' is in the index, but not at stage %d.\n"
+			    "Did you mean ':%d:%s'?",
 			    filename, stage,
 			    ce_stage(ce), filename);
 	}
@@ -1745,17 +1748,17 @@ static void diagnose_invalid_index_path(struct repository *r,
 		ce = istate->cache[pos];
 		if (ce_namelen(ce) == fullname.len &&
 		    !memcmp(ce->name, fullname.buf, fullname.len))
-			die(_("path '%s' is in the index, but not '%s'\n"
-			    "hint: Did you mean ':%d:%s' aka ':%d:./%s'?"),
+			die("Path '%s' is in the index, but not '%s'.\n"
+			    "Did you mean ':%d:%s' aka ':%d:./%s'?",
 			    fullname.buf, filename,
 			    ce_stage(ce), fullname.buf,
 			    ce_stage(ce), filename);
 	}
 
 	if (repo_file_exists(r, filename))
-		die(_("path '%s' exists on disk, but not in the index"), filename);
+		die("Path '%s' exists on disk, but not in the index.", filename);
 	if (is_missing_file_error(errno))
-		die(_("path '%s' does not exist (neither on disk nor in the index)"),
+		die("Path '%s' does not exist (neither on disk nor in the index).",
 		    filename);
 
 	strbuf_release(&fullname);
@@ -1768,7 +1771,7 @@ static char *resolve_relative_path(struct repository *r, const char *rel)
 		return NULL;
 
 	if (r != the_repository || !is_inside_work_tree())
-		die(_("relative path syntax can't be used outside working 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,
@@ -1906,7 +1909,7 @@ static enum get_oid_result get_oid_with_context_1(struct repository *repo,
 			return ret;
 		} else {
 			if (only_to_die)
-				die(_("invalid object name '%.*s'."), len, name);
+				die("Invalid object name '%.*s'.", len, name);
 		}
 	}
 	return ret;