Mercurial > hgsubversion
comparison svncommands.py @ 246:074f27c68818
Move rebuildmeta into svncommands.
| author | Dirkjan Ochtman <dirkjan@ochtman.nl> |
|---|---|
| date | Wed, 08 Apr 2009 18:49:44 +0200 |
| parents | 28d0ee605308 |
| children | 1272e87546ed |
comparison
equal
deleted
inserted
replaced
| 245:f8e9b74df403 | 246:074f27c68818 |
|---|---|
| 1 import os | 1 import os |
| 2 import cPickle as pickle | |
| 2 | 3 |
| 3 from mercurial import hg | 4 from mercurial import hg |
| 4 from mercurial import node | 5 from mercurial import node |
| 5 from mercurial import patch | 6 from mercurial import patch |
| 6 from mercurial import util as hgutil | 7 from mercurial import util as hgutil |
| 209 'unified': True, | 210 'unified': True, |
| 210 'text': False, | 211 'text': False, |
| 211 })) | 212 })) |
| 212 ui.write(cmdutil.filterdiff(''.join(it), base_rev)) | 213 ui.write(cmdutil.filterdiff(''.join(it), base_rev)) |
| 213 diff = util.register_subcommand('diff')(diff) | 214 diff = util.register_subcommand('diff')(diff) |
| 215 | |
| 216 | |
| 217 def rebuildmeta(ui, repo, hg_repo_path, args, **opts): | |
| 218 """rebuild hgsubversion metadata using values stored in revisions | |
| 219 """ | |
| 220 if len(args) != 1: | |
| 221 raise hgutil.Abort('You must pass the svn URI used to create this repo.') | |
| 222 uuid = None | |
| 223 url = args[0].rstrip('/') | |
| 224 user = opts.get('username', hgutil.getuser()) | |
| 225 passwd = opts.get('password', '') | |
| 226 svn = svnwrap.SubversionRepo(url, user, passwd) | |
| 227 subdir = svn.subdir | |
| 228 svnmetadir = os.path.join(repo.path, 'svn') | |
| 229 if not os.path.exists(svnmetadir): | |
| 230 os.makedirs(svnmetadir) | |
| 231 | |
| 232 revmap = open(os.path.join(svnmetadir, 'rev_map'), 'w') | |
| 233 revmap.write('1\n') | |
| 234 last_rev = -1 | |
| 235 branchinfo = {} | |
| 236 noderevnums = {} | |
| 237 for rev in repo: | |
| 238 ctx = repo[rev] | |
| 239 convinfo = ctx.extra().get('convert_revision', None) | |
| 240 if convinfo: | |
| 241 assert convinfo.startswith('svn:') | |
| 242 revpath, revision = convinfo[40:].split('@') | |
| 243 if subdir and subdir[0] != '/': | |
| 244 subdir = '/' + subdir | |
| 245 if subdir and subdir[-1] == '/': | |
| 246 subdir = subdir[:-1] | |
| 247 assert revpath.startswith(subdir), ('That does not look like the ' | |
| 248 'right location in the repo.') | |
| 249 if uuid is None: | |
| 250 uuid = convinfo[4:40] | |
| 251 assert uuid == svn.uuid, 'UUIDs did not match!' | |
| 252 urlfile = open(os.path.join(svnmetadir, 'url'), 'w') | |
| 253 urlfile.write(url) | |
| 254 urlfile.close() | |
| 255 uuidfile = open(os.path.join(svnmetadir, 'uuid'), 'w') | |
| 256 uuidfile.write(uuid) | |
| 257 uuidfile.close() | |
| 258 commitpath = revpath[len(subdir)+1:] | |
| 259 if commitpath.startswith('branches'): | |
| 260 commitpath = commitpath[len('branches/'):] | |
| 261 elif commitpath == 'trunk': | |
| 262 commitpath = '' | |
| 263 else: | |
| 264 assert False, 'Unhandled case in rebuildmeta' | |
| 265 revmap.write('%s %s %s\n' % (revision, | |
| 266 node.hex(ctx.node()), | |
| 267 commitpath)) | |
| 268 revision = int(revision) | |
| 269 noderevnums[ctx.node()] = revision | |
| 270 if revision > last_rev: | |
| 271 last_rev = revision | |
| 272 branch = ctx.branch() | |
| 273 if branch == 'default': | |
| 274 branch = None | |
| 275 if branch not in branchinfo: | |
| 276 parent = ctx.parents()[0] | |
| 277 if (parent.node() in noderevnums | |
| 278 and parent.branch() != ctx.branch()): | |
| 279 parentbranch = parent.branch() | |
| 280 if parentbranch == 'default': | |
| 281 parentbranch = None | |
| 282 else: | |
| 283 parentbranch = None | |
| 284 branchinfo[branch] = (parentbranch, | |
| 285 noderevnums.get(parent.node(), 0), | |
| 286 revision) | |
| 287 for c in ctx.children(): | |
| 288 if c.branch() == 'closed-branches': | |
| 289 if branch in branchinfo: | |
| 290 del branchinfo[branch] | |
| 291 branchinfofile = open(os.path.join(svnmetadir, 'branch_info'), 'w') | |
| 292 pickle.dump(branchinfo, branchinfofile) | |
| 293 branchinfofile.close() | |
| 294 | |
| 295 # now handle tags | |
| 296 tagsinfo = {} | |
| 297 realtags = svn.tags | |
| 298 tagsleft = realtags.items() | |
| 299 while tagsleft: | |
| 300 tag, tagparent = tagsleft.pop(0) | |
| 301 source, rev = tagparent | |
| 302 if source.startswith('tags/'): | |
| 303 src = source[len('tags/'):] | |
| 304 if src in tagsinfo: | |
| 305 tagsinfo[tag] = tagsinfo[src] | |
| 306 elif src in realtags: | |
| 307 if (realtags[src][1] <= last_rev | |
| 308 or realtags[src][0].startswith('tags/')): | |
| 309 tagsleft.append(src) | |
| 310 else: | |
| 311 older_tags = svn.tags_at_rev(rev) | |
| 312 newsrc, newrev = older_tags[src] | |
| 313 tagsleft.append((tag, (newsrc, newrev))) | |
| 314 continue | |
| 315 else: | |
| 316 # determine the branch | |
| 317 assert not source.startswith('tags/'), "Tags can't be tags of other tags." | |
| 318 if source.startswith('branches/'): | |
| 319 source = source[len('branches/'):] | |
| 320 elif source == 'trunk': | |
| 321 source = None | |
| 322 else: | |
| 323 source = '../' + source | |
| 324 if rev <= last_rev and (source or 'default') in repo.branchtags(): | |
| 325 tagsinfo[tag] = source, rev | |
| 326 | |
| 327 tagsinfofile = open(os.path.join(svnmetadir, 'tag_info'), 'w') | |
| 328 pickle.dump(tagsinfo, tagsinfofile) | |
| 329 tagsinfofile.close() | |
| 330 rebuildmeta = util.register_subcommand('rebuildmeta')(rebuildmeta) | |
| 331 rebuildmeta = util.command_needs_no_url(rebuildmeta) |
