]> granicus.if.org Git - git/commitdiff
Merge branch 'nd/conditional-config-include'
authorJunio C Hamano <gitster@pobox.com>
Mon, 24 Apr 2017 05:07:46 +0000 (22:07 -0700)
committerJunio C Hamano <gitster@pobox.com>
Mon, 24 Apr 2017 05:07:46 +0000 (22:07 -0700)
$GIT_DIR may in some cases be normalized with all symlinks resolved
while "gitdir" path expansion in the pattern does not receive the
same treatment, leading to incorrect mismatch.  This has been fixed.

* nd/conditional-config-include:
  config: resolve symlinks in conditional include's patterns
  path.c: and an option to call real_path() in expand_user_path()

1  2 
builtin/commit.c
builtin/config.c
cache.h
config.c
credential-cache.c
path.c

Simple merge
Simple merge
diff --cc cache.h
index e5cc06987a5bf20b72168591e9897699883b41cf,bf6eb39cbf164e537983c05cb7689726b00e7a92..75cce814bd656b3305666ef08fd1dc709babb537
+++ b/cache.h
@@@ -1120,51 -1097,8 +1120,51 @@@ enum scld_error 
  enum scld_error safe_create_leading_directories(char *path);
  enum scld_error safe_create_leading_directories_const(const char *path);
  
 +/*
 + * Callback function for raceproof_create_file(). This function is
 + * expected to do something that makes dirname(path) permanent despite
 + * the fact that other processes might be cleaning up empty
 + * directories at the same time. Usually it will create a file named
 + * path, but alternatively it could create another file in that
 + * directory, or even chdir() into that directory. The function should
 + * return 0 if the action was completed successfully. On error, it
 + * should return a nonzero result and set errno.
 + * raceproof_create_file() treats two errno values specially:
 + *
 + * - ENOENT -- dirname(path) does not exist. In this case,
 + *             raceproof_create_file() tries creating dirname(path)
 + *             (and any parent directories, if necessary) and calls
 + *             the function again.
 + *
 + * - EISDIR -- the file already exists and is a directory. In this
 + *             case, raceproof_create_file() removes the directory if
 + *             it is empty (and recursively any empty directories that
 + *             it contains) and calls the function again.
 + *
 + * Any other errno causes raceproof_create_file() to fail with the
 + * callback's return value and errno.
 + *
 + * Obviously, this function should be OK with being called again if it
 + * fails with ENOENT or EISDIR. In other scenarios it will not be
 + * called again.
 + */
 +typedef int create_file_fn(const char *path, void *cb);
 +
 +/*
 + * Create a file in dirname(path) by calling fn, creating leading
 + * directories if necessary. Retry a few times in case we are racing
 + * with another process that is trying to clean up the directory that
 + * contains path. See the documentation for create_file_fn for more
 + * details.
 + *
 + * Return the value and set the errno that resulted from the most
 + * recent call of fn. fn is always called at least once, and will be
 + * called more than once if it returns ENOENT or EISDIR.
 + */
 +int raceproof_create_file(const char *path, create_file_fn fn, void *cb);
 +
  int mkdir_in_gitdir(const char *path);
- extern char *expand_user_path(const char *path);
+ extern char *expand_user_path(const char *path, int real_home);
  const char *enter_repo(const char *path, int strict);
  static inline int is_absolute_path(const char *path)
  {
diff --cc config.c
Simple merge
index 3cbd4200190dd9d8378f5a111883de026b06e47d,774d1469fb533c0e68fec648d7348f3bc7443f24..91550bfb0b3325ad92a3f3c65d5f779b61fa9951
@@@ -83,19 -83,6 +83,19 @@@ static void do_cache(const char *socket
        strbuf_release(&buf);
  }
  
-       old_dir = expand_user_path("~/.git-credential-cache");
 +static char *get_socket_path(void)
 +{
 +      struct stat sb;
 +      char *old_dir, *socket;
++      old_dir = expand_user_path("~/.git-credential-cache", 0);
 +      if (old_dir && !stat(old_dir, &sb) && S_ISDIR(sb.st_mode))
 +              socket = xstrfmt("%s/socket", old_dir);
 +      else
 +              socket = xdg_cache_home("credential/socket");
 +      free(old_dir);
 +      return socket;
 +}
 +
  int cmd_main(int argc, const char **argv)
  {
        char *socket_path = NULL;
diff --cc path.c
Simple merge