path: root/vcs-svn/fast_export.c
diff options
authorJonathan Nieder <>2011-03-26 05:49:37 (GMT)
committerJonathan Nieder <>2011-03-26 05:49:37 (GMT)
commit195b7ca6f229455da61f9f6b6e56a6558fb0e8ee (patch)
tree580b6b998ae2e54c460f9b7c670a8f73c639e141 /vcs-svn/fast_export.c
parent4c3169b03ec567ac43edcfc08ffdab119e0ebe94 (diff)
vcs-svn: handle log message with embedded NUL
Pass the log message by strbuf instead of as a C-style string and use fwrite instead of printf to write it to fast-import so embedded '\0' bytes can be preserved. Currently "git log" doesn't show the embedded NULs but "git cat-file commit" can. While at it, stop including system headers from repo_tree.h. git source files need to include git-compat-util.h (or cache.h or builtin.h) sooner to ensure the appropriate feature test macros are defined. Signed-off-by: Jonathan Nieder <>
Diffstat (limited to 'vcs-svn/fast_export.c')
1 files changed, 7 insertions, 5 deletions
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 = &empty;
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");