From fbbaa32b555a509bd063cf323a76cebc5e903dd6 Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Wed, 4 Jul 2012 11:18:58 +0200 Subject: [PATCH] improve performance for big history with paging --- .../scm/repository/spi/HgLogCommand.java | 125 +++++++++++------- 1 file changed, 77 insertions(+), 48 deletions(-) diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgLogCommand.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgLogCommand.java index 4daf249b18..dfa454e229 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgLogCommand.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgLogCommand.java @@ -36,7 +36,6 @@ package sonia.scm.repository.spi; //~--- non-JDK imports -------------------------------------------------------- import com.google.common.base.Strings; -import com.google.common.collect.Lists; import sonia.scm.repository.Changeset; import sonia.scm.repository.ChangesetPagingResult; @@ -110,53 +109,10 @@ public class HgLogCommand extends AbstractCommand implements LogCommand ChangesetPagingResult result = null; com.aragost.javahg.Repository repository = open(); - HgLogChangesetCommand cmd = HgLogChangesetCommand.on(repository); if (!Strings.isNullOrEmpty(request.getPath())) { - - String startChangeset = request.getStartChangeset(); - String endChangeset = request.getEndChangeset(); - - if (!Strings.isNullOrEmpty(startChangeset) - &&!Strings.isNullOrEmpty(endChangeset)) - { - cmd.rev(startChangeset.concat(":").concat(endChangeset)); - } - else if (!Strings.isNullOrEmpty(endChangeset)) - { - cmd.rev("tip:".concat(endChangeset)); - } - else if (!Strings.isNullOrEmpty(startChangeset)) - { - cmd.rev(startChangeset.concat(":0")); - } - - List changesetList = cmd.execute(request.getPath()); - - int start = request.getPagingStart(); - int limit = request.getPagingLimit(); - List changesets = null; - - if ((start == 0) && (limit < 0)) - { - changesets = changesetList; - } - else - { - limit = limit + start; - - if ((limit > changesetList.size()) || (limit < 0)) - { - limit = changesetList.size(); - } - - List sublist = changesetList.subList(start, limit); - - changesets = Lists.newArrayList(sublist); - } - - result = new ChangesetPagingResult(changesetList.size(), changesets); + result = collectHistory(repository, request); } else { @@ -195,16 +151,89 @@ public class HgLogCommand extends AbstractCommand implements LogCommand { end = start - request.getPagingLimit() + 1; } - - if ( end < 0 ){ + + if (end < 0) + { end = 0; } - List changesets = cmd.rev(start + ":" + end).execute(); + List changesets = + HgLogChangesetCommand.on(repository).rev(start + ":" + end).execute(); result = new ChangesetPagingResult(total, changesets); } return result; } + + //~--- methods -------------------------------------------------------------- + + /** + * Method description + * + * + * @param repository + * @param request + * + * @return + */ + private ChangesetPagingResult collectHistory( + com.aragost.javahg.Repository repository, LogCommandRequest request) + { + HgLogChangesetCommand cmd = HgLogChangesetCommand.on(repository); + String startChangeset = request.getStartChangeset(); + String endChangeset = request.getEndChangeset(); + + if (!Strings.isNullOrEmpty(startChangeset) + &&!Strings.isNullOrEmpty(endChangeset)) + { + cmd.rev(startChangeset.concat(":").concat(endChangeset)); + } + else if (!Strings.isNullOrEmpty(endChangeset)) + { + cmd.rev("tip:".concat(endChangeset)); + } + else if (!Strings.isNullOrEmpty(startChangeset)) + { + cmd.rev(startChangeset.concat(":0")); + } + + int start = request.getPagingStart(); + int limit = request.getPagingLimit(); + + List changesets = null; + int total = 0; + + if ((start == 0) && (limit < 0)) + { + changesets = cmd.execute(request.getPath()); + total = changesets.size(); + } + else + { + limit = limit + start; + + List revisionList = cmd.loadRevisions(request.getPath()); + + if ((limit > revisionList.size()) || (limit < 0)) + { + limit = revisionList.size(); + } + + total = revisionList.size(); + + List sublist = revisionList.subList(start, limit); + + String[] revs = new String[sublist.size()]; + + for (int i = 0; i < sublist.size(); i++) + { + revs[i] = sublist.get(i).toString(); + } + + changesets = HgLogChangesetCommand.on(repository).rev(revs).execute(); + } + + return new ChangesetPagingResult(total, changesets); + } }