Mercurial > hgsubversion
annotate hgsubversion/svnexternals.py @ 1556:53d170a6c3c8
svnexternals: clean up some trailing whitespace
author | Augie Fackler <raf@durin42.com> |
---|---|
date | Sat, 24 Mar 2018 16:39:58 -0400 |
parents | cff81f35b31e |
children |
rev | line source |
---|---|
174
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
1 import cStringIO |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
2 |
291
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
3 import os, re, shutil, stat, subprocess |
1555
cff81f35b31e
cleanup: reference Abort from mercurial.error instead of mercurial.util
Augie Fackler <raf@durin42.com>
parents:
1515
diff
changeset
|
4 from mercurial import error as hgerror |
250
79349fd04836
utils: standardizing imported name to hgutil, our_util to util
Daniel Tang <dytang@cs.purdue.edu>
parents:
175
diff
changeset
|
5 from mercurial import util as hgutil |
291
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
6 from mercurial.i18n import _ |
1118
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
7 from mercurial import subrepo |
762
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
8 |
803
6b1ad75f8cda
svnexternals: fix canonpath import after hg.bfeaa88b875d
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
789
diff
changeset
|
9 try: |
1119
2efc4abd4602
svnexternals: remove pre-1.9 pegrev code
Sean Farley <sean.michael.farley@gmail.com>
parents:
1118
diff
changeset
|
10 from mercurial import scmutil |
2efc4abd4602
svnexternals: remove pre-1.9 pegrev code
Sean Farley <sean.michael.farley@gmail.com>
parents:
1118
diff
changeset
|
11 canonpath = scmutil.canonpath |
817
3b613d32ef11
svnexternals: fix subrepo peg revision handling (7ef125fa9b35)
Patrick Mezard <pmezard@gmail.com>
parents:
807
diff
changeset
|
12 except (ImportError, AttributeError): |
1119
2efc4abd4602
svnexternals: remove pre-1.9 pegrev code
Sean Farley <sean.michael.farley@gmail.com>
parents:
1118
diff
changeset
|
13 from mercurial import pathutil |
2efc4abd4602
svnexternals: remove pre-1.9 pegrev code
Sean Farley <sean.michael.farley@gmail.com>
parents:
1118
diff
changeset
|
14 canonpath = pathutil.canonpath |
803
6b1ad75f8cda
svnexternals: fix canonpath import after hg.bfeaa88b875d
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
789
diff
changeset
|
15 |
387
f6050c4dde31
svnexternals: Change an absolute import to be relative.
Augie Fackler <durin42@gmail.com>
parents:
340
diff
changeset
|
16 import util |
174
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
17 |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
18 class externalsfile(dict): |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
19 """Map svn directories to lists of externals entries. |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
20 """ |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
21 def __init__(self): |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
22 super(externalsfile, self).__init__() |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
23 self.encoding = 'utf-8' |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
24 |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
25 def __setitem__(self, key, value): |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
26 if value is None: |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
27 value = [] |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
28 elif isinstance(value, basestring): |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
29 value = value.splitlines() |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
30 if key == '.': |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
31 key = '' |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
32 if not value: |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
33 if key in self: |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
34 del self[key] |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
35 else: |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
36 super(externalsfile, self).__setitem__(key, value) |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
37 |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
38 def write(self): |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
39 fp = cStringIO.StringIO() |
286
552deb1351ce
Replace mercurial.util.sort with sorted buildin (after mercurial a1a5a57efe90)
Martijn Pieters <mj@zopatista.com>
parents:
250
diff
changeset
|
40 for target in sorted(self): |
174
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
41 lines = self[target] |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
42 if not lines: |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
43 continue |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
44 if not target: |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
45 target = '.' |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
46 fp.write('[%s]\n' % target) |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
47 for l in lines: |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
48 l = ' ' + l + '\n' |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
49 fp.write(l) |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
50 return fp.getvalue() |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
51 |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
52 def read(self, data): |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
53 self.clear() |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
54 fp = cStringIO.StringIO(data) |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
55 target = None |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
56 for line in fp.readlines(): |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
57 if not line.strip(): |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
58 continue |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
59 if line.startswith('['): |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
60 line = line.strip() |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
61 if line[-1] != ']': |
1555
cff81f35b31e
cleanup: reference Abort from mercurial.error instead of mercurial.util
Augie Fackler <raf@durin42.com>
parents:
1515
diff
changeset
|
62 raise hgerror.Abort('invalid externals section name: %s' % line) |
174
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
63 target = line[1:-1] |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
64 if target == '.': |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
65 target = '' |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
66 elif line.startswith(' '): |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
67 line = line.rstrip('\n') |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
68 if target is None or not line: |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
69 continue |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
70 self.setdefault(target, []).append(line[1:]) |
291
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
71 |
175
2412800b1258
Support svn:externals changes via .hgsvnexternals updates
Patrick Mezard <pmezard@gmail.com>
parents:
174
diff
changeset
|
72 def diff(ext1, ext2): |
759
864b5b67a5f0
svnexternals: keep diff() simple for the caller, return a list
Patrick Mezard <pmezard@gmail.com>
parents:
758
diff
changeset
|
73 """Compare 2 externalsfile and return a list of tuples like (dir, |
864b5b67a5f0
svnexternals: keep diff() simple for the caller, return a list
Patrick Mezard <pmezard@gmail.com>
parents:
758
diff
changeset
|
74 value1, value2) where value1 is the external value in ext1 for dir |
864b5b67a5f0
svnexternals: keep diff() simple for the caller, return a list
Patrick Mezard <pmezard@gmail.com>
parents:
758
diff
changeset
|
75 or None, and value2 the same in ext2. |
175
2412800b1258
Support svn:externals changes via .hgsvnexternals updates
Patrick Mezard <pmezard@gmail.com>
parents:
174
diff
changeset
|
76 """ |
759
864b5b67a5f0
svnexternals: keep diff() simple for the caller, return a list
Patrick Mezard <pmezard@gmail.com>
parents:
758
diff
changeset
|
77 changes = [] |
175
2412800b1258
Support svn:externals changes via .hgsvnexternals updates
Patrick Mezard <pmezard@gmail.com>
parents:
174
diff
changeset
|
78 for d in ext1: |
2412800b1258
Support svn:externals changes via .hgsvnexternals updates
Patrick Mezard <pmezard@gmail.com>
parents:
174
diff
changeset
|
79 if d not in ext2: |
759
864b5b67a5f0
svnexternals: keep diff() simple for the caller, return a list
Patrick Mezard <pmezard@gmail.com>
parents:
758
diff
changeset
|
80 changes.append((d, '\n'.join(ext1[d]), None)) |
175
2412800b1258
Support svn:externals changes via .hgsvnexternals updates
Patrick Mezard <pmezard@gmail.com>
parents:
174
diff
changeset
|
81 elif ext1[d] != ext2[d]: |
759
864b5b67a5f0
svnexternals: keep diff() simple for the caller, return a list
Patrick Mezard <pmezard@gmail.com>
parents:
758
diff
changeset
|
82 changes.append((d, '\n'.join(ext1[d]), '\n'.join(ext2[d]))) |
175
2412800b1258
Support svn:externals changes via .hgsvnexternals updates
Patrick Mezard <pmezard@gmail.com>
parents:
174
diff
changeset
|
83 for d in ext2: |
2412800b1258
Support svn:externals changes via .hgsvnexternals updates
Patrick Mezard <pmezard@gmail.com>
parents:
174
diff
changeset
|
84 if d not in ext1: |
759
864b5b67a5f0
svnexternals: keep diff() simple for the caller, return a list
Patrick Mezard <pmezard@gmail.com>
parents:
758
diff
changeset
|
85 changes.append((d, None, '\n'.join(ext2[d]))) |
864b5b67a5f0
svnexternals: keep diff() simple for the caller, return a list
Patrick Mezard <pmezard@gmail.com>
parents:
758
diff
changeset
|
86 return changes |
291
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
87 |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
88 class BadDefinition(Exception): |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
89 pass |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
90 |
850
d3bc067c0f72
Cope with non standard schemes in externals
Will Wykeham <will@wykeham.net>
parents:
819
diff
changeset
|
91 re_defold = re.compile(r'^\s*(.*?)\s+(?:-r\s*(\d+|\{REV\})\s+)?([a-zA-Z+]+://.*)\s*$') |
1456
77da55e0baa4
externals: support peg revisions in URLs
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
1410
diff
changeset
|
92 re_defnew = re.compile(r'^\s*(?:-r\s*(\d+|\{REV\})\s+)?((?:[a-zA-Z+]+://|\^/)\S*)\s+(\S+)\s*$') |
850
d3bc067c0f72
Cope with non standard schemes in externals
Will Wykeham <will@wykeham.net>
parents:
819
diff
changeset
|
93 re_scheme = re.compile(r'^[a-zA-Z+]+://') |
291
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
94 |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
95 def parsedefinition(line): |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
96 """Parse an external definition line, return a tuple (path, rev, source) |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
97 or raise BadDefinition. |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
98 """ |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
99 # The parsing is probably not correct wrt path with whitespaces or |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
100 # potential quotes. svn documentation is not really talkative about |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
101 # these either. |
761
979148947967
svnexternals: generate externals with a revision placeholder
Patrick Mezard <pmezard@gmail.com>
parents:
759
diff
changeset
|
102 pegrev, revgroup = None, 1 |
291
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
103 m = re_defnew.search(line) |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
104 if m: |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
105 rev, source, path = m.group(1, 2, 3) |
315
963d27a0b1c2
svnexternals: do not use peg revisions as --rev replacements
Patrick Mezard <pmezard@gmail.com>
parents:
291
diff
changeset
|
106 if '@' in source: |
963d27a0b1c2
svnexternals: do not use peg revisions as --rev replacements
Patrick Mezard <pmezard@gmail.com>
parents:
291
diff
changeset
|
107 source, pegrev = source.rsplit('@', 1) |
291
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
108 else: |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
109 m = re_defold.search(line) |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
110 if not m: |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
111 raise BadDefinition() |
761
979148947967
svnexternals: generate externals with a revision placeholder
Patrick Mezard <pmezard@gmail.com>
parents:
759
diff
changeset
|
112 revgroup = 2 |
291
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
113 path, rev, source = m.group(1, 2, 3) |
761
979148947967
svnexternals: generate externals with a revision placeholder
Patrick Mezard <pmezard@gmail.com>
parents:
759
diff
changeset
|
114 try: |
836
0cbf9fd89672
svnexternals: comment on the purpose of int(rev)
Augie Fackler <durin42@gmail.com>
parents:
825
diff
changeset
|
115 int(rev) # ensure revision is int()able, so we bail otherwise |
761
979148947967
svnexternals: generate externals with a revision placeholder
Patrick Mezard <pmezard@gmail.com>
parents:
759
diff
changeset
|
116 norevline = line[:m.start(revgroup)] + '{REV}' + line[m.end(revgroup):] |
979148947967
svnexternals: generate externals with a revision placeholder
Patrick Mezard <pmezard@gmail.com>
parents:
759
diff
changeset
|
117 except (TypeError, ValueError): |
979148947967
svnexternals: generate externals with a revision placeholder
Patrick Mezard <pmezard@gmail.com>
parents:
759
diff
changeset
|
118 norevline = line |
979148947967
svnexternals: generate externals with a revision placeholder
Patrick Mezard <pmezard@gmail.com>
parents:
759
diff
changeset
|
119 return (path, rev, source, pegrev, norevline) |
291
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
120 |
763
6463b34bbcb6
svnexternals: support subrepos based externals checkout
Patrick Mezard <pmezard@gmail.com>
parents:
762
diff
changeset
|
121 class RelativeSourceError(Exception): |
6463b34bbcb6
svnexternals: support subrepos based externals checkout
Patrick Mezard <pmezard@gmail.com>
parents:
762
diff
changeset
|
122 pass |
6463b34bbcb6
svnexternals: support subrepos based externals checkout
Patrick Mezard <pmezard@gmail.com>
parents:
762
diff
changeset
|
123 |
1350
554eaa682561
Fix for externals that include '..' in the path, i.e. relative paths within svn
Steve Barnes <StevenJohn.Barnes@ge.com>
parents:
1295
diff
changeset
|
124 def resolvedots(url): |
1351
9d58ca6253a3
Added check for excessive .. entries which would go out of domain.
Steve Barnes (Home) <gadgetsteve@hotmail.com>
parents:
1350
diff
changeset
|
125 """ |
9d58ca6253a3
Added check for excessive .. entries which would go out of domain.
Steve Barnes (Home) <gadgetsteve@hotmail.com>
parents:
1350
diff
changeset
|
126 Fix references that include .. entries. |
9d58ca6253a3
Added check for excessive .. entries which would go out of domain.
Steve Barnes (Home) <gadgetsteve@hotmail.com>
parents:
1350
diff
changeset
|
127 Scans a URL for .. type entries and resolves them but will not allow any |
9d58ca6253a3
Added check for excessive .. entries which would go out of domain.
Steve Barnes (Home) <gadgetsteve@hotmail.com>
parents:
1350
diff
changeset
|
128 number of ..s to take us out of domain so http://.. will raise an exception. |
1556
53d170a6c3c8
svnexternals: clean up some trailing whitespace
Augie Fackler <raf@durin42.com>
parents:
1555
diff
changeset
|
129 |
1352
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
130 Tests, (Don't know how to construct a round trip for this so doctest): |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
131 >>> # Relative URL within servers svn area |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
132 >>> resolvedots( |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
133 ... "http://some.svn.server/svn/some_repo/../other_repo") |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
134 'http://some.svn.server/svn/other_repo' |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
135 >>> # Complex One |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
136 >>> resolvedots( |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
137 ... "http://some.svn.server/svn/repo/../other/repo/../../other_repo") |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
138 'http://some.svn.server/svn/other_repo' |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
139 >>> # Another Complex One |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
140 >>> resolvedots( |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
141 ... "http://some.svn.server/svn/repo/dir/subdir/../../../other_repo/dir") |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
142 'http://some.svn.server/svn/other_repo/dir' |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
143 >>> # Last Complex One - SVN Allows this & seen it used even if it is BAD! |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
144 >>> resolvedots( |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
145 ... "http://svn.server/svn/my_repo/dir/subdir/../../other_dir") |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
146 'http://svn.server/svn/my_repo/other_dir' |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
147 >>> # Outside the SVN Area might be OK |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
148 >>> resolvedots( |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
149 ... "http://svn.server/svn/some_repo/../../other_svn_repo") |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
150 'http://svn.server/other_svn_repo' |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
151 >>> # Complex One |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
152 >>> resolvedots( |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
153 ... "http://some.svn.server/svn/repo/../other/repo/../../other_repo") |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
154 'http://some.svn.server/svn/other_repo' |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
155 >>> # On another server is not a relative URL should give an exception |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
156 >>> resolvedots( |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
157 ... "http://some.svn.server/svn/some_repo/../../../other_server") |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
158 Traceback (most recent call last): |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
159 ... |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
160 RelativeSourceError: Relative URL cannot be to another server |
1351
9d58ca6253a3
Added check for excessive .. entries which would go out of domain.
Steve Barnes (Home) <gadgetsteve@hotmail.com>
parents:
1350
diff
changeset
|
161 """ |
1350
554eaa682561
Fix for externals that include '..' in the path, i.e. relative paths within svn
Steve Barnes <StevenJohn.Barnes@ge.com>
parents:
1295
diff
changeset
|
162 orig = url.split('/') |
554eaa682561
Fix for externals that include '..' in the path, i.e. relative paths within svn
Steve Barnes <StevenJohn.Barnes@ge.com>
parents:
1295
diff
changeset
|
163 fixed = [] |
554eaa682561
Fix for externals that include '..' in the path, i.e. relative paths within svn
Steve Barnes <StevenJohn.Barnes@ge.com>
parents:
1295
diff
changeset
|
164 for item in orig: |
554eaa682561
Fix for externals that include '..' in the path, i.e. relative paths within svn
Steve Barnes <StevenJohn.Barnes@ge.com>
parents:
1295
diff
changeset
|
165 if item != '..': |
554eaa682561
Fix for externals that include '..' in the path, i.e. relative paths within svn
Steve Barnes <StevenJohn.Barnes@ge.com>
parents:
1295
diff
changeset
|
166 fixed.append(item) |
1352
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
167 elif len(fixed) > 3: # Don't allow things to go out of domain |
1350
554eaa682561
Fix for externals that include '..' in the path, i.e. relative paths within svn
Steve Barnes <StevenJohn.Barnes@ge.com>
parents:
1295
diff
changeset
|
168 fixed.pop() |
1351
9d58ca6253a3
Added check for excessive .. entries which would go out of domain.
Steve Barnes (Home) <gadgetsteve@hotmail.com>
parents:
1350
diff
changeset
|
169 else: |
1352
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
170 raise RelativeSourceError( |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
171 'Relative URL cannot be to another server') |
1350
554eaa682561
Fix for externals that include '..' in the path, i.e. relative paths within svn
Steve Barnes <StevenJohn.Barnes@ge.com>
parents:
1295
diff
changeset
|
172 return '/'.join(fixed) |
554eaa682561
Fix for externals that include '..' in the path, i.e. relative paths within svn
Steve Barnes <StevenJohn.Barnes@ge.com>
parents:
1295
diff
changeset
|
173 |
1352
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
174 |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
175 |
763
6463b34bbcb6
svnexternals: support subrepos based externals checkout
Patrick Mezard <pmezard@gmail.com>
parents:
762
diff
changeset
|
176 def resolvesource(ui, svnroot, source): |
1352
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
177 """ Resolve the source as either matching the scheme re or by resolving |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
178 relative URLs which start with ^ and my include relative .. references. |
1556
53d170a6c3c8
svnexternals: clean up some trailing whitespace
Augie Fackler <raf@durin42.com>
parents:
1555
diff
changeset
|
179 |
1352
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
180 >>> root = 'http://some.svn.server/svn/some_repo' |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
181 >>> resolvesource(None, root, 'http://other.svn.server') |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
182 'http://other.svn.server' |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
183 >>> resolvesource(None, root, 'ssh://other.svn.server') |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
184 'ssh://other.svn.server' |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
185 >>> resolvesource(None, root, '^/other_repo') |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
186 'http://some.svn.server/svn/some_repo/other_repo' |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
187 >>> resolvesource(None, root, '^/sub_repo') |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
188 'http://some.svn.server/svn/some_repo/sub_repo' |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
189 >>> resolvesource(None, root, '^/../other_repo') |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
190 'http://some.svn.server/svn/other_repo' |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
191 >>> resolvesource(None, root, '^/../../../server/other_repo') |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
192 Traceback (most recent call last): |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
193 ... |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
194 RelativeSourceError: Relative URL cannot be to another server |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
195 """ |
763
6463b34bbcb6
svnexternals: support subrepos based externals checkout
Patrick Mezard <pmezard@gmail.com>
parents:
762
diff
changeset
|
196 if re_scheme.search(source): |
6463b34bbcb6
svnexternals: support subrepos based externals checkout
Patrick Mezard <pmezard@gmail.com>
parents:
762
diff
changeset
|
197 return source |
6463b34bbcb6
svnexternals: support subrepos based externals checkout
Patrick Mezard <pmezard@gmail.com>
parents:
762
diff
changeset
|
198 if source.startswith('^/'): |
6463b34bbcb6
svnexternals: support subrepos based externals checkout
Patrick Mezard <pmezard@gmail.com>
parents:
762
diff
changeset
|
199 if svnroot is None: |
6463b34bbcb6
svnexternals: support subrepos based externals checkout
Patrick Mezard <pmezard@gmail.com>
parents:
762
diff
changeset
|
200 raise RelativeSourceError() |
1350
554eaa682561
Fix for externals that include '..' in the path, i.e. relative paths within svn
Steve Barnes <StevenJohn.Barnes@ge.com>
parents:
1295
diff
changeset
|
201 return resolvedots(svnroot + source[1:]) |
782
1f1aeb1f5ffc
svnexternals: missing EOL in ui.warn()
Patrick Mezard <pmezard@gmail.com>
parents:
781
diff
changeset
|
202 ui.warn(_('ignoring unsupported non-fully qualified external: %r\n' |
1f1aeb1f5ffc
svnexternals: missing EOL in ui.warn()
Patrick Mezard <pmezard@gmail.com>
parents:
781
diff
changeset
|
203 % source)) |
763
6463b34bbcb6
svnexternals: support subrepos based externals checkout
Patrick Mezard <pmezard@gmail.com>
parents:
762
diff
changeset
|
204 return None |
6463b34bbcb6
svnexternals: support subrepos based externals checkout
Patrick Mezard <pmezard@gmail.com>
parents:
762
diff
changeset
|
205 |
291
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
206 def parsedefinitions(ui, repo, svnroot, exts): |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
207 """Return (targetdir, revision, source) tuples. Fail if nested |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
208 targetdirs are detected. source is an svn project URL. |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
209 """ |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
210 defs = [] |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
211 for base in sorted(exts): |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
212 for line in exts[base]: |
789
a5be5ca638de
externals: ignore externals blank or comment lines
Patrick Mezard <pmezard@gmail.com>
parents:
784
diff
changeset
|
213 if not line.strip() or line.lstrip().startswith('#'): |
a5be5ca638de
externals: ignore externals blank or comment lines
Patrick Mezard <pmezard@gmail.com>
parents:
784
diff
changeset
|
214 # Ignore comments and blank lines |
a5be5ca638de
externals: ignore externals blank or comment lines
Patrick Mezard <pmezard@gmail.com>
parents:
784
diff
changeset
|
215 continue |
291
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
216 try: |
761
979148947967
svnexternals: generate externals with a revision placeholder
Patrick Mezard <pmezard@gmail.com>
parents:
759
diff
changeset
|
217 path, rev, source, pegrev, norevline = parsedefinition(line) |
291
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
218 except BadDefinition: |
782
1f1aeb1f5ffc
svnexternals: missing EOL in ui.warn()
Patrick Mezard <pmezard@gmail.com>
parents:
781
diff
changeset
|
219 ui.warn(_('ignoring invalid external definition: %r\n' % line)) |
291
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
220 continue |
763
6463b34bbcb6
svnexternals: support subrepos based externals checkout
Patrick Mezard <pmezard@gmail.com>
parents:
762
diff
changeset
|
221 source = resolvesource(ui, svnroot, source) |
6463b34bbcb6
svnexternals: support subrepos based externals checkout
Patrick Mezard <pmezard@gmail.com>
parents:
762
diff
changeset
|
222 if source is None: |
291
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
223 continue |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
224 wpath = hgutil.pconvert(os.path.join(base, path)) |
803
6b1ad75f8cda
svnexternals: fix canonpath import after hg.bfeaa88b875d
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
789
diff
changeset
|
225 wpath = canonpath(repo.root, '', wpath) |
761
979148947967
svnexternals: generate externals with a revision placeholder
Patrick Mezard <pmezard@gmail.com>
parents:
759
diff
changeset
|
226 defs.append((wpath, rev, source, pegrev, norevline, base)) |
291
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
227 # Check target dirs are not nested |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
228 defs.sort() |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
229 for i, d in enumerate(defs): |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
230 for d2 in defs[i+1:]: |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
231 if d2[0].startswith(d[0] + '/'): |
1555
cff81f35b31e
cleanup: reference Abort from mercurial.error instead of mercurial.util
Augie Fackler <raf@durin42.com>
parents:
1515
diff
changeset
|
232 raise hgerror.Abort(_('external directories cannot nest:\n%s\n%s') |
291
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
233 % (d[0], d2[0])) |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
234 return defs |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
235 |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
236 def computeactions(ui, repo, svnroot, ext1, ext2): |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
237 |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
238 def listdefs(data): |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
239 defs = {} |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
240 exts = externalsfile() |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
241 exts.read(data) |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
242 for d in parsedefinitions(ui, repo, svnroot, exts): |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
243 defs[d[0]] = d |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
244 return defs |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
245 |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
246 ext1 = listdefs(ext1) |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
247 ext2 = listdefs(ext2) |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
248 for wp1 in ext1: |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
249 if wp1 in ext2: |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
250 yield 'u', ext2[wp1] |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
251 else: |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
252 yield 'd', ext1[wp1] |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
253 for wp2 in ext2: |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
254 if wp2 not in ext1: |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
255 yield 'u', ext2[wp2] |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
256 |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
257 def getsvninfo(svnurl): |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
258 """Return a tuple (url, root) for supplied svn URL or working |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
259 directory path. |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
260 """ |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
261 # Yes, this is ugly, but good enough for now |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
262 args = ['svn', 'info', '--xml', svnurl] |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
263 shell = os.name == 'nt' |
331
75f082b5897e
Switch to using url scheme wrappers instead of duplicating each command we wrap.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
315
diff
changeset
|
264 p = subprocess.Popen(args, shell=shell, |
75f082b5897e
Switch to using url scheme wrappers instead of duplicating each command we wrap.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
315
diff
changeset
|
265 stdout=subprocess.PIPE, stderr=subprocess.STDOUT) |
291
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
266 stdout = p.communicate()[0] |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
267 if p.returncode: |
1555
cff81f35b31e
cleanup: reference Abort from mercurial.error instead of mercurial.util
Augie Fackler <raf@durin42.com>
parents:
1515
diff
changeset
|
268 raise hgerror.Abort(_('cannot get information about %s') |
291
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
269 % svnurl) |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
270 m = re.search(r'<root>(.*)</root>', stdout, re.S) |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
271 if not m: |
1555
cff81f35b31e
cleanup: reference Abort from mercurial.error instead of mercurial.util
Augie Fackler <raf@durin42.com>
parents:
1515
diff
changeset
|
272 raise hgerror.Abort(_('cannot find SVN repository root from %s') |
291
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
273 % svnurl) |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
274 root = m.group(1).rstrip('/') |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
275 |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
276 m = re.search(r'<url>(.*)</url>', stdout, re.S) |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
277 if not m: |
1555
cff81f35b31e
cleanup: reference Abort from mercurial.error instead of mercurial.util
Augie Fackler <raf@durin42.com>
parents:
1515
diff
changeset
|
278 raise hgerror.Abort(_('cannot find SVN repository URL from %s') % svnurl) |
291
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
279 url = m.group(1) |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
280 |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
281 m = re.search(r'<entry[^>]+revision="([^"]+)"', stdout, re.S) |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
282 if not m: |
1555
cff81f35b31e
cleanup: reference Abort from mercurial.error instead of mercurial.util
Augie Fackler <raf@durin42.com>
parents:
1515
diff
changeset
|
283 raise hgerror.Abort(_('cannot find SVN revision from %s') % svnurl) |
291
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
284 rev = m.group(1) |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
285 return url, root, rev |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
286 |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
287 class externalsupdater: |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
288 def __init__(self, ui, repo): |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
289 self.repo = repo |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
290 self.ui = ui |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
291 |
315
963d27a0b1c2
svnexternals: do not use peg revisions as --rev replacements
Patrick Mezard <pmezard@gmail.com>
parents:
291
diff
changeset
|
292 def update(self, wpath, rev, source, pegrev): |
1503
180e0d5fba2e
join: remove uses of repo.join/wjoin
Durham Goode <durham@fb.com>
parents:
1456
diff
changeset
|
293 path = self.repo.wvfs.join(wpath) |
291
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
294 revspec = [] |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
295 if rev: |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
296 revspec = ['-r', rev] |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
297 if os.path.isdir(path): |
825
c3450512237d
svnexternals.py: style cleanups
Yonggang Luo <luoyonggang@gmail.com>
parents:
819
diff
changeset
|
298 exturl, _extroot, extrev = getsvninfo(path) |
315
963d27a0b1c2
svnexternals: do not use peg revisions as --rev replacements
Patrick Mezard <pmezard@gmail.com>
parents:
291
diff
changeset
|
299 # Comparing the source paths is not enough, but I don't |
963d27a0b1c2
svnexternals: do not use peg revisions as --rev replacements
Patrick Mezard <pmezard@gmail.com>
parents:
291
diff
changeset
|
300 # know how to compare path+pegrev. The following update |
963d27a0b1c2
svnexternals: do not use peg revisions as --rev replacements
Patrick Mezard <pmezard@gmail.com>
parents:
291
diff
changeset
|
301 # might fail if the path was replaced by another unrelated |
963d27a0b1c2
svnexternals: do not use peg revisions as --rev replacements
Patrick Mezard <pmezard@gmail.com>
parents:
291
diff
changeset
|
302 # one. It can be fixed manually by deleting the externals |
963d27a0b1c2
svnexternals: do not use peg revisions as --rev replacements
Patrick Mezard <pmezard@gmail.com>
parents:
291
diff
changeset
|
303 # and updating again. |
291
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
304 if source == exturl: |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
305 if extrev != rev: |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
306 self.ui.status(_('updating external on %s@%s\n') % |
1456
77da55e0baa4
externals: support peg revisions in URLs
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
1410
diff
changeset
|
307 (wpath, rev or pegrev or 'HEAD')) |
291
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
308 cwd = os.path.join(self.repo.root, path) |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
309 self.svn(['update'] + revspec, cwd) |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
310 return |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
311 self.delete(wpath) |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
312 cwd, dest = os.path.split(path) |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
313 cwd = os.path.join(self.repo.root, cwd) |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
314 if not os.path.isdir(cwd): |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
315 os.makedirs(cwd) |
315
963d27a0b1c2
svnexternals: do not use peg revisions as --rev replacements
Patrick Mezard <pmezard@gmail.com>
parents:
291
diff
changeset
|
316 if not pegrev and rev: |
963d27a0b1c2
svnexternals: do not use peg revisions as --rev replacements
Patrick Mezard <pmezard@gmail.com>
parents:
291
diff
changeset
|
317 pegrev = rev |
963d27a0b1c2
svnexternals: do not use peg revisions as --rev replacements
Patrick Mezard <pmezard@gmail.com>
parents:
291
diff
changeset
|
318 if pegrev: |
963d27a0b1c2
svnexternals: do not use peg revisions as --rev replacements
Patrick Mezard <pmezard@gmail.com>
parents:
291
diff
changeset
|
319 source = '%s@%s' % (source, pegrev) |
1456
77da55e0baa4
externals: support peg revisions in URLs
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
1410
diff
changeset
|
320 self.ui.status(_('fetching external %s@%s\n') % |
77da55e0baa4
externals: support peg revisions in URLs
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
1410
diff
changeset
|
321 (wpath, rev or pegrev or 'HEAD')) |
291
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
322 self.svn(['co'] + revspec + [source, dest], cwd) |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
323 |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
324 def delete(self, wpath): |
1503
180e0d5fba2e
join: remove uses of repo.join/wjoin
Durham Goode <durham@fb.com>
parents:
1456
diff
changeset
|
325 path = self.repo.wvfs.join(wpath) |
291
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
326 if os.path.isdir(path): |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
327 self.ui.status(_('removing external %s\n') % wpath) |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
328 |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
329 def onerror(function, path, excinfo): |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
330 if function is not os.remove: |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
331 raise |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
332 # read-only files cannot be unlinked under Windows |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
333 s = os.stat(path) |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
334 if (s.st_mode & stat.S_IWRITE) != 0: |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
335 raise |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
336 os.chmod(path, stat.S_IMODE(s.st_mode) | stat.S_IWRITE) |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
337 os.remove(path) |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
338 |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
339 shutil.rmtree(path, onerror=onerror) |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
340 return 1 |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
341 |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
342 def svn(self, args, cwd): |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
343 args = ['svn'] + args |
1456
77da55e0baa4
externals: support peg revisions in URLs
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
1410
diff
changeset
|
344 self.ui.note(_('updating externals: %r, cwd=%s\n') % (args, cwd)) |
291
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
345 shell = os.name == 'nt' |
470
6bfaa9deb432
svnexternals: display svn commands output with --verbose
Patrick Mezard <pmezard@gmail.com>
parents:
387
diff
changeset
|
346 p = subprocess.Popen(args, cwd=cwd, shell=shell, |
6bfaa9deb432
svnexternals: display svn commands output with --verbose
Patrick Mezard <pmezard@gmail.com>
parents:
387
diff
changeset
|
347 stdout=subprocess.PIPE, stderr=subprocess.STDOUT) |
6bfaa9deb432
svnexternals: display svn commands output with --verbose
Patrick Mezard <pmezard@gmail.com>
parents:
387
diff
changeset
|
348 for line in p.stdout: |
1456
77da55e0baa4
externals: support peg revisions in URLs
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
1410
diff
changeset
|
349 self.ui.debug(line) |
470
6bfaa9deb432
svnexternals: display svn commands output with --verbose
Patrick Mezard <pmezard@gmail.com>
parents:
387
diff
changeset
|
350 p.wait() |
6bfaa9deb432
svnexternals: display svn commands output with --verbose
Patrick Mezard <pmezard@gmail.com>
parents:
387
diff
changeset
|
351 if p.returncode != 0: |
1555
cff81f35b31e
cleanup: reference Abort from mercurial.error instead of mercurial.util
Augie Fackler <raf@durin42.com>
parents:
1515
diff
changeset
|
352 raise hgerror.Abort("subprocess '%s' failed" % ' '.join(args)) |
291
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
353 |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
354 def updateexternals(ui, args, repo, **opts): |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
355 """update repository externals |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
356 """ |
331
75f082b5897e
Switch to using url scheme wrappers instead of duplicating each command we wrap.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
315
diff
changeset
|
357 if len(args) > 2: |
1555
cff81f35b31e
cleanup: reference Abort from mercurial.error instead of mercurial.util
Augie Fackler <raf@durin42.com>
parents:
1515
diff
changeset
|
358 raise hgerror.Abort(_('updateexternals expects at most one changeset')) |
291
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
359 node = None |
331
75f082b5897e
Switch to using url scheme wrappers instead of duplicating each command we wrap.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
315
diff
changeset
|
360 if len(args) == 2: |
75f082b5897e
Switch to using url scheme wrappers instead of duplicating each command we wrap.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
315
diff
changeset
|
361 svnurl = util.normalize_url(repo.ui.expandpath(args[0])) |
75f082b5897e
Switch to using url scheme wrappers instead of duplicating each command we wrap.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
315
diff
changeset
|
362 args = args[1:] |
75f082b5897e
Switch to using url scheme wrappers instead of duplicating each command we wrap.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
315
diff
changeset
|
363 else: |
75f082b5897e
Switch to using url scheme wrappers instead of duplicating each command we wrap.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
315
diff
changeset
|
364 svnurl = util.normalize_url(repo.ui.expandpath('default')) |
291
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
365 if args: |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
366 node = args[0] |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
367 |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
368 svnroot = getsvninfo(svnurl)[1] |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
369 |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
370 # Retrieve current externals status |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
371 try: |
1503
180e0d5fba2e
join: remove uses of repo.join/wjoin
Durham Goode <durham@fb.com>
parents:
1456
diff
changeset
|
372 oldext = file(repo.vfs.join('svn/externals'), 'rb').read() |
291
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
373 except IOError: |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
374 oldext = '' |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
375 newext = '' |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
376 ctx = repo[node] |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
377 if '.hgsvnexternals' in ctx: |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
378 newext = ctx['.hgsvnexternals'].data() |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
379 |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
380 updater = externalsupdater(ui, repo) |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
381 actions = computeactions(ui, repo, svnroot, oldext, newext) |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
382 for action, ext in actions: |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
383 if action == 'u': |
315
963d27a0b1c2
svnexternals: do not use peg revisions as --rev replacements
Patrick Mezard <pmezard@gmail.com>
parents:
291
diff
changeset
|
384 updater.update(ext[0], ext[1], ext[2], ext[3]) |
291
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
385 elif action == 'd': |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
386 updater.delete(ext[0]) |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
387 else: |
1555
cff81f35b31e
cleanup: reference Abort from mercurial.error instead of mercurial.util
Augie Fackler <raf@durin42.com>
parents:
1515
diff
changeset
|
388 raise hgerror.Abort(_('unknown update actions: %r') % action) |
291
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
389 |
1503
180e0d5fba2e
join: remove uses of repo.join/wjoin
Durham Goode <durham@fb.com>
parents:
1456
diff
changeset
|
390 file(repo.vfs.join('svn/externals'), 'wb').write(newext) |
757
6e18d9ab6557
pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents:
470
diff
changeset
|
391 |
6e18d9ab6557
pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents:
470
diff
changeset
|
392 def getchanges(ui, repo, parentctx, exts): |
6e18d9ab6557
pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents:
470
diff
changeset
|
393 """Take a parent changectx and the new externals definitions as an |
6e18d9ab6557
pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents:
470
diff
changeset
|
394 externalsfile and return a dictionary mapping the special file |
6e18d9ab6557
pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents:
470
diff
changeset
|
395 hgsubversion needs for externals bookkeeping, to their new content |
6e18d9ab6557
pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents:
470
diff
changeset
|
396 as raw bytes or None if the file has to be removed. |
6e18d9ab6557
pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents:
470
diff
changeset
|
397 """ |
762
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
398 mode = ui.config('hgsubversion', 'externals', 'svnexternals') |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
399 if mode == 'svnexternals': |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
400 files = { |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
401 '.hgsvnexternals': None, |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
402 } |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
403 if exts: |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
404 files['.hgsvnexternals'] = exts.write() |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
405 elif mode == 'subrepos': |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
406 # XXX: clobering the subrepos files is good enough for now |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
407 files = { |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
408 '.hgsub': None, |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
409 '.hgsubstate': None, |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
410 } |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
411 if exts: |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
412 defs = parsedefinitions(ui, repo, '', exts) |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
413 hgsub, hgsubstate = [], [] |
825
c3450512237d
svnexternals.py: style cleanups
Yonggang Luo <luoyonggang@gmail.com>
parents:
819
diff
changeset
|
414 for path, rev, _source, _pegrev, norevline, base in sorted(defs): |
762
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
415 hgsub.append('%s = [hgsubversion] %s:%s\n' |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
416 % (path, base, norevline)) |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
417 if rev is None: |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
418 rev = 'HEAD' |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
419 hgsubstate.append('%s %s\n' % (rev, path)) |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
420 files['.hgsub'] = ''.join(hgsub) |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
421 files['.hgsubstate'] = ''.join(hgsubstate) |
776
f025d00bfc4a
svnexternals: add 'ignore' mode to avoid converting externals
Patrick Mezard <pmezard@gmail.com>
parents:
764
diff
changeset
|
422 elif mode == 'ignore': |
f025d00bfc4a
svnexternals: add 'ignore' mode to avoid converting externals
Patrick Mezard <pmezard@gmail.com>
parents:
764
diff
changeset
|
423 files = {} |
762
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
424 else: |
1555
cff81f35b31e
cleanup: reference Abort from mercurial.error instead of mercurial.util
Augie Fackler <raf@durin42.com>
parents:
1515
diff
changeset
|
425 raise hgerror.Abort(_('unknown externals modes: %s') % mode) |
757
6e18d9ab6557
pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents:
470
diff
changeset
|
426 |
6e18d9ab6557
pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents:
470
diff
changeset
|
427 # Should the really be updated? |
6e18d9ab6557
pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents:
470
diff
changeset
|
428 updates = {} |
6e18d9ab6557
pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents:
470
diff
changeset
|
429 for fn, data in files.iteritems(): |
6e18d9ab6557
pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents:
470
diff
changeset
|
430 if data is not None: |
6e18d9ab6557
pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents:
470
diff
changeset
|
431 if fn not in parentctx or parentctx[fn].data() != data: |
6e18d9ab6557
pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents:
470
diff
changeset
|
432 updates[fn] = data |
6e18d9ab6557
pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents:
470
diff
changeset
|
433 else: |
6e18d9ab6557
pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents:
470
diff
changeset
|
434 if fn in parentctx: |
6e18d9ab6557
pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents:
470
diff
changeset
|
435 updates[fn] = None |
6e18d9ab6557
pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents:
470
diff
changeset
|
436 return updates |
758
76ebfc41f490
svnexternals: hide .hgsvnexternals parsing in parse()
Patrick Mezard <pmezard@gmail.com>
parents:
757
diff
changeset
|
437 |
762
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
438 def parse(ui, ctx): |
758
76ebfc41f490
svnexternals: hide .hgsvnexternals parsing in parse()
Patrick Mezard <pmezard@gmail.com>
parents:
757
diff
changeset
|
439 """Return the externals definitions stored in ctx as a (possibly empty) |
76ebfc41f490
svnexternals: hide .hgsvnexternals parsing in parse()
Patrick Mezard <pmezard@gmail.com>
parents:
757
diff
changeset
|
440 externalsfile(). |
76ebfc41f490
svnexternals: hide .hgsvnexternals parsing in parse()
Patrick Mezard <pmezard@gmail.com>
parents:
757
diff
changeset
|
441 """ |
76ebfc41f490
svnexternals: hide .hgsvnexternals parsing in parse()
Patrick Mezard <pmezard@gmail.com>
parents:
757
diff
changeset
|
442 external = externalsfile() |
762
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
443 mode = ui.config('hgsubversion', 'externals', 'svnexternals') |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
444 if mode == 'svnexternals': |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
445 if '.hgsvnexternals' in ctx: |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
446 external.read(ctx['.hgsvnexternals'].data()) |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
447 elif mode == 'subrepos': |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
448 for path in ctx.substate: |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
449 src, rev = ctx.substate[path][:2] |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
450 base, norevline = src.split(':', 1) |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
451 base = base.strip() |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
452 if rev is None: |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
453 rev = 'HEAD' |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
454 line = norevline.replace('{REV}', rev) |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
455 external.setdefault(base, []).append(line) |
776
f025d00bfc4a
svnexternals: add 'ignore' mode to avoid converting externals
Patrick Mezard <pmezard@gmail.com>
parents:
764
diff
changeset
|
456 elif mode == 'ignore': |
f025d00bfc4a
svnexternals: add 'ignore' mode to avoid converting externals
Patrick Mezard <pmezard@gmail.com>
parents:
764
diff
changeset
|
457 pass |
762
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
458 else: |
1555
cff81f35b31e
cleanup: reference Abort from mercurial.error instead of mercurial.util
Augie Fackler <raf@durin42.com>
parents:
1515
diff
changeset
|
459 raise hgerror.Abort(_('unknown externals modes: %s') % mode) |
758
76ebfc41f490
svnexternals: hide .hgsvnexternals parsing in parse()
Patrick Mezard <pmezard@gmail.com>
parents:
757
diff
changeset
|
460 return external |
762
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
461 |
1407
963946d7dfd7
externals: update for Mercurial 3.8's new subrepo API
Augie Fackler <raf@durin42.com>
parents:
1295
diff
changeset
|
462 _notset = object() |
963946d7dfd7
externals: update for Mercurial 3.8's new subrepo API
Augie Fackler <raf@durin42.com>
parents:
1295
diff
changeset
|
463 |
1118
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
464 class svnsubrepo(subrepo.svnsubrepo): |
1407
963946d7dfd7
externals: update for Mercurial 3.8's new subrepo API
Augie Fackler <raf@durin42.com>
parents:
1295
diff
changeset
|
465 def __init__(self, ctx, path, state, allowcreate=_notset): |
1118
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
466 state = (state[0].split(':', 1)[1], state[1]) |
1407
963946d7dfd7
externals: update for Mercurial 3.8's new subrepo API
Augie Fackler <raf@durin42.com>
parents:
1295
diff
changeset
|
467 if allowcreate is _notset: |
963946d7dfd7
externals: update for Mercurial 3.8's new subrepo API
Augie Fackler <raf@durin42.com>
parents:
1295
diff
changeset
|
468 # Mercurial 3.7 and earlier |
963946d7dfd7
externals: update for Mercurial 3.8's new subrepo API
Augie Fackler <raf@durin42.com>
parents:
1295
diff
changeset
|
469 super(svnsubrepo, self).__init__(ctx, path, state) |
963946d7dfd7
externals: update for Mercurial 3.8's new subrepo API
Augie Fackler <raf@durin42.com>
parents:
1295
diff
changeset
|
470 else: |
963946d7dfd7
externals: update for Mercurial 3.8's new subrepo API
Augie Fackler <raf@durin42.com>
parents:
1295
diff
changeset
|
471 # Mercurial 3.8 and later |
963946d7dfd7
externals: update for Mercurial 3.8's new subrepo API
Augie Fackler <raf@durin42.com>
parents:
1295
diff
changeset
|
472 super(svnsubrepo, self).__init__(ctx, path, state, allowcreate) |
1295
9d5cff8d7f67
svnexternals: fix for Mercurial 3.3+
Siddharth Agarwal <sid0@fb.com>
parents:
1119
diff
changeset
|
473 # Mercurial 3.3+ set 'ui' rather than '_ui' -- set that and use 'ui' |
9d5cff8d7f67
svnexternals: fix for Mercurial 3.3+
Siddharth Agarwal <sid0@fb.com>
parents:
1119
diff
changeset
|
474 # everywhere to maintain compatibility across versions |
9d5cff8d7f67
svnexternals: fix for Mercurial 3.3+
Siddharth Agarwal <sid0@fb.com>
parents:
1119
diff
changeset
|
475 if not hgutil.safehasattr(self, 'ui'): |
9d5cff8d7f67
svnexternals: fix for Mercurial 3.3+
Siddharth Agarwal <sid0@fb.com>
parents:
1119
diff
changeset
|
476 self.ui = ctx._repo.ui |
1118
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
477 |
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
478 def get(self, state, *args, **kwargs): |
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
479 # Resolve source first |
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
480 line = state[0].split(':', 1)[1] |
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
481 source, pegrev = parsedefinition(line)[2:4] |
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
482 try: |
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
483 # Getting the root SVN repository URL is expensive. |
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
484 # Assume the externals is absolute. |
1295
9d5cff8d7f67
svnexternals: fix for Mercurial 3.3+
Siddharth Agarwal <sid0@fb.com>
parents:
1119
diff
changeset
|
485 source = resolvesource(self.ui, None, source) |
1118
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
486 except RelativeSourceError: |
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
487 svnurl = self._ctx._repo.ui.expandpath('default') |
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
488 svnroot = getsvninfo(util.normalize_url(svnurl))[1] |
1295
9d5cff8d7f67
svnexternals: fix for Mercurial 3.3+
Siddharth Agarwal <sid0@fb.com>
parents:
1119
diff
changeset
|
489 source = resolvesource(self.ui, svnroot, source) |
1119
2efc4abd4602
svnexternals: remove pre-1.9 pegrev code
Sean Farley <sean.michael.farley@gmail.com>
parents:
1118
diff
changeset
|
490 # hg 1.9 and higher, append the rev as a peg revision to |
2efc4abd4602
svnexternals: remove pre-1.9 pegrev code
Sean Farley <sean.michael.farley@gmail.com>
parents:
1118
diff
changeset
|
491 # the source URL, so we cannot add our own. We assume |
2efc4abd4602
svnexternals: remove pre-1.9 pegrev code
Sean Farley <sean.michael.farley@gmail.com>
parents:
1118
diff
changeset
|
492 # that "-r10 url@2" will be similar to "url@10" most of |
2efc4abd4602
svnexternals: remove pre-1.9 pegrev code
Sean Farley <sean.michael.farley@gmail.com>
parents:
1118
diff
changeset
|
493 # the time. |
1118
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
494 state = (source, state[1]) |
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
495 return super(svnsubrepo, self).get(state, *args, **kwargs) |
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
496 |
1515
106716ed2ed0
subrepo: add missing arg to dirty()
Durham Goode <durham@fb.com>
parents:
1514
diff
changeset
|
497 def dirty(self, ignoreupdate=False, missing=False): |
1118
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
498 # You cannot compare anything with HEAD. Just accept it |
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
499 # can be anything. |
1404
c79fdd5f615d
cleanup: stop using hasattr
Augie Fackler <raf@durin42.com>
parents:
1352
diff
changeset
|
500 if hgutil.safehasattr(self, '_wcrevs'): |
1118
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
501 wcrevs = self._wcrevs() |
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
502 else: |
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
503 wcrev = self._wcrev() |
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
504 wcrevs = (wcrev, wcrev) |
1514
bdffbddfa704
subrepo: refactor dirty() to be cleaner
Durham Goode <durham@fb.com>
parents:
1503
diff
changeset
|
505 shouldcheck = ('HEAD' in wcrevs or self._state[1] == 'HEAD' or |
1515
106716ed2ed0
subrepo: add missing arg to dirty()
Durham Goode <durham@fb.com>
parents:
1514
diff
changeset
|
506 self._state[1] in wcrevs or ignoreupdate or missing) |
1514
bdffbddfa704
subrepo: refactor dirty() to be cleaner
Durham Goode <durham@fb.com>
parents:
1503
diff
changeset
|
507 if shouldcheck: |
1515
106716ed2ed0
subrepo: add missing arg to dirty()
Durham Goode <durham@fb.com>
parents:
1514
diff
changeset
|
508 changes, extchanges, wcmissing = self._wcchanged() |
106716ed2ed0
subrepo: add missing arg to dirty()
Durham Goode <durham@fb.com>
parents:
1514
diff
changeset
|
509 changed = changes or (missing and wcmissing) |
106716ed2ed0
subrepo: add missing arg to dirty()
Durham Goode <durham@fb.com>
parents:
1514
diff
changeset
|
510 if not changed: |
1514
bdffbddfa704
subrepo: refactor dirty() to be cleaner
Durham Goode <durham@fb.com>
parents:
1503
diff
changeset
|
511 return False |
1118
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
512 return True |
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
513 |
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
514 def commit(self, text, user, date): |
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
515 rev = super(svnsubrepo, self).commit(text, user, date) |
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
516 # Keep unversioned externals unversioned |
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
517 if self._state[1] == 'HEAD': |
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
518 rev = 'HEAD' |
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
519 return rev |
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
520 |
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
521 def basestate(self): |
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
522 # basestate() was introduced by bcb973abcc0b in 2.2 |
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
523 if self._state[1] == 'HEAD': |
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
524 return 'HEAD' |
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
525 return super(svnsubrepo, self).basestate() |
1556
53d170a6c3c8
svnexternals: clean up some trailing whitespace
Augie Fackler <raf@durin42.com>
parents:
1555
diff
changeset
|
526 |
1352
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
527 if __name__ == "__main__": |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
528 import doctest |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
529 doctest.testmod() |