Mercurial > hgsubversion
annotate hgsubversion/svnexternals.py @ 1506:332e803044e5
commands: fix registrar check
'util' in hgsubversion is a different type from hgutil, which is the one from
core hg. This was hidden by the fallback logic, but I'm not sure why it didn't
cause errors in the tests. Maybe I ran the original tests against an older hg.
This time I've ensured the tests pass against the latest version of hg.
author | Durham Goode <durham@fb.com> |
---|---|
date | Tue, 23 May 2017 11:08:42 -0700 |
parents | 180e0d5fba2e |
children | bdffbddfa704 |
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 |
250
79349fd04836
utils: standardizing imported name to hgutil, our_util to util
Daniel Tang <dytang@cs.purdue.edu>
parents:
175
diff
changeset
|
4 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
|
5 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
|
6 from mercurial import subrepo |
762
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
7 |
803
6b1ad75f8cda
svnexternals: fix canonpath import after hg.bfeaa88b875d
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
789
diff
changeset
|
8 try: |
1119
2efc4abd4602
svnexternals: remove pre-1.9 pegrev code
Sean Farley <sean.michael.farley@gmail.com>
parents:
1118
diff
changeset
|
9 from mercurial import scmutil |
2efc4abd4602
svnexternals: remove pre-1.9 pegrev code
Sean Farley <sean.michael.farley@gmail.com>
parents:
1118
diff
changeset
|
10 canonpath = scmutil.canonpath |
817
3b613d32ef11
svnexternals: fix subrepo peg revision handling (7ef125fa9b35)
Patrick Mezard <pmezard@gmail.com>
parents:
807
diff
changeset
|
11 except (ImportError, AttributeError): |
1119
2efc4abd4602
svnexternals: remove pre-1.9 pegrev code
Sean Farley <sean.michael.farley@gmail.com>
parents:
1118
diff
changeset
|
12 from mercurial import pathutil |
2efc4abd4602
svnexternals: remove pre-1.9 pegrev code
Sean Farley <sean.michael.farley@gmail.com>
parents:
1118
diff
changeset
|
13 canonpath = pathutil.canonpath |
803
6b1ad75f8cda
svnexternals: fix canonpath import after hg.bfeaa88b875d
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
789
diff
changeset
|
14 |
387
f6050c4dde31
svnexternals: Change an absolute import to be relative.
Augie Fackler <durin42@gmail.com>
parents:
340
diff
changeset
|
15 import util |
174
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
16 |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
17 class externalsfile(dict): |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
18 """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
|
19 """ |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
20 def __init__(self): |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
21 super(externalsfile, self).__init__() |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
22 self.encoding = 'utf-8' |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
23 |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
24 def __setitem__(self, key, value): |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
25 if value is None: |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
26 value = [] |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
27 elif isinstance(value, basestring): |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
28 value = value.splitlines() |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
29 if key == '.': |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
30 key = '' |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
31 if not value: |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
32 if key in self: |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
33 del self[key] |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
34 else: |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
35 super(externalsfile, self).__setitem__(key, value) |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
36 |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
37 def write(self): |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
38 fp = cStringIO.StringIO() |
286
552deb1351ce
Replace mercurial.util.sort with sorted buildin (after mercurial a1a5a57efe90)
Martijn Pieters <mj@zopatista.com>
parents:
250
diff
changeset
|
39 for target in sorted(self): |
174
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
40 lines = self[target] |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
41 if not lines: |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
42 continue |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
43 if not target: |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
44 target = '.' |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
45 fp.write('[%s]\n' % target) |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
46 for l in lines: |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
47 l = ' ' + l + '\n' |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
48 fp.write(l) |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
49 return fp.getvalue() |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
50 |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
51 def read(self, data): |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
52 self.clear() |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
53 fp = cStringIO.StringIO(data) |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
54 target = None |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
55 for line in fp.readlines(): |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
56 if not line.strip(): |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
57 continue |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
58 if line.startswith('['): |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
59 line = line.strip() |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
60 if line[-1] != ']': |
250
79349fd04836
utils: standardizing imported name to hgutil, our_util to util
Daniel Tang <dytang@cs.purdue.edu>
parents:
175
diff
changeset
|
61 raise hgutil.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
|
62 target = line[1:-1] |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
63 if target == '.': |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
64 target = '' |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
65 elif line.startswith(' '): |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
66 line = line.rstrip('\n') |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
67 if target is None or not line: |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
68 continue |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
diff
changeset
|
69 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
|
70 |
175
2412800b1258
Support svn:externals changes via .hgsvnexternals updates
Patrick Mezard <pmezard@gmail.com>
parents:
174
diff
changeset
|
71 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
|
72 """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
|
73 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
|
74 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
|
75 """ |
759
864b5b67a5f0
svnexternals: keep diff() simple for the caller, return a list
Patrick Mezard <pmezard@gmail.com>
parents:
758
diff
changeset
|
76 changes = [] |
175
2412800b1258
Support svn:externals changes via .hgsvnexternals updates
Patrick Mezard <pmezard@gmail.com>
parents:
174
diff
changeset
|
77 for d in ext1: |
2412800b1258
Support svn:externals changes via .hgsvnexternals updates
Patrick Mezard <pmezard@gmail.com>
parents:
174
diff
changeset
|
78 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
|
79 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
|
80 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
|
81 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
|
82 for d in ext2: |
2412800b1258
Support svn:externals changes via .hgsvnexternals updates
Patrick Mezard <pmezard@gmail.com>
parents:
174
diff
changeset
|
83 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
|
84 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
|
85 return changes |
291
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
86 |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
87 class BadDefinition(Exception): |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
88 pass |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
89 |
850
d3bc067c0f72
Cope with non standard schemes in externals
Will Wykeham <will@wykeham.net>
parents:
819
diff
changeset
|
90 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
|
91 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
|
92 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
|
93 |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
94 def parsedefinition(line): |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
95 """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
|
96 or raise BadDefinition. |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
97 """ |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
98 # 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
|
99 # 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
|
100 # these either. |
761
979148947967
svnexternals: generate externals with a revision placeholder
Patrick Mezard <pmezard@gmail.com>
parents:
759
diff
changeset
|
101 pegrev, revgroup = None, 1 |
291
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
102 m = re_defnew.search(line) |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
103 if m: |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
104 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
|
105 if '@' in source: |
963d27a0b1c2
svnexternals: do not use peg revisions as --rev replacements
Patrick Mezard <pmezard@gmail.com>
parents:
291
diff
changeset
|
106 source, pegrev = source.rsplit('@', 1) |
291
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
107 else: |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
108 m = re_defold.search(line) |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
109 if not m: |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
110 raise BadDefinition() |
761
979148947967
svnexternals: generate externals with a revision placeholder
Patrick Mezard <pmezard@gmail.com>
parents:
759
diff
changeset
|
111 revgroup = 2 |
291
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
112 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
|
113 try: |
836
0cbf9fd89672
svnexternals: comment on the purpose of int(rev)
Augie Fackler <durin42@gmail.com>
parents:
825
diff
changeset
|
114 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
|
115 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
|
116 except (TypeError, ValueError): |
979148947967
svnexternals: generate externals with a revision placeholder
Patrick Mezard <pmezard@gmail.com>
parents:
759
diff
changeset
|
117 norevline = line |
979148947967
svnexternals: generate externals with a revision placeholder
Patrick Mezard <pmezard@gmail.com>
parents:
759
diff
changeset
|
118 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
|
119 |
763
6463b34bbcb6
svnexternals: support subrepos based externals checkout
Patrick Mezard <pmezard@gmail.com>
parents:
762
diff
changeset
|
120 class RelativeSourceError(Exception): |
6463b34bbcb6
svnexternals: support subrepos based externals checkout
Patrick Mezard <pmezard@gmail.com>
parents:
762
diff
changeset
|
121 pass |
6463b34bbcb6
svnexternals: support subrepos based externals checkout
Patrick Mezard <pmezard@gmail.com>
parents:
762
diff
changeset
|
122 |
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
|
123 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
|
124 """ |
9d58ca6253a3
Added check for excessive .. entries which would go out of domain.
Steve Barnes (Home) <gadgetsteve@hotmail.com>
parents:
1350
diff
changeset
|
125 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
|
126 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
|
127 number of ..s to take us out of domain so http://.. will raise an exception. |
1352
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
128 |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
129 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
|
130 >>> # 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
|
131 >>> resolvedots( |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
132 ... "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
|
133 '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
|
134 >>> # 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
|
135 >>> resolvedots( |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
136 ... "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
|
137 '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
|
138 >>> # 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
|
139 >>> resolvedots( |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
140 ... "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
|
141 '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
|
142 >>> # 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
|
143 >>> resolvedots( |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
144 ... "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
|
145 '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
|
146 >>> # 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
|
147 >>> resolvedots( |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
148 ... "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
|
149 '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
|
150 >>> # 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
|
151 >>> resolvedots( |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
152 ... "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
|
153 '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
|
154 >>> # 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
|
155 >>> resolvedots( |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
156 ... "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
|
157 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
|
158 ... |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
159 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
|
160 """ |
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
|
161 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
|
162 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
|
163 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
|
164 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
|
165 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
|
166 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
|
167 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
|
168 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
|
169 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
|
170 '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
|
171 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
|
172 |
1352
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
173 |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
174 |
763
6463b34bbcb6
svnexternals: support subrepos based externals checkout
Patrick Mezard <pmezard@gmail.com>
parents:
762
diff
changeset
|
175 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
|
176 """ 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
|
177 relative URLs which start with ^ and my include relative .. references. |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
178 |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
179 >>> 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
|
180 >>> 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
|
181 '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 >>> 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
|
183 '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 >>> 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
|
185 '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
|
186 >>> 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
|
187 '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
|
188 >>> 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
|
189 '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
|
190 >>> 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
|
191 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
|
192 ... |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
193 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
|
194 """ |
763
6463b34bbcb6
svnexternals: support subrepos based externals checkout
Patrick Mezard <pmezard@gmail.com>
parents:
762
diff
changeset
|
195 if re_scheme.search(source): |
6463b34bbcb6
svnexternals: support subrepos based externals checkout
Patrick Mezard <pmezard@gmail.com>
parents:
762
diff
changeset
|
196 return source |
6463b34bbcb6
svnexternals: support subrepos based externals checkout
Patrick Mezard <pmezard@gmail.com>
parents:
762
diff
changeset
|
197 if source.startswith('^/'): |
6463b34bbcb6
svnexternals: support subrepos based externals checkout
Patrick Mezard <pmezard@gmail.com>
parents:
762
diff
changeset
|
198 if svnroot is None: |
6463b34bbcb6
svnexternals: support subrepos based externals checkout
Patrick Mezard <pmezard@gmail.com>
parents:
762
diff
changeset
|
199 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
|
200 return resolvedots(svnroot + source[1:]) |
782
1f1aeb1f5ffc
svnexternals: missing EOL in ui.warn()
Patrick Mezard <pmezard@gmail.com>
parents:
781
diff
changeset
|
201 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
|
202 % source)) |
763
6463b34bbcb6
svnexternals: support subrepos based externals checkout
Patrick Mezard <pmezard@gmail.com>
parents:
762
diff
changeset
|
203 return None |
6463b34bbcb6
svnexternals: support subrepos based externals checkout
Patrick Mezard <pmezard@gmail.com>
parents:
762
diff
changeset
|
204 |
291
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
205 def parsedefinitions(ui, repo, svnroot, exts): |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
206 """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
|
207 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
|
208 """ |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
209 defs = [] |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
210 for base in sorted(exts): |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
211 for line in exts[base]: |
789
a5be5ca638de
externals: ignore externals blank or comment lines
Patrick Mezard <pmezard@gmail.com>
parents:
784
diff
changeset
|
212 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
|
213 # Ignore comments and blank lines |
a5be5ca638de
externals: ignore externals blank or comment lines
Patrick Mezard <pmezard@gmail.com>
parents:
784
diff
changeset
|
214 continue |
291
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
215 try: |
761
979148947967
svnexternals: generate externals with a revision placeholder
Patrick Mezard <pmezard@gmail.com>
parents:
759
diff
changeset
|
216 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
|
217 except BadDefinition: |
782
1f1aeb1f5ffc
svnexternals: missing EOL in ui.warn()
Patrick Mezard <pmezard@gmail.com>
parents:
781
diff
changeset
|
218 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
|
219 continue |
763
6463b34bbcb6
svnexternals: support subrepos based externals checkout
Patrick Mezard <pmezard@gmail.com>
parents:
762
diff
changeset
|
220 source = resolvesource(ui, svnroot, source) |
6463b34bbcb6
svnexternals: support subrepos based externals checkout
Patrick Mezard <pmezard@gmail.com>
parents:
762
diff
changeset
|
221 if source is None: |
291
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
222 continue |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
223 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
|
224 wpath = canonpath(repo.root, '', wpath) |
761
979148947967
svnexternals: generate externals with a revision placeholder
Patrick Mezard <pmezard@gmail.com>
parents:
759
diff
changeset
|
225 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
|
226 # Check target dirs are not nested |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
227 defs.sort() |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
228 for i, d in enumerate(defs): |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
229 for d2 in defs[i+1:]: |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
230 if d2[0].startswith(d[0] + '/'): |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
231 raise hgutil.Abort(_('external directories cannot nest:\n%s\n%s') |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
232 % (d[0], d2[0])) |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
233 return defs |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
234 |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
235 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
|
236 |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
237 def listdefs(data): |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
238 defs = {} |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
239 exts = externalsfile() |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
240 exts.read(data) |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
241 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
|
242 defs[d[0]] = d |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
243 return defs |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
244 |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
245 ext1 = listdefs(ext1) |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
246 ext2 = listdefs(ext2) |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
247 for wp1 in ext1: |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
248 if wp1 in ext2: |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
249 yield 'u', ext2[wp1] |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
250 else: |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
251 yield 'd', ext1[wp1] |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
252 for wp2 in ext2: |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
253 if wp2 not in ext1: |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
254 yield 'u', ext2[wp2] |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
255 |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
256 def getsvninfo(svnurl): |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
257 """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
|
258 directory path. |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
259 """ |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
260 # 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
|
261 args = ['svn', 'info', '--xml', svnurl] |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
262 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
|
263 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
|
264 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
|
265 stdout = p.communicate()[0] |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
266 if p.returncode: |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
267 raise hgutil.Abort(_('cannot get information about %s') |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
268 % svnurl) |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
269 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
|
270 if not m: |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
271 raise hgutil.Abort(_('cannot find SVN repository root from %s') |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
272 % svnurl) |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
273 root = m.group(1).rstrip('/') |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
274 |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
275 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
|
276 if not m: |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
277 raise hgutil.Abort(_('cannot find SVN repository URL from %s') % svnurl) |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
278 url = m.group(1) |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
279 |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
280 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
|
281 if not m: |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
282 raise hgutil.Abort(_('cannot find SVN revision from %s') % svnurl) |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
283 rev = m.group(1) |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
284 return url, root, rev |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
285 |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
286 class externalsupdater: |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
287 def __init__(self, ui, repo): |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
288 self.repo = repo |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
289 self.ui = ui |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
290 |
315
963d27a0b1c2
svnexternals: do not use peg revisions as --rev replacements
Patrick Mezard <pmezard@gmail.com>
parents:
291
diff
changeset
|
291 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
|
292 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
|
293 revspec = [] |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
294 if rev: |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
295 revspec = ['-r', rev] |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
296 if os.path.isdir(path): |
825
c3450512237d
svnexternals.py: style cleanups
Yonggang Luo <luoyonggang@gmail.com>
parents:
819
diff
changeset
|
297 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
|
298 # 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
|
299 # 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
|
300 # 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
|
301 # 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
|
302 # and updating again. |
291
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
303 if source == exturl: |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
304 if extrev != rev: |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
305 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
|
306 (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
|
307 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
|
308 self.svn(['update'] + revspec, cwd) |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
309 return |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
310 self.delete(wpath) |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
311 cwd, dest = os.path.split(path) |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
312 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
|
313 if not os.path.isdir(cwd): |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
314 os.makedirs(cwd) |
315
963d27a0b1c2
svnexternals: do not use peg revisions as --rev replacements
Patrick Mezard <pmezard@gmail.com>
parents:
291
diff
changeset
|
315 if not pegrev and rev: |
963d27a0b1c2
svnexternals: do not use peg revisions as --rev replacements
Patrick Mezard <pmezard@gmail.com>
parents:
291
diff
changeset
|
316 pegrev = rev |
963d27a0b1c2
svnexternals: do not use peg revisions as --rev replacements
Patrick Mezard <pmezard@gmail.com>
parents:
291
diff
changeset
|
317 if pegrev: |
963d27a0b1c2
svnexternals: do not use peg revisions as --rev replacements
Patrick Mezard <pmezard@gmail.com>
parents:
291
diff
changeset
|
318 source = '%s@%s' % (source, pegrev) |
1456
77da55e0baa4
externals: support peg revisions in URLs
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
1410
diff
changeset
|
319 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
|
320 (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
|
321 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
|
322 |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
323 def delete(self, wpath): |
1503
180e0d5fba2e
join: remove uses of repo.join/wjoin
Durham Goode <durham@fb.com>
parents:
1456
diff
changeset
|
324 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
|
325 if os.path.isdir(path): |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
326 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
|
327 |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
328 def onerror(function, path, excinfo): |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
329 if function is not os.remove: |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
330 raise |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
331 # 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
|
332 s = os.stat(path) |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
333 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
|
334 raise |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
335 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
|
336 os.remove(path) |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
337 |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
338 shutil.rmtree(path, onerror=onerror) |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
339 return 1 |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
340 |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
341 def svn(self, args, cwd): |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
342 args = ['svn'] + args |
1456
77da55e0baa4
externals: support peg revisions in URLs
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
1410
diff
changeset
|
343 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
|
344 shell = os.name == 'nt' |
470
6bfaa9deb432
svnexternals: display svn commands output with --verbose
Patrick Mezard <pmezard@gmail.com>
parents:
387
diff
changeset
|
345 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
|
346 stdout=subprocess.PIPE, stderr=subprocess.STDOUT) |
6bfaa9deb432
svnexternals: display svn commands output with --verbose
Patrick Mezard <pmezard@gmail.com>
parents:
387
diff
changeset
|
347 for line in p.stdout: |
1456
77da55e0baa4
externals: support peg revisions in URLs
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
1410
diff
changeset
|
348 self.ui.debug(line) |
470
6bfaa9deb432
svnexternals: display svn commands output with --verbose
Patrick Mezard <pmezard@gmail.com>
parents:
387
diff
changeset
|
349 p.wait() |
6bfaa9deb432
svnexternals: display svn commands output with --verbose
Patrick Mezard <pmezard@gmail.com>
parents:
387
diff
changeset
|
350 if p.returncode != 0: |
6bfaa9deb432
svnexternals: display svn commands output with --verbose
Patrick Mezard <pmezard@gmail.com>
parents:
387
diff
changeset
|
351 raise hgutil.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
|
352 |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
353 def updateexternals(ui, args, repo, **opts): |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
354 """update repository externals |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
355 """ |
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
|
356 if len(args) > 2: |
291
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
357 raise hgutil.Abort(_('updateexternals expects at most one changeset')) |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
358 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
|
359 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
|
360 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
|
361 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
|
362 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
|
363 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
|
364 if args: |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
365 node = args[0] |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
366 |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
367 svnroot = getsvninfo(svnurl)[1] |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
368 |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
369 # Retrieve current externals status |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
370 try: |
1503
180e0d5fba2e
join: remove uses of repo.join/wjoin
Durham Goode <durham@fb.com>
parents:
1456
diff
changeset
|
371 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
|
372 except IOError: |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
373 oldext = '' |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
374 newext = '' |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
375 ctx = repo[node] |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
376 if '.hgsvnexternals' in ctx: |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
377 newext = ctx['.hgsvnexternals'].data() |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
378 |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
379 updater = externalsupdater(ui, repo) |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
380 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
|
381 for action, ext in actions: |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
382 if action == 'u': |
315
963d27a0b1c2
svnexternals: do not use peg revisions as --rev replacements
Patrick Mezard <pmezard@gmail.com>
parents:
291
diff
changeset
|
383 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
|
384 elif action == 'd': |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
385 updater.delete(ext[0]) |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
386 else: |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
387 raise hgutil.Abort(_('unknown update actions: %r') % action) |
ba8e91a7c077
Add 'updateexternals' to synchronize externals with remote repo.
Patrick Mezard <pmezard@gmail.com>
parents:
286
diff
changeset
|
388 |
1503
180e0d5fba2e
join: remove uses of repo.join/wjoin
Durham Goode <durham@fb.com>
parents:
1456
diff
changeset
|
389 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
|
390 |
6e18d9ab6557
pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents:
470
diff
changeset
|
391 def getchanges(ui, repo, parentctx, exts): |
6e18d9ab6557
pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents:
470
diff
changeset
|
392 """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
|
393 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
|
394 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
|
395 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
|
396 """ |
762
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
397 mode = ui.config('hgsubversion', 'externals', 'svnexternals') |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
398 if mode == 'svnexternals': |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
399 files = { |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
400 '.hgsvnexternals': None, |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
401 } |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
402 if exts: |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
403 files['.hgsvnexternals'] = exts.write() |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
404 elif mode == 'subrepos': |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
405 # 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
|
406 files = { |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
407 '.hgsub': None, |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
408 '.hgsubstate': None, |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
409 } |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
410 if exts: |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
411 defs = parsedefinitions(ui, repo, '', exts) |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
412 hgsub, hgsubstate = [], [] |
825
c3450512237d
svnexternals.py: style cleanups
Yonggang Luo <luoyonggang@gmail.com>
parents:
819
diff
changeset
|
413 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
|
414 hgsub.append('%s = [hgsubversion] %s:%s\n' |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
415 % (path, base, norevline)) |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
416 if rev is None: |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
417 rev = 'HEAD' |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
418 hgsubstate.append('%s %s\n' % (rev, path)) |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
419 files['.hgsub'] = ''.join(hgsub) |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
420 files['.hgsubstate'] = ''.join(hgsubstate) |
776
f025d00bfc4a
svnexternals: add 'ignore' mode to avoid converting externals
Patrick Mezard <pmezard@gmail.com>
parents:
764
diff
changeset
|
421 elif mode == 'ignore': |
f025d00bfc4a
svnexternals: add 'ignore' mode to avoid converting externals
Patrick Mezard <pmezard@gmail.com>
parents:
764
diff
changeset
|
422 files = {} |
762
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
423 else: |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
424 raise hgutil.Abort(_('unknown externals modes: %s') % mode) |
757
6e18d9ab6557
pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents:
470
diff
changeset
|
425 |
6e18d9ab6557
pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents:
470
diff
changeset
|
426 # Should the really be updated? |
6e18d9ab6557
pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents:
470
diff
changeset
|
427 updates = {} |
6e18d9ab6557
pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents:
470
diff
changeset
|
428 for fn, data in files.iteritems(): |
6e18d9ab6557
pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents:
470
diff
changeset
|
429 if data is not None: |
6e18d9ab6557
pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents:
470
diff
changeset
|
430 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
|
431 updates[fn] = data |
6e18d9ab6557
pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents:
470
diff
changeset
|
432 else: |
6e18d9ab6557
pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents:
470
diff
changeset
|
433 if fn in parentctx: |
6e18d9ab6557
pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents:
470
diff
changeset
|
434 updates[fn] = None |
6e18d9ab6557
pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents:
470
diff
changeset
|
435 return updates |
758
76ebfc41f490
svnexternals: hide .hgsvnexternals parsing in parse()
Patrick Mezard <pmezard@gmail.com>
parents:
757
diff
changeset
|
436 |
762
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
437 def parse(ui, ctx): |
758
76ebfc41f490
svnexternals: hide .hgsvnexternals parsing in parse()
Patrick Mezard <pmezard@gmail.com>
parents:
757
diff
changeset
|
438 """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
|
439 externalsfile(). |
76ebfc41f490
svnexternals: hide .hgsvnexternals parsing in parse()
Patrick Mezard <pmezard@gmail.com>
parents:
757
diff
changeset
|
440 """ |
76ebfc41f490
svnexternals: hide .hgsvnexternals parsing in parse()
Patrick Mezard <pmezard@gmail.com>
parents:
757
diff
changeset
|
441 external = externalsfile() |
762
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
442 mode = ui.config('hgsubversion', 'externals', 'svnexternals') |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
443 if mode == 'svnexternals': |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
444 if '.hgsvnexternals' in ctx: |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
445 external.read(ctx['.hgsvnexternals'].data()) |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
446 elif mode == 'subrepos': |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
447 for path in ctx.substate: |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
448 src, rev = ctx.substate[path][:2] |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
449 base, norevline = src.split(':', 1) |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
450 base = base.strip() |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
451 if rev is None: |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
452 rev = 'HEAD' |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
453 line = norevline.replace('{REV}', rev) |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
454 external.setdefault(base, []).append(line) |
776
f025d00bfc4a
svnexternals: add 'ignore' mode to avoid converting externals
Patrick Mezard <pmezard@gmail.com>
parents:
764
diff
changeset
|
455 elif mode == 'ignore': |
f025d00bfc4a
svnexternals: add 'ignore' mode to avoid converting externals
Patrick Mezard <pmezard@gmail.com>
parents:
764
diff
changeset
|
456 pass |
762
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
457 else: |
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
458 raise hgutil.Abort(_('unknown externals modes: %s') % mode) |
758
76ebfc41f490
svnexternals: hide .hgsvnexternals parsing in parse()
Patrick Mezard <pmezard@gmail.com>
parents:
757
diff
changeset
|
459 return external |
762
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
761
diff
changeset
|
460 |
1407
963946d7dfd7
externals: update for Mercurial 3.8's new subrepo API
Augie Fackler <raf@durin42.com>
parents:
1295
diff
changeset
|
461 _notset = object() |
963946d7dfd7
externals: update for Mercurial 3.8's new subrepo API
Augie Fackler <raf@durin42.com>
parents:
1295
diff
changeset
|
462 |
1118
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
463 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
|
464 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
|
465 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
|
466 if allowcreate is _notset: |
963946d7dfd7
externals: update for Mercurial 3.8's new subrepo API
Augie Fackler <raf@durin42.com>
parents:
1295
diff
changeset
|
467 # 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
|
468 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
|
469 else: |
963946d7dfd7
externals: update for Mercurial 3.8's new subrepo API
Augie Fackler <raf@durin42.com>
parents:
1295
diff
changeset
|
470 # 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
|
471 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
|
472 # 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
|
473 # everywhere to maintain compatibility across versions |
9d5cff8d7f67
svnexternals: fix for Mercurial 3.3+
Siddharth Agarwal <sid0@fb.com>
parents:
1119
diff
changeset
|
474 if not hgutil.safehasattr(self, 'ui'): |
9d5cff8d7f67
svnexternals: fix for Mercurial 3.3+
Siddharth Agarwal <sid0@fb.com>
parents:
1119
diff
changeset
|
475 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
|
476 |
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
477 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
|
478 # Resolve source first |
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
479 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
|
480 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
|
481 try: |
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
482 # 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
|
483 # Assume the externals is absolute. |
1295
9d5cff8d7f67
svnexternals: fix for Mercurial 3.3+
Siddharth Agarwal <sid0@fb.com>
parents:
1119
diff
changeset
|
484 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
|
485 except RelativeSourceError: |
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
486 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
|
487 svnroot = getsvninfo(util.normalize_url(svnurl))[1] |
1295
9d5cff8d7f67
svnexternals: fix for Mercurial 3.3+
Siddharth Agarwal <sid0@fb.com>
parents:
1119
diff
changeset
|
488 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
|
489 # 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
|
490 # 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
|
491 # 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
|
492 # the time. |
1118
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
493 state = (source, state[1]) |
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
494 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
|
495 |
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
496 def dirty(self, ignoreupdate=False): |
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
497 # 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
|
498 # can be anything. |
1404
c79fdd5f615d
cleanup: stop using hasattr
Augie Fackler <raf@durin42.com>
parents:
1352
diff
changeset
|
499 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
|
500 wcrevs = self._wcrevs() |
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
501 else: |
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
502 wcrev = self._wcrev() |
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
503 wcrevs = (wcrev, wcrev) |
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
504 if (('HEAD' in wcrevs or self._state[1] == 'HEAD' or |
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
505 self._state[1] in wcrevs or ignoreupdate) |
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
506 and not self._wcchanged()[0]): |
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
507 return False |
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
508 return True |
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
509 |
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
510 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
|
511 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
|
512 # Keep unversioned externals unversioned |
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
513 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
|
514 rev = 'HEAD' |
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
515 return rev |
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
516 |
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
517 def basestate(self): |
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
518 # 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
|
519 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
|
520 return 'HEAD' |
5490194e688e
svnexternals: remove pre-1.7 code and reindent
Sean Farley <sean.michael.farley@gmail.com>
parents:
1100
diff
changeset
|
521 return super(svnsubrepo, self).basestate() |
1352
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
522 |
30193fdd5da4
Addressed using relative URLs to actually divert to another server & added DocTest strings.
Gadget Steve <gadgetsteve@hotmail.com>
parents:
1351
diff
changeset
|
523 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
|
524 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
|
525 doctest.testmod() |