From 8e30720fe757603074d9678556ffe60a59c572da Mon Sep 17 00:00:00 2001 From: Wade Date: Sun, 17 Nov 2019 21:16:09 -0600 Subject: [PATCH 1/4] add active switch command --- lib/controllers/root-controller.js | 48 +++++++++++++++++++++++++++++- lib/github-package.js | 1 + lib/prop-types.js | 4 +++ 3 files changed, 52 insertions(+), 1 deletion(-) diff --git a/lib/controllers/root-controller.js b/lib/controllers/root-controller.js index 708fdc3561..3bd077f111 100644 --- a/lib/controllers/root-controller.js +++ b/lib/controllers/root-controller.js @@ -31,7 +31,7 @@ import GitTimingsView from '../views/git-timings-view'; import Conflict from '../models/conflicts/conflict'; import {getEndpoint} from '../models/endpoint'; import Switchboard from '../switchboard'; -import {WorkdirContextPoolPropType} from '../prop-types'; +import {WorkdirContextPoolPropType, WorkdirCachePropType} from '../prop-types'; import {destroyFilePatchPaneItems, destroyEmptyFilePatchPaneItems, autobind} from '../helpers'; import {GitError} from '../git-shell-out-strategy'; import {incrementCounter, addEvent} from '../reporter-proxy'; @@ -54,6 +54,7 @@ export default class RootController extends React.Component { // Models loginModel: PropTypes.object.isRequired, workdirContextPool: WorkdirContextPoolPropType.isRequired, + workdirCache: WorkdirCachePropType.isRequired, repository: PropTypes.object.isRequired, resolutionProgress: PropTypes.object.isRequired, statusBar: PropTypes.object, @@ -164,6 +165,10 @@ export default class RootController extends React.Component { command="github:view-staged-changes-for-current-file" callback={this.viewStagedChangesForCurrentFile} /> + { + const paneItem = this.props.workspace.getCenter().getActivePaneItem(); + + let itemPath = null; + + // Likely GitHub package provided pane item + if (typeof paneItem.getWorkingDirectory === 'function') { + itemPath = path.normalize(paneItem.getWorkingDirectory()); + } + + // TextEditor-like + if (typeof paneItem.getPath === 'function') { + itemPath = path.normalize(paneItem.getPath()); + } + + // Oh well + if (!itemPath) { + return; + } + + // Find valid git working directory + const workdir = await this.props.workdirCache.find(itemPath); + + if (workdir) { + this.props.changeWorkingDirectory(workdir); + return; + } + + // At this point, there is no parent git working directory + // But, we can still assign the current context to a valid context + // if the file is a child of a current working directory + const workdirs = this.props.workdirContextPool.getCurrentWorkDirs(); + for (const dir of workdirs) { + const tokens = path.normalize(dir).split(path.sep).filter(i => i.length); + if (tokens.every((t, i) => itemPath.split(path.sep)[i] === t)) { + // is a child of + this.props.changeWorkingDirectory(workdir); + } + } + } + showWaterfallDiagnostics() { this.props.workspace.open(GitTimingsView.buildURI()); } diff --git a/lib/github-package.js b/lib/github-package.js index f2fb23f72d..902bc52b31 100644 --- a/lib/github-package.js +++ b/lib/github-package.js @@ -293,6 +293,7 @@ export default class GithubPackage { confirm={this.confirm} currentWindow={this.currentWindow} workdirContextPool={this.contextPool} + workdirCache={this.workdirCache} loginModel={this.loginModel} repository={this.getActiveRepository()} resolutionProgress={this.getActiveResolutionProgress()} diff --git a/lib/prop-types.js b/lib/prop-types.js index 29fc33f8e1..d28870b09d 100644 --- a/lib/prop-types.js +++ b/lib/prop-types.js @@ -14,6 +14,10 @@ export const WorkdirContextPoolPropType = PropTypes.shape({ getContext: PropTypes.func.isRequired, }); +export const WorkdirCachePropType = PropTypes.shape({ + find: PropTypes.func.isRequired, +}); + export const GithubLoginModelPropType = PropTypes.shape({ getToken: PropTypes.func.isRequired, setToken: PropTypes.func.isRequired, From 5e04f8e181fc4e05ce7d72d7ec14381b11a86485 Mon Sep 17 00:00:00 2001 From: Wade Date: Sun, 17 Nov 2019 21:31:44 -0600 Subject: [PATCH 2/4] reduce redunant calculations --- lib/controllers/root-controller.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/controllers/root-controller.js b/lib/controllers/root-controller.js index 3bd077f111..3f8c620722 100644 --- a/lib/controllers/root-controller.js +++ b/lib/controllers/root-controller.js @@ -699,9 +699,10 @@ export default class RootController extends React.Component { // But, we can still assign the current context to a valid context // if the file is a child of a current working directory const workdirs = this.props.workdirContextPool.getCurrentWorkDirs(); + const itemTokens = itemPath.split(path.sep); for (const dir of workdirs) { - const tokens = path.normalize(dir).split(path.sep).filter(i => i.length); - if (tokens.every((t, i) => itemPath.split(path.sep)[i] === t)) { + const tokens = path.normalize(dir).split(path.sep).filter(t => t.length); + if (tokens.every((t, i) => itemTokens[i] === t)) { // is a child of this.props.changeWorkingDirectory(workdir); } From ec2624f2b4820b18010b8c62406f0bbe03f6dd29 Mon Sep 17 00:00:00 2001 From: Wade Date: Sun, 17 Nov 2019 21:32:21 -0600 Subject: [PATCH 3/4] fix typo --- lib/controllers/root-controller.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/controllers/root-controller.js b/lib/controllers/root-controller.js index 3f8c620722..3284eee24b 100644 --- a/lib/controllers/root-controller.js +++ b/lib/controllers/root-controller.js @@ -704,7 +704,7 @@ export default class RootController extends React.Component { const tokens = path.normalize(dir).split(path.sep).filter(t => t.length); if (tokens.every((t, i) => itemTokens[i] === t)) { // is a child of - this.props.changeWorkingDirectory(workdir); + this.props.changeWorkingDirectory(dir); } } } From 58d4db2711369f160c7d94b3907dd9a248049167 Mon Sep 17 00:00:00 2001 From: Wade Date: Wed, 20 Nov 2019 10:07:19 -0600 Subject: [PATCH 4/4] add bad pane test --- lib/controllers/root-controller.js | 4 ++++ test/controllers/root-controller.test.js | 18 +++++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/lib/controllers/root-controller.js b/lib/controllers/root-controller.js index 3284eee24b..a7ec4f151f 100644 --- a/lib/controllers/root-controller.js +++ b/lib/controllers/root-controller.js @@ -670,6 +670,10 @@ export default class RootController extends React.Component { selectActivePaneWorkDir = async () => { const paneItem = this.props.workspace.getCenter().getActivePaneItem(); + if (!paneItem) { + return; + } + let itemPath = null; // Likely GitHub package provided pane item diff --git a/test/controllers/root-controller.test.js b/test/controllers/root-controller.test.js index c2eb72e890..bebd26c59e 100644 --- a/test/controllers/root-controller.test.js +++ b/test/controllers/root-controller.test.js @@ -10,6 +10,7 @@ import {cloneRepository, buildRepository} from '../helpers'; import {multiFilePatchBuilder} from '../builder/patch'; import Repository from '../../lib/models/repository'; import WorkdirContextPool from '../../lib/models/workdir-context-pool'; +import WorkdirCache from '../../lib/models/workdir-cache'; import ResolutionProgress from '../../lib/models/conflicts/resolution-progress'; import RemoteSet from '../../lib/models/remote-set'; import Remote from '../../lib/models/remote'; @@ -33,7 +34,8 @@ import RootController from '../../lib/controllers/root-controller'; describe('RootController', function() { let atomEnv, app; let workspace, commands, notificationManager, tooltips, config, confirm, deserializers, grammars, project; - let workdirContextPool; + let workdirContextPool, workdirCache; + let changeWorkingDirectory; beforeEach(function() { atomEnv = global.buildAtomEnvironment(); @@ -46,6 +48,7 @@ describe('RootController', function() { config = atomEnv.config; project = atomEnv.project; + workdirCache = new WorkdirCache(); workdirContextPool = new WorkdirContextPool(); const loginModel = new GithubLoginModel(InMemoryStrategy); @@ -53,6 +56,7 @@ describe('RootController', function() { const emptyResolutionProgress = new ResolutionProgress(); confirm = sinon.stub(atomEnv, 'confirm'); + changeWorkingDirectory = sinon.spy(); app = ( ); }); @@ -355,6 +362,15 @@ describe('RootController', function() { }); }); + describe('selectActivePaneWorkDir()', function() { + it('does not update if there is no active pane', function() { + const wrapper = shallow(app); + wrapper.find('Command[command="github:select-active-pane-directory"]').prop('callback')(); + + assert.isTrue(changeWorkingDirectory.notCalled); + }); + }); + describe('openCloneDialog()', function() { let clone;