Initial commit
This commit is contained in:
279
lib/setup/setupRepo.js
Normal file
279
lib/setup/setupRepo.js
Normal file
@@ -0,0 +1,279 @@
|
||||
'use strict';
|
||||
function Repo(options) {
|
||||
const tools = require(__dirname + '/../tools.js');
|
||||
const extend = require('node.extend');
|
||||
let defaultSystemRepo = {
|
||||
"common": {
|
||||
"name": "System repositories",
|
||||
"dontDelete": true
|
||||
},
|
||||
"native": {
|
||||
"repositories": {
|
||||
"default": {
|
||||
"link": "http://download.yunkong2.net/sources-dist.json",
|
||||
"json": null
|
||||
},
|
||||
"latest": {
|
||||
"link": "http://download.yunkong2.net/sources-dist-latest.json",
|
||||
"json": null
|
||||
}
|
||||
}
|
||||
},
|
||||
"_id": "system.repositories",
|
||||
"type": "config"
|
||||
};
|
||||
|
||||
options = options || {};
|
||||
|
||||
if (!options.objects) throw 'Invalid arguments: objects is missing';
|
||||
|
||||
var objects = options.objects;
|
||||
|
||||
function updateRepo(repoUrl, callback) {
|
||||
var result = {};
|
||||
|
||||
if (!repoUrl || typeof repoUrl !== 'object') {
|
||||
tools.getRepositoryFile(repoUrl, function (err, sources) {
|
||||
updateRepo(sources, callback);
|
||||
});
|
||||
return;
|
||||
}
|
||||
var sources = repoUrl;
|
||||
var downloads = [];
|
||||
|
||||
function download() {
|
||||
if (downloads.length < 1) {
|
||||
console.log('update done');
|
||||
if (callback) callback(result);
|
||||
} else {
|
||||
var name = downloads.pop();
|
||||
|
||||
if (sources[name].version) {
|
||||
result[name] = sources[name];
|
||||
} else if (sources[name].meta) {
|
||||
tools.getJson(sources[name].meta, function (ioPack) {
|
||||
if (ioPack && ioPack.common) {
|
||||
result[name] = extend(true, sources[name], ioPack.common);
|
||||
}
|
||||
setImmediate(download);
|
||||
});
|
||||
return;
|
||||
} else if (sources[name].url) {
|
||||
console.log('Cannot get version of "' + name + '".');
|
||||
result[name] = sources[name];
|
||||
} else {
|
||||
console.log('Cannot get any information of "' + name + '". Ignored.');
|
||||
}
|
||||
setImmediate(download);
|
||||
}
|
||||
}
|
||||
|
||||
// Read repository file, local or by url
|
||||
for (var name in sources) {
|
||||
if (!sources.hasOwnProperty(name)) continue;
|
||||
downloads.push(name);
|
||||
}
|
||||
|
||||
download(/*sources*/);
|
||||
}
|
||||
|
||||
this.showRepo = function (repoUrl, flags, callback) {
|
||||
if (typeof flags === 'function') {
|
||||
callback = flags;
|
||||
flags = {};
|
||||
}
|
||||
|
||||
function showRepoResult(_name, sources) {
|
||||
var installed = tools.getInstalledInfo();
|
||||
var updatable;
|
||||
var keys = [];
|
||||
for (var key in sources) {
|
||||
if (!sources.hasOwnProperty(key)) continue;
|
||||
keys.push(key);
|
||||
}
|
||||
keys.sort();
|
||||
|
||||
for (var i = 0; i < keys.length; i++) {
|
||||
var name = keys[i];
|
||||
if (!sources.hasOwnProperty(name)) continue;
|
||||
updatable = false;
|
||||
var text = (sources[name].controller ? 'Controller ' : 'Adapter ');
|
||||
text += '"' + name + '"' + ((name.length < 15) ? new Array(15 - name.length).join(' ') : '');
|
||||
|
||||
var tLen = 10;
|
||||
if (name.length >= 15) tLen -= (name.length > tLen ? 1 : 0);
|
||||
if (tLen < 0) tLen = 0;
|
||||
|
||||
if (sources[name].version) {
|
||||
text += ': ' + sources[name].version + ((sources[name].version.length < tLen) ? new Array(tLen - sources[name].version.length).join(' ') : '');
|
||||
} else {
|
||||
text += new Array(tLen).join(' ')
|
||||
}
|
||||
if ((flags.installed || flags.i) && !installed[name]) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (installed[name] && installed[name].version) {
|
||||
text += ', installed ' + installed[name].version;
|
||||
if (sources[name].version !== installed[name].version &&
|
||||
sources[name].version &&
|
||||
!tools.upToDate(sources[name].version, installed[name].version)) {
|
||||
updatable = true;
|
||||
text += ' [Updateable]';
|
||||
}
|
||||
}
|
||||
if ((flags.updatable || flags.u) && !updatable) {
|
||||
continue;
|
||||
}
|
||||
console.log(text);
|
||||
}
|
||||
}
|
||||
|
||||
// Get the repositories
|
||||
objects.getObject('system.config', function (err, sysConfig) {
|
||||
objects.getObject('system.repositories', function (err, obj) {
|
||||
if (err || !obj) {
|
||||
console.log('Error: Object "system.config" not found');
|
||||
} else {
|
||||
if (!obj.native || !obj.native.repositories) {
|
||||
console.log('Error: no repositories found in the "system.config');
|
||||
} else {
|
||||
repoUrl = repoUrl || sysConfig.common.activeRepo;
|
||||
|
||||
console.log('Used repository: ' + repoUrl);
|
||||
|
||||
// If known repository
|
||||
if (obj.native.repositories[repoUrl]) {
|
||||
if (typeof obj.native.repositories[repoUrl] === 'string') {
|
||||
obj.native.repositories[repoUrl] = {
|
||||
link: obj.native.repositories[repoUrl],
|
||||
json: null
|
||||
};
|
||||
}
|
||||
|
||||
updateRepo(obj.native.repositories[repoUrl].link, function (sources) {
|
||||
obj.native.repositories[repoUrl].json = sources;
|
||||
obj.from = 'system.host.' + tools.getHostName() + '.cli';
|
||||
obj.ts = new Date().getTime();
|
||||
objects.setObject(obj._id, obj, function () {
|
||||
showRepoResult(repoUrl, sources);
|
||||
if (callback) callback();
|
||||
});
|
||||
});
|
||||
} else {
|
||||
updateRepo(repoUrl, function (sources) {
|
||||
showRepoResult(null, sources);
|
||||
if (callback) callback();
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
this.showRepoStatus = function (callback) {
|
||||
objects.getObject('system.repositories', function (err, obj) {
|
||||
if (err || !obj) {
|
||||
console.error('Cannot get list: ' + err);
|
||||
callback(102);
|
||||
} else {
|
||||
if (obj.native.repositories) {
|
||||
for (var r in obj.native.repositories) {
|
||||
if (obj.native.repositories.hasOwnProperty(r)){
|
||||
console.log(r + (r.length < 12 ? new Array(12 - r.length).join(' ') : '') + ': ' + obj.native.repositories[r].link);
|
||||
}
|
||||
}
|
||||
objects.getObject('system.config', function (err, obj) {
|
||||
if (obj) {
|
||||
console.log('\nActive repo: ' + obj.common.activeRepo);
|
||||
}
|
||||
callback();
|
||||
});
|
||||
} else {
|
||||
console.error('Cannot get list: ' + err);
|
||||
callback(102);
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
this.add = function (repoName, repoUrl, callback) {
|
||||
objects.getObject('system.repositories', function (err, obj) {
|
||||
if (err) {
|
||||
callback && callback(err);
|
||||
} else
|
||||
if (!obj) {
|
||||
obj = defaultSystemRepo;
|
||||
}
|
||||
|
||||
if (obj.native.repositories[repoName]) {
|
||||
callback && callback('Repository "' + repoName + '" yet exists: ' + obj.native.repositories[repoName].link);
|
||||
} else {
|
||||
obj.native.repositories[repoName] = {
|
||||
link: repoUrl,
|
||||
json: null
|
||||
};
|
||||
obj.from = 'system.host.' + tools.getHostName() + '.cli';
|
||||
obj.ts = new Date().getTime();
|
||||
objects.setObject('system.repositories', obj, callback);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
this.del = function (repoName, callback) {
|
||||
objects.getObject('system.config', function (err, obj) {
|
||||
if (err) {
|
||||
callback && callback(err);
|
||||
} else {
|
||||
if (obj.common.activeRepo === repoName) {
|
||||
callback && callback('Cannot delete active repository: ' + repoName);
|
||||
} else {
|
||||
objects.getObject('system.repositories', function (err, obj) {
|
||||
if (err) {
|
||||
callback && callback(err);
|
||||
} else if (!obj) {
|
||||
callback && callback();
|
||||
} else {
|
||||
if (!obj.native.repositories[repoName]) {
|
||||
callback && callback('Repository "' + repoName + '" not found.');
|
||||
} else {
|
||||
delete obj.native.repositories[repoName];
|
||||
obj.from = 'system.host.' + tools.getHostName() + '.cli';
|
||||
obj.ts = new Date().getTime();
|
||||
objects.setObject('system.repositories', obj, callback);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
this.setActive = function (repoName, callback) {
|
||||
objects.getObject('system.repositories', function (err, obj) {
|
||||
if (err) {
|
||||
callback && callback(err);
|
||||
} else
|
||||
if (!obj) {
|
||||
obj = defaultSystemRepo;
|
||||
}
|
||||
if (!obj.native.repositories[repoName]) {
|
||||
callback && callback('Repository "' + repoName + '" not found.');
|
||||
} else {
|
||||
objects.getObject('system.config', function (err, obj) {
|
||||
if (err) {
|
||||
callback && callback(err);
|
||||
} else {
|
||||
obj.common.activeRepo = repoName;
|
||||
obj.from = 'system.host.' + tools.getHostName() + '.cli';
|
||||
obj.ts = new Date().getTime();
|
||||
objects.setObject('system.config', obj, callback);
|
||||
}
|
||||
});
|
||||
}
|
||||
})
|
||||
};
|
||||
}
|
||||
|
||||
module.exports = Repo;
|
||||
Reference in New Issue
Block a user