X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=builtin-archive.c;h=c2e0c1ea5a676f30baa52151d9e6a2a94d4cd091;hb=bcbe5a515e837873f24dc9a764fa31e3ade45bb5;hp=a90c65ce54a1c3e415b46465a2b4c7bfdffca9ff;hpb=fed276e7524d6a80ae5dec037d586bd28543fc79;p=git.git diff --git a/builtin-archive.c b/builtin-archive.c index a90c65ce5..c2e0c1ea5 100644 --- a/builtin-archive.c +++ b/builtin-archive.c @@ -30,7 +30,7 @@ static int run_remote_archiver(const char *remote, int argc, { char *url, buf[LARGE_PACKET_MAX]; int fd[2], i, len, rv; - pid_t pid; + struct child_process *conn; const char *exec = "git-upload-archive"; int exec_at = 0; @@ -46,9 +46,7 @@ static int run_remote_archiver(const char *remote, int argc, } url = xstrdup(remote); - pid = git_connect(fd, url, exec, 0); - if (pid < 0) - return pid; + conn = git_connect(fd, url, exec, 0); for (i = 1; i < argc; i++) { if (i == exec_at) @@ -76,105 +74,11 @@ static int run_remote_archiver(const char *remote, int argc, rv = recv_sideband("archive", fd[0], 1, 2); close(fd[0]); close(fd[1]); - rv |= finish_connect(pid); + rv |= finish_connect(conn); return !!rv; } -static void *format_subst(const struct commit *commit, const char *format, - unsigned long *sizep) -{ - unsigned long len = *sizep, result_len = 0; - const char *a = format; - char *result = NULL; - - for (;;) { - const char *b, *c; - char *fmt, *formatted = NULL; - unsigned long a_len, fmt_len, formatted_len, allocated = 0; - - b = memmem(a, len, "$Format:", 8); - if (!b || a + len < b + 9) - break; - c = memchr(b + 8, '$', len - 8); - if (!c) - break; - - a_len = b - a; - fmt_len = c - b - 8; - fmt = xmalloc(fmt_len + 1); - memcpy(fmt, b + 8, fmt_len); - fmt[fmt_len] = '\0'; - - formatted_len = format_commit_message(commit, fmt, &formatted, - &allocated); - free(fmt); - result = xrealloc(result, result_len + a_len + formatted_len); - memcpy(result + result_len, a, a_len); - memcpy(result + result_len + a_len, formatted, formatted_len); - result_len += a_len + formatted_len; - len -= c + 1 - a; - a = c + 1; - } - - if (result && len) { - result = xrealloc(result, result_len + len); - memcpy(result + result_len, a, len); - result_len += len; - } - - *sizep = result_len; - - return result; -} - -static void *convert_to_archive(const char *path, - const void *src, unsigned long *sizep, - const struct commit *commit) -{ - static struct git_attr *attr_export_subst; - struct git_attr_check check[1]; - - if (!commit) - return NULL; - - 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; - if (!ATTR_TRUE(check[0].value)) - return NULL; - - return format_subst(commit, src, sizep); -} - -void *sha1_file_to_archive(const char *path, const unsigned char *sha1, - unsigned int mode, enum object_type *type, - unsigned long *size, - const struct commit *commit) -{ - void *buffer, *converted; - - buffer = read_sha1_file(sha1, type, size); - 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; - } - } - - return buffer; -} - static int init_archiver(const char *name, struct archiver *ar) { int rv = -1, i;