"GOT", but the "O" is a cute, smiling pufferfish. Index | Thread | Search

From:
Stefan Sperling <stsp@stsp.name>
Subject:
avoid got_repo_map_path in got tree
To:
gameoftrees@openbsd.org
Date:
Fri, 6 Nov 2020 01:24:42 +0100

Download raw body.

Thread
  • Stefan Sperling:

    avoid got_repo_map_path in got tree

Avoid got_repo_map_path() in 'got tree' if a work tree is available.

Note that got_worktree_resolve_path() will return a path based on
the current working directory if the argument is the empty string.
This quirk keeps the behaviour of 'got tree' intact which depends on
the current working directory if run in a work tree.

diff 727173c3ab3a0b386e808d2d6bbeacd048710216 /home/stsp/src/got
blob - e27c03fbd9f56aeed3a7642fcbeb7264fe402bb7
file + got/got.c
--- got/got.c
+++ got/got.c
@@ -4830,28 +4830,32 @@ cmd_tree(int argc, char *argv[])
 	if (error != NULL)
 		goto done;
 
-	error = apply_unveil(got_repo_get_path(repo), 1, NULL);
-	if (error)
-		goto done;
+	if (worktree) {
+		const char *prefix = got_worktree_get_path_prefix(worktree);
+		char *p;
 
-	if (path == NULL) {
-		if (worktree) {
-			char *p, *worktree_subdir = cwd +
-			    strlen(got_worktree_get_root_path(worktree));
-			if (asprintf(&p, "%s/%s",
-			    got_worktree_get_path_prefix(worktree),
-			    worktree_subdir) == -1) {
-				error = got_error_from_errno("asprintf");
-				goto done;
-			}
-			error = got_repo_map_path(&in_repo_path, repo, p, 0);
+		if (path == NULL)
+			path = "";
+		error = got_worktree_resolve_path(&p, worktree, path);
+		if (error)
+			goto done;
+		if (asprintf(&in_repo_path, "%s%s%s", prefix,
+		    (p[0] != '\0' && !got_path_is_root_dir(prefix)) ?  "/" : "",
+		    p) == -1) {
+			error = got_error_from_errno("asprintf");
 			free(p);
-			if (error)
-				goto done;
-		} else
+			goto done;
+		}
+		free(p);
+		error = apply_unveil(got_repo_get_path(repo), 1, NULL);
+		if (error)
+			goto done;
+	} else {
+		error = apply_unveil(got_repo_get_path(repo), 1, NULL);
+		if (error)
+			goto done;
+		if (path == NULL)
 			path = "/";
-	}
-	if (in_repo_path == NULL) {
 		error = got_repo_map_path(&in_repo_path, repo, path, 1);
 		if (error != NULL)
 			goto done;