GitLogParser.js
[gitlive] / GitLogParser.js
1
2 var File = imports.File.File;
3
4 GitLogParser = { 
5
6     parse : function(date)
7     {
8         this.date  = date;        
9         var home = '/home/alan';        
10         var lines = File.read(  home + '/.gitlog' + date.format('/Y/M/d') + 'txt').split("\n");
11         // first just convert them..
12         
13         for (var i = 0; i < lines.length; i++) {
14             lines[i] = this.parseLine(lines[i]);
15             if (i > 0) {
16                 lines[i-1].span = lines[i].start - lines[i-1].start; // should be seconds..?
17             }
18         });
19         // summarize data...
20         var hours = {};
21         for (var i = 0; i < lines.length; i++) {
22             var line = lines[i];
23             var hour = hours[line].start.format('H');
24             hours[hour] = (typeof(hours[hour]) == 'undefined') ? {} : hours[hour];
25             hours[hour][project] = (typeof(hours[project]) == 'undefined') ? 
26                     { total : 0, items = [] } 
27                     : hours[project];
28             hours[hour][project].total += line.span;
29             hours[hour][project].items.push(line);
30         }
31         return hours;
32
33     },
34     parseLine : function(l) 
35     {
36         var ret = { cmd : false; line : l };
37         var ar = l.split(/\S+/);
38         var time = ar.shift();
39         ret.start = xDate.parseDate(this.date.format('Y-m-d') + ' ' + time, 'Y-m-d H:i:s');
40
41
42         while (ret.cmd !== false) {
43             var ta = ar.pop();
44             if (ta == 'false') || ta[0] == '/') {
45                 ret.cmd = ta;
46                 break;
47             }
48             if (!ar.length) {
49                 throw "invalid line: " + l;
50             }
51
52         }
53         ret.title = ar.join(' ');
54         if (ret.title == 'IDLE') {
55             ret.project = 'IDLE';
56             return ret;        
57         }
58                 
59         
60
61         if (typeof(this[ret.cmd])=='undefined') {
62             throw "Unknown application: " + ret.line;
63         }
64         if (typeof(this[ret.cmd])=='string') {
65             ret.project = this[ret.cmd]  
66         } else {
67
68             this[ret.cmd](ret);
69         }
70
71
72         return ret;
73
74     },
75
76     '/usr/bin/perl' : function(ret) {
77         if (ret.title.match(/^PAC/)) {
78             ret.project = 'Unknown';
79             return;
80         }
81         throw "Unknown match: " + ret.line;
82     },
83     '/usr/lib/icedove/icedove-bin' : 'Checking Mail',
84     '/usr/lib/chromium/chromium' : function (ret) {
85
86           switch(true) {
87
88                 case (ret.title.match(/Media Clipping Portal/)):
89                     ret.project = 'Media Outreach';
90                     return;
91                 
92                 default:
93                     ret.project = 'Browsing';
94                     return;
95           }
96
97     },
98     '/usr/lib/Komodo-Edit-7/lib/mozilla/komodo' : function(ret) {
99           var l = ret.title.match(/Project\s+(^\)+)/);
100           print(l);
101               
102          throw "Unknown match: " + ret.line;
103     },
104     'guake' : 'Local Terminal',
105
106
107 }
108
109 var res = GitLogParser.parse(xDate.parseDate('2012-07-31', 'Y-m-d'));
110 print(JSON.stringify(res,null,4));
111
112 // open file..
113
114 // read lines
115
116 // summarize each hour
117
118 //convert line into 'Project / filename'
119
120