Fix detection of "initial checkout"

A checkout done directly after cloning (the "initial
checkout") has a different semantic as a default
checkout. That is defined in the documentation of
"git read-tree" [1]. JGit was detecting that it is
doing an initial checkout differently from native
git: jgit used to check that the index is empty
but native git required that the index file does
not exist [2]. Teach JGit to behave like native
git.

[1] https://github.com/git/git/blob/master/Documentation/git-read-tree.txt#L187
[2] https://marc.info/?t=154150811200001&r=1&w=2

Change-Id: I1dd0f1ede7cd7ea60d28607916d0165269a9f628
This commit is contained in:
Christian Halstrick 2018-11-06 17:56:15 +01:00 committed by Matthias Sohn
parent 1168ab0f37
commit 530812d936
1 changed files with 3 additions and 3 deletions

View File

@ -157,7 +157,7 @@ public CheckoutMetadata(EolStreamType eolStreamType,
private ArrayList<String> toBeDeleted = new ArrayList<>();
private boolean emptyDirCache;
private boolean initialCheckout;
private boolean performingCheckout;
@ -230,7 +230,7 @@ public DirCacheCheckout(Repository repo, ObjectId headCommitTree, DirCache dc,
this.headCommitTree = headCommitTree;
this.mergeCommitTree = mergeCommitTree;
this.workingTree = workingTree;
this.emptyDirCache = (dc == null) || (dc.getEntryCount() == 0);
this.initialCheckout = !repo.isBare() && !repo.getIndexFile().exists();
}
/**
@ -961,7 +961,7 @@ else if (m == null)
// called before). Ignore the cached deletion and use what we
// find in Merge. Potentially updates the file.
if (equalIdAndMode(hId, hMode, mId, mMode)) {
if (emptyDirCache)
if (initialCheckout)
update(name, mId, mMode);
else
keep(dce);