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

Re: [PATCH 2/4] refs: trim newline from reflog message

From
Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Date
Nov 23, 2021, 10:24 UTC
Message-ID
<211123.864k83w3y4.gmgdl@evledraar.gmail.com>
In-Reply-To
<dfb639373234a6b8d5f9110380a66ffccbe0b1d6.1637590855.git.gitgitgadget@gmail.com>
On Mon, Nov 22 2021, Han-Wen Nienhuys via GitGitGadget wrote:
Show 27 quoted lines
> From: Han-Wen Nienhuys <hanwen@google.com>
> [...]
> @@ -3059,18 +3059,18 @@ static int expire_reflog_ent(struct object_id *ooid, struct object_id *noid,
>  	if ((*cb->should_prune_fn)(ooid, noid, email, timestamp, tz,
>  				   message, policy_cb)) {
>  		if (!cb->newlog)
> -			printf("would prune %s", message);
> +			printf("would prune %s\n", message);
>  		else if (cb->flags & EXPIRE_REFLOGS_VERBOSE)
> -			printf("prune %s", message);
> +			printf("prune %s\n", message);
>  	} else {
>  		if (cb->newlog) {
> -			fprintf(cb->newlog, "%s %s %s %"PRItime" %+05d\t%s",
> -				oid_to_hex(ooid), oid_to_hex(noid),
> -				email, timestamp, tz, message);
> +			fprintf(cb->newlog, "%s %s %s %" PRItime " %+05d\t%s\n",
> +				oid_to_hex(ooid), oid_to_hex(noid), email,
> +				timestamp, tz, message);
>  			oidcpy(&cb->last_kept_oid, noid);
>  		}
>  		if (cb->flags & EXPIRE_REFLOGS_VERBOSE)
> -			printf("keep %s", message);
> +			printf("keep %s\n", message);
>  	}
>  	return 0;
>  }

I haven't looked deeply into this topic as a whole, but FWIW this conflicts with a topic I've got locally and was going to submit sometime after the current batch of my own ref fixes in "next".

That we've got verbose output at all in file-backend.c is a wart, and it should just be moved out if it entirely, this commit (stacked on top of various other fixes I've got in the area) does that: https://github.com/avar/git/commit/eff40d2d81b

With that change the reftable code will need to handle far less of this, as it'll be handled in builtin/reflog.c, it just needs to behave properly in the appropriate "expire reflog?" callback. I.e. the backend tells us "does this expire?", the builtin/reflog.c code consumes that and does any verbose or non-verbose (or progress etc.) output.

Now, the merge conflict between that and this looks rather trivial, but I can't help but wonder if we're going in the wrong direction here API-wise, or maybe "wrong direction" is too strong, but "sticking with the wrong patterN?".

I think your cleanup works, but wouldn't a better thing be to move this to callbacks rather than tweaking the fprintf formats?

I.e. in my version the whole body of this function has become:
	
	static int expire_reflog_ent(struct object_id *ooid, struct object_id *noid,
				     const char *email, timestamp_t timestamp, int tz,
				     const char *message, void *cb_data)
	{
		struct expire_reflog_cb *cb = cb_data;
		reflog_expiry_should_prune_fn *fn = cb->should_prune_fn;
	
		if (cb->rewrite)
			ooid = &cb->last_kept_oid;
	
		if (fn(ooid, noid, email, timestamp, tz, message, cb->policy_cb))
			return 0;
	
		if (cb->dry_run)
			return 0; /* --dry-run */
	
		fprintf(cb->newlog, "%s %s %s %"PRItime" %+05d\t%s", oid_to_hex(ooid),
			oid_to_hex(noid), email, timestamp, tz, message);
		oidcpy(&cb->last_kept_oid, noid);
	
		return 0;
	}

The only file-backend specific part of it is that fprintf(). If we moved towards making that part of it be:

	write_reflog_entry_cb(oid_to_hex(ooid), oid_to_hex(noid), email, timestamp, tz, message);

Then we could lift the whole of this API to a level that makes more sense for a backed to implement.

The refs/files-backend.c shouldn't need to have one function calll the "should_prune_fn" *and* write out the data. Instead some code common to all backends should call the "should prune?", and then call the backend's "here's an entry for you to write" callback.

But maybe I'm overthinking this whole thing. I'm just wondering if we have say a sqlite reflog backend as opposed to the file/reftable backend that wants to store this data in a schema. Such a a backend would need to unpack the data, as we're sprintf() formatting function parameters before it gets passed to the backends.

Previous: Ævar Arnfjörð BjarmasonNext: Han-Wen Nienhuys
Message 25 of 60 in “Inspect reflog data programmatically in more tests”
  1. 0/4 Inspect reflog data programmatically in more testsHan-Wen Nienhuys via GitGitGadget, Nov 22, 2021
  2. 1/4 show-branch: show reflog messageHan-Wen Nienhuys via GitGitGadget, Nov 22, 2021
  3. Junio C HamanoNov 22, 2021
  4. Bagas SanjayaNov 23, 2021
  5. Elijah NewrenNov 23, 2021
  6. 2/4 refs: trim newline from reflog messageHan-Wen Nienhuys via GitGitGadget, Nov 22, 2021
  7. Junio C HamanoNov 22, 2021
  8. Han-Wen NienhuysNov 23, 2021
  9. Junio C HamanoNov 23, 2021
  10. Han-Wen NienhuysNov 23, 2021
  11. Junio C HamanoNov 23, 2021
  12. Han-Wen NienhuysNov 24, 2021
  13. Junio C HamanoNov 24, 2021
  14. Han-Wen NienhuysNov 24, 2021
  15. Junio C HamanoNov 24, 2021
  16. Han-Wen NienhuysNov 25, 2021
  17. Junio C HamanoNov 29, 2021
  18. Junio C HamanoNov 24, 2021
  19. Han-Wen NienhuysNov 24, 2021
  20. Re* [PATCH 2/4] refs: trim newline from reflog messageJunio C Hamano, Nov 26, 2021
  21. Ævar Arnfjörð BjarmasonNov 28, 2021
  22. Junio C HamanoNov 28, 2021
  23. Re* [PATCH 2/4] refs: trim newline from reflog messageJunio C Hamano, Nov 28, 2021
  24. Ævar Arnfjörð BjarmasonNov 29, 2021
  25. Ævar Arnfjörð BjarmasonNov 23, 2021
  26. Han-Wen NienhuysNov 23, 2021
  27. 3/4 test-ref-store: tweaks to for-each-reflog-ent formatHan-Wen Nienhuys via GitGitGadget, Nov 22, 2021
  28. Junio C HamanoNov 22, 2021
  29. Han-Wen NienhuysNov 23, 2021
  30. Junio C HamanoNov 23, 2021
  31. 4/4 t1400: use test-helper ref-store to inspect reflog contentsHan-Wen Nienhuys via GitGitGadget, Nov 22, 2021
  32. Ævar Arnfjörð BjarmasonNov 22, 2021
  33. Han-Wen NienhuysNov 22, 2021
  34. Junio C HamanoNov 22, 2021
  35. 0/5 Inspect reflog data programmatically in more testsHan-Wen Nienhuys via GitGitGadget, Nov 25, 2021
  36. 3/5 t1405: check for_each_reflog_ent_reverse() more thoroughlyHan-Wen Nienhuys via GitGitGadget, Nov 25, 2021
  37. 5/5 refs/debug: trim trailing LF from reflog messageHan-Wen Nienhuys via GitGitGadget, Nov 25, 2021
  38. Junio C HamanoNov 26, 2021
  39. Han-Wen NienhuysNov 29, 2021
  40. Junio C HamanoNov 29, 2021
  41. Junio C HamanoNov 29, 2021
  42. Han-Wen NienhuysDec 2, 2021
  43. Junio C HamanoDec 2, 2021
  44. Ævar Arnfjörð BjarmasonNov 29, 2021
  45. 1/5 show-branch: show reflog messageHan-Wen Nienhuys via GitGitGadget, Nov 25, 2021
  46. 2/5 test-ref-store: don't add newline to reflog messageHan-Wen Nienhuys via GitGitGadget, Nov 25, 2021
  47. Junio C HamanoNov 26, 2021
  48. 4/5 test-ref-store: tweaks to for-each-reflog-ent formatHan-Wen Nienhuys via GitGitGadget, Nov 25, 2021
  49. Junio C HamanoNov 26, 2021
  50. Ævar Arnfjörð BjarmasonNov 29, 2021
  51. Han-Wen NienhuysNov 29, 2021
  52. Junio C HamanoNov 29, 2021
  53. Ævar Arnfjörð BjarmasonNov 29, 2021
  54. Han-Wen NienhuysDec 2, 2021
  55. 0/5 Inspect reflog data programmatically in more testsHan-Wen Nienhuys via GitGitGadget, Dec 2, 2021
  56. 1/5 show-branch: show reflog messageHan-Wen Nienhuys via GitGitGadget, Dec 2, 2021
  57. 5/5 refs/debug: trim trailing LF from reflog messageHan-Wen Nienhuys via GitGitGadget, Dec 2, 2021
  58. 4/5 test-ref-store: tweaks to for-each-reflog-ent formatHan-Wen Nienhuys via GitGitGadget, Dec 2, 2021
  59. 3/5 t1405: check for_each_reflog_ent_reverse() more thoroughlyHan-Wen Nienhuys via GitGitGadget, Dec 2, 2021
  60. 2/5 test-ref-store: don't add newline to reflog messageHan-Wen Nienhuys via GitGitGadget, Dec 2, 2021

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.