Merge branch 'rs/strbuf-getcwd'
Reduce the use of fixed sized buffer passed to getcwd() calls by introducing xgetcwd() helper. * rs/strbuf-getcwd: use strbuf_add_absolute_path() to add absolute paths abspath: convert absolute_path() to strbuf use xgetcwd() to set $GIT_DIR use xgetcwd() to get the current directory or die wrapper: add xgetcwd() abspath: convert real_path_internal() to strbuf abspath: use strbuf_getcwd() to remember original working directory setup: convert setup_git_directory_gently_1 et al. to strbuf unix-sockets: use strbuf_getcwd() strbuf: add strbuf_getcwd()
This commit is contained in:
46
strbuf.c
46
strbuf.c
@ -406,6 +406,27 @@ int strbuf_readlink(struct strbuf *sb, const char *path, size_t hint)
|
||||
return -1;
|
||||
}
|
||||
|
||||
int strbuf_getcwd(struct strbuf *sb)
|
||||
{
|
||||
size_t oldalloc = sb->alloc;
|
||||
size_t guessed_len = 128;
|
||||
|
||||
for (;; guessed_len *= 2) {
|
||||
strbuf_grow(sb, guessed_len);
|
||||
if (getcwd(sb->buf, sb->alloc)) {
|
||||
strbuf_setlen(sb, strlen(sb->buf));
|
||||
return 0;
|
||||
}
|
||||
if (errno != ERANGE)
|
||||
break;
|
||||
}
|
||||
if (oldalloc == 0)
|
||||
strbuf_release(sb);
|
||||
else
|
||||
strbuf_reset(sb);
|
||||
return -1;
|
||||
}
|
||||
|
||||
int strbuf_getwholeline(struct strbuf *sb, FILE *fp, int term)
|
||||
{
|
||||
int ch;
|
||||
@ -555,6 +576,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 ret;
|
||||
|
||||
Reference in New Issue
Block a user