diff --git a/index.js b/index.js index 4a708f9..f178e84 100644 --- a/index.js +++ b/index.js @@ -4,6 +4,7 @@ var config = require('./config.json'); var parse = require('diff-parse'); var nodemailer = require('nodemailer'); var escape = require('escape-html'); +var async = require('async'); exports.handler = (event, context, callback) => { @@ -15,79 +16,89 @@ exports.handler = (event, context, callback) => { } else { var commits = event['body-json'].commits; + var email = ''; + email += 'Branch: ' + event['body-json'].ref + '
'; + email += 'Home: ' + event['body-json'].repository.html_url + '
'; + email += 'Compare: ' + event['body-json'].compare + '

'; - commits.forEach(function(e,i,a){ + async.forEach(commits, function(e, callback){ getDiffFromGitHub(e.url) .then((diff)=>{ var files = parse(diff); - var email = ''; - email += 'Branch: ' + event['body-json'].ref + '
'; - email += 'Home: ' + event['body-json'].repository.html_url + '
'; - email += 'Commit: ' + e.id + '
'; - email += 'Author: ' + e.author.name + '
'; - email += 'Compare: ' + event['body-json'].compare + '
'; + var commit_msg = '
'; + commit_msg += 'Author: ' + e.author.name + '
'; + commit_msg += 'Commit: ' + e.id + '
'; + commit_msg += 'Message: ' + e.message + '
'; + commit_msg += 'Date: ' + e.timestamp + '
'; + + for(var k=0; k < files.length; k++){ + var file = files[k]; - - files.forEach(function(file){ - - email += '
' + file.to + ''; //file modified name - email += ''; + commit_msg += '
' + file.to; //file modified name + commit_msg += '
'; for(var i = 0; i < file.lines.length; i++){ //Build HTML EMAIL var change = file.lines[i]; if(change.add){ - email += ''; + commit_msg += ''; } else if (change.del){ - email += ''; + commit_msg += ''; } else if (change.normal){ - email += ''; + commit_msg += ''; } if(change.add || change.del || change.normal){ - email += ''; + commit_msg += ''; //Deal with tabs and spaces for emails var content = escape(change.content); content = content.replace(/\t/g,'\u00a0 \u00a0'); content = content.replace(/ /g, '\u00a0'); if(change.add === true){ - email += ''; + commit_msg += ''; } else if (change.del){ - email += ''; + commit_msg += ''; } else { - email += ''; + commit_msg += ''; } - email += ''; + commit_msg += ''; } - }; - email+='
'; - email += (change.normal) ? change.ln2 : change.ln; - email += ''; + commit_msg += (change.normal) ? change.ln2 : change.ln; + commit_msg += '+' + content + '+' + content + '-' + content + '-' + content + '' + content + '' + content + '

'; - }); + commit_msg+='
'; - email+=''; - return Promise.resolve({email:email,commit:e}); + }; + email += commit_msg; + callback(); }) - .then((c)=>{ - var subject = '[' + event['body-json'].repository.full_name + '] ' + c.commit.id.substring(0,6) + ': ' + c.commit.message; - var from = c.commit.author.name + '<' + c.commit.author.email + '>'; - sendMail(c.email, subject, from); + .catch((err)=>{ + console.log("Create message error:" + err); + callback(err); + }); + }, function(err) { + if (err) return next(err); + + getSenderNameFromGitHub(event['body-json'].sender.url) + .then((name)=>{ + var subject = '[' + event['body-json'].repository.full_name + '] ' + name + ' has pushed changes - ' + event['body-json'].head_commit.message.substring(0,60) + '...'; + var from = name + '<' + event['body-json'].pusher.email + '>'; + email += ''; + sendMail(email, subject, from); }) .catch((err)=>{ + console.log("Get sender info error:" + err); callback(err); }); - }); - + }) } }; - function getDiffFromGitHub(url){ var promise = new Promise((resolve,reject)=>{ https.get(url + '.diff',(res)=>{ @@ -113,6 +124,31 @@ function getDiffFromGitHub(url){ return promise; }; +function getSenderNameFromGitHub(url){ + var promise = new Promise((resolve,reject)=>{ + https.get(url,(res)=>{ + var data=''; + res.on('data',(chunk)=>{ + data+=chunk; + }); + res.on('end',()=>{ + resolve(JSON.parse(data).name); + }); + + res.on('err',(err)=>{ + console.log("HTTP GET ERROR GITHUB URL:" + err); + reject(err); + }) + .on('error',(err)=>{ + console.log(err); + reject(err); + }); + }); + }); + + return promise; +}; + function sendMail(email, subject, from){ var auth = { diff --git a/package.json b/package.json index 63c776f..59726a4 100644 --- a/package.json +++ b/package.json @@ -9,8 +9,10 @@ "author": "Tony Truong", "license": "MIT", "dependencies": { + "async": "^2.0.1", "diff-parse": "0.0.13", "escape-html": "^1.0.3", - "nodemailer": "^2.5.0" + "nodemailer": "^2.5.0", + "smtp-connection": "^2.10.0" } }