| 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 | |
|---|
| 8 | from unittest import TestCase |
|---|
| 9 | from datetime import datetime |
|---|
| 10 | from StringIO import StringIO |
|---|
| 11 | from vcpx.darcs import changesets_from_darcschanges |
|---|
| 12 | from shwrap import ExternalCommand, PIPE |
|---|
| 13 | |
|---|
| 14 | class 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) |
|---|