svn获取服务器文件路径,获取SVN服务端文件的md5/sha1

起因是运维的同事讨论如何获取SVN上文件的MD5:

07be142f81f64e3a5908326e781ea04e.png

之前确实在生产环境发现过生产介质损坏的情况,具体是SVN还是FTP导致问题不详。

初步搜索后得到两点信息:

SVN 1.8以上使用的是SHA1,SVN 1.8以下使用的是MD5(https://stackoverflow.com/questions/7438588/subversion-checksum-algorithm);

很多人曾经尝试过使用svn info命令获取;

然而实测svn info只能获取本地仓库中文件的校验和:

f62aae872d842d5359f54851060d6296.png

此用的svn.exe为TortoiseSVN自带的,版本如下:

9c59ed8c5c1810d620cf22b6698cbee1.png

搜索SVN文档,发现其远程路径的输出也没有校验和:

f74d2234b09ef1f34e0e812a6033baf1.png

该问题也有其他人遇到,但未得到解决:

b279a4ed75bc25ce743023db704e2091.png

cc5afba74e6005b4a2376beed916947b.png

继续搜索,找到一段代码:

0ef19b969e6ee0503d6e901b9f5cd750.png

这段代码是使用SVNKit实现的,没有用户名密码验证,增加验证调整后实测成功:

e3b4df55f604bdc0119aa342392a20dc.png

r.status的第二个参数可以直接加路径,就不用遍历了;不带第二个target参数就遍历。

完整代码如下:

参考资料:

1、http://subversion.1072662.n5.nabble.com/Get-checksum-performance-td2533.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现这个功能,你需要使用 SVNKit 库中的 Java API。以下是大致的步骤: 1. 使用 SVNKit 库连接到 SVN 服务器,并获取指定路径下的所有变更日志。 ```java SVNURL url = SVNURL.parseURIEncoded(svnUrl); ISVNAuthenticationManager authManager = SVNWCUtil.createDefaultAuthenticationManager(svnUsername, svnPassword); SVNRepository repository = SVNRepositoryFactory.create(url); repository.setAuthenticationManager(authManager); long startRevision = repository.getLatestRevision() - 10; // 获取最近的10个版本 long endRevision = repository.getLatestRevision(); Collection<SVNLogEntry> logEntries = repository.log(new String[]{""}, null, startRevision, endRevision, true, true); ``` 2. 遍历变更日志,获取每个文件的变更信息,如果是 .java 文件则进行解析。 ```java for (SVNLogEntry logEntry : logEntries) { Map<String, SVNLogEntryPath> changedPaths = logEntry.getChangedPaths(); for (Map.Entry<String, SVNLogEntryPath> entry : changedPaths.entrySet()) { SVNLogEntryPath path = entry.getValue(); String filePath = path.getPath(); if (filePath.endsWith(".java") && (path.getType() == SVNLogEntryPath.TYPE_ADDED || path.getType() == SVNLogEntryPath.TYPE_MODIFIED)) { // 解析 .java 文件 } } } ``` 3. 对于每个修改的 .java 文件,使用 JavaParser 库解析出其 AST,并遍历 AST 找到修改的类。 ```java FileInputStream in = new FileInputStream(filePath); CompilationUnit cu = JavaParser.parse(in); List<TypeDeclaration<?>> types = cu.getTypes(); for (TypeDeclaration<?> type : types) { if (type instanceof ClassOrInterfaceDeclaration) { ClassOrInterfaceDeclaration classDeclaration = (ClassOrInterfaceDeclaration) type; String className = classDeclaration.getNameAsString(); // 判断该类是否被修改 if (isClassModified(className, logEntry)) { // 处理修改的类 } } } ``` 4. 判断该类是否被修改,可以使用 SVNKit 的 `SVNLogEntryPath` 中的 `getCopyPath()` 和 `getCopyRevision()` 方法来判断该文件是否是复制或重命名,以及其所复制或重命名的文件是否在当前变更集中。 ```java private boolean isClassModified(String className, SVNLogEntry logEntry) { Map<String, SVNLogEntryPath> changedPaths = logEntry.getChangedPaths(); for (Map.Entry<String, SVNLogEntryPath> entry : changedPaths.entrySet()) { SVNLogEntryPath path = entry.getValue(); String filePath = path.getPath(); if (filePath.endsWith(".java") && (path.getType() == SVNLogEntryPath.TYPE_ADDED || path.getType() == SVNLogEntryPath.TYPE_MODIFIED)) { if (filePath.endsWith(className + ".java")) { return true; } String copyPath = path.getCopyPath(); if (copyPath != null && copyPath.endsWith(className + ".java")) { long copyRevision = path.getCopyRevision(); if (copyRevision >= logEntry.getRevision() - 10 && copyRevision <= logEntry.getRevision()) { return true; } } } } return false; } ``` 这样,就可以解析 SVN 路径下的 .java 文件,并获取修改的类了。不过需要注意的是,由于 SVNKit 是通过 SVN 服务器获取文件历史记录的,所以需要确保你有足够的权限访问该 SVN 服务器

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值