aboutsummaryrefslogtreecommitdiff
path: root/vcs-svn/svndump.c
diff options
context:
space:
mode:
authorDavid Barr <david.barr@cordelta.com>2011-03-22 17:52:17 -0500
committerJonathan Nieder <jrnieder@gmail.com>2011-03-22 18:01:48 -0500
commit7c5817d3ba111bb71a5d7e3c8526e0925f96c92d (patch)
tree27d8e622674ca0e7530cf3cf8dc17b75bb6c9c79 /vcs-svn/svndump.c
parentdce33c9c18e2987da1fe8ade67d27057bcb80a67 (diff)
downloadgit-7c5817d3ba111bb71a5d7e3c8526e0925f96c92d.tar.gz
git-7c5817d3ba111bb71a5d7e3c8526e0925f96c92d.tar.xz
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.c45
1 files changed, 28 insertions, 17 deletions
diff --git a/vcs-svn/svndump.c b/vcs-svn/svndump.c
index 559a8084a..7ac74877f 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);
}