File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / rsync / packaging / year-tweak
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Wed Mar 17 00:32:36 2021 UTC (3 years, 3 months ago) by misho
Branches: rsync, MAIN
CVS tags: v3_2_3, HEAD
rsync 3.2.3

    1: #!/usr/bin/env python3
    2: 
    3: # This uses the output from "support/git-set-file-times --list" to discern
    4: # the last-modified year of each *.c & *.h file and updates the copyright
    5: # year if it isn't set right.
    6: 
    7: import sys, os, re, argparse, subprocess
    8: from datetime import datetime
    9: 
   10: MAINTAINER_NAME = 'Wayne Davison'
   11: MAINTAINER_SUF = ' ' + MAINTAINER_NAME + "\n"
   12: 
   13: def main():
   14:     latest_year = '2000'
   15: 
   16:     proc = subprocess.Popen('support/git-set-file-times --list'.split(), stdout=subprocess.PIPE, encoding='utf-8')
   17:     for line in proc.stdout:
   18:         m = re.match(r'^\S\s+(?P<year>\d\d\d\d)\S+\s+\S+\s+(?P<fn>.+)', line)
   19:         if not m:
   20:             print("Failed to parse line from git-set-file-times:", line)
   21:             sys.exit(1)
   22:         m = argparse.Namespace(**m.groupdict())
   23:         if m.year > latest_year:
   24:             latest_year = m.year
   25:         if m.fn.startswith('zlib/') or m.fn.startswith('popt/'):
   26:             continue
   27:         if re.search(r'\.(c|h|sh|test)$', m.fn):
   28:             maybe_edit_copyright_year(m.fn, m.year)
   29:     proc.communicate()
   30: 
   31:     fn = 'latest-year.h'
   32:     with open(fn, 'r', encoding='utf-8') as fh:
   33:         old_txt = fh.read()
   34: 
   35:     txt = f'#define LATEST_YEAR "{latest_year}"\n'
   36:     if txt != old_txt:
   37:         print(f"Updating {fn} with year {latest_year}")
   38:         with open(fn, 'w', encoding='utf-8') as fh:
   39:             fh.write(txt)
   40: 
   41: 
   42: def maybe_edit_copyright_year(fn, year):
   43:     opening_lines = [ ]
   44:     copyright_line = None
   45: 
   46:     with open(fn, 'r', encoding='utf-8') as fh:
   47:         for lineno, line in enumerate(fh):
   48:             opening_lines.append(line)
   49:             if lineno > 3 and not re.search(r'\S', line):
   50:                 break
   51:             m = re.match(r'^(?P<pre>.*Copyright\s+\S+\s+)(?P<year>\d\d\d\d(?:-\d\d\d\d)?(,\s+\d\d\d\d)*)(?P<suf>.+)', line)
   52:             if not m:
   53:                 continue
   54:             copyright_line = argparse.Namespace(**m.groupdict())
   55:             copyright_line.lineno = len(opening_lines)
   56:             copyright_line.is_maintainer_line = MAINTAINER_NAME in copyright_line.suf
   57:             copyright_line.txt = line
   58:             if copyright_line.is_maintainer_line:
   59:                 break
   60: 
   61:         if not copyright_line:
   62:             return
   63: 
   64:         if copyright_line.is_maintainer_line:
   65:             cyears = copyright_line.year.split('-')
   66:             if year == cyears[0]:
   67:                 cyears = [ year ]
   68:             else:
   69:                 cyears = [ cyears[0], year ]
   70:             txt = copyright_line.pre + '-'.join(cyears) + MAINTAINER_SUF
   71:             if txt == copyright_line.txt:
   72:                 return
   73:             opening_lines[copyright_line.lineno - 1] = txt
   74:         else:
   75:             if fn.startswith('lib/') or fn.startswith('testsuite/'):
   76:                 return
   77:             txt = copyright_line.pre + year + MAINTAINER_SUF
   78:             opening_lines[copyright_line.lineno - 1] += txt
   79: 
   80:         remaining_txt = fh.read()
   81: 
   82:     print(f"Updating {fn} with year {year}")
   83: 
   84:     with open(fn, 'w', encoding='utf-8') as fh:
   85:         fh.write(''.join(opening_lines))
   86:         fh.write(remaining_txt)
   87: 
   88: 
   89: if __name__ == '__main__':
   90:     parser = argparse.ArgumentParser(description="Grab the year of last mod for our c & h files and make sure the Copyright comment is up-to-date.")
   91:     args = parser.parse_args()
   92:     main()
   93: 
   94: # vim: sw=4 et

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>