-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
shrink git-shell by avoiding redundant dependencies
A lot of modules that have nothing to do with git-shell functionality were linked in, bloating git-shell more than 8 times. This patch cuts off redundant dependencies by: 1. providing stubs for three functions that make no sense for git-shell; 2. moving quote_path_fully from environment.c to quote.c to make the later self sufficient; 3. moving make_absolute_path into a new separate file. The following numbers have been received with the default optimization settings on master using GCC 4.1.2: Before: text data bss dec hex filename 143915 1348 93168 238431 3a35f git-shell After: text data bss dec hex filename 17670 788 8232 26690 6842 git-shell Signed-off-by: Junio C Hamano <gitster@pobox.com>
- Loading branch information
Dmitry Potapov
authored and
Junio C Hamano
committed
Jun 28, 2008
1 parent
2dce956
commit 5b8e6f8
Showing
6 changed files
with
79 additions
and
68 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,68 @@ | ||
#include "cache.h" | ||
|
||
/* We allow "recursive" symbolic links. Only within reason, though. */ | ||
#define MAXDEPTH 5 | ||
|
||
const char *make_absolute_path(const char *path) | ||
{ | ||
static char bufs[2][PATH_MAX + 1], *buf = bufs[0], *next_buf = bufs[1]; | ||
char cwd[1024] = ""; | ||
int buf_index = 1, len; | ||
|
||
int depth = MAXDEPTH; | ||
char *last_elem = NULL; | ||
struct stat st; | ||
|
||
if (strlcpy(buf, path, PATH_MAX) >= PATH_MAX) | ||
die ("Too long path: %.*s", 60, path); | ||
|
||
while (depth--) { | ||
if (stat(buf, &st) || !S_ISDIR(st.st_mode)) { | ||
char *last_slash = strrchr(buf, '/'); | ||
if (last_slash) { | ||
*last_slash = '\0'; | ||
last_elem = xstrdup(last_slash + 1); | ||
} else { | ||
last_elem = xstrdup(buf); | ||
*buf = '\0'; | ||
} | ||
} | ||
|
||
if (*buf) { | ||
if (!*cwd && !getcwd(cwd, sizeof(cwd))) | ||
die ("Could not get current working directory"); | ||
|
||
if (chdir(buf)) | ||
die ("Could not switch to '%s'", buf); | ||
} | ||
if (!getcwd(buf, PATH_MAX)) | ||
die ("Could not get current working directory"); | ||
|
||
if (last_elem) { | ||
int len = strlen(buf); | ||
if (len + strlen(last_elem) + 2 > PATH_MAX) | ||
die ("Too long path name: '%s/%s'", | ||
buf, last_elem); | ||
buf[len] = '/'; | ||
strcpy(buf + len + 1, last_elem); | ||
free(last_elem); | ||
last_elem = NULL; | ||
} | ||
|
||
if (!lstat(buf, &st) && S_ISLNK(st.st_mode)) { | ||
len = readlink(buf, next_buf, PATH_MAX); | ||
if (len < 0) | ||
die ("Invalid symlink: %s", buf); | ||
next_buf[len] = '\0'; | ||
buf = next_buf; | ||
buf_index = 1 - buf_index; | ||
next_buf = bufs[buf_index]; | ||
} else | ||
break; | ||
} | ||
|
||
if (*cwd && chdir(cwd)) | ||
die ("Could not change back to '%s'", cwd); | ||
|
||
return buf; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters