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