annotate mercurial/hg.py @ 209:63af1db35611

Beginning of new command parsing interface -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Beginning of new command parsing interface This adds commands.py, with a primary interface dispatch(args) Dispatch searches a table of known commands, handles switches, sets up a repo object if appropriate, and dispatches the command. It also handles KeyboardInterrupt and can handle similar exceptions in the future. If the command is unknown, it falls through to the current command handler. Commands currently handled by the new scheme: help, init, and annotate manifest hash: 134cd032c880985e3f92f82efb8b629dd862ba4c -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.0 (GNU/Linux) iD8DBQFCnXEGywK+sNU5EO8RAuDAAJ9q7K4w7qGVWv1NWjCPFGO/UJc6VQCdEhMQ sBBlSRzah9QPy8K94catZyg= =wuRf -----END PGP SIGNATURE-----
author mpm@selenic.com
date Wed, 01 Jun 2005 00:25:42 -0800
parents ec327cf0d3a9
children d2badbd7d1ad
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
110
c37c7f784ee3 Move hg from storing files in data with base64 encoding to full
mpm@selenic.com
parents: 109
diff changeset
8 import sys, struct, sha, socket, os, time, re, urllib2
15
6daf7757e92b Fix network pull of repo files with "%" in their base64 encoding.
mpm@selenic.com
parents: 10
diff changeset
9 import urllib
161
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents: 155
diff changeset
10 from mercurial import byterange, lock
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
11 from mercurial.transaction import *
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
12 from mercurial.revlog import *
79
837d473d54d5 Add basic annotation support
mpm@selenic.com
parents: 78
diff changeset
13 from difflib import SequenceMatcher
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
14
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
15 class filelog(revlog):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
16 def __init__(self, opener, path):
144
ea9188538222 Fix transaction handling bug by reverting fileopener change
mpm@selenic.com
parents: 140
diff changeset
17 revlog.__init__(self, opener,
ea9188538222 Fix transaction handling bug by reverting fileopener change
mpm@selenic.com
parents: 140
diff changeset
18 os.path.join("data", path + ".i"),
ea9188538222 Fix transaction handling bug by reverting fileopener change
mpm@selenic.com
parents: 140
diff changeset
19 os.path.join("data", path + ".d"))
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
20
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
21 def read(self, node):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
22 return self.revision(node)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
23 def add(self, text, transaction, link, p1=None, p2=None):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
24 return self.addrevision(text, transaction, link, p1, p2)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
25
79
837d473d54d5 Add basic annotation support
mpm@selenic.com
parents: 78
diff changeset
26 def annotate(self, node):
199
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
27
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
28 def decorate(text, rev):
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
29 return [(rev, l) for l in text.splitlines(1)]
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
30
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
31 def strip(annotation):
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
32 return [e[1] for e in annotation]
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
33
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
34 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
35 new = []
199
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
36 sm = SequenceMatcher(None, strip(parent), strip(child))
79
837d473d54d5 Add basic annotation support
mpm@selenic.com
parents: 78
diff changeset
37 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
38 if o == 'equal':
199
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
39 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
40 else:
199
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
41 new += child[s:t]
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
42 return new
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
43
200
8450c18f2a45 annotate: memory efficiency
mpm@selenic.com
parents: 199
diff changeset
44 # find all ancestors
199
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
45 needed = {}
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
46 visit = [node]
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
47 while visit:
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
48 n = visit.pop(0)
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
49 for p in self.parents(n):
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
50 if p not in needed:
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
51 needed[p] = 1
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
52 visit.append(p)
200
8450c18f2a45 annotate: memory efficiency
mpm@selenic.com
parents: 199
diff changeset
53 else:
8450c18f2a45 annotate: memory efficiency
mpm@selenic.com
parents: 199
diff changeset
54 # count how many times we'll use this
8450c18f2a45 annotate: memory efficiency
mpm@selenic.com
parents: 199
diff changeset
55 needed[p] += 1
199
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
56
200
8450c18f2a45 annotate: memory efficiency
mpm@selenic.com
parents: 199
diff changeset
57 # sort by revision which is a topological order
199
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
58 visit = needed.keys()
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
59 visit = [ (self.rev(n), n) for n in visit ]
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
60 visit.sort()
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
61 visit = [ p[1] for p in visit ]
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
62 hist = {}
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
63
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
64 for n in visit:
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
65 curr = decorate(self.read(n), self.linkrev(n))
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
66 for p in self.parents(n):
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
67 if p != nullid:
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
68 curr = pair(hist[p], curr)
200
8450c18f2a45 annotate: memory efficiency
mpm@selenic.com
parents: 199
diff changeset
69 # trim the history of unneeded revs
8450c18f2a45 annotate: memory efficiency
mpm@selenic.com
parents: 199
diff changeset
70 needed[p] -= 1
8450c18f2a45 annotate: memory efficiency
mpm@selenic.com
parents: 199
diff changeset
71 if not needed[p]:
8450c18f2a45 annotate: memory efficiency
mpm@selenic.com
parents: 199
diff changeset
72 del hist[p]
199
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
73 hist[n] = curr
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
74
2424676edd8c annotate: deal with merges
mpm@selenic.com
parents: 192
diff changeset
75 return hist[n]
79
837d473d54d5 Add basic annotation support
mpm@selenic.com
parents: 78
diff changeset
76
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
77 class manifest(revlog):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
78 def __init__(self, opener):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
79 self.mapcache = None
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
80 self.listcache = None
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
81 self.addlist = None
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
82 revlog.__init__(self, opener, "00manifest.i", "00manifest.d")
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
83
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
84 def read(self, node):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
85 if self.mapcache and self.mapcache[0] == node:
90
ab9ebff09dcd Fix manifest merge swap bug
mpm@selenic.com
parents: 85
diff changeset
86 return self.mapcache[1].copy()
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
87 text = self.revision(node)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
88 map = {}
25
daa724b27300 Fix corruption from manifest.listcache optimization
mpm@selenic.com
parents: 20
diff changeset
89 self.listcache = (text, text.splitlines(1))
daa724b27300 Fix corruption from manifest.listcache optimization
mpm@selenic.com
parents: 20
diff changeset
90 for l in self.listcache[1]:
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
91 (f, n) = l.split('\0')
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
92 map[f] = bin(n[:40])
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
93 self.mapcache = (node, map)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
94 return map
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
95
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
96 def diff(self, a, b):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
97 # 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
98 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
99 d = mdiff.diff(self.listcache[1], self.addlist, 1)
3dde7c87e36d Add paranoia to diff code
mpm@selenic.com
parents: 96
diff changeset
100 if mdiff.patch(a, d) != b:
3dde7c87e36d Add paranoia to diff code
mpm@selenic.com
parents: 96
diff changeset
101 sys.stderr.write("*** sortdiff failed, falling back ***\n")
3dde7c87e36d Add paranoia to diff code
mpm@selenic.com
parents: 96
diff changeset
102 return mdiff.textdiff(a, b)
3dde7c87e36d Add paranoia to diff code
mpm@selenic.com
parents: 96
diff changeset
103 return d
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
104 else:
44
e825a68d7227 Fix occassional diff bug with manifests
mpm@selenic.com
parents: 40
diff changeset
105 return mdiff.textdiff(a, b)
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
106
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
107 def add(self, map, transaction, link, p1=None, p2=None):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
108 files = map.keys()
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
109 files.sort()
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
110
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
111 self.addlist = ["%s\000%s\n" % (f, hex(map[f])) for f in files]
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
112 text = "".join(self.addlist)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
113
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
114 n = self.addrevision(text, transaction, link, p1, p2)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
115 self.mapcache = (n, map)
25
daa724b27300 Fix corruption from manifest.listcache optimization
mpm@selenic.com
parents: 20
diff changeset
116 self.listcache = (text, self.addlist)
140
30ef77113872 Minor safety checks to manifest diff
mpm@selenic.com
parents: 118
diff changeset
117 self.addlist = None
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
118
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
119 return n
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 class changelog(revlog):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
122 def __init__(self, opener):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
123 revlog.__init__(self, opener, "00changelog.i", "00changelog.d")
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
124
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
125 def extract(self, text):
37
a8811676c85a Move hex/bin bits to revlog
mpm@selenic.com
parents: 33
diff changeset
126 if not text:
40
5f87633e1ea2 Date is an int as a string in changelog
mpm@selenic.com
parents: 37
diff changeset
127 return (nullid, "", "0", [], "")
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
128 last = text.index("\n\n")
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
129 desc = text[last + 2:]
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
130 l = text[:last].splitlines()
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
131 manifest = bin(l[0])
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
132 user = l[1]
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
133 date = l[2]
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
134 files = l[3:]
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
135 return (manifest, user, date, files, desc)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
136
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
137 def read(self, node):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
138 return self.extract(self.revision(node))
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
139
203
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
140 def add(self, manifest, list, desc, transaction, p1=None, p2=None,
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
141 user=None, date=None):
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
142 user = (user or
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
143 os.environ.get("HGUSER") or
55
2add70d51441 From: Thomas Arendsen Hein <thomas@intevation.de>
mpm@selenic.com
parents: 48
diff changeset
144 os.environ.get("EMAIL") or
2add70d51441 From: Thomas Arendsen Hein <thomas@intevation.de>
mpm@selenic.com
parents: 48
diff changeset
145 os.environ.get("LOGNAME", "unknown") + '@' + socket.getfqdn())
203
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
146 date = date or "%d %d" % (time.time(), time.timezone)
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
147 list.sort()
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
148 l = [hex(manifest), user, date] + list + ["", desc]
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
149 text = "\n".join(l)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
150 return self.addrevision(text, transaction, self.count(), p1, p2)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
151
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
152 class dircache:
20
a664c2b624cf The actual hg remove fix from Thomas Hein
mpm@selenic.com
parents: 19
diff changeset
153 def __init__(self, opener, ui):
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
154 self.opener = opener
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
155 self.dirty = 0
20
a664c2b624cf The actual hg remove fix from Thomas Hein
mpm@selenic.com
parents: 19
diff changeset
156 self.ui = ui
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
157 self.map = None
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
158 def __del__(self):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
159 if self.dirty: self.write()
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
160 def __getitem__(self, key):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
161 try:
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
162 return self.map[key]
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
163 except TypeError:
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
164 self.read()
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
165 return self[key]
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 def read(self):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
168 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
169
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
170 self.map = {}
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
171 try:
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
172 st = self.opener("dircache").read()
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
173 except: return
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
174
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
175 pos = 0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
176 while pos < len(st):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
177 e = struct.unpack(">llll", st[pos:pos+16])
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
178 l = e[3]
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
179 pos += 16
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
180 f = st[pos:pos + l]
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
181 self.map[f] = e[:3]
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
182 pos += l
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
183
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
184 def update(self, files):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
185 if not files: return
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
186 self.read()
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
187 self.dirty = 1
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
188 for f in files:
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
189 try:
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
190 s = os.stat(f)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
191 self.map[f] = (s.st_mode, s.st_size, s.st_mtime)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
192 except IOError:
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
193 self.remove(f)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
194
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
195 def taint(self, files):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
196 if not files: return
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
197 self.read()
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
198 self.dirty = 1
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
199 for f in files:
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
200 self.map[f] = (0, -1, 0)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
201
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
202 def remove(self, files):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
203 if not files: return
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
204 self.read()
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
205 self.dirty = 1
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
206 for f in files:
20
a664c2b624cf The actual hg remove fix from Thomas Hein
mpm@selenic.com
parents: 19
diff changeset
207 try:
a664c2b624cf The actual hg remove fix from Thomas Hein
mpm@selenic.com
parents: 19
diff changeset
208 del self.map[f]
a664c2b624cf The actual hg remove fix from Thomas Hein
mpm@selenic.com
parents: 19
diff changeset
209 except KeyError:
a664c2b624cf The actual hg remove fix from Thomas Hein
mpm@selenic.com
parents: 19
diff changeset
210 self.ui.warn("Not in dircache: %s\n" % f)
a664c2b624cf The actual hg remove fix from Thomas Hein
mpm@selenic.com
parents: 19
diff changeset
211 pass
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
212
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
213 def clear(self):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
214 self.map = {}
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
215 self.dirty = 1
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
216
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
217 def write(self):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
218 st = self.opener("dircache", "w")
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
219 for f, e in self.map.items():
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
220 e = struct.pack(">llll", e[0], e[1], e[2], len(f))
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
221 st.write(e + f)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
222 self.dirty = 0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
223
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
224 def copy(self):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
225 self.read()
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
226 return self.map.copy()
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
227
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
228 # used to avoid circular references so destructors work
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
229 def opener(base):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
230 p = base
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
231 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
232 if p[:7] == "http://":
6daf7757e92b Fix network pull of repo files with "%" in their base64 encoding.
mpm@selenic.com
parents: 10
diff changeset
233 f = os.path.join(p, urllib.quote(path))
6daf7757e92b Fix network pull of repo files with "%" in their base64 encoding.
mpm@selenic.com
parents: 10
diff changeset
234 return httprangereader(f)
6daf7757e92b Fix network pull of repo files with "%" in their base64 encoding.
mpm@selenic.com
parents: 10
diff changeset
235
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
236 f = os.path.join(p, path)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
237
110
c37c7f784ee3 Move hg from storing files in data with base64 encoding to full
mpm@selenic.com
parents: 109
diff changeset
238 if mode != "r":
c37c7f784ee3 Move hg from storing files in data with base64 encoding to full
mpm@selenic.com
parents: 109
diff changeset
239 try:
c37c7f784ee3 Move hg from storing files in data with base64 encoding to full
mpm@selenic.com
parents: 109
diff changeset
240 s = os.stat(f)
c37c7f784ee3 Move hg from storing files in data with base64 encoding to full
mpm@selenic.com
parents: 109
diff changeset
241 except OSError:
c37c7f784ee3 Move hg from storing files in data with base64 encoding to full
mpm@selenic.com
parents: 109
diff changeset
242 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
243 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
244 os.makedirs(d)
c37c7f784ee3 Move hg from storing files in data with base64 encoding to full
mpm@selenic.com
parents: 109
diff changeset
245 else:
c37c7f784ee3 Move hg from storing files in data with base64 encoding to full
mpm@selenic.com
parents: 109
diff changeset
246 if s.st_nlink > 1:
c37c7f784ee3 Move hg from storing files in data with base64 encoding to full
mpm@selenic.com
parents: 109
diff changeset
247 file(f + ".tmp", "w").write(file(f).read())
c37c7f784ee3 Move hg from storing files in data with base64 encoding to full
mpm@selenic.com
parents: 109
diff changeset
248 os.rename(f+".tmp", f)
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
249
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
250 return file(f, mode)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
251
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
252 return o
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
253
60
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
254 class localrepository:
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
255 def __init__(self, ui, path=None, create=0):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
256 self.remote = 0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
257 if path and path[:7] == "http://":
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
258 self.remote = 1
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
259 self.path = path
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
260 else:
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
261 if not path:
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
262 p = os.getcwd()
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
263 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
264 p = os.path.dirname(p)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
265 if p == "/": raise "No repo found"
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
266 path = p
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
267 self.path = os.path.join(path, ".hg")
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
268
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
269 self.root = path
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
270 self.ui = ui
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
271
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
272 if create:
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
273 os.mkdir(self.path)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
274 os.mkdir(self.join("data"))
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
275
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
276 self.opener = opener(self.path)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
277 self.manifest = manifest(self.opener)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
278 self.changelog = changelog(self.opener)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
279 self.ignorelist = None
67
a182f2561c8e Add tag support
mpm@selenic.com
parents: 65
diff changeset
280 self.tags = None
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
281
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
282 if not self.remote:
20
a664c2b624cf The actual hg remove fix from Thomas Hein
mpm@selenic.com
parents: 19
diff changeset
283 self.dircache = dircache(self.opener, ui)
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
284 try:
4
ce3bd728b858 Fix exception handling for reading current working version
mpm@selenic.com
parents: 0
diff changeset
285 self.current = bin(self.opener("current").read())
ce3bd728b858 Fix exception handling for reading current working version
mpm@selenic.com
parents: 0
diff changeset
286 except IOError:
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
287 self.current = None
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
288
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
289 def setcurrent(self, node):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
290 self.current = node
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
291 self.opener("current", "w").write(hex(node))
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
292
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
293 def ignore(self, f):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
294 if self.ignorelist is None:
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
295 self.ignorelist = []
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
296 try:
67
a182f2561c8e Add tag support
mpm@selenic.com
parents: 65
diff changeset
297 l = open(os.path.join(self.root, ".hgignore"))
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
298 for pat in l:
9
b4d0c3786ad3 Ignore empty ignore patterns
mpm@selenic.com
parents: 4
diff changeset
299 if pat != "\n":
b4d0c3786ad3 Ignore empty ignore patterns
mpm@selenic.com
parents: 4
diff changeset
300 self.ignorelist.append(re.compile(pat[:-1]))
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
301 except IOError: pass
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
302 for pat in self.ignorelist:
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
303 if pat.search(f): return True
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
304 return False
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
305
67
a182f2561c8e Add tag support
mpm@selenic.com
parents: 65
diff changeset
306 def lookup(self, key):
a182f2561c8e Add tag support
mpm@selenic.com
parents: 65
diff changeset
307 if self.tags is None:
a182f2561c8e Add tag support
mpm@selenic.com
parents: 65
diff changeset
308 self.tags = {}
a182f2561c8e Add tag support
mpm@selenic.com
parents: 65
diff changeset
309 try:
a182f2561c8e Add tag support
mpm@selenic.com
parents: 65
diff changeset
310 fl = self.file(".hgtags")
a182f2561c8e Add tag support
mpm@selenic.com
parents: 65
diff changeset
311 for l in fl.revision(fl.tip()).splitlines():
a182f2561c8e Add tag support
mpm@selenic.com
parents: 65
diff changeset
312 if l:
a182f2561c8e Add tag support
mpm@selenic.com
parents: 65
diff changeset
313 n, k = l.split(" ")
a182f2561c8e Add tag support
mpm@selenic.com
parents: 65
diff changeset
314 self.tags[k] = bin(n)
a182f2561c8e Add tag support
mpm@selenic.com
parents: 65
diff changeset
315 except KeyError: pass
a182f2561c8e Add tag support
mpm@selenic.com
parents: 65
diff changeset
316 try:
a182f2561c8e Add tag support
mpm@selenic.com
parents: 65
diff changeset
317 return self.tags[key]
a182f2561c8e Add tag support
mpm@selenic.com
parents: 65
diff changeset
318 except KeyError:
a182f2561c8e Add tag support
mpm@selenic.com
parents: 65
diff changeset
319 return self.changelog.lookup(key)
a182f2561c8e Add tag support
mpm@selenic.com
parents: 65
diff changeset
320
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
321 def join(self, f):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
322 return os.path.join(self.path, f)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
323
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
324 def file(self, f):
192
5d8553352d2e Changes to network protocol
mpm@selenic.com
parents: 191
diff changeset
325 if f[0] == '/': f = f[1:]
144
ea9188538222 Fix transaction handling bug by reverting fileopener change
mpm@selenic.com
parents: 140
diff changeset
326 return filelog(self.opener, f)
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
327
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
328 def transaction(self):
95
589f507bb259 Beginnings of transaction undo support
mpm@selenic.com
parents: 94
diff changeset
329 return transaction(self.opener, self.join("journal"),
589f507bb259 Beginnings of transaction undo support
mpm@selenic.com
parents: 94
diff changeset
330 self.join("undo"))
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
331
162
5dcbe4d9a30c Implement recover and undo commands
mpm@selenic.com
parents: 161
diff changeset
332 def recover(self, f = "journal"):
5dcbe4d9a30c Implement recover and undo commands
mpm@selenic.com
parents: 161
diff changeset
333 self.lock()
5dcbe4d9a30c Implement recover and undo commands
mpm@selenic.com
parents: 161
diff changeset
334 if os.path.exists(self.join(f)):
163
f38c90953c2c Make undo and recover friendlier
mpm@selenic.com
parents: 162
diff changeset
335 self.ui.status("attempting to rollback %s information\n" % f)
162
5dcbe4d9a30c Implement recover and undo commands
mpm@selenic.com
parents: 161
diff changeset
336 return rollback(self.opener, self.join(f))
163
f38c90953c2c Make undo and recover friendlier
mpm@selenic.com
parents: 162
diff changeset
337 else:
f38c90953c2c Make undo and recover friendlier
mpm@selenic.com
parents: 162
diff changeset
338 self.ui.warn("no %s information available\n" % f)
162
5dcbe4d9a30c Implement recover and undo commands
mpm@selenic.com
parents: 161
diff changeset
339
161
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents: 155
diff changeset
340 def lock(self, wait = 1):
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents: 155
diff changeset
341 try:
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents: 155
diff changeset
342 return lock.lock(self.join("lock"), 0)
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents: 155
diff changeset
343 except lock.LockHeld, inst:
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents: 155
diff changeset
344 if wait:
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents: 155
diff changeset
345 self.ui.warn("waiting for lock held by %s\n" % inst.args[0])
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents: 155
diff changeset
346 return lock.lock(self.join("lock"), wait)
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents: 155
diff changeset
347 raise inst
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents: 155
diff changeset
348
203
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
349 def rawcommit(self, files, text, user, date, p1=None, p2=None):
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
350 p1 = p1 or self.current or nullid
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
351 pchange = self.changelog.read(p1)
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
352 pmmap = self.manifest.read(pchange[0])
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
353 tr = self.transaction()
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
354 mmap = {}
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
355 linkrev = self.changelog.count()
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
356 for f in files:
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
357 try:
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
358 t = file(f).read()
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
359 except IOError:
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
360 self.ui.warn("Read file %s error, skipped\n" % f)
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
361 continue
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
362 r = self.file(f)
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
363 prev = pmmap.get(f, nullid)
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
364 mmap[f] = r.add(t, tr, linkrev, prev)
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
365
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
366 mnode = self.manifest.add(mmap, tr, linkrev, pchange[0])
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
367 n = self.changelog.add(mnode, files, text, tr, p1, p2, user ,date, )
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
368 tr.close()
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
369 self.setcurrent(n)
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
370 self.dircache.clear()
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
371 self.dircache.update(mmap)
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
372
30
12f598340423 Fix up commit arg breakage
mpm@selenic.com
parents: 29
diff changeset
373 def commit(self, parent, update = None, text = ""):
161
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents: 155
diff changeset
374 self.lock()
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
375 try:
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
376 remove = [ l[:-1] for l in self.opener("to-remove") ]
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
377 os.unlink(self.join("to-remove"))
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
378
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
379 except IOError:
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
380 remove = []
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
381
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
382 if update == None:
29
4d3a5dcb6972 Make diffdir take a revision argument
mpm@selenic.com
parents: 25
diff changeset
383 update = self.diffdir(self.root, parent)[0]
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
384
151
1f6c61a60586 Bail on attempts to do an empty commit
mpm@selenic.com
parents: 149
diff changeset
385 if not update:
1f6c61a60586 Bail on attempts to do an empty commit
mpm@selenic.com
parents: 149
diff changeset
386 self.ui.status("nothing changed\n")
1f6c61a60586 Bail on attempts to do an empty commit
mpm@selenic.com
parents: 149
diff changeset
387 return
1f6c61a60586 Bail on attempts to do an empty commit
mpm@selenic.com
parents: 149
diff changeset
388
1f6c61a60586 Bail on attempts to do an empty commit
mpm@selenic.com
parents: 149
diff changeset
389 tr = self.transaction()
1f6c61a60586 Bail on attempts to do an empty commit
mpm@selenic.com
parents: 149
diff changeset
390
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
391 # check in files
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
392 new = {}
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
393 linkrev = self.changelog.count()
113
1918852a67a8 Sort files on check-in for good I/O patterns
mpm@selenic.com
parents: 110
diff changeset
394 update.sort()
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
395 for f in update:
83
9fd5b35cfc45 Add -q quiet option
mpm@selenic.com
parents: 79
diff changeset
396 self.ui.note(f + "\n")
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
397 try:
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
398 t = file(f).read()
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
399 except IOError:
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
400 remove.append(f)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
401 continue
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
402 r = self.file(f)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
403 new[f] = r.add(t, tr, linkrev)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
404
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
405 # update manifest
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
406 mmap = self.manifest.read(self.manifest.tip())
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
407 mmap.update(new)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
408 for f in remove:
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
409 del mmap[f]
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
410 mnode = self.manifest.add(mmap, tr, linkrev)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
411
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
412 # add changeset
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
413 new = new.keys()
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
414 new.sort()
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
415
185
db3aa85b9379 Add manifest hash to commit messages for easy signing
mpm@selenic.com
parents: 182
diff changeset
416 edittext = text + "\n" + "HG: manifest hash %s\n" % hex(mnode)
db3aa85b9379 Add manifest hash to commit messages for easy signing
mpm@selenic.com
parents: 182
diff changeset
417 edittext += "".join(["HG: changed %s\n" % f for f in new])
25
daa724b27300 Fix corruption from manifest.listcache optimization
mpm@selenic.com
parents: 20
diff changeset
418 edittext += "".join(["HG: removed %s\n" % f for f in remove])
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
419 edittext = self.ui.edit(edittext)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
420
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
421 n = self.changelog.add(mnode, new, edittext, tr)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
422 tr.close()
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
423
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
424 self.setcurrent(n)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
425 self.dircache.update(new)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
426 self.dircache.remove(remove)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
427
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
428 def checkout(self, node):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
429 # checkout is really dumb at the moment
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
430 # it ought to basically merge
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
431 change = self.changelog.read(node)
114
82fb6d09f911 Simplify checkout slightly, replace checkdir with os.makedirs
mpm@selenic.com
parents: 113
diff changeset
432 l = self.manifest.read(change[0]).items()
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
433 l.sort()
114
82fb6d09f911 Simplify checkout slightly, replace checkdir with os.makedirs
mpm@selenic.com
parents: 113
diff changeset
434
82fb6d09f911 Simplify checkout slightly, replace checkdir with os.makedirs
mpm@selenic.com
parents: 113
diff changeset
435 for f,n in l:
82fb6d09f911 Simplify checkout slightly, replace checkdir with os.makedirs
mpm@selenic.com
parents: 113
diff changeset
436 if f[0] == "/": continue
82fb6d09f911 Simplify checkout slightly, replace checkdir with os.makedirs
mpm@selenic.com
parents: 113
diff changeset
437 self.ui.note(f, "\n")
82fb6d09f911 Simplify checkout slightly, replace checkdir with os.makedirs
mpm@selenic.com
parents: 113
diff changeset
438 t = self.file(f).revision(n)
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
439 try:
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
440 file(f, "w").write(t)
114
82fb6d09f911 Simplify checkout slightly, replace checkdir with os.makedirs
mpm@selenic.com
parents: 113
diff changeset
441 except IOError:
82fb6d09f911 Simplify checkout slightly, replace checkdir with os.makedirs
mpm@selenic.com
parents: 113
diff changeset
442 os.makedirs(os.path.dirname(f))
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
443 file(f, "w").write(t)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
444
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
445 self.setcurrent(node)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
446 self.dircache.clear()
114
82fb6d09f911 Simplify checkout slightly, replace checkdir with os.makedirs
mpm@selenic.com
parents: 113
diff changeset
447 self.dircache.update([f for f,n in l])
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
448
29
4d3a5dcb6972 Make diffdir take a revision argument
mpm@selenic.com
parents: 25
diff changeset
449 def diffdir(self, path, changeset):
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
450 changed = []
4
ce3bd728b858 Fix exception handling for reading current working version
mpm@selenic.com
parents: 0
diff changeset
451 mf = {}
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
452 added = []
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
453
29
4d3a5dcb6972 Make diffdir take a revision argument
mpm@selenic.com
parents: 25
diff changeset
454 if changeset:
4d3a5dcb6972 Make diffdir take a revision argument
mpm@selenic.com
parents: 25
diff changeset
455 change = self.changelog.read(changeset)
4
ce3bd728b858 Fix exception handling for reading current working version
mpm@selenic.com
parents: 0
diff changeset
456 mf = self.manifest.read(change[0])
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
457
29
4d3a5dcb6972 Make diffdir take a revision argument
mpm@selenic.com
parents: 25
diff changeset
458 if changeset == self.current:
4d3a5dcb6972 Make diffdir take a revision argument
mpm@selenic.com
parents: 25
diff changeset
459 dc = self.dircache.copy()
4d3a5dcb6972 Make diffdir take a revision argument
mpm@selenic.com
parents: 25
diff changeset
460 else:
4d3a5dcb6972 Make diffdir take a revision argument
mpm@selenic.com
parents: 25
diff changeset
461 dc = dict.fromkeys(mf)
4d3a5dcb6972 Make diffdir take a revision argument
mpm@selenic.com
parents: 25
diff changeset
462
4d3a5dcb6972 Make diffdir take a revision argument
mpm@selenic.com
parents: 25
diff changeset
463 def fcmp(fn):
64
b3e2ddff0159 Diff in subdirectories from Jake Edge
mpm@selenic.com
parents: 60
diff changeset
464 t1 = file(os.path.join(self.root, fn)).read()
29
4d3a5dcb6972 Make diffdir take a revision argument
mpm@selenic.com
parents: 25
diff changeset
465 t2 = self.file(fn).revision(mf[fn])
4d3a5dcb6972 Make diffdir take a revision argument
mpm@selenic.com
parents: 25
diff changeset
466 return cmp(t1, t2)
4d3a5dcb6972 Make diffdir take a revision argument
mpm@selenic.com
parents: 25
diff changeset
467
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
468 for dir, subdirs, files in os.walk(self.root):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
469 d = dir[len(self.root)+1:]
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
470 if ".hg" in subdirs: subdirs.remove(".hg")
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
471
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
472 for f in files:
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
473 fn = os.path.join(d, f)
64
b3e2ddff0159 Diff in subdirectories from Jake Edge
mpm@selenic.com
parents: 60
diff changeset
474 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
475 except: continue
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
476 if fn in dc:
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
477 c = dc[fn]
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
478 del dc[fn]
29
4d3a5dcb6972 Make diffdir take a revision argument
mpm@selenic.com
parents: 25
diff changeset
479 if not c:
4d3a5dcb6972 Make diffdir take a revision argument
mpm@selenic.com
parents: 25
diff changeset
480 if fcmp(fn):
4d3a5dcb6972 Make diffdir take a revision argument
mpm@selenic.com
parents: 25
diff changeset
481 changed.append(fn)
33
98633e60067c Support for 0, 1, or 2 diff revs
mpm@selenic.com
parents: 32
diff changeset
482 elif c[1] != s.st_size:
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
483 changed.append(fn)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
484 elif c[0] != s.st_mode or c[2] != s.st_mtime:
29
4d3a5dcb6972 Make diffdir take a revision argument
mpm@selenic.com
parents: 25
diff changeset
485 if fcmp(fn):
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
486 changed.append(fn)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
487 else:
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
488 if self.ignore(fn): continue
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
489 added.append(fn)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
490
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
491 deleted = dc.keys()
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
492 deleted.sort()
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
493
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
494 return (changed, added, deleted)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
495
32
6a4d8718bee0 Add diffrevs function to compare two nodes
mpm@selenic.com
parents: 30
diff changeset
496 def diffrevs(self, node1, node2):
33
98633e60067c Support for 0, 1, or 2 diff revs
mpm@selenic.com
parents: 32
diff changeset
497 changed, added = [], []
32
6a4d8718bee0 Add diffrevs function to compare two nodes
mpm@selenic.com
parents: 30
diff changeset
498
6a4d8718bee0 Add diffrevs function to compare two nodes
mpm@selenic.com
parents: 30
diff changeset
499 change = self.changelog.read(node1)
6a4d8718bee0 Add diffrevs function to compare two nodes
mpm@selenic.com
parents: 30
diff changeset
500 mf1 = self.manifest.read(change[0])
33
98633e60067c Support for 0, 1, or 2 diff revs
mpm@selenic.com
parents: 32
diff changeset
501 change = self.changelog.read(node2)
32
6a4d8718bee0 Add diffrevs function to compare two nodes
mpm@selenic.com
parents: 30
diff changeset
502 mf2 = self.manifest.read(change[0])
6a4d8718bee0 Add diffrevs function to compare two nodes
mpm@selenic.com
parents: 30
diff changeset
503
6a4d8718bee0 Add diffrevs function to compare two nodes
mpm@selenic.com
parents: 30
diff changeset
504 for fn in mf2:
6a4d8718bee0 Add diffrevs function to compare two nodes
mpm@selenic.com
parents: 30
diff changeset
505 if mf1.has_key(fn):
6a4d8718bee0 Add diffrevs function to compare two nodes
mpm@selenic.com
parents: 30
diff changeset
506 if mf1[fn] != mf2[fn]:
6a4d8718bee0 Add diffrevs function to compare two nodes
mpm@selenic.com
parents: 30
diff changeset
507 changed.append(fn)
6a4d8718bee0 Add diffrevs function to compare two nodes
mpm@selenic.com
parents: 30
diff changeset
508 del mf1[fn]
6a4d8718bee0 Add diffrevs function to compare two nodes
mpm@selenic.com
parents: 30
diff changeset
509 else:
6a4d8718bee0 Add diffrevs function to compare two nodes
mpm@selenic.com
parents: 30
diff changeset
510 added.append(fn)
6a4d8718bee0 Add diffrevs function to compare two nodes
mpm@selenic.com
parents: 30
diff changeset
511
6a4d8718bee0 Add diffrevs function to compare two nodes
mpm@selenic.com
parents: 30
diff changeset
512 deleted = mf1.keys()
6a4d8718bee0 Add diffrevs function to compare two nodes
mpm@selenic.com
parents: 30
diff changeset
513 deleted.sort()
6a4d8718bee0 Add diffrevs function to compare two nodes
mpm@selenic.com
parents: 30
diff changeset
514
6a4d8718bee0 Add diffrevs function to compare two nodes
mpm@selenic.com
parents: 30
diff changeset
515 return (changed, added, deleted)
6a4d8718bee0 Add diffrevs function to compare two nodes
mpm@selenic.com
parents: 30
diff changeset
516
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
517 def add(self, list):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
518 self.dircache.taint(list)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
519
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
520 def remove(self, list):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
521 dl = self.opener("to-remove", "a")
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
522 for f in list:
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
523 dl.write(f + "\n")
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
524
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
525 def branches(self, nodes):
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
526 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
527 b = []
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
528 for n in nodes:
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
529 t = n
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
530 while n:
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
531 p = self.changelog.parents(n)
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
532 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
533 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
534 break
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
535 n = p[0]
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
536 return b
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
537
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
538 def between(self, pairs):
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
539 r = []
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
540
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
541 for top, bottom in pairs:
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
542 n, l, i = top, [], 0
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
543 f = 1
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
544
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
545 while n != bottom:
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
546 p = self.changelog.parents(n)[0]
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
547 if i == f:
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
548 l.append(n)
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
549 f = f * 2
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
550 n = p
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
551 i += 1
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
552
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
553 r.append(l)
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
554
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
555 return r
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
556
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
557 def newer(self, nodes):
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
558 m = {}
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
559 nl = []
94
7daef883134f Refactor merge code
mpm@selenic.com
parents: 90
diff changeset
560 pm = {}
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
561 cl = self.changelog
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
562 t = l = cl.count()
94
7daef883134f Refactor merge code
mpm@selenic.com
parents: 90
diff changeset
563
7daef883134f Refactor merge code
mpm@selenic.com
parents: 90
diff changeset
564 # find the lowest numbered node
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
565 for n in nodes:
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
566 l = min(l, cl.rev(n))
94
7daef883134f Refactor merge code
mpm@selenic.com
parents: 90
diff changeset
567 m[n] = 1
46
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
568
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
569 for i in xrange(l, t):
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
570 n = cl.node(i)
94
7daef883134f Refactor merge code
mpm@selenic.com
parents: 90
diff changeset
571 if n in m: # explicitly listed
7daef883134f Refactor merge code
mpm@selenic.com
parents: 90
diff changeset
572 pm[n] = 1
7daef883134f Refactor merge code
mpm@selenic.com
parents: 90
diff changeset
573 nl.append(n)
7daef883134f Refactor merge code
mpm@selenic.com
parents: 90
diff changeset
574 continue
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
575 for p in cl.parents(n):
94
7daef883134f Refactor merge code
mpm@selenic.com
parents: 90
diff changeset
576 if p in pm: # parent listed
7daef883134f Refactor merge code
mpm@selenic.com
parents: 90
diff changeset
577 pm[n] = 1
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
578 nl.append(n)
94
7daef883134f Refactor merge code
mpm@selenic.com
parents: 90
diff changeset
579 break
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
580
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
581 return nl
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
582
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
583 def getchangegroup(self, remote):
65
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
584 m = self.changelog.nodemap
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
585 search = []
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
586 fetch = []
148
c32286d0a665 Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents: 146
diff changeset
587 seen = {}
c32286d0a665 Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents: 146
diff changeset
588 seenbranch = {}
192
5d8553352d2e Changes to network protocol
mpm@selenic.com
parents: 191
diff changeset
589
5d8553352d2e Changes to network protocol
mpm@selenic.com
parents: 191
diff changeset
590 self.ui.status("searching for changes\n")
190
3dd5ce2fddb6 merge: short-circuit search for merge into empty repo
mpm@selenic.com
parents: 187
diff changeset
591 tip = remote.branches([])[0]
3dd5ce2fddb6 merge: short-circuit search for merge into empty repo
mpm@selenic.com
parents: 187
diff changeset
592 self.ui.debug("remote tip branch is %s:%s\n" %
3dd5ce2fddb6 merge: short-circuit search for merge into empty repo
mpm@selenic.com
parents: 187
diff changeset
593 (short(tip[0]), short(tip[1])))
3dd5ce2fddb6 merge: short-circuit search for merge into empty repo
mpm@selenic.com
parents: 187
diff changeset
594
3dd5ce2fddb6 merge: short-circuit search for merge into empty repo
mpm@selenic.com
parents: 187
diff changeset
595 # 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
596 if self.changelog.tip() == nullid:
3dd5ce2fddb6 merge: short-circuit search for merge into empty repo
mpm@selenic.com
parents: 187
diff changeset
597 return remote.changegroup([nullid])
3dd5ce2fddb6 merge: short-circuit search for merge into empty repo
mpm@selenic.com
parents: 187
diff changeset
598
3dd5ce2fddb6 merge: short-circuit search for merge into empty repo
mpm@selenic.com
parents: 187
diff changeset
599 # otherwise, assume we're closer to the tip than the root
3dd5ce2fddb6 merge: short-circuit search for merge into empty repo
mpm@selenic.com
parents: 187
diff changeset
600 unknown = [tip]
46
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
601
65
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
602 if tip[0] in m:
192
5d8553352d2e Changes to network protocol
mpm@selenic.com
parents: 191
diff changeset
603 self.ui.status("nothing to do!\n")
60
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
604 return None
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
605
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
606 while unknown:
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
607 n = unknown.pop(0)
148
c32286d0a665 Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents: 146
diff changeset
608 seen[n[0]] = 1
c32286d0a665 Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents: 146
diff changeset
609
c32286d0a665 Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents: 146
diff changeset
610 self.ui.debug("examining %s:%s\n" % (short(n[0]), short(n[1])))
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
611 if n == nullid: break
148
c32286d0a665 Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents: 146
diff changeset
612 if n in seenbranch:
c32286d0a665 Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents: 146
diff changeset
613 self.ui.debug("branch already found\n")
c32286d0a665 Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents: 146
diff changeset
614 continue
65
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
615 if n[1] and n[1] in m: # do we know the base?
148
c32286d0a665 Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents: 146
diff changeset
616 self.ui.debug("found incomplete branch %s:%s\n"
c32286d0a665 Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents: 146
diff changeset
617 % (short(n[0]), short(n[1])))
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
618 search.append(n) # schedule branch range for scanning
148
c32286d0a665 Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents: 146
diff changeset
619 seenbranch[n] = 1
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
620 else:
94
7daef883134f Refactor merge code
mpm@selenic.com
parents: 90
diff changeset
621 if n[2] in m and n[3] in m:
7daef883134f Refactor merge code
mpm@selenic.com
parents: 90
diff changeset
622 if n[1] not in fetch:
7daef883134f Refactor merge code
mpm@selenic.com
parents: 90
diff changeset
623 self.ui.debug("found new changeset %s\n" %
7daef883134f Refactor merge code
mpm@selenic.com
parents: 90
diff changeset
624 short(n[1]))
7daef883134f Refactor merge code
mpm@selenic.com
parents: 90
diff changeset
625 fetch.append(n[1]) # earliest unknown
7daef883134f Refactor merge code
mpm@selenic.com
parents: 90
diff changeset
626 continue
148
c32286d0a665 Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents: 146
diff changeset
627
c32286d0a665 Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents: 146
diff changeset
628 r = []
c32286d0a665 Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents: 146
diff changeset
629 for a in n[2:4]:
c32286d0a665 Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents: 146
diff changeset
630 if a not in seen: r.append(a)
c32286d0a665 Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents: 146
diff changeset
631
c32286d0a665 Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents: 146
diff changeset
632 if r:
c32286d0a665 Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents: 146
diff changeset
633 self.ui.debug("requesting %s\n" %
c32286d0a665 Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents: 146
diff changeset
634 " ".join(map(short, r)))
c32286d0a665 Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents: 146
diff changeset
635 for b in remote.branches(r):
c32286d0a665 Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents: 146
diff changeset
636 self.ui.debug("received %s:%s\n" %
c32286d0a665 Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents: 146
diff changeset
637 (short(b[0]), short(b[1])))
c32286d0a665 Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents: 146
diff changeset
638 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
639 unknown.append(b)
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
640
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
641 while search:
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
642 n = search.pop(0)
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
643 l = remote.between([(n[0], n[1])])[0]
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
644 p = n[0]
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
645 f = 1
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
646 for i in l + [n[1]]:
65
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
647 if i in m:
85
58a1a0425c9b Fix merge bug, I hope
mpm@selenic.com
parents: 83
diff changeset
648 if f <= 2:
83
9fd5b35cfc45 Add -q quiet option
mpm@selenic.com
parents: 79
diff changeset
649 self.ui.debug("found new branch changeset %s\n" %
9fd5b35cfc45 Add -q quiet option
mpm@selenic.com
parents: 79
diff changeset
650 short(p))
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
651 fetch.append(p)
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
652 else:
83
9fd5b35cfc45 Add -q quiet option
mpm@selenic.com
parents: 79
diff changeset
653 self.ui.debug("narrowed branch search to %s:%s\n"
9fd5b35cfc45 Add -q quiet option
mpm@selenic.com
parents: 79
diff changeset
654 % (short(p), short(i)))
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
655 search.append((p, i))
65
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
656 break
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
657 p, f = i, f * 2
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
658
65
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
659 for f in fetch:
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
660 if f in m:
83
9fd5b35cfc45 Add -q quiet option
mpm@selenic.com
parents: 79
diff changeset
661 raise "already have", short(f[:4])
9fd5b35cfc45 Add -q quiet option
mpm@selenic.com
parents: 79
diff changeset
662
94
7daef883134f Refactor merge code
mpm@selenic.com
parents: 90
diff changeset
663 self.ui.note("adding new changesets starting at " +
83
9fd5b35cfc45 Add -q quiet option
mpm@selenic.com
parents: 79
diff changeset
664 " ".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
665
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
666 return remote.changegroup(fetch)
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
667
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
668 def changegroup(self, basenodes):
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
669 nodes = self.newer(basenodes)
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
670
46
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
671 # construct the link map
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
672 linkmap = {}
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
673 for n in nodes:
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
674 linkmap[self.changelog.rev(n)] = n
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
675
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
676 # construct a list of all changed files
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
677 changed = {}
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
678 for n in nodes:
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
679 c = self.changelog.read(n)
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
680 for f in c[3]:
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
681 changed[f] = 1
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
682 changed = changed.keys()
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
683 changed.sort()
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
684
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
685 # the changegroup is changesets + manifests + all file revs
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
686 revs = [ self.changelog.rev(n) for n in nodes ]
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
687
192
5d8553352d2e Changes to network protocol
mpm@selenic.com
parents: 191
diff changeset
688 for y in self.changelog.group(linkmap): yield y
5d8553352d2e Changes to network protocol
mpm@selenic.com
parents: 191
diff changeset
689 for y in self.manifest.group(linkmap): yield y
46
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
690 for f in changed:
192
5d8553352d2e Changes to network protocol
mpm@selenic.com
parents: 191
diff changeset
691 yield struct.pack(">l", len(f) + 4) + f
46
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
692 g = self.file(f).group(linkmap)
192
5d8553352d2e Changes to network protocol
mpm@selenic.com
parents: 191
diff changeset
693 for y in g:
5d8553352d2e Changes to network protocol
mpm@selenic.com
parents: 191
diff changeset
694 yield y
46
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
695
65
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
696 def addchangegroup(self, generator):
191
d7e859cf2f1b merge: add count of new manifests, files, and revisions
mpm@selenic.com
parents: 190
diff changeset
697 changesets = files = revisions = 0
d7e859cf2f1b merge: add count of new manifests, files, and revisions
mpm@selenic.com
parents: 190
diff changeset
698
161
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents: 155
diff changeset
699 self.lock()
65
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
700 class genread:
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
701 def __init__(self, generator):
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
702 self.g = generator
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
703 self.buf = ""
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
704 def read(self, l):
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
705 while l > len(self.buf):
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
706 try:
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
707 self.buf += self.g.next()
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
708 except StopIteration:
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
709 break
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
710 d, self.buf = self.buf[:l], self.buf[l:]
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
711 return d
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
712
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
713 if not generator: return
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
714 source = genread(generator)
60
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
715
192
5d8553352d2e Changes to network protocol
mpm@selenic.com
parents: 191
diff changeset
716 def getchunk():
65
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
717 d = source.read(4)
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
718 if not d: return ""
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
719 l = struct.unpack(">l", d)[0]
192
5d8553352d2e Changes to network protocol
mpm@selenic.com
parents: 191
diff changeset
720 if l <= 4: return ""
5d8553352d2e Changes to network protocol
mpm@selenic.com
parents: 191
diff changeset
721 return source.read(l - 4)
5d8553352d2e Changes to network protocol
mpm@selenic.com
parents: 191
diff changeset
722
5d8553352d2e Changes to network protocol
mpm@selenic.com
parents: 191
diff changeset
723 def getgroup():
5d8553352d2e Changes to network protocol
mpm@selenic.com
parents: 191
diff changeset
724 while 1:
5d8553352d2e Changes to network protocol
mpm@selenic.com
parents: 191
diff changeset
725 c = getchunk()
5d8553352d2e Changes to network protocol
mpm@selenic.com
parents: 191
diff changeset
726 if not c: break
5d8553352d2e Changes to network protocol
mpm@selenic.com
parents: 191
diff changeset
727 yield c
65
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
728
46
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
729 tr = self.transaction()
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
730 simple = True
146
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
731 need = {}
46
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
732
94
7daef883134f Refactor merge code
mpm@selenic.com
parents: 90
diff changeset
733 self.ui.status("adding changesets\n")
46
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
734 # pull off the changeset group
94
7daef883134f Refactor merge code
mpm@selenic.com
parents: 90
diff changeset
735 def report(x):
7daef883134f Refactor merge code
mpm@selenic.com
parents: 90
diff changeset
736 self.ui.debug("add changeset %s\n" % short(x))
7daef883134f Refactor merge code
mpm@selenic.com
parents: 90
diff changeset
737 return self.changelog.count()
192
5d8553352d2e Changes to network protocol
mpm@selenic.com
parents: 191
diff changeset
738
46
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
739 co = self.changelog.tip()
192
5d8553352d2e Changes to network protocol
mpm@selenic.com
parents: 191
diff changeset
740 cn = self.changelog.addgroup(getgroup(), report, tr)
46
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
741
192
5d8553352d2e Changes to network protocol
mpm@selenic.com
parents: 191
diff changeset
742 changesets = self.changelog.rev(cn) - self.changelog.rev(co)
191
d7e859cf2f1b merge: add count of new manifests, files, and revisions
mpm@selenic.com
parents: 190
diff changeset
743
94
7daef883134f Refactor merge code
mpm@selenic.com
parents: 90
diff changeset
744 self.ui.status("adding manifests\n")
46
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
745 # pull off the manifest group
90
ab9ebff09dcd Fix manifest merge swap bug
mpm@selenic.com
parents: 85
diff changeset
746 mm = self.manifest.tip()
192
5d8553352d2e Changes to network protocol
mpm@selenic.com
parents: 191
diff changeset
747 mo = self.manifest.addgroup(getgroup(),
5d8553352d2e Changes to network protocol
mpm@selenic.com
parents: 191
diff changeset
748 lambda x: self.changelog.rev(x), tr)
191
d7e859cf2f1b merge: add count of new manifests, files, and revisions
mpm@selenic.com
parents: 190
diff changeset
749
46
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
750 # do we need a resolve?
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
751 if self.changelog.ancestor(co, cn) != co:
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
752 simple = False
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
753 resolverev = self.changelog.count()
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
754
146
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
755 # resolve the manifest to determine which files
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
756 # we care about merging
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
757 self.ui.status("resolving manifests\n")
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
758 ma = self.manifest.ancestor(mm, mo)
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
759 omap = self.manifest.read(mo) # other
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
760 amap = self.manifest.read(ma) # ancestor
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
761 mmap = self.manifest.read(mm) # mine
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
762 nmap = {}
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
763
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
764 self.ui.debug(" ancestor %s local %s remote %s\n" %
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
765 (short(ma), short(mm), short(mo)))
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
766
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
767 for f, mid in mmap.iteritems():
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
768 if f in omap:
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
769 if mid != omap[f]:
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
770 self.ui.debug(" %s versions differ, do resolve\n" % f)
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
771 need[f] = mid # use merged version or local version
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
772 else:
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
773 nmap[f] = mid # keep ours
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
774 del omap[f]
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
775 elif f in amap:
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
776 if mid != amap[f]:
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
777 r = self.ui.prompt(
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
778 (" local changed %s which remote deleted\n" % f) +
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
779 "(k)eep or (d)elete?", "[kd]", "k")
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
780 if r == "k": nmap[f] = mid
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
781 else:
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
782 self.ui.debug("other deleted %s\n" % f)
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
783 pass # other deleted it
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
784 else:
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
785 self.ui.debug("local created %s\n" %f)
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
786 nmap[f] = mid # we created it
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
787
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
788 del mmap
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
789
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
790 for f, oid in omap.iteritems():
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
791 if f in amap:
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
792 if oid != amap[f]:
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
793 r = self.ui.prompt(
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
794 ("remote changed %s which local deleted\n" % f) +
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
795 "(k)eep or (d)elete?", "[kd]", "k")
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
796 if r == "k": nmap[f] = oid
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
797 else:
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
798 pass # probably safe
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
799 else:
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
800 self.ui.debug("remote created %s, do resolve\n" % f)
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
801 need[f] = oid
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
802
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
803 del omap
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
804 del amap
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
805
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
806 new = need.keys()
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
807 new.sort()
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
808
46
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
809 # process the files
94
7daef883134f Refactor merge code
mpm@selenic.com
parents: 90
diff changeset
810 self.ui.status("adding files\n")
65
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
811 while 1:
192
5d8553352d2e Changes to network protocol
mpm@selenic.com
parents: 191
diff changeset
812 f = getchunk()
65
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
813 if not f: break
94
7daef883134f Refactor merge code
mpm@selenic.com
parents: 90
diff changeset
814 self.ui.debug("adding %s revisions\n" % f)
46
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
815 fl = self.file(f)
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
816 o = fl.tip()
192
5d8553352d2e Changes to network protocol
mpm@selenic.com
parents: 191
diff changeset
817 n = fl.addgroup(getgroup(), lambda x: self.changelog.rev(x), tr)
191
d7e859cf2f1b merge: add count of new manifests, files, and revisions
mpm@selenic.com
parents: 190
diff changeset
818 revisions += fl.rev(n) - fl.rev(o)
d7e859cf2f1b merge: add count of new manifests, files, and revisions
mpm@selenic.com
parents: 190
diff changeset
819 files += 1
146
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
820 if f in need:
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
821 del need[f]
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
822 # manifest resolve determined we need to merge the tips
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
823 nmap[f] = self.merge3(fl, f, o, n, tr, resolverev)
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
824
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
825 if need:
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
826 # we need to do trivial merges on local files
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
827 for f in new:
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
828 if f not in need: continue
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
829 fl = self.file(f)
4a828422247d Handle merge with deletions
mpm@selenic.com
parents: 144
diff changeset
830 nmap[f] = self.merge3(fl, f, need[f], fl.tip(), tr, resolverev)
191
d7e859cf2f1b merge: add count of new manifests, files, and revisions
mpm@selenic.com
parents: 190
diff changeset
831 revisions += 1
46
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
832
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
833 # For simple merges, we don't need to resolve manifests or changesets
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
834 if simple:
90
ab9ebff09dcd Fix manifest merge swap bug
mpm@selenic.com
parents: 85
diff changeset
835 self.ui.debug("simple merge, skipping resolve\n")
192
5d8553352d2e Changes to network protocol
mpm@selenic.com
parents: 191
diff changeset
836 self.ui.status(("modified %d files, added %d changesets" +
191
d7e859cf2f1b merge: add count of new manifests, files, and revisions
mpm@selenic.com
parents: 190
diff changeset
837 " and %d new revisions\n")
192
5d8553352d2e Changes to network protocol
mpm@selenic.com
parents: 191
diff changeset
838 % (files, changesets, revisions))
46
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
839 tr.close()
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
840 return
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
841
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
842 node = self.manifest.add(nmap, tr, resolverev, mm, mo)
191
d7e859cf2f1b merge: add count of new manifests, files, and revisions
mpm@selenic.com
parents: 190
diff changeset
843 revisions += 1
46
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
844
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
845 # Now all files and manifests are merged, we add the changed files
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
846 # and manifest id to the changelog
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
847 self.ui.status("committing merge changeset\n")
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
848 if co == cn: cn = -1
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
849
78
85f1f87dc8ff Add "HG: merge resolve" to editor text for merge
mpm@selenic.com
parents: 67
diff changeset
850 edittext = "\nHG: merge resolve\n" + \
187
aa9a0d50e612 Fix two minor merge bugs
mpm@selenic.com
parents: 186
diff changeset
851 "HG: manifest hash %s\n" % hex(node) + \
78
85f1f87dc8ff Add "HG: merge resolve" to editor text for merge
mpm@selenic.com
parents: 67
diff changeset
852 "".join(["HG: changed %s\n" % f for f in new])
46
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
853 edittext = self.ui.edit(edittext)
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
854 n = self.changelog.add(node, new, edittext, tr, co, cn)
191
d7e859cf2f1b merge: add count of new manifests, files, and revisions
mpm@selenic.com
parents: 190
diff changeset
855 revisions += 1
d7e859cf2f1b merge: add count of new manifests, files, and revisions
mpm@selenic.com
parents: 190
diff changeset
856
d7e859cf2f1b merge: add count of new manifests, files, and revisions
mpm@selenic.com
parents: 190
diff changeset
857 self.ui.status("added %d changesets, %d files, and %d new revisions\n"
d7e859cf2f1b merge: add count of new manifests, files, and revisions
mpm@selenic.com
parents: 190
diff changeset
858 % (changesets, files, revisions))
46
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
859
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
860 tr.close()
93e868fa0db8 Add changegroup support
mpm@selenic.com
parents: 44
diff changeset
861
96
fce47326677c Add updated merge3 code
mpm@selenic.com
parents: 95
diff changeset
862 def merge3(self, fl, fn, my, other, transaction, link):
fce47326677c Add updated merge3 code
mpm@selenic.com
parents: 95
diff changeset
863 """perform a 3-way merge and append the result"""
fce47326677c Add updated merge3 code
mpm@selenic.com
parents: 95
diff changeset
864
fce47326677c Add updated merge3 code
mpm@selenic.com
parents: 95
diff changeset
865 def temp(prefix, node):
fce47326677c Add updated merge3 code
mpm@selenic.com
parents: 95
diff changeset
866 pre = "%s~%s." % (os.path.basename(fn), prefix)
fce47326677c Add updated merge3 code
mpm@selenic.com
parents: 95
diff changeset
867 (fd, name) = tempfile.mkstemp("", pre)
fce47326677c Add updated merge3 code
mpm@selenic.com
parents: 95
diff changeset
868 f = os.fdopen(fd, "w")
fce47326677c Add updated merge3 code
mpm@selenic.com
parents: 95
diff changeset
869 f.write(fl.revision(node))
fce47326677c Add updated merge3 code
mpm@selenic.com
parents: 95
diff changeset
870 f.close()
fce47326677c Add updated merge3 code
mpm@selenic.com
parents: 95
diff changeset
871 return name
fce47326677c Add updated merge3 code
mpm@selenic.com
parents: 95
diff changeset
872
fce47326677c Add updated merge3 code
mpm@selenic.com
parents: 95
diff changeset
873 base = fl.ancestor(my, other)
fce47326677c Add updated merge3 code
mpm@selenic.com
parents: 95
diff changeset
874 self.ui.note("resolving %s\n" % fn)
fce47326677c Add updated merge3 code
mpm@selenic.com
parents: 95
diff changeset
875 self.ui.debug("local %s remote %s ancestor %s\n" %
fce47326677c Add updated merge3 code
mpm@selenic.com
parents: 95
diff changeset
876 (short(my), short(other), short(base)))
fce47326677c Add updated merge3 code
mpm@selenic.com
parents: 95
diff changeset
877
fce47326677c Add updated merge3 code
mpm@selenic.com
parents: 95
diff changeset
878 if my == base:
fce47326677c Add updated merge3 code
mpm@selenic.com
parents: 95
diff changeset
879 text = fl.revision(other)
fce47326677c Add updated merge3 code
mpm@selenic.com
parents: 95
diff changeset
880 else:
fce47326677c Add updated merge3 code
mpm@selenic.com
parents: 95
diff changeset
881 a = temp("local", my)
fce47326677c Add updated merge3 code
mpm@selenic.com
parents: 95
diff changeset
882 b = temp("remote", other)
fce47326677c Add updated merge3 code
mpm@selenic.com
parents: 95
diff changeset
883 c = temp("parent", base)
fce47326677c Add updated merge3 code
mpm@selenic.com
parents: 95
diff changeset
884
fce47326677c Add updated merge3 code
mpm@selenic.com
parents: 95
diff changeset
885 cmd = os.environ["HGMERGE"]
fce47326677c Add updated merge3 code
mpm@selenic.com
parents: 95
diff changeset
886 self.ui.debug("invoking merge with %s\n" % cmd)
149
8cd45e152c83 Pass filename to $HGMERGE
mpm@selenic.com
parents: 148
diff changeset
887 r = os.system("%s %s %s %s %s" % (cmd, a, b, c, fn))
96
fce47326677c Add updated merge3 code
mpm@selenic.com
parents: 95
diff changeset
888 if r:
fce47326677c Add updated merge3 code
mpm@selenic.com
parents: 95
diff changeset
889 raise "Merge failed!"
fce47326677c Add updated merge3 code
mpm@selenic.com
parents: 95
diff changeset
890
fce47326677c Add updated merge3 code
mpm@selenic.com
parents: 95
diff changeset
891 text = open(a).read()
fce47326677c Add updated merge3 code
mpm@selenic.com
parents: 95
diff changeset
892 os.unlink(a)
fce47326677c Add updated merge3 code
mpm@selenic.com
parents: 95
diff changeset
893 os.unlink(b)
fce47326677c Add updated merge3 code
mpm@selenic.com
parents: 95
diff changeset
894 os.unlink(c)
fce47326677c Add updated merge3 code
mpm@selenic.com
parents: 95
diff changeset
895
171
75dddd697ed4 trivial tweak to merge3
mpm@selenic.com
parents: 163
diff changeset
896 return fl.add(text, transaction, link, my, other)
96
fce47326677c Add updated merge3 code
mpm@selenic.com
parents: 95
diff changeset
897
60
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
898 class remoterepository:
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
899 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
900 self.url = path
60
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
901 self.ui = ui
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
902
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
903 def do_cmd(self, cmd, **args):
83
9fd5b35cfc45 Add -q quiet option
mpm@selenic.com
parents: 79
diff changeset
904 self.ui.debug("sending %s command\n" % cmd)
60
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
905 q = {"cmd": cmd}
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
906 q.update(args)
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
907 qs = urllib.urlencode(q)
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
908 cu = "%s?%s" % (self.url, qs)
65
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
909 return urllib.urlopen(cu)
60
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
910
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
911 def branches(self, nodes):
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
912 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
913 d = self.do_cmd("branches", nodes=n).read()
148
c32286d0a665 Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents: 146
diff changeset
914 br = [ tuple(map(bin, b.split(" "))) for b in d.splitlines() ]
60
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
915 return br
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
916
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
917 def between(self, pairs):
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
918 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
919 d = self.do_cmd("between", pairs=n).read()
187
aa9a0d50e612 Fix two minor merge bugs
mpm@selenic.com
parents: 186
diff changeset
920 p = [ l and map(bin, l.split(" ")) or [] for l in d.splitlines() ]
60
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
921 return p
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
922
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
923 def changegroup(self, nodes):
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
924 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
925 zd = zlib.decompressobj()
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
926 f = self.do_cmd("changegroup", roots=n)
192
5d8553352d2e Changes to network protocol
mpm@selenic.com
parents: 191
diff changeset
927 bytes = 0
65
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
928 while 1:
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
929 d = f.read(4096)
192
5d8553352d2e Changes to network protocol
mpm@selenic.com
parents: 191
diff changeset
930 bytes += len(d)
65
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
931 if not d:
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
932 yield zd.flush()
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
933 break
d40cc5aacc31 Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents: 64
diff changeset
934 yield zd.decompress(d)
192
5d8553352d2e Changes to network protocol
mpm@selenic.com
parents: 191
diff changeset
935 self.ui.note("%d bytes of data transfered\n" % bytes)
60
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
936
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
937 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
938 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
939 return remoterepository(ui, path)
60
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
940 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
941 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
942 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
943 return localrepository(ui, path.replace("old-http://", "http://"))
60
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
944 else:
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
945 return localrepository(ui, path, create)
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
946
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
947 class httprangereader:
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
948 def __init__(self, url):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
949 self.url = url
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
950 self.pos = 0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
951 def seek(self, pos):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
952 self.pos = pos
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
953 def read(self, bytes=None):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
954 opener = urllib2.build_opener(byterange.HTTPRangeHandler())
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
955 urllib2.install_opener(opener)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
956 req = urllib2.Request(self.url)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
957 end = ''
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
958 if bytes: end = self.pos + bytes
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
959 req.add_header('Range', 'bytes=%d-%s' % (self.pos, end))
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
960 f = urllib2.urlopen(req)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
961 return f.read()