crowdin-helper
Version:
Unofficial Crowdin client to automate continuous integration workflow
88 lines (66 loc) • 2.87 kB
JavaScript
const spawn = require('child_process').spawnSync;
const CrowdinApi = require('../utilities/crowdin-api');
const { crowdinBranchName } = require('../utilities/branch-name');
const sourceFilesPromise = require('../utilities/source-files-promise');
const COLORS = require('../utilities/colors');
const triggerAutoTranslation = require('./trigger-auto-translation');
async function uploadSources(shouldExitIfSourceFileWasNotChanged = false) {
const files = await sourceFilesPromise;
if (shouldExitIfSourceFileWasNotChanged && _isEverySourceFileSameAsInMaster(files)) {
console.log(`Crowdin: Source files are unchanged. Nothing to upload`);
return;
}
console.log(`Crowdin: Uploading to branch: ${crowdinBranchName}`);
const branchData = await CrowdinApi.getBranchData(crowdinBranchName);
const branchId = branchData
? branchData.data.id
: (await CrowdinApi.addBranch(crowdinBranchName)).data.id;
// we have to process requests to crowdin sequentially
await files.reduce(async (sequentialPromise, filePath) => {
await sequentialPromise;
const findDirName = filePath.match(/(.+?)\/[^\/]+$/);
let lastDirId;
// Create directories if necessary
if (findDirName) {
const dirsToCreate = findDirName[1].split('/');
const existingDirs = (await CrowdinApi.listDirectories(branchId)).data;
await dirsToCreate.reduce(async (prevDirIdPromise, dir) => {
const prevDirId = prevDirIdPromise && (await prevDirIdPromise);
const dirIfExists = existingDirs.find(
(existingDir) =>
existingDir.data.name === dir && existingDir.data.directoryId === prevDirId,
);
lastDirId = dirIfExists
? dirIfExists.data.id
: (
await CrowdinApi.addDirectory(
dir,
prevDirId ? { directoryId: prevDirId } : { branchId },
)
).data.id;
return lastDirId;
}, null);
}
const fileName = filePath.split('/').slice(-1)[0];
const storageId = (await CrowdinApi.addStorage(filePath, fileName)).data.id;
const existingFile = (await CrowdinApi.listProjectFiles(branchId, lastDirId)).data.find(
(file) => file.data.path === `/${crowdinBranchName}/${filePath}`,
);
await (existingFile
? CrowdinApi.updateFile(storageId, existingFile.data.id)
: CrowdinApi.addFile(storageId, fileName, lastDirId));
console.log(`Crowdin:${COLORS.GREEN} ${filePath} is uploaded ${COLORS.WHITE}`);
}, Promise.resolve());
await triggerAutoTranslation();
}
function _isEverySourceFileSameAsInMaster(files) {
const changedFiles = spawn('git', [
'diff',
'origin/master',
'HEAD',
'--stat',
'--name-only',
]).stdout.toString();
return files.every((fileName) => !changedFiles.includes(fileName));
}
module.exports = uploadSources;