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);
+	}
 }