summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBen Straub <bstraub@github.com>2012-07-30 14:37:40 -0700
committerBen Straub <bstraub@github.com>2012-07-30 14:37:40 -0700
commitf1587b97a11e3a7283b32f5af46b7d057b8be4c5 (patch)
treeb028efd2921b06c5c94db33abea9b83d0ff6edfb /src
parente0681f6d07a9f6041e7450af4715a8df8552ad2e (diff)
downloadlibgit2-f1587b97a11e3a7283b32f5af46b7d057b8be4c5.tar.gz
Checkout: use git_index_read_tree_with_stats.
New variant of git_index_read_tree that fills in the 'total' field of a git_indexer_stats struct as it's walking the tree.
Diffstat (limited to 'src')
-rw-r--r--src/checkout.c3
-rw-r--r--src/index.c27
2 files changed, 24 insertions, 6 deletions
diff --git a/src/checkout.c b/src/checkout.c
index 81389a77a..3eed002ec 100644
--- a/src/checkout.c
+++ b/src/checkout.c
@@ -191,8 +191,7 @@ int git_checkout_head(git_repository *repo, git_checkout_opts *opts, git_indexer
if (!git_repository_head_tree(&tree, repo)) {
git_index *idx;
if (!(retcode = git_repository_index(&idx, repo))) {
- /* TODO: Make git_index_read_tree fill in stats->total */
- if (!(retcode = git_index_read_tree(idx, tree))) {
+ if (!(retcode = git_index_read_tree_with_stats(idx, tree, stats))) {
retcode = git_tree_walk(tree, checkout_walker, GIT_TREEWALK_POST, &payload);
}
git_index_free(idx);
diff --git a/src/index.c b/src/index.c
index 89d479870..434c1f102 100644
--- a/src/index.c
+++ b/src/index.c
@@ -985,12 +985,19 @@ int git_index_entry_stage(const git_index_entry *entry)
return (entry->flags & GIT_IDXENTRY_STAGEMASK) >> GIT_IDXENTRY_STAGESHIFT;
}
+typedef struct read_tree_data {
+ git_index *index;
+ git_indexer_stats *stats;
+} read_tree_data;
+
static int read_tree_cb(const char *root, const git_tree_entry *tentry, void *data)
{
- git_index *index = data;
+ read_tree_data *rtd = data;
git_index_entry *entry = NULL;
git_buf path = GIT_BUF_INIT;
+ rtd->stats->total++;
+
if (git_tree_entry__is_tree(tentry))
return 0;
@@ -1005,7 +1012,7 @@ static int read_tree_cb(const char *root, const git_tree_entry *tentry, void *da
entry->path = git_buf_detach(&path);
git_buf_free(&path);
- if (index_insert(index, entry, 0) < 0) {
+ if (index_insert(rtd->index, entry, 0) < 0) {
index_entry_free(entry);
return -1;
}
@@ -1013,9 +1020,21 @@ static int read_tree_cb(const char *root, const git_tree_entry *tentry, void *da
return 0;
}
-int git_index_read_tree(git_index *index, git_tree *tree)
+int git_index_read_tree_with_stats(git_index *index, git_tree *tree, git_indexer_stats *stats)
{
+ git_indexer_stats dummy_stats;
+ read_tree_data rtd = {index, NULL};
+
+ if (!stats) stats = &dummy_stats;
+ stats->total = 0;
+ rtd.stats = stats;
+
git_index_clear(index);
- return git_tree_walk(tree, read_tree_cb, GIT_TREEWALK_POST, index);
+ return git_tree_walk(tree, read_tree_cb, GIT_TREEWALK_POST, &rtd);
+}
+
+int git_index_read_tree(git_index *index, git_tree *tree)
+{
+ return git_index_read_tree_with_stats(index, tree, NULL);
}