diff --git a/src/cpp/session/include/session/SessionModuleContext.hpp b/src/cpp/session/include/session/SessionModuleContext.hpp index 527a1a6e522..47eabc03cf7 100644 --- a/src/cpp/session/include/session/SessionModuleContext.hpp +++ b/src/cpp/session/include/session/SessionModuleContext.hpp @@ -289,6 +289,7 @@ bool isGoogleDocsIntegrationEnabled(); void setGoogleDocsIntegrationEnabled(bool enabled); std::string detectedVcs(const core::FilePath& workingDir); +std::vector applicableVcs(const core::FilePath& workingDir); // persist state accross suspend and resume diff --git a/src/cpp/session/modules/SessionVCS.cpp b/src/cpp/session/modules/SessionVCS.cpp index 35a78432ca3..2cd64c3d24e 100644 --- a/src/cpp/session/modules/SessionVCS.cpp +++ b/src/cpp/session/modules/SessionVCS.cpp @@ -149,5 +149,21 @@ std::string detectedVcs(const FilePath& workingDir) return "none"; } +std::vector applicableVcs(const FilePath& workingDir) +{ + using namespace session::modules; + using namespace session::modules::source_control; + + std::vector applicable; + + if (isGitInstalled()) + applicable.push_back("git"); + + if (svn::isSvnDirectory(workingDir)) + applicable.push_back("svn"); + + return applicable; +} + } // namespace module_context } // namespace session diff --git a/src/cpp/session/projects/SessionProjects.cpp b/src/cpp/session/projects/SessionProjects.cpp index ac3575934ab..caaa64a6034 100644 --- a/src/cpp/session/projects/SessionProjects.cpp +++ b/src/cpp/session/projects/SessionProjects.cpp @@ -94,22 +94,35 @@ json::Object projectVcsOptionsJson() return vcsOptionsJson; } +json::Object projectVcsContextJson() +{ + json::Object contextJson; + contextJson["active_vcs"] = module_context::detectedVcs( + s_projectContext.directory()); + + std::vector applicable = module_context::applicableVcs( + s_projectContext.directory()); + json::Array applicableJson; + BOOST_FOREACH(const std::string& vcs, applicable) + { + applicableJson.push_back(vcs); + } + contextJson["applicable_vcs"] = applicableJson; + + return contextJson; +} + Error readProjectOptions(const json::JsonRpcRequest& request, json::JsonRpcResponse* pResponse) { // get project config json json::Object configJson = projectConfigJson(s_projectContext.config()); - // get vcs options default json - json::Object vcsOptionsDefaultJson; - vcsOptionsDefaultJson["active_vcs"] = module_context::detectedVcs( - s_projectContext.directory()); - // create project options json json::Object optionsJson; optionsJson["config"] = configJson; optionsJson["vcs_options"] = projectVcsOptionsJson(); - optionsJson["vcs_options_default"] = vcsOptionsDefaultJson; + optionsJson["vcs_context"] = projectVcsContextJson(); pResponse->setResult(optionsJson); return Success(); diff --git a/src/gwt/src/org/rstudio/core/client/widget/SelectWidget.java b/src/gwt/src/org/rstudio/core/client/widget/SelectWidget.java index a572ba2bc79..9892d5afd7e 100644 --- a/src/gwt/src/org/rstudio/core/client/widget/SelectWidget.java +++ b/src/gwt/src/org/rstudio/core/client/widget/SelectWidget.java @@ -100,6 +100,21 @@ public ListBox getListBox() { return listBox_; } + + public void setChoices(String[] options) + { + setChoices(options, options); + } + + public void setChoices(String[] options, String[] values) + { + listBox_.clear(); + for (int i = 0; i < options.length; i++) + listBox_.addItem(options[i], values[i]); + + if (listBox_.getItemCount() > 0) + listBox_.setSelectedIndex(0); + } public void setEnabled(boolean enabled) { diff --git a/src/gwt/src/org/rstudio/studio/client/projects/model/RProjectOptions.java b/src/gwt/src/org/rstudio/studio/client/projects/model/RProjectOptions.java index bba428e7cbb..f206c091290 100644 --- a/src/gwt/src/org/rstudio/studio/client/projects/model/RProjectOptions.java +++ b/src/gwt/src/org/rstudio/studio/client/projects/model/RProjectOptions.java @@ -44,7 +44,7 @@ public native final RProjectVcsOptions getVcsOptions() /*-{ return this.vcs_options; }-*/; - public native final RProjectVcsOptionsDefault getVcsOptionsDefault() /*-{ - return this.vcs_options_default; + public native final RProjectVcsContext getVcsContext() /*-{ + return this.vcs_context; }-*/; } diff --git a/src/gwt/src/org/rstudio/studio/client/projects/model/RProjectVcsOptionsDefault.java b/src/gwt/src/org/rstudio/studio/client/projects/model/RProjectVcsContext.java similarity index 69% rename from src/gwt/src/org/rstudio/studio/client/projects/model/RProjectVcsOptionsDefault.java rename to src/gwt/src/org/rstudio/studio/client/projects/model/RProjectVcsContext.java index 83778ef0906..f8b83bb786e 100644 --- a/src/gwt/src/org/rstudio/studio/client/projects/model/RProjectVcsOptionsDefault.java +++ b/src/gwt/src/org/rstudio/studio/client/projects/model/RProjectVcsContext.java @@ -1,5 +1,5 @@ /* - * RProjectVcsOptionsDefault.java + * RProjectVcsContext.java * * Copyright (C) 2009-11 by RStudio, Inc. * @@ -13,14 +13,19 @@ package org.rstudio.studio.client.projects.model; import com.google.gwt.core.client.JavaScriptObject; +import com.google.gwt.core.client.JsArrayString; -public class RProjectVcsOptionsDefault extends JavaScriptObject +public class RProjectVcsContext extends JavaScriptObject { - protected RProjectVcsOptionsDefault() + protected RProjectVcsContext() { } public native final String getActiveVcs() /*-{ return this.active_vcs; }-*/; + + public native final JsArrayString getApplicableVcs() /*-{ + return this.applicable_vcs; + }-*/; } diff --git a/src/gwt/src/org/rstudio/studio/client/projects/ui/prefs/ProjectSourceControlPreferencesPane.java b/src/gwt/src/org/rstudio/studio/client/projects/ui/prefs/ProjectSourceControlPreferencesPane.java index 751c45b9feb..f81ee016e8c 100644 --- a/src/gwt/src/org/rstudio/studio/client/projects/ui/prefs/ProjectSourceControlPreferencesPane.java +++ b/src/gwt/src/org/rstudio/studio/client/projects/ui/prefs/ProjectSourceControlPreferencesPane.java @@ -25,13 +25,13 @@ import org.rstudio.studio.client.projects.events.SwitchToProjectEvent; import org.rstudio.studio.client.projects.model.RProjectOptions; import org.rstudio.studio.client.projects.model.RProjectVcsOptions; -import org.rstudio.studio.client.projects.model.RProjectVcsOptionsDefault; +import org.rstudio.studio.client.projects.model.RProjectVcsContext; import org.rstudio.studio.client.server.ServerError; import org.rstudio.studio.client.server.ServerRequestCallback; import org.rstudio.studio.client.server.VoidServerRequestCallback; import org.rstudio.studio.client.workbench.model.Session; -import org.rstudio.studio.client.workbench.model.SessionInfo; +import com.google.gwt.core.client.JsArrayString; import com.google.gwt.event.dom.client.ChangeEvent; import com.google.gwt.event.dom.client.ChangeHandler; import com.google.gwt.resources.client.ImageResource; @@ -51,19 +51,7 @@ public ProjectSourceControlPreferencesPane(final Session session, eventBus_ = eventBus; server_ = server; - // populate the vcs selections list - String[] vcsSelections = new String[] { NONE }; - SessionInfo sessionInfo = session.getSessionInfo(); - if (sessionInfo.isVcsAvailable()) - { - String[] availableVcs = sessionInfo.getAvailableVCS(); - vcsSelections = new String[availableVcs.length + 1]; - vcsSelections[0] = NONE; - for (int i=0; i 0) + { + vcsSelections = new String[applicableVcs.length() + 1]; + vcsSelections[0] = NONE; + for (int i=0; i 0) setVcsSelection(vcsOptions.getActiveVcsOverride()); else - setVcsSelection(defaultVcsOptions_.getActiveVcs()); + setVcsSelection(vcsContext_.getActiveVcs()); } @Override @@ -124,7 +129,7 @@ public void onApply(RProjectOptions options) private void setVcsOptions(RProjectVcsOptions vcsOptions) { String vcsSelection = getVcsSelection(); - if (!vcsSelection.equals(defaultVcsOptions_.getActiveVcs())) + if (!vcsSelection.equals(vcsContext_.getActiveVcs())) vcsOptions.setActiveVcsOverride(vcsSelection); else vcsOptions.setActiveVcsOverride(""); @@ -227,8 +232,8 @@ private void promptToRestart() globalDisplay_.showYesNoMessage( MessageDialog.QUESTION, "Confirm Restart RStudio", - "You need to restart RStudio in order to start working with " + - "the specified version control system. Do you want to do this now?", + "You need to restart RStudio in order for this change to take " + + "effect. Do you want to do this now?", new Operation() { @Override @@ -258,7 +263,7 @@ public void execute() private SelectWidget vcsSelect_; - private RProjectVcsOptionsDefault defaultVcsOptions_; + private RProjectVcsContext vcsContext_; private static final String NONE = "(None)"; }