source: tailor/vcpx/tests/darcs.py @ 932

Revision 932, 7.1 KB checked in by lele@…, 8 years ago (diff)

Use an incremental parser for darcs changes
Now the changesets_from_darcschanges() function is a generator, and does
not reorder changeset by date, which was wrong and useless.

Line 
1# -*- mode: python; coding: utf-8 -*-
2# :Progetto: vcpx -- Darcs specific tests
3# :Creato:   sab 17 lug 2004 02:33:41 CEST
4# :Autore:   Lele Gaifax <lele@nautilus.homeip.net>
5# :Licenza:  GNU General Public License
6#
7
8from unittest import TestCase
9from datetime import datetime
10from StringIO import StringIO
11from vcpx.darcs import changesets_from_darcschanges
12from shwrap import ExternalCommand, PIPE
13
14class DarcsChangesParser(TestCase):
15    """Tests for the parser of darcs changes"""
16
17    SIMPLE_TEST = """\
18<changelog>
19<patch author='lele@nautilus.homeip.net' date='20040716123737' local_date='Fri Jul 16 14:37:37 CEST 2004' inverted='False' hash='20040716123737-97f81-9db0d923d2ba6f4c3808cb04a4ae4cf99fed185b.gz'>
20        <name>Fix the CVS parser to omit already seen changesets</name>
21        <comment>For some unknown reasons....</comment>
22
23    <summary>
24    <modify_file>vcpx/cvs.py<removed_lines num='4'/><added_lines num='11'/></modify_file>
25    <modify_file>vcpx/tests/cvs.py<removed_lines num='14'/><added_lines num='32'/></modify_file>
26    </summary>
27
28</patch>
29
30<patch author='lele@nautilus.homeip.net' date='20040601140559' local_date='Tue Jun  1 16:05:59 CEST 2004' inverted='False' hash='20040601140559-97f81-b669594864cb35290fbe4848e6645e73057a8caf.gz'>
31        <name>Svn log parser with test</name>
32
33    <summary>
34    <modify_file>cvsync/svn.py<removed_lines num='1'/><added_lines num='93'/></modify_file>
35    <modify_file>cvsync/tests/__init__.py<added_lines num='1'/></modify_file>
36    <add_file>cvsync/tests/svn.py</add_file>
37    <add_file>cvsync/tests/testrepo.dump</add_file>
38    </summary>
39
40</patch>
41
42</changelog>
43"""
44
45    def testBasicBehaviour(self):
46        """Verify basic darcs changes parser behaviour"""
47
48        log = StringIO(self.SIMPLE_TEST)
49
50        csets = changesets_from_darcschanges(log)
51
52        cset = csets.next()
53        self.assertEqual(cset.revision,
54                         "Fix the CVS parser to omit already seen changesets")
55        self.assertEqual(cset.author, "lele@nautilus.homeip.net")
56        self.assertEqual(cset.date, datetime(2004, 7, 16, 12, 37, 37))
57        self.assertEqual(cset.log,
58                         "Fix the CVS parser to omit already seen changesets\n"
59                         "For some unknown reasons....")
60        entry = cset.entries[0]
61        self.assertEqual(entry.name, 'vcpx/cvs.py')
62        self.assertEqual(entry.action_kind, entry.UPDATED)
63
64        cset = csets.next()
65        self.assertEqual(cset.revision,
66                         "Svn log parser with test")
67        self.assertEqual(cset.date, datetime(2004, 6, 1, 14, 5, 59))
68        self.assertEqual(len(cset.entries), 4)
69        self.assertEqual(cset.darcs_hash,
70                         '20040601140559-97f81-b669594864cb35290fbe4848e6645e73057a8caf.gz')
71
72        entry = cset.entries[0]
73        self.assertEqual(entry.name, 'cvsync/svn.py')
74        self.assertEqual(entry.action_kind, entry.UPDATED)
75        entry = cset.entries[1]
76        self.assertEqual(entry.name, 'cvsync/tests/__init__.py')
77        self.assertEqual(entry.action_kind, entry.UPDATED)
78        entry = cset.entries[2]
79        self.assertEqual(entry.name, 'cvsync/tests/svn.py')
80        self.assertEqual(entry.action_kind, entry.ADDED)
81        entry = cset.entries[3]
82        self.assertEqual(entry.name, 'cvsync/tests/testrepo.dump')
83        self.assertEqual(entry.action_kind, entry.ADDED)
84
85    def testOnTailorOwnRepo(self):
86        """Verify fetching unidiff of a darcs patch"""
87
88        from os import getcwd
89
90        patchname = 'more detailed diags on SAXException'
91        changes = ExternalCommand(command=["darcs", "changes", "--xml", "--summary",
92                                           "--patches", patchname])
93        csets = changesets_from_darcschanges(changes.execute(stdout=PIPE)[0],
94                                             unidiff=True,
95                                             repodir=getcwd())
96        unidiff = csets.next().unidiff
97        head = unidiff.split('\n')[0]
98        self.assertEqual(head, 'Thu Jun  9 22:17:11 CEST 2005  zooko@zooko.com')
99
100    ALL_ACTIONS_TEST = """\
101<changelog>
102<patch author='' date='20050811140203' local_date='Thu Aug 11 16:02:03 CEST 2005' inverted='False' hash='20050811140203-da39a-0a36c886b2479b20ab9188781fe2e51f9a50a175.gz'>
103        <name>first</name>
104    <summary>
105    <add_file>
106    a.txt
107    </add_file>
108    <add_directory>
109    dir
110    </add_directory>
111    </summary>
112</patch>
113<patch author='' date='20050811140254' local_date='Thu Aug 11 16:02:54 CEST 2005' inverted='False' hash='20050811140254-da39a-b2ad279f1d7edae8e07b7b1ea8f3e63dbb242bf0.gz'>
114        <name>removed</name>
115    <summary>
116    <remove_directory>
117    dir
118    </remove_directory>
119    </summary>
120</patch>
121<patch author='' date='20050811140314' local_date='Thu Aug 11 16:03:14 CEST 2005' inverted='False' hash='20050811140314-da39a-de701bff466827b91e51658e411c768f43abc1b0.gz'>
122        <name>moved</name>
123    <summary>
124    <move from="bdir" to="dir"/>
125    <add_directory>
126    bdir
127    </add_directory>
128    </summary>
129</patch>
130<patch author='lele@metapensiero.it' date='20050811143245' local_date='Thu Aug 11 16:32:45 CEST 2005' inverted='False' hash='20050811143245-7a6fb-663bb3085e9b7996f554e4bd9d2f0b13208d65e0.gz'>
131        <name>modified</name>
132    <summary>
133    <modify_file>
134    a.txt<added_lines num='3'/>
135    </modify_file>
136    </summary>
137</patch>
138</changelog>
139"""
140
141    def testAllActions(self):
142        """Verify darcs changes parser understand all actions"""
143
144        log = StringIO(self.ALL_ACTIONS_TEST)
145
146        csets = list(changesets_from_darcschanges(log))
147
148        self.assertEqual(len(csets), 4)
149
150        cset = csets[0]
151        self.assertEqual(cset.revision, 'first')
152        self.assertEqual(len(cset.entries), 2)
153
154        entry = cset.entries[0]
155        self.assertEqual(entry.name, 'a.txt')
156        self.assertEqual(entry.action_kind, entry.ADDED)
157        entry = cset.entries[1]
158        self.assertEqual(entry.name, 'dir')
159        self.assertEqual(entry.action_kind, entry.ADDED)
160
161        cset = csets[1]
162        self.assertEqual(cset.revision, 'removed')
163        self.assertEqual(len(cset.entries), 1)
164
165        entry = cset.entries[0]
166        self.assertEqual(entry.name, 'dir')
167        self.assertEqual(entry.action_kind, entry.DELETED)
168
169        cset = csets[2]
170        self.assertEqual(cset.revision, 'moved')
171        self.assertEqual(len(cset.entries), 2)
172
173        entry = cset.entries[0]
174        self.assertEqual(entry.name, 'bdir')
175        self.assertEqual(entry.action_kind, entry.ADDED)
176
177        entry = cset.entries[1]
178        self.assertEqual(entry.name, 'dir')
179        self.assertEqual(entry.action_kind, entry.RENAMED)
180
181        cset = csets[3]
182        self.assertEqual(cset.revision, 'modified')
183        self.assertEqual(len(cset.entries), 1)
184
185        entry = cset.entries[0]
186        self.assertEqual(entry.name, 'a.txt')
187        self.assertEqual(entry.action_kind, entry.UPDATED)
188
189    def testIncrementalParser(self):
190        """Verify that the parser is effectively incremental"""
191
192        log = StringIO(self.ALL_ACTIONS_TEST)
193
194        csets = list(changesets_from_darcschanges(log, chunksize=100))
195        self.assertEqual(len(csets), 4)
Note: See TracBrowser for help on using the repository browser.