[gentoo-portage-dev] [PATCH 3 of 3] repoman: update copyright on modified files

2011-10-19 Thread Fabian Groffen
To retain the behaviour of echangelog, update the copyrights on modified
files (mostly ebuilds) when necessary.  We also use this to update the
ChangeLog's copyright.

diff --git a/pym/repoman/utilities.py b/pym/repoman/utilities.py
--- a/pym/repoman/utilities.py
+++ b/pym/repoman/utilities.py
@@ -523,9 +523,84 @@
 
return outvcs
 
+def update_copyrights(pkgdir, files, year, pretend):
+   
+   Check list of files for Copyright statements, and update them to
+   year.  The patterns used for replacing copyrights are taken from
+   echangelog.  Only the first lines of each file that start with a
+   hash ('#') are considered, until a line is found that doesn't start
+   with a hash.
+   patches and diffs (identified by .patch and .diff) are excluded
+   
+
+   for fn in files:
+   if fn.endswith('.diff') or fn.endswith('.patch'):
+   continue
+
+   fn_path = os.path.join(pkgdir, fn)
+   try:
+   fn_hdl = io.open(_unicode_encode(fn_path,
+   encoding=_encodings['fs'], errors='strict'),
+   mode='r', encoding=_encodings['repo.content'], 
errors='replace')
+   except EnvironmentError:
+   continue
+
+   orig_header = []
+   new_header = []
+
+   for line in fn_hdl:
+   line_strip = line.strip()
+   orig_header.append(line)
+   if not line_strip or line_strip[:1] != '#':
+   new_header.append(line)
+   break
+
+   # these two regexes are taken from
+   # echangelog update_copyright()
+   line = re.sub(r'^(# Copyright \d+) ',
+   r'\1-%s ' % year, line)
+   line = re.sub(r'^(# Copyright) \d\d\d\d-\d\d\d\d',
+   r'\1 1999-%s' % year, line)
+   new_header.append(line)
+
+   difflines = 0
+   for line in difflib.unified_diff(orig_header, new_header,
+   fromfile=fn_path, tofile=fn_path, n=0):
+   util.writemsg_stdout(line, noiselevel=-1)
+   difflines += 1
+   util.writemsg_stdout(\n, noiselevel=-1)
+
+   # unified diff has three lines to start with
+   if difflines  3 and not pretend:
+   # write new file with changed header
+   f, fnnew_path = mkstemp()
+   f = io.open(f, mode='w', 
encoding=_encodings['repo.content'],
+   errors='backslashreplace')
+   for line in new_header:
+   f.write(line);
+   for line in fn_hdl:
+   f.write(line)
+   f.close()
+   try:
+   fn_stat = os.stat(fn_path)
+   except OSError:
+   fn_stat = None
+
+   shutil.move(fnnew_path, fn_path)
+
+   if fn_stat is None:
+   util.apply_permissions(fn_path, mode=0o644)
+   else:
+   util.apply_stat_permissions(fn_path, fn_stat)
+   fn_hdl.close()
+
 def UpdateChangeLog(pkgdir, category, package, new, removed, changed, \
msg, pretend, repodir):
-Write an entry to an existing ChangeLog, or create a new one. 
+   
+   Write an entry to an existing ChangeLog, or create a new one.
+   Updates copyright year on changed files, and updates the header of
+   ChangeLog with the contents of skel.ChangeLog.
+   
 
# figure out who to write as
if 'GENTOO_COMMITTER_NAME' in os.environ and \
@@ -548,6 +623,12 @@
logging.critical(err)
return None
 
+   year = time.strftime('%Y')
+   date = time.strftime('%d %b %Y')
+
+   # check modified files and the ChangeLog for copyright updates
+   update_copyrights(pkgdir, new + changed + ['ChangeLog'], year, pretend)
+
cl_path = os.path.join(pkgdir, 'ChangeLog')
clold_lines = []
clnew_lines = []
@@ -578,7 +659,8 @@
# construct correct header first
try:
if clold_file is not None:
-   # retain header from old ChangeLog
+   # retain header from old ChangeLog, its copyright has
+   # already been updated by update_copyrights
for line in clold_file:
line_strip = line.strip()
clold_lines.append(line)
@@ -597,7 +679,7 @@
line = 

[gentoo-portage-dev] [PATCH 0 of 3] repoman changelog patches

2011-10-19 Thread Fabian Groffen
The following three patches change repoman's echangelog feature
slightly:

1) default for updating the changelog is retrieved from layout.conf
2) skel.ChangeLog is used for constructing the header of new ChangeLogs
3) modified files are checked for copyright years to be updated

Please review before I push them.



Re: [gentoo-portage-dev] [PATCH 2 of 3] repoman: get ChangeLog header from skel.ChangeLog

2011-10-19 Thread Zac Medico
On 10/19/2011 12:55 PM, Fabian Groffen wrote:
 + if clold_lines[-1].strip():
 + f.write(clold_lines[-1])

If the old ChangeLog happens to be an empty file, then clold_lines[-1]
will raise IndexError. So, this is safer:

   if clold_lines and clold_lines[-1].strip():

-- 
Thanks,
Zac