From f76fee63ed9cb3a30d3c0c092d860b1cb93a481b Mon Sep 17 00:00:00 2001 From: Gerard Smyth Date: Tue, 1 Apr 2014 12:29:01 +0100 Subject: Updated the SyndicationServlet to provide an additional option to return details of the tags in the repository instead of the commits. This uses a new 'ot' request parameter to indicate the object type of the content to return, which can be ither TAG or COMMIT. If this is not provided, then COMMIT is assumed to maintain backwards compatability. If tags are returned, then the paging parameters, 'l' and 'pg' are still supported, but searching options are currently ignored. --- .../com/gitblit/servlet/SyndicationServlet.java | 135 ++++++++++++++------- 1 file changed, 91 insertions(+), 44 deletions(-) (limited to 'src/main/java/com/gitblit/servlet/SyndicationServlet.java') diff --git a/src/main/java/com/gitblit/servlet/SyndicationServlet.java b/src/main/java/com/gitblit/servlet/SyndicationServlet.java index 24def995..9650ee3a 100644 --- a/src/main/java/com/gitblit/servlet/SyndicationServlet.java +++ b/src/main/java/com/gitblit/servlet/SyndicationServlet.java @@ -163,6 +163,15 @@ public class SyndicationServlet extends DaggerServlet { searchType = type; } } + + Constants.FeedContentObjectType objectType = Constants.FeedContentObjectType.COMMIT; + if (!StringUtils.isEmpty(request.getParameter("ot"))) { + Constants.FeedContentObjectType type = Constants.FeedContentObjectType.forName(request.getParameter("ot")); + if (type != null) { + objectType = type; + } + } + int length = settings.getInteger(Keys.web.syndicationEntries, 25); if (StringUtils.isEmpty(objectId)) { objectId = org.eclipse.jgit.lib.Constants.HEAD; @@ -214,14 +223,7 @@ public class SyndicationServlet extends DaggerServlet { boolean mountParameters = settings.getBoolean(Keys.web.mountParameters, true); - String urlPattern; - if (mountParameters) { - // mounted parameters - urlPattern = "{0}/commit/{1}/{2}"; - } else { - // parameterized parameters - urlPattern = "{0}/commit/?r={1}&h={2}"; - } + String gitblitUrl = settings.getString(Keys.web.canonicalUrl, null); if (StringUtils.isEmpty(gitblitUrl)) { gitblitUrl = HttpUtils.getGitblitURL(request); @@ -247,47 +249,92 @@ public class SyndicationServlet extends DaggerServlet { feedDescription = model.description; } - List commits; - if (StringUtils.isEmpty(searchString)) { - // standard log/history lookup - commits = JGitUtils.getRevLog(repository, objectId, offset, length); + if (objectType == Constants.FeedContentObjectType.TAG) { + + String urlPattern; + if (mountParameters) { + // mounted parameters + urlPattern = "{0}/tag/{1}/{2}"; + } else { + // parameterized parameters + urlPattern = "{0}/tag/?r={1}&h={2}"; + } + + List tags = JGitUtils.getTags(repository, false, length, offset); + + for (RefModel tag : tags) { + FeedEntryModel entry = new FeedEntryModel(); + entry.title = tag.getName(); + entry.author = tag.getAuthorIdent().getName(); + entry.link = MessageFormat.format(urlPattern, gitblitUrl, + StringUtils.encodeURL(model.name.replace('/', fsc)), tag.getObjectId().getName()); + entry.published = tag.getDate(); + entry.contentType = "text/html"; + entry.content = tag.getFullMessage(); + entry.repository = model.name; + entry.branch = objectId; + + entry.tags = new ArrayList(); + + // add tag id and referenced commit id + entry.tags.add("tag:" + tag.getObjectId().getName()); + entry.tags.add("commit:" + tag.getReferencedObjectId().getName()); + + entries.add(entry); + } } else { - // repository search - commits = JGitUtils.searchRevlogs(repository, objectId, searchString, searchType, - offset, length); - } - Map> allRefs = JGitUtils.getAllRefs(repository, model.showRemoteBranches); - BugtraqProcessor processor = new BugtraqProcessor(settings); - - // convert RevCommit to SyndicatedEntryModel - for (RevCommit commit : commits) { - FeedEntryModel entry = new FeedEntryModel(); - entry.title = commit.getShortMessage(); - entry.author = commit.getAuthorIdent().getName(); - entry.link = MessageFormat.format(urlPattern, gitblitUrl, - StringUtils.encodeURL(model.name.replace('/', fsc)), commit.getName()); - entry.published = commit.getCommitterIdent().getWhen(); - entry.contentType = "text/html"; - String message = processor.processCommitMessage(repository, model, commit.getFullMessage()); - entry.content = message; - entry.repository = model.name; - entry.branch = objectId; - entry.tags = new ArrayList(); - - // add commit id and parent commit ids - entry.tags.add("commit:" + commit.getName()); - for (RevCommit parent : commit.getParents()) { - entry.tags.add("parent:" + parent.getName()); + + String urlPattern; + if (mountParameters) { + // mounted parameters + urlPattern = "{0}/commit/{1}/{2}"; + } else { + // parameterized parameters + urlPattern = "{0}/commit/?r={1}&h={2}"; } - // add refs to tabs list - List refs = allRefs.get(commit.getId()); - if (refs != null && refs.size() > 0) { - for (RefModel ref : refs) { - entry.tags.add("ref:" + ref.getName()); + List commits; + if (StringUtils.isEmpty(searchString)) { + // standard log/history lookup + commits = JGitUtils.getRevLog(repository, objectId, offset, length); + } else { + // repository search + commits = JGitUtils.searchRevlogs(repository, objectId, searchString, searchType, + offset, length); + } + Map> allRefs = JGitUtils.getAllRefs(repository, model.showRemoteBranches); + BugtraqProcessor processor = new BugtraqProcessor(settings); + + // convert RevCommit to SyndicatedEntryModel + for (RevCommit commit : commits) { + FeedEntryModel entry = new FeedEntryModel(); + entry.title = commit.getShortMessage(); + entry.author = commit.getAuthorIdent().getName(); + entry.link = MessageFormat.format(urlPattern, gitblitUrl, + StringUtils.encodeURL(model.name.replace('/', fsc)), commit.getName()); + entry.published = commit.getCommitterIdent().getWhen(); + entry.contentType = "text/html"; + String message = processor.processCommitMessage(repository, model, commit.getFullMessage()); + entry.content = message; + entry.repository = model.name; + entry.branch = objectId; + entry.tags = new ArrayList(); + + // add commit id and parent commit ids + entry.tags.add("commit:" + commit.getName()); + for (RevCommit parent : commit.getParents()) { + entry.tags.add("parent:" + parent.getName()); + } + + // add refs to tabs list + List refs = allRefs.get(commit.getId()); + if (refs != null && refs.size() > 0) { + for (RefModel ref : refs) { + entry.tags.add("ref:" + ref.getName()); + } } + entries.add(entry); } - entries.add(entry); } } -- cgit v1.2.3 From 9ff0c16b05cb0eb7c3cc63eda763b0f75d84853c Mon Sep 17 00:00:00 2001 From: James Moger Date: Thu, 8 May 2014 13:09:08 -0400 Subject: Change enum name and unit test RSS tag queries --- releases.moxie | 2 + src/main/java/com/gitblit/Constants.java | 6 +-- .../com/gitblit/servlet/SyndicationServlet.java | 6 +-- .../java/com/gitblit/utils/SyndicationUtils.java | 57 ++++++++++++++++++++++ src/site/rpc.mkd | 1 + .../com/gitblit/tests/SyndicationUtilsTest.java | 36 +++++++++++++- 6 files changed, 101 insertions(+), 7 deletions(-) (limited to 'src/main/java/com/gitblit/servlet/SyndicationServlet.java') diff --git a/releases.moxie b/releases.moxie index 228fc7e6..96a0ae91 100644 --- a/releases.moxie +++ b/releases.moxie @@ -13,9 +13,11 @@ r24: { changes: ~ additions: - Add FORK_REPOSITORY RPC request type (issue-371, pr-161, ticket-65) + - Add object type (ot) parameter for RSS queries to retrieve tag details (pr-165, ticket-66) dependencyChanges: ~ contributors: - Manisha Gayathri + - Gerard Smyth } # diff --git a/src/main/java/com/gitblit/Constants.java b/src/main/java/com/gitblit/Constants.java index 2007c0a8..95eb944a 100644 --- a/src/main/java/com/gitblit/Constants.java +++ b/src/main/java/com/gitblit/Constants.java @@ -405,11 +405,11 @@ public class Constants { /** * Enumeration of the feed content object types. */ - public static enum FeedContentObjectType { + public static enum FeedObjectType { COMMIT, TAG; - public static FeedContentObjectType forName(String name) { - for (FeedContentObjectType type : values()) { + public static FeedObjectType forName(String name) { + for (FeedObjectType type : values()) { if (type.name().equalsIgnoreCase(name)) { return type; } diff --git a/src/main/java/com/gitblit/servlet/SyndicationServlet.java b/src/main/java/com/gitblit/servlet/SyndicationServlet.java index 9650ee3a..631df781 100644 --- a/src/main/java/com/gitblit/servlet/SyndicationServlet.java +++ b/src/main/java/com/gitblit/servlet/SyndicationServlet.java @@ -164,9 +164,9 @@ public class SyndicationServlet extends DaggerServlet { } } - Constants.FeedContentObjectType objectType = Constants.FeedContentObjectType.COMMIT; + Constants.FeedObjectType objectType = Constants.FeedObjectType.COMMIT; if (!StringUtils.isEmpty(request.getParameter("ot"))) { - Constants.FeedContentObjectType type = Constants.FeedContentObjectType.forName(request.getParameter("ot")); + Constants.FeedObjectType type = Constants.FeedObjectType.forName(request.getParameter("ot")); if (type != null) { objectType = type; } @@ -249,7 +249,7 @@ public class SyndicationServlet extends DaggerServlet { feedDescription = model.description; } - if (objectType == Constants.FeedContentObjectType.TAG) { + if (objectType == Constants.FeedObjectType.TAG) { String urlPattern; if (mountParameters) { diff --git a/src/main/java/com/gitblit/utils/SyndicationUtils.java b/src/main/java/com/gitblit/utils/SyndicationUtils.java index 2ee1cf69..93e9321a 100644 --- a/src/main/java/com/gitblit/utils/SyndicationUtils.java +++ b/src/main/java/com/gitblit/utils/SyndicationUtils.java @@ -25,6 +25,7 @@ import java.util.ArrayList; import java.util.List; import com.gitblit.Constants; +import com.gitblit.Constants.FeedObjectType; import com.gitblit.GitBlitException; import com.gitblit.models.FeedEntryModel; import com.sun.syndication.feed.synd.SyndCategory; @@ -137,6 +138,59 @@ public class SyndicationUtils { */ public static List readFeed(String url, String repository, String branch, int numberOfEntries, int page, String username, char[] password) throws IOException { + return readFeed(url, repository, branch, FeedObjectType.COMMIT, numberOfEntries, + page, username, password); + } + + /** + * Reads tags from the specified repository. + * + * @param url + * the url of the Gitblit server + * @param repository + * the repository name + * @param branch + * the branch name (optional) + * @param numberOfEntries + * the number of entries to retrieve. if <= 0 the server default + * is used. + * @param page + * 0-indexed. used to paginate the results. + * @param username + * @param password + * @return a list of SyndicationModel entries + * @throws {@link IOException} + */ + public static List readTags(String url, String repository, + int numberOfEntries, int page, String username, char[] password) throws IOException { + return readFeed(url, repository, null, FeedObjectType.TAG, numberOfEntries, + page, username, password); + } + + /** + * Reads a Gitblit RSS feed. + * + * @param url + * the url of the Gitblit server + * @param repository + * the repository name + * @param branch + * the branch name (optional) + * @param objectType + * the object type to return (optional, COMMIT assummed) + * @param numberOfEntries + * the number of entries to retrieve. if <= 0 the server default + * is used. + * @param page + * 0-indexed. used to paginate the results. + * @param username + * @param password + * @return a list of SyndicationModel entries + * @throws {@link IOException} + */ + private static List readFeed(String url, String repository, String branch, + FeedObjectType objectType, int numberOfEntries, int page, String username, + char[] password) throws IOException { // build feed url List parameters = new ArrayList(); if (numberOfEntries > 0) { @@ -148,6 +202,9 @@ public class SyndicationUtils { if (!StringUtils.isEmpty(branch)) { parameters.add("h=" + branch); } + if (objectType != null) { + parameters.add("ot=" + objectType.name()); + } return readFeed(url, parameters, repository, branch, username, password); } diff --git a/src/site/rpc.mkd b/src/site/rpc.mkd index 2e502e2c..302084fb 100644 --- a/src/site/rpc.mkd +++ b/src/site/rpc.mkd @@ -32,6 +32,7 @@ The Gitblit API includes methods for retrieving and interpreting RSS feeds. The url parameterdefaultdescription standard query repositoryrequiredrepository name is part of the url (see examples below) +ot=optional
default: COMMITobject type to return in results. COMMIT or TAG h=optional
default: HEADstarting branch, ref, or commit id l=optional
default: web.syndicationEntriesmaximum return count pg=optional
default: 0page number for paging
(offset into history = pagenumber*maximum return count) diff --git a/src/test/java/com/gitblit/tests/SyndicationUtilsTest.java b/src/test/java/com/gitblit/tests/SyndicationUtilsTest.java index d206bbdb..b4bb044f 100644 --- a/src/test/java/com/gitblit/tests/SyndicationUtilsTest.java +++ b/src/test/java/com/gitblit/tests/SyndicationUtilsTest.java @@ -21,7 +21,10 @@ import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.Set; +import java.util.concurrent.atomic.AtomicBoolean; +import org.junit.AfterClass; +import org.junit.BeforeClass; import org.junit.Test; import com.gitblit.Constants.SearchType; @@ -30,6 +33,20 @@ import com.gitblit.utils.SyndicationUtils; public class SyndicationUtilsTest extends GitblitUnitTest { + private static final AtomicBoolean started = new AtomicBoolean(false); + + @BeforeClass + public static void startGitblit() throws Exception { + started.set(GitBlitSuite.startGitblit()); + } + + @AfterClass + public static void stopGitblit() throws Exception { + if (started.get()) { + GitBlitSuite.stopGitblit(); + } + } + @Test public void testSyndication() throws Exception { List entries = new ArrayList(); @@ -60,7 +77,7 @@ public class SyndicationUtilsTest extends GitblitUnitTest { } @Test - public void testFeedRead() throws Exception { + public void testFeedReadCommits() throws Exception { Set links = new HashSet(); for (int i = 0; i < 2; i++) { List feed = SyndicationUtils.readFeed(GitBlitSuite.url, "ticgit.git", @@ -76,6 +93,23 @@ public class SyndicationUtilsTest extends GitblitUnitTest { assertEquals("Feed pagination failed", 10, links.size()); } + @Test + public void testFeedReadTags() throws Exception { + Set links = new HashSet(); + for (int i = 0; i < 2; i++) { + List feed = SyndicationUtils.readTags(GitBlitSuite.url, "test/gitective.git", + 5, i, GitBlitSuite.account, GitBlitSuite.password.toCharArray()); + assertTrue(feed != null); + assertTrue(feed.size() > 0); + assertEquals(5, feed.size()); + for (FeedEntryModel entry : feed) { + links.add(entry.link); + } + } + // confirm we have 10 unique tags + assertEquals("Feed pagination failed", 10, links.size()); + } + @Test public void testSearchFeedRead() throws Exception { List feed = SyndicationUtils -- cgit v1.2.3