##// END OF EJS Templates
test-convert-darcs: skip if we can't find the elementtree module...
Alexis S. L. Carvalho -
r5520:cc3af86a default
parent child Browse files
Show More
@@ -1,140 +1,145 b''
1 # darcs support for the convert extension
1 # darcs support for the convert extension
2
2
3 from common import NoRepo, commit, converter_source
3 from common import NoRepo, commit, converter_source
4 from mercurial.i18n import _
4 from mercurial.i18n import _
5 from mercurial import util
5 from mercurial import util
6 import os, shutil, tempfile
6 import os, shutil, tempfile
7
7
8 # The naming drift of ElementTree is fun!
8 # The naming drift of ElementTree is fun!
9
9
10 try: from xml.etree.cElementTree import ElementTree
10 try: from xml.etree.cElementTree import ElementTree
11 except ImportError:
11 except ImportError:
12 try: from xml.etree.ElementTree import ElementTree
12 try: from xml.etree.ElementTree import ElementTree
13 except ImportError:
13 except ImportError:
14 try: from elementtree.cElementTree import ElementTree
14 try: from elementtree.cElementTree import ElementTree
15 except ImportError:
15 except ImportError:
16 try: from elementtree.ElementTree import ElementTree
16 try: from elementtree.ElementTree import ElementTree
17 except ImportError: ElementTree = None
17 except ImportError: ElementTree = None
18
18
19
19
20 class darcs_source(converter_source):
20 class darcs_source(converter_source):
21 def __init__(self, ui, path, rev=None):
21 def __init__(self, ui, path, rev=None):
22 super(darcs_source, self).__init__(ui, path, rev=rev)
22 super(darcs_source, self).__init__(ui, path, rev=rev)
23
23
24 if not os.path.exists(os.path.join(path, '_darcs', 'inventory')):
24 # check for _darcs, ElementTree, _darcs/inventory so that we can
25 # easily skip test-convert-darcs if ElementTree is not around
26 if not os.path.exists(os.path.join(path, '_darcs')):
25 raise NoRepo("couldn't open darcs repo %s" % path)
27 raise NoRepo("couldn't open darcs repo %s" % path)
26
28
27 if ElementTree is None:
29 if ElementTree is None:
28 raise util.Abort(_("Python ElementTree module is not available"))
30 raise util.Abort(_("Python ElementTree module is not available"))
29
31
32 if not os.path.exists(os.path.join(path, '_darcs', 'inventory')):
33 raise NoRepo("couldn't open darcs repo %s" % path)
34
30 self.path = os.path.realpath(path)
35 self.path = os.path.realpath(path)
31
36
32 self.lastrev = None
37 self.lastrev = None
33 self.changes = {}
38 self.changes = {}
34 self.parents = {}
39 self.parents = {}
35 self.tags = {}
40 self.tags = {}
36
41
37 def before(self):
42 def before(self):
38 self.tmppath = tempfile.mkdtemp(
43 self.tmppath = tempfile.mkdtemp(
39 prefix='convert-' + os.path.basename(self.path) + '-')
44 prefix='convert-' + os.path.basename(self.path) + '-')
40 output, status = self.run('init', repodir=self.tmppath)
45 output, status = self.run('init', repodir=self.tmppath)
41 self.checkexit(status)
46 self.checkexit(status)
42
47
43 tree = self.xml('changes', '--xml-output', '--summary')
48 tree = self.xml('changes', '--xml-output', '--summary')
44 tagname = None
49 tagname = None
45 child = None
50 child = None
46 for elt in tree.findall('patch'):
51 for elt in tree.findall('patch'):
47 node = elt.get('hash')
52 node = elt.get('hash')
48 name = elt.findtext('name', '')
53 name = elt.findtext('name', '')
49 if name.startswith('TAG '):
54 if name.startswith('TAG '):
50 tagname = name[4:].strip()
55 tagname = name[4:].strip()
51 elif tagname is not None:
56 elif tagname is not None:
52 self.tags[tagname] = node
57 self.tags[tagname] = node
53 tagname = None
58 tagname = None
54 self.changes[node] = elt
59 self.changes[node] = elt
55 self.parents[child] = [node]
60 self.parents[child] = [node]
56 child = node
61 child = node
57 self.parents[child] = []
62 self.parents[child] = []
58
63
59 def after(self):
64 def after(self):
60 self.ui.debug('cleaning up %s\n' % self.tmppath)
65 self.ui.debug('cleaning up %s\n' % self.tmppath)
61 shutil.rmtree(self.tmppath, ignore_errors=True)
66 shutil.rmtree(self.tmppath, ignore_errors=True)
62
67
63 def _run(self, cmd, *args, **kwargs):
68 def _run(self, cmd, *args, **kwargs):
64 cmdline = ['darcs', cmd, '--repodir', kwargs.get('repodir', self.path)]
69 cmdline = ['darcs', cmd, '--repodir', kwargs.get('repodir', self.path)]
65 cmdline += args
70 cmdline += args
66 cmdline = [util.shellquote(arg) for arg in cmdline]
71 cmdline = [util.shellquote(arg) for arg in cmdline]
67 cmdline += ['<', util.nulldev]
72 cmdline += ['<', util.nulldev]
68 cmdline = ' '.join(cmdline)
73 cmdline = ' '.join(cmdline)
69 self.ui.debug(cmdline, '\n')
74 self.ui.debug(cmdline, '\n')
70 return util.popen(cmdline)
75 return util.popen(cmdline)
71
76
72 def run(self, cmd, *args, **kwargs):
77 def run(self, cmd, *args, **kwargs):
73 fp = self._run(cmd, *args, **kwargs)
78 fp = self._run(cmd, *args, **kwargs)
74 output = fp.read()
79 output = fp.read()
75 return output, fp.close()
80 return output, fp.close()
76
81
77 def checkexit(self, status, output=''):
82 def checkexit(self, status, output=''):
78 if status:
83 if status:
79 if output:
84 if output:
80 self.ui.warn(_('darcs error:\n'))
85 self.ui.warn(_('darcs error:\n'))
81 self.ui.warn(output)
86 self.ui.warn(output)
82 msg = util.explain_exit(status)[0]
87 msg = util.explain_exit(status)[0]
83 raise util.Abort(_('darcs %s') % msg)
88 raise util.Abort(_('darcs %s') % msg)
84
89
85 def xml(self, cmd, *opts):
90 def xml(self, cmd, *opts):
86 etree = ElementTree()
91 etree = ElementTree()
87 fp = self._run(cmd, *opts)
92 fp = self._run(cmd, *opts)
88 etree.parse(fp)
93 etree.parse(fp)
89 self.checkexit(fp.close())
94 self.checkexit(fp.close())
90 return etree.getroot()
95 return etree.getroot()
91
96
92 def getheads(self):
97 def getheads(self):
93 return self.parents[None]
98 return self.parents[None]
94
99
95 def getcommit(self, rev):
100 def getcommit(self, rev):
96 elt = self.changes[rev]
101 elt = self.changes[rev]
97 date = util.strdate(elt.get('local_date'), '%a %b %d %H:%M:%S %Z %Y')
102 date = util.strdate(elt.get('local_date'), '%a %b %d %H:%M:%S %Z %Y')
98 desc = elt.findtext('name') + '\n' + elt.findtext('comment', '')
103 desc = elt.findtext('name') + '\n' + elt.findtext('comment', '')
99 return commit(author=elt.get('author'), date=util.datestr(date),
104 return commit(author=elt.get('author'), date=util.datestr(date),
100 desc=desc.strip(), parents=self.parents[rev])
105 desc=desc.strip(), parents=self.parents[rev])
101
106
102 def pull(self, rev):
107 def pull(self, rev):
103 output, status = self.run('pull', self.path, '--all',
108 output, status = self.run('pull', self.path, '--all',
104 '--match', 'hash %s' % rev,
109 '--match', 'hash %s' % rev,
105 '--no-test', '--no-posthook',
110 '--no-test', '--no-posthook',
106 '--external-merge', '/bin/false',
111 '--external-merge', '/bin/false',
107 repodir=self.tmppath)
112 repodir=self.tmppath)
108 if status:
113 if status:
109 if output.find('We have conflicts in') == -1:
114 if output.find('We have conflicts in') == -1:
110 self.checkexit(status, output)
115 self.checkexit(status, output)
111 output, status = self.run('revert', '--all', repodir=self.tmppath)
116 output, status = self.run('revert', '--all', repodir=self.tmppath)
112 self.checkexit(status, output)
117 self.checkexit(status, output)
113
118
114 def getchanges(self, rev):
119 def getchanges(self, rev):
115 self.pull(rev)
120 self.pull(rev)
116 copies = {}
121 copies = {}
117 changes = []
122 changes = []
118 for elt in self.changes[rev].find('summary').getchildren():
123 for elt in self.changes[rev].find('summary').getchildren():
119 if elt.tag in ('add_directory', 'remove_directory'):
124 if elt.tag in ('add_directory', 'remove_directory'):
120 continue
125 continue
121 if elt.tag == 'move':
126 if elt.tag == 'move':
122 changes.append((elt.get('from'), rev))
127 changes.append((elt.get('from'), rev))
123 copies[elt.get('from')] = elt.get('to')
128 copies[elt.get('from')] = elt.get('to')
124 else:
129 else:
125 changes.append((elt.text.strip(), rev))
130 changes.append((elt.text.strip(), rev))
126 changes.sort()
131 changes.sort()
127 self.lastrev = rev
132 self.lastrev = rev
128 return changes, copies
133 return changes, copies
129
134
130 def getfile(self, name, rev):
135 def getfile(self, name, rev):
131 if rev != self.lastrev:
136 if rev != self.lastrev:
132 raise util.Abort(_('internal calling inconsistency'))
137 raise util.Abort(_('internal calling inconsistency'))
133 return open(os.path.join(self.tmppath, name), 'rb').read()
138 return open(os.path.join(self.tmppath, name), 'rb').read()
134
139
135 def getmode(self, name, rev):
140 def getmode(self, name, rev):
136 mode = os.lstat(os.path.join(self.tmppath, name)).st_mode
141 mode = os.lstat(os.path.join(self.tmppath, name)).st_mode
137 return (mode & 0111) and 'x' or ''
142 return (mode & 0111) and 'x' or ''
138
143
139 def gettags(self):
144 def gettags(self):
140 return self.tags
145 return self.tags
@@ -1,53 +1,61 b''
1 #!/bin/sh
1 #!/bin/sh
2
2
3 "$TESTDIR/hghave" darcs || exit 80
3 "$TESTDIR/hghave" darcs || exit 80
4
4
5 echo "[extensions]" >> $HGRCPATH
5 echo "[extensions]" >> $HGRCPATH
6 echo "convert=" >> $HGRCPATH
6 echo "convert=" >> $HGRCPATH
7 echo 'hgext.graphlog =' >> $HGRCPATH
7 echo 'hgext.graphlog =' >> $HGRCPATH
8
8
9 DARCS_EMAIL='test@example.org'; export DARCS_EMAIL
9 DARCS_EMAIL='test@example.org'; export DARCS_EMAIL
10 HOME=do_not_use_HOME_darcs; export HOME
10 HOME=do_not_use_HOME_darcs; export HOME
11
11
12 # skip if we can't import elementtree
13 mkdir dummy
14 mkdir dummy/_darcs
15 if hg convert dummy 2>&1 | grep ElementTree > /dev/null; then
16 echo 'hghave: missing feature: elementtree module'
17 exit 80
18 fi
19
12 echo % initialize darcs repo
20 echo % initialize darcs repo
13 mkdir darcs-repo
21 mkdir darcs-repo
14 cd darcs-repo
22 cd darcs-repo
15 darcs init
23 darcs init
16 echo a > a
24 echo a > a
17 darcs record -a -l -m p0
25 darcs record -a -l -m p0
18 cd ..
26 cd ..
19
27
20 echo % branch and update
28 echo % branch and update
21 darcs get darcs-repo darcs-clone
29 darcs get darcs-repo darcs-clone
22 cd darcs-clone
30 cd darcs-clone
23 echo c >> a
31 echo c >> a
24 echo c > c
32 echo c > c
25 darcs record -a -l -m p1.1
33 darcs record -a -l -m p1.1
26 cd ..
34 cd ..
27
35
28 echo % update source
36 echo % update source
29 cd darcs-repo
37 cd darcs-repo
30 echo b >> a
38 echo b >> a
31 echo b > b
39 echo b > b
32 darcs record -a -l -m p1.2
40 darcs record -a -l -m p1.2
33
41
34 echo % merge branch
42 echo % merge branch
35 darcs pull -a ../darcs-clone
43 darcs pull -a ../darcs-clone
36 echo e > a
44 echo e > a
37 darcs record -a -l -m p2
45 darcs record -a -l -m p2
38 cd ..
46 cd ..
39
47
40 glog()
48 glog()
41 {
49 {
42 hg glog --template '#rev# "#desc|firstline#" files: #files#\n' "$@"
50 hg glog --template '#rev# "#desc|firstline#" files: #files#\n' "$@"
43 }
51 }
44
52
45 hg convert darcs-repo darcs-repo-hg
53 hg convert darcs-repo darcs-repo-hg
46 # The converter does not currently handle patch conflicts very well.
54 # The converter does not currently handle patch conflicts very well.
47 # When they occur, it reverts *all* changes and moves forward,
55 # When they occur, it reverts *all* changes and moves forward,
48 # letting the conflict resolving patch fix collisions.
56 # letting the conflict resolving patch fix collisions.
49 # Unfortunately, non-conflicting changes, like the addition of the
57 # Unfortunately, non-conflicting changes, like the addition of the
50 # "c" file in p1.1 patch are reverted too.
58 # "c" file in p1.1 patch are reverted too.
51 # Just to say that manifest not listing "c" here is a bug.
59 # Just to say that manifest not listing "c" here is a bug.
52 glog -R darcs-repo-hg
60 glog -R darcs-repo-hg
53 hg -R darcs-repo-hg manifest --debug
61 hg -R darcs-repo-hg manifest --debug
General Comments 0
You need to be logged in to leave comments. Login now