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>maint
							parent
							
								
									2dce956e39
								
							
						
					
					
						commit
						5b8e6f85f9
					
				
							
								
								
									
										1
									
								
								Makefile
								
								
								
								
							
							
						
						
									
										1
									
								
								Makefile
								
								
								
								
							|  | @ -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 | ||||
|  |  | |||
|  | @ -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; | ||||
| } | ||||
|  | @ -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; | ||||
|  |  | |||
							
								
								
									
										67
									
								
								path.c
								
								
								
								
							
							
						
						
									
										67
									
								
								path.c
								
								
								
								
							|  | @ -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; | ||||
| } | ||||
|  |  | |||
							
								
								
									
										2
									
								
								quote.c
								
								
								
								
							
							
						
						
									
										2
									
								
								quote.c
								
								
								
								
							|  | @ -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 | ||||
|  |  | |||
							
								
								
									
										8
									
								
								shell.c
								
								
								
								
							
							
						
						
									
										8
									
								
								shell.c
								
								
								
								
							|  | @ -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]; | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Dmitry Potapov
						Dmitry Potapov