commit c7f4312fa3469fb36fb0cc087ca64846744a5533 from: Stefan Sperling date: Tue Feb 05 16:46:58 2019 UTC make 'got status' work in subdirectories of a work tree commit - 247140b28268236ea5c77457b01d6dec936ffb51 commit + c7f4312fa3469fb36fb0cc087ca64846744a5533 blob - 7634022d459777ec21a6b7f7af7c711f06879feb blob + 97264cf27d57e9cd53202e2485893ca73899d36b --- got/got.c +++ got/got.c @@ -1429,7 +1429,8 @@ cmd_status(int argc, char *argv[]) if (error != NULL) goto done; - error = apply_unveil(got_repo_get_path(repo), worktree_path); + error = apply_unveil(got_repo_get_path(repo), + got_worktree_get_root_path(worktree)); if (error) goto done; blob - eb06c1c83638358bcdb853f29755a94983b589d3 blob + 768ca6a234213e1f696abed31c0a4266f2e2e612 --- include/got_worktree.h +++ include/got_worktree.h @@ -48,6 +48,11 @@ const struct got_error *got_worktree_open(struct got_w void got_worktree_close(struct got_worktree *); /* + * Get the path to the root directory of a worktree. + */ +const char *got_worktree_get_root_path(struct got_worktree *); + +/* * Get the path to the repository associated with a worktree. */ const char *got_worktree_get_repo_path(struct got_worktree *); blob - 77ab90b75f8f9d50abc0ed34fd125ec5cb522153 blob + b5a1c93ac214af54a1e83bcb21763aee46b40e61 --- lib/fileindex.c +++ lib/fileindex.c @@ -694,35 +694,46 @@ got_fileindex_diff_tree(struct got_fileindex *fileinde static const struct got_error * diff_fileindex_dir(struct got_fileindex *, struct got_fileindex_entry **, DIR *, - const char *, struct got_repository *, struct got_fileindex_diff_dir_cb *, - void *); + const char *, const char *, struct got_repository *, + struct got_fileindex_diff_dir_cb *, void *); static const struct got_error * walk_dir(struct got_pathlist_entry **next, struct got_fileindex *fileindex, struct got_fileindex_entry **ie, struct got_pathlist_entry *dle, - const char *path, DIR *dir, struct got_repository *repo, - struct got_fileindex_diff_dir_cb *cb, void *cb_arg) + const char *path, DIR *dir, const char *rootpath, + struct got_repository *repo, struct got_fileindex_diff_dir_cb *cb, + void *cb_arg) { const struct got_error *err = NULL; struct dirent *de = dle->data; if (de->d_type == DT_DIR) { char *subpath; + char *subdirpath; DIR *subdir; if (asprintf(&subpath, "%s%s%s", path, path[0] == '\0' ? "" : "/", de->d_name) == -1) return got_error_from_errno(); - subdir = opendir(subpath); + if (asprintf(&subdirpath, "%s/%s", rootpath, subpath) == -1) { + free(subpath); + return got_error_from_errno(); + } + + subdir = opendir(subdirpath); if (subdir == NULL) { + #if 0 free(subpath); + free(subdirpath); + #endif return got_error_from_errno(); } - err = diff_fileindex_dir(fileindex, ie, subdir, subpath, repo, - cb, cb_arg); + err = diff_fileindex_dir(fileindex, ie, subdir, rootpath, + subpath, repo, cb, cb_arg); free(subpath); + free(subdirpath); closedir(subdir); if (err) return err; @@ -734,9 +745,9 @@ walk_dir(struct got_pathlist_entry **next, struct got_ static const struct got_error * diff_fileindex_dir(struct got_fileindex *fileindex, - struct got_fileindex_entry **ie, DIR *dir, const char *path, - struct got_repository *repo, struct got_fileindex_diff_dir_cb *cb, - void *cb_arg) + struct got_fileindex_entry **ie, DIR *dir, const char *rootpath, + const char *path, struct got_repository *repo, + struct got_fileindex_diff_dir_cb *cb, void *cb_arg) { const struct got_error *err = NULL; struct dirent *de = NULL; @@ -797,7 +808,7 @@ diff_fileindex_dir(struct got_fileindex *fileindex, break; *ie = walk_fileindex(fileindex, *ie); err = walk_dir(&dle, fileindex, ie, dle, path, - dir, repo, cb, cb_arg); + dir, rootpath, repo, cb, cb_arg); } else if (cmp < 0 ) { next = walk_fileindex(fileindex, *ie); err = cb->diff_old(cb_arg, *ie, path); @@ -809,7 +820,7 @@ diff_fileindex_dir(struct got_fileindex *fileindex, if (err) break; err = walk_dir(&dle, fileindex, ie, dle, path, - dir, repo, cb, cb_arg); + dir, rootpath, repo, cb, cb_arg); } if (err) break; @@ -825,7 +836,7 @@ diff_fileindex_dir(struct got_fileindex *fileindex, if (err) break; err = walk_dir(&dle, fileindex, ie, dle, path, dir, - repo, cb, cb_arg); + rootpath, repo, cb, cb_arg); if (err) break; } @@ -838,13 +849,14 @@ done: } const struct got_error * -got_fileindex_diff_dir(struct got_fileindex *fileindex, DIR *dir, - struct got_repository *repo, struct got_fileindex_diff_dir_cb *cb, - void *cb_arg) +got_fileindex_diff_dir(struct got_fileindex *fileindex, DIR *rootdir, + const char *rootpath, struct got_repository *repo, + struct got_fileindex_diff_dir_cb *cb, void *cb_arg) { struct got_fileindex_entry *min; min = RB_MIN(got_fileindex_tree, &fileindex->entries); - return diff_fileindex_dir(fileindex, &min, dir, "", repo, cb, cb_arg); + return diff_fileindex_dir(fileindex, &min, rootdir, rootpath, "", + repo, cb, cb_arg); } RB_GENERATE(got_fileindex_tree, got_fileindex_entry, entry, got_fileindex_cmp); blob - f0befafd414a2ddcc56bb4f17a888939a7824d52 blob + 64bfc70abd5e42a3ce6e3949277cf7b625f4a843 --- lib/got_lib_fileindex.h +++ lib/got_lib_fileindex.h @@ -141,4 +141,5 @@ struct got_fileindex_diff_dir_cb { got_fileindex_diff_dir_new_cb diff_new; }; const struct got_error *got_fileindex_diff_dir(struct got_fileindex *, DIR *, - struct got_repository *, struct got_fileindex_diff_dir_cb *, void *); + const char *, struct got_repository *, struct got_fileindex_diff_dir_cb *, + void *); blob - 66bb12d1ff6c5832e73f92e7f73928f0892a631a blob + f4d98f7208b7cbd0bf5d9a9ea8b0af5fe29a606c --- lib/worktree.c +++ lib/worktree.c @@ -423,6 +423,12 @@ got_worktree_close(struct got_worktree *worktree) } const char * +got_worktree_get_root_path(struct got_worktree *worktree) +{ + return worktree->root_path; +} + +const char * got_worktree_get_repo_path(struct got_worktree *worktree) { return worktree->repo_path; @@ -1121,7 +1127,8 @@ got_worktree_status(struct got_worktree *worktree, arg.status_arg = status_arg; arg.cancel_cb = cancel_cb; arg.cancel_arg = cancel_arg; - err = got_fileindex_diff_dir(fileindex, workdir, repo, &fdiff_cb, &arg); + err = got_fileindex_diff_dir(fileindex, workdir, worktree->root_path, + repo, &fdiff_cb, &arg); done: if (workdir) closedir(workdir);