comparison cmdline/org/tmatesoft/hg/console/Incoming.java @ 206:63c9fed4369e

Sample command line tools for incoming/outgoing to use commands
author Artem Tikhomirov <tikhomirov.artem@gmail.com>
date Thu, 28 Apr 2011 02:47:44 +0200
parents e5407b5a586a
children ef8eba4aa215
comparison
equal deleted inserted replaced
205:ffc5f6d59f7e 206:63c9fed4369e
20 import java.util.Collections; 20 import java.util.Collections;
21 import java.util.Comparator; 21 import java.util.Comparator;
22 import java.util.HashSet; 22 import java.util.HashSet;
23 import java.util.Iterator; 23 import java.util.Iterator;
24 import java.util.LinkedHashMap; 24 import java.util.LinkedHashMap;
25 import java.util.LinkedHashSet;
26 import java.util.LinkedList; 25 import java.util.LinkedList;
27 import java.util.List; 26 import java.util.List;
28 import java.util.Map.Entry; 27 import java.util.Map.Entry;
29 28
30 import org.tmatesoft.hg.console.Outgoing.ChangesetFormatter; 29 import org.tmatesoft.hg.core.HgIncomingCommand;
31 import org.tmatesoft.hg.core.HgBadStateException; 30 import org.tmatesoft.hg.core.HgRepoFacade;
32 import org.tmatesoft.hg.core.Nodeid; 31 import org.tmatesoft.hg.core.Nodeid;
33 import org.tmatesoft.hg.internal.RepositoryComparator;
34 import org.tmatesoft.hg.internal.RepositoryComparator.BranchChain;
35 import org.tmatesoft.hg.repo.HgBundle;
36 import org.tmatesoft.hg.repo.HgChangelog;
37 import org.tmatesoft.hg.repo.HgChangelog.RawChangeset;
38 import org.tmatesoft.hg.repo.HgLookup; 32 import org.tmatesoft.hg.repo.HgLookup;
39 import org.tmatesoft.hg.repo.HgRemoteRepository; 33 import org.tmatesoft.hg.repo.HgRemoteRepository;
40 import org.tmatesoft.hg.repo.HgRepository;
41 34
42 35
43 /** 36 /**
44 * WORK IN PROGRESS, DO NOT USE 37 * <em>hg incoming</em> counterpart
45 * hg incoming counterpart
46 * 38 *
47 * @author Artem Tikhomirov 39 * @author Artem Tikhomirov
48 * @author TMate Software Ltd. 40 * @author TMate Software Ltd.
49 */ 41 */
50 public class Incoming { 42 public class Incoming {
53 if (Boolean.FALSE.booleanValue()) { 45 if (Boolean.FALSE.booleanValue()) {
54 new SequenceConstructor().test(); 46 new SequenceConstructor().test();
55 return; 47 return;
56 } 48 }
57 Options cmdLineOpts = Options.parse(args); 49 Options cmdLineOpts = Options.parse(args);
58 final HgRepository hgRepo = cmdLineOpts.findRepository(); 50 HgRepoFacade hgRepo = new HgRepoFacade();
59 if (hgRepo.isInvalid()) { 51 if (!hgRepo.init(cmdLineOpts.findRepository())) {
60 System.err.printf("Can't find repository in: %s\n", hgRepo.getLocation()); 52 System.err.printf("Can't find repository in: %s\n", hgRepo.getRepository().getLocation());
61 return; 53 return;
62 } 54 }
63 HgRemoteRepository hgRemote = new HgLookup().detectRemote(cmdLineOpts.getSingle(""), hgRepo); 55 HgRemoteRepository hgRemote = new HgLookup().detectRemote(cmdLineOpts.getSingle(""), hgRepo.getRepository());
64 if (hgRemote.isInvalid()) { 56 if (hgRemote.isInvalid()) {
65 System.err.printf("Remote repository %s is not valid", hgRemote.getLocation()); 57 System.err.printf("Remote repository %s is not valid", hgRemote.getLocation());
66 return; 58 return;
67 } 59 }
60 HgIncomingCommand cmd = hgRepo.createIncomingCommand();
61 cmd.against(hgRemote);
68 // 62 //
69 // in fact, all we need from changelog is set of all nodeids. However, since ParentWalker reuses same Nodeids, it's not too expensive 63 List<Nodeid> missing = cmd.executeLite(null);
70 // to reuse it here, XXX although later this may need to be refactored 64 Collections.reverse(missing); // useful to test output, from newer to older
71 final HgChangelog.ParentWalker pw = hgRepo.getChangelog().new ParentWalker(); 65 Outgoing.dump("Nodes to fetch:", missing);
72 pw.init();
73 //
74 RepositoryComparator repoCompare = new RepositoryComparator(pw, hgRemote);
75 repoCompare.compare(null);
76 List<BranchChain> missingBranches = repoCompare.calculateMissingBranches();
77 final LinkedHashSet<Nodeid> common = new LinkedHashSet<Nodeid>();
78 // XXX common can be obtained from repoCompare, but at the moment it would almost duplicate work of calculateMissingBranches
79 // once I refactor latter, common shall be taken from repoCompare.
80 for (BranchChain bc : missingBranches) {
81 bc.dump();
82 common.add(bc.branchRoot); // common known node
83 List<Nodeid> missing = repoCompare.visitBranches(bc);
84 assert bc.branchRoot.equals(missing.get(0));
85 missing.remove(0);
86 Collections.reverse(missing); // useful to test output, from newer to older
87 System.out.println("Nodes to fetch in this branch:");
88 for (Nodeid n : missing) {
89 if (pw.knownNode(n)) {
90 System.out.println("Erroneous to fetch:" + n);
91 } else {
92 System.out.println(n);
93 }
94 }
95 System.out.println("Branch done");
96 }
97 // 66 //
98 // Complete 67 // Complete
99 HgBundle changegroup = hgRemote.getChanges(new LinkedList<Nodeid>(common)); 68 final ChangesetDumpHandler h = new ChangesetDumpHandler(hgRepo.getRepository());
100 changegroup.changes(hgRepo, new HgChangelog.Inspector() { 69 h.complete(false); // this option looks up index of parent revision, done via repo.changelog (which doesn't have any of these new revisions)
101 private int localIndex; 70 // this can be fixed by tracking all nodeid->revision idx inside ChangesetDumpHandler, and refer to repo.changelog only when that mapping didn't work
102 private final ChangesetFormatter formatter = new ChangesetFormatter(); 71 h.verbose(cmdLineOpts.getBoolean("-v", "--verbose"));
103 72 cmd.executeFull(h);
104 public void next(int revisionNumber, Nodeid nodeid, RawChangeset cset) {
105 if (pw.knownNode(nodeid)) {
106 if (!common.contains(nodeid)) {
107 throw new HgBadStateException("Bundle shall not report known nodes other than roots we've supplied");
108 }
109 localIndex = hgRepo.getChangelog().getLocalRevision(nodeid);
110 return;
111 }
112 System.out.println(formatter.simple(++localIndex, nodeid, cset));
113 }
114 });
115 } 73 }
116 74
117 75
76 /*
77 * This is for investigation purposes only
78 */
118 private static class SequenceConstructor { 79 private static class SequenceConstructor {
119 80
120 private int[] between(int root, int head) { 81 private int[] between(int root, int head) {
121 if (head <= (root+1)) { 82 if (head <= (root+1)) {
122 return new int[0]; 83 return new int[0];