annotate mercurial/hg.py @ 419:28511fc21073

[PATCH] file seperator handling for the other 'OS' -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 [PATCH] file seperator handling for the other 'OS' From: K Thananchayan <thananck@yahoo.com> The following patch maintains repo root relative source file names in canonical form (with '/' as file seperator). Mercurial calls os.path.join, os.path.normpath, os.path.walk that use platform's file seperator. This patch does not change seperator in these circumstances (except when the result refer to source files). manifest hash: 2fbb4cb0d3d0bc4f4de5c7c8803fb738072ec6c5 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.0 (GNU/Linux) iD8DBQFCuNuBywK+sNU5EO8RAhAZAKCV8cz11+rdof9n1tHb0uDScF34GgCeITNi 4aVikToPXqXyReN9kFP5pnY= =xcV5 -----END PGP SIGNATURE-----
author mpm@selenic.com
date Tue, 21 Jun 2005 19:31:13 -0800
parents 0446f698d38e
children dbe86d465e09
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
419
28511fc21073 [PATCH] file seperator handling for the other 'OS'
mpm@selenic.com
parents: 418
diff changeset
9 import util
262
3db700146536 implement demand loading hack
mpm@selenic.com
parents: 256
diff changeset
10 from revlog import *
3db700146536 implement demand loading hack
mpm@selenic.com
parents: 256
diff changeset
11 from demandload import *
3db700146536 implement demand loading hack
mpm@selenic.com
parents: 256
diff changeset
12 demandload(globals(), "re lock urllib urllib2 transaction time socket")
372
4b0f562c61f4 Move httprangereader into its own file
mpm@selenic.com
parents: 363
diff changeset
13 demandload(globals(), "tempfile httprangereader difflib")
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
14
276
10e325db7347 add tracking of execute permissions
mpm@selenic.com
parents: 275
diff changeset
15 def is_exec(f):
10e325db7347 add tracking of execute permissions
mpm@selenic.com
parents: 275
diff changeset
16 return (os.stat(f).st_mode & 0100 != 0)
10e325db7347 add tracking of execute permissions
mpm@selenic.com
parents: 275
diff changeset
17
10e325db7347 add tracking of execute permissions
mpm@selenic.com
parents: 275
diff changeset
18 def set_exec(f, mode):
10e325db7347 add tracking of execute permissions
mpm@selenic.com
parents: 275
diff changeset
19 s = os.stat(f).st_mode
10e325db7347 add tracking of execute permissions
mpm@selenic.com
parents: 275
diff changeset
20 if (s & 0100 != 0) == mode:
10e325db7347 add tracking of execute permissions
mpm@selenic.com
parents: 275
diff changeset
21 return
298
91c9fd6a7c70 Turn on +x for every +r bit when making a file executable and obey umask.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 297
diff changeset
22 if mode:
299
7c239fad0f27 Merge with TAH
mpm@selenic.com
parents: 296 298
diff changeset
23 # Turn on +x for every +r bit when making a file executable
7c239fad0f27 Merge with TAH
mpm@selenic.com
parents: 296 298
diff changeset
24 # and obey umask.
298
91c9fd6a7c70 Turn on +x for every +r bit when making a file executable and obey umask.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 297
diff changeset
25 umask = os.umask(0)
91c9fd6a7c70 Turn on +x for every +r bit when making a file executable and obey umask.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 297
diff changeset
26 os.umask(umask)
91c9fd6a7c70 Turn on +x for every +r bit when making a file executable and obey umask.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 297
diff changeset
27 os.chmod(f, s | (s & 0444) >> 2 & ~umask)
91c9fd6a7c70 Turn on +x for every +r bit when making a file executable and obey umask.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 297
diff changeset
28 else:
91c9fd6a7c70 Turn on +x for every +r bit when making a file executable and obey umask.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 297
diff changeset
29 os.chmod(f, s & 0666)
276
10e325db7347 add tracking of execute permissions
mpm@selenic.com
parents: 275
diff changeset
30
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
31 class filelog(revlog):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
32 def __init__(self, opener, path):
144
ea9188538222 Fix transaction handling bug by reverting fileopener change
mpm@selenic.com
parents: 140
diff changeset
33 revlog.__init__(self, opener,
ea9188538222 Fix transaction handling bug by reverting fileopener change
mpm@selenic.com
parents: 140
diff changeset
34 os.path.join("data", path + ".i"),
ea9188538222 Fix transaction handling bug by reverting fileopener change
mpm@selenic.com
parents: 140
diff changeset
35 os.path.join("data", path + ".d"))
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
36
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
37 def read(self, node):
360
10519e4cbd02 filelog: add metadata support
mpm@selenic.com
parents: 358
diff changeset
38 t = self.revision(node)
10519e4cbd02 filelog: add metadata support
mpm@selenic.com
parents: 358
diff changeset
39 if t[:2] != '\1\n':
10519e4cbd02 filelog: add metadata support
mpm@selenic.com
parents: 358
diff changeset
40 return t
10519e4cbd02 filelog: add metadata support
mpm@selenic.com
parents: 358
diff changeset
41 s = t.find('\1\n', 2)
10519e4cbd02 filelog: add metadata support
mpm@selenic.com
parents: 358
diff changeset
42 return t[s+2:]
10519e4cbd02 filelog: add metadata support
mpm@selenic.com
parents: 358
diff changeset
43
10519e4cbd02 filelog: add metadata support
mpm@selenic.com
parents: 358
diff changeset
44 def readmeta(self, node):
10519e4cbd02 filelog: add metadata support
mpm@selenic.com
parents: 358
diff changeset
45 t = self.revision(node)
10519e4cbd02 filelog: add metadata support
mpm@selenic.com
parents: 358
diff changeset
46 if t[:2] != '\1\n':
10519e4cbd02 filelog: add metadata support
mpm@selenic.com
parents: 358
diff changeset
47 return t
10519e4cbd02 filelog: add metadata support
mpm@selenic.com
parents: 358
diff changeset
48 s = t.find('\1\n', 2)
10519e4cbd02 filelog: add metadata support
mpm@selenic.com
parents: 358
diff changeset
49 mt = t[2:s]
10519e4cbd02 filelog: add metadata support
mpm@selenic.com
parents: 358
diff changeset
50 for l in mt.splitlines():
10519e4cbd02 filelog: add metadata support
mpm@selenic.com
parents: 358
diff changeset
51 k, v = l.split(": ", 1)
10519e4cbd02 filelog: add metadata support
mpm@selenic.com
parents: 358
diff changeset
52 m[k] = v
10519e4cbd02 filelog: add metadata support
mpm@selenic.com
parents: 358
diff changeset
53 return m
10519e4cbd02 filelog: add metadata support
mpm@selenic.com
parents: 358
diff changeset
54
10519e4cbd02 filelog: add metadata support
mpm@selenic.com
parents: 358
diff changeset
55 def add(self, text, meta, transaction, link, p1=None, p2=None):
10519e4cbd02 filelog: add metadata support
mpm@selenic.com
parents: 358
diff changeset
56 if meta or text[:2] == '\1\n':
10519e4cbd02 filelog: add metadata support
mpm@selenic.com
parents: 358
diff changeset
57 mt = ""
10519e4cbd02 filelog: add metadata support
mpm@selenic.com
parents: 358
diff changeset
58 if meta:
10519e4cbd02 filelog: add metadata support
mpm@selenic.com
parents: 358
diff changeset
59 mt = [ "%s: %s\n" % (k, v) for k,v in meta.items() ]
10519e4cbd02 filelog: add metadata support
mpm@selenic.com
parents: 358
diff changeset
60 text = "\1\n" + "".join(mt) + "\1\n" + text
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
61 return self.addrevision(text, transaction, link, p1, p2)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
62
79
837d473d54d5 Add basic annotation support
mpm@selenic.com
parents: 78
diff changeset
63 def annotate(self, node):
199
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
64
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
65 def decorate(text, rev):
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
66 return [(rev, l) for l in text.splitlines(1)]
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
67
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
68 def strip(annotation):
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
69 return [e[1] for e in annotation]
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
70
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
71 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
72 new = []
262
3db700146536 implement demand loading hack
mpm@selenic.com
parents: 256
diff changeset
73 sm = difflib.SequenceMatcher(None, strip(parent), strip(child))
79
837d473d54d5 Add basic annotation support
mpm@selenic.com
parents: 78
diff changeset
74 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
75 if o == 'equal':
199
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
76 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
77 else:
199
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
78 new += child[s:t]
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
79 return new
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
80
200
8450c18f2a45 annotate: memory efficiency
mpm@selenic.com
parents: 199
diff changeset
81 # find all ancestors
216
201115f2859b hg annotate: actually annotate the given version
mpm@selenic.com
parents: 210
diff changeset
82 needed = {node:1}
199
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
83 visit = [node]
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
84 while visit:
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
85 n = visit.pop(0)
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
86 for p in self.parents(n):
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
87 if p not in needed:
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
88 needed[p] = 1
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
89 visit.append(p)
200
8450c18f2a45 annotate: memory efficiency
mpm@selenic.com
parents: 199
diff changeset
90 else:
8450c18f2a45 annotate: memory efficiency
mpm@selenic.com
parents: 199
diff changeset
91 # count how many times we'll use this
8450c18f2a45 annotate: memory efficiency
mpm@selenic.com
parents: 199
diff changeset
92 needed[p] += 1
199
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
93
200
8450c18f2a45 annotate: memory efficiency
mpm@selenic.com
parents: 199
diff changeset
94 # sort by revision which is a topological order
199
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
95 visit = needed.keys()
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
96 visit = [ (self.rev(n), n) for n in visit ]
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
97 visit.sort()
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
98 visit = [ p[1] for p in visit ]
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
99 hist = {}
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
100
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
101 for n in visit:
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
102 curr = decorate(self.read(n), self.linkrev(n))
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
103 for p in self.parents(n):
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
104 if p != nullid:
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
105 curr = pair(hist[p], curr)
200
8450c18f2a45 annotate: memory efficiency
mpm@selenic.com
parents: 199
diff changeset
106 # trim the history of unneeded revs
8450c18f2a45 annotate: memory efficiency
mpm@selenic.com
parents: 199
diff changeset
107 needed[p] -= 1
8450c18f2a45 annotate: memory efficiency
mpm@selenic.com
parents: 199
diff changeset
108 if not needed[p]:
8450c18f2a45 annotate: memory efficiency
mpm@selenic.com
parents: 199
diff changeset
109 del hist[p]
199
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
110 hist[n] = curr
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
111
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
112 return hist[n]
79
837d473d54d5 Add basic annotation support
mpm@selenic.com
parents: 78
diff changeset
113
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
114 class manifest(revlog):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
115 def __init__(self, opener):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
116 self.mapcache = None
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
117 self.listcache = None
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
118 self.addlist = None
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
119 revlog.__init__(self, opener, "00manifest.i", "00manifest.d")
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
120
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
121 def read(self, node):
313
e75ea4662d81 Minor caching improvement for manifest
mpm@selenic.com
parents: 312
diff changeset
122 if node == nullid: return {} # don't upset local cache
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
123 if self.mapcache and self.mapcache[0] == node:
90
ab9ebff09dcd Fix manifest merge swap bug
mpm@selenic.com
parents: 85
diff changeset
124 return self.mapcache[1].copy()
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
125 text = self.revision(node)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
126 map = {}
276
10e325db7347 add tracking of execute permissions
mpm@selenic.com
parents: 275
diff changeset
127 flag = {}
25
daa724b27300 Fix corruption from manifest.listcache optimization
mpm@selenic.com
parents: 20
diff changeset
128 self.listcache = (text, text.splitlines(1))
daa724b27300 Fix corruption from manifest.listcache optimization
mpm@selenic.com
parents: 20
diff changeset
129 for l in self.listcache[1]:
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
130 (f, n) = l.split('\0')
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
131 map[f] = bin(n[:40])
276
10e325db7347 add tracking of execute permissions
mpm@selenic.com
parents: 275
diff changeset
132 flag[f] = (n[40:-1] == "x")
10e325db7347 add tracking of execute permissions
mpm@selenic.com
parents: 275
diff changeset
133 self.mapcache = (node, map, flag)
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
134 return map
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
135
276
10e325db7347 add tracking of execute permissions
mpm@selenic.com
parents: 275
diff changeset
136 def readflags(self, node):
313
e75ea4662d81 Minor caching improvement for manifest
mpm@selenic.com
parents: 312
diff changeset
137 if node == nullid: return {} # don't upset local cache
358
9f4077d7ef6f [PATCH] manifest.readflags performance buglet
mpm@selenic.com
parents: 350
diff changeset
138 if not self.mapcache or self.mapcache[0] != node:
276
10e325db7347 add tracking of execute permissions
mpm@selenic.com
parents: 275
diff changeset
139 self.read(node)
10e325db7347 add tracking of execute permissions
mpm@selenic.com
parents: 275
diff changeset
140 return self.mapcache[2]
10e325db7347 add tracking of execute permissions
mpm@selenic.com
parents: 275
diff changeset
141
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
142 def diff(self, a, b):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
143 # 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
144 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
145 d = mdiff.diff(self.listcache[1], self.addlist, 1)
3dde7c87e36d Add paranoia to diff code
mpm@selenic.com
parents: 96
diff changeset
146 if mdiff.patch(a, d) != b:
3dde7c87e36d Add paranoia to diff code
mpm@selenic.com
parents: 96
diff changeset
147 sys.stderr.write("*** sortdiff failed, falling back ***\n")
3dde7c87e36d Add paranoia to diff code
mpm@selenic.com
parents: 96
diff changeset
148 return mdiff.textdiff(a, b)
3dde7c87e36d Add paranoia to diff code
mpm@selenic.com
parents: 96
diff changeset
149 return d
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
150 else:
44
e825a68d7227 Fix occassional diff bug with manifests
mpm@selenic.com
parents: 40
diff changeset
151 return mdiff.textdiff(a, b)
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
152
276
10e325db7347 add tracking of execute permissions
mpm@selenic.com
parents: 275
diff changeset
153 def add(self, map, flags, transaction, link, p1=None, p2=None):
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
154 files = map.keys()
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
155 files.sort()
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
156
276
10e325db7347 add tracking of execute permissions
mpm@selenic.com
parents: 275
diff changeset
157 self.addlist = ["%s\000%s%s\n" %
10e325db7347 add tracking of execute permissions
mpm@selenic.com
parents: 275
diff changeset
158 (f, hex(map[f]), flags[f] and "x" or '')
10e325db7347 add tracking of execute permissions
mpm@selenic.com
parents: 275
diff changeset
159 for f in files]
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
160 text = "".join(self.addlist)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
161
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
162 n = self.addrevision(text, transaction, link, p1, p2)
302
498fb0fa2795 various fixups for git import
mpm@selenic.com
parents: 299
diff changeset
163 self.mapcache = (n, map, flags)
25
daa724b27300 Fix corruption from manifest.listcache optimization
mpm@selenic.com
parents: 20
diff changeset
164 self.listcache = (text, self.addlist)
140
30ef77113872 Minor safety checks to manifest diff
mpm@selenic.com
parents: 118
diff changeset
165 self.addlist = None
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
166
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
167 return n
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
168
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
169 class changelog(revlog):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
170 def __init__(self, opener):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
171 revlog.__init__(self, opener, "00changelog.i", "00changelog.d")
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
172
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
173 def extract(self, text):
37
a8811676c85a Move hex/bin bits to revlog
mpm@selenic.com
parents: 33
diff changeset
174 if not text:
40
5f87633e1ea2 Date is an int as a string in changelog
mpm@selenic.com
parents: 37
diff changeset
175 return (nullid, "", "0", [], "")
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
176 last = text.index("\n\n")
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
177 desc = text[last + 2:]
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
178 l = text[:last].splitlines()
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
179 manifest = bin(l[0])
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
180 user = l[1]
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
181 date = l[2]
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
182 files = l[3:]
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
183 return (manifest, user, date, files, desc)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
184
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
185 def read(self, node):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
186 return self.extract(self.revision(node))
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
187
203
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
188 def add(self, manifest, list, desc, transaction, p1=None, p2=None,
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
189 user=None, date=None):
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
190 user = (user or
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
191 os.environ.get("HGUSER") or
55
2add70d51441 From: Thomas Arendsen Hein <thomas@intevation.de>
mpm@selenic.com
parents: 48
diff changeset
192 os.environ.get("EMAIL") or
2add70d51441 From: Thomas Arendsen Hein <thomas@intevation.de>
mpm@selenic.com
parents: 48
diff changeset
193 os.environ.get("LOGNAME", "unknown") + '@' + socket.getfqdn())
203
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
194 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
195 list.sort()
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
196 l = [hex(manifest), user, date] + list + ["", desc]
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
197 text = "\n".join(l)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
198 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
199
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
200 class dirstate:
244
43105253cf5e root relative IO and valid commit states
mpm@selenic.com
parents: 241
diff changeset
201 def __init__(self, opener, ui, root):
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
202 self.opener = opener
244
43105253cf5e root relative IO and valid commit states
mpm@selenic.com
parents: 241
diff changeset
203 self.root = root
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
204 self.dirty = 0
20
a664c2b624cf The actual hg remove fix from Thomas Hein
mpm@selenic.com
parents: 19
diff changeset
205 self.ui = ui
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
206 self.map = None
227
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
207 self.pl = None
363
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
208 self.copies = {}
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
209
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
210 def __del__(self):
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
211 if self.dirty:
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
212 self.write()
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
213
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
214 def __getitem__(self, key):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
215 try:
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
216 return self.map[key]
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
217 except TypeError:
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
218 self.read()
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
219 return self[key]
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
221 def __contains__(self, key):
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
222 if not self.map: self.read()
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
223 return key in self.map
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
224
227
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
225 def parents(self):
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
226 if not self.pl:
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
227 self.read()
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
228 return self.pl
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
229
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
230 def setparents(self, p1, p2 = nullid):
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
231 self.dirty = 1
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
232 self.pl = p1, p2
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
233
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
234 def state(self, key):
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
235 try:
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
236 return self[key][0]
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
237 except KeyError:
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
238 return "?"
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
239
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
240 def read(self):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
241 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
242
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
243 self.map = {}
227
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
244 self.pl = [nullid, nullid]
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
245 try:
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
246 st = self.opener("dirstate").read()
311
3b17056b72dc fix KeyErrors from reading empty dirstate
mpm@selenic.com
parents: 308
diff changeset
247 if not st: return
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
248 except: return
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
249
227
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
250 self.pl = [st[:20], st[20: 40]]
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
251
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
252 pos = 40
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
253 while pos < len(st):
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
254 e = struct.unpack(">cllll", st[pos:pos+17])
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
255 l = e[4]
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
256 pos += 17
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
257 f = st[pos:pos + l]
363
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
258 if '\0' in f:
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
259 f, c = f.split('\0')
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
260 self.copies[f] = c
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
261 self.map[f] = e[:4]
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
262 pos += l
363
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
263
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
264 def copy(self, source, dest):
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
265 self.read()
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
266 self.dirty = 1
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
267 self.copies[dest] = source
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
268
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
269 def copied(self, file):
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
270 return self.copies.get(file, None)
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
271
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
272 def update(self, files, state):
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
273 ''' current states:
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
274 n normal
231
15e7c6cee929 add 'm' state to dirstates
mpm@selenic.com
parents: 230
diff changeset
275 m needs merging
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
276 r marked for removal
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
277 a marked for addition'''
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
278
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
279 if not files: return
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
280 self.read()
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
281 self.dirty = 1
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
282 for f in files:
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
283 if state == "r":
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
284 self.map[f] = ('r', 0, 0, 0)
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
285 else:
253
2da0a56aa1fd Remove invalid state from dirstate
mpm@selenic.com
parents: 251
diff changeset
286 s = os.stat(os.path.join(self.root, f))
2da0a56aa1fd Remove invalid state from dirstate
mpm@selenic.com
parents: 251
diff changeset
287 self.map[f] = (state, s.st_mode, s.st_size, s.st_mtime)
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
288
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
289 def forget(self, files):
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
290 if not files: return
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
291 self.read()
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
292 self.dirty = 1
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
293 for f in files:
20
a664c2b624cf The actual hg remove fix from Thomas Hein
mpm@selenic.com
parents: 19
diff changeset
294 try:
a664c2b624cf The actual hg remove fix from Thomas Hein
mpm@selenic.com
parents: 19
diff changeset
295 del self.map[f]
a664c2b624cf The actual hg remove fix from Thomas Hein
mpm@selenic.com
parents: 19
diff changeset
296 except KeyError:
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
297 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
298 pass
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
299
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
300 def clear(self):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
301 self.map = {}
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
302 self.dirty = 1
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 def write(self):
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
305 st = self.opener("dirstate", "w")
227
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
306 st.write("".join(self.pl))
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
307 for f, e in self.map.items():
363
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
308 c = self.copied(f)
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
309 if c:
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
310 f = f + "\0" + c
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
311 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
312 st.write(e + f)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
313 self.dirty = 0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
314
363
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
315 def dup(self):
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
316 self.read()
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
317 return self.map.copy()
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
318
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
319 # used to avoid circular references so destructors work
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
320 def opener(base):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
321 p = base
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
322 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
323 if p[:7] == "http://":
6daf7757e92b Fix network pull of repo files with "%" in their base64 encoding.
mpm@selenic.com
parents: 10
diff changeset
324 f = os.path.join(p, urllib.quote(path))
372
4b0f562c61f4 Move httprangereader into its own file
mpm@selenic.com
parents: 363
diff changeset
325 return httprangereader.httprangereader(f)
15
6daf7757e92b Fix network pull of repo files with "%" in their base64 encoding.
mpm@selenic.com
parents: 10
diff changeset
326
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
327 f = os.path.join(p, path)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
328
292
09364bcebdf0 Make most file opening binary
mpm@selenic.com
parents: 291
diff changeset
329 mode += "b" # for that other OS
09364bcebdf0 Make most file opening binary
mpm@selenic.com
parents: 291
diff changeset
330
09364bcebdf0 Make most file opening binary
mpm@selenic.com
parents: 291
diff changeset
331 if mode[0] != "r":
110
c37c7f784ee3 Move hg from storing files in data with base64 encoding to full
mpm@selenic.com
parents: 109
diff changeset
332 try:
c37c7f784ee3 Move hg from storing files in data with base64 encoding to full
mpm@selenic.com
parents: 109
diff changeset
333 s = os.stat(f)
c37c7f784ee3 Move hg from storing files in data with base64 encoding to full
mpm@selenic.com
parents: 109
diff changeset
334 except OSError:
c37c7f784ee3 Move hg from storing files in data with base64 encoding to full
mpm@selenic.com
parents: 109
diff changeset
335 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
336 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
337 os.makedirs(d)
c37c7f784ee3 Move hg from storing files in data with base64 encoding to full
mpm@selenic.com
parents: 109
diff changeset
338 else:
c37c7f784ee3 Move hg from storing files in data with base64 encoding to full
mpm@selenic.com
parents: 109
diff changeset
339 if s.st_nlink > 1:
417
f2d1f5fd0179 [PATCH] file type fixes for the other 'OS'
mpm@selenic.com
parents: 416
diff changeset
340 file(f + ".tmp", "wb").write(file(f, "rb").read())
110
c37c7f784ee3 Move hg from storing files in data with base64 encoding to full
mpm@selenic.com
parents: 109
diff changeset
341 os.rename(f+".tmp", f)
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
342
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
343 return file(f, mode)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
344
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
345 return o
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
346
60
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
347 class localrepository:
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
348 def __init__(self, ui, path=None, create=0):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
349 self.remote = 0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
350 if path and path[:7] == "http://":
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
351 self.remote = 1
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
352 self.path = path
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
353 else:
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
354 if not path:
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
355 p = os.getcwd()
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
356 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
357 p = os.path.dirname(p)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
358 if p == "/": raise "No repo found"
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
359 path = p
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
360 self.path = os.path.join(path, ".hg")
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
361
405
99470ae6b424 Check if repository exists
mpm@selenic.com
parents: 402
diff changeset
362 if not create and not os.path.isdir(self.path):
99470ae6b424 Check if repository exists
mpm@selenic.com
parents: 402
diff changeset
363 raise "repository %s not found" % self.path
99470ae6b424 Check if repository exists
mpm@selenic.com
parents: 402
diff changeset
364
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
365 self.root = path
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
366 self.ui = ui
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
367
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
368 if create:
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
369 os.mkdir(self.path)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
370 os.mkdir(self.join("data"))
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
371
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
372 self.opener = opener(self.path)
291
2c4f2be05587 Add wopener for opening files in the working directory
mpm@selenic.com
parents: 288
diff changeset
373 self.wopener = opener(self.root)
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
374 self.manifest = manifest(self.opener)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
375 self.changelog = changelog(self.opener)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
376 self.ignorelist = None
343
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
377 self.tagscache = None
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
378 self.nodetagscache = None
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
379
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
380 if not self.remote:
244
43105253cf5e root relative IO and valid commit states
mpm@selenic.com
parents: 241
diff changeset
381 self.dirstate = dirstate(self.opener, ui, self.root)
337
c3d873ef4b31 Add support for .hg/hgrc file
mpm@selenic.com
parents: 330
diff changeset
382 try:
c3d873ef4b31 Add support for .hg/hgrc file
mpm@selenic.com
parents: 330
diff changeset
383 self.ui.readconfig(self.opener("hgrc"))
c3d873ef4b31 Add support for .hg/hgrc file
mpm@selenic.com
parents: 330
diff changeset
384 except IOError: pass
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
385
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
386 def ignore(self, f):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
387 if self.ignorelist is None:
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
388 self.ignorelist = []
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
389 try:
417
f2d1f5fd0179 [PATCH] file type fixes for the other 'OS'
mpm@selenic.com
parents: 416
diff changeset
390 l = file(self.wjoin(".hgignore"))
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
391 for pat in l:
9
b4d0c3786ad3 Ignore empty ignore patterns
mpm@selenic.com
parents: 4
diff changeset
392 if pat != "\n":
419
28511fc21073 [PATCH] file seperator handling for the other 'OS'
mpm@selenic.com
parents: 418
diff changeset
393 self.ignorelist.append(re.compile(util.pconvert(pat[:-1])))
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
394 except IOError: pass
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
395 for pat in self.ignorelist:
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
396 if pat.search(f): return True
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
397 return False
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
398
343
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
399 def tags(self):
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
400 '''return a mapping of tag to node'''
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
401 if not self.tagscache:
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
402 self.tagscache = {}
67
a182f2561c8e Add tag support
mpm@selenic.com
parents: 65
diff changeset
403 try:
254
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 253
diff changeset
404 # read each head of the tags file, ending with the tip
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 253
diff changeset
405 # and add each tag found to the map, with "newer" ones
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 253
diff changeset
406 # taking precedence
67
a182f2561c8e Add tag support
mpm@selenic.com
parents: 65
diff changeset
407 fl = self.file(".hgtags")
254
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 253
diff changeset
408 h = fl.heads()
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 253
diff changeset
409 h.reverse()
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 253
diff changeset
410 for r in h:
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 253
diff changeset
411 for l in fl.revision(r).splitlines():
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 253
diff changeset
412 if l:
385
e9e1efd5291c Fixed problems with extra spaces around tags in .hgtags
Thomas Arendsen Hein <thomas@intevation.de>
parents: 383
diff changeset
413 n, k = l.split(" ", 1)
e9e1efd5291c Fixed problems with extra spaces around tags in .hgtags
Thomas Arendsen Hein <thomas@intevation.de>
parents: 383
diff changeset
414 self.tagscache[k.strip()] = bin(n)
67
a182f2561c8e Add tag support
mpm@selenic.com
parents: 65
diff changeset
415 except KeyError: pass
343
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
416 self.tagscache['tip'] = self.changelog.tip()
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
417
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
418 return self.tagscache
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
419
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
420 def tagslist(self):
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
421 '''return a list of tags ordered by revision'''
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
422 l = []
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
423 for t,n in self.tags().items():
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
424 try:
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
425 r = self.changelog.rev(n)
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
426 except:
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
427 r = -2 # sort to the beginning of the list if unknown
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
428 l.append((r,t,n))
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
429 l.sort()
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
430 return [(t,n) for r,t,n in l]
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
431
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
432 def nodetags(self, node):
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
433 '''return the tags associated with a node'''
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
434 if not self.nodetagscache:
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
435 self.nodetagscache = {}
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
436 for t,n in self.tags().items():
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
437 self.nodetagscache.setdefault(n,[]).append(t)
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
438 return self.nodetagscache.get(node, [])
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
439
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
440 def lookup(self, key):
67
a182f2561c8e Add tag support
mpm@selenic.com
parents: 65
diff changeset
441 try:
343
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
442 return self.tags()[key]
67
a182f2561c8e Add tag support
mpm@selenic.com
parents: 65
diff changeset
443 except KeyError:
a182f2561c8e Add tag support
mpm@selenic.com
parents: 65
diff changeset
444 return self.changelog.lookup(key)
a182f2561c8e Add tag support
mpm@selenic.com
parents: 65
diff changeset
445
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
446 def join(self, f):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
447 return os.path.join(self.path, f)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
448
244
43105253cf5e root relative IO and valid commit states
mpm@selenic.com
parents: 241
diff changeset
449 def wjoin(self, f):
43105253cf5e root relative IO and valid commit states
mpm@selenic.com
parents: 241
diff changeset
450 return os.path.join(self.root, f)
43105253cf5e root relative IO and valid commit states
mpm@selenic.com
parents: 241
diff changeset
451
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
452 def file(self, f):
192
5d8553352d2e Changes to network protocol
mpm@selenic.com
parents: 191
diff changeset
453 if f[0] == '/': f = f[1:]
144
ea9188538222 Fix transaction handling bug by reverting fileopener change
mpm@selenic.com
parents: 140
diff changeset
454 return filelog(self.opener, f)
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
455
291
2c4f2be05587 Add wopener for opening files in the working directory
mpm@selenic.com
parents: 288
diff changeset
456 def wfile(self, f, mode='r'):
2c4f2be05587 Add wopener for opening files in the working directory
mpm@selenic.com
parents: 288
diff changeset
457 return self.wopener(f, mode)
2c4f2be05587 Add wopener for opening files in the working directory
mpm@selenic.com
parents: 288
diff changeset
458
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
459 def transaction(self):
251
3fd8fc14b12f backup dirstate for undo
mpm@selenic.com
parents: 249
diff changeset
460 # save dirstate for undo
263
e8eb427c6d71 Fix empty repository transaction bug
mpm@selenic.com
parents: 262
diff changeset
461 try:
e8eb427c6d71 Fix empty repository transaction bug
mpm@selenic.com
parents: 262
diff changeset
462 ds = self.opener("dirstate").read()
e8eb427c6d71 Fix empty repository transaction bug
mpm@selenic.com
parents: 262
diff changeset
463 except IOError:
e8eb427c6d71 Fix empty repository transaction bug
mpm@selenic.com
parents: 262
diff changeset
464 ds = ""
251
3fd8fc14b12f backup dirstate for undo
mpm@selenic.com
parents: 249
diff changeset
465 self.opener("undo.dirstate", "w").write(ds)
262
3db700146536 implement demand loading hack
mpm@selenic.com
parents: 256
diff changeset
466
3db700146536 implement demand loading hack
mpm@selenic.com
parents: 256
diff changeset
467 return transaction.transaction(self.opener, self.join("journal"),
3db700146536 implement demand loading hack
mpm@selenic.com
parents: 256
diff changeset
468 self.join("undo"))
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
469
210
d2badbd7d1ad hg undo: fixup working dir state
mpm@selenic.com
parents: 207
diff changeset
470 def recover(self):
225
1651a3e61925 fix repo locking
mpm@selenic.com
parents: 224
diff changeset
471 lock = self.lock()
210
d2badbd7d1ad hg undo: fixup working dir state
mpm@selenic.com
parents: 207
diff changeset
472 if os.path.exists(self.join("recover")):
d2badbd7d1ad hg undo: fixup working dir state
mpm@selenic.com
parents: 207
diff changeset
473 self.ui.status("attempting to rollback interrupted transaction\n")
262
3db700146536 implement demand loading hack
mpm@selenic.com
parents: 256
diff changeset
474 return transaction.rollback(self.opener, self.join("recover"))
210
d2badbd7d1ad hg undo: fixup working dir state
mpm@selenic.com
parents: 207
diff changeset
475 else:
d2badbd7d1ad hg undo: fixup working dir state
mpm@selenic.com
parents: 207
diff changeset
476 self.ui.warn("no interrupted transaction available\n")
d2badbd7d1ad hg undo: fixup working dir state
mpm@selenic.com
parents: 207
diff changeset
477
d2badbd7d1ad hg undo: fixup working dir state
mpm@selenic.com
parents: 207
diff changeset
478 def undo(self):
225
1651a3e61925 fix repo locking
mpm@selenic.com
parents: 224
diff changeset
479 lock = self.lock()
210
d2badbd7d1ad hg undo: fixup working dir state
mpm@selenic.com
parents: 207
diff changeset
480 if os.path.exists(self.join("undo")):
d2badbd7d1ad hg undo: fixup working dir state
mpm@selenic.com
parents: 207
diff changeset
481 self.ui.status("attempting to rollback last transaction\n")
262
3db700146536 implement demand loading hack
mpm@selenic.com
parents: 256
diff changeset
482 transaction.rollback(self.opener, self.join("undo"))
251
3fd8fc14b12f backup dirstate for undo
mpm@selenic.com
parents: 249
diff changeset
483 self.dirstate = None
3fd8fc14b12f backup dirstate for undo
mpm@selenic.com
parents: 249
diff changeset
484 os.rename(self.join("undo.dirstate"), self.join("dirstate"))
3fd8fc14b12f backup dirstate for undo
mpm@selenic.com
parents: 249
diff changeset
485 self.dirstate = dirstate(self.opener, self.ui, self.root)
163
f38c90953c2c Make undo and recover friendlier
mpm@selenic.com
parents: 162
diff changeset
486 else:
210
d2badbd7d1ad hg undo: fixup working dir state
mpm@selenic.com
parents: 207
diff changeset
487 self.ui.warn("no undo information available\n")
162
5dcbe4d9a30c Implement recover and undo commands
mpm@selenic.com
parents: 161
diff changeset
488
161
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents: 155
diff changeset
489 def lock(self, wait = 1):
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents: 155
diff changeset
490 try:
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents: 155
diff changeset
491 return lock.lock(self.join("lock"), 0)
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents: 155
diff changeset
492 except lock.LockHeld, inst:
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents: 155
diff changeset
493 if wait:
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents: 155
diff changeset
494 self.ui.warn("waiting for lock held by %s\n" % inst.args[0])
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents: 155
diff changeset
495 return lock.lock(self.join("lock"), wait)
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents: 155
diff changeset
496 raise inst
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents: 155
diff changeset
497
203
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
498 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
499 p1 = p1 or self.dirstate.parents()[0] or nullid
2502aa663484 teach rawcommit about dirstate.parents()
mpm@selenic.com
parents: 227
diff changeset
500 p2 = p2 or self.dirstate.parents()[1] or nullid
302
498fb0fa2795 various fixups for git import
mpm@selenic.com
parents: 299
diff changeset
501 c1 = self.changelog.read(p1)
498fb0fa2795 various fixups for git import
mpm@selenic.com
parents: 299
diff changeset
502 c2 = self.changelog.read(p2)
498fb0fa2795 various fixups for git import
mpm@selenic.com
parents: 299
diff changeset
503 m1 = self.manifest.read(c1[0])
498fb0fa2795 various fixups for git import
mpm@selenic.com
parents: 299
diff changeset
504 mf1 = self.manifest.readflags(c1[0])
498fb0fa2795 various fixups for git import
mpm@selenic.com
parents: 299
diff changeset
505 m2 = self.manifest.read(c2[0])
498fb0fa2795 various fixups for git import
mpm@selenic.com
parents: 299
diff changeset
506
203
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
507 tr = self.transaction()
302
498fb0fa2795 various fixups for git import
mpm@selenic.com
parents: 299
diff changeset
508 mm = m1.copy()
498fb0fa2795 various fixups for git import
mpm@selenic.com
parents: 299
diff changeset
509 mfm = mf1.copy()
203
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
510 linkrev = self.changelog.count()
314
3402cb9a4c06 More tweaking to rawcommit for repo conversion
mpm@selenic.com
parents: 313
diff changeset
511 self.dirstate.setparents(p1, p2)
203
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
512 for f in files:
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
513 try:
302
498fb0fa2795 various fixups for git import
mpm@selenic.com
parents: 299
diff changeset
514 t = self.wfile(f).read()
498fb0fa2795 various fixups for git import
mpm@selenic.com
parents: 299
diff changeset
515 tm = is_exec(self.wjoin(f))
498fb0fa2795 various fixups for git import
mpm@selenic.com
parents: 299
diff changeset
516 r = self.file(f)
498fb0fa2795 various fixups for git import
mpm@selenic.com
parents: 299
diff changeset
517 mfm[f] = tm
360
10519e4cbd02 filelog: add metadata support
mpm@selenic.com
parents: 358
diff changeset
518 mm[f] = r.add(t, {}, tr, linkrev,
302
498fb0fa2795 various fixups for git import
mpm@selenic.com
parents: 299
diff changeset
519 m1.get(f, nullid), m2.get(f, nullid))
314
3402cb9a4c06 More tweaking to rawcommit for repo conversion
mpm@selenic.com
parents: 313
diff changeset
520 self.dirstate.update([f], "n")
203
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
521 except IOError:
314
3402cb9a4c06 More tweaking to rawcommit for repo conversion
mpm@selenic.com
parents: 313
diff changeset
522 try:
3402cb9a4c06 More tweaking to rawcommit for repo conversion
mpm@selenic.com
parents: 313
diff changeset
523 del mm[f]
3402cb9a4c06 More tweaking to rawcommit for repo conversion
mpm@selenic.com
parents: 313
diff changeset
524 del mfm[f]
3402cb9a4c06 More tweaking to rawcommit for repo conversion
mpm@selenic.com
parents: 313
diff changeset
525 self.dirstate.forget([f])
3402cb9a4c06 More tweaking to rawcommit for repo conversion
mpm@selenic.com
parents: 313
diff changeset
526 except:
3402cb9a4c06 More tweaking to rawcommit for repo conversion
mpm@selenic.com
parents: 313
diff changeset
527 # deleted from p2?
3402cb9a4c06 More tweaking to rawcommit for repo conversion
mpm@selenic.com
parents: 313
diff changeset
528 pass
203
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
529
302
498fb0fa2795 various fixups for git import
mpm@selenic.com
parents: 299
diff changeset
530 mnode = self.manifest.add(mm, mfm, tr, linkrev, c1[0], c2[0])
498fb0fa2795 various fixups for git import
mpm@selenic.com
parents: 299
diff changeset
531 n = self.changelog.add(mnode, files, text, tr, p1, p2, user, date)
203
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
532 tr.close()
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
533
317
b18ce742566a hg commit: user and date options
mpm@selenic.com
parents: 314
diff changeset
534 def commit(self, files = None, text = "", user = None, date = None):
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
535 commit = []
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
536 remove = []
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
537 if files:
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
538 for f in files:
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
539 s = self.dirstate.state(f)
244
43105253cf5e root relative IO and valid commit states
mpm@selenic.com
parents: 241
diff changeset
540 if s in 'nmai':
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
541 commit.append(f)
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
542 elif s == 'r':
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
543 remove.append(f)
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
544 else:
244
43105253cf5e root relative IO and valid commit states
mpm@selenic.com
parents: 241
diff changeset
545 self.ui.warn("%s not tracked!\n" % f)
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
546 else:
230
00ea3613f82c make diffdir default to dirstate.parents()
mpm@selenic.com
parents: 229
diff changeset
547 (c, a, d, u) = self.diffdir(self.root)
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
548 commit = c + a
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
549 remove = d
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
550
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
551 if not commit and not remove:
151
1f6c61a60586 Bail on attempts to do an empty commit
mpm@selenic.com
parents: 149
diff changeset
552 self.ui.status("nothing changed\n")
1f6c61a60586 Bail on attempts to do an empty commit
mpm@selenic.com
parents: 149
diff changeset
553 return
1f6c61a60586 Bail on attempts to do an empty commit
mpm@selenic.com
parents: 149
diff changeset
554
229
1b11da6ee69e teach commit about dirstate.parents()
mpm@selenic.com
parents: 228
diff changeset
555 p1, p2 = self.dirstate.parents()
1b11da6ee69e teach commit about dirstate.parents()
mpm@selenic.com
parents: 228
diff changeset
556 c1 = self.changelog.read(p1)
1b11da6ee69e teach commit about dirstate.parents()
mpm@selenic.com
parents: 228
diff changeset
557 c2 = self.changelog.read(p2)
1b11da6ee69e teach commit about dirstate.parents()
mpm@selenic.com
parents: 228
diff changeset
558 m1 = self.manifest.read(c1[0])
276
10e325db7347 add tracking of execute permissions
mpm@selenic.com
parents: 275
diff changeset
559 mf1 = self.manifest.readflags(c1[0])
229
1b11da6ee69e teach commit about dirstate.parents()
mpm@selenic.com
parents: 228
diff changeset
560 m2 = self.manifest.read(c2[0])
225
1651a3e61925 fix repo locking
mpm@selenic.com
parents: 224
diff changeset
561 lock = self.lock()
151
1f6c61a60586 Bail on attempts to do an empty commit
mpm@selenic.com
parents: 149
diff changeset
562 tr = self.transaction()
1f6c61a60586 Bail on attempts to do an empty commit
mpm@selenic.com
parents: 149
diff changeset
563
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
564 # check in files
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
565 new = {}
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
566 linkrev = self.changelog.count()
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
567 commit.sort()
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
568 for f in commit:
83
9fd5b35cfc45 Add -q quiet option
mpm@selenic.com
parents: 79
diff changeset
569 self.ui.note(f + "\n")
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
570 try:
276
10e325db7347 add tracking of execute permissions
mpm@selenic.com
parents: 275
diff changeset
571 fp = self.wjoin(f)
10e325db7347 add tracking of execute permissions
mpm@selenic.com
parents: 275
diff changeset
572 mf1[f] = is_exec(fp)
418
0446f698d38e Minor tweak to binary mode patch
mpm@selenic.com
parents: 417
diff changeset
573 t = self.wfile(f).read()
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
574 except IOError:
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
575 self.warn("trouble committing %s!\n" % f)
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
576 raise
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
577
363
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
578 meta = {}
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
579 cp = self.dirstate.copied(f)
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
580 if cp:
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
581 meta["copy"] = cp
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
582 meta["copyrev"] = hex(m1.get(cp, m2.get(cp, nullid)))
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
583 self.ui.debug(" %s: copy %s:%s\n" % (f, cp, meta["copyrev"]))
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
584
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
585 r = self.file(f)
229
1b11da6ee69e teach commit about dirstate.parents()
mpm@selenic.com
parents: 228
diff changeset
586 fp1 = m1.get(f, nullid)
1b11da6ee69e teach commit about dirstate.parents()
mpm@selenic.com
parents: 228
diff changeset
587 fp2 = m2.get(f, nullid)
363
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
588 new[f] = r.add(t, meta, tr, linkrev, fp1, fp2)
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
589
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
590 # update manifest
229
1b11da6ee69e teach commit about dirstate.parents()
mpm@selenic.com
parents: 228
diff changeset
591 m1.update(new)
416
5e9e8b8d2629 [PATCH] Removal of a file added by merging branches
mpm@selenic.com
parents: 415
diff changeset
592 for f in remove:
5e9e8b8d2629 [PATCH] Removal of a file added by merging branches
mpm@selenic.com
parents: 415
diff changeset
593 if f in m1:
5e9e8b8d2629 [PATCH] Removal of a file added by merging branches
mpm@selenic.com
parents: 415
diff changeset
594 del m1[f]
276
10e325db7347 add tracking of execute permissions
mpm@selenic.com
parents: 275
diff changeset
595 mn = self.manifest.add(m1, mf1, tr, linkrev, c1[0], c2[0])
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
596
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
597 # add changeset
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
598 new = new.keys()
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
599 new.sort()
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
600
288
97c87ac6d7a4 commit: edit text fixups
mpm@selenic.com
parents: 287
diff changeset
601 if not text:
97c87ac6d7a4 commit: edit text fixups
mpm@selenic.com
parents: 287
diff changeset
602 edittext = "\n" + "HG: manifest hash %s\n" % hex(mn)
97c87ac6d7a4 commit: edit text fixups
mpm@selenic.com
parents: 287
diff changeset
603 edittext += "".join(["HG: changed %s\n" % f for f in new])
97c87ac6d7a4 commit: edit text fixups
mpm@selenic.com
parents: 287
diff changeset
604 edittext += "".join(["HG: removed %s\n" % f for f in remove])
97c87ac6d7a4 commit: edit text fixups
mpm@selenic.com
parents: 287
diff changeset
605 edittext = self.ui.edit(edittext)
97c87ac6d7a4 commit: edit text fixups
mpm@selenic.com
parents: 287
diff changeset
606 if not edittext.rstrip():
97c87ac6d7a4 commit: edit text fixups
mpm@selenic.com
parents: 287
diff changeset
607 return 1
97c87ac6d7a4 commit: edit text fixups
mpm@selenic.com
parents: 287
diff changeset
608 text = edittext
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
609
317
b18ce742566a hg commit: user and date options
mpm@selenic.com
parents: 314
diff changeset
610 n = self.changelog.add(mn, new, text, tr, p1, p2, user, date)
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
611 tr.close()
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
612
229
1b11da6ee69e teach commit about dirstate.parents()
mpm@selenic.com
parents: 228
diff changeset
613 self.dirstate.setparents(n)
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
614 self.dirstate.update(new, "n")
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
615 self.dirstate.forget(remove)
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
616
230
00ea3613f82c make diffdir default to dirstate.parents()
mpm@selenic.com
parents: 229
diff changeset
617 def diffdir(self, path, changeset = None):
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
618 changed = []
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
619 added = []
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
620 unknown = []
4
ce3bd728b858 Fix exception handling for reading current working version
mpm@selenic.com
parents: 0
diff changeset
621 mf = {}
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
622
29
4d3a5dcb6972 Make diffdir take a revision argument
mpm@selenic.com
parents: 25
diff changeset
623 if changeset:
4d3a5dcb6972 Make diffdir take a revision argument
mpm@selenic.com
parents: 25
diff changeset
624 change = self.changelog.read(changeset)
4
ce3bd728b858 Fix exception handling for reading current working version
mpm@selenic.com
parents: 0
diff changeset
625 mf = self.manifest.read(change[0])
230
00ea3613f82c make diffdir default to dirstate.parents()
mpm@selenic.com
parents: 229
diff changeset
626 dc = dict.fromkeys(mf)
00ea3613f82c make diffdir default to dirstate.parents()
mpm@selenic.com
parents: 229
diff changeset
627 else:
00ea3613f82c make diffdir default to dirstate.parents()
mpm@selenic.com
parents: 229
diff changeset
628 changeset = self.dirstate.parents()[0]
00ea3613f82c make diffdir default to dirstate.parents()
mpm@selenic.com
parents: 229
diff changeset
629 change = self.changelog.read(changeset)
00ea3613f82c make diffdir default to dirstate.parents()
mpm@selenic.com
parents: 229
diff changeset
630 mf = self.manifest.read(change[0])
363
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
631 dc = self.dirstate.dup()
29
4d3a5dcb6972 Make diffdir take a revision argument
mpm@selenic.com
parents: 25
diff changeset
632
4d3a5dcb6972 Make diffdir take a revision argument
mpm@selenic.com
parents: 25
diff changeset
633 def fcmp(fn):
291
2c4f2be05587 Add wopener for opening files in the working directory
mpm@selenic.com
parents: 288
diff changeset
634 t1 = self.wfile(fn).read()
29
4d3a5dcb6972 Make diffdir take a revision argument
mpm@selenic.com
parents: 25
diff changeset
635 t2 = self.file(fn).revision(mf[fn])
4d3a5dcb6972 Make diffdir take a revision argument
mpm@selenic.com
parents: 25
diff changeset
636 return cmp(t1, t2)
4d3a5dcb6972 Make diffdir take a revision argument
mpm@selenic.com
parents: 25
diff changeset
637
312
09375250eb31 Optimize diff and status in subdirectories
mpm@selenic.com
parents: 311
diff changeset
638 for dir, subdirs, files in os.walk(path):
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
639 d = dir[len(self.root)+1:]
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
640 if ".hg" in subdirs: subdirs.remove(".hg")
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
641
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
642 for f in files:
419
28511fc21073 [PATCH] file seperator handling for the other 'OS'
mpm@selenic.com
parents: 418
diff changeset
643 fn = util.pconvert(os.path.join(d, f))
64
b3e2ddff0159 Diff in subdirectories from Jake Edge
mpm@selenic.com
parents: 60
diff changeset
644 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
645 except: continue
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
646 if fn in dc:
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
647 c = dc[fn]
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
648 del dc[fn]
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
649 if not c:
29
4d3a5dcb6972 Make diffdir take a revision argument
mpm@selenic.com
parents: 25
diff changeset
650 if fcmp(fn):
4d3a5dcb6972 Make diffdir take a revision argument
mpm@selenic.com
parents: 25
diff changeset
651 changed.append(fn)
231
15e7c6cee929 add 'm' state to dirstates
mpm@selenic.com
parents: 230
diff changeset
652 elif c[0] == 'm':
15e7c6cee929 add 'm' state to dirstates
mpm@selenic.com
parents: 230
diff changeset
653 changed.append(fn)
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
654 elif c[0] == 'a':
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
655 added.append(fn)
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
656 elif c[0] == 'r':
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
657 unknown.append(fn)
276
10e325db7347 add tracking of execute permissions
mpm@selenic.com
parents: 275
diff changeset
658 elif c[2] != s.st_size or (c[1] ^ s.st_mode) & 0100:
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
659 changed.append(fn)
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
660 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
661 if fcmp(fn):
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
662 changed.append(fn)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
663 else:
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
664 if self.ignore(fn): continue
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
665 unknown.append(fn)
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
666
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
667 deleted = dc.keys()
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
668 deleted.sort()
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
669
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
670 return (changed, added, deleted, unknown)
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
671
32
6a4d8718bee0 Add diffrevs function to compare two nodes
mpm@selenic.com
parents: 30
diff changeset
672 def diffrevs(self, node1, node2):
33
98633e60067c Support for 0, 1, or 2 diff revs
mpm@selenic.com
parents: 32
diff changeset
673 changed, added = [], []
32
6a4d8718bee0 Add diffrevs function to compare two nodes
mpm@selenic.com
parents: 30
diff changeset
674
6a4d8718bee0 Add diffrevs function to compare two nodes
mpm@selenic.com
parents: 30
diff changeset
675 change = self.changelog.read(node1)
6a4d8718bee0 Add diffrevs function to compare two nodes
mpm@selenic.com
parents: 30
diff changeset
676 mf1 = self.manifest.read(change[0])
33
98633e60067c Support for 0, 1, or 2 diff revs
mpm@selenic.com
parents: 32
diff changeset
677 change = self.changelog.read(node2)
32
6a4d8718bee0 Add diffrevs function to compare two nodes
mpm@selenic.com
parents: 30
diff changeset
678 mf2 = self.manifest.read(change[0])
6a4d8718bee0 Add diffrevs function to compare two nodes
mpm@selenic.com
parents: 30
diff changeset
679
6a4d8718bee0 Add diffrevs function to compare two nodes
mpm@selenic.com
parents: 30
diff changeset
680 for fn in mf2:
6a4d8718bee0 Add diffrevs function to compare two nodes
mpm@selenic.com
parents: 30
diff changeset
681 if mf1.has_key(fn):
6a4d8718bee0 Add diffrevs function to compare two nodes
mpm@selenic.com
parents: 30
diff changeset
682 if mf1[fn] != mf2[fn]:
6a4d8718bee0 Add diffrevs function to compare two nodes
mpm@selenic.com
parents: 30
diff changeset
683 changed.append(fn)
6a4d8718bee0 Add diffrevs function to compare two nodes
mpm@selenic.com
parents: 30
diff changeset
684 del mf1[fn]
6a4d8718bee0 Add diffrevs function to compare two nodes
mpm@selenic.com
parents: 30
diff changeset
685 else:
6a4d8718bee0 Add diffrevs function to compare two nodes
mpm@selenic.com
parents: 30
diff changeset
686 added.append(fn)
6a4d8718bee0 Add diffrevs function to compare two nodes
mpm@selenic.com
parents: 30
diff changeset
687
6a4d8718bee0 Add diffrevs function to compare two nodes
mpm@selenic.com
parents: 30
diff changeset
688 deleted = mf1.keys()
6a4d8718bee0 Add diffrevs function to compare two nodes
mpm@selenic.com
parents: 30
diff changeset
689 deleted.sort()
6a4d8718bee0 Add diffrevs function to compare two nodes
mpm@selenic.com
parents: 30
diff changeset
690
6a4d8718bee0 Add diffrevs function to compare two nodes
mpm@selenic.com
parents: 30
diff changeset
691 return (changed, added, deleted)
6a4d8718bee0 Add diffrevs function to compare two nodes
mpm@selenic.com
parents: 30
diff changeset
692
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
693 def add(self, list):
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
694 for f in list:
244
43105253cf5e root relative IO and valid commit states
mpm@selenic.com
parents: 241
diff changeset
695 p = self.wjoin(f)
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
696 if not os.path.isfile(p):
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
697 self.ui.warn("%s does not exist!\n" % f)
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
698 elif self.dirstate.state(f) == 'n':
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
699 self.ui.warn("%s already tracked!\n" % f)
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
700 else:
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
701 self.dirstate.update([f], "a")
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
702
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
703 def forget(self, list):
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
704 for f in list:
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
705 if self.dirstate.state(f) not in 'ai':
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
706 self.ui.warn("%s not added!\n" % f)
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
707 else:
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
708 self.dirstate.forget([f])
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
709
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
710 def remove(self, list):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
711 for f in list:
244
43105253cf5e root relative IO and valid commit states
mpm@selenic.com
parents: 241
diff changeset
712 p = self.wjoin(f)
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
713 if os.path.isfile(p):
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
714 self.ui.warn("%s still exists!\n" % f)
402
2fe8d66e3075 [PATCH] (3/4) Removing an added file
mpm@selenic.com
parents: 385
diff changeset
715 elif self.dirstate.state(f) == 'a':
2fe8d66e3075 [PATCH] (3/4) Removing an added file
mpm@selenic.com
parents: 385
diff changeset
716 self.ui.warn("%s never committed!\n" % f)
2fe8d66e3075 [PATCH] (3/4) Removing an added file
mpm@selenic.com
parents: 385
diff changeset
717 self.dirstate.forget(f)
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
718 elif f not in self.dirstate:
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
719 self.ui.warn("%s not tracked!\n" % f)
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
720 else:
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
721 self.dirstate.update([f], "r")
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
722
363
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
723 def copy(self, source, dest):
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
724 p = self.wjoin(dest)
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
725 if not os.path.isfile(dest):
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
726 self.ui.warn("%s does not exist!\n" % dest)
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
727 else:
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
728 if self.dirstate.state(dest) == '?':
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
729 self.dirstate.update([dest], "a")
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
730 self.dirstate.copy(source, dest)
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
731
222
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
732 def heads(self):
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
733 return self.changelog.heads()
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
734
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
735 def branches(self, nodes):
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
736 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
737 b = []
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
738 for n in nodes:
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
739 t = n
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
740 while n:
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
741 p = self.changelog.parents(n)
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
742 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
743 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
744 break
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
745 n = p[0]
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
746 return b
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
747
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
748 def between(self, pairs):
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
749 r = []
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
750
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
751 for top, bottom in pairs:
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
752 n, l, i = top, [], 0
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
753 f = 1
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
754
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
755 while n != bottom:
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
756 p = self.changelog.parents(n)[0]
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
757 if i == f:
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
758 l.append(n)
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
759 f = f * 2
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
760 n = p
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
761 i += 1
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
762
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
763 r.append(l)
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
764
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
765 return r
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
766
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
767 def newer(self, nodes):
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
768 m = {}
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
769 nl = []
94
7daef883134f Refactor merge code
mpm@selenic.com
parents: 90
diff changeset
770 pm = {}
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
771 cl = self.changelog
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
772 t = l = cl.count()
94
7daef883134f Refactor merge code
mpm@selenic.com
parents: 90
diff changeset
773
7daef883134f Refactor merge code
mpm@selenic.com
parents: 90
diff changeset
774 # find the lowest numbered node
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
775 for n in nodes:
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
776 l = min(l, cl.rev(n))
94
7daef883134f Refactor merge code
mpm@selenic.com
parents: 90
diff changeset
777 m[n] = 1
46
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
778
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
779 for i in xrange(l, t):
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
780 n = cl.node(i)
94
7daef883134f Refactor merge code
mpm@selenic.com
parents: 90
diff changeset
781 if n in m: # explicitly listed
7daef883134f Refactor merge code
mpm@selenic.com
parents: 90
diff changeset
782 pm[n] = 1
7daef883134f Refactor merge code
mpm@selenic.com
parents: 90
diff changeset
783 nl.append(n)
7daef883134f Refactor merge code
mpm@selenic.com
parents: 90
diff changeset
784 continue
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
785 for p in cl.parents(n):
94
7daef883134f Refactor merge code
mpm@selenic.com
parents: 90
diff changeset
786 if p in pm: # parent listed
7daef883134f Refactor merge code
mpm@selenic.com
parents: 90
diff changeset
787 pm[n] = 1
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
788 nl.append(n)
94
7daef883134f Refactor merge code
mpm@selenic.com
parents: 90
diff changeset
789 break
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
790
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
791 return nl
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
792
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
793 def getchangegroup(self, remote):
65
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
794 m = self.changelog.nodemap
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
795 search = []
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
796 fetch = []
148
c32286d0a665 Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents: 146
diff changeset
797 seen = {}
c32286d0a665 Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents: 146
diff changeset
798 seenbranch = {}
192
5d8553352d2e Changes to network protocol
mpm@selenic.com
parents: 191
diff changeset
799
190
3dd5ce2fddb6 merge: short-circuit search for merge into empty repo
mpm@selenic.com
parents: 187
diff changeset
800 # 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
801 if self.changelog.tip() == nullid:
222
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
802 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
803 return remote.changegroup([nullid])
3dd5ce2fddb6 merge: short-circuit search for merge into empty repo
mpm@selenic.com
parents: 187
diff changeset
804
3dd5ce2fddb6 merge: short-circuit search for merge into empty repo
mpm@selenic.com
parents: 187
diff changeset
805 # 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
806 self.ui.status("searching for changes\n")
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
807 heads = remote.heads()
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
808 unknown = []
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
809 for h in heads:
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
810 if h not in m:
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
811 unknown.append(h)
46
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
812
222
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
813 if not unknown:
192
5d8553352d2e Changes to network protocol
mpm@selenic.com
parents: 191
diff changeset
814 self.ui.status("nothing to do!\n")
60
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
815 return None
324
ce81bdd91d06 hg merge: some getchangegroup fixups
mpm@selenic.com
parents: 321
diff changeset
816
ce81bdd91d06 hg merge: some getchangegroup fixups
mpm@selenic.com
parents: 321
diff changeset
817 rep = {}
ce81bdd91d06 hg merge: some getchangegroup fixups
mpm@selenic.com
parents: 321
diff changeset
818 reqcnt = 0
ce81bdd91d06 hg merge: some getchangegroup fixups
mpm@selenic.com
parents: 321
diff changeset
819
222
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
820 unknown = remote.branches(unknown)
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
821 while unknown:
324
ce81bdd91d06 hg merge: some getchangegroup fixups
mpm@selenic.com
parents: 321
diff changeset
822 r = []
ce81bdd91d06 hg merge: some getchangegroup fixups
mpm@selenic.com
parents: 321
diff changeset
823 while unknown:
ce81bdd91d06 hg merge: some getchangegroup fixups
mpm@selenic.com
parents: 321
diff changeset
824 n = unknown.pop(0)
ce81bdd91d06 hg merge: some getchangegroup fixups
mpm@selenic.com
parents: 321
diff changeset
825 if n[0] in seen:
ce81bdd91d06 hg merge: some getchangegroup fixups
mpm@selenic.com
parents: 321
diff changeset
826 continue
148
c32286d0a665 Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents: 146
diff changeset
827
324
ce81bdd91d06 hg merge: some getchangegroup fixups
mpm@selenic.com
parents: 321
diff changeset
828 self.ui.debug("examining %s:%s\n" % (short(n[0]), short(n[1])))
ce81bdd91d06 hg merge: some getchangegroup fixups
mpm@selenic.com
parents: 321
diff changeset
829 if n[0] == nullid:
ce81bdd91d06 hg merge: some getchangegroup fixups
mpm@selenic.com
parents: 321
diff changeset
830 break
328
dac675ef6189 hg pull: more query fixes
mpm@selenic.com
parents: 324
diff changeset
831 if n in seenbranch:
324
ce81bdd91d06 hg merge: some getchangegroup fixups
mpm@selenic.com
parents: 321
diff changeset
832 self.ui.debug("branch already found\n")
ce81bdd91d06 hg merge: some getchangegroup fixups
mpm@selenic.com
parents: 321
diff changeset
833 continue
ce81bdd91d06 hg merge: some getchangegroup fixups
mpm@selenic.com
parents: 321
diff changeset
834 if n[1] and n[1] in m: # do we know the base?
ce81bdd91d06 hg merge: some getchangegroup fixups
mpm@selenic.com
parents: 321
diff changeset
835 self.ui.debug("found incomplete branch %s:%s\n"
ce81bdd91d06 hg merge: some getchangegroup fixups
mpm@selenic.com
parents: 321
diff changeset
836 % (short(n[0]), short(n[1])))
ce81bdd91d06 hg merge: some getchangegroup fixups
mpm@selenic.com
parents: 321
diff changeset
837 search.append(n) # schedule branch range for scanning
328
dac675ef6189 hg pull: more query fixes
mpm@selenic.com
parents: 324
diff changeset
838 seenbranch[n] = 1
324
ce81bdd91d06 hg merge: some getchangegroup fixups
mpm@selenic.com
parents: 321
diff changeset
839 else:
ce81bdd91d06 hg merge: some getchangegroup fixups
mpm@selenic.com
parents: 321
diff changeset
840 if n[1] not in seen and n[1] not in fetch:
ce81bdd91d06 hg merge: some getchangegroup fixups
mpm@selenic.com
parents: 321
diff changeset
841 if n[2] in m and n[3] in m:
ce81bdd91d06 hg merge: some getchangegroup fixups
mpm@selenic.com
parents: 321
diff changeset
842 self.ui.debug("found new changeset %s\n" %
ce81bdd91d06 hg merge: some getchangegroup fixups
mpm@selenic.com
parents: 321
diff changeset
843 short(n[1]))
ce81bdd91d06 hg merge: some getchangegroup fixups
mpm@selenic.com
parents: 321
diff changeset
844 fetch.append(n[1]) # earliest unknown
ce81bdd91d06 hg merge: some getchangegroup fixups
mpm@selenic.com
parents: 321
diff changeset
845 continue
ce81bdd91d06 hg merge: some getchangegroup fixups
mpm@selenic.com
parents: 321
diff changeset
846
ce81bdd91d06 hg merge: some getchangegroup fixups
mpm@selenic.com
parents: 321
diff changeset
847 for a in n[2:4]:
ce81bdd91d06 hg merge: some getchangegroup fixups
mpm@selenic.com
parents: 321
diff changeset
848 if a not in rep:
ce81bdd91d06 hg merge: some getchangegroup fixups
mpm@selenic.com
parents: 321
diff changeset
849 r.append(a)
ce81bdd91d06 hg merge: some getchangegroup fixups
mpm@selenic.com
parents: 321
diff changeset
850 rep[a] = 1
ce81bdd91d06 hg merge: some getchangegroup fixups
mpm@selenic.com
parents: 321
diff changeset
851
328
dac675ef6189 hg pull: more query fixes
mpm@selenic.com
parents: 324
diff changeset
852 seen[n[0]] = 1
dac675ef6189 hg pull: more query fixes
mpm@selenic.com
parents: 324
diff changeset
853
324
ce81bdd91d06 hg merge: some getchangegroup fixups
mpm@selenic.com
parents: 321
diff changeset
854 if r:
ce81bdd91d06 hg merge: some getchangegroup fixups
mpm@selenic.com
parents: 321
diff changeset
855 reqcnt += 1
ce81bdd91d06 hg merge: some getchangegroup fixups
mpm@selenic.com
parents: 321
diff changeset
856 self.ui.debug("request %d: %s\n" %
ce81bdd91d06 hg merge: some getchangegroup fixups
mpm@selenic.com
parents: 321
diff changeset
857 (reqcnt, " ".join(map(short, r))))
ce81bdd91d06 hg merge: some getchangegroup fixups
mpm@selenic.com
parents: 321
diff changeset
858 for p in range(0, len(r), 10):
ce81bdd91d06 hg merge: some getchangegroup fixups
mpm@selenic.com
parents: 321
diff changeset
859 for b in remote.branches(r[p:p+10]):
148
c32286d0a665 Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents: 146
diff changeset
860 self.ui.debug("received %s:%s\n" %
c32286d0a665 Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents: 146
diff changeset
861 (short(b[0]), short(b[1])))
c32286d0a665 Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents: 146
diff changeset
862 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
863 unknown.append(b)
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
864
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
865 while search:
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
866 n = search.pop(0)
324
ce81bdd91d06 hg merge: some getchangegroup fixups
mpm@selenic.com
parents: 321
diff changeset
867 reqcnt += 1
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
868 l = remote.between([(n[0], n[1])])[0]
328
dac675ef6189 hg pull: more query fixes
mpm@selenic.com
parents: 324
diff changeset
869 l.append(n[1])
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
870 p = n[0]
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
871 f = 1
328
dac675ef6189 hg pull: more query fixes
mpm@selenic.com
parents: 324
diff changeset
872 for i in l:
dac675ef6189 hg pull: more query fixes
mpm@selenic.com
parents: 324
diff changeset
873 self.ui.debug("narrowing %d:%d %s\n" % (f, len(l), short(i)))
65
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
874 if i in m:
85
58a1a0425c9b Fix merge bug, I hope
mpm@selenic.com
parents: 83
diff changeset
875 if f <= 2:
83
9fd5b35cfc45 Add -q quiet option
mpm@selenic.com
parents: 79
diff changeset
876 self.ui.debug("found new branch changeset %s\n" %
9fd5b35cfc45 Add -q quiet option
mpm@selenic.com
parents: 79
diff changeset
877 short(p))
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
878 fetch.append(p)
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
879 else:
83
9fd5b35cfc45 Add -q quiet option
mpm@selenic.com
parents: 79
diff changeset
880 self.ui.debug("narrowed branch search to %s:%s\n"
9fd5b35cfc45 Add -q quiet option
mpm@selenic.com
parents: 79
diff changeset
881 % (short(p), short(i)))
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
882 search.append((p, i))
65
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
883 break
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
884 p, f = i, f * 2
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
885
65
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
886 for f in fetch:
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
887 if f in m:
83
9fd5b35cfc45 Add -q quiet option
mpm@selenic.com
parents: 79
diff changeset
888 raise "already have", short(f[:4])
9fd5b35cfc45 Add -q quiet option
mpm@selenic.com
parents: 79
diff changeset
889
94
7daef883134f Refactor merge code
mpm@selenic.com
parents: 90
diff changeset
890 self.ui.note("adding new changesets starting at " +
83
9fd5b35cfc45 Add -q quiet option
mpm@selenic.com
parents: 79
diff changeset
891 " ".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
892
324
ce81bdd91d06 hg merge: some getchangegroup fixups
mpm@selenic.com
parents: 321
diff changeset
893 self.ui.debug("%d total queries\n" % reqcnt)
ce81bdd91d06 hg merge: some getchangegroup fixups
mpm@selenic.com
parents: 321
diff changeset
894
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
895 return remote.changegroup(fetch)
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
896
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
897 def changegroup(self, basenodes):
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
898 nodes = self.newer(basenodes)
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
899
46
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
900 # construct the link map
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
901 linkmap = {}
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
902 for n in nodes:
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
903 linkmap[self.changelog.rev(n)] = n
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
904
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
905 # construct a list of all changed files
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
906 changed = {}
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
907 for n in nodes:
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
908 c = self.changelog.read(n)
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
909 for f in c[3]:
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
910 changed[f] = 1
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
911 changed = changed.keys()
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
912 changed.sort()
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
913
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
914 # the changegroup is changesets + manifests + all file revs
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
915 revs = [ self.changelog.rev(n) for n in nodes ]
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
916
192
5d8553352d2e Changes to network protocol
mpm@selenic.com
parents: 191
diff changeset
917 for y in self.changelog.group(linkmap): yield y
5d8553352d2e Changes to network protocol
mpm@selenic.com
parents: 191
diff changeset
918 for y in self.manifest.group(linkmap): yield y
46
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
919 for f in changed:
192
5d8553352d2e Changes to network protocol
mpm@selenic.com
parents: 191
diff changeset
920 yield struct.pack(">l", len(f) + 4) + f
46
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
921 g = self.file(f).group(linkmap)
192
5d8553352d2e Changes to network protocol
mpm@selenic.com
parents: 191
diff changeset
922 for y in g:
5d8553352d2e Changes to network protocol
mpm@selenic.com
parents: 191
diff changeset
923 yield y
46
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
924
65
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
925 def addchangegroup(self, generator):
222
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
926
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
927 class genread:
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
928 def __init__(self, generator):
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
929 self.g = generator
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
930 self.buf = ""
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
931 def read(self, l):
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
932 while l > len(self.buf):
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
933 try:
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
934 self.buf += self.g.next()
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
935 except StopIteration:
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
936 break
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
937 d, self.buf = self.buf[:l], self.buf[l:]
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
938 return d
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
939
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
940 def getchunk():
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
941 d = source.read(4)
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
942 if not d: return ""
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
943 l = struct.unpack(">l", d)[0]
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
944 if l <= 4: return ""
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
945 return source.read(l - 4)
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
946
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
947 def getgroup():
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
948 while 1:
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
949 c = getchunk()
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
950 if not c: break
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
951 yield c
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
952
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
953 def csmap(x):
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
954 self.ui.debug("add changeset %s\n" % short(x))
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
955 return self.changelog.count()
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
956
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
957 def revmap(x):
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
958 return self.changelog.rev(x)
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
959
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
960 if not generator: return
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
961 changesets = files = revisions = 0
225
1651a3e61925 fix repo locking
mpm@selenic.com
parents: 224
diff changeset
962
222
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
963 source = genread(generator)
225
1651a3e61925 fix repo locking
mpm@selenic.com
parents: 224
diff changeset
964 lock = self.lock()
222
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
965 tr = self.transaction()
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
966
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
967 # pull off the changeset group
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
968 self.ui.status("adding changesets\n")
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
969 co = self.changelog.tip()
224
ccbcc4d76f81 fix bad assumption about uniqueness of file versions
mpm@selenic.com
parents: 223
diff changeset
970 cn = self.changelog.addgroup(getgroup(), csmap, tr, 1) # unique
222
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
971 changesets = self.changelog.rev(cn) - self.changelog.rev(co)
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
972
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
973 # pull off the manifest group
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
974 self.ui.status("adding manifests\n")
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
975 mm = self.manifest.tip()
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
976 mo = self.manifest.addgroup(getgroup(), revmap, tr)
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
977
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
978 # process the files
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
979 self.ui.status("adding file revisions\n")
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
980 while 1:
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
981 f = getchunk()
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
982 if not f: break
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
983 self.ui.debug("adding %s revisions\n" % f)
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
984 fl = self.file(f)
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
985 o = fl.tip()
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
986 n = fl.addgroup(getgroup(), revmap, tr)
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
987 revisions += fl.rev(n) - fl.rev(o)
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
988 files += 1
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
989
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
990 self.ui.status(("modified %d files, added %d changesets" +
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
991 " and %d new revisions\n")
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
992 % (files, changesets, revisions))
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
993
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
994 tr.close()
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
995 return
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
996
275
61d45b0ba8fb various merge improvements
mpm@selenic.com
parents: 273
diff changeset
997 def update(self, node, allow=False, force=False):
232
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
998 pl = self.dirstate.parents()
275
61d45b0ba8fb various merge improvements
mpm@selenic.com
parents: 273
diff changeset
999 if not force and pl[1] != nullid:
254
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 253
diff changeset
1000 self.ui.warn("aborting: outstanding uncommitted merges\n")
46
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
1001 return
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
1002
232
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
1003 p1, p2 = pl[0], node
305
719812eb0156 more merge fixes
mpm@selenic.com
parents: 302
diff changeset
1004 pa = self.changelog.ancestor(p1, p2)
232
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
1005 m1n = self.changelog.read(p1)[0]
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
1006 m2n = self.changelog.read(p2)[0]
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
1007 man = self.manifest.ancestor(m1n, m2n)
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
1008 m1 = self.manifest.read(m1n)
276
10e325db7347 add tracking of execute permissions
mpm@selenic.com
parents: 275
diff changeset
1009 mf1 = self.manifest.readflags(m1n)
232
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
1010 m2 = self.manifest.read(m2n)
276
10e325db7347 add tracking of execute permissions
mpm@selenic.com
parents: 275
diff changeset
1011 mf2 = self.manifest.readflags(m2n)
232
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
1012 ma = self.manifest.read(man)
412
40cfa2d0c088 [PATCH]: Typo in localrepository.update
mpm@selenic.com
parents: 408
diff changeset
1013 mfa = self.manifest.readflags(man)
232
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
1014
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
1015 (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
1016
408
3695fbd2c33b [PATCH] Merging files that are deleted in both branches
mpm@selenic.com
parents: 407
diff changeset
1017 # is this a jump, or a merge? i.e. is there a linear path
3695fbd2c33b [PATCH] Merging files that are deleted in both branches
mpm@selenic.com
parents: 407
diff changeset
1018 # from p1 to p2?
3695fbd2c33b [PATCH] Merging files that are deleted in both branches
mpm@selenic.com
parents: 407
diff changeset
1019 linear_path = (pa == p1 or pa == p2)
3695fbd2c33b [PATCH] Merging files that are deleted in both branches
mpm@selenic.com
parents: 407
diff changeset
1020
232
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
1021 # 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
1022 # we care about merging
254
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 253
diff changeset
1023 self.ui.note("resolving manifests\n")
232
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
1024 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
1025 (short(man), short(m1n), short(m2n)))
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
1026
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
1027 merge = {}
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
1028 get = {}
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
1029 remove = []
305
719812eb0156 more merge fixes
mpm@selenic.com
parents: 302
diff changeset
1030 mark = {}
46
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
1031
232
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
1032 # construct a working dir manifest
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
1033 mw = m1.copy()
276
10e325db7347 add tracking of execute permissions
mpm@selenic.com
parents: 275
diff changeset
1034 mfw = mf1.copy()
254
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 253
diff changeset
1035 for f in a + c + u:
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 253
diff changeset
1036 mw[f] = ""
276
10e325db7347 add tracking of execute permissions
mpm@selenic.com
parents: 275
diff changeset
1037 mfw[f] = is_exec(self.wjoin(f))
232
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
1038 for f in d:
254
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 253
diff changeset
1039 if f in mw: del mw[f]
232
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
1040
408
3695fbd2c33b [PATCH] Merging files that are deleted in both branches
mpm@selenic.com
parents: 407
diff changeset
1041 # If we're jumping between revisions (as opposed to merging),
3695fbd2c33b [PATCH] Merging files that are deleted in both branches
mpm@selenic.com
parents: 407
diff changeset
1042 # and if neither the working directory nor the target rev has
3695fbd2c33b [PATCH] Merging files that are deleted in both branches
mpm@selenic.com
parents: 407
diff changeset
1043 # the file, then we need to remove it from the dirstate, to
3695fbd2c33b [PATCH] Merging files that are deleted in both branches
mpm@selenic.com
parents: 407
diff changeset
1044 # prevent the dirstate from listing the file when it is no
3695fbd2c33b [PATCH] Merging files that are deleted in both branches
mpm@selenic.com
parents: 407
diff changeset
1045 # longer in the manifest.
3695fbd2c33b [PATCH] Merging files that are deleted in both branches
mpm@selenic.com
parents: 407
diff changeset
1046 if linear_path and f not in m2:
3695fbd2c33b [PATCH] Merging files that are deleted in both branches
mpm@selenic.com
parents: 407
diff changeset
1047 self.dirstate.forget((f,))
3695fbd2c33b [PATCH] Merging files that are deleted in both branches
mpm@selenic.com
parents: 407
diff changeset
1048
232
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
1049 for f, n in mw.iteritems():
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
1050 if f in m2:
277
79279550c8ff merge: update permissions even if file contents didn't change
mpm@selenic.com
parents: 276
diff changeset
1051 s = 0
79279550c8ff merge: update permissions even if file contents didn't change
mpm@selenic.com
parents: 276
diff changeset
1052
407
0e0d0670b2bc [PATCH] Merging identical changes from another branch
mpm@selenic.com
parents: 405
diff changeset
1053 # is the wfile new since m1, and match m2?
0e0d0670b2bc [PATCH] Merging identical changes from another branch
mpm@selenic.com
parents: 405
diff changeset
1054 if n not in m1:
0e0d0670b2bc [PATCH] Merging identical changes from another branch
mpm@selenic.com
parents: 405
diff changeset
1055 t1 = self.wfile(f).read()
0e0d0670b2bc [PATCH] Merging identical changes from another branch
mpm@selenic.com
parents: 405
diff changeset
1056 t2 = self.file(f).revision(m2[f])
0e0d0670b2bc [PATCH] Merging identical changes from another branch
mpm@selenic.com
parents: 405
diff changeset
1057 if cmp(t1, t2) == 0:
0e0d0670b2bc [PATCH] Merging identical changes from another branch
mpm@selenic.com
parents: 405
diff changeset
1058 mark[f] = 1
0e0d0670b2bc [PATCH] Merging identical changes from another branch
mpm@selenic.com
parents: 405
diff changeset
1059 n = m2[f]
0e0d0670b2bc [PATCH] Merging identical changes from another branch
mpm@selenic.com
parents: 405
diff changeset
1060 del t1, t2
0e0d0670b2bc [PATCH] Merging identical changes from another branch
mpm@selenic.com
parents: 405
diff changeset
1061
296
a3d83bf86755 hg update: fix clobbering files when going backwards
mpm@selenic.com
parents: 292
diff changeset
1062 # are files different?
232
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
1063 if n != m2[f]:
254
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 253
diff changeset
1064 a = ma.get(f, nullid)
296
a3d83bf86755 hg update: fix clobbering files when going backwards
mpm@selenic.com
parents: 292
diff changeset
1065 # are both different from the ancestor?
254
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 253
diff changeset
1066 if n != a and m2[f] != a:
273
4f8174389001 merge: Fix bug where we overwrote local when local was newer
mpm@selenic.com
parents: 263
diff changeset
1067 self.ui.debug(" %s versions differ, resolve\n" % f)
276
10e325db7347 add tracking of execute permissions
mpm@selenic.com
parents: 275
diff changeset
1068 # merge executable bits
10e325db7347 add tracking of execute permissions
mpm@selenic.com
parents: 275
diff changeset
1069 # "if we changed or they changed, change in merge"
10e325db7347 add tracking of execute permissions
mpm@selenic.com
parents: 275
diff changeset
1070 a, b, c = mfa.get(f, 0), mfw[f], mf2[f]
10e325db7347 add tracking of execute permissions
mpm@selenic.com
parents: 275
diff changeset
1071 mode = ((a^b) | (a^c)) ^ a
10e325db7347 add tracking of execute permissions
mpm@selenic.com
parents: 275
diff changeset
1072 merge[f] = (m1.get(f, nullid), m2[f], mode)
277
79279550c8ff merge: update permissions even if file contents didn't change
mpm@selenic.com
parents: 276
diff changeset
1073 s = 1
305
719812eb0156 more merge fixes
mpm@selenic.com
parents: 302
diff changeset
1074 # are we clobbering?
719812eb0156 more merge fixes
mpm@selenic.com
parents: 302
diff changeset
1075 # is remote's version newer?
719812eb0156 more merge fixes
mpm@selenic.com
parents: 302
diff changeset
1076 # or are we going back in time?
719812eb0156 more merge fixes
mpm@selenic.com
parents: 302
diff changeset
1077 elif force or m2[f] != a or (p2 == pa and mw[f] == m1[f]):
273
4f8174389001 merge: Fix bug where we overwrote local when local was newer
mpm@selenic.com
parents: 263
diff changeset
1078 self.ui.debug(" remote %s is newer, get\n" % f)
254
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 253
diff changeset
1079 get[f] = m2[f]
277
79279550c8ff merge: update permissions even if file contents didn't change
mpm@selenic.com
parents: 276
diff changeset
1080 s = 1
305
719812eb0156 more merge fixes
mpm@selenic.com
parents: 302
diff changeset
1081 else:
719812eb0156 more merge fixes
mpm@selenic.com
parents: 302
diff changeset
1082 mark[f] = 1
277
79279550c8ff merge: update permissions even if file contents didn't change
mpm@selenic.com
parents: 276
diff changeset
1083
79279550c8ff merge: update permissions even if file contents didn't change
mpm@selenic.com
parents: 276
diff changeset
1084 if not s and mfw[f] != mf2[f]:
79279550c8ff merge: update permissions even if file contents didn't change
mpm@selenic.com
parents: 276
diff changeset
1085 if force:
79279550c8ff merge: update permissions even if file contents didn't change
mpm@selenic.com
parents: 276
diff changeset
1086 self.ui.debug(" updating permissions for %s\n" % f)
79279550c8ff merge: update permissions even if file contents didn't change
mpm@selenic.com
parents: 276
diff changeset
1087 set_exec(self.wjoin(f), mf2[f])
79279550c8ff merge: update permissions even if file contents didn't change
mpm@selenic.com
parents: 276
diff changeset
1088 else:
79279550c8ff merge: update permissions even if file contents didn't change
mpm@selenic.com
parents: 276
diff changeset
1089 a, b, c = mfa.get(f, 0), mfw[f], mf2[f]
79279550c8ff merge: update permissions even if file contents didn't change
mpm@selenic.com
parents: 276
diff changeset
1090 mode = ((a^b) | (a^c)) ^ a
79279550c8ff merge: update permissions even if file contents didn't change
mpm@selenic.com
parents: 276
diff changeset
1091 if mode != b:
79279550c8ff merge: update permissions even if file contents didn't change
mpm@selenic.com
parents: 276
diff changeset
1092 self.ui.debug(" updating permissions for %s\n" % f)
79279550c8ff merge: update permissions even if file contents didn't change
mpm@selenic.com
parents: 276
diff changeset
1093 set_exec(self.wjoin(f), mode)
305
719812eb0156 more merge fixes
mpm@selenic.com
parents: 302
diff changeset
1094 mark[f] = 1
232
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
1095 del m2[f]
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
1096 elif f in ma:
275
61d45b0ba8fb various merge improvements
mpm@selenic.com
parents: 273
diff changeset
1097 if not force and n != ma[f]:
415
c2b9502a4e96 [PATCH] Don't prompt user for keep-vs-delete when the merge is about to be aborted
mpm@selenic.com
parents: 413
diff changeset
1098 r = ""
c2b9502a4e96 [PATCH] Don't prompt user for keep-vs-delete when the merge is about to be aborted
mpm@selenic.com
parents: 413
diff changeset
1099 if linear_path or allow:
c2b9502a4e96 [PATCH] Don't prompt user for keep-vs-delete when the merge is about to be aborted
mpm@selenic.com
parents: 413
diff changeset
1100 r = self.ui.prompt(
c2b9502a4e96 [PATCH] Don't prompt user for keep-vs-delete when the merge is about to be aborted
mpm@selenic.com
parents: 413
diff changeset
1101 (" local changed %s which remote deleted\n" % f) +
c2b9502a4e96 [PATCH] Don't prompt user for keep-vs-delete when the merge is about to be aborted
mpm@selenic.com
parents: 413
diff changeset
1102 "(k)eep or (d)elete?", "[kd]", "k")
232
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
1103 if r == "d":
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
1104 remove.append(f)
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
1105 else:
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
1106 self.ui.debug("other deleted %s\n" % f)
254
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 253
diff changeset
1107 remove.append(f) # other deleted it
232
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
1108 else:
254
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 253
diff changeset
1109 if n == m1.get(f, nullid): # same as parent
383
4862a134e2c2 hg merge: fix time asymmetry bug with deleting files on update to past
mpm@selenic.com
parents: 377
diff changeset
1110 if p2 == pa: # going backwards?
4862a134e2c2 hg merge: fix time asymmetry bug with deleting files on update to past
mpm@selenic.com
parents: 377
diff changeset
1111 self.ui.debug("remote deleted %s\n" % f)
4862a134e2c2 hg merge: fix time asymmetry bug with deleting files on update to past
mpm@selenic.com
parents: 377
diff changeset
1112 remove.append(f)
4862a134e2c2 hg merge: fix time asymmetry bug with deleting files on update to past
mpm@selenic.com
parents: 377
diff changeset
1113 else:
4862a134e2c2 hg merge: fix time asymmetry bug with deleting files on update to past
mpm@selenic.com
parents: 377
diff changeset
1114 self.ui.debug("local created %s, keeping\n" % f)
254
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 253
diff changeset
1115 else:
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 253
diff changeset
1116 self.ui.debug("working dir created %s, keeping\n" % f)
46
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
1117
232
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
1118 for f, n in m2.iteritems():
256
649ed23e4661 minor fixes for update()
mpm@selenic.com
parents: 254
diff changeset
1119 if f[0] == "/": continue
275
61d45b0ba8fb various merge improvements
mpm@selenic.com
parents: 273
diff changeset
1120 if not force and f in ma and n != ma[f]:
415
c2b9502a4e96 [PATCH] Don't prompt user for keep-vs-delete when the merge is about to be aborted
mpm@selenic.com
parents: 413
diff changeset
1121 r = ""
c2b9502a4e96 [PATCH] Don't prompt user for keep-vs-delete when the merge is about to be aborted
mpm@selenic.com
parents: 413
diff changeset
1122 if linear_path or allow:
c2b9502a4e96 [PATCH] Don't prompt user for keep-vs-delete when the merge is about to be aborted
mpm@selenic.com
parents: 413
diff changeset
1123 r = self.ui.prompt(
c2b9502a4e96 [PATCH] Don't prompt user for keep-vs-delete when the merge is about to be aborted
mpm@selenic.com
parents: 413
diff changeset
1124 ("remote changed %s which local deleted\n" % f) +
c2b9502a4e96 [PATCH] Don't prompt user for keep-vs-delete when the merge is about to be aborted
mpm@selenic.com
parents: 413
diff changeset
1125 "(k)eep or (d)elete?", "[kd]", "k")
275
61d45b0ba8fb various merge improvements
mpm@selenic.com
parents: 273
diff changeset
1126 if r == "d": remove.append(f)
232
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
1127 else:
254
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 253
diff changeset
1128 self.ui.debug("remote created %s\n" % f)
232
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
1129 get[f] = n
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
1130
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
1131 del mw, m1, m2, ma
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
1132
275
61d45b0ba8fb various merge improvements
mpm@selenic.com
parents: 273
diff changeset
1133 if force:
61d45b0ba8fb various merge improvements
mpm@selenic.com
parents: 273
diff changeset
1134 for f in merge:
61d45b0ba8fb various merge improvements
mpm@selenic.com
parents: 273
diff changeset
1135 get[f] = merge[f][1]
61d45b0ba8fb various merge improvements
mpm@selenic.com
parents: 273
diff changeset
1136 merge = {}
61d45b0ba8fb various merge improvements
mpm@selenic.com
parents: 273
diff changeset
1137
408
3695fbd2c33b [PATCH] Merging files that are deleted in both branches
mpm@selenic.com
parents: 407
diff changeset
1138 if linear_path:
254
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 253
diff changeset
1139 # we don't need to do any magic, just jump to the new rev
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 253
diff changeset
1140 mode = 'n'
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 253
diff changeset
1141 p1, p2 = p2, nullid
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 253
diff changeset
1142 else:
275
61d45b0ba8fb various merge improvements
mpm@selenic.com
parents: 273
diff changeset
1143 if not allow:
305
719812eb0156 more merge fixes
mpm@selenic.com
parents: 302
diff changeset
1144 self.ui.status("this update spans a branch" +
719812eb0156 more merge fixes
mpm@selenic.com
parents: 302
diff changeset
1145 " affecting the following files:\n")
719812eb0156 more merge fixes
mpm@selenic.com
parents: 302
diff changeset
1146 fl = merge.keys() + get.keys()
719812eb0156 more merge fixes
mpm@selenic.com
parents: 302
diff changeset
1147 fl.sort()
719812eb0156 more merge fixes
mpm@selenic.com
parents: 302
diff changeset
1148 for f in fl:
719812eb0156 more merge fixes
mpm@selenic.com
parents: 302
diff changeset
1149 cf = ""
719812eb0156 more merge fixes
mpm@selenic.com
parents: 302
diff changeset
1150 if f in merge: cf = " (resolve)"
719812eb0156 more merge fixes
mpm@selenic.com
parents: 302
diff changeset
1151 self.ui.status(" %s%s\n" % (f, cf))
719812eb0156 more merge fixes
mpm@selenic.com
parents: 302
diff changeset
1152 self.ui.warn("aborting update spanning branches!\n")
719812eb0156 more merge fixes
mpm@selenic.com
parents: 302
diff changeset
1153 self.ui.status("(use update -m to perform a branch merge)\n")
275
61d45b0ba8fb various merge improvements
mpm@selenic.com
parents: 273
diff changeset
1154 return 1
254
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 253
diff changeset
1155 # we have to remember what files we needed to get/change
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 253
diff changeset
1156 # because any file that's different from either one of its
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 253
diff changeset
1157 # parents must be in the changeset
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 253
diff changeset
1158 mode = 'm'
305
719812eb0156 more merge fixes
mpm@selenic.com
parents: 302
diff changeset
1159 self.dirstate.update(mark.keys(), "m")
254
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 253
diff changeset
1160
232
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
1161 self.dirstate.setparents(p1, p2)
191
d7e859cf2f1b merge: add count of new manifests, files, and revisions
mpm@selenic.com
parents: 190
diff changeset
1162
232
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
1163 # 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
1164 files = get.keys()
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
1165 files.sort()
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
1166 for f in files:
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
1167 if f[0] == "/": continue
273
4f8174389001 merge: Fix bug where we overwrote local when local was newer
mpm@selenic.com
parents: 263
diff changeset
1168 self.ui.note("getting %s\n" % f)
276
10e325db7347 add tracking of execute permissions
mpm@selenic.com
parents: 275
diff changeset
1169 t = self.file(f).read(get[f])
232
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
1170 try:
291
2c4f2be05587 Add wopener for opening files in the working directory
mpm@selenic.com
parents: 288
diff changeset
1171 self.wfile(f, "w").write(t)
232
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
1172 except IOError:
297
0dbcf3c9ff20 Fixed usage of removed variable 'wp'.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 292
diff changeset
1173 os.makedirs(os.path.dirname(self.wjoin(f)))
291
2c4f2be05587 Add wopener for opening files in the working directory
mpm@selenic.com
parents: 288
diff changeset
1174 self.wfile(f, "w").write(t)
2c4f2be05587 Add wopener for opening files in the working directory
mpm@selenic.com
parents: 288
diff changeset
1175 set_exec(self.wjoin(f), mf2[f])
254
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 253
diff changeset
1176 self.dirstate.update([f], mode)
46
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
1177
232
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
1178 # merge the tricky bits
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
1179 files = merge.keys()
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
1180 files.sort()
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
1181 for f in files:
256
649ed23e4661 minor fixes for update()
mpm@selenic.com
parents: 254
diff changeset
1182 self.ui.status("merging %s\n" % f)
276
10e325db7347 add tracking of execute permissions
mpm@selenic.com
parents: 275
diff changeset
1183 m, o, flag = merge[f]
232
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
1184 self.merge3(f, m, o)
297
0dbcf3c9ff20 Fixed usage of removed variable 'wp'.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 292
diff changeset
1185 set_exec(self.wjoin(f), flag)
254
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 253
diff changeset
1186 self.dirstate.update([f], 'm')
232
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
1187
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
1188 for f in remove:
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
1189 self.ui.note("removing %s\n" % f)
254
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 253
diff changeset
1190 os.unlink(f)
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 253
diff changeset
1191 if mode == 'n':
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 253
diff changeset
1192 self.dirstate.forget(remove)
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 253
diff changeset
1193 else:
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 253
diff changeset
1194 self.dirstate.update(remove, 'r')
232
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
1195
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
1196 def merge3(self, fn, my, other):
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
1197 """perform a 3-way merge in the working directory"""
249
619e775aa7f9 import and startup cleanups
mpm@selenic.com
parents: 247
diff changeset
1198
96
fce47326677c Add updated merge3 code
mpm@selenic.com
parents: 95
diff changeset
1199 def temp(prefix, node):
fce47326677c Add updated merge3 code
mpm@selenic.com
parents: 95
diff changeset
1200 pre = "%s~%s." % (os.path.basename(fn), prefix)
fce47326677c Add updated merge3 code
mpm@selenic.com
parents: 95
diff changeset
1201 (fd, name) = tempfile.mkstemp("", pre)
417
f2d1f5fd0179 [PATCH] file type fixes for the other 'OS'
mpm@selenic.com
parents: 416
diff changeset
1202 f = os.fdopen(fd, "wb")
96
fce47326677c Add updated merge3 code
mpm@selenic.com
parents: 95
diff changeset
1203 f.write(fl.revision(node))
fce47326677c Add updated merge3 code
mpm@selenic.com
parents: 95
diff changeset
1204 f.close()
fce47326677c Add updated merge3 code
mpm@selenic.com
parents: 95
diff changeset
1205 return name
fce47326677c Add updated merge3 code
mpm@selenic.com
parents: 95
diff changeset
1206
232
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
1207 fl = self.file(fn)
96
fce47326677c Add updated merge3 code
mpm@selenic.com
parents: 95
diff changeset
1208 base = fl.ancestor(my, other)
244
43105253cf5e root relative IO and valid commit states
mpm@selenic.com
parents: 241
diff changeset
1209 a = self.wjoin(fn)
346
f69a5d2d4fe1 merge3: fix argument order
mpm@selenic.com
parents: 344
diff changeset
1210 b = temp("base", base)
f69a5d2d4fe1 merge3: fix argument order
mpm@selenic.com
parents: 344
diff changeset
1211 c = temp("other", other)
96
fce47326677c Add updated merge3 code
mpm@selenic.com
parents: 95
diff changeset
1212
232
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
1213 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
1214 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
1215 (fn, short(other), short(base)))
96
fce47326677c Add updated merge3 code
mpm@selenic.com
parents: 95
diff changeset
1216
240
737c66b68290 Replace tkmerge with hgmerge
mpm@selenic.com
parents: 232
diff changeset
1217 cmd = os.environ.get("HGMERGE", "hgmerge")
737c66b68290 Replace tkmerge with hgmerge
mpm@selenic.com
parents: 232
diff changeset
1218 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
1219 if r:
275
61d45b0ba8fb various merge improvements
mpm@selenic.com
parents: 273
diff changeset
1220 self.ui.warn("merging %s failed!\n" % fn)
232
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
1221
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
1222 os.unlink(b)
fc4a6e5b5812 hg resolve: merge a given node into the working directory
mpm@selenic.com
parents: 231
diff changeset
1223 os.unlink(c)
96
fce47326677c Add updated merge3 code
mpm@selenic.com
parents: 95
diff changeset
1224
247
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1225 def verify(self):
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1226 filelinkrevs = {}
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1227 filenodes = {}
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1228 changesets = revisions = files = 0
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1229 errors = 0
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1230
302
498fb0fa2795 various fixups for git import
mpm@selenic.com
parents: 299
diff changeset
1231 seen = {}
247
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1232 self.ui.status("checking changesets\n")
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1233 for i in range(self.changelog.count()):
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1234 changesets += 1
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1235 n = self.changelog.node(i)
302
498fb0fa2795 various fixups for git import
mpm@selenic.com
parents: 299
diff changeset
1236 if n in seen:
498fb0fa2795 various fixups for git import
mpm@selenic.com
parents: 299
diff changeset
1237 self.ui.warn("duplicate changeset at revision %d\n" % i)
498fb0fa2795 various fixups for git import
mpm@selenic.com
parents: 299
diff changeset
1238 errors += 1
498fb0fa2795 various fixups for git import
mpm@selenic.com
parents: 299
diff changeset
1239 seen[n] = 1
498fb0fa2795 various fixups for git import
mpm@selenic.com
parents: 299
diff changeset
1240
247
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1241 for p in self.changelog.parents(n):
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1242 if p not in self.changelog.nodemap:
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1243 self.ui.warn("changeset %s has unknown parent %s\n" %
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1244 (short(n), short(p)))
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1245 errors += 1
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1246 try:
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1247 changes = self.changelog.read(n)
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1248 except Exception, inst:
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1249 self.ui.warn("unpacking changeset %s: %s\n" % (short(n), inst))
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1250 errors += 1
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1251
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1252 for f in changes[3]:
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1253 filelinkrevs.setdefault(f, []).append(i)
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1254
302
498fb0fa2795 various fixups for git import
mpm@selenic.com
parents: 299
diff changeset
1255 seen = {}
247
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1256 self.ui.status("checking manifests\n")
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1257 for i in range(self.manifest.count()):
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1258 n = self.manifest.node(i)
302
498fb0fa2795 various fixups for git import
mpm@selenic.com
parents: 299
diff changeset
1259 if n in seen:
498fb0fa2795 various fixups for git import
mpm@selenic.com
parents: 299
diff changeset
1260 self.ui.warn("duplicate manifest at revision %d\n" % i)
498fb0fa2795 various fixups for git import
mpm@selenic.com
parents: 299
diff changeset
1261 errors += 1
498fb0fa2795 various fixups for git import
mpm@selenic.com
parents: 299
diff changeset
1262 seen[n] = 1
498fb0fa2795 various fixups for git import
mpm@selenic.com
parents: 299
diff changeset
1263
247
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1264 for p in self.manifest.parents(n):
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1265 if p not in self.manifest.nodemap:
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1266 self.ui.warn("manifest %s has unknown parent %s\n" %
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1267 (short(n), short(p)))
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1268 errors += 1
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1269
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1270 try:
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1271 delta = mdiff.patchtext(self.manifest.delta(n))
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1272 except KeyboardInterrupt:
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1273 print "aborted"
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1274 sys.exit(0)
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1275 except Exception, inst:
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1276 self.ui.warn("unpacking manifest %s: %s\n"
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1277 % (short(n), inst))
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1278 errors += 1
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1279
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1280 ff = [ l.split('\0') for l in delta.splitlines() ]
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1281 for f, fn in ff:
284
d7c2efd0b541 verify: don't die from new permission bits
mpm@selenic.com
parents: 279
diff changeset
1282 filenodes.setdefault(f, {})[bin(fn[:40])] = 1
247
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1283
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1284 self.ui.status("crosschecking files in changesets and manifests\n")
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1285 for f in filenodes:
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1286 if f not in filelinkrevs:
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1287 self.ui.warn("file %s in manifest but not in changesets\n" % f)
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1288 errors += 1
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1289
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1290 for f in filelinkrevs:
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1291 if f not in filenodes:
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1292 self.ui.warn("file %s in changeset but not in manifest\n" % f)
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1293 errors += 1
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1294
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1295 self.ui.status("checking files\n")
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1296 ff = filenodes.keys()
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1297 ff.sort()
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1298 for f in ff:
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1299 if f == "/dev/null": continue
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1300 files += 1
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1301 fl = self.file(f)
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1302 nodes = { nullid: 1 }
302
498fb0fa2795 various fixups for git import
mpm@selenic.com
parents: 299
diff changeset
1303 seen = {}
247
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1304 for i in range(fl.count()):
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1305 revisions += 1
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1306 n = fl.node(i)
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1307
302
498fb0fa2795 various fixups for git import
mpm@selenic.com
parents: 299
diff changeset
1308 if n in seen:
498fb0fa2795 various fixups for git import
mpm@selenic.com
parents: 299
diff changeset
1309 self.ui.warn("%s: duplicate revision %d\n" % (f, i))
498fb0fa2795 various fixups for git import
mpm@selenic.com
parents: 299
diff changeset
1310 errors += 1
498fb0fa2795 various fixups for git import
mpm@selenic.com
parents: 299
diff changeset
1311
247
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1312 if n not in filenodes[f]:
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1313 self.ui.warn("%s: %d:%s not in manifests\n"
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1314 % (f, i, short(n)))
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1315 print len(filenodes[f].keys()), fl.count(), f
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1316 errors += 1
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1317 else:
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1318 del filenodes[f][n]
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1319
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1320 flr = fl.linkrev(n)
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1321 if flr not in filelinkrevs[f]:
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1322 self.ui.warn("%s:%s points to unexpected changeset %d\n"
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1323 % (f, short(n), fl.linkrev(n)))
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1324 errors += 1
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1325 else:
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1326 filelinkrevs[f].remove(flr)
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1327
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1328 # verify contents
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1329 try:
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1330 t = fl.read(n)
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1331 except Exception, inst:
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1332 self.ui.warn("unpacking file %s %s: %s\n"
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1333 % (f, short(n), inst))
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1334 errors += 1
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1335
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1336 # verify parents
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1337 (p1, p2) = fl.parents(n)
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1338 if p1 not in nodes:
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1339 self.ui.warn("file %s:%s unknown parent 1 %s" %
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1340 (f, short(n), short(p1)))
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1341 errors += 1
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1342 if p2 not in nodes:
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1343 self.ui.warn("file %s:%s unknown parent 2 %s" %
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1344 (f, short(n), short(p1)))
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1345 errors += 1
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1346 nodes[n] = 1
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1347
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1348 # cross-check
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1349 for node in filenodes[f]:
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1350 self.ui.warn("node %s in manifests not in %s\n"
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1351 % (hex(n), f))
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1352 errors += 1
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1353
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1354 self.ui.status("%d files, %d changesets, %d total revisions\n" %
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1355 (files, changesets, revisions))
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1356
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1357 if errors:
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1358 self.ui.warn("%d integrity errors encountered!\n" % errors)
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1359 return 1
863b508c5b36 migrate verify
mpm@selenic.com
parents: 244
diff changeset
1360
60
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
1361 class remoterepository:
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
1362 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
1363 self.url = path
60
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
1364 self.ui = ui
321
73b8a8a059ec Transparent proxy support
mpm@selenic.com
parents: 317
diff changeset
1365 no_list = [ "localhost", "127.0.0.1" ]
73b8a8a059ec Transparent proxy support
mpm@selenic.com
parents: 317
diff changeset
1366 host = ui.config("http_proxy", "host")
73b8a8a059ec Transparent proxy support
mpm@selenic.com
parents: 317
diff changeset
1367 user = ui.config("http_proxy", "user")
73b8a8a059ec Transparent proxy support
mpm@selenic.com
parents: 317
diff changeset
1368 passwd = ui.config("http_proxy", "passwd")
73b8a8a059ec Transparent proxy support
mpm@selenic.com
parents: 317
diff changeset
1369 no = ui.config("http_proxy", "no")
73b8a8a059ec Transparent proxy support
mpm@selenic.com
parents: 317
diff changeset
1370 if no:
73b8a8a059ec Transparent proxy support
mpm@selenic.com
parents: 317
diff changeset
1371 no_list = no_list + no.split(",")
73b8a8a059ec Transparent proxy support
mpm@selenic.com
parents: 317
diff changeset
1372
73b8a8a059ec Transparent proxy support
mpm@selenic.com
parents: 317
diff changeset
1373 no_proxy = 0
73b8a8a059ec Transparent proxy support
mpm@selenic.com
parents: 317
diff changeset
1374 for h in no_list:
73b8a8a059ec Transparent proxy support
mpm@selenic.com
parents: 317
diff changeset
1375 if (path.startswith("http://" + h + "/") or
73b8a8a059ec Transparent proxy support
mpm@selenic.com
parents: 317
diff changeset
1376 path.startswith("http://" + h + ":") or
73b8a8a059ec Transparent proxy support
mpm@selenic.com
parents: 317
diff changeset
1377 path == "http://" + h):
73b8a8a059ec Transparent proxy support
mpm@selenic.com
parents: 317
diff changeset
1378 no_proxy = 1
73b8a8a059ec Transparent proxy support
mpm@selenic.com
parents: 317
diff changeset
1379
73b8a8a059ec Transparent proxy support
mpm@selenic.com
parents: 317
diff changeset
1380 # Note: urllib2 takes proxy values from the environment and those will
73b8a8a059ec Transparent proxy support
mpm@selenic.com
parents: 317
diff changeset
1381 # take precedence
73b8a8a059ec Transparent proxy support
mpm@selenic.com
parents: 317
diff changeset
1382
73b8a8a059ec Transparent proxy support
mpm@selenic.com
parents: 317
diff changeset
1383 proxy_handler = urllib2.BaseHandler()
73b8a8a059ec Transparent proxy support
mpm@selenic.com
parents: 317
diff changeset
1384 if host and not no_proxy:
73b8a8a059ec Transparent proxy support
mpm@selenic.com
parents: 317
diff changeset
1385 proxy_handler = urllib2.ProxyHandler({"http" : "http://" + host})
73b8a8a059ec Transparent proxy support
mpm@selenic.com
parents: 317
diff changeset
1386
73b8a8a059ec Transparent proxy support
mpm@selenic.com
parents: 317
diff changeset
1387 authinfo = None
73b8a8a059ec Transparent proxy support
mpm@selenic.com
parents: 317
diff changeset
1388 if user and passwd:
73b8a8a059ec Transparent proxy support
mpm@selenic.com
parents: 317
diff changeset
1389 passmgr = urllib2.HTTPPasswordMgrWithDefaultRealm()
73b8a8a059ec Transparent proxy support
mpm@selenic.com
parents: 317
diff changeset
1390 passmgr.add_password(None, host, user, passwd)
73b8a8a059ec Transparent proxy support
mpm@selenic.com
parents: 317
diff changeset
1391 authinfo = urllib2.ProxyBasicAuthHandler(passmgr)
73b8a8a059ec Transparent proxy support
mpm@selenic.com
parents: 317
diff changeset
1392
73b8a8a059ec Transparent proxy support
mpm@selenic.com
parents: 317
diff changeset
1393 opener = urllib2.build_opener(proxy_handler, authinfo)
73b8a8a059ec Transparent proxy support
mpm@selenic.com
parents: 317
diff changeset
1394 urllib2.install_opener(opener)
60
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
1395
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
1396 def do_cmd(self, cmd, **args):
83
9fd5b35cfc45 Add -q quiet option
mpm@selenic.com
parents: 79
diff changeset
1397 self.ui.debug("sending %s command\n" % cmd)
60
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
1398 q = {"cmd": cmd}
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
1399 q.update(args)
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
1400 qs = urllib.urlencode(q)
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
1401 cu = "%s?%s" % (self.url, qs)
321
73b8a8a059ec Transparent proxy support
mpm@selenic.com
parents: 317
diff changeset
1402 return urllib2.urlopen(cu)
60
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
1403
222
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
1404 def heads(self):
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
1405 d = self.do_cmd("heads").read()
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
1406 try:
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
1407 return map(bin, d[:-1].split(" "))
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
1408 except:
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
1409 self.ui.warn("unexpected response:\n" + d[:400] + "\n...\n")
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
1410 raise
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
1411
60
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
1412 def branches(self, nodes):
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
1413 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
1414 d = self.do_cmd("branches", nodes=n).read()
217
e6d6497a6331 merge: catch unexpected responses
mpm@selenic.com
parents: 216
diff changeset
1415 try:
e6d6497a6331 merge: catch unexpected responses
mpm@selenic.com
parents: 216
diff changeset
1416 br = [ tuple(map(bin, b.split(" "))) for b in d.splitlines() ]
e6d6497a6331 merge: catch unexpected responses
mpm@selenic.com
parents: 216
diff changeset
1417 return br
e6d6497a6331 merge: catch unexpected responses
mpm@selenic.com
parents: 216
diff changeset
1418 except:
e6d6497a6331 merge: catch unexpected responses
mpm@selenic.com
parents: 216
diff changeset
1419 self.ui.warn("unexpected response:\n" + d[:400] + "\n...\n")
e6d6497a6331 merge: catch unexpected responses
mpm@selenic.com
parents: 216
diff changeset
1420 raise
60
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
1421
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
1422 def between(self, pairs):
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
1423 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
1424 d = self.do_cmd("between", pairs=n).read()
217
e6d6497a6331 merge: catch unexpected responses
mpm@selenic.com
parents: 216
diff changeset
1425 try:
e6d6497a6331 merge: catch unexpected responses
mpm@selenic.com
parents: 216
diff changeset
1426 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
1427 return p
e6d6497a6331 merge: catch unexpected responses
mpm@selenic.com
parents: 216
diff changeset
1428 except:
e6d6497a6331 merge: catch unexpected responses
mpm@selenic.com
parents: 216
diff changeset
1429 self.ui.warn("unexpected response:\n" + d[:400] + "\n...\n")
e6d6497a6331 merge: catch unexpected responses
mpm@selenic.com
parents: 216
diff changeset
1430 raise
60
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
1431
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
1432 def changegroup(self, nodes):
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
1433 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
1434 zd = zlib.decompressobj()
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
1435 f = self.do_cmd("changegroup", roots=n)
192
5d8553352d2e Changes to network protocol
mpm@selenic.com
parents: 191
diff changeset
1436 bytes = 0
65
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
1437 while 1:
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
1438 d = f.read(4096)
192
5d8553352d2e Changes to network protocol
mpm@selenic.com
parents: 191
diff changeset
1439 bytes += len(d)
65
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
1440 if not d:
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
1441 yield zd.flush()
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
1442 break
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
1443 yield zd.decompress(d)
192
5d8553352d2e Changes to network protocol
mpm@selenic.com
parents: 191
diff changeset
1444 self.ui.note("%d bytes of data transfered\n" % bytes)
60
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
1445
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
1446 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
1447 if path and path[:7] == "http://":
1d8e9637a0a4 Change hg: protocol name to http: and http: to old-http:
mpm@selenic.com
parents: 171
diff changeset
1448 return remoterepository(ui, path)
60
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
1449 if path and path[:5] == "hg://":
176
1d8e9637a0a4 Change hg: protocol name to http: and http: to old-http:
mpm@selenic.com
parents: 171
diff changeset
1450 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
1451 if path and path[:11] == "old-http://":
1d8e9637a0a4 Change hg: protocol name to http: and http: to old-http:
mpm@selenic.com
parents: 171
diff changeset
1452 return localrepository(ui, path.replace("old-http://", "http://"))
60
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
1453 else:
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
1454 return localrepository(ui, path, create)
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
1455