{"thread":{"id":"19610","subject":"[PATCH v6 3/3] diff: generate pretty filenames in prep_temp_blob()","startedAt":"2009-05-31T04:37:53Z","lastAt":"2009-05-31T04:53:06Z","messageCount":5,"participants":["David Aguilar","Junio C Hamano"],"isPatch":true,"patchVersion":6,"patchTotal":3},"messages":[{"id":"115110","messageId":"1243744675-24160-1-git-send-email-davvid@gmail.com","threadId":"19610","inReplyTo":null,"subject":"[PATCH v6 1/3] compat: add a mkstemps() compatibility function","fromName":"David Aguilar","fromEmail":"davvid@gmail.com","sentAt":"2009-05-31T04:37:53Z","receivedAt":"2009-05-31T04:37:53Z","isPatch":true,"sender":{"key":"davvid@gmail.com","avatar":"https://avatars.githubusercontent.com/u/13196?v=4"},"body":"mkstemps() is a BSD extension so provide an implementation\nfor cross-platform use.\n\nSigned-off-by: David Aguilar <davvid@gmail.com>\nTested-by: Johannes Sixt <j6t@kdbg.org> (Windows)\n---\n Makefile          |   19 ++++++++++++++++\n compat/mkstemps.c |   63 +++++++++++++++++++++++++++++++++++++++++++++++++++++\n config.mak.in     |    1 +\n configure.ac      |    7 ++++++\n git-compat-util.h |    9 +++++++\n 5 files changed, 99 insertions(+), 0 deletions(-)\n create mode 100644 compat/mkstemps.c\n\ndiff --git a/Makefile b/Makefile\nindex eaae45d..a70b5f0 100644\n--- a/Makefile\n+++ b/Makefile\n@@ -52,6 +52,8 @@ all::\n #\n # Define NO_MKDTEMP if you don't have mkdtemp in the C library.\n #\n+# Define NO_MKSTEMPS if you don't have mkstemps in the C library.\n+#\n # Define NO_SYS_SELECT_H if you don't have sys/select.h.\n #\n # Define NO_SYMLINK_HEAD if you never want .git/HEAD to be a symbolic link.\n@@ -636,10 +638,12 @@ EXTLIBS =\n \n ifeq ($(uname_S),Linux)\n \tNO_STRLCPY = YesPlease\n+\tNO_MKSTEMPS = YesPlease\n \tTHREADED_DELTA_SEARCH = YesPlease\n endif\n ifeq ($(uname_S),GNU/kFreeBSD)\n \tNO_STRLCPY = YesPlease\n+\tNO_MKSTEMPS = YesPlease\n \tTHREADED_DELTA_SEARCH = YesPlease\n endif\n ifeq ($(uname_S),UnixWare)\n@@ -651,6 +655,7 @@ ifeq ($(uname_S),UnixWare)\n \tSHELL_PATH = /usr/local/bin/bash\n \tNO_IPV6 = YesPlease\n \tNO_HSTRERROR = YesPlease\n+\tNO_MKSTEMPS = YesPlease\n \tBASIC_CFLAGS += -Kthread\n \tBASIC_CFLAGS += -I/usr/local/include\n \tBASIC_LDFLAGS += -L/usr/local/lib\n@@ -674,6 +679,7 @@ ifeq ($(uname_S),SCO_SV)\n \tSHELL_PATH = /usr/bin/bash\n \tNO_IPV6 = YesPlease\n \tNO_HSTRERROR = YesPlease\n+\tNO_MKSTEMPS = YesPlease\n \tBASIC_CFLAGS += -I/usr/local/include\n \tBASIC_LDFLAGS += -L/usr/local/lib\n \tNO_STRCASESTR = YesPlease\n@@ -702,6 +708,7 @@ ifeq ($(uname_S),SunOS)\n \tNO_MEMMEM = YesPlease\n \tNO_HSTRERROR = YesPlease\n \tNO_MKDTEMP = YesPlease\n+\tNO_MKSTEMPS = YesPlease\n \tOLD_ICONV = UnfortunatelyYes\n \tifeq ($(uname_R),5.8)\n \t\tNO_UNSETENV = YesPlease\n@@ -724,6 +731,7 @@ ifeq ($(uname_O),Cygwin)\n \tNO_D_INO_IN_DIRENT = YesPlease\n \tNO_STRCASESTR = YesPlease\n \tNO_MEMMEM = YesPlease\n+\tNO_MKSTEMPS = YesPlease\n \tNO_SYMLINK_HEAD = YesPlease\n \tNEEDS_LIBICONV = YesPlease\n \tNO_FAST_WORKING_DIRECTORY = UnfortunatelyYes\n@@ -767,11 +775,13 @@ ifeq ($(uname_S),NetBSD)\n \tBASIC_LDFLAGS += -L/usr/pkg/lib $(CC_LD_DYNPATH)/usr/pkg/lib\n \tTHREADED_DELTA_SEARCH = YesPlease\n \tUSE_ST_TIMESPEC = YesPlease\n+\tNO_MKSTEMPS = YesPlease\n endif\n ifeq ($(uname_S),AIX)\n \tNO_STRCASESTR=YesPlease\n \tNO_MEMMEM = YesPlease\n \tNO_MKDTEMP = YesPlease\n+\tNO_MKSTEMPS = YesPlease\n \tNO_STRLCPY = YesPlease\n \tNO_NSEC = YesPlease\n \tFREAD_READS_DIRECTORIES = UnfortunatelyYes\n@@ -787,12 +797,14 @@ endif\n ifeq ($(uname_S),GNU)\n \t# GNU/Hurd\n \tNO_STRLCPY=YesPlease\n+\tNO_MKSTEMPS = YesPlease\n endif\n ifeq ($(uname_S),IRIX64)\n \tNO_IPV6=YesPlease\n \tNO_SETENV=YesPlease\n \tNO_STRCASESTR=YesPlease\n \tNO_MEMMEM = YesPlease\n+\tNO_MKSTEMPS = YesPlease\n \tNO_STRLCPY = YesPlease\n \tNO_SOCKADDR_STORAGE=YesPlease\n \tSHELL_PATH=/usr/gnu/bin/bash\n@@ -805,6 +817,7 @@ ifeq ($(uname_S),HP-UX)\n \tNO_SETENV=YesPlease\n \tNO_STRCASESTR=YesPlease\n \tNO_MEMMEM = YesPlease\n+\tNO_MKSTEMPS = YesPlease\n \tNO_STRLCPY = YesPlease\n \tNO_MKDTEMP = YesPlease\n \tNO_UNSETENV = YesPlease\n@@ -834,6 +847,7 @@ ifneq (,$(findstring MINGW,$(uname_S)))\n \tNO_C99_FORMAT = YesPlease\n \tNO_STRTOUMAX = YesPlease\n \tNO_MKDTEMP = YesPlease\n+\tNO_MKSTEMPS = YesPlease\n \tSNPRINTF_RETURNS_BOGUS = YesPlease\n \tNO_SVN_TESTS = YesPlease\n \tNO_PERL_MAKEMAKER = YesPlease\n@@ -853,6 +867,7 @@ ifneq (,$(findstring MINGW,$(uname_S)))\n endif\n ifneq (,$(findstring arm,$(uname_M)))\n \tARM_SHA1 = YesPlease\n+\tNO_MKSTEMPS = YesPlease\n endif\n \n -include config.mak.autogen\n@@ -1011,6 +1026,10 @@ ifdef NO_MKDTEMP\n \tCOMPAT_CFLAGS += -DNO_MKDTEMP\n \tCOMPAT_OBJS += compat/mkdtemp.o\n endif\n+ifdef NO_MKSTEMPS\n+\tCOMPAT_CFLAGS += -DNO_MKSTEMPS\n+\tCOMPAT_OBJS += compat/mkstemps.o\n+endif\n ifdef NO_UNSETENV\n \tCOMPAT_CFLAGS += -DNO_UNSETENV\n \tCOMPAT_OBJS += compat/unsetenv.o\ndiff --git a/compat/mkstemps.c b/compat/mkstemps.c\nnew file mode 100644\nindex 0000000..9ce729b\n--- /dev/null\n+++ b/compat/mkstemps.c\n@@ -0,0 +1,63 @@\n+#include \"../git-compat-util.h\"\n+\n+/* Adapted from libiberty's mkstemp.c. */\n+int gitmkstemps(char *pattern, int suffix_len)\n+{\n+\tstatic const char letters[] =\n+\t\t\"abcdefghijklmnopqrstuvwxyz\"\n+\t\t\"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n+\t\t\"0123456789\";\n+\tstatic const int num_letters = 62;\n+\tuint64_t value;\n+\tstruct timeval tv;\n+\tchar *template;\n+\tsize_t len;\n+\tint fd, count;\n+\n+\tlen = strlen(pattern);\n+\n+\tif (len < 6 + suffix_len) {\n+\t\terrno = EINVAL;\n+\t\treturn -1;\n+\t}\n+\n+\tif (strncmp(&pattern[len - 6 - suffix_len], \"XXXXXX\", 6)) {\n+\t\terrno = EINVAL;\n+\t\treturn -1;\n+\t}\n+\n+\t/* Replace pattern's XXXXXX characters with randomness.\n+\t * Try TMP_MAX different filenames.\n+\t */\n+\tgettimeofday(&tv, NULL);\n+\tvalue = ((size_t)(tv.tv_usec << 16)) ^ tv.tv_sec ^ getpid();\n+\ttemplate = &pattern[len - 6 - suffix_len];\n+\tfor (count = 0; count < TMP_MAX; ++count) {\n+\t\tuint64_t v = value;\n+\t\t/* Fill in the random bits. */\n+\t\ttemplate[0] = letters[v % num_letters]; v/= num_letters;\n+\t\ttemplate[1] = letters[v % num_letters]; v/= num_letters;\n+\t\ttemplate[2] = letters[v % num_letters]; v/= num_letters;\n+\t\ttemplate[3] = letters[v % num_letters]; v/= num_letters;\n+\t\ttemplate[4] = letters[v % num_letters]; v/= num_letters;\n+\t\ttemplate[5] = letters[v % num_letters]; v/= num_letters;\n+\n+\t\tfd = open(pattern, O_CREAT | O_EXCL | O_RDWR, 0600);\n+\t\tif (fd > 0)\n+\t\t\treturn fd;\n+\t\t/* Fatal error (EPERM, ENOSPC etc).\n+\t\t * It doesn't make sense to loop.\n+\t\t */\n+\t\tif (errno != EEXIST)\n+\t\t\tbreak;\n+\t\t/* This is a random value.  It is only necessary that\n+\t\t * the next TMP_MAX values generated by adding 7777 to\n+\t\t * VALUE are different with (module 2^32).\n+\t\t */\n+\t\tvalue += 7777;\n+\t}\n+\t/* We return the null string if we can't find a unique file name.  */\n+\tpattern[0] = '\\0';\n+\terrno = EINVAL;\n+\treturn -1;\n+}\ndiff --git a/config.mak.in b/config.mak.in\nindex 7cce0c1..b6619af 100644\n--- a/config.mak.in\n+++ b/config.mak.in\n@@ -46,6 +46,7 @@ NO_STRTOUMAX=@NO_STRTOUMAX@\n NO_SETENV=@NO_SETENV@\n NO_UNSETENV=@NO_UNSETENV@\n NO_MKDTEMP=@NO_MKDTEMP@\n+NO_MKSTEMPS=@NO_MKSTEMPS@\n NO_ICONV=@NO_ICONV@\n OLD_ICONV=@OLD_ICONV@\n NO_DEFLATE_BOUND=@NO_DEFLATE_BOUND@\ndiff --git a/configure.ac b/configure.ac\nindex 4e728bc..953da07 100644\n--- a/configure.ac\n+++ b/configure.ac\n@@ -677,6 +677,13 @@ GIT_CHECK_FUNC(mkdtemp,\n [NO_MKDTEMP=YesPlease])\n AC_SUBST(NO_MKDTEMP)\n #\n+# Define NO_MKSTEMPS if you don't have mkstemps in the C library.\n+GIT_CHECK_FUNC(mkstemps,\n+[NO_MKSTEMPS=],\n+[NO_MKSTEMPS=YesPlease])\n+AC_SUBST(NO_MKSTEMPS)\n+#\n+#\n # Define NO_MMAP if you want to avoid mmap.\n #\n # Define NO_ICONV if your libc does not properly support iconv.\ndiff --git a/git-compat-util.h b/git-compat-util.h\nindex c7cf2d5..5a2d4e7 100644\n--- a/git-compat-util.h\n+++ b/git-compat-util.h\n@@ -113,6 +113,10 @@\n #define PATH_MAX 4096\n #endif\n \n+#ifndef TMP_MAX\n+#define TMP_MAX 16384\n+#endif\n+\n #ifndef PRIuMAX\n #define PRIuMAX \"llu\"\n #endif\n@@ -232,6 +236,11 @@ extern int gitsetenv(const char *, const char *, int);\n extern char *gitmkdtemp(char *);\n #endif\n \n+#ifdef NO_MKSTEMPS\n+#define mkstemps gitmkstemps\n+extern int gitmkstemps(char *, int);\n+#endif\n+\n #ifdef NO_UNSETENV\n #define unsetenv gitunsetenv\n extern void gitunsetenv(const char *);\n-- \n1.6.3.1.178.g5b6b2\n"},{"id":"115109","messageId":"1243744675-24160-2-git-send-email-davvid@gmail.com","threadId":"19610","inReplyTo":"1243744675-24160-1-git-send-email-davvid@gmail.com","subject":"[PATCH v6 2/3] compat: add a basename() compatibility function","fromName":"David Aguilar","fromEmail":"davvid@gmail.com","sentAt":"2009-05-31T04:37:54Z","receivedAt":"2009-05-31T04:37:54Z","isPatch":true,"sender":{"key":"davvid@gmail.com","avatar":"https://avatars.githubusercontent.com/u/13196?v=4"},"body":"Some systems such as Windows lack libgen.h so provide a\nbasename() implementation for cross-platform use.\n\nThis introduces the NO_LIBGEN_H construct to the Makefile\nand autoconf scripts.\n\nSigned-off-by: David Aguilar <davvid@gmail.com>\n---\n Makefile          |   12 ++++++++++++\n compat/basename.c |   19 +++++++++++++++++++\n config.mak.in     |    1 +\n configure.ac      |    6 ++++++\n git-compat-util.h |    7 +++++++\n 5 files changed, 45 insertions(+), 0 deletions(-)\n create mode 100644 compat/basename.c\n\ndiff --git a/Makefile b/Makefile\nindex a70b5f0..caa3002 100644\n--- a/Makefile\n+++ b/Makefile\n@@ -54,6 +54,8 @@ all::\n #\n # Define NO_MKSTEMPS if you don't have mkstemps in the C library.\n #\n+# Define NO_LIBGEN_H if you don't have libgen.h.\n+#\n # Define NO_SYS_SELECT_H if you don't have sys/select.h.\n #\n # Define NO_SYMLINK_HEAD if you never want .git/HEAD to be a symbolic link.\n@@ -834,6 +836,7 @@ ifneq (,$(findstring MINGW,$(uname_S)))\n \tNO_PREAD = YesPlease\n \tNO_OPENSSL = YesPlease\n \tNO_CURL = YesPlease\n+\tNO_LIBGEN_H = UnfortunatelyYes\n \tNO_SYMLINK_HEAD = YesPlease\n \tNO_IPV6 = YesPlease\n \tNO_SETENV = YesPlease\n@@ -855,6 +858,7 @@ ifneq (,$(findstring MINGW,$(uname_S)))\n \tNO_POSIX_ONLY_PROGRAMS = YesPlease\n \tNO_ST_BLOCKS_IN_STRUCT_STAT = YesPlease\n \tNO_NSEC = YesPlease\n+\tUSE_WIN32_FS = YesPlease\n \tUSE_WIN32_MMAP = YesPlease\n \tUNRELIABLE_FSTAT = UnfortunatelyYes\n \tOBJECT_CREATION_USES_RENAMES = UnfortunatelyNeedsTo\n@@ -899,6 +903,11 @@ ifndef CC_LD_DYNPATH\n \tendif\n endif\n \n+ifdef NO_LIBGEN_H\n+\tCOMPAT_CFLAGS += -DNO_LIBGEN_H\n+\tCOMPAT_OBJS += compat/basename.o\n+endif\n+\n ifdef NO_CURL\n \tBASIC_CFLAGS += -DNO_CURL\n else\n@@ -1046,6 +1055,9 @@ else\n \t\tCOMPAT_OBJS += compat/win32mmap.o\n \tendif\n endif\n+ifdef USE_WIN32_FS\n+\tCOMPAT_CFLAGS += -DWIN32_FS\n+endif\n ifdef OBJECT_CREATION_USES_RENAMES\n \tCOMPAT_CFLAGS += -DOBJECT_CREATION_MODE=1\n endif\ndiff --git a/compat/basename.c b/compat/basename.c\nnew file mode 100644\nindex 0000000..c45716a\n--- /dev/null\n+++ b/compat/basename.c\n@@ -0,0 +1,19 @@\n+#include \"../git-compat-util.h\"\n+\n+/* Adapted from libiberty's basename.c.  */\n+char *gitbasename (char *path)\n+{\n+\tconst char *base;\n+\n+#ifdef USE_WIN32_FS\n+\t/* Skip over the disk name in MSDOS pathnames. */\n+\tif (isalpha(path[0]) && path[1] == ':')\n+\t\tpath += 2;\n+#endif\n+\tfor (base = path; *path; path++) {\n+\t\tif (is_dir_sep(*path)) {\n+\t\t\tbase = path + 1;\n+\t\t}\n+\t}\n+\treturn (char *)base;\n+}\ndiff --git a/config.mak.in b/config.mak.in\nindex b6619af..e8d96e8 100644\n--- a/config.mak.in\n+++ b/config.mak.in\n@@ -30,6 +30,7 @@ NEEDS_SSL_WITH_CRYPTO=@NEEDS_SSL_WITH_CRYPTO@\n NO_OPENSSL=@NO_OPENSSL@\n NO_CURL=@NO_CURL@\n NO_EXPAT=@NO_EXPAT@\n+NO_LIBGEN_H=@NO_LIBGEN_H@\n NEEDS_LIBICONV=@NEEDS_LIBICONV@\n NEEDS_SOCKET=@NEEDS_SOCKET@\n NO_SYS_SELECT_H=@NO_SYS_SELECT_H@\ndiff --git a/configure.ac b/configure.ac\nindex 953da07..3e7a0e4 100644\n--- a/configure.ac\n+++ b/configure.ac\n@@ -627,6 +627,12 @@ AC_SUBST(SNPRINTF_RETURNS_BOGUS)\n ## (in default C library and libraries checked by AC_CHECK_LIB)\n AC_MSG_NOTICE([CHECKS for library functions])\n #\n+# Define NO_LIBGEN_H if you don't have libgen.h.\n+AC_CHECK_HEADER([libgen.h],\n+[NO_LIBGEN_H=],\n+[NO_LIBGEN_H=UnfortunatelyYes])\n+AC_SUBST(NO_LIBGEN_H)\n+#\n # Define NO_STRCASESTR if you don't have strcasestr.\n GIT_CHECK_FUNC(strcasestr,\n [NO_STRCASESTR=],\ndiff --git a/git-compat-util.h b/git-compat-util.h\nindex 5a2d4e7..d248047 100644\n--- a/git-compat-util.h\n+++ b/git-compat-util.h\n@@ -97,6 +97,13 @@\n #include \"compat/mingw.h\"\n #endif\t/* __MINGW32__ */\n \n+#ifndef NO_LIBGEN_H\n+#include <libgen.h>\n+#else\n+#define basename gitbasename\n+extern char *gitbasename(char *);\n+#endif\n+\n #ifndef NO_ICONV\n #include <iconv.h>\n #endif\n-- \n1.6.3.1.178.g5b6b2\n"},{"id":"115108","messageId":"1243744675-24160-3-git-send-email-davvid@gmail.com","threadId":"19610","inReplyTo":"1243744675-24160-2-git-send-email-davvid@gmail.com","subject":"[PATCH v6 3/3] diff: generate pretty filenames in prep_temp_blob()","fromName":"David Aguilar","fromEmail":"davvid@gmail.com","sentAt":"2009-05-31T04:37:55Z","receivedAt":"2009-05-31T04:37:55Z","isPatch":true,"sender":{"key":"davvid@gmail.com","avatar":"https://avatars.githubusercontent.com/u/13196?v=4"},"body":"Naturally, prep_temp_blob() did not care about filenames.\nAs a result, GIT_EXTERNAL_DIFF and textconv generated\nfilenames such as \".diff_XXXXXX\".\n\nThis modifies prep_temp_blob() to generate user-friendly\nfilenames when creating temporary files.\n\nDiffing \"name.ext\" now generates \"XXXXXX_name.ext\".\n\nSigned-off-by: David Aguilar <davvid@gmail.com>\n---\n cache.h                  |    2 ++\n diff.c                   |   12 +++++++++++-\n path.c                   |   16 ++++++++++++++++\n t/t4020-diff-external.sh |    9 +++++++++\n 4 files changed, 38 insertions(+), 1 deletions(-)\n\ndiff --git a/cache.h b/cache.h\nindex b8503ad..871c984 100644\n--- a/cache.h\n+++ b/cache.h\n@@ -614,6 +614,8 @@ extern int is_empty_blob_sha1(const unsigned char *sha1);\n \n int git_mkstemp(char *path, size_t n, const char *template);\n \n+int git_mkstemps(char *path, size_t n, const char *template, int suffix_len);\n+\n /*\n  * NOTE NOTE NOTE!!\n  *\ndiff --git a/diff.c b/diff.c\nindex dcfbcb0..4d0a5b9 100644\n--- a/diff.c\n+++ b/diff.c\n@@ -1964,8 +1964,16 @@ static void prep_temp_blob(const char *path, struct diff_tempfile *temp,\n {\n \tint fd;\n \tstruct strbuf buf = STRBUF_INIT;\n+\tstruct strbuf template = STRBUF_INIT;\n+\tchar *path_dup = xstrdup(path);\n+\tconst char *base = basename(path_dup);\n \n-\tfd = git_mkstemp(temp->tmp_path, PATH_MAX, \".diff_XXXXXX\");\n+\t/* Generate \"XXXXXX_basename.ext\" */\n+\tstrbuf_addstr(&template, \"XXXXXX_\");\n+\tstrbuf_addstr(&template, base);\n+\n+\tfd = git_mkstemps(temp->tmp_path, PATH_MAX, template.buf,\n+\t\t\tstrlen(base) + 1);\n \tif (fd < 0)\n \t\tdie(\"unable to create temp-file: %s\", strerror(errno));\n \tif (convert_to_working_tree(path,\n@@ -1981,6 +1989,8 @@ static void prep_temp_blob(const char *path, struct diff_tempfile *temp,\n \ttemp->hex[40] = 0;\n \tsprintf(temp->mode, \"%06o\", mode);\n \tstrbuf_release(&buf);\n+\tstrbuf_release(&template);\n+\tfree(path_dup);\n }\n \n static struct diff_tempfile *prepare_temp_file(const char *name,\ndiff --git a/path.c b/path.c\nindex 8a0a674..047fdb0 100644\n--- a/path.c\n+++ b/path.c\n@@ -139,6 +139,22 @@ int git_mkstemp(char *path, size_t len, const char *template)\n \treturn mkstemp(path);\n }\n \n+/* git_mkstemps() - create tmp file with suffix honoring TMPDIR variable. */\n+int git_mkstemps(char *path, size_t len, const char *template, int suffix_len)\n+{\n+\tconst char *tmp;\n+\tsize_t n;\n+\n+\ttmp = getenv(\"TMPDIR\");\n+\tif (!tmp)\n+\t\ttmp = \"/tmp\";\n+\tn = snprintf(path, len, \"%s/%s\", tmp, template);\n+\tif (len <= n) {\n+\t\terrno = ENAMETOOLONG;\n+\t\treturn -1;\n+\t}\n+\treturn mkstemps(path, suffix_len);\n+}\n \n int validate_headref(const char *path)\n {\ndiff --git a/t/t4020-diff-external.sh b/t/t4020-diff-external.sh\nindex 0720001..4ea42e0 100755\n--- a/t/t4020-diff-external.sh\n+++ b/t/t4020-diff-external.sh\n@@ -136,6 +136,15 @@ test_expect_success 'GIT_EXTERNAL_DIFF with more than one changed files' '\n \tGIT_EXTERNAL_DIFF=echo git diff\n '\n \n+test_expect_success 'GIT_EXTERNAL_DIFF generates pretty paths' '\n+\ttouch file.ext &&\n+\tgit add file.ext &&\n+\techo with extension > file.ext &&\n+\tGIT_EXTERNAL_DIFF=echo git diff file.ext | grep ......_file\\.ext &&\n+\tgit update-index --force-remove file.ext &&\n+\trm file.ext\n+'\n+\n echo \"#!$SHELL_PATH\" >fake-diff.sh\n cat >> fake-diff.sh <<\\EOF\n cat $2 >> crlfed.txt\n-- \n1.6.3.1.178.g5b6b2\n"},{"id":"115111","messageId":"20090531044246.GA23995@gmail.com","threadId":"19610","inReplyTo":"1243744675-24160-2-git-send-email-davvid@gmail.com","subject":"Re: [PATCH v6 2/3] compat: add a basename() compatibility function","fromName":"David Aguilar","fromEmail":"davvid@gmail.com","sentAt":"2009-05-31T04:42:47Z","receivedAt":"2009-05-31T04:42:47Z","isPatch":true,"sender":{"key":"davvid@gmail.com","avatar":"https://avatars.githubusercontent.com/u/13196?v=4"},"body":"On Sat, May 30, 2009 at 09:37:54PM -0700, David Aguilar wrote:\n> Some systems such as Windows lack libgen.h so provide a\n> basename() implementation for cross-platform use.\n> [...]\n> diff --git a/compat/basename.c b/compat/basename.c\n> new file mode 100644\n> index 0000000..c45716a\n> --- /dev/null\n> +++ b/compat/basename.c\n> @@ -0,0 +1,19 @@\n> +#include \"../git-compat-util.h\"\n> +\n> +/* Adapted from libiberty's basename.c.  */\n> +char *gitbasename (char *path)\n> +{\n> +\tconst char *base;\n> +\n> +#ifdef USE_WIN32_FS\n> +\t/* Skip over the disk name in MSDOS pathnames. */\n> +\tif (isalpha(path[0]) && path[1] == ':')\n> +\t\tpath += 2;\n> +#endif\n\n\nThanks for bearing through this series everyone.. ;)\n\nCan someone with better win32 knowledge let me know if the\nUSE_WIN32_FS stuff is needed for msysgit?\n\nI would really like it if there was a way to do without the\n#define.\n\n\n\n> +\tfor (base = path; *path; path++) {\n> +\t\tif (is_dir_sep(*path)) {\n> +\t\t\tbase = path + 1;\n> +\t\t}\n> +\t}\n> +\treturn (char *)base;\n> +}\n\n-- \n\t\tDavid\n"},{"id":"115112","messageId":"7vbpp9vpot.fsf@alter.siamese.dyndns.org","threadId":"19610","inReplyTo":"20090531044246.GA23995@gmail.com","subject":"Re: [PATCH v6 2/3] compat: add a basename() compatibility function","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2009-05-31T04:53:06Z","receivedAt":"2009-05-31T04:53:06Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"David Aguilar <davvid@gmail.com> writes:\n\n>> +#ifdef USE_WIN32_FS\n>> +\t/* Skip over the disk name in MSDOS pathnames. */\n>> +\tif (isalpha(path[0]) && path[1] == ':')\n>> +\t\tpath += 2;\n>> +#endif\n>\n> Thanks for bearing through this series everyone.. ;)\n>\n> Can someone with better win32 knowledge let me know if the\n> USE_WIN32_FS stuff is needed for msysgit?\n>\n> I would really like it if there was a way to do without the\n> #define.\n\nIsn't this essentially the same as has_dos_drive_prefix()?\n"}]}