2014-11-12 05:48:26 +03:00
|
|
|
|
/**********************************************************************
|
|
|
|
|
|
*
|
|
|
|
|
|
*
|
|
|
|
|
|
*
|
|
|
|
|
|
**********************************************************************/
|
|
|
|
|
|
|
2014-11-14 21:57:55 +03:00
|
|
|
|
var path = require('path')
|
2014-12-16 04:50:34 +03:00
|
|
|
|
var events = require('events')
|
|
|
|
|
|
|
|
|
|
|
|
var fse = require('fs.extra')
|
|
|
|
|
|
var glob = require('glob')
|
|
|
|
|
|
var promise = require('promise')
|
2014-11-14 21:57:55 +03:00
|
|
|
|
|
|
|
|
|
|
|
2014-11-12 05:48:26 +03:00
|
|
|
|
define(function(require){ var module = {}
|
|
|
|
|
|
console.log('>>> file')
|
|
|
|
|
|
|
|
|
|
|
|
//var DEBUG = DEBUG != null ? DEBUG : true
|
|
|
|
|
|
|
2014-11-14 21:57:55 +03:00
|
|
|
|
var tasks = require('lib/tasks')
|
2014-11-12 05:48:26 +03:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-11-14 21:57:55 +03:00
|
|
|
|
/*********************************************************************/
|
2014-11-12 05:48:26 +03:00
|
|
|
|
|
2014-11-14 21:57:55 +03:00
|
|
|
|
var INDEX_DIR = '.ImageGrid'
|
2014-11-12 05:48:26 +03:00
|
|
|
|
|
|
|
|
|
|
|
2014-12-16 04:50:34 +03:00
|
|
|
|
/*********************************************************************/
|
|
|
|
|
|
// Queue
|
|
|
|
|
|
//
|
|
|
|
|
|
// Task
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-11-12 05:48:26 +03:00
|
|
|
|
/*********************************************************************/
|
2014-12-10 19:59:05 +03:00
|
|
|
|
// things we need...
|
|
|
|
|
|
// - load latest by pattern
|
|
|
|
|
|
// - merge
|
|
|
|
|
|
// - load latest base
|
|
|
|
|
|
// - merge diffs later than base
|
|
|
|
|
|
// - find index(s) in subtree
|
|
|
|
|
|
// - load index
|
|
|
|
|
|
// - data version
|
|
|
|
|
|
// - join indexes
|
|
|
|
|
|
// - take care of different base paths in images
|
|
|
|
|
|
//
|
2014-12-16 04:50:34 +03:00
|
|
|
|
//
|
|
|
|
|
|
//
|
2014-12-12 03:56:58 +03:00
|
|
|
|
// Might also be a nice idea to generic import:
|
|
|
|
|
|
// - get all .ImageGrid/*.json
|
2014-12-16 04:50:34 +03:00
|
|
|
|
// - group by ([a-z]*).* <20> pattern with <keyword>
|
2014-12-12 03:56:58 +03:00
|
|
|
|
// - sort by name, descending
|
|
|
|
|
|
// - split at first non-diff
|
|
|
|
|
|
// - merge diff's in reverse tail to head
|
|
|
|
|
|
//
|
2014-12-16 04:50:34 +03:00
|
|
|
|
// ...and output to format:
|
2014-12-12 03:56:58 +03:00
|
|
|
|
// {
|
|
|
|
|
|
// <keyword>: <data>,
|
|
|
|
|
|
// ...
|
|
|
|
|
|
// }
|
|
|
|
|
|
//
|
2014-11-12 05:48:26 +03:00
|
|
|
|
|
2014-12-16 04:50:34 +03:00
|
|
|
|
// XXX return a promice rather than an event emitter....
|
2014-11-14 21:57:55 +03:00
|
|
|
|
function listIndexes(base){
|
|
|
|
|
|
return glob(base +'/**/'+ INDEX_DIR)
|
|
|
|
|
|
}
|
2014-11-12 05:48:26 +03:00
|
|
|
|
|
|
|
|
|
|
|
2014-12-16 04:50:34 +03:00
|
|
|
|
// XXX return a promice rather than an event emitter....
|
|
|
|
|
|
function listJSON(path, pattern){
|
|
|
|
|
|
pattern = pattern || '*'
|
|
|
|
|
|
return glob(path +'/'+ pattern +'.json')
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var loadFile = promise.denodeify(fse.readFile)
|
|
|
|
|
|
function loadJSON(path){
|
|
|
|
|
|
return readFile(path).then(JSON.parse)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// json file name format:
|
|
|
|
|
|
// [<timestamp>-]<keyword>[-diff].json
|
|
|
|
|
|
//
|
|
|
|
|
|
// events emited:
|
|
|
|
|
|
// - queued <path> - json file path queued for loading
|
|
|
|
|
|
// - loaded <path> - done loading json file path
|
|
|
|
|
|
// - index <path> <data> - done loding index at path
|
|
|
|
|
|
// - end <indexes> - done loading all indexes
|
|
|
|
|
|
//
|
|
|
|
|
|
// XXX return a promice rather than an event emitter....
|
|
|
|
|
|
function loadIndex(path, emitter){
|
|
|
|
|
|
var p = path.split(INDEX_DIR)
|
|
|
|
|
|
var last = p.slice(-1)[0].trim()
|
|
|
|
|
|
|
|
|
|
|
|
var end = emitter == null
|
|
|
|
|
|
emitter = emitter == null ? new events.EventEmitter() : emitter
|
|
|
|
|
|
|
|
|
|
|
|
// we've got an index...
|
|
|
|
|
|
if(p.length > 1 && /^\/*$/.test(last)){
|
|
|
|
|
|
listJSON(path)
|
|
|
|
|
|
.on('end', function(files){
|
|
|
|
|
|
var res = {}
|
|
|
|
|
|
var index = {}
|
|
|
|
|
|
// group by keyword...
|
|
|
|
|
|
files
|
|
|
|
|
|
.sort()
|
|
|
|
|
|
.reverse()
|
|
|
|
|
|
.forEach(function(n){
|
|
|
|
|
|
var s = n.split(/[-.]/g).slice(0, -1)
|
|
|
|
|
|
|
|
|
|
|
|
// <keyword>.json / non-diff
|
|
|
|
|
|
if(s.length == 1){
|
|
|
|
|
|
var k = s[0]
|
|
|
|
|
|
var d = false
|
|
|
|
|
|
|
|
|
|
|
|
// <timestamp>-<keyword>[-diff].json / diff / non-diff
|
|
|
|
|
|
} else {
|
|
|
|
|
|
var k = s[1]
|
|
|
|
|
|
var d = s[2] == 'diff'
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// new keyword...
|
|
|
|
|
|
if(index[k] == null){
|
|
|
|
|
|
index[k] = []
|
|
|
|
|
|
|
|
|
|
|
|
// do not add anything past the latest non-diff
|
|
|
|
|
|
// for each keyword...
|
|
|
|
|
|
} else if(index[k].slice(-1)[0][0] == false){
|
|
|
|
|
|
index[k].push([d, n])
|
|
|
|
|
|
emitter.emit('queued', n)
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
index[k].push([d, n])
|
|
|
|
|
|
emitter.emit('queued', n)
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
// load...
|
|
|
|
|
|
promise
|
|
|
|
|
|
.all(Object.keys(index).map(function(k){
|
|
|
|
|
|
// get relevant paths...
|
|
|
|
|
|
var diffs = index[k]
|
|
|
|
|
|
var latest = diffs.splice(-1)[0][1]
|
|
|
|
|
|
|
|
|
|
|
|
// load latest...
|
|
|
|
|
|
return loadJSON(latest)
|
|
|
|
|
|
.then(function(data){
|
|
|
|
|
|
// handle diffs...
|
|
|
|
|
|
return promise
|
|
|
|
|
|
.all(diffs
|
|
|
|
|
|
.reverse()
|
|
|
|
|
|
.map(function(p){
|
|
|
|
|
|
p = p[1]
|
|
|
|
|
|
return loadJSON(p)
|
|
|
|
|
|
.done(function(json){
|
|
|
|
|
|
// merge...
|
|
|
|
|
|
for(var k in json){
|
|
|
|
|
|
data[k] = json[k]
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
emitter.emit('loaded', p)
|
|
|
|
|
|
})
|
|
|
|
|
|
}))
|
|
|
|
|
|
.then(function(){
|
|
|
|
|
|
res[k] = data
|
|
|
|
|
|
|
|
|
|
|
|
emitter.emit('loaded', latest)
|
|
|
|
|
|
})
|
|
|
|
|
|
})
|
|
|
|
|
|
})
|
|
|
|
|
|
.then(function(){
|
|
|
|
|
|
emitter.emit('index', path, res)
|
|
|
|
|
|
|
|
|
|
|
|
// indicate end only if we are not part of a multi-index load...
|
|
|
|
|
|
if(end){
|
|
|
|
|
|
emitter.emit('end', {path: res})
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
// no explicit index given -- find all in sub tree...
|
|
|
|
|
|
} else {
|
|
|
|
|
|
var res = {}
|
|
|
|
|
|
|
|
|
|
|
|
// collect the found indexes...
|
|
|
|
|
|
emitter.on('index', function(path, obj){ res[path] = obj })
|
|
|
|
|
|
|
|
|
|
|
|
listIndexes(path)
|
|
|
|
|
|
.on('end', function(indexes){
|
|
|
|
|
|
indexes.forEach(function(path){ loadIndex(path, emitter) })
|
|
|
|
|
|
|
|
|
|
|
|
// XXX need to call this when the load was done...
|
|
|
|
|
|
emitter.emit('end', res)
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return emitter
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-11-12 05:48:26 +03:00
|
|
|
|
/**********************************************************************
|
|
|
|
|
|
* vim:set ts=4 sw=4 : */
|
|
|
|
|
|
return module })
|