Commit 6c7ab9213e39b6a690152fe8ffb18fe1f15a9ccb

Stefan Sperling 2019-03-18T16:48:18

introduce got_worktree_resolve_path()

diff --git a/got/got.c b/got/got.c
index fd0fb74..32ed259 100644
--- a/got/got.c
+++ b/got/got.c
@@ -200,47 +200,6 @@ apply_unveil(const char *repo_path, int repo_read_only,
 	return NULL;
 }
 
-static const struct got_error *
-resolve_path_in_worktree(char **wt_path, struct got_worktree *worktree,
-    const char *arg)
-{
-	const struct got_error *err = NULL;
-	char *resolved, *path = NULL;
-	size_t len;
-
-	*wt_path = NULL;
-
-	resolved = realpath(arg, NULL);
-	if (resolved == NULL)
-		return got_error_from_errno();
-
-	if (strncmp(got_worktree_get_root_path(worktree), resolved,
-	    strlen(got_worktree_get_root_path(worktree)))) {
-		err = got_error(GOT_ERR_BAD_PATH);
-		goto done;
-	}
-
-	path = strdup(resolved + strlen(got_worktree_get_root_path(worktree)));
-	if (path == NULL) {
-		err = got_error_from_errno();
-		goto done;
-	}
-
-	/* XXX status walk can't deal with trailing slash! */
-	len = strlen(path);
-	while (path[len - 1] == '/') {
-		path[len - 1] = '\0';
-		len--;
-	}
-done:
-	free(resolved);
-	if (err == NULL)
-		*wt_path = path;
-	else
-		free(path);
-	return err;
-}
-
 __dead static void
 usage_checkout(void)
 {
@@ -879,7 +838,7 @@ cmd_log(int argc, char *argv[])
 	if (argc == 0)
 		path = strdup("");
 	else if (argc == 1) {
-		error = resolve_path_in_worktree(&path, worktree, argv[0]);
+		error = got_worktree_resolve_path(&path, worktree, argv[0]);
 		if (error)
 			goto done;
 	} else
@@ -1124,7 +1083,7 @@ cmd_diff(int argc, char *argv[])
 			goto done;
 		}
 		if (argc == 1) {
-			error = resolve_path_in_worktree(&path, worktree,
+			error = got_worktree_resolve_path(&path, worktree,
 			    argv[0]);
 			if (error)
 				goto done;
@@ -1657,7 +1616,7 @@ cmd_status(int argc, char *argv[])
 			goto done;
 		}
 	} else if (argc == 1) {
-		error = resolve_path_in_worktree(&path, worktree, argv[0]);
+		error = got_worktree_resolve_path(&path, worktree, argv[0]);
 		if (error)
 			goto done;
 	} else
diff --git a/include/got_worktree.h b/include/got_worktree.h
index fe7760b..3908cf7 100644
--- a/include/got_worktree.h
+++ b/include/got_worktree.h
@@ -125,3 +125,10 @@ const struct got_error *
 got_worktree_status(struct got_worktree *, const char *,
     struct got_repository *, got_worktree_status_cb, void *,
     got_worktree_cancel_cb cancel_cb, void *);
+
+/*
+ * Try to resolve a user-provided path to an on-disk path in the work tree.
+ * The caller must dispose of the resolved path with free(3).
+ */
+const struct got_error *got_worktree_resolve_path(char **,
+    struct got_worktree *, const char *);
diff --git a/lib/worktree.c b/lib/worktree.c
index 8ce73ba..12e2eb8 100644
--- a/lib/worktree.c
+++ b/lib/worktree.c
@@ -1543,3 +1543,44 @@ done:
 	got_fileindex_free(fileindex);
 	return err;
 }
+
+const struct got_error *
+got_worktree_resolve_path(char **wt_path, struct got_worktree *worktree,
+    const char *arg)
+{
+	const struct got_error *err = NULL;
+	char *resolved, *path = NULL;
+	size_t len;
+
+	*wt_path = NULL;
+
+	resolved = realpath(arg, NULL);
+	if (resolved == NULL)
+		return got_error_from_errno();
+
+	if (strncmp(got_worktree_get_root_path(worktree), resolved,
+	    strlen(got_worktree_get_root_path(worktree)))) {
+		err = got_error(GOT_ERR_BAD_PATH);
+		goto done;
+	}
+
+	path = strdup(resolved + strlen(got_worktree_get_root_path(worktree)));
+	if (path == NULL) {
+		err = got_error_from_errno();
+		goto done;
+	}
+
+	/* XXX status walk can't deal with trailing slash! */
+	len = strlen(path);
+	while (path[len - 1] == '/') {
+		path[len - 1] = '\0';
+		len--;
+	}
+done:
+	free(resolved);
+	if (err == NULL)
+		*wt_path = path;
+	else
+		free(path);
+	return err;
+}