[OpenAPI] SVNKit 샘플코드 및 사용후기

    728x90
    반응형

    SVNKit?

    1) 자바 언어로 작성된 SVN클라이언트 라이브러리

    2) SVNKit은 SVN클라이언트 API를 제공하며, Java 프로그램에서 Subversion 저장소와 상호 작용할 수 있는 방법을 제공

    3) 저장소의 내용을 체크 아웃하고 변경 사항을 커밋하는 등의 기본적인 버전 관리 작업을 수행

    4) Maven, Ant 등과 같은 빌드 도구와 함께 사용가능

     

     

    SVNURL

    1) SVNURL을 사용해 SVN저장소의 URL을 파싱

     

    샘플코드

    import org.tmatesoft.svn.core.*;
    import org.tmatesoft.svn.core.wc.*;
    
    public class SVNUtil {
        /**
         * SVN Remote URL에 연결을 시도한다
         * @return SVNURL
         */
        public static SVNURL getSVNURL() {
            String url = "http://svn.example.com/svn/repository/trunk"; // SVN 저장소 URL
            SVNURL svnUrl = SVNURL.parseURIDecoded(url);
            return svnUrl;
        }
    }

     

     

    SVNClientManager

    1) SVN저장소에 대한 클라이언트 연결을 설정하고, 작업 디렉토리를 관리

    2) SVN저장소에서 파일을 검색하고 다운로드하고 업로드하는 등의 작업을 수행

    3) SVNClientManager.newInstance()를 사용하여 SVNClientManager 객체를 생성

     

    샘플코드

    import org.tmatesoft.svn.core.*;
    import org.tmatesoft.svn.core.wc.*;
    
    public class SVNUtil {
        /**
         * SVNClientManager의 인스턴스를 생성한다
         * @return SVNClientManager
         */
        public static SVNClientManager ClientManagerInstance() {
            SVNClientManager clientManager = SVNClientManager.newInstance(SVNWCUtil.createDefaultOptions(true), "사용자ID", "비밀번호");
            clientManager.isIgnoreExternals();
            return clientManager;
        }
    }

     

     

    doCheckOut

    1) 저장소에서 코드를 체크아웃

    2) SVNRevision.HEAD를 사용하여 최신 버전의 코드를 체크아웃

    3) SVNDepth.INFINITY를 사용하여 하위 디렉토리의 모든 내용을 체크아웃

     

    샘플코드

    import org.tmatesoft.svn.core.*;
    import org.tmatesoft.svn.core.wc.*;
    
    public class SVNUtil {
        /**
         * SVNRepository에서 로컬에 체크아웃을 수행한다
         * @param clientManager SVNClient 정보를 관리하는 SVNClientManager
         * @param svnUrl SVN과 연결정보가 저장되어 있는 SVNURL 객체
         * @return long 최신 리비전 ID
         */
        public static long doCheckOut(SVNClientManager clientManager, SVNURL svnUrl) {
            long revId;
            try {
                revId = clientManager.getUpdateClient().doCheckout(svnUrl, new File("체크아웃받을 로컬경로"), SVNRevision.HEAD, SVNRevision.HEAD, SVNDepth.INFINITY, true);
            } catch(SVNException svne) {
                svne.printstackTrace();
            }
            return revId;
        }
    }

     

     

    doUpdate

    1) 로컬 디렉토리의 형상을 업데이트

    2) SVNRevision.HEAD를 사용하여 최신 버전의 코드를 업데이트

    3) SVNDepth.INFINITY를 사용하여 하위 디렉토리의 모든 내용을 업데이트

     

    샘플코드

    import org.tmatesoft.svn.core.*;
    import org.tmatesoft.svn.core.wc.*;
    
    public class SVNUtil {
        /**
         * SVNRepository에서 로컬에 업데이트를 수행한다
         * @param clientManager SVNClient 정보를 관리하는 SVNClientManager
         * @return long 최신 리비전 ID
         */
        public static long doUpdate(SVNClientManager clientManager) {
            long revId;
    
            try {
                revId = clientManager.getUpdateClient().doUpdate(new File("업데이트를 수행할 로컬경로"), SVNRevision.HEAD, SVNDepth.INFINITY, true, false);
            } catch(SVNException svne) {
                svne.printstackTrace();
            }
            return revId;
        }
    }

     

     

    ISVNEditor

    1) SVN 커밋을 수행하는 ISVNEditor의 인스턴스를 생성

    2) SVNWCUtil.createDefaultAuthenticationManager() 메소드를 사용해 SVN 계정 인증정보를 생성

     

    샘플코드

    import org.tmatesoft.svn.core.*;
    import org.tmatesoft.svn.core.wc.*;
    
    public class SVNUtil {
        /**
         * SVN Commit을 수행하는 ISVNEditor 인터페이스와 인스턴스를 생성한다
         * @param svnUrl SVN과 연결정보가 저장되어 있는 SVNURL 객체
         * @param commitMsg 커밋메시지
         * @return ISVNEditor
         */
        public static ISVNEditor commitEditor(SVNURL svnUrl, String commitMsg) {
            ISVNEditor editor = null;
    
            try {
                SVNRepository svnRepo = SVNRepositoryFactory.create(svnUrl);
                ISVNAutheticationManager authManager = SVNWCUtil.createDefaultAuthenticationManager("사용자ID", "비밀번호 byte[] 캐스팅");
                svnRepo.setAuthenticationManager(authManager);
                editor = svnRepo.getCommitEditor(commitMsg, null);
                editor.openRoot(-1);
                return editor;
            } catch(SVNException svne) {
                svne.printstackTrace();
            }
        }
    }

     

     

    파일/폴더 커밋(추가/수정)

    1) openDir(폴더명)

      i) ISVNEditor가 바라보고 있는 위치(ROOT)에서 하나의 레벨씩 폴더를 이동할 수 있는 메소드

      ii) SVN 하위의 경로는 '/'를 String.split() 메소드로 잘라 한 레벨씩 openDir() 메소드를 호출해 원하는 폴더로 진입해야함

      iii) 전체경로를 넣을 경우 원하는 위치에 정상적으로 폴더 및 파일을 커밋할 수 없음

      iv) openDir() 메소드를 호출한만큼 closeDir() 메소드를 호출해 다시 ISVNEditor가 ROOT를 바라보도록 만들어주어야 함

     

    2) addDir(폴더명)

     i) 폴더를 생성 및 커밋하고 싶은 경로까지 openDir() 메소드를 반복호출

     ii) 폴더가 정상적으로 생성되면 closeDir() 메소드를 반복호출해 다시 ISVNEditor가 ROOT를 바라보도록 만들어주어야 함

     

    3) addFile(로컬에서 SVN으로 커밋할 파일의 전체경로)

      i) 폴더와 같이 생성되서 커밋되는 경우엔 반드시 addDir() 메소드를 호출해 폴더를 먼저 생성해주어야 함

      ii) addFile() 메소드를 호출하면 빈껍데기의 파일이 생성됨

      iii) 파일이 생성되면 SVNDeltaGenerator.sendData() 메소드를 호출해 생성된 파일의 내용을 작성

       iv) 수정커밋은 비슷한 방식이지만 addFile() 대신 openFile() 메소드를 호출해 기존에 생성된 파일의 내용을 수정하는 방식

     

     

    샘플코드

    public class SVNUtil {
        /**
         * 신규생성폴더를 커밋한다
         * @param addDirPath 커밋을 수행할 폴더의 경로
         */
        public static void addDir(String addDirPath) {
            String openDir = "/";
            for (String path: addDirPath.split("/") {
                try {
                    editor.openDir(openDir, -1);
                    editor.addDir(path, null, -1);
                    openDir += path + "/";
                    editor.closeDir();
                } catch(SVNException svne) {
                    svne.printstackTrace();
                }
            }
    
            for (int i=openDir.split("/").length-1; i>0; i--) 
                editor.closeDir();
        }
    
        /**
         * 신규생성파일을 커밋한다.
         * @param addFilePath 커밋을 수행할 로컬 파일의 경로
         * @param distFilePath 커밋이 수행될 SVN Remote 파일의 경로
         * @param distDirPath 커밋이 수행될 SVN Remote 폴더의 경로
         */
        public static void addFile(String addFilePath, String distFilePath, String distDirPath) {
            String openDir = "";
            try {
            for (String path: distDirPath.split("/") {
                openDir += path + "/";
                editor.openDir(openDir);
            }
    
            editor.addFile(distFilePath, null, -1);
            editor.applyTextDelta(disFilePath, null);
            final SVNDeltaGenerator deltaGenerator = new SVNDeltaGenerator();
            String checksum = deltaGenerator.sendDelta(distFilePath, new ByteArrayInputStream(FileUtils.readFileToByteArray(new File(addFilePath))), editor, true);
    
            editor. closeFile(distFilePath, checksum);
            for (int i=distDirPath.split("/").length-1; i>0; i--)
                editor.closeDir();
            } catch(SVNException svne) {
                svne.printstackTrace();
            }
        }
    }
    728x90
    반응형

    댓글