From d0fe68db85f16a859c7b03efdcdcfcd26f8d48fe Mon Sep 17 00:00:00 2001 From: Pluto Date: Sun, 12 Jul 2026 14:31:12 +0530 Subject: [PATCH 1/5] feat: add command to open all the changed files in git --- src/command/Commands.js | 3 ++ src/extensions/default/Git/src/Constants.js | 1 + src/extensions/default/Git/src/Main.js | 4 ++ src/extensions/default/Git/src/Panel.js | 46 +++++++++++++++++++++ src/nls/root/strings.js | 2 + 5 files changed, 56 insertions(+) diff --git a/src/command/Commands.js b/src/command/Commands.js index caa7c4bd14..edf3bd1fd4 100644 --- a/src/command/Commands.js +++ b/src/command/Commands.js @@ -534,6 +534,9 @@ define(function (require, exports, module) { /** Closes unmodified files */ exports.CMD_GIT_CLOSE_UNMODIFIED = "git-close-unmodified-files"; + /** Opens all modified/untracked files */ + exports.CMD_GIT_OPEN_CHANGED_FILES = "git-open-changed-files"; + /** Checks out a branch or commit */ exports.CMD_GIT_CHECKOUT = "git-checkout"; diff --git a/src/extensions/default/Git/src/Constants.js b/src/extensions/default/Git/src/Constants.js index 2f851d7a52..5f7699d7e0 100644 --- a/src/extensions/default/Git/src/Constants.js +++ b/src/extensions/default/Git/src/Constants.js @@ -36,6 +36,7 @@ define(function (require, exports) { 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_OPEN_CHANGED_FILES = Commands.CMD_GIT_OPEN_CHANGED_FILES; 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; diff --git a/src/extensions/default/Git/src/Main.js b/src/extensions/default/Git/src/Main.js index 16249c4ca4..15e8aedb14 100644 --- a/src/extensions/default/Git/src/Main.js +++ b/src/extensions/default/Git/src/Main.js @@ -241,6 +241,7 @@ define(function (require, exports) { Constants.CMD_GIT_RESET_SOFT, // "More options" context menu commands + Constants.CMD_GIT_OPEN_CHANGED_FILES, Constants.CMD_GIT_DISCARD_ALL_CHANGES, Constants.CMD_GIT_UNDO_LAST_COMMIT, Constants.CMD_GIT_TOGGLE_UNTRACKED, @@ -322,6 +323,8 @@ define(function (require, exports) { // create context menu for git more options const optionsCmenu = Menus.registerContextMenu(Constants.GIT_PANEL_OPTIONS_CMENU); Menus.ContextMenu.assignContextMenuToSelector(".git-more-options-btn", optionsCmenu); + optionsCmenu.addMenuItem(Constants.CMD_GIT_OPEN_CHANGED_FILES); + optionsCmenu.addMenuDivider(); optionsCmenu.addMenuItem(Constants.CMD_GIT_DISCARD_ALL_CHANGES); optionsCmenu.addMenuItem(Constants.CMD_GIT_UNDO_LAST_COMMIT); optionsCmenu.addMenuDivider(); @@ -398,6 +401,7 @@ define(function (require, exports) { Utils.enableCommand(Constants.CMD_GIT_GOTO_NEXT_CHANGE, enabled); Utils.enableCommand(Constants.CMD_GIT_GOTO_PREVIOUS_CHANGE, enabled); Utils.enableCommand(Constants.CMD_GIT_CLOSE_UNMODIFIED, enabled); + Utils.enableCommand(Constants.CMD_GIT_OPEN_CHANGED_FILES, enabled); Utils.enableCommand(Constants.CMD_GIT_AUTHORS_OF_SELECTION, enabled); Utils.enableCommand(Constants.CMD_GIT_AUTHORS_OF_FILE, enabled); diff --git a/src/extensions/default/Git/src/Panel.js b/src/extensions/default/Git/src/Panel.js index 33a5c3b547..29e336a62e 100644 --- a/src/extensions/default/Git/src/Panel.js +++ b/src/extensions/default/Git/src/Panel.js @@ -15,6 +15,7 @@ define(function (require, exports) { Menus = brackets.getModule("command/Menus"), Mustache = brackets.getModule("thirdparty/mustache/mustache"), FindInFiles = brackets.getModule("search/FindInFiles"), + MainViewManager = brackets.getModule("view/MainViewManager"), WorkspaceManager = brackets.getModule("view/WorkspaceManager"), ProjectManager = brackets.getModule("project/ProjectManager"), StringUtils = brackets.getModule("utils/StringUtils"), @@ -1007,6 +1008,49 @@ define(function (require, exports) { }); } + function openAllChangedFiles() { + return Git.status().then(function (files) { + files = _.filter(files, function (file) { + if (!shouldShow(file)) { + return false; + } + // deleted files no longer exist on disk, so there is nothing to open + if (file.status.indexOf(Git.FILE_STATUS.DELETED) !== -1) { + return false; + } + // respect the "show untracked files" panel toggle + if (!showingUntracked && file.status.indexOf(Git.FILE_STATUS.UNTRACKED) !== -1) { + return false; + } + return true; + }); + + if (files.length === 0) { + return; + } + + const currentGitRoot = Preferences.get("currentGitRoot"); + // addListToWorkingSet ignores files already present in any pane, so this is safe + // to run repeatedly or with some of the files already open + const fileList = files.map(function (file) { + return FileSystem.getFileForPath(currentGitRoot + file.file); + }); + MainViewManager.addListToWorkingSet(MainViewManager.ACTIVE_PANE, fileList); + + // if the user is already viewing one of the changed files, we don't switch the file then... + // if user is viewing a un-changed file, then we switch to the first changed file + const currentPath = MainViewManager.getCurrentlyViewedPath(MainViewManager.ACTIVE_PANE); + const viewingChangedFile = _.any(fileList, function (file) { + return file.fullPath === currentPath; + }); + if (!viewingChangedFile) { + CommandManager.execute(Commands.FILE_OPEN, { fullPath: fileList[0].fullPath }); + } + }).catch(function (err) { + ErrorHandler.showError(err, Strings.ERROR_OPENING_CHANGED_FILES); + }); + } + var lastCheckOneClicked = null; function attachDefaultTableHandlers() { @@ -1345,6 +1389,8 @@ define(function (require, exports) { CommandManager.register(Strings.VIEW_AUTHORS_SELECTION, Constants.CMD_GIT_AUTHORS_OF_SELECTION, handleAuthorsSelection); CommandManager.register(Strings.VIEW_AUTHORS_FILE, Constants.CMD_GIT_AUTHORS_OF_FILE, handleAuthorsFile); CommandManager.register(Strings.HIDE_UNTRACKED, Constants.CMD_GIT_TOGGLE_UNTRACKED, handleToggleUntracked); + CommandManager.register(Strings.CMD_OPEN_CHANGED_FILES, + Constants.CMD_GIT_OPEN_CHANGED_FILES, openAllChangedFiles); CommandManager.register(Strings.GIT_INIT, Constants.CMD_GIT_INIT, EventEmitter.getEmitter(Events.HANDLE_GIT_INIT)); CommandManager.register(Strings.GIT_CLONE, Constants.CMD_GIT_CLONE, EventEmitter.getEmitter(Events.HANDLE_GIT_CLONE)); CommandManager.register(Strings.GIT_SHOW_HISTORY, Constants.CMD_GIT_HISTORY_GLOBAL, ()=>{ diff --git a/src/nls/root/strings.js b/src/nls/root/strings.js index 04d3c983a2..e12f6b9ab8 100644 --- a/src/nls/root/strings.js +++ b/src/nls/root/strings.js @@ -2236,6 +2236,7 @@ define({ "TAG_NAME_PLACEHOLDER": "Enter tag name here\u2026", "TAG_NAME": "Tag", "CMD_CLOSE_UNMODIFIED": "Close Unmodified Files", + "CMD_OPEN_CHANGED_FILES": "Open All Changed Files", "FILE_ADDED": "New file", "FILE_COPIED": "Copied", "FILE_DELETED": "Deleted", @@ -2266,6 +2267,7 @@ define({ "ERROR_PARSING_BRANCH_NAME": "Failed parsing branch name from {0}", "ERROR_READING_GIT_STATE": "Reading .git state failed", "ERROR_GETTING_DELETED_FILES": "Getting list of deleted files failed", + "ERROR_OPENING_CHANGED_FILES": "Opening changed files failed", "ERROR_SWITCHING_BRANCHES": "Switching branches failed", "ERROR_GETTING_CURRENT_BRANCH": "Getting current branch name failed", "ERROR_REBASE_FAILED": "Rebase failed", From b7b268b80ac8f5c4d517152926499a25004163b0 Mon Sep 17 00:00:00 2001 From: Pluto Date: Sun, 12 Jul 2026 14:47:57 +0530 Subject: [PATCH 2/5] feat: add branch name in the git panel toolbar --- src/extensions/default/Git/src/Branch.js | 4 ++++ src/extensions/default/Git/src/Panel.js | 14 ++++++++++++++ src/extensions/default/Git/styles/git-styles.less | 15 +++++++++++++++ .../default/Git/templates/git-panel.html | 3 +++ 4 files changed, 36 insertions(+) diff --git a/src/extensions/default/Git/src/Branch.js b/src/extensions/default/Git/src/Branch.js index 51f3236c98..daecaffd01 100644 --- a/src/extensions/default/Git/src/Branch.js +++ b/src/extensions/default/Git/src/Branch.js @@ -426,6 +426,7 @@ define(function (require, exports) { .text("\u2026") .parent() .show(); + Panel.setBranchName("\u2026", ""); return Git.getGitRoot().then(function (gitRoot) { var projectRoot = Utils.getProjectRoot(), @@ -440,6 +441,7 @@ define(function (require, exports) { $gitBranchName .off("click") .text("not a git repo"); + Panel.setBranchName("not a git repo", ""); Panel.disable("not-repo"); return; @@ -482,6 +484,7 @@ define(function (require, exports) { .attr("title", tooltip) .off("click") .on("click", toggleDropdown); + Panel.setBranchName(branchName, tooltip); Panel.enable(); }).catch(function (err) { @@ -493,6 +496,7 @@ define(function (require, exports) { $gitBranchName .off("click") .text("no branch"); + Panel.setBranchName("no branch", ""); Panel.enable(); } else { throw ex; diff --git a/src/extensions/default/Git/src/Panel.js b/src/extensions/default/Git/src/Panel.js index 29e336a62e..398cfac0f8 100644 --- a/src/extensions/default/Git/src/Panel.js +++ b/src/extensions/default/Git/src/Panel.js @@ -852,6 +852,19 @@ define(function (require, exports) { } } + const BRANCH_MAX_LEN = 18; + + // called by Branch.refresh() so the panel indicator always mirrors the sidebar one, + // including merge/rebase decorations like "main|MERGING" + function setBranchName(branchName, tooltip) { + const displayName = branchName.length > BRANCH_MAX_LEN + ? branchName.substring(0, BRANCH_MAX_LEN) + "\u2026" + : branchName; + const $branch = $gitPanel.find(".git-panel-branch"); + $branch.attr("title", tooltip || ""); + $branch.find(".git-branch-name").text(displayName); + } + function refreshCommitCounts() { // Find Push and Pull buttons var $pullBtn = $gitPanel.find(".git-pull"); @@ -1601,6 +1614,7 @@ define(function (require, exports) { exports.toggle = toggle; exports.enable = enable; exports.disable = disable; + exports.setBranchName = setBranchName; exports.getSelectedHistoryCommit = getSelectedHistoryCommit; exports.getPanel = function () { return $gitPanel; }; diff --git a/src/extensions/default/Git/styles/git-styles.less b/src/extensions/default/Git/styles/git-styles.less index 0cf885384b..5bd5346d51 100644 --- a/src/extensions/default/Git/styles/git-styles.less +++ b/src/extensions/default/Git/styles/git-styles.less @@ -1088,6 +1088,21 @@ right: 32px; top: 5px; } + .git-panel-branch { + display: inline-block; + vertical-align: middle; + margin-right: 10px; + font-size: 12px; + white-space: nowrap; + cursor: default; + opacity: .7; + .dark & { + opacity: .6; + } + i { + margin-right: 4px; + } + } .octicon:not(:only-child) { margin-right: 5px; vertical-align: -1px; diff --git a/src/extensions/default/Git/templates/git-panel.html b/src/extensions/default/Git/templates/git-panel.html index b0133c2c87..13f3e84251 100644 --- a/src/extensions/default/Git/templates/git-panel.html +++ b/src/extensions/default/Git/templates/git-panel.html @@ -57,6 +57,9 @@
+
+ +
-
+
From f93e24bd7a1fa2e6318b12747532b78d7e9dbe8c Mon Sep 17 00:00:00 2001 From: Pluto Date: Sun, 12 Jul 2026 15:27:52 +0530 Subject: [PATCH 4/5] fix: git branch button size inconsistent --- src/extensions/default/Git/styles/git-styles.less | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/extensions/default/Git/styles/git-styles.less b/src/extensions/default/Git/styles/git-styles.less index 9d7ee9917b..035dce6841 100644 --- a/src/extensions/default/Git/styles/git-styles.less +++ b/src/extensions/default/Git/styles/git-styles.less @@ -1091,8 +1091,13 @@ .git-panel-branch { display: inline-block; vertical-align: middle; + box-sizing: border-box; + height: 22px; + margin-top: 2px; margin-right: 8px; + padding: 2px 10px; font-size: 12px; + line-height: 16px; white-space: nowrap; cursor: default; i { From 783ed2dd1faafda21591e5c1d0ef0d483b5b45a6 Mon Sep 17 00:00:00 2001 From: Pluto Date: Sun, 12 Jul 2026 15:45:16 +0530 Subject: [PATCH 5/5] feat: make git branch toggle button in git panel responsive --- src/extensions/default/Git/src/Panel.js | 1 + src/extensions/default/Git/templates/git-panel.html | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/extensions/default/Git/src/Panel.js b/src/extensions/default/Git/src/Panel.js index 398cfac0f8..0cd592b758 100644 --- a/src/extensions/default/Git/src/Panel.js +++ b/src/extensions/default/Git/src/Panel.js @@ -1271,6 +1271,7 @@ define(function (require, exports) { const mainToolbarWidth = $mainToolbar.width(); let overFlowWidth = 540; const breakpoints = [ + { width: 600, className: "hide-when-medium" }, { width: overFlowWidth, className: "hide-when-small" }, { width: 400, className: "hide-when-x-small" } ]; diff --git a/src/extensions/default/Git/templates/git-panel.html b/src/extensions/default/Git/templates/git-panel.html index fec5ef0b93..132d7cce07 100644 --- a/src/extensions/default/Git/templates/git-panel.html +++ b/src/extensions/default/Git/templates/git-panel.html @@ -57,9 +57,9 @@
-
+
+