Path encoding is a little suspect in here, but it's not worse than it
was when we were on Python 2 only.
Subversion subrepo tests now pass in Python 3.
Path encoding is a little suspect in here, but it's not worse than it
was when we were on Python 2 only.
Subversion subrepo tests now pass in Python 3.
Automatic diff as part of commit; lint not applicable. |
Automatic diff as part of commit; unit tests not applicable. |
del env['LC_ALL'] | del env['LC_ALL'] | ||||
env['LC_MESSAGES'] = 'C' | env['LC_MESSAGES'] = 'C' | ||||
p = subprocess.Popen(pycompat.rapply(procutil.tonativestr, cmd), | p = subprocess.Popen(pycompat.rapply(procutil.tonativestr, cmd), | ||||
bufsize=-1, close_fds=procutil.closefds, | bufsize=-1, close_fds=procutil.closefds, | ||||
stdout=subprocess.PIPE, stderr=subprocess.PIPE, | stdout=subprocess.PIPE, stderr=subprocess.PIPE, | ||||
universal_newlines=True, | universal_newlines=True, | ||||
env=procutil.tonativeenv(env), **extrakw) | env=procutil.tonativeenv(env), **extrakw) | ||||
stdout, stderr = p.communicate() | stdout, stderr = p.communicate() | ||||
stdout, stderr = pycompat.fsencode(stdout), pycompat.fsencode(stderr) | |||||
stderr = stderr.strip() | stderr = stderr.strip() | ||||
if not failok: | if not failok: | ||||
if p.returncode: | if p.returncode: | ||||
raise error.Abort(stderr or 'exited with code %d' | raise error.Abort(stderr or 'exited with code %d' | ||||
% p.returncode) | % p.returncode) | ||||
if stderr: | if stderr: | ||||
self.ui.warn(stderr + '\n') | self.ui.warn(stderr + '\n') | ||||
return stdout, stderr | return stdout, stderr | ||||
return not self.wvfs.exists('.svn') | return not self.wvfs.exists('.svn') | ||||
def _wcrevs(self): | def _wcrevs(self): | ||||
# Get the working directory revision as well as the last | # Get the working directory revision as well as the last | ||||
# commit revision so we can compare the subrepo state with | # commit revision so we can compare the subrepo state with | ||||
# both. We used to store the working directory one. | # both. We used to store the working directory one. | ||||
output, err = self._svncommand(['info', '--xml']) | output, err = self._svncommand(['info', '--xml']) | ||||
doc = xml.dom.minidom.parseString(output) | doc = xml.dom.minidom.parseString(output) | ||||
entries = doc.getElementsByTagName('entry') | entries = doc.getElementsByTagName(r'entry') | ||||
lastrev, rev = '0', '0' | lastrev, rev = '0', '0' | ||||
if entries: | if entries: | ||||
rev = str(entries[0].getAttribute('revision')) or '0' | rev = pycompat.bytestr(entries[0].getAttribute(r'revision')) or '0' | ||||
commits = entries[0].getElementsByTagName('commit') | commits = entries[0].getElementsByTagName(r'commit') | ||||
if commits: | if commits: | ||||
lastrev = str(commits[0].getAttribute('revision')) or '0' | lastrev = pycompat.bytestr( | ||||
commits[0].getAttribute(r'revision')) or '0' | |||||
return (lastrev, rev) | return (lastrev, rev) | ||||
def _wcrev(self): | def _wcrev(self): | ||||
return self._wcrevs()[0] | return self._wcrevs()[0] | ||||
def _wcchanged(self): | def _wcchanged(self): | ||||
"""Return (changes, extchanges, missing) where changes is True | """Return (changes, extchanges, missing) where changes is True | ||||
if the working directory was changed, extchanges is | if the working directory was changed, extchanges is | ||||
True if any of these changes concern an external entry and missing | True if any of these changes concern an external entry and missing | ||||
is True if any change is a missing entry. | is True if any change is a missing entry. | ||||
""" | """ | ||||
output, err = self._svncommand(['status', '--xml']) | output, err = self._svncommand(['status', '--xml']) | ||||
externals, changes, missing = [], [], [] | externals, changes, missing = [], [], [] | ||||
doc = xml.dom.minidom.parseString(output) | doc = xml.dom.minidom.parseString(output) | ||||
for e in doc.getElementsByTagName('entry'): | for e in doc.getElementsByTagName(r'entry'): | ||||
s = e.getElementsByTagName('wc-status') | s = e.getElementsByTagName(r'wc-status') | ||||
if not s: | if not s: | ||||
continue | continue | ||||
item = s[0].getAttribute('item') | item = s[0].getAttribute(r'item') | ||||
props = s[0].getAttribute('props') | props = s[0].getAttribute(r'props') | ||||
path = e.getAttribute('path') | path = e.getAttribute(r'path').encode('utf8') | ||||
if item == 'external': | if item == r'external': | ||||
externals.append(path) | externals.append(path) | ||||
elif item == 'missing': | elif item == r'missing': | ||||
missing.append(path) | missing.append(path) | ||||
if (item not in ('', 'normal', 'unversioned', 'external') | if (item not in (r'', r'normal', r'unversioned', r'external') | ||||
or props not in ('', 'none', 'normal')): | or props not in (r'', r'none', r'normal')): | ||||
changes.append(path) | changes.append(path) | ||||
for path in changes: | for path in changes: | ||||
for ext in externals: | for ext in externals: | ||||
if path == ext or path.startswith(ext + pycompat.ossep): | if path == ext or path.startswith(ext + pycompat.ossep): | ||||
return True, True, bool(missing) | return True, True, bool(missing) | ||||
return bool(changes), False, bool(missing) | return bool(changes), False, bool(missing) | ||||
@annotatesubrepoerror | @annotatesubrepoerror | ||||
# push is a no-op for SVN | # push is a no-op for SVN | ||||
return True | return True | ||||
@annotatesubrepoerror | @annotatesubrepoerror | ||||
def files(self): | def files(self): | ||||
output = self._svncommand(['list', '--recursive', '--xml'])[0] | output = self._svncommand(['list', '--recursive', '--xml'])[0] | ||||
doc = xml.dom.minidom.parseString(output) | doc = xml.dom.minidom.parseString(output) | ||||
paths = [] | paths = [] | ||||
for e in doc.getElementsByTagName('entry'): | for e in doc.getElementsByTagName(r'entry'): | ||||
kind = pycompat.bytestr(e.getAttribute('kind')) | kind = pycompat.bytestr(e.getAttribute(r'kind')) | ||||
if kind != 'file': | if kind != 'file': | ||||
continue | continue | ||||
name = ''.join(c.data for c | name = r''.join(c.data for c | ||||
in e.getElementsByTagName('name')[0].childNodes | in e.getElementsByTagName(r'name')[0].childNodes | ||||
if c.nodeType == c.TEXT_NODE) | if c.nodeType == c.TEXT_NODE) | ||||
paths.append(name.encode('utf-8')) | paths.append(name.encode('utf8')) | ||||
return paths | return paths | ||||
def filedata(self, name, decode): | def filedata(self, name, decode): | ||||
return self._svncommand(['cat'], name)[0] | return self._svncommand(['cat'], name)[0] | ||||
class gitsubrepo(abstractsubrepo): | class gitsubrepo(abstractsubrepo): | ||||
def __init__(self, ctx, path, state, allowcreate): | def __init__(self, ctx, path, state, allowcreate): |