From 27ae9095639bb228a1b7ff86a3ebe4264abf05be Mon Sep 17 00:00:00 2001
From: mschaefers <mschaefers@scoop-gmbh.de>
Date: Thu, 29 Nov 2012 12:33:09 -0500
Subject: [PATCH] feature: when using LdapUserService one can configure Gitblit to fetch all users from ldap that can possibly login. This allows to see newly generated LDAP users instantly in Gitblit. By now an LDAP user had to log in once to appear in GitBlit.
---
src/com/gitblit/SyndicationServlet.java | 171 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 166 insertions(+), 5 deletions(-)
diff --git a/src/com/gitblit/SyndicationServlet.java b/src/com/gitblit/SyndicationServlet.java
index f1c474f..baaf7eb 100644
--- a/src/com/gitblit/SyndicationServlet.java
+++ b/src/com/gitblit/SyndicationServlet.java
@@ -16,16 +16,26 @@
package com.gitblit;
import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
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.AuthenticationFilter.AuthenticatedRequest;
+import com.gitblit.models.FeedEntryModel;
+import com.gitblit.models.ProjectModel;
+import com.gitblit.models.RefModel;
import com.gitblit.models.RepositoryModel;
+import com.gitblit.models.UserModel;
import com.gitblit.utils.HttpUtils;
import com.gitblit.utils.JGitUtils;
import com.gitblit.utils.StringUtils;
@@ -124,6 +134,15 @@
String repositoryName = url;
String objectId = request.getParameter("h");
String l = request.getParameter("l");
+ String page = request.getParameter("pg");
+ String searchString = request.getParameter("s");
+ Constants.SearchType searchType = Constants.SearchType.COMMIT;
+ if (!StringUtils.isEmpty(request.getParameter("st"))) {
+ Constants.SearchType type = Constants.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;
@@ -134,14 +153,156 @@
} catch (NumberFormatException x) {
}
}
+ int offset = 0;
+ if (!StringUtils.isEmpty(page)) {
+ try {
+ offset = length * Integer.parseInt(page);
+ } catch (NumberFormatException x) {
+ }
+ }
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);
+
+ boolean isProjectFeed = false;
+ String feedName = null;
+ String feedTitle = null;
+ String feedDescription = null;
+
+ List<String> repositories = null;
+ if (repositoryName.indexOf('/') == -1 && !repositoryName.toLowerCase().endsWith(".git")) {
+ // try to find a project
+ UserModel user = null;
+ if (request instanceof AuthenticatedRequest) {
+ user = ((AuthenticatedRequest) request).getUser();
+ }
+ ProjectModel project = GitBlit.self().getProjectModel(repositoryName, user);
+ if (project != null) {
+ isProjectFeed = true;
+ repositories = new ArrayList<String>(project.repositories);
+
+ // project feed
+ feedName = project.name;
+ feedTitle = project.title;
+ feedDescription = project.description;
+ }
+ }
+
+ if (repositories == null) {
+ // could not find project, assume this is a repository
+ repositories = Arrays.asList(repositoryName);
+ }
+
+
+ boolean mountParameters = GitBlit.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 = HttpUtils.getGitblitURL(request);
+ char fsc = GitBlit.getChar(Keys.web.forwardSlashCharacter, '/');
+
+ List<FeedEntryModel> entries = new ArrayList<FeedEntryModel>();
+
+ for (String name : repositories) {
+ Repository repository = GitBlit.self().getRepository(name);
+ RepositoryModel model = GitBlit.self().getRepositoryModel(name);
+
+ if (repository == null) {
+ if (model.isCollectingGarbage) {
+ logger.warn(MessageFormat.format("Temporarily excluding {0} from feed, busy collecting garbage", name));
+ }
+ continue;
+ }
+ if (!isProjectFeed) {
+ // single-repository feed
+ feedName = model.name;
+ feedTitle = model.name;
+ feedDescription = model.description;
+ }
+
+ List<RevCommit> 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<ObjectId, List<RefModel>> allRefs = JGitUtils.getAllRefs(repository, model.showRemoteBranches);
+
+ // 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 = GitBlit.self().processCommitMessage(model.name,
+ commit.getFullMessage());
+ entry.content = message;
+ entry.repository = model.name;
+ entry.branch = objectId;
+ entry.tags = new ArrayList<String>();
+
+ // 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<RefModel> refs = allRefs.get(commit.getId());
+ if (refs != null && refs.size() > 0) {
+ for (RefModel ref : refs) {
+ entry.tags.add("ref:" + ref.getName());
+ }
+ }
+ entries.add(entry);
+ }
+ }
+
+ // sort & truncate the feed
+ Collections.sort(entries);
+ if (entries.size() > length) {
+ // clip the list
+ entries = entries.subList(0, length);
+ }
+
+ String feedLink;
+ if (isProjectFeed) {
+ // project feed
+ if (mountParameters) {
+ // mounted url
+ feedLink = MessageFormat.format("{0}/project/{1}", gitblitUrl,
+ StringUtils.encodeURL(feedName));
+ } else {
+ // parameterized url
+ feedLink = MessageFormat.format("{0}/project/?p={1}", gitblitUrl,
+ StringUtils.encodeURL(feedName));
+ }
+ } else {
+ // repository feed
+ if (mountParameters) {
+ // mounted url
+ feedLink = MessageFormat.format("{0}/summary/{1}", gitblitUrl,
+ StringUtils.encodeURL(feedName));
+ } else {
+ // parameterized url
+ feedLink = MessageFormat.format("{0}/summary/?r={1}", gitblitUrl,
+ StringUtils.encodeURL(feedName));
+ }
+ }
+
try {
- SyndicationUtils.toRSS(HttpUtils.getGitblitURL(request), getTitle(model.name, objectId), model.description,
- model.name, commits, response.getOutputStream());
+ SyndicationUtils.toRSS(gitblitUrl, feedLink, getTitle(feedTitle, objectId),
+ feedDescription, entries, response.getOutputStream());
} catch (Exception e) {
logger.error("An error occurred during feed generation", e);
}
--
Gitblit v1.9.1