From b35c0a6c13ae206032c57bf680beee6c46b352c0 Mon Sep 17 00:00:00 2001 From: Chien-hung Chen Date: Sun, 4 Jan 2015 10:23:48 +0800 Subject: [PATCH 01/72] show more info about file, change reporter api --- index.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/index.js b/index.js index fe7a9e9..5829092 100644 --- a/index.js +++ b/index.js @@ -9,8 +9,8 @@ jshint_simple_reporter = function (E) { return ' 1. ' + path.relative(process.cwd(), E.file) + ': line ' + E.error.line + ', col ' + E.error.character + ' *' + E.error.reason + '*'; }, -jscs_simple_reporter = function (E) { - return ' 1. ' + E.filename + ': line ' + E.line + ', col ' + E.column + ' *' + E.message + '*'; +jscs_simple_reporter = function (E, file) { + return ' 1. ' + path.relative(process.cwd(), file.path) + ': line ' + E.line + ', col ' + E.column + ' *' + E.message + '*'; }, commentToGithub = function (body, opt) { @@ -43,13 +43,13 @@ module.exports = function (options) { return through.obj(function (file, enc, callback) { if (file.jshint && !file.jshint.success && !file.jshint.ignored) { file.jshint.results.forEach(function (E) { - jshint_output.push(jshint_reporter(E)); + jshint_output.push(jshint_reporter(E, file)); }); } if (file.jscs && !file.jscs.success) { file.jscs.errors.forEach(function (E) { - jscs_output.push(jscs_reporter(E)); + jscs_output.push(jscs_reporter(E, file)); }); } From c0ea978637eed9888a82d8c3d090dbc0c015267b Mon Sep 17 00:00:00 2001 From: Zordius Chen Date: Sun, 4 Jan 2015 10:26:26 +0800 Subject: [PATCH 02/72] update doc for new reporter interface --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6785b25..870176c 100644 --- a/README.md +++ b/README.md @@ -57,13 +57,13 @@ Options }, // Provide your own jshint reporter, optional - jshint_reporter: function (E) { + jshint_reporter: function (E, file) { // gulp stream file object // refer to http://jshint.com/docs/reporters/ for E structure. return 'Error in ' + E.file + '!'; }, // Provide your own jscs reporter, optional - jscs_reporter: function (E) { + jscs_reporter: function (E, file) { // gulp stream file object // refer to https://github.com/jscs-dev/node-jscs/wiki/Error-Filters for E structure. return 'Error in ' + E.filename + '!'; } From 68b721c45c226c8f642a9cf9c9d8b5d1b9b0360c Mon Sep 17 00:00:00 2001 From: Zordius Chen Date: Sun, 4 Jan 2015 10:29:40 +0800 Subject: [PATCH 03/72] update doc , add jscs sample --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 870176c..9745651 100644 --- a/README.md +++ b/README.md @@ -25,11 +25,16 @@ Usage ```javascript var gulp = require('gulp'), + jshint = require('gulp-jshint'), + jscs = require('gulp-jscs'), github = require('gulp-github'); gulp.task('link_report_github', function () { return gulp.src('lib/*.js') .pipe(jshint()) + .pipe(jscs()).on('error', function (E) { + console.log(E.message); // This handled jscs stream error + }) .pipe(github(options)); }); From ae9b003d307891b7f2cc25919720b9ce1e8ee8d1 Mon Sep 17 00:00:00 2001 From: Zordius Chen Date: Sun, 4 Jan 2015 10:30:40 +0800 Subject: [PATCH 04/72] update doc --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9745651..ebb19a1 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ gulp.task('link_report_github', function () { .pipe(jscs()).on('error', function (E) { console.log(E.message); // This handled jscs stream error }) - .pipe(github(options)); + .pipe(github(options)); // comment issues in github PR! }); // Or, direct output your comment with same options From 71a2e9164e8c7f0a4d5b78077c4a7db51d1fd263 Mon Sep 17 00:00:00 2001 From: Zordius Chen Date: Sun, 4 Jan 2015 10:37:58 +0800 Subject: [PATCH 05/72] add jscs --- .jscsrc | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++++ gulpfile.js | 6 ++++++ package.json | 3 ++- 3 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 .jscsrc diff --git a/.jscsrc b/.jscsrc new file mode 100644 index 0000000..cbae44a --- /dev/null +++ b/.jscsrc @@ -0,0 +1,53 @@ +{ + "additionalRules": ["rules/disallow-dot-notation-for-keywords.js"], + "fileExtensions": [".js", ".jsx"], + "disallowMixedSpacesAndTabs": true, + "disallowNewlineBeforeBlockStatements": true, + "disallowPaddingNewlinesInBlocks": true, + "disallowSpaceAfterObjectKeys": true, + "disallowTrailingComma": true, + + "requireBlocksOnNewline": true, + "requireCamelCaseOrUpperCaseIdentifiers": "ignoreProperties", + "requireCapitalizedConstructors": true, + "requireCommaBeforeLineBreak": true, + "requireSpaceAfterKeywords": [ + "if", + "else", + "for", + "while", + "do", + "switch", + "return", + "try", + "catch" + ], + "requireSpaceAfterLineComment": true, + "requireSpaceBeforeBlockStatements": true, + "requireSpacesInConditionalExpression": { + "afterTest": true, + "beforeConsequent": true, + "afterConsequent": true, + "beforeAlternate": true + }, + "requireSpacesInAnonymousFunctionExpression": { + "beforeOpeningCurlyBrace": true + }, + "requireSpacesInFunctionExpression": { + "beforeOpeningCurlyBrace": true + }, + "requireSpacesInNamedFunctionExpression": { + "beforeOpeningCurlyBrace": true + }, + + "safeContextKeyword": ["self"], + + "validateIndentation": 4, + "validateJSDoc": { + "checkParamNames": true, + "checkRedundantParams": true, + "requireParamTypes": true, + "checkTypes": true + }, + "validateQuoteMarks": { "mark": "'", "escape": true } +} diff --git a/gulpfile.js b/gulpfile.js index f7de01c..86fcd9b 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -1,10 +1,16 @@ var gulp = require('gulp'), jshint = require('gulp-jshint'), + jscs = require('gulp-jscs'), github = require('./index'); gulp.task('default', function () { return gulp.src('*.js') .pipe(jshint()) + .pipe(jscs()) + .on('error', function (E) { + // skip messages, handle error + // console.log(E.message); + }) .pipe(github({ // Read http://docs.travis-ci.com/user/encryption-keys/ // travis encrypt GHTK=your_github_access_token diff --git a/package.json b/package.json index 41a0adf..7c95847 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,8 @@ }, "devDependencies": { "gulp": "3.8.10", - "gulp-jshint": "1.9.0" + "gulp-jshint": "1.9.0", + "gulp-jscs": "1.4.0" }, "engines": { "node": ">=0.8" From 40e2a9aae8f49d5ab25b3ad4a0f456578cc49332 Mon Sep 17 00:00:00 2001 From: Zordius Chen Date: Sun, 4 Jan 2015 10:42:00 +0800 Subject: [PATCH 06/72] refine rules --- .jscsrc | 2 -- gulpfile.js | 5 ++--- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/.jscsrc b/.jscsrc index cbae44a..eb0a3c4 100644 --- a/.jscsrc +++ b/.jscsrc @@ -8,8 +8,6 @@ "disallowTrailingComma": true, "requireBlocksOnNewline": true, - "requireCamelCaseOrUpperCaseIdentifiers": "ignoreProperties", - "requireCapitalizedConstructors": true, "requireCommaBeforeLineBreak": true, "requireSpaceAfterKeywords": [ "if", diff --git a/gulpfile.js b/gulpfile.js index 86fcd9b..54b946e 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -7,9 +7,8 @@ gulp.task('default', function () { return gulp.src('*.js') .pipe(jshint()) .pipe(jscs()) - .on('error', function (E) { - // skip messages, handle error - // console.log(E.message); + .on('error', function () { + // handle error, skip gulp-jscs messages }) .pipe(github({ // Read http://docs.travis-ci.com/user/encryption-keys/ From 4c44804a16710556b192926b06d6351d7c780d5f Mon Sep 17 00:00:00 2001 From: Chien-hung Chen Date: Mon, 5 Jan 2015 10:19:05 +0800 Subject: [PATCH 07/72] update license --- LICENSE.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE.txt b/LICENSE.txt index 38105bf..9c76d75 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,7 +1,7 @@ Copyrights for code authored by Yahoo! Inc. is licensed under the following terms: MIT License -Copyright (c) 2014 Yahoo! Inc. All Rights Reserved. +Copyright (c) 2014, 2015 Yahoo! Inc. All Rights Reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights From fcd297b14a502c4daefc4e3ae2aa430d6a31e9d5 Mon Sep 17 00:00:00 2001 From: Chien-hung Chen Date: Mon, 5 Jan 2015 10:33:10 +0800 Subject: [PATCH 08/72] rename github.commentToGithub to github.commentToPR --- README.md | 2 +- index.js | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index ebb19a1..eb37264 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ gulp.task('link_report_github', function () { }); // Or, direct output your comment with same options -github.commentToGithub('Yes! it works!!', options); +github.commentToPR('Yes! it works!!', options); ``` Options diff --git a/index.js b/index.js index 5829092..2b645f6 100644 --- a/index.js +++ b/index.js @@ -13,7 +13,7 @@ jscs_simple_reporter = function (E, file) { return ' 1. ' + path.relative(process.cwd(), file.path) + ': line ' + E.line + ', col ' + E.column + ' *' + E.message + '*'; }, -commentToGithub = function (body, opt) { +commentToPR = function (body, opt) { var GIT = new github(opt.git_option || { version: '3.0.0', headers: { @@ -65,11 +65,11 @@ module.exports = function (options) { if (opt.git_token && opt.git_repo && opt.git_prid) { pr_url = 'https://' + ((opt.git_option && opt.git_option.host) ? opt.git_option.host : 'github.com') + '/' + opt.git_repo + '/pull/' + opt.git_prid; if (jshint_output.length > 1) { - commentToGithub(jshint_output.join('\n'), opt); + commentToPR(jshint_output.join('\n'), opt); gutil.log('[gulp-github]', gutil.colors.bold((jshint_output.length - 1) + ' jshint issues were updated to ' + pr_url)); } if (jscs_output.length > 1) { - commentToGithub(jscs_output.join('\n'), opt); + commentToPR(jscs_output.join('\n'), opt); gutil.log('[gulp-github]', gutil.colors.bold((jscs_output.length - 1) + ' jscs issues were updated to ' + pr_url)); } } else { @@ -89,4 +89,4 @@ module.exports = function (options) { }); }; -module.exports.commentToGithub = commentToGithub; +module.exports.commentToPR = commentToPR; From 9fad1fe222a2d0c86027717d6bad6ca8e72f64d7 Mon Sep 17 00:00:00 2001 From: Chien-hung Chen Date: Mon, 5 Jan 2015 10:49:49 +0800 Subject: [PATCH 09/72] add github createStatus to commit support. not tested --- README.md | 7 ++++++- index.js | 40 +++++++++++++++++++++++++++++++++++++--- 2 files changed, 43 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index eb37264..7f25071 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ Options ```javascript { - // Required options: git_token, git_repo, git_prid + // Required options: git_token, git_repo // refer to https://help.github.com/articles/creating-an-access-token-for-command-line-use/ git_token: 'your_github_oauth_token', @@ -55,6 +55,11 @@ Options git_repo: 'zordius/test', git_prid: '1', + // create status to this commit, optional + git_sha: 00000000, + jshint_status: 'error', // Set status to error when jshint errors + jscs_status: 'failure', // Set status to failure when jscs errors + // when using github enterprise, optional git_option: { // refer to https://www.npmjs.com/package/github diff --git a/index.js b/index.js index 2b645f6..48d6576 100644 --- a/index.js +++ b/index.js @@ -13,7 +13,7 @@ jscs_simple_reporter = function (E, file) { return ' 1. ' + path.relative(process.cwd(), file.path) + ': line ' + E.line + ', col ' + E.column + ' *' + E.message + '*'; }, -commentToPR = function (body, opt) { +getGIT = function (opt) { var GIT = new github(opt.git_option || { version: '3.0.0', headers: { @@ -24,14 +24,28 @@ commentToPR = function (body, opt) { type: 'oauth', token: opt.git_token }); + return GIT; +}, - GIT.issues.createComment({ +commentToPR = function (body, opt) { + getGIT(opt).issues.createComment({ user: opt.git_repo.split('/')[0], repo: opt.git_repo.split('/')[1], number: opt.git_prid, body: body }); -}; +}, + +createStatusToCommit = function (state, opt) { + getGIT(opt).statuses.create({ + user: opt.git_repo.split('/')[0], + repo: opt.git_repo.split('/')[1], + sha: opt.sha, + state: state.state, + description: state.description, + context: state.context + }); +} module.exports = function (options) { var jshint_output = ['**Please fix these jshint issues first:**'], @@ -85,6 +99,26 @@ module.exports = function (options) { console.log('Please read gulp-github document: https://github.com/zordius/gulp-github'); } + if (opt.git_token && opt.git_repo && opt.git_sha) { + if (jshint_output.length > 1) { + if (opt.jshint_status) { + createStatusToCommit({ + state: opt.jshint_status, + description: (jshint_output.length - 1) + ' jshint issues found', + context: 'gulp-github/jshint' + }); + } + + if (opt.jscs_status) { + createStatusToCommit({ + state: opt.jscs_status, + description: (jscs_output.length - 1) + ' jscs issues found', + context: 'gulp-github/jscs' + }); + } + } + } + cb(); }); }; From 4cd1dde65717e6dd27e597f6615c8f58eb32b173 Mon Sep 17 00:00:00 2001 From: Chien-hung Chen Date: Mon, 5 Jan 2015 10:51:43 +0800 Subject: [PATCH 10/72] test --- gulpfile.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index 54b946e..1711300 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -16,7 +16,11 @@ gulp.task('default', function () { // Then save into your .travis.yml git_token: process.env.GHTK, git_repo: process.env.TRAVIS_REPO_SLUG, - git_prid: process.env.TRAVIS_PULL_REQUEST + git_prid: process.env.TRAVIS_PULL_REQUEST, + git_sha: process.env.TRAVIS_COMMIT, + + jshint_status: 'error', + jscs_status: 'failure', })) .pipe(jshint.reporter('fail')); -}); \ No newline at end of file +}); From 059ab89edbc7d773f4a0a32b8b2d58913cc20b5a Mon Sep 17 00:00:00 2001 From: Chien-hung Chen Date: Mon, 5 Jan 2015 10:53:13 +0800 Subject: [PATCH 11/72] fix missing opt --- index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/index.js b/index.js index 48d6576..77268b4 100644 --- a/index.js +++ b/index.js @@ -106,7 +106,7 @@ module.exports = function (options) { state: opt.jshint_status, description: (jshint_output.length - 1) + ' jshint issues found', context: 'gulp-github/jshint' - }); + }, opt); } if (opt.jscs_status) { @@ -114,7 +114,7 @@ module.exports = function (options) { state: opt.jscs_status, description: (jscs_output.length - 1) + ' jscs issues found', context: 'gulp-github/jscs' - }); + }, opt); } } } From d9bc05ebaabc33224fa01f5966edd38edd18716d Mon Sep 17 00:00:00 2001 From: Chien-hung Chen Date: Mon, 5 Jan 2015 11:05:21 +0800 Subject: [PATCH 12/72] fix naming --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index 77268b4..88c5731 100644 --- a/index.js +++ b/index.js @@ -40,7 +40,7 @@ createStatusToCommit = function (state, opt) { getGIT(opt).statuses.create({ user: opt.git_repo.split('/')[0], repo: opt.git_repo.split('/')[1], - sha: opt.sha, + sha: opt.git_sha, state: state.state, description: state.description, context: state.context From 1176a3df404c3963707d5226af20d7c0c476d25b Mon Sep 17 00:00:00 2001 From: Chien-hung Chen Date: Mon, 5 Jan 2015 11:10:35 +0800 Subject: [PATCH 13/72] jshint/jscs fix --- gulpfile.js | 2 +- index.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index 1711300..e244dfb 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -20,7 +20,7 @@ gulp.task('default', function () { git_sha: process.env.TRAVIS_COMMIT, jshint_status: 'error', - jscs_status: 'failure', + jscs_status: 'failure' })) .pipe(jshint.reporter('fail')); }); diff --git a/index.js b/index.js index 88c5731..0c43a61 100644 --- a/index.js +++ b/index.js @@ -45,7 +45,7 @@ createStatusToCommit = function (state, opt) { description: state.description, context: state.context }); -} +}; module.exports = function (options) { var jshint_output = ['**Please fix these jshint issues first:**'], From c99ec77ebad8f1bee8aa1f4fa36b1935e4f3bb79 Mon Sep 17 00:00:00 2001 From: Chien-hung Chen Date: Mon, 5 Jan 2015 11:14:18 +0800 Subject: [PATCH 14/72] refine doc --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 7f25071..2c12ffd 100644 --- a/README.md +++ b/README.md @@ -8,9 +8,10 @@ A gulp plugin to pipe contents to github pull request comments. Features -------- -* Write collected info then comment on a github pull request. * Collect gulp-jshint results. * Collect gulp-jscs results. +* Write collected info then comment on a github pull request. +* Update github pull request status based on collected info. * **TODO** Collect lcov result. Installation From 9917d507a4b0cd182172695fd00d3fc58a2cfa6c Mon Sep 17 00:00:00 2001 From: Chien-hung Chen Date: Mon, 5 Jan 2015 11:14:34 +0800 Subject: [PATCH 15/72] Release --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7c95847..bb51eae 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "gulp-github", - "version": "0.1.0", + "version": "0.2.0", "description": "A gulp plugin to pipe contents to github pull request comments.", "author": "Zordius ", "contributors": [ From c35c4f028662d9a26388f14e04c060a9a56c5dd7 Mon Sep 17 00:00:00 2001 From: Zordius Chen Date: Mon, 5 Jan 2015 11:20:40 +0800 Subject: [PATCH 16/72] fix for process.env.TRAVIS_PULL_REQUEST = 'false' issue --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index 0c43a61..6208f44 100644 --- a/index.js +++ b/index.js @@ -76,7 +76,7 @@ module.exports = function (options) { return cb(); } - if (opt.git_token && opt.git_repo && opt.git_prid) { + if (opt.git_token && opt.git_repo && opt.git_prid && (opt.git_prid !== 'false')) { pr_url = 'https://' + ((opt.git_option && opt.git_option.host) ? opt.git_option.host : 'github.com') + '/' + opt.git_repo + '/pull/' + opt.git_prid; if (jshint_output.length > 1) { commentToPR(jshint_output.join('\n'), opt); From ead090c692505a06b1017ff513cf4f2a4f795ba6 Mon Sep 17 00:00:00 2001 From: Zordius Chen Date: Mon, 5 Jan 2015 11:20:58 +0800 Subject: [PATCH 17/72] test --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index 6208f44..fafce3d 100644 --- a/index.js +++ b/index.js @@ -73,7 +73,7 @@ module.exports = function (options) { var pr_url; if ((jshint_output.length === 1) && (jscs_output.length === 1)) { - return cb(); + return cb() } if (opt.git_token && opt.git_repo && opt.git_prid && (opt.git_prid !== 'false')) { From dc65b66d36526f081a9647943ce95af6394d3e61 Mon Sep 17 00:00:00 2001 From: Zordius Chen Date: Mon, 5 Jan 2015 11:24:45 +0800 Subject: [PATCH 18/72] more doc --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 2c12ffd..7d0527b 100644 --- a/README.md +++ b/README.md @@ -82,3 +82,5 @@ Options ``` Check this sample gulpfile to see how to migrate this with travis CI. + +Check This PR to see live demo. Click on ✘ symbol before d9bc05e to see created status. From 3a17747f9eec8a0d6d250f9658bede7322ecb97c Mon Sep 17 00:00:00 2001 From: Zordius Chen Date: Mon, 5 Jan 2015 11:24:58 +0800 Subject: [PATCH 19/72] fix --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index fafce3d..6208f44 100644 --- a/index.js +++ b/index.js @@ -73,7 +73,7 @@ module.exports = function (options) { var pr_url; if ((jshint_output.length === 1) && (jscs_output.length === 1)) { - return cb() + return cb(); } if (opt.git_token && opt.git_repo && opt.git_prid && (opt.git_prid !== 'false')) { From 8c7b4ae30fadb3030e5f6251803ce856e26bf0bd Mon Sep 17 00:00:00 2001 From: Zordius Chen Date: Mon, 5 Jan 2015 11:26:40 +0800 Subject: [PATCH 20/72] more doc --- gulpfile.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index e244dfb..aa5cec6 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -19,8 +19,8 @@ gulp.task('default', function () { git_prid: process.env.TRAVIS_PULL_REQUEST, git_sha: process.env.TRAVIS_COMMIT, - jshint_status: 'error', - jscs_status: 'failure' + jshint_status: 'error', // Set status to error when jshint errors + jscs_status: 'failure' // Set status to failure when jscs errors })) .pipe(jshint.reporter('fail')); }); From f88a397c9515006687987597e7eb418760c36a32 Mon Sep 17 00:00:00 2001 From: Chien-hung Chen Date: Mon, 5 Jan 2015 12:22:17 +0800 Subject: [PATCH 21/72] fix jscs status report bug --- index.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/index.js b/index.js index 6208f44..c03eac1 100644 --- a/index.js +++ b/index.js @@ -108,7 +108,9 @@ module.exports = function (options) { context: 'gulp-github/jshint' }, opt); } + } + if (jscs_output.length > 1) { if (opt.jscs_status) { createStatusToCommit({ state: opt.jscs_status, From 190b49a3e4a056884ff0baf86156fb135175a613 Mon Sep 17 00:00:00 2001 From: Chien-hung Chen Date: Mon, 5 Jan 2015 12:27:16 +0800 Subject: [PATCH 22/72] export createStatusToCommit --- index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/index.js b/index.js index c03eac1..54e92df 100644 --- a/index.js +++ b/index.js @@ -126,3 +126,4 @@ module.exports = function (options) { }; module.exports.commentToPR = commentToPR; +module.exports.createStatusToCommit = createStatusToCommit; From 1cf423119b3cf62467f8b627fabf144facede4a5 Mon Sep 17 00:00:00 2001 From: Chien-hung Chen Date: Mon, 5 Jan 2015 12:29:42 +0800 Subject: [PATCH 23/72] add more doc --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index 7d0527b..4ec48c1 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,13 @@ gulp.task('link_report_github', function () { // Or, direct output your comment with same options github.commentToPR('Yes! it works!!', options); + +// Or, direct set status to a commit +github.createStatusToCommit({ + description: 'No! 2 failures...', + context: 'my gulp task', + state: 'failure' +}, options); ``` Options From e1503a1f52e437105c1a4228341474e658a9cd53 Mon Sep 17 00:00:00 2001 From: Zordius Chen Date: Mon, 5 Jan 2015 12:57:09 +0800 Subject: [PATCH 24/72] update style --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4ec48c1..9b14201 100644 --- a/README.md +++ b/README.md @@ -90,4 +90,4 @@ Options Check this sample gulpfile to see how to migrate this with travis CI. -Check This PR to see live demo. Click on ✘ symbol before d9bc05e to see created status. +Check This PR to see live demo. Click on symbol before d9bc05e to see created status. From 8688e4fa04374c8f88e7987e75b51595410b3cad Mon Sep 17 00:00:00 2001 From: Zordius Chen Date: Mon, 5 Jan 2015 16:01:57 +0800 Subject: [PATCH 25/72] a new fail reporter for both jscs/jshint --- gulpfile.js | 2 +- index.js | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/gulpfile.js b/gulpfile.js index aa5cec6..a041e54 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -22,5 +22,5 @@ gulp.task('default', function () { jshint_status: 'error', // Set status to error when jshint errors jscs_status: 'failure' // Set status to failure when jscs errors })) - .pipe(jshint.reporter('fail')); + .pipe(github.failThisTask()); }); diff --git a/index.js b/index.js index 54e92df..16ac5a6 100644 --- a/index.js +++ b/index.js @@ -45,6 +45,42 @@ createStatusToCommit = function (state, opt) { description: state.description, context: state.context }); +}, + +failThisTask = function () { + var jshint_fails = 0, + jscs_fails = 0; + + return through.obj(function (file, enc, callback) { + if (file.jshint && !file.jshint.success && !file.jshint.ignored) { + jshint_fails += file.jshint.results.length; + } + + if (file.jscs && !file.jscs.success) { + jscs_fails += file.jscs.errors.length; + } + this.push(file); + callback(); + }, function (cb) { + var message = []; + + if (jshint_fails) { + message.push('found ' + jshint_fails + ' jshint issues'); + } + + if (jscs_fails) { + message.push('found ' + jscs_fails + ' jscs issues'); + } + + if (message.length) { + this.emit('error', new gutil.PluginError('gulp-github', { + message: 'Failed: ' + message.join(', ') + '.', + showStack: false + })); + } + + cb(); + }); }; module.exports = function (options) { @@ -127,3 +163,4 @@ module.exports = function (options) { module.exports.commentToPR = commentToPR; module.exports.createStatusToCommit = createStatusToCommit; +module.exports.failThisTask = failThisTask; From f8a426d80cd52522c88f0279f7f9e60b700e482d Mon Sep 17 00:00:00 2001 From: Zordius Chen Date: Mon, 5 Jan 2015 16:03:17 +0800 Subject: [PATCH 26/72] update document --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9b14201..b5549c0 100644 --- a/README.md +++ b/README.md @@ -34,9 +34,10 @@ gulp.task('link_report_github', function () { return gulp.src('lib/*.js') .pipe(jshint()) .pipe(jscs()).on('error', function (E) { - console.log(E.message); // This handled jscs stream error + console.log(E.message); // This handled jscs stream error. }) - .pipe(github(options)); // comment issues in github PR! + .pipe(github(options)); // Comment issues in github PR! + .pipe(github.failThisTask()); // Fail this task when jscs/jshint issues found. }); // Or, direct output your comment with same options From fff17099ac7c99e4a3146ff36000078986ad39f2 Mon Sep 17 00:00:00 2001 From: Zordius Chen Date: Tue, 6 Jan 2015 10:17:47 +0800 Subject: [PATCH 27/72] update doc --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index b5549c0..3ef648f 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@ Features * Collect gulp-jscs results. * Write collected info then comment on a github pull request. * Update github pull request status based on collected info. +* A failThisTask() reporter to fail a gulp task when jscs/jshint issues found * **TODO** Collect lcov result. Installation From 13021f3d6c17ef983e30e3feab8fc8aae8125c62 Mon Sep 17 00:00:00 2001 From: Zordius Chen Date: Tue, 6 Jan 2015 10:18:34 +0800 Subject: [PATCH 28/72] release --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index bb51eae..e5cd696 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "gulp-github", - "version": "0.2.0", + "version": "0.2.1", "description": "A gulp plugin to pipe contents to github pull request comments.", "author": "Zordius ", "contributors": [ From 2cce3d54c59c4762d0013bcbecb17415aa92c008 Mon Sep 17 00:00:00 2001 From: Zordius Chen Date: Wed, 14 Jan 2015 11:46:12 +0800 Subject: [PATCH 29/72] add failMergedPR() --- index.js | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 62 insertions(+), 1 deletion(-) diff --git a/index.js b/index.js index 16ac5a6..ca2a7f5 100644 --- a/index.js +++ b/index.js @@ -27,6 +27,15 @@ getGIT = function (opt) { return GIT; }, +closePR = function (opt) { + getGIT(opt).issues.update({ + user: opt.git_repo.split('/')[0], + repo: opt.git_repo.split('/')[1], + number: opt.git_prid, + state: 'closed' + }); +}, + commentToPR = function (body, opt) { getGIT(opt).issues.createComment({ user: opt.git_repo.split('/')[0], @@ -47,6 +56,56 @@ createStatusToCommit = function (state, opt) { }); }, +isPullRequest = function (opt) { + return opt.git_token && opt.git_repo && opt.git_prid && (opt.git_prid !== 'false'); +}, + +isMerge = function (opt, callback) { + if (!isPullRequest(opt)) { + return; + } + + getGIT(opt).pullRequests.getCommits({ + user: opt.git_repo.split('/')[0], + repo: opt.git_repo.split('/')[1], + number: opt.git_prid, + per_page: 100 + }, function (E, D) { + var merged = []; + + if (E) { + console.warn(E); + return callback(E); + } + + D.forEach(function (commit) { + if (commit.parents.length > 1) { + merged.push('* Commit: @' + commit.sha + ' is a merge from ' + commit.parents.map(function (C) { + return '@' + C.sha; + }).join(' , ') + ' !!'); + } + }); + + callback(merged.length ? merged.join('\n') : false); + }); +}, + +failMergedPR = function (opt) { + isMerge(opt, function (M) { + if (M) { + commentToPR('**Do not accept PR with merge, please use rebase always!**\n' + M, opt); + } + + createStatusToCommit({ + state: 'failure', + description: 'merge in PR', + context: 'gulp-github/is_merge' + }, opt); + + closePR(opt); + }); +}, + failThisTask = function () { var jshint_fails = 0, jscs_fails = 0; @@ -112,7 +171,7 @@ module.exports = function (options) { return cb(); } - if (opt.git_token && opt.git_repo && opt.git_prid && (opt.git_prid !== 'false')) { + if (isPullRequest(opt)) { pr_url = 'https://' + ((opt.git_option && opt.git_option.host) ? opt.git_option.host : 'github.com') + '/' + opt.git_repo + '/pull/' + opt.git_prid; if (jshint_output.length > 1) { commentToPR(jshint_output.join('\n'), opt); @@ -164,3 +223,5 @@ module.exports = function (options) { module.exports.commentToPR = commentToPR; module.exports.createStatusToCommit = createStatusToCommit; module.exports.failThisTask = failThisTask; +module.exports.failMergedPR = failMergedPR; +module.exports.isMerge = isMerge; From 84fa8fac2076e338609bbd81079f03dffdb08120 Mon Sep 17 00:00:00 2001 From: Zordius Chen Date: Fri, 16 Jan 2015 17:23:48 +0800 Subject: [PATCH 30/72] fix failMergedPR logic --- index.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/index.js b/index.js index ca2a7f5..2c7de13 100644 --- a/index.js +++ b/index.js @@ -28,7 +28,7 @@ getGIT = function (opt) { }, closePR = function (opt) { - getGIT(opt).issues.update({ + getGIT(opt).issues.edit({ user: opt.git_repo.split('/')[0], repo: opt.git_repo.split('/')[1], number: opt.git_prid, @@ -92,10 +92,12 @@ isMerge = function (opt, callback) { failMergedPR = function (opt) { isMerge(opt, function (M) { - if (M) { - commentToPR('**Do not accept PR with merge, please use rebase always!**\n' + M, opt); + if (!M) { + return; } + commentToPR('**Do not accept PR with merge, please use rebase always!**\n' + M, opt); + createStatusToCommit({ state: 'failure', description: 'merge in PR', From 04dcbfa03d3062ddc2da2f066fbb0235d84d1739 Mon Sep 17 00:00:00 2001 From: Zordius Chen Date: Wed, 2 Sep 2015 13:04:11 +0800 Subject: [PATCH 31/72] release --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e5cd696..d4e9b1e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "gulp-github", - "version": "0.2.1", + "version": "0.2.2", "description": "A gulp plugin to pipe contents to github pull request comments.", "author": "Zordius ", "contributors": [ From c3ee1eb5c912e2d97f4bf38a5b8f4c0da759cc56 Mon Sep 17 00:00:00 2001 From: Zordius Chen Date: Wed, 2 Sep 2015 16:27:51 +0800 Subject: [PATCH 32/72] update depdency and jscs cfg --- .jscsrc | 3 +-- package.json | 10 +++++----- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/.jscsrc b/.jscsrc index eb0a3c4..d242367 100644 --- a/.jscsrc +++ b/.jscsrc @@ -1,5 +1,4 @@ { - "additionalRules": ["rules/disallow-dot-notation-for-keywords.js"], "fileExtensions": [".js", ".jsx"], "disallowMixedSpacesAndTabs": true, "disallowNewlineBeforeBlockStatements": true, @@ -41,7 +40,7 @@ "safeContextKeyword": ["self"], "validateIndentation": 4, - "validateJSDoc": { + "jsDoc": { "checkParamNames": true, "checkRedundantParams": true, "requireParamTypes": true, diff --git a/package.json b/package.json index d4e9b1e..0280c6a 100644 --- a/package.json +++ b/package.json @@ -26,14 +26,14 @@ }, "main": "index.js", "dependencies": { - "github": "0.2.3", - "gulp-util": "3.0.1", + "github": "0.2.4", + "gulp-util": "3.0.6", "through2": "*" }, "devDependencies": { - "gulp": "3.8.10", - "gulp-jshint": "1.9.0", - "gulp-jscs": "1.4.0" + "gulp": "3.9.0", + "gulp-jshint": "1.11.2", + "gulp-jscs": "2.0.0" }, "engines": { "node": ">=0.8" From bae5af3d45f6e7c3f66af25b107ec63a2b08ff8d Mon Sep 17 00:00:00 2001 From: Zordius Chen Date: Wed, 2 Sep 2015 16:28:19 +0800 Subject: [PATCH 33/72] update depdency, release --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0280c6a..13b6ed3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "gulp-github", - "version": "0.2.2", + "version": "0.2.3", "description": "A gulp plugin to pipe contents to github pull request comments.", "author": "Zordius ", "contributors": [ From 2763e17eaf490a9a97f78ea6d40ca121c5d8a8b7 Mon Sep 17 00:00:00 2001 From: Zordius Chen Date: Thu, 22 Oct 2015 12:30:22 +0800 Subject: [PATCH 34/72] support callback --- index.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/index.js b/index.js index 2c7de13..aa4c458 100644 --- a/index.js +++ b/index.js @@ -27,25 +27,25 @@ getGIT = function (opt) { return GIT; }, -closePR = function (opt) { +closePR = function (opt, cb) { getGIT(opt).issues.edit({ user: opt.git_repo.split('/')[0], repo: opt.git_repo.split('/')[1], number: opt.git_prid, state: 'closed' - }); + }, cb); }, -commentToPR = function (body, opt) { +commentToPR = function (body, opt, cb) { getGIT(opt).issues.createComment({ user: opt.git_repo.split('/')[0], repo: opt.git_repo.split('/')[1], number: opt.git_prid, body: body - }); + }, cb); }, -createStatusToCommit = function (state, opt) { +createStatusToCommit = function (state, opt, cb) { getGIT(opt).statuses.create({ user: opt.git_repo.split('/')[0], repo: opt.git_repo.split('/')[1], @@ -53,7 +53,7 @@ createStatusToCommit = function (state, opt) { state: state.state, description: state.description, context: state.context - }); + }, cb); }, isPullRequest = function (opt) { From 05ddfa89e6183cd5b47e698ee6d4413b21903400 Mon Sep 17 00:00:00 2001 From: Zordius Chen Date: Thu, 22 Oct 2015 12:37:23 +0800 Subject: [PATCH 35/72] should be async --- index.js | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/index.js b/index.js index aa4c458..e5e453e 100644 --- a/index.js +++ b/index.js @@ -90,21 +90,33 @@ isMerge = function (opt, callback) { }); }, -failMergedPR = function (opt) { +failMergedPR = function (opt, cb) { + var count = 0; + var err = []; + var done = function (E) { + count++; + if (E) { + err.push(E); + } + if ((count == 3) && cb) { + cb(err.length ? err : undefined); + } + }; + isMerge(opt, function (M) { if (!M) { return; } - commentToPR('**Do not accept PR with merge, please use rebase always!**\n' + M, opt); + commentToPR('**Do not accept PR with merge, please use rebase always!**\n' + M, opt, done); createStatusToCommit({ state: 'failure', description: 'merge in PR', context: 'gulp-github/is_merge' - }, opt); + }, opt, done); - closePR(opt); + closePR(opt, done); }); }, From e14303ce18ee8d4935864a57cdf8706d7bf9cfe0 Mon Sep 17 00:00:00 2001 From: Zordius Chen Date: Thu, 22 Oct 2015 12:41:05 +0800 Subject: [PATCH 36/72] should be async. test --- index.js | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/index.js b/index.js index e5e453e..97d0676 100644 --- a/index.js +++ b/index.js @@ -180,6 +180,13 @@ module.exports = function (options) { callback(); }, function (cb) { var pr_url; + var count = 0; + var done = function () { + count--; + if (count == 0) { + cb(); + } + }; if ((jshint_output.length === 1) && (jscs_output.length === 1)) { return cb(); @@ -209,28 +216,32 @@ module.exports = function (options) { } if (opt.git_token && opt.git_repo && opt.git_sha) { + count++; if (jshint_output.length > 1) { if (opt.jshint_status) { + count++; createStatusToCommit({ state: opt.jshint_status, description: (jshint_output.length - 1) + ' jshint issues found', context: 'gulp-github/jshint' - }, opt); + }, opt, done); } } if (jscs_output.length > 1) { if (opt.jscs_status) { + count++; createStatusToCommit({ state: opt.jscs_status, description: (jscs_output.length - 1) + ' jscs issues found', context: 'gulp-github/jscs' - }, opt); + }, opt, done); } } } - cb(); + count++; + done(); }); }; From 4090ec7df5469b6b5e0a0c8f5eae8d25b33b54a3 Mon Sep 17 00:00:00 2001 From: Zordius Chen Date: Thu, 22 Oct 2015 12:42:11 +0800 Subject: [PATCH 37/72] fix count --- index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/index.js b/index.js index 97d0676..0020ce1 100644 --- a/index.js +++ b/index.js @@ -238,6 +238,7 @@ module.exports = function (options) { }, opt, done); } } + count--; } count++; From af9408873e863c8b8064f5b2006c060bcecbe7d7 Mon Sep 17 00:00:00 2001 From: Zordius Chen Date: Thu, 22 Oct 2015 13:00:27 +0800 Subject: [PATCH 38/72] fix --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index 0020ce1..3a7f8b4 100644 --- a/index.js +++ b/index.js @@ -183,7 +183,7 @@ module.exports = function (options) { var count = 0; var done = function () { count--; - if (count == 0) { + if (count === 0) { cb(); } }; From 2ccbce1a43dcc4e6fd07b3ea2eb1d56e1e0aa08a Mon Sep 17 00:00:00 2001 From: Zordius Chen Date: Thu, 22 Oct 2015 13:01:33 +0800 Subject: [PATCH 39/72] eslint --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 13b6ed3..25c53a0 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,8 @@ "devDependencies": { "gulp": "3.9.0", "gulp-jshint": "1.11.2", - "gulp-jscs": "2.0.0" + "gulp-jscs": "2.0.0", + "gulp-eslint": "1.0.0" }, "engines": { "node": ">=0.8" From 2c8dc22b771aabad9c1c4faf36946fd3ee61122a Mon Sep 17 00:00:00 2001 From: Zordius Chen Date: Thu, 22 Oct 2015 13:02:35 +0800 Subject: [PATCH 40/72] add eslint --- gulpfile.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/gulpfile.js b/gulpfile.js index a041e54..49cb441 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -1,12 +1,14 @@ var gulp = require('gulp'), jshint = require('gulp-jshint'), jscs = require('gulp-jscs'), + eslint = require('gulp-eslint'), github = require('./index'); gulp.task('default', function () { return gulp.src('*.js') .pipe(jshint()) .pipe(jscs()) + .pipe(eslint()) .on('error', function () { // handle error, skip gulp-jscs messages }) From 3609a6c95b169e4362eec3e165e79108c996f122 Mon Sep 17 00:00:00 2001 From: Zordius Chen Date: Thu, 22 Oct 2015 13:10:48 +0800 Subject: [PATCH 41/72] try to support eslint --- .eslintrc | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ gulpfile.js | 3 ++- index.js | 2 -- 3 files changed, 52 insertions(+), 3 deletions(-) create mode 100644 .eslintrc diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..adc8d65 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,50 @@ +{ + // http://eslint.org/docs/rules/ + + "env": { + "node": true, // Node.js global variables and Node.js-specific rules. + "mocha": true, // adds all of the Mocha testing global variables. + "es6": true // enable all ECMAScript 6 features except for modules. + }, + + "globals": { + }, + + "plugins": [ + ], + + "rules": { + + // Possible Errors + "no-extra-semi": 1, // disallow unnecessary semicolons + "no-inner-declarations": 2, // disallow function or variable declarations in nested blocks + + + // Best Practices + "curly": 2, // specify curly brace conventions for all control statements + "no-eval": 2, // disallow use of eval() + "no-extend-native": 2, // disallow adding to native types + "no-new-wrappers": 2, // disallows creating new instances of String, Number, and Boolean + "no-with": 2, // disallow use of the with statement + + + // Strict Mode + + + // Variables + "no-undef": 2, // disallow use of undeclared variables unless mentioned in a /*global */ block + + + // Node.js + + + // Stylistic Issues + "array-bracket-spacing": [2, "never"], // enforce spacing inside array brackets (off by default) + "indent": 2, // this option sets a specific tab width for your code (off by default) + "no-array-constructor": 2, // disallow use of the Array constructor + "no-mixed-spaces-and-tabs": 2, // disallow mixed spaces and tabs for indentation + "no-new-object": 2, // disallow use of the Object constructor + "object-curly-spacing": [2, "never"], // require or disallow padding inside curly braces (off by default) + "semi": 2, // require or disallow use of semicolons instead of ASI + } +} diff --git a/gulpfile.js b/gulpfile.js index 49cb441..a81c677 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -6,9 +6,10 @@ var gulp = require('gulp'), gulp.task('default', function () { return gulp.src('*.js') + .pipe(eslint()) + .pipe(eslint.formatEach()) .pipe(jshint()) .pipe(jscs()) - .pipe(eslint()) .on('error', function () { // handle error, skip gulp-jscs messages }) diff --git a/index.js b/index.js index 3a7f8b4..4dc4d40 100644 --- a/index.js +++ b/index.js @@ -1,5 +1,3 @@ -'use strict'; - var through = require('through2'), gutil = require('gulp-util'), github = require('github'), From 40490ddf30d4c3cfb4b0e0a6ab951552b59d4a81 Mon Sep 17 00:00:00 2001 From: Zordius Chen Date: Thu, 22 Oct 2015 13:15:41 +0800 Subject: [PATCH 42/72] update document --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 3ef648f..b25f06d 100644 --- a/README.md +++ b/README.md @@ -67,8 +67,9 @@ Options // create status to this commit, optional git_sha: 00000000, - jshint_status: 'error', // Set status to error when jshint errors - jscs_status: 'failure', // Set status to failure when jscs errors + jshint_status: 'error', // Set status to error when jshint errors, optional + jscs_status: 'failure', // Set git status to failure when jscs errors, optional + eslint_status: 'error', // Set git status to error when eslint errors, optional // when using github enterprise, optional git_option: { From 3187e982c315af13d54a2a810c6c42b57fc8a4ef Mon Sep 17 00:00:00 2001 From: Zordius Chen Date: Thu, 22 Oct 2015 13:17:37 +0800 Subject: [PATCH 43/72] more doc about eslint --- README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b25f06d..9d485bb 100644 --- a/README.md +++ b/README.md @@ -10,9 +10,10 @@ Features * Collect gulp-jshint results. * Collect gulp-jscs results. +* Collect gulp-eslint results. * Write collected info then comment on a github pull request. * Update github pull request status based on collected info. -* A failThisTask() reporter to fail a gulp task when jscs/jshint issues found +* A failThisTask() reporter to fail a gulp task when jscs/jshint/eslint issues found * **TODO** Collect lcov result. Installation @@ -29,6 +30,7 @@ Usage var gulp = require('gulp'), jshint = require('gulp-jshint'), jscs = require('gulp-jscs'), + eslint = require('gulp-eslint'), github = require('gulp-github'); gulp.task('link_report_github', function () { @@ -37,8 +39,9 @@ gulp.task('link_report_github', function () { .pipe(jscs()).on('error', function (E) { console.log(E.message); // This handled jscs stream error. }) + .pipe(eslint()) .pipe(github(options)); // Comment issues in github PR! - .pipe(github.failThisTask()); // Fail this task when jscs/jshint issues found. + .pipe(github.failThisTask()); // Fail this task when jscs/jshint/eslint issues found. }); // Or, direct output your comment with same options From dc9d917e0dc05d48c05965372a736c090638fa5f Mon Sep 17 00:00:00 2001 From: Zordius Chen Date: Thu, 22 Oct 2015 14:45:01 +0800 Subject: [PATCH 44/72] support eslint report to github --- gulpfile.js | 1 - index.js | 37 ++++++++++++++++++++++++++----------- 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index a81c677..6ebf5ee 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -7,7 +7,6 @@ var gulp = require('gulp'), gulp.task('default', function () { return gulp.src('*.js') .pipe(eslint()) - .pipe(eslint.formatEach()) .pipe(jshint()) .pipe(jscs()) .on('error', function () { diff --git a/index.js b/index.js index 4dc4d40..4b4e300 100644 --- a/index.js +++ b/index.js @@ -1,15 +1,19 @@ -var through = require('through2'), - gutil = require('gulp-util'), - github = require('github'), - path = require('path'), +var through = require('through2'); +var gutil = require('gulp-util'); +var github = require('github'); +var path = require('path'); -jshint_simple_reporter = function (E) { +var jshint_simple_reporter = function (E) { return ' 1. ' + path.relative(process.cwd(), E.file) + ': line ' + E.error.line + ', col ' + E.error.character + ' *' + E.error.reason + '*'; -}, +}; -jscs_simple_reporter = function (E, file) { +var jscs_simple_reporter = function (E, file) { return ' 1. ' + path.relative(process.cwd(), file.path) + ': line ' + E.line + ', col ' + E.column + ' *' + E.message + '*'; -}, +}; + +var eslint_simple_reporter = function (E, file) { + return ' 1. ' + path.relative(process.cwd(), file.path) + ': line ' + E.line + ', col ' + E.column + ' *' + E.message + '* (' + E.moduleId + ')'; +}; getGIT = function (opt) { var GIT = new github(opt.git_option || { @@ -157,6 +161,7 @@ failThisTask = function () { module.exports = function (options) { var jshint_output = ['**Please fix these jshint issues first:**'], jscs_output = ['**Please fix these jscs issues first:**'], + eslint_output = ['**Please fix these eslint issues first:**'], opt = options || {}, jshint_reporter = opt.jshint_reporter || jshint_simple_reporter, jscs_reporter = opt.jscs_reporter || jscs_simple_reporter; @@ -174,6 +179,12 @@ module.exports = function (options) { }); } + if (file.eslint) { + file.eslint.messages.forEach(function (E) { + eslint_output.push(eslint_simple_reporter(E, file)); + }); + } + this.push(file); callback(); }, function (cb) { @@ -203,14 +214,18 @@ module.exports = function (options) { } else { console.log('Not a pullrequest or no opts.git_token/opts.git_repo/opts.git_prid'); if (jshint_output.length > 1) { - console.log('These jshint issues will not update to github:'); + console.log('\nThese jshint issues will not update to github:'); console.log(jshint_output.join('\n')); } if (jscs_output.length > 1) { - console.log('These jscs issues will not update to github:'); + console.log('\nThese jscs issues will not update to github:'); console.log(jscs_output.join('\n')); } - console.log('Please read gulp-github document: https://github.com/zordius/gulp-github'); + if (eslint_output.length > 1) { + console.log('\nThese eslint issues will not update to github:'); + console.log(eslint_output.join('\n')); + } + console.log('\nPlease read gulp-github document: https://github.com/zordius/gulp-github'); } if (opt.git_token && opt.git_repo && opt.git_sha) { From e96df041f379e301f16f43d30bf427cd9d4196b7 Mon Sep 17 00:00:00 2001 From: Zordius Chen Date: Thu, 22 Oct 2015 14:46:23 +0800 Subject: [PATCH 45/72] fix for eslints --- index.js | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/index.js b/index.js index 4b4e300..0aa4661 100644 --- a/index.js +++ b/index.js @@ -15,7 +15,7 @@ var eslint_simple_reporter = function (E, file) { return ' 1. ' + path.relative(process.cwd(), file.path) + ': line ' + E.line + ', col ' + E.column + ' *' + E.message + '* (' + E.moduleId + ')'; }; -getGIT = function (opt) { +var getGIT = function (opt) { var GIT = new github(opt.git_option || { version: '3.0.0', headers: { @@ -27,27 +27,27 @@ getGIT = function (opt) { token: opt.git_token }); return GIT; -}, +}; -closePR = function (opt, cb) { +var closePR = function (opt, cb) { getGIT(opt).issues.edit({ user: opt.git_repo.split('/')[0], repo: opt.git_repo.split('/')[1], number: opt.git_prid, state: 'closed' }, cb); -}, +}; -commentToPR = function (body, opt, cb) { +var commentToPR = function (body, opt, cb) { getGIT(opt).issues.createComment({ user: opt.git_repo.split('/')[0], repo: opt.git_repo.split('/')[1], number: opt.git_prid, body: body }, cb); -}, +}; -createStatusToCommit = function (state, opt, cb) { +var createStatusToCommit = function (state, opt, cb) { getGIT(opt).statuses.create({ user: opt.git_repo.split('/')[0], repo: opt.git_repo.split('/')[1], @@ -56,13 +56,13 @@ createStatusToCommit = function (state, opt, cb) { description: state.description, context: state.context }, cb); -}, +}; -isPullRequest = function (opt) { +var isPullRequest = function (opt) { return opt.git_token && opt.git_repo && opt.git_prid && (opt.git_prid !== 'false'); -}, +}; -isMerge = function (opt, callback) { +var isMerge = function (opt, callback) { if (!isPullRequest(opt)) { return; } @@ -90,9 +90,9 @@ isMerge = function (opt, callback) { callback(merged.length ? merged.join('\n') : false); }); -}, +}; -failMergedPR = function (opt, cb) { +var failMergedPR = function (opt, cb) { var count = 0; var err = []; var done = function (E) { @@ -120,9 +120,9 @@ failMergedPR = function (opt, cb) { closePR(opt, done); }); -}, +}; -failThisTask = function () { +var failThisTask = function () { var jshint_fails = 0, jscs_fails = 0; From d932e514c27379a45fdae0e3bccbffb799b26b67 Mon Sep 17 00:00:00 2001 From: Zordius Chen Date: Thu, 22 Oct 2015 14:52:58 +0800 Subject: [PATCH 46/72] update doc, set eslint status --- README.md | 2 +- index.js | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 9d485bb..2ce0bce 100644 --- a/README.md +++ b/README.md @@ -96,4 +96,4 @@ Options Check this sample gulpfile to see how to migrate this with travis CI. -Check This PR to see live demo. Click on symbol before d9bc05e to see created status. +Check This PR to see live demo. diff --git a/index.js b/index.js index 0aa4661..b468e22 100644 --- a/index.js +++ b/index.js @@ -230,6 +230,7 @@ module.exports = function (options) { if (opt.git_token && opt.git_repo && opt.git_sha) { count++; + if (jshint_output.length > 1) { if (opt.jshint_status) { count++; @@ -251,6 +252,18 @@ module.exports = function (options) { }, opt, done); } } + + if (eslint_output.length > 1) { + if (opt.eslint_status) { + count++; + createStatusToCommit({ + state: opt.eslint_status, + description: (eslint_output.length - 1) + ' eslint issues found', + context: 'gulp-github/eslint' + }, opt, done); + } + } + count--; } From 866ff7e0e613792d898750f0985b356adecf3ba8 Mon Sep 17 00:00:00 2001 From: Zordius Chen Date: Thu, 22 Oct 2015 14:54:36 +0800 Subject: [PATCH 47/72] Add demo.png --- README.md | 2 ++ demo.png | Bin 0 -> 46877 bytes 2 files changed, 2 insertions(+) create mode 100644 demo.png diff --git a/README.md b/README.md index 2ce0bce..c5c8e84 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,8 @@ Features * A failThisTask() reporter to fail a gulp task when jscs/jshint/eslint issues found * **TODO** Collect lcov result. + + Installation ------------ diff --git a/demo.png b/demo.png new file mode 100644 index 0000000000000000000000000000000000000000..1b3574dc109777bb36fad18b10763c3c5c9b550e GIT binary patch literal 46877 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 Date: Thu, 22 Oct 2015 14:56:14 +0800 Subject: [PATCH 48/72] refine doc --- README.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index c5c8e84..121f7f1 100644 --- a/README.md +++ b/README.md @@ -8,11 +8,12 @@ A gulp plugin to pipe contents to github pull request comments. Features -------- -* Collect gulp-jshint results. -* Collect gulp-jscs results. -* Collect gulp-eslint results. -* Write collected info then comment on a github pull request. -* Update github pull request status based on collected info. +* See your CI issues on github! + * Collect gulp-jshint results. + * Collect gulp-jscs results. + * Collect gulp-eslint results. + * Write collected info then comment on a github pull request. + * Update github pull request status based on collected info. * A failThisTask() reporter to fail a gulp task when jscs/jshint/eslint issues found * **TODO** Collect lcov result. From 4a95a63dde39aae970dd0aacdba561be783faaa0 Mon Sep 17 00:00:00 2001 From: Zordius Chen Date: Thu, 22 Oct 2015 14:57:43 +0800 Subject: [PATCH 49/72] refine doc --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 121f7f1..b3908bd 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,14 @@ gulp-github =========== -A gulp plugin to pipe contents to github pull request comments. +A gulp plugin to comment jscs/jshint/eslint issues to a github pull request. [![npm version](https://img.shields.io/npm/v/gulp-github.svg)](https://www.npmjs.org/package/gulp-github) [![Dependency Status](https://david-dm.org/zordius/gulp-github.svg)](https://david-dm.org/zordius/gulp-github) [![Build Status](https://travis-ci.org/zordius/gulp-github.svg?branch=master)](https://travis-ci.org/zordius/gulp-github) [![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE.txt) Features -------- -* See your CI issues on github! +* See your CI issues of lint tools on github! * Collect gulp-jshint results. * Collect gulp-jscs results. * Collect gulp-eslint results. From 232186542718b035b8691d65a9bda7d3aaa616f5 Mon Sep 17 00:00:00 2001 From: Zordius Chen Date: Thu, 22 Oct 2015 14:58:14 +0800 Subject: [PATCH 50/72] release --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 25c53a0..5e02906 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "gulp-github", - "version": "0.2.3", + "version": "0.3.0", "description": "A gulp plugin to pipe contents to github pull request comments.", "author": "Zordius ", "contributors": [ From 255d8dc0d2d9e66e1697645d6a2d0b0885b62878 Mon Sep 17 00:00:00 2001 From: Zordius Chen Date: Tue, 8 Mar 2016 19:22:33 +0800 Subject: [PATCH 51/72] fix failThisTask() not work for eslint issues --- index.js | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/index.js b/index.js index b468e22..eb9166d 100644 --- a/index.js +++ b/index.js @@ -124,7 +124,8 @@ var failMergedPR = function (opt, cb) { var failThisTask = function () { var jshint_fails = 0, - jscs_fails = 0; + jscs_fails = 0, + eslint_fails = 0; return through.obj(function (file, enc, callback) { if (file.jshint && !file.jshint.success && !file.jshint.ignored) { @@ -134,6 +135,13 @@ var failThisTask = function () { if (file.jscs && !file.jscs.success) { jscs_fails += file.jscs.errors.length; } + + if (file.eslint) { + file.eslint.messages.forEach(function () { + eslint_fails++; + }); + } + this.push(file); callback(); }, function (cb) { @@ -147,6 +155,10 @@ var failThisTask = function () { message.push('found ' + jscs_fails + ' jscs issues'); } + if (eslint_fails) { + message.push('found ' + eslint_fails + ' eslint issues'); + } + if (message.length) { this.emit('error', new gutil.PluginError('gulp-github', { message: 'Failed: ' + message.join(', ') + '.', From 2295662d844e43342d8c96596ba3d5ee188b8d07 Mon Sep 17 00:00:00 2001 From: Zordius Chen Date: Tue, 8 Mar 2016 19:23:48 +0800 Subject: [PATCH 52/72] release --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5e02906..e39e0cb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "gulp-github", - "version": "0.3.0", + "version": "0.3.1", "description": "A gulp plugin to pipe contents to github pull request comments.", "author": "Zordius ", "contributors": [ From 7aebe78f238f9d6a8386781fa4bd978ee018280f Mon Sep 17 00:00:00 2001 From: Zordius Chen Date: Wed, 9 Mar 2016 10:49:39 +0800 Subject: [PATCH 53/72] fix eslint not fail issue --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index eb9166d..e313f46 100644 --- a/index.js +++ b/index.js @@ -209,7 +209,7 @@ module.exports = function (options) { } }; - if ((jshint_output.length === 1) && (jscs_output.length === 1)) { + if ((jshint_output.length === 1) && (jscs_output.length === 1) && (eslint_output.length === 1)) { return cb(); } From bc89bb0a46e82f57fcc4af96e36a40857bb1f27d Mon Sep 17 00:00:00 2001 From: Zordius Chen Date: Wed, 9 Mar 2016 10:49:51 +0800 Subject: [PATCH 54/72] release --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e39e0cb..1dc84b8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "gulp-github", - "version": "0.3.1", + "version": "0.3.2", "description": "A gulp plugin to pipe contents to github pull request comments.", "author": "Zordius ", "contributors": [ From 87f90e761f58285a834f28cc0afe6726c1af8f80 Mon Sep 17 00:00:00 2001 From: Zordius Chen Date: Wed, 9 Mar 2016 12:12:05 +0800 Subject: [PATCH 55/72] fix 'eslint issues not be commented into github PR' bug --- index.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/index.js b/index.js index e313f46..7ed65cd 100644 --- a/index.js +++ b/index.js @@ -223,6 +223,10 @@ module.exports = function (options) { commentToPR(jscs_output.join('\n'), opt); gutil.log('[gulp-github]', gutil.colors.bold((jscs_output.length - 1) + ' jscs issues were updated to ' + pr_url)); } + if (eslint_output.length > 1) { + commentToPR(eslint_output.join('\n'), opt); + gutil.log('[gulp-github]', gutil.colors.bold((eslint_output.length - 1) + ' eslint issues were updated to ' + pr_url)); + } } else { console.log('Not a pullrequest or no opts.git_token/opts.git_repo/opts.git_prid'); if (jshint_output.length > 1) { From 34c0ba05fd20f6c85e7758718baef6945bcbb9bd Mon Sep 17 00:00:00 2001 From: Zordius Chen Date: Wed, 9 Mar 2016 12:12:19 +0800 Subject: [PATCH 56/72] release --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1dc84b8..49fccef 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "gulp-github", - "version": "0.3.2", + "version": "0.3.3", "description": "A gulp plugin to pipe contents to github pull request comments.", "author": "Zordius ", "contributors": [ From c4ac3d03133315d81d0cd1ef182a558ae1147628 Mon Sep 17 00:00:00 2001 From: Zordius Chen Date: Fri, 18 Mar 2016 17:05:50 +0800 Subject: [PATCH 57/72] now failMergedPR() can fail the task. Add document for failMergedPR() --- README.md | 5 +++++ index.js | 4 +++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b3908bd..8d9ca95 100644 --- a/README.md +++ b/README.md @@ -56,6 +56,11 @@ github.createStatusToCommit({ context: 'my gulp task', state: 'failure' }, options); + +// Or, create a task to reject PR with merged commits +gulp.task('git_rules', function (cb) { + git.failMergedPR(options, cb); +}); ``` Options diff --git a/index.js b/index.js index 7ed65cd..9cc3422 100644 --- a/index.js +++ b/index.js @@ -64,7 +64,7 @@ var isPullRequest = function (opt) { var isMerge = function (opt, callback) { if (!isPullRequest(opt)) { - return; + return callback(); } getGIT(opt).pullRequests.getCommits({ @@ -110,6 +110,8 @@ var failMergedPR = function (opt, cb) { return; } + err.push(M); + commentToPR('**Do not accept PR with merge, please use rebase always!**\n' + M, opt, done); createStatusToCommit({ From 86b6c555885131ce2472964d61ac9f483009cac2 Mon Sep 17 00:00:00 2001 From: Zordius Chen Date: Fri, 18 Mar 2016 17:06:05 +0800 Subject: [PATCH 58/72] release --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 49fccef..015ef3a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "gulp-github", - "version": "0.3.3", + "version": "0.3.4", "description": "A gulp plugin to pipe contents to github pull request comments.", "author": "Zordius ", "contributors": [ From 23d40b2e6b37420fedea6bffb04b60efc4cf0c0c Mon Sep 17 00:00:00 2001 From: Zordius Chen Date: Fri, 18 Mar 2016 17:07:34 +0800 Subject: [PATCH 59/72] typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8d9ca95..5c39a25 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ var gulp = require('gulp'), eslint = require('gulp-eslint'), github = require('gulp-github'); -gulp.task('link_report_github', function () { +gulp.task('lint_report_github', function () { return gulp.src('lib/*.js') .pipe(jshint()) .pipe(jscs()).on('error', function (E) { From 199f5d17301a9d27e78ea534bbb46061885f78bb Mon Sep 17 00:00:00 2001 From: Zordius Chen Date: Fri, 29 Apr 2016 09:49:54 +0800 Subject: [PATCH 60/72] document improvement for #5 --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5c39a25..954a38f 100644 --- a/README.md +++ b/README.md @@ -84,8 +84,10 @@ Options // when using github enterprise, optional git_option: { - // refer to https://www.npmjs.com/package/github - host: 'github.mycorp.com' + // refer to https://www.npmjs.com/package/github for more options + host: 'github.mycorp.com', + // You may require this when you using Enterprise Github + pathPrefix: '/api/v3' }, // Provide your own jshint reporter, optional From e625c3f535402c3b094f8c347d9c90848f5bac00 Mon Sep 17 00:00:00 2001 From: Zordius Chen Date: Fri, 15 Jul 2016 16:26:03 +0800 Subject: [PATCH 61/72] update gulpfile --- gulpfile.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index 6ebf5ee..2636ee1 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -5,7 +5,7 @@ var gulp = require('gulp'), github = require('./index'); gulp.task('default', function () { - return gulp.src('*.js') + return gulp.src(['*.js', 'lint_test/*.js']) .pipe(eslint()) .pipe(jshint()) .pipe(jscs()) @@ -21,8 +21,9 @@ gulp.task('default', function () { git_prid: process.env.TRAVIS_PULL_REQUEST, git_sha: process.env.TRAVIS_COMMIT, - jshint_status: 'error', // Set status to error when jshint errors - jscs_status: 'failure' // Set status to failure when jscs errors + jshint_status: 'error', // Set status to error when jshint errors + jscs_status: 'failure', // Set status to failure when jscs errors + eslint_status: 'failure' // Set status to failure when eslint errors })) .pipe(github.failThisTask()); }); From d657c7156f9cf7e24ad1e30a00019f445f7a2bcd Mon Sep 17 00:00:00 2001 From: Zordius Chen Date: Fri, 15 Jul 2016 16:26:43 +0800 Subject: [PATCH 62/72] update dependency --- package.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 015ef3a..40a5ef7 100644 --- a/package.json +++ b/package.json @@ -27,14 +27,14 @@ "main": "index.js", "dependencies": { "github": "0.2.4", - "gulp-util": "3.0.6", + "gulp-util": "3.0.7", "through2": "*" }, "devDependencies": { - "gulp": "3.9.0", - "gulp-jshint": "1.11.2", - "gulp-jscs": "2.0.0", - "gulp-eslint": "1.0.0" + "gulp": "3.9.1", + "gulp-jshint": "2.0.0", + "gulp-jscs": "3.0.2", + "gulp-eslint": "2.0.0" }, "engines": { "node": ">=0.8" From de11a32de6778ef840b7b251bfed22fc587a7b7e Mon Sep 17 00:00:00 2001 From: Zordius Chen Date: Fri, 15 Jul 2016 16:28:33 +0800 Subject: [PATCH 63/72] support createPR --- index.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/index.js b/index.js index 9cc3422..d3230e3 100644 --- a/index.js +++ b/index.js @@ -38,6 +38,17 @@ var closePR = function (opt, cb) { }, cb); }; +var createPR = function (title, head, base, body, opt, cb) { + getGIT(opt).pullRequests.create({ + user: opt.git_repo.split('/')[0], + repo: opt.git_repo.split('/')[1], + title: title, + head: head, + base: base, + body: body + }, cb); +}; + var commentToPR = function (body, opt, cb) { getGIT(opt).issues.createComment({ user: opt.git_repo.split('/')[0], @@ -291,6 +302,7 @@ module.exports = function (options) { }; module.exports.commentToPR = commentToPR; +module.exports.createPR = createPR; module.exports.createStatusToCommit = createStatusToCommit; module.exports.failThisTask = failThisTask; module.exports.failMergedPR = failMergedPR; From 28209b9561f31ec1ffb782b83ddc9513797fa9e2 Mon Sep 17 00:00:00 2001 From: Zordius Chen Date: Fri, 15 Jul 2016 16:37:55 +0800 Subject: [PATCH 64/72] fix for newer jscs --- index.js | 2 +- lint_test/test1.js | 7 +++++++ package.json | 8 ++++---- 3 files changed, 12 insertions(+), 5 deletions(-) create mode 100644 lint_test/test1.js diff --git a/index.js b/index.js index d3230e3..3a483e4 100644 --- a/index.js +++ b/index.js @@ -199,7 +199,7 @@ module.exports = function (options) { } if (file.jscs && !file.jscs.success) { - file.jscs.errors.forEach(function (E) { + (file.jscs.errors.getErrorList ? file.jscs.errors.getErrorList() : file.jscs.errors).forEach(function (E) { jscs_output.push(jscs_reporter(E, file)); }); } diff --git a/lint_test/test1.js b/lint_test/test1.js new file mode 100644 index 0000000..c09af3e --- /dev/null +++ b/lint_test/test1.js @@ -0,0 +1,7 @@ +var bad = {}; +var foo = 123; + +if (123) { + foo ++; + foo--; +} diff --git a/package.json b/package.json index 40a5ef7..3764e61 100644 --- a/package.json +++ b/package.json @@ -26,15 +26,15 @@ }, "main": "index.js", "dependencies": { - "github": "0.2.4", + "github": "2.2.0", "gulp-util": "3.0.7", "through2": "*" }, "devDependencies": { "gulp": "3.9.1", - "gulp-jshint": "2.0.0", - "gulp-jscs": "3.0.2", - "gulp-eslint": "2.0.0" + "gulp-jshint": "2.0.1", + "gulp-jscs": "4.0.0", + "gulp-eslint": "3.0.1" }, "engines": { "node": ">=0.8" From 588e22f168166a3b02f04d268bdd499e9cc2c4b8 Mon Sep 17 00:00:00 2001 From: Zordius Chen Date: Fri, 15 Jul 2016 16:43:36 +0800 Subject: [PATCH 65/72] test on 4 --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 4fc06d2..de1246f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ language: node_js node_js: - - '0.11' + - '4' script: - npm test sudo: false From 23f93572ef9415122b8bbbfc805b174ab438df77 Mon Sep 17 00:00:00 2001 From: Zordius Chen Date: Fri, 15 Jul 2016 16:54:39 +0800 Subject: [PATCH 66/72] update to new github api interface --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index 3a483e4..1c7820d 100644 --- a/index.js +++ b/index.js @@ -59,7 +59,7 @@ var commentToPR = function (body, opt, cb) { }; var createStatusToCommit = function (state, opt, cb) { - getGIT(opt).statuses.create({ + getGIT(opt).repos.createStatus({ user: opt.git_repo.split('/')[0], repo: opt.git_repo.split('/')[1], sha: opt.git_sha, From a679eaf46bc6d97748858c493696677f466e0e85 Mon Sep 17 00:00:00 2001 From: Zordius Chen Date: Fri, 15 Jul 2016 17:02:10 +0800 Subject: [PATCH 67/72] remove failed file --- gulpfile.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gulpfile.js b/gulpfile.js index 2636ee1..157f504 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -5,7 +5,7 @@ var gulp = require('gulp'), github = require('./index'); gulp.task('default', function () { - return gulp.src(['*.js', 'lint_test/*.js']) + return gulp.src(['*.js']) // , 'lint_test/*.js']) .pipe(eslint()) .pipe(jshint()) .pipe(jscs()) From 22c8c07dd90c48c8b98d6fcc111f492d039fc80f Mon Sep 17 00:00:00 2001 From: Zordius Chen Date: Fri, 15 Jul 2016 17:05:10 +0800 Subject: [PATCH 68/72] release --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3764e61..e7dad8e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "gulp-github", - "version": "0.3.4", + "version": "0.3.5", "description": "A gulp plugin to pipe contents to github pull request comments.", "author": "Zordius ", "contributors": [ From 2986633b6d632a82b4686210441a96e0ba9acffe Mon Sep 17 00:00:00 2001 From: Fabio Elia Date: Mon, 12 Dec 2016 10:39:50 -0500 Subject: [PATCH 69/72] Add eslint reporter --- index.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/index.js b/index.js index 1c7820d..356d58c 100644 --- a/index.js +++ b/index.js @@ -189,7 +189,9 @@ module.exports = function (options) { eslint_output = ['**Please fix these eslint issues first:**'], opt = options || {}, jshint_reporter = opt.jshint_reporter || jshint_simple_reporter, - jscs_reporter = opt.jscs_reporter || jscs_simple_reporter; + jscs_reporter = opt.jscs_reporter || jscs_simple_reporter, + eslint_reporter = opt.eslint_reporter || eslint_simple_reporter; + return through.obj(function (file, enc, callback) { if (file.jshint && !file.jshint.success && !file.jshint.ignored) { @@ -206,7 +208,7 @@ module.exports = function (options) { if (file.eslint) { file.eslint.messages.forEach(function (E) { - eslint_output.push(eslint_simple_reporter(E, file)); + eslint_output.push(eslint_reporter(E, file)); }); } From 33e1550e71b871d95195d4b6dc4fa868fe09c795 Mon Sep 17 00:00:00 2001 From: "Mike P. Sinn" Date: Mon, 10 Dec 2018 18:13:05 -0600 Subject: [PATCH 70/72] Allow for target_url on statuses --- .gitignore | 1 + index.js | 6 ++++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 3cdc0ad..e5f98f1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ node_modules coverage artifacts +.idea/ diff --git a/index.js b/index.js index 356d58c..e8124e1 100644 --- a/index.js +++ b/index.js @@ -59,14 +59,16 @@ var commentToPR = function (body, opt, cb) { }; var createStatusToCommit = function (state, opt, cb) { - getGIT(opt).repos.createStatus({ + var statusOptions = { user: opt.git_repo.split('/')[0], repo: opt.git_repo.split('/')[1], sha: opt.git_sha, state: state.state, description: state.description, context: state.context - }, cb); + }; + if(state.target_url){statusOptions.target_url = state.target_url;} + getGIT(opt).repos.createStatus(statusOptions, cb); }; var isPullRequest = function (opt) { From 5d5ec40d17056e0ab86209197ba3e2b79ee2e9d3 Mon Sep 17 00:00:00 2001 From: "Mike P. Sinn" Date: Mon, 10 Dec 2018 18:17:36 -0600 Subject: [PATCH 71/72] Added target_url to README --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 954a38f..c940fb9 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ gulp.task('lint_report_github', function () { console.log(E.message); // This handled jscs stream error. }) .pipe(eslint()) - .pipe(github(options)); // Comment issues in github PR! + .pipe(github(options)) // Comment issues in github PR! .pipe(github.failThisTask()); // Fail this task when jscs/jshint/eslint issues found. }); @@ -54,7 +54,8 @@ github.commentToPR('Yes! it works!!', options); github.createStatusToCommit({ description: 'No! 2 failures...', context: 'my gulp task', - state: 'failure' + state: 'failure', + target_url: 'http://www.homerswebpage.com/' }, options); // Or, create a task to reject PR with merged commits From c001aa1cc4bfe83f9a387ef65d941afddd1c1544 Mon Sep 17 00:00:00 2001 From: Zordius Chen <1201409+zordius@users.noreply.github.com> Date: Thu, 13 Dec 2018 10:02:15 +0800 Subject: [PATCH 72/72] release --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index e7dad8e..686354d 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "gulp-github", - "version": "0.3.5", + "version": "0.3.6", "description": "A gulp plugin to pipe contents to github pull request comments.", - "author": "Zordius ", + "author": "Zordius ", "contributors": [ { "name": "Zordius Chen",