svnp
Version:
publish files to svn
163 lines (162 loc) • 5.72 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Publish = exports.login = exports.ExecSvnCmd = void 0;
const path_1 = __importDefault(require("path"));
const os_1 = __importDefault(require("os"));
const fs_1 = __importDefault(require("fs"));
const child_process_1 = require("child_process");
const utils_1 = require("./utils");
function ExecSvnCmd(cmd, dir) {
const fileName = path_1.default.join(__dirname, 'svn', 'svn.exe');
const output = (0, child_process_1.spawnSync)(fileName, cmd.split(' '), { encoding: 'utf-8', cwd: dir });
if (output.stderr) {
console.error('SVN命令执行错误: ', 'svn', cmd);
if (output.stderr.includes('credentials') || output.stderr.includes('Authentication') || output.stderr.includes('time')) {
console.error('\r\n请检查SVN用户名或密码并运行 "svnp login" 重新登陆');
(0, child_process_1.spawnSync)(fileName, ['auth', '--remove'], { cwd: dir });
}
throw output.stderr;
}
console.log(output.stdout);
}
exports.ExecSvnCmd = ExecSvnCmd;
function tempRepositoryDir() {
return path_1.default.join(os_1.default.tmpdir(), 'svn-publish-temp');
}
function rmdir(p) {
if (fs_1.default.existsSync(p)) {
const files = fs_1.default.readdirSync(p);
files.forEach(child => {
const childPath = path_1.default.join(p, child);
if (fs_1.default.statSync(childPath).isDirectory()) {
rmdir(childPath);
}
else {
try {
fs_1.default.unlinkSync(childPath);
}
catch (e) { }
;
}
});
fs_1.default.rmdirSync(p);
}
}
function runSvnDeleteCmd(p) {
const rep = repository();
ExecSvnCmd(`delete ${p} --force`, rep);
}
function clearRepository(p, conf, level = 0) {
if (path_1.default.basename(p) === '.svn')
return;
if (fs_1.default.existsSync(p)) {
const files = fs_1.default.readdirSync(p);
files.forEach(child => {
const childPath = path_1.default.join(p, child);
if (fs_1.default.statSync(childPath).isDirectory()) {
clearRepository(childPath, conf, level + 1);
}
else {
try {
runSvnDeleteCmd(childPath);
}
catch (e) { }
;
}
});
if (level !== 0) {
runSvnDeleteCmd(p);
}
}
}
function createTempRepository(repositoryPath) {
const repoDir = tempRepositoryDir();
rmdir(repoDir);
fs_1.default.mkdirSync(repoDir);
ExecSvnCmd('checkout ' + repositoryPath, repoDir);
}
function cpFileOrDir(src, dst) {
if (!fs_1.default.existsSync(src) || !fs_1.default.existsSync(dst))
return;
if (!fs_1.default.statSync(dst).isDirectory())
return;
const srcInfo = fs_1.default.statSync(src);
const dstPath = path_1.default.join(dst, path_1.default.basename(src));
if (srcInfo.isFile()) {
const dstFile = dstPath;
fs_1.default.cpSync(src, dstFile);
return;
}
fs_1.default.mkdirSync(dstPath);
const files = fs_1.default.readdirSync(src);
files.forEach(c => {
const s = path_1.default.join(src, c);
cpFileOrDir(s, dstPath);
});
}
function repository() {
const repoDir = tempRepositoryDir();
const files = fs_1.default.readdirSync(repoDir);
if (!files.length)
return '';
return path_1.default.join(repoDir, files[0]);
}
function addFiles(conf) {
const repo = repository();
if (!repo)
return;
clearRepository(repo, conf);
const localDir = conf.localDirectory;
if (conf.compress) {
const zipFile = path_1.default.join(localDir, conf.zipFileName);
if (!fs_1.default.existsSync(zipFile))
return;
fs_1.default.cpSync(zipFile, path_1.default.join(repo, conf.zipFileName));
return;
}
const localFiles = fs_1.default.readdirSync(localDir);
localFiles.forEach(f => {
cpFileOrDir(path_1.default.join(localDir, f), repo);
});
}
function update(conf, msg = 'update') {
createTempRepository(conf.remoteDirectory);
const repo = repository();
addFiles(conf);
ExecSvnCmd('add . --force', repo);
ExecSvnCmd(`commit -m "${msg}"`, repo);
console.log('发布成功');
}
function login() {
return new Promise(resolve => {
(0, utils_1.readAuth)().then(data => {
const { repository, username, password } = data;
const cmd = `checkout ${repository} --username ${username} --password ${password}`;
const repoDir = tempRepositoryDir();
rmdir(repoDir);
fs_1.default.mkdirSync(repoDir);
ExecSvnCmd(cmd, repoDir);
rmdir(tempRepositoryDir());
resolve(data);
});
});
}
exports.login = login;
function Publish(msg) {
const conf = (0, utils_1.readConfig)();
if (!conf)
return;
if (conf.compress)
(0, utils_1.zip)(conf.localDirectory, conf.zipFileName);
update(conf, msg);
try {
rmdir(tempRepositoryDir());
if (conf.compress)
fs_1.default.unlinkSync(path_1.default.join(conf.localDirectory, conf.zipFileName));
}
catch (e) { }
}
exports.Publish = Publish;