Skip to content

Commit

Permalink
Checkout: read blob objects to file.
Browse files Browse the repository at this point in the history
Properly handling file modes. Still needs line-
ending transformations.
  • Loading branch information
Ben Straub committed Jun 25, 2012
1 parent 830388a commit 24b0d3d
Showing 1 changed file with 39 additions and 2 deletions.
41 changes: 39 additions & 2 deletions src/checkout.c
Expand Up @@ -12,10 +12,12 @@
#include "git2/refs.h"
#include "git2/tree.h"
#include "git2/commit.h"
#include "git2/blob.h"

#include "common.h"
#include "refs.h"
#include "buffer.h"
#include "repository.h"

GIT_BEGIN_DECL

Expand Down Expand Up @@ -46,6 +48,7 @@ static int get_head_tree(git_tree **out, git_repository *repo)
typedef struct tree_walk_data
{
git_indexer_stats *stats;
git_repository *repo;
} tree_walk_data;


Expand All @@ -57,18 +60,51 @@ static int count_walker(const char *path, git_tree_entry *entry, void *payload)
return 0;
}

static int blob_contents_to_file(git_repository *repo, git_buf *fnbuf, const git_oid *id, int mode)
{
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);

/* TODO: line-ending smudging */

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_blob_free(blob);
}

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);

switch(git_tree_entry_type(entry)) {
case GIT_OBJ_TREE:
/* TODO: mkdir */
/* TODO: mkdir? */
break;

case GIT_OBJ_BLOB:
/* TODO: create/populate file */
{
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:
Expand All @@ -95,6 +131,7 @@ int git_checkout_force(git_repository *repo, git_indexer_stats *stats)

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 */
Expand Down

0 comments on commit 24b0d3d

Please sign in to comment.