summaryrefslogtreecommitdiffstats
path: root/src/main/java/com/gitblit/tickets/BranchTicketService.java
diff options
context:
space:
mode:
authorJames Moger <james.moger@gitblit.com>2014-03-06 13:36:23 -0500
committerJames Moger <james.moger@gitblit.com>2014-03-06 13:36:23 -0500
commit9883341c1fbb35abcb7a1d09f93f6a9e805ea551 (patch)
tree861c1aeb430e2c8a896873ad249734ebf5e4701c /src/main/java/com/gitblit/tickets/BranchTicketService.java
parente462bbf2974d33f1a5a0b2a808e150aa0e22d6f4 (diff)
downloadgitblit-9883341c1fbb35abcb7a1d09f93f6a9e805ea551.tar.gz
gitblit-9883341c1fbb35abcb7a1d09f93f6a9e805ea551.zip
Revise push/mirror tickets branch triggering
Diffstat (limited to 'src/main/java/com/gitblit/tickets/BranchTicketService.java')
-rw-r--r--src/main/java/com/gitblit/tickets/BranchTicketService.java72
1 files changed, 54 insertions, 18 deletions
diff --git a/src/main/java/com/gitblit/tickets/BranchTicketService.java b/src/main/java/com/gitblit/tickets/BranchTicketService.java
index 60dca276..fc0bd8f0 100644
--- a/src/main/java/com/gitblit/tickets/BranchTicketService.java
+++ b/src/main/java/com/gitblit/tickets/BranchTicketService.java
@@ -27,6 +27,7 @@ import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;
import javax.inject.Inject;
@@ -50,15 +51,18 @@ import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevTree;
import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.transport.ReceiveCommand;
import org.eclipse.jgit.treewalk.CanonicalTreeParser;
import org.eclipse.jgit.treewalk.TreeWalk;
import com.gitblit.Constants;
+import com.gitblit.git.ReceiveCommandEvent;
import com.gitblit.manager.INotificationManager;
import com.gitblit.manager.IRepositoryManager;
import com.gitblit.manager.IRuntimeManager;
import com.gitblit.manager.IUserManager;
import com.gitblit.models.PathModel;
+import com.gitblit.models.PathModel.PathChangeModel;
import com.gitblit.models.RefModel;
import com.gitblit.models.RepositoryModel;
import com.gitblit.models.TicketModel;
@@ -78,18 +82,6 @@ import com.gitblit.utils.StringUtils;
*/
public class BranchTicketService extends ITicketService implements RefsChangedListener {
- /**
- * The event fired by other classes to allow this service to index tickets.
- */
- public static class TicketsBranchUpdated extends RefsChangedEvent {
-
- public final RepositoryModel model;
-
- public TicketsBranchUpdated(RepositoryModel model) {
- this.model = model;
- }
- }
-
public static final String BRANCH = "refs/gitblit/tickets";
private static final String JOURNAL = "journal.json";
@@ -111,7 +103,7 @@ public class BranchTicketService extends ITicketService implements RefsChangedLi
repositoryManager);
lastAssignedId = new ConcurrentHashMap<String, AtomicLong>();
-
+
// register the branch ticket service for repository ref changes
Repository.getGlobalListenerList().addRefsChangedListener(this);
}
@@ -138,16 +130,60 @@ public class BranchTicketService extends ITicketService implements RefsChangedLi
}
/**
- * Listen for refs changed events and reindex that repository.
+ * Listen for tickets branch changes and (re)index tickets, as appropriate
*/
@Override
- public void onRefsChanged(RefsChangedEvent event) {
- if (!(event instanceof TicketsBranchUpdated)) {
+ public synchronized void onRefsChanged(RefsChangedEvent event) {
+ if (!(event instanceof ReceiveCommandEvent)) {
return;
}
- RepositoryModel repository = ((TicketsBranchUpdated) event).model;
+
+ ReceiveCommandEvent branchUpdate = (ReceiveCommandEvent) event;
+ RepositoryModel repository = branchUpdate.model;
+ ReceiveCommand cmd = branchUpdate.cmd;
try {
- reindex(repository);
+ switch (cmd.getType()) {
+ case CREATE:
+ case UPDATE_NONFASTFORWARD:
+ // reindex everything
+ reindex(repository);
+ break;
+ case UPDATE:
+ // incrementally index ticket updates
+ resetCaches(repository);
+ long start = System.nanoTime();
+ log.info("incrementally indexing {} ticket branch due to received ref update", repository.name);
+ Repository db = repositoryManager.getRepository(repository.name);
+ try {
+ Set<Long> ids = new HashSet<Long>();
+ List<PathChangeModel> paths = JGitUtils.getFilesInRange(db,
+ cmd.getOldId().getName(), cmd.getNewId().getName());
+ for (PathChangeModel path : paths) {
+ String name = path.name.substring(path.name.lastIndexOf('/') + 1);
+ if (!JOURNAL.equals(name)) {
+ continue;
+ }
+ String tid = path.path.split("/")[2];
+ long ticketId = Long.parseLong(tid);
+ if (!ids.contains(ticketId)) {
+ ids.add(ticketId);
+ TicketModel ticket = getTicket(repository, ticketId);
+ log.info(MessageFormat.format("indexing ticket #{0,number,0}: {1}",
+ ticketId, ticket.title));
+ indexer.index(ticket);
+ }
+ }
+ long end = System.nanoTime();
+ log.info("incremental indexing of {0} ticket(s) completed in {1} msecs",
+ ids.size(), TimeUnit.NANOSECONDS.toMillis(end - start));
+ } finally {
+ db.close();
+ }
+ break;
+ default:
+ log.warn("Unexpected receive type {} in BranchTicketService.onRefsChanged" + cmd.getType());
+ break;
+ }
} catch (Exception e) {
log.error("failed to reindex " + repository.name, e);
}