commit eaccb85f7218ef3615353170a2a64ec1c48028e2 from: Stefan Sperling date: Tue Dec 25 14:19:52 2018 UTC store a parsed base commit ID in struct got_worktree commit - 0f92850ea290f1ce78faa0f9ba874abec8477dea commit + eaccb85f7218ef3615353170a2a64ec1c48028e2 blob - 6eb1b51ed3c706b530176f8baa1f130982d4e4ce blob + 5fa0ba16f4cea03fe2779a8bf459fbf903861185 --- 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; + struct got_object_id *base_commit_id; char *head_ref; /* blob - 091974e1f03ab5beccb3a5411a64b8b933ba03be blob + 4656e2e4a0598b526e576e75b85fc270885e00a5 --- lib/worktree.c +++ lib/worktree.c @@ -265,8 +265,10 @@ got_worktree_open(struct got_worktree **worktree, cons char *path_got; char *formatstr = NULL; char *path_lock = NULL; + char *base_commit_id_str = NULL; int version, fd = -1; const char *errstr; + struct got_repository *repo = NULL; *worktree = NULL; @@ -319,13 +321,23 @@ got_worktree_open(struct got_worktree **worktree, cons GOT_WORKTREE_REPOSITORY); if (err) 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, + err = read_meta_file(&base_commit_id_str, path_got, GOT_WORKTREE_BASE_COMMIT); + if (err) + goto done; + + err = got_repo_open(&repo, (*worktree)->repo_path); + if (err) + goto done; + + err = got_object_resolve_id_str(&(*worktree)->base_commit_id, repo, + base_commit_id_str); if (err) goto done; @@ -335,8 +347,11 @@ got_worktree_open(struct got_worktree **worktree, cons goto done; done: + if (repo) + got_repo_close(repo); free(path_got); free(path_lock); + free(base_commit_id_str); if (err) { if (fd != -1) close(fd); @@ -355,7 +370,7 @@ got_worktree_close(struct got_worktree *worktree) free(worktree->root_path); free(worktree->repo_path); free(worktree->path_prefix); - free(worktree->base); + free(worktree->base_commit_id); free(worktree->head_ref); if (worktree->lockfd != -1) close(worktree->lockfd); @@ -612,7 +627,6 @@ got_worktree_checkout_files(struct got_worktree *workt 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_commit_object *commit = NULL; struct got_tree_object *tree = NULL; char *fileindex_path = NULL, *new_fileindex_path = NULL; @@ -622,10 +636,6 @@ got_worktree_checkout_files(struct got_worktree *workt err = lock_worktree(worktree, LOCK_EX); 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) { @@ -645,7 +655,8 @@ got_worktree_checkout_files(struct got_worktree *workt if (err) goto done; - err = got_object_open_as_commit(&commit, repo, commit_id); + err = got_object_open_as_commit(&commit, repo, + worktree->base_commit_id); if (err) goto done; @@ -675,7 +686,6 @@ done: got_object_tree_close(tree); if (commit) got_object_commit_close(commit); - free(commit_id); if (new_fileindex_path) unlink(new_fileindex_path); if (new_index)