annotate mercurial/hg.py @ 249:619e775aa7f9

import and startup cleanups -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 import and startup cleanups add commands:run() add copyright notice to commands eliminate/reorganize imports to speed up start time: 0.5b: $ time bash -c 'for i in `seq 100`; do ~/bin/hg > /dev/null; done' real 0m7.718s user 0m6.719s sys 0m0.794s new: $ time bash -c 'for i in `seq 100`; do hg > /dev/null; done' real 0m2.171s user 0m1.684s sys 0m0.444s just python: $ time bash -c 'for i in `seq 100`; do python -c pass; done' real 0m0.988s user 0m0.771s sys 0m0.207s Ignoring the fixed cost of loading the Python interpreter, we're 5.6 times faster. With the Python load time, we're still 3.5 times faster. manifest hash: acce5882a55c76eb165316f5741724c8ce4ef587 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.0 (GNU/Linux) iD8DBQFCoihAywK+sNU5EO8RAqMdAJwMe6Ur0R9G6jjayNa5hH2C3c4k/gCeIYvc N178vaWWGciX9zq+g5qCAls= =buhv -----END PGP SIGNATURE-----
author mpm@selenic.com
date Sat, 04 Jun 2005 14:16:32 -0800
parents 863b508c5b36
children 3fd8fc14b12f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
1 # hg.py - repository classes for mercurial
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
2 #
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
3 # Copyright 2005 Matt Mackall <mpm@selenic.com>
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
4 #
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
5 # This software may be used and distributed according to the terms
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
6 # of the GNU General Public License, incorporated herein by reference.
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
7
249
619e775aa7f9 import and startup cleanups
mpm@selenic.com
parents: 247
diff changeset
8 import sys, struct, os
619e775aa7f9 import and startup cleanups
mpm@selenic.com
parents: 247
diff changeset
9 from mercurial import lock
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
10 from mercurial.transaction import *
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
11 from mercurial.revlog import *
79
837d473d54d5 Add basic annotation support
mpm@selenic.com
parents: 78
diff changeset
12 from difflib import SequenceMatcher
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
13
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
14 class filelog(revlog):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
15 def __init__(self, opener, path):
144
ea9188538222 Fix transaction handling bug by reverting fileopener change
mpm@selenic.com
parents: 140
diff changeset
16 revlog.__init__(self, opener,
ea9188538222 Fix transaction handling bug by reverting fileopener change
mpm@selenic.com
parents: 140
diff changeset
17 os.path.join("data", path + ".i"),
ea9188538222 Fix transaction handling bug by reverting fileopener change
mpm@selenic.com
parents: 140
diff changeset
18 os.path.join("data", path + ".d"))
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
19
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
20 def read(self, node):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
21 return self.revision(node)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
22 def add(self, text, transaction, link, p1=None, p2=None):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
23 return self.addrevision(text, transaction, link, p1, p2)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
24
79
837d473d54d5 Add basic annotation support
mpm@selenic.com
parents: 78
diff changeset
25 def annotate(self, node):
199
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
26
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
27 def decorate(text, rev):
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
28 return [(rev, l) for l in text.splitlines(1)]
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
29
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
30 def strip(annotation):
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
31 return [e[1] for e in annotation]
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
32
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
33 def pair(parent, child):
109
95699294f580 Annotate was being too clever trying to work in place, and triggering
mpm@selenic.com
parents: 107
diff changeset
34 new = []
199
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
35 sm = SequenceMatcher(None, strip(parent), strip(child))
79
837d473d54d5 Add basic annotation support
mpm@selenic.com
parents: 78
diff changeset
36 for o, m, n, s, t in sm.get_opcodes():
109
95699294f580 Annotate was being too clever trying to work in place, and triggering
mpm@selenic.com
parents: 107
diff changeset
37 if o == 'equal':
199
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
38 new += parent[m:n]
109
95699294f580 Annotate was being too clever trying to work in place, and triggering
mpm@selenic.com
parents: 107
diff changeset
39 else:
199
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
40 new += child[s:t]
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
41 return new
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
42
200
8450c18f2a45 annotate: memory efficiency
mpm@selenic.com
parents: 199
diff changeset
43 # find all ancestors
216
201115f2859b hg annotate: actually annotate the given version
mpm@selenic.com
parents: 210
diff changeset
44 needed = {node:1}
199
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
45 visit = [node]
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
46 while visit:
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
47 n = visit.pop(0)
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
48 for p in self.parents(n):
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
49 if p not in needed:
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
50 needed[p] = 1
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
51 visit.append(p)
200
8450c18f2a45 annotate: memory efficiency
mpm@selenic.com
parents: 199
diff changeset
52 else:
8450c18f2a45 annotate: memory efficiency
mpm@selenic.com
parents: 199
diff changeset
53 # count how many times we'll use this
8450c18f2a45 annotate: memory efficiency
mpm@selenic.com
parents: 199
diff changeset
54 needed[p] += 1
199
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
55
200
8450c18f2a45 annotate: memory efficiency
mpm@selenic.com
parents: 199
diff changeset
56 # sort by revision which is a topological order
199
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
57 visit = needed.keys()
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
58 visit = [ (self.rev(n), n) for n in visit ]
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
59 visit.sort()
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
60 visit = [ p[1] for p in visit ]
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
61 hist = {}
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
62
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
63 for n in visit:
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
64 curr = decorate(self.read(n), self.linkrev(n))
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
65 for p in self.parents(n):
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
66 if p != nullid:
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
67 curr = pair(hist[p], curr)
200
8450c18f2a45 annotate: memory efficiency
mpm@selenic.com
parents: 199
diff changeset
68 # trim the history of unneeded revs
8450c18f2a45 annotate: memory efficiency
mpm@selenic.com
parents: 199
diff changeset
69 needed[p] -= 1
8450c18f2a45 annotate: memory efficiency
mpm@selenic.com
parents: 199
diff changeset
70 if not needed[p]:
8450c18f2a45 annotate: memory efficiency
mpm@selenic.com
parents: 199
diff changeset
71 del hist[p]
199
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
72 hist[n] = curr
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
73
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
74 return hist[n]
79
837d473d54d5 Add basic annotation support
mpm@selenic.com
parents: 78
diff changeset
75
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
76 class manifest(revlog):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
77 def __init__(self, opener):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
78 self.mapcache = None
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
79 self.listcache = None
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
80 self.addlist = None
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
81 revlog.__init__(self, opener, "00manifest.i", "00manifest.d")
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
82
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
83 def read(self, node):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
84 if self.mapcache and self.mapcache[0] == node:
90
ab9ebff09dcd Fix manifest merge swap bug
mpm@selenic.com
parents: 85
diff changeset
85 return self.mapcache[1].copy()
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
86 text = self.revision(node)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
87 map = {}
25
daa724b27300 Fix corruption from manifest.listcache optimization
mpm@selenic.com
parents: 20
diff changeset
88 self.listcache = (text, text.splitlines(1))
daa724b27300 Fix corruption from manifest.listcache optimization
mpm@selenic.com
parents: 20
diff changeset
89 for l in self.listcache[1]:
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
90 (f, n) = l.split('\0')
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
91 map[f] = bin(n[:40])
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
92 self.mapcache = (node, map)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
93 return map
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
94
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
95 def diff(self, a, b):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
96 # this is sneaky, as we're not actually using a and b
140
30ef77113872 Minor safety checks to manifest diff
mpm@selenic.com
parents: 118
diff changeset
97 if self.listcache and self.addlist and self.listcache[0] == a:
98
3dde7c87e36d Add paranoia to diff code
mpm@selenic.com
parents: 96
diff changeset
98 d = mdiff.diff(self.listcache[1], self.addlist, 1)
3dde7c87e36d Add paranoia to diff code
mpm@selenic.com
parents: 96
diff changeset
99 if mdiff.patch(a, d) != b:
3dde7c87e36d Add paranoia to diff code
mpm@selenic.com
parents: 96
diff changeset
100 sys.stderr.write("*** sortdiff failed, falling back ***\n")
3dde7c87e36d Add paranoia to diff code
mpm@selenic.com
parents: 96
diff changeset
101 return mdiff.textdiff(a, b)
3dde7c87e36d Add paranoia to diff code
mpm@selenic.com
parents: 96
diff changeset
102 return d
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
103 else:
44
e825a68d7227 Fix occassional diff bug with manifests
mpm@selenic.com
parents: 40
diff changeset
104 return mdiff.textdiff(a, b)
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
105
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
106 def add(self, map, transaction, link, p1=None, p2=None):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
107 files = map.keys()
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
108 files.sort()
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
109
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
110 self.addlist = ["%s\000%s\n" % (f, hex(map[f])) for f in files]
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
111 text = "".join(self.addlist)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
112
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
113 n = self.addrevision(text, transaction, link, p1, p2)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
114 self.mapcache = (n, map)
25
daa724b27300 Fix corruption from manifest.listcache optimization
mpm@selenic.com
parents: 20
diff changeset
115 self.listcache = (text, self.addlist)
140
30ef77113872 Minor safety checks to manifest diff
mpm@selenic.com
parents: 118
diff changeset
116 self.addlist = None
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
117
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
118 return n
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
119
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
120 class changelog(revlog):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
121 def __init__(self, opener):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
122 revlog.__init__(self, opener, "00changelog.i", "00changelog.d")
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
123
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
124 def extract(self, text):
37
a8811676c85a Move hex/bin bits to revlog
mpm@selenic.com
parents: 33
diff changeset
125 if not text:
40
5f87633e1ea2 Date is an int as a string in changelog
mpm@selenic.com
parents: 37
diff changeset
126 return (nullid, "", "0", [], "")
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
127 last = text.index("\n\n")
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
128 desc = text[last + 2:]
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
129 l = text[:last].splitlines()
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
130 manifest = bin(l[0])
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
131 user = l[1]
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
132 date = l[2]
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
133 files = l[3:]
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
134 return (manifest, user, date, files, desc)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
135
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
136 def read(self, node):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
137 return self.extract(self.revision(node))
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
138
203
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
139 def add(self, manifest, list, desc, transaction, p1=None, p2=None,
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
140 user=None, date=None):
249
619e775aa7f9 import and startup cleanups
mpm@selenic.com
parents: 247
diff changeset
141 import socket, time
203
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
142 user = (user or
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
143 os.environ.get("HGUSER") or
55
2add70d51441 From: Thomas Arendsen Hein <thomas@intevation.de>
mpm@selenic.com
parents: 48
diff changeset
144 os.environ.get("EMAIL") or
2add70d51441 From: Thomas Arendsen Hein <thomas@intevation.de>
mpm@selenic.com
parents: 48
diff changeset
145 os.environ.get("LOGNAME", "unknown") + '@' + socket.getfqdn())
203
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
146 date = date or "%d %d" % (time.time(), time.timezone)
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
147 list.sort()
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
148 l = [hex(manifest), user, date] + list + ["", desc]
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
149 text = "\n".join(l)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
150 return self.addrevision(text, transaction, self.count(), p1, p2)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
151
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
152 class dirstate:
244
43105253cf5e root relative IO and valid commit states
mpm@selenic.com
parents: 241
diff changeset
153 def __init__(self, opener, ui, root):
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
154 self.opener = opener
244
43105253cf5e root relative IO and valid commit states
mpm@selenic.com
parents: 241
diff changeset
155 self.root = root
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
156 self.dirty = 0
20
a664c2b624cf The actual hg remove fix from Thomas Hein
mpm@selenic.com
parents: 19
diff changeset
157 self.ui = ui
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
158 self.map = None
227
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
159 self.pl = None
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
160
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
161 def __del__(self):
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
162 if self.dirty:
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
163 self.write()
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
164
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
165 def __getitem__(self, key):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
166 try:
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
167 return self.map[key]
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
168 except TypeError:
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
169 self.read()
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
170 return self[key]
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
171
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
172 def __contains__(self, key):
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
173 if not self.map: self.read()
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
174 return key in self.map
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
175
227
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
176 def parents(self):
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
177 if not self.pl:
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
178 self.read()
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
179 return self.pl
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
180
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
181 def setparents(self, p1, p2 = nullid):
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
182 self.dirty = 1
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
183 self.pl = p1, p2
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
184
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
185 def state(self, key):
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
186 try:
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
187 return self[key][0]
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
188 except KeyError:
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
189 return "?"
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
190
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
191 def read(self):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
192 if self.map is not None: return self.map
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
193
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
194 self.map = {}
227
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
195 self.pl = [nullid, nullid]
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
196 try:
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
197 st = self.opener("dirstate").read()
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
198 except: return
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
199
227
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
200 self.pl = [st[:20], st[20: 40]]
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
201
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
202 pos = 40
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
203 while pos < len(st):
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
204 e = struct.unpack(">cllll", st[pos:pos+17])
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
205 l = e[4]
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
206 pos += 17
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
207 f = st[pos:pos + l]
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
208 self.map[f] = e[:4]
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
209 pos += l
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
210
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
211 def update(self, files, state):
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
212 ''' current states:
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
213 n normal
231
15e7c6cee929 add 'm' state to dirstates
mpm@selenic.com
parents: 230
diff changeset
214 m needs merging
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
215 i invalid
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
216 r marked for removal
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
217 a marked for addition'''
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
218
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
219 if not files: return
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
220 self.read()
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
221 self.dirty = 1
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
222 for f in files:
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
223 if state == "r":
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
224 self.map[f] = ('r', 0, 0, 0)
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
225 else:
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
226 try:
244
43105253cf5e root relative IO and valid commit states
mpm@selenic.com
parents: 241
diff changeset
227 s = os.stat(os.path.join(self.root, f))
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
228 self.map[f] = (state, s.st_mode, s.st_size, s.st_mtime)
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
229 except OSError:
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
230 if state != "i": raise
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
231 self.map[f] = ('r', 0, 0, 0)
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
232
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
233 def forget(self, files):
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
234 if not files: return
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
235 self.read()
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
236 self.dirty = 1
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
237 for f in files:
20
a664c2b624cf The actual hg remove fix from Thomas Hein
mpm@selenic.com
parents: 19
diff changeset
238 try:
a664c2b624cf The actual hg remove fix from Thomas Hein
mpm@selenic.com
parents: 19
diff changeset
239 del self.map[f]
a664c2b624cf The actual hg remove fix from Thomas Hein
mpm@selenic.com
parents: 19
diff changeset
240 except KeyError:
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
241 self.ui.warn("not in dirstate: %s!\n" % f)
20
a664c2b624cf The actual hg remove fix from Thomas Hein
mpm@selenic.com
parents: 19
diff changeset
242 pass
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
243
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
244 def clear(self):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
245 self.map = {}
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
246 self.dirty = 1
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
247
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
248 def write(self):
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
249 st = self.opener("dirstate", "w")
227
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
250 st.write("".join(self.pl))
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
251 for f, e in self.map.items():
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
252 e = struct.pack(">cllll", e[0], e[1], e[2], e[3], len(f))
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
253 st.write(e + f)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
254 self.dirty = 0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
255
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
256 def copy(self):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
257 self.read()
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
258 return self.map.copy()
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
259
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
260 # used to avoid circular references so destructors work
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
261 def opener(base):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
262 p = base
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
263 def o(path, mode="r"):
15
6daf7757e92b Fix network pull of repo files with "%" in their base64 encoding.
mpm@selenic.com
parents: 10
diff changeset
264 if p[:7] == "http://":
6daf7757e92b Fix network pull of repo files with "%" in their base64 encoding.
mpm@selenic.com
parents: 10
diff changeset
265 f = os.path.join(p, urllib.quote(path))
6daf7757e92b Fix network pull of repo files with "%" in their base64 encoding.
mpm@selenic.com
parents: 10
diff changeset
266 return httprangereader(f)
6daf7757e92b Fix network pull of repo files with "%" in their base64 encoding.
mpm@selenic.com
parents: 10
diff changeset
267
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
268 f = os.path.join(p, path)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
269
110
c37c7f784ee3 Move hg from storing files in data with base64 encoding to full
mpm@selenic.com
parents: 109
diff changeset
270 if mode != "r":
c37c7f784ee3 Move hg from storing files in data with base64 encoding to full
mpm@selenic.com
parents: 109
diff changeset
271 try:
c37c7f784ee3 Move hg from storing files in data with base64 encoding to full
mpm@selenic.com
parents: 109
diff changeset
272 s = os.stat(f)
c37c7f784ee3 Move hg from storing files in data with base64 encoding to full
mpm@selenic.com
parents: 109
diff changeset
273 except OSError:
c37c7f784ee3 Move hg from storing files in data with base64 encoding to full
mpm@selenic.com
parents: 109
diff changeset
274 d = os.path.dirname(f)
c37c7f784ee3 Move hg from storing files in data with base64 encoding to full
mpm@selenic.com
parents: 109
diff changeset
275 if not os.path.isdir(d):
c37c7f784ee3 Move hg from storing files in data with base64 encoding to full
mpm@selenic.com
parents: 109
diff changeset
276 os.makedirs(d)
c37c7f784ee3 Move hg from storing files in data with base64 encoding to full
mpm@selenic.com
parents: 109
diff changeset
277 else:
c37c7f784ee3 Move hg from storing files in data with base64 encoding to full
mpm@selenic.com
parents: 109
diff changeset
278 if s.st_nlink > 1:
c37c7f784ee3 Move hg from storing files in data with base64 encoding to full
mpm@selenic.com
parents: 109
diff changeset
279 file(f + ".tmp", "w").write(file(f).read())
c37c7f784ee3 Move hg from storing files in data with base64 encoding to full
mpm@selenic.com
parents: 109
diff changeset
280 os.rename(f+".tmp", f)
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
281
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
282 return file(f, mode)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
283
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
284 return o
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
285
60
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
286 class localrepository:
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
287 def __init__(self, ui, path=None, create=0):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
288 self.remote = 0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
289 if path and path[:7] == "http://":
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
290 self.remote = 1
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
291 self.path = path
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
292 else:
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
293 if not path:
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
294 p = os.getcwd()
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
295 while not os.path.isdir(os.path.join(p, ".hg")):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
296 p = os.path.dirname(p)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
297 if p == "/": raise "No repo found"
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
298 path = p
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
299 self.path = os.path.join(path, ".hg")
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
300
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
301 self.root = path
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
302 self.ui = ui
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
303
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
304 if create:
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
305 os.mkdir(self.path)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
306 os.mkdir(self.join("data"))
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
307
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
308 self.opener = opener(self.path)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
309 self.manifest = manifest(self.opener)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
310 self.changelog = changelog(self.opener)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
311 self.ignorelist = None
67
a182f2561c8e Add tag support
mpm@selenic.com
parents: 65
diff changeset
312 self.tags = None
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
313
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
314 if not self.remote:
244
43105253cf5e root relative IO and valid commit states
mpm@selenic.com
parents: 241
diff changeset
315 self.dirstate = dirstate(self.opener, ui, self.root)
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
316
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
317 def ignore(self, f):
249
619e775aa7f9 import and startup cleanups
mpm@selenic.com
parents: 247
diff changeset
318 import re
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
319 if self.ignorelist is None:
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
320 self.ignorelist = []
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
321 try:
67
a182f2561c8e Add tag support
mpm@selenic.com
parents: 65
diff changeset
322 l = open(os.path.join(self.root, ".hgignore"))
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
323 for pat in l:
9
b4d0c3786ad3 Ignore empty ignore patterns
mpm@selenic.com
parents: 4
diff changeset
324 if pat != "\n":
b4d0c3786ad3 Ignore empty ignore patterns
mpm@selenic.com
parents: 4
diff changeset
325 self.ignorelist.append(re.compile(pat[:-1]))
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
326 except IOError: pass
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
327 for pat in self.ignorelist:
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
328 if pat.search(f): return True
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
329 return False
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
330
67
a182f2561c8e Add tag support
mpm@selenic.com
parents: 65
diff changeset
331 def lookup(self, key):
a182f2561c8e Add tag support
mpm@selenic.com
parents: 65
diff changeset
332 if self.tags is None:
a182f2561c8e Add tag support
mpm@selenic.com
parents: 65
diff changeset
333 self.tags = {}
a182f2561c8e Add tag support
mpm@selenic.com
parents: 65
diff changeset
334 try:
a182f2561c8e Add tag support
mpm@selenic.com
parents: 65
diff changeset
335 fl = self.file(".hgtags")
a182f2561c8e Add tag support
mpm@selenic.com
parents: 65
diff changeset
336 for l in fl.revision(fl.tip()).splitlines():
a182f2561c8e Add tag support
mpm@selenic.com
parents: 65
diff changeset
337 if l:
a182f2561c8e Add tag support
mpm@selenic.com
parents: 65
diff changeset
338 n, k = l.split(" ")
a182f2561c8e Add tag support
mpm@selenic.com
parents: 65
diff changeset
339 self.tags[k] = bin(n)
a182f2561c8e Add tag support
mpm@selenic.com
parents: 65
diff changeset
340 except KeyError: pass
a182f2561c8e Add tag support
mpm@selenic.com
parents: 65
diff changeset
341 try:
a182f2561c8e Add tag support
mpm@selenic.com
parents: 65
diff changeset
342 return self.tags[key]
a182f2561c8e Add tag support
mpm@selenic.com
parents: 65
diff changeset
343 except KeyError:
a182f2561c8e Add tag support
mpm@selenic.com
parents: 65
diff changeset
344 return self.changelog.lookup(key)
a182f2561c8e Add tag support
mpm@selenic.com
parents: 65
diff changeset
345
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
346 def join(self, f):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
347 return os.path.join(self.path, f)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
348
244
43105253cf5e root relative IO and valid commit states
mpm@selenic.com
parents: 241
diff changeset
349 def wjoin(self, f):
43105253cf5e root relative IO and valid commit states
mpm@selenic.com
parents: 241
diff changeset
350 return os.path.join(self.root, f)
43105253cf5e root relative IO and valid commit states
mpm@selenic.com
parents: 241
diff changeset
351
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
352 def file(self, f):
192
5d8553352d2e Changes to network protocol
mpm@selenic.com
parents: 191
diff changeset
353 if f[0] == '/': f = f[1:]
144
ea9188538222 Fix transaction handling bug by reverting fileopener change
mpm@selenic.com
parents: 140
diff changeset
354 return filelog(self.opener, f)
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
355
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
356 def transaction(self):
95
589f507bb259 Beginnings of transaction undo support
mpm@selenic.com
parents: 94
diff changeset
357 return transaction(self.opener, self.join("journal"),
589f507bb259 Beginnings of transaction undo support
mpm@selenic.com
parents: 94
diff changeset
358 self.join("undo"))
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
359
210
d2badbd7d1ad hg undo: fixup working dir state
mpm@selenic.com
parents: 207
diff changeset
360 def recover(self):
225
1651a3e61925 fix repo locking
mpm@selenic.com
parents: 224
diff changeset
361 lock = self.lock()
210
d2badbd7d1ad hg undo: fixup working dir state
mpm@selenic.com
parents: 207
diff changeset
362 if os.path.exists(self.join("recover")):
d2badbd7d1ad hg undo: fixup working dir state
mpm@selenic.com
parents: 207
diff changeset
363 self.ui.status("attempting to rollback interrupted transaction\n")
d2badbd7d1ad hg undo: fixup working dir state
mpm@selenic.com
parents: 207
diff changeset
364 return rollback(self.opener, self.join("recover"))
d2badbd7d1ad hg undo: fixup working dir state
mpm@selenic.com
parents: 207
diff changeset
365 else:
d2badbd7d1ad hg undo: fixup working dir state
mpm@selenic.com
parents: 207
diff changeset
366 self.ui.warn("no interrupted transaction available\n")
d2badbd7d1ad hg undo: fixup working dir state
mpm@selenic.com
parents: 207
diff changeset
367
d2badbd7d1ad hg undo: fixup working dir state
mpm@selenic.com
parents: 207
diff changeset
368 def undo(self):
225
1651a3e61925 fix repo locking
mpm@selenic.com
parents: 224
diff changeset
369 lock = self.lock()
210
d2badbd7d1ad hg undo: fixup working dir state
mpm@selenic.com
parents: 207
diff changeset
370 if os.path.exists(self.join("undo")):
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
371 f = self.changelog.read(self.changelog.tip())[3]
210
d2badbd7d1ad hg undo: fixup working dir state
mpm@selenic.com
parents: 207
diff changeset
372 self.ui.status("attempting to rollback last transaction\n")
d2badbd7d1ad hg undo: fixup working dir state
mpm@selenic.com
parents: 207
diff changeset
373 rollback(self.opener, self.join("undo"))
d2badbd7d1ad hg undo: fixup working dir state
mpm@selenic.com
parents: 207
diff changeset
374 self.manifest = manifest(self.opener)
d2badbd7d1ad hg undo: fixup working dir state
mpm@selenic.com
parents: 207
diff changeset
375 self.changelog = changelog(self.opener)
d2badbd7d1ad hg undo: fixup working dir state
mpm@selenic.com
parents: 207
diff changeset
376
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
377 self.ui.status("discarding dirstate\n")
210
d2badbd7d1ad hg undo: fixup working dir state
mpm@selenic.com
parents: 207
diff changeset
378 node = self.changelog.tip()
d2badbd7d1ad hg undo: fixup working dir state
mpm@selenic.com
parents: 207
diff changeset
379 f.sort()
d2badbd7d1ad hg undo: fixup working dir state
mpm@selenic.com
parents: 207
diff changeset
380
227
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
381 self.dirstate.setparents(node)
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
382 self.dirstate.update(f, 'i')
210
d2badbd7d1ad hg undo: fixup working dir state
mpm@selenic.com
parents: 207
diff changeset
383
163
f38c90953c2c Make undo and recover friendlier
mpm@selenic.com
parents: 162
diff changeset
384 else:
210
d2badbd7d1ad hg undo: fixup working dir state
mpm@selenic.com
parents: 207
diff changeset
385 self.ui.warn("no undo information available\n")
162
5dcbe4d9a30c Implement recover and undo commands
mpm@selenic.com
parents: 161
diff changeset
386
161
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents: 155
diff changeset
387 def lock(self, wait = 1):
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents: 155
diff changeset
388 try:
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents: 155
diff changeset
389 return lock.lock(self.join("lock"), 0)
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents: 155
diff changeset
390 except lock.LockHeld, inst:
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents: 155
diff changeset
391 if wait:
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents: 155
diff changeset
392 self.ui.warn("waiting for lock held by %s\n" % inst.args[0])
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents: 155
diff changeset
393 return lock.lock(self.join("lock"), wait)
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents: 155
diff changeset
394 raise inst
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents: 155
diff changeset
395
203
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
396 def rawcommit(self, files, text, user, date, p1=None, p2=None):
228
2502aa663484 teach rawcommit about dirstate.parents()
mpm@selenic.com
parents: 227
diff changeset
397 p1 = p1 or self.dirstate.parents()[0] or nullid
2502aa663484 teach rawcommit about dirstate.parents()
mpm@selenic.com
parents: 227
diff changeset
398 p2 = p2 or self.dirstate.parents()[1] or nullid
203
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
399 pchange = self.changelog.read(p1)
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
400 pmmap = self.manifest.read(pchange[0])
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
401 tr = self.transaction()
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
402 mmap = {}
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
403 linkrev = self.changelog.count()
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
404 for f in files:
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
405 try:
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
406 t = file(f).read()
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
407 except IOError:
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
408 self.ui.warn("Read file %s error, skipped\n" % f)
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
409 continue
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
410 r = self.file(f)
228
2502aa663484 teach rawcommit about dirstate.parents()
mpm@selenic.com
parents: 227
diff changeset
411 # FIXME - need to find both parents properly
203
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
412 prev = pmmap.get(f, nullid)
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
413 mmap[f] = r.add(t, tr, linkrev, prev)
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
414
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
415 mnode = self.manifest.add(mmap, tr, linkrev, pchange[0])
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
416 n = self.changelog.add(mnode, files, text, tr, p1, p2, user ,date, )
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
417 tr.close()
228
2502aa663484 teach rawcommit about dirstate.parents()
mpm@selenic.com
parents: 227
diff changeset
418 self.dirstate.setparents(p1, p2)
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
419 self.dirstate.clear()
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
420 self.dirstate.update(mmap.keys(), "n")
203
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
421
229
1b11da6ee69e teach commit about dirstate.parents()
mpm@selenic.com
parents: 228
diff changeset
422 def commit(self, files = None, text = ""):
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
423 commit = []
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
424 remove = []
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
425 if files:
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
426 for f in files:
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
427 s = self.dirstate.state(f)
244
43105253cf5e root relative IO and valid commit states
mpm@selenic.com
parents: 241
diff changeset
428 if s in 'nmai':
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
429 commit.append(f)
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
430 elif s == 'r':
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
431 remove.append(f)
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
432 else:
244
43105253cf5e root relative IO and valid commit states
mpm@selenic.com
parents: 241
diff changeset
433 self.ui.warn("%s not tracked!\n" % f)
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
434 else:
230
00ea3613f82c make diffdir default to dirstate.parents()
mpm@selenic.com
parents: 229
diff changeset
435 (c, a, d, u) = self.diffdir(self.root)
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
436 commit = c + a
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
437 remove = d
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
438
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
439 if not commit and not remove:
151
1f6c61a60586 Bail on attempts to do an empty commit
mpm@selenic.com
parents: 149
diff changeset
440 self.ui.status("nothing changed\n")
1f6c61a60586 Bail on attempts to do an empty commit
mpm@selenic.com
parents: 149
diff changeset
441 return
1f6c61a60586 Bail on attempts to do an empty commit
mpm@selenic.com
parents: 149
diff changeset
442
229
1b11da6ee69e teach commit about dirstate.parents()
mpm@selenic.com
parents: 228
diff changeset
443 p1, p2 = self.dirstate.parents()
1b11da6ee69e teach commit about dirstate.parents()
mpm@selenic.com
parents: 228
diff changeset
444 c1 = self.changelog.read(p1)
1b11da6ee69e teach commit about dirstate.parents()
mpm@selenic.com
parents: 228
diff changeset
445 c2 = self.changelog.read(p2)
1b11da6ee69e teach commit about dirstate.parents()
mpm@selenic.com
parents: 228
diff changeset
446 m1 = self.manifest.read(c1[0])
1b11da6ee69e teach commit about dirstate.parents()
mpm@selenic.com
parents: 228
diff changeset
447 m2 = self.manifest.read(c2[0])
225
1651a3e61925 fix repo locking
mpm@selenic.com
parents: 224
diff changeset
448 lock = self.lock()
151
1f6c61a60586 Bail on attempts to do an empty commit
mpm@selenic.com
parents: 149
diff changeset
449 tr = self.transaction()
1f6c61a60586 Bail on attempts to do an empty commit
mpm@selenic.com
parents: 149
diff changeset
450
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
451 # check in files
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
452 new = {}
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
453 linkrev = self.changelog.count()
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
454 commit.sort()
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
455 for f in commit:
83
9fd5b35cfc45 Add -q quiet option
mpm@selenic.com
parents: 79
diff changeset
456 self.ui.note(f + "\n")
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
457 try:
244
43105253cf5e root relative IO and valid commit states
mpm@selenic.com
parents: 241
diff changeset
458 t = file(self.wjoin(f)).read()
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
459 except IOError:
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
460 self.warn("trouble committing %s!\n" % f)
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
461 raise
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
462
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
463 r = self.file(f)
229
1b11da6ee69e teach commit about dirstate.parents()
mpm@selenic.com
parents: 228
diff changeset
464 fp1 = m1.get(f, nullid)
1b11da6ee69e teach commit about dirstate.parents()
mpm@selenic.com
parents: 228
diff changeset
465 fp2 = m2.get(f, nullid)
1b11da6ee69e teach commit about dirstate.parents()
mpm@selenic.com
parents: 228
diff changeset
466 new[f] = r.add(t, tr, linkrev, fp1, fp2)
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
467
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
468 # update manifest
229
1b11da6ee69e teach commit about dirstate.parents()
mpm@selenic.com
parents: 228
diff changeset
469 m1.update(new)
1b11da6ee69e teach commit about dirstate.parents()
mpm@selenic.com
parents: 228
diff changeset
470 for f in remove: del m1[f]
1b11da6ee69e teach commit about dirstate.parents()
mpm@selenic.com
parents: 228
diff changeset
471 mn = self.manifest.add(m1, tr, linkrev, c1[0], c2[0])
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
472
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
473 # add changeset
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
474 new = new.keys()
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
475 new.sort()
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
476
229
1b11da6ee69e teach commit about dirstate.parents()
mpm@selenic.com
parents: 228
diff changeset
477 edittext = text + "\n" + "HG: manifest hash %s\n" % hex(mn)
185
db3aa85b9379 Add manifest hash to commit messages for easy signing
mpm@selenic.com
parents: 182
diff changeset
478 edittext += "".join(["HG: changed %s\n" % f for f in new])
25
daa724b27300 Fix corruption from manifest.listcache optimization
mpm@selenic.com
parents: 20
diff changeset
479 edittext += "".join(["HG: removed %s\n" % f for f in remove])
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
480 edittext = self.ui.edit(edittext)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
481
229
1b11da6ee69e teach commit about dirstate.parents()
mpm@selenic.com
parents: 228
diff changeset
482 n = self.changelog.add(mn, new, edittext, tr, p1, p2)
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
483 tr.close()
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
484
229
1b11da6ee69e teach commit about dirstate.parents()
mpm@selenic.com
parents: 228
diff changeset
485 self.dirstate.setparents(n)
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
486 self.dirstate.update(new, "n")
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
487 self.dirstate.forget(remove)
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
488
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
489 def checkout(self, node):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
490 # checkout is really dumb at the moment
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
491 # it ought to basically merge
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
492 change = self.changelog.read(node)
114
82fb6d09f911 Simplify checkout slightly, replace checkdir with os.makedirs
mpm@selenic.com
parents: 113
diff changeset
493 l = self.manifest.read(change[0]).items()
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
494 l.sort()
114
82fb6d09f911 Simplify checkout slightly, replace checkdir with os.makedirs
mpm@selenic.com
parents: 113
diff changeset
495
82fb6d09f911 Simplify checkout slightly, replace checkdir with os.makedirs
mpm@selenic.com
parents: 113
diff changeset
496 for f,n in l:
82fb6d09f911 Simplify checkout slightly, replace checkdir with os.makedirs
mpm@selenic.com
parents: 113
diff changeset
497 if f[0] == "/": continue
82fb6d09f911 Simplify checkout slightly, replace checkdir with os.makedirs
mpm@selenic.com
parents: 113
diff changeset
498 self.ui.note(f, "\n")
82fb6d09f911 Simplify checkout slightly, replace checkdir with os.makedirs
mpm@selenic.com
parents: 113
diff changeset
499 t = self.file(f).revision(n)
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
500 try:
244
43105253cf5e root relative IO and valid commit states
mpm@selenic.com
parents: 241
diff changeset
501 file(self.wjoin(f), "w").write(t)
114
82fb6d09f911 Simplify checkout slightly, replace checkdir with os.makedirs
mpm@selenic.com
parents: 113
diff changeset
502 except IOError:
82fb6d09f911 Simplify checkout slightly, replace checkdir with os.makedirs
mpm@selenic.com
parents: 113
diff changeset
503 os.makedirs(os.path.dirname(f))
244
43105253cf5e root relative IO and valid commit states
mpm@selenic.com
parents: 241
diff changeset
504 file(self.wjoin(f), "w").write(t)
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
505
227
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
506 self.dirstate.setparents(node)
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
507 self.dirstate.clear()
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
508 self.dirstate.update([f for f,n in l], "n")
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
509
230
00ea3613f82c make diffdir default to dirstate.parents()
mpm@selenic.com
parents: 229
diff changeset
510 def diffdir(self, path, changeset = None):
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
511 changed = []
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
512 added = []
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
513 unknown = []
4
ce3bd728b858 Fix exception handling for reading current working version
mpm@selenic.com
parents: 0
diff changeset
514 mf = {}
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
515
29
4d3a5dcb6972 Make diffdir take a revision argument
mpm@selenic.com
parents: 25
diff changeset
516 if changeset:
4d3a5dcb6972 Make diffdir take a revision argument
mpm@selenic.com
parents: 25
diff changeset
517 change = self.changelog.read(changeset)
4
ce3bd728b858 Fix exception handling for reading current working version
mpm@selenic.com
parents: 0
diff changeset
518 mf = self.manifest.read(change[0])
230
00ea3613f82c make diffdir default to dirstate.parents()
mpm@selenic.com
parents: 229
diff changeset
519 dc = dict.fromkeys(mf)
00ea3613f82c make diffdir default to dirstate.parents()
mpm@selenic.com
parents: 229
diff changeset
520 else:
00ea3613f82c make diffdir default to dirstate.parents()
mpm@selenic.com
parents: 229
diff changeset
521 changeset = self.dirstate.parents()[0]
00ea3613f82c make diffdir default to dirstate.parents()
mpm@selenic.com
parents: 229
diff changeset
522 change = self.changelog.read(changeset)
00ea3613f82c make diffdir default to dirstate.parents()
mpm@selenic.com
parents: 229
diff changeset
523 mf = self.manifest.read(change[0])
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
524 dc = self.dirstate.copy()
29
4d3a5dcb6972 Make diffdir take a revision argument
mpm@selenic.com
parents: 25
diff changeset
525
4d3a5dcb6972 Make diffdir take a revision argument
mpm@selenic.com
parents: 25
diff changeset
526 def fcmp(fn):
244
43105253cf5e root relative IO and valid commit states
mpm@selenic.com
parents: 241
diff changeset
527 t1 = file(self.wjoin(fn)).read()
29
4d3a5dcb6972 Make diffdir take a revision argument
mpm@selenic.com
parents: 25
diff changeset
528 t2 = self.file(fn).revision(mf[fn])
4d3a5dcb6972 Make diffdir take a revision argument
mpm@selenic.com
parents: 25
diff changeset
529 return cmp(t1, t2)
4d3a5dcb6972 Make diffdir take a revision argument
mpm@selenic.com
parents: 25
diff changeset
530
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
531 for dir, subdirs, files in os.walk(self.root):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
532 d = dir[len(self.root)+1:]
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
533 if ".hg" in subdirs: subdirs.remove(".hg")
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
534
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
535 for f in files:
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
536 fn = os.path.join(d, f)
64
b3e2ddff0159 Diff in subdirectories from Jake Edge
mpm@selenic.com
parents: 60
diff changeset
537 try: s = os.stat(os.path.join(self.root, fn))
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
538 except: continue
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
539 if fn in dc:
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
540 c = dc[fn]
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
541 del dc[fn]
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
542 if not c:
29
4d3a5dcb6972 Make diffdir take a revision argument
mpm@selenic.com
parents: 25
diff changeset
543 if fcmp(fn):
4d3a5dcb6972 Make diffdir take a revision argument
mpm@selenic.com
parents: 25
diff changeset
544 changed.append(fn)
230
00ea3613f82c make diffdir default to dirstate.parents()
mpm@selenic.com
parents: 229
diff changeset
545 elif c[0] == 'i':
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
546 if fn not in mf:
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
547 added.append(fn)
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
548 elif fcmp(fn):
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
549 changed.append(fn)
231
15e7c6cee929 add 'm' state to dirstates
mpm@selenic.com
parents: 230
diff changeset
550 elif c[0] == 'm':
15e7c6cee929 add 'm' state to dirstates
mpm@selenic.com
parents: 230
diff changeset
551 changed.append(fn)
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
552 elif c[0] == 'a':
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
553 added.append(fn)
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
554 elif c[0] == 'r':
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
555 unknown.append(fn)
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
556 elif c[2] != s.st_size:
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
557 changed.append(fn)
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
558 elif c[1] != s.st_mode or c[3] != s.st_mtime:
29
4d3a5dcb6972 Make diffdir take a revision argument
mpm@selenic.com
parents: 25
diff changeset
559 if fcmp(fn):
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
560 changed.append(fn)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
561 else:
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
562 if self.ignore(fn): continue
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
563 unknown.append(fn)
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
564
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
565 deleted = dc.keys()
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
566 deleted.sort()
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
567
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
568 return (changed, added, deleted, unknown)
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
569
32
6a4d8718bee0 Add diffrevs function to compare two nodes
mpm@selenic.com
parents: 30
diff changeset
570 def diffrevs(self, node1, node2):
33
98633e60067c Support for 0, 1, or 2 diff revs
mpm@selenic.com
parents: 32
diff changeset
571 changed, added = [], []
32
6a4d8718bee0 Add diffrevs function to compare two nodes
mpm@selenic.com
parents: 30
diff changeset
572
6a4d8718bee0 Add diffrevs function to compare two nodes
mpm@selenic.com
parents: 30
diff changeset
573 change = self.changelog.read(node1)
6a4d8718bee0 Add diffrevs function to compare two nodes
mpm@selenic.com
parents: 30
diff changeset
574 mf1 = self.manifest.read(change[0])
33
98633e60067c Support for 0, 1, or 2 diff revs
mpm@selenic.com
parents: 32
diff changeset
575 change = self.changelog.read(node2)
32
6a4d8718bee0 Add diffrevs function to compare two nodes
mpm@selenic.com
parents: 30
diff changeset
576 mf2 = self.manifest.read(change[0])
6a4d8718bee0 Add diffrevs function to compare two nodes
mpm@selenic.com
parents: 30
diff changeset
577
6a4d8718bee0 Add diffrevs function to compare two nodes
mpm@selenic.com
parents: 30
diff changeset
578 for fn in mf2:
6a4d8718bee0 Add diffrevs function to compare two nodes
mpm@selenic.com
parents: 30
diff changeset
579 if mf1.has_key(fn):
6a4d8718bee0 Add diffrevs function to compare two nodes
mpm@selenic.com
parents: 30
diff changeset
580 if mf1[fn] != mf2[fn]:
6a4d8718bee0 Add diffrevs function to compare two nodes
mpm@selenic.com
parents: 30
diff changeset
581 changed.append(fn)
6a4d8718bee0 Add diffrevs function to compare two nodes
mpm@selenic.com
parents: 30
diff changeset
582 del mf1[fn]
6a4d8718bee0 Add diffrevs function to compare two nodes
mpm@selenic.com
parents: 30
diff changeset
583 else:
6a4d8718bee0 Add diffrevs function to compare two nodes
mpm@selenic.com
parents: 30
diff changeset
584 added.append(fn)
6a4d8718bee0 Add diffrevs function to compare two nodes
mpm@selenic.com
parents: 30
diff changeset
585
6a4d8718bee0 Add diffrevs function to compare two nodes
mpm@selenic.com
parents: 30
diff changeset
586 deleted = mf1.keys()
6a4d8718bee0 Add diffrevs function to compare two nodes
mpm@selenic.com
parents: 30
diff changeset
587 deleted.sort()
6a4d8718bee0 Add diffrevs function to compare two nodes
mpm@selenic.com
parents: 30
diff changeset
588
6a4d8718bee0 Add diffrevs function to compare two nodes
mpm@selenic.com
parents: 30
diff changeset
589 return (changed, added, deleted)
6a4d8718bee0 Add diffrevs function to compare two nodes
mpm@selenic.com
parents: 30
diff changeset
590
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
591 def add(self, list):
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
592 for f in list:
244
43105253cf5e root relative IO and valid commit states
mpm@selenic.com
parents: 241
diff changeset
593 p = self.wjoin(f)
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
594 if not os.path.isfile(p):
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
595 self.ui.warn("%s does not exist!\n" % f)
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
596 elif self.dirstate.state(f) == 'n':
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
597 self.ui.warn("%s already tracked!\n" % f)
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
598 else:
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
599 self.dirstate.update([f], "a")
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
600
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
601 def forget(self, list):
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
602 for f in list:
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
603 if self.dirstate.state(f) not in 'ai':
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
604 self.ui.warn("%s not added!\n" % f)
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
605 else:
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
606 self.dirstate.forget([f])
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
607
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
608 def remove(self, list):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
609 for f in list:
244
43105253cf5e root relative IO and valid commit states
mpm@selenic.com
parents: 241
diff changeset
610 p = self.wjoin(f)
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
611 if os.path.isfile(p):
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
612 self.ui.warn("%s still exists!\n" % f)
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
613 elif f not in self.dirstate:
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
614 self.ui.warn("%s not tracked!\n" % f)
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
615 else:
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
616 self.dirstate.update([f], "r")
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
617
222
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
618 def heads(self):
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
619 return self.changelog.heads()
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
620
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
621 def branches(self, nodes):
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
622 if not nodes: nodes = [self.changelog.tip()]
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
623 b = []
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
624 for n in nodes:
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
625 t = n
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
626 while n:
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
627 p = self.changelog.parents(n)
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
628 if p[1] != nullid or p[0] == nullid:
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
629 b.append((t, n, p[0], p[1]))
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
630 break
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
631 n = p[0]
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
632 return b
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
633
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
634 def between(self, pairs):
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
635 r = []
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
636
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
637 for top, bottom in pairs:
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
638 n, l, i = top, [], 0
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
639 f = 1
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
640
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
641 while n != bottom:
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
642 p = self.changelog.parents(n)[0]
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
643 if i == f:
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
644 l.append(n)
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
645 f = f * 2
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
646 n = p
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
647 i += 1
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
648
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
649 r.append(l)
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
650
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
651 return r
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
652
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
653 def newer(self, nodes):
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
654 m = {}
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
655 nl = []
94
7daef883134f Refactor merge code
mpm@selenic.com
parents: 90
diff changeset
656 pm = {}
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
657 cl = self.changelog
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
658 t = l = cl.count()
94
7daef883134f Refactor merge code
mpm@selenic.com
parents: 90
diff changeset
659
7daef883134f Refactor merge code
mpm@selenic.com
parents: 90
diff changeset
660 # find the lowest numbered node
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
661 for n in nodes:
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
662 l = min(l, cl.rev(n))
94
7daef883134f Refactor merge code
mpm@selenic.com
parents: 90
diff changeset
663 m[n] = 1
46
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
664
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
665 for i in xrange(l, t):
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
666 n = cl.node(i)
94
7daef883134f Refactor merge code
mpm@selenic.com
parents: 90
diff changeset
667 if n in m: # explicitly listed
7daef883134f Refactor merge code
mpm@selenic.com
parents: 90
diff changeset
668 pm[n] = 1
7daef883134f Refactor merge code
mpm@selenic.com
parents: 90
diff changeset
669 nl.append(n)
7daef883134f Refactor merge code
mpm@selenic.com
parents: 90
diff changeset
670 continue
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
671 for p in cl.parents(n):
94
7daef883134f Refactor merge code
mpm@selenic.com
parents: 90
diff changeset
672 if p in pm: # parent listed
7daef883134f Refactor merge code
mpm@selenic.com
parents: 90
diff changeset
673 pm[n] = 1
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
674 nl.append(n)
94
7daef883134f Refactor merge code
mpm@selenic.com
parents: 90
diff changeset
675 break
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
676
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
677 return nl
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
678
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
679 def getchangegroup(self, remote):
65
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
680 m = self.changelog.nodemap
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
681 search = []
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
682 fetch = []
148
c32286d0a665 Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents: 146
diff changeset
683 seen = {}
c32286d0a665 Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents: 146
diff changeset
684 seenbranch = {}
192
5d8553352d2e Changes to network protocol
mpm@selenic.com
parents: 191
diff changeset
685
190
3dd5ce2fddb6 merge: short-circuit search for merge into empty repo
mpm@selenic.com
parents: 187
diff changeset
686 # if we have an empty repo, fetch everything
3dd5ce2fddb6 merge: short-circuit search for merge into empty repo
mpm@selenic.com
parents: 187
diff changeset
687 if self.changelog.tip() == nullid:
222
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
688 self.ui.status("requesting all changes\n")
190
3dd5ce2fddb6 merge: short-circuit search for merge into empty repo
mpm@selenic.com
parents: 187
diff changeset
689 return remote.changegroup([nullid])
3dd5ce2fddb6 merge: short-circuit search for merge into empty repo
mpm@selenic.com
parents: 187
diff changeset
690
3dd5ce2fddb6 merge: short-circuit search for merge into empty repo
mpm@selenic.com
parents: 187
diff changeset
691 # otherwise, assume we're closer to the tip than the root
222
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
692 self.ui.status("searching for changes\n")
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
693 heads = remote.heads()
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
694 unknown = []
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
695 for h in heads:
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
696 if h not in m:
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
697 unknown.append(h)
46
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
698
222
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
699 if not unknown:
192
5d8553352d2e Changes to network protocol
mpm@selenic.com
parents: 191
diff changeset
700 self.ui.status("nothing to do!\n")
60
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
701 return None
222
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
702
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
703 unknown = remote.branches(unknown)
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
704 while unknown:
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
705 n = unknown.pop(0)
148
c32286d0a665 Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents: 146
diff changeset
706 seen[n[0]] = 1
c32286d0a665 Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents: 146
diff changeset
707
c32286d0a665 Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents: 146
diff changeset
708 self.ui.debug("examining %s:%s\n" % (short(n[0]), short(n[1])))
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
709 if n == nullid: break
148
c32286d0a665 Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents: 146
diff changeset
710 if n in seenbranch:
c32286d0a665 Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents: 146
diff changeset
711 self.ui.debug("branch already found\n")
c32286d0a665 Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents: 146
diff changeset
712 continue
65
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
713 if n[1] and n[1] in m: # do we know the base?
148
c32286d0a665 Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents: 146
diff changeset
714 self.ui.debug("found incomplete branch %s:%s\n"
c32286d0a665 Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents: 146
diff changeset
715 % (short(n[0]), short(n[1])))
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
716 search.append(n) # schedule branch range for scanning
148
c32286d0a665 Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents: 146
diff changeset
717 seenbranch[n] = 1
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
718 else:
94
7daef883134f Refactor merge code
mpm@selenic.com
parents: 90
diff changeset
719 if n[2] in m and n[3] in m:
7daef883134f Refactor merge code
mpm@selenic.com
parents: 90
diff changeset
720 if n[1] not in fetch:
7daef883134f Refactor merge code
mpm@selenic.com
parents: 90
diff changeset
721 self.ui.debug("found new changeset %s\n" %
7daef883134f Refactor merge code
mpm@selenic.com
parents: 90
diff changeset
722 short(n[1]))
7daef883134f Refactor merge code
mpm@selenic.com
parents: 90
diff changeset
723 fetch.append(n[1]) # earliest unknown
7daef883134f Refactor merge code
mpm@selenic.com
parents: 90
diff changeset
724 continue
148
c32286d0a665 Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents: 146
diff changeset
725
c32286d0a665 Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents: 146
diff changeset
726 r = []
c32286d0a665 Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents: 146
diff changeset
727 for a in n[2:4]:
c32286d0a665 Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents: 146
diff changeset
728 if a not in seen: r.append(a)
c32286d0a665 Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents: 146
diff changeset
729
c32286d0a665 Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents: 146
diff changeset
730 if r:
c32286d0a665 Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents: 146
diff changeset
731 self.ui.debug("requesting %s\n" %
c32286d0a665 Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents: 146
diff changeset
732 " ".join(map(short, r)))
c32286d0a665 Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents: 146
diff changeset
733 for b in remote.branches(r):
c32286d0a665 Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents: 146
diff changeset
734 self.ui.debug("received %s:%s\n" %
c32286d0a665 Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents: 146
diff changeset
735 (short(b[0]), short(b[1])))
c32286d0a665 Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents: 146
diff changeset
736 if b[0] not in m and b[0] not in seen:
c32286d0a665 Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents: 146
diff changeset
737 unknown.append(b)
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
738
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
739 while search:
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
740 n = search.pop(0)
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
741 l = remote.between([(n[0], n[1])])[0]
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
742 p = n[0]
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
743 f = 1
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
744 for i in l + [n[1]]:
65
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
745 if i in m:
85
58a1a0425c9b Fix merge bug, I hope
mpm@selenic.com
parents: 83
diff changeset
746 if f <= 2:
83
9fd5b35cfc45 Add -q quiet option
mpm@selenic.com
parents: 79
diff changeset
747 self.ui.debug("found new branch changeset %s\n" %
9fd5b35cfc45 Add -q quiet option
mpm@selenic.com
parents: 79
diff changeset
748 short(p))
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
749 fetch.append(p)
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
750 else:
83
9fd5b35cfc45 Add -q quiet option
mpm@selenic.com
parents: 79
diff changeset
751 self.ui.debug("narrowed branch search to %s:%s\n"
9fd5b35cfc45 Add -q quiet option
mpm@selenic.com
parents: 79
diff changeset
752 % (short(p), short(i)))
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
753 search.append((p, i))
65
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
754 break
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
755 p, f = i, f * 2
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
756
65
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
757 for f in fetch:
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
758 if f in m:
83
9fd5b35cfc45 Add -q quiet option
mpm@selenic.com
parents: 79
diff changeset
759 raise "already have", short(f[:4])
9fd5b35cfc45 Add -q quiet option
mpm@selenic.com
parents: 79
diff changeset
760
94
7daef883134f Refactor merge code
mpm@selenic.com
parents: 90
diff changeset
761 self.ui.note("adding new changesets starting at " +
83
9fd5b35cfc45 Add -q quiet option
mpm@selenic.com
parents: 79
diff changeset
762 " ".join([short(f) for f in fetch]) + "\n")
65
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
763
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
764 return remote.changegroup(fetch)
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
765
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
766 def changegroup(self, basenodes):
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
767 nodes = self.newer(basenodes)
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
768
46
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
769 # construct the link map
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
770 linkmap = {}
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
771 for n in nodes:
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
772 linkmap[self.changelog.rev(n)] = n
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
773
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
774 # construct a list of all changed files
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
775 changed = {}
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
776 for n in nodes:
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
777 c = self.changelog.read(n)
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
778 for f in c[3]:
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
779 changed[f] = 1
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
780 changed = changed.keys()
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
781 changed.sort()
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
782
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
783 # the changegroup is changesets + manifests + all file revs
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
784 revs = [ self.changelog.rev(n) for n in nodes ]
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
785
192
5d8553352d2e Changes to network protocol
mpm@selenic.com
parents: 191
diff changeset
786 for y in self.changelog.group(linkmap): yield y
5d8553352d2e Changes to network protocol
mpm@selenic.com
parents: 191
diff changeset
787 for y in self.manifest.group(linkmap): yield y
46
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
788 for f in changed:
192
5d8553352d2e Changes to network protocol
mpm@selenic.com
parents: 191
diff changeset
789 yield struct.pack(">l", len(f) + 4) + f
46
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
790 g = self.file(f).group(linkmap)
192
5d8553352d2e Changes to network protocol
mpm@selenic.com
parents: 191
diff changeset
791 for y in g:
5d8553352d2e Changes to network protocol
mpm@selenic.com
parents: 191
diff changeset
792 yield y
46
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
793
65
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
794 def addchangegroup(self, generator):
222
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
795
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
796 class genread:
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
797 def __init__(self, generator):
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
798 self.g = generator
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
799 self.buf = ""
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
800 def read(self, l):
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
801 while l > len(self.buf):
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
802 try:
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
803 self.buf += self.g.next()
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
804 except StopIteration:
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
805 break
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
806 d, self.buf = self.buf[:l], self.buf[l:]
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
807 return d
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
808
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
809 def getchunk():
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
810 d = source.read(4)
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
811 if not d: return ""
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
812 l = struct.unpack(">l", d)[0]
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
813 if l <= 4: return ""
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
814 return source.read(l - 4)
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
815
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
816 def getgroup():
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
817 while 1:
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
818 c = getchunk()
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
819 if not c: break
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
820 yield c
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
821
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
822 def csmap(x):
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
823 self.ui.debug("add changeset %s\n" % short(x))
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
824 return self.changelog.count()
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
825
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
826 def revmap(x):
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
827 return self.changelog.rev(x)
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
828
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
829 if not generator: return
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
830 changesets = files = revisions = 0
225
1651a3e61925 fix repo locking
mpm@selenic.com
parents: 224
diff changeset
831
222
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
832 source = genread(generator)
225
1651a3e61925 fix repo locking
mpm@selenic.com
parents: 224
diff changeset
833 lock = self.lock()
222
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
834 tr = self.transaction()
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
835
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
836 # pull off the changeset group
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
837 self.ui.status("adding changesets\n")
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
838 co = self.changelog.tip()
224
ccbcc4d76f81 fix bad assumption about uniqueness of file versions
mpm@selenic.com
parents: 223
diff changeset
839 cn = self.changelog.addgroup(getgroup(), csmap, tr, 1) # unique
222
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
840 changesets = self.changelog.rev(cn) - self.changelog.rev(co)
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
841
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
842 # pull off the manifest group
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
843 self.ui.status("adding manifests\n")
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
844 mm = self.manifest.tip()
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
845 mo = self.manifest.addgroup(getgroup(), revmap, tr)
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
846
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
847 # process the files
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
848 self.ui.status("adding file revisions\n")
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
849 while 1:
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
850 f = getchunk()
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
851 if not f: break
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
852 self.ui.debug("adding %s revisions\n" % f)
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
853 fl = self.file(f)
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
854 o = fl.tip()
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
855 n = fl.addgroup(getgroup(), revmap, tr)
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
856 revisions += fl.rev(n) - fl.rev(o)
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
857 files += 1
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
858
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
859 self.ui.status(("modified %d files, added %d changesets" +
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
860 " and %d new revisions\n")
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
861 % (files, changesets, revisions))
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
862
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
863 tr.close()
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
864 return
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
865
232
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
866 def resolve(self, node):
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
867 pl = self.dirstate.parents()
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
868 if pl[1] != nullid:
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
869 self.ui.warn("last merge not committed")
46
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
870 return
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
871
232
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
872 p1, p2 = pl[0], node
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
873 m1n = self.changelog.read(p1)[0]
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
874 m2n = self.changelog.read(p2)[0]
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
875 man = self.manifest.ancestor(m1n, m2n)
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
876 m1 = self.manifest.read(m1n)
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
877 m2 = self.manifest.read(m2n)
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
878 ma = self.manifest.read(man)
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
879
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
880 (c, a, d, u) = self.diffdir(self.root)
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
881
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
882 # resolve the manifest to determine which files
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
883 # we care about merging
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
884 self.ui.status("resolving manifests\n")
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
885 self.ui.debug(" ancestor %s local %s remote %s\n" %
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
886 (short(man), short(m1n), short(m2n)))
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
887
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
888 merge = {}
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
889 get = {}
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
890 remove = []
46
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
891
232
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
892 # construct a working dir manifest
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
893 mw = m1.copy()
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
894 for f in a + c:
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
895 mw[f] = nullid
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
896 for f in d:
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
897 del mw[f]
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
898
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
899 for f, n in mw.iteritems():
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
900 if f in m2:
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
901 if n != m2[f]:
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
902 self.ui.debug(" %s versions differ, do resolve\n" % f)
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
903 merge[f] = (m1.get(f, nullid), m2[f])
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
904 del m2[f]
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
905 elif f in ma:
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
906 if n != ma[f]:
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
907 r = self.ui.prompt(
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
908 (" local changed %s which remote deleted\n" % f) +
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
909 "(k)eep or (d)elete?", "[kd]", "k")
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
910 if r == "d":
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
911 remove.append(f)
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
912 else:
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
913 self.ui.debug("other deleted %s\n" % f)
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
914 pass # other deleted it
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
915 else:
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
916 self.ui.debug("local created %s\n" %f)
46
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
917
232
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
918 for f, n in m2.iteritems():
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
919 if f in ma:
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
920 if n != ma[f]:
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
921 r = self.ui.prompt(
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
922 ("remote changed %s which local deleted\n" % f) +
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
923 "(k)eep or (d)elete?", "[kd]", "k")
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
924 if r == "d": remove.append(f)
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
925 else:
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
926 pass # probably safe
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
927 else:
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
928 self.ui.debug("remote created %s, do resolve\n" % f)
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
929 get[f] = n
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
930
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
931 del mw, m1, m2, ma
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
932
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
933 self.dirstate.setparents(p1, p2)
191
d7e859cf2f1b merge: add count of new manifests, files, and revisions
mpm@selenic.com
parents: 190
diff changeset
934
232
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
935 # get the files we don't need to change
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
936 files = get.keys()
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
937 files.sort()
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
938 for f in files:
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
939 if f[0] == "/": continue
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
940 self.ui.note(f, "\n")
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
941 t = self.file(f).revision(get[f])
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
942 try:
244
43105253cf5e root relative IO and valid commit states
mpm@selenic.com
parents: 241
diff changeset
943 file(self.wjoin(f), "w").write(t)
232
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
944 except IOError:
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
945 os.makedirs(os.path.dirname(f))
244
43105253cf5e root relative IO and valid commit states
mpm@selenic.com
parents: 241
diff changeset
946 file(self.wjoin(f), "w").write(t)
232
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
947
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
948 # we have to remember what files we needed to get/change
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
949 # because any file that's different from either one of its
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
950 # parents must be in the changeset
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
951 self.dirstate.update(files, 'm')
46
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
952
232
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
953 # merge the tricky bits
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
954 files = merge.keys()
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
955 files.sort()
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
956 for f in files:
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
957 m, o = merge[f]
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
958 self.merge3(f, m, o)
46
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
959
232
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
960 # same here
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
961 self.dirstate.update(files, 'm')
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
962
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
963 for f in remove:
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
964 self.ui.note("removing %s\n" % f)
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
965 #os.unlink(f)
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
966 self.dirstate.update(remove, 'r')
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
967
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
968 def merge3(self, fn, my, other):
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
969 """perform a 3-way merge in the working directory"""
249
619e775aa7f9 import and startup cleanups
mpm@selenic.com
parents: 247
diff changeset
970
619e775aa7f9 import and startup cleanups
mpm@selenic.com
parents: 247
diff changeset
971 import tempfile
96
fce47326677c Add updated merge3 code
mpm@selenic.com
parents: 95
diff changeset
972
fce47326677c Add updated merge3 code
mpm@selenic.com
parents: 95
diff changeset
973 def temp(prefix, node):
fce47326677c Add updated merge3 code
mpm@selenic.com
parents: 95
diff changeset
974 pre = "%s~%s." % (os.path.basename(fn), prefix)
fce47326677c Add updated merge3 code
mpm@selenic.com
parents: 95
diff changeset
975 (fd, name) = tempfile.mkstemp("", pre)
fce47326677c Add updated merge3 code
mpm@selenic.com
parents: 95
diff changeset
976 f = os.fdopen(fd, "w")
fce47326677c Add updated merge3 code
mpm@selenic.com
parents: 95
diff changeset
977 f.write(fl.revision(node))
fce47326677c Add updated merge3 code
mpm@selenic.com
parents: 95
diff changeset
978 f.close()
fce47326677c Add updated merge3 code
mpm@selenic.com
parents: 95
diff changeset
979 return name
fce47326677c Add updated merge3 code
mpm@selenic.com
parents: 95
diff changeset
980
232
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
981 fl = self.file(fn)
96
fce47326677c Add updated merge3 code
mpm@selenic.com
parents: 95
diff changeset
982 base = fl.ancestor(my, other)
244
43105253cf5e root relative IO and valid commit states
mpm@selenic.com
parents: 241
diff changeset
983 a = self.wjoin(fn)
232
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
984 b = temp("other", other)
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
985 c = temp("base", base)
96
fce47326677c Add updated merge3 code
mpm@selenic.com
parents: 95
diff changeset
986
232
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
987 self.ui.note("resolving %s\n" % fn)
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
988 self.ui.debug("file %s: other %s ancestor %s\n" %
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
989 (fn, short(other), short(base)))
96
fce47326677c Add updated merge3 code
mpm@selenic.com
parents: 95
diff changeset
990
240
737c66b68290 Replace tkmerge with hgmerge
mpm@selenic.com
parents: 232
diff changeset
991 cmd = os.environ.get("HGMERGE", "hgmerge")
737c66b68290 Replace tkmerge with hgmerge
mpm@selenic.com
parents: 232
diff changeset
992 r = os.system("%s %s %s %s" % (cmd, a, b, c))
232
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
993 if r:
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
994 self.ui.warn("merging %s failed!\n" % f)
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
995
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
996 os.unlink(b)
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
997 os.unlink(c)
96
fce47326677c Add updated merge3 code
mpm@selenic.com
parents: 95
diff changeset
998
247
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
999 def verify(self):
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1000 filelinkrevs = {}
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1001 filenodes = {}
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1002 manifestchangeset = {}
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1003 changesets = revisions = files = 0
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1004 errors = 0
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1005
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1006 self.ui.status("checking changesets\n")
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1007 for i in range(self.changelog.count()):
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1008 changesets += 1
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1009 n = self.changelog.node(i)
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1010 for p in self.changelog.parents(n):
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1011 if p not in self.changelog.nodemap:
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1012 self.ui.warn("changeset %s has unknown parent %s\n" %
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1013 (short(n), short(p)))
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1014 errors += 1
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1015 try:
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1016 changes = self.changelog.read(n)
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1017 except Exception, inst:
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1018 self.ui.warn("unpacking changeset %s: %s\n" % (short(n), inst))
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1019 errors += 1
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1020
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1021 manifestchangeset[changes[0]] = n
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1022 for f in changes[3]:
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1023 filelinkrevs.setdefault(f, []).append(i)
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1024
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1025 self.ui.status("checking manifests\n")
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1026 for i in range(self.manifest.count()):
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1027 n = self.manifest.node(i)
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1028 for p in self.manifest.parents(n):
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1029 if p not in self.manifest.nodemap:
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1030 self.ui.warn("manifest %s has unknown parent %s\n" %
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1031 (short(n), short(p)))
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1032 errors += 1
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1033 ca = self.changelog.node(self.manifest.linkrev(n))
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1034 cc = manifestchangeset[n]
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1035 if ca != cc:
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1036 self.ui.warn("manifest %s points to %s, not %s\n" %
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1037 (hex(n), hex(ca), hex(cc)))
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1038 errors += 1
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1039
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1040 try:
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1041 delta = mdiff.patchtext(self.manifest.delta(n))
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1042 except KeyboardInterrupt:
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1043 print "aborted"
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1044 sys.exit(0)
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1045 except Exception, inst:
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1046 self.ui.warn("unpacking manifest %s: %s\n"
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1047 % (short(n), inst))
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1048 errors += 1
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1049
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1050 ff = [ l.split('\0') for l in delta.splitlines() ]
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1051 for f, fn in ff:
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1052 filenodes.setdefault(f, {})[bin(fn)] = 1
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1053
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1054 self.ui.status("crosschecking files in changesets and manifests\n")
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1055 for f in filenodes:
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1056 if f not in filelinkrevs:
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1057 self.ui.warn("file %s in manifest but not in changesets\n" % f)
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1058 errors += 1
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1059
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1060 for f in filelinkrevs:
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1061 if f not in filenodes:
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1062 self.ui.warn("file %s in changeset but not in manifest\n" % f)
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1063 errors += 1
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1064
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1065 self.ui.status("checking files\n")
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1066 ff = filenodes.keys()
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1067 ff.sort()
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1068 for f in ff:
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1069 if f == "/dev/null": continue
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1070 files += 1
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1071 fl = self.file(f)
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1072 nodes = { nullid: 1 }
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1073 for i in range(fl.count()):
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1074 revisions += 1
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1075 n = fl.node(i)
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1076
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1077 if n not in filenodes[f]:
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1078 self.ui.warn("%s: %d:%s not in manifests\n"
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1079 % (f, i, short(n)))
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1080 print len(filenodes[f].keys()), fl.count(), f
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1081 errors += 1
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1082 else:
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1083 del filenodes[f][n]
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1084
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1085 flr = fl.linkrev(n)
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1086 if flr not in filelinkrevs[f]:
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1087 self.ui.warn("%s:%s points to unexpected changeset %d\n"
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1088 % (f, short(n), fl.linkrev(n)))
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1089 errors += 1
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1090 else:
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1091 filelinkrevs[f].remove(flr)
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1092
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1093 # verify contents
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1094 try:
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1095 t = fl.read(n)
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1096 except Exception, inst:
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1097 self.ui.warn("unpacking file %s %s: %s\n"
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1098 % (f, short(n), inst))
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1099 errors += 1
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1100
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1101 # verify parents
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1102 (p1, p2) = fl.parents(n)
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1103 if p1 not in nodes:
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1104 self.ui.warn("file %s:%s unknown parent 1 %s" %
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1105 (f, short(n), short(p1)))
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1106 errors += 1
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1107 if p2 not in nodes:
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1108 self.ui.warn("file %s:%s unknown parent 2 %s" %
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1109 (f, short(n), short(p1)))
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1110 errors += 1
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1111 nodes[n] = 1
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1112
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1113 # cross-check
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1114 for node in filenodes[f]:
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1115 self.ui.warn("node %s in manifests not in %s\n"
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1116 % (hex(n), f))
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1117 errors += 1
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1118
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1119 self.ui.status("%d files, %d changesets, %d total revisions\n" %
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1120 (files, changesets, revisions))
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1121
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1122 if errors:
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1123 self.ui.warn("%d integrity errors encountered!\n" % errors)
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1124 return 1
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1125
60
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
1126 class remoterepository:
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
1127 def __init__(self, ui, path):
176
1d8e9637a0a4 Change hg: protocol name to http: and http: to old-http:
mpm@selenic.com
parents: 171
diff changeset
1128 self.url = path
60
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
1129 self.ui = ui
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
1130
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
1131 def do_cmd(self, cmd, **args):
83
9fd5b35cfc45 Add -q quiet option
mpm@selenic.com
parents: 79
diff changeset
1132 self.ui.debug("sending %s command\n" % cmd)
60
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
1133 q = {"cmd": cmd}
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
1134 q.update(args)
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
1135 qs = urllib.urlencode(q)
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
1136 cu = "%s?%s" % (self.url, qs)
65
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
1137 return urllib.urlopen(cu)
60
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
1138
222
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
1139 def heads(self):
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
1140 d = self.do_cmd("heads").read()
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
1141 try:
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
1142 return map(bin, d[:-1].split(" "))
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
1143 except:
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
1144 self.ui.warn("unexpected response:\n" + d[:400] + "\n...\n")
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
1145 raise
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
1146
60
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
1147 def branches(self, nodes):
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
1148 n = " ".join(map(hex, nodes))
65
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
1149 d = self.do_cmd("branches", nodes=n).read()
217
e6d6497a6331 merge: catch unexpected responses
mpm@selenic.com
parents: 216
diff changeset
1150 try:
e6d6497a6331 merge: catch unexpected responses
mpm@selenic.com
parents: 216
diff changeset
1151 br = [ tuple(map(bin, b.split(" "))) for b in d.splitlines() ]
e6d6497a6331 merge: catch unexpected responses
mpm@selenic.com
parents: 216
diff changeset
1152 return br
e6d6497a6331 merge: catch unexpected responses
mpm@selenic.com
parents: 216
diff changeset
1153 except:
e6d6497a6331 merge: catch unexpected responses
mpm@selenic.com
parents: 216
diff changeset
1154 self.ui.warn("unexpected response:\n" + d[:400] + "\n...\n")
e6d6497a6331 merge: catch unexpected responses
mpm@selenic.com
parents: 216
diff changeset
1155 raise
60
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
1156
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
1157 def between(self, pairs):
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
1158 n = "\n".join(["-".join(map(hex, p)) for p in pairs])
65
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
1159 d = self.do_cmd("between", pairs=n).read()
217
e6d6497a6331 merge: catch unexpected responses
mpm@selenic.com
parents: 216
diff changeset
1160 try:
e6d6497a6331 merge: catch unexpected responses
mpm@selenic.com
parents: 216
diff changeset
1161 p = [ l and map(bin, l.split(" ")) or [] for l in d.splitlines() ]
e6d6497a6331 merge: catch unexpected responses
mpm@selenic.com
parents: 216
diff changeset
1162 return p
e6d6497a6331 merge: catch unexpected responses
mpm@selenic.com
parents: 216
diff changeset
1163 except:
e6d6497a6331 merge: catch unexpected responses
mpm@selenic.com
parents: 216
diff changeset
1164 self.ui.warn("unexpected response:\n" + d[:400] + "\n...\n")
e6d6497a6331 merge: catch unexpected responses
mpm@selenic.com
parents: 216
diff changeset
1165 raise
60
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
1166
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
1167 def changegroup(self, nodes):
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
1168 n = " ".join(map(hex, nodes))
65
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
1169 zd = zlib.decompressobj()
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
1170 f = self.do_cmd("changegroup", roots=n)
192
5d8553352d2e Changes to network protocol
mpm@selenic.com
parents: 191
diff changeset
1171 bytes = 0
65
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
1172 while 1:
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
1173 d = f.read(4096)
192
5d8553352d2e Changes to network protocol
mpm@selenic.com
parents: 191
diff changeset
1174 bytes += len(d)
65
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
1175 if not d:
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
1176 yield zd.flush()
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
1177 break
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
1178 yield zd.decompress(d)
192
5d8553352d2e Changes to network protocol
mpm@selenic.com
parents: 191
diff changeset
1179 self.ui.note("%d bytes of data transfered\n" % bytes)
60
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
1180
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
1181 def repository(ui, path=None, create=0):
176
1d8e9637a0a4 Change hg: protocol name to http: and http: to old-http:
mpm@selenic.com
parents: 171
diff changeset
1182 if path and path[:7] == "http://":
249
619e775aa7f9 import and startup cleanups
mpm@selenic.com
parents: 247
diff changeset
1183 import urllib, urllib2
176
1d8e9637a0a4 Change hg: protocol name to http: and http: to old-http:
mpm@selenic.com
parents: 171
diff changeset
1184 return remoterepository(ui, path)
60
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
1185 if path and path[:5] == "hg://":
249
619e775aa7f9 import and startup cleanups
mpm@selenic.com
parents: 247
diff changeset
1186 import urllib, urllib2
176
1d8e9637a0a4 Change hg: protocol name to http: and http: to old-http:
mpm@selenic.com
parents: 171
diff changeset
1187 return remoterepository(ui, path.replace("hg://", "http://"))
1d8e9637a0a4 Change hg: protocol name to http: and http: to old-http:
mpm@selenic.com
parents: 171
diff changeset
1188 if path and path[:11] == "old-http://":
249
619e775aa7f9 import and startup cleanups
mpm@selenic.com
parents: 247
diff changeset
1189 import urllib, urllib2
619e775aa7f9 import and startup cleanups
mpm@selenic.com
parents: 247
diff changeset
1190 from mercurial import byterange
176
1d8e9637a0a4 Change hg: protocol name to http: and http: to old-http:
mpm@selenic.com
parents: 171
diff changeset
1191 return localrepository(ui, path.replace("old-http://", "http://"))
60
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
1192 else:
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
1193 return localrepository(ui, path, create)
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
1194
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
1195 class httprangereader:
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
1196 def __init__(self, url):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
1197 self.url = url
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
1198 self.pos = 0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
1199 def seek(self, pos):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
1200 self.pos = pos
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
1201 def read(self, bytes=None):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
1202 opener = urllib2.build_opener(byterange.HTTPRangeHandler())
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
1203 urllib2.install_opener(opener)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
1204 req = urllib2.Request(self.url)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
1205 end = ''
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
1206 if bytes: end = self.pos + bytes
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
1207 req.add_header('Range', 'bytes=%d-%s' % (self.pos, end))
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
1208 f = urllib2.urlopen(req)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
1209 return f.read()