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

2011-10-19 Thread Zac Medico
On 10/19/2011 12:55 PM, Fabian Groffen wrote:
> +def update_copyrights(pkgdir, files, year, pretend):

I think update_copyrights() could just as well operate on a single file,
and take a single file argument in place of the pkgdir and files
arguments. That would simplify the interface a tiny bit.

> @@ -651,7 +733,7 @@
>   if clold_file is not None:
>   # clold_lines may contain a saved non-header line
>   # that we want to write first.
> - if clold_lines[-1].strip():
> + if len(clold_lines) > 0 and clold_lines[-1].strip():
>   f.write(clold_lines[-1])

Good, this fixes a possible IndexError that I complained about in the
previous patch.
-- 
Thanks,
Zac



[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 @@