A folder does not constitute a dirty work tree
This fixes two cases: - A folder without tracked content exist both in the workdir and merged commit, as long as there names within that folder does not conflict. - An empty folder structure exists with the same name as a file in the merged commit. Bug: 402834 Change-Id: I4c5b9f11313dd1665fcbdae2d0755fdb64deb3ef
This commit is contained in:
parent
9105e1c9af
commit
3cd089f04c
|
@ -188,6 +188,83 @@ public void checkMergeMergeableTreesWithoutIndex(MergeStrategy strategy)
|
||||||
indexState(CONTENT));
|
indexState(CONTENT));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An existing directory without tracked content should not prevent merging
|
||||||
|
* a tree where that directory exists.
|
||||||
|
*
|
||||||
|
* @param strategy
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
@Theory
|
||||||
|
public void checkUntrackedFolderIsNotAConflict(
|
||||||
|
MergeStrategy strategy) throws Exception {
|
||||||
|
Git git = Git.wrap(db);
|
||||||
|
|
||||||
|
writeTrashFile("d/1", "1");
|
||||||
|
git.add().addFilepattern("d/1").call();
|
||||||
|
RevCommit first = git.commit().setMessage("added d/1").call();
|
||||||
|
|
||||||
|
writeTrashFile("e/1", "4");
|
||||||
|
git.add().addFilepattern("e/1").call();
|
||||||
|
RevCommit masterCommit = git.commit().setMessage("added e/1").call();
|
||||||
|
|
||||||
|
git.checkout().setCreateBranch(true).setStartPoint(first)
|
||||||
|
.setName("side").call();
|
||||||
|
writeTrashFile("f/1", "5");
|
||||||
|
git.add().addFilepattern("f/1").call();
|
||||||
|
git.commit().setAll(true).setMessage("added f/1")
|
||||||
|
.call();
|
||||||
|
|
||||||
|
// Untracked directory e shall not conflict with merged e/1
|
||||||
|
writeTrashFile("e/2", "d two");
|
||||||
|
|
||||||
|
MergeResult mergeRes = git.merge().setStrategy(strategy)
|
||||||
|
.include(masterCommit).call();
|
||||||
|
assertEquals(MergeStatus.MERGED, mergeRes.getMergeStatus());
|
||||||
|
assertEquals(
|
||||||
|
"[d/1, mode:100644, content:1][e/1, mode:100644, content:4][f/1, mode:100644, content:5]",
|
||||||
|
indexState(CONTENT));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An existing directory without tracked content should not prevent merging
|
||||||
|
* a file with that name.
|
||||||
|
*
|
||||||
|
* @param strategy
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
@Theory
|
||||||
|
public void checkUntrackedEmpytFolderIsNotAConflictWithFile(
|
||||||
|
MergeStrategy strategy)
|
||||||
|
throws Exception {
|
||||||
|
Git git = Git.wrap(db);
|
||||||
|
|
||||||
|
writeTrashFile("d/1", "1");
|
||||||
|
git.add().addFilepattern("d/1").call();
|
||||||
|
RevCommit first = git.commit().setMessage("added d/1").call();
|
||||||
|
|
||||||
|
writeTrashFile("e", "4");
|
||||||
|
git.add().addFilepattern("e").call();
|
||||||
|
RevCommit masterCommit = git.commit().setMessage("added e").call();
|
||||||
|
|
||||||
|
git.checkout().setCreateBranch(true).setStartPoint(first)
|
||||||
|
.setName("side").call();
|
||||||
|
writeTrashFile("f/1", "5");
|
||||||
|
git.add().addFilepattern("f/1").call();
|
||||||
|
git.commit().setAll(true).setMessage("added f/1").call();
|
||||||
|
|
||||||
|
// Untracked empty directory hierarcy e/1 shall not conflict with merged
|
||||||
|
// e/1
|
||||||
|
FileUtils.mkdirs(new File(trash, "e/1"), true);
|
||||||
|
|
||||||
|
MergeResult mergeRes = git.merge().setStrategy(strategy)
|
||||||
|
.include(masterCommit).call();
|
||||||
|
assertEquals(MergeStatus.MERGED, mergeRes.getMergeStatus());
|
||||||
|
assertEquals(
|
||||||
|
"[d/1, mode:100644, content:1][e, mode:100644, content:4][f/1, mode:100644, content:5]",
|
||||||
|
indexState(CONTENT));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Merging two equal subtrees when the index does not contain any file in
|
* Merging two equal subtrees when the index does not contain any file in
|
||||||
* that subtree should lead to a merged state.
|
* that subtree should lead to a merged state.
|
||||||
|
|
|
@ -1129,7 +1129,8 @@ public static void checkoutEntry(final Repository repo, File f,
|
||||||
if (!tmpFile.renameTo(f)) {
|
if (!tmpFile.renameTo(f)) {
|
||||||
// tried to rename which failed. Let' delete the target file and try
|
// tried to rename which failed. Let' delete the target file and try
|
||||||
// again
|
// again
|
||||||
FileUtils.delete(f);
|
FileUtils.delete(f, FileUtils.EMPTY_DIRECTORIES_ONLY
|
||||||
|
| FileUtils.RECURSIVE);
|
||||||
if (!tmpFile.renameTo(f)) {
|
if (!tmpFile.renameTo(f)) {
|
||||||
throw new IOException(MessageFormat.format(
|
throw new IOException(MessageFormat.format(
|
||||||
JGitText.get().couldNotWriteFile, tmpFile.getPath(),
|
JGitText.get().couldNotWriteFile, tmpFile.getPath(),
|
||||||
|
|
|
@ -621,7 +621,10 @@ private boolean isWorktreeDirty(WorkingTreeIterator work) {
|
||||||
boolean isDirty = work.isModeDifferent(modeO);
|
boolean isDirty = work.isModeDifferent(modeO);
|
||||||
if (!isDirty && nonTree(modeF))
|
if (!isDirty && nonTree(modeF))
|
||||||
isDirty = !tw.idEqual(T_FILE, T_OURS);
|
isDirty = !tw.idEqual(T_FILE, T_OURS);
|
||||||
|
// Ignore existing empty directories
|
||||||
|
if (isDirty && modeF == FileMode.TYPE_TREE
|
||||||
|
&& modeO == FileMode.TYPE_MISSING)
|
||||||
|
isDirty = false;
|
||||||
if (isDirty)
|
if (isDirty)
|
||||||
failingPaths.put(tw.getPathString(),
|
failingPaths.put(tw.getPathString(),
|
||||||
MergeFailureReason.DIRTY_WORKTREE);
|
MergeFailureReason.DIRTY_WORKTREE);
|
||||||
|
|
Loading…
Reference in New Issue