IDEA-252890 event `pluginUnloaded` should be fired after `forbidGettingServicesToken...
[idea/community.git] / platform / dvcs-impl / src / com / intellij / dvcs / branch / DvcsBranchUtil.java
1 // Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
2 package com.intellij.dvcs.branch;
3
4 import com.intellij.dvcs.repo.Repository;
5 import com.intellij.dvcs.ui.DvcsBundle;
6 import com.intellij.openapi.util.text.StringUtil;
7 import com.intellij.openapi.vcs.changes.Change;
8 import com.intellij.openapi.vcs.changes.ContentRevision;
9 import com.intellij.util.containers.ContainerUtil;
10 import org.jetbrains.annotations.Nls;
11 import org.jetbrains.annotations.NotNull;
12 import org.jetbrains.annotations.Nullable;
13
14 import java.util.Collection;
15 import java.util.List;
16
17 public final class DvcsBranchUtil {
18   @Nullable
19   public static <T extends DvcsBranchInfo> T find(@Nullable final Collection<T> branches,
20                                                   @Nullable Repository repository,
21                                                   @NotNull String sourceBranch) {
22     if (branches == null) return null;
23     return ContainerUtil.find(branches, targetInfo -> repoAndSourceAreEqual(repository, sourceBranch, targetInfo));
24   }
25
26   private static boolean repoAndSourceAreEqual(@Nullable Repository repository,
27                                                @NotNull String sourceBranch,
28                                                @NotNull DvcsBranchInfo targetInfo) {
29     return getPathFor(repository).equals(targetInfo.repoPath) && StringUtil.equals(targetInfo.sourceName, sourceBranch);
30   }
31
32   @NotNull
33   public static String getPathFor(@Nullable Repository repository) {
34     return repository == null ? "" : repository.getRoot().getPath();
35   }
36
37   @NotNull
38   public static List<Change> swapRevisions(@NotNull List<? extends Change> changes) {
39     return ContainerUtil.map(changes, change -> {
40       ContentRevision beforeRevision = change.getBeforeRevision();
41       ContentRevision afterRevision = change.getAfterRevision();
42       if (beforeRevision == null || afterRevision == null) return new Change(afterRevision, beforeRevision);
43       return new Change(afterRevision, beforeRevision, change.getFileStatus());
44     });
45   }
46
47   public static @Nls @NotNull String shortenBranchName(@Nls @NotNull String fullBranchName) {
48     // -1, because there are arrows indicating that it is a popup
49     int maxLength = DvcsBundle.message("branch.popup.maximum.branch.length.sample").length() - 1;
50     return StringUtil.shortenTextWithEllipsis(fullBranchName, maxLength, 5);
51   }
52 }