James Moger
2015-10-05 548b29e87dedac76bad2011cda4e39a9f3d72a21
src/main/java/com/gitblit/tickets/BranchTicketService.java
@@ -72,6 +72,8 @@
import com.gitblit.utils.ArrayUtils;
import com.gitblit.utils.JGitUtils;
import com.gitblit.utils.StringUtils;
import com.google.inject.Inject;
import com.google.inject.Singleton;
/**
 * Implementation of a ticket service based on an orphan branch.  All tickets
@@ -81,6 +83,7 @@
 * @author James Moger
 *
 */
@Singleton
public class BranchTicketService extends ITicketService implements RefsChangedListener {
   public static final String BRANCH = "refs/meta/gitblit/tickets";
@@ -91,6 +94,7 @@
   private final Map<String, AtomicLong> lastAssignedId;
   @Inject
   public BranchTicketService(
         IRuntimeManager runtimeManager,
         IPluginManager pluginManager,
@@ -112,6 +116,7 @@
   @Override
   public BranchTicketService start() {
      log.info("{} started", getClass().getSimpleName());
      return this;
   }
@@ -292,7 +297,7 @@
         log.error("failed to read " + file, e);
      } finally {
         if (rw != null) {
            rw.release();
            rw.close();
         }
      }
      return null;
@@ -348,7 +353,7 @@
      } catch (IOException e) {
         log.error("", e);
      } finally {
         inserter.release();
         inserter.close();
      }
   }
@@ -378,6 +383,37 @@
   }
   /**
    * Returns the assigned ticket ids.
    *
    * @return the assigned ticket ids
    */
   @Override
   public synchronized Set<Long> getIds(RepositoryModel repository) {
      Repository db = repositoryManager.getRepository(repository.name);
      try {
         if (getTicketsBranch(db) == null) {
            return Collections.emptySet();
         }
         Set<Long> ids = new TreeSet<Long>();
         List<PathModel> paths = JGitUtils.getDocuments(db, Arrays.asList("json"), BRANCH);
         for (PathModel 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);
            ids.add(ticketId);
         }
         return ids;
      } finally {
         if (db != null) {
            db.close();
         }
      }
   }
   /**
    * Assigns a new ticket id.
    *
    * @param repository
@@ -398,16 +434,10 @@
         }
         AtomicLong lastId = lastAssignedId.get(repository.name);
         if (lastId.get() <= 0) {
            List<PathModel> paths = JGitUtils.getDocuments(db, Arrays.asList("json"), BRANCH);
            for (PathModel 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 (ticketId > lastId.get()) {
                  lastId.set(ticketId);
            Set<Long> ids = getIds(repository);
            for (long id : ids) {
               if (id > lastId.get()) {
                  lastId.set(id);
               }
            }
         }
@@ -520,6 +550,28 @@
            ticket.number = ticketId;
         }
         return ticket;
      } finally {
         db.close();
      }
   }
   /**
    * Retrieves the journal for the ticket.
    *
    * @param repository
    * @param ticketId
    * @return a journal, if it exists, otherwise null
    */
   @Override
   protected List<Change> getJournalImpl(RepositoryModel repository, long ticketId) {
      Repository db = repositoryManager.getRepository(repository.name);
      try {
         List<Change> changes = getJournal(db, ticketId);
         if (ArrayUtils.isEmpty(changes)) {
            log.warn("Empty journal for {}:{}", repository, ticketId);
            return null;
         }
         return changes;
      } finally {
         db.close();
      }
@@ -660,7 +712,7 @@
         } finally {
            // release the treewalk
            if (treeWalk != null) {
               treeWalk.release();
               treeWalk.close();
            }
         }
      } finally {
@@ -759,7 +811,7 @@
         // finish the index
         builder.finish();
      } finally {
         inserter.release();
         inserter.close();
      }
      return newIndex;
   }
@@ -776,8 +828,12 @@
      List<DirCacheEntry> list = new ArrayList<DirCacheEntry>();
      TreeWalk tw = null;
      try {
         tw = new TreeWalk(db);
         ObjectId treeId = db.resolve(BRANCH + "^{tree}");
         if (treeId == null) {
            // branch does not exist yet, could be migrating tickets
            return list;
         }
         tw = new TreeWalk(db);
         int hIdx = tw.addTree(treeId);
         tw.setRecursive(true);
@@ -799,7 +855,7 @@
         }
      } finally {
         if (tw != null) {
            tw.release();
            tw.close();
         }
      }
      return list;
@@ -857,10 +913,10 @@
                     rc));
            }
         } finally {
            revWalk.release();
            revWalk.close();
         }
      } finally {
         odi.release();
         odi.close();
      }
      return success;
   }