Skip to content

Commit f2e8fe6

Browse files
dschoGit for Windows Build Agent
authored andcommitted
status: offer *not* to lock the index and update it
When a third-party tool periodically runs `git status` in order to keep track of the state of the working tree, it is a bad idea to lock the index: it might interfere with interactive commands executed by the user, e.g. when the user wants to commit files. Let's introduce the option `--no-lock-index` to prevent such problems. The idea is that the third-party tool calls `git status` with this option, preventing it from ever updating the index. The downside is that the periodic `git status` calls will be a little bit more wasteful because they may have to refresh the index repeatedly, only to throw away the updates when it exits. This cannot really be helped, though, as tools wanting to get a periodic update of the status have no way to predict when the user may want to lock the index herself. Note that the regression test added in this commit does not *really* verify that no index.lock file was written; that test is not possible in a portable way. Instead, we verify that .git/index is rewritten *only* when `git status` is run without `--no-lock-index`. Signed-off-by: Johannes Schindelin <[email protected]>
1 parent 4caf06e commit f2e8fe6

File tree

3 files changed

+20
-1
lines changed

3 files changed

+20
-1
lines changed

Documentation/git-status.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,11 @@ configuration variable documented in linkgit:git-config[1].
111111
without options are equivalent to 'always' and 'never'
112112
respectively.
113113

114+
--no-lock-index::
115+
--lock-index::
116+
Specifies whether `git status` should try to lock the index and
117+
update it afterwards if any changes were detected. Defaults to
118+
`--lock-index`.
114119

115120
OUTPUT
116121
------

builtin/commit.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1335,6 +1335,7 @@ static int git_status_config(const char *k, const char *v, void *cb)
13351335

13361336
int cmd_status(int argc, const char **argv, const char *prefix)
13371337
{
1338+
static int no_lock_index = 0;
13381339
static struct wt_status s;
13391340
int fd;
13401341
struct object_id oid;
@@ -1364,6 +1365,8 @@ int cmd_status(int argc, const char **argv, const char *prefix)
13641365
N_("ignore changes to submodules, optional when: all, dirty, untracked. (Default: all)"),
13651366
PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
13661367
OPT_COLUMN(0, "column", &s.colopts, N_("list untracked files in columns")),
1368+
OPT_BOOL(0, "no-lock-index", &no_lock_index,
1369+
N_("do not lock the index")),
13671370
OPT_END(),
13681371
};
13691372

@@ -1387,7 +1390,7 @@ int cmd_status(int argc, const char **argv, const char *prefix)
13871390
read_cache_preload(&s.pathspec);
13881391
refresh_index(&the_index, REFRESH_QUIET|REFRESH_UNMERGED, &s.pathspec, NULL, NULL);
13891392

1390-
fd = hold_locked_index(&index_lock, 0);
1393+
fd = no_lock_index ? -1 : hold_locked_index(&index_lock, 0);
13911394

13921395
s.is_initial = get_oid(s.reference, &oid) ? 1 : 0;
13931396
if (!s.is_initial)

t/t7508-status.sh

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1670,4 +1670,15 @@ test_expect_success '"Initial commit" should not be noted in commit template' '
16701670
test_i18ngrep ! "Initial commit" output
16711671
'
16721672

1673+
test_expect_success '--no-lock-index' '
1674+
test_commit some-file &&
1675+
test-chmtime =1234567890 .git/index &&
1676+
git status --no-lock-index &&
1677+
test-chmtime -v +0 .git/index >out &&
1678+
grep ^1234567890 out &&
1679+
git status &&
1680+
test-chmtime -v +0 .git/index >out &&
1681+
! grep ^1234567890 out
1682+
'
1683+
16731684
test_done

0 commit comments

Comments
 (0)