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

[PATCH 06/12] vcs-svn: add a comment before each commit

From
Jonathan Nieder <jrnieder@gmail.com>
Date
Mar 6, 2011, 23:09 UTC
Message-ID
<20110306230951.GH24327@elie>
In-Reply-To
<20110306225419.GA24327@elie>
Date: Tue, 4 Jan 2011 21:53:33 -0600
Current svn-fe produces output like this:
	blob
	mark :7382321
	data 5
	hello
	blob
	mark :7382322
	data 5
	Hello
	commit
	mark :3
[...]
	M 100644 :7382321 hello.c
	M 100644 :7382322 hello2.c

This means svn-fe has to keep track of the paths modified in each commit and the corresponding marks, instead of dealing with each file as it arrives in input and then forgetting about it. A better strategy would be to use inline blobs:

	commit
	mark :3
[...]
	M 100644 inline hello.c
	data 5
	hello
[...]

As a first step towards that, teach svn-fe to notice when the collection of blobs for each commit starts and write a comment ("# commit 3.") there.

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
 vcs-svn/fast_export.c |    5 +++++
 vcs-svn/fast_export.h |    1 +
 vcs-svn/svndump.c     |   29 ++++++++++++++++++++++-------
 3 files changed, 28 insertions(+), 7 deletions(-)
diff --git a/vcs-svn/fast_export.c b/vcs-svn/fast_export.c
index 932824a..5a105ad 100644
--- a/vcs-svn/fast_export.c
+++ b/vcs-svn/fast_export.c
@@ -30,6 +30,11 @@ void fast_export_modify(uint32_t depth, uint32_t *path, uint32_t mode,
 	putchar('\n');
 }
 
+void fast_export_begin_commit(uint32_t revision)
+{
+	printf("# commit %"PRIu32".\n", revision);
+}
+
 static char gitsvnline[MAX_GITSVN_LINE_LEN];
 void fast_export_commit(uint32_t revision, uint32_t author, char *log,
 			uint32_t uuid, uint32_t url,
diff --git a/vcs-svn/fast_export.h b/vcs-svn/fast_export.h
index 054e7d5..aff8005 100644
--- a/vcs-svn/fast_export.h
+++ b/vcs-svn/fast_export.h
@@ -6,6 +6,7 @@
 void fast_export_delete(uint32_t depth, uint32_t *path);
 void fast_export_modify(uint32_t depth, uint32_t *path, uint32_t mode,
 			uint32_t mark);
+void fast_export_begin_commit(uint32_t revision);
 void fast_export_commit(uint32_t revision, uint32_t author, char *log,
 			uint32_t uuid, uint32_t url, unsigned long timestamp);
 void fast_export_blob(uint32_t mode, uint32_t mark, uint32_t len,
diff --git a/vcs-svn/svndump.c b/vcs-svn/svndump.c
index e6d84ba..a384996 100644
--- a/vcs-svn/svndump.c
+++ b/vcs-svn/svndump.c
@@ -20,9 +20,11 @@
 #define NODEACT_CHANGE 1
 #define NODEACT_UNKNOWN 0
 
-#define DUMP_CTX 0
-#define REV_CTX  1
-#define NODE_CTX 2
+/* States: */
+#define DUMP_CTX 0	/* dump metadata */
+#define REV_CTX  1	/* revision metadata */
+#define NODE_CTX 2	/* node metadata */
+#define INTERNODE_CTX 3	/* between nodes */
 
 #define LENGTH_UNKNOWN (~0)
 #define DATE_RFC2822_LEN 31
@@ -267,7 +269,14 @@ static void handle_node(void)
 				 node_ctx.textLength, &input);
 }
 
-static void handle_revision(void)
+static void begin_revision(void)
+{
+	if (!rev_ctx.revision)	/* revision 0 gets no git commit. */
+		return;
+	fast_export_begin_commit(rev_ctx.revision);
+}
+
+static void end_revision(void)
 {
 	if (rev_ctx.revision)
 		repo_commit(rev_ctx.revision, rev_ctx.author, rev_ctx.log,
@@ -301,13 +310,17 @@ void svndump_read(const char *url)
 		} else if (key == keys.revision_number) {
 			if (active_ctx == NODE_CTX)
 				handle_node();
+			if (active_ctx == REV_CTX)
+				begin_revision();
 			if (active_ctx != DUMP_CTX)
-				handle_revision();
+				end_revision();
 			active_ctx = REV_CTX;
 			reset_rev_ctx(atoi(val));
 		} else if (key == keys.node_path) {
 			if (active_ctx == NODE_CTX)
 				handle_node();
+			if (active_ctx == REV_CTX)
+				begin_revision();
 			active_ctx = NODE_CTX;
 			reset_node_ctx(val);
 		} else if (key == keys.node_kind) {
@@ -349,7 +362,7 @@ void svndump_read(const char *url)
 				read_props();
 			} else if (active_ctx == NODE_CTX) {
 				handle_node();
-				active_ctx = REV_CTX;
+				active_ctx = INTERNODE_CTX;
 			} else {
 				fprintf(stderr, "Unexpected content length header: %"PRIu32"\n", len);
 				buffer_skip_bytes(&input, len);
@@ -358,8 +371,10 @@ void svndump_read(const char *url)
 	}
 	if (active_ctx == NODE_CTX)
 		handle_node();
+	if (active_ctx == REV_CTX)
+		begin_revision();
 	if (active_ctx != DUMP_CTX)
-		handle_revision();
+		end_revision();
 }
 
 int svndump_init(const char *filename)
-- 
1.7.4.1
Previous: Jonathan NiederNext: Jonathan Nieder
Message 27 of 37 in “vcs-svn: prepare for (implement?) incremental import”
  1. 00/10 vcs-svn: prepare for (implement?) incremental importJonathan Nieder, Dec 10, 2010
  2. 01/10 vcs-svn: use higher mark numbers for blobsJonathan Nieder, Dec 10, 2010
  3. 02/10 vcs-svn: save marks for imported commitsJonathan Nieder, Dec 10, 2010
  4. Jonathan NiederMar 6, 2011
  5. 03/10 vcs-svn: introduce cat_mark function to retrieve a marked blobJonathan Nieder, Dec 10, 2010
  6. 04/10 vcs-svn: make apply_delta caller retrieve preimageJonathan Nieder, Dec 10, 2010
  7. 05/10 vcs-svn: split off function to export result from delta applicationJonathan Nieder, Dec 10, 2010
  8. 06/10 vcs-svn: do not rely on marks for old blobsJonathan Nieder, Dec 10, 2010
  9. 07/10 vcs-svn: split off function to make 'ls' requestsJonathan Nieder, Dec 10, 2010
  10. 08/10 vcs-svn: prepare to eliminate repo_tree structureJonathan Nieder, Dec 10, 2010
  11. vcs-svn: prepare to eliminate repo_tree structureJonathan Nieder, Mar 6, 2011
  12. David BarrMar 6, 2011
  13. 09/10 vcs-svn: simplifications for repo_modify_path et alJonathan Nieder, Dec 10, 2010
  14. 10/10 vcs-svn: eliminate repo_tree structureJonathan Nieder, Dec 10, 2010
  15. 12/10 vcs-svn: quote paths correctly for ls commandDavid Michael Barr, Dec 11, 2010
  16. vcs-svn: quote all paths passed to fast-importJonathan Nieder, Dec 11, 2010
  17. 13/10 vcs-svn: use mark from previous import for parent commitDavid Michael Barr, Dec 12, 2010
  18. Jonathan NiederDec 12, 2010
  19. 00/12 vcs-svn: incremental importJonathan Nieder, Mar 6, 2011
  20. 01/12 vcs-svn: use higher mark numbers for blobsJonathan Nieder, Mar 6, 2011
  21. Junio C HamanoMar 8, 2011
  22. Jonathan NiederMar 9, 2011
  23. 02/12 vcs-svn: save marks for imported commitsJonathan Nieder, Mar 6, 2011
  24. 03/12 vcs-svn: introduce repo_read_path to check the content at a pathJonathan Nieder, Mar 6, 2011
  25. 04/12 vcs-svn: handle_node: use repo_read_pathJonathan Nieder, Mar 6, 2011
  26. 05/12 vcs-svn: simplify repo_modify_path and repo_copyJonathan Nieder, Mar 6, 2011
  27. 06/12 vcs-svn: add a comment before each commitJonathan Nieder, Mar 6, 2011
  28. 07/12 vcs-svn: allow input errors to be detected promptlyJonathan Nieder, Mar 6, 2011
  29. 08/12 vcs-svn: set up channel to read fast-import cat-blob responseJonathan Nieder, Mar 6, 2011
  30. 09/12 vcs-svn: eliminate repo_tree structureJonathan Nieder, Mar 6, 2011
  31. 10/12 vcs-svn: quote paths correctly for ls commandJonathan Nieder, Mar 6, 2011
  32. 11/12 vcs-svn: handle filenames with dq correctlyJonathan Nieder, Mar 6, 2011
  33. 12/12 vcs-svn: use mark from previous import for parent commitJonathan Nieder, Mar 6, 2011
  34. Sverre RabbelierMar 7, 2011
  35. Jonathan NiederMar 7, 2011
  36. fast-import: treat filemodify with empty tree as deleteJonathan Nieder, Dec 11, 2010
  37. vcs-svn: avoid git-isms in fast-import streamJonathan Nieder, Dec 11, 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.