All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jeff King <peff@peff.net>
To: Tom Grennan <tmgrennan@gmail.com>
Cc: git@vger.kernel.org, gitster@pobox.com, jasampler@gmail.com
Subject: Re: [PATCHv3] tag: add --points-at list option
Date: Wed, 8 Feb 2012 13:57:50 -0500	[thread overview]
Message-ID: <20120208185750.GA22220@sigill.intra.peff.net> (raw)
In-Reply-To: <20120208184332.GF6264@tgrennan-laptop>

On Wed, Feb 08, 2012 at 10:43:32AM -0800, Tom Grennan wrote:

> >Though we provide a null_sha1 global already. So doing:
> >
> >  const unsigned char *tagged_sha1 = null_sha1;
> >
> >would be sufficient.
> 
> Or just initialize at test tagged_sha1 with NULL.

Oh yeah, that is even better.

> >That being said, I don't know why you want to do both lookups in the
> >same loop of the points_at. If it's a lightweight tag and the tag
> >matches, you can get away with not parsing the object at all (although
> >to be fair, that is the minority case, so it is unlikely to matter).
> 
> Yes, I think your saying that the lightweight search could go before the
> tag object search like this.

Exactly, though:

> static const unsigned char *match_points_at(const unsigned char *sha1)
> {
> 	const unsigned char *tagged_sha1 = NULL;
> 	struct object *obj = parse_object(sha1);
> 
> 	if (sha1_array_lookup(&points_at, sha1) >= 0)
> 		return sha1;
> 	if (obj && obj->type == OBJ_TAG)
> 		tagged_sha1 = ((struct tag *)obj)->tagged->sha1;

You can delay the relatively expensive parse_object until you find the
results of the first lookup (though like I said earlier, it is unlikely to
matter, as it only helps in the positive-match case. Out of N tags, you
will likely end up parsing N-1 of them anyway).

> >Also, should we be producing an error if !obj? It would indicate a tag
> >that points to a bogus object.
> 
> I think the test of (obj) is redundant as this should be caught
> by get_sha1() in parse_opt_points_at()

No, it's not redundant. get_sha1 is purely about looking up the name and
finding a sha1. parse_object is about looking up the object represented
by that sha1 in the object db. get_sha1 can sometimes involve parsing
objects (e.g., looking for "foo^1" will need to parse the commit object
at "foo"),  but does not have to.

Besides which, you are not calling parse_object on the sha1 from
--points-at, but rather the sha1 for each tag ref given to us by
for_each_tag_ref.

> >Why write your own linear search? sha1_array_lookup will do a binary
> >search for you.
> 
> Well, it's only a linear search of the points_at command arguments.
> But by that reasoning, might as well do two sha1_array_lookups like
> above and save some code b/c "less code is always better"(TM).

Right. I expect the N to be small in this case, so I doubt it matters.
But two sha1_array_lookups is still asymptotically smaller, because the
expensive operation is hashcmp(). So two binary searches is O(2*lg n),
whereas a linear walk with 2 hashcmps per item is O(2*n).

> >Other than that, the patch looks OK to me.
> 
> Thanks, I'll send what I hope to be the final version later today.

Thanks for working on this and being so responsive to review.

-Peff

  reply	other threads:[~2012-02-08 18:57 UTC|newest]

Thread overview: 53+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-02-05 22:28 [RFC/PATCH] tag: add --points-at list option Tom Grennan
2012-02-05 23:31 ` Junio C Hamano
2012-02-06  5:48   ` Tom Grennan
2012-02-06  6:25     ` Junio C Hamano
2012-02-06  6:45       ` Tom Grennan
2012-02-06  0:04 ` Jeff King
2012-02-06  6:32   ` Tom Grennan
2012-02-06  7:04     ` Jeff King
2012-02-06  7:13       ` Jeff King
2012-02-06  7:45         ` Jeff King
2012-02-06  8:11           ` Jeff King
2012-02-06  8:13             ` [PATCH 1/3] tag: fix output of "tag -n" when errors occur Jeff King
2012-02-06  8:13             ` [PATCH 2/3] tag: die when listing missing or corrupt objects Jeff King
2012-02-06  8:32               ` Junio C Hamano
2012-02-06  8:34                 ` Jeff King
2012-02-06  8:36                 ` Junio C Hamano
2012-02-06  8:38                   ` Jeff King
2012-02-06 18:04                     ` Junio C Hamano
2012-02-06 18:13                     ` Junio C Hamano
2012-02-06 20:12                       ` Jeff King
2012-02-06 23:34                         ` Junio C Hamano
2012-02-08 21:01                       ` Jeff King
2012-02-09  4:33                         ` Junio C Hamano
2012-02-06  8:14             ` [PATCH 3/3] tag: don't show non-tag contents with "-n" Jeff King
2012-02-07  7:01             ` [PATCHv2] tag: add --points-at list option Tom Grennan
2012-02-07  7:01             ` Tom Grennan
2012-02-07  8:35               ` Junio C Hamano
2012-02-07 18:05                 ` Tom Grennan
2012-02-07 16:05               ` Jeff King
2012-02-07 19:02                 ` Tom Grennan
2012-02-07 19:12                   ` Jeff King
2012-02-07 19:22                     ` Tom Grennan
2012-02-07 19:36                       ` Jeff King
2012-02-07 20:20                         ` Junio C Hamano
2012-02-07 21:30                           ` Jeff King
2012-02-07 22:08                             ` Tom Grennan
2012-02-08  0:25                               ` Jeff King
2012-02-08  1:45                                 ` Tom Grennan
2012-02-08 15:31                                   ` Jeff King
2012-02-08  6:21                                 ` [PATCHv3] " Tom Grennan
2012-02-08  6:21                                 ` Tom Grennan
2012-02-08 15:44                                   ` Jeff King
2012-02-08 18:43                                     ` Tom Grennan
2012-02-08 18:57                                       ` Jeff King [this message]
2012-02-08 20:12                                         ` [PATCHv4] " Tom Grennan
2012-02-08 20:12                                         ` Tom Grennan
2012-02-08 20:58                                           ` Jeff King
2012-02-08 22:15                                             ` Tom Grennan
2012-02-08 23:03                                             ` [PATCH-master] " Tom Grennan
2012-02-08 23:03                                             ` Tom Grennan
2012-02-09  1:44                                               ` Jeff King
2012-02-09  4:29                                                 ` Junio C Hamano
2012-02-08 18:58                                       ` [PATCHv3] " Tom Grennan

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=20120208185750.GA22220@sigill.intra.peff.net \
    --to=peff@peff.net \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=jasampler@gmail.com \
    --cc=tmgrennan@gmail.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.