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

Re: [PATCH 06/13] Dump the revprops at the start of every revision

From
Jonathan Nieder <jrnieder@gmail.com>
Date
Jul 7, 2010, 19:04 UTC
Message-ID
<20100707190434.GA2732@burratino>
In-Reply-To
<1278461693-3828-7-git-send-email-artagnon@gmail.com>
Ramkumar Ramachandra wrote:
> Fill in replay_revstart to dump the revprops at the start of every
> revision. Add an additional write_hash_to_stringbuf helper function.
	A write_hash_to_stringbuf helper does the work of
	converting the property hashtable to dumpfile format.
> +++ b/dumpr_util.c
[...]
> +void write_hash_to_stringbuf(apr_hash_t *properties,
> +			     svn_boolean_t deleted,
> +			     svn_stringbuf_t **strbuf,
> +			     apr_pool_t *pool)
This function looks like:
	void write_hash_to_stringbuf(...
	{
		if (!deleted) {
			for (each prop) {
				append the new value of the prop;
			}
		} else {
			for (each prop) {
				mention that it has been deleted;
			}
		}
	}

It would be simpler to put the body of the loop in its own function, like this:

	static void write_prop_to_stringbuf(...
	{
		if (deleted) {
			append deletion notice;
			return;
		}
		append new value of prop;
	}
	void write_hash_to_stringbuf(...
	{
		for (each prop)
			write_prop_to_stringbuf(...
	}
Or even:
	static void write_prop(...
	static void write_deleted_prop(...
	void write_prop_data_to_stringbuf(...
	{
		for (each prop)
			write_prop(...
	}
	void write_deleted_prop_data_to_stringbuf(...
	{
		for (each prop)
			write_deleted_prop(...
	}
which would make the arguments from the caller less opaque.

I did not check whether the "return early in the simpler case" is idiomatic for svn code. Of course you should respect whatever convention is prevalent.

Show 20 quoted lines
> +{
> +	apr_hash_index_t *this;
> +	const void *key;
> +	void *val;
> +	apr_ssize_t keylen;
> +	svn_string_t *value;
> +	
> +	if (!deleted) {
> +		for (this = apr_hash_first(pool, properties); this;
> +		     this = apr_hash_next(this)) {
> +			/* Get this key and val. */
> +			apr_hash_this(this, &key, &keylen, &val);
> +			value = val;
> +
> +			/* Output name length, then name. */
> +			svn_stringbuf_appendcstr(*strbuf,
> +						 apr_psprintf(pool, "K %" APR_SSIZE_T_FMT "\n",
> +							      keylen));
> +
> +			svn_stringbuf_appendbytes(*strbuf, (const char *) key, keylen);

Is the cast needed? (The answer might be "yes" if this code is meant to be usable with C++ compilers.)

Show 9 quoted lines
> +++ b/svndumpr.c
> @@ -23,6 +23,37 @@ static svn_error_t *replay_revstart(svn_revnum_t revision,
>                                      apr_hash_t *rev_props,
>                                      apr_pool_t *pool)
>  {
> +	/* Editing this revision has just started; dump the revprops
> +	   before invoking the editor callbacks */
> +	svn_stringbuf_t *propstring = svn_stringbuf_create("", pool);
> +	svn_stream_t *stdout_stream;
Style: better to say in comments what we are trying to do than what we
actually do.  So:
	/* First, dump revision properties. */

Maybe dumping revision properties should be its own function to make that comment unnecessary (and make replay_revstart() less daunting as it grows).

> +
> +	/* Create an stdout stream */
> +	svn_stream_for_stdout(&stdout_stream, pool);
Useless comment.
Show 7 quoted lines
> +
> +        /* Print revision number and prepare the propstring */
> +	SVN_ERR(svn_stream_printf(stdout_stream, pool,
> +				  SVN_REPOS_DUMPFILE_REVISION_NUMBER
> +				  ": %ld\n", revision));
> +	write_hash_to_stringbuf(rev_props, FALSE, &propstring, pool);
> +	svn_stringbuf_appendbytes(propstring, "PROPS-END\n", 10);
Unhelpful comment.  Maybe:
	/* Revision-number: 19 */
	SVN_ERR(svn_stream_printf(stdout_stream, pool,
				  SVN_REPOS_DUMPFILE_REVISION_NUMBER
				  ": %ld\n", revision));
	write_hash_to_stringbuf(rev_props, FALSE, &propstring, pool);
	svn_stringbuf_appendbytes(propstring, "PROPS-END\n", 10);
	/* Prop-content-length: 13 */
	SVN_ERR(svn_stream_printf(stdout_stream, pool,
				  SVN_REPOS_DUMPFILE_PROP_CONTENT_LENGTH
				  ": %" APR_SIZE_T_FMT "\n", propstring->len));
	...

This would make it particularly easy to grep for a particular header (even if grepping for SVN_REPOS_DUMPFILE_PROP_CONTENT_LENGTH is not that hard).

[...]
> +	/* Print the revprops now */
> +	SVN_ERR(svn_stream_write(stdout_stream, propstring->data,
> +				 &(propstring->len)));
Maybe:
	/* Property data. */
	SVN_ERR(svn_stream_write(stdout_stream, propstring->data,
				 &(propstring->len)));
The whole function so far has been about printing revprops.
> +
> +	svn_stream_close(stdout_stream);
This does not actually fclose(stdout), does it?
Show 7 quoted lines
> @@ -39,6 +70,9 @@ static svn_error_t *replay_revend(svn_revnum_t revision,
>                                    apr_hash_t *rev_props,
>                                    apr_pool_t *pool)
>  {
> +	/* Editor has finished for this revision and close_edit has
> +	   been called; do nothing: just continue to the next
> +	   revision */
I’d leave out the comment, or:
	/* No resources to free. */

HTH, Jonathan

Previous: Ramkumar RamachandraNext: Ramkumar Ramachandra
Message 20 of 31 in “[GSoC update] git-remote-svn: Week 10”
  1. Ramkumar RamachandraJul 7, 2010
  2. 01/13 Add LICENSERamkumar Ramachandra, Jul 7, 2010
  3. 02/13 Add skeleton SVN client and MakefileRamkumar Ramachandra, Jul 7, 2010
  4. Jonathan NiederJul 7, 2010
  5. Ramkumar RamachandraJul 7, 2010
  6. Jonathan NiederJul 7, 2010
  7. Ramkumar RamachandraJul 7, 2010
  8. Daniel ShahafJul 7, 2010
  9. 03/13 Add debug editor from Subversion trunkRamkumar Ramachandra, Jul 7, 2010
  10. Jonathan NiederJul 7, 2010
  11. 04/13 Add skeleton dump editorRamkumar Ramachandra, Jul 7, 2010
  12. Jonathan NiederJul 7, 2010
  13. Ramkumar RamachandraJul 8, 2010
  14. 05/13 Drive the debug editorRamkumar Ramachandra, Jul 7, 2010
  15. Jonathan NiederJul 7, 2010
  16. Ramkumar RamachandraJul 7, 2010
  17. Jonathan NiederJul 7, 2010
  18. Ramkumar RamachandraJul 8, 2010
  19. 06/13 Dump the revprops at the start of every revisionRamkumar Ramachandra, Jul 7, 2010
  20. Jonathan NiederJul 7, 2010
  21. Ramkumar RamachandraJul 21, 2010
  22. Julian FoadJul 26, 2010
  23. Ramkumar RamachandraJul 26, 2010
  24. 07/13 Implement open_root and close_editRamkumar Ramachandra, Jul 7, 2010
  25. 08/13 Implement dump_nodeRamkumar Ramachandra, Jul 7, 2010
  26. 09/13 Implement directory-related functionsRamkumar Ramachandra, Jul 7, 2010
  27. 10/13 Implement file-related functionsRamkumar Ramachandra, Jul 7, 2010
  28. 11/13 Implement apply_textdeltaRamkumar Ramachandra, Jul 7, 2010
  29. 12/13 Implement close_fileRamkumar Ramachandra, Jul 7, 2010
  30. 13/13 Add a validation scriptRamkumar Ramachandra, Jul 7, 2010
  31. Ramkumar RamachandraJul 7, 2010

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.