Skip to content

Commit

Permalink
vcs-svn: Use mark to indicate nodes with included text
Browse files Browse the repository at this point in the history
Allocate a mark if needed as soon as possible so later code can use
"if (mark)" to check if this node has text attached rather than
explicitly checking for Text-content-length.

While at it, reject directory nodes with text attached; the presence
of such a node would indicate a bug in the dump generator or svn-fe's
understanding.  In the long term, it would be nice to be able to
continue parsing and save the error for later, but for now it is
simpler to error out right away.

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Jonathan Nieder authored and Junio C Hamano committed Nov 24, 2010
1 parent d6e81a0 commit 462e1f5
Showing 1 changed file with 8 additions and 8 deletions.
16 changes: 8 additions & 8 deletions vcs-svn/svndump.c
Original file line number Diff line number Diff line change
Expand Up @@ -156,15 +156,17 @@ static void handle_node(void)
if (node_ctx.text_delta || node_ctx.prop_delta)
die("text and property deltas not supported");

if (node_ctx.textLength != LENGTH_UNKNOWN)
mark = next_blob_mark();

if (have_props && node_ctx.propLength)
read_props();

if (node_ctx.srcRev)
old_mode = repo_copy(node_ctx.srcRev, node_ctx.src, node_ctx.dst);

if (node_ctx.textLength != LENGTH_UNKNOWN &&
node_ctx.type != REPO_MODE_DIR)
mark = next_blob_mark();
if (mark && node_ctx.type == REPO_MODE_DIR)
die("invalid dump: directories cannot have text attached");

if (node_ctx.action == NODEACT_DELETE) {
repo_delete(node_ctx.dst);
Expand All @@ -175,15 +177,15 @@ static void handle_node(void)
repo_replace(node_ctx.dst, mark);
else if (have_props)
repo_modify(node_ctx.dst, node_ctx.type, mark);
else if (node_ctx.textLength != LENGTH_UNKNOWN)
else if (mark)
old_mode = repo_replace(node_ctx.dst, mark);
} else if (node_ctx.action == NODEACT_ADD) {
if (node_ctx.srcRev && have_props)
repo_modify(node_ctx.dst, node_ctx.type, mark);
else if (node_ctx.srcRev && node_ctx.textLength != LENGTH_UNKNOWN)
else if (node_ctx.srcRev && mark)
old_mode = repo_replace(node_ctx.dst, mark);
else if ((node_ctx.type == REPO_MODE_DIR && !node_ctx.srcRev) ||
node_ctx.textLength != LENGTH_UNKNOWN)
mark)
repo_add(node_ctx.dst, node_ctx.type, mark);
}

Expand All @@ -192,8 +194,6 @@ static void handle_node(void)

if (mark)
fast_export_blob(node_ctx.type, mark, node_ctx.textLength);
else if (node_ctx.textLength != LENGTH_UNKNOWN)
buffer_skip_bytes(node_ctx.textLength);
}

static void handle_revision(void)
Expand Down

0 comments on commit 462e1f5

Please sign in to comment.