commit - 324d37e7c791a6e6ff08598c3e6206ba956d0965
commit + a09378479c43596eacd072025af84ba0c10c479c
blob - d478002f569d82038e88d43aad775c0b9ce16c9c
blob + 0aa6d642158881e6a8c75f98befbb326845f7325
--- got/got.c
+++ got/got.c
#include "got_commit_graph.h"
#include "got_blame.h"
#include "got_privsep.h"
+#include "got_path.h"
#ifndef nitems
#define nitems(_a) (sizeof((_a)) / sizeof((_a)[0]))
static const struct got_error *
apply_unveil(const char *repo_path, int repo_read_only,
- const char *worktree_path)
+ const char *worktree_path, int create_worktree)
{
const struct got_error *error;
+ if (create_worktree) {
+ /* Pre-create work tree path to avoid unveiling its parents. */
+ error = got_path_mkdir(worktree_path);
+ if (error && (error->code != GOT_ERR_ERRNO || errno != EISDIR))
+ return error;
+ }
+
if (repo_path && unveil(repo_path, repo_read_only ? "r" : "rwc") != 0)
return got_error_from_errno();
if (error != NULL)
goto done;
- error = apply_unveil(got_repo_get_path(repo), 0, worktree_path);
+ error = apply_unveil(got_repo_get_path(repo), 0, worktree_path, 1);
if (error)
goto done;
goto done;
error = apply_unveil(got_repo_get_path(repo), 0,
- got_worktree_get_root_path(worktree));
+ got_worktree_get_root_path(worktree), 0);
if (error)
goto done;
goto done;
error = apply_unveil(got_repo_get_path(repo), 1,
- worktree ? got_worktree_get_root_path(worktree) : NULL);
+ worktree ? got_worktree_get_root_path(worktree) : NULL, 0);
if (error)
goto done;
goto done;
error = apply_unveil(got_repo_get_path(repo), 1,
- worktree ? got_worktree_get_root_path(worktree) : NULL);
+ worktree ? got_worktree_get_root_path(worktree) : NULL, 0);
if (error)
goto done;
if (error != NULL)
goto done;
- error = apply_unveil(got_repo_get_path(repo), 1, NULL);
+ error = apply_unveil(got_repo_get_path(repo), 1, NULL, 0);
if (error)
goto done;
if (error != NULL)
goto done;
- error = apply_unveil(got_repo_get_path(repo), 1, NULL);
+ error = apply_unveil(got_repo_get_path(repo), 1, NULL, 0);
if (error)
goto done;
goto done;
error = apply_unveil(got_repo_get_path(repo), 1,
- got_worktree_get_root_path(worktree));
+ got_worktree_get_root_path(worktree), 0);
if (error)
goto done;
goto done;
error = apply_unveil(got_repo_get_path(repo), do_list,
- worktree ? got_worktree_get_root_path(worktree) : NULL);
+ worktree ? got_worktree_get_root_path(worktree) : NULL, 0);
if (error)
goto done;
goto done;
error = apply_unveil(got_repo_get_path(repo), 1,
- got_worktree_get_root_path(worktree));
+ got_worktree_get_root_path(worktree), 0);
if (error)
goto done;
goto done;
error = apply_unveil(got_repo_get_path(repo), 1,
- got_worktree_get_root_path(worktree));
+ got_worktree_get_root_path(worktree), 0);
if (error)
goto done;
goto done;
error = apply_unveil(got_repo_get_path(repo), 1,
- got_worktree_get_root_path(worktree));
+ got_worktree_get_root_path(worktree), 0);
if (error)
goto done;
goto done;
error = apply_unveil(got_repo_get_path(repo), 0,
- got_worktree_get_root_path(worktree));
+ got_worktree_get_root_path(worktree), 0);
if (error)
goto done;