summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdward Thomson <ethomson@github.com>2016-09-14 10:28:24 +0100
committerEdward Thomson <ethomson@github.com>2016-09-14 10:28:24 +0100
commit955c99c21495841f2426733f680bdf3af9c8b593 (patch)
tree45decf87c68bf0b1c24b0059d5471ad0775eb51c
parent40b08124f26e6a1328fa35fc1c0f69911d31a2d8 (diff)
downloadlibgit2-ethomson/checkout_dont_calculate_oid_for_dirs.tar.gz
checkout: don't try to calculate oid for directoriesethomson/checkout_dont_calculate_oid_for_dirs
When trying to determine if we can safely overwrite an existing workdir item, we may need to calculate the oid for the workdir item to determine if its identical to the old side (and eligible for removal). We previously did this regardless of the type of entry in the workdir; if it was a directory, we would open(2) it and then try to read(2). The read(2) of a directory fails on many platforms, so we would treat it as if it were unmodified and continue to perform the checkout. On FreeBSD, you _can_ read(2) a directory, so this pattern failed. We would calculate an oid from the data read and determine that the directory was modified and would therefore generate a checkout conflict. This reliance on read(2) is silly (and was most likely accidentally giving us the behavior we wanted), we should be explicit about the directory test.
-rw-r--r--src/checkout.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/src/checkout.c b/src/checkout.c
index f11102c8b..b3427fb7c 100644
--- a/src/checkout.c
+++ b/src/checkout.c
@@ -212,6 +212,10 @@ static bool checkout_is_workdir_modified(
if (baseitem->size && wditem->file_size != baseitem->size)
return true;
+ /* if the workdir item is a directory, it cannot be a modified file */
+ if (S_ISDIR(wditem->mode))
+ return false;
+
if (git_diff__oid_for_entry(&oid, data->diff, wditem, wditem->mode, NULL) < 0)
return false;