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

Re: [PATCH 01/22] sequencer: use repository parameter in short_commit_name()

From
Jeff King <peff@peff.net>
Date
Aug 29, 2023, 00:48 UTC
Message-ID
<20230829004801.GA3876652@coredump.intra.peff.net>
In-Reply-To
<xmqqsf82g65k.fsf@gitster.g>
On Mon, Aug 28, 2023 at 03:21:11PM -0700, Junio C Hamano wrote:
Show 16 quoted lines
> > @@ -3172,7 +3171,8 @@ static int walk_revs_populate_todo(struct todo_list *todo_list,
> >  		item->offset_in_buf = todo_list->buf.len;
> >  		subject_len = find_commit_subject(commit_buffer, &subject);
> >  		strbuf_addf(&todo_list->buf, "%s %s %.*s\n", command_string,
> > -			short_commit_name(commit), subject_len, subject);
> > +			short_commit_name(opts->revs->repo, commit),
> > +			subject_len, subject);
> >  		repo_unuse_commit_buffer(the_repository, commit,
> >  					 commit_buffer);
> 
> But how do we ascertain that opts->revs->repo is always safe to use
> (iow initialized to a sensible value)?  repo_init_revisions() takes
> a repository as its parameter and the first thing it does is to set
> it to the revs->repo, so it is safe for any "struct rev_info" that
> came from there, but REV_INFO_INIT omits initializer for the .repo
> member.

I mostly just assumed it would have been initialized, because passing in anything else and expecting it to work is a bit crazy. REV_INFO_INIT specifically says:

   * This will not fully initialize a "struct rev_info", the
   * repo_init_revisions() function needs to be called before
   * setup_revisions() and any revision walking takes place.

and then goes on to explain that the point is just so you can "goto cleanup" and free it if you never made it to the init_revisions() call. So the code would already be pretty buggy in this case.

That said, all of the code paths here do call repo_init_revisions(), so I think it is OK. But if we want to make the patch simple and more obviously correct, I would prefer to just blindly use the_repository in callers that don't have a "struct repository" themselves. Then we know it's a strict step forward (if slightly smaller), and we can leave the refactoring of the rest of the sequencer code for another day. I was trying hard to draw a reasonable line and not get this already-large series derailed by only semi-related refactoring.

Show 6 quoted lines
> The other two calls in this loop refer to the_repository so the
> current code would be safe even if opts->revs->repo is set or NULL,
> but that will no longer be true with the updated code.  I'd feel
> safer if at the beginning of the function we create a local variable
> "struct rev_info *repo" that is initialized to opts->revs->repo and
> use it throughout the function instead of the_repository.

I'm not sure how that makes it any safer, as it would mean using the suspect repo pointer in more places. Unless you are proposing to do:

  struct repository *r = opts->revs->repo;
  if (!r)
	r = the_repository; /* or BUG() ? */
-Peff
Previous: Taylor BlauNext: Junio C Hamano
Message 5 of 59 in “YAUPS: Yet Another Unused Parameter Series”
  1. 0/22 YAUPS: Yet Another Unused Parameter SeriesJeff King, Aug 28, 2023
  2. 01/22 sequencer: use repository parameter in short_commit_name()Jeff King, Aug 28, 2023
  3. Junio C HamanoAug 28, 2023
  4. Taylor BlauAug 28, 2023
  5. Jeff KingAug 29, 2023
  6. Junio C HamanoAug 29, 2023
  7. 02/22 sequencer: mark repository argument as unusedJeff King, Aug 28, 2023
  8. Taylor BlauAug 28, 2023
  9. Phillip WoodAug 29, 2023
  10. Jeff KingAug 29, 2023
  11. Phillip WoodAug 30, 2023
  12. 04/22 pack-bitmap: mark unused parameters in show_object callbackJeff King, Aug 28, 2023
  13. 03/22 ref-filter: mark unused parameters in parser callbacksJeff King, Aug 28, 2023
  14. 08/22 stash: mark unused parameter in diff callbackJeff King, Aug 28, 2023
  15. 05/22 worktree: mark unused parameters in each_ref_fn callbackJeff King, Aug 28, 2023
  16. 06/22 commit-graph: mark unused data parameters in generation callbacksJeff King, Aug 28, 2023
  17. Taylor BlauAug 28, 2023
  18. Jeff KingAug 29, 2023
  19. 07/22 ls-tree: mark unused parameter in callbackJeff King, Aug 28, 2023
  20. 09/22 trace2: mark unused us_elapsed_absolute parametersJeff King, Aug 28, 2023
  21. 11/22 test-trace2: mark unused argv/argc parametersJeff King, Aug 28, 2023
  22. 12/22 grep: mark unused parameter in output functionJeff King, Aug 28, 2023
  23. 14/22 negotiator/noop: mark unused callback parametersJeff King, Aug 28, 2023
  24. 10/22 trace2: mark unused config callback parameterJeff King, Aug 28, 2023
  25. 13/22 add-interactive: mark unused callback parametersJeff King, Aug 28, 2023
  26. 15/22 worktree: mark unused parameters in noop repair callbackJeff King, Aug 28, 2023
  27. 16/22 imap-send: mark unused parameters with NO_OPENSSLJeff King, Aug 28, 2023
  28. 17/22 grep: mark unused parmaeters in pcre fallbacksJeff King, Aug 28, 2023
  29. 18/22 credential: mark unused parameter in urlmatch callbackJeff King, Aug 28, 2023
  30. 19/22 fetch: mark unused parameter in ref_transaction callbackJeff King, Aug 28, 2023
  31. 20/22 bundle-uri: mark unused parameters in callbacksJeff King, Aug 28, 2023
  32. 22/22 update-ref: mark unused parameter in parser callbacksJeff King, Aug 28, 2023
  33. 21/22 gc: mark unused descriptors in scheduler callbacksJeff King, Aug 28, 2023
  34. Taylor BlauAug 28, 2023
  35. 0/22 Yet Another Unused Parameter SeriesJeff King, Aug 29, 2023
  36. 01/22 sequencer: use repository parameter in short_commit_name()Jeff King, Aug 29, 2023
  37. Phillip WoodAug 30, 2023
  38. 02/22 sequencer: mark repository argument as unusedJeff King, Aug 29, 2023
  39. 03/22 ref-filter: mark unused parameters in parser callbacksJeff King, Aug 29, 2023
  40. 04/22 pack-bitmap: mark unused parameters in show_object callbackJeff King, Aug 29, 2023
  41. 06/22 commit-graph: mark unused data parameters in generation callbacksJeff King, Aug 29, 2023
  42. 07/22 ls-tree: mark unused parameter in callbackJeff King, Aug 29, 2023
  43. 05/22 worktree: mark unused parameters in each_ref_fn callbackJeff King, Aug 29, 2023
  44. 08/22 stash: mark unused parameter in diff callbackJeff King, Aug 29, 2023
  45. 10/22 trace2: mark unused config callback parameterJeff King, Aug 29, 2023
  46. 09/22 trace2: mark unused us_elapsed_absolute parametersJeff King, Aug 29, 2023
  47. 11/22 test-trace2: mark unused argv/argc parametersJeff King, Aug 29, 2023
  48. 12/22 grep: mark unused parameter in output functionJeff King, Aug 29, 2023
  49. 13/22 add-interactive: mark unused callback parametersJeff King, Aug 29, 2023
  50. 14/22 negotiator/noop: mark unused callback parametersJeff King, Aug 29, 2023
  51. 15/22 worktree: mark unused parameters in noop repair callbackJeff King, Aug 29, 2023
  52. 16/22 imap-send: mark unused parameters with NO_OPENSSLJeff King, Aug 29, 2023
  53. 17/22 grep: mark unused parmaeters in pcre fallbacksJeff King, Aug 29, 2023
  54. 19/22 fetch: mark unused parameter in ref_transaction callbackJeff King, Aug 29, 2023
  55. 18/22 credential: mark unused parameter in urlmatch callbackJeff King, Aug 29, 2023
  56. 21/22 gc: mark unused descriptors in scheduler callbacksJeff King, Aug 29, 2023
  57. 20/22 bundle-uri: mark unused parameters in callbacksJeff King, Aug 29, 2023
  58. 22/22 update-ref: mark unused parameter in parser callbacksJeff King, Aug 29, 2023
  59. Junio C HamanoAug 30, 2023

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.