From b938aeea1e892b9c95396ca0745ac2adb79ff78e Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Tue, 28 Feb 2012 17:22:40 -0500
Subject: [PATCH] Delete branch from index. Queue index update from the PostReceiveHook.

---
 src/com/gitblit/GitBlit.java           |   10 ++++++++++
 src/com/gitblit/utils/LuceneUtils.java |   29 +++++++++++++++++++++++++----
 src/com/gitblit/GitServlet.java        |    3 +++
 src/com/gitblit/LuceneExecutor.java    |   16 ++++++++++++----
 4 files changed, 50 insertions(+), 8 deletions(-)

diff --git a/src/com/gitblit/GitBlit.java b/src/com/gitblit/GitBlit.java
index 580bf62..a7bfad4 100644
--- a/src/com/gitblit/GitBlit.java
+++ b/src/com/gitblit/GitBlit.java
@@ -1697,6 +1697,15 @@
 	}
 
 	/**
+	 * Update the Lucene index of a repository.
+	 * 
+	 * @param repository
+	 */
+	public void updateLuceneIndex(RepositoryModel repository) {
+		luceneExecutor.queue(repository);
+	}
+
+	/**
 	 * Returns the descriptions/comments of the Gitblit config settings.
 	 * 
 	 * @return SettingsModel
@@ -1892,5 +1901,6 @@
 	public void contextDestroyed(ServletContextEvent contextEvent) {
 		logger.info("Gitblit context destroyed by servlet container.");
 		scheduledExecutor.shutdownNow();
+		luceneExecutor.close();
 	}
 }
diff --git a/src/com/gitblit/GitServlet.java b/src/com/gitblit/GitServlet.java
index 3b60e9f..473e4c9 100644
--- a/src/com/gitblit/GitServlet.java
+++ b/src/com/gitblit/GitServlet.java
@@ -197,6 +197,9 @@
 
 			// Experimental
 			// runNativeScript(rp, "hooks/post-receive", commands);
+			
+			// Update the Lucene search index
+			GitBlit.self().updateLuceneIndex(repository);
 		}
 
 		/**
diff --git a/src/com/gitblit/LuceneExecutor.java b/src/com/gitblit/LuceneExecutor.java
index 32004a7..e4624ef 100644
--- a/src/com/gitblit/LuceneExecutor.java
+++ b/src/com/gitblit/LuceneExecutor.java
@@ -54,7 +54,7 @@
 	public LuceneExecutor(IStoredSettings settings) {
 		this.settings = settings;
 		this.isLuceneEnabled = settings.getBoolean("lucene.enableLucene", false);
-		this.isPollingMode = settings.getBoolean("lucene.pollingMode", false);		
+		this.isPollingMode = settings.getBoolean("lucene.pollingMode", false);
 	}
 
 	/**
@@ -94,9 +94,9 @@
 		if (!isLuceneEnabled) {
 			return;
 		}
-		
+
 		if (firstRun.get() || isPollingMode) {
-			// update all indexes on first run or if polling mode 
+			// update all indexes on first run or if polling mode
 			firstRun.set(false);
 			queue.addAll(GitBlit.self().getRepositoryList());
 		}
@@ -117,7 +117,7 @@
 								"Lucene executor could not find repository {0}. Skipping.",
 								repositoryName));
 						continue;
-					}					
+					}
 					index(repositoryName, repository);
 					repository.close();
 					processed.add(repositoryName);
@@ -174,4 +174,12 @@
 			logger.error(MessageFormat.format("Lucene indexing failure for {0}", repositoryName), t);
 		}
 	}
+
+	/**
+	 * Close all Lucene indexers.
+	 * 
+	 */
+	public void close() {
+		LuceneUtils.close();
+	}
 }
diff --git a/src/com/gitblit/utils/LuceneUtils.java b/src/com/gitblit/utils/LuceneUtils.java
index eaf02df..d463cdf 100644
--- a/src/com/gitblit/utils/LuceneUtils.java
+++ b/src/com/gitblit/utils/LuceneUtils.java
@@ -473,13 +473,24 @@
 				tags.get(tag.getReferencedObjectId().getName()).add(tag.displayName);
 			}
 
+			// detect branch deletion
+			// first assume all branches are deleted and then remove each
+			// existing branch from deletedBranches during indexing			
+			Set<String> deletedBranches = new TreeSet<String>();
+			for (String alias : config.getNames(CONF_ALIAS)) {
+				String branch = config.getString(CONF_ALIAS, null, alias);
+				deletedBranches.add(branch);
+			}
+			
+			// walk through each branches
 			List<RefModel> branches = JGitUtils.getLocalBranches(repository, true, -1);
-			// TODO detect branch deletion
-
-			// walk through each branch
 			for (RefModel branch : branches) {
-				// determine last commit
 				String branchName = branch.getName();
+
+				// remove this branch from the deletedBranches set
+				deletedBranches.remove(branchName);
+
+				// determine last commit				
 				String keyName = getBranchKey(branchName);
 				String lastCommit = config.getString(CONF_BRANCH, null, keyName);
 
@@ -504,6 +515,16 @@
 				config.setString(CONF_BRANCH, null, keyName, branch.getObjectId().getName());
 				config.save();
 			}
+			
+			// the deletedBranches set will normally be empty by this point
+			// unless a branch really was deleted and no longer exists
+			if (deletedBranches.size() > 0) {
+				for (String branch : deletedBranches) {
+					IndexWriter writer = getIndexWriter(repository, false);
+					writer.deleteDocuments(new Term(FIELD_BRANCH, branch));
+					writer.commit();
+				}
+			}
 			success = true;
 		} catch (Throwable t) {
 			t.printStackTrace();

--
Gitblit v1.9.1