commit c530dc2326756e37023dbbdd885deff9c9dc7f33 from: Stefan Sperling date: Tue Jul 23 12:56:53 2019 UTC create worktree for apply_unveil() during checkout; others don't need this commit - 6e6049bedc731142c42807f4db5b8447ed4f1b2d commit + c530dc2326756e37023dbbdd885deff9c9dc7f33 blob - 0cc9e662fbf0e1f79d663932fbb770959945ac7a blob + 2beec0b333c8f864cac68acb81ef75faa133b416 --- got/got.c +++ got/got.c @@ -240,7 +240,7 @@ get_editor(char **abspath) static const struct got_error * apply_unveil(const char *repo_path, int repo_read_only, - const char *worktree_path, int create_worktree) + const char *worktree_path) { const struct got_error *err; @@ -248,24 +248,6 @@ apply_unveil(const char *repo_path, int repo_read_only if (unveil("gmon.out", "rwc") != 0) return got_error_from_errno2("unveil", "gmon.out"); #endif - if (create_worktree) { - /* Pre-create work tree path to avoid unveiling its parents. */ - err = got_path_mkdir(worktree_path); - - if (errno == EEXIST) { - if (got_path_dir_is_empty(worktree_path)) { - errno = 0; - err = NULL; - } else { - err = got_error_path(worktree_path, - GOT_ERR_DIR_NOT_EMPTY); - } - } - - if (err && (err->code != GOT_ERR_ERRNO || errno != EISDIR)) - return err; - } - if (repo_path && unveil(repo_path, repo_read_only ? "r" : "rwc") != 0) return got_error_from_errno2("unveil", repo_path); @@ -328,7 +310,7 @@ cmd_init(int argc, char *argv[]) !(error->code == GOT_ERR_ERRNO && errno == EEXIST)) goto done; - error = apply_unveil(repo_path, 0, NULL, 0); + error = apply_unveil(repo_path, 0, NULL); if (error) goto done; @@ -597,7 +579,7 @@ cmd_import(int argc, char *argv[]) if (unveil(path_dir, "r") != 0) return got_error_from_errno2("unveil", path_dir); - error = apply_unveil(got_repo_get_path(repo), 0, NULL, 0); + error = apply_unveil(got_repo_get_path(repo), 0, NULL); if (error) goto done; @@ -877,7 +859,19 @@ cmd_checkout(int argc, char *argv[]) if (error != NULL) goto done; - error = apply_unveil(got_repo_get_path(repo), 0, worktree_path, 1); + /* Pre-create work tree path for unveil(2) */ + error = got_path_mkdir(worktree_path); + if (error) { + if (!(error->code == GOT_ERR_ERRNO && errno == EISDIR)) + goto done; + if (!got_path_dir_is_empty(worktree_path)) { + error = got_error_path(worktree_path, + GOT_ERR_DIR_NOT_EMPTY); + goto done; + } + } + + error = apply_unveil(got_repo_get_path(repo), 0, worktree_path); if (error) goto done; @@ -1078,7 +1072,7 @@ cmd_update(int argc, char *argv[]) goto done; error = apply_unveil(got_repo_get_path(repo), 0, - got_worktree_get_root_path(worktree), 0); + got_worktree_get_root_path(worktree)); if (error) goto done; @@ -1490,7 +1484,7 @@ cmd_log(int argc, char *argv[]) goto done; error = apply_unveil(got_repo_get_path(repo), 1, - worktree ? got_worktree_get_root_path(worktree) : NULL, 0); + worktree ? got_worktree_get_root_path(worktree) : NULL); if (error) goto done; @@ -1763,7 +1757,7 @@ cmd_diff(int argc, char *argv[]) goto done; error = apply_unveil(got_repo_get_path(repo), 1, - worktree ? got_worktree_get_root_path(worktree) : NULL, 0); + worktree ? got_worktree_get_root_path(worktree) : NULL); if (error) goto done; @@ -1968,7 +1962,7 @@ cmd_blame(int argc, char *argv[]) if (error != NULL) goto done; - error = apply_unveil(got_repo_get_path(repo), 1, NULL, 0); + error = apply_unveil(got_repo_get_path(repo), 1, NULL); if (error) goto done; @@ -2196,7 +2190,7 @@ cmd_tree(int argc, char *argv[]) if (error != NULL) goto done; - error = apply_unveil(got_repo_get_path(repo), 1, NULL, 0); + error = apply_unveil(got_repo_get_path(repo), 1, NULL); if (error) goto done; @@ -2325,7 +2319,7 @@ cmd_status(int argc, char *argv[]) goto done; error = apply_unveil(got_repo_get_path(repo), 1, - got_worktree_get_root_path(worktree), 0); + got_worktree_get_root_path(worktree)); if (error) goto done; @@ -2516,7 +2510,7 @@ cmd_ref(int argc, char *argv[]) goto done; error = apply_unveil(got_repo_get_path(repo), do_list, - worktree ? got_worktree_get_root_path(worktree) : NULL, 0); + worktree ? got_worktree_get_root_path(worktree) : NULL); if (error) goto done; @@ -2755,7 +2749,7 @@ cmd_branch(int argc, char *argv[]) goto done; error = apply_unveil(got_repo_get_path(repo), do_list, - worktree ? got_worktree_get_root_path(worktree) : NULL, 0); + worktree ? got_worktree_get_root_path(worktree) : NULL); if (error) goto done; @@ -2837,7 +2831,7 @@ cmd_add(int argc, char *argv[]) goto done; error = apply_unveil(got_repo_get_path(repo), 1, - got_worktree_get_root_path(worktree), 0); + got_worktree_get_root_path(worktree)); if (error) goto done; @@ -2925,7 +2919,7 @@ cmd_remove(int argc, char *argv[]) goto done; error = apply_unveil(got_repo_get_path(repo), 1, - got_worktree_get_root_path(worktree), 0); + got_worktree_get_root_path(worktree)); if (error) goto done; @@ -3036,7 +3030,7 @@ cmd_revert(int argc, char *argv[]) goto done; error = apply_unveil(got_repo_get_path(repo), 1, - got_worktree_get_root_path(worktree), 0); + got_worktree_get_root_path(worktree)); if (error) goto done; @@ -3124,7 +3118,7 @@ done: /* Editor is done; we can now apply unveil(2) */ if (err == NULL) { - err = apply_unveil(a->repo_path, 0, a->worktree_path, 0); + err = apply_unveil(a->repo_path, 0, a->worktree_path); if (err) { free(*logmsg); *logmsg = NULL; @@ -3211,7 +3205,7 @@ cmd_commit(int argc, char *argv[]) error = get_editor(&editor); else error = apply_unveil(got_repo_get_path(repo), 0, - got_worktree_get_root_path(worktree), 0); + got_worktree_get_root_path(worktree)); if (error) goto done; @@ -3306,7 +3300,7 @@ cmd_cherrypick(int argc, char *argv[]) goto done; error = apply_unveil(got_repo_get_path(repo), 0, - got_worktree_get_root_path(worktree), 0); + got_worktree_get_root_path(worktree)); if (error) goto done; @@ -3421,7 +3415,7 @@ cmd_backout(int argc, char *argv[]) goto done; error = apply_unveil(got_repo_get_path(repo), 0, - got_worktree_get_root_path(worktree), 0); + got_worktree_get_root_path(worktree)); if (error) goto done; @@ -3776,7 +3770,7 @@ cmd_rebase(int argc, char *argv[]) goto done; error = apply_unveil(got_repo_get_path(repo), 0, - got_worktree_get_root_path(worktree), 0); + got_worktree_get_root_path(worktree)); if (error) goto done;