Bug 143560 CVS merging new files causes commits to fail
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/mappings/MergeSubscriberContext.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/mappings/MergeSubscriberContext.java
index db9412f..1d8691f 100644
--- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/mappings/MergeSubscriberContext.java
+++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/mappings/MergeSubscriberContext.java
@@ -25,8 +25,7 @@
import org.eclipse.team.core.variants.IResourceVariant;
import org.eclipse.team.internal.ccvs.core.*;
import org.eclipse.team.internal.ccvs.core.resources.CVSWorkspaceRoot;
-import org.eclipse.team.internal.ccvs.core.syncinfo.MutableResourceSyncInfo;
-import org.eclipse.team.internal.ccvs.core.syncinfo.ResourceSyncInfo;
+import org.eclipse.team.internal.ccvs.core.syncinfo.*;
import org.eclipse.team.internal.ccvs.ui.CVSUIMessages;
import org.eclipse.team.internal.ui.Utils;
@@ -97,6 +96,7 @@
byte[] syncBytes = variant.asBytes();
MutableResourceSyncInfo info = new MutableResourceSyncInfo(resource.getName(), ResourceSyncInfo.ADDED_REVISION);
info.setKeywordMode(ResourceSyncInfo.getKeywordMode(syncBytes));
+ info.setTag(getTag(resource.getParent()));
CVSWorkspaceRoot.getCVSFileFor((IFile)resource).setSyncInfo(info, ICVSFile.DIRTY);
}
}
@@ -107,6 +107,14 @@
return status[0];
}
+ CVSTag getTag(IContainer parent) throws CVSException {
+ ICVSFolder folder = CVSWorkspaceRoot.getCVSFolderFor(parent);
+ FolderSyncInfo info = folder.getFolderSyncInfo();
+ if (info != null)
+ return info.getTag();
+ return null;
+ }
+
boolean equals(IThreeWayDiff currentDiff, IThreeWayDiff otherDiff) {
return currentDiff.getKind() == otherDiff.getKind()
&& currentDiff.getDirection() == otherDiff.getDirection();
diff --git a/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/subscriber/CVSMergeSubscriberTest.java b/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/subscriber/CVSMergeSubscriberTest.java
index 80cd2c3..e05ab5c 100644
--- a/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/subscriber/CVSMergeSubscriberTest.java
+++ b/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/subscriber/CVSMergeSubscriberTest.java
@@ -24,6 +24,8 @@
import org.eclipse.team.internal.ccvs.core.*;
import org.eclipse.team.internal.ccvs.core.client.Command;
import org.eclipse.team.internal.ccvs.core.client.Command.KSubstOption;
+import org.eclipse.team.internal.ccvs.core.resources.CVSWorkspaceRoot;
+import org.eclipse.team.internal.ccvs.core.syncinfo.ResourceSyncInfo;
import org.eclipse.team.tests.ccvs.core.CVSTestSetup;
@@ -584,6 +586,13 @@
// Ensure HEAD matches branch
assertContentsEqual(project, branchedProject);
+ // Ensure that the tag on the file is HEAD
+ ICVSFile cvsFile = CVSWorkspaceRoot.getCVSFileFor(project.getFile("folder2/added.txt"));
+ ResourceSyncInfo syncInfo = cvsFile.getSyncInfo();
+ CVSTag tag = syncInfo.getTag();
+ if (tag != null && !tag.equals(CVSTag.DEFAULT))
+ fail("Invalid tag for added file");
+
// Modify the file on the branch
setContentsAndEnsureModified(branchedProject.getFile("folder2/added.txt"), "Unmergable contents");
commitProject(branchedProject);
@@ -668,4 +677,50 @@
CVSProviderPlugin.getPlugin().setDefaultTextKSubstOption(option);
}
}
+
+ public void testMergeNewFileToBranch() throws InvocationTargetException, InterruptedException, CoreException, IOException {
+ // Create a project
+ IProject project = createProject(new String[] {"file1.txt"});
+
+ // Checkout and branch a copy
+ CVSTag root = new CVSTag("root_branch1", CVSTag.VERSION);
+ CVSTag branch = new CVSTag("branch1", CVSTag.BRANCH);
+ IProject branchedProject = branchProject(project, root, branch);
+
+ // Add a file to HEAD
+ addResources(project, new String[] {"added.txt"}, true);
+
+ // Merge the file with branch but do not commit
+ CVSMergeSubscriber subscriber = getSyncInfoSource().createMergeSubscriber(branchedProject, root, CVSTag.DEFAULT);
+ assertSyncEquals("testFileAddedToBranch", subscriber, branchedProject,
+ new String[]{"added.txt"}, true,
+ new int[]{
+ SyncInfo.INCOMING | SyncInfo.ADDITION
+ });
+ mergeResources(subscriber, branchedProject, new String[]{"added.txt"}, true /* allow overwrite */);
+
+ // Ensure HEAD matches branch
+ assertContentsEqual(project, branchedProject);
+
+ // Ensure that the tag on the file is the branch tag
+ ICVSFile cvsFile = CVSWorkspaceRoot.getCVSFileFor(branchedProject.getFile("added.txt"));
+ ResourceSyncInfo syncInfo = cvsFile.getSyncInfo();
+ assertEquals("Invalid tag for added file", syncInfo.getTag(), branch);
+
+ // Add a file in a subfolder to HEAD
+ addResources(project, new String[] {"folder1/added.txt"}, true);
+ assertSyncEquals("testFileAddedToBranch", subscriber, branchedProject,
+ new String[]{"folder1/added.txt"}, true,
+ new int[]{
+ SyncInfo.INCOMING | SyncInfo.ADDITION
+ });
+ mergeResources(subscriber, branchedProject, new String[]{"folder1/added.txt"}, true /* allow overwrite */);
+ // Ensure HEAD matches branch
+ assertContentsEqual(project, branchedProject);
+
+ // Ensure that the tag on the file is the branch tag
+ cvsFile = CVSWorkspaceRoot.getCVSFileFor(branchedProject.getFile("folder1/added.txt"));
+ syncInfo = cvsFile.getSyncInfo();
+ assertEquals("Invalid tag for added file", syncInfo.getTag(), branch);
+ }
}