mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-06 21:44:58 +00:00
Checkout: reindent, fix uninit. variable.
This commit is contained in:
parent
0e874b12d8
commit
4a26ee4fd4
221
src/checkout.c
221
src/checkout.c
@ -25,160 +25,159 @@ GIT_BEGIN_DECL
|
||||
|
||||
static int get_head_tree(git_tree **out, git_repository *repo)
|
||||
{
|
||||
int retcode = GIT_ERROR;
|
||||
git_reference *head = NULL;
|
||||
int retcode = GIT_ERROR;
|
||||
git_reference *head = NULL;
|
||||
|
||||
/* Dereference HEAD all the way to an OID ref */
|
||||
if (!git_reference_lookup_resolved(&head, repo, GIT_HEAD_FILE, -1)) {
|
||||
/* The OID should be a commit */
|
||||
git_object *commit;
|
||||
if (!git_object_lookup(&commit, repo,
|
||||
git_reference_oid(head), GIT_OBJ_COMMIT)) {
|
||||
/* Get the tree */
|
||||
if (!git_commit_tree(out, (git_commit*)commit)) {
|
||||
retcode = 0;
|
||||
}
|
||||
git_object_free(commit);
|
||||
}
|
||||
git_reference_free(head);
|
||||
}
|
||||
/* Dereference HEAD all the way to an OID ref */
|
||||
if (!git_reference_lookup_resolved(&head, repo, GIT_HEAD_FILE, -1)) {
|
||||
/* The OID should be a commit */
|
||||
git_object *commit;
|
||||
if (!git_object_lookup(&commit, repo,
|
||||
git_reference_oid(head), GIT_OBJ_COMMIT)) {
|
||||
/* Get the tree */
|
||||
if (!git_commit_tree(out, (git_commit*)commit)) {
|
||||
retcode = 0;
|
||||
}
|
||||
git_object_free(commit);
|
||||
}
|
||||
git_reference_free(head);
|
||||
}
|
||||
|
||||
return retcode;
|
||||
return retcode;
|
||||
}
|
||||
|
||||
typedef struct tree_walk_data
|
||||
{
|
||||
git_indexer_stats *stats;
|
||||
git_repository *repo;
|
||||
git_indexer_stats *stats;
|
||||
git_repository *repo;
|
||||
} tree_walk_data;
|
||||
|
||||
|
||||
/* TODO: murder this */
|
||||
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;
|
||||
GIT_UNUSED(path);
|
||||
GIT_UNUSED(entry);
|
||||
((tree_walk_data*)payload)->stats->total++;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int apply_filters(git_buf *out,
|
||||
git_vector *filters,
|
||||
const void *data,
|
||||
size_t len)
|
||||
git_vector *filters,
|
||||
const void *data,
|
||||
size_t len)
|
||||
{
|
||||
int retcode = GIT_ERROR;
|
||||
int retcode = GIT_ERROR;
|
||||
|
||||
git_buf_clear(out);
|
||||
git_buf_clear(out);
|
||||
|
||||
if (!filters->length) {
|
||||
/* No filters to apply; just copy the result */
|
||||
git_buf_put(out, data, len);
|
||||
return 0;
|
||||
}
|
||||
if (!filters->length) {
|
||||
/* No filters to apply; just copy the result */
|
||||
git_buf_put(out, data, len);
|
||||
return 0;
|
||||
}
|
||||
|
||||
git_buf origblob;
|
||||
git_buf_attach(&origblob, (char*)data, len);
|
||||
retcode = git_filters_apply(out, &origblob, filters);
|
||||
git_buf_detach(&origblob);
|
||||
git_buf origblob = GIT_BUF_INIT;
|
||||
git_buf_attach(&origblob, (char*)data, len);
|
||||
retcode = git_filters_apply(out, &origblob, filters);
|
||||
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)
|
||||
{
|
||||
int retcode = GIT_ERROR;
|
||||
int retcode = GIT_ERROR;
|
||||
|
||||
git_blob *blob;
|
||||
if (!git_blob_lookup(&blob, repo, id)) {
|
||||
const void *contents = git_blob_rawcontent(blob);
|
||||
size_t len = git_blob_rawsize(blob);
|
||||
git_vector filters = GIT_VECTOR_INIT;
|
||||
int filter_count;
|
||||
git_blob *blob;
|
||||
if (!git_blob_lookup(&blob, repo, id)) {
|
||||
const void *contents = git_blob_rawcontent(blob);
|
||||
size_t len = git_blob_rawsize(blob);
|
||||
git_vector filters = GIT_VECTOR_INIT;
|
||||
int filter_count;
|
||||
|
||||
/* TODO: line-ending smudging */
|
||||
filter_count = git_filters_load(&filters, repo,
|
||||
git_buf_cstr(fnbuf),
|
||||
GIT_FILTER_TO_WORKTREE);
|
||||
printf("Got %d filters\n", filter_count);
|
||||
if (filter_count >= 0) {
|
||||
git_buf filteredblob = GIT_BUF_INIT;
|
||||
if (!apply_filters(&filteredblob, &filters, contents, len)) {
|
||||
int fd = git_futils_creat_withpath(git_buf_cstr(fnbuf),
|
||||
GIT_DIR_MODE, mode);
|
||||
if (fd >= 0) {
|
||||
retcode = (!p_write(fd, contents, len)) ? 0 : GIT_ERROR;
|
||||
p_close(fd);
|
||||
}
|
||||
}
|
||||
}
|
||||
/* TODO: line-ending smudging */
|
||||
filter_count = git_filters_load(&filters, repo,
|
||||
git_buf_cstr(fnbuf),
|
||||
GIT_FILTER_TO_WORKTREE);
|
||||
if (filter_count >= 0) {
|
||||
git_buf filteredblob = GIT_BUF_INIT;
|
||||
if (!apply_filters(&filteredblob, &filters, contents, len)) {
|
||||
int fd = git_futils_creat_withpath(git_buf_cstr(fnbuf),
|
||||
GIT_DIR_MODE, mode);
|
||||
if (fd >= 0) {
|
||||
retcode = (!p_write(fd, contents, len)) ? 0 : GIT_ERROR;
|
||||
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)
|
||||
{
|
||||
int retcode = 0;
|
||||
tree_walk_data *data = (tree_walk_data*)payload;
|
||||
int attr = git_tree_entry_attributes(entry);
|
||||
int retcode = 0;
|
||||
tree_walk_data *data = (tree_walk_data*)payload;
|
||||
int attr = git_tree_entry_attributes(entry);
|
||||
|
||||
switch(git_tree_entry_type(entry)) {
|
||||
case GIT_OBJ_TREE:
|
||||
/* TODO: mkdir? */
|
||||
break;
|
||||
switch(git_tree_entry_type(entry)) {
|
||||
case GIT_OBJ_TREE:
|
||||
/* TODO: mkdir? */
|
||||
break;
|
||||
|
||||
case GIT_OBJ_BLOB:
|
||||
{
|
||||
git_buf fnbuf = GIT_BUF_INIT;
|
||||
git_buf_join_n(&fnbuf, '/', 3,
|
||||
git_repository_workdir(data->repo),
|
||||
path,
|
||||
git_tree_entry_name(entry));
|
||||
retcode = blob_contents_to_file(data->repo, &fnbuf, git_tree_entry_id(entry), attr);
|
||||
git_buf_free(&fnbuf);
|
||||
}
|
||||
break;
|
||||
case GIT_OBJ_BLOB:
|
||||
{
|
||||
git_buf fnbuf = GIT_BUF_INIT;
|
||||
git_buf_join_n(&fnbuf, '/', 3,
|
||||
git_repository_workdir(data->repo),
|
||||
path,
|
||||
git_tree_entry_name(entry));
|
||||
retcode = blob_contents_to_file(data->repo, &fnbuf, git_tree_entry_id(entry), attr);
|
||||
git_buf_free(&fnbuf);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
retcode = -1;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
retcode = -1;
|
||||
break;
|
||||
}
|
||||
|
||||
data->stats->processed++;
|
||||
return retcode;
|
||||
data->stats->processed++;
|
||||
return retcode;
|
||||
}
|
||||
|
||||
/* TODO
|
||||
* -> Line endings
|
||||
*/
|
||||
|
||||
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;
|
||||
int retcode = GIT_ERROR;
|
||||
git_indexer_stats dummy_stats;
|
||||
git_tree *tree;
|
||||
tree_walk_data payload;
|
||||
|
||||
assert(repo);
|
||||
if (!stats) stats = &dummy_stats;
|
||||
assert(repo);
|
||||
if (!stats) stats = &dummy_stats;
|
||||
|
||||
stats->total = stats->processed = 0;
|
||||
payload.stats = stats;
|
||||
payload.repo = repo;
|
||||
stats->total = stats->processed = 0;
|
||||
payload.stats = stats;
|
||||
payload.repo = repo;
|
||||
|
||||
if (!get_head_tree(&tree, repo)) {
|
||||
/* 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);
|
||||
}
|
||||
if (!get_head_tree(&tree, repo)) {
|
||||
/* 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;
|
||||
return retcode;
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user