File indexing completed on 2024-04-14 05:35:12

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