Commit 4a26ee4f by Ben Straub

Checkout: reindent, fix uninit. variable.

parent 0e874b12
...@@ -25,160 +25,159 @@ GIT_BEGIN_DECL ...@@ -25,160 +25,159 @@ GIT_BEGIN_DECL
static int get_head_tree(git_tree **out, git_repository *repo) static int get_head_tree(git_tree **out, git_repository *repo)
{ {
int retcode = GIT_ERROR; int retcode = GIT_ERROR;
git_reference *head = NULL; git_reference *head = NULL;
/* Dereference HEAD all the way to an OID ref */ /* Dereference HEAD all the way to an OID ref */
if (!git_reference_lookup_resolved(&head, repo, GIT_HEAD_FILE, -1)) { if (!git_reference_lookup_resolved(&head, repo, GIT_HEAD_FILE, -1)) {
/* The OID should be a commit */ /* The OID should be a commit */
git_object *commit; git_object *commit;
if (!git_object_lookup(&commit, repo, if (!git_object_lookup(&commit, repo,
git_reference_oid(head), GIT_OBJ_COMMIT)) { git_reference_oid(head), GIT_OBJ_COMMIT)) {
/* Get the tree */ /* Get the tree */
if (!git_commit_tree(out, (git_commit*)commit)) { if (!git_commit_tree(out, (git_commit*)commit)) {
retcode = 0; retcode = 0;
} }
git_object_free(commit); git_object_free(commit);
} }
git_reference_free(head); git_reference_free(head);
} }
return retcode; return retcode;
} }
typedef struct tree_walk_data typedef struct tree_walk_data
{ {
git_indexer_stats *stats; git_indexer_stats *stats;
git_repository *repo; git_repository *repo;
} tree_walk_data; } tree_walk_data;
/* TODO: murder this */
static int count_walker(const char *path, git_tree_entry *entry, void *payload) static int count_walker(const char *path, git_tree_entry *entry, void *payload)
{ {
GIT_UNUSED(path); GIT_UNUSED(path);
GIT_UNUSED(entry); GIT_UNUSED(entry);
((tree_walk_data*)payload)->stats->total++; ((tree_walk_data*)payload)->stats->total++;
return 0; return 0;
} }
static int apply_filters(git_buf *out, static int apply_filters(git_buf *out,
git_vector *filters, git_vector *filters,
const void *data, const void *data,
size_t len) size_t len)
{ {
int retcode = GIT_ERROR; int retcode = GIT_ERROR;
git_buf_clear(out); git_buf_clear(out);
if (!filters->length) { if (!filters->length) {
/* No filters to apply; just copy the result */ /* No filters to apply; just copy the result */
git_buf_put(out, data, len); git_buf_put(out, data, len);
return 0; return 0;
} }
git_buf origblob; git_buf origblob = GIT_BUF_INIT;
git_buf_attach(&origblob, (char*)data, len); git_buf_attach(&origblob, (char*)data, len);
retcode = git_filters_apply(out, &origblob, filters); retcode = git_filters_apply(out, &origblob, filters);
git_buf_detach(&origblob); git_buf_detach(&origblob);
return retcode; return retcode;
} }
static int blob_contents_to_file(git_repository *repo, git_buf *fnbuf, const git_oid *id, int mode) static int blob_contents_to_file(git_repository *repo, git_buf *fnbuf, const git_oid *id, int mode)
{ {
int retcode = GIT_ERROR; int retcode = GIT_ERROR;
git_blob *blob; git_blob *blob;
if (!git_blob_lookup(&blob, repo, id)) { if (!git_blob_lookup(&blob, repo, id)) {
const void *contents = git_blob_rawcontent(blob); const void *contents = git_blob_rawcontent(blob);
size_t len = git_blob_rawsize(blob); size_t len = git_blob_rawsize(blob);
git_vector filters = GIT_VECTOR_INIT; git_vector filters = GIT_VECTOR_INIT;
int filter_count; int filter_count;
/* TODO: line-ending smudging */ /* TODO: line-ending smudging */
filter_count = git_filters_load(&filters, repo, filter_count = git_filters_load(&filters, repo,
git_buf_cstr(fnbuf), git_buf_cstr(fnbuf),
GIT_FILTER_TO_WORKTREE); GIT_FILTER_TO_WORKTREE);
printf("Got %d filters\n", filter_count); if (filter_count >= 0) {
if (filter_count >= 0) { git_buf filteredblob = GIT_BUF_INIT;
git_buf filteredblob = GIT_BUF_INIT; if (!apply_filters(&filteredblob, &filters, contents, len)) {
if (!apply_filters(&filteredblob, &filters, contents, len)) { int fd = git_futils_creat_withpath(git_buf_cstr(fnbuf),
int fd = git_futils_creat_withpath(git_buf_cstr(fnbuf), GIT_DIR_MODE, mode);
GIT_DIR_MODE, mode); if (fd >= 0) {
if (fd >= 0) { retcode = (!p_write(fd, contents, len)) ? 0 : GIT_ERROR;
retcode = (!p_write(fd, contents, len)) ? 0 : GIT_ERROR; p_close(fd);
p_close(fd); }
} }
} git_buf_free(&filteredblob);
} }
git_blob_free(blob); git_blob_free(blob);
} }
return retcode; return retcode;
} }
static int checkout_walker(const char *path, git_tree_entry *entry, void *payload) static int checkout_walker(const char *path, git_tree_entry *entry, void *payload)
{ {
int retcode = 0; int retcode = 0;
tree_walk_data *data = (tree_walk_data*)payload; tree_walk_data *data = (tree_walk_data*)payload;
int attr = git_tree_entry_attributes(entry); int attr = git_tree_entry_attributes(entry);
switch(git_tree_entry_type(entry)) { switch(git_tree_entry_type(entry)) {
case GIT_OBJ_TREE: case GIT_OBJ_TREE:
/* TODO: mkdir? */ /* TODO: mkdir? */
break; break;
case GIT_OBJ_BLOB: case GIT_OBJ_BLOB:
{ {
git_buf fnbuf = GIT_BUF_INIT; git_buf fnbuf = GIT_BUF_INIT;
git_buf_join_n(&fnbuf, '/', 3, git_buf_join_n(&fnbuf, '/', 3,
git_repository_workdir(data->repo), git_repository_workdir(data->repo),
path, path,
git_tree_entry_name(entry)); git_tree_entry_name(entry));
retcode = blob_contents_to_file(data->repo, &fnbuf, git_tree_entry_id(entry), attr); retcode = blob_contents_to_file(data->repo, &fnbuf, git_tree_entry_id(entry), attr);
git_buf_free(&fnbuf); git_buf_free(&fnbuf);
} }
break; break;
default: default:
retcode = -1; retcode = -1;
break; break;
} }
data->stats->processed++; data->stats->processed++;
return retcode; return retcode;
} }
/* TODO
* -> Line endings
*/
int git_checkout_force(git_repository *repo, git_indexer_stats *stats) int git_checkout_force(git_repository *repo, git_indexer_stats *stats)
{ {
int retcode = GIT_ERROR; int retcode = GIT_ERROR;
git_indexer_stats dummy_stats; git_indexer_stats dummy_stats;
git_tree *tree; git_tree *tree;
tree_walk_data payload; tree_walk_data payload;
assert(repo); assert(repo);
if (!stats) stats = &dummy_stats; if (!stats) stats = &dummy_stats;
stats->total = stats->processed = 0; stats->total = stats->processed = 0;
payload.stats = stats; payload.stats = stats;
payload.repo = repo; payload.repo = repo;
if (!get_head_tree(&tree, repo)) { if (!get_head_tree(&tree, repo)) {
/* Count all the tree nodes for progress information */ /* Count all the tree nodes for progress information */
if (!git_tree_walk(tree, count_walker, GIT_TREEWALK_POST, &payload)) { if (!git_tree_walk(tree, count_walker, GIT_TREEWALK_POST, &payload)) {
/* Checkout the files */ /* Checkout the files */
if (!git_tree_walk(tree, checkout_walker, GIT_TREEWALK_POST, &payload)) { if (!git_tree_walk(tree, checkout_walker, GIT_TREEWALK_POST, &payload)) {
retcode = 0; retcode = 0;
} }
} }
git_tree_free(tree); git_tree_free(tree);
} }
return retcode; 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