From fabe060d3a435f116128851f828e35c2af5fde67 Mon Sep 17 00:00:00 2001 From: James Moger <james.moger@gitblit.com> Date: Mon, 10 Sep 2012 16:26:27 -0400 Subject: [PATCH] Strip folder name and .git from repo links in the project view --- src/com/gitblit/SyndicationServlet.java | 170 +++++++++++++++++++++++++++++++++++++++++++++++--------- 1 files changed, 143 insertions(+), 27 deletions(-) diff --git a/src/com/gitblit/SyndicationServlet.java b/src/com/gitblit/SyndicationServlet.java index 7510179..4c542b6 100644 --- a/src/com/gitblit/SyndicationServlet.java +++ b/src/com/gitblit/SyndicationServlet.java @@ -17,17 +17,25 @@ 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.SyndicatedEntryModel; +import com.gitblit.models.UserModel; import com.gitblit.utils.HttpUtils; import com.gitblit.utils.JGitUtils; import com.gitblit.utils.StringUtils; @@ -126,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; @@ -136,12 +153,45 @@ } 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); - List<SyndicatedEntryModel> entries = new ArrayList<SyndicatedEntryModel>(); + + 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; @@ -153,34 +203,100 @@ urlPattern = "{0}/commit/?r={1}&h={2}"; } String gitblitUrl = HttpUtils.getGitblitURL(request); - // convert RevCommit to SyndicatedEntryModel - for (RevCommit commit : commits) { - SyndicatedEntryModel entry = new SyndicatedEntryModel(); - entry.title = commit.getShortMessage(); - entry.author = commit.getAuthorIdent().getName(); - entry.link = MessageFormat.format(urlPattern, gitblitUrl, - StringUtils.encodeURL(model.name), commit.getName()); - entry.published = commit.getCommitterIdent().getWhen(); - entry.contentType = "text/plain"; - entry.content = commit.getFullMessage(); - entry.repository = model.name; - entry.branch = objectId; - entries.add(entry); + 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 (!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); + + // 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 (mountParameters) { - // mounted url - feedLink = MessageFormat.format("{0}/summary/{1}", gitblitUrl, - StringUtils.encodeURL(model.name)); + 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 { - // parameterized url - feedLink = MessageFormat.format("{0}/summary/?r={1}", gitblitUrl, - StringUtils.encodeURL(model.name)); + // 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(gitblitUrl, feedLink, getTitle(model.name, objectId), - model.description, model.name, entries, 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