summaryrefslogtreecommitdiff
path: root/modules/changes/changes.js
diff options
context:
space:
mode:
authortomsmeding <tom.smeding@gmail.com>2017-01-05 23:43:39 +0100
committertomsmeding <tom.smeding@gmail.com>2017-01-05 23:43:39 +0100
commitc57e57f5ba31db9b8d57f58ce98aab6eac9e48d7 (patch)
treed1d33a051d063d61b071861d6075237d779c4762 /modules/changes/changes.js
parent468e0f73f38ae64f912de3b9ac249b3b1198e76a (diff)
changes: Diffing!
Diffstat (limited to 'modules/changes/changes.js')
-rw-r--r--modules/changes/changes.js72
1 files changed, 72 insertions, 0 deletions
diff --git a/modules/changes/changes.js b/modules/changes/changes.js
index 7cbe7ee..8a0b3d9 100644
--- a/modules/changes/changes.js
+++ b/modules/changes/changes.js
@@ -5,6 +5,7 @@ var cmn=require("../$common.js"),
crypto=require("crypto"),
http=require("http"),
https=require("https"),
+ fs=require("fs"),
URL=require("url"),
child_process=require("child_process");
@@ -376,4 +377,75 @@ module.exports=function(app,io,_moddir){
refreshURLs();
res.send();
});
+ app.post("/changes/diff",function(req,res){
+ var param;
+ try {param=JSON.parse(req.body);}
+ catch(e){
+ res.status(400);
+ res.send("Invalid JSON sent");
+ return;
+ }
+ var url=param.url;
+ var newdate=new Date(param.newdate);
+ var olddate=new Date(param.olddate);
+ if(!urls[url]){
+ res.status(404);
+ res.send("URL not found in watch list");
+ return;
+ }
+ if(newdate.getTime()==NaN||olddate.getTime()==NaN){
+ res.status(400);
+ res.send("Invalid time(s) sent");
+ return;
+ }
+ if(newdate.getTime()==olddate.getTime()){
+ res.status(400);
+ res.send("Please select different records to diff");
+ return;
+ }
+ var tl=urls[url].timeline;
+ var newi=-1,oldi=-1,i;
+ for(i=0;i<tl.length;i++){
+ if(tl[i][0].getTime()==newdate.getTime()){
+ newi=i;
+ }
+ if(tl[i][0].getTime()==olddate.getTime()){
+ oldi=i;
+ }
+ }
+ if(newi==-1||oldi==-1){
+ res.status(404);
+ res.send("Times not found in timeline for URL");
+ return;
+ }
+ //res.send(tl[newi][1]+"\n"+tl[oldi][1]+"\n");
+ fs.mkdtemp("/tmp/changes-diff-tmp-",function(err,folder){
+ if(err){
+ console.log(err);
+ res.status(500);
+ res.send();
+ return;
+ }
+ var counter=0;
+ var fscb=function(err){
+ if(err){
+ console.log(err);
+ res.status(500);
+ res.send();
+ return;
+ }
+ counter++;
+ if(counter<2)return;
+ var proc=child_process.spawn(
+ "diff",
+ [folder+"/old.html",folder+"/new.html"],
+ {stdio:[process.stdin,fs.openSync(folder+"/diff.txt","w"),process.stderr]});
+ proc.on("exit",function(code,signal){
+ fs.createReadStream(folder+"/diff.txt").pipe(res);
+ });
+ };
+ fs.writeFile(folder+"/old.html",tl[oldi][2],fscb);
+ fs.writeFile(folder+"/new.html",tl[newi][2],fscb);
+ });
+ });
};