From f76fee63ed9cb3a30d3c0c092d860b1cb93a481b Mon Sep 17 00:00:00 2001
From: Gerard Smyth <gerard.smyth@gmail.com>
Date: Thu, 08 May 2014 13:09:30 -0400
Subject: [PATCH] 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.

---
 src/main/java/com/gitblit/utils/CommitCache.java |   93 ++++++++++++++++++++++++++++------------------
 1 files changed, 56 insertions(+), 37 deletions(-)

diff --git a/src/main/java/com/gitblit/utils/CommitCache.java b/src/main/java/com/gitblit/utils/CommitCache.java
index e188ff9..a3963f5 100644
--- a/src/main/java/com/gitblit/utils/CommitCache.java
+++ b/src/main/java/com/gitblit/utils/CommitCache.java
@@ -35,39 +35,39 @@
 
 /**
  * Caches repository commits for re-use in the dashboard and activity pages.
- * 
+ *
  * @author James Moger
  *
  */
 public class CommitCache {
-	
+
 	private static final CommitCache instance;
-	
+
 	protected final Logger logger = LoggerFactory.getLogger(getClass());
-	
+
 	protected final Map<String, ObjectCache<List<RepositoryCommit>>> cache;
-	
+
 	protected int cacheDays = -1;
-	
+
 	public static CommitCache instance() {
 		return instance;
 	}
-	
+
 	static {
 		instance = new CommitCache();
 	}
-	
+
 	protected CommitCache() {
 		cache = new ConcurrentHashMap<String, ObjectCache<List<RepositoryCommit>>>();
 	}
-	
+
 	/**
 	 * Returns the cutoff date for the cache.  Commits after this date are cached.
 	 * Commits before this date are not cached.
-	 * 
+	 *
 	 * @return
 	 */
-	protected Date getCacheCutoffDate() {
+	public Date getCutoffDate() {
 		final Calendar cal = Calendar.getInstance();
 		cal.setTimeInMillis(System.currentTimeMillis());
 		cal.set(Calendar.HOUR_OF_DAY, 0);
@@ -77,28 +77,28 @@
 		cal.add(Calendar.DATE, -1*cacheDays);
 		return cal.getTime();
 	}
-	
+
 	/**
 	 * Sets the number of days to cache.
-	 * 
+	 *
 	 * @param days
 	 */
 	public synchronized void setCacheDays(int days) {
 		this.cacheDays = days;
 		clear();
 	}
-	
+
 	/**
 	 * Clears the entire commit cache.
-	 * 
+	 *
 	 */
 	public void clear() {
 		cache.clear();
 	}
-	
+
 	/**
 	 * Clears the commit cache for a specific repository.
-	 * 
+	 *
 	 * @param repositoryName
 	 */
 	public void clear(String repositoryName) {
@@ -108,24 +108,41 @@
 			logger.info(MessageFormat.format("{0} commit cache cleared", repositoryName));
 		}
 	}
-	
+
+	/**
+	 * Clears the commit cache for a specific branch of a specific repository.
+	 *
+	 * @param repositoryName
+	 * @param branch
+	 */
+	public void clear(String repositoryName, String branch) {
+		String repoKey = repositoryName.toLowerCase();
+		ObjectCache<List<RepositoryCommit>> repoCache = cache.get(repoKey);
+		if (repoCache != null) {
+			List<RepositoryCommit> commits = repoCache.remove(branch.toLowerCase());
+			if (!ArrayUtils.isEmpty(commits)) {
+				logger.info(MessageFormat.format("{0}:{1} commit cache cleared", repositoryName, branch));
+			}
+		}
+	}
+
 	/**
 	 * Get all commits for the specified repository:branch that are in the cache.
-	 * 
+	 *
 	 * @param repositoryName
 	 * @param repository
 	 * @param branch
 	 * @return a list of commits
 	 */
 	public List<RepositoryCommit> getCommits(String repositoryName, Repository repository, String branch) {
-		return getCommits(repositoryName, repository, branch, getCacheCutoffDate());
+		return getCommits(repositoryName, repository, branch, getCutoffDate());
 	}
-	
+
 	/**
 	 * Get all commits for the specified repository:branch since a specific date.
 	 * These commits may be retrieved from the cache if the sinceDate is after
 	 * the cacheCutoffDate.
-	 * 
+	 *
 	 * @param repositoryName
 	 * @param repository
 	 * @param branch
@@ -134,7 +151,7 @@
 	 */
 	public List<RepositoryCommit> getCommits(String repositoryName, Repository repository, String branch, Date sinceDate) {
 		long start = System.nanoTime();
-		Date cacheCutoffDate = getCacheCutoffDate();
+		Date cacheCutoffDate = getCutoffDate();
 		List<RepositoryCommit> list;
 		if (cacheDays > 0 && (sinceDate.getTime() >= cacheCutoffDate.getTime())) {
 			// request fits within the cache window
@@ -142,13 +159,13 @@
 			if (!cache.containsKey(repoKey)) {
 				cache.put(repoKey, new ObjectCache<List<RepositoryCommit>>());
 			}
-			
+
 			ObjectCache<List<RepositoryCommit>> repoCache = cache.get(repoKey);
 			String branchKey = branch.toLowerCase();
-			
+
 			RevCommit tip = JGitUtils.getCommit(repository, branch);
 			Date tipDate = JGitUtils.getCommitDate(tip);
-			
+
 			List<RepositoryCommit> commits;
 			if (!repoCache.hasCurrent(branchKey, tipDate)) {
 				commits = repoCache.getObject(branchKey);
@@ -176,7 +193,7 @@
 				// update cache
 				repoCache.updateObject(branchKey, tipDate, commits);
 			}
-			
+
 			if (sinceDate.equals(cacheCutoffDate)) {
 				list = commits;
 			} else {
@@ -193,10 +210,10 @@
 		}
 		return list;
 	}
-	
+
 	/**
-	 * Returns a list of commits for the specified repository branch. 
-	 * 
+	 * Returns a list of commits for the specified repository branch.
+	 *
 	 * @param repositoryName
 	 * @param repository
 	 * @param branch
@@ -208,15 +225,16 @@
 		List<RepositoryCommit> commits = new ArrayList<RepositoryCommit>();
 		for (RevCommit commit : JGitUtils.getRevLog(repository, branch, sinceDate)) {
 			RepositoryCommit commitModel = new RepositoryCommit(repositoryName, branch, commit);
-			commitModel.setRefs(allRefs.get(commitModel.getName()));
+			List<RefModel> commitRefs = allRefs.get(commitModel.getId());
+			commitModel.setRefs(commitRefs);
 			commits.add(commitModel);
 		}
 		return commits;
 	}
-	
+
 	/**
-	 * Returns a list of commits for the specified repository branch since the specified commit. 
-	 * 
+	 * Returns a list of commits for the specified repository branch since the specified commit.
+	 *
 	 * @param repositoryName
 	 * @param repository
 	 * @param branch
@@ -228,15 +246,16 @@
 		List<RepositoryCommit> commits = new ArrayList<RepositoryCommit>();
 		for (RevCommit commit : JGitUtils.getRevLog(repository, sinceCommit.getName(), branch)) {
 			RepositoryCommit commitModel = new RepositoryCommit(repositoryName, branch, commit);
-			commitModel.setRefs(allRefs.get(commitModel.getName()));
+			List<RefModel> commitRefs = allRefs.get(commitModel.getId());
+			commitModel.setRefs(commitRefs);
 			commits.add(commitModel);
 		}
 		return commits;
 	}
-	
+
 	/**
 	 * Reduces the list of commits to those since the specified date.
-	 * 
+	 *
 	 * @param commits
 	 * @param sinceDate
 	 * @return  a list of commits

--
Gitblit v1.9.1