diff options
author | Junio C Hamano <gitster@pobox.com> | 2017-10-03 15:42:48 +0900 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2017-10-03 15:42:49 +0900 |
commit | d4e93836a6a072e392b20d7daf604fd41e15ecf9 (patch) | |
tree | 69f37e3a5a7239b416a0c75b9d52114cb9e048d3 | |
parent | d9ec072a2903f31a0e1afde4125f62b9fc57f620 (diff) | |
parent | 27344d6a6c8056664966e11acf674e5da6dd7ee3 (diff) | |
download | git-d4e93836a6a072e392b20d7daf604fd41e15ecf9.tar.gz |
Merge branch 'jk/no-optional-locks'
Some commands (most notably "git status") makes an opportunistic
update when performing a read-only operation to help optimize later
operations in the same repository. The new "--no-optional-locks"
option can be passed to Git to disable them.
* jk/no-optional-locks:
git: add --no-optional-locks option
-rw-r--r-- | Documentation/git.txt | 12 | ||||
-rw-r--r-- | builtin/commit.c | 5 | ||||
-rw-r--r-- | cache.h | 6 | ||||
-rw-r--r-- | environment.c | 5 | ||||
-rw-r--r-- | git.c | 4 | ||||
-rwxr-xr-x | t/t7508-status.sh | 10 |
6 files changed, 41 insertions, 1 deletions
diff --git a/Documentation/git.txt b/Documentation/git.txt index 6e3a6767e5..f7e603bc82 100644 --- a/Documentation/git.txt +++ b/Documentation/git.txt @@ -159,6 +159,10 @@ foo.bar= ...`) sets `foo.bar` to the empty string which ` git config Add "icase" magic to all pathspec. This is equivalent to setting the `GIT_ICASE_PATHSPECS` environment variable to `1`. +--no-optional-locks:: + Do not perform optional operations that require locks. This is + equivalent to setting the `GIT_OPTIONAL_LOCKS` to `0`. + GIT COMMANDS ------------ @@ -697,6 +701,14 @@ of clones and fetches. which feed potentially-untrusted URLS to git commands. See linkgit:git-config[1] for more details. +`GIT_OPTIONAL_LOCKS`:: + If set to `0`, Git will complete any requested operation without + performing any optional sub-operations that require taking a lock. + For example, this will prevent `git status` from refreshing the + index as a side effect. This is useful for processes running in + the background which do not want to cause lock contention with + other operations on the repository. Defaults to `1`. + Discussion[[Discussion]] ------------------------ diff --git a/builtin/commit.c b/builtin/commit.c index 0f8ddb6866..d75b3805ea 100644 --- a/builtin/commit.c +++ b/builtin/commit.c @@ -1392,7 +1392,10 @@ int cmd_status(int argc, const char **argv, const char *prefix) read_cache_preload(&s.pathspec); refresh_index(&the_index, REFRESH_QUIET|REFRESH_UNMERGED, &s.pathspec, NULL, NULL); - fd = hold_locked_index(&index_lock, 0); + if (use_optional_locks()) + fd = hold_locked_index(&index_lock, 0); + else + fd = -1; s.is_initial = get_oid(s.reference, &oid) ? 1 : 0; if (!s.is_initial) @@ -444,6 +444,7 @@ static inline enum object_type object_type(unsigned int mode) #define GIT_NOGLOB_PATHSPECS_ENVIRONMENT "GIT_NOGLOB_PATHSPECS" #define GIT_ICASE_PATHSPECS_ENVIRONMENT "GIT_ICASE_PATHSPECS" #define GIT_QUARANTINE_ENVIRONMENT "GIT_QUARANTINE_PATH" +#define GIT_OPTIONAL_LOCKS_ENVIRONMENT "GIT_OPTIONAL_LOCKS" /* * This environment variable is expected to contain a boolean indicating @@ -784,6 +785,11 @@ extern int protect_ntfs; extern int ref_paranoia; /* + * Returns the boolean value of $GIT_OPTIONAL_LOCKS (or the default value). + */ +int use_optional_locks(void); + +/* * The character that begins a commented line in user-editable file * that is subject to stripspace. */ diff --git a/environment.c b/environment.c index f1f934b6fd..8289c25b44 100644 --- a/environment.c +++ b/environment.c @@ -338,3 +338,8 @@ void reset_shared_repository(void) { need_shared_repository_from_config = 1; } + +int use_optional_locks(void) +{ + return git_env_bool(GIT_OPTIONAL_LOCKS_ENVIRONMENT, 1); +} @@ -182,6 +182,10 @@ static int handle_options(const char ***argv, int *argc, int *envchanged) setenv(GIT_ICASE_PATHSPECS_ENVIRONMENT, "1", 1); if (envchanged) *envchanged = 1; + } else if (!strcmp(cmd, "--no-optional-locks")) { + setenv(GIT_OPTIONAL_LOCKS_ENVIRONMENT, "0", 1); + if (envchanged) + *envchanged = 1; } else if (!strcmp(cmd, "--shallow-file")) { (*argv)++; (*argc)--; diff --git a/t/t7508-status.sh b/t/t7508-status.sh index 43d19a9b22..93f162a4f7 100755 --- a/t/t7508-status.sh +++ b/t/t7508-status.sh @@ -1670,4 +1670,14 @@ test_expect_success '"Initial commit" should not be noted in commit template' ' test_i18ngrep ! "Initial commit" output ' +test_expect_success '--no-optional-locks prevents index update' ' + test-chmtime =1234567890 .git/index && + git --no-optional-locks status && + test-chmtime -v +0 .git/index >out && + grep ^1234567890 out && + git status && + test-chmtime -v +0 .git/index >out && + ! grep ^1234567890 out +' + test_done |