From dce33c9c18e2987da1fe8ade67d27057bcb80a67 Mon Sep 17 00:00:00 2001 From: David Barr Date: Tue, 22 Mar 2011 10:49:50 +1100 Subject: vcs-svn: use strbuf for revision log obj_pool is overkill for this application: all that is needed is a buffer that can resize from rev to rev to accomodate differently-sized strings. In the spirit of commit deadcef4 (2010-11-06), use a strbuf instead. This is a small step towards removing dependence on obj_pool.h. Signed-off-by: David Barr Signed-off-by: Jonathan Nieder --- vcs-svn/svndump.c | 28 ++++++++-------------------- 1 file changed, 8 insertions(+), 20 deletions(-) (limited to 'vcs-svn/svndump.c') diff --git a/vcs-svn/svndump.c b/vcs-svn/svndump.c index 15f822ea84..559a8084ab 100644 --- a/vcs-svn/svndump.c +++ b/vcs-svn/svndump.c @@ -11,8 +11,8 @@ #include "repo_tree.h" #include "fast_export.h" #include "line_buffer.h" -#include "obj_pool.h" #include "string_pool.h" +#include "strbuf.h" #define NODEACT_REPLACE 4 #define NODEACT_DELETE 3 @@ -27,20 +27,8 @@ #define LENGTH_UNKNOWN (~0) #define DATE_RFC2822_LEN 31 -/* Create memory pool for log messages */ -obj_pool_gen(log, char, 4096) - static struct line_buffer input = LINE_BUFFER_INIT; -static char *log_copy(uint32_t length, const char *log) -{ - char *buffer; - log_free(log_pool.size); - buffer = log_pointer(log_alloc(length)); - strncpy(buffer, log, length); - return buffer; -} - static struct { uint32_t action, propLength, textLength, srcRev, type; uint32_t src[REPO_MAX_PATH_DEPTH], dst[REPO_MAX_PATH_DEPTH]; @@ -50,7 +38,7 @@ static struct { static struct { uint32_t revision, author; unsigned long timestamp; - char *log; + struct strbuf log; } rev_ctx; static struct { @@ -83,7 +71,7 @@ static void reset_rev_ctx(uint32_t revision) { rev_ctx.revision = revision; rev_ctx.timestamp = 0; - rev_ctx.log = NULL; + strbuf_reset(&rev_ctx.log); rev_ctx.author = ~0; } @@ -123,8 +111,8 @@ static void handle_property(uint32_t key, const char *val, uint32_t len, if (key == keys.svn_log) { if (!val) die("invalid dump: unsets svn:log"); - /* Value length excludes terminating nul. */ - rev_ctx.log = log_copy(len + 1, val); + strbuf_reset(&rev_ctx.log); + strbuf_add(&rev_ctx.log, val, len); } else if (key == keys.svn_author) { rev_ctx.author = pool_intern(val); } else if (key == keys.svn_date) { @@ -286,7 +274,7 @@ static void handle_node(void) static void handle_revision(void) { if (rev_ctx.revision) - repo_commit(rev_ctx.revision, rev_ctx.author, rev_ctx.log, + repo_commit(rev_ctx.revision, rev_ctx.author, rev_ctx.log.buf, dump_ctx.uuid, dump_ctx.url, rev_ctx.timestamp); } @@ -390,6 +378,7 @@ int svndump_init(const char *filename) if (buffer_init(&input, filename)) return error("cannot open %s: %s", filename, strerror(errno)); repo_init(); + strbuf_init(&rev_ctx.log, 4096); reset_dump_ctx(~0); reset_rev_ctx(0); reset_node_ctx(NULL); @@ -399,11 +388,11 @@ int svndump_init(const char *filename) void svndump_deinit(void) { - log_reset(); repo_reset(); reset_dump_ctx(~0); reset_rev_ctx(0); reset_node_ctx(NULL); + strbuf_release(&rev_ctx.log); if (buffer_deinit(&input)) fprintf(stderr, "Input error\n"); if (ferror(stdout)) @@ -412,7 +401,6 @@ void svndump_deinit(void) void svndump_reset(void) { - log_reset(); buffer_reset(&input); repo_reset(); reset_dump_ctx(~0); -- cgit v1.2.1 From 7c5817d3ba111bb71a5d7e3c8526e0925f96c92d Mon Sep 17 00:00:00 2001 From: David Barr Date: Tue, 22 Mar 2011 17:52:17 -0500 Subject: vcs-svn: use strbuf for author, UUID, and URL Use strbufs and strings instead of interned strings for values of rev, dump, and node fields that happen to be strings. After this change, the only remaining string_pool use is for paths in the repo_tree API and internals. Functional change: treat an empty author, UUID, or URL as none at all. So for example, in repos where the first revision has an empty svn:author property, the first rev will be treated as by "nobody" rather than by a person with empty name and email address created by prepending an @ sign to the repository UUID. Signed-off-by: David Barr Signed-off-by: Jonathan Nieder --- vcs-svn/svndump.c | 45 ++++++++++++++++++++++++++++----------------- 1 file changed, 28 insertions(+), 17 deletions(-) (limited to 'vcs-svn/svndump.c') diff --git a/vcs-svn/svndump.c b/vcs-svn/svndump.c index 559a8084ab..7ac74877fa 100644 --- a/vcs-svn/svndump.c +++ b/vcs-svn/svndump.c @@ -36,13 +36,14 @@ static struct { } node_ctx; static struct { - uint32_t revision, author; + uint32_t revision; unsigned long timestamp; - struct strbuf log; + struct strbuf log, author; } rev_ctx; static struct { - uint32_t version, uuid, url; + uint32_t version; + struct strbuf uuid, url; } dump_ctx; static struct { @@ -72,14 +73,16 @@ static void reset_rev_ctx(uint32_t revision) rev_ctx.revision = revision; rev_ctx.timestamp = 0; strbuf_reset(&rev_ctx.log); - rev_ctx.author = ~0; + strbuf_reset(&rev_ctx.author); } -static void reset_dump_ctx(uint32_t url) +static void reset_dump_ctx(const char *url) { - dump_ctx.url = url; + strbuf_reset(&dump_ctx.url); + if (url) + strbuf_addstr(&dump_ctx.url, url); dump_ctx.version = 1; - dump_ctx.uuid = ~0; + strbuf_reset(&dump_ctx.uuid); } static void init_keys(void) @@ -114,7 +117,9 @@ static void handle_property(uint32_t key, const char *val, uint32_t len, strbuf_reset(&rev_ctx.log); strbuf_add(&rev_ctx.log, val, len); } else if (key == keys.svn_author) { - rev_ctx.author = pool_intern(val); + strbuf_reset(&rev_ctx.author); + if (val) + strbuf_add(&rev_ctx.author, val, len); } else if (key == keys.svn_date) { if (!val) die("invalid dump: unsets svn:date"); @@ -274,8 +279,9 @@ static void handle_node(void) static void handle_revision(void) { if (rev_ctx.revision) - repo_commit(rev_ctx.revision, rev_ctx.author, rev_ctx.log.buf, - dump_ctx.uuid, dump_ctx.url, rev_ctx.timestamp); + repo_commit(rev_ctx.revision, rev_ctx.author.buf, + rev_ctx.log.buf, dump_ctx.uuid.buf, dump_ctx.url.buf, + rev_ctx.timestamp); } void svndump_read(const char *url) @@ -286,7 +292,7 @@ void svndump_read(const char *url) uint32_t len; uint32_t key; - reset_dump_ctx(pool_intern(url)); + reset_dump_ctx(url); while ((t = buffer_read_line(&input))) { val = strstr(t, ": "); if (!val) @@ -301,7 +307,8 @@ void svndump_read(const char *url) die("expected svn dump format version <= 3, found %"PRIu32, dump_ctx.version); } else if (key == keys.uuid) { - dump_ctx.uuid = pool_intern(val); + strbuf_reset(&dump_ctx.uuid); + strbuf_addstr(&dump_ctx.uuid, val); } else if (key == keys.revision_number) { if (active_ctx == NODE_CTX) handle_node(); @@ -378,8 +385,11 @@ int svndump_init(const char *filename) if (buffer_init(&input, filename)) return error("cannot open %s: %s", filename, strerror(errno)); repo_init(); + strbuf_init(&dump_ctx.uuid, 4096); + strbuf_init(&dump_ctx.url, 4096); strbuf_init(&rev_ctx.log, 4096); - reset_dump_ctx(~0); + strbuf_init(&rev_ctx.author, 4096); + reset_dump_ctx(NULL); reset_rev_ctx(0); reset_node_ctx(NULL); init_keys(); @@ -389,7 +399,7 @@ int svndump_init(const char *filename) void svndump_deinit(void) { repo_reset(); - reset_dump_ctx(~0); + reset_dump_ctx(NULL); reset_rev_ctx(0); reset_node_ctx(NULL); strbuf_release(&rev_ctx.log); @@ -403,7 +413,8 @@ void svndump_reset(void) { buffer_reset(&input); repo_reset(); - reset_dump_ctx(~0); - reset_rev_ctx(0); - reset_node_ctx(NULL); + strbuf_release(&dump_ctx.uuid); + strbuf_release(&dump_ctx.url); + strbuf_release(&rev_ctx.log); + strbuf_release(&rev_ctx.author); } -- cgit v1.2.1