Windows: Strip ".exe" from the program name.
authorJohannes Sixt <johannes.sixt@telecom.at>
Sat, 8 Dec 2007 19:57:25 +0000 (20:57 +0100)
committerJohannes Sixt <johannes.sixt@telecom.at>
Mon, 23 Jun 2008 11:34:55 +0000 (13:34 +0200)
Before we can successfully parse a builtin command from the program name
we must strip off unneeded parts, that is, the file extension.

Furthermore, we must take Windows style path names into account when we
parse the program name.

Signed-off-by: Johannes Sixt <johannes.sixt@telecom.at>
Makefile
git-compat-util.h
git.c

index a7dafa7..9c5aae0 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -735,6 +735,7 @@ ifneq (,$(findstring MINGW,$(uname_S)))
        NO_POSIX_ONLY_PROGRAMS = YesPlease
        COMPAT_CFLAGS += -D__USE_MINGW_ACCESS -DNOGDI -Icompat
        COMPAT_CFLAGS += -DSNPRINTF_SIZE_CORR=1
+       COMPAT_CFLAGS += -DSTRIP_EXTENSION=\".exe\"
        COMPAT_OBJS += compat/mingw.o compat/fnmatch.o compat/regex.o
        EXTLIBS += -lws2_32
        X = .exe
index ab762c7..a9a85be 100644 (file)
 #define PATH_SEP ':'
 #endif
 
+#ifndef STRIP_EXTENSION
+#define STRIP_EXTENSION ""
+#endif
+
 #ifndef has_dos_drive_prefix
 #define has_dos_drive_prefix(path) 0
 #endif
diff --git a/git.c b/git.c
index 59f0fcc..871b93c 100644 (file)
--- a/git.c
+++ b/git.c
@@ -369,6 +369,16 @@ static void handle_internal_command(int argc, const char **argv)
                { "pack-refs", cmd_pack_refs, RUN_SETUP },
        };
        int i;
+       static const char ext[] = STRIP_EXTENSION;
+
+       if (sizeof(ext) > 1) {
+               i = strlen(argv[0]) - strlen(ext);
+               if (i > 0 && !strcmp(argv[0] + i, ext)) {
+                       char *argv0 = strdup(argv[0]);
+                       argv[0] = cmd = argv0;
+                       argv0[i] = '\0';
+               }
+       }
 
        /* Turn "git cmd --help" into "git help cmd" */
        if (argc > 1 && !strcmp(argv[1], "--help")) {
@@ -386,8 +396,8 @@ static void handle_internal_command(int argc, const char **argv)
 
 int main(int argc, const char **argv)
 {
-       const char *cmd = argv[0] ? argv[0] : "git-help";
-       char *slash = strrchr(cmd, '/');
+       const char *cmd = argv[0] && *argv[0] ? argv[0] : "git-help";
+       char *slash = (char *)cmd + strlen(cmd);
        const char *cmd_path = NULL;
        int done_alias = 0;
 
@@ -396,7 +406,10 @@ int main(int argc, const char **argv)
         * name, and the dirname as the default exec_path
         * if we don't have anything better.
         */
-       if (slash) {
+       do
+               --slash;
+       while (cmd <= slash && !is_dir_sep(*slash));
+       if (cmd <= slash) {
                *slash++ = 0;
                cmd_path = cmd;
                cmd = slash;