From: Junio C Hamano Date: Tue, 23 May 2006 21:44:31 +0000 (-0700) Subject: Merge branch 'jc/tartree' into jc/builtin-n-tar-tree X-Git-Tag: v1.4.0-rc1~77^2 X-Git-Url: https://git.verplant.org/?a=commitdiff_plain;h=1af0d11283ee34127a4ee877fb753db021d399ea;p=git.git Merge branch 'jc/tartree' into jc/builtin-n-tar-tree * jc/tartree: built-in tar-tree and remote tar-tree --- 1af0d11283ee34127a4ee877fb753db021d399ea diff --cc Makefile index fc5f98b9,f4bcec49..14873fa3 --- a/Makefile +++ b/Makefile @@@ -169,10 -171,7 +169,11 @@@ PROGRAMS = BUILT_INS = git-log$X git-whatchanged$X git-show$X \ git-count-objects$X git-diff$X git-push$X \ git-grep$X git-rev-list$X git-check-ref-format$X \ - git-init-db$X git-tar-tree$X git-upload-tar$X + git-init-db$X git-ls-files$X git-ls-tree$X \ - git-tar-tree$X git-read-tree$X git-commit-tree$X \ ++ git-read-tree$X git-commit-tree$X \ + git-apply$X git-show-branch$X git-diff-files$X \ - git-diff-index$X git-diff-stages$X git-diff-tree$X ++ git-diff-index$X git-diff-stages$X git-diff-tree$X \ ++ git-tar-tree$X git-upload-tar$X # what 'all' will build and 'install' will install, in gitexecdir ALL_PROGRAMS = $(PROGRAMS) $(SIMPLE_PROGRAMS) $(SCRIPTS) @@@ -221,10 -220,7 +222,11 @@@ LIB_OBJS = BUILTIN_OBJS = \ builtin-log.o builtin-help.o builtin-count.o builtin-diff.o builtin-push.o \ builtin-grep.o builtin-rev-list.o builtin-check-ref-format.o \ - builtin-init-db.o builtin-tar-tree.o builtin-upload-tar.o + builtin-init-db.o builtin-ls-files.o builtin-ls-tree.o \ - builtin-tar-tree.o builtin-read-tree.o builtin-commit-tree.o \ ++ builtin-read-tree.o builtin-commit-tree.o \ + builtin-apply.o builtin-show-branch.o builtin-diff-files.o \ - builtin-diff-index.o builtin-diff-stages.o builtin-diff-tree.o ++ builtin-diff-index.o builtin-diff-stages.o builtin-diff-tree.o \ ++ builtin-tar-tree.o builtin-upload-tar.o GITLIBS = $(LIB_FILE) $(XDIFF_LIB) LIBS = $(GITLIBS) -lz diff --cc builtin-tar-tree.c index 6ada04ce,e97e0af9..2d5e06fb --- a/builtin-tar-tree.c +++ b/builtin-tar-tree.c @@@ -302,7 -304,7 +304,7 @@@ static void traverse_tree(struct tree_d } } - int cmd_tar_tree(int argc, const char **argv, char** envp) -int generate_tar(int argc, const char **argv) ++static int generate_tar(int argc, const char **argv, char** envp) { unsigned char sha1[20], tree_sha1[20]; struct commit *commit; @@@ -349,3 -351,58 +351,58 @@@ free(current_path.buf); return 0; } + + static const char *exec = "git-upload-tar"; + + static int remote_tar(int argc, const char **argv) + { + int fd[2], ret, len; + pid_t pid; + char buf[1024]; + char *url; + + if (argc < 3 || 4 < argc) + usage(tar_tree_usage); + + /* --remote= */ + url = strdup(argv[1]+9); + pid = git_connect(fd, url, exec); + if (pid < 0) + return 1; + + packet_write(fd[1], "want %s\n", argv[2]); + if (argv[3]) + packet_write(fd[1], "base %s\n", argv[3]); + packet_flush(fd[1]); + + len = packet_read_line(fd[0], buf, sizeof(buf)); + if (!len) + die("git-tar-tree: expected ACK/NAK, got EOF"); + if (buf[len-1] == '\n') + buf[--len] = 0; + if (strcmp(buf, "ACK")) { + if (5 < len && !strncmp(buf, "NACK ", 5)) + die("git-tar-tree: NACK %s", buf + 5); + die("git-tar-tree: protocol error"); + } + /* expect a flush */ + len = packet_read_line(fd[0], buf, sizeof(buf)); + if (len) + die("git-tar-tree: expected a flush"); + + /* Now, start reading from fd[0] and spit it out to stdout */ + ret = copy_fd(fd[0], 1); + close(fd[0]); + + ret |= finish_connect(pid); + return !!ret; + } + + int cmd_tar_tree(int argc, const char **argv, char **envp) + { + if (argc < 2) + usage(tar_tree_usage); + if (!strncmp("--remote=", argv[1], 9)) + return remote_tar(argc, argv); - return generate_tar(argc, argv); ++ return generate_tar(argc, argv, envp); + } diff --cc builtin.h index 76209846,f22783c4..2249c5fa --- a/builtin.h +++ b/builtin.h @@@ -27,17 -27,7 +27,17 @@@ extern int cmd_grep(int argc, const cha extern int cmd_rev_list(int argc, const char **argv, char **envp); extern int cmd_check_ref_format(int argc, const char **argv, char **envp); extern int cmd_init_db(int argc, const char **argv, char **envp); + extern int cmd_tar_tree(int argc, const char **argv, char **envp); + extern int cmd_upload_tar(int argc, const char **argv, char **envp); +extern int cmd_ls_files(int argc, const char **argv, char **envp); +extern int cmd_ls_tree(int argc, const char **argv, char **envp); - extern int cmd_tar_tree(int argc, const char **argv, char **envp); +extern int cmd_read_tree(int argc, const char **argv, char **envp); +extern int cmd_commit_tree(int argc, const char **argv, char **envp); +extern int cmd_apply(int argc, const char **argv, char **envp); +extern int cmd_show_branch(int argc, const char **argv, char **envp); +extern int cmd_diff_files(int argc, const char **argv, char **envp); +extern int cmd_diff_index(int argc, const char **argv, char **envp); +extern int cmd_diff_stages(int argc, const char **argv, char **envp); +extern int cmd_diff_tree(int argc, const char **argv, char **envp); - #endif diff --cc git.c index 87497487,fd8e9bf7..38e84618 --- a/git.c +++ b/git.c @@@ -50,20 -50,11 +50,22 @@@ static void handle_internal_command(in { "count-objects", cmd_count_objects }, { "diff", cmd_diff }, { "grep", cmd_grep }, + { "rev-list", cmd_rev_list }, { "init-db", cmd_init_db }, + { "tar-tree", cmd_tar_tree }, + { "upload-tar", cmd_upload_tar }, - { "rev-list", cmd_rev_list }, - { "check-ref-format", cmd_check_ref_format } + { "check-ref-format", cmd_check_ref_format }, + { "ls-files", cmd_ls_files }, + { "ls-tree", cmd_ls_tree }, + { "tar-tree", cmd_tar_tree }, + { "read-tree", cmd_read_tree }, + { "commit-tree", cmd_commit_tree }, + { "apply", cmd_apply }, + { "show-branch", cmd_show_branch }, + { "diff-files", cmd_diff_files }, + { "diff-index", cmd_diff_index }, + { "diff-stages", cmd_diff_stages }, + { "diff-tree", cmd_diff_tree } }; int i;