Commit e93af304 by nulltoken

checkout: introduce git_checkout_index()

parent 3aa443a9
...@@ -71,6 +71,20 @@ GIT_EXTERN(int) git_checkout_reference( ...@@ -71,6 +71,20 @@ GIT_EXTERN(int) git_checkout_reference(
git_indexer_stats *stats); git_indexer_stats *stats);
/** /**
* Updates files in the working tree to match the content of the index.
*
* @param repo repository to check out (must be non-bare)
* @param opts specifies checkout options (may be NULL)
* @param stats structure through which progress information is reported
* @return 0 on success, GIT_ERROR otherwise (use giterr_last for information
* about the error)
*/
GIT_EXTERN(int) git_checkout_index(
git_repository *repo,
git_checkout_opts *opts,
git_indexer_stats *stats);
/**
* Updates files in the index and working tree to match the content of the * Updates files in the index and working tree to match the content of the
* tree pointed at by the treeish. * tree pointed at by the treeish.
* *
......
...@@ -220,14 +220,12 @@ static void normalize_options(git_checkout_opts *normalized, git_checkout_opts * ...@@ -220,14 +220,12 @@ static void normalize_options(git_checkout_opts *normalized, git_checkout_opts *
normalized->file_open_flags = O_CREAT | O_TRUNC | O_WRONLY; normalized->file_open_flags = O_CREAT | O_TRUNC | O_WRONLY;
} }
int git_checkout_tree( int git_checkout_index(
git_repository *repo, git_repository *repo,
git_object *treeish,
git_checkout_opts *opts, git_checkout_opts *opts,
git_indexer_stats *stats) git_indexer_stats *stats)
{ {
git_index *index = NULL; git_index *index = NULL;
git_tree *tree = NULL;
git_diff_list *diff = NULL; git_diff_list *diff = NULL;
git_indexer_stats dummy_stats; git_indexer_stats dummy_stats;
...@@ -239,25 +237,11 @@ int git_checkout_tree( ...@@ -239,25 +237,11 @@ int git_checkout_tree(
int error; int error;
assert(repo && treeish); assert(repo);
if ((git_repository__ensure_not_bare(repo, "checkout")) < 0) if ((git_repository__ensure_not_bare(repo, "checkout")) < 0)
return GIT_EBAREREPO; return GIT_EBAREREPO;
if (git_object_peel((git_object **)&tree, treeish, GIT_OBJ_TREE) < 0) {
giterr_set(GITERR_INVALID, "Provided treeish cannot be peeled into a tree.");
return GIT_ERROR;
}
if ((error = git_repository_index(&index, repo)) < 0)
goto cleanup;
if ((error = git_index_read_tree(index, tree, NULL)) < 0)
goto cleanup;
if ((error = git_index_write(index)) < 0)
goto cleanup;
diff_opts.flags = GIT_DIFF_INCLUDE_UNTRACKED; diff_opts.flags = GIT_DIFF_INCLUDE_UNTRACKED;
if (opts && opts->paths) { if (opts && opts->paths) {
...@@ -277,6 +261,10 @@ int git_checkout_tree( ...@@ -277,6 +261,10 @@ int git_checkout_tree(
stats = &dummy_stats; stats = &dummy_stats;
stats->processed = 0; stats->processed = 0;
if ((git_repository_index(&index, repo)) < 0)
goto cleanup;
stats->total = git_index_entrycount(index); stats->total = git_index_entrycount(index);
memset(&data, 0, sizeof(data)); memset(&data, 0, sizeof(data));
...@@ -293,10 +281,44 @@ int git_checkout_tree( ...@@ -293,10 +281,44 @@ int git_checkout_tree(
error = git_diff_foreach(diff, &data, checkout_diff_fn, NULL, NULL); error = git_diff_foreach(diff, &data, checkout_diff_fn, NULL, NULL);
cleanup: cleanup:
git_index_free(index);
git_diff_list_free(diff); git_diff_list_free(diff);
git_buf_free(&workdir);
return error;
}
int git_checkout_tree(
git_repository *repo,
git_object *treeish,
git_checkout_opts *opts,
git_indexer_stats *stats)
{
git_index *index = NULL;
git_tree *tree = NULL;
int error;
assert(repo && treeish);
if (git_object_peel((git_object **)&tree, treeish, GIT_OBJ_TREE) < 0) {
giterr_set(GITERR_INVALID, "Provided treeish cannot be peeled into a tree.");
return GIT_ERROR;
}
if ((error = git_repository_index(&index, repo)) < 0)
goto cleanup;
if ((error = git_index_read_tree(index, tree, NULL)) < 0)
goto cleanup;
if ((error = git_index_write(index)) < 0)
goto cleanup;
error = git_checkout_index(repo, opts, stats);
cleanup:
git_index_free(index); git_index_free(index);
git_tree_free(tree); git_tree_free(tree);
git_buf_free(&workdir);
return error; return error;
} }
......
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