diff --git a/src/command/Commands.js b/src/command/Commands.js index dbb945c0a..dff87adad 100644 --- a/src/command/Commands.js +++ b/src/command/Commands.js @@ -483,6 +483,88 @@ define(function (require, exports, module) { /** Shows the sidebar */ exports.SHOW_SIDEBAR = "view.showSidebar"; // SidebarView.js show() + // commands + /** Initializes a new git repository */ + exports.CMD_GIT_INIT = "git-init"; + + /** Clones a git repository */ + exports.CMD_GIT_CLONE = "git-clone"; + + /** Clones a git repository with a specific URL */ + exports.CMD_GIT_CLONE_WITH_URL = "git-clone-url"; + + /** Opens git settings */ + exports.CMD_GIT_SETTINGS_COMMAND_ID = "git-settings"; + + /** Closes unmodified files */ + exports.CMD_GIT_CLOSE_UNMODIFIED = "git-close-unmodified-files"; + + /** Checks out a branch or commit */ + exports.CMD_GIT_CHECKOUT = "git-checkout"; + + /** Performs a hard reset */ + exports.CMD_GIT_RESET_HARD = "git-reset-hard"; + + /** Performs a soft reset */ + exports.CMD_GIT_RESET_SOFT = "git-reset-soft"; + + /** Performs a mixed reset */ + exports.CMD_GIT_RESET_MIXED = "git-reset-mixed"; + + /** Toggles the git panel */ + exports.CMD_GIT_TOGGLE_PANEL = "git-toggle-panel"; + + /** Goes to next git change */ + exports.CMD_GIT_GOTO_NEXT_CHANGE = "git-gotoNextChange"; + + /** Goes to previous git change */ + exports.CMD_GIT_GOTO_PREVIOUS_CHANGE = "git-gotoPrevChange"; + + /** Commits current file changes */ + exports.CMD_GIT_COMMIT_CURRENT = "git-commitCurrent"; + + /** Commits all changes */ + exports.CMD_GIT_COMMIT_ALL = "git-commitAll"; + + /** Fetches from remote */ + exports.CMD_GIT_FETCH = "git-fetch"; + + /** Pulls from remote */ + exports.CMD_GIT_PULL = "git-pull"; + + /** Pushes to remote */ + exports.CMD_GIT_PUSH = "git-push"; + + /** Refreshes git status */ + exports.CMD_GIT_REFRESH = "git-refresh"; + + /** Creates a git tag */ + exports.CMD_GIT_TAG = "git-tag"; + + /** Discards all changes */ + exports.CMD_GIT_DISCARD_ALL_CHANGES = "git-discard-all-changes"; + + /** Undoes the last commit */ + exports.CMD_GIT_UNDO_LAST_COMMIT = "git-undo-last-commit"; + + /** Changes git username */ + exports.CMD_GIT_CHANGE_USERNAME = "git-change-username"; + + /** Changes git email */ + exports.CMD_GIT_CHANGE_EMAIL = "git-change-email"; + + /** Pushes to Gerrit code review */ + exports.CMD_GIT_GERRIT_PUSH_REF = "git-gerrit-push_ref"; + + /** Shows authors of selected code */ + exports.CMD_GIT_AUTHORS_OF_SELECTION = "git-authors-of-selection"; + + /** Shows authors of current file */ + exports.CMD_GIT_AUTHORS_OF_FILE = "git-authors-of-file"; + + /** Toggles display of untracked files */ + exports.CMD_GIT_TOGGLE_UNTRACKED = "git-toggle-untracked"; + // DEPRECATED: Working Set Commands DeprecationWarning.deprecateConstant(exports, "SORT_WORKINGSET_BY_ADDED", "CMD_WORKINGSET_SORT_BY_ADDED"); DeprecationWarning.deprecateConstant(exports, "SORT_WORKINGSET_BY_NAME", "CMD_WORKINGSET_SORT_BY_NAME"); diff --git a/src/command/Menus.js b/src/command/Menus.js index 2d6265c0e..b1c137b62 100644 --- a/src/command/Menus.js +++ b/src/command/Menus.js @@ -75,6 +75,14 @@ define(function (require, exports, module) { SPLITVIEW_MENU: "splitview-menu" }; + /** + * Brackets well known submenus + * @enum {string} + */ + let SubMenuIds = { + GIT_SUB_MENU: "git-submenu" + }; + /** * Event triggered before the context menu opens. * @event EVENT_BEFORE_CONTEXT_MENU_OPEN @@ -254,6 +262,15 @@ define(function (require, exports, module) { return menuMap[id]; } + /** + * Retrieves the subMenu object for the corresponding id if present. + * @param {string} id + * @return {Menu} + */ + function getSubMenu(id) { + return getContextMenu(id); + } + /** * retruns a set containing all commands that has a menu item registered * @returns {Set} @@ -1755,6 +1772,7 @@ define(function (require, exports, module) { exports.LAST_IN_SECTION = LAST_IN_SECTION; exports.DIVIDER = DIVIDER; exports.getMenu = getMenu; + exports.getSubMenu = getSubMenu; exports.getAllMenus = getAllMenus; exports.getMenuItem = getMenuItem; exports.getContextMenu = getContextMenu; @@ -1768,6 +1786,7 @@ define(function (require, exports, module) { exports.Menu = Menu; exports.MenuItem = MenuItem; exports.ContextMenu = ContextMenu; + exports.SubMenuIds = SubMenuIds; // public events exports.EVENT_BEFORE_CONTEXT_MENU_OPEN = EVENT_BEFORE_CONTEXT_MENU_OPEN; exports.EVENT_BEFORE_CONTEXT_MENU_CLOSE = EVENT_BEFORE_CONTEXT_MENU_CLOSE; diff --git a/src/extensions/default/Git/src/Constants.js b/src/extensions/default/Git/src/Constants.js index f18e884f4..10774e667 100644 --- a/src/extensions/default/Git/src/Constants.js +++ b/src/extensions/default/Git/src/Constants.js @@ -19,8 +19,11 @@ */ define(function (require, exports) { + const Commands = brackets.getModule("command/Commands"), + Menus = brackets.getModule("command/Menus"); + exports.GIT_STRING_UNIVERSAL = "Git"; - exports.GIT_SUB_MENU = "git-submenu"; + exports.GIT_SUB_MENU = Menus.SubMenuIds.GIT_SUB_MENU; // Menus exports.GIT_PANEL_CHANGES_CMENU = "git-panel-changes-cmenu"; @@ -28,31 +31,31 @@ define(function (require, exports) { exports.GIT_PANEL_OPTIONS_CMENU = "git-panel-options-cmenu"; // commands - exports.CMD_GIT_INIT = "git-init"; - exports.CMD_GIT_CLONE = "git-clone"; - exports.CMD_GIT_CLONE_WITH_URL = "git-clone-url"; - exports.CMD_GIT_SETTINGS_COMMAND_ID = "git-settings"; - exports.CMD_GIT_CLOSE_UNMODIFIED = "git-close-unmodified-files"; - exports.CMD_GIT_CHECKOUT = "git-checkout"; - exports.CMD_GIT_RESET_HARD = "git-reset-hard"; - exports.CMD_GIT_RESET_SOFT = "git-reset-soft"; - exports.CMD_GIT_RESET_MIXED = "git-reset-mixed"; - exports.CMD_GIT_TOGGLE_PANEL = "git-toggle-panel"; - exports.CMD_GIT_GOTO_NEXT_CHANGE = "git-gotoNextChange"; - exports.CMD_GIT_GOTO_PREVIOUS_CHANGE = "git-gotoPrevChange"; - exports.CMD_GIT_COMMIT_CURRENT = "git-commitCurrent"; - exports.CMD_GIT_COMMIT_ALL = "git-commitAll"; - exports.CMD_GIT_FETCH = "git-fetch"; - exports.CMD_GIT_PULL = "git-pull"; - exports.CMD_GIT_PUSH = "git-push"; - exports.CMD_GIT_REFRESH = "git-refresh"; - exports.CMD_GIT_TAG = "git-tag"; - exports.CMD_GIT_DISCARD_ALL_CHANGES = "git-discard-all-changes"; - exports.CMD_GIT_UNDO_LAST_COMMIT = "git-undo-last-commit"; - exports.CMD_GIT_CHANGE_USERNAME = "git-change-username"; - exports.CMD_GIT_CHANGE_EMAIL = "git-change-email"; - exports.CMD_GIT_GERRIT_PUSH_REF = "git-gerrit-push_ref"; - exports.CMD_GIT_AUTHORS_OF_SELECTION = "git-authors-of-selection"; - exports.CMD_GIT_AUTHORS_OF_FILE = "git-authors-of-file"; - exports.CMD_GIT_TOGGLE_UNTRACKED = "git-toggle-untracked"; + exports.CMD_GIT_INIT = Commands.CMD_GIT_INIT; + exports.CMD_GIT_CLONE = Commands.CMD_GIT_CLONE; + exports.CMD_GIT_CLONE_WITH_URL = Commands.CMD_GIT_CLONE_WITH_URL; + exports.CMD_GIT_SETTINGS_COMMAND_ID = Commands.CMD_GIT_SETTINGS_COMMAND_ID; + exports.CMD_GIT_CLOSE_UNMODIFIED = Commands.CMD_GIT_CLOSE_UNMODIFIED; + exports.CMD_GIT_CHECKOUT = Commands.CMD_GIT_CHECKOUT; + exports.CMD_GIT_RESET_HARD = Commands.CMD_GIT_RESET_HARD; + exports.CMD_GIT_RESET_SOFT = Commands.CMD_GIT_RESET_SOFT; + exports.CMD_GIT_RESET_MIXED = Commands.CMD_GIT_RESET_MIXED; + exports.CMD_GIT_TOGGLE_PANEL = Commands.CMD_GIT_TOGGLE_PANEL; + exports.CMD_GIT_GOTO_NEXT_CHANGE = Commands.CMD_GIT_GOTO_NEXT_CHANGE; + exports.CMD_GIT_GOTO_PREVIOUS_CHANGE = Commands.CMD_GIT_GOTO_PREVIOUS_CHANGE; + exports.CMD_GIT_COMMIT_CURRENT = Commands.CMD_GIT_COMMIT_CURRENT; + exports.CMD_GIT_COMMIT_ALL = Commands.CMD_GIT_COMMIT_ALL; + exports.CMD_GIT_FETCH = Commands.CMD_GIT_FETCH; + exports.CMD_GIT_PULL = Commands.CMD_GIT_PULL; + exports.CMD_GIT_PUSH = Commands.CMD_GIT_PUSH; + exports.CMD_GIT_REFRESH = Commands.CMD_GIT_REFRESH; + exports.CMD_GIT_TAG = Commands.CMD_GIT_TAG; + exports.CMD_GIT_DISCARD_ALL_CHANGES = Commands.CMD_GIT_DISCARD_ALL_CHANGES; + exports.CMD_GIT_UNDO_LAST_COMMIT = Commands.CMD_GIT_UNDO_LAST_COMMIT; + exports.CMD_GIT_CHANGE_USERNAME = Commands.CMD_GIT_CHANGE_USERNAME; + exports.CMD_GIT_CHANGE_EMAIL = Commands.CMD_GIT_CHANGE_EMAIL; + exports.CMD_GIT_GERRIT_PUSH_REF = Commands.CMD_GIT_GERRIT_PUSH_REF; + exports.CMD_GIT_AUTHORS_OF_SELECTION = Commands.CMD_GIT_AUTHORS_OF_SELECTION; + exports.CMD_GIT_AUTHORS_OF_FILE = Commands.CMD_GIT_AUTHORS_OF_FILE; + exports.CMD_GIT_TOGGLE_UNTRACKED = Commands.CMD_GIT_TOGGLE_UNTRACKED; }); diff --git a/src/utils/ExtensionLoader.js b/src/utils/ExtensionLoader.js index 95e6250d2..8b32fe69b 100644 --- a/src/utils/ExtensionLoader.js +++ b/src/utils/ExtensionLoader.js @@ -624,6 +624,23 @@ define(function (require, exports, module) { } + /** + * Loads the default extension located at given extensions/default/extensionFolderName . used for tests + * + * @private + * @param {string} extensionFolderName + * @return {!$.Promise} A promise object that is resolved when all extensions complete loading. + */ + function _loadDefaultExtension(extensionFolderName) { + const extensionPath = getDefaultExtensionPath(); + + logger.leaveTrail("loading default extension: " + extensionFolderName); + var extConfig = { + baseUrl: extensionPath + "/" + extensionFolderName + }; + return loadExtension(extensionFolderName, extConfig, 'main'); + } + /** * Loads the extension that lives at baseUrl into its own Require.js context * @@ -906,8 +923,11 @@ define(function (require, exports, module) { EventDispatcher.makeEventDispatcher(exports); // unit tests - exports._setInitExtensionTimeout = _setInitExtensionTimeout; - exports._getInitExtensionTimeout = _getInitExtensionTimeout; + if(Phoenix.isTestWindow) { + exports._loadDefaultExtension = _loadDefaultExtension; + exports._setInitExtensionTimeout = _setInitExtensionTimeout; + exports._getInitExtensionTimeout = _getInitExtensionTimeout; + } // private internal usage exports._DELETED_EXTENSION_FILE_MARKER = _DELETED_EXTENSION_FILE_MARKER; diff --git a/test/UnitTestSuite.js b/test/UnitTestSuite.js index 481967833..cd6663fc5 100644 --- a/test/UnitTestSuite.js +++ b/test/UnitTestSuite.js @@ -131,6 +131,7 @@ define(function (require, exports, module) { require("spec/Extn-CSSCodeHints-integ-test"); require("spec/Extn-HTMLCodeHints-Lint-integ-test"); require("spec/Extn-HtmlTagSyncEdit-integ-test"); + require("spec/Extn-Git-integ-test"); // Node Tests require("spec/NodeConnection-test"); // todo TEST_MODERN diff --git a/test/spec/Extn-Git-integ-test.js b/test/spec/Extn-Git-integ-test.js new file mode 100644 index 000000000..34d7c7c30 --- /dev/null +++ b/test/spec/Extn-Git-integ-test.js @@ -0,0 +1,82 @@ +/* + * GNU AGPL-3.0 License + * + * Copyright (c) 2021 - present core.ai . All rights reserved. + * Original work Copyright (c) 2012 - 2021 Adobe Systems Incorporated. All rights reserved. + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License + * for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see https://opensource.org/licenses/AGPL-3.0. + * + */ + +/*global describe, it, expect, beforeEach, afterEach, awaitsForDone,beforeAll, awaitsFor */ + +define(function (require, exports, module) { + + if(!Phoenix.isNativeApp) { + return; + } + + let $, __PR, testWindow, ExtensionLoader, Menus, Commands, CommandManager, + SpecRunnerUtils = require("spec/SpecRunnerUtils"), + anotherTestFolder = SpecRunnerUtils.getTestPath("/spec/LowLevelFileIO-test-files"); + + let testPathGit; + + function forCommandEnabled(commandID, enabled = true) { + const command = CommandManager.get(commandID); + if(!commandID){ + throw new Error(`no such command ${commandID}`); + } + return awaitsFor(()=>{ + return command && command.getEnabled() === enabled; + }, `Git ${commandID} to be ${enabled? "enabled" : "disabled"}`); + } + + describe("LegacyInteg:Git Workflows test", function () { + + beforeAll(async function () { + testWindow = await SpecRunnerUtils.createTestWindowAndRun({forceReload: true}); + // Load module instances from brackets.test + $ = testWindow.$; + __PR = testWindow.__PR; + Menus = testWindow.brackets.test.Menus; + ExtensionLoader = testWindow.brackets.test.ExtensionLoader; + Commands = testWindow.brackets.test.Commands; + CommandManager = testWindow.brackets.test.CommandManager; + testPathGit = await SpecRunnerUtils.getTempTestDirectory("/spec/EditorCommandHandlers-test-files"); + + await SpecRunnerUtils.loadProjectInTestWindow(testPathGit); + await ExtensionLoader._loadDefaultExtension("Git"); + await awaitsFor(()=>{ + return !!Menus.getSubMenu(Menus.SubMenuIds.GIT_SUB_MENU); + }, "Git menus to be present", 10000); + }, 30000); + + describe("Init repo", function () { + it("should only git settings, init and clone commands be enabled in non-git repos", async function () { + await forCommandEnabled(Commands.CMD_GIT_INIT); + await forCommandEnabled(Commands.CMD_GIT_CLONE); + await forCommandEnabled(Commands.CMD_GIT_SETTINGS_COMMAND_ID); + await forCommandEnabled(Commands.CMD_GIT_TOGGLE_PANEL); + // others are disabled + await forCommandEnabled(Commands.CMD_GIT_REFRESH, false); + await forCommandEnabled(Commands.CMD_GIT_REFRESH, false); + await forCommandEnabled(Commands.CMD_GIT_FETCH, false); + await forCommandEnabled(Commands.CMD_GIT_PULL, false); + await forCommandEnabled(Commands.CMD_GIT_PUSH, false); + }); + }); + + }); +});