Gentoo Archives: gentoo-commits

From: Mike Frysinger <vapier@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] proj/portage:master commit in: pym/repoman/, pym/portage/tests/repoman/
Date: Wed, 13 Jun 2012 04:10:42
Message-Id: 1339538946.84b1cdcf057576bf59d2f038609e8b32995f3231.vapier@gentoo
1 commit: 84b1cdcf057576bf59d2f038609e8b32995f3231
2 Author: Mike Frysinger <vapier <AT> gentoo <DOT> org>
3 AuthorDate: Mon Jun 11 20:16:59 2012 +0000
4 Commit: Mike Frysinger <vapier <AT> gentoo <DOT> org>
5 CommitDate: Tue Jun 12 22:09:06 2012 +0000
6 URL: http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=84b1cdcf
7
8 repoman: update cat/pkg info in header all the time
9
10 There are edge cases where repoman's changelog code is not as good as
11 the existing echangelog. Mostly related to out of date headers. Have
12 the code check the header in more cases not just for missing lines, but
13 also outdated values all the time.
14
15 While we're at it, write some tests!
16
17 Signed-off-by: Mike Frysinger <vapier <AT> gentoo.org>
18
19 ---
20 pym/portage/tests/repoman/test_echangelog.py | 101 ++++++++++++++++++++++++++
21 pym/repoman/utilities.py | 57 ++++++++-------
22 2 files changed, 133 insertions(+), 25 deletions(-)
23
24 diff --git a/pym/portage/tests/repoman/test_echangelog.py b/pym/portage/tests/repoman/test_echangelog.py
25 new file mode 100644
26 index 0000000..71d6d5e
27 --- /dev/null
28 +++ b/pym/portage/tests/repoman/test_echangelog.py
29 @@ -0,0 +1,101 @@
30 +# Copyright 2012 Gentoo Foundation
31 +# Distributed under the terms of the GNU General Public License v2
32 +
33 +import datetime
34 +import subprocess
35 +import sys
36 +import tempfile
37 +import time
38 +
39 +import portage
40 +from portage import os
41 +from portage import shutil
42 +from portage.tests import TestCase
43 +from repoman.utilities import UpdateChangeLog
44 +
45 +class RepomanEchangelogTestCase(TestCase):
46 +
47 + def setUp(self):
48 + super(RepomanEchangelogTestCase, self).setUp()
49 +
50 + self.tmpdir = tempfile.mkdtemp(prefix='repoman.echangelog.')
51 +
52 + self.skel_changelog = os.path.join(self.tmpdir, 'skel.ChangeLog')
53 + skel = [
54 + '# ChangeLog for <CATEGORY>/<PACKAGE_NAME>\n',
55 + '# Copyright 1999-2000 Gentoo Foundation; Distributed under the GPL v2\n',
56 + '# $Header: $\n'
57 + ]
58 + self._writelines(self.skel_changelog, skel)
59 +
60 + self.cat = 'mycat'
61 + self.pkg = 'mypkg'
62 + self.pkgdir = os.path.join(self.tmpdir, self.cat, self.pkg)
63 + os.makedirs(self.pkgdir)
64 +
65 + self.header_pkg = '# ChangeLog for %s/%s\n' % (self.cat, self.pkg)
66 + self.header_copyright = '# Copyright 1999-%s Gentoo Foundation; Distributed under the GPL v2\n' % \
67 + datetime.datetime.now().year
68 + self.header_cvs = '# $Header: $\n'
69 +
70 + self.changelog = os.path.join(self.pkgdir, 'ChangeLog')
71 +
72 + self.user = 'Testing User <portage@g.o>'
73 +
74 + def tearDown(self):
75 + super(RepomanEchangelogTestCase, self).tearDown()
76 + shutil.rmtree(self.tmpdir)
77 +
78 + def _readlines(self, file):
79 + with open(file, 'r') as f:
80 + return f.readlines()
81 +
82 + def _writelines(self, file, data):
83 + with open(file, 'w') as f:
84 + f.writelines(data)
85 +
86 + def testRejectRootUser(self):
87 + self.assertEqual(UpdateChangeLog(self.pkgdir, 'me <root@g.o>', '', '', '', '', quiet=True), None)
88 +
89 + def testMissingSkelFile(self):
90 + # Test missing ChangeLog, but with empty skel (i.e. do nothing).
91 + UpdateChangeLog(self.pkgdir, self.user, 'test!', '/does/not/exist', self.cat, self.pkg, quiet=True)
92 + actual_cl = self._readlines(self.changelog)
93 + self.assertGreater(len(actual_cl[0]), 0)
94 +
95 + def testEmptyChangeLog(self):
96 + # Make sure we do the right thing with a 0-byte ChangeLog
97 + open(self.changelog, 'w').close()
98 + UpdateChangeLog(self.pkgdir, self.user, 'test!', self.skel_changelog, self.cat, self.pkg, quiet=True)
99 + actual_cl = self._readlines(self.changelog)
100 + self.assertEqual(actual_cl[0], self.header_pkg)
101 + self.assertEqual(actual_cl[1], self.header_copyright)
102 + self.assertEqual(actual_cl[2], self.header_cvs)
103 +
104 + def testCopyrightUpdate(self):
105 + # Make sure updating the copyright line works
106 + UpdateChangeLog(self.pkgdir, self.user, 'test!', self.skel_changelog, self.cat, self.pkg, quiet=True)
107 + actual_cl = self._readlines(self.changelog)
108 + self.assertEqual(actual_cl[1], self.header_copyright)
109 +
110 + def testSkelHeader(self):
111 + # Test skel.ChangeLog -> ChangeLog
112 + UpdateChangeLog(self.pkgdir, self.user, 'test!', self.skel_changelog, self.cat, self.pkg, quiet=True)
113 + actual_cl = self._readlines(self.changelog)
114 + self.assertEqual(actual_cl[0], self.header_pkg)
115 +
116 + def testExistingGoodHeader(self):
117 + # Test existing ChangeLog (correct values)
118 + self._writelines(self.changelog, [self.header_pkg])
119 +
120 + UpdateChangeLog(self.pkgdir, self.user, 'test!', self.skel_changelog, self.cat, self.pkg, quiet=True)
121 + actual_cl = self._readlines(self.changelog)
122 + self.assertEqual(actual_cl[0], self.header_pkg)
123 +
124 + def testExistingBadHeader(self):
125 + # Test existing ChangeLog (wrong values)
126 + self._writelines(self.changelog, ['# ChangeLog for \n'])
127 +
128 + UpdateChangeLog(self.pkgdir, self.user, 'test!', self.skel_changelog, self.cat, self.pkg, quiet=True)
129 + actual_cl = self._readlines(self.changelog)
130 + self.assertEqual(actual_cl[0], self.header_pkg)
131
132 diff --git a/pym/repoman/utilities.py b/pym/repoman/utilities.py
133 index bee67aa..1e07bad 100644
134 --- a/pym/repoman/utilities.py
135 +++ b/pym/repoman/utilities.py
136 @@ -681,7 +681,7 @@ def get_committer_name(env=None):
137 return user
138
139 def UpdateChangeLog(pkgdir, user, msg, skel_path, category, package,
140 - new=(), removed=(), changed=(), pretend=False):
141 + new=(), removed=(), changed=(), pretend=False, quiet=False):
142 """
143 Write an entry to an existing ChangeLog, or create a new one.
144 Updates copyright year on changed files, and updates the header of
145 @@ -689,8 +689,8 @@ def UpdateChangeLog(pkgdir, user, msg, skel_path, category, package,
146 """
147
148 if '<root@' in user:
149 - err = 'Please set ECHANGELOG_USER or run as non-root'
150 - logging.critical(err)
151 + if not quiet:
152 + logging.critical('Please set ECHANGELOG_USER or run as non-root')
153 return None
154
155 # ChangeLog times are in UTC
156 @@ -711,24 +711,13 @@ def UpdateChangeLog(pkgdir, user, msg, skel_path, category, package,
157 old_header_lines = []
158 header_lines = []
159
160 + clold_file = None
161 try:
162 clold_file = io.open(_unicode_encode(cl_path,
163 encoding=_encodings['fs'], errors='strict'),
164 mode='r', encoding=_encodings['repo.content'], errors='replace')
165 except EnvironmentError:
166 - clold_file = None
167 -
168 - clskel_file = None
169 - if clold_file is None:
170 - # we will only need the ChangeLog skeleton if there is no
171 - # ChangeLog yet
172 - try:
173 - clskel_file = io.open(_unicode_encode(skel_path,
174 - encoding=_encodings['fs'], errors='strict'),
175 - mode='r', encoding=_encodings['repo.content'],
176 - errors='replace')
177 - except EnvironmentError:
178 - pass
179 + pass
180
181 f, clnew_path = mkstemp()
182
183 @@ -736,17 +725,35 @@ def UpdateChangeLog(pkgdir, user, msg, skel_path, category, package,
184 try:
185 if clold_file is not None:
186 # retain header from old ChangeLog
187 + first_line = True
188 for line in clold_file:
189 - line_strip = line.strip()
190 + line_strip = line.strip()
191 if line_strip and line[:1] != "#":
192 clold_lines.append(line)
193 break
194 + # always make sure cat/pkg is up-to-date in case we are
195 + # moving packages around, or copied from another pkg, or ...
196 + if first_line:
197 + if line.startswith('# ChangeLog for'):
198 + line = '# ChangeLog for %s/%s\n' % (category, package)
199 + first_line = False
200 old_header_lines.append(line)
201 header_lines.append(_update_copyright_year(year, line))
202 if not line_strip:
203 break
204
205 - elif clskel_file is not None:
206 + clskel_file = None
207 + if not header_lines:
208 + # delay opening this until we find we need a header
209 + try:
210 + clskel_file = io.open(_unicode_encode(skel_path,
211 + encoding=_encodings['fs'], errors='strict'),
212 + mode='r', encoding=_encodings['repo.content'],
213 + errors='replace')
214 + except EnvironmentError:
215 + pass
216 +
217 + if clskel_file is not None:
218 # read skel.ChangeLog up to first empty line
219 for line in clskel_file:
220 line_strip = line.strip()
221 @@ -806,7 +813,7 @@ def UpdateChangeLog(pkgdir, user, msg, skel_path, category, package,
222 errors='backslashreplace')
223
224 for line in clnew_lines:
225 - f.write(line)
226 + f.write(_unicode_decode(line))
227
228 # append stuff from old ChangeLog
229 if clold_file is not None:
230 @@ -837,12 +844,12 @@ def UpdateChangeLog(pkgdir, user, msg, skel_path, category, package,
231 clold_file.close()
232 f.close()
233
234 - # show diff (do we want to keep on doing this, or only when
235 - # pretend?)
236 - for line in difflib.unified_diff(clold_lines, clnew_lines,
237 - fromfile=cl_path, tofile=cl_path, n=0):
238 - util.writemsg_stdout(line, noiselevel=-1)
239 - util.writemsg_stdout("\n", noiselevel=-1)
240 + # show diff
241 + if not quiet:
242 + for line in difflib.unified_diff(clold_lines, clnew_lines,
243 + fromfile=cl_path, tofile=cl_path, n=0):
244 + util.writemsg_stdout(line, noiselevel=-1)
245 + util.writemsg_stdout("\n", noiselevel=-1)
246
247 if pretend:
248 # remove what we've done