annotate hgext/convert/subversion.py @ 25748:baea47cafe75

convert: add support for specifying multiple revs Previously convert could only take one '--rev'. This change allows the user to specify multiple --rev entries. For instance, this could allow converting multiple branches (but not all branches) at once from git. In this first patch, we disable support for this for all sources. Future patches will enable it for select sources (like git).
author Durham Goode <durham@fb.com>
date Wed, 08 Jul 2015 10:27:43 -0700
parents 328739ea70c3
children 56b2bcea2529
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4765
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents:
diff changeset
1 # Subversion 1.4/1.5 Python API backend
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents:
diff changeset
2 #
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents:
diff changeset
3 # Copyright(C) 2007 Daniel Holth et al
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents:
diff changeset
4
19787
87f07f70f227 convert: move import of xml.minidom.dom to its own line for check-code
Augie Fackler <raf@durin42.com>
parents: 19468
diff changeset
5 import os, re, sys, tempfile, urllib, urllib2
87f07f70f227 convert: move import of xml.minidom.dom to its own line for check-code
Augie Fackler <raf@durin42.com>
parents: 19468
diff changeset
6 import xml.dom.minidom
4946
e8f4e40f285a convert/subversion: work around memory leak in svn's python bindings
Bryan O'Sullivan <bos@serpentine.com>
parents: 4944
diff changeset
7 import cPickle as pickle
5513
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
8
13970
d13913355390 move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13690
diff changeset
9 from mercurial import strutil, scmutil, util, encoding
5513
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
10 from mercurial.i18n import _
4765
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents:
diff changeset
11
16511
ecd2fbe68b25 convert/svn: make svn sink work with svn 1.7
Patrick Mezard <patrick@mezard.eu>
parents: 16466
diff changeset
12 propertycache = util.propertycache
ecd2fbe68b25 convert/svn: make svn sink work with svn 1.7
Patrick Mezard <patrick@mezard.eu>
parents: 16466
diff changeset
13
4765
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents:
diff changeset
14 # Subversion stuff. Works best with very recent Python SVN bindings
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents:
diff changeset
15 # e.g. SVN 1.5 or backports. Thanks to the bzr folks for enhancing
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents:
diff changeset
16 # these bindings.
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents:
diff changeset
17
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents:
diff changeset
18 from cStringIO import StringIO
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents:
diff changeset
19
7447
4fd92687f331 convert: improve reporting of invalid svn bindings
Patrick Mezard <pmezard@gmail.com>
parents: 7446
diff changeset
20 from common import NoRepo, MissingTool, commit, encodeargs, decodeargs
4fd92687f331 convert: improve reporting of invalid svn bindings
Patrick Mezard <pmezard@gmail.com>
parents: 7446
diff changeset
21 from common import commandline, converter_source, converter_sink, mapfile
17974
337d728e644f convert: add config option to use the local time zone
Julian Cowley <julian@lava.net>
parents: 17537
diff changeset
22 from common import makedatetimestamp
4766
95cbb6b74790 convert: activate subversion engine
Brendan Cully <brendan@kublai.com>
parents: 4765
diff changeset
23
95cbb6b74790 convert: activate subversion engine
Brendan Cully <brendan@kublai.com>
parents: 4765
diff changeset
24 try:
95cbb6b74790 convert: activate subversion engine
Brendan Cully <brendan@kublai.com>
parents: 4765
diff changeset
25 from svn.core import SubversionException, Pool
5010
6b2d8caf87b2 convert svn: try to extract URL from source if it is a working directory
Brendan Cully <brendan@kublai.com>
parents: 5008
diff changeset
26 import svn
6b2d8caf87b2 convert svn: try to extract URL from source if it is a working directory
Brendan Cully <brendan@kublai.com>
parents: 5008
diff changeset
27 import svn.client
4766
95cbb6b74790 convert: activate subversion engine
Brendan Cully <brendan@kublai.com>
parents: 4765
diff changeset
28 import svn.core
95cbb6b74790 convert: activate subversion engine
Brendan Cully <brendan@kublai.com>
parents: 4765
diff changeset
29 import svn.ra
95cbb6b74790 convert: activate subversion engine
Brendan Cully <brendan@kublai.com>
parents: 4765
diff changeset
30 import svn.delta
95cbb6b74790 convert: activate subversion engine
Brendan Cully <brendan@kublai.com>
parents: 4765
diff changeset
31 import transport
8221
f35b933044cc convert: hide svn deprecation warnings
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 8219
diff changeset
32 import warnings
f35b933044cc convert: hide svn deprecation warnings
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 8219
diff changeset
33 warnings.filterwarnings('ignore',
f35b933044cc convert: hide svn deprecation warnings
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 8219
diff changeset
34 module='svn.core',
f35b933044cc convert: hide svn deprecation warnings
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 8219
diff changeset
35 category=DeprecationWarning)
f35b933044cc convert: hide svn deprecation warnings
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 8219
diff changeset
36
4766
95cbb6b74790 convert: activate subversion engine
Brendan Cully <brendan@kublai.com>
parents: 4765
diff changeset
37 except ImportError:
13480
69418d4525d1 convert/svn: abort operation when python bindings are not available
Azhagu Selvan SP <tamizhgeek@gmail.com>
parents: 13190
diff changeset
38 svn = None
4765
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents:
diff changeset
39
7381
b965605dfb2e convert: be even more tolerant when detecting svn tags
Patrick Mezard <pmezard@gmail.com>
parents: 7184
diff changeset
40 class SvnPathNotFound(Exception):
b965605dfb2e convert: be even more tolerant when detecting svn tags
Patrick Mezard <pmezard@gmail.com>
parents: 7184
diff changeset
41 pass
b965605dfb2e convert: be even more tolerant when detecting svn tags
Patrick Mezard <pmezard@gmail.com>
parents: 7184
diff changeset
42
13690
af331f557942 convert/svn: extract revsplit() in a function
Patrick Mezard <pmezard@gmail.com>
parents: 13653
diff changeset
43 def revsplit(rev):
20419
e61a8395c3c1 convert: make subversion revsplit more stable when meeting revisions without @
Mads Kiilerich <madski@unity3d.com>
parents: 20378
diff changeset
44 """Parse a revision string and return (uuid, path, revnum).
e61a8395c3c1 convert: make subversion revsplit more stable when meeting revisions without @
Mads Kiilerich <madski@unity3d.com>
parents: 20378
diff changeset
45 >>> revsplit('svn:a2147622-4a9f-4db4-a8d3-13562ff547b2'
e61a8395c3c1 convert: make subversion revsplit more stable when meeting revisions without @
Mads Kiilerich <madski@unity3d.com>
parents: 20378
diff changeset
46 ... '/proj%20B/mytrunk/mytrunk@1')
e61a8395c3c1 convert: make subversion revsplit more stable when meeting revisions without @
Mads Kiilerich <madski@unity3d.com>
parents: 20378
diff changeset
47 ('a2147622-4a9f-4db4-a8d3-13562ff547b2', '/proj%20B/mytrunk/mytrunk', 1)
e61a8395c3c1 convert: make subversion revsplit more stable when meeting revisions without @
Mads Kiilerich <madski@unity3d.com>
parents: 20378
diff changeset
48 >>> revsplit('svn:8af66a51-67f5-4354-b62c-98d67cc7be1d@1')
e61a8395c3c1 convert: make subversion revsplit more stable when meeting revisions without @
Mads Kiilerich <madski@unity3d.com>
parents: 20378
diff changeset
49 ('', '', 1)
e61a8395c3c1 convert: make subversion revsplit more stable when meeting revisions without @
Mads Kiilerich <madski@unity3d.com>
parents: 20378
diff changeset
50 >>> revsplit('@7')
e61a8395c3c1 convert: make subversion revsplit more stable when meeting revisions without @
Mads Kiilerich <madski@unity3d.com>
parents: 20378
diff changeset
51 ('', '', 7)
e61a8395c3c1 convert: make subversion revsplit more stable when meeting revisions without @
Mads Kiilerich <madski@unity3d.com>
parents: 20378
diff changeset
52 >>> revsplit('7')
e61a8395c3c1 convert: make subversion revsplit more stable when meeting revisions without @
Mads Kiilerich <madski@unity3d.com>
parents: 20378
diff changeset
53 ('', '', 0)
e61a8395c3c1 convert: make subversion revsplit more stable when meeting revisions without @
Mads Kiilerich <madski@unity3d.com>
parents: 20378
diff changeset
54 >>> revsplit('bad')
e61a8395c3c1 convert: make subversion revsplit more stable when meeting revisions without @
Mads Kiilerich <madski@unity3d.com>
parents: 20378
diff changeset
55 ('', '', 0)
e61a8395c3c1 convert: make subversion revsplit more stable when meeting revisions without @
Mads Kiilerich <madski@unity3d.com>
parents: 20378
diff changeset
56 """
e61a8395c3c1 convert: make subversion revsplit more stable when meeting revisions without @
Mads Kiilerich <madski@unity3d.com>
parents: 20378
diff changeset
57 parts = rev.rsplit('@', 1)
e61a8395c3c1 convert: make subversion revsplit more stable when meeting revisions without @
Mads Kiilerich <madski@unity3d.com>
parents: 20378
diff changeset
58 revnum = 0
e61a8395c3c1 convert: make subversion revsplit more stable when meeting revisions without @
Mads Kiilerich <madski@unity3d.com>
parents: 20378
diff changeset
59 if len(parts) > 1:
e61a8395c3c1 convert: make subversion revsplit more stable when meeting revisions without @
Mads Kiilerich <madski@unity3d.com>
parents: 20378
diff changeset
60 revnum = int(parts[1])
e61a8395c3c1 convert: make subversion revsplit more stable when meeting revisions without @
Mads Kiilerich <madski@unity3d.com>
parents: 20378
diff changeset
61 parts = parts[0].split('/', 1)
e61a8395c3c1 convert: make subversion revsplit more stable when meeting revisions without @
Mads Kiilerich <madski@unity3d.com>
parents: 20378
diff changeset
62 uuid = ''
13690
af331f557942 convert/svn: extract revsplit() in a function
Patrick Mezard <pmezard@gmail.com>
parents: 13653
diff changeset
63 mod = ''
20419
e61a8395c3c1 convert: make subversion revsplit more stable when meeting revisions without @
Mads Kiilerich <madski@unity3d.com>
parents: 20378
diff changeset
64 if len(parts) > 1 and parts[0].startswith('svn:'):
e61a8395c3c1 convert: make subversion revsplit more stable when meeting revisions without @
Mads Kiilerich <madski@unity3d.com>
parents: 20378
diff changeset
65 uuid = parts[0][4:]
13690
af331f557942 convert/svn: extract revsplit() in a function
Patrick Mezard <pmezard@gmail.com>
parents: 13653
diff changeset
66 mod = '/' + parts[1]
20419
e61a8395c3c1 convert: make subversion revsplit more stable when meeting revisions without @
Mads Kiilerich <madski@unity3d.com>
parents: 20378
diff changeset
67 return uuid, mod, revnum
13690
af331f557942 convert/svn: extract revsplit() in a function
Patrick Mezard <pmezard@gmail.com>
parents: 13653
diff changeset
68
15599
c6be93a4c378 convert/svn: fix URL quoting issue with svn 1.7
Patrick Mezard <pmezard@gmail.com>
parents: 15381
diff changeset
69 def quote(s):
c6be93a4c378 convert/svn: fix URL quoting issue with svn 1.7
Patrick Mezard <pmezard@gmail.com>
parents: 15381
diff changeset
70 # As of svn 1.7, many svn calls expect "canonical" paths. In
c6be93a4c378 convert/svn: fix URL quoting issue with svn 1.7
Patrick Mezard <pmezard@gmail.com>
parents: 15381
diff changeset
71 # theory, we should call svn.core.*canonicalize() on all paths
c6be93a4c378 convert/svn: fix URL quoting issue with svn 1.7
Patrick Mezard <pmezard@gmail.com>
parents: 15381
diff changeset
72 # before passing them to the API. Instead, we assume the base url
c6be93a4c378 convert/svn: fix URL quoting issue with svn 1.7
Patrick Mezard <pmezard@gmail.com>
parents: 15381
diff changeset
73 # is canonical and copy the behaviour of svn URL encoding function
c6be93a4c378 convert/svn: fix URL quoting issue with svn 1.7
Patrick Mezard <pmezard@gmail.com>
parents: 15381
diff changeset
74 # so we can extend it safely with new components. The "safe"
c6be93a4c378 convert/svn: fix URL quoting issue with svn 1.7
Patrick Mezard <pmezard@gmail.com>
parents: 15381
diff changeset
75 # characters were taken from the "svn_uri__char_validity" table in
c6be93a4c378 convert/svn: fix URL quoting issue with svn 1.7
Patrick Mezard <pmezard@gmail.com>
parents: 15381
diff changeset
76 # libsvn_subr/path.c.
c6be93a4c378 convert/svn: fix URL quoting issue with svn 1.7
Patrick Mezard <pmezard@gmail.com>
parents: 15381
diff changeset
77 return urllib.quote(s, "!$&'()*+,-./:=@_~")
c6be93a4c378 convert/svn: fix URL quoting issue with svn 1.7
Patrick Mezard <pmezard@gmail.com>
parents: 15381
diff changeset
78
5008
b6c3abdbe0eb convert: urlify svn repos if necessary.
Brendan Cully <brendan@kublai.com>
parents: 4960
diff changeset
79 def geturl(path):
5010
6b2d8caf87b2 convert svn: try to extract URL from source if it is a working directory
Brendan Cully <brendan@kublai.com>
parents: 5008
diff changeset
80 try:
5020
780051cca03c convert svn: canonicalize path before calling url_from_path.
Brendan Cully <brendan@kublai.com>
parents: 5010
diff changeset
81 return svn.client.url_from_path(svn.core.svn_path_canonicalize(path))
5010
6b2d8caf87b2 convert svn: try to extract URL from source if it is a working directory
Brendan Cully <brendan@kublai.com>
parents: 5008
diff changeset
82 except SubversionException:
15599
c6be93a4c378 convert/svn: fix URL quoting issue with svn 1.7
Patrick Mezard <pmezard@gmail.com>
parents: 15381
diff changeset
83 # svn.client.url_from_path() fails with local repositories
5010
6b2d8caf87b2 convert svn: try to extract URL from source if it is a working directory
Brendan Cully <brendan@kublai.com>
parents: 5008
diff changeset
84 pass
5008
b6c3abdbe0eb convert: urlify svn repos if necessary.
Brendan Cully <brendan@kublai.com>
parents: 4960
diff changeset
85 if os.path.isdir(path):
5793
68f5bf9aa582 convert: Accept local path on win32.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents: 5790
diff changeset
86 path = os.path.normpath(os.path.abspath(path))
68f5bf9aa582 convert: Accept local path on win32.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents: 5790
diff changeset
87 if os.name == 'nt':
5842
111ed8c871bf Use util.normpath() instead of direct path string operation.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents: 5841
diff changeset
88 path = '/' + util.normpath(path)
8886
0593c5b5b1f0 convert/svn: stop returning unicode revision identifiers
Patrick Mezard <pmezard@gmail.com>
parents: 8885
diff changeset
89 # Module URL is later compared with the repository URL returned
0593c5b5b1f0 convert/svn: stop returning unicode revision identifiers
Patrick Mezard <pmezard@gmail.com>
parents: 8885
diff changeset
90 # by svn API, which is UTF-8.
0593c5b5b1f0 convert/svn: stop returning unicode revision identifiers
Patrick Mezard <pmezard@gmail.com>
parents: 8885
diff changeset
91 path = encoding.tolocal(path)
15599
c6be93a4c378 convert/svn: fix URL quoting issue with svn 1.7
Patrick Mezard <pmezard@gmail.com>
parents: 15381
diff changeset
92 path = 'file://%s' % quote(path)
c6be93a4c378 convert/svn: fix URL quoting issue with svn 1.7
Patrick Mezard <pmezard@gmail.com>
parents: 15381
diff changeset
93 return svn.core.svn_path_canonicalize(path)
5008
b6c3abdbe0eb convert: urlify svn repos if necessary.
Brendan Cully <brendan@kublai.com>
parents: 4960
diff changeset
94
5117
c89ed1f27e78 convert: svn: add helper function for optrevs
Brendan Cully <brendan@kublai.com>
parents: 5114
diff changeset
95 def optrev(number):
c89ed1f27e78 convert: svn: add helper function for optrevs
Brendan Cully <brendan@kublai.com>
parents: 5114
diff changeset
96 optrev = svn.core.svn_opt_revision_t()
c89ed1f27e78 convert: svn: add helper function for optrevs
Brendan Cully <brendan@kublai.com>
parents: 5114
diff changeset
97 optrev.kind = svn.core.svn_opt_revision_number
c89ed1f27e78 convert: svn: add helper function for optrevs
Brendan Cully <brendan@kublai.com>
parents: 5114
diff changeset
98 optrev.value.number = number
c89ed1f27e78 convert: svn: add helper function for optrevs
Brendan Cully <brendan@kublai.com>
parents: 5114
diff changeset
99 return optrev
c89ed1f27e78 convert: svn: add helper function for optrevs
Brendan Cully <brendan@kublai.com>
parents: 5114
diff changeset
100
4946
e8f4e40f285a convert/subversion: work around memory leak in svn's python bindings
Bryan O'Sullivan <bos@serpentine.com>
parents: 4944
diff changeset
101 class changedpath(object):
e8f4e40f285a convert/subversion: work around memory leak in svn's python bindings
Bryan O'Sullivan <bos@serpentine.com>
parents: 4944
diff changeset
102 def __init__(self, p):
e8f4e40f285a convert/subversion: work around memory leak in svn's python bindings
Bryan O'Sullivan <bos@serpentine.com>
parents: 4944
diff changeset
103 self.copyfrom_path = p.copyfrom_path
e8f4e40f285a convert/subversion: work around memory leak in svn's python bindings
Bryan O'Sullivan <bos@serpentine.com>
parents: 4944
diff changeset
104 self.copyfrom_rev = p.copyfrom_rev
e8f4e40f285a convert/subversion: work around memory leak in svn's python bindings
Bryan O'Sullivan <bos@serpentine.com>
parents: 4944
diff changeset
105 self.action = p.action
e8f4e40f285a convert/subversion: work around memory leak in svn's python bindings
Bryan O'Sullivan <bos@serpentine.com>
parents: 4944
diff changeset
106
16683
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16514
diff changeset
107 def get_log_child(fp, url, paths, start, end, limit=0,
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16514
diff changeset
108 discover_changed_paths=True, strict_node_history=False):
5127
39b6eaee6fd7 convert: replace fork with subprocess call.
Patrick Mezard <pmezard@gmail.com>
parents: 5122
diff changeset
109 protocol = -1
39b6eaee6fd7 convert: replace fork with subprocess call.
Patrick Mezard <pmezard@gmail.com>
parents: 5122
diff changeset
110 def receiver(orig_paths, revnum, author, date, message, pool):
20057
d54467c1a198 convert: fix svn crash when svn.ra.get_log calls back with orig_paths=None
Mads Kiilerich <madski@unity3d.com>
parents: 19787
diff changeset
111 paths = {}
5127
39b6eaee6fd7 convert: replace fork with subprocess call.
Patrick Mezard <pmezard@gmail.com>
parents: 5122
diff changeset
112 if orig_paths is not None:
39b6eaee6fd7 convert: replace fork with subprocess call.
Patrick Mezard <pmezard@gmail.com>
parents: 5122
diff changeset
113 for k, v in orig_paths.iteritems():
20057
d54467c1a198 convert: fix svn crash when svn.ra.get_log calls back with orig_paths=None
Mads Kiilerich <madski@unity3d.com>
parents: 19787
diff changeset
114 paths[k] = changedpath(v)
d54467c1a198 convert: fix svn crash when svn.ra.get_log calls back with orig_paths=None
Mads Kiilerich <madski@unity3d.com>
parents: 19787
diff changeset
115 pickle.dump((paths, revnum, author, date, message),
5143
d4fa6bafc43a Remove trailing spaces, fix indentation
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5141
diff changeset
116 fp, protocol)
d4fa6bafc43a Remove trailing spaces, fix indentation
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5141
diff changeset
117
5127
39b6eaee6fd7 convert: replace fork with subprocess call.
Patrick Mezard <pmezard@gmail.com>
parents: 5122
diff changeset
118 try:
39b6eaee6fd7 convert: replace fork with subprocess call.
Patrick Mezard <pmezard@gmail.com>
parents: 5122
diff changeset
119 # Use an ra of our own so that our parent can consume
39b6eaee6fd7 convert: replace fork with subprocess call.
Patrick Mezard <pmezard@gmail.com>
parents: 5122
diff changeset
120 # our results without confusing the server.
39b6eaee6fd7 convert: replace fork with subprocess call.
Patrick Mezard <pmezard@gmail.com>
parents: 5122
diff changeset
121 t = transport.SvnRaTransport(url=url)
39b6eaee6fd7 convert: replace fork with subprocess call.
Patrick Mezard <pmezard@gmail.com>
parents: 5122
diff changeset
122 svn.ra.get_log(t.ra, paths, start, end, limit,
39b6eaee6fd7 convert: replace fork with subprocess call.
Patrick Mezard <pmezard@gmail.com>
parents: 5122
diff changeset
123 discover_changed_paths,
39b6eaee6fd7 convert: replace fork with subprocess call.
Patrick Mezard <pmezard@gmail.com>
parents: 5122
diff changeset
124 strict_node_history,
39b6eaee6fd7 convert: replace fork with subprocess call.
Patrick Mezard <pmezard@gmail.com>
parents: 5122
diff changeset
125 receiver)
5873
ecb4eb0cbff2 convert: make svn revision iterator interruptible
Patrick Mezard <pmezard@gmail.com>
parents: 5872
diff changeset
126 except IOError:
ecb4eb0cbff2 convert: make svn revision iterator interruptible
Patrick Mezard <pmezard@gmail.com>
parents: 5872
diff changeset
127 # Caller may interrupt the iteration
ecb4eb0cbff2 convert: make svn revision iterator interruptible
Patrick Mezard <pmezard@gmail.com>
parents: 5872
diff changeset
128 pickle.dump(None, fp, protocol)
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24856
diff changeset
129 except Exception as inst:
15750
03d04296cfab convert: improve exception reporting for SVN logstream
Matt Mackall <mpm@selenic.com>
parents: 15599
diff changeset
130 pickle.dump(str(inst), fp, protocol)
5127
39b6eaee6fd7 convert: replace fork with subprocess call.
Patrick Mezard <pmezard@gmail.com>
parents: 5122
diff changeset
131 else:
39b6eaee6fd7 convert: replace fork with subprocess call.
Patrick Mezard <pmezard@gmail.com>
parents: 5122
diff changeset
132 pickle.dump(None, fp, protocol)
39b6eaee6fd7 convert: replace fork with subprocess call.
Patrick Mezard <pmezard@gmail.com>
parents: 5122
diff changeset
133 fp.close()
6397
e1402cf5e08a convert: avoid svn log retrieval process cleanup
Patrick Mezard <pmezard@gmail.com>
parents: 6281
diff changeset
134 # With large history, cleanup process goes crazy and suddenly
e1402cf5e08a convert: avoid svn log retrieval process cleanup
Patrick Mezard <pmezard@gmail.com>
parents: 6281
diff changeset
135 # consumes *huge* amount of memory. The output file being closed,
e1402cf5e08a convert: avoid svn log retrieval process cleanup
Patrick Mezard <pmezard@gmail.com>
parents: 6281
diff changeset
136 # there is no need for clean termination.
e1402cf5e08a convert: avoid svn log retrieval process cleanup
Patrick Mezard <pmezard@gmail.com>
parents: 6281
diff changeset
137 os._exit(0)
5127
39b6eaee6fd7 convert: replace fork with subprocess call.
Patrick Mezard <pmezard@gmail.com>
parents: 5122
diff changeset
138
5139
18abf13064cb Move debugsvnlog to subversion module.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5138
diff changeset
139 def debugsvnlog(ui, **opts):
18abf13064cb Move debugsvnlog to subversion module.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5138
diff changeset
140 """Fetch SVN log in a subprocess and channel them back to parent to
18abf13064cb Move debugsvnlog to subversion module.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5138
diff changeset
141 avoid memory collection issues.
18abf13064cb Move debugsvnlog to subversion module.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5138
diff changeset
142 """
17053
0e4171fdb9d4 convert: check for failed svn import in debugsvnlog and abort cleanly
Mads Kiilerich <mads@kiilerich.com>
parents: 17052
diff changeset
143 if svn is None:
0e4171fdb9d4 convert: check for failed svn import in debugsvnlog and abort cleanly
Mads Kiilerich <mads@kiilerich.com>
parents: 17052
diff changeset
144 raise util.Abort(_('debugsvnlog could not load Subversion python '
0e4171fdb9d4 convert: check for failed svn import in debugsvnlog and abort cleanly
Mads Kiilerich <mads@kiilerich.com>
parents: 17052
diff changeset
145 'bindings'))
0e4171fdb9d4 convert: check for failed svn import in debugsvnlog and abort cleanly
Mads Kiilerich <mads@kiilerich.com>
parents: 17052
diff changeset
146
14233
659f34b833b9 rename util.set_binary to setbinary
Adrian Buehlmann <adrian@cadifra.com>
parents: 14232
diff changeset
147 util.setbinary(sys.stdin)
659f34b833b9 rename util.set_binary to setbinary
Adrian Buehlmann <adrian@cadifra.com>
parents: 14232
diff changeset
148 util.setbinary(sys.stdout)
5139
18abf13064cb Move debugsvnlog to subversion module.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5138
diff changeset
149 args = decodeargs(sys.stdin.read())
18abf13064cb Move debugsvnlog to subversion module.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5138
diff changeset
150 get_log_child(sys.stdout, *args)
18abf13064cb Move debugsvnlog to subversion module.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5138
diff changeset
151
8778
c5f36402daad use new style classes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8764
diff changeset
152 class logstream(object):
5873
ecb4eb0cbff2 convert: make svn revision iterator interruptible
Patrick Mezard <pmezard@gmail.com>
parents: 5872
diff changeset
153 """Interruptible revision log iterator."""
ecb4eb0cbff2 convert: make svn revision iterator interruptible
Patrick Mezard <pmezard@gmail.com>
parents: 5872
diff changeset
154 def __init__(self, stdout):
ecb4eb0cbff2 convert: make svn revision iterator interruptible
Patrick Mezard <pmezard@gmail.com>
parents: 5872
diff changeset
155 self._stdout = stdout
ecb4eb0cbff2 convert: make svn revision iterator interruptible
Patrick Mezard <pmezard@gmail.com>
parents: 5872
diff changeset
156
ecb4eb0cbff2 convert: make svn revision iterator interruptible
Patrick Mezard <pmezard@gmail.com>
parents: 5872
diff changeset
157 def __iter__(self):
ecb4eb0cbff2 convert: make svn revision iterator interruptible
Patrick Mezard <pmezard@gmail.com>
parents: 5872
diff changeset
158 while True:
9587
d80a251baf9a convert/svn: better error when hg cannot call itself (issue1838)
Patrick Mezard <pmezard@gmail.com>
parents: 9521
diff changeset
159 try:
d80a251baf9a convert/svn: better error when hg cannot call itself (issue1838)
Patrick Mezard <pmezard@gmail.com>
parents: 9521
diff changeset
160 entry = pickle.load(self._stdout)
d80a251baf9a convert/svn: better error when hg cannot call itself (issue1838)
Patrick Mezard <pmezard@gmail.com>
parents: 9521
diff changeset
161 except EOFError:
d80a251baf9a convert/svn: better error when hg cannot call itself (issue1838)
Patrick Mezard <pmezard@gmail.com>
parents: 9521
diff changeset
162 raise util.Abort(_('Mercurial failed to run itself, check'
d80a251baf9a convert/svn: better error when hg cannot call itself (issue1838)
Patrick Mezard <pmezard@gmail.com>
parents: 9521
diff changeset
163 ' hg executable is in PATH'))
5873
ecb4eb0cbff2 convert: make svn revision iterator interruptible
Patrick Mezard <pmezard@gmail.com>
parents: 5872
diff changeset
164 try:
ecb4eb0cbff2 convert: make svn revision iterator interruptible
Patrick Mezard <pmezard@gmail.com>
parents: 5872
diff changeset
165 orig_paths, revnum, author, date, message = entry
16688
cfb6682961b8 cleanup: replace naked excepts with more specific ones
Brodie Rao <brodie@sf.io>
parents: 16687
diff changeset
166 except (TypeError, ValueError):
5873
ecb4eb0cbff2 convert: make svn revision iterator interruptible
Patrick Mezard <pmezard@gmail.com>
parents: 5872
diff changeset
167 if entry is None:
ecb4eb0cbff2 convert: make svn revision iterator interruptible
Patrick Mezard <pmezard@gmail.com>
parents: 5872
diff changeset
168 break
15750
03d04296cfab convert: improve exception reporting for SVN logstream
Matt Mackall <mpm@selenic.com>
parents: 15599
diff changeset
169 raise util.Abort(_("log stream exception '%s'") % entry)
5873
ecb4eb0cbff2 convert: make svn revision iterator interruptible
Patrick Mezard <pmezard@gmail.com>
parents: 5872
diff changeset
170 yield entry
ecb4eb0cbff2 convert: make svn revision iterator interruptible
Patrick Mezard <pmezard@gmail.com>
parents: 5872
diff changeset
171
ecb4eb0cbff2 convert: make svn revision iterator interruptible
Patrick Mezard <pmezard@gmail.com>
parents: 5872
diff changeset
172 def close(self):
ecb4eb0cbff2 convert: make svn revision iterator interruptible
Patrick Mezard <pmezard@gmail.com>
parents: 5872
diff changeset
173 if self._stdout:
ecb4eb0cbff2 convert: make svn revision iterator interruptible
Patrick Mezard <pmezard@gmail.com>
parents: 5872
diff changeset
174 self._stdout.close()
ecb4eb0cbff2 convert: make svn revision iterator interruptible
Patrick Mezard <pmezard@gmail.com>
parents: 5872
diff changeset
175 self._stdout = None
ecb4eb0cbff2 convert: make svn revision iterator interruptible
Patrick Mezard <pmezard@gmail.com>
parents: 5872
diff changeset
176
20420
62153c5d1ce2 convert: secret config option for disabling debugsvnlog
Mads Kiilerich <madski@unity3d.com>
parents: 20419
diff changeset
177 class directlogstream(list):
62153c5d1ce2 convert: secret config option for disabling debugsvnlog
Mads Kiilerich <madski@unity3d.com>
parents: 20419
diff changeset
178 """Direct revision log iterator.
62153c5d1ce2 convert: secret config option for disabling debugsvnlog
Mads Kiilerich <madski@unity3d.com>
parents: 20419
diff changeset
179 This can be used for debugging and development but it will probably leak
62153c5d1ce2 convert: secret config option for disabling debugsvnlog
Mads Kiilerich <madski@unity3d.com>
parents: 20419
diff changeset
180 memory and is not suitable for real conversions."""
62153c5d1ce2 convert: secret config option for disabling debugsvnlog
Mads Kiilerich <madski@unity3d.com>
parents: 20419
diff changeset
181 def __init__(self, url, paths, start, end, limit=0,
62153c5d1ce2 convert: secret config option for disabling debugsvnlog
Mads Kiilerich <madski@unity3d.com>
parents: 20419
diff changeset
182 discover_changed_paths=True, strict_node_history=False):
62153c5d1ce2 convert: secret config option for disabling debugsvnlog
Mads Kiilerich <madski@unity3d.com>
parents: 20419
diff changeset
183
62153c5d1ce2 convert: secret config option for disabling debugsvnlog
Mads Kiilerich <madski@unity3d.com>
parents: 20419
diff changeset
184 def receiver(orig_paths, revnum, author, date, message, pool):
62153c5d1ce2 convert: secret config option for disabling debugsvnlog
Mads Kiilerich <madski@unity3d.com>
parents: 20419
diff changeset
185 paths = {}
62153c5d1ce2 convert: secret config option for disabling debugsvnlog
Mads Kiilerich <madski@unity3d.com>
parents: 20419
diff changeset
186 if orig_paths is not None:
62153c5d1ce2 convert: secret config option for disabling debugsvnlog
Mads Kiilerich <madski@unity3d.com>
parents: 20419
diff changeset
187 for k, v in orig_paths.iteritems():
62153c5d1ce2 convert: secret config option for disabling debugsvnlog
Mads Kiilerich <madski@unity3d.com>
parents: 20419
diff changeset
188 paths[k] = changedpath(v)
62153c5d1ce2 convert: secret config option for disabling debugsvnlog
Mads Kiilerich <madski@unity3d.com>
parents: 20419
diff changeset
189 self.append((paths, revnum, author, date, message))
62153c5d1ce2 convert: secret config option for disabling debugsvnlog
Mads Kiilerich <madski@unity3d.com>
parents: 20419
diff changeset
190
62153c5d1ce2 convert: secret config option for disabling debugsvnlog
Mads Kiilerich <madski@unity3d.com>
parents: 20419
diff changeset
191 # Use an ra of our own so that our parent can consume
62153c5d1ce2 convert: secret config option for disabling debugsvnlog
Mads Kiilerich <madski@unity3d.com>
parents: 20419
diff changeset
192 # our results without confusing the server.
62153c5d1ce2 convert: secret config option for disabling debugsvnlog
Mads Kiilerich <madski@unity3d.com>
parents: 20419
diff changeset
193 t = transport.SvnRaTransport(url=url)
62153c5d1ce2 convert: secret config option for disabling debugsvnlog
Mads Kiilerich <madski@unity3d.com>
parents: 20419
diff changeset
194 svn.ra.get_log(t.ra, paths, start, end, limit,
62153c5d1ce2 convert: secret config option for disabling debugsvnlog
Mads Kiilerich <madski@unity3d.com>
parents: 20419
diff changeset
195 discover_changed_paths,
62153c5d1ce2 convert: secret config option for disabling debugsvnlog
Mads Kiilerich <madski@unity3d.com>
parents: 20419
diff changeset
196 strict_node_history,
62153c5d1ce2 convert: secret config option for disabling debugsvnlog
Mads Kiilerich <madski@unity3d.com>
parents: 20419
diff changeset
197 receiver)
62153c5d1ce2 convert: secret config option for disabling debugsvnlog
Mads Kiilerich <madski@unity3d.com>
parents: 20419
diff changeset
198
62153c5d1ce2 convert: secret config option for disabling debugsvnlog
Mads Kiilerich <madski@unity3d.com>
parents: 20419
diff changeset
199 def close(self):
62153c5d1ce2 convert: secret config option for disabling debugsvnlog
Mads Kiilerich <madski@unity3d.com>
parents: 20419
diff changeset
200 pass
8074
fc78313cba53 convert: Improved svn source detection.
Augie Fackler <durin42@gmail.com>
parents: 7973
diff changeset
201
fc78313cba53 convert: Improved svn source detection.
Augie Fackler <durin42@gmail.com>
parents: 7973
diff changeset
202 # Check to see if the given path is a local Subversion repo. Verify this by
fc78313cba53 convert: Improved svn source detection.
Augie Fackler <durin42@gmail.com>
parents: 7973
diff changeset
203 # looking for several svn-specific files and directories in the given
fc78313cba53 convert: Improved svn source detection.
Augie Fackler <durin42@gmail.com>
parents: 7973
diff changeset
204 # directory.
9829
1b2516a547d4 convert/svn: delegate to svn bindings if HTTP probe fails
Patrick Mezard <pmezard@gmail.com>
parents: 9819
diff changeset
205 def filecheck(ui, path, proto):
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10071
diff changeset
206 for x in ('locks', 'hooks', 'format', 'db'):
8074
fc78313cba53 convert: Improved svn source detection.
Augie Fackler <durin42@gmail.com>
parents: 7973
diff changeset
207 if not os.path.exists(os.path.join(path, x)):
fc78313cba53 convert: Improved svn source detection.
Augie Fackler <durin42@gmail.com>
parents: 7973
diff changeset
208 return False
fc78313cba53 convert: Improved svn source detection.
Augie Fackler <durin42@gmail.com>
parents: 7973
diff changeset
209 return True
fc78313cba53 convert: Improved svn source detection.
Augie Fackler <durin42@gmail.com>
parents: 7973
diff changeset
210
fc78313cba53 convert: Improved svn source detection.
Augie Fackler <durin42@gmail.com>
parents: 7973
diff changeset
211 # Check to see if a given path is the root of an svn repo over http. We verify
fc78313cba53 convert: Improved svn source detection.
Augie Fackler <durin42@gmail.com>
parents: 7973
diff changeset
212 # this by requesting a version-controlled URL we know can't exist and looking
fc78313cba53 convert: Improved svn source detection.
Augie Fackler <durin42@gmail.com>
parents: 7973
diff changeset
213 # for the svn-specific "not found" XML.
9829
1b2516a547d4 convert/svn: delegate to svn bindings if HTTP probe fails
Patrick Mezard <pmezard@gmail.com>
parents: 9819
diff changeset
214 def httpcheck(ui, path, proto):
1b2516a547d4 convert/svn: delegate to svn bindings if HTTP probe fails
Patrick Mezard <pmezard@gmail.com>
parents: 9819
diff changeset
215 try:
1b2516a547d4 convert/svn: delegate to svn bindings if HTTP probe fails
Patrick Mezard <pmezard@gmail.com>
parents: 9819
diff changeset
216 opener = urllib2.build_opener()
1b2516a547d4 convert/svn: delegate to svn bindings if HTTP probe fails
Patrick Mezard <pmezard@gmail.com>
parents: 9819
diff changeset
217 rsp = opener.open('%s://%s/!svn/ver/0/.svn' % (proto, path))
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10071
diff changeset
218 data = rsp.read()
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24856
diff changeset
219 except urllib2.HTTPError as inst:
9838
2e51cc30fc30 convert/svn: fix HTTP detection bug introduced by 1b2516a547d4
Patrick Mezard <pmezard@gmail.com>
parents: 9829
diff changeset
220 if inst.code != 404:
2e51cc30fc30 convert/svn: fix HTTP detection bug introduced by 1b2516a547d4
Patrick Mezard <pmezard@gmail.com>
parents: 9829
diff changeset
221 # Except for 404 we cannot know for sure this is not an svn repo
9860
9c43089b372a convert/svn: fix warning when repo detection failed
Patrick Mezard <pmezard@gmail.com>
parents: 9838
diff changeset
222 ui.warn(_('svn: cannot probe remote repository, assume it could '
9c43089b372a convert/svn: fix warning when repo detection failed
Patrick Mezard <pmezard@gmail.com>
parents: 9838
diff changeset
223 'be a subversion repository. Use --source-type if you '
9c43089b372a convert/svn: fix warning when repo detection failed
Patrick Mezard <pmezard@gmail.com>
parents: 9838
diff changeset
224 'know better.\n'))
9838
2e51cc30fc30 convert/svn: fix HTTP detection bug introduced by 1b2516a547d4
Patrick Mezard <pmezard@gmail.com>
parents: 9829
diff changeset
225 return True
2e51cc30fc30 convert/svn: fix HTTP detection bug introduced by 1b2516a547d4
Patrick Mezard <pmezard@gmail.com>
parents: 9829
diff changeset
226 data = inst.fp.read()
16689
f366d4c2ff34 cleanup: replace naked excepts with except Exception: ...
Brodie Rao <brodie@sf.io>
parents: 16688
diff changeset
227 except Exception:
9829
1b2516a547d4 convert/svn: delegate to svn bindings if HTTP probe fails
Patrick Mezard <pmezard@gmail.com>
parents: 9819
diff changeset
228 # Could be urllib2.URLError if the URL is invalid or anything else.
1b2516a547d4 convert/svn: delegate to svn bindings if HTTP probe fails
Patrick Mezard <pmezard@gmail.com>
parents: 9819
diff changeset
229 return False
9838
2e51cc30fc30 convert/svn: fix HTTP detection bug introduced by 1b2516a547d4
Patrick Mezard <pmezard@gmail.com>
parents: 9829
diff changeset
230 return '<m:human-readable errcode="160013">' in data
8074
fc78313cba53 convert: Improved svn source detection.
Augie Fackler <durin42@gmail.com>
parents: 7973
diff changeset
231
fc78313cba53 convert: Improved svn source detection.
Augie Fackler <durin42@gmail.com>
parents: 7973
diff changeset
232 protomap = {'http': httpcheck,
fc78313cba53 convert: Improved svn source detection.
Augie Fackler <durin42@gmail.com>
parents: 7973
diff changeset
233 'https': httpcheck,
fc78313cba53 convert: Improved svn source detection.
Augie Fackler <durin42@gmail.com>
parents: 7973
diff changeset
234 'file': filecheck,
fc78313cba53 convert: Improved svn source detection.
Augie Fackler <durin42@gmail.com>
parents: 7973
diff changeset
235 }
9829
1b2516a547d4 convert/svn: delegate to svn bindings if HTTP probe fails
Patrick Mezard <pmezard@gmail.com>
parents: 9819
diff changeset
236 def issvnurl(ui, url):
8764
46b5b4301fcc convert: default to file protocol when no :// found for svn repo url
Edouard Gomez <ed.gomez@free.fr>
parents: 8693
diff changeset
237 try:
46b5b4301fcc convert: default to file protocol when no :// found for svn repo url
Edouard Gomez <ed.gomez@free.fr>
parents: 8693
diff changeset
238 proto, path = url.split('://', 1)
9521
e3ce0c30798b Fix issue 1782 don't do url2pathname conversion for urls
Grauw <laurens.hg@grauw.nl>
parents: 9168
diff changeset
239 if proto == 'file':
17052
1bd18c415eec convert: accept Subversion 'file:///c%3A/svnrepo' syntax on Windows
Mads Kiilerich <mads@kiilerich.com>
parents: 17031
diff changeset
240 if (os.name == 'nt' and path[:1] == '/' and path[1:2].isalpha()
1bd18c415eec convert: accept Subversion 'file:///c%3A/svnrepo' syntax on Windows
Mads Kiilerich <mads@kiilerich.com>
parents: 17031
diff changeset
241 and path[2:6].lower() == '%3a/'):
1bd18c415eec convert: accept Subversion 'file:///c%3A/svnrepo' syntax on Windows
Mads Kiilerich <mads@kiilerich.com>
parents: 17031
diff changeset
242 path = path[:2] + ':/' + path[6:]
9521
e3ce0c30798b Fix issue 1782 don't do url2pathname conversion for urls
Grauw <laurens.hg@grauw.nl>
parents: 9168
diff changeset
243 path = urllib.url2pathname(path)
8764
46b5b4301fcc convert: default to file protocol when no :// found for svn repo url
Edouard Gomez <ed.gomez@free.fr>
parents: 8693
diff changeset
244 except ValueError:
46b5b4301fcc convert: default to file protocol when no :// found for svn repo url
Edouard Gomez <ed.gomez@free.fr>
parents: 8693
diff changeset
245 proto = 'file'
46b5b4301fcc convert: default to file protocol when no :// found for svn repo url
Edouard Gomez <ed.gomez@free.fr>
parents: 8693
diff changeset
246 path = os.path.abspath(url)
9521
e3ce0c30798b Fix issue 1782 don't do url2pathname conversion for urls
Grauw <laurens.hg@grauw.nl>
parents: 9168
diff changeset
247 if proto == 'file':
16067
467a85ced564 i18n: use util.pconvert() instead of 'str.replace()' for problematic encoding
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15970
diff changeset
248 path = util.pconvert(path)
10885
9e4d120e3c32 convert/subversion: fix default URL checker prototype
Patrick Mezard <pmezard@gmail.com>
parents: 10618
diff changeset
249 check = protomap.get(proto, lambda *args: False)
8074
fc78313cba53 convert: Improved svn source detection.
Augie Fackler <durin42@gmail.com>
parents: 7973
diff changeset
250 while '/' in path:
9829
1b2516a547d4 convert/svn: delegate to svn bindings if HTTP probe fails
Patrick Mezard <pmezard@gmail.com>
parents: 9819
diff changeset
251 if check(ui, path, proto):
8074
fc78313cba53 convert: Improved svn source detection.
Augie Fackler <durin42@gmail.com>
parents: 7973
diff changeset
252 return True
fc78313cba53 convert: Improved svn source detection.
Augie Fackler <durin42@gmail.com>
parents: 7973
diff changeset
253 path = path.rsplit('/', 1)[0]
fc78313cba53 convert: Improved svn source detection.
Augie Fackler <durin42@gmail.com>
parents: 7973
diff changeset
254 return False
fc78313cba53 convert: Improved svn source detection.
Augie Fackler <durin42@gmail.com>
parents: 7973
diff changeset
255
4765
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents:
diff changeset
256 # SVN conversion code stolen from bzr-svn and tailor
5876
fb93c774dfff convert: document the subversion conversion model
Patrick Mezard <pmezard@gmail.com>
parents: 5875
diff changeset
257 #
fb93c774dfff convert: document the subversion conversion model
Patrick Mezard <pmezard@gmail.com>
parents: 5875
diff changeset
258 # Subversion looks like a versioned filesystem, branches structures
fb93c774dfff convert: document the subversion conversion model
Patrick Mezard <pmezard@gmail.com>
parents: 5875
diff changeset
259 # are defined by conventions and not enforced by the tool. First,
fb93c774dfff convert: document the subversion conversion model
Patrick Mezard <pmezard@gmail.com>
parents: 5875
diff changeset
260 # we define the potential branches (modules) as "trunk" and "branches"
fb93c774dfff convert: document the subversion conversion model
Patrick Mezard <pmezard@gmail.com>
parents: 5875
diff changeset
261 # children directories. Revisions are then identified by their
fb93c774dfff convert: document the subversion conversion model
Patrick Mezard <pmezard@gmail.com>
parents: 5875
diff changeset
262 # module and revision number (and a repository identifier).
fb93c774dfff convert: document the subversion conversion model
Patrick Mezard <pmezard@gmail.com>
parents: 5875
diff changeset
263 #
fb93c774dfff convert: document the subversion conversion model
Patrick Mezard <pmezard@gmail.com>
parents: 5875
diff changeset
264 # The revision graph is really a tree (or a forest). By default, a
fb93c774dfff convert: document the subversion conversion model
Patrick Mezard <pmezard@gmail.com>
parents: 5875
diff changeset
265 # revision parent is the previous revision in the same module. If the
fb93c774dfff convert: document the subversion conversion model
Patrick Mezard <pmezard@gmail.com>
parents: 5875
diff changeset
266 # module directory is copied/moved from another module then the
fb93c774dfff convert: document the subversion conversion model
Patrick Mezard <pmezard@gmail.com>
parents: 5875
diff changeset
267 # revision is the module root and its parent the source revision in
fb93c774dfff convert: document the subversion conversion model
Patrick Mezard <pmezard@gmail.com>
parents: 5875
diff changeset
268 # the parent module. A revision has at most one parent.
fb93c774dfff convert: document the subversion conversion model
Patrick Mezard <pmezard@gmail.com>
parents: 5875
diff changeset
269 #
5438
6fa5258be3d4 convert: rename convert_svn to svn_source
Bryan O'Sullivan <bos@serpentine.com>
parents: 5437
diff changeset
270 class svn_source(converter_source):
25748
baea47cafe75 convert: add support for specifying multiple revs
Durham Goode <durham@fb.com>
parents: 25660
diff changeset
271 def __init__(self, ui, url, revs=None):
baea47cafe75 convert: add support for specifying multiple revs
Durham Goode <durham@fb.com>
parents: 25660
diff changeset
272 super(svn_source, self).__init__(ui, url, revs=revs)
4807
15a3cbfc6568 convert: call superclass init from engine init functions
Brendan Cully <brendan@kublai.com>
parents: 4799
diff changeset
273
7973
db3a68fd9387 convert: attempt to check repo type before checking for tool
Matt Mackall <mpm@selenic.com>
parents: 7875
diff changeset
274 if not (url.startswith('svn://') or url.startswith('svn+ssh://') or
db3a68fd9387 convert: attempt to check repo type before checking for tool
Matt Mackall <mpm@selenic.com>
parents: 7875
diff changeset
275 (os.path.exists(url) and
db3a68fd9387 convert: attempt to check repo type before checking for tool
Matt Mackall <mpm@selenic.com>
parents: 7875
diff changeset
276 os.path.exists(os.path.join(url, '.svn'))) or
9829
1b2516a547d4 convert/svn: delegate to svn bindings if HTTP probe fails
Patrick Mezard <pmezard@gmail.com>
parents: 9819
diff changeset
277 issvnurl(ui, url)):
10939
9f6731b03906 convert: mark strings for translation
Martin Geisler <mg@lazybytes.net>
parents: 10938
diff changeset
278 raise NoRepo(_("%s does not look like a Subversion repository")
9f6731b03906 convert: mark strings for translation
Martin Geisler <mg@lazybytes.net>
parents: 10938
diff changeset
279 % url)
13480
69418d4525d1 convert/svn: abort operation when python bindings are not available
Azhagu Selvan SP <tamizhgeek@gmail.com>
parents: 13190
diff changeset
280 if svn is None:
16925
eaf6a6d7f015 convert: lowercase status and abort messages
Martin Geisler <mg@aragost.com>
parents: 16689
diff changeset
281 raise MissingTool(_('could not load Subversion python bindings'))
7447
4fd92687f331 convert: improve reporting of invalid svn bindings
Patrick Mezard <pmezard@gmail.com>
parents: 7446
diff changeset
282
4fd92687f331 convert: improve reporting of invalid svn bindings
Patrick Mezard <pmezard@gmail.com>
parents: 7446
diff changeset
283 try:
4fd92687f331 convert: improve reporting of invalid svn bindings
Patrick Mezard <pmezard@gmail.com>
parents: 7446
diff changeset
284 version = svn.core.SVN_VER_MAJOR, svn.core.SVN_VER_MINOR
4fd92687f331 convert: improve reporting of invalid svn bindings
Patrick Mezard <pmezard@gmail.com>
parents: 7446
diff changeset
285 if version < (1, 4):
4fd92687f331 convert: improve reporting of invalid svn bindings
Patrick Mezard <pmezard@gmail.com>
parents: 7446
diff changeset
286 raise MissingTool(_('Subversion python bindings %d.%d found, '
4fd92687f331 convert: improve reporting of invalid svn bindings
Patrick Mezard <pmezard@gmail.com>
parents: 7446
diff changeset
287 '1.4 or later required') % version)
4fd92687f331 convert: improve reporting of invalid svn bindings
Patrick Mezard <pmezard@gmail.com>
parents: 7446
diff changeset
288 except AttributeError:
4fd92687f331 convert: improve reporting of invalid svn bindings
Patrick Mezard <pmezard@gmail.com>
parents: 7446
diff changeset
289 raise MissingTool(_('Subversion python bindings are too old, 1.4 '
4fd92687f331 convert: improve reporting of invalid svn bindings
Patrick Mezard <pmezard@gmail.com>
parents: 7446
diff changeset
290 'or later required'))
4766
95cbb6b74790 convert: activate subversion engine
Brendan Cully <brendan@kublai.com>
parents: 4765
diff changeset
291
4813
1fcdf2fe3d7c convert: svn: use revmap to parse only new revisions in incremental conversions
Brendan Cully <brendan@kublai.com>
parents: 4811
diff changeset
292 self.lastrevs = {}
1fcdf2fe3d7c convert: svn: use revmap to parse only new revisions in incremental conversions
Brendan Cully <brendan@kublai.com>
parents: 4811
diff changeset
293
4766
95cbb6b74790 convert: activate subversion engine
Brendan Cully <brendan@kublai.com>
parents: 4765
diff changeset
294 latest = None
4765
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents:
diff changeset
295 try:
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents:
diff changeset
296 # Support file://path@rev syntax. Useful e.g. to convert
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents:
diff changeset
297 # deleted branches.
4927
5e89b0dafce5 convert/subversion.py: str.rsplit is not available in Python 2.3
Bryan O'Sullivan <bos@serpentine.com>
parents: 4925
diff changeset
298 at = url.rfind('@')
5e89b0dafce5 convert/subversion.py: str.rsplit is not available in Python 2.3
Bryan O'Sullivan <bos@serpentine.com>
parents: 4925
diff changeset
299 if at >= 0:
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10071
diff changeset
300 latest = int(url[at + 1:])
4927
5e89b0dafce5 convert/subversion.py: str.rsplit is not available in Python 2.3
Bryan O'Sullivan <bos@serpentine.com>
parents: 4925
diff changeset
301 url = url[:at]
7874
d812029cda85 cleanup: drop variables for unused return values
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7857
diff changeset
302 except ValueError:
4766
95cbb6b74790 convert: activate subversion engine
Brendan Cully <brendan@kublai.com>
parents: 4765
diff changeset
303 pass
5008
b6c3abdbe0eb convert: urlify svn repos if necessary.
Brendan Cully <brendan@kublai.com>
parents: 4960
diff changeset
304 self.url = geturl(url)
4765
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents:
diff changeset
305 self.encoding = 'UTF-8' # Subversion is always nominal UTF-8
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents:
diff changeset
306 try:
5008
b6c3abdbe0eb convert: urlify svn repos if necessary.
Brendan Cully <brendan@kublai.com>
parents: 4960
diff changeset
307 self.transport = transport.SvnRaTransport(url=self.url)
4765
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents:
diff changeset
308 self.ra = self.transport.ra
4946
e8f4e40f285a convert/subversion: work around memory leak in svn's python bindings
Bryan O'Sullivan <bos@serpentine.com>
parents: 4944
diff changeset
309 self.ctx = self.transport.client
7074
b1a4f67b98d0 convert: properly encode subversion URLs (issue 1224)
Patrick Mezard <pmezard@gmail.com>
parents: 6877
diff changeset
310 self.baseurl = svn.ra.get_repos_root(self.ra)
6538
05dff77bfbd9 convert: fix subpaths detection in svn source
Patrick Mezard <pmezard@gmail.com>
parents: 6493
diff changeset
311 # Module is either empty or a repository path starting with
05dff77bfbd9 convert: fix subpaths detection in svn source
Patrick Mezard <pmezard@gmail.com>
parents: 6493
diff changeset
312 # a slash and not ending with a slash.
7074
b1a4f67b98d0 convert: properly encode subversion URLs (issue 1224)
Patrick Mezard <pmezard@gmail.com>
parents: 6877
diff changeset
313 self.module = urllib.unquote(self.url[len(self.baseurl):])
6847
9d6d1fdb7d72 convert: restore previous svn transport parent correctly
Patrick Mezard <pmezard@gmail.com>
parents: 6553
diff changeset
314 self.prevmodule = None
5957
971a17af5982 convert: prevent svn branches to leave the root module tree
Patrick Mezard <pmezard@gmail.com>
parents: 5956
diff changeset
315 self.rootmodule = self.module
4765
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents:
diff changeset
316 self.commits = {}
5121
ef338e34a906 convert: look up copies in getchanges instead of getcommit
Brendan Cully <brendan@kublai.com>
parents: 5120
diff changeset
317 self.paths = {}
8886
0593c5b5b1f0 convert/svn: stop returning unicode revision identifiers
Patrick Mezard <pmezard@gmail.com>
parents: 8885
diff changeset
318 self.uuid = svn.ra.get_uuid(self.ra)
7875
553aa0cbeab6 cleanup: drop unused assignments
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7874
diff changeset
319 except SubversionException:
8206
cce63ef1045b ui: print_exc() -> traceback()
Matt Mackall <mpm@selenic.com>
parents: 8172
diff changeset
320 ui.traceback()
23583
a8edcb9c1199 convert: on svn failure, note libsvn version (issue4043)
Augie Fackler <raf@durin42.com>
parents: 22414
diff changeset
321 svnversion = '%d.%d.%d' % (svn.core.SVN_VER_MAJOR,
a8edcb9c1199 convert: on svn failure, note libsvn version (issue4043)
Augie Fackler <raf@durin42.com>
parents: 22414
diff changeset
322 svn.core.SVN_VER_MINOR,
a8edcb9c1199 convert: on svn failure, note libsvn version (issue4043)
Augie Fackler <raf@durin42.com>
parents: 22414
diff changeset
323 svn.core.SVN_VER_MICRO)
a8edcb9c1199 convert: on svn failure, note libsvn version (issue4043)
Augie Fackler <raf@durin42.com>
parents: 22414
diff changeset
324 raise NoRepo(_("%s does not look like a Subversion repository "
a8edcb9c1199 convert: on svn failure, note libsvn version (issue4043)
Augie Fackler <raf@durin42.com>
parents: 22414
diff changeset
325 "to libsvn version %s")
a8edcb9c1199 convert: on svn failure, note libsvn version (issue4043)
Augie Fackler <raf@durin42.com>
parents: 22414
diff changeset
326 % (self.url, svnversion))
4765
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents:
diff changeset
327
25748
baea47cafe75 convert: add support for specifying multiple revs
Durham Goode <durham@fb.com>
parents: 25660
diff changeset
328 if revs:
baea47cafe75 convert: add support for specifying multiple revs
Durham Goode <durham@fb.com>
parents: 25660
diff changeset
329 if len(revs) > 1:
baea47cafe75 convert: add support for specifying multiple revs
Durham Goode <durham@fb.com>
parents: 25660
diff changeset
330 raise util.Abort(_('subversion source does not support '
baea47cafe75 convert: add support for specifying multiple revs
Durham Goode <durham@fb.com>
parents: 25660
diff changeset
331 'specifying multiple revisions'))
5145
0751c25ea0c0 raise util.Abort again if specified revision is not an integer.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5144
diff changeset
332 try:
25748
baea47cafe75 convert: add support for specifying multiple revs
Durham Goode <durham@fb.com>
parents: 25660
diff changeset
333 latest = int(revs[0])
5145
0751c25ea0c0 raise util.Abort again if specified revision is not an integer.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5144
diff changeset
334 except ValueError:
25748
baea47cafe75 convert: add support for specifying multiple revs
Durham Goode <durham@fb.com>
parents: 25660
diff changeset
335 raise util.Abort(_('svn: revision %s is not an integer') %
baea47cafe75 convert: add support for specifying multiple revs
Durham Goode <durham@fb.com>
parents: 25660
diff changeset
336 revs[0])
5145
0751c25ea0c0 raise util.Abort again if specified revision is not an integer.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5144
diff changeset
337
16683
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16514
diff changeset
338 self.trunkname = self.ui.config('convert', 'svn.trunk',
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16514
diff changeset
339 'trunk').strip('/')
6173
963000ed8cac convert: add shallow, single branch svn conversions via svn.startrev
Patrick Mezard <pmezard@gmail.com>
parents: 6172
diff changeset
340 self.startrev = self.ui.config('convert', 'svn.startrev', default=0)
963000ed8cac convert: add shallow, single branch svn conversions via svn.startrev
Patrick Mezard <pmezard@gmail.com>
parents: 6172
diff changeset
341 try:
963000ed8cac convert: add shallow, single branch svn conversions via svn.startrev
Patrick Mezard <pmezard@gmail.com>
parents: 6172
diff changeset
342 self.startrev = int(self.startrev)
963000ed8cac convert: add shallow, single branch svn conversions via svn.startrev
Patrick Mezard <pmezard@gmail.com>
parents: 6172
diff changeset
343 if self.startrev < 0:
963000ed8cac convert: add shallow, single branch svn conversions via svn.startrev
Patrick Mezard <pmezard@gmail.com>
parents: 6172
diff changeset
344 self.startrev = 0
963000ed8cac convert: add shallow, single branch svn conversions via svn.startrev
Patrick Mezard <pmezard@gmail.com>
parents: 6172
diff changeset
345 except ValueError:
6210
942287cb1f57 Removed trailing spaces from everything except test output
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6173
diff changeset
346 raise util.Abort(_('svn: start revision %s is not an integer')
6173
963000ed8cac convert: add shallow, single branch svn conversions via svn.startrev
Patrick Mezard <pmezard@gmail.com>
parents: 6172
diff changeset
347 % self.startrev)
963000ed8cac convert: add shallow, single branch svn conversions via svn.startrev
Patrick Mezard <pmezard@gmail.com>
parents: 6172
diff changeset
348
14152
00121103546a convert: handle invalid subversion source paths
Mads Kiilerich <mads@kiilerich.com>
parents: 13970
diff changeset
349 try:
00121103546a convert: handle invalid subversion source paths
Mads Kiilerich <mads@kiilerich.com>
parents: 13970
diff changeset
350 self.head = self.latest(self.module, latest)
00121103546a convert: handle invalid subversion source paths
Mads Kiilerich <mads@kiilerich.com>
parents: 13970
diff changeset
351 except SvnPathNotFound:
00121103546a convert: handle invalid subversion source paths
Mads Kiilerich <mads@kiilerich.com>
parents: 13970
diff changeset
352 self.head = None
5957
971a17af5982 convert: prevent svn branches to leave the root module tree
Patrick Mezard <pmezard@gmail.com>
parents: 5956
diff changeset
353 if not self.head:
8886
0593c5b5b1f0 convert/svn: stop returning unicode revision identifiers
Patrick Mezard <pmezard@gmail.com>
parents: 8885
diff changeset
354 raise util.Abort(_('no revision found in module %s')
0593c5b5b1f0 convert/svn: stop returning unicode revision identifiers
Patrick Mezard <pmezard@gmail.com>
parents: 8885
diff changeset
355 % self.module)
5955
c4496b7c10ce convert: fix svn_source.latest()
Patrick Mezard <pmezard@gmail.com>
parents: 5921
diff changeset
356 self.last_changed = self.revnum(self.head)
6210
942287cb1f57 Removed trailing spaces from everything except test output
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6173
diff changeset
357
22298
4ba35d4298a0 convert: refactor subversion getchanges and caching
Mads Kiilerich <madski@unity3d.com>
parents: 22297
diff changeset
358 self._changescache = (None, None)
4765
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents:
diff changeset
359
5554
2147a734dcf9 convert: tell the source repository when a rev has been converted
Bryan O'Sullivan <bos@serpentine.com>
parents: 5537
diff changeset
360 if os.path.exists(os.path.join(url, '.svn/entries')):
2147a734dcf9 convert: tell the source repository when a rev has been converted
Bryan O'Sullivan <bos@serpentine.com>
parents: 5537
diff changeset
361 self.wc = url
2147a734dcf9 convert: tell the source repository when a rev has been converted
Bryan O'Sullivan <bos@serpentine.com>
parents: 5537
diff changeset
362 else:
2147a734dcf9 convert: tell the source repository when a rev has been converted
Bryan O'Sullivan <bos@serpentine.com>
parents: 5537
diff changeset
363 self.wc = None
2147a734dcf9 convert: tell the source repository when a rev has been converted
Bryan O'Sullivan <bos@serpentine.com>
parents: 5537
diff changeset
364 self.convertfp = None
2147a734dcf9 convert: tell the source repository when a rev has been converted
Bryan O'Sullivan <bos@serpentine.com>
parents: 5537
diff changeset
365
5510
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5462
diff changeset
366 def setrevmap(self, revmap):
4840
a265fe42abe7 convert: svn code movement (no actual changes)
Brendan Cully <brendan@kublai.com>
parents: 4839
diff changeset
367 lastrevs = {}
5511
03bb1296a1c3 convert: iterate
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
368 for revid in revmap.iterkeys():
13690
af331f557942 convert/svn: extract revsplit() in a function
Patrick Mezard <pmezard@gmail.com>
parents: 13653
diff changeset
369 uuid, module, revnum = revsplit(revid)
4840
a265fe42abe7 convert: svn code movement (no actual changes)
Brendan Cully <brendan@kublai.com>
parents: 4839
diff changeset
370 lastrevnum = lastrevs.setdefault(module, revnum)
a265fe42abe7 convert: svn code movement (no actual changes)
Brendan Cully <brendan@kublai.com>
parents: 4839
diff changeset
371 if revnum > lastrevnum:
a265fe42abe7 convert: svn code movement (no actual changes)
Brendan Cully <brendan@kublai.com>
parents: 4839
diff changeset
372 lastrevs[module] = revnum
a265fe42abe7 convert: svn code movement (no actual changes)
Brendan Cully <brendan@kublai.com>
parents: 4839
diff changeset
373 self.lastrevs = lastrevs
a265fe42abe7 convert: svn code movement (no actual changes)
Brendan Cully <brendan@kublai.com>
parents: 4839
diff changeset
374
4925
2642726b61b6 convert/subversion.py: fix bad assumptions about SVN path naming
Bryan O'Sullivan <bos@serpentine.com>
parents: 4873
diff changeset
375 def exists(self, path, optrev):
2642726b61b6 convert/subversion.py: fix bad assumptions about SVN path naming
Bryan O'Sullivan <bos@serpentine.com>
parents: 4873
diff changeset
376 try:
15599
c6be93a4c378 convert/svn: fix URL quoting issue with svn 1.7
Patrick Mezard <pmezard@gmail.com>
parents: 15381
diff changeset
377 svn.client.ls(self.url.rstrip('/') + '/' + quote(path),
4925
2642726b61b6 convert/subversion.py: fix bad assumptions about SVN path naming
Bryan O'Sullivan <bos@serpentine.com>
parents: 4873
diff changeset
378 optrev, False, self.ctx)
5461
ab4d2e9f3b97 convert: svn -- fix 'exists'
Kirill Smelkov <kirr@landau.phys.spbu.ru>
parents: 5438
diff changeset
379 return True
7875
553aa0cbeab6 cleanup: drop unused assignments
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7874
diff changeset
380 except SubversionException:
5461
ab4d2e9f3b97 convert: svn -- fix 'exists'
Kirill Smelkov <kirr@landau.phys.spbu.ru>
parents: 5438
diff changeset
381 return False
4925
2642726b61b6 convert/subversion.py: fix bad assumptions about SVN path naming
Bryan O'Sullivan <bos@serpentine.com>
parents: 4873
diff changeset
382
4840
a265fe42abe7 convert: svn code movement (no actual changes)
Brendan Cully <brendan@kublai.com>
parents: 4839
diff changeset
383 def getheads(self):
5854
8b95f598097c convert: separate trunk detection from branch layout detection
Edouard Gomez <ed.gomez@free.fr>
parents: 5842
diff changeset
384
6491
2bdd43246c95 convert: check svn branches are directories
Patrick Mezard <pmezard@gmail.com>
parents: 6400
diff changeset
385 def isdir(path, revnum):
6848
59c40c60d8d8 convert: remove leading slash from ra.check_path inputs (issue 1236)
Patrick Mezard <pmezard@gmail.com>
parents: 6847
diff changeset
386 kind = self._checkpath(path, revnum)
6491
2bdd43246c95 convert: check svn branches are directories
Patrick Mezard <pmezard@gmail.com>
parents: 6400
diff changeset
387 return kind == svn.core.svn_node_dir
2bdd43246c95 convert: check svn branches are directories
Patrick Mezard <pmezard@gmail.com>
parents: 6400
diff changeset
388
5854
8b95f598097c convert: separate trunk detection from branch layout detection
Edouard Gomez <ed.gomez@free.fr>
parents: 5842
diff changeset
389 def getcfgpath(name, rev):
8b95f598097c convert: separate trunk detection from branch layout detection
Edouard Gomez <ed.gomez@free.fr>
parents: 5842
diff changeset
390 cfgpath = self.ui.config('convert', 'svn.' + name)
6172
0cd6846e5200 convert: allow svn trunk/branches/tags detection to be skipped
Patrick Mezard <pmezard@gmail.com>
parents: 6053
diff changeset
391 if cfgpath is not None and cfgpath.strip() == '':
0cd6846e5200 convert: allow svn trunk/branches/tags detection to be skipped
Patrick Mezard <pmezard@gmail.com>
parents: 6053
diff changeset
392 return None
5854
8b95f598097c convert: separate trunk detection from branch layout detection
Edouard Gomez <ed.gomez@free.fr>
parents: 5842
diff changeset
393 path = (cfgpath or name).strip('/')
8b95f598097c convert: separate trunk detection from branch layout detection
Edouard Gomez <ed.gomez@free.fr>
parents: 5842
diff changeset
394 if not self.exists(path, rev):
13494
3178aca36b0f convert.svn: branch name which equals trunk means `default' branch (issue2653)
Pavel Boldin <boldin.pavel@gmail.com>
parents: 13480
diff changeset
395 if self.module.endswith(path) and name == 'trunk':
3178aca36b0f convert.svn: branch name which equals trunk means `default' branch (issue2653)
Pavel Boldin <boldin.pavel@gmail.com>
parents: 13480
diff changeset
396 # we are converting from inside this directory
3178aca36b0f convert.svn: branch name which equals trunk means `default' branch (issue2653)
Pavel Boldin <boldin.pavel@gmail.com>
parents: 13480
diff changeset
397 return None
5854
8b95f598097c convert: separate trunk detection from branch layout detection
Edouard Gomez <ed.gomez@free.fr>
parents: 5842
diff changeset
398 if cfgpath:
8b95f598097c convert: separate trunk detection from branch layout detection
Edouard Gomez <ed.gomez@free.fr>
parents: 5842
diff changeset
399 raise util.Abort(_('expected %s to be at %r, but not found')
8b95f598097c convert: separate trunk detection from branch layout detection
Edouard Gomez <ed.gomez@free.fr>
parents: 5842
diff changeset
400 % (name, path))
8b95f598097c convert: separate trunk detection from branch layout detection
Edouard Gomez <ed.gomez@free.fr>
parents: 5842
diff changeset
401 return None
8b95f598097c convert: separate trunk detection from branch layout detection
Edouard Gomez <ed.gomez@free.fr>
parents: 5842
diff changeset
402 self.ui.note(_('found %s at %r\n') % (name, path))
8b95f598097c convert: separate trunk detection from branch layout detection
Edouard Gomez <ed.gomez@free.fr>
parents: 5842
diff changeset
403 return path
8b95f598097c convert: separate trunk detection from branch layout detection
Edouard Gomez <ed.gomez@free.fr>
parents: 5842
diff changeset
404
5117
c89ed1f27e78 convert: svn: add helper function for optrevs
Brendan Cully <brendan@kublai.com>
parents: 5114
diff changeset
405 rev = optrev(self.last_changed)
5854
8b95f598097c convert: separate trunk detection from branch layout detection
Edouard Gomez <ed.gomez@free.fr>
parents: 5842
diff changeset
406 oldmodule = ''
8b95f598097c convert: separate trunk detection from branch layout detection
Edouard Gomez <ed.gomez@free.fr>
parents: 5842
diff changeset
407 trunk = getcfgpath('trunk', rev)
6400
c237b27e1350 convert: allow tags detection to be disabled
Patrick Mezard <pmezard@gmail.com>
parents: 6399
diff changeset
408 self.tags = getcfgpath('tags', rev)
5854
8b95f598097c convert: separate trunk detection from branch layout detection
Edouard Gomez <ed.gomez@free.fr>
parents: 5842
diff changeset
409 branches = getcfgpath('branches', rev)
8b95f598097c convert: separate trunk detection from branch layout detection
Edouard Gomez <ed.gomez@free.fr>
parents: 5842
diff changeset
410
8b95f598097c convert: separate trunk detection from branch layout detection
Edouard Gomez <ed.gomez@free.fr>
parents: 5842
diff changeset
411 # If the project has a trunk or branches, we will extract heads
8b95f598097c convert: separate trunk detection from branch layout detection
Edouard Gomez <ed.gomez@free.fr>
parents: 5842
diff changeset
412 # from them. We keep the project root otherwise.
8b95f598097c convert: separate trunk detection from branch layout detection
Edouard Gomez <ed.gomez@free.fr>
parents: 5842
diff changeset
413 if trunk:
8b95f598097c convert: separate trunk detection from branch layout detection
Edouard Gomez <ed.gomez@free.fr>
parents: 5842
diff changeset
414 oldmodule = self.module or ''
4925
2642726b61b6 convert/subversion.py: fix bad assumptions about SVN path naming
Bryan O'Sullivan <bos@serpentine.com>
parents: 4873
diff changeset
415 self.module += '/' + trunk
5955
c4496b7c10ce convert: fix svn_source.latest()
Patrick Mezard <pmezard@gmail.com>
parents: 5921
diff changeset
416 self.head = self.latest(self.module, self.last_changed)
5957
971a17af5982 convert: prevent svn branches to leave the root module tree
Patrick Mezard <pmezard@gmail.com>
parents: 5956
diff changeset
417 if not self.head:
9312
c5f0825c1dbb kill trailing whitespace
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9169
diff changeset
418 raise util.Abort(_('no revision found in module %s')
8886
0593c5b5b1f0 convert/svn: stop returning unicode revision identifiers
Patrick Mezard <pmezard@gmail.com>
parents: 8885
diff changeset
419 % self.module)
5854
8b95f598097c convert: separate trunk detection from branch layout detection
Edouard Gomez <ed.gomez@free.fr>
parents: 5842
diff changeset
420
8b95f598097c convert: separate trunk detection from branch layout detection
Edouard Gomez <ed.gomez@free.fr>
parents: 5842
diff changeset
421 # First head in the list is the module's head
8b95f598097c convert: separate trunk detection from branch layout detection
Edouard Gomez <ed.gomez@free.fr>
parents: 5842
diff changeset
422 self.heads = [self.head]
6400
c237b27e1350 convert: allow tags detection to be disabled
Patrick Mezard <pmezard@gmail.com>
parents: 6399
diff changeset
423 if self.tags is not None:
c237b27e1350 convert: allow tags detection to be disabled
Patrick Mezard <pmezard@gmail.com>
parents: 6399
diff changeset
424 self.tags = '%s/%s' % (oldmodule , (self.tags or 'tags'))
5854
8b95f598097c convert: separate trunk detection from branch layout detection
Edouard Gomez <ed.gomez@free.fr>
parents: 5842
diff changeset
425
8b95f598097c convert: separate trunk detection from branch layout detection
Edouard Gomez <ed.gomez@free.fr>
parents: 5842
diff changeset
426 # Check if branches bring a few more heads to the list
8b95f598097c convert: separate trunk detection from branch layout detection
Edouard Gomez <ed.gomez@free.fr>
parents: 5842
diff changeset
427 if branches:
8b95f598097c convert: separate trunk detection from branch layout detection
Edouard Gomez <ed.gomez@free.fr>
parents: 5842
diff changeset
428 rpath = self.url.strip('/')
15599
c6be93a4c378 convert/svn: fix URL quoting issue with svn 1.7
Patrick Mezard <pmezard@gmail.com>
parents: 15381
diff changeset
429 branchnames = svn.client.ls(rpath + '/' + quote(branches),
7074
b1a4f67b98d0 convert: properly encode subversion URLs (issue 1224)
Patrick Mezard <pmezard@gmail.com>
parents: 6877
diff changeset
430 rev, False, self.ctx)
18374
942ecb55b1de convert: process subversion branch in a sorted order
Mads Kiilerich <mads@kiilerich.com>
parents: 17974
diff changeset
431 for branch in sorted(branchnames):
5854
8b95f598097c convert: separate trunk detection from branch layout detection
Edouard Gomez <ed.gomez@free.fr>
parents: 5842
diff changeset
432 module = '%s/%s/%s' % (oldmodule, branches, branch)
6491
2bdd43246c95 convert: check svn branches are directories
Patrick Mezard <pmezard@gmail.com>
parents: 6400
diff changeset
433 if not isdir(module, self.last_changed):
2bdd43246c95 convert: check svn branches are directories
Patrick Mezard <pmezard@gmail.com>
parents: 6400
diff changeset
434 continue
5955
c4496b7c10ce convert: fix svn_source.latest()
Patrick Mezard <pmezard@gmail.com>
parents: 5921
diff changeset
435 brevid = self.latest(module, self.last_changed)
5957
971a17af5982 convert: prevent svn branches to leave the root module tree
Patrick Mezard <pmezard@gmail.com>
parents: 5956
diff changeset
436 if not brevid:
8886
0593c5b5b1f0 convert/svn: stop returning unicode revision identifiers
Patrick Mezard <pmezard@gmail.com>
parents: 8885
diff changeset
437 self.ui.note(_('ignoring empty branch %s\n') % branch)
5957
971a17af5982 convert: prevent svn branches to leave the root module tree
Patrick Mezard <pmezard@gmail.com>
parents: 5956
diff changeset
438 continue
6956
12472a240398 i18n: mark strings for translation in convert extension
Martin Geisler <mg@daimi.au.dk>
parents: 6884
diff changeset
439 self.ui.note(_('found branch %s at %d\n') %
5955
c4496b7c10ce convert: fix svn_source.latest()
Patrick Mezard <pmezard@gmail.com>
parents: 5921
diff changeset
440 (branch, self.revnum(brevid)))
c4496b7c10ce convert: fix svn_source.latest()
Patrick Mezard <pmezard@gmail.com>
parents: 5921
diff changeset
441 self.heads.append(brevid)
5462
91a522a69c13 convert: svn -- fix tags handling
Kirill Smelkov <kirr@landau.phys.spbu.ru>
parents: 5461
diff changeset
442
6173
963000ed8cac convert: add shallow, single branch svn conversions via svn.startrev
Patrick Mezard <pmezard@gmail.com>
parents: 6172
diff changeset
443 if self.startrev and self.heads:
963000ed8cac convert: add shallow, single branch svn conversions via svn.startrev
Patrick Mezard <pmezard@gmail.com>
parents: 6172
diff changeset
444 if len(self.heads) > 1:
8086
89b6450148d0 convert: fix typo
Wagner Bruna <wbruna@yahoo.com>
parents: 7973
diff changeset
445 raise util.Abort(_('svn: start revision is not supported '
6173
963000ed8cac convert: add shallow, single branch svn conversions via svn.startrev
Patrick Mezard <pmezard@gmail.com>
parents: 6172
diff changeset
446 'with more than one branch'))
963000ed8cac convert: add shallow, single branch svn conversions via svn.startrev
Patrick Mezard <pmezard@gmail.com>
parents: 6172
diff changeset
447 revnum = self.revnum(self.heads[0])
963000ed8cac convert: add shallow, single branch svn conversions via svn.startrev
Patrick Mezard <pmezard@gmail.com>
parents: 6172
diff changeset
448 if revnum < self.startrev:
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10071
diff changeset
449 raise util.Abort(
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10071
diff changeset
450 _('svn: no revision found after start revision %d')
6173
963000ed8cac convert: add shallow, single branch svn conversions via svn.startrev
Patrick Mezard <pmezard@gmail.com>
parents: 6172
diff changeset
451 % self.startrev)
963000ed8cac convert: add shallow, single branch svn conversions via svn.startrev
Patrick Mezard <pmezard@gmail.com>
parents: 6172
diff changeset
452
4840
a265fe42abe7 convert: svn code movement (no actual changes)
Brendan Cully <brendan@kublai.com>
parents: 4839
diff changeset
453 return self.heads
a265fe42abe7 convert: svn code movement (no actual changes)
Brendan Cully <brendan@kublai.com>
parents: 4839
diff changeset
454
22300
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22298
diff changeset
455 def _getchanges(self, rev, full):
5121
ef338e34a906 convert: look up copies in getchanges instead of getcommit
Brendan Cully <brendan@kublai.com>
parents: 5120
diff changeset
456 (paths, parents) = self.paths[rev]
22300
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22298
diff changeset
457 copies = {}
5956
094638b3cbed convert: checkout svn root revisions
Patrick Mezard <pmezard@gmail.com>
parents: 5955
diff changeset
458 if parents:
11127
ab575114ddd8 convert/svn: do not retrieve removed files
Patrick Mezard <pmezard@gmail.com>
parents: 11126
diff changeset
459 files, self.removed, copies = self.expandpaths(rev, paths, parents)
22300
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22298
diff changeset
460 if full or not parents:
5956
094638b3cbed convert: checkout svn root revisions
Patrick Mezard <pmezard@gmail.com>
parents: 5955
diff changeset
461 # Perform a full checkout on roots
13690
af331f557942 convert/svn: extract revsplit() in a function
Patrick Mezard <pmezard@gmail.com>
parents: 13653
diff changeset
462 uuid, module, revnum = revsplit(rev)
15599
c6be93a4c378 convert/svn: fix URL quoting issue with svn 1.7
Patrick Mezard <pmezard@gmail.com>
parents: 15381
diff changeset
463 entries = svn.client.ls(self.baseurl + quote(module),
7074
b1a4f67b98d0 convert: properly encode subversion URLs (issue 1224)
Patrick Mezard <pmezard@gmail.com>
parents: 6877
diff changeset
464 optrev(revnum), True, self.ctx)
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10071
diff changeset
465 files = [n for n, e in entries.iteritems()
5956
094638b3cbed convert: checkout svn root revisions
Patrick Mezard <pmezard@gmail.com>
parents: 5955
diff changeset
466 if e.kind == svn.core.svn_node_file]
11127
ab575114ddd8 convert/svn: do not retrieve removed files
Patrick Mezard <pmezard@gmail.com>
parents: 11126
diff changeset
467 self.removed = set()
5956
094638b3cbed convert: checkout svn root revisions
Patrick Mezard <pmezard@gmail.com>
parents: 5955
diff changeset
468
5121
ef338e34a906 convert: look up copies in getchanges instead of getcommit
Brendan Cully <brendan@kublai.com>
parents: 5120
diff changeset
469 files.sort()
ef338e34a906 convert: look up copies in getchanges instead of getcommit
Brendan Cully <brendan@kublai.com>
parents: 5120
diff changeset
470 files = zip(files, [rev] * len(files))
22298
4ba35d4298a0 convert: refactor subversion getchanges and caching
Mads Kiilerich <madski@unity3d.com>
parents: 22297
diff changeset
471 return (files, copies)
5121
ef338e34a906 convert: look up copies in getchanges instead of getcommit
Brendan Cully <brendan@kublai.com>
parents: 5120
diff changeset
472
22300
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22298
diff changeset
473 def getchanges(self, rev, full):
22298
4ba35d4298a0 convert: refactor subversion getchanges and caching
Mads Kiilerich <madski@unity3d.com>
parents: 22297
diff changeset
474 # reuse cache from getchangedfiles
22300
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22298
diff changeset
475 if self._changescache[0] == rev and not full:
22298
4ba35d4298a0 convert: refactor subversion getchanges and caching
Mads Kiilerich <madski@unity3d.com>
parents: 22297
diff changeset
476 (files, copies) = self._changescache[1]
4ba35d4298a0 convert: refactor subversion getchanges and caching
Mads Kiilerich <madski@unity3d.com>
parents: 22297
diff changeset
477 else:
22300
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22298
diff changeset
478 (files, copies) = self._getchanges(rev, full)
22298
4ba35d4298a0 convert: refactor subversion getchanges and caching
Mads Kiilerich <madski@unity3d.com>
parents: 22297
diff changeset
479 # caller caches the result, so free it here to release memory
4ba35d4298a0 convert: refactor subversion getchanges and caching
Mads Kiilerich <madski@unity3d.com>
parents: 22297
diff changeset
480 del self.paths[rev]
24395
216fa1ba9993 convert: optimize convert of files that are unmodified from p2 in merges
Mads Kiilerich <madski@unity3d.com>
parents: 24306
diff changeset
481 return (files, copies, set())
4840
a265fe42abe7 convert: svn code movement (no actual changes)
Brendan Cully <brendan@kublai.com>
parents: 4839
diff changeset
482
5382
d7d395fb7cd5 convert_svn: add --filemap support
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5373
diff changeset
483 def getchangedfiles(self, rev, i):
22298
4ba35d4298a0 convert: refactor subversion getchanges and caching
Mads Kiilerich <madski@unity3d.com>
parents: 22297
diff changeset
484 # called from filemap - cache computed values for reuse in getchanges
22300
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22298
diff changeset
485 (files, copies) = self._getchanges(rev, False)
22298
4ba35d4298a0 convert: refactor subversion getchanges and caching
Mads Kiilerich <madski@unity3d.com>
parents: 22297
diff changeset
486 self._changescache = (rev, (files, copies))
4ba35d4298a0 convert: refactor subversion getchanges and caching
Mads Kiilerich <madski@unity3d.com>
parents: 22297
diff changeset
487 return [f[0] for f in files]
5382
d7d395fb7cd5 convert_svn: add --filemap support
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5373
diff changeset
488
4840
a265fe42abe7 convert: svn code movement (no actual changes)
Brendan Cully <brendan@kublai.com>
parents: 4839
diff changeset
489 def getcommit(self, rev):
a265fe42abe7 convert: svn code movement (no actual changes)
Brendan Cully <brendan@kublai.com>
parents: 4839
diff changeset
490 if rev not in self.commits:
13690
af331f557942 convert/svn: extract revsplit() in a function
Patrick Mezard <pmezard@gmail.com>
parents: 13653
diff changeset
491 uuid, module, revnum = revsplit(rev)
4840
a265fe42abe7 convert: svn code movement (no actual changes)
Brendan Cully <brendan@kublai.com>
parents: 4839
diff changeset
492 self.module = module
a265fe42abe7 convert: svn code movement (no actual changes)
Brendan Cully <brendan@kublai.com>
parents: 4839
diff changeset
493 self.reparent(module)
5875
f1504d3355bb convert: fetch less revisions when looking for a branch parent
Patrick Mezard <pmezard@gmail.com>
parents: 5873
diff changeset
494 # We assume that:
f1504d3355bb convert: fetch less revisions when looking for a branch parent
Patrick Mezard <pmezard@gmail.com>
parents: 5873
diff changeset
495 # - requests for revisions after "stop" come from the
f1504d3355bb convert: fetch less revisions when looking for a branch parent
Patrick Mezard <pmezard@gmail.com>
parents: 5873
diff changeset
496 # revision graph backward traversal. Cache all of them
f1504d3355bb convert: fetch less revisions when looking for a branch parent
Patrick Mezard <pmezard@gmail.com>
parents: 5873
diff changeset
497 # down to stop, they will be used eventually.
f1504d3355bb convert: fetch less revisions when looking for a branch parent
Patrick Mezard <pmezard@gmail.com>
parents: 5873
diff changeset
498 # - requests for revisions before "stop" come to get
f1504d3355bb convert: fetch less revisions when looking for a branch parent
Patrick Mezard <pmezard@gmail.com>
parents: 5873
diff changeset
499 # isolated branches parents. Just fetch what is needed.
4840
a265fe42abe7 convert: svn code movement (no actual changes)
Brendan Cully <brendan@kublai.com>
parents: 4839
diff changeset
500 stop = self.lastrevs.get(module, 0)
5875
f1504d3355bb convert: fetch less revisions when looking for a branch parent
Patrick Mezard <pmezard@gmail.com>
parents: 5873
diff changeset
501 if revnum < stop:
f1504d3355bb convert: fetch less revisions when looking for a branch parent
Patrick Mezard <pmezard@gmail.com>
parents: 5873
diff changeset
502 stop = revnum + 1
5871
c1244685425a convert: fix parents of last fetched svn revision
Patrick Mezard <pmezard@gmail.com>
parents: 5870
diff changeset
503 self._fetch_revisions(revnum, stop)
15970
9f2ed48f8cda convert: subversion convert abort on revision not found (issue 3205)
Jesus Espino Garcia <jesus.espino@kaleidos.net>
parents: 15751
diff changeset
504 if rev not in self.commits:
9f2ed48f8cda convert: subversion convert abort on revision not found (issue 3205)
Jesus Espino Garcia <jesus.espino@kaleidos.net>
parents: 15751
diff changeset
505 raise util.Abort(_('svn: revision %s not found') % revnum)
22201
269688a398c4 cleanup: fix some list comprehension redefinitions of existing vars
Mads Kiilerich <madski@unity3d.com>
parents: 21635
diff changeset
506 revcommit = self.commits[rev]
4840
a265fe42abe7 convert: svn code movement (no actual changes)
Brendan Cully <brendan@kublai.com>
parents: 4839
diff changeset
507 # caller caches the result, so free it here to release memory
a265fe42abe7 convert: svn code movement (no actual changes)
Brendan Cully <brendan@kublai.com>
parents: 4839
diff changeset
508 del self.commits[rev]
22201
269688a398c4 cleanup: fix some list comprehension redefinitions of existing vars
Mads Kiilerich <madski@unity3d.com>
parents: 21635
diff changeset
509 return revcommit
4840
a265fe42abe7 convert: svn code movement (no actual changes)
Brendan Cully <brendan@kublai.com>
parents: 4839
diff changeset
510
20373
e8203629371b convert: add mapname parameter to checkrevformat
Sean Farley <sean.michael.farley@gmail.com>
parents: 20057
diff changeset
511 def checkrevformat(self, revstr, mapname='splicemap'):
19122
83973dc1bfe9 splicemap: improve error handling when source is subversion (issue2084)
Ben Goswami <bengoswami@fb.com>
parents: 18374
diff changeset
512 """ fails if revision format does not match the correct format"""
83973dc1bfe9 splicemap: improve error handling when source is subversion (issue2084)
Ben Goswami <bengoswami@fb.com>
parents: 18374
diff changeset
513 if not re.match(r'svn:[0-9a-f]{8,8}-[0-9a-f]{4,4}-'
83973dc1bfe9 splicemap: improve error handling when source is subversion (issue2084)
Ben Goswami <bengoswami@fb.com>
parents: 18374
diff changeset
514 '[0-9a-f]{4,4}-[0-9a-f]{4,4}-[0-9a-f]'
83973dc1bfe9 splicemap: improve error handling when source is subversion (issue2084)
Ben Goswami <bengoswami@fb.com>
parents: 18374
diff changeset
515 '{12,12}(.*)\@[0-9]+$',revstr):
20373
e8203629371b convert: add mapname parameter to checkrevformat
Sean Farley <sean.michael.farley@gmail.com>
parents: 20057
diff changeset
516 raise util.Abort(_('%s entry %s is not a valid revision'
e8203629371b convert: add mapname parameter to checkrevformat
Sean Farley <sean.michael.farley@gmail.com>
parents: 20057
diff changeset
517 ' identifier') % (mapname, revstr))
19122
83973dc1bfe9 splicemap: improve error handling when source is subversion (issue2084)
Ben Goswami <bengoswami@fb.com>
parents: 18374
diff changeset
518
22414
299eaa09b41b convert: enable deterministic conversion progress bar for svn
Augie Fackler <raf@durin42.com>
parents: 22300
diff changeset
519 def numcommits(self):
299eaa09b41b convert: enable deterministic conversion progress bar for svn
Augie Fackler <raf@durin42.com>
parents: 22300
diff changeset
520 return int(self.head.rsplit('@', 1)[1]) - self.startrev
299eaa09b41b convert: enable deterministic conversion progress bar for svn
Augie Fackler <raf@durin42.com>
parents: 22300
diff changeset
521
4840
a265fe42abe7 convert: svn code movement (no actual changes)
Brendan Cully <brendan@kublai.com>
parents: 4839
diff changeset
522 def gettags(self):
a265fe42abe7 convert: svn code movement (no actual changes)
Brendan Cully <brendan@kublai.com>
parents: 4839
diff changeset
523 tags = {}
6172
0cd6846e5200 convert: allow svn trunk/branches/tags detection to be skipped
Patrick Mezard <pmezard@gmail.com>
parents: 6053
diff changeset
524 if self.tags is None:
0cd6846e5200 convert: allow svn trunk/branches/tags detection to be skipped
Patrick Mezard <pmezard@gmail.com>
parents: 6053
diff changeset
525 return tags
6210
942287cb1f57 Removed trailing spaces from everything except test output
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6173
diff changeset
526
6399
5efd447a9b8d convert: follow svn tags history (issue953)
Patrick Mezard <pmezard@gmail.com>
parents: 6397
diff changeset
527 # svn tags are just a convention, project branches left in a
5efd447a9b8d convert: follow svn tags history (issue953)
Patrick Mezard <pmezard@gmail.com>
parents: 6397
diff changeset
528 # 'tags' directory. There is no other relationship than
5efd447a9b8d convert: follow svn tags history (issue953)
Patrick Mezard <pmezard@gmail.com>
parents: 6397
diff changeset
529 # ancestry, which is expensive to discover and makes them hard
5efd447a9b8d convert: follow svn tags history (issue953)
Patrick Mezard <pmezard@gmail.com>
parents: 6397
diff changeset
530 # to update incrementally. Worse, past revisions may be
5efd447a9b8d convert: follow svn tags history (issue953)
Patrick Mezard <pmezard@gmail.com>
parents: 6397
diff changeset
531 # referenced by tags far away in the future, requiring a deep
5efd447a9b8d convert: follow svn tags history (issue953)
Patrick Mezard <pmezard@gmail.com>
parents: 6397
diff changeset
532 # history traversal on every calculation. Current code
5efd447a9b8d convert: follow svn tags history (issue953)
Patrick Mezard <pmezard@gmail.com>
parents: 6397
diff changeset
533 # performs a single backward traversal, tracking moves within
5efd447a9b8d convert: follow svn tags history (issue953)
Patrick Mezard <pmezard@gmail.com>
parents: 6397
diff changeset
534 # the tags directory (tag renaming) and recording a new tag
5efd447a9b8d convert: follow svn tags history (issue953)
Patrick Mezard <pmezard@gmail.com>
parents: 6397
diff changeset
535 # everytime a project is copied from outside the tags
5efd447a9b8d convert: follow svn tags history (issue953)
Patrick Mezard <pmezard@gmail.com>
parents: 6397
diff changeset
536 # directory. It also lists deleted tags, this behaviour may
5efd447a9b8d convert: follow svn tags history (issue953)
Patrick Mezard <pmezard@gmail.com>
parents: 6397
diff changeset
537 # change in the future.
5efd447a9b8d convert: follow svn tags history (issue953)
Patrick Mezard <pmezard@gmail.com>
parents: 6397
diff changeset
538 pendings = []
5efd447a9b8d convert: follow svn tags history (issue953)
Patrick Mezard <pmezard@gmail.com>
parents: 6397
diff changeset
539 tagspath = self.tags
5efd447a9b8d convert: follow svn tags history (issue953)
Patrick Mezard <pmezard@gmail.com>
parents: 6397
diff changeset
540 start = svn.ra.get_latest_revnum(self.ra)
11195
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
541 stream = self._getlog([self.tags], start, self.startrev)
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
542 try:
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
543 for entry in stream:
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
544 origpaths, revnum, author, date, message = entry
19468
82c512643bed convert: catch empty origpaths in svn gettags (issue3941)
Matt Mackall <mpm@selenic.com>
parents: 19122
diff changeset
545 if not origpaths:
82c512643bed convert: catch empty origpaths in svn gettags (issue3941)
Matt Mackall <mpm@selenic.com>
parents: 19122
diff changeset
546 origpaths = []
11195
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
547 copies = [(e.copyfrom_path, e.copyfrom_rev, p) for p, e
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
548 in origpaths.iteritems() if e.copyfrom_path]
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
549 # Apply moves/copies from more specific to general
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
550 copies.sort(reverse=True)
6399
5efd447a9b8d convert: follow svn tags history (issue953)
Patrick Mezard <pmezard@gmail.com>
parents: 6397
diff changeset
551
11195
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
552 srctagspath = tagspath
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
553 if copies and copies[-1][2] == tagspath:
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
554 # Track tags directory moves
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
555 srctagspath = copies.pop()[0]
6399
5efd447a9b8d convert: follow svn tags history (issue953)
Patrick Mezard <pmezard@gmail.com>
parents: 6397
diff changeset
556
11195
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
557 for source, sourcerev, dest in copies:
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
558 if not dest.startswith(tagspath + '/'):
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
559 continue
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
560 for tag in pendings:
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
561 if tag[0].startswith(dest):
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
562 tagpath = source + tag[0][len(dest):]
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
563 tag[:2] = [tagpath, sourcerev]
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
564 break
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
565 else:
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
566 pendings.append([source, sourcerev, dest])
8248
d093e57671ea convert/svn: ignore composite tags
Patrick Mezard <pmezard@gmail.com>
parents: 8247
diff changeset
567
11195
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
568 # Filter out tags with children coming from different
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
569 # parts of the repository like:
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
570 # /tags/tag.1 (from /trunk:10)
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
571 # /tags/tag.1/foo (from /branches/foo:12)
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
572 # Here/tags/tag.1 discarded as well as its children.
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
573 # It happens with tools like cvs2svn. Such tags cannot
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
574 # be represented in mercurial.
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
575 addeds = dict((p, e.copyfrom_path) for p, e
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
576 in origpaths.iteritems()
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
577 if e.action == 'A' and e.copyfrom_path)
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
578 badroots = set()
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
579 for destroot in addeds:
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
580 for source, sourcerev, dest in pendings:
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
581 if (not dest.startswith(destroot + '/')
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
582 or source.startswith(addeds[destroot] + '/')):
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
583 continue
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
584 badroots.add(destroot)
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
585 break
8248
d093e57671ea convert/svn: ignore composite tags
Patrick Mezard <pmezard@gmail.com>
parents: 8247
diff changeset
586
11195
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
587 for badroot in badroots:
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
588 pendings = [p for p in pendings if p[2] != badroot
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
589 and not p[2].startswith(badroot + '/')]
6399
5efd447a9b8d convert: follow svn tags history (issue953)
Patrick Mezard <pmezard@gmail.com>
parents: 6397
diff changeset
590
11195
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
591 # Tell tag renamings from tag creations
15124
8542a9c9f679 convert: rename local variable
Martin Geisler <mg@aragost.com>
parents: 14273
diff changeset
592 renamings = []
11195
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
593 for source, sourcerev, dest in pendings:
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
594 tagname = dest.split('/')[-1]
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
595 if source.startswith(srctagspath):
15124
8542a9c9f679 convert: rename local variable
Martin Geisler <mg@aragost.com>
parents: 14273
diff changeset
596 renamings.append([source, sourcerev, tagname])
11195
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
597 continue
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
598 if tagname in tags:
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
599 # Keep the latest tag value
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
600 continue
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
601 # From revision may be fake, get one with changes
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
602 try:
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
603 tagid = self.latest(source, sourcerev)
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
604 if tagid and tagname not in tags:
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
605 tags[tagname] = tagid
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
606 except SvnPathNotFound:
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
607 # It happens when we are following directories
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
608 # we assumed were copied with their parents
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
609 # but were really created in the tag
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
610 # directory.
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
611 pass
15124
8542a9c9f679 convert: rename local variable
Martin Geisler <mg@aragost.com>
parents: 14273
diff changeset
612 pendings = renamings
11195
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
613 tagspath = srctagspath
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
614 finally:
46bb49134498 convert/svn: close gettags() log stream (issue2196)
Aaron Digulla <digulla@hepe.com>
parents: 11194
diff changeset
615 stream.close()
4946
e8f4e40f285a convert/subversion: work around memory leak in svn's python bindings
Bryan O'Sullivan <bos@serpentine.com>
parents: 4944
diff changeset
616 return tags
4840
a265fe42abe7 convert: svn code movement (no actual changes)
Brendan Cully <brendan@kublai.com>
parents: 4839
diff changeset
617
5554
2147a734dcf9 convert: tell the source repository when a rev has been converted
Bryan O'Sullivan <bos@serpentine.com>
parents: 5537
diff changeset
618 def converted(self, rev, destrev):
2147a734dcf9 convert: tell the source repository when a rev has been converted
Bryan O'Sullivan <bos@serpentine.com>
parents: 5537
diff changeset
619 if not self.wc:
2147a734dcf9 convert: tell the source repository when a rev has been converted
Bryan O'Sullivan <bos@serpentine.com>
parents: 5537
diff changeset
620 return
2147a734dcf9 convert: tell the source repository when a rev has been converted
Bryan O'Sullivan <bos@serpentine.com>
parents: 5537
diff changeset
621 if self.convertfp is None:
2147a734dcf9 convert: tell the source repository when a rev has been converted
Bryan O'Sullivan <bos@serpentine.com>
parents: 5537
diff changeset
622 self.convertfp = open(os.path.join(self.wc, '.svn', 'hg-shamap'),
2147a734dcf9 convert: tell the source repository when a rev has been converted
Bryan O'Sullivan <bos@serpentine.com>
parents: 5537
diff changeset
623 'a')
2147a734dcf9 convert: tell the source repository when a rev has been converted
Bryan O'Sullivan <bos@serpentine.com>
parents: 5537
diff changeset
624 self.convertfp.write('%s %d\n' % (destrev, self.revnum(rev)))
2147a734dcf9 convert: tell the source repository when a rev has been converted
Bryan O'Sullivan <bos@serpentine.com>
parents: 5537
diff changeset
625 self.convertfp.flush()
2147a734dcf9 convert: tell the source repository when a rev has been converted
Bryan O'Sullivan <bos@serpentine.com>
parents: 5537
diff changeset
626
4810
c2d529f288a1 convert: move some code into common init function
Brendan Cully <brendan@kublai.com>
parents: 4807
diff changeset
627 def revid(self, revnum, module=None):
8886
0593c5b5b1f0 convert/svn: stop returning unicode revision identifiers
Patrick Mezard <pmezard@gmail.com>
parents: 8885
diff changeset
628 return 'svn:%s%s@%s' % (self.uuid, module or self.module, revnum)
4774
d305852a5ec8 convert: svn: add revnum() to convert rev to revnum
Brendan Cully <brendan@kublai.com>
parents: 4773
diff changeset
629
d305852a5ec8 convert: svn: add revnum() to convert rev to revnum
Brendan Cully <brendan@kublai.com>
parents: 4773
diff changeset
630 def revnum(self, rev):
d305852a5ec8 convert: svn: add revnum() to convert rev to revnum
Brendan Cully <brendan@kublai.com>
parents: 4773
diff changeset
631 return int(rev.split('@')[-1])
4789
c5dd8e184279 convert: svn: add function to get the latest revision touching a path
Brendan Cully <brendan@kublai.com>
parents: 4788
diff changeset
632
16464
0e1329d905df convert/svn: clarify svn_source.latest() stop arg default value
Patrick Mezard <patrick@mezard.eu>
parents: 16162
diff changeset
633 def latest(self, path, stop=None):
0e1329d905df convert/svn: clarify svn_source.latest() stop arg default value
Patrick Mezard <patrick@mezard.eu>
parents: 16162
diff changeset
634 """Find the latest revid affecting path, up to stop revision
0e1329d905df convert/svn: clarify svn_source.latest() stop arg default value
Patrick Mezard <patrick@mezard.eu>
parents: 16162
diff changeset
635 number. If stop is None, default to repository latest
0e1329d905df convert/svn: clarify svn_source.latest() stop arg default value
Patrick Mezard <patrick@mezard.eu>
parents: 16162
diff changeset
636 revision. It may return a revision in a different module,
0e1329d905df convert/svn: clarify svn_source.latest() stop arg default value
Patrick Mezard <patrick@mezard.eu>
parents: 16162
diff changeset
637 since a branch may be moved without a change being
0e1329d905df convert/svn: clarify svn_source.latest() stop arg default value
Patrick Mezard <patrick@mezard.eu>
parents: 16162
diff changeset
638 reported. Return None if computed module does not belong to
0e1329d905df convert/svn: clarify svn_source.latest() stop arg default value
Patrick Mezard <patrick@mezard.eu>
parents: 16162
diff changeset
639 rootmodule subtree.
5955
c4496b7c10ce convert: fix svn_source.latest()
Patrick Mezard <pmezard@gmail.com>
parents: 5921
diff changeset
640 """
16466
c53a49c345e1 convert/svn: do not try converting empty head revisions (issue3347)
Patrick Mezard <patrick@mezard.eu>
parents: 16465
diff changeset
641 def findchanges(path, start, stop=None):
c53a49c345e1 convert/svn: do not try converting empty head revisions (issue3347)
Patrick Mezard <patrick@mezard.eu>
parents: 16465
diff changeset
642 stream = self._getlog([path], start, stop or 1)
16465
ad38b96c88f9 convert/svn: refactor svn_source.latest() with a nested function
Patrick Mezard <patrick@mezard.eu>
parents: 16464
diff changeset
643 try:
ad38b96c88f9 convert/svn: refactor svn_source.latest() with a nested function
Patrick Mezard <patrick@mezard.eu>
parents: 16464
diff changeset
644 for entry in stream:
ad38b96c88f9 convert/svn: refactor svn_source.latest() with a nested function
Patrick Mezard <patrick@mezard.eu>
parents: 16464
diff changeset
645 paths, revnum, author, date, message = entry
16466
c53a49c345e1 convert/svn: do not try converting empty head revisions (issue3347)
Patrick Mezard <patrick@mezard.eu>
parents: 16465
diff changeset
646 if stop is None and paths:
c53a49c345e1 convert/svn: do not try converting empty head revisions (issue3347)
Patrick Mezard <patrick@mezard.eu>
parents: 16465
diff changeset
647 # We do not know the latest changed revision,
c53a49c345e1 convert/svn: do not try converting empty head revisions (issue3347)
Patrick Mezard <patrick@mezard.eu>
parents: 16465
diff changeset
648 # keep the first one with changed paths.
c53a49c345e1 convert/svn: do not try converting empty head revisions (issue3347)
Patrick Mezard <patrick@mezard.eu>
parents: 16465
diff changeset
649 break
16465
ad38b96c88f9 convert/svn: refactor svn_source.latest() with a nested function
Patrick Mezard <patrick@mezard.eu>
parents: 16464
diff changeset
650 if revnum <= stop:
ad38b96c88f9 convert/svn: refactor svn_source.latest() with a nested function
Patrick Mezard <patrick@mezard.eu>
parents: 16464
diff changeset
651 break
ad38b96c88f9 convert/svn: refactor svn_source.latest() with a nested function
Patrick Mezard <patrick@mezard.eu>
parents: 16464
diff changeset
652
ad38b96c88f9 convert/svn: refactor svn_source.latest() with a nested function
Patrick Mezard <patrick@mezard.eu>
parents: 16464
diff changeset
653 for p in paths:
ad38b96c88f9 convert/svn: refactor svn_source.latest() with a nested function
Patrick Mezard <patrick@mezard.eu>
parents: 16464
diff changeset
654 if (not path.startswith(p) or
ad38b96c88f9 convert/svn: refactor svn_source.latest() with a nested function
Patrick Mezard <patrick@mezard.eu>
parents: 16464
diff changeset
655 not paths[p].copyfrom_path):
ad38b96c88f9 convert/svn: refactor svn_source.latest() with a nested function
Patrick Mezard <patrick@mezard.eu>
parents: 16464
diff changeset
656 continue
ad38b96c88f9 convert/svn: refactor svn_source.latest() with a nested function
Patrick Mezard <patrick@mezard.eu>
parents: 16464
diff changeset
657 newpath = paths[p].copyfrom_path + path[len(p):]
ad38b96c88f9 convert/svn: refactor svn_source.latest() with a nested function
Patrick Mezard <patrick@mezard.eu>
parents: 16464
diff changeset
658 self.ui.debug("branch renamed from %s to %s at %d\n" %
ad38b96c88f9 convert/svn: refactor svn_source.latest() with a nested function
Patrick Mezard <patrick@mezard.eu>
parents: 16464
diff changeset
659 (path, newpath, revnum))
ad38b96c88f9 convert/svn: refactor svn_source.latest() with a nested function
Patrick Mezard <patrick@mezard.eu>
parents: 16464
diff changeset
660 path = newpath
ad38b96c88f9 convert/svn: refactor svn_source.latest() with a nested function
Patrick Mezard <patrick@mezard.eu>
parents: 16464
diff changeset
661 break
16466
c53a49c345e1 convert/svn: do not try converting empty head revisions (issue3347)
Patrick Mezard <patrick@mezard.eu>
parents: 16465
diff changeset
662 if not paths:
c53a49c345e1 convert/svn: do not try converting empty head revisions (issue3347)
Patrick Mezard <patrick@mezard.eu>
parents: 16465
diff changeset
663 revnum = None
16465
ad38b96c88f9 convert/svn: refactor svn_source.latest() with a nested function
Patrick Mezard <patrick@mezard.eu>
parents: 16464
diff changeset
664 return revnum, path
ad38b96c88f9 convert/svn: refactor svn_source.latest() with a nested function
Patrick Mezard <patrick@mezard.eu>
parents: 16464
diff changeset
665 finally:
ad38b96c88f9 convert/svn: refactor svn_source.latest() with a nested function
Patrick Mezard <patrick@mezard.eu>
parents: 16464
diff changeset
666 stream.close()
ad38b96c88f9 convert/svn: refactor svn_source.latest() with a nested function
Patrick Mezard <patrick@mezard.eu>
parents: 16464
diff changeset
667
6281
3e5f99b13998 convert: avoid querying log of foreign svn branches
Patrick Mezard <pmezard@gmail.com>
parents: 6214
diff changeset
668 if not path.startswith(self.rootmodule):
3e5f99b13998 convert: avoid querying log of foreign svn branches
Patrick Mezard <pmezard@gmail.com>
parents: 6214
diff changeset
669 # Requests on foreign branches may be forbidden at server level
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9312
diff changeset
670 self.ui.debug('ignoring foreign branch %r\n' % path)
6281
3e5f99b13998 convert: avoid querying log of foreign svn branches
Patrick Mezard <pmezard@gmail.com>
parents: 6214
diff changeset
671 return None
3e5f99b13998 convert: avoid querying log of foreign svn branches
Patrick Mezard <pmezard@gmail.com>
parents: 6214
diff changeset
672
16464
0e1329d905df convert/svn: clarify svn_source.latest() stop arg default value
Patrick Mezard <patrick@mezard.eu>
parents: 16162
diff changeset
673 if stop is None:
4789
c5dd8e184279 convert: svn: add function to get the latest revision touching a path
Brendan Cully <brendan@kublai.com>
parents: 4788
diff changeset
674 stop = svn.ra.get_latest_revnum(self.ra)
c5dd8e184279 convert: svn: add function to get the latest revision touching a path
Brendan Cully <brendan@kublai.com>
parents: 4788
diff changeset
675 try:
6847
9d6d1fdb7d72 convert: restore previous svn transport parent correctly
Patrick Mezard <pmezard@gmail.com>
parents: 6553
diff changeset
676 prevmodule = self.reparent('')
4789
c5dd8e184279 convert: svn: add function to get the latest revision touching a path
Brendan Cully <brendan@kublai.com>
parents: 4788
diff changeset
677 dirent = svn.ra.stat(self.ra, path.strip('/'), stop)
6847
9d6d1fdb7d72 convert: restore previous svn transport parent correctly
Patrick Mezard <pmezard@gmail.com>
parents: 6553
diff changeset
678 self.reparent(prevmodule)
4789
c5dd8e184279 convert: svn: add function to get the latest revision touching a path
Brendan Cully <brendan@kublai.com>
parents: 4788
diff changeset
679 except SubversionException:
c5dd8e184279 convert: svn: add function to get the latest revision touching a path
Brendan Cully <brendan@kublai.com>
parents: 4788
diff changeset
680 dirent = None
c5dd8e184279 convert: svn: add function to get the latest revision touching a path
Brendan Cully <brendan@kublai.com>
parents: 4788
diff changeset
681 if not dirent:
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10071
diff changeset
682 raise SvnPathNotFound(_('%s not found up to revision %d')
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10071
diff changeset
683 % (path, stop))
4789
c5dd8e184279 convert: svn: add function to get the latest revision touching a path
Brendan Cully <brendan@kublai.com>
parents: 4788
diff changeset
684
8660
b9ec04eb2aa3 convert/subversion: wrap long lines in comments
Martin Geisler <mg@lazybytes.net>
parents: 8339
diff changeset
685 # stat() gives us the previous revision on this line of
b9ec04eb2aa3 convert/subversion: wrap long lines in comments
Martin Geisler <mg@lazybytes.net>
parents: 8339
diff changeset
686 # development, but it might be in *another module*. Fetch the
b9ec04eb2aa3 convert/subversion: wrap long lines in comments
Martin Geisler <mg@lazybytes.net>
parents: 8339
diff changeset
687 # log and detect renames down to the latest revision.
16465
ad38b96c88f9 convert/svn: refactor svn_source.latest() with a nested function
Patrick Mezard <patrick@mezard.eu>
parents: 16464
diff changeset
688 revnum, realpath = findchanges(path, stop, dirent.created_rev)
16466
c53a49c345e1 convert/svn: do not try converting empty head revisions (issue3347)
Patrick Mezard <patrick@mezard.eu>
parents: 16465
diff changeset
689 if revnum is None:
c53a49c345e1 convert/svn: do not try converting empty head revisions (issue3347)
Patrick Mezard <patrick@mezard.eu>
parents: 16465
diff changeset
690 # Tools like svnsync can create empty revision, when
c53a49c345e1 convert/svn: do not try converting empty head revisions (issue3347)
Patrick Mezard <patrick@mezard.eu>
parents: 16465
diff changeset
691 # synchronizing only a subtree for instance. These empty
c53a49c345e1 convert/svn: do not try converting empty head revisions (issue3347)
Patrick Mezard <patrick@mezard.eu>
parents: 16465
diff changeset
692 # revisions created_rev still have their original values
c53a49c345e1 convert/svn: do not try converting empty head revisions (issue3347)
Patrick Mezard <patrick@mezard.eu>
parents: 16465
diff changeset
693 # despite all changes having disappeared and can be
c53a49c345e1 convert/svn: do not try converting empty head revisions (issue3347)
Patrick Mezard <patrick@mezard.eu>
parents: 16465
diff changeset
694 # returned by ra.stat(), at least when stating the root
c53a49c345e1 convert/svn: do not try converting empty head revisions (issue3347)
Patrick Mezard <patrick@mezard.eu>
parents: 16465
diff changeset
695 # module. In that case, do not trust created_rev and scan
c53a49c345e1 convert/svn: do not try converting empty head revisions (issue3347)
Patrick Mezard <patrick@mezard.eu>
parents: 16465
diff changeset
696 # the whole history.
c53a49c345e1 convert/svn: do not try converting empty head revisions (issue3347)
Patrick Mezard <patrick@mezard.eu>
parents: 16465
diff changeset
697 revnum, realpath = findchanges(path, stop)
c53a49c345e1 convert/svn: do not try converting empty head revisions (issue3347)
Patrick Mezard <patrick@mezard.eu>
parents: 16465
diff changeset
698 if revnum is None:
c53a49c345e1 convert/svn: do not try converting empty head revisions (issue3347)
Patrick Mezard <patrick@mezard.eu>
parents: 16465
diff changeset
699 self.ui.debug('ignoring empty branch %r\n' % realpath)
c53a49c345e1 convert/svn: do not try converting empty head revisions (issue3347)
Patrick Mezard <patrick@mezard.eu>
parents: 16465
diff changeset
700 return None
c53a49c345e1 convert/svn: do not try converting empty head revisions (issue3347)
Patrick Mezard <patrick@mezard.eu>
parents: 16465
diff changeset
701
16465
ad38b96c88f9 convert/svn: refactor svn_source.latest() with a nested function
Patrick Mezard <patrick@mezard.eu>
parents: 16464
diff changeset
702 if not realpath.startswith(self.rootmodule):
ad38b96c88f9 convert/svn: refactor svn_source.latest() with a nested function
Patrick Mezard <patrick@mezard.eu>
parents: 16464
diff changeset
703 self.ui.debug('ignoring foreign branch %r\n' % realpath)
5957
971a17af5982 convert: prevent svn branches to leave the root module tree
Patrick Mezard <pmezard@gmail.com>
parents: 5956
diff changeset
704 return None
16465
ad38b96c88f9 convert/svn: refactor svn_source.latest() with a nested function
Patrick Mezard <patrick@mezard.eu>
parents: 16464
diff changeset
705 return self.revid(revnum, realpath)
4789
c5dd8e184279 convert: svn: add function to get the latest revision touching a path
Brendan Cully <brendan@kublai.com>
parents: 4788
diff changeset
706
4765
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents:
diff changeset
707 def reparent(self, module):
6847
9d6d1fdb7d72 convert: restore previous svn transport parent correctly
Patrick Mezard <pmezard@gmail.com>
parents: 6553
diff changeset
708 """Reparent the svn transport and return the previous parent."""
9d6d1fdb7d72 convert: restore previous svn transport parent correctly
Patrick Mezard <pmezard@gmail.com>
parents: 6553
diff changeset
709 if self.prevmodule == module:
9d6d1fdb7d72 convert: restore previous svn transport parent correctly
Patrick Mezard <pmezard@gmail.com>
parents: 6553
diff changeset
710 return module
15599
c6be93a4c378 convert/svn: fix URL quoting issue with svn 1.7
Patrick Mezard <pmezard@gmail.com>
parents: 15381
diff changeset
711 svnurl = self.baseurl + quote(module)
6847
9d6d1fdb7d72 convert: restore previous svn transport parent correctly
Patrick Mezard <pmezard@gmail.com>
parents: 6553
diff changeset
712 prevmodule = self.prevmodule
9d6d1fdb7d72 convert: restore previous svn transport parent correctly
Patrick Mezard <pmezard@gmail.com>
parents: 6553
diff changeset
713 if prevmodule is None:
9d6d1fdb7d72 convert: restore previous svn transport parent correctly
Patrick Mezard <pmezard@gmail.com>
parents: 6553
diff changeset
714 prevmodule = ''
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9312
diff changeset
715 self.ui.debug("reparent to %s\n" % svnurl)
7074
b1a4f67b98d0 convert: properly encode subversion URLs (issue 1224)
Patrick Mezard <pmezard@gmail.com>
parents: 6877
diff changeset
716 svn.ra.reparent(self.ra, svnurl)
6847
9d6d1fdb7d72 convert: restore previous svn transport parent correctly
Patrick Mezard <pmezard@gmail.com>
parents: 6553
diff changeset
717 self.prevmodule = module
9d6d1fdb7d72 convert: restore previous svn transport parent correctly
Patrick Mezard <pmezard@gmail.com>
parents: 6553
diff changeset
718 return prevmodule
4765
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents:
diff changeset
719
5120
514c06098e9c convert: svn: pull up path to file expansion code into separate function.
Brendan Cully <brendan@kublai.com>
parents: 5119
diff changeset
720 def expandpaths(self, rev, paths, parents):
11127
ab575114ddd8 convert/svn: do not retrieve removed files
Patrick Mezard <pmezard@gmail.com>
parents: 11126
diff changeset
721 changed, removed = set(), set()
5120
514c06098e9c convert: svn: pull up path to file expansion code into separate function.
Brendan Cully <brendan@kublai.com>
parents: 5119
diff changeset
722 copies = {}
514c06098e9c convert: svn: pull up path to file expansion code into separate function.
Brendan Cully <brendan@kublai.com>
parents: 5119
diff changeset
723
13690
af331f557942 convert/svn: extract revsplit() in a function
Patrick Mezard <pmezard@gmail.com>
parents: 13653
diff changeset
724 new_module, revnum = revsplit(rev)[1:]
5872
7d4149cccc5d convert: fix cross-branches subversion revisions handling
Patrick Mezard <pmezard@gmail.com>
parents: 5871
diff changeset
725 if new_module != self.module:
7d4149cccc5d convert: fix cross-branches subversion revisions handling
Patrick Mezard <pmezard@gmail.com>
parents: 5871
diff changeset
726 self.module = new_module
7d4149cccc5d convert: fix cross-branches subversion revisions handling
Patrick Mezard <pmezard@gmail.com>
parents: 5871
diff changeset
727 self.reparent(self.module)
5121
ef338e34a906 convert: look up copies in getchanges instead of getcommit
Brendan Cully <brendan@kublai.com>
parents: 5120
diff changeset
728
11137
94afe7bc87a9 convert/svn: report path discovery progress
Patrick Mezard <pmezard@gmail.com>
parents: 11134
diff changeset
729 for i, (path, ent) in enumerate(paths):
94afe7bc87a9 convert/svn: report path discovery progress
Patrick Mezard <pmezard@gmail.com>
parents: 11134
diff changeset
730 self.ui.progress(_('scanning paths'), i, item=path,
94afe7bc87a9 convert/svn: report path discovery progress
Patrick Mezard <pmezard@gmail.com>
parents: 11134
diff changeset
731 total=len(paths))
6539
7814d7bb77bc convert: rename get_entry_from_path() into an svn_source method
Patrick Mezard <pmezard@gmail.com>
parents: 6538
diff changeset
732 entrypath = self.getrelpath(path)
5120
514c06098e9c convert: svn: pull up path to file expansion code into separate function.
Brendan Cully <brendan@kublai.com>
parents: 5119
diff changeset
733
6848
59c40c60d8d8 convert: remove leading slash from ra.check_path inputs (issue 1236)
Patrick Mezard <pmezard@gmail.com>
parents: 6847
diff changeset
734 kind = self._checkpath(entrypath, revnum)
5120
514c06098e9c convert: svn: pull up path to file expansion code into separate function.
Brendan Cully <brendan@kublai.com>
parents: 5119
diff changeset
735 if kind == svn.core.svn_node_file:
11127
ab575114ddd8 convert/svn: do not retrieve removed files
Patrick Mezard <pmezard@gmail.com>
parents: 11126
diff changeset
736 changed.add(self.recode(entrypath))
6546
075b2c9aed37 convert: fix svn file copy detection code
Patrick Mezard <pmezard@gmail.com>
parents: 6545
diff changeset
737 if not ent.copyfrom_path or not parents:
6544
3447c088a516 convert: cleanup svn file copy handling
Patrick Mezard <pmezard@gmail.com>
parents: 6543
diff changeset
738 continue
8660
b9ec04eb2aa3 convert/subversion: wrap long lines in comments
Martin Geisler <mg@lazybytes.net>
parents: 8339
diff changeset
739 # Copy sources not in parent revisions cannot be
b9ec04eb2aa3 convert/subversion: wrap long lines in comments
Martin Geisler <mg@lazybytes.net>
parents: 8339
diff changeset
740 # represented, ignore their origin for now
13690
af331f557942 convert/svn: extract revsplit() in a function
Patrick Mezard <pmezard@gmail.com>
parents: 13653
diff changeset
741 pmodule, prevnum = revsplit(parents[0])[1:]
6546
075b2c9aed37 convert: fix svn file copy detection code
Patrick Mezard <pmezard@gmail.com>
parents: 6545
diff changeset
742 if ent.copyfrom_rev < prevnum:
075b2c9aed37 convert: fix svn file copy detection code
Patrick Mezard <pmezard@gmail.com>
parents: 6545
diff changeset
743 continue
075b2c9aed37 convert: fix svn file copy detection code
Patrick Mezard <pmezard@gmail.com>
parents: 6545
diff changeset
744 copyfrom_path = self.getrelpath(ent.copyfrom_path, pmodule)
6544
3447c088a516 convert: cleanup svn file copy handling
Patrick Mezard <pmezard@gmail.com>
parents: 6543
diff changeset
745 if not copyfrom_path:
3447c088a516 convert: cleanup svn file copy handling
Patrick Mezard <pmezard@gmail.com>
parents: 6543
diff changeset
746 continue
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9312
diff changeset
747 self.ui.debug("copied to %s from %s@%s\n" %
6544
3447c088a516 convert: cleanup svn file copy handling
Patrick Mezard <pmezard@gmail.com>
parents: 6543
diff changeset
748 (entrypath, copyfrom_path, ent.copyfrom_rev))
8885
2c184bd2b37a convert/svn: remove confusing unicode variable
Patrick Mezard <pmezard@gmail.com>
parents: 8884
diff changeset
749 copies[self.recode(entrypath)] = self.recode(copyfrom_path)
5120
514c06098e9c convert: svn: pull up path to file expansion code into separate function.
Brendan Cully <brendan@kublai.com>
parents: 5119
diff changeset
750 elif kind == 0: # gone, but had better be a deleted *file*
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9312
diff changeset
751 self.ui.debug("gone from %s\n" % ent.copyfrom_rev)
13690
af331f557942 convert/svn: extract revsplit() in a function
Patrick Mezard <pmezard@gmail.com>
parents: 13653
diff changeset
752 pmodule, prevnum = revsplit(parents[0])[1:]
8884
8b603c7c808e convert/svn: remove dead code from entry deletion code path
Patrick Mezard <pmezard@gmail.com>
parents: 8883
diff changeset
753 parentpath = pmodule + "/" + entrypath
11128
a9b427b5821e convert/svn: handle files/links replaced by dirs (issue2166)
Patrick Mezard <pmezard@gmail.com>
parents: 11127
diff changeset
754 fromkind = self._checkpath(entrypath, prevnum, pmodule)
6210
942287cb1f57 Removed trailing spaces from everything except test output
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6173
diff changeset
755
8881
76d3cd914c5e convert/svn: remove dead code and obsolete comments
Patrick Mezard <pmezard@gmail.com>
parents: 8843
diff changeset
756 if fromkind == svn.core.svn_node_file:
11127
ab575114ddd8 convert/svn: do not retrieve removed files
Patrick Mezard <pmezard@gmail.com>
parents: 11126
diff changeset
757 removed.add(self.recode(entrypath))
5120
514c06098e9c convert: svn: pull up path to file expansion code into separate function.
Brendan Cully <brendan@kublai.com>
parents: 5119
diff changeset
758 elif fromkind == svn.core.svn_node_dir:
11123
8dd69bee71da convert/svn: tree conflicts no longer happen now we use memctx
Patrick Mezard <pmezard@gmail.com>
parents: 10940
diff changeset
759 oroot = parentpath.strip('/')
8dd69bee71da convert/svn: tree conflicts no longer happen now we use memctx
Patrick Mezard <pmezard@gmail.com>
parents: 10940
diff changeset
760 nroot = path.strip('/')
11133
d7b6aab612b4 convert/svn: remove useless sort
Patrick Mezard <pmezard@gmail.com>
parents: 11132
diff changeset
761 children = self._iterfiles(oroot, prevnum)
11132
321b8b2aa20f convert/svn: list files explicitely, stop checking their type
Patrick Mezard <pmezard@gmail.com>
parents: 11130
diff changeset
762 for childpath in children:
321b8b2aa20f convert/svn: list files explicitely, stop checking their type
Patrick Mezard <pmezard@gmail.com>
parents: 11130
diff changeset
763 childpath = childpath.replace(oroot, nroot)
321b8b2aa20f convert/svn: list files explicitely, stop checking their type
Patrick Mezard <pmezard@gmail.com>
parents: 11130
diff changeset
764 childpath = self.getrelpath("/" + childpath, pmodule)
11125
7a5a98fc38e9 convert/svn: remove broken but unused copy filtering code
Patrick Mezard <pmezard@gmail.com>
parents: 11123
diff changeset
765 if childpath:
11127
ab575114ddd8 convert/svn: do not retrieve removed files
Patrick Mezard <pmezard@gmail.com>
parents: 11126
diff changeset
766 removed.add(self.recode(childpath))
5120
514c06098e9c convert: svn: pull up path to file expansion code into separate function.
Brendan Cully <brendan@kublai.com>
parents: 5119
diff changeset
767 else:
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9312
diff changeset
768 self.ui.debug('unknown path in revision %d: %s\n' % \
5120
514c06098e9c convert: svn: pull up path to file expansion code into separate function.
Brendan Cully <brendan@kublai.com>
parents: 5119
diff changeset
769 (revnum, path))
12770
614f0d8724ab check-code: find trailing whitespace
Martin Geisler <mg@lazybytes.net>
parents: 12343
diff changeset
770 elif kind == svn.core.svn_node_dir:
5870
0d583ade5817 convert: don't scan directories on property changes
Patrick Mezard <pmezard@gmail.com>
parents: 5854
diff changeset
771 if ent.action == 'M':
11128
a9b427b5821e convert/svn: handle files/links replaced by dirs (issue2166)
Patrick Mezard <pmezard@gmail.com>
parents: 11127
diff changeset
772 # If the directory just had a prop change,
a9b427b5821e convert/svn: handle files/links replaced by dirs (issue2166)
Patrick Mezard <pmezard@gmail.com>
parents: 11127
diff changeset
773 # then we shouldn't need to look for its children.
5870
0d583ade5817 convert: don't scan directories on property changes
Patrick Mezard <pmezard@gmail.com>
parents: 5854
diff changeset
774 continue
13052
5fb924ee44d5 convert/svn: fix changed files list upon directory replacements
Patrick Mezard <pmezard@gmail.com>
parents: 12770
diff changeset
775 if ent.action == 'R' and parents:
11128
a9b427b5821e convert/svn: handle files/links replaced by dirs (issue2166)
Patrick Mezard <pmezard@gmail.com>
parents: 11127
diff changeset
776 # If a directory is replacing a file, mark the previous
a9b427b5821e convert/svn: handle files/links replaced by dirs (issue2166)
Patrick Mezard <pmezard@gmail.com>
parents: 11127
diff changeset
777 # file as deleted
13690
af331f557942 convert/svn: extract revsplit() in a function
Patrick Mezard <pmezard@gmail.com>
parents: 13653
diff changeset
778 pmodule, prevnum = revsplit(parents[0])[1:]
11128
a9b427b5821e convert/svn: handle files/links replaced by dirs (issue2166)
Patrick Mezard <pmezard@gmail.com>
parents: 11127
diff changeset
779 pkind = self._checkpath(entrypath, prevnum, pmodule)
a9b427b5821e convert/svn: handle files/links replaced by dirs (issue2166)
Patrick Mezard <pmezard@gmail.com>
parents: 11127
diff changeset
780 if pkind == svn.core.svn_node_file:
a9b427b5821e convert/svn: handle files/links replaced by dirs (issue2166)
Patrick Mezard <pmezard@gmail.com>
parents: 11127
diff changeset
781 removed.add(self.recode(entrypath))
13052
5fb924ee44d5 convert/svn: fix changed files list upon directory replacements
Patrick Mezard <pmezard@gmail.com>
parents: 12770
diff changeset
782 elif pkind == svn.core.svn_node_dir:
5fb924ee44d5 convert/svn: fix changed files list upon directory replacements
Patrick Mezard <pmezard@gmail.com>
parents: 12770
diff changeset
783 # We do not know what files were kept or removed,
5fb924ee44d5 convert/svn: fix changed files list upon directory replacements
Patrick Mezard <pmezard@gmail.com>
parents: 12770
diff changeset
784 # mark them all as changed.
5fb924ee44d5 convert/svn: fix changed files list upon directory replacements
Patrick Mezard <pmezard@gmail.com>
parents: 12770
diff changeset
785 for childpath in self._iterfiles(pmodule, prevnum):
5fb924ee44d5 convert/svn: fix changed files list upon directory replacements
Patrick Mezard <pmezard@gmail.com>
parents: 12770
diff changeset
786 childpath = self.getrelpath("/" + childpath)
5fb924ee44d5 convert/svn: fix changed files list upon directory replacements
Patrick Mezard <pmezard@gmail.com>
parents: 12770
diff changeset
787 if childpath:
5fb924ee44d5 convert/svn: fix changed files list upon directory replacements
Patrick Mezard <pmezard@gmail.com>
parents: 12770
diff changeset
788 changed.add(self.recode(childpath))
5870
0d583ade5817 convert: don't scan directories on property changes
Patrick Mezard <pmezard@gmail.com>
parents: 5854
diff changeset
789
11133
d7b6aab612b4 convert/svn: remove useless sort
Patrick Mezard <pmezard@gmail.com>
parents: 11132
diff changeset
790 for childpath in self._iterfiles(path, revnum):
11132
321b8b2aa20f convert/svn: list files explicitely, stop checking their type
Patrick Mezard <pmezard@gmail.com>
parents: 11130
diff changeset
791 childpath = self.getrelpath("/" + childpath)
321b8b2aa20f convert/svn: list files explicitely, stop checking their type
Patrick Mezard <pmezard@gmail.com>
parents: 11130
diff changeset
792 if childpath:
321b8b2aa20f convert/svn: list files explicitely, stop checking their type
Patrick Mezard <pmezard@gmail.com>
parents: 11130
diff changeset
793 changed.add(self.recode(childpath))
5120
514c06098e9c convert: svn: pull up path to file expansion code into separate function.
Brendan Cully <brendan@kublai.com>
parents: 5119
diff changeset
794
8881
76d3cd914c5e convert/svn: remove dead code and obsolete comments
Patrick Mezard <pmezard@gmail.com>
parents: 8843
diff changeset
795 # Handle directory copies
6543
a6e2e60b34d0 convert: handle past or foreign partial svn copies
Patrick Mezard <pmezard@gmail.com>
parents: 6542
diff changeset
796 if not ent.copyfrom_path or not parents:
6542
e7810e61f7c1 convert: more cleanup in svn directory copy handling
Patrick Mezard <pmezard@gmail.com>
parents: 6541
diff changeset
797 continue
8660
b9ec04eb2aa3 convert/subversion: wrap long lines in comments
Martin Geisler <mg@lazybytes.net>
parents: 8339
diff changeset
798 # Copy sources not in parent revisions cannot be
b9ec04eb2aa3 convert/subversion: wrap long lines in comments
Martin Geisler <mg@lazybytes.net>
parents: 8339
diff changeset
799 # represented, ignore their origin for now
13690
af331f557942 convert/svn: extract revsplit() in a function
Patrick Mezard <pmezard@gmail.com>
parents: 13653
diff changeset
800 pmodule, prevnum = revsplit(parents[0])[1:]
6543
a6e2e60b34d0 convert: handle past or foreign partial svn copies
Patrick Mezard <pmezard@gmail.com>
parents: 6542
diff changeset
801 if ent.copyfrom_rev < prevnum:
a6e2e60b34d0 convert: handle past or foreign partial svn copies
Patrick Mezard <pmezard@gmail.com>
parents: 6542
diff changeset
802 continue
8882
48a04961b0dd convert/svn: remove useless encoding/decoding calls (issue1676)
Patrick Mezard <pmezard@gmail.com>
parents: 8881
diff changeset
803 copyfrompath = self.getrelpath(ent.copyfrom_path, pmodule)
6542
e7810e61f7c1 convert: more cleanup in svn directory copy handling
Patrick Mezard <pmezard@gmail.com>
parents: 6541
diff changeset
804 if not copyfrompath:
e7810e61f7c1 convert: more cleanup in svn directory copy handling
Patrick Mezard <pmezard@gmail.com>
parents: 6541
diff changeset
805 continue
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9312
diff changeset
806 self.ui.debug("mark %s came from %s:%d\n"
6542
e7810e61f7c1 convert: more cleanup in svn directory copy handling
Patrick Mezard <pmezard@gmail.com>
parents: 6541
diff changeset
807 % (path, copyfrompath, ent.copyfrom_rev))
11133
d7b6aab612b4 convert/svn: remove useless sort
Patrick Mezard <pmezard@gmail.com>
parents: 11132
diff changeset
808 children = self._iterfiles(ent.copyfrom_path, ent.copyfrom_rev)
11132
321b8b2aa20f convert/svn: list files explicitely, stop checking their type
Patrick Mezard <pmezard@gmail.com>
parents: 11130
diff changeset
809 for childpath in children:
321b8b2aa20f convert/svn: list files explicitely, stop checking their type
Patrick Mezard <pmezard@gmail.com>
parents: 11130
diff changeset
810 childpath = self.getrelpath("/" + childpath, pmodule)
321b8b2aa20f convert/svn: list files explicitely, stop checking their type
Patrick Mezard <pmezard@gmail.com>
parents: 11130
diff changeset
811 if not childpath:
6542
e7810e61f7c1 convert: more cleanup in svn directory copy handling
Patrick Mezard <pmezard@gmail.com>
parents: 6541
diff changeset
812 continue
11132
321b8b2aa20f convert/svn: list files explicitely, stop checking their type
Patrick Mezard <pmezard@gmail.com>
parents: 11130
diff changeset
813 copytopath = path + childpath[len(copyfrompath):]
6542
e7810e61f7c1 convert: more cleanup in svn directory copy handling
Patrick Mezard <pmezard@gmail.com>
parents: 6541
diff changeset
814 copytopath = self.getrelpath(copytopath)
11132
321b8b2aa20f convert/svn: list files explicitely, stop checking their type
Patrick Mezard <pmezard@gmail.com>
parents: 11130
diff changeset
815 copies[self.recode(copytopath)] = self.recode(childpath)
5120
514c06098e9c convert: svn: pull up path to file expansion code into separate function.
Brendan Cully <brendan@kublai.com>
parents: 5119
diff changeset
816
11137
94afe7bc87a9 convert/svn: report path discovery progress
Patrick Mezard <pmezard@gmail.com>
parents: 11134
diff changeset
817 self.ui.progress(_('scanning paths'), None)
11127
ab575114ddd8 convert/svn: do not retrieve removed files
Patrick Mezard <pmezard@gmail.com>
parents: 11126
diff changeset
818 changed.update(removed)
ab575114ddd8 convert/svn: do not retrieve removed files
Patrick Mezard <pmezard@gmail.com>
parents: 11126
diff changeset
819 return (list(changed), removed, copies)
5120
514c06098e9c convert: svn: pull up path to file expansion code into separate function.
Brendan Cully <brendan@kublai.com>
parents: 5119
diff changeset
820
5871
c1244685425a convert: fix parents of last fetched svn revision
Patrick Mezard <pmezard@gmail.com>
parents: 5870
diff changeset
821 def _fetch_revisions(self, from_revnum, to_revnum):
c1244685425a convert: fix parents of last fetched svn revision
Patrick Mezard <pmezard@gmail.com>
parents: 5870
diff changeset
822 if from_revnum < to_revnum:
c1244685425a convert: fix parents of last fetched svn revision
Patrick Mezard <pmezard@gmail.com>
parents: 5870
diff changeset
823 from_revnum, to_revnum = to_revnum, from_revnum
c1244685425a convert: fix parents of last fetched svn revision
Patrick Mezard <pmezard@gmail.com>
parents: 5870
diff changeset
824
4940
961379b2c586 convert/subversion: reduce memory usage by filtering early
Bryan O'Sullivan <bos@serpentine.com>
parents: 4927
diff changeset
825 self.child_cset = None
6545
a7492fb2107b convert: fix svn branch source detection corner case
Patrick Mezard <pmezard@gmail.com>
parents: 6544
diff changeset
826
4946
e8f4e40f285a convert/subversion: work around memory leak in svn's python bindings
Bryan O'Sullivan <bos@serpentine.com>
parents: 4944
diff changeset
827 def parselogentry(orig_paths, revnum, author, date, message):
6210
942287cb1f57 Removed trailing spaces from everything except test output
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6173
diff changeset
828 """Return the parsed commit object or None, and True if
5872
7d4149cccc5d convert: fix cross-branches subversion revisions handling
Patrick Mezard <pmezard@gmail.com>
parents: 5871
diff changeset
829 the revision is a branch root.
7d4149cccc5d convert: fix cross-branches subversion revisions handling
Patrick Mezard <pmezard@gmail.com>
parents: 5871
diff changeset
830 """
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9312
diff changeset
831 self.ui.debug("parsing revision %d (%d changes)\n" %
4946
e8f4e40f285a convert/subversion: work around memory leak in svn's python bindings
Bryan O'Sullivan <bos@serpentine.com>
parents: 4944
diff changeset
832 (revnum, len(orig_paths)))
4940
961379b2c586 convert/subversion: reduce memory usage by filtering early
Bryan O'Sullivan <bos@serpentine.com>
parents: 4927
diff changeset
833
5957
971a17af5982 convert: prevent svn branches to leave the root module tree
Patrick Mezard <pmezard@gmail.com>
parents: 5956
diff changeset
834 branched = False
4810
c2d529f288a1 convert: move some code into common init function
Brendan Cully <brendan@kublai.com>
parents: 4807
diff changeset
835 rev = self.revid(revnum)
4837
4cdbaa885d8a convert: svn: some improvements in memory usage
Brendan Cully <brendan@kublai.com>
parents: 4814
diff changeset
836 # branch log might return entries for a parent we already have
5871
c1244685425a convert: fix parents of last fetched svn revision
Patrick Mezard <pmezard@gmail.com>
parents: 5870
diff changeset
837
8117
2b30d8488819 remove unnecessary outer parenthesis in if-statements
Martin Geisler <mg@lazybytes.net>
parents: 8086
diff changeset
838 if rev in self.commits or revnum < to_revnum:
5957
971a17af5982 convert: prevent svn branches to leave the root module tree
Patrick Mezard <pmezard@gmail.com>
parents: 5956
diff changeset
839 return None, branched
4837
4cdbaa885d8a convert: svn: some improvements in memory usage
Brendan Cully <brendan@kublai.com>
parents: 4814
diff changeset
840
5120
514c06098e9c convert: svn: pull up path to file expansion code into separate function.
Brendan Cully <brendan@kublai.com>
parents: 5119
diff changeset
841 parents = []
5958
59dce24933ad convert: follow svn module parent moves
Patrick Mezard <pmezard@gmail.com>
parents: 5957
diff changeset
842 # check whether this revision is the start of a branch or part
59dce24933ad convert: follow svn module parent moves
Patrick Mezard <pmezard@gmail.com>
parents: 5957
diff changeset
843 # of a branch renaming
8209
a1a5a57efe90 replace util.sort with sorted built-in
Matt Mackall <mpm@selenic.com>
parents: 8206
diff changeset
844 orig_paths = sorted(orig_paths.iteritems())
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10071
diff changeset
845 root_paths = [(p, e) for p, e in orig_paths
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10071
diff changeset
846 if self.module.startswith(p)]
5958
59dce24933ad convert: follow svn module parent moves
Patrick Mezard <pmezard@gmail.com>
parents: 5957
diff changeset
847 if root_paths:
59dce24933ad convert: follow svn module parent moves
Patrick Mezard <pmezard@gmail.com>
parents: 5957
diff changeset
848 path, ent = root_paths[-1]
5119
4cef0b93969d convert: svn: hoist up branch creation check
Brendan Cully <brendan@kublai.com>
parents: 5118
diff changeset
849 if ent.copyfrom_path:
5957
971a17af5982 convert: prevent svn branches to leave the root module tree
Patrick Mezard <pmezard@gmail.com>
parents: 5956
diff changeset
850 branched = True
5958
59dce24933ad convert: follow svn module parent moves
Patrick Mezard <pmezard@gmail.com>
parents: 5957
diff changeset
851 newpath = ent.copyfrom_path + self.module[len(path):]
5119
4cef0b93969d convert: svn: hoist up branch creation check
Brendan Cully <brendan@kublai.com>
parents: 5118
diff changeset
852 # ent.copyfrom_rev may not be the actual last revision
7476
6644c111f9e9 convert: backout a7492fb2107b
Patrick Mezard <pmezard@gmail.com>
parents: 7447
diff changeset
853 previd = self.latest(newpath, ent.copyfrom_rev)
5957
971a17af5982 convert: prevent svn branches to leave the root module tree
Patrick Mezard <pmezard@gmail.com>
parents: 5956
diff changeset
854 if previd is not None:
13690
af331f557942 convert/svn: extract revsplit() in a function
Patrick Mezard <pmezard@gmail.com>
parents: 13653
diff changeset
855 prevmodule, prevnum = revsplit(previd)[1:]
6173
963000ed8cac convert: add shallow, single branch svn conversions via svn.startrev
Patrick Mezard <pmezard@gmail.com>
parents: 6172
diff changeset
856 if prevnum >= self.startrev:
963000ed8cac convert: add shallow, single branch svn conversions via svn.startrev
Patrick Mezard <pmezard@gmail.com>
parents: 6172
diff changeset
857 parents = [previd]
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10071
diff changeset
858 self.ui.note(
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10071
diff changeset
859 _('found parent of branch %s at %d: %s\n') %
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10071
diff changeset
860 (self.module, prevnum, prevmodule))
5119
4cef0b93969d convert: svn: hoist up branch creation check
Brendan Cully <brendan@kublai.com>
parents: 5118
diff changeset
861 else:
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9312
diff changeset
862 self.ui.debug("no copyfrom path, don't know what to do.\n")
5119
4cef0b93969d convert: svn: hoist up branch creation check
Brendan Cully <brendan@kublai.com>
parents: 5118
diff changeset
863
5120
514c06098e9c convert: svn: pull up path to file expansion code into separate function.
Brendan Cully <brendan@kublai.com>
parents: 5119
diff changeset
864 paths = []
514c06098e9c convert: svn: pull up path to file expansion code into separate function.
Brendan Cully <brendan@kublai.com>
parents: 5119
diff changeset
865 # filter out unrelated paths
4940
961379b2c586 convert/subversion: reduce memory usage by filtering early
Bryan O'Sullivan <bos@serpentine.com>
parents: 4927
diff changeset
866 for path, ent in orig_paths:
6540
55bd855fc0af convert: improve subversion branch filtering
Patrick Mezard <pmezard@gmail.com>
parents: 6539
diff changeset
867 if self.getrelpath(path) is None:
4788
62e1b6412b62 convert: svn: add an early return to move most changeset parsing out an indent level
Brendan Cully <brendan@kublai.com>
parents: 4787
diff changeset
868 continue
5120
514c06098e9c convert: svn: pull up path to file expansion code into separate function.
Brendan Cully <brendan@kublai.com>
parents: 5119
diff changeset
869 paths.append((path, ent))
4765
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents:
diff changeset
870
4788
62e1b6412b62 convert: svn: add an early return to move most changeset parsing out an indent level
Brendan Cully <brendan@kublai.com>
parents: 4787
diff changeset
871 # Example SVN datetime. Includes microseconds.
62e1b6412b62 convert: svn: add an early return to move most changeset parsing out an indent level
Brendan Cully <brendan@kublai.com>
parents: 4787
diff changeset
872 # ISO-8601 conformant
62e1b6412b62 convert: svn: add an early return to move most changeset parsing out an indent level
Brendan Cully <brendan@kublai.com>
parents: 4787
diff changeset
873 # '2007-01-04T17:35:00.902377Z'
5617
924fd86f0579 convert: fix SVN date parser dropping the final whole second digit
David J. Mellor <dmellor@whistlingcat.com>
parents: 5521
diff changeset
874 date = util.parsedate(date[:19] + " UTC", ["%Y-%m-%dT%H:%M:%S"])
17974
337d728e644f convert: add config option to use the local time zone
Julian Cowley <julian@lava.net>
parents: 17537
diff changeset
875 if self.ui.configbool('convert', 'localtimezone'):
337d728e644f convert: add config option to use the local time zone
Julian Cowley <julian@lava.net>
parents: 17537
diff changeset
876 date = makedatetimestamp(date[0])
4765
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents:
diff changeset
877
24306
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 23583
diff changeset
878 if message:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 23583
diff changeset
879 log = self.recode(message)
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 23583
diff changeset
880 else:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 23583
diff changeset
881 log = ''
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 23583
diff changeset
882
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 23583
diff changeset
883 if author:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 23583
diff changeset
884 author = self.recode(author)
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 23583
diff changeset
885 else:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 23583
diff changeset
886 author = ''
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 23583
diff changeset
887
5120
514c06098e9c convert: svn: pull up path to file expansion code into separate function.
Brendan Cully <brendan@kublai.com>
parents: 5119
diff changeset
888 try:
514c06098e9c convert: svn: pull up path to file expansion code into separate function.
Brendan Cully <brendan@kublai.com>
parents: 5119
diff changeset
889 branch = self.module.split("/")[-1]
13529
9b62cbe81f44 convert/svn: read trunk name once, use None for default
Patrick Mezard <pmezard@gmail.com>
parents: 13494
diff changeset
890 if branch == self.trunkname:
9b62cbe81f44 convert/svn: read trunk name once, use None for default
Patrick Mezard <pmezard@gmail.com>
parents: 13494
diff changeset
891 branch = None
5120
514c06098e9c convert: svn: pull up path to file expansion code into separate function.
Brendan Cully <brendan@kublai.com>
parents: 5119
diff changeset
892 except IndexError:
514c06098e9c convert: svn: pull up path to file expansion code into separate function.
Brendan Cully <brendan@kublai.com>
parents: 5119
diff changeset
893 branch = None
4765
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents:
diff changeset
894
4788
62e1b6412b62 convert: svn: add an early return to move most changeset parsing out an indent level
Brendan Cully <brendan@kublai.com>
parents: 4787
diff changeset
895 cset = commit(author=author,
16514
363e808de349 i18n: use locale insensitive format for datetimes as intermediate representation (issue3398)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 16511
diff changeset
896 date=util.datestr(date, '%Y-%m-%d %H:%M:%S %1%2'),
4957
cdd33a048289 removed trailing whitespace
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4949
diff changeset
897 desc=log,
4795
ea618c5934f3 convert: svn: get parent for branch creation events
Brendan Cully <brendan@kublai.com>
parents: 4794
diff changeset
898 parents=parents,
4873
28b23b9073a8 convert: record the source revision in the changelog
Brendan Cully <brendan@kublai.com>
parents: 4848
diff changeset
899 branch=branch,
8886
0593c5b5b1f0 convert/svn: stop returning unicode revision identifiers
Patrick Mezard <pmezard@gmail.com>
parents: 8885
diff changeset
900 rev=rev)
4788
62e1b6412b62 convert: svn: add an early return to move most changeset parsing out an indent level
Brendan Cully <brendan@kublai.com>
parents: 4787
diff changeset
901
4796
26857a6f9dd0 convert: svn: pull out broken batching code, add alpha tags support
Brendan Cully <brendan@kublai.com>
parents: 4795
diff changeset
902 self.commits[rev] = cset
5872
7d4149cccc5d convert: fix cross-branches subversion revisions handling
Patrick Mezard <pmezard@gmail.com>
parents: 5871
diff changeset
903 # The parents list is *shared* among self.paths and the
7d4149cccc5d convert: fix cross-branches subversion revisions handling
Patrick Mezard <pmezard@gmail.com>
parents: 5871
diff changeset
904 # commit object. Both will be updated below.
7d4149cccc5d convert: fix cross-branches subversion revisions handling
Patrick Mezard <pmezard@gmail.com>
parents: 5871
diff changeset
905 self.paths[rev] = (paths, cset.parents)
4796
26857a6f9dd0 convert: svn: pull out broken batching code, add alpha tags support
Brendan Cully <brendan@kublai.com>
parents: 4795
diff changeset
906 if self.child_cset and not self.child_cset.parents:
5872
7d4149cccc5d convert: fix cross-branches subversion revisions handling
Patrick Mezard <pmezard@gmail.com>
parents: 5871
diff changeset
907 self.child_cset.parents[:] = [rev]
4788
62e1b6412b62 convert: svn: add an early return to move most changeset parsing out an indent level
Brendan Cully <brendan@kublai.com>
parents: 4787
diff changeset
908 self.child_cset = cset
5957
971a17af5982 convert: prevent svn branches to leave the root module tree
Patrick Mezard <pmezard@gmail.com>
parents: 5956
diff changeset
909 return cset, branched
4796
26857a6f9dd0 convert: svn: pull out broken batching code, add alpha tags support
Brendan Cully <brendan@kublai.com>
parents: 4795
diff changeset
910
6956
12472a240398 i18n: mark strings for translation in convert extension
Martin Geisler <mg@daimi.au.dk>
parents: 6884
diff changeset
911 self.ui.note(_('fetching revision log for "%s" from %d to %d\n') %
4797
09dae950919f convert: svn: autodetect /branches, /tags, /trunk.
Brendan Cully <brendan@kublai.com>
parents: 4796
diff changeset
912 (self.module, from_revnum, to_revnum))
4765
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents:
diff changeset
913
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents:
diff changeset
914 try:
5871
c1244685425a convert: fix parents of last fetched svn revision
Patrick Mezard <pmezard@gmail.com>
parents: 5870
diff changeset
915 firstcset = None
6173
963000ed8cac convert: add shallow, single branch svn conversions via svn.startrev
Patrick Mezard <pmezard@gmail.com>
parents: 6172
diff changeset
916 lastonbranch = False
6850
c6bb8fae3bd2 convert: normalize paths sent to svn get_log (issue 1219)
Patrick Mezard <pmezard@gmail.com>
parents: 6848
diff changeset
917 stream = self._getlog([self.module], from_revnum, to_revnum)
5873
ecb4eb0cbff2 convert: make svn revision iterator interruptible
Patrick Mezard <pmezard@gmail.com>
parents: 5872
diff changeset
918 try:
ecb4eb0cbff2 convert: make svn revision iterator interruptible
Patrick Mezard <pmezard@gmail.com>
parents: 5872
diff changeset
919 for entry in stream:
ecb4eb0cbff2 convert: make svn revision iterator interruptible
Patrick Mezard <pmezard@gmail.com>
parents: 5872
diff changeset
920 paths, revnum, author, date, message = entry
6173
963000ed8cac convert: add shallow, single branch svn conversions via svn.startrev
Patrick Mezard <pmezard@gmail.com>
parents: 6172
diff changeset
921 if revnum < self.startrev:
963000ed8cac convert: add shallow, single branch svn conversions via svn.startrev
Patrick Mezard <pmezard@gmail.com>
parents: 6172
diff changeset
922 lastonbranch = True
963000ed8cac convert: add shallow, single branch svn conversions via svn.startrev
Patrick Mezard <pmezard@gmail.com>
parents: 6172
diff changeset
923 break
8172
36b935cad495 Fix subversion convert not detecting empty changesets.
Francis Barber <fedora@barber-family.id.au>
parents: 8155
diff changeset
924 if not paths:
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9312
diff changeset
925 self.ui.debug('revision %d has no entries\n' % revnum)
10618
508fda6b8637 convert: handle svn tree with empty roots (issue2079)
Patrick Mezard <pmezard@gmail.com>
parents: 10282
diff changeset
926 # If we ever leave the loop on an empty
508fda6b8637 convert: handle svn tree with empty roots (issue2079)
Patrick Mezard <pmezard@gmail.com>
parents: 10282
diff changeset
927 # revision, do not try to get a parent branch
508fda6b8637 convert: handle svn tree with empty roots (issue2079)
Patrick Mezard <pmezard@gmail.com>
parents: 10282
diff changeset
928 lastonbranch = lastonbranch or revnum == 0
5873
ecb4eb0cbff2 convert: make svn revision iterator interruptible
Patrick Mezard <pmezard@gmail.com>
parents: 5872
diff changeset
929 continue
6210
942287cb1f57 Removed trailing spaces from everything except test output
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6173
diff changeset
930 cset, lastonbranch = parselogentry(paths, revnum, author,
6173
963000ed8cac convert: add shallow, single branch svn conversions via svn.startrev
Patrick Mezard <pmezard@gmail.com>
parents: 6172
diff changeset
931 date, message)
5873
ecb4eb0cbff2 convert: make svn revision iterator interruptible
Patrick Mezard <pmezard@gmail.com>
parents: 5872
diff changeset
932 if cset:
ecb4eb0cbff2 convert: make svn revision iterator interruptible
Patrick Mezard <pmezard@gmail.com>
parents: 5872
diff changeset
933 firstcset = cset
6173
963000ed8cac convert: add shallow, single branch svn conversions via svn.startrev
Patrick Mezard <pmezard@gmail.com>
parents: 6172
diff changeset
934 if lastonbranch:
5873
ecb4eb0cbff2 convert: make svn revision iterator interruptible
Patrick Mezard <pmezard@gmail.com>
parents: 5872
diff changeset
935 break
ecb4eb0cbff2 convert: make svn revision iterator interruptible
Patrick Mezard <pmezard@gmail.com>
parents: 5872
diff changeset
936 finally:
ecb4eb0cbff2 convert: make svn revision iterator interruptible
Patrick Mezard <pmezard@gmail.com>
parents: 5872
diff changeset
937 stream.close()
5871
c1244685425a convert: fix parents of last fetched svn revision
Patrick Mezard <pmezard@gmail.com>
parents: 5870
diff changeset
938
6173
963000ed8cac convert: add shallow, single branch svn conversions via svn.startrev
Patrick Mezard <pmezard@gmail.com>
parents: 6172
diff changeset
939 if not lastonbranch and firstcset and not firstcset.parents:
5871
c1244685425a convert: fix parents of last fetched svn revision
Patrick Mezard <pmezard@gmail.com>
parents: 5870
diff changeset
940 # The first revision of the sequence (the last fetched one)
c1244685425a convert: fix parents of last fetched svn revision
Patrick Mezard <pmezard@gmail.com>
parents: 5870
diff changeset
941 # has invalid parents if not a branch root. Find the parent
c1244685425a convert: fix parents of last fetched svn revision
Patrick Mezard <pmezard@gmail.com>
parents: 5870
diff changeset
942 # revision now, if any.
c1244685425a convert: fix parents of last fetched svn revision
Patrick Mezard <pmezard@gmail.com>
parents: 5870
diff changeset
943 try:
c1244685425a convert: fix parents of last fetched svn revision
Patrick Mezard <pmezard@gmail.com>
parents: 5870
diff changeset
944 firstrevnum = self.revnum(firstcset.rev)
c1244685425a convert: fix parents of last fetched svn revision
Patrick Mezard <pmezard@gmail.com>
parents: 5870
diff changeset
945 if firstrevnum > 1:
c1244685425a convert: fix parents of last fetched svn revision
Patrick Mezard <pmezard@gmail.com>
parents: 5870
diff changeset
946 latest = self.latest(self.module, firstrevnum - 1)
5957
971a17af5982 convert: prevent svn branches to leave the root module tree
Patrick Mezard <pmezard@gmail.com>
parents: 5956
diff changeset
947 if latest:
971a17af5982 convert: prevent svn branches to leave the root module tree
Patrick Mezard <pmezard@gmail.com>
parents: 5956
diff changeset
948 firstcset.parents.append(latest)
7381
b965605dfb2e convert: be even more tolerant when detecting svn tags
Patrick Mezard <pmezard@gmail.com>
parents: 7184
diff changeset
949 except SvnPathNotFound:
5871
c1244685425a convert: fix parents of last fetched svn revision
Patrick Mezard <pmezard@gmail.com>
parents: 5870
diff changeset
950 pass
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24856
diff changeset
951 except SubversionException as xxx_todo_changeme:
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24856
diff changeset
952 (inst, num) = xxx_todo_changeme.args
4765
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents:
diff changeset
953 if num == svn.core.SVN_ERR_FS_NO_SUCH_REVISION:
16683
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16514
diff changeset
954 raise util.Abort(_('svn: branch has no revision %s')
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16514
diff changeset
955 % to_revnum)
4765
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents:
diff changeset
956 raise
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents:
diff changeset
957
11134
33010ff1fd6f convert: merge sources getmode() into getfile()
Patrick Mezard <pmezard@gmail.com>
parents: 11133
diff changeset
958 def getfile(self, file, rev):
4765
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents:
diff changeset
959 # TODO: ra.get_file transmits the whole file instead of diffs.
11127
ab575114ddd8 convert/svn: do not retrieve removed files
Patrick Mezard <pmezard@gmail.com>
parents: 11126
diff changeset
960 if file in self.removed:
22296
650b5b6e75ed convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents: 22201
diff changeset
961 return None, None
4765
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents:
diff changeset
962 mode = ''
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents:
diff changeset
963 try:
13690
af331f557942 convert/svn: extract revsplit() in a function
Patrick Mezard <pmezard@gmail.com>
parents: 13653
diff changeset
964 new_module, revnum = revsplit(rev)[1:]
5872
7d4149cccc5d convert: fix cross-branches subversion revisions handling
Patrick Mezard <pmezard@gmail.com>
parents: 5871
diff changeset
965 if self.module != new_module:
7d4149cccc5d convert: fix cross-branches subversion revisions handling
Patrick Mezard <pmezard@gmail.com>
parents: 5871
diff changeset
966 self.module = new_module
4765
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents:
diff changeset
967 self.reparent(self.module)
7446
2d2e0be762be convert: work around svn.ra.get_files() not releasing input buffer
Patrick Mezard <pmezard@gmail.com>
parents: 7382
diff changeset
968 io = StringIO()
4765
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents:
diff changeset
969 info = svn.ra.get_file(self.ra, file, revnum, io)
7446
2d2e0be762be convert: work around svn.ra.get_files() not releasing input buffer
Patrick Mezard <pmezard@gmail.com>
parents: 7382
diff changeset
970 data = io.getvalue()
17424
e7cfe3587ea4 fix trivial spelling errors
Mads Kiilerich <mads@kiilerich.com>
parents: 17247
diff changeset
971 # ra.get_file() seems to keep a reference on the input buffer
17479
17c3dbf3026f spelling: Explicitly
timeless@mozdev.org
parents: 17247
diff changeset
972 # preventing collection. Release it explicitly.
7446
2d2e0be762be convert: work around svn.ra.get_files() not releasing input buffer
Patrick Mezard <pmezard@gmail.com>
parents: 7382
diff changeset
973 io.close()
4765
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents:
diff changeset
974 if isinstance(info, list):
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents:
diff changeset
975 info = info[-1]
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents:
diff changeset
976 mode = ("svn:executable" in info) and 'x' or ''
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents:
diff changeset
977 mode = ("svn:special" in info) and 'l' or mode
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24856
diff changeset
978 except SubversionException as e:
4765
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents:
diff changeset
979 notfound = (svn.core.SVN_ERR_FS_NOT_FOUND,
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents:
diff changeset
980 svn.core.SVN_ERR_RA_DAV_PATH_NOT_FOUND)
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents:
diff changeset
981 if e.apr_err in notfound: # File not found
22296
650b5b6e75ed convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents: 22201
diff changeset
982 return None, None
4765
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents:
diff changeset
983 raise
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents:
diff changeset
984 if mode == 'l':
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents:
diff changeset
985 link_prefix = "link "
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents:
diff changeset
986 if data.startswith(link_prefix):
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents:
diff changeset
987 data = data[len(link_prefix):]
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents:
diff changeset
988 return data, mode
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents:
diff changeset
989
11133
d7b6aab612b4 convert/svn: remove useless sort
Patrick Mezard <pmezard@gmail.com>
parents: 11132
diff changeset
990 def _iterfiles(self, path, revnum):
d7b6aab612b4 convert/svn: remove useless sort
Patrick Mezard <pmezard@gmail.com>
parents: 11132
diff changeset
991 """Enumerate all files in path at revnum, recursively."""
5114
35f67dd712d0 convert: svn: ensure leading / is removed from paths in _find_children (broken in 2bd996d0aaf8)
Brendan Cully <brendan@kublai.com>
parents: 5050
diff changeset
992 path = path.strip('/')
4765
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents:
diff changeset
993 pool = Pool()
15599
c6be93a4c378 convert/svn: fix URL quoting issue with svn 1.7
Patrick Mezard <pmezard@gmail.com>
parents: 15381
diff changeset
994 rpath = '/'.join([self.baseurl, quote(path)]).strip('/')
11167
b5ef95b5ae14 convert/svn: fix long line
Matt Mackall <mpm@selenic.com>
parents: 11137
diff changeset
995 entries = svn.client.ls(rpath, optrev(revnum), True, self.ctx, pool)
13651
9777df929035 convert/svn: fix _iterfiles() output in root dir case (issue2647)
Patrick Mezard <pmezard@gmail.com>
parents: 13494
diff changeset
996 if path:
9777df929035 convert/svn: fix _iterfiles() output in root dir case (issue2647)
Patrick Mezard <pmezard@gmail.com>
parents: 13494
diff changeset
997 path += '/'
9777df929035 convert/svn: fix _iterfiles() output in root dir case (issue2647)
Patrick Mezard <pmezard@gmail.com>
parents: 13494
diff changeset
998 return ((path + p) for p, e in entries.iteritems()
11133
d7b6aab612b4 convert/svn: remove useless sort
Patrick Mezard <pmezard@gmail.com>
parents: 11132
diff changeset
999 if e.kind == svn.core.svn_node_file)
5513
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1000
6539
7814d7bb77bc convert: rename get_entry_from_path() into an svn_source method
Patrick Mezard <pmezard@gmail.com>
parents: 6538
diff changeset
1001 def getrelpath(self, path, module=None):
7814d7bb77bc convert: rename get_entry_from_path() into an svn_source method
Patrick Mezard <pmezard@gmail.com>
parents: 6538
diff changeset
1002 if module is None:
7814d7bb77bc convert: rename get_entry_from_path() into an svn_source method
Patrick Mezard <pmezard@gmail.com>
parents: 6538
diff changeset
1003 module = self.module
7814d7bb77bc convert: rename get_entry_from_path() into an svn_source method
Patrick Mezard <pmezard@gmail.com>
parents: 6538
diff changeset
1004 # Given the repository url of this wc, say
7814d7bb77bc convert: rename get_entry_from_path() into an svn_source method
Patrick Mezard <pmezard@gmail.com>
parents: 6538
diff changeset
1005 # "http://server/plone/CMFPlone/branches/Plone-2_0-branch"
7814d7bb77bc convert: rename get_entry_from_path() into an svn_source method
Patrick Mezard <pmezard@gmail.com>
parents: 6538
diff changeset
1006 # extract the "entry" portion (a relative path) from what
17424
e7cfe3587ea4 fix trivial spelling errors
Mads Kiilerich <mads@kiilerich.com>
parents: 17247
diff changeset
1007 # svn log --xml says, i.e.
6539
7814d7bb77bc convert: rename get_entry_from_path() into an svn_source method
Patrick Mezard <pmezard@gmail.com>
parents: 6538
diff changeset
1008 # "/CMFPlone/branches/Plone-2_0-branch/tests/PloneTestCase.py"
7814d7bb77bc convert: rename get_entry_from_path() into an svn_source method
Patrick Mezard <pmezard@gmail.com>
parents: 6538
diff changeset
1009 # that is to say "tests/PloneTestCase.py"
7814d7bb77bc convert: rename get_entry_from_path() into an svn_source method
Patrick Mezard <pmezard@gmail.com>
parents: 6538
diff changeset
1010 if path.startswith(module):
7814d7bb77bc convert: rename get_entry_from_path() into an svn_source method
Patrick Mezard <pmezard@gmail.com>
parents: 6538
diff changeset
1011 relative = path.rstrip('/')[len(module):]
7814d7bb77bc convert: rename get_entry_from_path() into an svn_source method
Patrick Mezard <pmezard@gmail.com>
parents: 6538
diff changeset
1012 if relative.startswith('/'):
7814d7bb77bc convert: rename get_entry_from_path() into an svn_source method
Patrick Mezard <pmezard@gmail.com>
parents: 6538
diff changeset
1013 return relative[1:]
7814d7bb77bc convert: rename get_entry_from_path() into an svn_source method
Patrick Mezard <pmezard@gmail.com>
parents: 6538
diff changeset
1014 elif relative == '':
7814d7bb77bc convert: rename get_entry_from_path() into an svn_source method
Patrick Mezard <pmezard@gmail.com>
parents: 6538
diff changeset
1015 return relative
7814d7bb77bc convert: rename get_entry_from_path() into an svn_source method
Patrick Mezard <pmezard@gmail.com>
parents: 6538
diff changeset
1016
7814d7bb77bc convert: rename get_entry_from_path() into an svn_source method
Patrick Mezard <pmezard@gmail.com>
parents: 6538
diff changeset
1017 # The path is outside our tracked tree...
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9312
diff changeset
1018 self.ui.debug('%r is not under %r, ignoring\n' % (path, module))
6539
7814d7bb77bc convert: rename get_entry_from_path() into an svn_source method
Patrick Mezard <pmezard@gmail.com>
parents: 6538
diff changeset
1019 return None
7814d7bb77bc convert: rename get_entry_from_path() into an svn_source method
Patrick Mezard <pmezard@gmail.com>
parents: 6538
diff changeset
1020
11128
a9b427b5821e convert/svn: handle files/links replaced by dirs (issue2166)
Patrick Mezard <pmezard@gmail.com>
parents: 11127
diff changeset
1021 def _checkpath(self, path, revnum, module=None):
a9b427b5821e convert/svn: handle files/links replaced by dirs (issue2166)
Patrick Mezard <pmezard@gmail.com>
parents: 11127
diff changeset
1022 if module is not None:
a9b427b5821e convert/svn: handle files/links replaced by dirs (issue2166)
Patrick Mezard <pmezard@gmail.com>
parents: 11127
diff changeset
1023 prevmodule = self.reparent('')
a9b427b5821e convert/svn: handle files/links replaced by dirs (issue2166)
Patrick Mezard <pmezard@gmail.com>
parents: 11127
diff changeset
1024 path = module + '/' + path
a9b427b5821e convert/svn: handle files/links replaced by dirs (issue2166)
Patrick Mezard <pmezard@gmail.com>
parents: 11127
diff changeset
1025 try:
a9b427b5821e convert/svn: handle files/links replaced by dirs (issue2166)
Patrick Mezard <pmezard@gmail.com>
parents: 11127
diff changeset
1026 # ra.check_path does not like leading slashes very much, it leads
a9b427b5821e convert/svn: handle files/links replaced by dirs (issue2166)
Patrick Mezard <pmezard@gmail.com>
parents: 11127
diff changeset
1027 # to PROPFIND subversion errors
a9b427b5821e convert/svn: handle files/links replaced by dirs (issue2166)
Patrick Mezard <pmezard@gmail.com>
parents: 11127
diff changeset
1028 return svn.ra.check_path(self.ra, path.strip('/'), revnum)
a9b427b5821e convert/svn: handle files/links replaced by dirs (issue2166)
Patrick Mezard <pmezard@gmail.com>
parents: 11127
diff changeset
1029 finally:
a9b427b5821e convert/svn: handle files/links replaced by dirs (issue2166)
Patrick Mezard <pmezard@gmail.com>
parents: 11127
diff changeset
1030 if module is not None:
a9b427b5821e convert/svn: handle files/links replaced by dirs (issue2166)
Patrick Mezard <pmezard@gmail.com>
parents: 11127
diff changeset
1031 self.reparent(prevmodule)
12770
614f0d8724ab check-code: find trailing whitespace
Martin Geisler <mg@lazybytes.net>
parents: 12343
diff changeset
1032
6850
c6bb8fae3bd2 convert: normalize paths sent to svn get_log (issue 1219)
Patrick Mezard <pmezard@gmail.com>
parents: 6848
diff changeset
1033 def _getlog(self, paths, start, end, limit=0, discover_changed_paths=True,
c6bb8fae3bd2 convert: normalize paths sent to svn get_log (issue 1219)
Patrick Mezard <pmezard@gmail.com>
parents: 6848
diff changeset
1034 strict_node_history=False):
c6bb8fae3bd2 convert: normalize paths sent to svn get_log (issue 1219)
Patrick Mezard <pmezard@gmail.com>
parents: 6848
diff changeset
1035 # Normalize path names, svn >= 1.5 only wants paths relative to
c6bb8fae3bd2 convert: normalize paths sent to svn get_log (issue 1219)
Patrick Mezard <pmezard@gmail.com>
parents: 6848
diff changeset
1036 # supplied URL
c6bb8fae3bd2 convert: normalize paths sent to svn get_log (issue 1219)
Patrick Mezard <pmezard@gmail.com>
parents: 6848
diff changeset
1037 relpaths = []
c6bb8fae3bd2 convert: normalize paths sent to svn get_log (issue 1219)
Patrick Mezard <pmezard@gmail.com>
parents: 6848
diff changeset
1038 for p in paths:
c6bb8fae3bd2 convert: normalize paths sent to svn get_log (issue 1219)
Patrick Mezard <pmezard@gmail.com>
parents: 6848
diff changeset
1039 if not p.startswith('/'):
c6bb8fae3bd2 convert: normalize paths sent to svn get_log (issue 1219)
Patrick Mezard <pmezard@gmail.com>
parents: 6848
diff changeset
1040 p = self.module + '/' + p
c6bb8fae3bd2 convert: normalize paths sent to svn get_log (issue 1219)
Patrick Mezard <pmezard@gmail.com>
parents: 6848
diff changeset
1041 relpaths.append(p.strip('/'))
16683
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16514
diff changeset
1042 args = [self.baseurl, relpaths, start, end, limit,
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16514
diff changeset
1043 discover_changed_paths, strict_node_history]
20420
62153c5d1ce2 convert: secret config option for disabling debugsvnlog
Mads Kiilerich <madski@unity3d.com>
parents: 20419
diff changeset
1044 # undocumented feature: debugsvnlog can be disabled
62153c5d1ce2 convert: secret config option for disabling debugsvnlog
Mads Kiilerich <madski@unity3d.com>
parents: 20419
diff changeset
1045 if not self.ui.configbool('convert', 'svn.debugsvnlog', True):
62153c5d1ce2 convert: secret config option for disabling debugsvnlog
Mads Kiilerich <madski@unity3d.com>
parents: 20419
diff changeset
1046 return directlogstream(*args)
6850
c6bb8fae3bd2 convert: normalize paths sent to svn get_log (issue 1219)
Patrick Mezard <pmezard@gmail.com>
parents: 6848
diff changeset
1047 arg = encodeargs(args)
c6bb8fae3bd2 convert: normalize paths sent to svn get_log (issue 1219)
Patrick Mezard <pmezard@gmail.com>
parents: 6848
diff changeset
1048 hgexe = util.hgexecutable()
c6bb8fae3bd2 convert: normalize paths sent to svn get_log (issue 1219)
Patrick Mezard <pmezard@gmail.com>
parents: 6848
diff changeset
1049 cmd = '%s debugsvnlog' % util.shellquote(hgexe)
13190
5314cbb775f6 convert: subversion should use util.quotecommand to wrap args to popen2
Steve Borho <steve@borho.org>
parents: 13052
diff changeset
1050 stdin, stdout = util.popen2(util.quotecommand(cmd))
6850
c6bb8fae3bd2 convert: normalize paths sent to svn get_log (issue 1219)
Patrick Mezard <pmezard@gmail.com>
parents: 6848
diff changeset
1051 stdin.write(arg)
10071
661980567246 convert/svn: better handling of hg recursive call failure
Patrick Mezard <pmezard@gmail.com>
parents: 10051
diff changeset
1052 try:
661980567246 convert/svn: better handling of hg recursive call failure
Patrick Mezard <pmezard@gmail.com>
parents: 10051
diff changeset
1053 stdin.close()
661980567246 convert/svn: better handling of hg recursive call failure
Patrick Mezard <pmezard@gmail.com>
parents: 10051
diff changeset
1054 except IOError:
661980567246 convert/svn: better handling of hg recursive call failure
Patrick Mezard <pmezard@gmail.com>
parents: 10051
diff changeset
1055 raise util.Abort(_('Mercurial failed to run itself, check'
661980567246 convert/svn: better handling of hg recursive call failure
Patrick Mezard <pmezard@gmail.com>
parents: 10051
diff changeset
1056 ' hg executable is in PATH'))
6850
c6bb8fae3bd2 convert: normalize paths sent to svn get_log (issue 1219)
Patrick Mezard <pmezard@gmail.com>
parents: 6848
diff changeset
1057 return logstream(stdout)
c6bb8fae3bd2 convert: normalize paths sent to svn get_log (issue 1219)
Patrick Mezard <pmezard@gmail.com>
parents: 6848
diff changeset
1058
5513
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1059 pre_revprop_change = '''#!/bin/sh
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1060
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1061 REPOS="$1"
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1062 REV="$2"
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1063 USER="$3"
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1064 PROPNAME="$4"
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1065 ACTION="$5"
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1066
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1067 if [ "$ACTION" = "M" -a "$PROPNAME" = "svn:log" ]; then exit 0; fi
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1068 if [ "$ACTION" = "A" -a "$PROPNAME" = "hg:convert-branch" ]; then exit 0; fi
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1069 if [ "$ACTION" = "A" -a "$PROPNAME" = "hg:convert-rev" ]; then exit 0; fi
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1070
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1071 echo "Changing prohibited revision property" >&2
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1072 exit 1
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1073 '''
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1074
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1075 class svn_sink(converter_sink, commandline):
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1076 commit_re = re.compile(r'Committed revision (\d+).', re.M)
13530
5f69af0d2fb3 convert/svn: stop using svn bindings when pushing to svn
Patrick Mezard <pmezard@gmail.com>
parents: 13529
diff changeset
1077 uuid_re = re.compile(r'Repository UUID:\s*(\S+)', re.M)
5513
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1078
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1079 def prerun(self):
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1080 if self.wc:
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1081 os.chdir(self.wc)
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1082
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1083 def postrun(self):
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1084 if self.wc:
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1085 os.chdir(self.cwd)
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1086
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1087 def join(self, name):
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1088 return os.path.join(self.wc, '.svn', name)
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5705
diff changeset
1089
5513
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1090 def revmapfile(self):
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1091 return self.join('hg-shamap')
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1092
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1093 def authorfile(self):
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1094 return self.join('hg-authormap')
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1095
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1096 def __init__(self, ui, path):
13480
69418d4525d1 convert/svn: abort operation when python bindings are not available
Azhagu Selvan SP <tamizhgeek@gmail.com>
parents: 13190
diff changeset
1097
5513
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1098 converter_sink.__init__(self, ui, path)
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1099 commandline.__init__(self, ui, 'svn')
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1100 self.delete = []
5698
b63ef7b1441c convert: svn-sink: copy and set properties after adding dirs/files
Maxim Dounin <mdounin@mdounin.ru>
parents: 5618
diff changeset
1101 self.setexec = []
b63ef7b1441c convert: svn-sink: copy and set properties after adding dirs/files
Maxim Dounin <mdounin@mdounin.ru>
parents: 5618
diff changeset
1102 self.delexec = []
b63ef7b1441c convert: svn-sink: copy and set properties after adding dirs/files
Maxim Dounin <mdounin@mdounin.ru>
parents: 5618
diff changeset
1103 self.copies = []
5513
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1104 self.wc = None
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1105 self.cwd = os.getcwd()
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1106
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1107 created = False
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1108 if os.path.isfile(os.path.join(path, '.svn', 'entries')):
17247
6d51a0c71d4e convert/svn: handle non-local svn destination paths (issue3142)
Patrick Mezard <patrick@mezard.eu>
parents: 17053
diff changeset
1109 self.wc = os.path.realpath(path)
5513
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1110 self.run0('update')
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1111 else:
17247
6d51a0c71d4e convert/svn: handle non-local svn destination paths (issue3142)
Patrick Mezard <patrick@mezard.eu>
parents: 17053
diff changeset
1112 if not re.search(r'^(file|http|https|svn|svn\+ssh)\://', path):
6d51a0c71d4e convert/svn: handle non-local svn destination paths (issue3142)
Patrick Mezard <patrick@mezard.eu>
parents: 17053
diff changeset
1113 path = os.path.realpath(path)
6d51a0c71d4e convert/svn: handle non-local svn destination paths (issue3142)
Patrick Mezard <patrick@mezard.eu>
parents: 17053
diff changeset
1114 if os.path.isdir(os.path.dirname(path)):
6d51a0c71d4e convert/svn: handle non-local svn destination paths (issue3142)
Patrick Mezard <patrick@mezard.eu>
parents: 17053
diff changeset
1115 if not os.path.exists(os.path.join(path, 'db', 'fs-type')):
6d51a0c71d4e convert/svn: handle non-local svn destination paths (issue3142)
Patrick Mezard <patrick@mezard.eu>
parents: 17053
diff changeset
1116 ui.status(_('initializing svn repository %r\n') %
6d51a0c71d4e convert/svn: handle non-local svn destination paths (issue3142)
Patrick Mezard <patrick@mezard.eu>
parents: 17053
diff changeset
1117 os.path.basename(path))
6d51a0c71d4e convert/svn: handle non-local svn destination paths (issue3142)
Patrick Mezard <patrick@mezard.eu>
parents: 17053
diff changeset
1118 commandline(ui, 'svnadmin').run0('create', path)
6d51a0c71d4e convert/svn: handle non-local svn destination paths (issue3142)
Patrick Mezard <patrick@mezard.eu>
parents: 17053
diff changeset
1119 created = path
6d51a0c71d4e convert/svn: handle non-local svn destination paths (issue3142)
Patrick Mezard <patrick@mezard.eu>
parents: 17053
diff changeset
1120 path = util.normpath(path)
6d51a0c71d4e convert/svn: handle non-local svn destination paths (issue3142)
Patrick Mezard <patrick@mezard.eu>
parents: 17053
diff changeset
1121 if not path.startswith('/'):
6d51a0c71d4e convert/svn: handle non-local svn destination paths (issue3142)
Patrick Mezard <patrick@mezard.eu>
parents: 17053
diff changeset
1122 path = '/' + path
6d51a0c71d4e convert/svn: handle non-local svn destination paths (issue3142)
Patrick Mezard <patrick@mezard.eu>
parents: 17053
diff changeset
1123 path = 'file://' + path
5535
7501ef26402b convert: fix svn file:// URL generation under Windows
Patrick Mezard <pmezard@gmail.com>
parents: 5528
diff changeset
1124
17247
6d51a0c71d4e convert/svn: handle non-local svn destination paths (issue3142)
Patrick Mezard <patrick@mezard.eu>
parents: 17053
diff changeset
1125 wcpath = os.path.join(os.getcwd(), os.path.basename(path) + '-wc')
10940
898d68468df2 convert: write "working copy" instead of "wc"
Martin Geisler <mg@lazybytes.net>
parents: 10939
diff changeset
1126 ui.status(_('initializing svn working copy %r\n')
898d68468df2 convert: write "working copy" instead of "wc"
Martin Geisler <mg@lazybytes.net>
parents: 10939
diff changeset
1127 % os.path.basename(wcpath))
5513
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1128 self.run0('checkout', path, wcpath)
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1129
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1130 self.wc = wcpath
13970
d13913355390 move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13690
diff changeset
1131 self.opener = scmutil.opener(self.wc)
d13913355390 move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13690
diff changeset
1132 self.wopener = scmutil.opener(self.wc)
5513
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1133 self.childmap = mapfile(ui, self.join('hg-childmap'))
24306
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 23583
diff changeset
1134 if util.checkexec(self.wc):
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 23583
diff changeset
1135 self.is_exec = util.isexec
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 23583
diff changeset
1136 else:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 23583
diff changeset
1137 self.is_exec = None
5513
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1138
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1139 if created:
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1140 hook = os.path.join(created, 'hooks', 'pre-revprop-change')
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1141 fp = open(hook, 'w')
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1142 fp.write(pre_revprop_change)
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1143 fp.close()
14232
df2399663392 rename util.set_flags to setflags
Adrian Buehlmann <adrian@cadifra.com>
parents: 14168
diff changeset
1144 util.setflags(hook, False, True)
5513
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1145
13530
5f69af0d2fb3 convert/svn: stop using svn bindings when pushing to svn
Patrick Mezard <pmezard@gmail.com>
parents: 13529
diff changeset
1146 output = self.run0('info')
5f69af0d2fb3 convert/svn: stop using svn bindings when pushing to svn
Patrick Mezard <pmezard@gmail.com>
parents: 13529
diff changeset
1147 self.uuid = self.uuid_re.search(output).group(1).strip()
5554
2147a734dcf9 convert: tell the source repository when a rev has been converted
Bryan O'Sullivan <bos@serpentine.com>
parents: 5537
diff changeset
1148
5513
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1149 def wjoin(self, *names):
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1150 return os.path.join(self.wc, *names)
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1151
16511
ecd2fbe68b25 convert/svn: make svn sink work with svn 1.7
Patrick Mezard <patrick@mezard.eu>
parents: 16466
diff changeset
1152 @propertycache
ecd2fbe68b25 convert/svn: make svn sink work with svn 1.7
Patrick Mezard <patrick@mezard.eu>
parents: 16466
diff changeset
1153 def manifest(self):
ecd2fbe68b25 convert/svn: make svn sink work with svn 1.7
Patrick Mezard <patrick@mezard.eu>
parents: 16466
diff changeset
1154 # As of svn 1.7, the "add" command fails when receiving
ecd2fbe68b25 convert/svn: make svn sink work with svn 1.7
Patrick Mezard <patrick@mezard.eu>
parents: 16466
diff changeset
1155 # already tracked entries, so we have to track and filter them
ecd2fbe68b25 convert/svn: make svn sink work with svn 1.7
Patrick Mezard <patrick@mezard.eu>
parents: 16466
diff changeset
1156 # ourselves.
ecd2fbe68b25 convert/svn: make svn sink work with svn 1.7
Patrick Mezard <patrick@mezard.eu>
parents: 16466
diff changeset
1157 m = set()
ecd2fbe68b25 convert/svn: make svn sink work with svn 1.7
Patrick Mezard <patrick@mezard.eu>
parents: 16466
diff changeset
1158 output = self.run0('ls', recursive=True, xml=True)
ecd2fbe68b25 convert/svn: make svn sink work with svn 1.7
Patrick Mezard <patrick@mezard.eu>
parents: 16466
diff changeset
1159 doc = xml.dom.minidom.parseString(output)
ecd2fbe68b25 convert/svn: make svn sink work with svn 1.7
Patrick Mezard <patrick@mezard.eu>
parents: 16466
diff changeset
1160 for e in doc.getElementsByTagName('entry'):
ecd2fbe68b25 convert/svn: make svn sink work with svn 1.7
Patrick Mezard <patrick@mezard.eu>
parents: 16466
diff changeset
1161 for n in e.childNodes:
ecd2fbe68b25 convert/svn: make svn sink work with svn 1.7
Patrick Mezard <patrick@mezard.eu>
parents: 16466
diff changeset
1162 if n.nodeType != n.ELEMENT_NODE or n.tagName != 'name':
ecd2fbe68b25 convert/svn: make svn sink work with svn 1.7
Patrick Mezard <patrick@mezard.eu>
parents: 16466
diff changeset
1163 continue
ecd2fbe68b25 convert/svn: make svn sink work with svn 1.7
Patrick Mezard <patrick@mezard.eu>
parents: 16466
diff changeset
1164 name = ''.join(c.data for c in n.childNodes
ecd2fbe68b25 convert/svn: make svn sink work with svn 1.7
Patrick Mezard <patrick@mezard.eu>
parents: 16466
diff changeset
1165 if c.nodeType == c.TEXT_NODE)
ecd2fbe68b25 convert/svn: make svn sink work with svn 1.7
Patrick Mezard <patrick@mezard.eu>
parents: 16466
diff changeset
1166 # Entries are compared with names coming from
ecd2fbe68b25 convert/svn: make svn sink work with svn 1.7
Patrick Mezard <patrick@mezard.eu>
parents: 16466
diff changeset
1167 # mercurial, so bytes with undefined encoding. Our
ecd2fbe68b25 convert/svn: make svn sink work with svn 1.7
Patrick Mezard <patrick@mezard.eu>
parents: 16466
diff changeset
1168 # best bet is to assume they are in local
ecd2fbe68b25 convert/svn: make svn sink work with svn 1.7
Patrick Mezard <patrick@mezard.eu>
parents: 16466
diff changeset
1169 # encoding. They will be passed to command line calls
ecd2fbe68b25 convert/svn: make svn sink work with svn 1.7
Patrick Mezard <patrick@mezard.eu>
parents: 16466
diff changeset
1170 # later anyway, so they better be.
ecd2fbe68b25 convert/svn: make svn sink work with svn 1.7
Patrick Mezard <patrick@mezard.eu>
parents: 16466
diff changeset
1171 m.add(encoding.tolocal(name.encode('utf-8')))
ecd2fbe68b25 convert/svn: make svn sink work with svn 1.7
Patrick Mezard <patrick@mezard.eu>
parents: 16466
diff changeset
1172 break
ecd2fbe68b25 convert/svn: make svn sink work with svn 1.7
Patrick Mezard <patrick@mezard.eu>
parents: 16466
diff changeset
1173 return m
ecd2fbe68b25 convert/svn: make svn sink work with svn 1.7
Patrick Mezard <patrick@mezard.eu>
parents: 16466
diff changeset
1174
5513
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1175 def putfile(self, filename, flags, data):
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1176 if 'l' in flags:
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1177 self.wopener.symlink(data, filename)
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1178 else:
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1179 try:
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1180 if os.path.islink(self.wjoin(filename)):
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1181 os.unlink(filename)
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1182 except OSError:
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1183 pass
14168
135e244776f0 prevent transient leaks of file handle by using new helper functions
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 14152
diff changeset
1184 self.wopener.write(filename, data)
5536
fdee5d614fcc convert: force svn:executable when execute-bit is not supported
Patrick Mezard <pmezard@gmail.com>
parents: 5535
diff changeset
1185
fdee5d614fcc convert: force svn:executable when execute-bit is not supported
Patrick Mezard <pmezard@gmail.com>
parents: 5535
diff changeset
1186 if self.is_exec:
17031
f17b561cc473 convert: ignore svn:executable for subversion targets without exec bit support
Mads Kiilerich <mads@kiilerich.com>
parents: 16925
diff changeset
1187 if self.is_exec(self.wjoin(filename)):
f17b561cc473 convert: ignore svn:executable for subversion targets without exec bit support
Mads Kiilerich <mads@kiilerich.com>
parents: 16925
diff changeset
1188 if 'x' not in flags:
f17b561cc473 convert: ignore svn:executable for subversion targets without exec bit support
Mads Kiilerich <mads@kiilerich.com>
parents: 16925
diff changeset
1189 self.delexec.append(filename)
f17b561cc473 convert: ignore svn:executable for subversion targets without exec bit support
Mads Kiilerich <mads@kiilerich.com>
parents: 16925
diff changeset
1190 else:
f17b561cc473 convert: ignore svn:executable for subversion targets without exec bit support
Mads Kiilerich <mads@kiilerich.com>
parents: 16925
diff changeset
1191 if 'x' in flags:
f17b561cc473 convert: ignore svn:executable for subversion targets without exec bit support
Mads Kiilerich <mads@kiilerich.com>
parents: 16925
diff changeset
1192 self.setexec.append(filename)
f17b561cc473 convert: ignore svn:executable for subversion targets without exec bit support
Mads Kiilerich <mads@kiilerich.com>
parents: 16925
diff changeset
1193 util.setflags(self.wjoin(filename), False, 'x' in flags)
5698
b63ef7b1441c convert: svn-sink: copy and set properties after adding dirs/files
Maxim Dounin <mdounin@mdounin.ru>
parents: 5618
diff changeset
1194
b63ef7b1441c convert: svn-sink: copy and set properties after adding dirs/files
Maxim Dounin <mdounin@mdounin.ru>
parents: 5618
diff changeset
1195 def _copyfile(self, source, dest):
5513
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1196 # SVN's copy command pukes if the destination file exists, but
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1197 # our copyfile method expects to record a copy that has
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1198 # already occurred. Cross the semantic gap.
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1199 wdest = self.wjoin(dest)
12343
28642f7fc2cf convert/svn: fix broken symlink renames in svn sink
Patrick Mezard <pmezard@gmail.com>
parents: 11779
diff changeset
1200 exists = os.path.lexists(wdest)
5513
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1201 if exists:
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1202 fd, tempname = tempfile.mkstemp(
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1203 prefix='hg-copy-', dir=os.path.dirname(wdest))
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1204 os.close(fd)
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1205 os.unlink(tempname)
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1206 os.rename(wdest, tempname)
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1207 try:
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1208 self.run0('copy', source, dest)
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1209 finally:
16511
ecd2fbe68b25 convert/svn: make svn sink work with svn 1.7
Patrick Mezard <patrick@mezard.eu>
parents: 16466
diff changeset
1210 self.manifest.add(dest)
5513
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1211 if exists:
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1212 try:
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1213 os.unlink(wdest)
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1214 except OSError:
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1215 pass
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1216 os.rename(tempname, wdest)
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1217
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1218 def dirs_of(self, files):
8150
bbc24c0753a0 util: use built-in set and frozenset
Martin Geisler <mg@lazybytes.net>
parents: 8129
diff changeset
1219 dirs = set()
5513
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1220 for f in files:
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1221 if os.path.isdir(self.wjoin(f)):
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1222 dirs.add(f)
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1223 for i in strutil.rfindall(f, '/'):
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1224 dirs.add(f[:i])
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1225 return dirs
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1226
5698
b63ef7b1441c convert: svn-sink: copy and set properties after adding dirs/files
Maxim Dounin <mdounin@mdounin.ru>
parents: 5618
diff changeset
1227 def add_dirs(self, files):
8209
a1a5a57efe90 replace util.sort with sorted built-in
Matt Mackall <mpm@selenic.com>
parents: 8206
diff changeset
1228 add_dirs = [d for d in sorted(self.dirs_of(files))
16511
ecd2fbe68b25 convert/svn: make svn sink work with svn 1.7
Patrick Mezard <patrick@mezard.eu>
parents: 16466
diff changeset
1229 if d not in self.manifest]
5513
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1230 if add_dirs:
16511
ecd2fbe68b25 convert/svn: make svn sink work with svn 1.7
Patrick Mezard <patrick@mezard.eu>
parents: 16466
diff changeset
1231 self.manifest.update(add_dirs)
5832
2192ed187319 convert: add commandline.xargs(), use it in svn_sink class
Maxim Dounin <mdounin@mdounin.ru>
parents: 5806
diff changeset
1232 self.xargs(add_dirs, 'add', non_recursive=True, quiet=True)
5698
b63ef7b1441c convert: svn-sink: copy and set properties after adding dirs/files
Maxim Dounin <mdounin@mdounin.ru>
parents: 5618
diff changeset
1233 return add_dirs
b63ef7b1441c convert: svn-sink: copy and set properties after adding dirs/files
Maxim Dounin <mdounin@mdounin.ru>
parents: 5618
diff changeset
1234
b63ef7b1441c convert: svn-sink: copy and set properties after adding dirs/files
Maxim Dounin <mdounin@mdounin.ru>
parents: 5618
diff changeset
1235 def add_files(self, files):
16511
ecd2fbe68b25 convert/svn: make svn sink work with svn 1.7
Patrick Mezard <patrick@mezard.eu>
parents: 16466
diff changeset
1236 files = [f for f in files if f not in self.manifest]
5513
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1237 if files:
16511
ecd2fbe68b25 convert/svn: make svn sink work with svn 1.7
Patrick Mezard <patrick@mezard.eu>
parents: 16466
diff changeset
1238 self.manifest.update(files)
5832
2192ed187319 convert: add commandline.xargs(), use it in svn_sink class
Maxim Dounin <mdounin@mdounin.ru>
parents: 5806
diff changeset
1239 self.xargs(files, 'add', quiet=True)
5698
b63ef7b1441c convert: svn-sink: copy and set properties after adding dirs/files
Maxim Dounin <mdounin@mdounin.ru>
parents: 5618
diff changeset
1240 return files
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5705
diff changeset
1241
5513
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1242 def addchild(self, parent, child):
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1243 self.childmap[parent] = child
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1244
5554
2147a734dcf9 convert: tell the source repository when a rev has been converted
Bryan O'Sullivan <bos@serpentine.com>
parents: 5537
diff changeset
1245 def revid(self, rev):
2147a734dcf9 convert: tell the source repository when a rev has been converted
Bryan O'Sullivan <bos@serpentine.com>
parents: 5537
diff changeset
1246 return u"svn:%s@%s" % (self.uuid, rev)
5698
b63ef7b1441c convert: svn-sink: copy and set properties after adding dirs/files
Maxim Dounin <mdounin@mdounin.ru>
parents: 5618
diff changeset
1247
24395
216fa1ba9993 convert: optimize convert of files that are unmodified from p2 in merges
Mads Kiilerich <madski@unity3d.com>
parents: 24306
diff changeset
1248 def putcommit(self, files, copies, parents, commit, source, revmap, full,
216fa1ba9993 convert: optimize convert of files that are unmodified from p2 in merges
Mads Kiilerich <madski@unity3d.com>
parents: 24306
diff changeset
1249 cleanp2):
15605
2ad5b8937d0d convert/svn: update svn working copy only when necessary
Patrick Mezard <pmezard@gmail.com>
parents: 15599
diff changeset
1250 for parent in parents:
2ad5b8937d0d convert/svn: update svn working copy only when necessary
Patrick Mezard <pmezard@gmail.com>
parents: 15599
diff changeset
1251 try:
2ad5b8937d0d convert/svn: update svn working copy only when necessary
Patrick Mezard <pmezard@gmail.com>
parents: 15599
diff changeset
1252 return self.revid(self.childmap[parent])
2ad5b8937d0d convert/svn: update svn working copy only when necessary
Patrick Mezard <pmezard@gmail.com>
parents: 15599
diff changeset
1253 except KeyError:
2ad5b8937d0d convert/svn: update svn working copy only when necessary
Patrick Mezard <pmezard@gmail.com>
parents: 15599
diff changeset
1254 pass
2ad5b8937d0d convert/svn: update svn working copy only when necessary
Patrick Mezard <pmezard@gmail.com>
parents: 15599
diff changeset
1255
6716
c9b8d2565b92 convert: reintegrate file retrieval code in sinks
Patrick Mezard <pmezard@gmail.com>
parents: 6557
diff changeset
1256 # Apply changes to working copy
c9b8d2565b92 convert: reintegrate file retrieval code in sinks
Patrick Mezard <pmezard@gmail.com>
parents: 6557
diff changeset
1257 for f, v in files:
22296
650b5b6e75ed convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents: 22201
diff changeset
1258 data, mode = source.getfile(f, v)
650b5b6e75ed convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents: 22201
diff changeset
1259 if data is None:
6716
c9b8d2565b92 convert: reintegrate file retrieval code in sinks
Patrick Mezard <pmezard@gmail.com>
parents: 6557
diff changeset
1260 self.delete.append(f)
c9b8d2565b92 convert: reintegrate file retrieval code in sinks
Patrick Mezard <pmezard@gmail.com>
parents: 6557
diff changeset
1261 else:
11134
33010ff1fd6f convert: merge sources getmode() into getfile()
Patrick Mezard <pmezard@gmail.com>
parents: 11133
diff changeset
1262 self.putfile(f, mode, data)
6716
c9b8d2565b92 convert: reintegrate file retrieval code in sinks
Patrick Mezard <pmezard@gmail.com>
parents: 6557
diff changeset
1263 if f in copies:
c9b8d2565b92 convert: reintegrate file retrieval code in sinks
Patrick Mezard <pmezard@gmail.com>
parents: 6557
diff changeset
1264 self.copies.append([copies[f], f])
22300
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22298
diff changeset
1265 if full:
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22298
diff changeset
1266 self.delete.extend(sorted(self.manifest.difference(files)))
6716
c9b8d2565b92 convert: reintegrate file retrieval code in sinks
Patrick Mezard <pmezard@gmail.com>
parents: 6557
diff changeset
1267 files = [f[0] for f in files]
c9b8d2565b92 convert: reintegrate file retrieval code in sinks
Patrick Mezard <pmezard@gmail.com>
parents: 6557
diff changeset
1268
8150
bbc24c0753a0 util: use built-in set and frozenset
Martin Geisler <mg@lazybytes.net>
parents: 8129
diff changeset
1269 entries = set(self.delete)
bbc24c0753a0 util: use built-in set and frozenset
Martin Geisler <mg@lazybytes.net>
parents: 8129
diff changeset
1270 files = frozenset(files)
5698
b63ef7b1441c convert: svn-sink: copy and set properties after adding dirs/files
Maxim Dounin <mdounin@mdounin.ru>
parents: 5618
diff changeset
1271 entries.update(self.add_dirs(files.difference(entries)))
b63ef7b1441c convert: svn-sink: copy and set properties after adding dirs/files
Maxim Dounin <mdounin@mdounin.ru>
parents: 5618
diff changeset
1272 if self.copies:
b63ef7b1441c convert: svn-sink: copy and set properties after adding dirs/files
Maxim Dounin <mdounin@mdounin.ru>
parents: 5618
diff changeset
1273 for s, d in self.copies:
b63ef7b1441c convert: svn-sink: copy and set properties after adding dirs/files
Maxim Dounin <mdounin@mdounin.ru>
parents: 5618
diff changeset
1274 self._copyfile(s, d)
b63ef7b1441c convert: svn-sink: copy and set properties after adding dirs/files
Maxim Dounin <mdounin@mdounin.ru>
parents: 5618
diff changeset
1275 self.copies = []
5513
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1276 if self.delete:
5832
2192ed187319 convert: add commandline.xargs(), use it in svn_sink class
Maxim Dounin <mdounin@mdounin.ru>
parents: 5806
diff changeset
1277 self.xargs(self.delete, 'delete')
16511
ecd2fbe68b25 convert/svn: make svn sink work with svn 1.7
Patrick Mezard <patrick@mezard.eu>
parents: 16466
diff changeset
1278 for f in self.delete:
ecd2fbe68b25 convert/svn: make svn sink work with svn 1.7
Patrick Mezard <patrick@mezard.eu>
parents: 16466
diff changeset
1279 self.manifest.remove(f)
5513
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1280 self.delete = []
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1281 entries.update(self.add_files(files.difference(entries)))
5698
b63ef7b1441c convert: svn-sink: copy and set properties after adding dirs/files
Maxim Dounin <mdounin@mdounin.ru>
parents: 5618
diff changeset
1282 if self.delexec:
5832
2192ed187319 convert: add commandline.xargs(), use it in svn_sink class
Maxim Dounin <mdounin@mdounin.ru>
parents: 5806
diff changeset
1283 self.xargs(self.delexec, 'propdel', 'svn:executable')
5698
b63ef7b1441c convert: svn-sink: copy and set properties after adding dirs/files
Maxim Dounin <mdounin@mdounin.ru>
parents: 5618
diff changeset
1284 self.delexec = []
b63ef7b1441c convert: svn-sink: copy and set properties after adding dirs/files
Maxim Dounin <mdounin@mdounin.ru>
parents: 5618
diff changeset
1285 if self.setexec:
5832
2192ed187319 convert: add commandline.xargs(), use it in svn_sink class
Maxim Dounin <mdounin@mdounin.ru>
parents: 5806
diff changeset
1286 self.xargs(self.setexec, 'propset', 'svn:executable', '*')
5698
b63ef7b1441c convert: svn-sink: copy and set properties after adding dirs/files
Maxim Dounin <mdounin@mdounin.ru>
parents: 5618
diff changeset
1287 self.setexec = []
b63ef7b1441c convert: svn-sink: copy and set properties after adding dirs/files
Maxim Dounin <mdounin@mdounin.ru>
parents: 5618
diff changeset
1288
5513
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1289 fd, messagefile = tempfile.mkstemp(prefix='hg-convert-')
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1290 fp = os.fdopen(fd, 'w')
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1291 fp.write(commit.desc)
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1292 fp.close()
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1293 try:
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1294 output = self.run0('commit',
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1295 username=util.shortuser(commit.author),
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1296 file=messagefile,
5790
f85c0034a062 convert: svn_sink: workaround of command line size limitation on win32.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents: 5789
diff changeset
1297 encoding='utf-8')
5513
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1298 try:
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1299 rev = self.commit_re.search(output).group(1)
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1300 except AttributeError:
24856
5c1364b7e5ac convert: avoid traceback in subversion sink
Matt Mackall <mpm@selenic.com>
parents: 24395
diff changeset
1301 if parents and not files:
10051
a02d43acbc04 convert/svn: make sink recover gracefully from empty changeset
Patrick Mezard <pmezard@gmail.com>
parents: 9860
diff changeset
1302 return parents[0]
5513
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1303 self.ui.warn(_('unexpected svn output:\n'))
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1304 self.ui.warn(output)
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1305 raise util.Abort(_('unable to cope with svn output'))
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1306 if commit.rev:
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1307 self.run('propset', 'hg:convert-rev', commit.rev,
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1308 revprop=True, revision=rev)
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1309 if commit.branch and commit.branch != 'default':
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1310 self.run('propset', 'hg:convert-branch', commit.branch,
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1311 revprop=True, revision=rev)
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1312 for parent in parents:
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1313 self.addchild(parent, rev)
5554
2147a734dcf9 convert: tell the source repository when a rev has been converted
Bryan O'Sullivan <bos@serpentine.com>
parents: 5537
diff changeset
1314 return self.revid(rev)
5513
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1315 finally:
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1316 os.unlink(messagefile)
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1317
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5511
diff changeset
1318 def puttags(self, tags):
11779
2b7a75ca6913 convert: less shouting in SVN sink warning
Martin Geisler <mg@aragost.com>
parents: 11778
diff changeset
1319 self.ui.warn(_('writing Subversion tags is not yet implemented\n'))
11778
7e5f5e5858f9 convert: Using --dest-type svn crashed, if the source repo used tags.
Daniel J. Lauk <daniel.lauk@gmail.com>
parents: 11196
diff changeset
1320 return None, None
16106
d75aa756149b convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents: 16067
diff changeset
1321
21635
5f2cc464e502 convert: introduce hascommitfrommap sink method
Mads Kiilerich <madski@unity3d.com>
parents: 21634
diff changeset
1322 def hascommitfrommap(self, rev):
5f2cc464e502 convert: introduce hascommitfrommap sink method
Mads Kiilerich <madski@unity3d.com>
parents: 21634
diff changeset
1323 # We trust that revisions referenced in a map still is present
5f2cc464e502 convert: introduce hascommitfrommap sink method
Mads Kiilerich <madski@unity3d.com>
parents: 21634
diff changeset
1324 # TODO: implement something better if necessary and feasible
5f2cc464e502 convert: introduce hascommitfrommap sink method
Mads Kiilerich <madski@unity3d.com>
parents: 21634
diff changeset
1325 return True
5f2cc464e502 convert: introduce hascommitfrommap sink method
Mads Kiilerich <madski@unity3d.com>
parents: 21634
diff changeset
1326
21634
23b24d6a70c8 convert: rename sink hascommit to hascommitforsplicemap
Mads Kiilerich <madski@unity3d.com>
parents: 21076
diff changeset
1327 def hascommitforsplicemap(self, rev):
16106
d75aa756149b convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents: 16067
diff changeset
1328 # This is not correct as one can convert to an existing subversion
d75aa756149b convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents: 16067
diff changeset
1329 # repository and childmap would not list all revisions. Too bad.
d75aa756149b convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents: 16067
diff changeset
1330 if rev in self.childmap:
d75aa756149b convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents: 16067
diff changeset
1331 return True
d75aa756149b convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents: 16067
diff changeset
1332 raise util.Abort(_('splice map revision %s not found in subversion '
16162
7e279d475669 convert: fix typos in error messages
Wagner Bruna <wbruna@softwareexpress.com.br>
parents: 16106
diff changeset
1333 'child map (revision lookups are not implemented)')
16106
d75aa756149b convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents: 16067
diff changeset
1334 % rev)