commit - 0ffeb3c2d8dbe6ae565c5a4ae78d63c74897d102
commit + f715ca7f097cb62ed88c26483f966c5c628d96e7
blob - f4cdddb788293a815d8951ca973ba1e28f3dedfb
blob + ba716d03ea4d230704feb345266231ccd3603142
--- lib/object.c
+++ lib/object.c
buf += strlen(buf) + 1;
memcpy((*te)->id.sha1, buf, SHA1_DIGEST_LENGTH);
*elen += SHA1_DIGEST_LENGTH;
-
- printf("%s %s%s\n", got_object_id_str(&(*te)->id, hex, sizeof(hex)),
- (*te)->name, mode_trailer((*te)->mode));
done:
if (err)
tree_entry_close(*te);
}
static const struct got_error *
-open_tree_recursive(struct got_object_id *id, struct got_repository *repo)
-{
- struct got_object *obj;
- struct got_tree_object *tree;
- const struct got_error *err;
-
- err = got_object_open(&obj, repo, id);
- if (err)
- return err;
- if (obj->type != GOT_OBJ_TYPE_TREE)
- return got_error(GOT_ERR_OBJ_TYPE);
-
- err = got_object_tree_open(&tree, repo, obj);
- if (err) {
- got_object_close(obj);
- return err;
- }
-
- got_object_tree_close(tree);
- got_object_close(obj);
- return NULL;
-}
-
-static const struct got_error *
parse_tree_object(struct got_tree_object **tree, struct got_repository *repo,
char *buf, size_t len)
{
parse_tree_entry(&te, &elen, buf, remain);
(*tree)->nentries++;
SIMPLEQ_INSERT_TAIL(&(*tree)->entries, te, entry);
- if (S_ISDIR(te->mode)) {
- const struct got_error *err;
- err = open_tree_recursive(&te->id, repo);
- if (err) {
- got_object_tree_close(*tree);
- return err;
- }
- }
buf += elen;
remain -= elen;
}
- printf("\n");
if (remain != 0) {
got_object_tree_close(*tree);
void
got_object_tree_close(struct got_tree_object *tree)
{
+ struct got_tree_entry *te;
+
+ while (!SIMPLEQ_EMPTY(&tree->entries)) {
+ te = SIMPLEQ_FIRST(&tree->entries);
+ SIMPLEQ_REMOVE_HEAD(&tree->entries, entry);
+ tree_entry_close(te);
+ }
+
+ free(tree);
}
blob - 2044938135e906df60393fc61d80b70c7c452e9a
blob + d5a430de14f9e3491cb122739a767733028c7718
--- regress/repository/repository_test.c
+++ regress/repository/repository_test.c
}
static const struct got_error *
-print_tree_object(struct got_object *obj, struct got_repository *repo)
+print_tree_object(struct got_object *obj, char *parent,
+ struct got_repository *repo)
{
struct got_tree_object *tree;
+ struct got_tree_entry *te;
const struct got_error *err;
+ char hex[SHA1_DIGEST_STRING_LENGTH];
err = got_object_tree_open(&tree, repo, obj);
if (err != NULL)
return err;
+ SIMPLEQ_FOREACH(te, &tree->entries, entry) {
+ struct got_object *treeobj;
+ char *next_parent;
+
+ if (!S_ISDIR(te->mode)) {
+ printf("%s %s/%s\n",
+ got_object_id_str(&te->id, hex, sizeof(hex)),
+ parent, te->name);
+ continue;
+ }
+ printf("%s %s/%s\n",
+ got_object_id_str(&te->id, hex, sizeof(hex)),
+ parent, te->name);
+
+ err = got_object_open(&treeobj, repo, &te->id);
+ if (err != NULL)
+ break;
+
+ if (treeobj->type != GOT_OBJ_TYPE_TREE) {
+ err = got_error(GOT_ERR_OBJ_TYPE);
+ got_object_close(treeobj);
+ break;
+ }
+
+ if (asprintf(&next_parent, "%s/%s", parent, te->name) == -1) {
+ err = got_error(GOT_ERR_NO_MEM);
+ got_object_close(treeobj);
+ break;
+ }
+
+ err = print_tree_object(treeobj, next_parent, repo);
+ free(next_parent);
+ if (err) {
+ got_object_close(treeobj);
+ break;
+ }
+
+ got_object_close(treeobj);
+ }
+
got_object_tree_close(tree);
- return NULL;
+ return err;
}
static const struct got_error *
err = got_object_open(&treeobj, repo, &commit->tree_id);
if (err != NULL)
return err;
- if (treeobj->type == GOT_OBJ_TYPE_TREE)
- print_tree_object(treeobj, repo);
+ if (treeobj->type == GOT_OBJ_TYPE_TREE) {
+ print_tree_object(treeobj, "", repo);
+ printf("\n");
+ }
got_object_close(treeobj);
err = print_parent_commits(commit, repo);