使用svnClientAdapter程式設計控制上傳下載已經實現

qking93415981發表於2020-04-06

public class SvnClientUtil {
    
private SvnConfig config;
    
private ISVNClientAdapter svnClient;

    
private SvnClientUtil(){}
    
public SvnClientUtil(SvnConfig config)throws SVNClientException{
        
this.config = config;
        getClient();
    }

    
/**
     * 本地路徑轉為svn路徑
     * 
@param file 本地路徑檔案
     * 
@return SVNUrl
     
*/
    
public SVNUrl localPath2SVNUrl(File file) throws MalformedURLException{
        String absltPath 
= file.getAbsolutePath();
        absltPath 
= absltPath.replaceAll("//""/");
        String tmpPath 
= this.config.getRootDir().replaceAll("//""/");
        absltPath 
= absltPath.replaceAll(tmpPath, "");
        
        
        
return new SVNUrl(this.config.getRootUrl() + absltPath);
    }
    
    
/**
     * checkout from svn server
     * 
@param moduleName svnserver 上的URL
     * 
@param destPath 本地目標路徑
     * 
@param revision 版本
     * 
@param recurse 是否遞迴
     * 
@throws SVNClientException
     
*/
    
public void checkOut(
            SVNUrl moduleName,
            File destPath,
            SVNRevision revision,
            
boolean recurse)throws SVNClientException{
        
        
this.svnClient.checkout(moduleName, destPath, revision, recurse);
    }
    
    
/**
     * 新增檔案到svn
     * 
@param file 待新增的File
     * 
@param url 新增到的SVNUrl
     * 
@param message 備註(必須有中文)
     * 
@throws SVNClientException
     
*/
    
public void add(File file,SVNUrl url,String message)throws SVNClientException{
        
this.svnClient.addFile(file);
        File [] paths 
= new File[]{file};
        
this.svnClient.commit(paths, message, false);
    }
    
    
/**
     * 新增目錄
     * 
@param dir 目錄File
     * 
@param message 備註(中文)
     * 
@param recurse 是否遞迴
     * 
@throws SVNClientException
     
*/
    
public void addDir(File dir, String message,boolean recurse)throws SVNClientException{
        
this.svnClient.addDirectory(dir, recurse);
        File [] paths 
= new File[]{dir};
        
this.svnClient.commit(paths, message, recurse);
    }
    
    
/**
     * 獲得某版本的內容
     * 
@param url svnURL
     * 
@param revision 版本號
     * 
@return InputStream
     * 
@throws SVNClientException
     
*/
    
public InputStream getHistoryContent(SVNUrl url, SVNRevision revision)throws SVNClientException{
        
return this.svnClient.getContent(url, revision);
    }
    
    
/**
     * 提交
     * 
@param path 提交的檔案
     * 
@param message 備註(必須含中文)
     * 
@throws SVNClientException
     
*/
    
public void commit(File path, String message)throws SVNClientException{
        File [] paths 
= new File[]{path};
        
this.svnClient.commit(paths, message, false);
    }
    
    
/**
     * 刪除
     * 
@param url 刪除檔案的URL
     * 
@param message 備註(必須含中文)
     * 
@throws SVNClientException
     
*/
    
public void delete(SVNUrl url,String message)throws SVNClientException{
        SVNUrl[] urls 
= new SVNUrl[]{url};
        
this.svnClient.remove(urls, message);
    }
    
    
    
/**
     * 獲取歷史紀錄
     * 
@param url 檔案對應的svn url
     * 
@return ISVNLogMessage[]
     * 
@throws SVNClientException
     
*/
    
public ISVNLogMessage[] getHistory(SVNUrl url)throws SVNClientException{
         
return  this.svnClient.getLogMessages(url, SVNRevision.START, SVNRevision.HEAD);
    }
    
    
    
/**
     * 復原為某一個版本
     * 
@param path 路徑
     * 
@param revision 版本號
     * 
@param recurse 是否遞迴
     * 
@throws SVNClientException
     
*/
    
public void update(File path, SVNRevision revision, boolean recurse)throws SVNClientException{
        
this.svnClient.update(path, revision, recurse);
    }
    
    
public SvnConfig getConfig() {
        
return config;
    }
    
    
public void setup() {
        
try {
            JhlClientAdapterFactory.setup();
        } 
catch (SVNClientException e) {
            
// can't register this factory
        }
        
try {
            CmdLineClientAdapterFactory.setup();
        } 
catch (SVNClientException e1) {
            
// can't register this factory
        }
        
        
try {
            SvnKitClientAdapterFactory.setup();
        } 
catch (SVNClientException e1) {
            
// can't register this factory
        }
       
    }

    
public void getClient() throws SVNClientException{
        setup();
        
        
try {
            String bestClientType 
= SVNClientAdapterFactory.getPreferredSVNClientType();
            System.out.println(
"Using "+bestClientType+" factory");
            svnClient 
= SVNClientAdapterFactory.createSVNClient(bestClientType);
        } 
catch (SVNClientException e) {
            System.out.println(e.getMessage());
            
throw e;
        }
        

        
// set username and password if necessary
        svnClient.setUsername(this.config.getSvnUser());
        svnClient.setPassword(
this.config.getSvnPwd());

        
//    add a listener if you wish
        NotifyListener listener = new SvnClientUtil.NotifyListener();
        svnClient.addNotifyListener(listener);
        
        
//初始化工作目錄
        SVNUrl moduleName;
        File destPath 
= new File(this.config.getRootDir());
        
try{
            
if(!destPath.exists()){
                destPath.mkdirs();
                System.out.println(
"create local SVN work space!");
            }
            moduleName 
= new SVNUrl(this.config.getRootUrl());
            
            System.out.println(
"update SVN work space from server!");
            
this.checkOut(moduleName, destPath, SVNRevision.HEAD, true);
        }
catch(Exception e){
            System.out.println(
"update SVN work space from server fail!");
            e.printStackTrace();
            
throw new SVNClientException(e);
        }
    }
    
    
public static class NotifyListener implements ISVNNotifyListener {
        
public void setCommand(int cmd) {
            
// the command that is being executed. See ISVNNotifyListener.Command
            
// ISVNNotifyListener.Command.ADD for example 
        }
        
public void logMessage(String message) {
            System.out.println(message);
        }

        
public void logCommandLine(String message) {
            
// the command line used
            System.out.println(message);
        }

        
public void logError(String message) {
            
// when an error occurs
            System.out.println("error :" +message);
        }
    
        
public void logRevision(long revision, String path) {
            
// when command completes against revision
            System.out.println("revision :" +revision);
        }

        
public void logCompleted(String message) {
            
// when command completed
            System.out.println(message);
        }

        
public void onNotify(File path, SVNNodeKind nodeKind) {
            
// each time the status of a file or directory changes (file added, reverted ...)
            
// nodeKind is SVNNodeKind.FILE or SVNNodeKind.DIR
            
            
// this is the function we use in subclipse to know which files need to be refreshed
            
            System.out.println(
"Status of "+path.toString()+" has changed");
        }
    }
   
}
 

相關文章