diff options
author | David Barr <david.barr@cordelta.com> | 2011-03-22 17:52:17 -0500 |
---|---|---|
committer | Jonathan Nieder <jrnieder@gmail.com> | 2011-03-22 18:01:48 -0500 |
commit | 7c5817d3ba111bb71a5d7e3c8526e0925f96c92d (patch) | |
tree | 27d8e622674ca0e7530cf3cf8dc17b75bb6c9c79 /vcs-svn/svndump.c | |
parent | dce33c9c18e2987da1fe8ade67d27057bcb80a67 (diff) | |
download | git-7c5817d3ba111bb71a5d7e3c8526e0925f96c92d.tar.gz |
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 <david.barr@cordelta.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Diffstat (limited to 'vcs-svn/svndump.c')
-rw-r--r-- | vcs-svn/svndump.c | 45 |
1 files changed, 28 insertions, 17 deletions
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); } |