Merge branch 'tb/push-to-cygwin-unc-path'
authorJunio C Hamano <gitster@pobox.com>
Tue, 18 Jul 2017 19:48:09 +0000 (12:48 -0700)
committerJunio C Hamano <gitster@pobox.com>
Tue, 18 Jul 2017 19:48:09 +0000 (12:48 -0700)
On Cygwin, similar to Windows, "git push //server/share/repository"
ought to mean a repository on a network share that can be accessed
locally, but this did not work correctly due to stripping the double
slashes at the beginning.

This may need to be heavily tested before it gets unleashed to the
wild, as the change is at a fairly low-level code and would affect
not just the code to decide if the push destination is local. There
may be unexpected fallouts in the path normalization.

* tb/push-to-cygwin-unc-path:
cygwin: allow pushing to UNC paths

1  2 
config.mak.uname
git-compat-util.h
diff --combined config.mak.uname
index adfb90b6018a87a6fb3455635590aec374fd170b,6367cc023d313d50d5c39217cb6858be80a0bae3..551e465a78242d15ddc472e28351df705f706d88
@@@ -36,7 -36,6 +36,7 @@@ ifeq ($(uname_S),Linux
        NEEDS_LIBRT = YesPlease
        HAVE_GETDELIM = YesPlease
        SANE_TEXT_GREP=-a
 +      FREAD_READS_DIRECTORIES = UnfortunatelyYes
  endif
  ifeq ($(uname_S),GNU/kFreeBSD)
        HAVE_ALLOCA_H = YesPlease
@@@ -44,7 -43,6 +44,7 @@@
        HAVE_PATHS_H = YesPlease
        DIR_HAS_BSD_GROUP_SEMANTICS = YesPlease
        LIBC_CONTAINS_LIBINTL = YesPlease
 +      FREAD_READS_DIRECTORIES = UnfortunatelyYes
  endif
  ifeq ($(uname_S),UnixWare)
        CC = cc
@@@ -110,7 -108,6 +110,7 @@@ ifeq ($(uname_S),Darwin
        BASIC_CFLAGS += -DPRECOMPOSE_UNICODE
        BASIC_CFLAGS += -DPROTECT_HFS_DEFAULT=1
        HAVE_BSD_SYSCTL = YesPlease
 +      FREAD_READS_DIRECTORIES = UnfortunatelyYes
  endif
  ifeq ($(uname_S),SunOS)
        NEEDS_SOCKET = YesPlease
@@@ -184,6 -181,7 +184,7 @@@ ifeq ($(uname_O),Cygwin
        UNRELIABLE_FSTAT = UnfortunatelyYes
        SPARSE_FLAGS = -isystem /usr/include/w32api -Wno-one-bit-signed-bitfield
        OBJECT_CREATION_USES_RENAMES = UnfortunatelyNeedsTo
+       COMPAT_OBJS += compat/cygwin.o
  endif
  ifeq ($(uname_S),FreeBSD)
        NEEDS_LIBICONV = YesPlease
        GMTIME_UNRELIABLE_ERRORS = UnfortunatelyYes
        HAVE_BSD_SYSCTL = YesPlease
        PAGER_ENV = LESS=FRX LV=-c MORE=FRX
 +      FREAD_READS_DIRECTORIES = UnfortunatelyYes
  endif
  ifeq ($(uname_S),OpenBSD)
        NO_STRCASESTR = YesPlease
@@@ -555,7 -552,6 +556,7 @@@ els
                NO_GETTEXT =
                USE_GETTEXT_SCHEME = fallthrough
                USE_LIBPCRE= YesPlease
 +              NO_LIBPCRE1_JIT = UnfortunatelyYes
                NO_CURL =
                USE_NED_ALLOCATOR = YesPlease
        else
diff --combined git-compat-util.h
index 047172d173c495d7e723a00db5d563113978f917,59866d72fa3bb5aff109632b42c7178b24f528bc..db9c22de7693af4e905fdeb0a1766ba4469eda94
  #include <sys/sysctl.h>
  #endif
  
+ #if defined(__CYGWIN__)
+ #include "compat/cygwin.h"
+ #endif
  #if defined(__MINGW32__)
  /* pull in Windows compatibility stuff */
  #include "compat/mingw.h"
@@@ -319,11 -322,6 +322,11 @@@ extern char *gitdirname(char *)
  #define PRIo32 "o"
  #endif
  
 +typedef uintmax_t timestamp_t;
 +#define PRItime PRIuMAX
 +#define parse_timestamp strtoumax
 +#define TIME_MAX UINTMAX_MAX
 +
  #ifndef PATH_SEP
  #define PATH_SEP ':'
  #endif
@@@ -620,7 -618,7 +623,7 @@@ extern int git_lstat(const char *, stru
  #endif
  
  #define DEFAULT_PACKED_GIT_LIMIT \
 -      ((1024L * 1024L) * (size_t)(sizeof(void*) >= 8 ? 8192 : 256))
 +      ((1024L * 1024L) * (size_t)(sizeof(void*) >= 8 ? (32 * 1024L * 1024L) : 256))
  
  #ifdef NO_PREAD
  #define pread git_pread
@@@ -693,12 -691,10 +696,12 @@@ char *gitstrdup(const char *s)
  #endif
  
  #ifdef FREAD_READS_DIRECTORIES
 -#ifdef fopen
 -#undef fopen
 -#endif
 -#define fopen(a,b) git_fopen(a,b)
 +# if !defined(SUPPRESS_FOPEN_REDEFINITION)
 +#  ifdef fopen
 +#   undef fopen
 +#  endif
 +#  define fopen(a,b) git_fopen(a,b)
 +# endif
  extern FILE *git_fopen(const char*, const char*);
  #endif
  
@@@ -806,13 -802,6 +809,13 @@@ extern int xmkstemp(char *template)
  extern int xmkstemp_mode(char *template, int mode);
  extern char *xgetcwd(void);
  extern FILE *fopen_for_writing(const char *path);
 +extern FILE *fopen_or_warn(const char *path, const char *mode);
 +
 +/*
 + * FREE_AND_NULL(ptr) is like free(ptr) followed by ptr = NULL. Note
 + * that ptr is used twice, so don't pass e.g. ptr++.
 + */
 +#define FREE_AND_NULL(p) do { free(p); (p) = NULL; } while (0)
  
  #define ALLOC_ARRAY(x, alloc) (x) = xmalloc(st_mult(sizeof(*(x)), (alloc)))
  #define REALLOC_ARRAY(x, alloc) (x) = xrealloc((x), st_mult(sizeof(*(x)), (alloc)))
@@@ -1119,8 -1108,8 +1122,8 @@@ int remove_or_warn(unsigned int mode, c
  int access_or_warn(const char *path, int mode, unsigned flag);
  int access_or_die(const char *path, int mode, unsigned flag);
  
 -/* Warn on an inaccessible file that ought to be accessible */
 -void warn_on_inaccessible(const char *path);
 +/* Warn on an inaccessible file if errno indicates this is an error */
 +int warn_on_fopen_errors(const char *path);
  
  #ifdef GMTIME_UNRELIABLE_ERRORS
  struct tm *git_gmtime(const time_t *);
@@@ -1143,21 -1132,6 +1146,21 @@@ struct tm *git_gmtime_r(const time_t *
  #define getc_unlocked(fh) getc(fh)
  #endif
  
 +/*
 + * Our code often opens a path to an optional file, to work on its
 + * contents when we can successfully open it.  We can ignore a failure
 + * to open if such an optional file does not exist, but we do want to
 + * report a failure in opening for other reasons (e.g. we got an I/O
 + * error, or the file is there, but we lack the permission to open).
 + *
 + * Call this function after seeing an error from open() or fopen() to
 + * see if the errno indicates a missing file that we can safely ignore.
 + */
 +static inline int is_missing_file_error(int errno_)
 +{
 +      return (errno_ == ENOENT || errno_ == ENOTDIR);
 +}
 +
  extern int cmd_main(int, const char **);
  
  #endif