Mercurial > hgsubversion
annotate hgsubversion/svnexternals.py @ 1503:180e0d5fba2e
join: remove uses of repo.join/wjoin
Upstream Mercurial has dropped these functions as of 4.3. Let's switch to the
appropriate repo.[w]vfs.join functions.
author | Durham Goode <durham@fb.com> |
---|---|
date | Tue, 09 May 2017 15:20:16 -0700 |
parents | 77da55e0baa4 |
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() |