FAQ Search Today's Posts Mark Forums Read
» Video Reviews

» Linux Archive

Linux-archive is a website aiming to archive linux email lists and to make them easily accessible for linux users/developers.


» Sponsor

» Partners

» Sponsor

Go Back   Linux Archive > Gentoo > Gentoo Portage Developer

 
 
LinkBack Thread Tools
 
Old 10-19-2011, 07:55 PM
Fabian Groffen
 
Default repoman: update copyright on modified files

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) dddd-dddd',
+ 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("
", 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 = line.replace('<CATEGORY>', category)
line = line.replace('<PACKAGE_NAME>', package)
line = re.sub(r'^(# Copyright dddd)-dddd ',
- r'1-%s ' % time.strftime('%Y'), line)
+ r'1-%s ' % year, line)
clnew_lines.append(line)
clnew_lines.append(_unicode_decode('
'))
clskel_file.close()
@@ -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])

for line in clold_file:
 
Old 10-19-2011, 10:14 PM
Zac Medico
 
Default repoman: update copyright on modified files

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
 
Old 10-20-2011, 06:23 PM
Fabian Groffen
 
Default repoman: update copyright on modified files

To retain the behaviour of echangelog, update the copyrights on modified
files (mostly ebuilds) when necessary. Also 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,77 @@

return outvcs

+def update_copyright(fn_path, year, pretend):
+ """
+ Check file for a Copyright statement, and update its 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.
+ """
+
+ try:
+ fn_hdl = io.open(_unicode_encode(fn_path,
+ encoding=_encodings['fs'], errors='strict'),
+ mode='r', encoding=_encodings['repo.content'], errors='replace')
+ except EnvironmentError:
+ return
+
+ 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) dddd-dddd',
+ 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("
", 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 +616,16 @@
logging.critical(err)
return None

+ year = time.strftime('%Y')
+ date = time.strftime('%d %b %Y')
+
+ # check modified files and the ChangeLog for copyright updates
+ # patches and diffs (identified by .patch and .diff) are excluded
+ for fn in new + changed:
+ if fn.endswith('.diff') or fn.endswith('.patch'):
+ continue
+ update_copyright(os.path.join(pkgdir, fn), year, pretend)
+
cl_path = os.path.join(pkgdir, 'ChangeLog')
clold_lines = []
clnew_lines = []
@@ -584,8 +662,9 @@
clold_lines.append(line)
if line_strip[:1] != '#':
break
- if clskel_file is None:
- clnew_lines.append(line)
+ line = re.sub(r'^(# Copyright) dddd-dddd',
+ r'1 1999-%s' % year, line)
+ clnew_lines.append(line)
if not line_strip:
break
elif clskel_file is not None:
@@ -597,7 +676,7 @@
line = line.replace('<CATEGORY>', category)
line = line.replace('<PACKAGE_NAME>', package)
line = re.sub(r'^(# Copyright dddd)-dddd ',
- r'1-%s ' % time.strftime('%Y'), line)
+ r'1-%s ' % year, line)
clnew_lines.append(line)
clnew_lines.append(_unicode_decode('
'))
clskel_file.close()
 
Old 10-20-2011, 06:38 PM
Zac Medico
 
Default repoman: update copyright on modified files

On 10/20/2011 11:23 AM, Fabian Groffen wrote:
> To retain the behaviour of echangelog, update the copyrights on modified
> files (mostly ebuilds) when necessary. Also 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,77 @@
>
> return outvcs
>
> +def update_copyright(fn_path, year, pretend):
> + """
> + Check file for a Copyright statement, and update its 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.
> + """

Thanks, I like that much better.
--
Thanks,
Zac
 
Old 10-20-2011, 06:55 PM
Mike Gilbert
 
Default repoman: update copyright on modified files

On Thu, Oct 20, 2011 at 2:23 PM, Fabian Groffen <grobian@gentoo.org> wrote:
> To retain the behaviour of echangelog, update the copyrights on modified
> files (mostly ebuilds) when necessary. *Also 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
> @@ -548,6 +616,16 @@
> * * * * * * * *logging.critical(err)
> * * * * * * * *return None
>
> + * * * year = time.strftime('%Y')
> + * * * date = time.strftime('%d %b %Y')
> +

echangelog calls time.strftime('%d %b %Y', gmtime) so that UTC is always used.
 
Old 10-20-2011, 07:12 PM
Zac Medico
 
Default repoman: update copyright on modified files

On 10/20/2011 11:55 AM, Mike Gilbert wrote:
> On Thu, Oct 20, 2011 at 2:23 PM, Fabian Groffen <grobian@gentoo.org> wrote:
>> To retain the behaviour of echangelog, update the copyrights on modified
>> files (mostly ebuilds) when necessary. Also 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
>> @@ -548,6 +616,16 @@
>> logging.critical(err)
>> return None
>>
>> + year = time.strftime('%Y')
>> + date = time.strftime('%d %b %Y')
>> +
>
> echangelog calls time.strftime('%d %b %Y', gmtime) so that UTC is always used.
>

Thanks, the existing code is fixed in git now:

http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=0f261405f63cd09639728da78e7 0a254cd3c5320
--
Thanks,
Zac
 

Thread Tools




All times are GMT. The time now is 07:26 PM.

VBulletin, Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
Content Relevant URLs by vBSEO ©2007, Crawlability, Inc.
Copyright 2007 - 2008, www.linux-archive.org