commit 93a3027739b17cdd9bccd7bda53f581b919b87ea from: Stefan Sperling date: Mon Dec 24 19:11:47 2018 UTC make got_worktree_checkout_files() infer base commit from meta data commit - 65596e15914f3e70494e33e84a842d7ce360c1e7 commit + 93a3027739b17cdd9bccd7bda53f581b919b87ea blob - 4f7d23771ac7850de8807514c25be47cc3ceb7fc blob + fec08d6e7aa2616d656e927be6b0417754d3c805 --- got/got.c +++ got/got.c @@ -283,7 +283,7 @@ cmd_checkout(int argc, char *argv[]) if (error != NULL) goto done; - error = got_worktree_checkout_files(worktree, head_ref, repo, + error = got_worktree_checkout_files(worktree, repo, checkout_progress, worktree_path, checkout_cancel, NULL); if (error != NULL) goto done; blob - 806d598ff338396a2c65dc8d684657dde47f4316 blob + 06af45d140806cd9cccbab4aa32668e5689f53cf --- include/got_worktree.h +++ include/got_worktree.h @@ -21,8 +21,8 @@ struct got_worktree; * The first argument is the path to a directory where the work tree * will be created. The path itself must not yet exist, but the dirname(3) * of the path must already exist. - * The reference provided will be used as the new worktree's HEAD. - * The third argument speficies the work tree's path prefix. + * The reference provided will be used to determine the new worktree's + * base commit. The third argument speficies the work tree's path prefix. */ const struct got_error *got_worktree_init(const char *, struct got_reference *, const char *, struct got_repository *); @@ -59,11 +59,10 @@ typedef const struct got_error *(*got_worktree_cancel_ * Attempt to check out files into a work tree from its associated repository * and path prefix, and update the work tree's file index accordingly. * File content is obtained from blobs within the work tree's path prefix - * inside the tree resolved via the provided reference. + * inside the tree corresponding to the work tree's base commit. * The checkout progress callback will be invoked with the provided * void * argument, and the path of each checked out file. */ const struct got_error *got_worktree_checkout_files(struct got_worktree *, - struct got_reference *, struct got_repository *, - got_worktree_checkout_cb progress, void *, + struct got_repository *, got_worktree_checkout_cb progress, void *, got_worktree_cancel_cb, void *); blob - f308aded447a9b1eb4bd3254941d0239b56abd64 blob + 75906a3d0c3bc85aceb9a38f7f965526ec15b9cc --- lib/got_lib_worktree.h +++ lib/got_lib_worktree.h @@ -18,7 +18,7 @@ struct got_worktree { char *root_path; char *repo_path; char *path_prefix; - char *base_commit; + char *base; char *head_ref; /* blob - f44df5ba61c7b288ade196d3ade7a0617ebf9b68 blob + 673aed2f7eff4a8513878d5be8013592ce0d75a1 --- lib/worktree.c +++ lib/worktree.c @@ -321,6 +321,10 @@ got_worktree_open(struct got_worktree **worktree, cons goto done; err = read_meta_file(&(*worktree)->path_prefix, path_got, GOT_WORKTREE_PATH_PREFIX); + if (err) + goto done; + + err = read_meta_file(&(*worktree)->base, path_got, GOT_WORKTREE_BASE); if (err) goto done; @@ -350,7 +354,7 @@ got_worktree_close(struct got_worktree *worktree) free(worktree->root_path); free(worktree->repo_path); free(worktree->path_prefix); - free(worktree->base_commit); + free(worktree->base); free(worktree->head_ref); if (worktree->lockfd != -1) close(worktree->lockfd); @@ -603,13 +607,11 @@ tree_checkout(struct got_worktree *worktree, const struct got_error * got_worktree_checkout_files(struct got_worktree *worktree, - struct got_reference *head_ref, struct got_repository *repo, - got_worktree_checkout_cb progress_cb, void *progress_arg, - got_worktree_cancel_cb cancel_cb, void *cancel_arg) + struct got_repository *repo, got_worktree_checkout_cb progress_cb, + void *progress_arg, got_worktree_cancel_cb cancel_cb, void *cancel_arg) { const struct got_error *err = NULL, *unlockerr; struct got_object_id *commit_id = NULL; - struct got_object *obj = NULL; struct got_commit_object *commit = NULL; struct got_tree_object *tree = NULL; char *fileindex_path = NULL, *new_fileindex_path = NULL; @@ -620,6 +622,10 @@ got_worktree_checkout_files(struct got_worktree *workt if (err) return err; + err = got_object_resolve_id_str(&commit_id, repo, worktree->base); + if (err) + goto done; + fileindex = got_fileindex_alloc(); if (fileindex == NULL) { err = got_error_from_errno(); @@ -638,37 +644,14 @@ got_worktree_checkout_files(struct got_worktree *workt if (err) goto done; - err = got_ref_resolve(&commit_id, repo, head_ref); - if (err) - goto done; - - err = got_object_open(&obj, repo, commit_id); - if (err) - goto done; - - if (obj->type != GOT_OBJ_TYPE_COMMIT) { - err = got_error(GOT_ERR_OBJ_TYPE); - goto done; - } - - err = got_object_commit_open(&commit, repo, obj); + err = got_object_open_as_commit(&commit, repo, commit_id); if (err) goto done; - got_object_close(obj); - err = got_object_open(&obj, repo, commit->tree_id); + err = got_object_open_as_tree(&tree, repo, commit->tree_id); if (err) goto done; - if (obj->type != GOT_OBJ_TYPE_TREE) { - err = got_error(GOT_ERR_OBJ_TYPE); - goto done; - } - - err = got_object_tree_open(&tree, repo, obj); - if (err) - goto done; - err = tree_checkout(worktree, fileindex, tree, "/", repo, progress_cb, progress_arg, cancel_cb, cancel_arg); if (err) @@ -691,8 +674,6 @@ done: got_object_tree_close(tree); if (commit) got_object_commit_close(commit); - if (obj) - got_object_close(obj); free(commit_id); if (new_fileindex_path) unlink(new_fileindex_path); blob - 5157cfdf337a5f2e01c27959ea8dc60b0516eda7 blob + 476ab3d1513ea3b719e817918075368ae0df1b1a --- regress/worktree/worktree_test.c +++ regress/worktree/worktree_test.c @@ -341,8 +341,8 @@ worktree_checkout(const char *repo_path) if (err != NULL) goto done; - err = got_worktree_checkout_files(worktree, head_ref, repo, - process_cb, NULL, NULL, NULL); + err = got_worktree_checkout_files(worktree, repo, process_cb, NULL, + NULL, NULL); if (err != NULL) goto done;