Skip to content

Commit

Permalink
diff/status: refactor opportunistic index update
Browse files Browse the repository at this point in the history
When we had to refresh the index internally before running diff or status,
we opportunistically updated the $GIT_INDEX_FILE so that later invocation
of git can use the lstat(2) we already did in this invocation.

Make them share a helper function to do so.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Junio C Hamano committed Mar 21, 2011
1 parent 87b5054 commit ccdc4ec
Show file tree
Hide file tree
Showing 4 changed files with 16 additions and 13 deletions.
9 changes: 2 additions & 7 deletions builtin/commit.c
Original file line number Diff line number Diff line change
Expand Up @@ -1090,13 +1090,8 @@ int cmd_status(int argc, const char **argv, const char *prefix)
refresh_index(&the_index, REFRESH_QUIET|REFRESH_UNMERGED, s.pathspec, NULL, NULL);

fd = hold_locked_index(&index_lock, 0);
if (0 <= fd) {
if (active_cache_changed &&
!write_cache(fd, active_cache, active_nr))
commit_locked_index(&index_lock);
else
rollback_lock_file(&index_lock);
}
if (0 <= fd)
update_index_if_able(&the_index, &index_lock);

s.is_initial = get_sha1(s.reference, sha1) ? 1 : 0;
s.in_merge = in_merge;
Expand Down
7 changes: 1 addition & 6 deletions builtin/diff.c
Original file line number Diff line number Diff line change
Expand Up @@ -197,12 +197,7 @@ static void refresh_index_quietly(void)
discard_cache();
read_cache();
refresh_cache(REFRESH_QUIET|REFRESH_UNMERGED);

if (active_cache_changed &&
!write_cache(fd, active_cache, active_nr))
commit_locked_index(lock_file);

rollback_lock_file(lock_file);
update_index_if_able(&the_index, lock_file);
}

static int builtin_diff_files(struct rev_info *revs, int argc, const char **argv)
Expand Down
1 change: 1 addition & 0 deletions cache.h
Original file line number Diff line number Diff line change
Expand Up @@ -520,6 +520,7 @@ extern NORETURN void unable_to_lock_index_die(const char *path, int err);
extern int hold_lock_file_for_update(struct lock_file *, const char *path, int);
extern int hold_lock_file_for_append(struct lock_file *, const char *path, int);
extern int commit_lock_file(struct lock_file *);
extern void update_index_if_able(struct index_state *, struct lock_file *);

extern int hold_locked_index(struct lock_file *, int);
extern int commit_locked_index(struct lock_file *);
Expand Down
12 changes: 12 additions & 0 deletions read-cache.c
Original file line number Diff line number Diff line change
Expand Up @@ -1545,6 +1545,18 @@ static int ce_write_entry(git_SHA_CTX *c, int fd, struct cache_entry *ce)
return result;
}

/*
* Opportunisticly update the index but do not complain if we can't
*/
void update_index_if_able(struct index_state *istate, struct lock_file *lockfile)
{
if (istate->cache_changed &&
!write_index(istate, lockfile->fd))
commit_locked_index(lockfile);
else
rollback_lock_file(lockfile);
}

int write_index(struct index_state *istate, int newfd)
{
git_SHA_CTX c;
Expand Down

0 comments on commit ccdc4ec

Please sign in to comment.