package hudson.scm; import java.io.File; import java.util.*; import java.util.regex.Pattern; import hudson.scm.subversion.UpdateUpdater; import org.jvnet.hudson.test.Bug; import org.jvnet.hudson.test.HudsonHomeLoader.CopyExisting; import org.tmatesoft.svn.core.*; import org.tmatesoft.svn.core.io.SVNRepository; import org.tmatesoft.svn.core.wc.SVNClientManager; /** * Tests the behavior of {@link DefaultSVNLogFilter} * */ public class DefaultSVNLogFilterTest extends AbstractSubversionTest { String [] empty = {}; Pattern [] noPatterns = {}; @SuppressWarnings("unchecked") Set<String> noUsers = Collections.EMPTY_SET; SVNRepository svnRepo; public void setUp() throws Exception { super.setUp(); File repo = new CopyExisting(DefaultSVNLogFilter.class.getResource("JENKINS-10449.zip")).allocate(); SVNURL svnUrl = SVNURL.fromFile(repo); SVNClientManager svnMgr = SVNClientManager.newInstance(); svnRepo = svnMgr.createRepository(svnUrl, false); } public void tearDown() throws Exception { svnRepo = null; super.tearDown(); } private List<SVNLogEntry> doFilter(final SVNLogFilter logFilter) throws SVNException { final List<SVNLogEntry> log = new ArrayList<SVNLogEntry>(); ISVNLogEntryHandler logGatherer = new ISVNLogEntryHandler() { public void handleLogEntry(SVNLogEntry logEntry) throws SVNException { if (logFilter.isIncluded(logEntry)) { log.add(logEntry); } } }; svnRepo.log(empty, 1, 5, true, false, logGatherer); return log; } private static Pattern [] compile(String ... regexes) { List<Pattern> patterns = new ArrayList<Pattern>(); for (String re : regexes) { patterns.add(Pattern.compile(re)); } return patterns.toArray(new Pattern [] {}); } private static boolean containsRevs(List<SVNLogEntry> logs, long ... revs) { if (revs.length != logs.size()) return false; nextrev: for (long r : revs) { for (SVNLogEntry l : logs) { if (r == l.getRevision()); continue nextrev; } return false; } return true; } public void testNoExcludes() throws Exception { DefaultSVNLogFilter filter = new DefaultSVNLogFilter(noPatterns, noPatterns, noUsers, null, noPatterns, false); assertTrue(!filter.hasExclusionRule()); List<SVNLogEntry> entries = doFilter(filter); assertTrue(containsRevs(entries, 1, 2, 3, 4, 5)); } public void testExcludes() throws Exception { Pattern [] excludes = compile("/z.*"); DefaultSVNLogFilter filter = new DefaultSVNLogFilter(excludes, noPatterns, noUsers, null, noPatterns, false); assertTrue(filter.hasExclusionRule()); List<SVNLogEntry> entries = doFilter(filter); assertTrue(containsRevs(entries, 1, 4)); } public void testIncludes() throws Exception { Pattern [] includes = compile("/z.*"); DefaultSVNLogFilter filter = new DefaultSVNLogFilter(noPatterns, includes, noUsers, null, noPatterns, false); assertTrue(filter.hasExclusionRule()); List<SVNLogEntry> entries = doFilter(filter); assertTrue(containsRevs(entries, 2, 3, 5)); } public void testBothIncludesAndExcludes() throws Exception { Pattern [] includes = compile("/z.*"); Pattern [] excludes = compile("/z/a.*"); DefaultSVNLogFilter filter = new DefaultSVNLogFilter(excludes, includes, noUsers, null, noPatterns, false); assertTrue(filter.hasExclusionRule()); List<SVNLogEntry> entries = doFilter(filter); assertTrue(containsRevs(entries, 2, 5)); } public void testExcludedUsers() throws Exception { Set<String> users = new HashSet<String>(); users.add("brent"); DefaultSVNLogFilter filter = new DefaultSVNLogFilter(noPatterns, noPatterns, users, null, noPatterns, false); assertTrue(filter.hasExclusionRule()); List<SVNLogEntry> entries = doFilter(filter); assertTrue(containsRevs(entries, 1, 2, 3, 4)); } public void testExcludedRevProp() throws Exception { DefaultSVNLogFilter filter = new DefaultSVNLogFilter(noPatterns, noPatterns, noUsers, "ignoreme", noPatterns, false); assertTrue(filter.hasExclusionRule()); List<SVNLogEntry> entries = doFilter(filter); assertTrue(containsRevs(entries, 1, 2, 3, 4)); } public void testExcludedCommitMessages() throws Exception { Pattern [] excludes = compile(".*pinned.*"); DefaultSVNLogFilter filter = new DefaultSVNLogFilter(noPatterns, noPatterns, noUsers, null, excludes, false); assertTrue(filter.hasExclusionRule()); List<SVNLogEntry> entries = doFilter(filter); assertTrue(containsRevs(entries, 1, 2, 3, 5)); } public void testExcludedDirPropChanges() throws Exception { DefaultSVNLogFilter filter = new DefaultSVNLogFilter(noPatterns, noPatterns, noUsers, null, noPatterns, true); assertTrue(filter.hasExclusionRule()); List<SVNLogEntry> entries = doFilter(filter); assertTrue(containsRevs(entries, 1, 2, 3)); } @Bug(18099) public void testGlobalExclusionRevprop() throws Exception { SubversionSCM scm = new SubversionSCM( Arrays.asList(new SubversionSCM.ModuleLocation("file://some/repo", ".")), new UpdateUpdater(), null, null, null, null, null, null, false); scm.getDescriptor().setGlobalExcludedRevprop("ignoreme"); SVNProperties p = new SVNProperties(); p.put("ignoreme", "*"); Map<String, SVNLogEntryPath> paths = new HashMap<String, SVNLogEntryPath>(); paths.put("/foo", new SVNLogEntryPath("/foo", SVNLogEntryPath.TYPE_MODIFIED, null, -1)); SVNLogEntry e = new SVNLogEntry(paths, 1234L, p, false); SVNLogFilter filter = scm.createSVNLogFilter(); assertFalse(filter.isIncluded(e)); } }