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