git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH] Offload most of cg-object-id to git-rev-parse

From
Jonas Fonseca <fonseca@diku.dk>
Date
Dec 11, 2005, 18:19 UTC
Message-ID
<20051211181901.GA2960@diku.dk>
In-Reply-To
<20051207213905.GA25890@diku.dk>
Signed-off-by: Jonas Fonseca <fonseca@diku.dk>
 
---
 Forget the other 4 patches. Here's one that fixes the thing we
 discussed on IRC, i.e. ambiguous ID's are handled correctly
 (unfortunately without giving a proper warning message).
 
 This one also assumes that there is no reason for checking revs
 returned by git-rev-list with git-rev-parse --revs-only.
 TODO         |    2 --
 cg-object-id |   58 ++++++++++++++++------------------------------------------
 2 files changed, 16 insertions(+), 44 deletions(-)
diff --git a/TODO b/TODO
index 0658b39..26bb4d0 100644
--- a/TODO
+++ b/TODO
@@ -27,8 +27,6 @@ cg-*patch should be pre-1.0.)
 
 	Includes merge-order cg-log and cg-diff checking for renames.
 
-* Offload most of cg-object-id to git-rev-parse
-
 * Show only first 12 (or so) nibbles of the hashes everywhere
 	Even this might be too much, but more than this is really useless
 	for anyone remotely human. And it's less scary, too.
diff --git a/cg-object-id b/cg-object-id
index 1628e93..49d6d99 100755
--- a/cg-object-id
+++ b/cg-object-id
@@ -40,54 +40,29 @@ deprecated_alias cg-object-id commit-id 
 normalize_id()
 {
 	local id="$1"
+	local revid=
+	local valid=
 
-	if [ "${id:(-1):1}" = "^" ]; then
-		# find first parent
-		normalize_id "${id%^}"
-		normid=$(git-cat-file commit "$normid" | \
-			 awk '/^parent/{print $2; exit};/^$/{exit}') || exit 1
-		type="commit"
-		return
-	fi
-
-	if [ ! "$id" ] || [ "$id" = "this" ] || [ "$id" = "HEAD" ]; then
-		read id < "$_git/$(git-symbolic-ref HEAD)"
-
-	elif [ -r "$_git/refs/tags/$id" ]; then
-		read id < "$_git/refs/tags/$id"
-
-	elif [ -r "$_git/refs/heads/$id" ]; then
-		read id < "$_git/refs/heads/$id"
-
-	elif [ -r "$_git/refs/$id" ]; then
-		read id < "$_git/refs/$id"
-
-	# Short id's must be lower case and at least 4 digits.
-	elif [[ "$id" == [0-9a-f][0-9a-f][0-9a-f][0-9a-f]* ]]; then
-		idpref=${id:0:2}
-		idpost=${id:2}
-
-		# Assign array elements to matching names
-		idmatch=($_git_objects/$idpref/$idpost*)
-
-		if [ ${#idmatch[*]} -eq 1 ] && [ -r "$idmatch" ]; then
-			exid=$idpref${idmatch#$_git_objects/$idpref/}
-			[ ${#exid} -eq 40 ] && [ "$(git-rev-parse --revs-only "$exid")" ] && id="$exid"
-		elif [ ${#idmatch[*]} -gt 1 ]; then
-			echo "Ambiguous id: $id" >&2
-			echo "${idmatch[@]}" >&2
-			exit 1
-		fi
+	if [ ! "$id" ] || [ "$id" = "this" ]; then
+		id=HEAD;
+	fi
+
+ 	revid="$(git-rev-parse --verify "$id^0" 2>/dev/null)"
+ 	if [ "$revid" ]; then
+ 		id="$revid"
+		valid=1
 	fi
 
-	valid=; [ ${#id} -eq 40 ] && [ "$(git-rev-parse --revs-only "$id")" ] && valid=1
 	# date does the wrong thing for empty and single-letter ids
 	if [ ${#id} -gt 1 ] && [ ! "$valid" ]; then
 		reqsecs=$(date --date="$id" +'%s' 2>/dev/null)
 
 		if [ "$reqsecs" ]; then
-			id=$(git-rev-list --min-age=$reqsecs --max-count=1 HEAD)
-			valid=; [ ${#id} -eq 40 ] && [ "$(git-rev-parse --revs-only "$id")" ] && valid=1
+			revid=$(git-rev-list --min-age=$reqsecs --max-count=1 HEAD)
+			if [ ${#revid} -eq 40 ]; then
+				id="$revid"
+				valid=1
+			fi
 		fi
 	fi
 
@@ -147,7 +122,7 @@ fi
 
 
 if [ "$show_parent" ]; then
-	git-cat-file commit "$normid" | awk '/^parent/{print $2};/^$/{exit}'
+	git-rev-parse "$normid^"
 	exit 0
 fi
 
@@ -170,4 +145,3 @@ else
 fi
 
 echo $normid
-
-- 
Jonas Fonseca
Previous: Jonas FonsecaNext: Jonas Fonseca
Message 2 of 3 in “Offload most of cg-object-id to git-rev-parse”
  1. Offload most of cg-object-id to git-rev-parseJonas Fonseca, Dec 7, 2005
  2. Offload most of cg-object-id to git-rev-parseJonas Fonseca, Dec 11, 2005
  3. cg-object-id: use git-rev-parse(1) for date parsingJonas Fonseca, Dec 11, 2005

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.