[PATCH 09/15] vcs-svn: Delay read of per-path properties

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



The mode for each file in an svn-format dump is kept in the properties
section.  The properties section is read as soon as possible to allow
the correct mode to be filled in when registering the file with the
repo_tree lib.

To support nodes with a missing properties section, svn-fe determines
the mode in three stages:

 - The kind (directory or file) of the node is read from the dump and
   used to make an initial estimate (040000 or 100644).
 - Properties are read in and allowed to override this for symlinks
   and executables.
 - If there is no properties section, the mode from the previous
   content of the path is left alone, overriding the above
   considerations.

This is a bit of a mess, and worse, it would get even more complicated
once we start to support property deltas.  If we could only register
the file with a provisional value for mode and then change it later
when properties say so, the procedure would be much simpler.

... oh, right, we can.

Signed-off-by: Jonathan Nieder <jrnieder@xxxxxxxxx>
---
 vcs-svn/svndump.c |   42 +++++++++++++++++++-----------------------
 1 files changed, 19 insertions(+), 23 deletions(-)

diff --git a/vcs-svn/svndump.c b/vcs-svn/svndump.c
index e40be58..4fdfcbb 100644
--- a/vcs-svn/svndump.c
+++ b/vcs-svn/svndump.c
@@ -150,7 +150,8 @@ static void read_props(void)
 
 static void handle_node(void)
 {
-	uint32_t old_mode = 0, mark = 0;
+	uint32_t mark = 0;
+	const uint32_t type = node_ctx.type;
 	const int have_props = node_ctx.propLength != LENGTH_UNKNOWN;
 
 	if (node_ctx.text_delta || node_ctx.prop_delta)
@@ -171,32 +172,27 @@ static void handle_node(void)
 		node_ctx.action = NODEACT_ADD;
 	}
 
-	if (have_props && node_ctx.propLength)
-		read_props();
+	if (node_ctx.srcRev) {
+		repo_copy(node_ctx.srcRev, node_ctx.src, node_ctx.dst);
+		node_ctx.action = NODEACT_CHANGE;
+	}
 
-	if (node_ctx.srcRev)
-		old_mode = repo_copy(node_ctx.srcRev, node_ctx.src, node_ctx.dst);
-
-	if (mark && node_ctx.type == REPO_MODE_DIR)
+	if (mark && type == REPO_MODE_DIR)
 		die("invalid dump: directories cannot have text attached");
 
-	if (node_ctx.action == NODEACT_CHANGE) {
-		if (have_props)
-			repo_modify_path(node_ctx.dst, node_ctx.type, mark);
-		else if (mark)
-			old_mode = repo_modify_path(node_ctx.dst, 0, mark);
-	} else if (node_ctx.action == NODEACT_ADD) {
-		if (node_ctx.srcRev && have_props)
-			repo_modify_path(node_ctx.dst, node_ctx.type, mark);
-		else if (node_ctx.srcRev && mark)
-			old_mode = repo_modify_path(node_ctx.dst, 0, mark);
-		else if ((node_ctx.type == REPO_MODE_DIR && !node_ctx.srcRev) ||
-			 mark)
-			repo_add(node_ctx.dst, node_ctx.type, mark);
-	}
+	if (node_ctx.action == NODEACT_CHANGE)
+		node_ctx.type = repo_modify_path(node_ctx.dst, 0, mark);
+	else	/* Node-action: add */
+		repo_add(node_ctx.dst, type, mark);
 
-	if (!have_props && old_mode)
-		node_ctx.type = old_mode;
+	if (have_props) {
+		const uint32_t old_mode = node_ctx.type;
+		node_ctx.type = type;
+		if (node_ctx.propLength)
+			read_props();
+		if (node_ctx.type != old_mode)
+			repo_modify_path(node_ctx.dst, node_ctx.type, mark);
+	}
 
 	if (mark)
 		fast_export_blob(node_ctx.type, mark, node_ctx.textLength);
-- 
1.7.2.3

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]