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

Revision 1499, 11.5 KB checked in by lele@…, 5 years ago (diff)

Reduce "rename A B"+"add B" to "add B"

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 datetime import datetime
9from StringIO import StringIO
10from unittest import TestCase
11from vcpx.repository.darcs.source import changesets_from_darcschanges, \
12     DarcsSourceWorkingDir
13from vcpx.shwrap import ExternalCommand, PIPE
14from vcpx.tzinfo import UTC
15
16
17class DarcsParserTestCase(TestCase):
18
19    def getDarcsOutput(self, testname, ext='.log'):
20        from os.path import split, join
21
22        logfilename = join(split(__file__)[0], 'data', testname+ext)
23        return file(logfilename)
24
25
26class DarcsChangesParser(DarcsParserTestCase):
27    """Tests for the parser of darcs changes"""
28
29    def testBasicBehaviour(self):
30        """Verify basic darcs changes parser behaviour"""
31
32        log = self.getDarcsOutput('darcs-simple_test')
33
34        csets = changesets_from_darcschanges(log)
35
36        cset = csets.next()
37        self.assertEqual(cset.revision,
38                         "Fix the CVS parser to omit already seen changesets")
39        self.assertEqual(cset.author, "lele@nautilus.homeip.net")
40        self.assertEqual(cset.date, datetime(2004, 7, 16, 12, 37, 37, 0, UTC))
41        self.assertEqual(cset.log, "For some unknown reasons....")
42        entry = cset.entries[0]
43        self.assertEqual(entry.name, 'vcpx/cvs.py')
44        self.assertEqual(entry.action_kind, entry.UPDATED)
45
46        cset = csets.next()
47        self.assertEqual(cset.revision,
48                         "Svn log parser with test")
49        self.assertEqual(cset.date, datetime(2004, 6, 1, 14, 5, 59, 0, UTC))
50        self.assertEqual(len(cset.entries), 4)
51        self.assertEqual(cset.darcs_hash,
52                         '20040601140559-97f81-b669594864cb35290fbe4848e6645e73057a8caf.gz')
53
54        entry = cset.entries[0]
55        self.assertEqual(entry.name, 'cvsync/svn.py')
56        self.assertEqual(entry.action_kind, entry.UPDATED)
57        entry = cset.entries[1]
58        self.assertEqual(entry.name, 'cvsync/tests/__init__.py')
59        self.assertEqual(entry.action_kind, entry.UPDATED)
60        entry = cset.entries[2]
61        self.assertEqual(entry.name, 'cvsync/tests/svn.py')
62        self.assertEqual(entry.action_kind, entry.ADDED)
63        entry = cset.entries[3]
64        self.assertEqual(entry.name, 'cvsync/tests/testrepo.dump')
65        self.assertEqual(entry.action_kind, entry.ADDED)
66
67    def testOnTailorOwnRepo(self):
68        """Verify fetching unidiff of a darcs patch"""
69
70        from os import getcwd
71
72        patchname = 'more detailed diags on SAXException'
73        changes = ExternalCommand(command=["darcs", "changes", "--xml", "--summary",
74                                           "--patches", patchname])
75        csets = changesets_from_darcschanges(changes.execute(stdout=PIPE, TZ='UTC')[0],
76                                             unidiff=True,
77                                             repodir=getcwd())
78        unidiff = csets.next().unidiff
79        head = unidiff.split('\n')[0]
80        self.assertEqual(head, 'Thu Jun  9 20:17:11 UTC 2005  zooko@zooko.com')
81
82    def testAllActions(self):
83        """Verify darcs changes parser understand all actions"""
84
85        log = self.getDarcsOutput('darcs-all_actions_test')
86
87        csets = list(changesets_from_darcschanges(log))
88
89        self.assertEqual(len(csets), 4)
90
91        cset = csets[0]
92        self.assertEqual(cset.revision, 'first')
93        self.assertEqual(len(cset.entries), 2)
94
95        entry = cset.entries[0]
96        self.assertEqual(entry.name, 'a.txt')
97        self.assertEqual(entry.action_kind, entry.ADDED)
98        entry = cset.entries[1]
99        self.assertEqual(entry.name, 'dir')
100        self.assertEqual(entry.action_kind, entry.ADDED)
101
102        cset = csets[1]
103        self.assertEqual(cset.revision, 'removed')
104        self.assertEqual(len(cset.entries), 1)
105
106        entry = cset.entries[0]
107        self.assertEqual(entry.name, 'dir')
108        self.assertEqual(entry.action_kind, entry.DELETED)
109
110        cset = csets[2]
111        self.assertEqual(cset.revision, 'moved')
112        self.assertEqual(len(cset.entries), 1)
113
114        entry = cset.entries[0]
115        self.assertEqual(entry.name, 'dir')
116        self.assertEqual(entry.action_kind, entry.ADDED)
117
118        cset = csets[3]
119        self.assertEqual(cset.revision, 'modified')
120        self.assertEqual(len(cset.entries), 1)
121
122        entry = cset.entries[0]
123        self.assertEqual(entry.name, 'a.txt')
124        self.assertEqual(entry.action_kind, entry.UPDATED)
125
126    def testIncrementalParser(self):
127        """Verify that the parser is effectively incremental"""
128
129        log = self.getDarcsOutput('darcs-all_actions_test')
130
131        csets = list(changesets_from_darcschanges(log, chunksize=100))
132        self.assertEqual(len(csets), 4)
133
134    def testOldDateFormat(self):
135        """Verify that the parser understands date format used by old darcs"""
136
137        log = self.getDarcsOutput('darcs-old_date_format_test')
138
139        csets = changesets_from_darcschanges(log)
140
141        cset = csets.next()
142        self.assertEqual(cset.date, datetime(2003, 10, 14, 9, 42, 0, 0, UTC))
143
144        cset = csets.next()
145        self.assertEqual(cset.date, datetime(2003, 10, 14, 14, 2, 31, 0, UTC))
146
147    def testRenameAndRemove(self):
148        """Verify that the parser degrades rename A B+remove B  to remove A"""
149
150        log = self.getDarcsOutput('darcs-rename_then_remove_test')
151        csets = changesets_from_darcschanges(log)
152
153        cset = csets.next()
154        self.assertEqual(len(cset.entries), 1)
155
156        entry = cset.entries[0]
157        self.assertEqual(entry.name, 'fileA')
158        self.assertEqual(entry.action_kind, entry.DELETED)
159
160    def testRenameAndAdd(self):
161        """Verify that the parser reduce rename A B+add B  to rename A B"""
162
163        log = self.getDarcsOutput('darcs-rename_and_add_test')
164        csets = changesets_from_darcschanges(log)
165
166        cset = csets.next()
167        self.assertEqual(len(cset.entries), 5)
168
169        entry = cset.entries[0]
170        self.assertEqual(entry.name, 'Autoconf.lhs.in')
171        self.assertEqual(entry.action_kind, entry.ADDED)
172
173        entry = cset.entries[1]
174        self.assertEqual(entry.name, 'Makefile')
175        self.assertEqual(entry.action_kind, entry.UPDATED)
176
177        entry = cset.entries[2]
178        self.assertEqual(entry.name, 'autoconf.mk.in')
179        self.assertEqual(entry.action_kind, entry.UPDATED)
180
181        entry = cset.entries[3]
182        self.assertEqual(entry.name, 'configure.in')
183        self.assertEqual(entry.action_kind, entry.UPDATED)
184
185        entry = cset.entries[4]
186        self.assertEqual(entry.name, 'darcs_cgi.lhs')
187        self.assertEqual(entry.action_kind, entry.UPDATED)
188
189    def testBadOrderedXML(self):
190        "Verify if the parser is able to correct the bad order produced by changes --xml"
191
192        log = self.getDarcsOutput('darcs-bad_xml_order_test')
193        csets = changesets_from_darcschanges(log)
194
195        cset = csets.next()
196
197        # Verify that each renamed entry is not within a directory added or renamed
198        # by a following hunk
199        for i,e in enumerate(cset.entries):
200            if e.action_kind == e.RENAMED:
201                postadds = [n.name for n in cset.entries[i+1:]
202                            if ((e.name.startswith(n.name+'/') or (e.old_name==n.name)) and
203                                (n.action_kind==n.ADDED or n.action_kind==n.RENAMED))]
204                self.assertEqual(postadds, [])
205
206    def testAddAndRename(self):
207        "Verify if the parser degrades (add A)+(rename A B) to (add B)"
208
209        log = self.getDarcsOutput('darcs-add_then_rename_test')
210        csets = changesets_from_darcschanges(log)
211
212        cset = csets.next()
213
214        entry = cset.entries[2]
215        self.assertEqual(entry.name, 'vcpx/repository/git/__init__.py')
216        self.assertEqual(entry.action_kind, entry.ADDED)
217
218        log = self.getDarcsOutput('darcs-mixed_test')
219        csets = changesets_from_darcschanges(log)
220
221        cset = csets.next()
222        self.assertEqual([], [e for e in cset.entries if e.name == 'ancillary/mbox2rpc.py'])
223        self.assertEqual([], [e for e in cset.entries if e.action_kind == e.RENAMED])
224
225    def testAddAndRemove(self):
226        "Verify if the parser annihilate (add A)+(remove A)"
227
228        log = self.getDarcsOutput('darcs-add_then_remove_test')
229        csets = changesets_from_darcschanges(log)
230
231        cset = csets.next()
232
233        self.assertEqual([], [e for e in cset.entries
234                              if e.name == 'Carpet/CarpetWeb/binaries/darcs-1.0.3-static-linux-i386.gz'])
235
236
237class DarcsPullParser(DarcsParserTestCase):
238    """Tests for the parser of darcs pull"""
239
240    def testParsePull(self):
241        """Verify basic darcs pull parser behaviour"""
242
243        from vcpx.changes import Changeset
244
245        output = self.getDarcsOutput('darcs-pull_parser_test')
246        hashes = self.getDarcsOutput('darcs-pull_parser_test', ext='.hashes')
247
248        class FauxRepository(object):
249            name = 'foo'
250        dswd = DarcsSourceWorkingDir(FauxRepository())
251        results = list(dswd._parseDarcsPull(output))
252
253        expected_changesets = [
254            Changeset('Monotone add is no longer recursive by default '
255                      '(as of 2006-11-02).',
256                      datetime(2006,12,12,05,30,20, tzinfo=UTC),
257                      'elb@elitists.net',
258                      'Use add --recursive when adding subtrees.'),
259            Changeset('Fix ticket #87',
260                      datetime(2006,12,14,23,45,04, tzinfo=UTC),
261                      'Edgar Alves <edgar.alves@gmail.com>',
262                      ''),
263            Changeset("Don't assume the timestamp in darcs log is exactly "
264                      "28 chars long",
265                      datetime(2006,11,17,20,26,28, tzinfo=UTC),
266                      'lele@nautilus.homeip.net',
267                      ''),
268            Changeset('tagged Version 0.9.27',
269                      datetime(2006,12,11,21,07,48, tzinfo=UTC),
270                      'lele@nautilus.homeip.net',
271                      ''),
272            Changeset('darcs: factor parsing from process invocation in DarcsSourceWorkingDir._getUpstreamChangesets',
273                      datetime(2007, 1, 6, 1,52,50, tzinfo=UTC),
274                      'Kevin Turner <kevin@janrain.com>',
275                      ''),
276            ]
277        for changeset, expected_hash in zip(expected_changesets, hashes):
278            changeset.darcs_hash = expected_hash.strip()
279
280        self.failUnlessEqual(len(expected_changesets), len(results))
281
282        for expected, result in zip(expected_changesets, results):
283            self.failUnlessEqual(expected, result,
284                                 "%s != %s" % (expected, result))
285            self.failUnlessEqual(expected.darcs_hash, result.darcs_hash,
286                                 'hash failed for %s\n %s !=\n %s' %
287                                 (result, expected.darcs_hash,
288                                  result.darcs_hash))
289
290        output = self.getDarcsOutput('darcs-pull_parser_test2')
291        results = list(dswd._parseDarcsPull(output))
292        first = results[0]
293        self.failUnlessEqual(first.revision, 'Added some basic utility functions')
294        self.failUnlessEqual(first.date, datetime(2003,10,10,16,23,44, tzinfo=UTC))
295        self.failUnlessEqual(first.author, 'John Goerzen <jgoerzen@complete.org>')
296        self.failUnlessEqual(first.log, '\n\n(jgoerzen@complete.org--projects/tla-buildpackage--head--1.0--patch-2)')
297        last = results[-1]
298        self.failUnlessEqual(last.log, 'Keywords:\n\nAdded some code in Python to get things going.\n')
Note: See TracBrowser for help on using the repository browser.