If there are no information about recently visited roots, get the project root if exists.
public ConversionPolicy LINE_SEPARATORS_CONVERSION = ConversionPolicy.CONVERT;
public boolean PUSH_AUTO_UPDATE = false;
public GitBranchSyncSetting SYNC_SETTING = GitBranchSyncSetting.NOT_DECIDED;
+ public String RECENT_GIT_ROOT_PATH = null;
}
public GitVcsSettings(GitVcsApplicationSettings appSettings) {
myState.SYNC_SETTING = syncSetting;
}
+ @Nullable
+ public String getRecentRootPath() {
+ return myState.RECENT_GIT_ROOT_PATH;
+ }
+
+ public void setRecentRoot(@NotNull String recentGitRootPath) {
+ myState.RECENT_GIT_ROOT_PATH = recentGitRootPath;
+ }
}
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.vcs.AbstractVcs;
import com.intellij.openapi.vcs.ProjectLevelVcsManager;
+import com.intellij.openapi.vfs.VfsUtilCore;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.wm.StatusBar;
import com.intellij.openapi.wm.WindowManager;
import com.intellij.openapi.wm.impl.status.StatusBarUtil;
+import com.intellij.vcsUtil.VcsUtil;
import git4idea.GitBranch;
import git4idea.GitVcs;
+import git4idea.config.GitVcsSettings;
import git4idea.repo.GitRepository;
import git4idea.repo.GitRepositoryManager;
import git4idea.validators.GitNewBranchNameValidator;
return gitRoots[0];
}
- // TODO: remember last git root we have worked with
- return null;
+ // remember the last visited Git root
+ GitVcsSettings settings = GitVcsSettings.getInstance(project);
+ if (settings != null) {
+ String recentRootPath = settings.getRecentRootPath();
+ if (recentRootPath != null) {
+ VirtualFile recentRoot = VcsUtil.getVirtualFile(recentRootPath);
+ if (recentRoot != null) {
+ return recentRoot;
+ }
+ }
+ }
+
+ // otherwise return the root of the project dir or the root containing the project dir, if there is such
+ VirtualFile projectBaseDir = project.getBaseDir();
+ if (projectBaseDir == null) {
+ return null;
+ }
+ VirtualFile rootCandidate = null;
+ for (VirtualFile root : gitRoots) {
+ if (root.equals(projectBaseDir)) {
+ return root;
+ }
+ else if (VfsUtilCore.isAncestor(root, projectBaseDir, true)) {
+ rootCandidate = root;
+ }
+ }
+
+ return rootCandidate;
}
}
import com.intellij.openapi.wm.StatusBarWidget;
import com.intellij.openapi.wm.impl.status.EditorBasedWidget;
import com.intellij.util.Consumer;
+import git4idea.config.GitVcsSettings;
import git4idea.repo.GitRepository;
import git4idea.repo.GitRepositoryChangeListener;
import git4idea.repo.GitRepositoryManager;
public class GitBranchWidget extends EditorBasedWidget implements StatusBarWidget.MultipleTextValuesPresentation,
StatusBarWidget.Multiframe,
GitRepositoryChangeListener {
- private final GitRepositoryManager myRepositoryManager;
+ private final GitVcsSettings mySettings;
private volatile String myText = "";
private volatile String myTooltip = "";
public GitBranchWidget(Project project) {
super(project);
- myRepositoryManager = GitRepositoryManager.getInstance(project);
- myRepositoryManager.addListenerToAllRepositories(this);
+ GitRepositoryManager.getInstance(project).addListenerToAllRepositories(this);
+ mySettings = GitVcsSettings.getInstance(project);
}
@Override
if (repo == null) {
return null;
}
- return GitBranchPopup.getInstance(getProject(), repo).asListPopup();
+ return GitBranchPopup.getInstance(project, repo).asListPopup();
}
@Override
myText = GitBranchUiUtil.getDisplayableBranchText(repo);
myTooltip = getDisplayableBranchTooltip(repo);
myStatusBar.updateWidget(ID());
+ mySettings.setRecentRoot(repo.getRoot().getPath());
}
});
}