ReadMe for relic.py (a Mozilla relicensing tool) This script is intended to facilitate re-licensing the Mozilla source tree pursuant to . 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-.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% 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% ---------------------------- 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 ). If you have problems with the script please let me know and hopefully I can help you out.