Skip to content

Commit 7db94e5

Browse files
derrickstoleedscho
authored andcommitted
Merge pull request git-for-windows#494: reset: fix mixed reset when using virtual filesystem
This replaces git-for-windows#493 (can't reopen a PR after a force-push...). I updated this commit with a more firm version of the fix. This hopefully answers Victoria's excellent concerns with the previous approach. I did not manage to get an automated test for this, but I did carefully verify this manually with a few commits in a VFS for Git enlistment (with different files every time). I updated the commit message with more details about why this works. --- This fork contains changes specific to monorepo scenarios. If you are an external contributor, then please detail your reason for submitting to this fork: * [X] This change only applies to the virtualization hook and VFS for Git. Resolves git-for-windows#490.
2 parents 362625b + 44b0cdb commit 7db94e5

File tree

1 file changed

+49
-2
lines changed

1 file changed

+49
-2
lines changed

builtin/reset.c

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@
3838
#include "add-interactive.h"
3939
#include "strbuf.h"
4040
#include "quote.h"
41+
#include "dir.h"
42+
#include "entry.h"
4143

4244
#define REFRESH_INDEX_DELAY_WARNING_IN_MS (2 * 1000)
4345

@@ -158,9 +160,48 @@ static void update_index_from_diff(struct diff_queue_struct *q,
158160

159161
for (i = 0; i < q->nr; i++) {
160162
int pos;
163+
int respect_skip_worktree = 1;
161164
struct diff_filespec *one = q->queue[i]->one;
165+
struct diff_filespec *two = q->queue[i]->two;
162166
int is_in_reset_tree = one->mode && !is_null_oid(&one->oid);
167+
int is_missing = !(one->mode && !is_null_oid(&one->oid));
168+
int was_missing = !two->mode && is_null_oid(&two->oid);
163169
struct cache_entry *ce;
170+
struct cache_entry *ceBefore;
171+
struct checkout state = CHECKOUT_INIT;
172+
173+
/*
174+
* When using the virtual filesystem feature, the cache entries that are
175+
* added here will not have the skip-worktree bit set.
176+
*
177+
* Without this code there is data that is lost because the files that
178+
* would normally be in the working directory are not there and show as
179+
* deleted for the next status or in the case of added files just disappear.
180+
* We need to create the previous version of the files in the working
181+
* directory so that they will have the right content and the next
182+
* status call will show modified or untracked files correctly.
183+
*/
184+
if (core_virtualfilesystem && !file_exists(two->path))
185+
{
186+
respect_skip_worktree = 0;
187+
pos = index_name_pos(the_repository->index, two->path, strlen(two->path));
188+
189+
if ((pos >= 0 && ce_skip_worktree(the_repository->index->cache[pos])) &&
190+
(is_missing || !was_missing))
191+
{
192+
state.force = 1;
193+
state.refresh_cache = 1;
194+
state.istate = the_repository->index;
195+
ceBefore = make_cache_entry(the_repository->index, two->mode,
196+
&two->oid, two->path,
197+
0, 0);
198+
if (!ceBefore)
199+
die(_("make_cache_entry failed for path '%s'"),
200+
two->path);
201+
202+
checkout_entry(ceBefore, &state, NULL, NULL);
203+
}
204+
}
164205

165206
if (!is_in_reset_tree && !intent_to_add) {
166207
remove_file_from_index(the_repository->index, one->path);
@@ -179,8 +220,14 @@ static void update_index_from_diff(struct diff_queue_struct *q,
179220
* to properly construct the reset sparse directory.
180221
*/
181222
pos = index_name_pos(the_repository->index, one->path, strlen(one->path));
182-
if ((pos >= 0 && ce_skip_worktree(the_repository->index->cache[pos])) ||
183-
(pos < 0 && !path_in_sparse_checkout(one->path, the_repository->index)))
223+
224+
/*
225+
* Do not add the SKIP_WORKTREE bit back if we populated the
226+
* file on purpose in a virtual filesystem scenario.
227+
*/
228+
if (respect_skip_worktree &&
229+
((pos >= 0 && ce_skip_worktree(the_repository->index->cache[pos])) ||
230+
(pos < 0 && !path_in_sparse_checkout(one->path, the_repository->index))))
184231
ce->ce_flags |= CE_SKIP_WORKTREE;
185232

186233
if (!ce)

0 commit comments

Comments
 (0)