From 659c34298ed6ae6b7613968dbbcdd1b22729fa08 Mon Sep 17 00:00:00 2001 From: Ash Wilson Date: Thu, 25 May 2017 14:40:05 -0400 Subject: [PATCH 01/11] Unit tests for the startOpen package state --- test/github-package.test.js | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/test/github-package.test.js b/test/github-package.test.js index e4a7b2c896..af639a6c38 100644 --- a/test/github-package.test.js +++ b/test/github-package.test.js @@ -272,6 +272,33 @@ describe('GithubPackage', function() { assert.isFalse(githubPackage.getActiveResolutionProgress().isEmpty()); assert.equal(githubPackage.getActiveResolutionProgress().getRemaining('modified-on-both-ours.txt'), 3); }); + + describe('startOpen', function() { + it('renders with startOpen on the first run', function() { + config.set('github.firstRun', true); + config.set('welcome.showOnStartup', false); + githubPackage.activate(); + + assert.isTrue(githubPackage.startOpen); + assert.isFalse(config.get('github.firstRun')); + }); + + it('renders without startOpen on non-first runs', function() { + config.set('github.firstRun', false); + githubPackage.activate(); + + assert.isFalse(githubPackage.startOpen); + }); + + it('renders without startOpen on the first run if the welcome pane is shown', function() { + config.set('github.firstRun', true); + config.set('welcome.showOnStartup', true); + githubPackage.activate(); + + assert.isFalse(githubPackage.startOpen); + assert.isFalse(config.get('github.firstRun')); + }); + }); }); describe('when the project paths change', function() { From 08058b1ea25955a807372f6ec151aa809ac318a5 Mon Sep 17 00:00:00 2001 From: Ash Wilson Date: Thu, 25 May 2017 14:40:50 -0400 Subject: [PATCH 02/11] Set startOpen based on current config settings --- lib/github-package.js | 3 +++ package.json | 6 ++++++ 2 files changed, 9 insertions(+) diff --git a/lib/github-package.js b/lib/github-package.js index 5c99f96dbb..bff33816b8 100644 --- a/lib/github-package.js +++ b/lib/github-package.js @@ -41,6 +41,7 @@ export default class GithubPackage { this.styleCalculator = new StyleCalculator(this.styles, this.config); this.confirm = confirm; this.useLegacyPanels = false; + this.startOpen = false; const criteria = { projectPathCount: this.project.getPaths().length, @@ -121,6 +122,8 @@ export default class GithubPackage { activate(state = {}) { this.savedState = {...defaultState, ...state}; + this.startOpen = this.config.get('github.firstRun') && !this.config.get('welcome.showOnStartup'); + this.config.set('github.firstRun', false); if (!this.workspace.getLeftDock || this.config.get('github.useLegacyPanels')) { this.useLegacyPanels = true; diff --git a/package.json b/package.json index 7453e3043d..506078eabd 100644 --- a/package.json +++ b/package.json @@ -145,6 +145,12 @@ "type": "boolean", "default": false, "description": "Capture CPU profiles" + }, + "firstRun": { + "type": "boolean", + "default": true, + "description": "Display the Git and GitHub tabs on Atom launch. Reverts to false on each launch.", + "hidden": true } }, "deserializers": { From f7ce7e3ec1b2791e897567be532f4d2a668806d0 Mon Sep 17 00:00:00 2001 From: Ash Wilson Date: Thu, 25 May 2017 14:41:31 -0400 Subject: [PATCH 03/11] :fire: unused firstRun state --- test/github-package.test.js | 1 - 1 file changed, 1 deletion(-) diff --git a/test/github-package.test.js b/test/github-package.test.js index af639a6c38..ef9188bcca 100644 --- a/test/github-package.test.js +++ b/test/github-package.test.js @@ -183,7 +183,6 @@ describe('GithubPackage', function() { await contextUpdateAfter(() => githubPackage.activate({ activeRepositoryPath: workdirPath2, - firstRun: false, })); const context = contextPool.getContext(workdirPath2); From 35cc185a6013d48f00a8031a44bf70f5817b676a Mon Sep 17 00:00:00 2001 From: Ash Wilson Date: Thu, 25 May 2017 14:44:37 -0400 Subject: [PATCH 04/11] Rename `firstRun` prop to `startOpen` --- lib/controllers/root-controller.js | 10 +++++----- lib/github-package.js | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/controllers/root-controller.js b/lib/controllers/root-controller.js index 8d21aedd34..5a8d9cee83 100644 --- a/lib/controllers/root-controller.js +++ b/lib/controllers/root-controller.js @@ -56,14 +56,14 @@ export default class RootController extends React.Component { switchboard: PropTypes.instanceOf(Switchboard), savedState: PropTypes.object, useLegacyPanels: PropTypes.bool, - firstRun: React.PropTypes.bool, + startOpen: React.PropTypes.bool, } static defaultProps = { switchboard: new Switchboard(), savedState: {}, useLegacyPanels: false, - firstRun: true, + startOpen: true, } serialize() { @@ -80,8 +80,8 @@ export default class RootController extends React.Component { this.state = { ...nullFilePatchState, amending: false, - gitTabActive: props.firstRun || props.savedState.gitTabActive, - githubTabActive: props.firstRun || props.savedState.githubTabActive || props.savedState.githubPanelActive, + gitTabActive: props.startOpen || props.savedState.gitTabActive, + githubTabActive: props.startOpen || props.savedState.githubTabActive || props.savedState.githubPanelActive, panelSize: props.savedState.panelSize || 400, activeTab: props.savedState.activeTab || 0, cloneDialogActive: false, @@ -184,7 +184,7 @@ export default class RootController extends React.Component { getItem={({subtree}) => subtree.getWrappedComponent()} onDidCloseItem={() => this.setState({gitTabActive: false})} stubItemSelector="git-tab-controller" - activate={this.props.firstRun}> + activate={this.props.startOpen}> { this.gitTabController = c; }} className="github-PanelEtchWrapper" diff --git a/lib/github-package.js b/lib/github-package.js index bff33816b8..88db401b68 100644 --- a/lib/github-package.js +++ b/lib/github-package.js @@ -214,7 +214,7 @@ export default class GithubPackage { cloneRepositoryForProjectPath={this.cloneRepositoryForProjectPath} switchboard={this.switchboard} useLegacyPanels={this.useLegacyPanels} - firstRun={this.savedState.firstRun} + startOpen={this.startOpen} />, this.element, callback, ); } From 5931c65585aff112adb7df29c3035c1bdcc73d9d Mon Sep 17 00:00:00 2001 From: Ash Wilson Date: Thu, 25 May 2017 15:03:46 -0400 Subject: [PATCH 05/11] Use the renamed prop in tests --- test/controllers/root-controller.test.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/controllers/root-controller.test.js b/test/controllers/root-controller.test.js index 83083b42ac..aa4664cd1c 100644 --- a/test/controllers/root-controller.test.js +++ b/test/controllers/root-controller.test.js @@ -48,7 +48,7 @@ import RootController from '../../lib/controllers/root-controller'; repository={absentRepository} resolutionProgress={emptyResolutionProgress} useLegacyPanels={useLegacyPanels || !workspace.getLeftDock} - firstRun={false} + startOpen={false} /> ); }); @@ -78,11 +78,11 @@ import RootController from '../../lib/controllers/root-controller'; assert.isTrue(isGitPaneDisplayed(wrapper)); }); - it('is always visible when the firstRun prop is true', async function() { + it('is always visible when the startOpen prop is true', async function() { const workdirPath = await cloneRepository('multiple-commits'); const repository = await buildRepository(workdirPath); - app = React.cloneElement(app, {repository, firstRun: true}); + app = React.cloneElement(app, {repository, startOpen: true}); const wrapper = shallow(app); assert.isTrue(isGitPaneDisplayed(wrapper)); From f3046ad173704e04a167cc1cc36fc58791b9434d Mon Sep 17 00:00:00 2001 From: Ash Wilson Date: Thu, 25 May 2017 15:41:16 -0400 Subject: [PATCH 06/11] Update tests to use a flag file in the config directory --- test/github-package.test.js | 36 ++++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/test/github-package.test.js b/test/github-package.test.js index ef9188bcca..3a9995fb98 100644 --- a/test/github-package.test.js +++ b/test/github-package.test.js @@ -4,12 +4,12 @@ import temp from 'temp'; import until from 'test-until'; import {cloneRepository} from './helpers'; -import {writeFile, getTempDir} from '../lib/helpers'; +import {writeFile, deleteFileOrFolder, fileExists, getTempDir} from '../lib/helpers'; import GithubPackage from '../lib/github-package'; describe('GithubPackage', function() { let atomEnv, workspace, project, commandRegistry, notificationManager, config, confirm, tooltips, styles; - let getLoadSettings; + let getLoadSettings, configDirPath; let githubPackage, contextPool; beforeEach(function() { @@ -23,9 +23,11 @@ describe('GithubPackage', function() { confirm = atomEnv.confirm.bind(atomEnv); styles = atomEnv.styles; getLoadSettings = atomEnv.getLoadSettings.bind(atomEnv); + configDirPath = path.join(__dirname, 'fixtures', 'atomenv-config'); githubPackage = new GithubPackage( - workspace, project, commandRegistry, notificationManager, tooltips, styles, config, confirm, getLoadSettings, + workspace, project, commandRegistry, notificationManager, tooltips, styles, config, confirm, + configDirPath, getLoadSettings, ); sinon.stub(githubPackage, 'rerender').callsFake(callback => { @@ -273,29 +275,35 @@ describe('GithubPackage', function() { }); describe('startOpen', function() { - it('renders with startOpen on the first run', function() { - config.set('github.firstRun', true); + let confFile; + + beforeEach(async function() { + confFile = path.join(configDirPath, 'github.cson'); + await deleteFileOrFolder(confFile); + }); + + it('renders with startOpen on the first run', async function() { config.set('welcome.showOnStartup', false); - githubPackage.activate(); + await githubPackage.activate(); assert.isTrue(githubPackage.startOpen); - assert.isFalse(config.get('github.firstRun')); + assert.isTrue(await fileExists(confFile)); }); - it('renders without startOpen on non-first runs', function() { - config.set('github.firstRun', false); - githubPackage.activate(); + it('renders without startOpen on non-first runs', async function() { + await writeFile(confFile, ''); + await githubPackage.activate(); assert.isFalse(githubPackage.startOpen); + assert.isTrue(await fileExists(confFile)); }); - it('renders without startOpen on the first run if the welcome pane is shown', function() { - config.set('github.firstRun', true); + it('renders without startOpen on the first run if the welcome pane is shown', async function() { config.set('welcome.showOnStartup', true); - githubPackage.activate(); + await githubPackage.activate(); assert.isFalse(githubPackage.startOpen); - assert.isFalse(config.get('github.firstRun')); + assert.isTrue(await fileExists(confFile)); }); }); }); From 4e5eaef3a79f7683c599c8241d95cc181d18835a Mon Sep 17 00:00:00 2001 From: Ash Wilson Date: Thu, 25 May 2017 15:56:13 -0400 Subject: [PATCH 07/11] Use a flag file for a hidden "first run" indicator --- lib/github-package.js | 15 ++++++++++----- lib/index.js | 3 ++- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/lib/github-package.js b/lib/github-package.js index 88db401b68..63c3e6ea52 100644 --- a/lib/github-package.js +++ b/lib/github-package.js @@ -6,7 +6,7 @@ import React from 'react'; import ReactDom from 'react-dom'; import {autobind} from 'core-decorators'; -import {mkdirs} from './helpers'; +import {mkdirs, fileExists, writeFile} from './helpers'; import WorkdirCache from './models/workdir-cache'; import WorkdirContext from './models/workdir-context'; import WorkdirContextPool from './models/workdir-context-pool'; @@ -29,7 +29,7 @@ const defaultState = { export default class GithubPackage { constructor(workspace, project, commandRegistry, notificationManager, tooltips, styles, config, - confirm, getLoadSettings) { + confirm, configDirPath, getLoadSettings) { this.workspace = workspace; this.project = project; this.commandRegistry = commandRegistry; @@ -37,6 +37,7 @@ export default class GithubPackage { this.tooltips = tooltips; this.config = config; this.styles = styles; + this.configPath = path.join(configDirPath, 'github.cson'); this.styleCalculator = new StyleCalculator(this.styles, this.config); this.confirm = confirm; @@ -120,10 +121,14 @@ export default class GithubPackage { ); } - activate(state = {}) { + async activate(state = {}) { this.savedState = {...defaultState, ...state}; - this.startOpen = this.config.get('github.firstRun') && !this.config.get('welcome.showOnStartup'); - this.config.set('github.firstRun', false); + + const firstRun = !await fileExists(this.configPath); + this.startOpen = firstRun && !this.config.get('welcome.showOnStartup'); + if (firstRun) { + await writeFile(this.configPath, '# Store non-visible GitHub package state.'); + } if (!this.workspace.getLeftDock || this.config.get('github.useLegacyPanels')) { this.useLegacyPanels = true; diff --git a/lib/index.js b/lib/index.js index 2387bc5b8b..8ed7f0b0a5 100644 --- a/lib/index.js +++ b/lib/index.js @@ -5,7 +5,8 @@ const entry = { initialize() { pack = new GithubPackage( atom.workspace, atom.project, atom.commands, atom.notifications, atom.tooltips, - atom.styles, atom.config, atom.confirm.bind(atom), atom.getLoadSettings.bind(atom), + atom.styles, atom.config, atom.confirm.bind(atom), atom.getConfigDirPath(), + atom.getLoadSettings.bind(atom), ); }, }; From 6cafcfdc43174620844ef5de161d41eb7a72bc48 Mon Sep 17 00:00:00 2001 From: Ash Wilson Date: Thu, 25 May 2017 16:06:47 -0400 Subject: [PATCH 08/11] Make contextUpdateAfter() async. --- test/github-package.test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/github-package.test.js b/test/github-package.test.js index 3a9995fb98..e6dd7c5b0f 100644 --- a/test/github-package.test.js +++ b/test/github-package.test.js @@ -42,9 +42,9 @@ describe('GithubPackage', function() { atomEnv.destroy(); }); - function contextUpdateAfter(chunk) { + async function contextUpdateAfter(chunk) { const updatePromise = githubPackage.getSwitchboard().getFinishActiveContextUpdatePromise(); - chunk(); + await chunk(); return updatePromise; } From 5b5aba1a7c48c25fa9e14983863a2081d1d5fbc7 Mon Sep 17 00:00:00 2001 From: Ash Wilson Date: Thu, 25 May 2017 16:10:05 -0400 Subject: [PATCH 09/11] Initialize GithubPackage correctly --- test/github-package.test.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/github-package.test.js b/test/github-package.test.js index e6dd7c5b0f..d5feb9b049 100644 --- a/test/github-package.test.js +++ b/test/github-package.test.js @@ -66,7 +66,8 @@ describe('GithubPackage', function() { const getLoadSettings1 = () => ({initialPaths}); githubPackage1 = new GithubPackage( - workspace, project, commandRegistry, notificationManager, tooltips, styles, config, confirm, getLoadSettings1, + workspace, project, commandRegistry, notificationManager, tooltips, styles, config, confirm, + configDirPath, getLoadSettings1, ); } From e0756eac0734e7ddde60757688ad6cc579b47160 Mon Sep 17 00:00:00 2001 From: Ash Wilson Date: Thu, 25 May 2017 16:19:31 -0400 Subject: [PATCH 10/11] Empty fixture config directory --- test/fixtures/atomenv-config/.gitignore | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 test/fixtures/atomenv-config/.gitignore diff --git a/test/fixtures/atomenv-config/.gitignore b/test/fixtures/atomenv-config/.gitignore new file mode 100644 index 0000000000..d6b7ef32c8 --- /dev/null +++ b/test/fixtures/atomenv-config/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore From a2909369f07a6563ee8c654333c2df66dc18b5da Mon Sep 17 00:00:00 2001 From: Ash Wilson Date: Tue, 30 May 2017 10:58:24 -0400 Subject: [PATCH 11/11] :fire: the unused package setting --- package.json | 6 ------ 1 file changed, 6 deletions(-) diff --git a/package.json b/package.json index 506078eabd..7453e3043d 100644 --- a/package.json +++ b/package.json @@ -145,12 +145,6 @@ "type": "boolean", "default": false, "description": "Capture CPU profiles" - }, - "firstRun": { - "type": "boolean", - "default": true, - "description": "Display the Git and GitHub tabs on Atom launch. Reverts to false on each launch.", - "hidden": true } }, "deserializers": {