src/com/gitblit/RpcServlet.java | ●●●●● patch | view | raw | blame | history | |
src/com/gitblit/SyndicationServlet.java | ●●●●● patch | view | raw | blame | history | |
src/com/gitblit/utils/SyndicationUtils.java | ●●●●● patch | view | raw | blame | history | |
tests/com/gitblit/tests/SyndicationUtilsTest.java | ●●●●● patch | view | raw | blame | history |
src/com/gitblit/RpcServlet.java
@@ -232,6 +232,7 @@ List<String> keys = new ArrayList<String>(); keys.add(Keys.web.siteName); keys.add(Keys.web.mountParameters); keys.add(Keys.web.syndicationEntries); if (allowManagement) { // keys necessary for repository and/or user management src/com/gitblit/SyndicationServlet.java
@@ -18,18 +18,22 @@ import java.text.MessageFormat; import java.util.ArrayList; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServlet; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevCommit; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.gitblit.models.RefModel; import com.gitblit.models.RepositoryModel; import com.gitblit.models.SyndicatedEntryModel; import com.gitblit.utils.HttpUtils; import com.gitblit.utils.JGitUtils; import com.gitblit.utils.JGitUtils.SearchType; import com.gitblit.utils.StringUtils; import com.gitblit.utils.SyndicationUtils; @@ -126,6 +130,14 @@ String repositoryName = url; String objectId = request.getParameter("h"); String l = request.getParameter("l"); String searchString = request.getParameter("s"); SearchType searchType = SearchType.COMMIT; if (!StringUtils.isEmpty(request.getParameter("st"))) { SearchType type = SearchType.forName(request.getParameter("st")); if (type != null) { searchType = type; } } int length = GitBlit.getInteger(Keys.web.syndicationEntries, 25); if (StringUtils.isEmpty(objectId)) { objectId = org.eclipse.jgit.lib.Constants.HEAD; @@ -140,7 +152,16 @@ response.setContentType("application/rss+xml; charset=UTF-8"); Repository repository = GitBlit.self().getRepository(repositoryName); RepositoryModel model = GitBlit.self().getRepositoryModel(repositoryName); List<RevCommit> commits = JGitUtils.getRevLog(repository, objectId, 0, length); List<RevCommit> commits; if (StringUtils.isEmpty(searchString)) { // standard log/history lookup commits = JGitUtils.getRevLog(repository, objectId, 0, length); } else { // repository search commits = JGitUtils.searchRevlogs(repository, objectId, searchString, searchType, 0, length); } Map<ObjectId, List<RefModel>> allRefs = JGitUtils.getAllRefs(repository); List<SyndicatedEntryModel> entries = new ArrayList<SyndicatedEntryModel>(); boolean mountParameters = GitBlit.getBoolean(Keys.web.mountParameters, true); @@ -165,6 +186,14 @@ entry.content = commit.getFullMessage(); entry.repository = model.name; entry.branch = objectId; List<RefModel> refs = allRefs.get(commit.getId()); if (refs != null && refs.size() > 0) { List<String> tags = new ArrayList<String>(); for (RefModel ref : refs) { tags.add(ref.getName()); } entry.tags = tags; } entries.add(entry); } String feedLink; src/com/gitblit/utils/SyndicationUtils.java
@@ -22,11 +22,15 @@ import java.net.URLConnection; import java.text.MessageFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import com.gitblit.Constants; import com.gitblit.GitBlitException; import com.gitblit.models.SyndicatedEntryModel; import com.gitblit.utils.JGitUtils.SearchType; import com.sun.syndication.feed.synd.SyndCategory; import com.sun.syndication.feed.synd.SyndCategoryImpl; import com.sun.syndication.feed.synd.SyndContent; import com.sun.syndication.feed.synd.SyndContentImpl; import com.sun.syndication.feed.synd.SyndEntry; @@ -84,10 +88,21 @@ entry.setLink(entryModel.link); entry.setPublishedDate(entryModel.published); if (entryModel.tags != null && entryModel.tags.size() > 0) { List<SyndCategory> tags = new ArrayList<SyndCategory>(); for (String tag : entryModel.tags) { SyndCategoryImpl cat = new SyndCategoryImpl(); cat.setName(tag); tags.add(cat); } entry.setCategories(tags); } SyndContent content = new SyndContentImpl(); content.setType(entryModel.contentType); content.setValue(entryModel.content); entry.setDescription(content); entries.add(entry); } feed.setEntries(entries); @@ -125,6 +140,63 @@ if (!StringUtils.isEmpty(branch)) { parameters.add("h=" + branch); } return readFeed(url, parameters, repository, branch, username, password); } /** * Reads a Gitblit RSS search feed. * * @param url * the url of the Gitblit server * @param repository * the repository name * @param fragment * the search fragment * @param searchType * the search type (optional, defaults to COMMIT) * @param numberOfEntries * the number of entries to retrieve. if <= 0 the server default * is used. * @param username * @param password * @return a list of SyndicationModel entries * @throws {@link IOException} */ public static List<SyndicatedEntryModel> readSearchFeed(String url, String repository, String branch, String fragment, SearchType searchType, int numberOfEntries, String username, char[] password) throws IOException { // determine parameters List<String> parameters = new ArrayList<String>(); parameters.add("s=" + StringUtils.encodeURL(fragment)); if (numberOfEntries > 0) { parameters.add("l=" + numberOfEntries); } if (!StringUtils.isEmpty(branch)) { parameters.add("h=" + branch); } if (searchType != null) { parameters.add("st=" + searchType.name()); } return readFeed(url, parameters, repository, branch, username, password); } /** * Reads a Gitblit RSS feed. * * @param url * the url of the Gitblit server * @param parameters * the list of RSS parameters * @param repository * the repository name * @param username * @param password * @return a list of SyndicationModel entries * @throws {@link IOException} */ private static List<SyndicatedEntryModel> readFeed(String url, List<String> parameters, String repository, String branch, String username, char[] password) throws IOException { // build url StringBuilder sb = new StringBuilder(); sb.append(MessageFormat.format("{0}" + Constants.SYNDICATION_PATH + "{1}", url, repository)); if (parameters.size() > 0) { @@ -140,7 +212,6 @@ } } String feedUrl = sb.toString(); URLConnection conn = ConnectionUtils.openReadConnection(feedUrl, username, password); InputStream is = conn.getInputStream(); SyndFeedInput input = new SyndFeedInput(); @@ -163,6 +234,14 @@ model.link = entry.getLink(); model.content = entry.getDescription().getValue(); model.contentType = entry.getDescription().getType(); if (entry.getCategories() != null && entry.getCategories().size() > 0) { List<String> tags = new ArrayList<String>(); for (Object p : entry.getCategories()) { SyndCategory cat = (SyndCategory) p; tags.add(cat.getName()); } model.tags = tags; } entries.add(model); } return entries; tests/com/gitblit/tests/SyndicationUtilsTest.java
@@ -57,4 +57,12 @@ assertTrue(feed.size() > 0); assertEquals(5, feed.size()); } public void testSearchFeedRead() throws Exception { List<SyndicatedEntryModel> feed = SyndicationUtils.readSearchFeed("https://localhost:8443", "ticgit.git", null, "documentation", null, 5, "admin", "admin".toCharArray()); assertTrue(feed != null); assertTrue(feed.size() > 0); assertEquals(2, feed.size()); } }