gamelet-cli
Version:
Download project from code.gamelet.com, edit/test in vscode and sync back to server.
280 lines • 25 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.upload = void 0;
const file_1 = require("../utils/file");
const net_1 = require("../utils/net");
const merges_1 = require("./merges");
const cli_progress_1 = __importDefault(require("cli-progress"));
const inquirer_1 = __importDefault(require("inquirer"));
const isbinaryfile_1 = require("isbinaryfile");
const tempFolder = '/.temp';
const upload = ({ projectCode, folder, token, debug }) => {
if (debug) {
console.log('debug = true');
}
let srcFolder = `${folder}/src`;
(0, net_1.apiSetToken)(token);
(0, file_1.setFileCacheFolder)(folder);
if (!(0, file_1.fileExists)(srcFolder)) {
return Promise.reject(`${srcFolder} does not exist`);
}
let zipFilename = folder + tempFolder + '/sources.zip';
return Promise.resolve()
.then(() => validateToken(projectCode, token))
.then(() => validateGitCommit(folder))
.then(() => checkSourcesMerged(zipFilename, projectCode, folder, token))
.then(basezip => createUploadQueue(projectCode, basezip, folder))
.then(queue => processUploadQueue(projectCode, queue, folder))
.then(queue => queue.length && downloadBase(zipFilename, projectCode, folder, token))
.then(() => (0, file_1.rmdir)(`${folder}${tempFolder}`).catch(_e => { }))
.then(() => {
console.log();
console.log('done');
})
.catch(err => {
console.log();
console.error(err);
})
.then(() => console.log());
};
exports.upload = upload;
function validateGitCommit(folder) {
return (0, file_1.isGitCommitted)(folder)
.then(committed => {
if (!committed) {
return Promise.reject('Please commit your current sources first.');
}
else {
return Promise.resolve();
}
});
}
function validateToken(projectCode, _token) {
return (0, net_1.apiGet)(`/validate/local_dev_token/${projectCode}/edit`)
.catch(_e => {
console.error('Only the current Project Editor can do the upload');
throw _e;
});
}
function downloadBase(zipFilename, projectCode, folder, token) {
let basezip = `${folder}/.cg/sources.base`;
console.log(`update sources base ...`);
return Promise.resolve()
.then(() => {
if (!(0, file_1.fileExists)(zipFilename)) {
let progressBar = new cli_progress_1.default.SingleBar({}, cli_progress_1.default.Presets.shades_classic);
return (0, file_1.downloadFile)((0, net_1.cgUrl)(`/download/${projectCode}?token=${token}`), zipFilename, progressBar, { noCache: true })
.then(() => progressBar && progressBar.stop());
}
else {
return Promise.resolve();
}
})
.then(() => (0, file_1.moveFile)(zipFilename, basezip));
}
let sourcesProcessing;
function checkSourcesMerged(zipFilename, projectCode, folder, token) {
let progressBar = new cli_progress_1.default.SingleBar({}, cli_progress_1.default.Presets.shades_classic);
sourcesProcessing = [];
let basezip = `${folder}/.cg/sources.base`;
if (!(0, file_1.fileExists)(basezip)) {
return Promise.reject('Cannot merge: source base missing.');
}
console.log(`prepare updates: download remote sources ...`);
return (0, file_1.downloadFile)((0, net_1.cgUrl)(`/download/${projectCode}?token=${token}`), zipFilename, progressBar, { noCache: true })
.then(() => {
progressBar.stop();
return (0, file_1.getFileZip)(zipFilename);
})
.then(jszip => {
return Promise.resolve()
.then(() => (0, file_1.rmdir)(`${folder}${tempFolder}`).catch(_e => { }))
.then(() => (0, file_1.getFileZip)(basezip))
.then(basezip => {
let saveSrcFiles = [];
sourcesProcessing = [];
console.log(`prepare updates: diff remote sources ...`);
for (let filename in jszip.files) {
if (filename.startsWith('src/')) {
saveSrcFiles.push(checkSourceMerged(jszip.file(filename), basezip.file(filename), folder));
}
}
return Promise.all(saveSrcFiles)
.then(results => {
if (results.find(result => !result)) {
return Promise.reject(`Please do a merge before upload.\nRun the command "gamelet merge"`);
}
return basezip;
});
});
});
}
function checkSourceMerged(file, base, folder) {
if (sourcesProcessing.length > 19) {
return (0, file_1.wait)(30).then(() => checkSourceMerged(file, base, folder));
}
sourcesProcessing.push(file);
return (0, merges_1.isSourceMerged)(file.name, file, base, folder)
.then(result => {
let index = sourcesProcessing.indexOf(file);
sourcesProcessing.splice(index, 1);
return result;
});
}
function processUploadQueue(projectCode, queue, _folder) {
if (!queue.length) {
console.log('nothing to upload');
return Promise.resolve(queue);
}
return inquirer_1.default.prompt([
{
type: 'confirm',
name: 'confirm',
message: `${queue.length} item(s) to upload to "${projectCode}", Continue?`,
}
])
.then(result => {
if (result.confirm) {
sourcesProcessing = [];
let progressBar = new cli_progress_1.default.SingleBar({}, cli_progress_1.default.Presets.shades_classic);
progressBar.start(queue.length, 0);
return Promise.all(queue.map(item => processUploadQueueItem(projectCode, item, progressBar)))
.then(() => progressBar.stop());
}
else {
queue.length = 0;
}
return Promise.resolve();
})
.then(() => queue);
}
function processUploadQueueItem(projectCode, queueItem, progressBar) {
if (sourcesProcessing.length > 5) {
return (0, file_1.wait)(30).then(() => processUploadQueueItem(projectCode, queueItem, progressBar));
}
sourcesProcessing.push(queueItem);
return Promise.resolve()
.then(() => {
return (0, net_1.apiPost)(`/update/source/local_dev/${projectCode}/${queueItem.action}`, {
path: queueItem.path,
filename: queueItem.filename,
content: queueItem.content || '',
});
})
.then(() => {
progressBar.increment(1);
let index = sourcesProcessing.indexOf(queueItem);
sourcesProcessing.splice(index, 1);
});
}
function createUploadQueue(projectCode, basezip, folder) {
sourcesProcessing = [];
let srcFolder = `${folder}/src`;
let queue = [];
let filesToDelete = {};
for (let filename in basezip.files) {
let search = filename.match(/^src\/(.*\/)?([^\/]+)$/);
if (search) {
let path = search[1] ? search[1].substr(0, search[1].length - 1) : '';
let fname = search[2];
let fullpath = path ? `${path}/${fname}` : fname;
filesToDelete[fullpath] = {
path: path,
filename: fname,
};
}
}
console.log('listing files to upload...');
console.log('===============================');
return (0, file_1.listFiles)(srcFolder)
.then(files => {
return Promise.all(files.map(file => updateSource(projectCode, srcFolder, '', file, basezip, queue, filesToDelete)));
})
.then(() => {
sourcesProcessing = [];
for (let key in filesToDelete) {
let queueItem = Object.assign({
action: 'delete',
}, filesToDelete[key]);
queue.push(queueItem);
console.log(' - (delete) ' + key);
}
})
.then(() => {
if (queue.length) {
console.log('-------------------------------');
}
return queue;
});
}
function updateSource(projectCode, srcFolder, path, filename, basezip, queue, filesToDelete) {
if (sourcesProcessing.length > 19) {
return (0, file_1.wait)(30).then(() => updateSource(projectCode, srcFolder, path, filename, basezip, queue, filesToDelete));
}
let fullpathname = path ? `${path}/${filename}` : filename;
sourcesProcessing.push(fullpathname);
let localFilepath = `${srcFolder}/${fullpathname}`;
delete filesToDelete[fullpathname];
return (0, file_1.fileStat)(localFilepath)
.then((stats) => {
if (stats.isDirectory()) {
return (0, file_1.listFiles)(localFilepath)
.then(files => {
let index = sourcesProcessing.indexOf(fullpathname);
sourcesProcessing.splice(index, 1);
return Promise.all(files.map(file => {
return updateSource(projectCode, srcFolder, fullpathname, file, basezip, queue, filesToDelete);
}));
});
}
else if (stats.isFile()) {
return (0, isbinaryfile_1.isBinaryFile)(localFilepath)
.then(isBinary => {
if (isBinary) {
return Promise.reject(`${filename} is not a text file.`);
}
else {
return (0, file_1.getFileString)(localFilepath)
.then(content => {
return getSourceAction(fullpathname, content, basezip)
.then(action => {
if (action) {
queue.push({
path: path,
filename: filename,
content: content,
action: action,
});
let sign = action == 'create' ? '+' : '>';
console.log(` ${sign} (${action}) ` + fullpathname);
}
});
});
}
});
}
else {
return Promise.resolve();
}
})
.then(() => {
let index = sourcesProcessing.indexOf(fullpathname);
sourcesProcessing.splice(index, 1);
});
}
function getSourceAction(sourcePathname, sourceContent, basezip) {
let baseFile = basezip.file(`src/${sourcePathname}`);
if (baseFile) {
return baseFile.async('string')
.then(baseContent => {
return sourceContent != baseContent ? 'update' : '';
});
}
else {
return Promise.resolve('create');
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2dhbWVsZXQvdXBsb2FkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHdDQUFvSztBQUNwSyxzQ0FBbUU7QUFDbkUscUNBQTBDO0FBQzFDLGdFQUF1QztBQUN2Qyx3REFBZ0M7QUFDaEMsK0NBQTRDO0FBRTVDLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQztBQUVyQixNQUFNLE1BQU0sR0FBRyxDQUFDLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRTtJQUM1RCxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ1IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBQ0QsSUFBSSxTQUFTLEdBQUcsR0FBRyxNQUFNLE1BQU0sQ0FBQztJQUNoQyxJQUFBLGlCQUFXLEVBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkIsSUFBQSx5QkFBa0IsRUFBQyxNQUFNLENBQUMsQ0FBQztJQUUzQixJQUFJLENBQUMsSUFBQSxpQkFBVSxFQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDekIsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsU0FBUyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRCxJQUFJLFdBQVcsR0FBRyxNQUFNLEdBQUcsVUFBVSxHQUFHLGNBQWMsQ0FBQztJQUV2RCxPQUFPLE9BQU8sQ0FBQyxPQUFPLEVBQUU7U0FDbkIsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDN0MsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3JDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFB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