blob: e5b61a39ba0aec79972caa5a2cbf06aa6f6c69cb [file] [log] [blame]
package org.eclipse.team.internal.ccvs.ui.wizards;
/*
* (c) Copyright IBM Corp. 2000, 2002.
* All Rights Reserved.
*/
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.MultiStatus;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.team.core.RepositoryProvider;
import org.eclipse.team.core.TeamException;
import org.eclipse.team.internal.ccvs.core.CVSException;
import org.eclipse.team.internal.ccvs.core.CVSProviderPlugin;
import org.eclipse.team.internal.ccvs.core.CVSTag;
import org.eclipse.team.internal.ccvs.core.CVSTeamProvider;
import org.eclipse.team.internal.ccvs.core.ICVSFile;
import org.eclipse.team.internal.ccvs.core.ICVSFolder;
import org.eclipse.team.internal.ccvs.core.ICVSRepositoryLocation;
import org.eclipse.team.internal.ccvs.core.ICVSResource;
import org.eclipse.team.internal.ccvs.core.resources.CVSWorkspaceRoot;
import org.eclipse.team.internal.ccvs.core.syncinfo.FolderSyncInfo;
import org.eclipse.team.internal.ccvs.core.syncinfo.ResourceSyncInfo;
import org.eclipse.team.internal.ccvs.ui.CVSUIPlugin;
import org.eclipse.team.internal.ccvs.ui.ICVSUIConstants;
import org.eclipse.team.internal.ccvs.ui.Policy;
import org.eclipse.team.internal.ccvs.ui.RepositoryManager;
import org.eclipse.team.internal.ccvs.ui.actions.CVSAction;
public class BranchWizard extends Wizard {
BranchWizardPage mainPage;
IResource[] resources;
public BranchWizard() {
setNeedsProgressMonitor(true);
setWindowTitle(Policy.bind("BranchWizard.title")); //$NON-NLS-1$
}
public void addPages() {
boolean allResourcesSticky = areAllResourcesSticky(resources);
String versionName = ""; //$NON-NLS-1$
try {
if(allResourcesSticky) {
IResource stickyResource = resources[0];
if(stickyResource.getType()==IResource.FILE) {
ICVSFile cvsFile = CVSWorkspaceRoot.getCVSFileFor((IFile)stickyResource);
versionName = cvsFile.getSyncInfo().getTag().getName();
} else {
ICVSFolder cvsFolder = CVSWorkspaceRoot.getCVSFolderFor((IContainer)stickyResource);
versionName = cvsFolder.getFolderSyncInfo().getTag().getName();
}
}
} catch(CVSException e) {
CVSUIPlugin.log(e.getStatus());
versionName = ""; //$NON-NLS-1$
}
mainPage = new BranchWizardPage("versionPage", Policy.bind("BranchWizard.createABranch"), allResourcesSticky, versionName, CVSUIPlugin.getPlugin().getImageDescriptor(ICVSUIConstants.IMG_WIZBAN_BRANCH)); //$NON-NLS-1$ //$NON-NLS-2$
addPage(mainPage);
}
public boolean performFinish() {
final boolean[] result = new boolean[] {false};
try {
getContainer().run(false, false, new IRunnableWithProgress() {
public void run(IProgressMonitor monitor) throws InvocationTargetException {
try {
String tagString = mainPage.getBranchTag();
boolean update = mainPage.getUpdate();
String versionString = mainPage.getVersionTag();
CVSTag rootVersionTag = null;
final CVSTag branchTag = new CVSTag(tagString, CVSTag.BRANCH);
if (versionString != null) {
rootVersionTag = new CVSTag(versionString, CVSTag.VERSION);
}
// For non-projects determine if the tag being loaded is the same as the resource's parent
// If it's not, warn the user that they will have strange sync behavior
if (update) {
if(!CVSAction.checkForMixingTags(getShell(), resources, branchTag)) {
return;
}
}
RepositoryManager manager = CVSUIPlugin.getPlugin().getRepositoryManager();
Hashtable table = getProviderMapping(resources);
Set keySet = table.keySet();
monitor.beginTask("", keySet.size() * 1000); //$NON-NLS-1$
MultiStatus status = new MultiStatus(CVSUIPlugin.ID, IStatus.INFO, Policy.bind("BranchWizard.errorTagging"), null); //$NON-NLS-1$
Iterator iterator = keySet.iterator();
while (iterator.hasNext()) {
IProgressMonitor subMonitor = new SubProgressMonitor(monitor, 1000);
CVSTeamProvider provider = (CVSTeamProvider)iterator.next();
List list = (List)table.get(provider);
IResource[] providerResources = (IResource[])list.toArray(new IResource[list.size()]);
ICVSRepositoryLocation root = provider.getCVSWorkspaceRoot().getRemoteLocation();
try {
if (!areAllResourcesSticky(resources)) {
// version everything in workspace with the root version tag specified in dialog
provider.makeBranch(providerResources, rootVersionTag, branchTag, update, true, subMonitor);
} else {
// all resources are versions, use that version as the root of the branch
provider.makeBranch(providerResources, null, branchTag, update, true, subMonitor);
}
if (rootVersionTag != null || update) {
for (int i = 0; i < providerResources.length; i++) {
ICVSResource cvsResource = CVSWorkspaceRoot.getCVSResourceFor(providerResources[i]);
if (rootVersionTag != null) {
manager.addVersionTags(cvsResource, new CVSTag[] { rootVersionTag });
}
if (update) {
manager.addBranchTags(cvsResource, new CVSTag[] { branchTag });
}
}
}
} catch (TeamException e) {
status.merge(e.getStatus());
}
}
if (!status.isOK()) {
ErrorDialog.openError(getShell(), null, null, status);
}
result[0] = true;
} catch (CVSException e) {
throw new InvocationTargetException(e);
} finally {
monitor.done();
}
}
});
} catch (InterruptedException e) {
return true;
} catch (InvocationTargetException e) {
Throwable target = e.getTargetException();
if (target instanceof CVSException) {
ErrorDialog.openError(getShell(), null, null, ((CVSException)target).getStatus());
return false;
}
if (target instanceof RuntimeException) {
throw (RuntimeException)target;
}
if (target instanceof Error) {
throw (Error)target;
}
}
return result[0];
}
public void setResources(IResource[] resources) {
this.resources = resources;
}
private Hashtable getProviderMapping(IResource[] resources) {
Hashtable result = new Hashtable();
for (int i = 0; i < resources.length; i++) {
RepositoryProvider provider = RepositoryProvider.getProvider(resources[i].getProject(), CVSProviderPlugin.getTypeId());
List list = (List)result.get(provider);
if (list == null) {
list = new ArrayList();
result.put(provider, list);
}
list.add(resources[i]);
}
return result;
}
private boolean areAllResourcesSticky(IResource[] resources) {
for (int i = 0; i < resources.length; i++) {
if(!hasStickyTag(resources[i])) return false;
}
return true;
}
private boolean hasStickyTag(IResource resource) {
try {
ICVSResource cvsResource = CVSWorkspaceRoot.getCVSResourceFor(resource);
CVSTag tag;
if(cvsResource.isFolder()) {
FolderSyncInfo folderInfo = ((ICVSFolder)cvsResource).getFolderSyncInfo();
tag = folderInfo.getTag();
} else {
ResourceSyncInfo info = cvsResource.getSyncInfo();
tag = info.getTag();
}
if(tag!=null) {
int tagType = tag.getType();
if(tagType==tag.VERSION) {
return true;
}
}
} catch(CVSException e) {
CVSUIPlugin.log(e.getStatus());
return false;
}
return false;
}
}