Commit ec532d5eded489d5d031d199200b6223573c9365

Ben Straub 2012-06-21T14:54:12

Checkout: initial tree walkers.

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;