X-Git-Url: http://git.roojs.org/?p=gitlive;a=blobdiff_plain;f=GitLogParser.js;h=8c13ff40051b4ab5ab82552d0d07a58b56aaf8ad;hp=73b73fdb957f55c23fbc2a6aaf6cbe9f41a4ed0f;hb=refs%2Fheads%2Fwip_alan_T5782_messing_around_with_libgit2glib;hpb=627ad3ad07bc8a8838d51d5edaa655aaf2789a19 diff --git a/GitLogParser.js b/GitLogParser.js index 73b73fdb..8c13ff40 100644 --- a/GitLogParser.js +++ b/GitLogParser.js @@ -3,15 +3,26 @@ var File = imports.File.File; xDate = imports.Date; -GitLogParser = { + + +GitLogParser = { + shours : false, + date : false, parse : function(date) { - this.date = date; - var home = GLib.get_home_dir(); - print( "READING FILE"); - var flines = File.read( home + '/.gitlog' + date.format('/Y/m/d') + '.log').split("\n"); - print("loaded"); + var filename = date; + if (typeof(date) == 'object') { + this.date = date; + var home = GLib.get_home_dir(); + //print( "READING FILE"); + filename = home + '/.gitlog' + date.format('/Y/m/d') + '.log'; + + + } + + var flines = File.read( filename ).split("\n"); + //print("loaded"); // first just convert them.. // we had an old bug that did not put line breaks in there.. // however 00:00:00: is pretty distinct, so let'st try and split on it.. @@ -41,11 +52,17 @@ GitLogParser = { } - print("parsed"); + //print("parsed"); //print(JSON.stringify(lines,null,4)); // summarize data... var hours = {}; + var shours = {}; + + // shours should be: + // hour : [ ] + + for (var i = 0; i < lines.length; i++) { var line = lines[i]; var hour = line.start.format('H'); @@ -53,6 +70,9 @@ GitLogParser = { if (line.project == 'IDLE' && line.spanMin >= 5 ) { line.project = 'LONGIDLE'; } + if (line.project == 'IDLE' || line.project == 'LONGIDLE') { + line.desc = line.project; + } var project = line.project; hours[hour] = (typeof(hours[hour]) == 'undefined') ? {} : hours[hour]; @@ -61,7 +81,24 @@ GitLogParser = { : hours[hour][project]; hours[hour][project].total += line.span; hours[hour][project].items.push(line); + + hours[-1] = (typeof(hours[-1]) == 'undefined') ? {} : hours[-1]; + hours[-1][project] = (typeof(hours[-1][project]) == 'undefined') ? + { total : 0, items : {} } + : hours[-1][project]; + + hours[-1][project].total += line.span; + hours[-1][project].items[line.desc] = (typeof(hours[-1][project].items[line.desc]) == 'undefined' ? + 0 : hours[-1][project].items[line.desc]) + line.span; + + shours[hour] = (typeof(shours[hour]) == 'undefined') ? {} : shours[hour]; + shours[hour][line.desc] = (typeof(shours[hour][line.desc] ) == 'undefined') ? 0 : shours[hour][line.desc] ; + shours[hour][line.desc] += line.span; + + + } + this.shours = shours; return hours; }, @@ -69,13 +106,19 @@ GitLogParser = { { var ret = { cmd : false, line : l, span : 0 }; var ar = l.split(/\s+/); - print(JSON.stringify(ar)); + //print(JSON.stringify(ar)); + var time = ar.shift(); - //print("time: " + time); - ret.start = xDate.Date.parseDate(this.date.format('Y-m-d') + ' ' + time, 'Y-m-d H:i:s'); + ret.desc = ar.join(' '); + //print("time: " + time); + + //ret.start = xDate.Date.parseDate(this.date.format('Y-m-d') + ' ' + time, 'Y-m-d H:i:s'); + ret.start = xDate.Date.parseDate( + (this.date ? this.date.format('Y-m-d') :'2013-01-01') + + ' ' + time, 'Y-m-d H:i:s'); while (ret.cmd === false) { var ta = ar.pop(); @@ -99,8 +142,22 @@ GitLogParser = { ret.project = 'IDLE'; return ret; } - + ret.project = 'Unknown'; + for(var proj in this.regexes) { + for(var r in this.regexes[proj]) { + if (ret.line.match(this.regexes[proj][r])) { + //print("Match " + proj + " on " + r + ret.line + ) + ret.project = proj; + break; + } + } + if (ret.project != 'Unknown') { + break; + } + } + return ret; + /* if (typeof(this[ret.cmd])=='undefined') { ret.project = 'Unknown'; @@ -109,8 +166,8 @@ GitLogParser = { throw { error : "TEST"}; } - print(ret.cmd); - print(ret.title); + //print(ret.cmd); + //print(ret.title); if (typeof(this[ret.cmd])=='string') { ret.project = this[ret.cmd] } else { @@ -120,14 +177,57 @@ GitLogParser = { return ret; + */ }, - + + regexes : { + 'HPA' : [ /web.hpasite/, /Roo Application Builder - Site/, /HP Intranet/, /Hpasite/ ], + 'MediaOut' : [ /app\.WorkerBee/, /web\.MediaOut/, /workerbee/, + /media-outreach/ , /Press Release Image Portal/, /Media Outreach Feed/ , /PressRelease/, + /Clipping Portal/, /Media OutReach/, + /Auto Searching/ , // These are the excel files they send over.. + /sitemap\.xml/, + /Builder - Clipping/ + ], + 'Habito' : [ /Interspire/ ], + 'Hebe' :[ /web.hhyc_membership_system/ ,/Builder - Hebe/, /Hebe Haven Membership Managment/], + + 'RIS' : [ /Project web.Ris/ , /RIS HK/ , /Hydra/, /hydrajobs/ ], + // for who thoug... + 'Mailfort' : [ /web.FlexySpam/ ], + 'Emily' : [ /greengarden/ ,/Inventory \| Warehouse/, /Emily/ ], + 'GPUK' : [/gp-wordpress/, /Greenpeace UK/], + + 'COBA' : [/Veridate/, /web\.coba/, /COBA/ ,/Pipeline - DS view/, /Coba/, /Pman.BAdmin/ , /SoapUI/ ], + 'Regulation Asia' : [/Regulation Asia/, /comocracy/], + 'Unknown Project' : [ /PAC/ , /Guake/ , /WhatsApp/ ,/Mozilla Thunderbird/], + 'Admin Work' : [ /roojs.com\/admin/, /RooJSolutions Management Portal/ ] + + + }, + + match_project : function(line) { + for(var proj in this.regexes) { + for(var r in this.regexes[proj]) { + if (line.match(this.regexes[proj][r])) { + //print("Match " + proj + " on " + r + ret.line + ) + return proj; + + } + } + + } + return "Unknown"; + }, + + '/usr/bin/perl' : function(ret) { if (ret.title.match(/^PAC/)) { ret.project = 'Unknown'; - return; + return 'Unknown'; } + return 'Unknown'; throw "Unknown match: " + ret.line; }, '/usr/lib/icedove/icedove-bin' : 'Checking Mail', @@ -163,15 +263,15 @@ if (typeof(Seed.argv[2]) == 'undefined') { print("pick a date"); Seed.quit(); } - - -var res = GitLogParser.parse(xDate.Date.parseDate(Seed.argv[2], 'Y-m-d')); -var totals = { work : 0 , idle: 0, shortidle : 0} + +var res = GitLogParser.parse( Seed.argv[2][0] == '/' ? Seed.argv[2] : xDate.Date.parseDate(Seed.argv[2], 'Y-m-d')); +var totals = { work : 0 , idle: 0, shortidle : 0}; +var unknown = []; for (var h in res) { for (var p in res[h]) { if (p == 'LONGIDLE') { var idletime = Math.floor(res[h][p].total/60000) ; - print(h + ' ' + Math.floor(res[h][p].total/60000) +'m LONGIDLE' ); + //print(h + ' ' + Math.floor(res[h][p].total/60000) +'m LONGIDLE' ); totals.idle += idletime; @@ -179,7 +279,7 @@ for (var h in res) { } if (p == 'IDLE') { var idletime = Math.floor(res[h][p].total/60000) ; - print(h + ' ' + Math.floor(res[h][p].total/60000) +'m SHORT IDLE' ); + //print(h + ' ' + Math.floor(res[h][p].total/60000) +'m SHORT IDLE' ); totals.shortidle += idletime; @@ -187,23 +287,69 @@ for (var h in res) { } - print(h + ' ' + Math.floor(res[h][p].total/60000) +'m ' + p ); + //print(h + ' ' + Math.floor(res[h][p].total/60000) +'m ' + p ); totals.work += Math.floor(res[h][p].total/60000) ; - for (var k in res[h][p].items) { - - //print( ' ' + Math.floor(res[h][p].items[k].span/60000) +'m ' + res[h][p].items[k].line ); - - } + + if (h == -1) { + + print( "\n" + p + ':' + Math.floor(res[h][p].total/60000) + 'm'); + + if (p != 'Unknown') { + for (var k in res[h][p].items) { + + print( ' ' + Math.floor(res[h][p].items[k]/60000) +'m ' + k ); + + } + } else { + + for (var k in res[h][p].items) { + unknown.push({ desc : k , tot : (res[h][p].items[k]/60000).toFixed(2)*1 }) ; + + + } + } + } } } + + print("\nLONGIDLE : " +(totals.idle/60).toFixed(2) +"h" ); print("\nShort Idle : " +(totals.shortidle/60).toFixed(2) +"h" ); print("Worked: " + (totals.work/60).toFixed(2) +"h\n" ); +var totals = {}; + +for (var h in GitLogParser.shours) { + var hsum = []; + var htot = 0; + for (var desc in GitLogParser.shours[h]) { + htot += (GitLogParser.shours[h][desc]/60000).toFixed(2)*1; + hsum.push({ desc : desc, tot : (GitLogParser.shours[h][desc]/60000).toFixed(2)*1 }) + totals[desc] = (typeof(totals[desc]) == 'undefined' ? 0 : totals[desc]) + ((GitLogParser.shours[h][desc]/60000).toFixed(2)*1); + } + hsum.sort(function(a,b) { if (a.tot == b.tot) { return 0; } return a.tot < b.tot ? 1 : -1 }); + print("\n\n" + h+': Total (' + htot +')'); + hsum.forEach(function(r) { + var pr = r.desc.match(/IDLE/) ? '' : (GitLogParser.match_project(r.desc) == "Unknown" ? '??? - ' : ''); + + print (" " + r.tot + " : " + pr + r.desc); + }); +} + + +unknown.sort(function(a,b) { if (a.tot == b.tot) { return 0; } return a.tot < b.tot ? 1 : -1 }); +print("\n\nUnclassified"); +unknown.forEach(function(r) { + print (" " + (r.tot.toFixed(2)*1) + " : " + r.desc); +}); + +//print(JSON.stringify(GitLogParser.shours,null,4)); + + // open file..