diff --git a/src/checkout.c b/src/checkout.c index f3bee6b94..cd4bc5a62 100644 --- a/src/checkout.c +++ b/src/checkout.c @@ -15,6 +15,7 @@ #include "common.h" #include "refs.h" +#include "buffer.h" GIT_BEGIN_DECL @@ -42,6 +43,43 @@ static int get_head_tree(git_tree **out, git_repository *repo) return retcode; } +typedef struct tree_walk_data +{ + git_indexer_stats *stats; +} tree_walk_data; + + +static int count_walker(const char *path, git_tree_entry *entry, void *payload) +{ + GIT_UNUSED(path); + GIT_UNUSED(entry); + ((tree_walk_data*)payload)->stats->total++; + return 0; +} + +static int checkout_walker(const char *path, git_tree_entry *entry, void *payload) +{ + int retcode = 0; + tree_walk_data *data = (tree_walk_data*)payload; + + switch(git_tree_entry_type(entry)) { + case GIT_OBJ_TREE: + /* TODO: mkdir */ + break; + + case GIT_OBJ_BLOB: + /* TODO: create/populate file */ + break; + + default: + retcode = -1; + break; + } + + data->stats->processed++; + return retcode; +} + /* TODO * -> Line endings */ @@ -50,13 +88,23 @@ int git_checkout_force(git_repository *repo, git_indexer_stats *stats) int retcode = GIT_ERROR; git_indexer_stats dummy_stats; git_tree *tree; + tree_walk_data payload; assert(repo); if (!stats) stats = &dummy_stats; + stats->total = stats->processed = 0; + payload.stats = stats; + if (!get_head_tree(&tree, repo)) { - /* TODO */ - retcode = 0; + /* Count all the tree nodes for progress information */ + if (!git_tree_walk(tree, count_walker, GIT_TREEWALK_POST, &payload)) { + /* Checkout the files */ + if (!git_tree_walk(tree, checkout_walker, GIT_TREEWALK_POST, &payload)) { + retcode = 0; + } + } + git_tree_free(tree); } return retcode;