From: Jonathan Nieder <jrnieder@gmail.com>
To: David Barr <david.barr@cordelta.com>
Cc: Git Mailing List <git@vger.kernel.org>,
Ramkumar Ramachandra <artagnon@gmail.com>,
Junio C Hamano <gitster@pobox.com>
Subject: [PATCH 4/4] vcs-svn: handle log message with embedded null bytes
Date: Thu, 24 Mar 2011 23:11:20 -0500 [thread overview]
Message-ID: <20110325041120.GE3007@elie> (raw)
In-Reply-To: <20110325033431.GA3007@elie>
Use fwrite instead of printf to write the log message to fast-import
so embedded ASCII NUL characters can be preserved.
Currently "git log" doesn't show the embedded NULs but "git cat-file
commit" can.
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
t/t9010-svn-fe.sh | 77 +++++++++++++++++++++++++++++++++++++++++++++++++
vcs-svn/fast_export.c | 12 ++++---
vcs-svn/fast_export.h | 9 +++--
vcs-svn/repo_tree.c | 5 ++-
vcs-svn/repo_tree.h | 4 +-
vcs-svn/svndump.c | 2 +-
6 files changed, 95 insertions(+), 14 deletions(-)
diff --git a/t/t9010-svn-fe.sh b/t/t9010-svn-fe.sh
index 47f1e4f..be35139 100755
--- a/t/t9010-svn-fe.sh
+++ b/t/t9010-svn-fe.sh
@@ -397,6 +397,83 @@ test_expect_success 'null byte in property value' '
test_cmp expect.message actual.message
'
+test_expect_success 'null bytes' '
+ # Caveat: svnadmin 1.6.16 (r1073529) truncates at \0 in the
+ # svn:specialQnotreally example.
+ reinit_git &&
+ cat >expect <<-\EOF &&
+ OBJID
+ :100644 100644 OBJID OBJID M greeting
+ OBJID
+ :000000 100644 OBJID OBJID A greeting
+ EOF
+ printf "\n%s" "something with a null byte (Q)" >expect.message &&
+ printf "%s\n" "helQo" >expect.hello1 &&
+ printf "%s\n" "link hello" >expect.hello2 &&
+ {
+ properties svn:log "something with a null byte (Q)" &&
+ echo PROPS-END
+ } |
+ q_to_nul >props &&
+ {
+ q_to_nul <<-\EOF &&
+ SVN-fs-dump-format-version: 3
+
+ Revision-number: 1
+ Prop-content-length: 10
+ Content-length: 10
+
+ PROPS-END
+
+ Node-path: greeting
+ Node-kind: file
+ Node-action: add
+ Prop-content-length: 10
+ Text-content-length: 6
+ Content-length: 16
+
+ PROPS-END
+ helQo
+
+ Revision-number: 2
+ EOF
+ echo Prop-content-length: $(wc -c <props) &&
+ echo Content-length: $(wc -c <props) &&
+ echo &&
+ cat props &&
+ q_to_nul <<-\EOF
+
+ Node-path: greeting
+ Node-kind: file
+ Node-action: change
+ Prop-content-length: 43
+ Text-content-length: 11
+ Content-length: 54
+
+ K 21
+ svn:specialQnotreally
+ V 1
+ *
+ PROPS-END
+ link hello
+ EOF
+ } >8bitclean.dump &&
+ test-svn-fe 8bitclean.dump >stream &&
+ git fast-import <stream &&
+ {
+ git rev-list HEAD |
+ git diff-tree --root --stdin |
+ sed "s/$_x40/OBJID/g"
+ } >actual &&
+ git cat-file commit HEAD | nul_to_q | sed -ne "/^\$/,\$ p" >actual.message &&
+ git cat-file blob HEAD^:greeting | nul_to_q >actual.hello1 &&
+ git cat-file blob HEAD:greeting | nul_to_q >actual.hello2 &&
+ test_cmp expect actual &&
+ test_cmp expect.message actual.message &&
+ test_cmp expect.hello1 actual.hello1 &&
+ test_cmp expect.hello2 actual.hello2
+'
+
test_expect_success 'change file mode and reiterate content' '
reinit_git &&
cat >expect <<-\EOF &&
diff --git a/vcs-svn/fast_export.c b/vcs-svn/fast_export.c
index a4d4d99..2e5bb67 100644
--- a/vcs-svn/fast_export.c
+++ b/vcs-svn/fast_export.c
@@ -31,12 +31,14 @@ void fast_export_modify(uint32_t depth, uint32_t *path, uint32_t mode,
}
static char gitsvnline[MAX_GITSVN_LINE_LEN];
-void fast_export_commit(uint32_t revision, const char *author, char *log,
+void fast_export_commit(uint32_t revision, const char *author,
+ const struct strbuf *log,
const char *uuid, const char *url,
unsigned long timestamp)
{
+ static const struct strbuf empty = STRBUF_INIT;
if (!log)
- log = "";
+ log = ∅
if (*uuid && *url) {
snprintf(gitsvnline, MAX_GITSVN_LINE_LEN,
"\n\ngit-svn-id: %s@%"PRIu32" %s\n",
@@ -49,9 +51,9 @@ void fast_export_commit(uint32_t revision, const char *author, char *log,
*author ? author : "nobody",
*author ? author : "nobody",
*uuid ? uuid : "local", timestamp);
- printf("data %"PRIu32"\n%s%s\n",
- (uint32_t) (strlen(log) + strlen(gitsvnline)),
- log, gitsvnline);
+ printf("data %"PRIuMAX"\n", log->len + strlen(gitsvnline));
+ fwrite(log->buf, log->len, 1, stdout);
+ printf("%s\n", gitsvnline);
if (!first_commit_done) {
if (revision > 1)
printf("from refs/heads/master^0\n");
diff --git a/vcs-svn/fast_export.h b/vcs-svn/fast_export.h
index 05cf97f..5878381 100644
--- a/vcs-svn/fast_export.h
+++ b/vcs-svn/fast_export.h
@@ -1,14 +1,15 @@
#ifndef FAST_EXPORT_H_
#define FAST_EXPORT_H_
-#include "line_buffer.h"
+struct line_buffer;
+struct strbuf;
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_commit(uint32_t revision, const char *author, char *log,
- const char *uuid, const char *url,
- unsigned long timestamp);
+void fast_export_commit(uint32_t revision, const char *author,
+ const struct strbuf *log, const char *uuid,
+ const char *url, unsigned long timestamp);
void fast_export_blob(uint32_t mode, uint32_t mark, uint32_t len,
struct line_buffer *input);
diff --git a/vcs-svn/repo_tree.c b/vcs-svn/repo_tree.c
index d722e32..8caa015 100644
--- a/vcs-svn/repo_tree.c
+++ b/vcs-svn/repo_tree.c
@@ -278,8 +278,9 @@ void repo_diff(uint32_t r1, uint32_t r2)
repo_commit_root_dir(commit_pointer(r2)));
}
-void repo_commit(uint32_t revision, const char *author, char *log,
- const char *uuid, const char *url, unsigned long timestamp)
+void repo_commit(uint32_t revision, const char *author,
+ const struct strbuf *log, const char *uuid, const char *url,
+ unsigned long timestamp)
{
fast_export_commit(revision, author, log, uuid, url, timestamp);
dent_commit();
diff --git a/vcs-svn/repo_tree.h b/vcs-svn/repo_tree.h
index a1b0e87..37bde2e 100644
--- a/vcs-svn/repo_tree.h
+++ b/vcs-svn/repo_tree.h
@@ -1,7 +1,7 @@
#ifndef REPO_TREE_H_
#define REPO_TREE_H_
-#include "git-compat-util.h"
+struct strbuf;
#define REPO_MODE_DIR 0040000
#define REPO_MODE_BLB 0100644
@@ -18,7 +18,7 @@ uint32_t repo_read_path(const uint32_t *path);
uint32_t repo_read_mode(const uint32_t *path);
void repo_delete(uint32_t *path);
void repo_commit(uint32_t revision, const char *author,
- char *log, const char *uuid, const char *url,
+ const struct strbuf *log, const char *uuid, const char *url,
long unsigned timestamp);
void repo_diff(uint32_t r1, uint32_t r2);
void repo_init(void);
diff --git a/vcs-svn/svndump.c b/vcs-svn/svndump.c
index 88ecef1..eef49ca 100644
--- a/vcs-svn/svndump.c
+++ b/vcs-svn/svndump.c
@@ -274,7 +274,7 @@ static void handle_revision(void)
{
if (rev_ctx.revision)
repo_commit(rev_ctx.revision, rev_ctx.author.buf,
- rev_ctx.log.buf, dump_ctx.uuid.buf, dump_ctx.url.buf,
+ &rev_ctx.log, dump_ctx.uuid.buf, dump_ctx.url.buf,
rev_ctx.timestamp);
}
--
1.7.4.1
next prev parent reply other threads:[~2011-03-25 4:11 UTC|newest]
Thread overview: 72+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-03-19 7:03 vcs-svn: purge obsolete data structures and code David Barr
2011-03-19 7:03 ` [PATCH 1/9] vcs-svn: pass paths through to fast-import David Barr
2011-03-19 7:50 ` Jonathan Nieder
2011-03-19 7:03 ` [PATCH 2/9] vcs-svn: avoid using ls command twice David Barr
2011-03-19 8:01 ` Jonathan Nieder
2011-03-19 7:03 ` [PATCH 3/9] vcs-svn: implement perfect hash for node-prop keys David Barr
2011-03-19 8:51 ` Jonathan Nieder
2011-03-21 1:26 ` [PATCH 1/3] " David Barr
2011-03-21 1:26 ` [PATCH 2/3] vcs-svn: implement perfect hash for top-level keys David Barr
2011-03-21 1:26 ` [PATCH 3/3] vcs-svn: use switch rather than cascading ifs David Barr
2011-03-21 1:38 ` [PATCHv2] " David Barr
2011-03-19 7:03 ` [PATCH 4/9] vcs-svn: implement perfect hash for top-level keys David Barr
2011-03-19 8:57 ` Jonathan Nieder
2011-03-19 7:03 ` [PATCH 5/9] vcs-svn: factor out usage of string_pool David Barr
2011-03-19 9:08 ` Jonathan Nieder
2011-03-19 7:03 ` [PATCH 6/9] vcs-svn: drop string_pool David Barr
2011-03-19 7:03 ` [PATCH 7/9] vcs-svn: drop trp.h David Barr
2011-03-19 7:03 ` [PATCH 8/9] vcs-svn: drop obj_pool.h David Barr
2011-03-19 7:03 ` [PATCH 9/9] vcs-svn: use strchr to find RFC822 delimiter David Barr
2011-03-19 9:10 ` Jonathan Nieder
2011-03-19 7:20 ` vcs-svn: integrate support for text deltas David Barr
2011-03-19 7:20 ` [PATCH 01/16] vcs-svn: improve support for reading large files David Barr
2011-03-19 7:20 ` [PATCH 02/16] vcs-svn: make buffer_skip_bytes return length read David Barr
2011-03-19 7:20 ` [PATCH 03/16] vcs-svn: make buffer_copy_bytes " David Barr
2011-03-19 7:20 ` [PATCH 04/16] vcs-svn: improve reporting of input errors David Barr
2011-03-19 7:20 ` [PATCH 05/16] vcs-svn: learn to maintain a sliding view of a file David Barr
2011-03-19 7:20 ` [PATCH 06/16] vcs-svn: skeleton of an svn delta parser David Barr
2011-03-28 3:30 ` Jonathan Nieder
2011-03-19 7:20 ` [PATCH 07/16] vcs-svn: parse svndiff0 window header David Barr
2011-03-19 7:20 ` [PATCH 08/16] vcs-svn: read the preimage when applying deltas David Barr
2011-03-19 7:20 ` [PATCH 09/16] vcs-svn: read inline data from deltas David Barr
2011-03-19 7:20 ` [PATCH 10/16] vcs-svn: read instructions " David Barr
2011-03-19 7:20 ` [PATCH 11/16] vcs-svn: implement copyfrom_data delta instruction David Barr
2011-03-19 7:20 ` [PATCH 12/16] vcs-svn: verify that deltas consume all inline data David Barr
2011-03-19 7:20 ` [PATCH 13/16] vcs-svn: let deltas use data from postimage David Barr
2011-03-19 7:20 ` [PATCH 14/16] vcs-svn: let deltas use data from preimage David Barr
2011-03-19 7:20 ` [PATCH 15/16] vcs-svn: microcleanup in svndiff0 window-reading code David Barr
2011-03-19 7:20 ` [PATCH 16/16] vcs-svn: implement text-delta handling David Barr
2011-03-28 7:00 ` vcs-svn: integrate support for text deltas Jonathan Nieder
2011-03-28 11:56 ` David Barr
2011-03-21 23:49 ` [PATCHv2 00/11] vcs-svn: purge obsolete data structures and code David Barr
2011-03-21 23:49 ` [PATCH 01/11] vcs-svn: use strbuf for revision log David Barr
2011-03-21 23:49 ` [PATCH 02/11] vcs-svn: pass paths through to fast-import David Barr
2011-03-21 23:49 ` [PATCH 03/11] vcs-svn: avoid using ls command twice David Barr
2011-03-21 23:49 ` [PATCH 04/11] vcs-svn: implement perfect hash for node-prop keys David Barr
2011-03-21 23:49 ` [PATCH 05/11] vcs-svn: implement perfect hash for top-level keys David Barr
2011-03-21 23:49 ` [PATCH 06/11] vcs-svn: use switch rather than cascading ifs David Barr
2011-03-21 23:49 ` [PATCH 07/11] vcs-svn: factor out usage of string_pool David Barr
2011-03-21 23:49 ` [PATCH 08/11] vcs-svn: drop string_pool David Barr
2011-03-21 23:49 ` =?^[?q?=5BPATCH=2009/11=5D=20vcs-svn=3A=20drop=20trp=2Eh?= David Barr
2011-03-21 23:49 ` [PATCH 10/11] vcs-svn: drop obj_pool.h David Barr
2011-03-21 23:50 ` [PATCH 11/11] vcs-svn: use strchr to find RFC822 delimiter David Barr
2011-03-23 0:32 ` [PULL svn-fe] vcs-svn: simplifications, error handling improvements Jonathan Nieder
2011-03-23 5:46 ` Junio C Hamano
2011-03-23 6:03 ` Junio C Hamano
2011-03-26 6:42 ` Jonathan Nieder
2011-03-26 9:49 ` t0081-line-buffer.sh hangs (Re: [PULL svn-fe] vcs-svn: simplifications, error handling improvements) Jonathan Nieder
2011-03-23 7:11 ` [PULL svn-fe] vcs-svn: simplifications, error handling improvements David Barr
2011-03-24 12:43 ` [PATCH] fixup! vcs-svn: improve reporting of input errors David Barr
2011-03-25 1:12 ` Jonathan Nieder
2011-03-25 3:34 ` [PATCH svn-fe 0/4] vcs-svn: null bytes in properties Jonathan Nieder
2011-03-25 4:07 ` [PATCH 1/4] vcs-svn: make reading of properties binary-safe Jonathan Nieder
2011-03-28 15:34 ` tb
2011-03-28 19:41 ` Jonathan Nieder
2011-03-28 20:30 ` Torsten Bögershausen
2011-03-28 20:44 ` Jonathan Nieder
2011-03-25 4:09 ` [PATCH 2/4] vcs-svn: remove buffer_read_string Jonathan Nieder
2011-03-25 4:10 ` [PATCH 3/4] vcs-svn: avoid unnecessary copying of log message and author Jonathan Nieder
2011-03-25 4:11 ` Jonathan Nieder [this message]
2011-03-26 6:46 ` [PULL svn-fe] vcs-svn: simplifications, error handling improvements Jonathan Nieder
2011-03-26 18:36 ` Junio C Hamano
2011-03-28 0:38 ` [PATCH svn-fe] vcs-svn: add missing cast to printf argument Jonathan Nieder
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20110325041120.GE3007@elie \
--to=jrnieder@gmail.com \
--cc=artagnon@gmail.com \
--cc=david.barr@cordelta.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.