checkout: create submodule dirs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
diff --git a/src/checkout.c b/src/checkout.c
index c4e75b6..c2e1c49 100644
--- a/src/checkout.c
+++ b/src/checkout.c
@@ -87,8 +87,11 @@ static int checkout_walker(const char *path, const git_tree_entry *entry, void *
int retcode = 0;
tree_walk_data *data = (tree_walk_data*)payload;
int attr = git_tree_entry_attributes(entry);
-
- /* TODO: handle submodules */
+ git_buf fnbuf = GIT_BUF_INIT;
+ git_buf_join_n(&fnbuf, '/', 3,
+ git_repository_workdir(data->repo),
+ path,
+ git_tree_entry_name(entry));
switch(git_tree_entry_type(entry))
{
@@ -96,21 +99,18 @@ static int checkout_walker(const char *path, const git_tree_entry *entry, void *
/* Nothing to do; the blob handling creates necessary directories. */
break;
+ case GIT_OBJ_COMMIT:
+ /* Submodule */
+ retcode = p_mkdir(git_buf_cstr(&fnbuf), 0644);
+ 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));
- if (S_ISLNK(attr)) {
- retcode = blob_contents_to_link(data, &fnbuf,
- git_tree_entry_id(entry));
- } else {
- retcode = blob_contents_to_file(data->repo, &fnbuf,
- git_tree_entry_id(entry), attr);
- }
- git_buf_free(&fnbuf);
+ if (S_ISLNK(attr)) {
+ retcode = blob_contents_to_link(data, &fnbuf,
+ git_tree_entry_id(entry));
+ } else {
+ retcode = blob_contents_to_file(data->repo, &fnbuf,
+ git_tree_entry_id(entry), attr);
}
break;
@@ -119,6 +119,7 @@ static int checkout_walker(const char *path, const git_tree_entry *entry, void *
break;
}
+ git_buf_free(&fnbuf);
data->stats->processed++;
return retcode;
}