diff options
author | Dmitry Potapov <dpotapov@gmail.com> | 2008-06-28 00:46:42 +0400 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2008-06-27 23:22:00 -0700 |
commit | 5b8e6f85f971dba8eeac048e7821978bbca14121 (patch) | |
tree | bb9f168de296ac8a430aad00645e337d9eba3e91 | |
parent | 2dce956e397be8a769624e8693565b8a30056060 (diff) | |
download | git-5b8e6f85f971dba8eeac048e7821978bbca14121.tar.gz git-5b8e6f85f971dba8eeac048e7821978bbca14121.tar.xz |
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>
-rw-r--r-- | Makefile | 1 | ||||
-rw-r--r-- | abspath.c | 68 | ||||
-rw-r--r-- | environment.c | 1 | ||||
-rw-r--r-- | path.c | 67 | ||||
-rw-r--r-- | quote.c | 2 | ||||
-rw-r--r-- | shell.c | 8 |
6 files changed, 79 insertions, 68 deletions
@@ -378,6 +378,7 @@ LIB_H += unpack-trees.h LIB_H += utf8.h LIB_H += wt-status.h +LIB_OBJS += abspath.o LIB_OBJS += alias.o LIB_OBJS += alloc.o LIB_OBJS += archive.o diff --git a/abspath.c b/abspath.c new file mode 100644 index 000000000..4f95a954d --- /dev/null +++ b/abspath.c @@ -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; +} diff --git a/environment.c b/environment.c index 084ac8a43..4a88a17d5 100644 --- a/environment.c +++ b/environment.c @@ -13,7 +13,6 @@ char git_default_email[MAX_GITNAME]; char git_default_name[MAX_GITNAME]; int user_ident_explicitly_given; int trust_executable_bit = 1; -int quote_path_fully = 1; int has_symlinks = 1; int ignore_case; int assume_unchanged; @@ -327,9 +327,6 @@ const char *make_nonrelative_path(const char *path) return buf; } -/* We allow "recursive" symbolic links. Only within reason, though. */ -#define MAXDEPTH 5 - const char *make_relative_path(const char *abs, const char *base) { static char buf[PATH_MAX + 1]; @@ -346,67 +343,3 @@ const char *make_relative_path(const char *abs, const char *base) strcpy(buf, abs + baselen); return buf; } - -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; -} @@ -1,6 +1,8 @@ #include "cache.h" #include "quote.h" +int quote_path_fully = 1; + /* Help to copy the thing properly quoted for the shell safety. * any single quote is replaced with '\'', any exclamation point * is replaced with '\!', and the whole thing is enclosed in a @@ -3,6 +3,14 @@ #include "exec_cmd.h" #include "strbuf.h" +/* Stubs for functions that make no sense for git-shell. These stubs + * are provided here to avoid linking in external redundant modules. + */ +void release_pack_memory(size_t need, int fd){} +void trace_argv_printf(const char **argv, const char *fmt, ...){} +void trace_printf(const char *fmt, ...){} + + static int do_generic_cmd(const char *me, char *arg) { const char *my_argv[4]; |