e9bdf92c6f
gdb/ChangeLog: * copyright.py: New script. * copyright.sh (byhand): Add *.ads, *.adb, *.gpr and *.inc. Launch emacs without exec'ing. Call copyright.py afterwards.
609 lines
23 KiB
Python
609 lines
23 KiB
Python
#! /usr/bin/env python
|
|
|
|
"""copyright.py
|
|
|
|
This script updates most of the files that are not already handled
|
|
by copyright.sh. It must be run from the gdb/ subdirectory of the
|
|
GDB source tree.
|
|
|
|
"""
|
|
|
|
import datetime
|
|
import re
|
|
import os
|
|
import os.path
|
|
|
|
class Comment(object):
|
|
"""A class describing comment.
|
|
|
|
ATTRIBUTES
|
|
start: A string describing how comments are started.
|
|
stop: A string describing how comments end. If None, then
|
|
a comment ends at the end of the line.
|
|
start2: Some files accept more than 1 kind of comment.
|
|
For those that do, this is the alternative form.
|
|
For now, it is assumed that if start2 is not None,
|
|
then stop is None (thus no stop2 attribute).
|
|
"""
|
|
def __init__(self, start, stop=None, start2=None, max_lines=30):
|
|
"""The "Copyright" keyword should be within MAX_LINES lines
|
|
from the start of the file."""
|
|
self.start = start
|
|
self.stop = stop
|
|
self.start2 = start2
|
|
self.max_lines = max_lines
|
|
|
|
# The Comment object for Ada code (and GPR files).
|
|
ADA_COMMENT = Comment(start="--")
|
|
|
|
THIS_YEAR = str(datetime.date.today().year)
|
|
|
|
# Files which should not be modified, either because they are
|
|
# generated, non-FSF, or otherwise special (e.g. license text,
|
|
# or test cases which must be sensitive to line numbering).
|
|
EXCLUSION_LIST = (
|
|
"COPYING", "COPYING.LIB", "CVS", "configure", "copying.c", "gdbarch.c",
|
|
"gdbarch.h", "fdl.texi", "gpl.texi", "gdbtk", "gdb.gdbtk", "osf-share",
|
|
"aclocal.m4", "step-line.inp", "step-line.c",
|
|
)
|
|
|
|
# Files that are too different from the rest to be processed automatically.
|
|
BY_HAND = ['../sim/ppc/psim.texinfo']
|
|
|
|
# Files for which we know that they do not have a copyright header.
|
|
# Ideally, this list should be empty (but it may not be possible to
|
|
# add a copyright header in some of them).
|
|
NO_COPYRIGHT = (
|
|
# Configure files. We should fix those, one day.
|
|
"testsuite/gdb.cell/configure.ac", "testsuite/gdb.hp/configure.ac",
|
|
"testsuite/gdb.hp/gdb.aCC/configure.ac",
|
|
"testsuite/gdb.hp/gdb.base-hp/configure.ac",
|
|
"testsuite/gdb.hp/gdb.compat/configure.ac",
|
|
"testsuite/gdb.hp/gdb.defects/configure.ac",
|
|
"testsuite/gdb.hp/gdb.objdbg/configure.ac",
|
|
"testsuite/gdb.stabs/configure.ac",
|
|
"../sim/arm/configure.ac", "../sim/avr/configure.ac",
|
|
"../sim/common/configure.ac", "../sim/configure.ac",
|
|
"../sim/cr16/configure.ac", "../sim/cris/configure.ac",
|
|
"../sim/d10v/configure.ac", "../sim/erc32/configure.ac",
|
|
"../sim/frv/configure.ac", "../sim/h8300/configure.ac",
|
|
"../sim/igen/configure.ac", "../sim/iq2000/configure.ac",
|
|
"../sim/lm32/configure.ac", "../sim/m32r/configure.ac",
|
|
"../sim/m68hc11/configure.ac", "../sim/mcore/configure.ac",
|
|
"../sim/microblaze/configure.ac", "../sim/mips/configure.ac",
|
|
"../sim/mn10300/configure.ac", "../sim/moxie/configure.ac",
|
|
"../sim/ppc/configure.ac", "../sim/sh/configure.ac",
|
|
"../sim/sh64/configure.ac", "../sim/testsuite/configure.ac",
|
|
"../sim/testsuite/d10v-elf/configure.ac",
|
|
"../sim/testsuite/frv-elf/configure.ac",
|
|
"../sim/testsuite/m32r-elf/configure.ac",
|
|
"../sim/testsuite/mips64el-elf/configure.ac", "../sim/v850/configure.ac",
|
|
# Assembly files. It's not certain that we can add a copyright
|
|
# header in a way that works for all platforms supported by the
|
|
# testcase...
|
|
"testsuite/gdb.arch/pa-nullify.s", "testsuite/gdb.arch/pa64-nullify.s",
|
|
"testsuite/gdb.asm/asmsrc1.s", "testsuite/gdb.asm/asmsrc2.s",
|
|
"testsuite/gdb.disasm/am33.s", "testsuite/gdb.disasm/h8300s.s",
|
|
"testsuite/gdb.disasm/hppa.s", "testsuite/gdb.disasm/mn10200.s",
|
|
"testsuite/gdb.disasm/mn10300.s", "testsuite/gdb.disasm/sh3.s",
|
|
"testsuite/gdb.disasm/t01_mov.s", "testsuite/gdb.disasm/t02_mova.s",
|
|
"testsuite/gdb.disasm/t03_add.s", "testsuite/gdb.disasm/t04_sub.s",
|
|
"testsuite/gdb.disasm/t05_cmp.s", "testsuite/gdb.disasm/t06_ari2.s",
|
|
"testsuite/gdb.disasm/t07_ari3.s", "testsuite/gdb.disasm/t08_or.s",
|
|
"testsuite/gdb.disasm/t09_xor.s", "testsuite/gdb.disasm/t10_and.s",
|
|
"testsuite/gdb.disasm/t11_logs.s", "testsuite/gdb.disasm/t12_bit.s",
|
|
"testsuite/gdb.disasm/t13_otr.s", "testsuite/gdb.hp/gdb.base-hp/reg-pa64.s",
|
|
"testsuite/gdb.hp/gdb.base-hp/reg.s",
|
|
"../sim/testsuite/d10v-elf/exit47.s",
|
|
"../sim/testsuite/d10v-elf/hello.s",
|
|
"../sim/testsuite/d10v-elf/loop.s",
|
|
"../sim/testsuite/d10v-elf/t-ae-ld-d.s",
|
|
"../sim/testsuite/d10v-elf/t-ae-ld-i.s",
|
|
"../sim/testsuite/d10v-elf/t-ae-ld-id.s",
|
|
"../sim/testsuite/d10v-elf/t-ae-ld-im.s",
|
|
"../sim/testsuite/d10v-elf/t-ae-ld-ip.s",
|
|
"../sim/testsuite/d10v-elf/t-ae-ld2w-d.s",
|
|
"../sim/testsuite/d10v-elf/t-ae-ld2w-i.s",
|
|
"../sim/testsuite/d10v-elf/t-ae-ld2w-id.s",
|
|
"../sim/testsuite/d10v-elf/t-ae-ld2w-im.s",
|
|
"../sim/testsuite/d10v-elf/t-ae-ld2w-ip.s",
|
|
"../sim/testsuite/d10v-elf/t-ae-st-d.s",
|
|
"../sim/testsuite/d10v-elf/t-ae-st-i.s",
|
|
"../sim/testsuite/d10v-elf/t-ae-st-id.s",
|
|
"../sim/testsuite/d10v-elf/t-ae-st-im.s",
|
|
"../sim/testsuite/d10v-elf/t-ae-st-ip.s",
|
|
"../sim/testsuite/d10v-elf/t-ae-st-is.s",
|
|
"../sim/testsuite/d10v-elf/t-ae-st2w-d.s",
|
|
"../sim/testsuite/d10v-elf/t-ae-st2w-i.s",
|
|
"../sim/testsuite/d10v-elf/t-ae-st2w-id.s",
|
|
"../sim/testsuite/d10v-elf/t-ae-st2w-im.s",
|
|
"../sim/testsuite/d10v-elf/t-ae-st2w-ip.s",
|
|
"../sim/testsuite/d10v-elf/t-ae-st2w-is.s",
|
|
"../sim/testsuite/d10v-elf/t-dbt.s",
|
|
"../sim/testsuite/d10v-elf/t-ld-st.s",
|
|
"../sim/testsuite/d10v-elf/t-mac.s",
|
|
"../sim/testsuite/d10v-elf/t-mod-ld-pre.s",
|
|
"../sim/testsuite/d10v-elf/t-msbu.s",
|
|
"../sim/testsuite/d10v-elf/t-mulxu.s",
|
|
"../sim/testsuite/d10v-elf/t-mvtac.s",
|
|
"../sim/testsuite/d10v-elf/t-mvtc.s",
|
|
"../sim/testsuite/d10v-elf/t-rac.s",
|
|
"../sim/testsuite/d10v-elf/t-rachi.s",
|
|
"../sim/testsuite/d10v-elf/t-rdt.s",
|
|
"../sim/testsuite/d10v-elf/t-rep.s",
|
|
"../sim/testsuite/d10v-elf/t-rie-xx.s",
|
|
"../sim/testsuite/d10v-elf/t-rte.s",
|
|
"../sim/testsuite/d10v-elf/t-sac.s",
|
|
"../sim/testsuite/d10v-elf/t-sachi.s",
|
|
"../sim/testsuite/d10v-elf/t-sadd.s",
|
|
"../sim/testsuite/d10v-elf/t-slae.s",
|
|
"../sim/testsuite/d10v-elf/t-sp.s",
|
|
"../sim/testsuite/d10v-elf/t-sub.s",
|
|
"../sim/testsuite/d10v-elf/t-sub2w.s",
|
|
"../sim/testsuite/d10v-elf/t-subi.s",
|
|
"../sim/testsuite/d10v-elf/t-trap.s",
|
|
"../sim/testsuite/frv-elf/cache.s",
|
|
"../sim/testsuite/frv-elf/exit47.s",
|
|
"../sim/testsuite/frv-elf/grloop.s",
|
|
"../sim/testsuite/frv-elf/hello.s",
|
|
"../sim/testsuite/frv-elf/loop.s",
|
|
"../sim/testsuite/m32r-elf/exit47.s",
|
|
"../sim/testsuite/m32r-elf/hello.s",
|
|
"../sim/testsuite/m32r-elf/loop.s",
|
|
"../sim/testsuite/sim/cris/hw/rv-n-cris/quit.s",
|
|
"../sim/testsuite/sim/h8300/addb.s",
|
|
"../sim/testsuite/sim/h8300/addl.s",
|
|
"../sim/testsuite/sim/h8300/adds.s",
|
|
"../sim/testsuite/sim/h8300/addw.s",
|
|
"../sim/testsuite/sim/h8300/addx.s",
|
|
"../sim/testsuite/sim/h8300/andb.s",
|
|
"../sim/testsuite/sim/h8300/andl.s",
|
|
"../sim/testsuite/sim/h8300/andw.s",
|
|
"../sim/testsuite/sim/h8300/band.s",
|
|
"../sim/testsuite/sim/h8300/bfld.s",
|
|
"../sim/testsuite/sim/h8300/biand.s",
|
|
"../sim/testsuite/sim/h8300/bra.s",
|
|
"../sim/testsuite/sim/h8300/brabc.s",
|
|
"../sim/testsuite/sim/h8300/bset.s",
|
|
"../sim/testsuite/sim/h8300/cmpb.s",
|
|
"../sim/testsuite/sim/h8300/cmpl.s",
|
|
"../sim/testsuite/sim/h8300/cmpw.s",
|
|
"../sim/testsuite/sim/h8300/daa.s",
|
|
"../sim/testsuite/sim/h8300/das.s",
|
|
"../sim/testsuite/sim/h8300/dec.s",
|
|
"../sim/testsuite/sim/h8300/div.s",
|
|
"../sim/testsuite/sim/h8300/extl.s",
|
|
"../sim/testsuite/sim/h8300/extw.s",
|
|
"../sim/testsuite/sim/h8300/inc.s",
|
|
"../sim/testsuite/sim/h8300/jmp.s",
|
|
"../sim/testsuite/sim/h8300/ldc.s",
|
|
"../sim/testsuite/sim/h8300/ldm.s",
|
|
"../sim/testsuite/sim/h8300/mac.s",
|
|
"../sim/testsuite/sim/h8300/mova.s",
|
|
"../sim/testsuite/sim/h8300/movb.s",
|
|
"../sim/testsuite/sim/h8300/movl.s",
|
|
"../sim/testsuite/sim/h8300/movmd.s",
|
|
"../sim/testsuite/sim/h8300/movsd.s",
|
|
"../sim/testsuite/sim/h8300/movw.s",
|
|
"../sim/testsuite/sim/h8300/mul.s",
|
|
"../sim/testsuite/sim/h8300/neg.s",
|
|
"../sim/testsuite/sim/h8300/nop.s",
|
|
"../sim/testsuite/sim/h8300/not.s",
|
|
"../sim/testsuite/sim/h8300/orb.s",
|
|
"../sim/testsuite/sim/h8300/orl.s",
|
|
"../sim/testsuite/sim/h8300/orw.s",
|
|
"../sim/testsuite/sim/h8300/rotl.s",
|
|
"../sim/testsuite/sim/h8300/rotr.s",
|
|
"../sim/testsuite/sim/h8300/rotxl.s",
|
|
"../sim/testsuite/sim/h8300/rotxr.s",
|
|
"../sim/testsuite/sim/h8300/shal.s",
|
|
"../sim/testsuite/sim/h8300/shar.s",
|
|
"../sim/testsuite/sim/h8300/shll.s",
|
|
"../sim/testsuite/sim/h8300/shlr.s",
|
|
"../sim/testsuite/sim/h8300/stack.s",
|
|
"../sim/testsuite/sim/h8300/stc.s",
|
|
"../sim/testsuite/sim/h8300/subb.s",
|
|
"../sim/testsuite/sim/h8300/subl.s",
|
|
"../sim/testsuite/sim/h8300/subs.s",
|
|
"../sim/testsuite/sim/h8300/subw.s",
|
|
"../sim/testsuite/sim/h8300/subx.s",
|
|
"../sim/testsuite/sim/h8300/tas.s",
|
|
"../sim/testsuite/sim/h8300/xorb.s",
|
|
"../sim/testsuite/sim/h8300/xorl.s",
|
|
"../sim/testsuite/sim/h8300/xorw.s",
|
|
"../sim/testsuite/sim/mips/fpu64-ps-sb1.s",
|
|
"../sim/testsuite/sim/mips/fpu64-ps.s",
|
|
"../sim/testsuite/sim/mips/hilo-hazard-1.s",
|
|
"../sim/testsuite/sim/mips/hilo-hazard-2.s",
|
|
"../sim/testsuite/sim/mips/hilo-hazard-3.s",
|
|
"../sim/testsuite/sim/mips/mdmx-ob-sb1.s",
|
|
"../sim/testsuite/sim/mips/mdmx-ob.s",
|
|
"../sim/testsuite/sim/mips/mips32-dsp.s",
|
|
"../sim/testsuite/sim/mips/mips32-dsp2.s",
|
|
"../sim/testsuite/sim/mips/sanity.s",
|
|
"../sim/testsuite/sim/sh/add.s",
|
|
"../sim/testsuite/sim/sh/and.s",
|
|
"../sim/testsuite/sim/sh/bandor.s",
|
|
"../sim/testsuite/sim/sh/bandornot.s",
|
|
"../sim/testsuite/sim/sh/bclr.s",
|
|
"../sim/testsuite/sim/sh/bld.s",
|
|
"../sim/testsuite/sim/sh/bldnot.s",
|
|
"../sim/testsuite/sim/sh/bset.s",
|
|
"../sim/testsuite/sim/sh/bst.s",
|
|
"../sim/testsuite/sim/sh/bxor.s",
|
|
"../sim/testsuite/sim/sh/clip.s",
|
|
"../sim/testsuite/sim/sh/div.s",
|
|
"../sim/testsuite/sim/sh/dmxy.s",
|
|
"../sim/testsuite/sim/sh/fabs.s",
|
|
"../sim/testsuite/sim/sh/fadd.s",
|
|
"../sim/testsuite/sim/sh/fail.s",
|
|
"../sim/testsuite/sim/sh/fcmpeq.s",
|
|
"../sim/testsuite/sim/sh/fcmpgt.s",
|
|
"../sim/testsuite/sim/sh/fcnvds.s",
|
|
"../sim/testsuite/sim/sh/fcnvsd.s",
|
|
"../sim/testsuite/sim/sh/fdiv.s",
|
|
"../sim/testsuite/sim/sh/fipr.s",
|
|
"../sim/testsuite/sim/sh/fldi0.s",
|
|
"../sim/testsuite/sim/sh/fldi1.s",
|
|
"../sim/testsuite/sim/sh/flds.s",
|
|
"../sim/testsuite/sim/sh/float.s",
|
|
"../sim/testsuite/sim/sh/fmac.s",
|
|
"../sim/testsuite/sim/sh/fmov.s",
|
|
"../sim/testsuite/sim/sh/fmul.s",
|
|
"../sim/testsuite/sim/sh/fneg.s",
|
|
"../sim/testsuite/sim/sh/fpchg.s",
|
|
"../sim/testsuite/sim/sh/frchg.s",
|
|
"../sim/testsuite/sim/sh/fsca.s",
|
|
"../sim/testsuite/sim/sh/fschg.s",
|
|
"../sim/testsuite/sim/sh/fsqrt.s",
|
|
"../sim/testsuite/sim/sh/fsrra.s",
|
|
"../sim/testsuite/sim/sh/fsub.s",
|
|
"../sim/testsuite/sim/sh/ftrc.s",
|
|
"../sim/testsuite/sim/sh/ldrc.s",
|
|
"../sim/testsuite/sim/sh/loop.s",
|
|
"../sim/testsuite/sim/sh/macl.s",
|
|
"../sim/testsuite/sim/sh/macw.s",
|
|
"../sim/testsuite/sim/sh/mov.s",
|
|
"../sim/testsuite/sim/sh/movi.s",
|
|
"../sim/testsuite/sim/sh/movli.s",
|
|
"../sim/testsuite/sim/sh/movua.s",
|
|
"../sim/testsuite/sim/sh/movxy.s",
|
|
"../sim/testsuite/sim/sh/mulr.s",
|
|
"../sim/testsuite/sim/sh/pabs.s",
|
|
"../sim/testsuite/sim/sh/padd.s",
|
|
"../sim/testsuite/sim/sh/paddc.s",
|
|
"../sim/testsuite/sim/sh/pand.s",
|
|
"../sim/testsuite/sim/sh/pass.s",
|
|
"../sim/testsuite/sim/sh/pclr.s",
|
|
"../sim/testsuite/sim/sh/pdec.s",
|
|
"../sim/testsuite/sim/sh/pdmsb.s",
|
|
"../sim/testsuite/sim/sh/pinc.s",
|
|
"../sim/testsuite/sim/sh/pmuls.s",
|
|
"../sim/testsuite/sim/sh/prnd.s",
|
|
"../sim/testsuite/sim/sh/pshai.s",
|
|
"../sim/testsuite/sim/sh/pshar.s",
|
|
"../sim/testsuite/sim/sh/pshli.s",
|
|
"../sim/testsuite/sim/sh/pshlr.s",
|
|
"../sim/testsuite/sim/sh/psub.s",
|
|
"../sim/testsuite/sim/sh/pswap.s",
|
|
"../sim/testsuite/sim/sh/pushpop.s",
|
|
"../sim/testsuite/sim/sh/resbank.s",
|
|
"../sim/testsuite/sim/sh/sett.s",
|
|
"../sim/testsuite/sim/sh/shll.s",
|
|
"../sim/testsuite/sim/sh/shll16.s",
|
|
"../sim/testsuite/sim/sh/shll2.s",
|
|
"../sim/testsuite/sim/sh/shll8.s",
|
|
"../sim/testsuite/sim/sh/shlr.s",
|
|
"../sim/testsuite/sim/sh/shlr16.s",
|
|
"../sim/testsuite/sim/sh/shlr2.s",
|
|
"../sim/testsuite/sim/sh/shlr8.s",
|
|
"../sim/testsuite/sim/sh/swap.s",
|
|
"../sim/testsuite/sim/sh64/misc/fr-dr.s",
|
|
# .inc files. These are usually assembly or C files...
|
|
"testsuite/gdb.asm/alpha.inc",
|
|
"testsuite/gdb.asm/arm.inc",
|
|
"testsuite/gdb.asm/common.inc",
|
|
"testsuite/gdb.asm/empty.inc",
|
|
"testsuite/gdb.asm/frv.inc",
|
|
"testsuite/gdb.asm/h8300.inc",
|
|
"testsuite/gdb.asm/i386.inc",
|
|
"testsuite/gdb.asm/ia64.inc",
|
|
"testsuite/gdb.asm/iq2000.inc",
|
|
"testsuite/gdb.asm/m32c.inc",
|
|
"testsuite/gdb.asm/m32r-linux.inc",
|
|
"testsuite/gdb.asm/m32r.inc",
|
|
"testsuite/gdb.asm/m68hc11.inc",
|
|
"testsuite/gdb.asm/m68k.inc",
|
|
"testsuite/gdb.asm/mips.inc",
|
|
"testsuite/gdb.asm/netbsd.inc",
|
|
"testsuite/gdb.asm/openbsd.inc",
|
|
"testsuite/gdb.asm/pa.inc",
|
|
"testsuite/gdb.asm/pa64.inc",
|
|
"testsuite/gdb.asm/powerpc.inc",
|
|
"testsuite/gdb.asm/powerpc64.inc",
|
|
"testsuite/gdb.asm/s390.inc",
|
|
"testsuite/gdb.asm/s390x.inc",
|
|
"testsuite/gdb.asm/sh.inc",
|
|
"testsuite/gdb.asm/sparc.inc",
|
|
"testsuite/gdb.asm/sparc64.inc",
|
|
"testsuite/gdb.asm/spu.inc",
|
|
"testsuite/gdb.asm/v850.inc",
|
|
"testsuite/gdb.asm/x86_64.inc",
|
|
"testsuite/gdb.asm/xstormy16.inc",
|
|
"../sim/testsuite/sim/arm/iwmmxt/testutils.inc",
|
|
"../sim/testsuite/sim/arm/testutils.inc",
|
|
"../sim/testsuite/sim/arm/thumb/testutils.inc",
|
|
"../sim/testsuite/sim/arm/xscale/testutils.inc",
|
|
"../sim/testsuite/sim/cr16/testutils.inc",
|
|
"../sim/testsuite/sim/cris/asm/testutils.inc",
|
|
"../sim/testsuite/sim/cris/hw/rv-n-cris/testutils.inc",
|
|
"../sim/testsuite/sim/fr30/testutils.inc",
|
|
"../sim/testsuite/sim/frv/testutils.inc",
|
|
"../sim/testsuite/sim/h8300/testutils.inc",
|
|
"../sim/testsuite/sim/m32r/testutils.inc",
|
|
"../sim/testsuite/sim/sh/testutils.inc",
|
|
"../sim/testsuite/sim/sh64/compact/testutils.inc",
|
|
"../sim/testsuite/sim/sh64/media/testutils.inc",
|
|
"../sim/testsuite/sim/v850/testutils.inc",
|
|
)
|
|
|
|
# A mapping between file extensions to their associated Comment object.
|
|
# This dictionary also contains a number of exceptions, based on
|
|
# filename.
|
|
COMMENT_MAP = \
|
|
{".1" : Comment(start=r'.\"'),
|
|
".ac" : Comment(start="dnl", start2="#"),
|
|
".ads" : ADA_COMMENT,
|
|
".adb" : ADA_COMMENT,
|
|
".f" : Comment(start="c"),
|
|
".f90" : Comment(start="!"),
|
|
".gpr" : ADA_COMMENT,
|
|
".inc" : Comment(start="#", start2=";"),
|
|
".s" : Comment(start="!"),
|
|
".tex" : Comment(start="%"),
|
|
".texi" : Comment(start="@c"),
|
|
".texinfo" : Comment(start="@c"),
|
|
|
|
# Files that use a different way of including the copyright
|
|
# header...
|
|
"ada-operator.inc" : Comment(start="/*", stop="*/"),
|
|
"gdbint.texinfo" : Comment(start='@copying', stop="@end copying"),
|
|
"annotate.texinfo" : Comment(start='@copying', stop="@end copying",
|
|
max_lines=50),
|
|
"stabs.texinfo" : Comment(start='@copying', stop="@end copying"),
|
|
}
|
|
|
|
class NotFound(Exception):
|
|
pass
|
|
|
|
class AlreadyDone(Exception):
|
|
pass
|
|
|
|
def process_header(src, dst, cdescr):
|
|
"""Read from SRC for up to CDESCR.MAX_LINES until we find a copyright
|
|
notice. If found, then write the entire file, with the copyright
|
|
noticed updated with the current year added.
|
|
|
|
Raises NotFound if the copyright notice could not be found or has
|
|
some inconsistencies.
|
|
|
|
Raises AlreadyDone if the copyright notice already includes the current
|
|
year.
|
|
"""
|
|
line_count = 0
|
|
# The start-of-comment marker used for this file. Only really useful
|
|
# in the case where comments ends at the end of the line, as this
|
|
# allows us to know which comment marker to use when breaking long
|
|
# lines (in the cases where there are more than one.
|
|
cdescr_start = ""
|
|
|
|
while True:
|
|
# If we still haven't found a copyright line within a certain
|
|
# number of lines, then give up.
|
|
if line_count > cdescr.max_lines:
|
|
raise NotFound("start of Copyright not found")
|
|
|
|
line = src.readline()
|
|
line_count += 1
|
|
if not line:
|
|
raise NotFound("start of Copyright not found (EOF)")
|
|
|
|
# Is this a copyright line? If not, then no transformation is
|
|
# needed. Write it as is, and continue.
|
|
if not re.search(r"Copyright\b.*\b(199\d|20\d\d)\b", line):
|
|
dst.write(line)
|
|
continue
|
|
|
|
# If a start-of-comment marker is needed for every line, try to
|
|
# figure out which one it is that is being used in this file (most
|
|
# files only accept one, in which case it's easy - but some accept
|
|
# two or more...).
|
|
if cdescr.stop is None:
|
|
stripped_line = line.lstrip()
|
|
if stripped_line.startswith(cdescr.start):
|
|
cdescr_start = cdescr.start
|
|
elif (cdescr.start2 is not None
|
|
and stripped_line.startswith(cdescr.start2)):
|
|
cdescr_start = cdescr.start2
|
|
elif cdescr.start in stripped_line:
|
|
cdescr_start = cdescr.start
|
|
elif (cdescr.start2 is not None
|
|
and cdescr.start2 in stripped_line):
|
|
cdescr_start = cdescr.start2
|
|
else:
|
|
# This can't be a line with a comment, so not the copyright
|
|
# line we were looking for. Ignore.
|
|
continue
|
|
|
|
comment = line
|
|
break
|
|
|
|
while not re.search(r"Free\s+Software\s+Foundation", comment):
|
|
line = src.readline()
|
|
line_count += 1
|
|
if not line:
|
|
raise NotFound("Copyright owner not found (EOF)")
|
|
|
|
if cdescr.stop is None:
|
|
# Expect a new comment marker at the start of each line
|
|
line = line.lstrip()
|
|
if not line.startswith(cdescr_start):
|
|
raise NotFound("Copyright owner not found "
|
|
"(end of comment)")
|
|
comment += " " + line[len(cdescr_start):]
|
|
else:
|
|
if cdescr.stop in comment:
|
|
raise NotFound("Copyright owner not found "
|
|
"(end of comment)")
|
|
comment += line
|
|
|
|
# Normalize a bit the copyright string (we preserve the string
|
|
# up until "Copyright", in order to help preserve any original
|
|
# alignment.
|
|
(before, after) = comment.split("Copyright", 1)
|
|
after = after.replace("\n", " ")
|
|
after = re.sub("\s+", " ", after)
|
|
after = after.rstrip()
|
|
|
|
# If the copyright year has already been added, the nothing else
|
|
# to do.
|
|
if THIS_YEAR in after:
|
|
raise AlreadyDone
|
|
|
|
m = re.match("(.*[0-9]+)(.*)", after)
|
|
if m is None:
|
|
raise NotFound("Internal error - cannot split copyright line: "
|
|
"`%s'" % comment)
|
|
|
|
# Reconstruct the comment line
|
|
comment = before + "Copyright" + m.group(1) + ', %s' % THIS_YEAR
|
|
owner_part = m.group(2).lstrip()
|
|
|
|
# Max comment len...
|
|
max_len = 76
|
|
|
|
# If we have to break the copyright line into multiple lines,
|
|
# we want to align all the lines on the "Copyright" keyword.
|
|
# Create a small "indent" string that we can use for that.
|
|
if cdescr.stop is None:
|
|
# The comment marker is needed on every line, so put it at the
|
|
# start of our "indent" string.
|
|
indent = cdescr_start + ' ' * (len(before) - len(cdescr_start))
|
|
else:
|
|
indent = ' ' * len(before)
|
|
|
|
# If the line is too long...
|
|
while len(comment) > max_len:
|
|
# Split the line at the first space before max_len.
|
|
space_index = comment[0:max_len].rfind(' ')
|
|
if space_index < 0: # No space in the first max_len characters???
|
|
# Split at the first space, then...
|
|
space_index = comment.find(' ')
|
|
if space_index < 0:
|
|
# Still no space found. This is extremely unlikely, but
|
|
# just pretend there is one at the end of the string.
|
|
space_index = len(comment)
|
|
|
|
# Write the first part of the string up until the space
|
|
# we selected to break our line.
|
|
dst.write(comment[:space_index] + '\n')
|
|
|
|
# Strip the part of comment that we have finished printing.
|
|
if space_index < len(comment):
|
|
comment = comment[space_index + 1:]
|
|
else:
|
|
comment = ""
|
|
|
|
# Prepend the "indent" string to make sure that we remain
|
|
# aligned on the "Copyright" word.
|
|
comment = indent + comment
|
|
|
|
# And finally, write the rest of the last line... We want to write
|
|
# "Free Software Foundation, Inc" on the same line, so handle this
|
|
# with extra care.
|
|
dst.write(comment)
|
|
if len(comment) + 1 + len (owner_part) > max_len:
|
|
dst.write('\n' + indent)
|
|
else:
|
|
dst.write(' ')
|
|
dst.write(owner_part + '\n')
|
|
|
|
def comment_for_filename(filename):
|
|
"""Return the Comment object that best describes the given file.
|
|
This a smart lookup of the COMMENT_MAP dictionary where we check
|
|
for filename-based exceptions first, before looking up the comment
|
|
by filename extension. """
|
|
# First, consult the COMMENT_MAP using the filename, in case this
|
|
# file needs special treatment.
|
|
basename = os.path.basename(filename)
|
|
if basename in COMMENT_MAP:
|
|
return COMMENT_MAP[basename]
|
|
# Not a special file. Check the file extension.
|
|
ext = os.path.splitext(filename)[1]
|
|
if ext in COMMENT_MAP:
|
|
return COMMENT_MAP[ext]
|
|
# Not a know extension either, return None.
|
|
return None
|
|
|
|
def process_file(filename):
|
|
"""Processes the given file.
|
|
"""
|
|
cdescr = comment_for_filename(filename)
|
|
if cdescr is None:
|
|
# Either no filename extension, or not an extension that we
|
|
# know how to handle.
|
|
return
|
|
|
|
dst_filename = filename + '.new'
|
|
src = open(filename)
|
|
dst = open(dst_filename, 'w')
|
|
try:
|
|
process_header(src, dst, cdescr)
|
|
except AlreadyDone:
|
|
print "+++ Already up to date: `%s'." % filename
|
|
dst.close()
|
|
os.unlink(dst_filename)
|
|
if filename in NO_COPYRIGHT:
|
|
# We expect the search for a copyright header to fail, and
|
|
# yet we found one...
|
|
print "Warning: `%s' should not be in NO_COPYRIGHT" % filename
|
|
return
|
|
except NotFound as inst:
|
|
dst.close()
|
|
os.unlink(dst_filename)
|
|
if not filename in NO_COPYRIGHT:
|
|
print "*** \033[31m%s\033[0m: %s" % (filename, inst)
|
|
return
|
|
|
|
if filename in NO_COPYRIGHT:
|
|
# We expect the search for a copyright header to fail, and
|
|
# yet we found one...
|
|
print "Warning: `%s' should not be in NO_COPYRIGHT" % filename
|
|
|
|
for line in src:
|
|
dst.write(line)
|
|
src.close()
|
|
dst.close()
|
|
os.rename(dst_filename, filename)
|
|
|
|
if __name__ == "__main__":
|
|
if not os.path.isfile("doc/gdb.texinfo"):
|
|
print "Error: This script must be called from the gdb directory."
|
|
for gdb_dir in ('.', '../sim', '../include/gdb'):
|
|
for root, dirs, files in os.walk(gdb_dir):
|
|
for filename in files:
|
|
fullpath = os.path.join(root, filename)
|
|
if fullpath.startswith('./'):
|
|
fullpath = fullpath[2:]
|
|
if filename not in EXCLUSION_LIST and fullpath not in BY_HAND:
|
|
# Paths that start with './' are ugly, so strip that.
|
|
# This also allows us to omit them in the NO_COPYRIGHT
|
|
# list...
|
|
process_file(fullpath)
|
|
print
|
|
print "\033[32mREMINDER: The following files must be updated by hand." \
|
|
"\033[0m"
|
|
for filename in BY_HAND:
|
|
print " ", filename
|
|
|