commit f715ca7f097cb62ed88c26483f966c5c628d96e7 from: Stefan Sperling date: Mon Nov 27 00:10:58 2017 UTC move printing of tree objects into regression test commit - 0ffeb3c2d8dbe6ae565c5a4ae78d63c74897d102 commit + f715ca7f097cb62ed88c26483f966c5c628d96e7 blob - f4cdddb788293a815d8951ca973ba1e28f3dedfb blob + ba716d03ea4d230704feb345266231ccd3603142 --- lib/object.c +++ lib/object.c @@ -474,9 +474,6 @@ parse_tree_entry(struct got_tree_entry **te, size_t *e 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); @@ -484,30 +481,6 @@ done: } 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) { @@ -527,18 +500,9 @@ parse_tree_object(struct got_tree_object **tree, struc 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); @@ -688,4 +652,13 @@ got_object_tree_open(struct got_tree_object **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 @@ -56,17 +56,60 @@ print_parent_commits(struct got_commit_object *commit, } 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 * @@ -96,8 +139,10 @@ print_commit_object(struct got_object *obj, struct got 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);