Browse Source

Windows: Strip ".exe" from the program name.

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>
maint
Johannes Sixt 17 years ago
parent
commit
23326d14ed
  1. 1
      Makefile
  2. 4
      git-compat-util.h
  3. 19
      git.c

1
Makefile

@ -735,6 +735,7 @@ ifneq (,$(findstring MINGW,$(uname_S)))
NO_POSIX_ONLY_PROGRAMS = YesPlease NO_POSIX_ONLY_PROGRAMS = YesPlease
COMPAT_CFLAGS += -D__USE_MINGW_ACCESS -DNOGDI -Icompat COMPAT_CFLAGS += -D__USE_MINGW_ACCESS -DNOGDI -Icompat
COMPAT_CFLAGS += -DSNPRINTF_SIZE_CORR=1 COMPAT_CFLAGS += -DSNPRINTF_SIZE_CORR=1
COMPAT_CFLAGS += -DSTRIP_EXTENSION=\".exe\"
COMPAT_OBJS += compat/mingw.o compat/fnmatch.o compat/regex.o COMPAT_OBJS += compat/mingw.o compat/fnmatch.o compat/regex.o
EXTLIBS += -lws2_32 EXTLIBS += -lws2_32
X = .exe X = .exe

4
git-compat-util.h

@ -114,6 +114,10 @@
#define PATH_SEP ':' #define PATH_SEP ':'
#endif #endif


#ifndef STRIP_EXTENSION
#define STRIP_EXTENSION ""
#endif

#ifndef has_dos_drive_prefix #ifndef has_dos_drive_prefix
#define has_dos_drive_prefix(path) 0 #define has_dos_drive_prefix(path) 0
#endif #endif

19
git.c

@ -369,6 +369,16 @@ static void handle_internal_command(int argc, const char **argv)
{ "pack-refs", cmd_pack_refs, RUN_SETUP }, { "pack-refs", cmd_pack_refs, RUN_SETUP },
}; };
int i; 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" */ /* Turn "git cmd --help" into "git help cmd" */
if (argc > 1 && !strcmp(argv[1], "--help")) { 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) int main(int argc, const char **argv)
{ {
const char *cmd = argv[0] ? argv[0] : "git-help"; const char *cmd = argv[0] && *argv[0] ? argv[0] : "git-help";
char *slash = strrchr(cmd, '/'); char *slash = (char *)cmd + strlen(cmd);
const char *cmd_path = NULL; const char *cmd_path = NULL;
int done_alias = 0; int done_alias = 0;


@ -396,7 +406,10 @@ int main(int argc, const char **argv)
* name, and the dirname as the default exec_path * name, and the dirname as the default exec_path
* if we don't have anything better. * if we don't have anything better.
*/ */
if (slash) { do
--slash;
while (cmd <= slash && !is_dir_sep(*slash));
if (cmd <= slash) {
*slash++ = 0; *slash++ = 0;
cmd_path = cmd; cmd_path = cmd;
cmd = slash; cmd = slash;

Loading…
Cancel
Save