This commit continues the work started with previous commit.
Signed-off-by: Alexandr Miloslavskiy <alexandr.miloslavskiy@syntevo.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
return retval;
}
-/*
- * Resolve `path` into an absolute, cleaned-up path. The return value
- * comes from a shared buffer.
- */
-const char *real_path_if_valid(const char *path)
-{
- static struct strbuf realpath = STRBUF_INIT;
- return strbuf_realpath(&realpath, path, 0);
-}
-
char *real_pathdup(const char *path, int die_on_error)
{
struct strbuf realpath = STRBUF_INIT;
int is_directory(const char *);
char *strbuf_realpath(struct strbuf *resolved, const char *path,
int die_on_error);
-const char *real_path_if_valid(const char *path);
char *real_pathdup(const char *path, int die_on_error);
const char *absolute_path(const char *path);
char *absolute_pathdup(const char *path);
/*
* A "string_list_each_func_t" function that canonicalizes an entry
- * from GIT_CEILING_DIRECTORIES using real_path_if_valid(), or
+ * from GIT_CEILING_DIRECTORIES using real_pathdup(), or
* discards it if unusable. The presence of an empty entry in
* GIT_CEILING_DIRECTORIES turns off canonicalization for all
* subsequent entries.
char *compute_alternate_path(const char *path, struct strbuf *err)
{
char *ref_git = NULL;
- const char *repo, *ref_git_s;
+ const char *repo;
int seen_error = 0;
- ref_git_s = real_path_if_valid(path);
- if (!ref_git_s) {
+ ref_git = real_pathdup(path, 0);
+ if (!ref_git) {
seen_error = 1;
strbuf_addf(err, _("path '%s' does not exist"), path);
goto out;
- } else
- /*
- * Beware: read_gitfile(), real_path() and mkpath()
- * return static buffer
- */
- ref_git = xstrdup(ref_git_s);
+ }
repo = read_gitfile(ref_git);
if (!repo)
static struct strbuf realpath = STRBUF_INIT;
struct child_process cp = CHILD_PROCESS_INIT;
struct strbuf sb = STRBUF_INIT;
- const char *one_up = real_path_if_valid("../");
+ struct strbuf one_up = STRBUF_INIT;
const char *cwd = xgetcwd();
const char *ret = NULL;
const char *subpath;
*/
return NULL;
- if (!one_up)
+ if (!strbuf_realpath(&one_up, "../", 0))
return NULL;
- subpath = relative_path(cwd, one_up, &sb);
+ subpath = relative_path(cwd, one_up.buf, &sb);
+ strbuf_release(&one_up);
prepare_submodule_repo_env(&cp.env_array);
argv_array_pop(&cp.env_array);
struct worktree *find_worktree_by_path(struct worktree **list, const char *p)
{
+ struct strbuf wt_path = STRBUF_INIT;
char *path = real_pathdup(p, 0);
if (!path)
return NULL;
for (; *list; list++) {
- const char *wt_path = real_path_if_valid((*list)->path);
+ if (!strbuf_realpath(&wt_path, (*list)->path, 0))
+ continue;
- if (wt_path && !fspathcmp(path, wt_path))
+ if (!fspathcmp(path, wt_path.buf))
break;
}
free(path);
+ strbuf_release(&wt_path);
return *list;
}