git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Jonas Fonseca <fonseca@diku.dk>
To: Petr Baudis <pasky@ucw.cz>, git@vger.kernel.org
Subject: [PATCH] Offload most of cg-object-id to git-rev-parse
Date: Sun, 11 Dec 2005 19:19:01 +0100	[thread overview]
Message-ID: <20051211181901.GA2960@diku.dk> (raw)
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

  reply	other threads:[~2005-12-11 18:19 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-12-07 21:39 [PATCH] Offload most of cg-object-id to git-rev-parse Jonas Fonseca
2005-12-11 18:19 ` Jonas Fonseca [this message]
2005-12-11 18:31   ` [PATCH] cg-object-id: use git-rev-parse(1) for date parsing Jonas Fonseca

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20051211181901.GA2960@diku.dk \
    --to=fonseca@diku.dk \
    --cc=git@vger.kernel.org \
    --cc=pasky@ucw.cz \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).