Package: devscripts
Version: 2.10.25
Followup-For: Bug #472199

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA224


Dear devscripts developers,

I'm not really a perl hacker but I did a try on adding this feature to
licensecheck myself. It is *NOT* ready and does *NOT* do what it should.
It just adds a possible way to output license information as requested
by the copyright proposal.

Well, I tried to comment on every sensefull line I've added so that you
can clearly understand what I did. Furthermore I tried to not touch
anything you wrote so I don't think that I broke anything.
Although I added an option "createfile" my patch does not create a new
copyright file. It just prints whatever could be put into such a file. I
guess, doing the file handling is not the most difficult part of the
job. :)

I'd like to hear your comments on my patch. If you feel it is not worth
working on it just tell me. I can stop everytime.

Cheers,
Hauke

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)

iE8DBQFIDJ+yGOp6XeD8cQ0RC09JAN9W/yU7VmN9KcSY66qJF+Qk4T0dYHASZxFy
7L31AN48ojn/OH0c2wgs7yncYLqReowZckrRiGjiqiYw
=aNPf
-----END PGP SIGNATURE-----
--- /usr/bin/licensecheck       2008-04-09 16:11:23.000000000 +0200
+++ licensecheck        2008-04-21 15:55:22.000000000 +0200
@@ -78,6 +78,10 @@
 
 Also display copyright text found within the file
 
+=item B<-f> B<--createfile>
+
+Create a new copyright file which is machine interpretable
+
 =back
 
 =head1 CONFIGURATION VARIABLES
@@ -160,6 +164,10 @@
 my ($opt_help, $opt_version);
 my $def_lines = 60;
 
+my $opt_createfile;
+my $mr_licence;
+my @mr_files;
+
 # Read configuration files and then command line
 # This is boilerplate
 
@@ -214,6 +222,7 @@
           "copyright" => \$opt_copyright,
           "noconf" => \$opt_noconf,
           "no-conf" => \$opt_noconf,
+          "createfile|f" => \$opt_createfile,
           )
     or die "Usage: $progname [options] filelist\nRun $progname --help for more 
details\n";
 
@@ -232,6 +241,7 @@
 $opt_lines = $def_lines if not defined $opt_lines;
 
 my @files = ();
+my %mr_files = ();
 my @find_args = ();
 my $files_count = @ARGV;
 
@@ -257,6 +267,8 @@
     }
 }
 
+my @all_licenses;
+
 while (@files) {
     my $file = shift @files;
     my $content = '';
@@ -295,10 +307,89 @@
     $content =~ s#//##g;
     $content =~ tr/ //s;
 
-    print "$file: " . parselicense($content) . "\n";
-    print "  [Copyright: " . $copyright . "]\n"
-      if $copyright and $opt_copyright;
-    print "\n" if $opt_copyright;
+    # do machine readable stuff if $opt_createfile
+    if ( $opt_createfile ) {
+        # copyright output like:
+       # Copyright: year author
+       #       year author
+        my $mr_copyright = join("\n\t", values %copyrights);
+       # if opt_createfile we get an array here
+       my @mr_licenses = parselicense($content);
+       # and join it to a string with an "or" statement since this is probably
+       # to most sensefull relation between two licenses of one file
+       my $mr_licensestring = join(" | ", @mr_licenses);
+       # create an array with all licenses used in every checked file
+       # we need this to output a License statement for each license at the 
end of
+       # the copyright file
+       push @all_licenses, @mr_licenses;
+       # have an array for each file with name, copyright and license
+       my @mr_file = ($file, $mr_copyright, $mr_licensestring);
+       # and push every file array to a global files array
+       push @mr_files, [ @mr_file ];
+    } else {
+       print "$file: " . parselicense($content) . "\n";
+        print "  [Copyright: " . $copyright . "]\n"
+          if $copyright and $opt_copyright;
+        print "\n" if $opt_copyright;
+    }
+}
+
+if ( $opt_createfile ) {
+       # what we have now:
+       # @mr_files =
+       # ARRAY (
+       #     [0] => ARRAY (
+       #         [0] => string filename
+       #         [1] => string copyright
+       #         [2] => string licenses (seperated by |)
+       #     )
+       # )
+    # create an hash:
+    # %new_hash = 
+    # HASH (
+    #     [ copyright_and_license_string ] => 
list_of_files_matching_this_copyright_and_license_(comma_sparated)
+    # )
+    my %new_hash;
+    for ( my $i=0; $i<=$#mr_files; $i++ ) {
+        my @filedata = @{$mr_files[$i]};
+       # string copyright_and_license:
+       #   Copyright: year author (from above!)
+       #   License: license1 | license2 (from above!)
+        my $mr_candl = "Copyright: " . $filedata[1] . "\nLicense: " . 
$filedata[2];
+        if ( in_array ( $mr_candl, keys %new_hash ) ) {
+            $new_hash{$mr_candl} = $new_hash{$mr_candl} . ", " . $filedata[0];
+        } else {
+            $new_hash{$mr_candl} = $filedata[0];
+        }
+    }
+    # and then print the hash to output
+    #   Files: comma separated list
+    #   Copyright: ...
+    #   License: ...
+    foreach my $key ( keys %new_hash ) {
+        print "Files: " . $new_hash{$key} . "\n";
+       print $key . "\n\n";
+    }
+    # output a License: line for each used license
+    my @uniq_licenses = keys %{{ map { $_ => 1 } @all_licenses }};
+    foreach my $single_license ( @uniq_licenses ) {
+        # unless license is not known
+        if ( $single_license ne "UNKNOWN LICENSE" ) {
+            # we should ship some standard texts for GPL, LGPL and stuff...
+            print "License: $single_license\nType short form of license text 
here!\n\n"
+        }
+    }
+}
+
+# small function (same as in_array in PHP ;-))
+sub in_array {
+    my $val = shift;
+    for my $elem ( @_ ) {
+        if ( $val eq $elem ) {
+            return 1;
+        }
+    }
+    return 0;
 }
 
 sub help {
@@ -321,6 +412,7 @@
                             regular expression should be ignored when
                             checking files
                             (Default: '$default_ignore_regex')
+   --createfile, -f       Create a machine interpretable copyright file
 
 Default settings modified by devscripts configuration files:
 $modified_conf_msg
@@ -347,12 +439,18 @@
     my $extrainfo = "";
     my $license = "";
 
+    # I added new vars for machine readable output to not break anything you 
wrote.
+    my @mr_licence;
+    my $mr_licenceinfo = "";
+
     if ($licensetext =~ /version ([^ ]+) (?:\(?only\)?.? )?(?:of the GNU 
General Public License )?as published by the Free Software Foundation/i or
        $licensetext =~ /GNU General Public License as published by the Free 
Software Foundation; version ([^ ]+) /i) {
 
        $gplver = " (v$1)";
+       $mr_licenceinfo = "-$1";
     } elsif ($licensetext =~ /either version ([^ ]+) of the License, or \(at 
your option\) any later version/) {
        $gplver = " (v$1 or later)";
+       $mr_licenceinfo = "-$1+";
     }
 
     if ($licensetext =~ /(?:675 Mass Ave|59 Temple Place|51 Franklin 
Steet|02139|02111-1307)/i) {
@@ -365,78 +463,99 @@
 
     if ($licensetext =~ /(All changes made in this file will be lost|DO NOT 
(EDIT|delete this file)|Generated by)/i) {
        $license = "GENERATED FILE";
+       push(@mr_licence, "UNKNOWN LICENSE");
     }
 
     if ($licensetext =~ /is free software. you can redistribute it and\/or 
modify it under the terms of the (GNU (Library|Lesser) General Public 
License|LGPL)/i) {
        $license = "LGPL$gplver$extrainfo $license";
+       push(@mr_licence, "LGPL$mr_licenceinfo");
     }
 
     if ($licensetext =~ /is free software.? you can redistribute it and\/or 
modify it under the terms of (?:version [^ ]+ (?:\(?only\)? )?of )?the GNU 
General Public License/i) {
        $license = "GPL$gplver$extrainfo $license";
+       push(@mr_licence, "GPL$mr_licenceinfo");
     }
 
     if ($licensetext =~ /is distributed.*terms.*GPL/) {
        $license = "GPL (unversioned/unknown version) $license";
+       push(@mr_licence, "GPL");
     }
 
     if ($licensetext =~ /This file is part of the .*Qt GUI Toolkit. This file 
may be distributed under the terms of the Q Public License as defined/) {
        $license = "QPL (part of Qt) $license";
+       push(@mr_licence, "QPL");
     } elsif ($licensetext =~ /may be distributed under the terms of the Q 
Public License as defined/) {
        $license = "QPL $license";
+       push(@mr_licence, "QPL");
     }
 
     if ($licensetext =~ 
/http:\/\/opensource\.org\/licenses\/mit-license\.php/) {
        $license = "MIT/X11 (BSD like) $license";
+       push(@mr_licence, "MIT");
     } elsif ($licensetext =~ /Permission is hereby granted, free of charge, to 
any person obtaining a copy of this software and associated documentation files 
\(the Software\), to deal in the Software/) {
        $license = "MIT/X11 (BSD like) $license";
+       push(@mr_licence, "MIT");
     }
 
     if ($licensetext  =~ /Permission to use, copy, modify, and(\/or)? 
distribute this software for any purpose with or without fee is hereby granted, 
provided.*copyright notice.*permission notice.*all copies/) {
        $license = "ISC $license";
+       push(@mr_licence, "other");
     }
 
     if ($licensetext =~ /THIS SOFTWARE IS PROVIDED .*AS IS AND ANY EXPRESS OR 
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
MERCHANTABILITY/) {
        if ($licensetext =~ /All advertising materials mentioning features or 
use of this software must display the following acknowledge?ment.*This product 
includes software developed by/i) {
            $license = "BSD (4 clause) $license";
+           push(@mr_licence, "BSD-4");
        } elsif ($licensetext =~ /(The name of .*? may not|Neither the name of 
.*? nor the names of its contributors may) be used to endorse or promote 
products derived from this software/i) {
            $license = "BSD (3 clause) $license";
+           push(@mr_licence, "BSD-3");
        } elsif ($licensetext =~ /Redistributions of source code must retain 
the above copyright notice/i) {
            $license = "BSD (2 clause) $license";
+           push(@mr_licence, "BSD-2");
        } else {
            $license = "BSD $license";
+           push(@mr_licence, "BSD");
        }
     }
 
     if ($licensetext =~ /Mozilla Public License Version ([^ ]+)/) {
        $license = "MPL (v$1) $license";
+       push(@mr_licence, "MPL-$1");
     }
 
     if ($licensetext =~ /Released under the terms of the Artistic License ([^ 
]+)/) {
        $license = "Artistic (v$1) $license";
+       push(@mr_licence, "Artistic-$1");
     }
 
     if ($licensetext =~ /This program is free software; you can redistribute 
it and\/or modify it under the same terms as Perl itself/) {
        $license = "Perl $license";
+       push(@mr_licence, "Perl-$1");
     }
 
     if ($licensetext =~ /under the Apache License, Version ([^ ]+) \(the 
License\)/) {
        $license = "Apache (v$1) $license";
+       push(@mr_licence, "Apache-$1");
     }
 
     if ($licensetext =~ /This source file is subject to version ([^ ]+) of the 
PHP license/) {
        $license = "PHP (v$1) $license";
+       push(@mr_licence, "PHP-$1");
     }
 
     if ($licensetext =~ /is in the public domain/i) {
        $license = "Public domain";
+       push(@mr_licence, "PD");
     }
 
     $license = "UNKNOWN" if (!length($license));
+    @mr_licence = ("UNKNOWN LICENSE") if ( @mr_licence == 0 );
 
     if ($licensetext !~ /copyright/i) {
        $license = "*No copyright* $license";
     }
 
+    return @mr_licence if $opt_createfile;
     return $license;
 }
 

Reply via email to