summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/checkout.c12
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.
*/