Mercurial > hg
comparison hgext/convert/__init__.py @ 4588:9855939d0c82
convert extension: Save a few opens on the map file
Save a few opens on the map file adding a class attribute
author | Edouard Gomez <ed.gomez@free.fr> |
---|---|
date | Thu, 14 Jun 2007 23:25:55 +0200 |
parents | cc9b79216a76 |
children | 451e91ed535e |
comparison
equal
deleted
inserted
replaced
4587:d8a08b92ad34 | 4588:9855939d0c82 |
---|---|
31 def __init__(self, ui, source, dest, mapfile, opts): | 31 def __init__(self, ui, source, dest, mapfile, opts): |
32 | 32 |
33 self.source = source | 33 self.source = source |
34 self.dest = dest | 34 self.dest = dest |
35 self.ui = ui | 35 self.ui = ui |
36 self.mapfile = mapfile | |
37 self.opts = opts | 36 self.opts = opts |
38 self.commitcache = {} | 37 self.commitcache = {} |
38 self.mapfile = mapfile | |
39 self.mapfilefd = None | |
39 | 40 |
40 self.map = {} | 41 self.map = {} |
41 try: | 42 try: |
42 for l in file(self.mapfile): | 43 origmapfile = open(self.mapfile, 'r') |
44 for l in origmapfile: | |
43 sv, dv = l[:-1].split() | 45 sv, dv = l[:-1].split() |
44 self.map[sv] = dv | 46 self.map[sv] = dv |
47 origmapfile.close() | |
45 except IOError: | 48 except IOError: |
46 pass | 49 pass |
47 | 50 |
48 def walktree(self, heads): | 51 def walktree(self, heads): |
49 visit = heads | 52 visit = heads |
116 s.sort() | 119 s.sort() |
117 s = [e[2] for e in s] | 120 s = [e[2] for e in s] |
118 | 121 |
119 return s | 122 return s |
120 | 123 |
124 def mapentry(self, src, dst): | |
125 if self.mapfilefd is None: | |
126 try: | |
127 self.mapfilefd = open(self.mapfile, "a") | |
128 except IOError, (errno, strerror): | |
129 raise util.Abort("Could not open map file %s: %s, %s\n" % (self.mapfile, errno, strerror)) | |
130 self.map[src] = dst | |
131 self.mapfilefd.write("%s %s\n" % (src, dst)) | |
132 self.mapfilefd.flush() | |
133 | |
121 def copy(self, rev): | 134 def copy(self, rev): |
122 c = self.commitcache[rev] | 135 c = self.commitcache[rev] |
123 files = self.source.getchanges(rev) | 136 files = self.source.getchanges(rev) |
124 | 137 |
125 for f, v in files: | 138 for f, v in files: |
131 e = self.source.getmode(f, v) | 144 e = self.source.getmode(f, v) |
132 self.dest.putfile(f, e, data) | 145 self.dest.putfile(f, e, data) |
133 | 146 |
134 r = [self.map[v] for v in c.parents] | 147 r = [self.map[v] for v in c.parents] |
135 f = [f for f, v in files] | 148 f = [f for f, v in files] |
136 self.map[rev] = self.dest.putcommit(f, r, c) | 149 newnode = self.dest.putcommit(f, r, c) |
137 file(self.mapfile, "a").write("%s %s\n" % (rev, self.map[rev])) | 150 self.mapentry(rev, newnode) |
138 | 151 |
139 def convert(self): | 152 def convert(self): |
140 self.ui.status("scanning source...\n") | 153 try: |
141 heads = self.source.getheads() | 154 self.ui.status("scanning source...\n") |
142 parents = self.walktree(heads) | 155 heads = self.source.getheads() |
143 self.ui.status("sorting...\n") | 156 parents = self.walktree(heads) |
144 t = self.toposort(parents) | 157 self.ui.status("sorting...\n") |
145 num = len(t) | 158 t = self.toposort(parents) |
146 c = None | 159 num = len(t) |
147 | 160 c = None |
148 self.ui.status("converting...\n") | 161 |
149 for c in t: | 162 self.ui.status("converting...\n") |
150 num -= 1 | 163 for c in t: |
151 desc = self.commitcache[c].desc | 164 num -= 1 |
152 if "\n" in desc: | 165 desc = self.commitcache[c].desc |
153 desc = desc.splitlines()[0] | 166 if "\n" in desc: |
154 self.ui.status("%d %s\n" % (num, desc)) | 167 desc = desc.splitlines()[0] |
155 self.copy(c) | 168 self.ui.status("%d %s\n" % (num, desc)) |
156 | 169 self.copy(c) |
157 tags = self.source.gettags() | 170 |
158 ctags = {} | 171 tags = self.source.gettags() |
159 for k in tags: | 172 ctags = {} |
160 v = tags[k] | 173 for k in tags: |
161 if v in self.map: | 174 v = tags[k] |
162 ctags[k] = self.map[v] | 175 if v in self.map: |
163 | 176 ctags[k] = self.map[v] |
164 if c and ctags: | 177 |
165 nrev = self.dest.puttags(ctags) | 178 if c and ctags: |
166 # write another hash correspondence to override the previous | 179 nrev = self.dest.puttags(ctags) |
167 # one so we don't end up with extra tag heads | 180 # write another hash correspondence to override the previous |
168 if nrev: | 181 # one so we don't end up with extra tag heads |
169 file(self.mapfile, "a").write("%s %s\n" % (c, nrev)) | 182 if nrev: |
183 self.mapentry(c, nrev) | |
184 finally: | |
185 self.cleanup() | |
186 | |
187 def cleanup(self): | |
188 if self.mapfilefd: | |
189 self.mapfilefd.close() | |
170 | 190 |
171 def _convert(ui, src, dest=None, mapfile=None, **opts): | 191 def _convert(ui, src, dest=None, mapfile=None, **opts): |
172 '''Convert a foreign SCM repository to a Mercurial one. | 192 '''Convert a foreign SCM repository to a Mercurial one. |
173 | 193 |
174 Accepted source formats: | 194 Accepted source formats: |