From 11f8eba2c33d98638d710c34f221c027b7970939 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 10 Dec 2013 08:12:19 -0800 Subject: [PATCH 01/15] Add initial upload-release script --- package.json | 3 +- script/cibuild | 1 + script/upload-release | 80 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 83 insertions(+), 1 deletion(-) create mode 100755 script/upload-release diff --git a/package.json b/package.json index 6cb01ec6c..8fa7ea9e7 100644 --- a/package.json +++ b/package.json @@ -69,7 +69,8 @@ "request": "~2.27.0", "unzip": "~0.1.9", "rcedit": "~0.1.2", - "rimraf": "~2.2.2" + "rimraf": "~2.2.2", + "github-releases": "~0.2.0" }, "packageDependencies": { "atom-dark-syntax": "0.8.0", diff --git a/script/cibuild b/script/cibuild index c83d01c45..24474722d 100755 --- a/script/cibuild +++ b/script/cibuild @@ -33,6 +33,7 @@ cp.safeExec.bind(global, 'node script/bootstrap', function(error) { require('rimraf').bind(global, path.join(homeDir, '.atom')), cp.safeExec.bind(global, 'git clean -dff'), cp.safeExec.bind(global, 'node node_modules/grunt-cli/bin/grunt ci --stack --no-color'), + cp.safeExec.bind(global, 'node script/upload-release') ], function(error) { process.exit(error ? 1 : 0); }); diff --git a/script/upload-release b/script/upload-release new file mode 100755 index 000000000..5a46e0363 --- /dev/null +++ b/script/upload-release @@ -0,0 +1,80 @@ +#!/usr/bin/env node + +console.log(process.env); + +return + +var child_process = require('child_process'); +var fs = require('fs'); +var path = require ('path'); + +var GitHub = require('github-releases'); +var request = require('request'); + +var assetPath = '/tmp/atom-build/atom-mac-prerelease.zip'; +var token = process.env.ATOM_ACCESS_TOKEN; + +var zipApp = function(callback) { + if (fs.existsSync(assetPath)) + fs.unlinkSync(assetPath) + + var options = { + cwd: path.dirname(assetPath), + maxBuffer: Infinity + }; + child_process.exec('zip -r --symlinks atom-mac.zip Atom.app', options, function(error, stdout, stderr) { + if (error) { + console.error('Zipping Atom.app failed', error, stderr); + process.exit(1); + } else + callback(); + }); +}; + +var getDraftRelease = function(callback) { + var github = new GitHub({repo: 'atom/atom', token: token}); + github.getReleases(function(error, releases) { + if (error) { + console.error('Fetching releases failed', error.message, error.stack); + process.exit(1); + } + + if (!releases || releases.length === 0) { + console.error('No releases found in atom/atom repo'); + process.exit(1); + } + + var release = null; + for (var i = 0; i < releases.length; i++) { + release = releases[i]; + if (release.draft) { + callback(release); + return; + } + } + + console.error('No draft release found in atom/atom repo'); + process.exit(1); + }) +}; + +var uploadAsset = function() { + getDraftRelease(function(release) { + var options = { + uri: "https://uploads.github.com/repos/atom/atom/releases/" + release.id + "/assets?name=" + path.basename(assetPath), + method: 'POST', + headers: { + Authorization: 'token ' + token, + 'Content-Type': 'application/zip', + 'Content-Length': fs.statSync(assetPath).size + } + }; + var upload = request(options, function(error, response, body) { + if (error || response.statusCode >= 400) + console.error('Upload release asset failed', error, body); + }); + fs.createReadStream(assetPath).pipe(upload); + }); +} + +zipApp(uploadAsset); From 4705e382bfd3443db59ebef06fd5e84b414f657f Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 10 Dec 2013 08:22:06 -0800 Subject: [PATCH 02/15] Convert script/upload-release to CoffeeScript --- script/cibuild | 2 +- script/upload-release | 114 +++++++++++++++++------------------------- 2 files changed, 48 insertions(+), 68 deletions(-) diff --git a/script/cibuild b/script/cibuild index 24474722d..ff7a154b9 100755 --- a/script/cibuild +++ b/script/cibuild @@ -33,7 +33,7 @@ cp.safeExec.bind(global, 'node script/bootstrap', function(error) { require('rimraf').bind(global, path.join(homeDir, '.atom')), cp.safeExec.bind(global, 'git clean -dff'), cp.safeExec.bind(global, 'node node_modules/grunt-cli/bin/grunt ci --stack --no-color'), - cp.safeExec.bind(global, 'node script/upload-release') + cp.safeExec.bind(global, 'node_modules/.bin/coffee script/upload-release') ], function(error) { process.exit(error ? 1 : 0); }); diff --git a/script/upload-release b/script/upload-release index 5a46e0363..048ae254b 100755 --- a/script/upload-release +++ b/script/upload-release @@ -1,80 +1,60 @@ -#!/usr/bin/env node +#!/usr/bin/env coffee -console.log(process.env); +if process.env.JANKY_SHA1 and process.env.JANKY_BRANCH isnt 'ks-upload-release' + return -return +child_process = require 'child_process' +fs = require 'fs' +path = require 'path' -var child_process = require('child_process'); -var fs = require('fs'); -var path = require ('path'); +GitHub = require 'github-releases' +request = require 'request' -var GitHub = require('github-releases'); -var request = require('request'); +assetPath = '/tmp/atom-build/atom-mac-prerelease.zip' +token = process.env.ATOM_ACCESS_TOKEN -var assetPath = '/tmp/atom-build/atom-mac-prerelease.zip'; -var token = process.env.ATOM_ACCESS_TOKEN; +zipApp = (callback) -> + fs.unlinkSync(assetPath) if fs.existsSync(assetPath) -var zipApp = function(callback) { - if (fs.existsSync(assetPath)) - fs.unlinkSync(assetPath) + options = {cwd: path.dirname(assetPath), maxBuffer: Infinity} + child_process.exec 'zip -r --symlinks atom-mac.zip Atom.app', options, (error, stdout, stderr) -> + if error? + console.error('Zipping Atom.app failed', error, stderr) + process.exit(1) + else + callback() - var options = { - cwd: path.dirname(assetPath), - maxBuffer: Infinity - }; - child_process.exec('zip -r --symlinks atom-mac.zip Atom.app', options, function(error, stdout, stderr) { - if (error) { - console.error('Zipping Atom.app failed', error, stderr); - process.exit(1); - } else - callback(); - }); -}; +getDraftRelease = (callback) -> + github = new GitHub({repo: 'atom/atom', token: token}) + github.getReleases (error, releases=[]) -> + if error? + console.error('Fetching releases failed', error.message, error.stack) + process.exit(1) -var getDraftRelease = function(callback) { - var github = new GitHub({repo: 'atom/atom', token: token}); - github.getReleases(function(error, releases) { - if (error) { - console.error('Fetching releases failed', error.message, error.stack); - process.exit(1); - } + if releases.length is 0 + console.error('No releases found in atom/atom repo') + process.exit(1) - if (!releases || releases.length === 0) { - console.error('No releases found in atom/atom repo'); - process.exit(1); - } + for release in releases when release.draft + callback(release) + return - var release = null; - for (var i = 0; i < releases.length; i++) { - release = releases[i]; - if (release.draft) { - callback(release); - return; - } - } + console.error('No draft release found in atom/atom repo') + process.exit(1) - console.error('No draft release found in atom/atom repo'); - process.exit(1); - }) -}; - -var uploadAsset = function() { - getDraftRelease(function(release) { - var options = { - uri: "https://uploads.github.com/repos/atom/atom/releases/" + release.id + "/assets?name=" + path.basename(assetPath), - method: 'POST', - headers: { - Authorization: 'token ' + token, - 'Content-Type': 'application/zip', +uploadAsset = -> + getDraftRelease (release) -> + options = + uri: "https://uploads.github.com/repos/atom/atom/releases/#{release.id}/assets?name=#{path.basename(assetPath)}" + method: 'POST' + headers: + Authorization: "token #{token}" + 'Content-Type': 'application/zip' 'Content-Length': fs.statSync(assetPath).size - } - }; - var upload = request(options, function(error, response, body) { - if (error || response.statusCode >= 400) - console.error('Upload release asset failed', error, body); - }); - fs.createReadStream(assetPath).pipe(upload); - }); -} -zipApp(uploadAsset); + upload = request options, (error, response, body) -> + if error or response.statusCode >= 400 + console.error('Upload release asset failed', error, body) + fs.createReadStream(assetPath).pipe(upload) + +zipApp(uploadAsset) From 96d38d725287a9a351208b9f021ff74f2f12899d Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 10 Dec 2013 08:22:59 -0800 Subject: [PATCH 03/15] :lipstick: Use return unless --- script/upload-release | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/script/upload-release b/script/upload-release index 048ae254b..3ec5f8653 100755 --- a/script/upload-release +++ b/script/upload-release @@ -1,7 +1,6 @@ #!/usr/bin/env coffee -if process.env.JANKY_SHA1 and process.env.JANKY_BRANCH isnt 'ks-upload-release' - return +return unless process.env.JANKY_SHA1 and process.env.JANKY_BRANCH is 'ks-upload-release' child_process = require 'child_process' fs = require 'fs' From 2a51eb76144af473a21a872216dbb8224f5be008 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 10 Dec 2013 08:24:03 -0800 Subject: [PATCH 04/15] Remove unneeded key name --- script/upload-release | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/upload-release b/script/upload-release index 3ec5f8653..9e2e6135a 100755 --- a/script/upload-release +++ b/script/upload-release @@ -24,7 +24,7 @@ zipApp = (callback) -> callback() getDraftRelease = (callback) -> - github = new GitHub({repo: 'atom/atom', token: token}) + github = new GitHub({repo: 'atom/atom', token}) github.getReleases (error, releases=[]) -> if error? console.error('Fetching releases failed', error.message, error.stack) From a9d1afdf65c6bc285fdf5df54ad71adb2c6a2959 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 10 Dec 2013 08:24:42 -0800 Subject: [PATCH 05/15] Rename upload variable to assetRequest --- script/upload-release | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/script/upload-release b/script/upload-release index 9e2e6135a..e174b2af8 100755 --- a/script/upload-release +++ b/script/upload-release @@ -51,9 +51,9 @@ uploadAsset = -> 'Content-Type': 'application/zip' 'Content-Length': fs.statSync(assetPath).size - upload = request options, (error, response, body) -> + assetRequest = request options, (error, response, body) -> if error or response.statusCode >= 400 console.error('Upload release asset failed', error, body) - fs.createReadStream(assetPath).pipe(upload) + fs.createReadStream(assetPath).pipe(assetRequest) zipApp(uploadAsset) From 90802e372588562921e36977f73de7d75dd9a6f2 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 10 Dec 2013 08:25:10 -0800 Subject: [PATCH 06/15] Check for error being null and default body to empty string --- script/upload-release | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/script/upload-release b/script/upload-release index e174b2af8..a02537069 100755 --- a/script/upload-release +++ b/script/upload-release @@ -51,8 +51,8 @@ uploadAsset = -> 'Content-Type': 'application/zip' 'Content-Length': fs.statSync(assetPath).size - assetRequest = request options, (error, response, body) -> - if error or response.statusCode >= 400 + assetRequest = request options, (error, response, body='') -> + if error? or response.statusCode >= 400 console.error('Upload release asset failed', error, body) fs.createReadStream(assetPath).pipe(assetRequest) From 4af71391a60101108cdac2354006e8a18deb2bf7 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 10 Dec 2013 08:31:22 -0800 Subject: [PATCH 07/15] Use basename of assetPath in zip command --- script/upload-release | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/upload-release b/script/upload-release index a02537069..964b6167f 100755 --- a/script/upload-release +++ b/script/upload-release @@ -16,7 +16,7 @@ zipApp = (callback) -> fs.unlinkSync(assetPath) if fs.existsSync(assetPath) options = {cwd: path.dirname(assetPath), maxBuffer: Infinity} - child_process.exec 'zip -r --symlinks atom-mac.zip Atom.app', options, (error, stdout, stderr) -> + child_process.exec "zip -r --symlinks #{path.basename(assetPath)} Atom.app", options, (error, stdout, stderr) -> if error? console.error('Zipping Atom.app failed', error, stderr) process.exit(1) From 8c1d49c703d09020c176c95d5c75b9aed989cca5 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 10 Dec 2013 08:38:44 -0800 Subject: [PATCH 08/15] Exit with 1 when upload fails --- script/upload-release | 1 + 1 file changed, 1 insertion(+) diff --git a/script/upload-release b/script/upload-release index 964b6167f..00187280d 100755 --- a/script/upload-release +++ b/script/upload-release @@ -54,6 +54,7 @@ uploadAsset = -> assetRequest = request options, (error, response, body='') -> if error? or response.statusCode >= 400 console.error('Upload release asset failed', error, body) + process.exit(1) fs.createReadStream(assetPath).pipe(assetRequest) zipApp(uploadAsset) From be0ebab841c35635b57210ff5c5f7bc963a734cf Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 10 Dec 2013 08:51:30 -0800 Subject: [PATCH 09/15] Delete existing before uploading new one --- script/upload-release | 50 +++++++++++++++++++++++++++++++------------ 1 file changed, 36 insertions(+), 14 deletions(-) diff --git a/script/upload-release b/script/upload-release index 00187280d..5b2829441 100755 --- a/script/upload-release +++ b/script/upload-release @@ -1,11 +1,11 @@ #!/usr/bin/env coffee -return unless process.env.JANKY_SHA1 and process.env.JANKY_BRANCH is 'ks-upload-release' +# return unless process.env.JANKY_SHA1 and process.env.JANKY_BRANCH is 'ks-upload-release' child_process = require 'child_process' -fs = require 'fs' path = require 'path' +fs = require 'fs-plus' GitHub = require 'github-releases' request = require 'request' @@ -13,7 +13,7 @@ assetPath = '/tmp/atom-build/atom-mac-prerelease.zip' token = process.env.ATOM_ACCESS_TOKEN zipApp = (callback) -> - fs.unlinkSync(assetPath) if fs.existsSync(assetPath) + fs.removeSync(assetPath) options = {cwd: path.dirname(assetPath), maxBuffer: Infinity} child_process.exec "zip -r --symlinks #{path.basename(assetPath)} Atom.app", options, (error, stdout, stderr) -> @@ -41,20 +41,42 @@ getDraftRelease = (callback) -> console.error('No draft release found in atom/atom repo') process.exit(1) -uploadAsset = -> - getDraftRelease (release) -> +deleteExistingAsset = (release, callback) -> + for asset in release.assets when asset.name is path.basename(assetPath) options = - uri: "https://uploads.github.com/repos/atom/atom/releases/#{release.id}/assets?name=#{path.basename(assetPath)}" - method: 'POST' + uri: asset.url + method: 'DELETE' headers: Authorization: "token #{token}" - 'Content-Type': 'application/zip' - 'Content-Length': fs.statSync(assetPath).size - - assetRequest = request options, (error, response, body='') -> + 'User-Agent': 'Atom' + request options, (error, response, body='') -> if error? or response.statusCode >= 400 - console.error('Upload release asset failed', error, body) + console.error('Deleting existing release asset failed', error, body) process.exit(1) - fs.createReadStream(assetPath).pipe(assetRequest) + else + callback() -zipApp(uploadAsset) + return + + callback() + +uploadAsset = (release) -> + options = + uri: "https://uploads.github.com/repos/atom/atom/releases/#{release.id}/assets?name=#{path.basename(assetPath)}" + method: 'POST' + headers: + Authorization: "token #{token}" + 'Content-Type': 'application/zip' + 'Content-Length': fs.getSizeSync(assetPath) + 'User-Agent': 'Atom' + + assetRequest = request options, (error, response, body='') -> + if error? or response.statusCode >= 400 + console.error('Upload release asset failed', error, body) + process.exit(1) + fs.createReadStream(assetPath).pipe(assetRequest) + +getDraftRelease (release) -> + zipApp -> + deleteExistingAsset release, -> + uploadAsset(release) From 2d0ba3e1f98b54df386c50f27d75c528b20d234f Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 10 Dec 2013 08:51:55 -0800 Subject: [PATCH 10/15] Uncomment branch check --- script/upload-release | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/upload-release b/script/upload-release index 5b2829441..afcefc44c 100755 --- a/script/upload-release +++ b/script/upload-release @@ -1,6 +1,6 @@ #!/usr/bin/env coffee -# return unless process.env.JANKY_SHA1 and process.env.JANKY_BRANCH is 'ks-upload-release' +return unless process.env.JANKY_SHA1 and process.env.JANKY_BRANCH is 'ks-upload-release' child_process = require 'child_process' path = require 'path' From 3d8e304b1cb720aaeaf641b3d266b72d4c2ced59 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 10 Dec 2013 08:54:40 -0800 Subject: [PATCH 11/15] Allow script/upload-release to be called directly --- script/upload-release | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/upload-release b/script/upload-release index afcefc44c..d744bc39b 100755 --- a/script/upload-release +++ b/script/upload-release @@ -1,6 +1,6 @@ #!/usr/bin/env coffee -return unless process.env.JANKY_SHA1 and process.env.JANKY_BRANCH is 'ks-upload-release' +return if process.env.JANKY_SHA1 and process.env.JANKY_BRANCH isnt 'ks-upload-release' child_process = require 'child_process' path = require 'path' From f3f94a2af0d3ca71dea24df0541adb6d61eb40dc Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 10 Dec 2013 12:59:32 -0800 Subject: [PATCH 12/15] Drop prerelease from asset name --- script/upload-release | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/upload-release b/script/upload-release index d744bc39b..bb2fb9147 100755 --- a/script/upload-release +++ b/script/upload-release @@ -9,7 +9,7 @@ fs = require 'fs-plus' GitHub = require 'github-releases' request = require 'request' -assetPath = '/tmp/atom-build/atom-mac-prerelease.zip' +assetPath = '/tmp/atom-build/atom-mac.zip' token = process.env.ATOM_ACCESS_TOKEN zipApp = (callback) -> From e1a1a7efc9f26c93df82bd346bf8b253bcee3ac2 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 10 Dec 2013 13:24:02 -0800 Subject: [PATCH 13/15] Log what release is being uploaded to --- script/upload-release | 2 ++ 1 file changed, 2 insertions(+) diff --git a/script/upload-release b/script/upload-release index bb2fb9147..635da1c4d 100755 --- a/script/upload-release +++ b/script/upload-release @@ -2,6 +2,7 @@ return if process.env.JANKY_SHA1 and process.env.JANKY_BRANCH isnt 'ks-upload-release' + child_process = require 'child_process' path = require 'path' @@ -77,6 +78,7 @@ uploadAsset = (release) -> fs.createReadStream(assetPath).pipe(assetRequest) getDraftRelease (release) -> + console.log("Uploading #{path.basename(assetPath)} asset to #{release.name} release") zipApp -> deleteExistingAsset release, -> uploadAsset(release) From 2141d06f6149d863da5921380962fbcb50826aee Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 10 Dec 2013 13:33:31 -0800 Subject: [PATCH 14/15] Upload master builds only --- script/upload-release | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/script/upload-release b/script/upload-release index 635da1c4d..9401cfc45 100755 --- a/script/upload-release +++ b/script/upload-release @@ -1,7 +1,6 @@ #!/usr/bin/env coffee -return if process.env.JANKY_SHA1 and process.env.JANKY_BRANCH isnt 'ks-upload-release' - +return if process.env.JANKY_SHA1 and process.env.JANKY_BRANCH isnt 'master' child_process = require 'child_process' path = require 'path' From 163994340d90acdbc1d748471a1196780abc2534 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 10 Dec 2013 13:51:09 -0800 Subject: [PATCH 15/15] Log Atom release tag name --- script/upload-release | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/upload-release b/script/upload-release index 9401cfc45..5fea1c12a 100755 --- a/script/upload-release +++ b/script/upload-release @@ -77,7 +77,7 @@ uploadAsset = (release) -> fs.createReadStream(assetPath).pipe(assetRequest) getDraftRelease (release) -> - console.log("Uploading #{path.basename(assetPath)} asset to #{release.name} release") + console.log("Uploading #{path.basename(assetPath)} asset to #{release.tag_name} (#{release.name}) release") zipApp -> deleteExistingAsset release, -> uploadAsset(release)