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

[PATCH 7/4] submodule: clarify logic in show_submodule_summary

From
Jeff King <peff@peff.net>
Date
Mar 22, 2013, 16:19 UTC
Message-ID
<20130322161955.GA25857@sigill.intra.peff.net>
In-Reply-To
<20130322161837.GG3083@sigill.intra.peff.net>

There are two uses of the "left" and "right" commit variables that make it hard to be sure what values they have (both for the reader, and for gcc, which wrongly complains that they might be used uninitialized).

The functions starts with a cascading if statement, checking that the input sha1s exist, and finally working up to preparing a revision walk. We only prepare the walk if the cascading conditional did not find any problems, which we check by seeing whether it set the "message" variable or not. It's simpler and more obvious to just add a condition to the end of the cascade.

Later, we check the same "message" variable when deciding whether to clear commit marks on the left/right commits; if it is set, we presumably never started the walk. This is wrong, though; we might have started the walk and munged commit flags, only to encounter an error afterwards. We should always clear the flags on left/right if they exist, whether the walk was successful or not.

Signed-off-by: Jeff King <peff@peff.net>
---
 submodule.c | 13 ++++++-------
 1 file changed, 6 insertions(+), 7 deletions(-)
diff --git a/submodule.c b/submodule.c
index 9ba1496..975bc87 100644
--- a/submodule.c
+++ b/submodule.c
@@ -261,7 +261,7 @@ void show_submodule_summary(FILE *f, const char *path,
 		const char *del, const char *add, const char *reset)
 {
 	struct rev_info rev;
-	struct commit *left = left, *right = right;
+	struct commit *left = NULL, *right = NULL;
 	const char *message = NULL;
 	struct strbuf sb = STRBUF_INIT;
 	int fast_forward = 0, fast_backward = 0;
@@ -275,10 +275,8 @@ void show_submodule_summary(FILE *f, const char *path,
 	else if (!(left = lookup_commit_reference(one)) ||
 		 !(right = lookup_commit_reference(two)))
 		message = "(commits not present)";
-
-	if (!message &&
-	    prepare_submodule_summary(&rev, path, left, right,
-					&fast_forward, &fast_backward))
+	else if (prepare_submodule_summary(&rev, path, left, right,
+					   &fast_forward, &fast_backward))
 		message = "(revision walker failed)";
 
 	if (dirty_submodule & DIRTY_SUBMODULE_UNTRACKED)
@@ -302,11 +300,12 @@ void show_submodule_summary(FILE *f, const char *path,
 		strbuf_addf(&sb, "%s:%s\n", fast_backward ? " (rewind)" : "", reset);
 	fwrite(sb.buf, sb.len, 1, f);
 
-	if (!message) {
+	if (!message) /* only NULL if we succeeded in setting up the walk */
 		print_submodule_summary(&rev, f, del, add, reset);
+	if (left)
 		clear_commit_marks(left, ~0);
+	if (right)
 		clear_commit_marks(right, ~0);
-	}
 
 	strbuf_release(&sb);
 }
-- 
1.8.2.13.g0f18d3c
Previous: Jeff KingNext: Junio C Hamano
Message 30 of 42 in “drop some "int x = x" hacks to silence gcc warnings”
  1. 0/4 drop some "int x = x" hacks to silence gcc warningsJeff King, Mar 21, 2013
  2. 1/4 wt-status: fix possible use of uninitialized variableJeff King, Mar 21, 2013
  3. Jonathan NiederMar 21, 2013
  4. Junio C HamanoMar 21, 2013
  5. Jonathan NiederMar 21, 2013
  6. Jeff KingMar 22, 2013
  7. 2/4 fast-import: use pointer-to-pointer to keep list tailJeff King, Mar 21, 2013
  8. Jonathan NiederMar 21, 2013
  9. 3/4 drop some obsolete "x = x" compiler warning hacksJeff King, Mar 21, 2013
  10. Erik Faye-LundMar 21, 2013
  11. Jonathan NiederMar 21, 2013
  12. Torsten BögershausenMar 24, 2013
  13. 4/4 transport: drop "int cmp = cmp" hackJeff King, Mar 21, 2013
  14. Jonathan NiederMar 21, 2013
  15. Junio C HamanoMar 24, 2013
  16. Jeff KingMar 24, 2013
  17. Torsten BögershausenMar 24, 2013
  18. Junio C HamanoMar 25, 2013
  19. Jeff KingMar 25, 2013
  20. Junio C HamanoMar 25, 2013
  21. Johannes SixtMar 21, 2013
  22. Jeff KingMar 21, 2013
  23. Junio C HamanoMar 21, 2013
  24. Junio C HamanoMar 21, 2013
  25. Jeff KingMar 21, 2013
  26. 5/4 fast-import: clarify "inline" logic in file_change_mJeff King, Mar 21, 2013
  27. 6/4 run-command: always set failed_errno in start_commandJeff King, Mar 21, 2013
  28. Jonathan NiederMar 21, 2013
  29. Jeff KingMar 22, 2013
  30. 7/4 submodule: clarify logic in show_submodule_summaryJeff King, Mar 22, 2013
  31. Junio C HamanoMar 22, 2013
  32. 8/4 match-trees: drop "x = x" initializationsJeff King, Mar 22, 2013
  33. Junio C HamanoMar 22, 2013
  34. Junio C HamanoMar 22, 2013
  35. Jeff KingMar 22, 2013
  36. René ScharfeMar 23, 2013
  37. Junio C HamanoMar 24, 2013
  38. Jeff KingMar 24, 2013
  39. René ScharfeMar 24, 2013
  40. Junio C HamanoMar 25, 2013
  41. Joachim SchmitzMar 21, 2013
  42. Joachim SchmitzMar 21, 2013

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.