diff options
author | Pierre Habouzit <madcoder@debian.org> | 2007-09-16 15:51:04 +0200 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2007-09-16 17:30:03 -0700 |
commit | 5ecd293d1420bf641a927a015877950f4d79c067 (patch) | |
tree | ae217d6915a5c858f7173ed0c99730a4ce62d2f4 /builtin-archive.c | |
parent | 917c9a713397b16671ed5b1f1c159515bcfa389e (diff) | |
download | git-5ecd293d1420bf641a927a015877950f4d79c067.tar.gz |
Rewrite convert_to_{git,working_tree} to use strbuf's.
* Now, those functions take an "out" strbuf argument, where they store their
result if any. In that case, it also returns 1, else it returns 0.
* those functions support "in place" editing, in the sense that it's OK to
call them this way:
convert_to_git(path, sb->buf, sb->len, sb);
When doable, conversions are done in place for real, else the strbuf
content is just replaced with the new one, transparentely for the caller.
If you want to create a new filter working this way, being the accumulation
of filter1, filter2, ... filtern, then your meta_filter would be:
int meta_filter(..., const char *src, size_t len, struct strbuf *sb)
{
int ret = 0;
ret |= filter1(...., src, len, sb);
if (ret) {
src = sb->buf;
len = sb->len;
}
ret |= filter2(...., src, len, sb);
if (ret) {
src = sb->buf;
len = sb->len;
}
....
return ret | filtern(..., src, len, sb);
}
That's why subfilters the convert_to_* functions called were also rewritten
to work this way.
Signed-off-by: Pierre Habouzit <madcoder@debian.org>
Acked-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'builtin-archive.c')
-rw-r--r-- | builtin-archive.c | 78 |
1 files changed, 36 insertions, 42 deletions
diff --git a/builtin-archive.c b/builtin-archive.c index 6fa424d386..843a9e37bb 100644 --- a/builtin-archive.c +++ b/builtin-archive.c @@ -81,22 +81,21 @@ static int run_remote_archiver(const char *remote, int argc, return !!rv; } -static void *format_subst(const struct commit *commit, const char *format, - unsigned long *sizep) +static void format_subst(const struct commit *commit, + const char *src, size_t len, + struct strbuf *buf) { - unsigned long len = *sizep; - const char *a = format; - struct strbuf result; + char *to_free = NULL; struct strbuf fmt; - strbuf_init(&result, 0); + if (src == buf->buf) + to_free = strbuf_detach(buf); strbuf_init(&fmt, 0); - for (;;) { const char *b, *c; - b = memmem(a, len, "$Format:", 8); - if (!b || a + len < b + 9) + b = memmem(src, len, "$Format:", 8); + if (!b || src + len < b + 9) break; c = memchr(b + 8, '$', len - 8); if (!c) @@ -105,62 +104,57 @@ static void *format_subst(const struct commit *commit, const char *format, strbuf_reset(&fmt); strbuf_add(&fmt, b + 8, c - b - 8); - strbuf_add(&result, a, b - a); - format_commit_message(commit, fmt.buf, &result); - len -= c + 1 - a; - a = c + 1; + strbuf_add(buf, src, b - src); + format_commit_message(commit, fmt.buf, buf); + len -= c + 1 - src; + src = c + 1; } - - strbuf_add(&result, a, len); - - *sizep = result.len; - + strbuf_add(buf, src, len); strbuf_release(&fmt); - return strbuf_detach(&result); + free(to_free); } -static void *convert_to_archive(const char *path, - const void *src, unsigned long *sizep, - const struct commit *commit) +static int convert_to_archive(const char *path, + const void *src, size_t len, + struct strbuf *buf, + const struct commit *commit) { static struct git_attr *attr_export_subst; struct git_attr_check check[1]; if (!commit) - return NULL; + return 0; - if (!attr_export_subst) - attr_export_subst = git_attr("export-subst", 12); + if (!attr_export_subst) + attr_export_subst = git_attr("export-subst", 12); check[0].attr = attr_export_subst; if (git_checkattr(path, ARRAY_SIZE(check), check)) - return NULL; + return 0; if (!ATTR_TRUE(check[0].value)) - return NULL; + return 0; - return format_subst(commit, src, sizep); + format_subst(commit, src, len, buf); + return 1; } void *sha1_file_to_archive(const char *path, const unsigned char *sha1, unsigned int mode, enum object_type *type, - unsigned long *size, + unsigned long *sizep, const struct commit *commit) { - void *buffer, *converted; + void *buffer; - buffer = read_sha1_file(sha1, type, size); + buffer = read_sha1_file(sha1, type, sizep); if (buffer && S_ISREG(mode)) { - converted = convert_to_working_tree(path, buffer, size); - if (converted) { - free(buffer); - buffer = converted; - } - - converted = convert_to_archive(path, buffer, size, commit); - if (converted) { - free(buffer); - buffer = converted; - } + struct strbuf buf; + + strbuf_init(&buf, 0); + strbuf_attach(&buf, buffer, *sizep, *sizep + 1); + convert_to_working_tree(path, buf.buf, buf.len, &buf); + convert_to_archive(path, buf.buf, buf.len, &buf, commit); + *sizep = buf.len; + buffer = buf.buf; } return buffer; |