Commit ec532d5e by Ben Straub

Checkout: initial tree walkers.

parent cb2dc0b0
......@@ -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,14 +88,24 @@ 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 */
/* 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;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment