blob: 441e3b795e5916d07a5d9e14a168e58858ba6c53 [file] [log] [blame]
/*
* Copyright 2000-2012 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.cvsSupport2.cvsoperations.cvsTagOrBranch;
import com.intellij.CvsBundle;
import com.intellij.cvsSupport2.cvsExecution.CvsOperationExecutor;
import com.intellij.cvsSupport2.cvsExecution.CvsOperationExecutorCallback;
import com.intellij.cvsSupport2.cvsExecution.ModalityContextImpl;
import com.intellij.cvsSupport2.cvshandlers.CommandCvsHandler;
import com.intellij.cvsSupport2.cvsoperations.common.CvsCommandOperation;
import com.intellij.cvsSupport2.cvsoperations.common.CvsOperation;
import com.intellij.cvsSupport2.cvsoperations.cvsLog.LogOperation;
import com.intellij.cvsSupport2.cvsoperations.cvsTagOrBranch.ui.SelectTagDialog;
import com.intellij.cvsSupport2.history.CvsRevisionNumber;
import com.intellij.openapi.application.ModalityState;
import com.intellij.openapi.cvsIntegration.CvsResult;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.ui.TextFieldWithBrowseButton;
import com.intellij.openapi.vcs.FilePath;
import com.intellij.openapi.vcs.ProjectLevelVcsManager;
import com.intellij.openapi.vcs.VcsException;
import com.intellij.openapi.vcs.actions.VcsContextFactory;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.containers.HashSet;
import org.jetbrains.annotations.Nullable;
import org.netbeans.lib.cvsclient.command.log.LogInformation;
import org.netbeans.lib.cvsclient.command.log.Revision;
import org.netbeans.lib.cvsclient.command.log.SymbolicName;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.*;
/**
* author: lesya
*/
public class TagsHelper {
private static final Logger LOG = Logger.getInstance("#com.intellij.cvsSupport2.cvsoperations.cvsTagOrBranch.TagsHelper");
private TagsHelper() {
}
@Nullable
public static String chooseBranch(TagsProvider tagsProvider, Project project) {
try {
final CvsCommandOperation operation = tagsProvider.getOperation();
if (operation == null) return null;
final BranchesProvider branchesProvider = getBranchesProvider(operation, project);
return chooseFrom(branchesProvider.getAllBranches(), branchesProvider.getAllRevisions());
}
catch (VcsException e) {
showErrorMessage(e);
return null;
}
}
@Nullable
public static String chooseBranch(Collection<FilePath> files, Project project) {
try {
return chooseFrom(collectAllBranches(files, project), new ArrayList<CvsRevisionNumber>());
}
catch (VcsException e) {
showErrorMessage(e);
return null;
}
}
public static void addChooseBranchAction(final TextFieldWithBrowseButton field, final Collection<FilePath> files, final Project project) {
field.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
final String branchName = chooseBranch(files, project);
if (branchName != null) field.setText(branchName);
}
});
}
public static Collection<String> getAllBranches(List<LogInformation> log) {
final HashSet<String> branches = new HashSet<String>();
for (final LogInformation logInformation : log) {
collectBranches(logInformation, branches);
}
return branches;
}
private static void collectBranches(LogInformation logInformation, HashSet<String> branches) {
final List<SymbolicName> allSymbolicNames = logInformation.getAllSymbolicNames();
for (final SymbolicName symbolicName : allSymbolicNames) {
branches.add(symbolicName.getName());
}
}
private static void collectRevisions(LogInformation logInformation, ArrayList<CvsRevisionNumber> result) {
for (final Revision revision : logInformation.getRevisionList()) {
result.add(new CvsRevisionNumber(revision.getNumber()));
}
}
private static BranchesProvider getBranchesProvider(CvsOperation operation, Project project) throws VcsException {
LOG.assertTrue(operation instanceof BranchesProvider);
final CvsOperationExecutor executor =
new CvsOperationExecutor(true, project, new ModalityContextImpl(ModalityState.defaultModalityState()));
final CommandCvsHandler handler = new CommandCvsHandler(CvsBundle.message("load.tags.operation.name"), operation, true);
executor.performActionSync(handler, CvsOperationExecutorCallback.EMPTY);
final CvsResult executionResult = executor.getResult();
if (executionResult.hasErrors()) throw executionResult.composeError();
return (BranchesProvider)operation;
}
public static Collection<FilePath> findVcsRoots(FilePath[] files, Project project) {
if (files.length == 0) {
return Collections.emptyList();
}
final Collection<FilePath> roots = new HashSet<FilePath>();
final Set<VirtualFile> seen = new HashSet<VirtualFile>();
for(FilePath filePath : files) {
final VirtualFile root = ProjectLevelVcsManager.getInstance(project).getVcsRootFor(filePath);
if (root == null || !seen.add(root)) {
continue;
}
roots.add(VcsContextFactory.SERVICE.getInstance().createFilePathOn(root));
}
return roots;
}
private static Collection<String> collectAllBranches(Collection<FilePath> files, Project project) throws VcsException {
if (files.isEmpty()) {
return Collections.emptyList();
}
return getBranchesProvider(new LogOperation(files), project).getAllBranches();
}
private static void showErrorMessage(VcsException e1) {
Messages.showErrorDialog(CvsBundle.message("error.message.cannot.load.tags", e1.getLocalizedMessage()),
CvsBundle.message("operation.name.select.tag"));
}
@Nullable
private static String chooseFrom(Collection<String> tags, Collection<CvsRevisionNumber> revisions) {
if (tags == null) return null;
final Collection<String> revisionsNames = collectSortedRevisionsNames(revisions);
if (tags.isEmpty() && revisionsNames.isEmpty()) {
Messages.showMessageDialog(CvsBundle.message("message.no.tags.found"), CvsBundle.message("operation.name.select.tag"),
Messages.getInformationIcon());
return null;
}
final SelectTagDialog selectTagDialog = new SelectTagDialog(collectSortedTags(tags), revisionsNames);
selectTagDialog.show();
if (selectTagDialog.isOK()) {
return selectTagDialog.getTag();
}
return null;
}
private static Collection<String> collectSortedTags(Collection<String> tags) {
final ArrayList<String> result = new ArrayList<String>(tags);
Collections.sort(result);
return result;
}
private static Collection<String> collectSortedRevisionsNames(Collection<CvsRevisionNumber> revisions) {
if (revisions == null) return new ArrayList<String>();
final ArrayList<CvsRevisionNumber> list = new ArrayList<CvsRevisionNumber>(revisions);
Collections.sort(list, new Comparator<CvsRevisionNumber>() {
@Override
public int compare(CvsRevisionNumber o, CvsRevisionNumber o1) {
return o.compareTo(o1);
}
});
final ArrayList<String> result = new ArrayList<String>();
for (final CvsRevisionNumber aList : list) {
result.add(aList.toString());
}
return result;
}
public static Collection<CvsRevisionNumber> getAllRevisions(List<LogInformation> logs) {
final ArrayList<CvsRevisionNumber> result = new ArrayList<CvsRevisionNumber>();
for (final LogInformation log : logs) {
collectRevisions(log, result);
}
return result;
}
}