SVNKit操作SVN仓库

导入依赖

<dependency>
<groupId>org.tmatesoft.svnkit</groupId>
<artifactId>svnkit</artifactId>
<version>1.8.5</version>
<scope>compile</scope>
</dependency> <dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.3</version>
</dependency> <dependency>
<groupId>org.ini4j</groupId>
<artifactId>ini4j</artifactId>
</dependency>

SVN通过代码操作常用工具类

1、FilePermissionUtil.java

import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException; /**
* @author: hanchunyu
* @since 2022/11/2 下午5:54
* <p>
* Description:
*/
public class FilePermissionUtil {
/**
* 判断文件是否有读权限
*
* @param file
* 文件
* @return
*/
public static Boolean canRead(File file) {
if (file.isDirectory()) {
try {
File[] listFiles = file.listFiles();
if (listFiles == null) { // 返回null表示无法读取或访问,如果为空目录返回的是一个空数组
return false;
} else {
return true;
}
} catch (Exception e) {
return false;
}
} else if (!file.exists()) { // 文件不存在
return false;
}
return checkRead(file);
} /**
* 检测文件是否有读权限
*
* @param file
* 文件
* @return
*/
private static boolean checkRead(File file) {
FileReader fd = null;
try {
fd = new FileReader(file);
while ((fd.read()) != -1) {
break;
}
return true;
} catch (IOException e) {
return false;
} finally {
try {
fd.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} /**
* 判断文件是否有写权限
*
* @param file
* 文件
* @return
*/
public static Boolean canWrite(File file) {
if (file.isDirectory()) {
try {
file = new File(file, "canWriteTestDeleteOnExit.temp");
if (file.exists()) {
boolean checkWrite = checkWrite(file);
if (!deleteFile(file)) {
file.deleteOnExit();
}
return checkWrite;
} else if (file.createNewFile()) {
if (!deleteFile(file)) {
file.deleteOnExit();
}
return true;
} else {
return false;
}
} catch (Exception e) {
return false;
}
}
return checkWrite(file);
} /**
* 检测文件是否有写权限
*
* @param file
* 文件
* @return
*/
private static boolean checkWrite(File file) {
FileWriter fw = null;
boolean delete = !file.exists();
boolean result = false;
try {
fw = new FileWriter(file, true);
fw.write("");
fw.flush();
result = true;
return result;
} catch (IOException e) {
return false;
} finally {
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
if (delete && result) {
deleteFile(file);
}
}
} /**
* 删除文件,如果要删除的对象是文件夹,先删除所有子文件(夹),再删除该文件
*
* @param file
* 要删除的文件对象
* @return 删除是否成功
*/
public static boolean deleteFile(File file) {
return deleteFile(file, true);
} /**
* 删除文件,如果要删除的对象是文件夹,则根据delDir判断是否同时删除文件夹
*
* @param file
* 要删除的文件对象
* @param delDir
* 是否删除目录
* @return 删除是否成功
*/
public static boolean deleteFile(File file, boolean delDir) {
if (!file.exists()) { // 文件不存在
return true;
}
if (file.isFile()) {
return file.delete();
} else {
boolean result = true;
File[] children = file.listFiles();
for (int i = 0; i < children.length; i++) { // 删除所有子文件和子文件夹
result = deleteFile(children[i], delDir);// 递归删除文件
if (!result) {
return false;
}
}
if (delDir) {
result = file.delete(); // 删除当前文件夹
}
return result;
}
}
}

2、HttpdUtils.java

import java.io.File;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.resource.ClassPathResource;
import cn.hutool.core.util.RuntimeUtil; public class HttpdUtils { public void modHttpdPort(String port) {
List<String> lines = FileUtil.readLines(new File("/etc/apache2/httpd.conf"), Charset.forName("UTF-8"));
List<String> reLines = new ArrayList<String>();
for (String line : lines) {
if (line.startsWith("Listen ")) {
line = "Listen " + port;
}
reLines.add(line);
}
FileUtil.writeLines(reLines, new File("/etc/apache2/httpd.conf"), Charset.forName("UTF-8")); } public void releaseFile() {
ClassPathResource resource = new ClassPathResource("file/dav_svn.conf");
FileUtil.writeFromStream(resource.getStream(), "/etc/apache2/conf.d/dav_svn.conf");
} public void start() {
RuntimeUtil.exec("httpd -k start");
} public void stop() {
RuntimeUtil.exec("pkill httpd");
} }

3、RepositoryUtil.java

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.resource.ClassPathResource;
import cn.hutool.core.util.ZipUtil;
import org.tmatesoft.svn.core.*;
import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager;
import org.tmatesoft.svn.core.internal.io.dav.DAVRepositoryFactory;
import org.tmatesoft.svn.core.internal.io.fs.FSRepositoryFactory;
import org.tmatesoft.svn.core.internal.io.svn.SVNRepositoryFactoryImpl;
import org.tmatesoft.svn.core.internal.wc.DefaultSVNOptions;
import org.tmatesoft.svn.core.io.SVNRepository;
import org.tmatesoft.svn.core.io.SVNRepositoryFactory;
import org.tmatesoft.svn.core.wc.*; import java.io.*;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.*; /**
* @author: hanchunyu
* @since 2022/11/2 下午5:54
* <p>
* Description: SVN仓库操作工具类
*/
public class RepositoryUtil { public static Boolean DoUpdateStatus = true;
// 声明SVN客户端管理类
private static SVNClientManager ourClientManager; static {
// 初始化库。 必须先执行此操作。具体操作封装在setupLibrary方法中。
// For using over http:// and https://
DAVRepositoryFactory.setup(); // For using over svn:// and svn+xxx://
SVNRepositoryFactoryImpl.setup(); // For using over file://
FSRepositoryFactory.setup();
} /**
* 创建镜像(默认携带admin用户)
*
* @param path
* 路径
* @param name
* 仓库名
*/
public static void createRepository(String path, String name) { // 创建仓库
String dir = path + "repo" + File.separator + name;
if (!FileUtil.exist(dir + File.separator + "db")) {
ClassPathResource resource = new ClassPathResource("file/repo.zip");
InputStream inputStream = resource.getStream();
File temp = new File(path + "temp" + File.separator + "file/repo.zip");
FileUtil.writeFromStream(inputStream, temp);
FileUtil.mkdir(dir);
ZipUtil.unzip(temp, new File(dir));
FileUtil.del(temp);
}
} /**
* 创建仓库(最初形式)
*
* @param path
* 仓库路径
* @return
*/
public static Boolean initRepository(String path) {
try {
SVNRepositoryFactory.createLocalRepository(new File(path), true, false);
return true;
} catch (SVNException e) {
e.printStackTrace();
return false;
}
} /**
* 检出仓库
*
* @param svnPath
* SVN路径
* @param targetPath
* 本地仓库路径
* @return
*/
public static Long checkOut(String svnPath, String targetPath) {
return checkOut(svnPath, targetPath, "admin", "admin");
} /**
* 拉取镜像
*
* @param svnPath
* SVN路径
* @param targetPath
* 本地仓库路径
* @param svnUserName
* 用户名
* @param svnPassWord
* 密码
* @return -1L发生错误 -- 版本号
*/
public static Long checkOut(String svnPath, String targetPath, String svnUserName, String svnPassWord) { // 相关变量赋值
SVNURL repositoryURL = null;
try {
repositoryURL = SVNURL.parseURIEncoded(svnPath);
} catch (SVNException e) {
e.printStackTrace();
return -1L;
}
DefaultSVNOptions options = new DefaultSVNOptions();
// 实例化客户端管理类
SVNClientManager ourClientManager = SVNClientManager.newInstance(options, svnUserName, svnPassWord);
// 要把版本库的内容check out到的目录
File wcDir = new File(targetPath);
// 通过客户端管理类获得updateClient类的实例。
SVNUpdateClient updateClient = ourClientManager.getUpdateClient();
updateClient.setIgnoreExternals(false);
// 执行check out 操作,返回工作副本的版本号。
long workingVersion = -1;
try {
if (wcDir.exists()) {
ourClientManager.getWCClient().doCleanup(wcDir);
}
workingVersion = updateClient.doCheckout(repositoryURL, wcDir, SVNRevision.HEAD, SVNRevision.HEAD,
SVNDepth.INFINITY, false); } catch (Exception e) {
e.printStackTrace();
return -1L;
} System.out.println("把版本:" + workingVersion + " check out 到目录:" + wcDir + "中。");
try {
ourClientManager.getWCClient().doCleanup(wcDir);
} catch (SVNException e) {
throw new RuntimeException(e);
}
return workingVersion;
} /**
* 更新仓库
*
* @param targetPath
* 本地仓库路径
* @return
*/
public static Integer doUpdate(String targetPath) {
return doUpdate(targetPath, "admin", "admin");
} /**
* 更新svn
*
* @param targetPath
* 本地仓库路径
* @param svnUserName
* 用户名
* @param svnPassWord
* 密码
* @return int(- 1更新失败 , 1成功 , 0有程序在占用更新)
*/
public static Integer doUpdate(String targetPath, String svnUserName, String svnPassWord) {
if (Boolean.FALSE.equals(RepositoryUtil.DoUpdateStatus)) {
System.out.println("更新程序已经在运行中,不能重复请求!");
return 0;
}
RepositoryUtil.DoUpdateStatus = false; /* * For using over http:// and https:// */
try {
DAVRepositoryFactory.setup();
ISVNOptions options = SVNWCUtil.createDefaultOptions(true);
// 实例化客户端管理类
SVNClientManager ourClientManager = SVNClientManager.newInstance((DefaultSVNOptions) options, svnUserName,
svnPassWord);
// 要更新的文件
File updateFile = new File(targetPath);
// 获得updateClient的实例
SVNUpdateClient updateClient = ourClientManager.getUpdateClient();
updateClient.setIgnoreExternals(false);
// 执行更新操作
long versionNum = updateClient.doUpdate(updateFile, SVNRevision.HEAD, SVNDepth.INFINITY, false, false);
System.out.println("工作副本更新后的版本:" + versionNum);
DoUpdateStatus = true;
return 1;
} catch (SVNException e) {
DoUpdateStatus = true;
e.printStackTrace();
return -1;
}
} /**
* Svn提交 list.add("a.txt")可直接添加单个文件;
* list.add("aaa")添加文件夹将添加夹子内所有的文件到svn,预添加文件必须先添加其所在的文件夹;
*
* @param fileRelativePathList
* 文件相对路径
* @param targetPath
* 本地仓库
* @param username
* 用户名
* @param passWord
* 密码
* @return Boolean
*/
public static Boolean doCommit(List<String> fileRelativePathList, String targetPath, String username,
String passWord) { ISVNOptions options = SVNWCUtil.createDefaultOptions(true);
// 实例化客户端管理类
ourClientManager = SVNClientManager.newInstance((DefaultSVNOptions) options, username, passWord);
// 要提交的文件夹子
File commitFile = new File(targetPath);
// 获取此文件的状态(是文件做了修改还是新添加的文件?)
SVNStatus status = null;
File addFile = null;
String strPath = null;
try {
if (fileRelativePathList != null && fileRelativePathList.size() > 0) {
for (int i = 0; i < fileRelativePathList.size(); i++) {
strPath = fileRelativePathList.get(i);
addFile = new File(targetPath + "/" + strPath);
status = ourClientManager.getStatusClient().doStatus(addFile, true);
// 如果此文件是新增加的则先把此文件添加到版本库,然后提交。
if (null == status || status.getContentsStatus() == SVNStatusType.STATUS_UNVERSIONED) {
// 把此文件增加到版本库中
ourClientManager.getWCClient().doAdd(addFile, false, false, false, SVNDepth.INFINITY, false,
false);
System.out.println("add");
}
}
// 提交此文件
} // 如果此文件不是新增加的,直接提交。
ourClientManager.getCommitClient().doCommit(new File[] { commitFile }, true, "", null, null, true, false,
SVNDepth.INFINITY);
System.out.println("commit");
} catch (Exception e) {
e.printStackTrace();
return false;
}
System.out.println(status.getContentsStatus());
return true;
} /**
* 提交代码
*
* @param fileRelativePath
* 相对于仓库路径
* @param targetPath
* 仓库路径
* @return
*/
public static Boolean doCommit(String fileRelativePath, String targetPath) {
return doCommit(fileRelativePath, targetPath, "admin", "admin");
} /**
* Svn提交
*
* @param fileRelativePath
* 文件相对仓库路径
* @param targetPath
* 本地仓库
* @param username
* 用户名
* @param passWord
* 密码
*
* @return Boolean
*/
public static Boolean doCommit(String fileRelativePath, String targetPath, String username, String passWord) {
ISVNOptions options = SVNWCUtil.createDefaultOptions(true);
// 实例化客户端管理类
ourClientManager = SVNClientManager.newInstance((DefaultSVNOptions) options, username, passWord);
// 要提交的文件夹子
File commitFile = new File(targetPath);
// 获取此文件的状态(是文件做了修改还是新添加的文件?)
SVNStatus status = null;
File addFile = null;
try {
if (fileRelativePath != null && fileRelativePath.trim().length() > 0) {
addFile = new File(ToolUtils.endDir(targetPath) + fileRelativePath);
status = ourClientManager.getStatusClient().doStatus(addFile, true);
// 如果此文件是新增加的则先把此文件添加到版本库,然后提交。
if (null == status || status.getContentsStatus() == SVNStatusType.STATUS_UNVERSIONED) {
// 把此文件增加到版本库中
ourClientManager.getWCClient().doAdd(addFile, false, false, false, SVNDepth.INFINITY, false, false);
System.out.println("add");
}
// 提交此文件
} else if ("".equals(fileRelativePath)) {
File[] files = FileUtil.ls(targetPath);
for (File f : files) {
if (!f.getPath().equals(ToolUtils.endDir(targetPath) + ".svn")) {
status = ourClientManager.getStatusClient().doStatus(f, true);
// 如果此文件是新增加的则先把此文件添加到版本库,然后提交。
if (null == status || status.getContentsStatus() == SVNStatusType.STATUS_UNVERSIONED) {
// 把此文件增加到版本库中
ourClientManager.getWCClient().doAdd(f, false, false, false, SVNDepth.INFINITY, false,
false);
}
}
} }
// 如果此文件不是新增加的,直接提交。
ourClientManager.getCommitClient().doCommit(new File[] { commitFile }, true, "commit all", null, null, true,
false, SVNDepth.INFINITY);
ourClientManager.getWCClient().doCleanup(commitFile);
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
} /**
* 导入文件
*
* @param dirPath
* 文件加路径
* @param svnPath
* SVN仓库路径
* @return
*/
public static Boolean doImport(String dirPath, String svnPath) {
return doImport(dirPath, svnPath, "admin", "admin");
} /**
* 将文件导入并提交到svn 同路径文件要是已经存在将会报错
*
* @param dirPath
* 文件夹路径
* @param svnPath
* 仓库路径
* @param username
* 用户名
* @param passWord
* 密码
* @return Boolean
*/
public static Boolean doImport(String dirPath, String svnPath, String username, String passWord) {
// 相关变量赋值
SVNURL repositoryURL = null;
try {
repositoryURL = SVNURL.parseURIEncoded(svnPath);
} catch (SVNException e) {
e.printStackTrace();
}
ISVNOptions options = SVNWCUtil.createDefaultOptions(true);
// 实例化客户端管理类
ourClientManager = SVNClientManager.newInstance((DefaultSVNOptions) options, username, passWord);
// 要把此目录中的内容导入到版本库
File impDir = new File(dirPath);
// 执行导入操作
SVNCommitInfo commitInfo = null;
try {
commitInfo = ourClientManager.getCommitClient().doImport(impDir, repositoryURL, "import operation!", null,
false, false, SVNDepth.INFINITY);
} catch (SVNException e) {
e.printStackTrace();
return false;
}
System.out.println(commitInfo.toString());
return true;
} /**
* 删除本地仓库文件夹
*
* @param dirPath
* 本地路径
* @return
*/
public static Boolean doDeleteLocalDir(String dirPath) {
return doDeleteLocalDir(dirPath, "admin", "admin");
} /**
* 删除本地仓库文件夹
*
* @param dirPath
* 本地路径
* @param username
* 用户名
* @param passWord
* 密码
* @return
*/
public static Boolean doDeleteLocalDir(String dirPath, String username, String passWord) {
ISVNOptions options = SVNWCUtil.createDefaultOptions(true);
// 实例化客户端管理类
ourClientManager = SVNClientManager.newInstance((DefaultSVNOptions) options, username, passWord);
// 要把此目录中的内容导入到版本库
File impDir = new File(dirPath); try {
ourClientManager.getWCClient().doDelete(impDir, false, false);
} catch (SVNException e) {
e.printStackTrace();
return false;
}
return true;
} /**
*
* @param path
* 文件夹路径
*
* @return
*/
public static Boolean doMkDir(String path) {
return doMkDir(new String[] { path });
} /**
*
* @param path
* 文件夹路径
*
* @return
*/
public static Boolean doMkDir(String[] path) {
return doMkDir(path, "admin", "admin");
} /**
*
* @param path
* 文件夹路径
* @param username
* 用户名
* @param passWord
* 密码
* @return
*/
public static Boolean doMkDir(String[] path, String username, String passWord) { // 相关变量赋值
SVNURL[] repositoryURL = new SVNURL[path.length];
try {
for (int i = 0; i < path.length; i++) {
SVNURL svnurl = SVNURL.parseURIEncoded(path[i]);
repositoryURL[i] = svnurl;
}
} catch (SVNException e) {
e.printStackTrace();
return false;
} ISVNOptions options = SVNWCUtil.createDefaultOptions(true);
// 实例化客户端管理类
ourClientManager = SVNClientManager.newInstance((DefaultSVNOptions) options, username, passWord);
SVNCommitInfo commitInfo = null;
try {
commitInfo = ourClientManager.getCommitClient().doMkDir(repositoryURL, "mkdir");
} catch (SVNException e) {
e.printStackTrace();
return false;
}
System.out.println(commitInfo);
return true;
} /**
* 删除仓库
*
* @param svnPath
* SVN路径
* @return
*/
public static Boolean doDelete(String svnPath) {
String[] path = { svnPath };
return doDelete(path);
} /**
* 删除文件夹
*
* @param svnPath
* SVN路径
* @return
*/
public static Boolean doDelete(String[] svnPath) {
return doDelete(svnPath, "admin", "admin");
} /**
* 删除文件夹
*
* @param svnPath
* SVN路径
* @param username
* 用户名
* @param passWord
* 密码
* @return
*/
public static Boolean doDelete(String[] svnPath, String username, String passWord) { ISVNOptions options = SVNWCUtil.createDefaultOptions(true);
// 实例化客户端管理类
ourClientManager = SVNClientManager.newInstance((DefaultSVNOptions) options, username, passWord); // 相关变量赋值
SVNURL[] repositoryURL = new SVNURL[svnPath.length];
try {
for (int i = 0; i < svnPath.length; i++) {
SVNURL svnurl = SVNURL.parseURIEncoded(svnPath[i]);
repositoryURL[i] = svnurl;
}
} catch (SVNException e) {
e.printStackTrace();
return false;
} // 执行导入操作
SVNCommitInfo commitInfo = null;
try {
commitInfo = ourClientManager.getCommitClient().doDelete(repositoryURL, "delete file");
} catch (SVNException e) {
e.printStackTrace();
return false;
}
return true;
} /**
* 清除仓库中的锁,以及未完成的操作
*
* @param targetPath
* 本地仓库路径
* @param username
* 用户名
* @param passWord
* 密码
* @return Boolean
*/
public static Boolean doCleanup(String targetPath, String username, String passWord) {
ISVNOptions options = SVNWCUtil.createDefaultOptions(true);
// 实例化客户端管理类
ourClientManager = SVNClientManager.newInstance((DefaultSVNOptions) options, username, passWord);
File wcDir = new File(targetPath);
if (wcDir.exists()) {
try {
ourClientManager.getWCClient().doCleanup(wcDir);
} catch (SVNException e) {
e.printStackTrace();
return false;
}
} else {
return false;
}
return true;
} /**
* 下载压缩包
*
* @param path
* 仓库路径
*/
public static void checkoutZip(String path) {
checkoutZip(path, "/data/repo");
} /**
* 下载压缩包
*
* @param path
* 仓库路径
* @param targetPath
* 本地路径
*/
public static void checkoutZip(String path, String targetPath) {
checkoutZip(path, targetPath, "admin", "admin");
} /**
* 下载压缩包
*
* @param path
* 仓库路径
* @param targetPath
* 本地路径
* @param userName
* 用户名
* @param passWord
* 密码
*/
public static void checkoutZip(String path, String targetPath, String userName, String passWord) {
Long isSuccess = RepositoryUtil.checkOut(path, targetPath, userName, passWord); String[] split = path.split(File.separator);
String fileName = split[split.length - 1]; String zipFilePath = targetPath + fileName + ".zip"; ZipUtil.zip(targetPath, zipFilePath);
if (isSuccess != -1L) {
try (FileInputStream is = new FileInputStream(zipFilePath)) {
EventUtil.post(new DownloadFileEvent(fileName + ".zip", DataConvert.inputStreamToByte(is)));
} catch (Exception ex) {
ExtendUtil.error(ex.getMessage());
} finally { Path tempPath = Paths.get(zipFilePath);
FileUtil.del(tempPath); }
}
} /**
* 获取文件,判断是否是.svn文件夹
*
* @param f
* 文件
*/
public static void getFile(File f) {
File[] files = f.listFiles();
for (int i = 0; i < files.length; i++) {
if (".svn".equals(files[i].getName())) {
continue;
}
if (files[i].isDirectory()) {
getFile(files[i]);
}
}
} /**
* 获取SVN文件夹
*
* @param path
* 仓库路径
* @param revision
* 版本号
* @param properties
* SVN配置
* @param dirEntries
* 文件夹集合
* @param svnPath
* SVN路径
* @param username
* 用户
* @param password
* 密码
* @return
* @throws SVNException
*/
public static List<DirNodeDTO> getSvnDir(String path, long revision, SVNProperties properties,
Collection dirEntries, String svnPath, String username, String password) throws SVNException { /*
* 创建SVNRepository来管理repository. SVNURL 是url的包装对象
*/
SVNRepository repository = SVNRepositoryFactory.create(SVNURL.parseURIEncoded(svnPath)); // 登录
ISVNAuthenticationManager authManager = SVNWCUtil.createDefaultAuthenticationManager(username, password);
repository.setAuthenticationManager(authManager); ArrayList<DirNodeDTO> dirNodes = new ArrayList<>();
return getDirPath(dirNodes, null, repository, path, revision, properties, dirEntries);
} /**
* 获取SVN文件夹
*
* @param path
* 仓库路径
* @param revision
* 版本号
* @param properties
* SVN配置
* @param dirEntries
* 文件夹集合
* @param svnPath
* SVN路径
* @return
* @throws SVNException
*/
public static List<DirNodeDTO> getSvnDir(String path, long revision, SVNProperties properties,
Collection dirEntries, String svnPath) throws SVNException {
return getSvnDir(path, revision, properties, dirEntries, svnPath, "admin", "admin");
} /**
* 获取SVN文件夹
*
* @param path
* 仓库路径
* @param revision
* 版本号
* @param svnPath
* SVN路径
* @return
* @throws SVNException
*/
public static List<DirNodeDTO> getSvnDir(String path, long revision, String svnPath) throws SVNException {
return getSvnDir(path, revision, null, null, svnPath);
} /**
* 获取SVN文件夹
*
* @param path
* 仓库路径
* @param svnPath
* SVN路径
* @return
* @throws SVNException
*/
public static List<DirNodeDTO> getSvnDir(String path, String svnPath) throws SVNException {
return getSvnDir(path, -1, svnPath);
} /**
* 获取SVN文件夹
*
* @param svnPath
* SVN路径
* @return
* @throws SVNException
*/
public static List<DirNodeDTO> getSvnDir(String svnPath) throws SVNException {
return getSvnDir("", svnPath);
} /**
* 获取文件路径
*
* @param list
* 文件实体集合
* @param dir
* 文件实体
* @param repository
* SVN仓库
* @param path
* 路径
* @param revision
* 版本号
* @param properties
* 配置
* @param dirEntries
* 实体集合
* @return
* @throws SVNException
*/
public static List<DirNodeDTO> getDirPath(List<DirNodeDTO> list, DirNodeDTO dir, SVNRepository repository,
String path, long revision, SVNProperties properties, Collection dirEntries) throws SVNException {
Collection entries = repository.getDir(path, revision, null, (Collection) null);
Iterator iterator = entries.iterator();
while (iterator.hasNext()) {
SVNDirEntry entry = (SVNDirEntry) iterator.next();
/*
* SVNNodeKind.NONE :无此目录或文件 SVNNodeKind.FILE :该地址是个文件 SVNNodeKind.DIR :该地址是个目录
*/
SVNNodeKind nodeKind = repository.checkPath(entry.getName(), -1); DirNodeDTO dirNode = new DirNodeDTO();
dirNode.setSize(entry.getSize());
dirNode.setRevision(entry.getRevision());
dirNode.setAuthor(entry.getAuthor());
dirNode.setUpdateDate(entry.getDate());
dirNode.setMessage(entry.getCommitMessage());
dirNode.setPath(path.equals("") ? entry.getName() : path + "/" + entry.getName());
dirNode.setName(entry.getRelativePath());
dirNode.setParent(dir);
if (entry.getKind().toString().equals("file")) {
dirNode.setDir(false);
} else {
dirNode.setDir(true);
} System.out.println(dirNode); list.add(dirNode);
if (entry.getKind().toString().equals("dir")) {
getDirPath(list, dirNode, repository, dirNode.getPath(), revision, null, (Collection) null);
}
}
return list;
} /**
* 获取仓库文件
*
* @param path
* 路径
* @param revision
* 版本
* @param svnPath
* SVN路径
* @param username
* 用户名
* @param password
* 密码
* @return
* @throws SVNException
*/
public static RepositoryFileContentDTO getSvnFile(String path, long revision, String svnPath, String username,
String password) throws SVNException { /*
* 创建SVNRepository来管理repository. SVNURL 是url的包装对象
*/
SVNRepository repository = SVNRepositoryFactory.create(SVNURL.parseURIEncoded(svnPath)); // 登录
ISVNAuthenticationManager authManager = SVNWCUtil.createDefaultAuthenticationManager(username, password);
repository.setAuthenticationManager(authManager); return getFileContext(repository, path, revision);
} /**
* 获取仓库文件
*
* @param path
* 路径
* @param svnPath
* SVN路径
* @param username
* 用户名
* @param password
* 密码
* @return
* @throws SVNException
*/
public static RepositoryFileContentDTO getSvnFile(String path, String svnPath, String username, String password)
throws SVNException {
return getSvnFile(path, -1, svnPath, username, password);
} /**
* 获取仓库文件
*
* @param path
* 路径
* @param svnPath
* SVN路径
* @return
* @throws SVNException
*/
public static RepositoryFileContentDTO getSvnFile(String path, String svnPath) throws SVNException {
return getSvnFile(path, -1, svnPath, "admin", "admin");
} /**
* 获取仓库文件
*
* @param repository
* 仓库
* @param path
* 路径
* @param revision
* 版本
* @return
* @throws SVNException
*/
public static RepositoryFileContentDTO getFileContext(SVNRepository repository, String path, long revision)
throws SVNException { /*
* SVNNodeKind.NONE :无此目录或文件 SVNNodeKind.FILE :该地址是个文件 SVNNodeKind.DIR :该地址是个目录
*/
SVNNodeKind nodeKind = repository.checkPath(path, revision); if (nodeKind.toString().equals("file")) {
SVNProperties fileProperties = new SVNProperties();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
/*
* 获取文件内容和属性。-1:最后版本。
*/
repository.getFile(path, -1, fileProperties, baos);
String mimeType = fileProperties.getStringValue(SVNProperty.MIME_TYPE);
boolean isTextType = SVNProperty.isTextMimeType(mimeType); if (isTextType) {
try {
System.out.println("@" + new String(baos.toString("UTF-8")));
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}
RepositoryFileContentDTO repositoryFileContent = new RepositoryFileContentDTO();
repositoryFileContent.setIsText(isTextType);
repositoryFileContent.setBaos(baos);
return repositoryFileContent;
}
return null;
} /**
* 对比文件
*
* @param svnPath
* SVN路径
* @param path
* 文件路径
* @param rivision1
* 版本号
* @param rivision2
* 版本号
* @return
* @throws SVNException
* @throws Exception
*/
public static String diff(String svnPath, String path, Long rivision1, Long rivision2)
throws SVNException, Exception {
return diff(svnPath, path, rivision1, path, rivision2);
} /**
* 对比文件
*
* @param svnPath
* SVN路径
* @param path1
* 文件路径
* @param rivision1
* 版本号
* @param path2
* 文件路径
* @param rivision2
* 版本号
* @return
* @throws SVNException
* @throws Exception
*/
public static String diff(String svnPath, String path1, Long rivision1, String path2, Long rivision2)
throws SVNException, Exception {
return diff(svnPath, "admin", "admin", path1, rivision1, path2, rivision2);
} /**
* 对比文件内容
*
* @param svnPath
* SVN路径
* @param userName
* 用户名
* @param passWord
* 面
* @param path1
* 路径
* @param rivision1
* 版本
* @param path2
* 路径
* @param rivision2
* 版本
* @return
* @throws SVNException
* @throws Exception
*/
public static String diff(String svnPath, String userName, String passWord, String path1, Long rivision1,
String path2, Long rivision2) throws SVNException, Exception {
return diff(svnPath, userName, passWord, path1, SVNRevision.create(rivision1), path2,
SVNRevision.create(rivision2));
} /**
* 对比文件内容
*
* @param svnPath
* SVN路径
* @param userName
* 用户名
* @param passWord
* 面
* @param path1
* 路径
* @param rivision1
* 版本
* @param path2
* 路径
* @param rivision2
* 版本
* @return
* @throws SVNException
* @throws Exception
*/
public static String diff(String svnPath, String userName, String passWord, String path1, SVNRevision rivision1,
String path2, SVNRevision rivision2) throws SVNException, Exception {
return diff(svnPath, userName, passWord, path1, rivision1, path2, rivision2, (String) null);
} /**
* 对比文件内容
*
* @param svnPath
* SVN路径
* @param userName
* 用户名
* @param passWord
* 面
* @param path1
* 路径
* @param rivision1
* 版本
* @param path2
* 路径
* @param rivision2
* 版本
* @param targetPath
* 内容输出文件路径
* @return
* @throws SVNException
* @throws Exception
*/
public static String diff(String svnPath, String userName, String passWord, String path1, SVNRevision rivision1,
String path2, SVNRevision rivision2, String targetPath) throws SVNException, Exception { ISVNOptions options = SVNWCUtil.createDefaultOptions(true);
// 实例化客户端管理类
ourClientManager = SVNClientManager.newInstance((DefaultSVNOptions) options, userName, passWord); SVNDiffClient diffClient = ourClientManager.getDiffClient();
// StringOutputStream result = new StringOutputStream();
ByteArrayOutputStream out = new ByteArrayOutputStream(); SVNURL svnUrl1 = SVNURL.parseURIEncoded(ToolUtils.endDir(svnPath) + path1);
SVNURL svnUrl2 = SVNURL.parseURIEncoded(ToolUtils.endDir(svnPath) + path2); diffClient.doDiff(svnUrl1, rivision1, svnUrl2, rivision2, SVNDepth.INFINITY, true, out); if (targetPath != null && "".equals(targetPath)) {
FileOutputStream fileOutputStream = null;
try {
fileOutputStream = new FileOutputStream(targetPath);
fileOutputStream.write(out.toByteArray());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} System.out.println(out.toString("UTF-8"));
return out.toString("UTF-8");
} /**
* 获得指定版本提交日志信息
*
* @param svnPath
* SVN路径
* @return 日志实体集合
* @throws SVNException
*/
public static List<SVNCommitLogDTO> getCommitLog(String svnPath) throws SVNException {
ISVNOptions options = SVNWCUtil.createDefaultOptions(true);
// 实例化客户端管理类
ourClientManager = SVNClientManager.newInstance((DefaultSVNOptions) options, "admin", "admin");
SVNRepository repository = ourClientManager.createRepository(SVNURL.parseURIEncoded(svnPath), true);
SVNDirEntry entry = repository.info(".", -1);
return getCommitLog(svnPath, (int) entry.getRevision());
} /**
* 获得指定版本提交日志信息
*
* @param svnPath
* SVN路径
* @param limit
* 展示数
* @return 日志实体集合
* @throws SVNException
*/
public static List<SVNCommitLogDTO> getCommitLog(String svnPath, int limit) throws SVNException {
ISVNOptions options = SVNWCUtil.createDefaultOptions(true);
// 实例化客户端管理类
ourClientManager = SVNClientManager.newInstance((DefaultSVNOptions) options, "admin", "admin");
SVNRepository repository = ourClientManager.createRepository(SVNURL.parseURIEncoded(svnPath), true);
SVNDirEntry entry = repository.info(".", -1);
return getCommitLog(svnPath, (int) entry.getRevision(), 1, limit);
} /**
* 获得指定版本提交日志信息
*
* @param svnPath
* SVN路径
* @param revision
* 版本
* @param limit
* 展示数
* @return 日志实体集合
* @throws SVNException
*/
public static List<SVNCommitLogDTO> getCommitLog(String svnPath, int revision, int limit) throws SVNException {
ISVNOptions options = SVNWCUtil.createDefaultOptions(true);
// 实例化客户端管理类
ourClientManager = SVNClientManager.newInstance((DefaultSVNOptions) options, "admin", "admin");
SVNRepository repository = ourClientManager.createRepository(SVNURL.parseURIEncoded(svnPath), true);
SVNDirEntry entry = repository.info(".", -1);
return getCommitLog(svnPath, (int) entry.getRevision(), revision, limit);
} /**
* 获得指定版本提交日志信息
*
* @param svnPath
* SVN路径
* @param startRevision
* 开始版本号
* @param endRevision
* 结束版本号
* @param limit
* 展示数
* @return 日志实体集合
* @throws SVNException
*/
public static List<SVNCommitLogDTO> getCommitLog(String svnPath, int startRevision, int endRevision, int limit)
throws SVNException {
return getCommitLog(svnPath, new String[] {}, -1, startRevision, endRevision, limit);
} /**
* 获得指定版本提交日志信息
*
* @param svnPath
* SVN路径
* @param paths
* 文件路径
* @param pegRevision
* 文件版本号
* @param startRevision
* 开始版本号
* @param endRevision
* 结束版本号
* @param limit
* 展示数
* @return 日志实体集合
* @throws SVNException
*/
public static List<SVNCommitLogDTO> getCommitLog(String svnPath, String[] paths, int pegRevision, int startRevision,
int endRevision, int limit) throws SVNException {
return getCommitLog(svnPath, "admin", "admin", paths, pegRevision, startRevision, endRevision, limit);
} /**
* 获得指定版本提交日志信息
*
* @param svnPath
* SVN路径
* @param userName
* 用户名
* @param passWord
* 密码
* @param paths
* 文件路径
* @param pegRevision
* 文件版本号
* @param startRevision
* 开始版本号
* @param endRevision
* 结束版本号
* @param limit
* 展示数
* @return 日志实体集合
* @throws SVNException
*/
public static List<SVNCommitLogDTO> getCommitLog(String svnPath, String userName, String passWord, String[] paths,
int pegRevision, int startRevision, int endRevision, int limit) throws SVNException { // 3.初始化权限
ISVNAuthenticationManager isvnAuthenticationManager = SVNWCUtil.createDefaultAuthenticationManager(userName,
passWord);
// 4.创建SVNClientManager的实例
ISVNOptions options = SVNWCUtil.createDefaultOptions(true);
// 实例化客户端管理类
SVNClientManager svnClientManager = SVNClientManager.newInstance((DefaultSVNOptions) options, "admin", "admin");
SVNLogClient svnLogClient = svnClientManager.getLogClient();
ArrayList<SVNCommitLogDTO> logList = new ArrayList<>();
try {
svnLogClient.doLog(SVNURL.parseURIEncoded(svnPath), paths, SVNRevision.create(pegRevision),
SVNRevision.create(startRevision), SVNRevision.create(endRevision), false, true, false, limit, null,
svnLogEntry -> {
SVNCommitLogDTO svnCommitLogDTO = new SVNCommitLogDTO();
svnCommitLogDTO.setAuthor(svnLogEntry.getAuthor());
svnCommitLogDTO.setMessage(svnLogEntry.getMessage());
svnCommitLogDTO.setRevision(svnLogEntry.getRevision());
svnCommitLogDTO.setCommitDate(svnLogEntry.getDate()); Collection<SVNLogEntryPath> svnLogEntryPathCollection = svnLogEntry.getChangedPaths().values();
List<SVNFileEntryDTO> fileEntryDTOList = new ArrayList<>();
for (SVNLogEntryPath svnLogEntryPath : svnLogEntryPathCollection) {
int i = svnLogEntryPath.getPath().lastIndexOf("/");
String substring = svnLogEntryPath.getPath().substring(0, i);
SVNClientManager svnClientManager2 = SVNClientManager.newInstance(options,
isvnAuthenticationManager);
SVNRepository repository = svnClientManager2
.createRepository(SVNURL.parseURIEncoded(svnPath), true);
List<SVNFileEntryDTO> svnFileEntryDTOList = new ArrayList<>();
listEntries(repository, substring, svnLogEntry.getRevision(), svnFileEntryDTOList);
for (SVNFileEntryDTO svnFileEntryDTO : svnFileEntryDTOList) {
svnFileEntryDTO.setSubmitType(String.valueOf(svnLogEntryPath.getType()));
svnFileEntryDTO.setPath(svnFileEntryDTO.getPath());
if (svnFileEntryDTO.getPath().equals(svnLogEntryPath.getPath())) {
fileEntryDTOList.add(svnFileEntryDTO);
}
}
}
svnCommitLogDTO.setFileList(fileEntryDTOList);
logList.add(svnCommitLogDTO);
});
} catch (Exception e) {
e.printStackTrace();
}
return logList;
} /**
* 获取文件详情信息
*
* @param repository
* 镜像
* @param path
* 路径
* @param revision
* 版本
* @param svnFileEntryDTOList
* 文件实体集合
* @throws SVNException
*/
private static void listEntries(SVNRepository repository, String path, Long revision,
List<SVNFileEntryDTO> svnFileEntryDTOList) throws SVNException {
// 获取版本库的path目录下的所有条目。参数-1表示是最新版本。
Collection entries = null;
try {
entries = repository.getDir(path, revision, null, (Collection) null);
} catch (Exception e) {
return;
}
Iterator iterator = entries.iterator();
while (iterator.hasNext()) {
SVNDirEntry entry = (SVNDirEntry) iterator.next();
// 创建文件对象
SVNFileEntryDTO svnFileEntryDTO = new SVNFileEntryDTO();
svnFileEntryDTO.setName(entry.getName());
svnFileEntryDTO.setRevision(entry.getRevision());
svnFileEntryDTO.setPath("/" + ("".equals(path) ? "" : path + "/") + entry.getName());
svnFileEntryDTO.setPath(svnFileEntryDTO.getPath().replace("//", "/"));
svnFileEntryDTO.setKind(entry.getKind().toString());
svnFileEntryDTOList.add(svnFileEntryDTO);
if (entry.getKind() == SVNNodeKind.DIR) {
listEntries(repository, (path.equals("")) ? entry.getName() : ToolUtils.endDir(path) + entry.getName(),
revision, svnFileEntryDTOList);
}
}
} /**
* 获取指定版本的文件并转换为字符串
*
* @param url
* SVN路径
* @param version
* 版本
* @return
* @throws Exception
*/
public static String getRevisionFileContent(String url, int version) throws Exception {
return getRevisionFileContent(url, "admin", "admin", version);
} /**
* 获取指定版本的文件并转换为字符串
*
* @param url
* SVN路径
* @param userName
* 用户名
* @param passWord
* 密码
* @param version
* 版本
* @return
* @throws Exception
*/
public static String getRevisionFileContent(String url, String userName, String passWord, int version)
throws Exception { // create clientManager
ISVNOptions options = SVNWCUtil.createDefaultOptions(true);
ourClientManager = SVNClientManager.newInstance((DefaultSVNOptions) options, userName, passWord); // generate client
SVNWCClient wcClient = ourClientManager.getWCClient(); SVNURL repositoryUrl = SVNURL.parseURIEncoded(url);
OutputStream contentStream = new ByteArrayOutputStream();
wcClient.doGetFileContents(repositoryUrl, SVNRevision.HEAD, SVNRevision.create(version), false, contentStream);
return contentStream.toString();
} /**
* 获取指定版本的文件并转换为字符串
*
* @param url
* SVN路径
* @param userName
* 用户名
* @param passWord
* 密码
* @param version
* 版本
* @return 文件
* @throws Exception
*/
public File getRevisionFile(String url, String userName, String passWord, String version) throws Exception { // create clientManager
ISVNOptions options = SVNWCUtil.createDefaultOptions(true);
ourClientManager = SVNClientManager.newInstance((DefaultSVNOptions) options, userName, passWord); // generate client
SVNWCClient wcClient = ourClientManager.getWCClient(); SVNURL repositoryUrl = SVNURL.parseURIEncoded(url); SVNRevision revision = SVNRevision.create(Long.parseLong(version));
File file = File.createTempFile("patch-", ".tmp");
OutputStream contentStream = new FileOutputStream(file);
wcClient.doGetFileContents(repositoryUrl, SVNRevision.HEAD, revision, false, contentStream);
return file;
} /**
* 扫描仓库
*
* @param path
* 扫描的地址
* @return
*/
public static HashMap<String, String> scanRepository(String path) {
HashMap<String, String> paths = new HashMap<>();
File dir = new File(path + "repo" + File.separator);
for (File file : dir.listFiles()) {
if (FileUtil.isDirectory(file) //
&& FileUtil.exist(file.getPath() + File.separator + "conf") //
&& FileUtil.exist(file.getPath() + File.separator + "db") //
&& FileUtil.exist(file.getPath() + File.separator + "hooks") //
&& FileUtil.exist(file.getPath() + File.separator + "locks")) {
paths.put(file.getName(), path);
}
}
return paths;
} }

4、SvnServiceUtil.java

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.RuntimeUtil; import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List; /**
* @author: hanchunyu
* @since 2022/11/2 上午10:58
* <p>
* Description: SVN服务器服务
*/
public class SvnServiceUtil { /**
* 创建SVN目录
*
* @param path
* 服务器路径
*/
public static void createSvnDir(String path) {
// 创建仓库目录
FileUtil.mkdir(path + "repo");
} /**
* 停止服务器
*/
public static void stopSvnServer() {
if (SystemUtil.isWindows()) {
RuntimeUtil.execForStr("taskkill /f /im svnserve.exe");
} else {
RuntimeUtil.execForStr("killall svnserve");
}
} /**
* 开启服务器
*
* @param path
* 服务器路径
* @param port
* 端口号
* @return
*/
public static String startSvnServer(String path, String port) {
String rs = null;
if (SystemUtil.isWindows()) {
// 使用vbs后台运行
String cmd = "svnserve.exe -d -r " + (path + "repo").replace("/", "\\") + " --listen-port " + port;
List<String> vbs = new ArrayList<>();
vbs.add("set ws=WScript.CreateObject(\"WScript.Shell\")");
vbs.add("ws.Run \"" + cmd + " \",0");
FileUtil.writeLines(vbs, path + "run.vbs", Charset.forName("UTF-8")); rs = RuntimeUtil.execForStr("wscript " + path + "run.vbs");
} else {
rs = RuntimeUtil.execForStr("svnserve -d -r " + path + "repo --listen-port " + port);
}
return rs;
} public static Boolean getStatus(SvnServerBean svnServerBean) {
Boolean isRun = false;
String status = ""; SvnProtocolEnum serverProtocol = svnServerBean.getServerProtocol();
if (SvnProtocolEnum.HTTP.equals(serverProtocol) || SvnProtocolEnum.HTTPS.equals(serverProtocol)) {
String[] command = { "/bin/sh", "-c", "ps -ef|grep httpd" };
String rs = RuntimeUtil.execForStr(command);
isRun = rs.contains("httpd -k start");
} else {
if (Boolean.TRUE.equals(SystemUtil.isWindows())) {
String[] command = { "tasklist" };
String rs = RuntimeUtil.execForStr(command);
isRun = rs.toLowerCase().contains("svnserve");
} else {
String[] command = { "/bin/sh", "-c", "ps -ef|grep svnserve" };
String rs = RuntimeUtil.execForStr(command);
isRun = rs.contains("svnserve -d -r");
}
}
return isRun;
}
}

5、SvnUserUtil.java

import org.ini4j.Ini;
import org.ini4j.Profile; import java.io.File;
import java.io.IOException;
import java.util.*;
import java.util.stream.Collectors; /**
* @author: hanchunyu
* @since 2022/11/9 下午3:20
* <p>
* Description: SVN用户权限操作类
*/
public class SvnUserUtil { /**
* 文件删除用户
*
* @param repositoryBean
* SVN仓库实体
* @param svnUserAuthBeans
* 用户权限实体集合
* @throws IOException
*/
public static void deleteUserToFile()
throws IOException {
String passwdPath = getPasswdPath(getServerPath(),getRepositoryName());
File file = new File(passwdPath);
Ini ini = new Ini();
ini.load(file); Profile.Section users = ini.get("users"); users.remove(getUserName()) ini.store(file);
} /**
* 从文件删除用户组
*
* @param repositoryBean
* SVN仓库实体
* @param svnGroupAuthBeans
* 用户组权限实体集合
* @throws IOException
*/
public static void deleteGroupToFile()
throws IOException {
String authPath = getAuthzPath(getServerPath(),getRepositoryName());
File file = new File(authPath);
Ini ini = new Ini();
ini.load(file); Profile.Section groups = ini.get("groups");
groups.remove(getGroupName())
ini.store(file);
} /**
* 删除权限
*
* @param repositoryBean
* SVN仓库实体
* @param svnUserAuthBeans
* 用户权限实体集合
* @param svnGroupAuthBeans
* 用户组权限实体集合
* @throws IOException
*/
public static void deleteAuth() throws IOException {
String authPath = getAuthzPath(getServerPath(),getRepositoryName());
File file = new File(authPath);
Ini ini = new Ini();
ini.load(file); Profile.Section users = ini.get(repositoryBean.getSvnAddress()); users.remove("@" + getGroupName()); ini.store(file);
} /**
* 创建用户(刷新) 将数据库中的全部用户进行刷新写入
*
* @param repositoryBean
* SVN仓库实体
* @throws IOException
*/
public static void createUser() throws IOException { String passwdPath = getPasswdPath(getServerPath(),getRepositoryName());
File file = new File(passwdPath);
Ini ini = new Ini();
ini.load(file);
Map<String, Map<String, String>> updateData = new HashMap<>(); Map<String, String> userMap = new HashMap<>(); userMap.put(getUserName(),getPassword()); updateData.put("users", userMap); Profile.Section section = null;
Map<String, String> dataMap = null;
for (String sect : updateData.keySet()) {
section = ini.get(sect);
dataMap = updateData.get(sect);
if (section == null) {
for (String key : dataMap.keySet()) {
ini.add(sect, key, dataMap.get(key) == null ? "" : dataMap.get(key));
}
} else {
for (String key : dataMap.keySet()) {
section.put(key, dataMap.get(key) == null ? "" : dataMap.get(key));
}
}
}
ini.store(file); } /**
* 更新用户
*
* @param svnUserAuthBean
* 用户权限实体
* @param repositoryBean
* SVN仓库镜像
* @throws IOException
*/
public static void updateUser() throws IOException { String passwdPath = getPasswdPath(getServerPath(),getRepositoryName());
File file = new File(passwdPath);
Ini ini = new Ini();
ini.load(file); Profile.Section section = ini.get("users");
if (section != null) {
section.put(getUserName(),getPassword() == null ? "":getPassword());
} else {
ini.add("users", getUserName(),getPassword() == null ? "":getPassword());
}
ini.store(file);
} /**
* 更新用户权限
*
* @param svnUserAuthBean
* 用户权限实体
* @param repositoryBean
* SVN仓库镜像
* @throws IOException
*/
public static void updateUserAuth()
throws IOException { String authPath = getAuthzPath(getServerPath(),getRepositoryName());
File file = new File(authPath);
Ini ini = new Ini();
ini.load(file); Profile.Section section = ini.get(getSvnAddress());
if (section != null) {
section.put(userName(),typeName());
} else {
ini.add(getSvnAddress() != null ? getSvnAddress() : "/",
getUserName(),typeName());
}
ini.store(file);
} /**
* 更新用户组权限
*
* @param svnGroupAuthBean
* 用户组权限实体
* @param repositoryBean
* SVN仓库镜像
* @throws IOException
*/
public static void updateGroupAuth()
throws IOException { String authPath = getAuthzPath(getServerPath(),getRepositoryName());
File file = new File(authPath);
Ini ini = new Ini();
ini.load(file); Map<String, String> userGroupMap = new HashMap<>();
Map<String, String> authMap = new HashMap<>();
Map<String, Map<String, String>> updateData = new HashMap<>(); userGroupMap.put(getGroupName(), userName);
authMap.put("@" + getName(), typeName()); updateData.put("groups", userGroupMap); updateData.put(
repositoryBean.getSvnAddress() == null ? "/" : ToolUtils.startDir(repositoryBean.getSvnAddress()),
authMap); Profile.Section section = null;
Map<String, String> dataMap = null;
for (String sect : updateData.keySet()) {
section = ini.get(sect);
dataMap = updateData.get(sect);
if (section != null) {
for (String key : dataMap.keySet()) {
section.put(key, dataMap.get(key) == null ? "" : dataMap.get(key));
}
} else {
for (String key : dataMap.keySet()) {
ini.add(sect, key, dataMap.get(key) == null ? "" : dataMap.get(key));
}
} }
ini.store(file);
} /**
* 更新用户组
*
* @param svnGroupAuthBean
* 用户组权限实体
* @param repositoryBean
* SVN仓库镜像
* @throws IOException
*/
public static void updateGroup()
throws IOException { String passwdPath = getPasswdPath(getServerPath(),getRepositoryName());
File file = new File(passwdPath);
Ini ini = new Ini();
ini.load(file);
Map<String, Map<String, String>> updateData = new HashMap<>(); Map<String, String> userMap = new HashMap<>(); userMap.put(userName,password); updateData.put("users", userMap); Profile.Section section = null;
Map<String, String> dataMap = null;
for (String sect : updateData.keySet()) {
section = ini.get(sect);
dataMap = updateData.get(sect);
if (section != null) {
for (String key : dataMap.keySet()) {
section.put(key, dataMap.get(key) == null ? "" : dataMap.get(key));
}
} else {
for (String key : dataMap.keySet()) {
ini.add(sect, key, dataMap.get(key) == null ? "" : dataMap.get(key));
}
}
}
ini.store(file);
} /**
* 创建权限以及用户组(刷新) 将数据库中的全部进行刷新写入
*
* @param repositoryBean
* SVN仓库实体
* @throws IOException
*/
public static void createAuth() throws IOException {
String authPath = getAuthzPath(getServerPath(),getRepositoryName());
File file = new File(authPath);
Ini ini = new Ini();
ini.load(file);
Map<String, Map<String, String>> updateData = new HashMap<>(); DBUtils t = DBUtils.t(WebContext.getTenantIdentifier());
Map<String, String> userGroupMap = new HashMap<>();
Map<String, String> authMap = new HashMap<>(); authMap.put("@" + groupName,typeName); updateData.put("groups", userGroupMap); updateData.put(
repositoryBean.getSvnAddress() == null ? "/" : ToolUtils.startDir(repositoryBean.getSvnAddress()),
authMap); Profile.Section section = null;
Map<String, String> dataMap = null;
for (String sect : updateData.keySet()) {
section = ini.get(sect);
dataMap = updateData.get(sect);
if (section != null) {
for (String key : dataMap.keySet()) {
section.put(key, dataMap.get(key) == null ? "" : dataMap.get(key));
}
} else {
for (String key : dataMap.keySet()) {
ini.add(sect, key, dataMap.get(key) == null ? "" : dataMap.get(key));
}
} }
ini.store(file); } /**
* 创建全部人权限
*
* @param repositoryBean
* 仓库实体
* @param svnAuthEnum
* 权限枚举
* @throws IOException
*/
public static void updateAdminAuth() throws IOException { String authPath = getAuthzPath(getServerPath(),getRepositoryName());
File file = new File(authPath);
Ini ini = new Ini();
ini.load(file); Profile.Section section = ini.get(getSvnAddress());
if (section != null) {
section.put("*", svnAuthEnum);
} else {
ini.add(repositoryBean.getSvnAddress(), "*", svnAuthEnum);
}
ini.store(file); } /**
* 获取用户名密码文件路径
*
* @param path
* SVN仓库路径
* @param name
* 仓库文件路径
* @return
*/
private static String getPasswdPath(String path, String name) {
return ToolUtils.handlePath(
ToolUtils.endDir(path) + "repo/" + ToolUtils.endDir(ToolUtils.startDir(name)) + "/conf/passwd");
} /**
* 获取权限文件路径
*
* @param path
* SVN仓库路径
* @param name
* 仓库文件路径
* @return
*/
private static String getAuthzPath(String path, String name) {
return ToolUtils.handlePath(
ToolUtils.endDir(path) + "repo/" + ToolUtils.endDir(ToolUtils.startDir(name)) + "/conf/authz");
} }

6、SystemUtil.java

import cn.hutool.core.io.FileUtil;

/**
* @author: hanchunyu
* @since 2022/11/2 上午11:02
* <p>
* Description: 系统工具类
*/
public class SystemUtil { /**
* 判断系统
*
* @return 字符串
*/
public static String getSystem() { if (cn.hutool.system.SystemUtil.get(cn.hutool.system.SystemUtil.OS_NAME).toLowerCase().contains("windows")) {
return "Windows";
} else if (cn.hutool.system.SystemUtil.get(cn.hutool.system.SystemUtil.OS_NAME).toLowerCase()
.contains("mac os")) {
return "Mac OS";
} else {
return "Linux";
} } /**
* 判断是否是Windows系统
*
* @return
*/
public static Boolean isWindows() {
return getSystem().equals("Windows");
} /**
* 判断是否是Mac系统
*
* @return
*/
public static Boolean isMacOS() {
return getSystem().equals("Mac OS");
} /**
* 判断是否是Linux系统
*
* @return
*/
public static Boolean isLinux() {
return getSystem().equals("Linux");
} /**
* 判断是否是root、用户
*
* @return
*/
public static boolean hasRoot() {
if (SystemUtil.isLinux()) {
String user = System.getProperties().getProperty(cn.hutool.system.SystemUtil.USER_NAME);
if ("root".equals(user)) {
return true;
} else {
return false;
}
}
return true;
} }

7、ToolUtils.java

public class ToolUtils {

	/**
* 处理路径的斜杠
*
* @param path
* 路径
* @return
*/
public static String handlePath(String path) {
return path.replace("\\", "/").replace("//", "/");
} /**
* 处理目录最后的斜杠
*
* @param path
* 路径
* @return
*/
public static String endDir(String path) {
if (!path.endsWith("/")) {
path += "/";
} return path;
} /**
* 处理目录开始的斜杠
*
* @param path
* 路径
* @return
*/
public static String startDir(String path) {
if (!path.startsWith("/")) {
path += "/";
} return path;
}
}

相关的实体

1、DirNodeDTO.java

public class DirNodeDTO {
private String path;
private String name; private Long size; private Long revision; private String author; private Date updateDate; private String message; private boolean isDir; private DirNodeDTO parent;
}

2、RepositoryFileContentDTO.java

public class RepositoryFileContentDTO implements Serializable {
private boolean isText;
private ByteArrayOutputStream baos;
}

3、SVNCommitLogDTO.java

public class SVNCommitLogDTO {

	/**
* 版本号
*/
private Long revision;
/**
* 提交人信息
*/
private String author;
/**
* 提交时间
*/
private Date commitDate;
/**
* 提交信息
*/
private String message;
/**
* 仓库前缀
*/
private String repoPrefix;
/**
* 文件列表
*/
private List<SVNFileEntryDTO> fileList;
}

4、SVNFileEntryDTO.java

public class SVNFileEntryDTO {
/**
* 文件名
*/
private String name; /**
* 文件类别,文件file,文件夹dir
*/
private String kind;
/**
* 版本号
*/
private Long revision;
/**
* 操作文件类型:A添加,D删除,U更新
*/
private String submitType;
/**
* 文件路径 :如 /测试项目/112/中文.ppt
*/
private String path;
}

最新文章

  1. JS:offsetWidth\offsetleft 等图文解释
  2. 解决 SVN Skipped &#39;xxx&#39; -- Node remains in conflict
  3. jquery note--czx
  4. mysql命令行以及mysql workbence查询结果中文乱码的解决方法
  5. MVC 基础和增删改、登录
  6. java 标识符命名规则
  7. 解决github push错误The requested URL returned error: 403 Forbidden while accessing
  8. Android的所有权限说明
  9. 各种实用的js,bootstrap插件
  10. Android 基础(设备显示密度/图片自适应
  11. WEB 中的一些名词解释
  12. CSS 入门
  13. Node填坑教程——过滤器
  14. Java中的String类能否被继承?为什么?
  15. .NET CORE学习笔记系列(2)——依赖注入【1】控制反转IOC
  16. Elasticsearch学习笔记(十二)filter与query
  17. 将项目打成jar包执行 在liunx上执行 java -xx.jar
  18. 以time.py为文件名时,调用time包
  19. ubuntu预装的是vim tiny版本
  20. Codeforces Round #427 (Div. 2) Problem B The number on the board (Codeforces 835B) - 贪心

热门文章

  1. 在stm32中使用printf
  2. 在IIS上同站点部署多个程序操作步骤
  3. C. Tea Tasting
  4. ssr 学习总结
  5. 打开Access时电脑出现蓝屏,错误编号0x00000116的问题解决
  6. mysql报错This function has none of DETERMINISTIC. NO SOL or READS SOL DATA...
  7. RBAC(DAC)模型
  8. js 俄罗斯方块 canvas
  9. Mysql 索引心得
  10. 使用Wireshark完成实验3-IP