Warning, file /sdk/kde-dev-scripts/relicensecheck.pl was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).

0001 #!/usr/bin/perl -w
0002 # vim:sw=4:et
0003 # (c) Dirk Mueller. GPLv2+
0004 # I would love to be a python script, but os.popen just sucks
0005 
0006 use strict;
0007 
0008 use List::Util qw(any);
0009 
0010 ### Please add your KDE (svn/git) account name in *alphabetical* order to the list
0011 ### below, then answer the following questions:
0012 ###
0013 ### 1. Include 'gplv23' if you are okay with contributions you've made under
0014 ###    "GPLv2" being relicensed as "GPLv2 or GPLv3".
0015 ###
0016 ### 2. Include 'lgplv23' if you are okay with contributions you've made under
0017 ###    "LGPLv2" being relicensed as "LGPLv2 or LGPLv3".
0018 ###
0019 ### 3. Include 'gplv2+' if you are okay with contributions you've made under
0020 ###    "GPLv2" being relicensed as "GPLv2 or later".
0021 ###
0022 ### 4. Include 'lgplv2+' if you are okay with contributions you've made under
0023 ###    "LGPLv2" being relicensed as "LGPLv2 or later".
0024 ###
0025 ### 5. Include '+eV' if you are okay with the KDE e.V. deciding on a future
0026 ###    licensing change to your code if necessary.
0027 ###
0028 ### 6. Include 'CCBYSA4' if you are okay with contributions you've made under
0029 ###    "GNU FDL" being relicensed as "Creative Commons Attribution-ShareAlike 4.0 International".
0030 ### For more information, see https://community.kde.org/Guidelines_and_HOWTOs/Relicensing/KDE_Relicensing
0031 
0032 my %license_table = (
0033     'acrouthamel'   => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0034     'adityam'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0035     'aheinecke'     => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0036     'ahmadsamir'    => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0037     'albertvaka'    => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0038     'alex'          => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0039     'apollozhu'     => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0040     'arbab'         => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0041     'arichardson'   => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0042     'arrowdodger'   => ['lgplv23', 'CCBYSA4'],
0043     'athurhfree'    => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0044     'bdevries'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0045     'bharadwaj-raju'=> ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0046     'blu-base'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0047     'bruns'         => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0048     'burghard'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0049     'carlschwan'    => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0050     'cfeck'         => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0051     'cgerloff'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0052     'cordlandwehr'  => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0053     'davidbryant'   => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0054     'davidedmundson'=> ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0055     'davidhurka'    => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0056     'davidre'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0057     'djarvie'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0058     'emmanuelp'     => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0059     'felixernst'    => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', 'CCBYSA4' ],
0060     'flherne'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0061     'froscher'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0062     'fthieme'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0063     'hadacek'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', 'CCBYSA4' ],
0064     'huoni'         => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0065     'igorkushnir'   => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0066     'jarmond'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0067     'jbatrina'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0068     'johanneszarl'  => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0069     'jpoelen'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0070     'jriddell'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0071     'jsuhaas'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0072     'kezik'         => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0073     'kleag'         => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', 'CCBYSA4' ],
0074     'lesliezhai'    => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0075     'lnj'           => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0076     'logixoul'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0077     'lorendb'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0078     'ltoscano'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0079     'lueck'         => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0080     'mart'          => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0081     'marten'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0082     'meven'         => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0083     'mgallien'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0084     'michaeleden'   => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0085     'michelh'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0086     'mitchell'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0087     'mjansen'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0088     'mpyne'         => ['gplv23', 'lgplv23',                      '+eV', 'CCBYSA4' ],
0089     'muhlenpfordt'  => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0090     'ndavis'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0091     'nclarius'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+',        'CCBYSA4' ],
0092     'ngraham'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0093     'nicolasfella'  => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0094     'nituldatt'     => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0095     'okellogg'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0096     'ostroffjh'     => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0097     'redstrate'     => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0098     'rikkus'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0099     'rkflx'         => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0100     'rkrawitz'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0101     'safaalfulaij'  => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0102     'sitter'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0103     'smithjd'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0104     'smitop'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0105     'sredman'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0106     'stefan'        => ['lgplv2+'],
0107     'sstjames'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0108     'stikonas'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0109     'tfella'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0110     'thomassc'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0111     'tkadauke'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0112     'tleupold'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0113     'vladz'         => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0114     'vjoshi'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0115     'whiting'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0116     'wxiao'         => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0117     'wbauer'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ],
0118     'xyquadrat'     => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV', 'CCBYSA4' ]
0119 );
0120 
0121 my %old_license_table_2 = (
0122     # From before CCBYSA4 was added, if you get an update for one of these people move it to %license_table
0123     'aacid'         => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0124     'abryant'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0125     'adawit'        => ['gplv23', 'lgplv23',                      '+eV' ],
0126     'ademko'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0127     'adiaferia'     => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0128     'afiestas'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0129     'alexmerry'     => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0130     'alund'         => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0131     'amantia'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0132     'amth'          => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0133     'andreyc'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0134     'antlarr'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0135     'apol'          => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0136     'arnolddumas'   => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0137     'asensi'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0138     'aseigo'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0139     'asserhal'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0140     'beaulen'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0141     'bensi'         => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0142     'beschow'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0143     'bgupta'        => [                     'gplv2+', 'lgplv2+', '+eV' ],
0144     'bhards'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0145     'bieker'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0146     'bischoff'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0147     'bks'           => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0148     'blackie'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0149     'bport'         => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0150     'bram'          => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0151     'broulik'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0152     'bruggie'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0153     'bshah'         => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0154     'capel'         => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0155     'carewolf'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+'        ],
0156     'cgiboudeaux'   => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0157     'chani'         => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0158     'chehrlic'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0159     'clee'          => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0160     'cmollekopf'    => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0161     'coates'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0162     'codrea'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+'        ],
0163     'craig'         => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0164     'cramblitt'     => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+'        ],
0165     'cschumac'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0166     'ctennis'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0167     'cullmann'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0168     'dakon'         => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+'        ],
0169     'danimo'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0170     'dannya'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0171     'deller'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+'        ],
0172     'denis'         => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0173     'deniskuplyakov'=> ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0174     'dfaure'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0175     'dhaumann'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0176     'dherberth'     => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0177     'domi'          => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0178     'dyp'           => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0179     'dvratil'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0180     'egorov'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0181     'ehamberg'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0182     'eliasp'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0183     'elvisangelaccio'=>['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0184     'epignet'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0185     'ereslibre'     => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0186     'eros'          => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0187     'ervin'         => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0188     'eschepers'     => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+',       ],
0189     'eva'           => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+'        ],
0190     'fabiank'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0191     'fawcett'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0192     'fengchao'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0193     'fischer'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0194     'fizz'          => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0195     'flocati'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0196     'fujioka'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0197     'fux'           => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0198     'garbanzo'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0199     'gateau'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0200     'geralds'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+'        ],
0201     'giannaros'     => ['gplv23', 'lgplv23'                             ],
0202     'gioele'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0203     'graesslin'     => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0204     'granroth'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0205     'gregormi'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0206     'groszdaniel'   => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0207     'grulich'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0208     'guymaurel'     => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0209     'haeber'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0210     'haeckel'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+',       ],
0211     'harris'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0212     'hausmann'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0213     'heikobecker'   => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+',       ],
0214     'hein'          => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0215     'hdhoang'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0216     'hindenburg'    => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0217     'hoelzer'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0218     'hrvojes'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0219     'hubner'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0220     'huerlimann'    => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0221     'huftis'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0222     'ibragimov'     => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0223     'ilic'          => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0224     'ikomissarov'   => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0225     'ivan'          => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0226     'jbrouault'     => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0227     'jehrichs'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0228     'jekyllwu'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0229     'jlee'          => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0230     'johnflux'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0231     'jones'         => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0232     'jowenn'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0233     'jschroeder'    => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0234     'jtamate'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0235     'kainhofe'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0236     'kfunk'         => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0237     'kloecker'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+'        ],
0238     'knight'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0239     'knauss'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0240     'kossebau'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0241     'kylafas'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0242     'lbeltrame'     => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0243     'leinir'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0244     'leonh'         => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+'        ],
0245     'leonhard'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0246     'lilachaze'     => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0247     'lliehu'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0248     'lukas'         => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0249     'lvsouza'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0250     'lypanov'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0251     'majewsky'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0252     'mardelle'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0253     'martyn'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0254     'mbritton'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0255     'mbroadst'      => ['gplv23', 'lgplv23'                     , '+eV' ],
0256     'mecir'         => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0257     'michaelhowell' => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0258     'michalhumpula' => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0259     'milliams'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0260     'mirko'         => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0261     'mklapetek'     => ['gplv23', 'lgplv23',         ,          , '+eV' ],
0262     'mkoller'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0263     'mlaurent'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0264     'mludwig'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+'        ],
0265     'mmrozowski'    => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0266     'mssola'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0267     'mturkia'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0268     'mueller'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+'        ],
0269     'mwolff'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0270     'nalvarez'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0271     'narvaez'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0272     'nhasan'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+'        ],
0273     'nikitas'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0274     'nsams'         => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+'        ],
0275     'ogoffart'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0276     'orcsik'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0277     'palant'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0278     'palimaka'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0279     'pdamsten'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+'        ],
0280     'peifengyu'     => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+'        ],
0281     'pgquiles'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0282     'pino'          => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0283     'pletourn'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0284     'pupeno'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0285     'raabe'         => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0286     'rahn'          => ['gplv23', 'lgplv23'                     , '+eV' ],
0287     'ralfjung'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0288     'ralsina'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0289     'rdale'         => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0290     'reiher'        => ['gplv23', 'lgplv23',                      '+eV' ],
0291     'rich'          => ['gplv23', 'lgplv23'                     , '+eV' ],
0292     'richih'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+'        ],
0293     'rkcosta'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0294     'robbilla'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+'        ],
0295     'romariorios'   => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0296     'rpreukschas'   => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0297     'rthomsen'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0298     'ruedigergad'   => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0299     'sanders'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0300     'sandsmark'     => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0301     'sars'          => ['gplv23', 'lgplv23',                      '+eV' ],
0302     'saschpe'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+'        ],
0303     'savernik'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0304     'scarpino'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0305     'schmeisser'    => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0306     'schroder'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0307     'schwarzer'     => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0308     'sebas'         => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0309     'skelly'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0310     'smartins'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0311     'sping'         => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+'        ],
0312     'staikos'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0313     'staniek'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0314     'sune'          => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0315     'taj'           => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+'        ],
0316     'tanton'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+'        ],
0317     'tenharmsel'    => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0318     'teske'         => ['gplv23', 'lgplv23',                            ],
0319     'tfry'          => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+'        ],
0320     'thiago'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0321     'tjansen'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0322     'tmcguire'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0323     'tnyblom'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0324     'treat'         => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0325     'turbov'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0326     'uga'           => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0327     'uwolfer'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0328     'vandenoever'   => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0329     'vhanda'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0330     'vitters'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0331     'vkrause'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0332     'vonreth'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0333     'vrusu'         => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0334     'waba'          => ['gplv23', 'lgplv23',                      '+eV' ], # NOTE: explicit consent given for relicensing LGPL-2.0-only to LGPL-2.1-only in addition to the stated grants
0335     'wheeler'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+'        ],
0336     'willy'         => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0337     'woebbe'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0338     'wstephens'     => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0339     'yurchor'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0340     'zack'          => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ],
0341     'zecke'         => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+', '+eV' ]
0342     # Do not add anything here. Use license_table instead.
0343 );
0344 
0345 my %old_license_table = (
0346     ### below is the older table -- from before we offered the +eV option.
0347     ### This means that in theory some of these contributors might accept
0348     ### to add the +eV if we ask them nicely. If they refuse, move the line
0349     ### to the above part of the table so that we don't ask them again.
0350     'adridg'        => ['gplv23', 'lgplv23'                      ],
0351     'ahartmetz'     => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0352     'annma'         => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0353     'apaku'         => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0354     'arendjr'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0355     'aumuell'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0356     'bbroeksema'    => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0357     'binner'        => ['gplv23', 'lgplv23'                      ],
0358     'bjacob'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0359     'bmeyer'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0360     'boemann'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0361     'borgese'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0362     'braxton'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0363     'bvirlet'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0364     'cartman'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0365     'cconnell'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0366     'charles'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0367     'cies'          => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0368     'cniehaus'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0369     'coolo'         => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0370     'cschlaeg'      => ['gplv23', 'lgplv23'                      ],
0371     'dimsuz'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0372     'djurban'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0373     'dmacvicar'     => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0374     'dymo'          => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0375     'edghill'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0376     'emmott'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0377     'espen'         => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0378     'fela'          => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0379     'fredrik'       => ['gplv23', 'lgplv23'                      ],
0380     'gladhorn'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0381     'gogolok'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0382     'goossens'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0383     'gyurco'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0384     'harald'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0385     'hedlund'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0386     'helio'         => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0387     'howells'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0388     'hschaefer'     => ['gplv23'                                 ],
0389     'ingwa'         => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0390     'isaac'         => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0391     'jens'          => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0392     'jlayt'         => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0393     'johach'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0394     'krake'         => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0395     'laidig'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0396     'lunakl'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0397     'lure'          => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0398     'marchand'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0399     'mattr'         => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0400     'mcamen'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0401     'menard'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0402     'mfranz'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0403     'mhunter'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0404     'micron'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0405     'mkretz'        => ['gplv23', 'lgplv23'                      ],
0406     'mlarouche'     => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0407     'mm'            => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0408     'mrudolf'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0409     'msoeken'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0410     'mstocker'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0411     'mutz'          => [                     'gplv2+', 'lgplv2+' ],
0412     'mvaldenegro'   => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0413     'mwoehlke'      => ['gplv23', 'lgplv23'                      ],
0414     'nielsslot'     => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0415     'okellogg'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0416     'onurf'         => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0417     'orzel'         => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0418     'ossi'          => [                     'gplv2+', 'lgplv2+' ],
0419     'osterfeld'     => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0420     'pfeiffer'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0421     'piacentini'    => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0422     'pitagora'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0423     'ppenz'         => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0424     'pstirnweiss'   => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0425     'putzer'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0426     'pvicente'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0427     'quique'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0428     'raggi'         => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0429     'rempt'         => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0430     'rjarosz'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0431     'rodda'         => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0432     'roffet'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0433     'rohanpm'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0434     'sebsauer'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0435     'shaforo'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0436     'shipley'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0437     'silberstorff'  => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0438     'thorbenk'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0439     'tilladam'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0440     'tokoe'         => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0441     'toma'          => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0442     'troeder'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0443     'trueg'         => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ], # NOTE: except k3b
0444     'wgreven'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0445     'winterz'       => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0446     'zachmann'      => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ],
0447     'zander'        => ['gplv23', 'lgplv23', 'gplv2+', 'lgplv2+' ]
0448     # Do not add anything here. Use license_table instead.
0449 );
0450 
0451 my %secondary_mail_addresses = (
0452     '13thguards@gmail.com' => 'isemenov',
0453     'ABBAPOH@me.com' => 'ikomissarov',
0454     'aetf@unlimitedcodeworks.xyz' => 'peifengyu',
0455     'aleixpol@kde.org' => 'apol',
0456     'alex.merry@kde.org' => 'alexmerry',
0457     'arichardson.kde@googlemail.com' => 'arichardson',
0458     'asmond@gmx.com' => 'asensi',
0459     'athurh@gmail.com' => 'athurhfree',
0460     'bero@arklinux.org' => 'bero',
0461     'bhush94@gmail.com' => 'bshah',
0462     'blackie@kde.org' => 'blackie',
0463     'caleb@gentoo.org' => 'ctennis',
0464     'cgiboudeaux@gmx.com' => 'cgiboudeaux',
0465     'christoph@maxiom.de' => 'cfeck',
0466     'kde@davidedmundson.co.uk' => 'davidedmundson',
0467     'devel@the-user.org' => 'schmidt-domine',
0468     'devriese@kde.org' => 'domi',
0469     'dvratil@redhat.com' => 'dvratil',
0470     'elvis.angelaccio@kdemail.net' => 'elvisangelaccio',
0471     'ervin+bluesystems@kde.org' => 'ervin',
0472     'faure+bluesystems@kde.org' => 'dfaure',
0473     'git@the-user.org' => 'schmidt-domine',
0474     'guy.maurel@kde.org' => 'guymaurel',
0475     'guy-kde@maurel.de' => 'guymaurel',
0476     'isilmendil@gmx.net' => 'johanneszarl',
0477     'isilmendil@isilme.lupus.uberspace.de' => 'johanneszarl',
0478     'jesper.pedersen@kdab.com' => 'blackie',
0479     'jesper.pedersen@kde.org' => 'blackie',
0480     'jkt@flaska.net' => 'jkt',
0481     'jkt@gentoo.org' => 'jkt',
0482     'johannes@zarl.at' => 'johanneszarl',
0483     'john@layt.net' => 'jlayt',
0484     'kevin.krammer@gmx.at' => 'krake',
0485     'kde@randomguy3.me.uk' => 'alexmerry',
0486     'kde@rusu.info' => 'valir',
0487     'keziolio123@gmail.com' => 'kezik',
0488     'knauss@kolabsys.com' => 'knauss',
0489     'kubito@gmail.com' => 'rkcosta',
0490     'lamarque@gmail.com' => 'lvsouza',
0491     'lukas@kde.org' => 'lukas',
0492     'majewsky@gmx.net' => 'majewsky',
0493     'malte@kde.org' => 'malte',
0494     'matthias.fuessel@gmx.net' => 'matthiasf',
0495     'miika.turkia@nixu.fi' => 'mturkia',
0496     'mk-lists@email.de' => 'kaning',
0497     'mklapetek@kde.org' => 'mklapetek',
0498     'neoclust.kde@free.fr' => 'nlecureuil',
0499     'nyblom@kde.org' => 'tnyblom',
0500     'olav@vitters.nl' => 'vitters',
0501     'pointedstick@zoho.com' => 'ngraham',
0502     'richard@goteborg.utfors.se' => 'larkang',
0503     'schwarzerf@gmail.com' => 'schwarzer',
0504     'iamsergio@gmail.com' => 'smartins',
0505     'sandsmark@samfundet.no' => 'sandsmark',
0506     'sune@vuorela.dk' => 'sune',
0507     'thb@net-bembel.de' => 'tbaumgart',
0508     'tobias.leupold@web.de' => 'tleupold',
0509     'trev@adblockplus.org' => 'palant',
0510     'tsdgeos@terra.es' => 'aacid',
0511     'nicolas.fella@kdab.com' => 'nicolasfella',
0512     'xiangzhai83@gmail.com' => 'lesliezhai',
0513 );
0514 
0515 my %ruletable;
0516 my %blacklist;
0517 my %whitelist;
0518 my %unknown_authors;
0519 my @blacklist_revs;
0520 
0521 foreach my $who (keys %old_license_table) {
0522     die "$who in both tables" if defined $license_table{$who};
0523     $license_table{$who} = $old_license_table{$who};
0524 }
0525 
0526 foreach my $who (keys %old_license_table_2) {
0527     die "$who in both tables" if defined $license_table{$who};
0528     $license_table{$who} = $old_license_table_2{$who};
0529 }
0530 
0531 foreach my $who (keys %license_table) {
0532     foreach my $license(@{$license_table{$who}}) {
0533         $ruletable{$license}->{$who} = 1;
0534     }
0535 }
0536 
0537 # Read kde-common/accounts for email->name mapping.
0538 
0539 my $configfile = $ENV{HOME}. "/.config/KDE/relicensecheck.conf";
0540 
0541 open(CONFIG, $configfile) or die "Please write the path to kde-common/accounts in $configfile";
0542 my $accountfile;
0543 while (<CONFIG>) {
0544     if (not /^#/) {
0545         chomp;
0546         $accountfile = $_;
0547     }
0548 }
0549 close CONFIG;
0550 defined $accountfile or die "Please write the path to kde-common/accounts in $configfile";
0551 
0552 my %authors = ();
0553 my %authornames = ();
0554 sub parseAccountsFile($)
0555 {
0556     my ($accountfile) = @_;
0557     open(ACCOUNTS, $accountfile) || die "Account file not found: $accountfile";
0558     while (<ACCOUNTS>) {
0559         # The format is nick name email.
0560         if (/([^\s]*)\s+([^\s].*[^\s])\s+([^\s]+)/) {
0561             $authors{$3} = "$1";
0562             $authornames{$1} = "$2";
0563         }
0564         #elsif (/([^\s]*)\s+([^\s]*)/) {
0565         #    $authors{$1} = $2;
0566         #}
0567         else {
0568             die "$accountfile: couldn't parse $_";
0569         }
0570     }
0571     close ACCOUNTS;
0572 }
0573 
0574 if ($accountfile) {
0575     parseAccountsFile($accountfile);
0576 
0577     # Also read the "disabled accounts" file
0578     my $disabledaccountsfile = $accountfile;
0579     $disabledaccountsfile =~ s/accounts$/disabled-accounts/;
0580     die "I expected this to end with 'accounts': $accountfile" if ($accountfile eq $disabledaccountsfile);
0581     parseAccountsFile($disabledaccountsfile);
0582 }
0583 
0584 sub resolveEmail($) {
0585     my ($email) = @_;
0586 
0587     my $resolved = $authors{$email};
0588     if (not defined $resolved) {
0589         $resolved = $secondary_mail_addresses{$email};
0590     }
0591     if (not defined $resolved) {
0592         $unknown_authors{$email} = 1;
0593         return $email;
0594     }
0595     return $resolved;
0596 }
0597 
0598 sub skipCommitByAuthor($) {
0599     my ($author) = @_;
0600     return ($author eq "scripty" or
0601             $author eq "(no" or
0602             $author eq "nobody\@localhost" or
0603             $author eq "not.committed.yet" or
0604             $author eq "null\@kde.org");
0605 }
0606 
0607 sub usage()
0608 {
0609  print << "EOM";
0610 Usage:
0611     relicensecheck.pl file
0612 
0613     Output information on relicensing possibilities for <file>
0614 
0615     relicensecheck.pl -g
0616     relicensecheck.pl --generate-wiki
0617 
0618     Generate the table for the wiki page
0619 EOM
0620 }
0621 
0622 my $generate_wiki = 0;
0623 my @arguments;
0624 sub parse_arguments(@)
0625 {
0626     while (scalar @_) {
0627         my $arg = shift @_;
0628 
0629         if ($arg eq "-g" || $arg eq "--generate-wiki") {
0630             $generate_wiki = 1;
0631         } elsif ($arg eq "-?" || $arg eq "--?" || $arg eq "-h" || $arg eq "--help") {
0632             usage();
0633             exit 0;
0634         } elsif ($arg eq "--") {
0635             push @arguments, @_;
0636             return;
0637         } else {
0638             push @arguments, $arg;
0639         }
0640     }
0641 }
0642 
0643 parse_arguments(@ARGV);
0644 
0645 if ($generate_wiki) {
0646 
0647     print "{| border=\"1\"\n";
0648     print "! Name !! GPLv2->GPLv2+ !! LGPLv2 -> LGPLv2+ !! GPLv2 -> GPLv2+v3 !! LGPLv2 -> LGPLv2+LGPLv3 !! KDE e.V. decides !! FDL -> CC-BY-SA 4.0 \n";
0649     print "|-\n";
0650     my @lines = ();
0651     foreach my $who (keys %license_table) {
0652         if (!defined $authornames{$who}) {
0653             die "ERROR: unknown author $who\n";
0654         }
0655         # Example: print "|Adam, Till || YES || YES || YES || YES || NO\n";
0656         my @licenses = @{$license_table{$who}};
0657         my %licensesHash = map { $_ => 1 } @licenses;
0658         my $gplv23 = exists($licensesHash{'gplv23'}) ? "YES" : "NO";
0659         my $lgplv23 = exists($licensesHash{'lgplv23'}) ? "YES" : "NO";
0660         my $gplv2plus = exists($licensesHash{'gplv2+'}) ? "YES" : "NO";
0661         my $lgplv2plus = exists($licensesHash{'lgplv2+'}) ? "YES" : "NO";
0662         my $eV = exists($licensesHash{'+eV'}) ? "YES" : "NO";
0663         $eV = "" if (exists $old_license_table{$who});
0664         my $ccbysa4 = exists($licensesHash{'CCBYSA4'}) ? "YES" : "NO";
0665         $ccbysa4 = "" if (exists $old_license_table_2{$who} || exists $old_license_table{$who});
0666         push @lines, "|$authornames{$who} || $gplv2plus || $lgplv2plus || $gplv23 || $lgplv23 || $eV || $ccbysa4\n";
0667     }
0668     use locale;
0669     foreach my $line (sort @lines) {
0670         print $line;
0671         print "|-\n";
0672     }
0673     print "|}\n";
0674 
0675     exit 0;
0676 }
0677 my $file = $arguments[0] || "";
0678 
0679 die "need existing file: $file" if (! -r $file);
0680 
0681 my $svn = (-d ".svn");
0682 
0683 if ($svn) {
0684     open(IN, "-|") || exec 'svn', 'log', '-q', $file;
0685 } else {
0686     # Format the git output to match the format of svn log.
0687     open(IN, "-|") || exec 'git', 'log', '--follow', '--abbrev-commit', '--pretty=format:r%h | %ae ', $file;
0688 }
0689 while(<IN>) {
0690 
0691     if (/^r(\S+) \| (\S+) /)  {
0692         my ($rev, $author) = ($1, $2);
0693         #print STDERR "rev=$rev author=$author\n";
0694 
0695         next if skipCommitByAuthor($author);
0696 
0697         if (not $svn) {
0698             # Resolve email to account name
0699             $author = resolveEmail($author);
0700         }
0701 
0702         foreach my $license(keys %ruletable) {
0703             if (!defined($ruletable{$license}->{$author})) {
0704                 push(@{$blacklist{$license}->{$author}}, $rev);
0705             }
0706             else {
0707                 push(@{$whitelist{$license}->{$author}}, $rev);
0708             }
0709 
0710         }
0711     }
0712 }
0713 close(IN);
0714 
0715 my %loc_author = ();
0716 
0717 if (-f $file) {
0718     if ($svn) {
0719         open(IN, "-|") || exec 'svn', 'ann', '-x', '-w', $file;
0720         while(<IN>) {
0721             my ($author) = (split)[1];
0722             $loc_author{$author}++;
0723         }
0724         close(IN);
0725     } else {
0726         open(IN, "-|") || exec 'git', 'blame', '-f', '-w', '-e', $file;
0727         while(<IN>) {
0728             # The format is:
0729             # b061712b kdecore/klockfile.cpp      (<faure@kde.org>   [...]
0730             if (m/^(\S+) (\S+) +\(<([^>]+)>/) {
0731                 my ($author) = $3;
0732                 next if skipCommitByAuthor($author);
0733                 $author = resolveEmail($author);
0734                 $loc_author{$author}++;
0735             } else {
0736                 print STDERR "Parse error on git blame output: $_";
0737             }
0738         }
0739         close(IN);
0740     }
0741 }
0742 
0743 if (%unknown_authors) {
0744     print "The following emails do not appear in the accounts file:\n\n";
0745     foreach my $who(keys %unknown_authors) {
0746         print "$who\n";
0747     }
0748     print "\n";
0749 }
0750 
0751 if (defined (keys %blacklist)) {
0752     print "Need permission for licensing:\n\n";
0753 
0754     my %stat;
0755 
0756     foreach my $license(keys %blacklist) {
0757         print "- $license: ". join(' ', (keys %{$blacklist{$license}})) . "\n";
0758         foreach my $who(keys %{$blacklist{$license}}) {
0759             next if not defined $loc_author{$who};
0760             $stat{$license} += scalar(@{$blacklist{$license}->{$who}});
0761             printf "%9s (%4d LOC): %s \n", $who, $loc_author{$who} || 0, join(",", @{$blacklist{$license}->{$who}});
0762         }
0763         print "\n";
0764     }
0765 
0766     print "\n";
0767     print "Summary:\n";
0768 
0769     foreach my $license(sort { $stat{$a} <=> $stat{$b} } keys %stat) {
0770         printf "%5d commits preventing relicensing to %s\n", $stat{$license}, $license
0771     }
0772 }
0773 
0774 my @allowed_list = ();
0775 
0776 if (defined (keys %whitelist)) {
0777     foreach my $license(keys %whitelist) {
0778         next if defined($blacklist{$license});
0779         push(@allowed_list, $license);
0780     }
0781 }
0782 
0783 if ($#allowed_list >= 0) {
0784     print "\nRelicensing allowed: ". join(' ', @allowed_list) . "\n";
0785 }
0786 
0787 print "\nDo not forget to check copyright headers and for patches committed in the name of others!\n";