[PATCH 11/11] vcs-svn: Allow deltas to copy from preimage

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Jonathan Nieder
Date: Wednesday, October 13, 2010 - 3:00 am

The copyfrom_source instruction appends data from the preimage
buffer to the end of output.  Its arguments are a length and an
offset relative to the beginning of the source view.

Helped-by: Ramkumar Ramachandra <artagnon@gmail.com>
Helped-by: David Barr <david.barr@cordelta.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
[resending with cc: samv]

That's the end of the series.  Thanks for reading.  Hopefully this
round did not introduce too many bugs but if it did, I'd be glad to
hear about them.

Good night,
Jonathan

 t/t9011-svn-da.sh |   35 +++++++++++++++++++++++++++++++++++
 vcs-svn/svndiff.c |   27 +++++++++++++++++++++++----
 2 files changed, 58 insertions(+), 4 deletions(-)

diff --git a/t/t9011-svn-da.sh b/t/t9011-svn-da.sh
index c4bd1f3..c8959e2 100755
--- a/t/t9011-svn-da.sh
+++ b/t/t9011-svn-da.sh
@@ -198,4 +198,39 @@ test_expect_success 'catch copy that overflows' '
 	test_must_fail test-svn-fe -d preimage copytarget.overflow $len
 '
 
+test_expect_success 'copyfrom source' '
+	printf foo >expect &&
+	printf "SVNQ%b%b" "Q\003\003\002Q" "\003Q" | q_to_nul >copysource.all &&
+	test-svn-fe -d preimage copysource.all 11 >actual &&
+	test_cmp expect actual
+'
+
+test_expect_success 'copy backwards' '
+	printf oof >expect &&
+	printf "SVNQ%b%b" "Q\003\003\006Q" "\001\002\001\001\001Q" |
+		q_to_nul >copysource.rev &&
+	test-svn-fe -d preimage copysource.rev 15 >actual &&
+	test_cmp expect actual
+'
+
+test_expect_success 'offsets are relative to window' '
+	printf fo >expect &&
+	printf "SVNQ%b%b%b%b" "Q\003\001\002Q" "\001Q" \
+		"\002\001\001\002Q" "\001Q" |
+		q_to_nul >copysource.two &&
+	test-svn-fe -d preimage copysource.two 18 >actual &&
+	test_cmp expect actual
+'
+
+test_expect_success 'example from notes/svndiff' '
+	printf aaaaccccdddddddd >expect &&
+	printf aaaabbbbcccc >source &&
+	printf "SVNQ%b%b%s" "Q\014\020\007\001" \
+		"\004Q\004\010\0201\0107\010" d |
+		q_to_nul >delta.example &&
+	len=$(wc -c <delta.example) &&
+	test-svn-fe -d source delta.example $len >actual &&
+	test_cmp expect actual
+'
+
 test_done
diff --git a/vcs-svn/svndiff.c b/vcs-svn/svndiff.c
index 8f1b61e..d3d1dba 100644
--- a/vcs-svn/svndiff.c
+++ b/vcs-svn/svndiff.c
@@ -23,6 +23,7 @@
  * view_selector ::= copyfrom_source
  *   | copyfrom_target
  *   ;
+ * copyfrom_source ::= # binary 00 000000;
  * copyfrom_target ::= # binary 01 000000;
  * copyfrom_data ::= # binary 10 000000;
  * packed_view_selector ::= # view_selector OR-ed with 6 bit value;
@@ -33,6 +34,7 @@
  */
 
 #define INSN_MASK	0xc0
+#define INSN_COPYFROM_SOURCE	0x00
 #define INSN_COPYFROM_TARGET	0x40
 #define INSN_COPYFROM_DATA	0x80
 #define OPERAND_MASK	0x3f
@@ -42,6 +44,7 @@
 #define VLI_BITS_PER_DIGIT 7
 
 struct window {
+	struct view *in;
 	struct strbuf out;
 	struct strbuf instructions;
 	struct strbuf data;
@@ -144,6 +147,19 @@ static int read_chunk(struct line_buffer *delta, off_t *delta_len,
 	return 0;
 }
 
+static int copyfrom_source(struct window *ctx, const char **instructions,
+			   size_t nbytes, const char *insns_end)
+{
+	size_t offset;
+	if (parse_int(instructions, &offset, insns_end))
+		return -1;
+	if (unsigned_add_overflows(offset, nbytes) ||
+	    offset + nbytes > ctx->in->buf.len)
+		return error("Invalid delta: copies source data outside view.");
+	strbuf_add(&ctx->out, ctx->in->buf.buf + offset, nbytes);
+	return 0;
+}
+
 static int copyfrom_target(struct window *ctx, const char **instructions,
 			   size_t nbytes, const char *insns_end)
 {
@@ -193,12 +209,14 @@ static int step(struct window *ctx, const char **instructions, size_t *data_pos)
 	if (parse_first_operand(instructions, &nbytes, insns_end))
 		return -1;
 	switch (instruction & INSN_MASK) {
+	case INSN_COPYFROM_SOURCE:
+		return copyfrom_source(ctx, instructions, nbytes, insns_end);
 	case INSN_COPYFROM_TARGET:
 		return copyfrom_target(ctx, instructions, nbytes, insns_end);
 	case INSN_COPYFROM_DATA:
 		return copyfrom_data(ctx, data_pos, nbytes);
 	default:
-		return error("Unknown instruction %x", instruction);
+		return error("Invalid instruction %x", instruction);
 	}
 }
 
@@ -220,9 +238,9 @@ static int apply_window_in_core(struct window *ctx)
 }
 
 static int apply_one_window(struct line_buffer *delta, off_t *delta_len,
-			    FILE *out)
+			    struct view *preimage, FILE *out)
 {
-	struct window ctx = {STRBUF_INIT, STRBUF_INIT, STRBUF_INIT};
+	struct window ctx = {preimage, STRBUF_INIT, STRBUF_INIT, STRBUF_INIT};
 	size_t out_len;
 	size_t instructions_len;
 	size_t data_len;
@@ -277,7 +295,8 @@ int svndiff0_apply(struct line_buffer *delta, off_t delta_len,
 		if (read_offset(delta, &pre_off, &delta_len) ||
 		    read_length(delta, &pre_len, &delta_len) ||
 		    move_window(&preimage_view, pre_off, pre_len) ||
-		    apply_one_window(delta, &delta_len, postimage))
+		    apply_one_window(delta, &delta_len,
+				     &preimage_view, postimage))
 			goto fail;
 		if (delta_len && buffer_at_eof(delta)) {
 			error("Delta ends early! (%"PRIu64" bytes remaining)",
-- 
1.7.2.3

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[PATCH 0/8] Resurrect rr/svn-export, Ramkumar Ramachandra, (Thu Jul 15, 9:22 am)
[PATCH 1/8] Export parse_date_basic() to convert a date st ..., Ramkumar Ramachandra, (Thu Jul 15, 9:22 am)
[PATCH 2/8] Introduce vcs-svn lib, Ramkumar Ramachandra, (Thu Jul 15, 9:22 am)
[PATCH 3/8] Add memory pool library, Ramkumar Ramachandra, (Thu Jul 15, 9:22 am)
[PATCH 4/8] Add treap implementation, Ramkumar Ramachandra, (Thu Jul 15, 9:23 am)
[PATCH 5/8] Add string-specific memory pool, Ramkumar Ramachandra, (Thu Jul 15, 9:23 am)
[PATCH 6/8] Add stream helper library, Ramkumar Ramachandra, (Thu Jul 15, 9:23 am)
[PATCH 7/8] Add infrastructure to write revisions in fast- ..., Ramkumar Ramachandra, (Thu Jul 15, 9:23 am)
[PATCH 8/8] Add SVN dump parser, Ramkumar Ramachandra, (Thu Jul 15, 9:23 am)
Re: [PATCH 2/8] Introduce vcs-svn lib, Jonathan Nieder, (Thu Jul 15, 10:46 am)
Re: [PATCH 3/8] Add memory pool library, Jonathan Nieder, (Thu Jul 15, 11:57 am)
Re: [PATCH 4/8] Add treap implementation, Jonathan Nieder, (Thu Jul 15, 12:09 pm)
Re: [PATCH 3/8] Add memory pool library, Ramkumar Ramachandra, (Thu Jul 15, 12:12 pm)
Re: [PATCH 2/8] Introduce vcs-svn lib, Ramkumar Ramachandra, (Thu Jul 15, 12:15 pm)
Re: [PATCH 4/8] Add treap implementation, Ramkumar Ramachandra, (Thu Jul 15, 12:18 pm)
Re: [PATCH 6/8] Add stream helper library, Jonathan Nieder, (Thu Jul 15, 12:19 pm)
Re: [PATCH 8/8] Add SVN dump parser, Jonathan Nieder, (Thu Jul 15, 12:52 pm)
Re: [PATCH 8/8] Add SVN dump parser, Jonathan Nieder, (Thu Jul 15, 1:04 pm)
Re: [PATCH 0/8] Resurrect rr/svn-export, Jonathan Nieder, (Fri Jul 16, 3:13 am)
[PATCH 3/9] Add memory pool library, Jonathan Nieder, (Fri Jul 16, 3:16 am)
[PATCH 4/9] Add treap implementation, Jonathan Nieder, (Fri Jul 16, 3:23 am)
Re: [PATCH 4/9] Add treap implementation, Jonathan Nieder, (Fri Jul 16, 11:26 am)
[PATCH 0/10] rr/svn-export reroll, Jonathan Nieder, (Mon Aug 9, 2:57 pm)
[PATCH 02/10] Introduce vcs-svn lib, Jonathan Nieder, (Mon Aug 9, 3:04 pm)
[PATCH 03/10] Add memory pool library, Jonathan Nieder, (Mon Aug 9, 3:11 pm)
[PATCH 04/10] Add treap implementation, Jonathan Nieder, (Mon Aug 9, 3:17 pm)
[PATCH 05/10] Add string-specific memory pool, Jonathan Nieder, (Mon Aug 9, 3:34 pm)
[PATCH 06/10] Add stream helper library, Jonathan Nieder, (Mon Aug 9, 3:39 pm)
[PATCH 08/10] SVN dump parser, Jonathan Nieder, (Mon Aug 9, 3:55 pm)
PATCH 09/10] Update svn-fe manual, Jonathan Nieder, (Mon Aug 9, 3:55 pm)
Re: [PATCH 0/10] rr/svn-export reroll, Ramkumar Ramachandra, (Tue Aug 10, 5:53 am)
Re: [PATCH 0/10] rr/svn-export reroll, Jonathan Nieder, (Tue Aug 10, 6:53 pm)
Re: [PATCH 05/10] Add string-specific memory pool, Junio C Hamano, (Thu Aug 12, 10:22 am)
Re: [PATCH 04/10] Add treap implementation, Junio C Hamano, (Thu Aug 12, 10:22 am)
Re: [PATCH 08/10] SVN dump parser, Junio C Hamano, (Thu Aug 12, 10:22 am)
Re: [PATCH 05/10] Add string-specific memory pool, Jonathan Nieder, (Thu Aug 12, 2:30 pm)
Re: [PATCH 04/10] Add treap implementation, Jonathan Nieder, (Thu Aug 12, 3:02 pm)
Re: [PATCH 04/10] Add treap implementation, Jonathan Nieder, (Thu Aug 12, 3:11 pm)
Re: [PATCH 04/10] Add treap implementation, Junio C Hamano, (Thu Aug 12, 3:44 pm)
[PATCH/WIP 00/16] svn delta applier, Jonathan Nieder, (Sun Oct 10, 7:34 pm)
[PATCH 01/16] vcs-svn: Eliminate global byte_buffer[] array, Jonathan Nieder, (Sun Oct 10, 7:37 pm)
[PATCH 03/16] vcs-svn: Collect line_buffer data in a struct, Jonathan Nieder, (Sun Oct 10, 7:39 pm)
[PATCH 07/16] vcs-svn: Add binary-safe read() function, Jonathan Nieder, (Sun Oct 10, 7:47 pm)
[PATCH 10/16] vcs-svn: Allow character-oriented input, Jonathan Nieder, (Sun Oct 10, 7:52 pm)
[PATCH 13/16] vcs-svn: Learn to check for SVN\0 magic, Jonathan Nieder, (Sun Oct 10, 7:58 pm)
[PATCH 14/16] compat: helper for detecting unsigned overflow, Jonathan Nieder, (Sun Oct 10, 7:59 pm)
[PATCH/RFC 16'/16] vcs-svn: Add svn delta parser, Jonathan Nieder, (Sun Oct 10, 9:01 pm)
[PATCH/RFC 0/11] Building up the delta parser, Jonathan Nieder, (Wed Oct 13, 2:17 am)
[PATCH 02/11] vcs-svn: Skeleton of an svn delta parser, Jonathan Nieder, (Wed Oct 13, 2:21 am)
[PATCH 04/11] vcs-svn: Read inline data from deltas, Jonathan Nieder, (Wed Oct 13, 2:35 am)
[PATCH 05/11] vcs-svn: Read instructions from deltas, Jonathan Nieder, (Wed Oct 13, 2:38 am)
[PATCH 07/11] vcs-svn: Check declared number of output bytes, Jonathan Nieder, (Wed Oct 13, 2:41 am)
[PATCH 09/11] vcs-svn: Let deltas use data from postimage, Jonathan Nieder, (Wed Oct 13, 2:50 am)
[PATCH 11/11] vcs-svn: Allow deltas to copy from preimage, Jonathan Nieder, (Wed Oct 13, 2:58 am)
[PATCH 11/11] vcs-svn: Allow deltas to copy from preimage, Jonathan Nieder, (Wed Oct 13, 3:00 am)
Re: [PATCH/RFC 0/11] Building up the delta parser, Ramkumar Ramachandra, (Mon Oct 18, 10:00 am)
Re: [PATCH/RFC 0/11] Building up the delta parser, Jonathan Nieder, (Mon Oct 18, 10:03 am)