commit - cbd1af7a5ac90edbfeec7507187896b76710c60e
commit + 6c7ab9213e39b6a690152fe8ffb18fe1f15a9ccb
blob - fd0fb74b2c6a1723f8aca3e8c9c832e065f1d6d1
blob + 32ed25930a57db98595d201cd260b1d73b46142a
--- got/got.c
+++ got/got.c
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)
{
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
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;
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
blob - fe7760b8b5c088e55c141d45fe73ad788eef4e63
blob + 3908cf70ae58c988b8d20322cb755f391ac31264
--- include/got_worktree.h
+++ include/got_worktree.h
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 *);
blob - 8ce73ba0ba53813a0ee2a1585db0e7432279b738
blob + 12e2eb8b8f429c6ceffa39338e06773b13190057
--- lib/worktree.c
+++ lib/worktree.c
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;
+}