Skip to content
  • Dmitry Potapov's avatar
    cygwin: Use native Win32 API for stat · adbc0b6b
    Dmitry Potapov authored
    
    
    lstat/stat functions in Cygwin are very slow, because they try to emulate
    some *nix things that Git does not actually need. This patch adds Win32
    specific implementation of these functions for Cygwin.
    
    This implementation handles most situation directly but in some rare cases
    it falls back on the implementation provided for Cygwin. This is necessary
    for two reasons:
    
    - Cygwin has its own file hierarchy, so absolute paths used in Cygwin is
      not suitable to be used Win32 API. cygwin_conv_to_win32_path can not be
      used because it automatically dereference Cygwin symbol links, also it
      causes extra syscall. Fortunately Git rarely use absolute paths, so we
      always use Cygwin implementation for absolute paths.
    
    - Support of symbol links. Cygwin stores symbol links as ordinary using
      one of two possible formats. Therefore, the fast implementation falls
      back to Cygwin functions if it detects potential use of symbol links.
    
    The speed of this implementation should be the same as mingw_lstat for
    common cases, but it is considerable slower when the specified file name
    does not exist.
    
    Despite all efforts to make the fast implementation as robust as possible,
    it may not work well for some very rare situations. I am aware only one
    situation: use Cygwin mount to bind unrelated paths inside repository
    together.  Therefore, the core.ignoreCygwinFSTricks configuration option is
    provided, which controls whether native or Cygwin version of stat is used.
    
    Signed-off-by: default avatarDmitry Potapov <dpotapov@gmail.com>
    Signed-off-by: default avatarShawn O. Pearce <spearce@spearce.org>
    adbc0b6b