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

Re: [PATCH 1/5] Introduces for_each_revision() helper

From
Andy Whitcroft <apw@shadowen.org>
Date
Apr 26, 2007, 19:59 UTC
Message-ID
<46310485.8070605@shadowen.org>
In-Reply-To
<11776168001048-git-send-email-lcapitulino@mandriva.com.br>
Luiz Fernando N Capitulino wrote:
Show 53 quoted lines
> This macro may be used to iterate over revisions, so, instead of
> doing:
> 
> 	struct commit *commit;
> 
> 	...
> 
> 	prepare_revision_walk(rev);
> 	while ((commit = get_revision(rev)) != NULL) {
> 		...
> 	}
> 
> New code should use:
> 
> 	struct commit *commit;
> 
> 	...
> 
> 	for_each_revision(commit, rev) {
> 		...
> 	}
> 
>  The only disadvantage is that it's something magical, and the fact that
> it returns a struct commit is not obvious.
> 
>  On the other hand it's documented, has the advantage of making the walking
> through revisions easier and can save some lines of code.
> 
> Signed-off-by: Luiz Fernando N Capitulino <lcapitulino@mandriva.com.br>
> ---
>  revision.h |   11 +++++++++++
>  1 files changed, 11 insertions(+), 0 deletions(-)
> 
> diff --git a/revision.h b/revision.h
> index cdf94ad..bb6f475 100644
> --- a/revision.h
> +++ b/revision.h
> @@ -133,4 +133,15 @@ extern void add_object(struct object *obj,
>  extern void add_pending_object(struct rev_info *revs, struct object *obj, const char *name);
>  extern void add_pending_object_with_mode(struct rev_info *revs, struct object *obj, const char *name, unsigned mode);
>  
> +/* helpers */
> +
> +/**
> + * for_each_revision	-	iterate over revisions
> + * @commit:	pointer to a commit object returned for each iteration
> + * @rev:	revision pointer
> + */
> +#define for_each_revision(commit, rev) \
> +	prepare_revision_walk(rev);    \
> +	while ((commit = get_revision(rev)) != NULL)
> +
>  #endif

If this is constructed like that then I would expect the code below to be miss-compiled:

	if (condition)
		for_each_revision(commit, rev) {
		}
As it would be effectivly be:
	if (condition)
		prepare_revision_walk(rev);
	while ((commit = get_revision(rev)) != NULL) {
	}
I think you'd want this to be something more like:
#define for_each_revision(commit, rev) \
	for (prepare_revision_walk(rev); \
		(commit = get_revision(rev))) != NULL); ) {
-apw
Previous: Luiz Fernando N CapitulinoNext: Luiz Fernando N. Capitulino
Message 3 of 15 in “RFC: for_each_revision() helper”
  1. 0/5 RFC: for_each_revision() helperLuiz Fernando N Capitulino, Apr 26, 2007
  2. 1/5 Introduces for_each_revision() helperLuiz Fernando N Capitulino, Apr 26, 2007
  3. Andy WhitcroftApr 26, 2007
  4. Luiz Fernando N. CapitulinoApr 26, 2007
  5. 2/5 builtin-fmt-merge-msg.c: Use for_each_revision() helperLuiz Fernando N Capitulino, Apr 26, 2007
  6. 3/5 reachable.c: Use for_each_revision() helperLuiz Fernando N Capitulino, Apr 26, 2007
  7. 4/5 builtin-shortlog.c: Use for_each_revision() helperLuiz Fernando N Capitulino, Apr 26, 2007
  8. 5/5 builtin-log.c: Use for_each_revision() helperLuiz Fernando N Capitulino, Apr 26, 2007
  9. Hermes TrismegistoApr 26, 2007
  10. Sam RavnborgApr 26, 2007
  11. Luiz Fernando N. CapitulinoApr 26, 2007
  12. Luiz Fernando N. CapitulinoApr 26, 2007
  13. Junio C HamanoApr 26, 2007
  14. Luiz Fernando N. CapitulinoApr 27, 2007
  15. Junio C HamanoApr 27, 2007

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.