2 * Copyright (c) 2005, 2006 Rene Scharfe
12 #define RECORDSIZE (512)
13 #define BLOCKSIZE (RECORDSIZE * 20)
15 static const char tar_tree_usage
[] =
16 "git-tar-tree [--remote=<repo>] <tree-ish> [basedir]";
18 static int generate_tar(int argc
, const char **argv
, const char *prefix
)
20 struct archiver_args args
;
24 memset(&args
, 0, sizeof(args
));
25 if (argc
!= 2 && argc
!= 3)
26 usage(tar_tree_usage
);
28 int baselen
= strlen(argv
[2]);
29 base
= xmalloc(baselen
+ 2);
30 memcpy(base
, argv
[2], baselen
);
32 base
[baselen
+ 1] = '\0';
35 parse_treeish_arg(argv
+ 1, &args
, NULL
);
37 result
= write_tar_archive(&args
);
43 static const char *exec
= "git-upload-tar";
45 static int remote_tar(int argc
, const char **argv
)
52 if (argc
< 3 || 4 < argc
)
53 usage(tar_tree_usage
);
56 url
= xstrdup(argv
[1]+9);
57 pid
= git_connect(fd
, url
, exec
);
61 packet_write(fd
[1], "want %s\n", argv
[2]);
63 packet_write(fd
[1], "base %s\n", argv
[3]);
66 len
= packet_read_line(fd
[0], buf
, sizeof(buf
));
68 die("git-tar-tree: expected ACK/NAK, got EOF");
69 if (buf
[len
-1] == '\n')
71 if (strcmp(buf
, "ACK")) {
72 if (5 < len
&& !strncmp(buf
, "NACK ", 5))
73 die("git-tar-tree: NACK %s", buf
+ 5);
74 die("git-tar-tree: protocol error");
77 len
= packet_read_line(fd
[0], buf
, sizeof(buf
));
79 die("git-tar-tree: expected a flush");
81 /* Now, start reading from fd[0] and spit it out to stdout */
82 ret
= copy_fd(fd
[0], 1);
85 ret
|= finish_connect(pid
);
89 int cmd_tar_tree(int argc
, const char **argv
, const char *prefix
)
92 usage(tar_tree_usage
);
93 if (!strncmp("--remote=", argv
[1], 9))
94 return remote_tar(argc
, argv
);
95 return generate_tar(argc
, argv
, prefix
);
98 /* ustar header + extended global header content */
99 #define HEADERSIZE (2 * RECORDSIZE)
101 int cmd_get_tar_commit_id(int argc
, const char **argv
, const char *prefix
)
103 char buffer
[HEADERSIZE
];
104 struct ustar_header
*header
= (struct ustar_header
*)buffer
;
105 char *content
= buffer
+ RECORDSIZE
;
108 n
= xread(0, buffer
, HEADERSIZE
);
110 die("git-get-tar-commit-id: read error");
111 if (header
->typeflag
[0] != 'g')
113 if (memcmp(content
, "52 comment=", 11))
116 n
= xwrite(1, content
+ 11, 41);
118 die("git-get-tar-commit-id: write error");