Merge branch 'ld/discovery-limit-to-fs' (early part)

* 'ld/discovery-limit-to-fs' (early part):
  Rename ONE_FILESYSTEM to DISCOVERY_ACROSS_FILESYSTEM
  GIT_ONE_FILESYSTEM: flip the default to stop at filesystem boundaries
  Add support for GIT_ONE_FILESYSTEM
  truncate cwd string before printing error message
  config.c: remove static keyword from git_env_bool()
This commit is contained in:
Junio C Hamano 2010-05-21 04:02:15 -07:00
Родитель 7f3ed824a4 cf87463e79
Коммит 78f17935a3
4 изменённых файлов: 40 добавлений и 2 удалений

Просмотреть файл

@ -545,6 +545,16 @@ git so take care if using Cogito etc.
a GIT_DIR set on the command line or in the environment.
(Useful for excluding slow-loading network directories.)
'GIT_DISCOVERY_ACROSS_FILESYSTEM'::
When run in a directory that does not have ".git" repository
directory, git tries to find such a directory in the parent
directories to find the top of the working tree, but by default it
does not cross filesystem boundaries. This environment variable
can be set to true to tell git not to stop at filesystem
boundaries. Like 'GIT_CEILING_DIRECTORIES', this will not affect
an explicit repository directory set via 'GIT_DIR' or on the
command line.
git Commits
~~~~~~~~~~~
'GIT_AUTHOR_NAME'::

Просмотреть файл

@ -954,6 +954,7 @@ extern int git_config_set_multivar(const char *, const char *, const char *, int
extern int git_config_rename_section(const char *, const char *);
extern const char *git_etc_gitconfig(void);
extern int check_repository_format_version(const char *var, const char *value, void *cb);
extern int git_env_bool(const char *, int);
extern int git_config_system(void);
extern int git_config_global(void);
extern int config_error_nonbool(const char *);

Просмотреть файл

@ -739,7 +739,7 @@ const char *git_etc_gitconfig(void)
return system_wide;
}
static int git_env_bool(const char *k, int def)
int git_env_bool(const char *k, int def)
{
const char *v = getenv(k);
return v ? git_config_bool(k, v) : def;

29
setup.c
Просмотреть файл

@ -323,6 +323,8 @@ const char *setup_git_directory_gently(int *nongit_ok)
const char *gitdirenv;
const char *gitfile_dir;
int len, offset, ceil_offset, root_len;
int current_device = 0, one_filesystem = 1;
struct stat buf;
/*
* Let's assume that we are in a git repository.
@ -390,6 +392,12 @@ const char *setup_git_directory_gently(int *nongit_ok)
* etc.
*/
offset = len = strlen(cwd);
one_filesystem = !git_env_bool("GIT_DISCOVERY_ACROSS_FILESYSTEM", 0);
if (one_filesystem) {
if (stat(".", &buf))
die_errno("failed to stat '.'");
current_device = buf.st_dev;
}
for (;;) {
gitfile_dir = read_gitfile_gently(DEFAULT_GIT_DIR_ENVIRONMENT);
if (gitfile_dir) {
@ -422,8 +430,27 @@ const char *setup_git_directory_gently(int *nongit_ok)
}
die("Not a git repository (or any of the parent directories): %s", DEFAULT_GIT_DIR_ENVIRONMENT);
}
if (chdir(".."))
if (one_filesystem) {
if (stat("..", &buf)) {
cwd[offset] = '\0';
die_errno("failed to stat '%s/..'", cwd);
}
if (buf.st_dev != current_device) {
if (nongit_ok) {
if (chdir(cwd))
die_errno("Cannot come back to cwd");
*nongit_ok = 1;
return NULL;
}
cwd[offset] = '\0';
die("Not a git repository (or any parent up to mount parent %s)\n"
"Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set).", cwd);
}
}
if (chdir("..")) {
cwd[offset] = '\0';
die_errno("Cannot change to '%s/..'", cwd);
}
}
inside_git_dir = 0;