annotate hgsubversion/svnexternals.py @ 1556:53d170a6c3c8

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