Merge branch 'jc/builtin-n-tar-tree'
This pulls in "make many commands built-in" branches. * jc/builtin-n-tar-tree: built-in tar-tree and remote tar-tree Builtin git-diff-files, git-diff-index, git-diff-stages, and git-diff-tree. Builtin git-show-branch. Builtin git-apply. Builtin git-commit-tree. Builtin git-read-tree. Builtin git-tar-tree. Builtin git-ls-tree. Builtin git-ls-files.
This commit is contained in:
commit
f2054be4c4
29
Makefile
29
Makefile
@ -149,19 +149,17 @@ SIMPLE_PROGRAMS = \
|
||||
|
||||
# ... and all the rest that could be moved out of bindir to gitexecdir
|
||||
PROGRAMS = \
|
||||
git-apply$X git-cat-file$X \
|
||||
git-checkout-index$X git-clone-pack$X git-commit-tree$X \
|
||||
git-convert-objects$X git-diff-files$X \
|
||||
git-diff-index$X git-diff-stages$X \
|
||||
git-diff-tree$X git-fetch-pack$X git-fsck-objects$X \
|
||||
git-cat-file$X \
|
||||
git-checkout-index$X git-clone-pack$X \
|
||||
git-convert-objects$X git-fetch-pack$X git-fsck-objects$X \
|
||||
git-hash-object$X git-index-pack$X git-local-fetch$X \
|
||||
git-ls-files$X git-ls-tree$X git-mailinfo$X git-merge-base$X \
|
||||
git-mailinfo$X git-merge-base$X \
|
||||
git-merge-index$X git-mktag$X git-mktree$X git-pack-objects$X git-patch-id$X \
|
||||
git-peek-remote$X git-prune-packed$X git-read-tree$X \
|
||||
git-peek-remote$X git-prune-packed$X \
|
||||
git-receive-pack$X git-rev-parse$X \
|
||||
git-send-pack$X git-show-branch$X git-shell$X \
|
||||
git-send-pack$X git-shell$X \
|
||||
git-show-index$X git-ssh-fetch$X \
|
||||
git-ssh-upload$X git-tar-tree$X git-unpack-file$X \
|
||||
git-ssh-upload$X git-unpack-file$X \
|
||||
git-unpack-objects$X git-update-index$X git-update-server-info$X \
|
||||
git-upload-pack$X git-verify-pack$X git-write-tree$X \
|
||||
git-update-ref$X git-symbolic-ref$X \
|
||||
@ -172,7 +170,11 @@ 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-add$X git-rm$X git-rev-list$X \
|
||||
git-check-ref-format$X \
|
||||
git-init-db$X
|
||||
git-init-db$X git-tar-tree$X git-upload-tar$X \
|
||||
git-ls-files$X git-ls-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
|
||||
|
||||
# what 'all' will build and 'install' will install, in gitexecdir
|
||||
ALL_PROGRAMS = $(PROGRAMS) $(SIMPLE_PROGRAMS) $(SCRIPTS)
|
||||
@ -221,7 +223,12 @@ LIB_OBJS = \
|
||||
BUILTIN_OBJS = \
|
||||
builtin-log.o builtin-help.o builtin-count.o builtin-diff.o builtin-push.o \
|
||||
builtin-grep.o builtin-add.o builtin-rev-list.o builtin-check-ref-format.o \
|
||||
builtin-rm.o builtin-init-db.o
|
||||
builtin-rm.o builtin-init-db.o \
|
||||
builtin-tar-tree.o builtin-upload-tar.o \
|
||||
builtin-ls-files.o builtin-ls-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
|
||||
|
||||
GITLIBS = $(LIB_FILE) $(XDIFF_LIB)
|
||||
LIBS = $(GITLIBS) -lz
|
||||
|
@ -11,6 +11,7 @@
|
||||
#include "quote.h"
|
||||
#include "blob.h"
|
||||
#include "delta.h"
|
||||
#include "builtin.h"
|
||||
|
||||
// --check turns on checking that the working tree matches the
|
||||
// files that are being modified, but doesn't apply the patch
|
||||
@ -2151,7 +2152,7 @@ static int git_apply_config(const char *var, const char *value)
|
||||
}
|
||||
|
||||
|
||||
int main(int argc, char **argv)
|
||||
int cmd_apply(int argc, const char **argv, char **envp)
|
||||
{
|
||||
int i;
|
||||
int read_stdin = 1;
|
@ -6,6 +6,7 @@
|
||||
#include "cache.h"
|
||||
#include "commit.h"
|
||||
#include "tree.h"
|
||||
#include "builtin.h"
|
||||
|
||||
#define BLOCKING (1ul << 14)
|
||||
|
||||
@ -76,7 +77,7 @@ static int new_parent(int idx)
|
||||
return 1;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
int cmd_commit_tree(int argc, const char **argv, char **envp)
|
||||
{
|
||||
int i;
|
||||
int parents = 0;
|
||||
@ -98,7 +99,7 @@ int main(int argc, char **argv)
|
||||
|
||||
check_valid(tree_sha1, tree_type);
|
||||
for (i = 2; i < argc; i += 2) {
|
||||
char *a, *b;
|
||||
const char *a, *b;
|
||||
a = argv[i]; b = argv[i+1];
|
||||
if (!b || strcmp(a, "-p"))
|
||||
usage(commit_tree_usage);
|
@ -7,12 +7,13 @@
|
||||
#include "diff.h"
|
||||
#include "commit.h"
|
||||
#include "revision.h"
|
||||
#include "builtin.h"
|
||||
|
||||
static const char diff_files_usage[] =
|
||||
"git-diff-files [-q] [-0/-1/2/3 |-c|--cc] [<common diff options>] [<path>...]"
|
||||
COMMON_DIFF_OPTIONS_HELP;
|
||||
|
||||
int main(int argc, const char **argv)
|
||||
int cmd_diff_files(int argc, const char **argv, char **envp)
|
||||
{
|
||||
struct rev_info rev;
|
||||
int silent = 0;
|
@ -2,13 +2,14 @@
|
||||
#include "diff.h"
|
||||
#include "commit.h"
|
||||
#include "revision.h"
|
||||
#include "builtin.h"
|
||||
|
||||
static const char diff_cache_usage[] =
|
||||
"git-diff-index [-m] [--cached] "
|
||||
"[<common diff options>] <tree-ish> [<path>...]"
|
||||
COMMON_DIFF_OPTIONS_HELP;
|
||||
|
||||
int main(int argc, const char **argv)
|
||||
int cmd_diff_index(int argc, const char **argv, char **envp)
|
||||
{
|
||||
struct rev_info rev;
|
||||
int cached = 0;
|
@ -4,6 +4,7 @@
|
||||
|
||||
#include "cache.h"
|
||||
#include "diff.h"
|
||||
#include "builtin.h"
|
||||
|
||||
static struct diff_options diff_options;
|
||||
|
||||
@ -54,7 +55,7 @@ static void diff_stages(int stage1, int stage2, const char **pathspec)
|
||||
}
|
||||
}
|
||||
|
||||
int main(int ac, const char **av)
|
||||
int cmd_diff_stages(int ac, const char **av, char **envp)
|
||||
{
|
||||
int stage1, stage2;
|
||||
const char *prefix = setup_git_directory();
|
@ -2,6 +2,7 @@
|
||||
#include "diff.h"
|
||||
#include "commit.h"
|
||||
#include "log-tree.h"
|
||||
#include "builtin.h"
|
||||
|
||||
static struct rev_info log_tree_opt;
|
||||
|
||||
@ -58,7 +59,7 @@ static const char diff_tree_usage[] =
|
||||
" --root include the initial commit as diff against /dev/null\n"
|
||||
COMMON_DIFF_OPTIONS_HELP;
|
||||
|
||||
int main(int argc, const char **argv)
|
||||
int cmd_diff_tree(int argc, const char **argv, char **envp)
|
||||
{
|
||||
int nr_sha1;
|
||||
char line[1000];
|
@ -10,6 +10,7 @@
|
||||
#include "cache.h"
|
||||
#include "quote.h"
|
||||
#include "dir.h"
|
||||
#include "builtin.h"
|
||||
|
||||
static int abbrev = 0;
|
||||
static int show_deleted = 0;
|
||||
@ -321,7 +322,7 @@ static const char ls_files_usage[] =
|
||||
"[ --exclude-per-directory=<filename> ] [--full-name] [--abbrev] "
|
||||
"[--] [<file>]*";
|
||||
|
||||
int main(int argc, const char **argv)
|
||||
int cmd_ls_files(int argc, const char **argv, char** envp)
|
||||
{
|
||||
int i;
|
||||
int exc_given = 0;
|
@ -7,6 +7,7 @@
|
||||
#include "blob.h"
|
||||
#include "tree.h"
|
||||
#include "quote.h"
|
||||
#include "builtin.h"
|
||||
|
||||
static int line_termination = '\n';
|
||||
#define LS_RECURSIVE 1
|
||||
@ -15,7 +16,7 @@ static int line_termination = '\n';
|
||||
#define LS_NAME_ONLY 8
|
||||
static int abbrev = 0;
|
||||
static int ls_options = 0;
|
||||
const char **pathspec;
|
||||
static const char **pathspec;
|
||||
static int chomp_prefix = 0;
|
||||
static const char *prefix;
|
||||
|
||||
@ -84,7 +85,7 @@ static int show_tree(unsigned char *sha1, const char *base, int baselen,
|
||||
return retval;
|
||||
}
|
||||
|
||||
int main(int argc, const char **argv)
|
||||
int cmd_ls_tree(int argc, const char **argv, char **envp)
|
||||
{
|
||||
unsigned char sha1[20];
|
||||
struct tree *tree;
|
@ -11,6 +11,7 @@
|
||||
#include "tree.h"
|
||||
#include <sys/time.h>
|
||||
#include <signal.h>
|
||||
#include "builtin.h"
|
||||
|
||||
static int reset = 0;
|
||||
static int merge = 0;
|
||||
@ -763,7 +764,7 @@ static const char read_tree_usage[] = "git-read-tree (<sha> | -m [--aggressive]
|
||||
|
||||
static struct cache_file cache_file;
|
||||
|
||||
int main(int argc, char **argv)
|
||||
int cmd_read_tree(int argc, const char **argv, char **envp)
|
||||
{
|
||||
int i, newfd, stage = 0;
|
||||
unsigned char sha1[20];
|
@ -3,13 +3,14 @@
|
||||
#include "cache.h"
|
||||
#include "commit.h"
|
||||
#include "refs.h"
|
||||
#include "builtin.h"
|
||||
|
||||
static const char show_branch_usage[] =
|
||||
"git-show-branch [--dense] [--current] [--all] [--heads] [--tags] [--topo-order] [--more=count | --list | --independent | --merge-base ] [--topics] [<refs>...]";
|
||||
|
||||
static int default_num = 0;
|
||||
static int default_alloc = 0;
|
||||
static char **default_arg = NULL;
|
||||
static const char **default_arg = NULL;
|
||||
|
||||
#define UNINTERESTING 01
|
||||
|
||||
@ -548,7 +549,7 @@ static int omit_in_dense(struct commit *commit, struct commit **rev, int n)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main(int ac, char **av)
|
||||
int cmd_show_branch(int ac, const char **av, char **envp)
|
||||
{
|
||||
struct commit *rev[MAX_REVS], *commit;
|
||||
struct commit_list *list = NULL, *seen = NULL;
|
||||
@ -581,7 +582,7 @@ int main(int ac, char **av)
|
||||
}
|
||||
|
||||
while (1 < ac && av[1][0] == '-') {
|
||||
char *arg = av[1];
|
||||
const char *arg = av[1];
|
||||
if (!strcmp(arg, "--")) {
|
||||
ac--; av++;
|
||||
break;
|
@ -7,11 +7,14 @@
|
||||
#include "commit.h"
|
||||
#include "strbuf.h"
|
||||
#include "tar.h"
|
||||
#include "builtin.h"
|
||||
#include "pkt-line.h"
|
||||
|
||||
#define RECORDSIZE (512)
|
||||
#define BLOCKSIZE (RECORDSIZE * 20)
|
||||
|
||||
static const char tar_tree_usage[] = "git-tar-tree <key> [basedir]";
|
||||
static const char tar_tree_usage[] =
|
||||
"git-tar-tree [--remote=<repo>] <ent> [basedir]";
|
||||
|
||||
static char block[BLOCKSIZE];
|
||||
static unsigned long offset;
|
||||
@ -301,7 +304,7 @@ static void traverse_tree(struct tree_desc *tree, struct strbuf *path)
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
static int generate_tar(int argc, const char **argv, char** envp)
|
||||
{
|
||||
unsigned char sha1[20], tree_sha1[20];
|
||||
struct commit *commit;
|
||||
@ -348,3 +351,58 @@ int main(int argc, char **argv)
|
||||
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=<repo> */
|
||||
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, envp);
|
||||
}
|
74
builtin-upload-tar.c
Normal file
74
builtin-upload-tar.c
Normal file
@ -0,0 +1,74 @@
|
||||
/*
|
||||
* Copyright (c) 2006 Junio C Hamano
|
||||
*/
|
||||
#include "cache.h"
|
||||
#include "pkt-line.h"
|
||||
#include "exec_cmd.h"
|
||||
#include "builtin.h"
|
||||
|
||||
static const char upload_tar_usage[] = "git-upload-tar <repo>";
|
||||
|
||||
static int nak(const char *reason)
|
||||
{
|
||||
packet_write(1, "NACK %s\n", reason);
|
||||
packet_flush(1);
|
||||
return 1;
|
||||
}
|
||||
|
||||
int cmd_upload_tar(int argc, const char **argv, char **envp)
|
||||
{
|
||||
int len;
|
||||
const char *dir = argv[1];
|
||||
char buf[8192];
|
||||
unsigned char sha1[20];
|
||||
char *base = NULL;
|
||||
char hex[41];
|
||||
int ac;
|
||||
const char *av[4];
|
||||
|
||||
if (argc != 2)
|
||||
usage(upload_tar_usage);
|
||||
if (strlen(dir) < sizeof(buf)-1)
|
||||
strcpy(buf, dir); /* enter-repo smudges its argument */
|
||||
else
|
||||
packet_write(1, "NACK insanely long repository name %s\n", dir);
|
||||
if (!enter_repo(buf, 0)) {
|
||||
packet_write(1, "NACK not a git archive %s\n", dir);
|
||||
packet_flush(1);
|
||||
return 1;
|
||||
}
|
||||
|
||||
len = packet_read_line(0, buf, sizeof(buf));
|
||||
if (len < 5 || strncmp("want ", buf, 5))
|
||||
return nak("expected want");
|
||||
if (buf[len-1] == '\n')
|
||||
buf[--len] = 0;
|
||||
if (get_sha1(buf + 5, sha1))
|
||||
return nak("expected sha1");
|
||||
strcpy(hex, sha1_to_hex(sha1));
|
||||
|
||||
len = packet_read_line(0, buf, sizeof(buf));
|
||||
if (len) {
|
||||
if (len < 5 || strncmp("base ", buf, 5))
|
||||
return nak("expected (optional) base");
|
||||
if (buf[len-1] == '\n')
|
||||
buf[--len] = 0;
|
||||
base = strdup(buf + 5);
|
||||
len = packet_read_line(0, buf, sizeof(buf));
|
||||
}
|
||||
if (len)
|
||||
return nak("expected flush");
|
||||
|
||||
packet_write(1, "ACK\n");
|
||||
packet_flush(1);
|
||||
|
||||
ac = 0;
|
||||
av[ac++] = "tar-tree";
|
||||
av[ac++] = hex;
|
||||
if (base)
|
||||
av[ac++] = base;
|
||||
av[ac++] = NULL;
|
||||
execv_git_cmd(av);
|
||||
/* should it return that is an error */
|
||||
return 1;
|
||||
}
|
12
builtin.h
12
builtin.h
@ -29,5 +29,17 @@ extern int cmd_add(int argc, const char **argv, char **envp);
|
||||
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_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
|
||||
|
15
git.c
15
git.c
@ -54,7 +54,20 @@ static void handle_internal_command(int argc, const char **argv, char **envp)
|
||||
{ "add", cmd_add },
|
||||
{ "rev-list", cmd_rev_list },
|
||||
{ "init-db", cmd_init_db },
|
||||
{ "check-ref-format", cmd_check_ref_format }
|
||||
{ "tar-tree", cmd_tar_tree },
|
||||
{ "upload-tar", cmd_upload_tar },
|
||||
{ "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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user