diff options
| author | Vicent Martà <vicent@github.com> | 2013-04-17 12:20:09 -0700 |
|---|---|---|
| committer | Vicent Martà <vicent@github.com> | 2013-04-17 12:20:09 -0700 |
| commit | 526882a30a6304bde5aaf1ffe88b2556f5e33e1b (patch) | |
| tree | ad376f81efbc32e9826046ca2f1bc0f0008f31ba /src/checkout.c | |
| parent | f9fe1b6ea3578e6e1fc1f3b81ce396bbe84833c0 (diff) | |
| parent | 0da62c5cf094394e7d9a4f7ef0832f8459ab3d40 (diff) | |
| download | libgit2-526882a30a6304bde5aaf1ffe88b2556f5e33e1b.tar.gz | |
Merge pull request #1477 from ethomson/checkout_modified_use_cache
checkout: use cache when possible to determine if workdir item is dirty
Diffstat (limited to 'src/checkout.c')
| -rw-r--r-- | src/checkout.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/src/checkout.c b/src/checkout.c index 24fa21024..81dc5e3da 100644 --- a/src/checkout.c +++ b/src/checkout.c @@ -119,6 +119,7 @@ static bool checkout_is_workdir_modified( const git_index_entry *wditem) { git_oid oid; + const git_index_entry *ie; /* handle "modified" submodule */ if (wditem->mode == GIT_FILEMODE_COMMIT) { @@ -140,6 +141,17 @@ static bool checkout_is_workdir_modified( return (git_oid_cmp(&baseitem->oid, sm_oid) != 0); } + /* Look at the cache to decide if the workdir is modified. If not, + * we can simply compare the oid in the cache to the baseitem instead + * of hashing the file. + */ + if ((ie = git_index_get_bypath(data->index, wditem->path, 0)) != NULL) { + if (wditem->mtime.seconds == ie->mtime.seconds && + wditem->mtime.nanoseconds == ie->mtime.nanoseconds && + wditem->file_size == ie->file_size) + return (git_oid_cmp(&baseitem->oid, &ie->oid) != 0); + } + /* depending on where base is coming from, we may or may not know * the actual size of the data, so we can't rely on this shortcut. */ |
