| | |
| | | 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; |
| | |
| | | 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; |
| | |
| | | */ |
| | | 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"; |
| | |
| | | repositoryManager); |
| | | |
| | | lastAssignedId = new ConcurrentHashMap<String, AtomicLong>(); |
| | | |
| | | |
| | | // register the branch ticket service for repository ref changes |
| | | Repository.getGlobalListenerList().addRefsChangedListener(this); |
| | | } |
| | |
| | | } |
| | | |
| | | /** |
| | | * 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); |
| | | } |