summaryrefslogtreecommitdiff
path: root/platform/dvcs-impl/src/com/intellij/dvcs/DvcsUtil.java
diff options
context:
space:
mode:
Diffstat (limited to 'platform/dvcs-impl/src/com/intellij/dvcs/DvcsUtil.java')
-rw-r--r--platform/dvcs-impl/src/com/intellij/dvcs/DvcsUtil.java205
1 files changed, 205 insertions, 0 deletions
diff --git a/platform/dvcs-impl/src/com/intellij/dvcs/DvcsUtil.java b/platform/dvcs-impl/src/com/intellij/dvcs/DvcsUtil.java
new file mode 100644
index 000000000000..1fba1827084c
--- /dev/null
+++ b/platform/dvcs-impl/src/com/intellij/dvcs/DvcsUtil.java
@@ -0,0 +1,205 @@
+/*
+ * Copyright 2000-2013 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.dvcs;
+
+import com.intellij.dvcs.repo.Repository;
+import com.intellij.dvcs.repo.RepositoryManager;
+import com.intellij.openapi.diagnostic.Logger;
+import com.intellij.openapi.editor.Document;
+import com.intellij.openapi.editor.Editor;
+import com.intellij.openapi.fileEditor.FileDocumentManager;
+import com.intellij.openapi.fileEditor.FileEditor;
+import com.intellij.openapi.fileEditor.FileEditorManager;
+import com.intellij.openapi.fileEditor.TextEditor;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.util.Condition;
+import com.intellij.openapi.util.SystemInfo;
+import com.intellij.openapi.util.text.StringUtil;
+import com.intellij.openapi.vcs.AbstractVcs;
+import com.intellij.openapi.vcs.ProjectLevelVcsManager;
+import com.intellij.openapi.vcs.VcsKey;
+import com.intellij.openapi.vfs.VfsUtilCore;
+import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.openapi.wm.StatusBar;
+import com.intellij.openapi.wm.StatusBarWidget;
+import com.intellij.openapi.wm.WindowManager;
+import com.intellij.openapi.wm.impl.status.StatusBarUtil;
+import com.intellij.util.Function;
+import com.intellij.util.containers.ContainerUtil;
+import com.intellij.util.text.DateFormatUtil;
+import com.intellij.vcs.log.TimedVcsCommit;
+import com.intellij.vcs.log.VcsLog;
+import com.intellij.vcs.log.VcsLogProvider;
+import org.intellij.images.editor.ImageFileEditor;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.io.File;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * @author Kirill Likhodedov
+ */
+public class DvcsUtil {
+
+ private static final int SHORT_HASH_LENGTH = 8;
+
+ public static void installStatusBarWidget(@NotNull Project project, @NotNull StatusBarWidget widget) {
+ StatusBar statusBar = WindowManager.getInstance().getStatusBar(project);
+ if (statusBar != null) {
+ statusBar.addWidget(widget, "after " + (SystemInfo.isMac ? "Encoding" : "InsertOverwrite"), project);
+ }
+ }
+
+ public static void removeStatusBarWidget(@NotNull Project project, @NotNull StatusBarWidget widget) {
+ StatusBar statusBar = WindowManager.getInstance().getStatusBar(project);
+ if (statusBar != null) {
+ statusBar.removeWidget(widget.ID());
+ }
+ }
+
+ @NotNull
+ public static String getShortRepositoryName(@NotNull Project project, @NotNull VirtualFile root) {
+ VirtualFile projectDir = project.getBaseDir();
+
+ String repositoryPath = root.getPresentableUrl();
+ if (projectDir != null) {
+ String relativePath = VfsUtilCore.getRelativePath(root, projectDir, File.separatorChar);
+ if (relativePath != null) {
+ repositoryPath = relativePath;
+ }
+ }
+
+ return repositoryPath.isEmpty() ? root.getName() : repositoryPath;
+ }
+
+ @NotNull
+ public static String getShortRepositoryName(@NotNull Repository repository) {
+ return getShortRepositoryName(repository.getProject(), repository.getRoot());
+ }
+
+ @NotNull
+ public static String getShortNames(@NotNull Collection<? extends Repository> repositories) {
+ return StringUtil.join(repositories, new Function<Repository, String>() {
+ @Override
+ public String fun(Repository repository) {
+ return getShortRepositoryName(repository);
+ }
+ }, ", ");
+ }
+
+ @NotNull
+ public static String joinRootsPaths(@NotNull Collection<VirtualFile> roots) {
+ return StringUtil.join(roots, new Function<VirtualFile, String>() {
+ @Override
+ public String fun(VirtualFile virtualFile) {
+ return virtualFile.getPresentableUrl();
+ }
+ }, ", ");
+ }
+
+ public static boolean anyRepositoryIsFresh(Collection<? extends Repository> repositories) {
+ for (Repository repository : repositories) {
+ if (repository.isFresh()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Report a warning that the given root has no associated Repositories.
+ */
+ public static void noVcsRepositoryForRoot(@NotNull Logger log,
+ @NotNull VirtualFile root,
+ @NotNull Project project,
+ @NotNull RepositoryManager repositoryManager,
+ @Nullable AbstractVcs vcs) {
+ if (vcs == null) {
+ return;
+ }
+ ProjectLevelVcsManager vcsManager = ProjectLevelVcsManager.getInstance(project);
+ List<VirtualFile> roots = Arrays.asList(vcsManager.getRootsUnderVcs(vcs));
+ log.warn(String.format("Repository not found for root: %s. All roots: %s, all repositories: %s", root, roots,
+ repositoryManager.getRepositories()));
+ }
+
+ /**
+ * Checks if there are hg roots in the VCS log.
+ */
+ public static boolean logHasRootForVcs(@NotNull VcsLog log, @Nullable final VcsKey vcsKey) {
+ return ContainerUtil.find(log.getLogProviders(), new Condition<VcsLogProvider>() {
+ @Override
+ public boolean value(VcsLogProvider logProvider) {
+ return logProvider.getSupportedVcs().equals(vcsKey);
+ }
+ }) != null;
+ }
+
+ @Nullable
+ public static String joinMessagesOrNull(@NotNull Collection<String> messages) {
+ String joined = StringUtil.join(messages, "\n");
+ return StringUtil.isEmptyOrSpaces(joined) ? null : joined;
+ }
+
+ /**
+ * Returns the currently selected file, based on which VcsBranch or StatusBar components will identify the current repository root.
+ */
+ @Nullable
+ public static VirtualFile getSelectedFile(@NotNull Project project) {
+ StatusBar statusBar = WindowManager.getInstance().getStatusBar(project);
+ final FileEditor fileEditor = StatusBarUtil.getCurrentFileEditor(project, statusBar);
+ VirtualFile result = null;
+ if (fileEditor != null) {
+ if (fileEditor instanceof TextEditor) {
+ Document document = ((TextEditor)fileEditor).getEditor().getDocument();
+ result = FileDocumentManager.getInstance().getFile(document);
+ }
+ else if (fileEditor instanceof ImageFileEditor) {
+ result = ((ImageFileEditor)fileEditor).getImageEditor().getFile();
+ }
+ }
+
+ if (result == null) {
+ final FileEditorManager manager = FileEditorManager.getInstance(project);
+ if (manager != null) {
+ Editor editor = manager.getSelectedTextEditor();
+ if (editor != null) {
+ result = FileDocumentManager.getInstance().getFile(editor.getDocument());
+ }
+ }
+ }
+ return result;
+ }
+
+ @NotNull
+ public static String getShortHash(@NotNull String hash) {
+ if (hash.length() == 0) return "";
+ if (hash.length() == 40) return hash.substring(0, SHORT_HASH_LENGTH);
+ if (hash.length() > 40) // revision string encoded with date too
+ {
+ return hash.substring(hash.indexOf("[") + 1, SHORT_HASH_LENGTH);
+ }
+ return hash;
+ }
+
+ @NotNull
+ public static String getDateString(@NotNull TimedVcsCommit commit) {
+ return DateFormatUtil.formatPrettyDateTime(commit.getTimestamp()) + " ";
+ }
+}