From f89dbb66e26ea979ce00b698ecab4ce2bf85a200 Mon Sep 17 00:00:00 2001 From: Michelle Tilley Date: Mon, 3 Apr 2017 23:52:00 -0700 Subject: [PATCH 01/16] Simplify startup path --- lib/index.js | 49 +++++-------------------------------------------- package.json | 2 -- 2 files changed, 5 insertions(+), 46 deletions(-) diff --git a/lib/index.js b/lib/index.js index c10222a79a..47abc4c9f7 100644 --- a/lib/index.js +++ b/lib/index.js @@ -1,45 +1,6 @@ -/* eslint-disable no-var */ +import GithubPackage from 'github-package'; -var semver = require('semver'); - -var v = semver.parse(atom.appVersion); -var atomVersion = [v.major, v.minor, v.patch].join('.'); -var requiredVersion = '>=1.13.0'; - -if (atom.inDevMode() || atom.inSpecMode() || semver.satisfies(atomVersion, requiredVersion)) { - module.exports = startPackage(); -} else { - module.exports = versionMismatch(); -} - -function versionMismatch() { - return { - activate: () => { - atom.notifications.addWarning('Incompatible Atom Version', { - description: 'The GitHub packages requires Atom ' + requiredVersion + - '. You are running ' + atomVersion + '. Please check for updates and try again.', - dismissable: true, - }); - }, - }; -} - -function startPackage() { - var GithubPackage = require('./github-package').default; - - if (atom.inDevMode()) { - // Let's install some devTools - try { - const electronDevtoolsInstaller = require('electron-devtools-installer'); - const installExtension = electronDevtoolsInstaller.default; - installExtension(electronDevtoolsInstaller.REACT_DEVELOPER_TOOLS); - } catch (_e) { - // Nothing - } - } - - return new GithubPackage( - atom.workspace, atom.project, atom.commands, atom.notifications, atom.tooltips, - atom.styles, atom.config, atom.confirm.bind(atom), - ); -} +module.exports = new GithubPackage( + atom.workspace, atom.project, atom.commands, atom.notifications, atom.tooltips, + atom.styles, atom.config, atom.confirm.bind(atom), +); diff --git a/package.json b/package.json index cebf776ce0..7353ef3873 100644 --- a/package.json +++ b/package.json @@ -62,7 +62,6 @@ "react-dom": "^15.4.1", "react-relay": "^0.10.0", "recursive-readdir": "^2.0.0", - "semver": "^5.3.0", "tree-kill": "^1.1.0", "what-the-diff": "^0.3.0", "yubikiri": "0.0.2" @@ -73,7 +72,6 @@ "chai": "^3.5.0", "chai-as-promised": "^5.3.0", "dedent-js": "^1.0.1", - "electron-devtools-installer": "^2.0.1", "enzyme": "^2.7.1", "eslint": "^3.0.0", "eslint-config-fbjs": "2.0.0-alpha.1", From 4c9fafa256010c5c793d3bdd896bb5ab555c573e Mon Sep 17 00:00:00 2001 From: Michelle Tilley Date: Mon, 3 Apr 2017 23:56:32 -0700 Subject: [PATCH 02/16] Fix bad require --- lib/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/index.js b/lib/index.js index 47abc4c9f7..f06e05a2b8 100644 --- a/lib/index.js +++ b/lib/index.js @@ -1,4 +1,4 @@ -import GithubPackage from 'github-package'; +import GithubPackage from './github-package'; module.exports = new GithubPackage( atom.workspace, atom.project, atom.commands, atom.notifications, atom.tooltips, From a0e99517771da7e31f7365a2dbe7ba829b35aff4 Mon Sep 17 00:00:00 2001 From: Michelle Tilley Date: Tue, 4 Apr 2017 08:35:01 -0700 Subject: [PATCH 03/16] Defer creation of the GithubPackage object until activation --- lib/index.js | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/lib/index.js b/lib/index.js index f06e05a2b8..a729750492 100644 --- a/lib/index.js +++ b/lib/index.js @@ -1,6 +1,23 @@ import GithubPackage from './github-package'; -module.exports = new GithubPackage( - atom.workspace, atom.project, atom.commands, atom.notifications, atom.tooltips, - atom.styles, atom.config, atom.confirm.bind(atom), -); +let pack; +const entry = { + activate(...args) { + pack = new GithubPackage( + atom.workspace, atom.project, atom.commands, atom.notifications, atom.tooltips, + atom.styles, atom.config, atom.confirm.bind(atom), + ); + pack.activate(...args); + }, +}; + +[ + 'serialize', 'deserialize', 'deactivate', 'consumeStatusBar', + 'createGitTimingsView', 'createIssueishPaneItem', +].forEach(method => { + entry[method] = (...args) => { + return pack[method](...args); + }; +}); + +module.exports = entry; From 517e22e8d8545ab46a7447e8e2783d356de75441 Mon Sep 17 00:00:00 2001 From: Michelle Tilley Date: Tue, 4 Apr 2017 10:16:05 -0700 Subject: [PATCH 04/16] Import things from event-kit --- lib/atom-items/issueish-pane-item.js | 2 +- lib/controllers/editor-conflict-controller.js | 2 +- lib/controllers/file-patch-controller.js | 3 ++- lib/controllers/repository-conflict-controller.js | 2 +- lib/controllers/root-controller.js | 3 ++- lib/git-prompt-server.js | 2 +- lib/git-shell-out-strategy.js | 2 +- lib/github-package.js | 3 ++- lib/models/conflicts/resolution-progress.js | 2 +- lib/models/file-system-change-observer.js | 2 +- lib/models/github-login-model.js | 2 +- lib/models/repository.js | 2 +- lib/models/style-calculator.js | 2 +- lib/models/workspace-change-observer.js | 2 +- lib/views/clone-dialog.js | 2 +- lib/views/commit-view.js | 3 ++- lib/views/decoration.js | 2 +- lib/views/file-patch-view.js | 2 +- lib/views/git-tab-view.js | 2 +- lib/views/git-timings-view.js | 3 ++- lib/views/github-dotcom-markdown.js | 2 +- lib/views/staging-view.js | 2 +- package.json | 1 + test/decorators/observe-model.test.js | 2 +- test/models/model-observer.test.js | 2 +- test/models/style-calculator.test.js | 2 +- test/views/observe-model.test.js | 2 +- test/views/pane-item.test.js | 2 +- test/views/panel.test.js | 2 +- 29 files changed, 34 insertions(+), 28 deletions(-) diff --git a/lib/atom-items/issueish-pane-item.js b/lib/atom-items/issueish-pane-item.js index 1c40562af9..a51fa67d77 100644 --- a/lib/atom-items/issueish-pane-item.js +++ b/lib/atom-items/issueish-pane-item.js @@ -1,4 +1,4 @@ -import {Emitter} from 'atom'; +import {Emitter} from 'event-kit'; import url from 'url'; diff --git a/lib/controllers/editor-conflict-controller.js b/lib/controllers/editor-conflict-controller.js index d27f525a28..b405cdfcfb 100644 --- a/lib/controllers/editor-conflict-controller.js +++ b/lib/controllers/editor-conflict-controller.js @@ -1,4 +1,4 @@ -import {CompositeDisposable} from 'atom'; +import {CompositeDisposable} from 'event-kit'; import React from 'react'; import {autobind} from 'core-decorators'; import compareSets from 'compare-sets'; diff --git a/lib/controllers/file-patch-controller.js b/lib/controllers/file-patch-controller.js index 5fe44fd3b1..80c9ea82a5 100644 --- a/lib/controllers/file-patch-controller.js +++ b/lib/controllers/file-patch-controller.js @@ -1,6 +1,7 @@ import React from 'react'; -import {Point, Emitter} from 'atom'; +import {Point} from 'atom'; +import {Emitter} from 'event-kit'; import {autobind} from 'core-decorators'; import EventWatcher from '../event-watcher'; diff --git a/lib/controllers/repository-conflict-controller.js b/lib/controllers/repository-conflict-controller.js index b21e29b029..c3f32e6795 100644 --- a/lib/controllers/repository-conflict-controller.js +++ b/lib/controllers/repository-conflict-controller.js @@ -1,7 +1,7 @@ import path from 'path'; import React from 'react'; import yubikiri from 'yubikiri'; -import {CompositeDisposable} from 'atom'; +import {CompositeDisposable} from 'event-kit'; import ObserveModelDecorator from '../decorators/observe-model'; import ResolutionProgress from '../models/conflicts/resolution-progress'; diff --git a/lib/controllers/root-controller.js b/lib/controllers/root-controller.js index 7c4458e705..f167886a5a 100644 --- a/lib/controllers/root-controller.js +++ b/lib/controllers/root-controller.js @@ -1,7 +1,8 @@ import fs from 'fs'; import path from 'path'; -import {CompositeDisposable, Disposable, File} from 'atom'; +import {File} from 'atom'; +import {CompositeDisposable, Disposable} from 'event-kit'; import React from 'react'; import {autobind} from 'core-decorators'; diff --git a/lib/git-prompt-server.js b/lib/git-prompt-server.js index f01a59b9df..060b37af37 100644 --- a/lib/git-prompt-server.js +++ b/lib/git-prompt-server.js @@ -2,7 +2,7 @@ import net from 'net'; import path from 'path'; import os from 'os'; -import {Emitter} from 'atom'; +import {Emitter} from 'event-kit'; import {deleteFileOrFolder, getTempDir, copyFile} from './helpers'; diff --git a/lib/git-shell-out-strategy.js b/lib/git-shell-out-strategy.js index 5aa5699108..0d83147e40 100644 --- a/lib/git-shell-out-strategy.js +++ b/lib/git-shell-out-strategy.js @@ -1,7 +1,7 @@ import path from 'path'; import os from 'os'; -import {CompositeDisposable} from 'atom'; +import {CompositeDisposable} from 'event-kit'; import {GitProcess} from 'git-kitchen-sink'; import {parse as parseDiff} from 'what-the-diff'; diff --git a/lib/github-package.js b/lib/github-package.js index a06d358e96..9211024fc0 100644 --- a/lib/github-package.js +++ b/lib/github-package.js @@ -1,4 +1,5 @@ -import {CompositeDisposable, Disposable, File} from 'atom'; +import {File} from 'atom'; +import {CompositeDisposable, Disposable} from 'event-kit'; import path from 'path'; diff --git a/lib/models/conflicts/resolution-progress.js b/lib/models/conflicts/resolution-progress.js index d8bf910ca8..d135cc7dc0 100644 --- a/lib/models/conflicts/resolution-progress.js +++ b/lib/models/conflicts/resolution-progress.js @@ -1,4 +1,4 @@ -import {Emitter} from 'atom'; +import {Emitter} from 'event-kit'; export default class ResolutionProgress { static empty() { diff --git a/lib/models/file-system-change-observer.js b/lib/models/file-system-change-observer.js index 1187dffb53..43ef449e99 100644 --- a/lib/models/file-system-change-observer.js +++ b/lib/models/file-system-change-observer.js @@ -1,4 +1,4 @@ -import {Emitter} from 'atom'; +import {Emitter} from 'event-kit'; import nsfw from 'nsfw'; import path from 'path'; diff --git a/lib/models/github-login-model.js b/lib/models/github-login-model.js index 07c2c0496c..ea5a590689 100644 --- a/lib/models/github-login-model.js +++ b/lib/models/github-login-model.js @@ -2,7 +2,7 @@ import {execFile} from 'child_process'; import keytar from 'keytar'; -import {Emitter} from 'atom'; +import {Emitter} from 'event-kit'; export const UNAUTHENTICATED = Symbol('UNAUTHENTICATED'); diff --git a/lib/models/repository.js b/lib/models/repository.js index 6bff89e491..6b4a0dc137 100644 --- a/lib/models/repository.js +++ b/lib/models/repository.js @@ -1,7 +1,7 @@ import fs from 'fs-extra'; import path from 'path'; -import {Emitter, Disposable} from 'atom'; +import {Emitter, Disposable} from 'event-kit'; import {autobind} from 'core-decorators'; import CompositeGitStrategy from '../composite-git-strategy'; diff --git a/lib/models/style-calculator.js b/lib/models/style-calculator.js index d1a8c3686c..434500e408 100644 --- a/lib/models/style-calculator.js +++ b/lib/models/style-calculator.js @@ -1,4 +1,4 @@ -import {CompositeDisposable} from 'atom'; +import {CompositeDisposable} from 'event-kit'; import {autobind} from 'core-decorators'; diff --git a/lib/models/workspace-change-observer.js b/lib/models/workspace-change-observer.js index 18755edfbd..645ea391f0 100644 --- a/lib/models/workspace-change-observer.js +++ b/lib/models/workspace-change-observer.js @@ -1,4 +1,4 @@ -import {CompositeDisposable, Disposable, Emitter} from 'atom'; +import {CompositeDisposable, Disposable, Emitter} from 'event-kit'; import nsfw from 'nsfw'; import {autobind} from 'core-decorators'; diff --git a/lib/views/clone-dialog.js b/lib/views/clone-dialog.js index 9a70b87252..221963ca90 100644 --- a/lib/views/clone-dialog.js +++ b/lib/views/clone-dialog.js @@ -1,6 +1,6 @@ import React from 'react'; import {autobind} from 'core-decorators'; -import {CompositeDisposable} from 'atom'; +import {CompositeDisposable} from 'event-kit'; import url from 'url'; import path from 'path'; diff --git a/lib/views/commit-view.js b/lib/views/commit-view.js index b7836f848e..f832b687c5 100644 --- a/lib/views/commit-view.js +++ b/lib/views/commit-view.js @@ -1,7 +1,8 @@ /** @jsx etch.dom */ /* eslint react/no-unknown-property: "off" */ -import {CompositeDisposable, TextEditor} from 'atom'; +import {TextEditor} from 'atom'; +import {CompositeDisposable} from 'event-kit'; import etch from 'etch'; import {autobind} from 'core-decorators'; diff --git a/lib/views/decoration.js b/lib/views/decoration.js index 4a3e013cc1..c4fda04d90 100644 --- a/lib/views/decoration.js +++ b/lib/views/decoration.js @@ -1,5 +1,5 @@ import React from 'react'; -import {CompositeDisposable} from 'atom'; +import {CompositeDisposable} from 'event-kit'; import Portal from './portal'; diff --git a/lib/views/file-patch-view.js b/lib/views/file-patch-view.js index b60d17ffd0..5d9e3428cd 100644 --- a/lib/views/file-patch-view.js +++ b/lib/views/file-patch-view.js @@ -1,6 +1,6 @@ import React from 'react'; -import {CompositeDisposable, Disposable} from 'atom'; +import {CompositeDisposable, Disposable} from 'event-kit'; import cx from 'classnames'; import {autobind} from 'core-decorators'; diff --git a/lib/views/git-tab-view.js b/lib/views/git-tab-view.js index 607786c9ca..b39d7b697b 100644 --- a/lib/views/git-tab-view.js +++ b/lib/views/git-tab-view.js @@ -1,7 +1,7 @@ /** @jsx etch.dom */ /* eslint react/no-unknown-property: "off" */ -import {Disposable, CompositeDisposable} from 'atom'; +import {Disposable, CompositeDisposable} from 'event-kit'; import etch from 'etch'; import {autobind} from 'core-decorators'; diff --git a/lib/views/git-timings-view.js b/lib/views/git-timings-view.js index feaff72d6a..b3234b7670 100644 --- a/lib/views/git-timings-view.js +++ b/lib/views/git-timings-view.js @@ -1,4 +1,5 @@ -import {Emitter, CompositeDisposable, TextBuffer} from 'atom'; +import {TextBuffer} from 'atom'; +import {Emitter, CompositeDisposable} from 'event-kit'; import {remote} from 'electron'; const {dialog} = remote; diff --git a/lib/views/github-dotcom-markdown.js b/lib/views/github-dotcom-markdown.js index de74fae7b0..e6738ff558 100644 --- a/lib/views/github-dotcom-markdown.js +++ b/lib/views/github-dotcom-markdown.js @@ -1,4 +1,4 @@ -import {CompositeDisposable, Disposable} from 'atom'; +import {CompositeDisposable, Disposable} from 'event-kit'; import {shell} from 'electron'; import url from 'url'; diff --git a/lib/views/staging-view.js b/lib/views/staging-view.js index 673e7ff0d0..06e53b354b 100644 --- a/lib/views/staging-view.js +++ b/lib/views/staging-view.js @@ -1,7 +1,7 @@ /** @jsx etch.dom */ /* eslint react/no-unknown-property: "off" */ -import {Disposable, CompositeDisposable} from 'atom'; +import {Disposable, CompositeDisposable} from 'event-kit'; import {remote} from 'electron'; const {Menu, MenuItem} = remote; diff --git a/package.json b/package.json index 7353ef3873..1f93b32da7 100644 --- a/package.json +++ b/package.json @@ -47,6 +47,7 @@ "core-decorators": "^0.15.0", "diff": "2.2.2", "etch": "0.8.0", + "event-kit": "^2.2.0", "fs-extra": "^1.0.0", "git-kitchen-sink": "1.17.0", "graphql": "^0.8.2", diff --git a/test/decorators/observe-model.test.js b/test/decorators/observe-model.test.js index 3f6c41c659..314900655b 100644 --- a/test/decorators/observe-model.test.js +++ b/test/decorators/observe-model.test.js @@ -1,4 +1,4 @@ -import {Emitter} from 'atom'; +import {Emitter} from 'event-kit'; import React from 'react'; import {mount} from 'enzyme'; diff --git a/test/models/model-observer.test.js b/test/models/model-observer.test.js index 1dc216306c..b1e8846cc0 100644 --- a/test/models/model-observer.test.js +++ b/test/models/model-observer.test.js @@ -1,4 +1,4 @@ -import {Emitter} from 'atom'; +import {Emitter} from 'event-kit'; import ModelObserver from '../../lib/models/model-observer'; class Model { diff --git a/test/models/style-calculator.test.js b/test/models/style-calculator.test.js index 5ae9c75bd7..02a3760187 100644 --- a/test/models/style-calculator.test.js +++ b/test/models/style-calculator.test.js @@ -1,4 +1,4 @@ -import {Disposable} from 'atom'; +import {Disposable} from 'event-kit'; import dedent from 'dedent-js'; diff --git a/test/views/observe-model.test.js b/test/views/observe-model.test.js index 9dd7dcfc23..1565d68978 100644 --- a/test/views/observe-model.test.js +++ b/test/views/observe-model.test.js @@ -1,4 +1,4 @@ -import {Emitter} from 'atom'; +import {Emitter} from 'event-kit'; import React from 'react'; import {mount} from 'enzyme'; diff --git a/test/views/pane-item.test.js b/test/views/pane-item.test.js index 9eefe8f989..e54eea864c 100644 --- a/test/views/pane-item.test.js +++ b/test/views/pane-item.test.js @@ -2,7 +2,7 @@ import React from 'react'; import PaneItem from '../../lib/views/pane-item'; -import {Emitter} from 'atom'; +import {Emitter} from 'event-kit'; import {createRenderer} from '../helpers'; diff --git a/test/views/panel.test.js b/test/views/panel.test.js index 921a585a0d..ffe42034a2 100644 --- a/test/views/panel.test.js +++ b/test/views/panel.test.js @@ -2,7 +2,7 @@ import React from 'react'; import Panel from '../../lib/views/panel'; -import {Emitter} from 'atom'; +import {Emitter} from 'event-kit'; import {createRenderer} from '../helpers'; From 84d82e74b121262fbb583eab48da53cda6c8c580 Mon Sep 17 00:00:00 2001 From: Michelle Tilley Date: Tue, 4 Apr 2017 12:16:18 -0700 Subject: [PATCH 05/16] :art: --- lib/helpers.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/helpers.js b/lib/helpers.js index aaf710ce3d..16c099803e 100644 --- a/lib/helpers.js +++ b/lib/helpers.js @@ -99,9 +99,9 @@ export function writeFile(absoluteFilePath, contents) { }); } -export function deleteFileOrFolder(path) { +export function deleteFileOrFolder(fileOrFolder) { return new Promise((resolve, reject) => { - fs.remove(path, err => { + fs.remove(fileOrFolder, err => { if (err) { return reject(err); } else { return resolve(); } }); }); From 00de30b7c40910fd2b744cd600bef7669708c067 Mon Sep 17 00:00:00 2001 From: Michelle Tilley Date: Tue, 4 Apr 2017 12:20:03 -0700 Subject: [PATCH 06/16] Use getPackageRoot() for locating bins --- lib/git-prompt-server.js | 4 ++-- lib/git-shell-out-strategy.js | 7 ++++--- lib/helpers.js | 17 +++++++++++++++++ 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/lib/git-prompt-server.js b/lib/git-prompt-server.js index 060b37af37..dcda296843 100644 --- a/lib/git-prompt-server.js +++ b/lib/git-prompt-server.js @@ -4,7 +4,7 @@ import os from 'os'; import {Emitter} from 'event-kit'; -import {deleteFileOrFolder, getTempDir, copyFile} from './helpers'; +import {getPackageRoot, deleteFileOrFolder, getTempDir, copyFile} from './helpers'; function getAtomHelperPath() { if (process.platform === 'darwin') { @@ -41,7 +41,7 @@ export default class GitPromptServer { await Promise.all( Object.keys(sourceFiles).map(filename => copyFile( - path.resolve(__dirname, '..', 'bin', filename), + path.resolve(getPackageRoot(), 'bin', filename), path.join(this.tmpFolderPath, filename), ).then(sourceFiles[filename])), ); diff --git a/lib/git-shell-out-strategy.js b/lib/git-shell-out-strategy.js index 0d83147e40..a11be0c369 100644 --- a/lib/git-shell-out-strategy.js +++ b/lib/git-shell-out-strategy.js @@ -8,13 +8,13 @@ import {parse as parseDiff} from 'what-the-diff'; import GitPromptServer from './git-prompt-server'; import AsyncQueue from './async-queue'; -import {readFile, fileExists, writeFile, isFileExecutable} from './helpers'; +import {getPackageRoot, readFile, fileExists, writeFile, isFileExecutable} from './helpers'; import GitTimingsView from './views/git-timings-view'; const LINE_ENDING_REGEX = /\r?\n/; -const GPG_HELPER_PATH = path.resolve(__dirname, '..', 'bin', 'gpg-no-tty.sh'); -const DUGITE_PATH = require.resolve('git-kitchen-sink'); +const GPG_HELPER_PATH = path.resolve(getPackageRoot(), 'bin', 'gpg-no-tty.sh'); +let DUGITE_PATH; export class GitError extends Error { constructor(message) { @@ -93,6 +93,7 @@ export default class GitShellOutStrategy { const { socket, electron, credentialHelper, askPass, sshWrapper, } = await gitPromptServer.start(this.prompt); + DUGITE_PATH = DUGITE_PATH || require.resolve('git-kitchen-sink'); env.ATOM_GITHUB_ASKPASS_PATH = normalizePath(askPass.script); env.ATOM_GITHUB_CREDENTIAL_PATH = normalizePath(credentialHelper.script); diff --git a/lib/helpers.js b/lib/helpers.js index 16c099803e..5c375b4122 100644 --- a/lib/helpers.js +++ b/lib/helpers.js @@ -1,6 +1,23 @@ +import path from 'path'; import fs from 'fs-extra'; import {ncp} from 'ncp'; +export function getPackageRoot() { + const {resourcePath} = atom.getLoadSettings(); + const currentFileWasRequiredFromSnapshot = !path.isAbsolute(__dirname); + if (currentFileWasRequiredFromSnapshot) { + return path.join(resourcePath, 'node_modules', 'github'); + } else { + const packageRoot = path.resolve(__dirname, '..'); + if (path.extname(resourcePath) === '.asar') { + if (packageRoot.indexOf(resourcePath) === 0) { + return path.join(`${resourcePath}.unpacked`, 'node_modules', 'github'); + } + } + return packageRoot; + } +} + function descriptorsFromProto(proto) { return Object.getOwnPropertyNames(proto).reduce((acc, name) => { From d6484f4fca34c72993c73f892069354c7231135f Mon Sep 17 00:00:00 2001 From: Michelle Tilley Date: Tue, 4 Apr 2017 12:42:12 -0700 Subject: [PATCH 07/16] :fire: unnecessary deserializer registration --- lib/views/git-timings-view.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/views/git-timings-view.js b/lib/views/git-timings-view.js index b3234b7670..2aa7cf9c5e 100644 --- a/lib/views/git-timings-view.js +++ b/lib/views/git-timings-view.js @@ -455,5 +455,3 @@ export default class GitTimingsView extends React.Component { }); } } - -atom.deserializers.add(GitTimingsView); From 30b9b9579aaca92f2e6678563e297fb3e9424311 Mon Sep 17 00:00:00 2001 From: Michelle Tilley Date: Tue, 4 Apr 2017 12:52:37 -0700 Subject: [PATCH 08/16] git-kitchen-sink -> dugite --- lib/git-shell-out-strategy.js | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/git-shell-out-strategy.js b/lib/git-shell-out-strategy.js index a11be0c369..0a8cb225d6 100644 --- a/lib/git-shell-out-strategy.js +++ b/lib/git-shell-out-strategy.js @@ -3,7 +3,7 @@ import os from 'os'; import {CompositeDisposable} from 'event-kit'; -import {GitProcess} from 'git-kitchen-sink'; +import {GitProcess} from 'dugite'; import {parse as parseDiff} from 'what-the-diff'; import GitPromptServer from './git-prompt-server'; @@ -93,7 +93,7 @@ export default class GitShellOutStrategy { const { socket, electron, credentialHelper, askPass, sshWrapper, } = await gitPromptServer.start(this.prompt); - DUGITE_PATH = DUGITE_PATH || require.resolve('git-kitchen-sink'); + DUGITE_PATH = DUGITE_PATH || require.resolve('dugite'); env.ATOM_GITHUB_ASKPASS_PATH = normalizePath(askPass.script); env.ATOM_GITHUB_CREDENTIAL_PATH = normalizePath(credentialHelper.script); diff --git a/package.json b/package.json index 1f93b32da7..323e10680e 100644 --- a/package.json +++ b/package.json @@ -46,10 +46,10 @@ "compare-sets": "^1.0.1", "core-decorators": "^0.15.0", "diff": "2.2.2", + "dugite": "^1.23.0", "etch": "0.8.0", "event-kit": "^2.2.0", "fs-extra": "^1.0.0", - "git-kitchen-sink": "1.17.0", "graphql": "^0.8.2", "hoist-non-react-statics": "^1.2.0", "keytar": "^3.0.2", From d14450f55eab37b15044a6ac03567d3ec0f4b657 Mon Sep 17 00:00:00 2001 From: Michelle Tilley Date: Tue, 4 Apr 2017 12:53:12 -0700 Subject: [PATCH 09/16] :arrow_up: etch@0.12.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 323e10680e..cb81502123 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "core-decorators": "^0.15.0", "diff": "2.2.2", "dugite": "^1.23.0", - "etch": "0.8.0", + "etch": "0.12.0", "event-kit": "^2.2.0", "fs-extra": "^1.0.0", "graphql": "^0.8.2", From 42666557c8332b709578893d1483587427ab67bc Mon Sep 17 00:00:00 2001 From: Michelle Tilley Date: Tue, 4 Apr 2017 13:17:12 -0700 Subject: [PATCH 10/16] Where in the world is Dugite --- lib/git-shell-out-strategy.js | 6 ++---- lib/helpers.js | 17 +++++++++++++++++ test/git-prompt-server.test.js | 2 +- test/git-strategies.test.js | 2 +- 4 files changed, 21 insertions(+), 6 deletions(-) diff --git a/lib/git-shell-out-strategy.js b/lib/git-shell-out-strategy.js index 0a8cb225d6..213ba09e71 100644 --- a/lib/git-shell-out-strategy.js +++ b/lib/git-shell-out-strategy.js @@ -8,13 +8,12 @@ import {parse as parseDiff} from 'what-the-diff'; import GitPromptServer from './git-prompt-server'; import AsyncQueue from './async-queue'; -import {getPackageRoot, readFile, fileExists, writeFile, isFileExecutable} from './helpers'; +import {getPackageRoot, getDugitePath, readFile, fileExists, writeFile, isFileExecutable} from './helpers'; import GitTimingsView from './views/git-timings-view'; const LINE_ENDING_REGEX = /\r?\n/; const GPG_HELPER_PATH = path.resolve(getPackageRoot(), 'bin', 'gpg-no-tty.sh'); -let DUGITE_PATH; export class GitError extends Error { constructor(message) { @@ -93,7 +92,6 @@ export default class GitShellOutStrategy { const { socket, electron, credentialHelper, askPass, sshWrapper, } = await gitPromptServer.start(this.prompt); - DUGITE_PATH = DUGITE_PATH || require.resolve('dugite'); env.ATOM_GITHUB_ASKPASS_PATH = normalizePath(askPass.script); env.ATOM_GITHUB_CREDENTIAL_PATH = normalizePath(credentialHelper.script); @@ -101,7 +99,7 @@ export default class GitShellOutStrategy { env.ATOM_GITHUB_SOCK_PATH = normalizePath(socket); env.ATOM_GITHUB_WORKDIR_PATH = this.workingDir; - env.ATOM_GITHUB_DUGITE_PATH = DUGITE_PATH; + env.ATOM_GITHUB_DUGITE_PATH = path.join(getDugitePath(), 'git', 'bin', 'git'); // "ssh" won't respect SSH_ASKPASS unless: // (a) it's running without a tty diff --git a/lib/helpers.js b/lib/helpers.js index 5c375b4122..9cdbdd5b41 100644 --- a/lib/helpers.js +++ b/lib/helpers.js @@ -18,6 +18,23 @@ export function getPackageRoot() { } } +let DUGITE_PATH; +export function getDugitePath() { + if (!DUGITE_PATH) { + DUGITE_PATH = require.resolve('dugite'); + if (!path.isAbsolute(DUGITE_PATH)) { + // Assume we're snapshotted + const {resourcePath} = atom.getLoadSettings(); + if (path.extname(resourcePath) === '.asar') { + DUGITE_PATH = path.join(`${resourcePath}.unpacked`, 'node_modules', 'dugite'); + } else { + DUGITE_PATH = path.join(resourcePath, 'node_modules', 'dugite'); + } + } + } + + return DUGITE_PATH; +} function descriptorsFromProto(proto) { return Object.getOwnPropertyNames(proto).reduce((acc, name) => { diff --git a/test/git-prompt-server.test.js b/test/git-prompt-server.test.js index d2a24d4c5c..f592294b1d 100644 --- a/test/git-prompt-server.test.js +++ b/test/git-prompt-server.test.js @@ -8,7 +8,7 @@ describe('GitPromptServer', function() { const electronEnv = { ELECTRON_RUN_AS_NODE: '1', ELECTRON_NO_ATTACH_CONSOLE: '1', - ATOM_GITHUB_DUGITE_PATH: require.resolve('git-kitchen-sink'), + ATOM_GITHUB_DUGITE_PATH: require.resolve('dugite'), ATOM_GITHUB_ORIGINAL_PATH: process.env.PATH, ATOM_GITHUB_WORKDIR_PATH: path.join(__dirname, '..'), GIT_TRACE: 'true', diff --git a/test/git-strategies.test.js b/test/git-strategies.test.js index 519c3e691f..a577956183 100644 --- a/test/git-strategies.test.js +++ b/test/git-strategies.test.js @@ -6,7 +6,7 @@ import dedent from 'dedent-js'; import CompositeGitStrategy from '../lib/composite-git-strategy'; import GitShellOutStrategy from '../lib/git-shell-out-strategy'; -import {GitProcess} from 'git-kitchen-sink'; +import {GitProcess} from 'dugite'; import {cloneRepository, initRepository, assertDeepPropertyVals, setUpLocalAndRemoteRepositories} from './helpers'; import {fsStat} from '../lib/helpers'; From 75c05e4ae94063c30c135d928c50e551390cc855 Mon Sep 17 00:00:00 2001 From: Michelle Tilley Date: Tue, 4 Apr 2017 13:17:23 -0700 Subject: [PATCH 11/16] :white_check_mark: fix failing tests --- lib/views/commit-view.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/views/commit-view.js b/lib/views/commit-view.js index f832b687c5..eb57d54cef 100644 --- a/lib/views/commit-view.js +++ b/lib/views/commit-view.js @@ -120,7 +120,7 @@ export default class CommitView { return '∞'; } } else { - return this.props.maximumCharacterLimit; + return this.props.maximumCharacterLimit || ''; } } From 29cbf127112860522715de69f5682011bf368752 Mon Sep 17 00:00:00 2001 From: Michelle Tilley Date: Tue, 4 Apr 2017 13:23:54 -0700 Subject: [PATCH 12/16] Add console.logs (that's a first) --- lib/helpers.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lib/helpers.js b/lib/helpers.js index 9cdbdd5b41..d0c285f654 100644 --- a/lib/helpers.js +++ b/lib/helpers.js @@ -22,17 +22,25 @@ let DUGITE_PATH; export function getDugitePath() { if (!DUGITE_PATH) { DUGITE_PATH = require.resolve('dugite'); + console.log("require.resolve says it's", DUGITE_PATH); if (!path.isAbsolute(DUGITE_PATH)) { + console.log("but it's not absolute! (cause we're snapshotted mebbe)"); // Assume we're snapshotted const {resourcePath} = atom.getLoadSettings(); + console.log('atom says our resource path is', resourcePath); if (path.extname(resourcePath) === '.asar') { DUGITE_PATH = path.join(`${resourcePath}.unpacked`, 'node_modules', 'dugite'); + console.log("we're in an asar, so it's", DUGITE_PATH); } else { DUGITE_PATH = path.join(resourcePath, 'node_modules', 'dugite'); + console.log("but since we're not using asar it's", DUGITE_PATH); } + } else { + console.log("and it's absolute so the answer is", DUGITE_PATH); } } + console.log("We're done! The final answer is ", DUGITE_PATH); return DUGITE_PATH; } From 64c822d95f3a2e572b431a91c06b2c439769fa9b Mon Sep 17 00:00:00 2001 From: Michelle Tilley Date: Tue, 4 Apr 2017 22:01:00 -0700 Subject: [PATCH 13/16] Extract PrInfoByBranchRoute into routes --- lib/controllers/pr-info-controller.js | 22 +--------------------- lib/routes/pr-info-by-branch-route.js | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 21 deletions(-) create mode 100644 lib/routes/pr-info-by-branch-route.js diff --git a/lib/controllers/pr-info-controller.js b/lib/controllers/pr-info-controller.js index 922fcfa130..c335eb05a2 100644 --- a/lib/controllers/pr-info-controller.js +++ b/lib/controllers/pr-info-controller.js @@ -1,33 +1,13 @@ import React from 'react'; -import Relay from 'react-relay'; import {RemotePropType} from '../prop-types'; import RelayRootContainer from '../containers/relay-root-container'; import PrListContainer from '../containers/pr-list-container'; import GithubLoginView from '../views/github-login-view'; +import PrInfoByBranchRoute from '../routes/pr-info-by-branch-route'; import RelayNetworkLayerManager from '../relay-network-layer-manager'; import {UNAUTHENTICATED} from '../models/github-login-model'; -class PrInfoByBranchRoute extends Relay.Route { - static routeName = 'pr-info-route' - - static queries = { - query: (Component, variables) => Relay.QL` - query { - relay { - ${Component.getFragment('query', variables)} - } - } - `, - } - - static paramDefinitions = { - repoOwner: {required: true}, - repoName: {required: true}, - branchName: {required: true}, - } -} - export default class PrInfoController extends React.Component { static propTypes = { token: React.PropTypes.oneOfType([ diff --git a/lib/routes/pr-info-by-branch-route.js b/lib/routes/pr-info-by-branch-route.js new file mode 100644 index 0000000000..2f60d320d1 --- /dev/null +++ b/lib/routes/pr-info-by-branch-route.js @@ -0,0 +1,21 @@ +import Relay from 'react-relay'; + +export default class PrInfoByBranchRoute extends Relay.Route { + static routeName = 'pr-info-route' + + static queries = { + query: (Component, variables) => Relay.QL` + query { + relay { + ${Component.getFragment('query', variables)} + } + } + `, + } + + static paramDefinitions = { + repoOwner: {required: true}, + repoName: {required: true}, + branchName: {required: true}, + } +} From 2120a10f306e9e8951b1f303dd2fea0c64b2cc3f Mon Sep 17 00:00:00 2001 From: Michelle Tilley Date: Tue, 4 Apr 2017 22:07:40 -0700 Subject: [PATCH 14/16] We don't need these any more :fire: --- lib/helpers.js | 8 -------- 1 file changed, 8 deletions(-) diff --git a/lib/helpers.js b/lib/helpers.js index d0c285f654..9cdbdd5b41 100644 --- a/lib/helpers.js +++ b/lib/helpers.js @@ -22,25 +22,17 @@ let DUGITE_PATH; export function getDugitePath() { if (!DUGITE_PATH) { DUGITE_PATH = require.resolve('dugite'); - console.log("require.resolve says it's", DUGITE_PATH); if (!path.isAbsolute(DUGITE_PATH)) { - console.log("but it's not absolute! (cause we're snapshotted mebbe)"); // Assume we're snapshotted const {resourcePath} = atom.getLoadSettings(); - console.log('atom says our resource path is', resourcePath); if (path.extname(resourcePath) === '.asar') { DUGITE_PATH = path.join(`${resourcePath}.unpacked`, 'node_modules', 'dugite'); - console.log("we're in an asar, so it's", DUGITE_PATH); } else { DUGITE_PATH = path.join(resourcePath, 'node_modules', 'dugite'); - console.log("but since we're not using asar it's", DUGITE_PATH); } - } else { - console.log("and it's absolute so the answer is", DUGITE_PATH); } } - console.log("We're done! The final answer is ", DUGITE_PATH); return DUGITE_PATH; } From d1ffecde5b880d3d50afd5e15d86ea8d848092d4 Mon Sep 17 00:00:00 2001 From: Michelle Tilley Date: Tue, 4 Apr 2017 23:21:29 -0700 Subject: [PATCH 15/16] Defer GithubLoginModel strategy validation test --- lib/models/github-login-model.js | 18 ++++++++++++++---- test/models/github-login-model.test.js | 6 +++--- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/lib/models/github-login-model.js b/lib/models/github-login-model.js index ea5a590689..bc3320c8a3 100644 --- a/lib/models/github-login-model.js +++ b/lib/models/github-login-model.js @@ -107,12 +107,22 @@ export default class GithubLoginModel { return instance; } - constructor(Strategy = strategies.find(strat => strat.isValid())) { + constructor(Strategy) { + this._Strategy = Strategy; + this._strategy = null; this.emitter = new Emitter(); - if (!Strategy) { - throw new Error('None of the listed GithubLoginModel strategies returned true for `isValid`'); + } + + get strategy() { + if (!this._strategy) { + const Strategy = this._Strategy || strategies.find(strat => strat.isValid()); + if (!Strategy) { + throw new Error('None of the listed GithubLoginModel strategies returned true for `isValid`'); + } + this._strategy = new Strategy(); } - this.strategy = new Strategy(); + + return this._strategy; } async getToken(account) { diff --git a/test/models/github-login-model.test.js b/test/models/github-login-model.test.js index 193ed6ebd9..83f3f442f5 100644 --- a/test/models/github-login-model.test.js +++ b/test/models/github-login-model.test.js @@ -1,9 +1,9 @@ import GithubLoginModel, {KeytarStrategy, SecurityBinaryStrategy, InMemoryStrategy, UNAUTHENTICATED} from '../../lib/models/github-login-model'; describe('GithubLoginModel', function() { - [KeytarStrategy, SecurityBinaryStrategy, InMemoryStrategy].forEach(function(Strategy) { - if (Strategy.isValid()) { - describe(Strategy.name, function() { + [null, KeytarStrategy, SecurityBinaryStrategy, InMemoryStrategy].forEach(function(Strategy) { + if (!Strategy || Strategy.isValid()) { + describe((Strategy && Strategy.name) || 'default strategy', function() { it('manages passwords', async function() { const loginModel = new GithubLoginModel(Strategy); const callback = sinon.stub(); From 9ad8629a105278622866171b0ba903ae143caadf Mon Sep 17 00:00:00 2001 From: Michelle Tilley Date: Thu, 6 Apr 2017 00:57:00 -0700 Subject: [PATCH 16/16] Create GithubPackage instance in `initialize` package hook This ensures that the instance is available before any consume* or deserialize* hooks are called --- lib/index.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/index.js b/lib/index.js index a729750492..78aa55e7aa 100644 --- a/lib/index.js +++ b/lib/index.js @@ -3,11 +3,14 @@ import GithubPackage from './github-package'; let pack; const entry = { activate(...args) { + pack.activate(...args); + }, + + initialize() { pack = new GithubPackage( atom.workspace, atom.project, atom.commands, atom.notifications, atom.tooltips, atom.styles, atom.config, atom.confirm.bind(atom), ); - pack.activate(...args); }, };