"GOT", but the "O" is a cute, smiling pufferfish. Index | Thread | Search

From:
Stefan Sperling <stsp@stsp.name>
Subject:
Re: tog log: make ^L stick to current branch
To:
Christian Weisgerber <naddy@mips.inka.de>
Cc:
gameoftrees@openbsd.org
Date:
Sat, 5 Dec 2020 22:21:06 +0100

Download raw body.

Thread
On Sat, Dec 05, 2020 at 09:26:56PM +0100, Christian Weisgerber wrote:
> Stefan Sperling:
> 
> >   got up -b main
> >   tog log -c mybranch
> > -> tog now displays commits starting at 'mybranch'
> >   ^L
> > -> tog now displays commits starting at 'main' instead of 'mybranch'
> 
> Here's another variant of this problem which your diff also fixes:
> 
>   cd repo.git
>   tog log -c mybranch
> -> tog now displays commits starting at 'mybranch'
>   ^L
> -> tog now displays commits starting at 'main' instead of 'mybranch'
> 
> > This patch fixes the problem. If a reference is passed to the -c option,
> > remember this reference instead of the work tree's current branch.
> 
> Yes.  But now this happens:
> 
>   tog log -c 0.44
>   ^L
>   tog: bad object data

Wonderful! You have triggered a bug in got_repo_object_match_tag().
This function does not work correctly if its input is an absolute reference
name such as "refs/tags/0.44". It only works for input like "0.44".

Here's my proposed fix:

diff 5a8b5076742038c09dece0c1e59ecddf8cd7a41a /home/stsp/src/got
blob - e604a6980724929b924f7abf1a893dcaafca0590
file + lib/repository.c
--- lib/repository.c
+++ lib/repository.c
@@ -1502,6 +1502,7 @@ got_repo_object_match_tag(struct got_tag_object **tag,
 	struct got_reflist_head refs;
 	struct got_reflist_entry *re;
 	struct got_object_id *tag_id;
+	int name_is_absolute = (strncmp(name, "refs/", 5) == 0);
 
 	SIMPLEQ_INIT(&refs);
 	*tag = NULL;
@@ -1515,7 +1516,8 @@ got_repo_object_match_tag(struct got_tag_object **tag,
 		refname = got_ref_get_name(re->ref);
 		if (got_ref_is_symbolic(re->ref))
 			continue;
-		refname += strlen("refs/tags/");
+		if (!name_is_absolute)
+			refname += strlen("refs/tags/");
 		if (strcmp(refname, name) != 0)
 			continue;
 		err = got_ref_resolve(&tag_id, repo, re->ref);