最近发现了一个纯java实现的svn。
把它用到了当前项目中用于管理指定项目的代码。
废话不多说了,帖代码吧。一目了然
package me.jor.util;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Date;
import java.util.Set;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import org.tmatesoft.svn.core.SVNDepth;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.SVNProperties;
import org.tmatesoft.svn.core.internal.io.dav.DAVRepositoryFactory;
import org.tmatesoft.svn.core.wc.SVNClientManager;
import org.tmatesoft.svn.core.wc.SVNRevision;
import org.tmatesoft.svn.core.wc.SVNWCClient;
public class SVN {
static{
//在javasvn api内没有公开这三个类,但这是初始化svn repository最简单的方法
SVNRepositoryFactoryImpl.setup();//初始化svn/svn+ssh协议
DAVRepositoryFactory.setup();//初始化http/https协议
FSRepositoryFactory.setup();//初始化本地文件系统file://协议
}
private static final SVNClientManager svn=SVNClientManager.newInstance();
public static final ReentrantReadWriteLock.ReadLock SVN_READ_LOCK = LockMap
.getReadLock("common_svn_lock");
public static final ReentrantReadWriteLock.WriteLock SVN_WRITE_LOCK = LockMap
.getWriteLock("common_svn_lock");
/**
* @throws SVNException
*
* @throws InterruptedException
* @throws IOException
* */
public static void ci(String target, ReentrantReadWriteLock.WriteLock lock)
throws FileNotFoundException, SVNException {
ci(new File(target), lock);
}
/**
* @throws SVNException
*
* @throws InterruptedException
* @throws IOException
* */
public static void ci(File target, ReentrantReadWriteLock.WriteLock lock)
throws FileNotFoundException, SVNException {
try {
lock.lock();
SVNWCClient wc=add(target);
svn.getCommitClient().doCommit(
new File[] { target },
false,
"commit " + target.toString() + " on " + new Date(),
new SVNProperties(), null, false, false,
SVNDepth.INFINITY);
wc.doCleanup(target);
} finally {
lock.unlock();
}
}
private static SVNWCClient add(File path) throws SVNException {
SVNWCClient wc=svn.getWCClient();
if(path.isDirectory()){
wc.doAdd(path, true, true, true, SVNDepth.INFINITY, true, true);
for(File f:path.listFiles()){
if(f.toString().indexOf(".svn")<0){
add(f);
}
}
}else{
wc.doAdd(path, true, false, true, SVNDepth.INFINITY, true, true);
}
return wc;
}
/**
* @param target
* 接受Set<File>或Set<String>
* @param filePath
* true:targets是目录路径,false:是目录文件对象
* */
public static enum CommitType {
ABSOLUTE_PATH, FILE
}
@SuppressWarnings("unchecked")
public static void ci(Set<?> targets, CommitType type,
ReentrantReadWriteLock.WriteLock lock) throws IOException,
InterruptedException, SVNException {
switch (type) {
case FILE:
for (File target : (Set<File>) targets) {
ci(target, lock);
}
break;
case ABSOLUTE_PATH:
for (String target : (Set<String>) targets) {
ci(target, lock);
}
break;
}
}
public static void up(String target, ReentrantReadWriteLock.WriteLock lock)
throws FileNotFoundException, SVNException, InterruptedException {
up(new File(target),lock);
}
private static Thread upThread;
public static void up(File target, ReentrantReadWriteLock.WriteLock lock)
throws FileNotFoundException, SVNException, InterruptedException {
if (target.exists()) {
if(upThread==null){
lock.lock();
upThread=Thread.currentThread();
svn.getUpdateClient().doUpdate(target, SVNRevision.HEAD, SVNDepth.INFINITY, true, true);
upThread=null;
lock.unlock();
}
if(upThread!=null){
upThread.join();
}
} else {
throw new FileNotFoundException(target.toString());
}
}
// public static void main(String[] args) throws SVNException,
// FileNotFoundException, InterruptedException {
// SVN.up("E:\\workspace\\dev_processDef\\");
// }
}