UNPKG

gardener

Version:

A node process manager for couchapps that depend on npm modules, or have npm modules bundled with them.

113 lines (85 loc) 2.72 kB
module.exports = generate_watch_list; var _ = require('underscore'); function path_type(path) { if (!path || path.length ===0) return 'couch'; if (path.indexOf('_design') > 0 ) return 'design'; var parts = path.split('/'); if (parts.length === 1) return 'db'; } function ddoc_db(path) { var parts = path.split('/'); if (parts[0] === '_design') return null; return parts[0]; } function ddoc_id(path) { var parts = path.split('/'); return parts.slice(1).join('/'); } function split_db_ddocs(names, default_db) { var results = { dbs: [], ddocs: {} }; _.each(names, function(path){ var type = path_type(path); if (type === 'db') return results.dbs.push(path); var db = ddoc_db(path); if (db) { var doc_id = ddoc_id(path); if (doc_id && doc_id.length > 0) { results.ddocs[db] = results.ddocs[db] || []; results.ddocs[db].push(doc_id); return; } } if (default_db) { // we assume that the path in this case is just the id results.ddocs[default_db] = results.ddocs[default_db] || []; results.ddocs[default_db].push(path); return; } }); results.dbs = _.uniq(results.dbs); return results; } function generate_watch_list(base_url, couch_root_url, all_dbs, includes, excludes) { // base is the path difference between the base_url and the couch_root_url var base = base_url.substring(couch_root_url.length); var result = { couch_root_url : couch_root_url, base: base, base_type : path_type(base), dbs: all_dbs, ddocs: { includes: {}, excludes: {} } }; var default_db = null; if (result.base_type === 'db') { all_dbs = _.intersection([result.base], all_dbs); default_db = result.base; } if (result.base_type === 'design') { var db = ddoc_db(result.base); all_dbs = _.intersection([db], all_dbs); default_db = db; } var incl = split_db_ddocs(includes, default_db); result.ddocs.includes = incl.ddocs; if (incl.dbs.length > 0) { all_dbs = _.intersection(all_dbs, incl.dbs); } else { var keys = _.keys(result.ddocs.includes); if (keys && keys.length > 0) { all_dbs = _.intersection(all_dbs, keys); } } var excl = split_db_ddocs(excludes, default_db); result.ddocs.excludes = excl.ddocs; if (excl.dbs.length > 0) { all_dbs = _.difference(all_dbs, excl.dbs); } result.dbs = all_dbs; return result; }