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

Re: [PATCH 1/1] commit-reach: properly peel tags

From
Jeff King <peff@peff.net>
Date
Sep 12, 2018, 21:34 UTC
Message-ID
<20180912213407.GA27598@sigill.intra.peff.net>
In-Reply-To
<xmqqpnxijtpd.fsf@gitster-ct.c.googlers.com>
On Wed, Sep 12, 2018 at 02:23:42PM -0700, Junio C Hamano wrote:
Show 29 quoted lines
> > diff --git a/commit-reach.c b/commit-reach.c
> > index 86715c103c..6de72c6e03 100644
> > --- a/commit-reach.c
> > +++ b/commit-reach.c
> > @@ -544,20 +544,31 @@ int can_all_from_reach_with_flag(struct object_array *from,
> >  {
> >  	struct commit **list = NULL;
> >  	int i;
> > +	int nr_commits;
> >  	int result = 1;
> >  
> >  	ALLOC_ARRAY(list, from->nr);
> > +	nr_commits = 0;
> >  	for (i = 0; i < from->nr; i++) {
> > -		list[i] = (struct commit *)from->objects[i].item;
> > +		struct object *from_one = from->objects[i].item;
> >  
> > -		if (parse_commit(list[i]) ||
> > -		    list[i]->generation < min_generation)
> > -			return 0;
> > +		from_one = deref_tag(the_repository, from_one,
> > +				     "a from object", 0);
> > +		if (!from_one || from_one->type != OBJ_COMMIT) {
> > +			from->objects[i].item->flags |= assign_flag;
> 
> I wondered why this is not futzing with "from_one->flags"; by going
> back to the original from->objects[] array, the code is setting the
> flags on the original tag object and not the non-commit object that
> was pointed at by the tag.
Note that from_one may even be NULL.
Show 26 quoted lines
> > +			continue;
> > +		}
> > +
> > +		list[nr_commits] = (struct commit *)from_one;
> > +		if (parse_commit(list[nr_commits]) ||
> > +		    list[nr_commits]->generation < min_generation)
> > +			return 0; /* is this a leak? */
> > +		nr_commits++;
> >  	}
> 
> In the original code, the flags bits were left unchanged if the loop
> terminated by hitting a commit whose generation is too young (or
> parse_commit() returns non-zero).  With this updated code, flags bit
> can be modified before the code notices the situation and leave the
> function, bypassing the "cleanup" we see below that clears the
> "assign_flag" bits.
> 
> Would it be a problem that we return early without cleaning up?
> 
> Even if we do not call this early return, the assign_flag bits added
> to the original tag in from->objects[i].item won't be cleaned in
> this new code, as "cleanup:" section now loops over the list[] that
> omits the object whose flags was smudged above before the "continue".
> 
> Would it be a problem that we leave the assign_flags without
> cleaning up?

Yeah, I hadn't thought about the bit cleanup when making my original suggestion. In the original code (before 4fbcca4eff), I think we did set flags as we iterated through the loop, and we could still do an early return when we hit "!reachable(...)". But I don't see any cleanup of assign_flag there at all.

So I guess I'm pretty confused about what the semantics are supposed to be.

-Peff
Previous: Junio C HamanoNext: Derrick Stolee via GitGitGadget
Message 5 of 25 in “Properly peel tags in can_all_from_reach_with_flags()”
  1. 0/1 Properly peel tags in can_all_from_reach_with_flags()Derrick Stolee via GitGitGadget, Sep 12, 2018
  2. 1/1 commit-reach: properly peel tagsDerrick Stolee via GitGitGadget, Sep 12, 2018
  3. Jeff KingSep 12, 2018
  4. Junio C HamanoSep 12, 2018
  5. Jeff KingSep 12, 2018
  6. 0/1 Properly peel tags in can_all_from_reach_with_flags()Derrick Stolee via GitGitGadget, Sep 13, 2018
  7. 1/1 commit-reach: properly peel tagsDerrick Stolee via GitGitGadget, Sep 13, 2018
  8. Derrick StoleeSep 13, 2018
  9. Junio C HamanoSep 13, 2018
  10. 0/2 Properly peel tags in can_all_from_reach_with_flags()Derrick Stolee via GitGitGadget, Sep 21, 2018
  11. 1/2 commit-reach: properly peel tagsDerrick Stolee via GitGitGadget, Sep 21, 2018
  12. Jeff KingSep 21, 2018
  13. Derrick StoleeSep 24, 2018
  14. 2/2 commit-reach: fix memory and flag leaksDerrick Stolee via GitGitGadget, Sep 21, 2018
  15. Jeff KingSep 21, 2018
  16. Derrick StoleeSep 24, 2018
  17. Jeff KingSep 24, 2018
  18. 0/1 Properly peel tags in can_all_from_reach_with_flags()Derrick Stolee via GitGitGadget, Sep 24, 2018
  19. 1/1 commit-reach: properly peel tags and clear flagsDerrick Stolee via GitGitGadget, Sep 24, 2018
  20. Jeff KingSep 24, 2018
  21. Eric SunshineSep 25, 2018
  22. commit-reach: cleanups in can_all_from_reach...Derrick Stolee, Sep 25, 2018
  23. Junio C HamanoSep 25, 2018
  24. Derrick StoleeSep 25, 2018
  25. Junio C HamanoSep 25, 2018

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.