src/main/java/com/gitblit/tickets/BranchTicketService.java
@@ -436,64 +436,84 @@ @Override public List<TicketModel> getTickets(RepositoryModel repository, TicketFilter filter) { List<TicketModel> list = new ArrayList<TicketModel>(); Repository db = repositoryManager.getRepository(repository.name); try { RefModel ticketsBranch = getTicketsBranch(db); if (ticketsBranch == null) { return list; List<Repository> databases = new ArrayList<Repository>(); List<RepositoryModel> models = new ArrayList<RepositoryModel>(); if(repository == null) { List<String> allRepo = repositoryManager.getRepositoryList(); for(int i = 0; i < allRepo.size(); i++) { databases.add(repositoryManager.getRepository(allRepo.get(i))); models.add(repositoryManager.getRepositoryModel(allRepo.get(i))); } } else { databases.add(repositoryManager.getRepository(repository.name)); models.add(repository); } // Collect the set of all json files List<PathModel> paths = JGitUtils.getDocuments(db, Arrays.asList("json"), BRANCH); // Deserialize each ticket and optionally filter out unwanted tickets for (PathModel path : paths) { String name = path.name.substring(path.name.lastIndexOf('/') + 1); if (!JOURNAL.equals(name)) { continue; for(int i = 0; i < databases.size(); i++) { Repository db = databases.get(i); try { RefModel ticketsBranch = getTicketsBranch(db); if (ticketsBranch == null) { return list; } String json = readTicketsFile(db, path.path); if (StringUtils.isEmpty(json)) { // journal was touched but no changes were written continue; } try { // Reconstruct ticketId from the path // id/26/326/journal.json String tid = path.path.split("/")[2]; long ticketId = Long.parseLong(tid); List<Change> changes = TicketSerializer.deserializeJournal(json); if (ArrayUtils.isEmpty(changes)) { log.warn("Empty journal for {}:{}", repository, path.path); // Collect the set of all json files List<PathModel> paths = JGitUtils.getDocuments(db, Arrays.asList("json"), BRANCH); // Deserialize each ticket and optionally filter out unwanted tickets for (PathModel path : paths) { String name = path.name.substring(path.name.lastIndexOf('/') + 1); if (!JOURNAL.equals(name)) { continue; } TicketModel ticket = TicketModel.buildTicket(changes); ticket.project = repository.projectPath; ticket.repository = repository.name; ticket.number = ticketId; // add the ticket, conditionally, to the list if (filter == null) { list.add(ticket); } else { if (filter.accept(ticket)) { list.add(ticket); } String json = readTicketsFile(db, path.path); if (StringUtils.isEmpty(json)) { // journal was touched but no changes were written continue; } } catch (Exception e) { log.error("failed to deserialize {}/{}\n{}", new Object [] { repository, path.path, e.getMessage()}); log.error(null, e); try { // Reconstruct ticketId from the path // id/26/326/journal.json String tid = path.path.split("/")[2]; long ticketId = Long.parseLong(tid); List<Change> changes = TicketSerializer.deserializeJournal(json); if (ArrayUtils.isEmpty(changes)) { log.warn("Empty journal for {}:{}", models.get(i), path.path); continue; } TicketModel ticket = TicketModel.buildTicket(changes); ticket.project = models.get(i).projectPath; ticket.repository = models.get(i).name; ticket.number = ticketId; // add the ticket, conditionally, to the list if (filter == null) { list.add(ticket); } else { if (filter.accept(ticket)) { list.add(ticket); } } } catch (Exception e) { log.error("failed to deserialize {}/{}\n{}", new Object [] { repository, path.path, e.getMessage()}); log.error(null, e); } } } finally { db.close(); } // sort the tickets by creation Collections.sort(list); return list; } finally { db.close(); } // sort the tickets by creation Collections.sort(list); return list; } /** src/main/java/com/gitblit/tickets/FileTicketService.java
@@ -228,6 +228,7 @@ for(int i = 0; i < databases.size(); i++) { Repository db = databases.get(i); RepositoryModel model = models.get(i); try { // Collect the set of all json files File dir = new File(db.getDirectory(), TICKETS_PATH); @@ -253,12 +254,12 @@ long ticketId = Long.parseLong(tid); List<Change> changes = TicketSerializer.deserializeJournal(json); if (ArrayUtils.isEmpty(changes)) { log.warn("Empty journal for {}:{}", models.get(i), journal); log.warn("Empty journal for {}:{}", model, journal); continue; } TicketModel ticket = TicketModel.buildTicket(changes); ticket.project = models.get(i).projectPath; ticket.repository = models.get(i).name; ticket.project = model.projectPath; ticket.repository = model.name; ticket.number = ticketId; // add the ticket, conditionally, to the list @@ -271,7 +272,7 @@ } } catch (Exception e) { log.error("failed to deserialize {}/{}\n{}", new Object [] { models.get(i), journal, e.getMessage()}); new Object [] { model, journal, e.getMessage()}); log.error(null, e); } } src/main/java/com/gitblit/tickets/RedisTicketService.java
@@ -22,6 +22,7 @@ import java.util.Set; import org.apache.commons.pool2.impl.GenericObjectPoolConfig; import org.eclipse.jgit.lib.Repository; import redis.clients.jedis.Client; import redis.clients.jedis.Jedis; @@ -228,47 +229,65 @@ public List<TicketModel> getTickets(RepositoryModel repository, TicketFilter filter) { Jedis jedis = pool.getResource(); List<TicketModel> list = new ArrayList<TicketModel>(); List<RepositoryModel> models = new ArrayList<RepositoryModel>(); if(repository == null) { List<String> allRepo = repositoryManager.getRepositoryList(); for(int i = 0; i < allRepo.size(); i++) { models.add(repositoryManager.getRepositoryModel(allRepo.get(i))); } } else { models.add(repository); } if (jedis == null) { return list; } try { // Deserialize each journal, build the ticket, and optionally filter Set<String> keys = jedis.keys(key(repository, KeyType.journal, "*")); for (String key : keys) { // {repo}:journal:{id} String id = key.split(":")[2]; long ticketId = Long.parseLong(id); List<Change> changes = getJournal(jedis, repository, ticketId); if (ArrayUtils.isEmpty(changes)) { log.warn("Empty journal for {}:{}", repository, ticketId); continue; } TicketModel ticket = TicketModel.buildTicket(changes); ticket.project = repository.projectPath; ticket.repository = repository.name; ticket.number = ticketId; // add the ticket, conditionally, to the list if (filter == null) { list.add(ticket); } else { if (filter.accept(ticket)) { for(int i = 0; i < models.size(); i++) { RepositoryModel model = models.get(i); try { // Deserialize each journal, build the ticket, and optionally filter Set<String> keys = jedis.keys(key(model, KeyType.journal, "*")); for (String key : keys) { // {repo}:journal:{id} String id = key.split(":")[2]; long ticketId = Long.parseLong(id); List<Change> changes = getJournal(jedis, model, ticketId); if (ArrayUtils.isEmpty(changes)) { log.warn("Empty journal for {}:{}", model, ticketId); continue; } TicketModel ticket = TicketModel.buildTicket(changes); ticket.project = model.projectPath; ticket.repository = model.name; ticket.number = ticketId; // add the ticket, conditionally, to the list if (filter == null) { list.add(ticket); } else { if (filter.accept(ticket)) { list.add(ticket); } } } } // sort the tickets by creation Collections.sort(list); } catch (JedisException e) { log.error("failed to retrieve tickets from Redis @ " + getUrl(), e); pool.returnBrokenResource(jedis); jedis = null; } finally { if (jedis != null) { pool.returnResource(jedis); } catch (JedisException e) { log.error("failed to retrieve tickets from Redis @ " + getUrl(), e); pool.returnBrokenResource(jedis); jedis = null; } finally { if (jedis != null) { pool.returnResource(jedis); } } } // sort the tickets by creation Collections.sort(list); return list; }