aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2011-10-16 17:11:08 -0700
committerZac Medico <zmedico@gentoo.org>2011-10-16 17:11:08 -0700
commitb655137b7b5f87c11a7e742b7ef0e028a1139677 (patch)
treed9459447703d8a9c0f629f7a9e6a3e2380ee022e
parentrepoman: implemented echangelog functionality (diff)
downloadportage-b655137b7b5f87c11a7e742b7ef0e028a1139677.tar.gz
portage-b655137b7b5f87c11a7e742b7ef0e028a1139677.tar.bz2
portage-b655137b7b5f87c11a7e742b7ef0e028a1139677.zip
UpdateChangeLog: optimize and add unicode support
Also: * copy the old header from the old ChangeLog if it exists, in case it contains a non-gentoo header * don't add a header if the old ChangeLog exists and doesn't contain a header
-rw-r--r--pym/repoman/utilities.py102
1 files changed, 70 insertions, 32 deletions
diff --git a/pym/repoman/utilities.py b/pym/repoman/utilities.py
index 8f7d5d54c..5b9eaf741 100644
--- a/pym/repoman/utilities.py
+++ b/pym/repoman/utilities.py
@@ -547,28 +547,54 @@ def UpdateChangeLog(pkgdir, category, package, new, removed, changed, msg, prete
return None
cl_path = os.path.join(pkgdir, 'ChangeLog')
+ clold_lines = []
+ clnew_lines = []
+ header_lines = []
+
+ try:
+ clold_file = io.open(_unicode_encode(cl_path,
+ encoding=_encodings['fs'], errors='strict'),
+ mode='r', encoding=_encodings['repo.content'], errors='replace')
+ except EnvironmentError:
+ clold_file = None
+
f, clnew_path = mkstemp()
# create an empty ChangeLog.new with correct header first
try:
- f = os.fdopen(f, 'w+')
- f.write('# ChangeLog for %s/%s\n' % (category, package))
- year = time.strftime('%Y')
- f.write('# Copyright 1999-%s Gentoo Foundation; Distributed under the GPL v2\n' % year)
- f.write('# $Header: $\n')
- f.write('\n')
+ f = io.open(f, mode='w', encoding=_encodings['repo.content'],
+ errors='backslashreplace')
+
+ if clold_file is None:
+ header_lines.append(_unicode_decode('# ChangeLog for %s/%s\n' %
+ (category, package)))
+ year = time.strftime('%Y')
+ header_lines.append(_unicode_decode('# Copyright 1999-'
+ '%s Gentoo Foundation; Distributed under the GPL v2\n' % year))
+ header_lines.append(_unicode_decode('# $Header: $\n'))
+ header_lines.append(_unicode_decode('\n'))
+ else:
+ for line in clold_file:
+ line_strip = line.strip()
+ if line_strip and line[:1] != "#":
+ clold_lines.append(line)
+ break
+ header_lines.append(line)
+ if not line_strip:
+ break
# write new ChangeLog entry
+ clnew_lines.extend(header_lines)
date = time.strftime('%d %b %Y')
newebuild = False
for fn in new:
if not fn.endswith('.ebuild'):
continue
ebuild = fn.split(os.sep)[-1][0:-7]
- f.write('*%s (%s)\n' % (ebuild, date))
+ clnew_lines.append(_unicode_decode('*%s (%s)\n' % (ebuild, date)))
newebuild = True
if newebuild:
- f.write('\n')
+ clnew_lines.append(_unicode_decode('\n'))
new = ['+' + elem for elem in new if elem not in ['ChangeLog', 'Manifest']]
removed = ['-' + elem for elem in removed]
changed = [elem for elem in changed if elem not in ['ChangeLog', 'Manifest']]
@@ -577,45 +603,57 @@ def UpdateChangeLog(pkgdir, category, package, new, removed, changed, msg, prete
for line in textwrap.wrap(mesg, 80, \
initial_indent=' ', subsequent_indent=' ', \
break_on_hyphens=False):
- f.write('%s\n' % line)
+ clnew_lines.append(_unicode_decode('%s\n' % line))
for line in textwrap.wrap(msg, 80, \
initial_indent=' ', subsequent_indent=' '):
- f.write('%s\n' % line)
+ clnew_lines.append(_unicode_decode('%s\n' % line))
+ clnew_lines.append(_unicode_decode('\n'))
+
+ for line in clnew_lines:
+ f.write(line)
# append stuff from old ChangeLog
- cl_lines = []
- if os.path.exists(cl_path):
- c = open(cl_path, 'r')
- cl_lines = c.readlines()
- for index, line in enumerate(cl_lines):
- # skip the headers
- if line.startswith('#'):
- # normalise to $Header: $ to avoid pointless diff line
- if line.startswith('# $Header:'):
- cl_lines[index] = '# $Header: $\n'
- continue
+ if clold_file is not None:
+ # If the old ChangeLog didn't have a header, then
+ # clold_lines may contain a saved non-header line
+ # that we want to write first.
+ for line in clold_lines:
f.write(line)
- c.close()
- # show diff (do we want to keep on doing this, or only when
- # pretend?)
- f.seek(0)
- clnew_lines = f.readlines()
- for line in difflib.unified_diff(cl_lines, clnew_lines, \
- fromfile=cl_path, tofile=cl_path + '.new', n=0):
- print(line.rstrip())
- print()
+ # Now prepend header_lines to clold_lines, for use
+ # in the unified_diff call below.
+ clold_lines = header_lines + clold_lines
+ for line in clold_file:
+ f.write(line)
+ clold_file.close()
f.close()
+ # show diff (do we want to keep on doing this, or only when
+ # pretend?)
+ for line in difflib.unified_diff(clold_lines, clnew_lines,
+ fromfile=cl_path, tofile=cl_path + '.new', n=0):
+ util.writemsg_stdout(line, noiselevel=-1)
+ util.writemsg_stdout("\n", noiselevel=-1)
+
if pretend:
# remove what we've done
os.remove(clnew_path)
else:
- # rename ChangeLog.new to ChangeLog
+ # rename ChangeLog.new to ChangeLog, and set permissions
+ try:
+ clold_stat = os.stat(cl_path)
+ except OSError:
+ clold_stat = None
+
shutil.move(clnew_path, cl_path)
- if cl_lines == []:
+ if clold_stat is None:
+ util.apply_permissions(cl_path, mode=0o644)
+ else:
+ util.apply_stat_permissions(cl_path, clold_stat)
+
+ if clold_file is None:
return True
else:
return False