@atomist/automation-client
Version:
Atomist API for software low-level client
75 lines • 3.58 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const NodeFsLocalProject_1 = require("../../project/local/NodeFsLocalProject");
const tmpDirectoryManager_1 = require("../../spi/clone/tmpDirectoryManager");
const logger_1 = require("../../util/logger");
const projectEditor_1 = require("../edit/projectEditor");
/**
* Generate a new project given the starting point project.
* Do not change the starting point. May perform additional
* action after persisting the project.
* @param {Promise<Project>} startingPoint
* @param {HandlerContext} ctx
* @param {ProjectOperationCredentials} credentials
* @param {ProjectEditor} editor editor that does the actual transformation
* @param persist persist function to persist the new project:
* for example, to GitHub
* @param targetId id of target repo for persistence
* @param params optional parameters to be passed to persister
* @param afterAction action to perform after project persistence.
* @param directoryManager finds a directory for the new project; defaults to tmp
*/
function generate(startingPoint, ctx, credentials, editor, persist, targetId, params, afterAction, directoryManager = tmpDirectoryManager_1.TmpDirectoryManager) {
return directoryManager.directoryFor(targetId.owner, targetId.repo, "master", {})
.then(newRepoDirectoryInfo => {
return Promise.resolve(startingPoint) // it might be a promise
.then(seed =>
// Make a copy that we can work on
NodeFsLocalProject_1.NodeFsLocalProject.copy(seed, newRepoDirectoryInfo.path, newRepoDirectoryInfo.release)
.then(independentCopy => release(seed).then(() => independentCopy)))
// Let's be sure we didn't inherit any old git stuff
.then(independentCopy => independentCopy.deleteDirectory(".git"))
.then(independentCopy => {
// Overwrite the seed id before running the editor so that it sees the new repo details
independentCopy.id = targetId;
return projectEditor_1.toEditor(editor)(independentCopy, ctx, params);
})
.then(r => {
if (r.success) {
return r.target;
}
else if (!!r.error) {
throw r.error;
}
else {
return Promise.reject(new Error("Failed to edit project"));
}
})
.then(populated => {
logger_1.logger.debug("Persisting repo at [%s]: owner/repo=%s/%s", populated.baseDir, targetId.owner, targetId.repo);
return persist(populated, credentials, targetId, params);
})
.then(persistenceResult => {
return afterAction ?
afterAction(persistenceResult.target, params)
.then(r => {
// Preserve any extra returned values from persister
return Object.assign(Object.assign({}, persistenceResult), r);
}) :
persistenceResult;
})
.catch(err => {
logger_1.logger.debug("Failed to generate %s/%s in %s, cleaning up: %s\n", targetId.owner, targetId.repo, newRepoDirectoryInfo.path, err.message);
return newRepoDirectoryInfo.release()
.then(() => Promise.reject(err), e => Promise.reject(err));
});
});
}
exports.generate = generate;
function release(project) {
if (project.release) {
return project.release();
}
return Promise.resolve();
}
//# sourceMappingURL=generatorUtils.js.map