UNPKG

svnp

Version:
163 lines (162 loc) 5.72 kB
"use strict"; 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;