package com.svnmanager.service; import com.svnmanager.util.ProcessUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeoutException; /** * Commit服务 */ public class CommitService extends SvnService { private static final Logger logger = LoggerFactory.getLogger(CommitService.class); /** * 提交修改 * * @param workingDirectory 工作目录 * @param message 提交消息 * @param files 要提交的文件列表(null表示提交所有修改) * @return 提交结果 * @throws IOException IO异常 * @throws InterruptedException 中断异常 * @throws TimeoutException 超时异常 */ public CommitResult commit(String workingDirectory, String message, List files) throws IOException, InterruptedException, TimeoutException { logger.info("提交修改: {}", workingDirectory); if (!isValidWorkingCopy(workingDirectory)) { throw new IllegalArgumentException("无效的SVN工作副本: " + workingDirectory); } if (message == null || message.trim().isEmpty()) { throw new IllegalArgumentException("提交消息不能为空"); } List args = new ArrayList<>(); args.add("-m"); args.add(message); if (files != null && !files.isEmpty()) { args.addAll(files); } ProcessUtil.ProcessResult result = executeSvnCommand("commit", args, workingDirectory); CommitResult commitResult = new CommitResult(); commitResult.setSuccess(result.isSuccess()); commitResult.setOutput(result.getOutputAsString()); commitResult.setError(result.getErrorAsString()); if (result.isSuccess()) { // 解析提交后的版本号 String output = result.getOutputAsString(); String revisionLine = output.lines() .filter(line -> line.contains("Committed revision")) .findFirst() .orElse(""); if (!revisionLine.isEmpty()) { String[] parts = revisionLine.split(" "); if (parts.length > 0) { String rev = parts[parts.length - 1].replace(".", ""); commitResult.setRevision(rev); } } logger.info("提交成功,版本: {}", commitResult.getRevision()); } else { logger.error("提交失败: {}", result.getErrorAsString()); } return commitResult; } /** * 提交所有修改 * * @param workingDirectory 工作目录 * @param message 提交消息 * @return 提交结果 * @throws IOException IO异常 * @throws InterruptedException 中断异常 * @throws TimeoutException 超时异常 */ public CommitResult commit(String workingDirectory, String message) throws IOException, InterruptedException, TimeoutException { return commit(workingDirectory, message, null); } /** * 提交结果 */ public static class CommitResult { private boolean success; private String revision; private String output; private String error; public boolean isSuccess() { return success; } public void setSuccess(boolean success) { this.success = success; } public String getRevision() { return revision; } public void setRevision(String revision) { this.revision = revision; } public String getOutput() { return output; } public void setOutput(String output) { this.output = output; } public String getError() { return error; } public void setError(String error) { this.error = error; } } }