Bug 535919 - Duplicate stages not allowed: 0 subtree/file
Summary: Duplicate stages not allowed: 0 subtree/file
Status: RESOLVED FIXED
Alias: None
Product: JGit
Classification: Technology
Component: JGit (show other bugs)
Version: 4.9   Edit
Hardware: All All
: P3 critical with 1 vote (vote)
Target Milestone: 6.4   Edit
Assignee: Project Inbox CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2018-06-14 21:03 EDT by Natalie Chen CLA
Modified: 2022-11-30 04:47 EST (History)
5 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Natalie Chen CLA 2018-06-14 21:03:10 EDT
Problem:
Exception in thread "main" java.lang.IllegalStateException: Duplicate stages not allowed: 0 subtree/file
	at org.eclipse.jgit.dircache.DirCacheBuilder.bad(DirCacheBuilder.java:278)
	at org.eclipse.jgit.dircache.DirCacheBuilder.resort(DirCacheBuilder.java:268)
	at org.eclipse.jgit.dircache.DirCacheBuilder.finish(DirCacheBuilder.java:224)
	at org.eclipse.jgit.merge.ResolveMerger.mergeTrees(ResolveMerger.java:1144)
	at org.eclipse.jgit.merge.ResolveMerger.mergeImpl(ResolveMerger.java:345)
	at org.eclipse.jgit.merge.Merger.merge(Merger.java:258)
	at org.eclipse.jgit.merge.Merger.merge(Merger.java:211)
	at org.eclipse.jgit.merge.ThreeWayMerger.merge(ThreeWayMerger.java:126)

Steps to reproduce:
1. cd /path/to/test
2. git init
3. touch init && git add init
4. git commit -m 'init'
5. touch subtree
6. touch subtree-0
7. git add -A && git commit -m 'add file subtree'  => commit1
8. rm subtree
9. mkdir subtree
10. touch subtree/file
11. git add subtree/file
12. git commit -m 'add subtree/file' => commit2
13. Run the following code:

		RepositoryBuilder rb = new RepositoryBuilder() 
		.setGitDir(new File(/path/to/test/.git>))
		.readEnvironment()
		.findGitDir();
		try (Repository repo = rb.build();
		   RevWalk rw = new RevWalk(repo);) {
			RevCommit toMerge = rw.parseCommit(ObjectId.fromString(commit1));
			RevCommit mergeTip = rw.parseCommit(ObjectId.fromString(commit2));
			
			ResolveMerger m = (ResolveMerger) MergeStrategy.RECURSIVE.newMerger(repo, true);
			m.setObjectInserter(createDryRunInserter(repo));
	                boolean mergeable = m.merge(new AnyObjectId[] {mergeTip, toMerge});
                }
Comment 1 Thomas Wolf CLA 2019-05-10 02:50:51 EDT
Seems to me that this merge should simply not do anything since toMerge is an ancestor of mergeTip. MergeCommand checks for this. ResolveMerger is a lower-level API and doesn't.
Comment 2 Adithya Chakilam CLA 2022-06-09 18:59:33 EDT
We see this error occurring in gerrit while creating auto merge commits. In our case the file is modified only in their index and not in base, ours indexes.
Comment 3 Eclipse Genie CLA 2022-06-27 14:21:35 EDT
New Gerrit change created: https://git.eclipse.org/r/c/jgit/jgit/+/194411
Comment 5 Eclipse Genie CLA 2022-11-29 09:07:52 EST
New Gerrit change created: https://git.eclipse.org/r/c/jgit/jgit/+/197360