|
|
|
@ -3,7 +3,7 @@
@@ -3,7 +3,7 @@
|
|
|
|
|
*/ |
|
|
|
|
#include <time.h> |
|
|
|
|
#include "cache.h" |
|
|
|
|
#include "tree.h" |
|
|
|
|
#include "diff.h" |
|
|
|
|
#include "commit.h" |
|
|
|
|
|
|
|
|
|
#define RECORDSIZE (512) |
|
|
|
@ -336,37 +336,38 @@ static void write_header(const unsigned char *sha1, char typeflag, const char *b
@@ -336,37 +336,38 @@ static void write_header(const unsigned char *sha1, char typeflag, const char *b
|
|
|
|
|
write_if_needed(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void traverse_tree(struct tree *tree, |
|
|
|
|
static void traverse_tree(struct tree_desc *tree, |
|
|
|
|
struct path_prefix *prefix) |
|
|
|
|
{ |
|
|
|
|
struct path_prefix this_prefix; |
|
|
|
|
struct tree_entry_list *item; |
|
|
|
|
this_prefix.prev = prefix; |
|
|
|
|
|
|
|
|
|
parse_tree(tree); |
|
|
|
|
item = tree->entries; |
|
|
|
|
|
|
|
|
|
while (item) { |
|
|
|
|
while (tree->size) { |
|
|
|
|
const char *name; |
|
|
|
|
const unsigned char *sha1; |
|
|
|
|
unsigned mode; |
|
|
|
|
void *eltbuf; |
|
|
|
|
char elttype[20]; |
|
|
|
|
unsigned long eltsize; |
|
|
|
|
|
|
|
|
|
eltbuf = read_sha1_file(item->item.any->sha1, |
|
|
|
|
elttype, &eltsize); |
|
|
|
|
sha1 = tree_entry_extract(tree, &name, &mode); |
|
|
|
|
update_tree_entry(tree); |
|
|
|
|
|
|
|
|
|
eltbuf = read_sha1_file(sha1, elttype, &eltsize); |
|
|
|
|
if (!eltbuf) |
|
|
|
|
die("cannot read %s", |
|
|
|
|
sha1_to_hex(item->item.any->sha1)); |
|
|
|
|
write_header(item->item.any->sha1, TYPEFLAG_AUTO, basedir, |
|
|
|
|
prefix, item->name, |
|
|
|
|
item->mode, eltbuf, eltsize); |
|
|
|
|
if (item->directory) { |
|
|
|
|
this_prefix.name = item->name; |
|
|
|
|
traverse_tree(item->item.tree, &this_prefix); |
|
|
|
|
} else if (!item->symlink) { |
|
|
|
|
die("cannot read %s", sha1_to_hex(sha1)); |
|
|
|
|
write_header(sha1, TYPEFLAG_AUTO, basedir, |
|
|
|
|
prefix, name, mode, eltbuf, eltsize); |
|
|
|
|
if (S_ISDIR(mode)) { |
|
|
|
|
struct tree_desc subtree; |
|
|
|
|
subtree.buf = eltbuf; |
|
|
|
|
subtree.size = eltsize; |
|
|
|
|
this_prefix.name = name; |
|
|
|
|
traverse_tree(&subtree, &this_prefix); |
|
|
|
|
} else if (!S_ISLNK(mode)) { |
|
|
|
|
write_blocked(eltbuf, eltsize); |
|
|
|
|
} |
|
|
|
|
free(eltbuf); |
|
|
|
|
item = item->next; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -374,7 +375,7 @@ int main(int argc, char **argv)
@@ -374,7 +375,7 @@ int main(int argc, char **argv)
|
|
|
|
|
{ |
|
|
|
|
unsigned char sha1[20]; |
|
|
|
|
struct commit *commit; |
|
|
|
|
struct tree *tree; |
|
|
|
|
struct tree_desc tree; |
|
|
|
|
|
|
|
|
|
setup_git_directory(); |
|
|
|
|
|
|
|
|
@ -395,8 +396,8 @@ int main(int argc, char **argv)
@@ -395,8 +396,8 @@ int main(int argc, char **argv)
|
|
|
|
|
write_global_extended_header(commit->object.sha1); |
|
|
|
|
archive_time = commit->date; |
|
|
|
|
} |
|
|
|
|
tree = parse_tree_indirect(sha1); |
|
|
|
|
if (!tree) |
|
|
|
|
tree.buf = read_object_with_reference(sha1, "tree", &tree.size, NULL); |
|
|
|
|
if (!tree.buf) |
|
|
|
|
die("not a reference to a tag, commit or tree object: %s", |
|
|
|
|
sha1_to_hex(sha1)); |
|
|
|
|
if (!archive_time) |
|
|
|
@ -404,7 +405,7 @@ int main(int argc, char **argv)
@@ -404,7 +405,7 @@ int main(int argc, char **argv)
|
|
|
|
|
if (basedir) |
|
|
|
|
write_header((unsigned char *)"0", TYPEFLAG_DIR, NULL, NULL, |
|
|
|
|
basedir, 040777, NULL, 0); |
|
|
|
|
traverse_tree(tree, NULL); |
|
|
|
|
traverse_tree(&tree, NULL); |
|
|
|
|
write_trailer(); |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|