зеркало из https://github.com/microsoft/git.git
abspath: convert absolute_path() to strbuf
Move most of the code of absolute_path() into the new function strbuf_add_absolute_path() and in the process transform it to use struct strbuf and xgetcwd() instead of a PATH_MAX-sized buffer, which can be too small on some file systems. Signed-off-by: Rene Scharfe <l.s.r@web.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Родитель
4d3ab44d26
Коммит
679eebe24d
|
@ -293,6 +293,12 @@ same behaviour as well.
|
||||||
|
|
||||||
Set the buffer to the path of the current working directory.
|
Set the buffer to the path of the current working directory.
|
||||||
|
|
||||||
|
`strbuf_add_absolute_path`
|
||||||
|
|
||||||
|
Add a path to a buffer, converting a relative path to an
|
||||||
|
absolute one in the process. Symbolic links are not
|
||||||
|
resolved.
|
||||||
|
|
||||||
`stripspace`::
|
`stripspace`::
|
||||||
|
|
||||||
Strip whitespace from a buffer. The second parameter controls if
|
Strip whitespace from a buffer. The second parameter controls if
|
||||||
|
|
46
abspath.c
46
abspath.c
|
@ -140,54 +140,16 @@ const char *real_path_if_valid(const char *path)
|
||||||
return real_path_internal(path, 0);
|
return real_path_internal(path, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char *get_pwd_cwd(void)
|
|
||||||
{
|
|
||||||
static char cwd[PATH_MAX + 1];
|
|
||||||
char *pwd;
|
|
||||||
struct stat cwd_stat, pwd_stat;
|
|
||||||
if (getcwd(cwd, PATH_MAX) == NULL)
|
|
||||||
return NULL;
|
|
||||||
pwd = getenv("PWD");
|
|
||||||
if (pwd && strcmp(pwd, cwd)) {
|
|
||||||
stat(cwd, &cwd_stat);
|
|
||||||
if ((cwd_stat.st_dev || cwd_stat.st_ino) &&
|
|
||||||
!stat(pwd, &pwd_stat) &&
|
|
||||||
pwd_stat.st_dev == cwd_stat.st_dev &&
|
|
||||||
pwd_stat.st_ino == cwd_stat.st_ino) {
|
|
||||||
strlcpy(cwd, pwd, PATH_MAX);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return cwd;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Use this to get an absolute path from a relative one. If you want
|
* Use this to get an absolute path from a relative one. If you want
|
||||||
* to resolve links, you should use real_path.
|
* to resolve links, you should use real_path.
|
||||||
*
|
|
||||||
* If the path is already absolute, then return path. As the user is
|
|
||||||
* never meant to free the return value, we're safe.
|
|
||||||
*/
|
*/
|
||||||
const char *absolute_path(const char *path)
|
const char *absolute_path(const char *path)
|
||||||
{
|
{
|
||||||
static char buf[PATH_MAX + 1];
|
static struct strbuf sb = STRBUF_INIT;
|
||||||
|
strbuf_reset(&sb);
|
||||||
if (!*path) {
|
strbuf_add_absolute_path(&sb, path);
|
||||||
die("The empty string is not a valid path");
|
return sb.buf;
|
||||||
} else if (is_absolute_path(path)) {
|
|
||||||
if (strlcpy(buf, path, PATH_MAX) >= PATH_MAX)
|
|
||||||
die("Too long path: %.*s", 60, path);
|
|
||||||
} else {
|
|
||||||
size_t len;
|
|
||||||
const char *fmt;
|
|
||||||
const char *cwd = get_pwd_cwd();
|
|
||||||
if (!cwd)
|
|
||||||
die_errno("Cannot determine the current working directory");
|
|
||||||
len = strlen(cwd);
|
|
||||||
fmt = (len > 0 && is_dir_sep(cwd[len - 1])) ? "%s%s" : "%s/%s";
|
|
||||||
if (snprintf(buf, PATH_MAX, fmt, cwd, path) >= PATH_MAX)
|
|
||||||
die("Too long path: %.*s", 60, path);
|
|
||||||
}
|
|
||||||
return buf;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
25
strbuf.c
25
strbuf.c
|
@ -568,6 +568,31 @@ void strbuf_humanise_bytes(struct strbuf *buf, off_t bytes)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void strbuf_add_absolute_path(struct strbuf *sb, const char *path)
|
||||||
|
{
|
||||||
|
if (!*path)
|
||||||
|
die("The empty string is not a valid path");
|
||||||
|
if (!is_absolute_path(path)) {
|
||||||
|
struct stat cwd_stat, pwd_stat;
|
||||||
|
size_t orig_len = sb->len;
|
||||||
|
char *cwd = xgetcwd();
|
||||||
|
char *pwd = getenv("PWD");
|
||||||
|
if (pwd && strcmp(pwd, cwd) &&
|
||||||
|
!stat(cwd, &cwd_stat) &&
|
||||||
|
(cwd_stat.st_dev || cwd_stat.st_ino) &&
|
||||||
|
!stat(pwd, &pwd_stat) &&
|
||||||
|
pwd_stat.st_dev == cwd_stat.st_dev &&
|
||||||
|
pwd_stat.st_ino == cwd_stat.st_ino)
|
||||||
|
strbuf_addstr(sb, pwd);
|
||||||
|
else
|
||||||
|
strbuf_addstr(sb, cwd);
|
||||||
|
if (sb->len > orig_len && !is_dir_sep(sb->buf[sb->len - 1]))
|
||||||
|
strbuf_addch(sb, '/');
|
||||||
|
free(cwd);
|
||||||
|
}
|
||||||
|
strbuf_addstr(sb, path);
|
||||||
|
}
|
||||||
|
|
||||||
int printf_ln(const char *fmt, ...)
|
int printf_ln(const char *fmt, ...)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
2
strbuf.h
2
strbuf.h
|
@ -179,6 +179,8 @@ extern void strbuf_addstr_urlencode(struct strbuf *, const char *,
|
||||||
int reserved);
|
int reserved);
|
||||||
extern void strbuf_humanise_bytes(struct strbuf *buf, off_t bytes);
|
extern void strbuf_humanise_bytes(struct strbuf *buf, off_t bytes);
|
||||||
|
|
||||||
|
extern void strbuf_add_absolute_path(struct strbuf *sb, const char *path);
|
||||||
|
|
||||||
__attribute__((format (printf,1,2)))
|
__attribute__((format (printf,1,2)))
|
||||||
extern int printf_ln(const char *fmt, ...);
|
extern int printf_ln(const char *fmt, ...);
|
||||||
__attribute__((format (printf,2,3)))
|
__attribute__((format (printf,2,3)))
|
||||||
|
|
Загрузка…
Ссылка в новой задаче