From 9a8225a745f0d1b0a6524fdc1d0a751aa6830bcf Mon Sep 17 00:00:00 2001 From: Denis Malinochkin Date: Thu, 5 Nov 2015 16:03:16 +0300 Subject: [PATCH 01/14] Support Windows & Linux - Remove menubar --- Gruntfile.js | 2 +- main.js | 67 ++++++++++++++++++++++++++++++++++------------------ package.json | 9 +++---- 3 files changed, 50 insertions(+), 28 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index d76f48421..b2e81b33e 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,7 +29,7 @@ module.exports = function(grunt) { watch: { less: { files: 'src/less/*', - tasks: ['less'], + tasks: ['less'] } }, diff --git a/main.js b/main.js index 8881280d2..e90f202b4 100644 --- a/main.js +++ b/main.js @@ -2,24 +2,34 @@ const electron = require('electron'); const app = electron.app; const ipc = electron.ipcMain; +const BrowserWindow = electron.BrowserWindow; +const Menu = electron.Menu; +const Tray = electron.Tray; + var path = require('path'); var ghReleases = require('electron-gh-releases'); require('crash-reporter').start(); -var Menu = require('menu'); -var Tray = require('tray'); var AutoLaunch = require('auto-launch'); -var BrowserWindow = require('browser-window'); var dialog = require('dialog'); +// Status icons var iconIdle = path.join(__dirname, 'images', 'tray-idleTemplate.png'); var iconActive = path.join(__dirname, 'images', 'tray-active.png'); -var autoStart = new AutoLaunch({ - name: 'Gitify', - path: process.execPath.match(/.*?\.app/)[0] -}); +// Utilities +var isLinux = (process.platform === 'linux'); +var isDarwin = (process.platform === 'darwin'); +// var isWindows = (process.platform === 'win32'); + +// The auto-start module does not support Linux +if (!isLinux) { + var autoStart = new AutoLaunch({ + name: 'Gitify', + path: process.execPath.match(/.*?\.app/) + }); +} app.on('ready', function() { var appIcon = new Tray(iconIdle); @@ -55,7 +65,10 @@ app.on('ready', function() { appIcon.window.setVisibleOnAllWorkspaces(true); initMenu(); - checkAutoUpdate(false); + + if (!isLinux) { + checkAutoUpdate(false); + } } function showWindow (bounds) { @@ -106,8 +119,7 @@ app.on('ready', function() { appIcon.window.hide(); } - function checkAutoUpdate(showAlert) { - + function checkAutoUpdate (showAlert) { var autoUpdateOptions = { repo: 'ekonstantinidis/gitify', currentVersion: app.getVersion() @@ -115,12 +127,12 @@ app.on('ready', function() { var update = new ghReleases(autoUpdateOptions, function (autoUpdater) { autoUpdater - .on('error', function(event, message) { + .on('error', function (event, message) { console.log('ERRORED.'); console.log('Event: ' + JSON.stringify(event) + '. MESSAGE: ' + message); }) .on('update-downloaded', function (event, releaseNotes, releaseName, - releaseDate, updateUrl, quitAndUpdate) { + releaseDate, updateUrl, quitAndUpdate) { console.log('Update downloaded'); confirmAutoUpdate(quitAndUpdate); }); @@ -137,7 +149,10 @@ app.on('ready', function() { message: 'You are currently running the latest version of Gitify.' }); } - app.dock.hide(); + + if (isDarwin) { + app.dock.hide(); + } } if (!err && status) { @@ -146,7 +161,7 @@ app.on('ready', function() { }); } - function confirmAutoUpdate(quitAndUpdate) { + function confirmAutoUpdate (quitAndUpdate) { dialog.showMessageBox({ type: 'question', buttons: ['Update & Restart', 'Cancel'], @@ -155,18 +170,20 @@ app.on('ready', function() { message: 'There is an update available. Would you like to update Gitify now?' }, function (response) { console.log('Exit: ' + response); - app.dock.hide(); + if (isDarwin) { + app.dock.hide(); + } if (response === 0) { quitAndUpdate(); } } ); } - ipc.on('reopen-window', function() { + ipc.on('reopen-window', function () { showWindow(); }); - ipc.on('update-icon', function(event, arg) { + ipc.on('update-icon', function (event, arg) { if (arg === 'TrayActive') { appIcon.setImage(iconActive); } else { @@ -174,19 +191,23 @@ app.on('ready', function() { } }); - ipc.on('startup-enable', function() { - autoStart.enable(); + ipc.on('startup-enable', function () { + if (!isLinux) { + autoStart.enable(); + } }); - ipc.on('startup-disable', function() { - autoStart.disable(); + ipc.on('startup-disable', function () { + if (!isLinux) { + autoStart.disable(); + } }); - ipc.on('check-update', function() { + ipc.on('check-update', function () { checkAutoUpdate(true); }); - ipc.on('app-quit', function() { + ipc.on('app-quit', function () { app.quit(); }); diff --git a/package.json b/package.json index 4f9baa8b2..7bda12f05 100644 --- a/package.json +++ b/package.json @@ -8,12 +8,13 @@ "build": "ulimit -n 512 && npm install && grunt build && npm run build-js", "watch-js": "watchify -t [ babelify --presets [ es2015 react ] ] src/js/app.js -o build/js/app.js -v", "watch": "npm run build && grunt build && npm run watch-js & grunt watch", - "start": "electron .", - "package": "electron-packager . Gitify --overwrite --platform=darwin --arch=x64 --version=0.35.4 --asar=true --icon=images/app-icon.icns --prune --ignore='src' --ignore='coverage'", "codesign": "bash scripts/codesign.bash", - "dist": "npm run package && npm run codesign", + "dist-osx": "electron-packager . Gitify --overwrite --platform=darwin --arch=x64 --version=0.34.2 --asar=true --icon=images/app-icon.icns --prune --out=dist --ignore='src' --ignore='^/dist$' --ignore='coverage' && bash scripts/codesign.bash", + "dist-linux": "electron-packager . Gitify --overwrite --platform=linux --arch=x64 --version=0.34.2 --asar=true --icon=images/app-icon.icns --prune --out=dist --ignore='src' --ignore='^/dist$' --ignore='coverage'", + "dist-windows": "electron-packager . Gitify --overwrite --platform=win32 --arch=x64 --version=0.34.2 --asar=true --icon=images/app-icon.icns --prune --out=dist --ignore='src' --ignore='^/dist$' --ignore='coverage'", "lint": "eslint 'src/js/' 'src/js/app.js' 'main.js'", - "test": "npm run lint && jest --config=jest-config.json" + "test": "npm run lint && jest --config=jest-config.json", + "start": "electron . --enable-logging" }, "repository": { "type": "git", From 59eca0ba517d25af979dc5145a486828414aef2d Mon Sep 17 00:00:00 2001 From: Emmanouil Konstantinidis Date: Mon, 7 Dec 2015 21:16:43 +0000 Subject: [PATCH 02/14] Remove path for autoStart --- main.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/main.js b/main.js index e90f202b4..208f73f7f 100644 --- a/main.js +++ b/main.js @@ -26,8 +26,7 @@ var isDarwin = (process.platform === 'darwin'); // The auto-start module does not support Linux if (!isLinux) { var autoStart = new AutoLaunch({ - name: 'Gitify', - path: process.execPath.match(/.*?\.app/) + name: 'Gitify' }); } From 1070a12994ebe783a4c807a198b1c6178152ab9d Mon Sep 17 00:00:00 2001 From: Emmanouil Konstantinidis Date: Mon, 7 Dec 2015 21:17:48 +0000 Subject: [PATCH 03/14] Update electron version in dist scripts --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 7bda12f05..85a3a9c2b 100644 --- a/package.json +++ b/package.json @@ -9,9 +9,9 @@ "watch-js": "watchify -t [ babelify --presets [ es2015 react ] ] src/js/app.js -o build/js/app.js -v", "watch": "npm run build && grunt build && npm run watch-js & grunt watch", "codesign": "bash scripts/codesign.bash", - "dist-osx": "electron-packager . Gitify --overwrite --platform=darwin --arch=x64 --version=0.34.2 --asar=true --icon=images/app-icon.icns --prune --out=dist --ignore='src' --ignore='^/dist$' --ignore='coverage' && bash scripts/codesign.bash", - "dist-linux": "electron-packager . Gitify --overwrite --platform=linux --arch=x64 --version=0.34.2 --asar=true --icon=images/app-icon.icns --prune --out=dist --ignore='src' --ignore='^/dist$' --ignore='coverage'", - "dist-windows": "electron-packager . Gitify --overwrite --platform=win32 --arch=x64 --version=0.34.2 --asar=true --icon=images/app-icon.icns --prune --out=dist --ignore='src' --ignore='^/dist$' --ignore='coverage'", + "dist-osx": "electron-packager . Gitify --overwrite --platform=darwin --arch=x64 --version=0.35.4 --asar=true --icon=images/app-icon.icns --prune --out=dist --ignore='src' --ignore='^/dist$' --ignore='coverage' && bash scripts/codesign.bash", + "dist-linux": "electron-packager . Gitify --overwrite --platform=linux --arch=x64 --version=0.35.4 --asar=true --icon=images/app-icon.icns --prune --out=dist --ignore='src' --ignore='^/dist$' --ignore='coverage'", + "dist-windows": "electron-packager . Gitify --overwrite --platform=win32 --arch=x64 --version=0.35.4 --asar=true --icon=images/app-icon.icns --prune --out=dist --ignore='src' --ignore='^/dist$' --ignore='coverage'", "lint": "eslint 'src/js/' 'src/js/app.js' 'main.js'", "test": "npm run lint && jest --config=jest-config.json", "start": "electron . --enable-logging" From 98b08f0f41e0d8b1622f9cf9f1fd8967919c4a10 Mon Sep 17 00:00:00 2001 From: Emmanouil Konstantinidis Date: Mon, 7 Dec 2015 21:46:07 +0000 Subject: [PATCH 04/14] Add Denis to Contributors @mrmlnc --- package.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 85a3a9c2b..cae695473 100644 --- a/package.json +++ b/package.json @@ -36,13 +36,17 @@ { "name": "Jake 'Sid' Smith", "url": "https://githib.com/JakeSidSmith" + }, + { + "name": "Denis Malinochkin", + "url": "https://github.com/mrmlnc" } ], "license": "MIT", "bugs": { "url": "https://github.com/ekonstantinidis/gitify/issues" }, - "homepage": "https://github.com/ekonstantinidis/gitify", + "homepage": "https://www.gitify.io/", "dependencies": { "auto-launch": "=1.0.1", "bootstrap": "=3.3.6", From 3be2af605b4814f0d865f6bf99fb45c0567202af Mon Sep 17 00:00:00 2001 From: Emmanouil Konstantinidis Date: Tue, 8 Dec 2015 17:43:47 +0000 Subject: [PATCH 05/14] Windows Ico --- .gitignore | 1 + images/app-icon.ico | Bin 0 -> 370070 bytes package.json | 2 +- 3 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 images/app-icon.ico diff --git a/.gitignore b/.gitignore index 8443f2974..6d37409b5 100644 --- a/.gitignore +++ b/.gitignore @@ -3,5 +3,6 @@ npm-debug.log build/ coverage/ +dist/ node_modules/ Gitify-darwin-x64/ diff --git a/images/app-icon.ico b/images/app-icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..d48a4b695a009c0aaa49d137d9953f1204428d99 GIT binary patch literal 370070 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 literal 0 HcmV?d00001 diff --git a/package.json b/package.json index cae695473..874fd05c1 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "codesign": "bash scripts/codesign.bash", "dist-osx": "electron-packager . Gitify --overwrite --platform=darwin --arch=x64 --version=0.35.4 --asar=true --icon=images/app-icon.icns --prune --out=dist --ignore='src' --ignore='^/dist$' --ignore='coverage' && bash scripts/codesign.bash", "dist-linux": "electron-packager . Gitify --overwrite --platform=linux --arch=x64 --version=0.35.4 --asar=true --icon=images/app-icon.icns --prune --out=dist --ignore='src' --ignore='^/dist$' --ignore='coverage'", - "dist-windows": "electron-packager . Gitify --overwrite --platform=win32 --arch=x64 --version=0.35.4 --asar=true --icon=images/app-icon.icns --prune --out=dist --ignore='src' --ignore='^/dist$' --ignore='coverage'", + "dist-windows": "electron-packager . Gitify --overwrite --platform=win32 --arch=x64 --version=0.35.4 --asar=true --icon=images/app-icon.ico --prune --out=dist --ignore='src' --ignore='^/dist$' --ignore='coverage'", "lint": "eslint 'src/js/' 'src/js/app.js' 'main.js'", "test": "npm run lint && jest --config=jest-config.json", "start": "electron . --enable-logging" From 903b5ac167f00a30f32087ca72644e00f64420fe Mon Sep 17 00:00:00 2001 From: Emmanouil Konstantinidis Date: Tue, 8 Dec 2015 17:45:09 +0000 Subject: [PATCH 06/14] Support Releases --- src/js/components/notification.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/js/components/notification.js b/src/js/components/notification.js index c3b0f5f30..baffeda82 100644 --- a/src/js/components/notification.js +++ b/src/js/components/notification.js @@ -73,6 +73,9 @@ var NotificationItem = React.createClass({ } else if (this.props.notification.subject.type == 'Commit') { typeIconClass = 'octicon octicon-git-commit'; typeIconTooltip = 'Commit'; + } else if (this.props.notification.subject.type == 'Release') { + typeIconClass = 'octicon octicon-tag'; + typeIconTooltip = 'Release'; } else { typeIconClass = 'octicon octicon-question'; typeIconTooltip = ''; From 3983801e6908b4efd08e559f52c6b675e8a09a40 Mon Sep 17 00:00:00 2001 From: Emmanouil Konstantinidis Date: Tue, 8 Dec 2015 23:03:55 +0000 Subject: [PATCH 07/14] Fix code sign path --- scripts/codesign.bash | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/codesign.bash b/scripts/codesign.bash index 224df5f9d..085368b5c 100644 --- a/scripts/codesign.bash +++ b/scripts/codesign.bash @@ -1 +1 @@ -codesign --verbose --deep --force --sign "Developer ID Application: Emmanouil KONSTANTINIDIS" Gitify-darwin-x64/Gitify.app +codesign --verbose --deep --force --sign "Developer ID Application: Emmanouil KONSTANTINIDIS" dist/Gitify-darwin-x64/Gitify.app From a9d0d15ed5acfab1504a9465670ff0fc24c3ad79 Mon Sep 17 00:00:00 2001 From: Emmanouil Konstantinidis Date: Tue, 8 Dec 2015 23:24:01 +0000 Subject: [PATCH 08/14] Cashed bounds on notification click --- main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.js b/main.js index cb24fbd64..3c5c9d93d 100644 --- a/main.js +++ b/main.js @@ -176,7 +176,7 @@ app.on('ready', function() { } ipc.on('reopen-window', function () { - showWindow(); + showWindow(cachedBounds); }); ipc.on('update-icon', function (event, arg) { From 9195ddaf950d210f1374f7dda37235df7e81f057 Mon Sep 17 00:00:00 2001 From: Emmanouil Konstantinidis Date: Wed, 9 Dec 2015 21:29:59 +0000 Subject: [PATCH 09/14] Better packaging --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 19e928cad..bc964be6a 100644 --- a/package.json +++ b/package.json @@ -9,9 +9,10 @@ "watch-js": "watchify -t [ babelify --presets [ es2015 react ] ] src/js/app.js -o build/js/app.js -v", "watch": "npm run build && grunt build && npm run watch-js & grunt watch", "codesign": "bash scripts/codesign.bash", - "dist-osx": "electron-packager . Gitify --overwrite --platform=darwin --arch=x64 --version=0.35.4 --asar=true --icon=images/app-icon.icns --prune --out=dist --ignore='src' --ignore='^/dist$' --ignore='coverage' && bash scripts/codesign.bash", + "dist-osx": "electron-packager . Gitify --overwrite --platform=darwin --arch=x64 --version=0.35.4 --asar=true --icon=images/app-icon.icns --prune --out=dist --ignore='src' --ignore='^/dist$' --ignore='coverage'", "dist-linux": "electron-packager . Gitify --overwrite --platform=linux --arch=x64 --version=0.35.4 --asar=true --icon=images/app-icon.icns --prune --out=dist --ignore='src' --ignore='^/dist$' --ignore='coverage'", "dist-windows": "electron-packager . Gitify --overwrite --platform=win32 --arch=x64 --version=0.35.4 --asar=true --icon=images/app-icon.ico --prune --out=dist --ignore='src' --ignore='^/dist$' --ignore='coverage'", + "dist-all": "npm run dist-osx && bash scripts/codesign.bash && npm run dist-linux && npm run dist-windows", "lint": "eslint 'src/js/' 'src/js/app.js' 'main.js'", "test": "npm run lint && jest --config=jest-config.json", "start": "electron . --enable-logging" From 02b2b6a04ddfb540bfc352fd1295e83c9fe92cb7 Mon Sep 17 00:00:00 2001 From: Emmanouil Konstantinidis Date: Thu, 5 May 2016 23:08:52 +0100 Subject: [PATCH 10/14] Remove Gruntfile --- .gitignore | 1 - Gruntfile.js | 55 ---------------------------------------------------- 2 files changed, 56 deletions(-) delete mode 100644 Gruntfile.js diff --git a/.gitignore b/.gitignore index df777b05e..34cdbdb20 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,6 @@ .DS_Store npm-debug.log -dist/ coverage/ dist/ node_modules/ diff --git a/Gruntfile.js b/Gruntfile.js deleted file mode 100644 index b2e81b33e..000000000 --- a/Gruntfile.js +++ /dev/null @@ -1,55 +0,0 @@ -module.exports = function(grunt) { - - grunt.initConfig({ - - less: { - options: { - cleancss: true - }, - main: { - files: { - 'build/css/style.css': 'src/less/style.less' - } - } - }, - - copy: { - main: { - files: [ - {expand: true, cwd: 'src/fonts/', src: '**', dest: 'build/fonts/'}, - {expand: true, cwd: 'node_modules/bootstrap/fonts/', src: '**', dest: 'build/fonts/'}, - {expand: true, cwd: 'node_modules/font-awesome/fonts/', src: '**', dest: 'build/fonts/'}, - {expand: true, cwd: 'node_modules/octicons/octicons/', src: '*.eot', dest: 'build/fonts/'}, - {expand: true, cwd: 'node_modules/octicons/octicons/', src: 'octicons.woff', dest: 'build/fonts/'}, - {expand: true, cwd: 'node_modules/octicons/octicons/', src: '*.ttf', dest: 'build/fonts/'} - ] - } - }, - - watch: { - less: { - files: 'src/less/*', - tasks: ['less'] - } - }, - - clean: { - files: ['build/'] - } - - }); - - // Load the plugin that provides the 'uglify' task. - grunt.loadNpmTasks('grunt-contrib-less'); - grunt.loadNpmTasks('grunt-contrib-copy'); - grunt.loadNpmTasks('grunt-contrib-watch'); - grunt.loadNpmTasks('grunt-contrib-clean'); - - // Default task(s). - grunt.registerTask('default', ['build']); - grunt.registerTask('build', function () { - grunt.file.mkdir('build/js'); - grunt.task.run(['less', 'copy']); - }); - grunt.registerTask('release', ['clean', 'build']); -}; From 680c660e7995f4b00886d4511c306499a0909450 Mon Sep 17 00:00:00 2001 From: Emmanouil Konstantinidis Date: Mon, 6 Jun 2016 02:52:32 +0100 Subject: [PATCH 11/14] Hide "Update" button if not darwin --- src/js/components/settings.js | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/js/components/settings.js b/src/js/components/settings.js index caf671bfb..95cbe3358 100644 --- a/src/js/components/settings.js +++ b/src/js/components/settings.js @@ -2,7 +2,9 @@ import React from 'react'; import { connect } from 'react-redux'; import Toggle from 'react-toggle'; -const ipcRenderer = window.require('electron').ipcRenderer; +const electron = window.require('electron'); +const remote = electron.remote; +const ipcRenderer =electron.ipcRenderer; import { fetchNotifications, updateSetting, logout } from '../actions'; @@ -33,21 +35,27 @@ export class SettingsPage extends React.Component { render() { const appVersion = require('../../../package.json').version; + const isDarwin = remote.process.platform === 'darwin'; const settings = this.props.settings; return (