0

私は小さなプロジェクトの Java SVNKit (タグ付け用) に使用します。

現時点での作業:

public void copy(String branchName, String dstTag, boolean isMove, String msg) throws SVNException, IOException {
    String finalURL = getSvnUrl() + "tags/" + dstTag;
    URL url = new URL(finalURL);
    String loginPassword = getUsername() + ":" + getPassword();

    String encoded = EncodingUtil.getAsciiString(Base64.encodeBase64(EncodingUtil.getAsciiBytes(loginPassword)));
    URLConnection conn = url.openConnection();
    conn.setRequestProperty("Authorization", "Basic " + encoded);
    HttpURLConnection urlConnect = null;
    try {
        urlConnect = (HttpURLConnection)conn;
        if (urlConnect.getResponseCode() != HttpURLConnection.HTTP_OK) {
            ourClientManager.getCopyClient().doCopy(SVNURL.parseURIDecoded(getSvnUrl() + branchName),
                    SVNRevision.HEAD, SVNURL.parseURIDecoded(finalURL), isMove, msg);
            LOGGER.info("svn-tagging " + dstTag);
        } else
            LOGGER.info(dstTag + " Tag exists.");

    } finally {
        if (urlConnect != null) {
            urlConnect.disconnect();
        }
    }
}

タグが存在するかどうかを確認したいのですが、SVNRepositoryandSVNClientManagerと notを使用/使用したいのですHttpURLConnection.HTTP_OKが、何か考えはありますか?

4

2 に答える 2

0

新しい「操作」APIを使用します:

public static void main(String[] args) throws SVNException {
    final SvnList list = new SvnOperationFactory().createList();
    list.setSingleTarget(SvnTarget.fromURL(SVNURL.parseURIEncoded("http://svn.apache.org/repos/asf/spamassassin/tags")));
    list.setReceiver(new ISvnObjectReceiver<SVNDirEntry>() {
        public void receive(SvnTarget target, SVNDirEntry object) throws SVNException {
            System.out.println(object.getName());
        }
    });
    list.run();
}
于 2012-10-08T12:54:27.823 に答える
0

@mstrap が提案したように、SvnOperationFactoryを使用して実行される操作を作成する操作 API の使用も好みます。プロジェクトにタグを付けるために gradle スクリプトで使用する Groovy コードを次に示します。Java コードに簡単に適用できます。

SvnList が空のリストや null ではなくFS_NOT_FOUNDエラーでSVNException を返したので、タグの上書きを避けるために try/catch コンストラクトを使用しました。このようにして、別の操作を節約できます。

workingCopyUrlは、現在の作業コピーのプロジェクト フォルダーの SVN サーバー上の URL です (例: myhost/svnprojects/projectName) 。必ずサーバー バージョンをソースとして使用してください。そうしないと、サーバーに存在しないリビジョンをコピーしてしまう可能性があります。ただし、事前にすべてをコミットしたことを確認しないと、作業コピーとは異なるバージョンにタグ付けされます!

subDirはプロジェクトのサブディレクトリです(例: projectName/branches/Featurebranch または projectName/trunk)。

import org.tmatesoft.svn.core.wc.*
import org.tmatesoft.svn.core.wc2.*
import org.tmatesoft.svn.core.*
def tagSVN(projectName, workingCopyUrl, subDir, tagName) {
    final SvnOperationFactory svnOperationFactory = new SvnOperationFactory();
    final defaultAuthManager =  SVNWCUtil.createDefaultAuthenticationManager("username", "password")
    svnOperationFactory.setAuthenticationManager(defaultAuthManager)

    try {
        final SvnRemoteCopy tagOperation = svnOperationFactory.createRemoteCopy();      

        // Setup source (Working copy + subDir which may be trunk or a tag or a branch or any other sub-directory) 
        def sourceFolder = workingCopyUrl + '/' + subDir
        def SVNURL sourceURL = SVNURL.parseURIEncoded(sourceFolder)
        def SvnCopySource source = SvnCopySource.create(SvnTarget.fromURL(sourceURL), SVNRevision.HEAD)
        tagOperation.addCopySource(source)

        // Setup destination (SVN Server)
        def tagDestinationPath = workingCopyUrl + "/tags/" + tagName
        def SVNURL destinationURL = SVNURL.parseURIEncoded(tagDestinationPath)                  
        tagOperation.setSingleTarget(SvnTarget.fromURL(destinationURL))

        // Make the operation fail when no 
        tagOperation.setFailWhenDstExists(true)  
        tagOperation.setCommitMessage("Tagging the ${projectName}")
        tagOperation.run()
    } catch (SVNException e) {
        if (e.getErrorMessage() == SVNErrorCode.ENTRY_EXISTS) {
            logger.info("Entry exists")
        }

    } finally {
        svnOperationFactory.dispose()
    }
}
于 2016-03-23T12:28:18.490 に答える