Checkout: initial tree walkers.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
diff --git a/src/checkout.c b/src/checkout.c
index f3bee6b..cd4bc5a 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;