Mercurial > jhg
comparison src/org/tmatesoft/hg/core/HgIncomingCommand.java @ 192:e5407b5a586a
Incoming and Outgoing commands are alive
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
|---|---|
| date | Fri, 15 Apr 2011 03:17:03 +0200 |
| parents | cd3371670f0b |
| children | 344e8d7e4d6e |
comparison
equal
deleted
inserted
replaced
| 191:b777502a06f5 | 192:e5407b5a586a |
|---|---|
| 14 * the terms of a license other than GNU General Public License | 14 * the terms of a license other than GNU General Public License |
| 15 * contact TMate Software at support@hg4j.com | 15 * contact TMate Software at support@hg4j.com |
| 16 */ | 16 */ |
| 17 package org.tmatesoft.hg.core; | 17 package org.tmatesoft.hg.core; |
| 18 | 18 |
| 19 import java.io.IOException; | |
| 20 import java.util.ArrayList; | |
| 21 import java.util.LinkedHashSet; | |
| 22 import java.util.LinkedList; | |
| 19 import java.util.List; | 23 import java.util.List; |
| 20 | 24 |
| 25 import org.tmatesoft.hg.internal.RepositoryComparator; | |
| 26 import org.tmatesoft.hg.internal.RepositoryComparator.BranchChain; | |
| 27 import org.tmatesoft.hg.repo.HgBundle; | |
| 28 import org.tmatesoft.hg.repo.HgChangelog; | |
| 29 import org.tmatesoft.hg.repo.HgChangelog.RawChangeset; | |
| 30 import org.tmatesoft.hg.repo.HgRemoteRepository; | |
| 21 import org.tmatesoft.hg.repo.HgRepository; | 31 import org.tmatesoft.hg.repo.HgRepository; |
| 22 import org.tmatesoft.hg.util.CancelledException; | 32 import org.tmatesoft.hg.util.CancelledException; |
| 23 | 33 |
| 24 /** | 34 /** |
| 25 * | 35 * Command to find out changes available in a remote repository, missing locally. |
| 36 * | |
| 26 * @author Artem Tikhomirov | 37 * @author Artem Tikhomirov |
| 27 * @author TMate Software Ltd. | 38 * @author TMate Software Ltd. |
| 28 */ | 39 */ |
| 29 public class HgIncomingCommand { | 40 public class HgIncomingCommand { |
| 30 | 41 |
| 31 private final HgRepository repo; | 42 private final HgRepository localRepo; |
| 43 private HgRemoteRepository remoteRepo; | |
| 32 private boolean includeSubrepo; | 44 private boolean includeSubrepo; |
| 45 private RepositoryComparator comparator; | |
| 46 private List<BranchChain> missingBranches; | |
| 47 private HgChangelog.ParentWalker parentHelper; | |
| 33 | 48 |
| 34 public HgIncomingCommand(HgRepository hgRepo) { | 49 public HgIncomingCommand(HgRepository hgRepo) { |
| 35 repo = hgRepo; | 50 localRepo = hgRepo; |
| 51 } | |
| 52 | |
| 53 public HgIncomingCommand against(HgRemoteRepository hgRemote) { | |
| 54 remoteRepo = hgRemote; | |
| 55 comparator = null; | |
| 56 missingBranches = null; | |
| 57 return this; | |
| 36 } | 58 } |
| 37 | 59 |
| 38 /** | 60 /** |
| 61 * PLACEHOLDER, NOT IMPLEMENTED YET. | |
| 62 * | |
| 39 * Select specific branch to pull | 63 * Select specific branch to pull |
| 40 * @return <code>this</code> for convenience | 64 * @return <code>this</code> for convenience |
| 41 */ | 65 */ |
| 42 public HgIncomingCommand branch(String branch) { | 66 public HgIncomingCommand branch(String branch) { |
| 43 throw HgRepository.notImplemented(); | 67 throw HgRepository.notImplemented(); |
| 44 } | 68 } |
| 45 | 69 |
| 46 /** | 70 /** |
| 71 * PLACEHOLDER, NOT IMPLEMENTED YET. | |
| 72 * | |
| 47 * Whether to include sub-repositories when collecting changes, default is <code>true</code> XXX or false? | 73 * Whether to include sub-repositories when collecting changes, default is <code>true</code> XXX or false? |
| 48 * @return <code>this</code> for convenience | 74 * @return <code>this</code> for convenience |
| 49 */ | 75 */ |
| 50 public HgIncomingCommand subrepo(boolean include) { | 76 public HgIncomingCommand subrepo(boolean include) { |
| 51 includeSubrepo = include; | 77 includeSubrepo = include; |
| 59 * @return list of nodes present at remote and missing locally | 85 * @return list of nodes present at remote and missing locally |
| 60 * @throws HgException | 86 * @throws HgException |
| 61 * @throws CancelledException | 87 * @throws CancelledException |
| 62 */ | 88 */ |
| 63 public List<Nodeid> executeLite(Object context) throws HgException, CancelledException { | 89 public List<Nodeid> executeLite(Object context) throws HgException, CancelledException { |
| 64 throw HgRepository.notImplemented(); | 90 LinkedHashSet<Nodeid> result = new LinkedHashSet<Nodeid>(); |
| 91 RepositoryComparator repoCompare = getComparator(context); | |
| 92 for (BranchChain bc : getMissingBranches(context)) { | |
| 93 List<Nodeid> missing = repoCompare.visitBranches(bc); | |
| 94 assert bc.branchRoot.equals(missing.get(0)); | |
| 95 missing.remove(0); | |
| 96 result.addAll(missing); | |
| 97 } | |
| 98 ArrayList<Nodeid> rv = new ArrayList<Nodeid>(result); | |
| 99 return rv; | |
| 65 } | 100 } |
| 66 | 101 |
| 67 /** | 102 /** |
| 68 * Full information about incoming changes | 103 * Full information about incoming changes |
| 69 * | 104 * |
| 70 * @throws HgException | 105 * @throws HgException |
| 71 * @throws CancelledException | 106 * @throws CancelledException |
| 72 */ | 107 */ |
| 73 public void executeFull(HgLogCommand.Handler handler) throws HgException, CancelledException { | 108 public void executeFull(final HgLogCommand.Handler handler) throws HgException, CancelledException { |
| 74 throw HgRepository.notImplemented(); | 109 if (handler == null) { |
| 110 throw new IllegalArgumentException("Delegate can't be null"); | |
| 111 } | |
| 112 final List<Nodeid> common = getCommon(handler); | |
| 113 HgBundle changegroup = remoteRepo.getChanges(new LinkedList<Nodeid>(common)); | |
| 114 try { | |
| 115 changegroup.changes(localRepo, new HgChangelog.Inspector() { | |
| 116 private int localIndex; | |
| 117 private final HgChangelog.ParentWalker parentHelper; | |
| 118 private final ChangesetTransformer transformer; | |
| 119 private final HgChangelog changelog; | |
| 120 | |
| 121 { | |
| 122 transformer = new ChangesetTransformer(localRepo, handler); | |
| 123 parentHelper = getParentHelper(); | |
| 124 changelog = localRepo.getChangelog(); | |
| 125 } | |
| 126 | |
| 127 public void next(int revisionNumber, Nodeid nodeid, RawChangeset cset) { | |
| 128 if (parentHelper.knownNode(nodeid)) { | |
| 129 if (!common.contains(nodeid)) { | |
| 130 throw new HgBadStateException("Bundle shall not report known nodes other than roots we've supplied"); | |
| 131 } | |
| 132 localIndex = changelog.getLocalRevision(nodeid); | |
| 133 return; | |
| 134 } | |
| 135 transformer.next(++localIndex, nodeid, cset); | |
| 136 } | |
| 137 }); | |
| 138 } catch (IOException ex) { | |
| 139 throw new HgException(ex); | |
| 140 } | |
| 141 } | |
| 142 | |
| 143 private RepositoryComparator getComparator(Object context) throws HgException, CancelledException { | |
| 144 if (remoteRepo == null) { | |
| 145 throw new HgBadArgumentException("Shall specify remote repository to compare against", null); | |
| 146 } | |
| 147 if (comparator == null) { | |
| 148 comparator = new RepositoryComparator(getParentHelper(), remoteRepo); | |
| 149 comparator.compare(context); | |
| 150 } | |
| 151 return comparator; | |
| 152 } | |
| 153 | |
| 154 private HgChangelog.ParentWalker getParentHelper() { | |
| 155 if (parentHelper == null) { | |
| 156 parentHelper = localRepo.getChangelog().new ParentWalker(); | |
| 157 parentHelper.init(); | |
| 158 } | |
| 159 return parentHelper; | |
| 160 } | |
| 161 | |
| 162 private List<BranchChain> getMissingBranches(Object context) throws HgException, CancelledException { | |
| 163 if (missingBranches == null) { | |
| 164 missingBranches = getComparator(context).calculateMissingBranches(); | |
| 165 } | |
| 166 return missingBranches; | |
| 167 } | |
| 168 | |
| 169 private List<Nodeid> getCommon(Object context) throws HgException, CancelledException { | |
| 170 final LinkedHashSet<Nodeid> common = new LinkedHashSet<Nodeid>(); | |
| 171 // XXX common can be obtained from repoCompare, but at the moment it would almost duplicate work of calculateMissingBranches | |
| 172 // once I refactor latter, common shall be taken from repoCompare. | |
| 173 for (BranchChain bc : getMissingBranches(context)) { | |
| 174 common.add(bc.branchRoot); | |
| 175 } | |
| 176 return new LinkedList<Nodeid>(common); | |
| 75 } | 177 } |
| 76 } | 178 } |
