James Moger
2014-03-06 9883341c1fbb35abcb7a1d09f93f6a9e805ea551
src/main/java/com/gitblit/tickets/BranchTicketService.java
@@ -27,6 +27,7 @@
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.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 @@
 */
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 @@
            repositoryManager);
      lastAssignedId = new ConcurrentHashMap<String, AtomicLong>();
      // register the branch ticket service for repository ref changes
      Repository.getGlobalListenerList().addRefsChangedListener(this);
   }
@@ -138,16 +130,60 @@
   }
   /**
    * 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);
      }