Skip to content

Commit 736410b

Browse files
committed
createTag() and getTags() API methods implemented
1 parent b3ea070 commit 736410b

File tree

2 files changed

+74
-1
lines changed

2 files changed

+74
-1
lines changed

src/main/java/org/scm4j/vcs/svn/SVNVCS.java

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import java.util.Collection;
1010
import java.util.Collections;
1111
import java.util.HashSet;
12+
import java.util.Iterator;
1213
import java.util.List;
1314
import java.util.Set;
1415

@@ -18,10 +19,12 @@
1819
import org.scm4j.vcs.api.VCSCommit;
1920
import org.scm4j.vcs.api.VCSDiffEntry;
2021
import org.scm4j.vcs.api.VCSMergeResult;
22+
import org.scm4j.vcs.api.VCSTag;
2123
import org.scm4j.vcs.api.WalkDirection;
2224
import org.scm4j.vcs.api.exceptions.EVCSBranchExists;
2325
import org.scm4j.vcs.api.exceptions.EVCSException;
2426
import org.scm4j.vcs.api.exceptions.EVCSFileNotFound;
27+
import org.scm4j.vcs.api.exceptions.EVCSTagExists;
2528
import org.scm4j.vcs.api.workingcopy.IVCSLockedWorkingCopy;
2629
import org.scm4j.vcs.api.workingcopy.IVCSRepositoryWorkspace;
2730
import org.scm4j.vcs.api.workingcopy.IVCSWorkspace;
@@ -31,6 +34,7 @@
3134
import org.tmatesoft.svn.core.SVNDirEntry;
3235
import org.tmatesoft.svn.core.SVNException;
3336
import org.tmatesoft.svn.core.SVNLogEntry;
37+
import org.tmatesoft.svn.core.SVNLogEntryPath;
3438
import org.tmatesoft.svn.core.SVNNodeKind;
3539
import org.tmatesoft.svn.core.SVNProperties;
3640
import org.tmatesoft.svn.core.SVNURL;
@@ -49,6 +53,7 @@
4953
import org.tmatesoft.svn.core.wc.SVNCopyClient;
5054
import org.tmatesoft.svn.core.wc.SVNCopySource;
5155
import org.tmatesoft.svn.core.wc.SVNDiffClient;
56+
import org.tmatesoft.svn.core.wc.SVNInfo;
5257
import org.tmatesoft.svn.core.wc.SVNRevision;
5358
import org.tmatesoft.svn.core.wc.SVNRevisionRange;
5459
import org.tmatesoft.svn.core.wc.SVNStatusType;
@@ -77,6 +82,7 @@ public class SVNVCS implements IVCS {
7782

7883
public static final String MASTER_PATH= "trunk/";
7984
public static final String BRANCHES_PATH = "branches/";
85+
public static final String TAGS_PATH = "tags/";
8086
private static final String SVN_VCS_TYPE_STRING = "svn";
8187

8288
public SVNClientManager getClientManager() {
@@ -609,4 +615,70 @@ public Boolean fileExists(String branchName, String filePath) {
609615
throw new RuntimeException(e);
610616
}
611617
}
618+
619+
@Override
620+
public VCSTag createTag(String branchName, String tagName, String tagMessage) throws EVCSTagExists {
621+
try {
622+
SVNURL srcURL = getBranchUrl(branchName);
623+
SVNURL dstURL = SVNURL.parseURIEncoded(repoUrl + TAGS_PATH + tagName);
624+
SVNCopySource copySource =
625+
new SVNCopySource(SVNRevision.HEAD, SVNRevision.HEAD, srcURL);
626+
627+
clientManager.getCopyClient().doCopy(new SVNCopySource[] {copySource}, dstURL,
628+
false, false, true, tagMessage, null);
629+
630+
SVNDirEntry entry = repository.info(TAGS_PATH + tagName, -1);
631+
632+
VCSTag tag = new VCSTag(tagName, tagMessage, entry.getAuthor(), getHeadCommit(branchName));
633+
return tag;
634+
} catch (SVNException e) {
635+
if (e.getErrorMessage().getErrorCode().getCode() == SVN_ITEM_EXISTS_ERROR_CODE) {
636+
throw new EVCSTagExists(e);
637+
}
638+
throw new EVCSException(e);
639+
} catch (Exception e) {
640+
throw new RuntimeException(e);
641+
}
642+
}
643+
644+
@Override
645+
public List<VCSTag> getTags() {
646+
Set<String> entries = new HashSet<>();
647+
try {
648+
listEntries(entries, TAGS_PATH);
649+
List<VCSTag> res = new ArrayList<>();
650+
for (String entryStr : entries) {
651+
SVNDirEntry entry = repository.info(entryStr, -1);
652+
SVNInfo info = clientManager.getWCClient().doInfo(SVNURL.parseURIEncoded(repoUrl + entryStr), SVNRevision.HEAD, SVNRevision.HEAD);
653+
654+
info.getCommittedRevision(); // tag revision number
655+
656+
class SVNTagBaseCommit implements ISVNLogEntryHandler {
657+
658+
public Long copyFromRevision;
659+
660+
@Override
661+
public void handleLogEntry(SVNLogEntry logEntry) throws SVNException {
662+
for (Iterator<?> changedPaths = logEntry.getChangedPaths().keySet().iterator(); changedPaths.hasNext();) {
663+
SVNLogEntryPath entryPath = (SVNLogEntryPath) logEntry.getChangedPaths().get(changedPaths.next());
664+
copyFromRevision = entryPath.getCopyRevision();
665+
}
666+
}
667+
}
668+
669+
SVNTagBaseCommit handler = new SVNTagBaseCommit();
670+
671+
repository.log(new String[] { entryStr }, -1 /* start from head descending */,
672+
0, true, true, -1, handler);
673+
674+
SVNDirEntry copyFromEntry = repository.info("", handler.copyFromRevision);
675+
676+
res.add(new VCSTag(entry.getName(), entry.getCommitMessage(), entry.getAuthor(), new VCSCommit(Long.toString(copyFromEntry.getRevision()),
677+
copyFromEntry.getCommitMessage(), copyFromEntry.getAuthor())));
678+
}
679+
return res;
680+
} catch (SVNException e) {
681+
throw new EVCSException(e);
682+
}
683+
}
612684
}

src/main/java/org/scm4j/vcs/svn/SVNVCSUtils.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ public static void createFolderStructure(SVNVCS svn, String commitMessage) {
2626
.getCommitClient()
2727
.doMkDir(new SVNURL[] {
2828
SVNURL.parseURIEncoded(StringUtils.appendIfMissing(svn.getRepoUrl(), "/") + SVNVCS.MASTER_PATH),
29-
SVNURL.parseURIEncoded(StringUtils.appendIfMissing(svn.getRepoUrl(), "/") + SVNVCS.BRANCHES_PATH)},
29+
SVNURL.parseURIEncoded(StringUtils.appendIfMissing(svn.getRepoUrl(), "/") + SVNVCS.BRANCHES_PATH),
30+
SVNURL.parseURIEncoded(StringUtils.appendIfMissing(svn.getRepoUrl(), "/") + SVNVCS.TAGS_PATH)},
3031
commitMessage);
3132
} catch (SVNException e) {
3233
throw new EVCSException(e);

0 commit comments

Comments
 (0)