            ReadMe for relic.py (a Mozilla relicensing tool)


    This script is intended to facilitate re-licensing the Mozilla source
    tree pursuant to <http://mozilla.org/MPL/>. It cannot do the full job
    automatically but handles most of the grunt work.

Table of Contents:

    The Problem
    Getting Started
    Basic Usage
    What Files are Processed
    Error Handling (--force)
    Unfinished Business
    Contributors


The Problem:

    The basic problem is that Mozilla has a lot of files. The goal is to have
    all the files (with a few minor exceptions) contain a leading license
    block that is either the MPL/GPL/LGPL tri-license or the NPL/GPL/LGPL
    tri-license. Because this was never rigorously enforced a lot of cleanup
    is necessary to correct license blocks in Mozilla's files. This script
    will traverse the given directory(s)/file(s) and fixup the leading
    license block, or give an error message explaining why it cannot. (It
    also has modes to just scan for and summarize license info.)


Getting Started:

    While 'relic.py' is probably quite portable to Windows it has not been
    tested there. There may be some hidden path-delimiter bugs. It is
    probably best to just run this script on Linux.

    To use:
    - crack the relic-<version>.tar.gz tarball in some directory
    - call './relic.py --help' to learn the basic usage
    - play with './relic.py ...' as desired.


Basic Usage:

    'relic.py' has a --help option that explains the basic usage but I'll go
    through some examples here. In our examples we will work on re-licensing
    the mozilla/js/src directory tree.

    'relic.py' has three modes.
    (1) List license info on each file processed (the default)

        $ ./relic.py mozilla/js/src/jsapi.h
        /js/src/jsapi.h
        ... npl/gpl found
        ... license block lines: 2-32
        ... original code is: Mozilla Communicator client code
        ... initially by: Original Code is Netscape Communications Corporation (1998)

    (2) Gather and dump statistics on the processed files:

        $ ./relic.py -s mozilla/js/src/jsapi.h
        Summary of Licenses in Files
        ============================
         Number  Percent License
        ------- -------- -----------
              1  100.00% npl/gpl
        ----------------------------
              1 files processed

        Licensed files with complete tri-license block: 0
        Licensed files with no 'Initial Developer...' info: 0
        Licensed files with no 'Original Code is...' info: 0
        Licensed files with improperly indented 'Contributor(s):' line(s): 0

    (3) Re-licensing the given files that need it (i.e. files with a complete
        and correct license block are changed).

        $ ./relic.py -r mozilla/js/src/jsapi.h
        mozilla/js/src/jsapi.h
        ... npl/gpl found, need to relicense
        ... original code is: Mozilla Communicator client code
        ... initially by: Original Code is Netscape Communications Corporation (1998)
        ... replacing lines 2-32 with NPL/GPL/LGPL tri-license
        ... backing up to 'mozilla/js/src/jsapi.h~0'
        ... done relicensing 'mozilla/js/src/jsapi.h'

        --------------------- Summary of Results ------------------------
        Files skipped b/c they are binary: 0
        Files skipped b/c they already had proper license: 0
        Files skipped b/c they had no license: 0
        Files re-licensed: 1
        -----------------------------------------------------------------

    If you are trying this as you read this, run the following command to see
    the changes made to jsapi.h:

        $ diff -c mozilla/js/src/jsapi.h~0 mozilla/js/src/jsapi.h


What Files are Processed:

    'relic.py' will process any files listed on the command line and will
    recursively process all files in any given directories:

        $ ./relic.py -s mozilla/js/src
        Summary of Licenses in Files
        ============================
         Number  Percent License
        ------- -------- -----------
            324   74.14% npl/gpl
             71   16.25% <none found>
             23    5.26% mpl/gpl/lgpl
              4    0.92% npl/gpl/lgpl
              4    0.92% mpl
              4    0.92% ibm
              3    0.69% mpl/gpl
              2    0.46% npl
              2    0.46% <unknown license>
        ----------------------------
            437 files processed

        Licensed files with complete tri-license block: 27
        Licensed files with no 'Initial Developer...' info: 1
        Licensed files with no 'Original Code is...' info: 27
        Licensed files with improperly indented 'Contributor(s):' line(s): 2
   
    The following files are automatically skipped:
    - CVS control directories;
    - files listed in .cvsignore files;
    - all *.s files (there usage of comment delimiters is all over the map);
    - binary files; and
    - any files included in the following global variables in relic.py:
      _g_skip_file_basenames, _g_skip_files, _g_skip_dir_basenames,
      _g_skip_dirs, _g_skip_ext.


Error Handling (--force):

    There are some situations that relic.py cannot handle. E.g., a file with
    no license block to start with, an IBM license block, a license block
    sufficiently strange enough to baffle relic.py regular expressions. In
    normal operation, when an error is encoutered on any file processing
    stops. This can be annoying, so a --force|-f option was added to force
    relic.py to continue processing files after an error with a file is
    encountered. In all modes of operation errors are summarized at the end.

        $ ./relic.py -s mozilla/extensions/transformiix/source/xml
        ERROR:relic:This is line is part of the 'Contributor(s):' paragraph but (1) is not indented and (2) does not look like it contains an email address: mozilla/extensions/transformiix/source/xml/XMLDOMUtils.h:20: ' * Keith Visco' (the --force option can be used to skip problematic files and continue processing rather than aborting)

        $ ./relic.py -sf mozilla/extensions/transformiix/source/xml
        Summary of Licenses in Files
        ============================
         Number  Percent License
        ------- -------- -----------
             24  100.00% mpl
        ----------------------------
             24 files processed

        Licensed files with complete tri-license block: 0
        Licensed files with no 'Initial Developer...' info: 16
        Licensed files with no 'Original Code is...' info: 15
        Licensed files with improperly indented 'Contributor(s):' line(s): 3


        =================== Summary of Errors ===========================
        Files with processing errors: 3
        =================================================================
        mozilla/extensions/transformiix/source/xml/XMLDOMUtils.cpp: This is line is part of the 'Contributor(s):' paragraph but (1) is not indented and (2) does not look like it contains an email address: mozilla/extensions/transformiix/source/xml/XMLDOMUtils.cpp:20: ' * Keith Visco '

        mozilla/extensions/transformiix/source/xml/XMLDOMUtils.h: This is line is part of the 'Contributor(s):' paragraph but (1) is not indented and (2) does not look like it contains an email address: mozilla/extensions/transformiix/source/xml/XMLDOMUtils.h:20: ' * Keith Visco '

        mozilla/extensions/transformiix/source/xml/parser/txXMLParser.h: This is line is part of the 'Contributor(s):' paragraph but (1) is not indented and (2) does not look like it contains an email address: mozilla/extensions/transformiix/source/xml/parser/txXMLParser.h:20: ' * Tom Kneeland'

        =================================================================
 

Unfinished Business:

    The following is a list of issues that should be sorted out before this
    should be used to start making patches to the Mozilla tree:

    - What to do for files that have no 'Initial Developer...' block?
    - What to do for files that have no 'Original Code is...' block?
    - Are there specific files or parts of the mozilla tree that should be
      skipped always, i.e. generated files, files not meant to have leading
      license blocks?
    - What to do for files with the IBM license?
    - Should *.uf be ignored (there are 87 of them in the mozilla tree)?
    - The 'ripl' and lick' scripts' "include licenses" configuration option
      is not supported in anyway by relic.py. Is it necessary? I don't see a
      useful use case.
    - test/x_thread_align_center.xml and test/abs2rel.pl are examples of
      files that are not handled correctly. In the former there is some data
      loss. In the latter the is some cruft left over.


Contributors:

    Trent Mick (TrentM@ActiveState.com) originally wrote this script,
    borrowing some from earlier attempts in the name of 'lick', 'lutils.py',
    and 'ripl' (see <http://bugzilla.mozilla.org/show_bug.cgi?id=98089>).
    If you have problems with the script please let me know and hopefully I
    can help you out.
    

