git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* git-push: forced update of tag shows unabbreviated SHA1
@ 2008-01-31  9:27 Johannes Sixt
  2008-01-31  9:37 ` Junio C Hamano
  2008-01-31 10:06 ` Jeff King
  0 siblings, 2 replies; 9+ messages in thread
From: Johannes Sixt @ 2008-01-31  9:27 UTC (permalink / raw)
  To: Jeff King; +Cc: Git Mailing List

This is just a cosmetical flaw:

When a tag is changed to point to a new commit, then the tag is pushed to
a repo that still has the old tag, it is correctly pushed, but the old
SHA1 is reported with all 40 digits:

# make upstream repo
$ mkdir A && cd A
$ git init
$ echo a > a; git add a; git commit -m a

# clone, modify, push
$ cd ..
$ git clone A B
$ cd B
$ echo b > a; git commit -a -m b
$ git push file://$PWD/../A

# tag old state in upstream
$ cd ../A
$ git tag -m T T HEAD~1

# tag new state in clone (same name) and force-push tag
$ cd ../B
$ git tag -m Tclone T
$ git push -f file://$PWD/../A refs/tags/*:refs/tags/*
Counting objects: 1, done.
Unpacking objects: 100% (1/1), done.
Writing objects: 100% (1/1), 160 bytes, done.
Total 1 (delta 0), reused 0 (delta 0)
To file:///home/jsixt/tmp/foo/B/../A
 + 639669ce44f84417f30842c622064827dda01461...475e55f T -> T (forced update)

Notice that the original SHA1 is not abbreviated.

-- Hannes

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: git-push: forced update of tag shows unabbreviated SHA1
  2008-01-31  9:27 git-push: forced update of tag shows unabbreviated SHA1 Johannes Sixt
@ 2008-01-31  9:37 ` Junio C Hamano
  2008-01-31 10:01   ` Johannes Sixt
  2008-01-31 10:06 ` Jeff King
  1 sibling, 1 reply; 9+ messages in thread
From: Junio C Hamano @ 2008-01-31  9:37 UTC (permalink / raw)
  To: Johannes Sixt; +Cc: Jeff King, Git Mailing List

Johannes Sixt <j.sixt@viscovery.net> writes:

> This is just a cosmetical flaw:
> ...
> To file:///home/jsixt/tmp/foo/B/../A
>  + 639669ce44f84417f30842c622064827dda01461...475e55f T -> T (forced update)
>
> Notice that the original SHA1 is not abbreviated.

I suspect that is because you do not _have_ the original object,
so there is no uniquely usable abbreviation to name the object
in your repository.

This obviously is not tested at all (not even compile tested),
but I think it would show you what is going on.

---
 builtin-send-pack.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/builtin-send-pack.c b/builtin-send-pack.c
index 8afb1d0..9c558ee 100644
--- a/builtin-send-pack.c
+++ b/builtin-send-pack.c
@@ -265,7 +265,7 @@ static const char *status_abbrev(unsigned char sha1[20])
 {
 	const char *abbrev;
 	abbrev = find_unique_abbrev(sha1, DEFAULT_ABBREV);
-	return abbrev ? abbrev : sha1_to_hex(sha1);
+	return abbrev ? abbrev : "<you do not have it>";
 }
 
 static void print_ok_ref_status(struct ref *ref)

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: git-push: forced update of tag shows unabbreviated SHA1
  2008-01-31  9:37 ` Junio C Hamano
@ 2008-01-31 10:01   ` Johannes Sixt
  0 siblings, 0 replies; 9+ messages in thread
From: Johannes Sixt @ 2008-01-31 10:01 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Jeff King, Git Mailing List

Junio C Hamano schrieb:
> Johannes Sixt <j.sixt@viscovery.net> writes:
> 
>> This is just a cosmetical flaw:
>> ...
>> To file:///home/jsixt/tmp/foo/B/../A
>>  + 639669ce44f84417f30842c622064827dda01461...475e55f T -> T (forced update)
>>
>> Notice that the original SHA1 is not abbreviated.
> 
> I suspect that is because you do not _have_ the original object,
> so there is no uniquely usable abbreviation to name the object
> in your repository.

Yes, you are right. This also happens for a commit.

> This obviously is not tested at all (not even compile tested),
> but I think it would show you what is going on.
> 
> ---
>  builtin-send-pack.c |    2 +-
>  1 files changed, 1 insertions(+), 1 deletions(-)
> 
> diff --git a/builtin-send-pack.c b/builtin-send-pack.c
> index 8afb1d0..9c558ee 100644
> --- a/builtin-send-pack.c
> +++ b/builtin-send-pack.c
> @@ -265,7 +265,7 @@ static const char *status_abbrev(unsigned char sha1[20])
>  {
>  	const char *abbrev;
>  	abbrev = find_unique_abbrev(sha1, DEFAULT_ABBREV);
> -	return abbrev ? abbrev : sha1_to_hex(sha1);
> +	return abbrev ? abbrev : "<you do not have it>";
>  }

No, that would be information hiding. I prefer an unabbreviated name.
Nevertheless, if we know the name, we could be able to find a suitable
abbreviation. But it's really not *that* important...

-- Hannes

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: git-push: forced update of tag shows unabbreviated SHA1
  2008-01-31  9:27 git-push: forced update of tag shows unabbreviated SHA1 Johannes Sixt
  2008-01-31  9:37 ` Junio C Hamano
@ 2008-01-31 10:06 ` Jeff King
  2008-01-31 10:21   ` Junio C Hamano
  2008-01-31 10:27   ` Jeff King
  1 sibling, 2 replies; 9+ messages in thread
From: Jeff King @ 2008-01-31 10:06 UTC (permalink / raw)
  To: Johannes Sixt; +Cc: Git Mailing List

On Thu, Jan 31, 2008 at 10:27:43AM +0100, Johannes Sixt wrote:

> When a tag is changed to point to a new commit, then the tag is pushed to
> a repo that still has the old tag, it is correctly pushed, but the old
> SHA1 is reported with all 40 digits:

As Junio noted, this is because find_unique_abbrev returns NULL for
objects we don't have. Actually, it is somewhat worse -- we return an
erroneous abbreviation in the rare case that we are trying to find the
abbreviation for something we don't have, but for which we do have a
matching abbreviation. For example, if we have

  1234567890123456789012345678901234567890

then for every 12345678* that we don't have, we will claim the correct
abbreviation is 1234568.

In practice, I doubt this is a problem.

But getting back to your point: yes, I agree it is a little ugly.
Rewriting find_unique_abbrev would be necessary for fixing it, and I'm
not sure it is worth the trouble.

-Peff

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: git-push: forced update of tag shows unabbreviated SHA1
  2008-01-31 10:06 ` Jeff King
@ 2008-01-31 10:21   ` Junio C Hamano
  2008-01-31 10:39     ` Jeff King
  2008-01-31 10:27   ` Jeff King
  1 sibling, 1 reply; 9+ messages in thread
From: Junio C Hamano @ 2008-01-31 10:21 UTC (permalink / raw)
  To: Jeff King; +Cc: Johannes Sixt, Git Mailing List

Jeff King <peff@peff.net> writes:

> ... then for every 12345678* that we don't have, we will claim
> the correct abbreviation is 1234568.
>
> In practice, I doubt this is a problem.
>
> But getting back to your point: yes, I agree it is a little ugly.
> Rewriting find_unique_abbrev would be necessary for fixing it, and I'm
> not sure it is worth the trouble.

I think that needs to be done carefully.  I recall some callers
do expect it to return NULL for nonexistant objects, so the bug
you noted above as "rare case" may need to be fixed, which I
think is more important than coming up with a potentially too
short abbreviation.

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: git-push: forced update of tag shows unabbreviated SHA1
  2008-01-31 10:06 ` Jeff King
  2008-01-31 10:21   ` Junio C Hamano
@ 2008-01-31 10:27   ` Jeff King
  2008-01-31 10:38     ` Junio C Hamano
  1 sibling, 1 reply; 9+ messages in thread
From: Jeff King @ 2008-01-31 10:27 UTC (permalink / raw)
  To: Johannes Sixt; +Cc: Git Mailing List

On Thu, Jan 31, 2008 at 05:06:25AM -0500, Jeff King wrote:

> But getting back to your point: yes, I agree it is a little ugly.
> Rewriting find_unique_abbrev would be necessary for fixing it, and I'm
> not sure it is worth the trouble.

Actually, it looks like we already handle a similar case: the null sha1,
so the change isn't that big (and the null sha1 case folds nicely into
the "missing" case). With the (lightly tested) patch below,
find_unique_abbrev _always_ returns an answer, and for missing objects
will show enough characters that it doesn't match any existing object.

diff --git a/sha1_name.c b/sha1_name.c
index 13e1164..c0e6af1 100644
--- a/sha1_name.c
+++ b/sha1_name.c
@@ -192,26 +192,24 @@ static int get_short_sha1(const char *name, int len, unsigned char *sha1,
 
 const char *find_unique_abbrev(const unsigned char *sha1, int len)
 {
-	int status, is_null;
+	int status, missing;
 	static char hex[41];
 
-	is_null = is_null_sha1(sha1);
+	missing = !has_sha1_file(sha1);
 	memcpy(hex, sha1_to_hex(sha1), 40);
 	if (len == 40 || !len)
 		return hex;
 	while (len < 40) {
 		unsigned char sha1_ret[20];
 		status = get_short_sha1(hex, len, sha1_ret, 1);
-		if (!status ||
-		    (is_null && status != SHORT_NAME_AMBIGUOUS)) {
+		if ((!missing && !status) ||
+		    (missing && status == SHORT_NAME_NOT_FOUND)) {
 			hex[len] = 0;
 			return hex;
 		}
-		if (status != SHORT_NAME_AMBIGUOUS)
-			return NULL;
 		len++;
 	}
-	return NULL;
+	return hex;
 }
 
 static int ambiguous_path(const char *path, int len)

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: git-push: forced update of tag shows unabbreviated SHA1
  2008-01-31 10:27   ` Jeff King
@ 2008-01-31 10:38     ` Junio C Hamano
  2008-01-31 10:41       ` Jeff King
  0 siblings, 1 reply; 9+ messages in thread
From: Junio C Hamano @ 2008-01-31 10:38 UTC (permalink / raw)
  To: Jeff King; +Cc: Johannes Sixt, Git Mailing List

Jeff King <peff@peff.net> writes:

> On Thu, Jan 31, 2008 at 05:06:25AM -0500, Jeff King wrote:
>
>> But getting back to your point: yes, I agree it is a little ugly.
>> Rewriting find_unique_abbrev would be necessary for fixing it, and I'm
>> not sure it is worth the trouble.
>
> Actually, it looks like we already handle a similar case: the null sha1,
> so the change isn't that big (and the null sha1 case folds nicely into
> the "missing" case).

Heh, "Make sure to abbreviate something that does not match" ---
I forgot about that trick I did looooooooong time ago ;-).

I like the idea.  Does it not break anything?

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: git-push: forced update of tag shows unabbreviated SHA1
  2008-01-31 10:21   ` Junio C Hamano
@ 2008-01-31 10:39     ` Jeff King
  0 siblings, 0 replies; 9+ messages in thread
From: Jeff King @ 2008-01-31 10:39 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Johannes Sixt, Git Mailing List

On Thu, Jan 31, 2008 at 02:21:49AM -0800, Junio C Hamano wrote:

> I think that needs to be done carefully.  I recall some callers
> do expect it to return NULL for nonexistant objects, so the bug
> you noted above as "rare case" may need to be fixed, which I
> think is more important than coming up with a potentially too
> short abbreviation.

The patch I just posted just figures out ahead of time whether the
object exists. We can easily have it default to returning NULL but allow
a special flag for the new behavior. Something like:

diff --git a/builtin-send-pack.c b/builtin-send-pack.c
index 8afb1d0..454ad8f 100644
--- a/builtin-send-pack.c
+++ b/builtin-send-pack.c
@@ -263,9 +263,8 @@ static void print_ref_status(char flag, const char *summary, struct ref *to, str
 
 static const char *status_abbrev(unsigned char sha1[20])
 {
-	const char *abbrev;
-	abbrev = find_unique_abbrev(sha1, DEFAULT_ABBREV);
-	return abbrev ? abbrev : sha1_to_hex(sha1);
+	return find_unique_abbrev_flags(sha1, DEFAULT_ABBREV,
+			FIND_UNIQUE_ABBREV_MISSING);
 }
 
 static void print_ok_ref_status(struct ref *ref)
diff --git a/cache.h b/cache.h
index 7a38511..0bcbf54 100644
--- a/cache.h
+++ b/cache.h
@@ -383,7 +383,14 @@ extern char *git_path(const char *fmt, ...) __attribute__((format (printf, 1, 2)
 extern char *sha1_file_name(const unsigned char *sha1);
 extern char *sha1_pack_name(const unsigned char *sha1);
 extern char *sha1_pack_index_name(const unsigned char *sha1);
-extern const char *find_unique_abbrev(const unsigned char *sha1, int);
+
+#define FIND_UNIQUE_ABBREV_MISSING 1
+extern const char *find_unique_abbrev_flags(const unsigned char *sha1, int len, int flags);
+static inline const char *find_unique_abbrev(const unsigned char *sha1, int len)
+{
+	return find_unique_abbrev_flags(sha1, len, 0);
+}
+
 extern const unsigned char null_sha1[20];
 static inline int is_null_sha1(const unsigned char *sha1)
 {
diff --git a/sha1_name.c b/sha1_name.c
index a99aff3..666d36c 100644
--- a/sha1_name.c
+++ b/sha1_name.c
@@ -190,12 +190,15 @@ static int get_short_sha1(const char *name, int len, unsigned char *sha1,
 	return status;
 }
 
-const char *find_unique_abbrev(const unsigned char *sha1, int len)
+const char *find_unique_abbrev_flags(const unsigned char *sha1, int len,
+		int flags)
 {
 	int status, missing;
 	static char hex[41];
 
 	missing = !has_sha1_file(sha1);
+	if (missing && !(flags & FIND_UNIQUE_ABBREV_MISSING))
+		return NULL;
 	memcpy(hex, sha1_to_hex(sha1), 40);
 	if (len == 40 || !len)
 		return hex;

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: git-push: forced update of tag shows unabbreviated SHA1
  2008-01-31 10:38     ` Junio C Hamano
@ 2008-01-31 10:41       ` Jeff King
  0 siblings, 0 replies; 9+ messages in thread
From: Jeff King @ 2008-01-31 10:41 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Johannes Sixt, Git Mailing List

On Thu, Jan 31, 2008 at 02:38:37AM -0800, Junio C Hamano wrote:

> > Actually, it looks like we already handle a similar case: the null sha1,
> > so the change isn't that big (and the null sha1 case folds nicely into
> > the "missing" case).
> 
> Heh, "Make sure to abbreviate something that does not match" ---
> I forgot about that trick I did looooooooong time ago ;-).
> 
> I like the idea.  Does it not break anything?

No idea. :) I will hold onto it and submit a cleaned up version
post-1.5.4.

-Peff

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2008-01-31 10:41 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-01-31  9:27 git-push: forced update of tag shows unabbreviated SHA1 Johannes Sixt
2008-01-31  9:37 ` Junio C Hamano
2008-01-31 10:01   ` Johannes Sixt
2008-01-31 10:06 ` Jeff King
2008-01-31 10:21   ` Junio C Hamano
2008-01-31 10:39     ` Jeff King
2008-01-31 10:27   ` Jeff King
2008-01-31 10:38     ` Junio C Hamano
2008-01-31 10:41       ` Jeff King

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).