#!/usr/bin/perl # Catch all in-source GPL2/3 license declarations and convert # them to AGPL. # # You expected this to be using diff & patch? Well, the source # files have all sorts of different commenting and indentation # styles, not speaking of typos and failed uses of search and # replace, that an attempt in using the patch(1) tool would fail # miserably. This script instead is based on my rgrep from 1998. # Keeping it here as it may be useful to other projects under- # going the same pains. It is forbidden to use this script to # convert AGPL code back to less strict licensing. Haha, just # kidding. # # -symlynX use File::Find; $|=1; # Recurse into current or given directories find(\&wanted, $#ARGV >= 0 ? @ARGV : '.'); print STDERR "\n"; exit; sub wanted { my $name = $File::Find::name; ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime) = lstat; return $File::Find::prune = 1 if /^(CVS|\.git|\.svn)$/; # Nicer if you 'make distclean' first return if /\.(o|pdf)$/i; return if -d _ or -l _; return if /afferify/; # Don't apply this to itself ;) # No.. i didn't do it.. just being careful ;) ;) # return unless -T _; # We don't have binaries in the repo, do we? # We need the default variable '$_' for more important duties. my $f = $_; if (sysopen(I, $f, O_RDONLY)) { $_ = &slurp(*I); close I; # Debugging: What's inside the file we just read? # print STDERR '> ', $_; if (0) { # This code did the initial conversion. We ifdef it out. # Good idea to have the text start with "GNUnet" rather than "This program" if ( s#GNUnet is free software; you can redistribute it and/or modify it under the#GNUnet is free software: you can redistribute it and/or modify it# ) { # Whoever had the idea of reformatting the GPL license text... print STDERR "\nTrying wide style on $name\t"; # Most important thing to know in order to be able # to read perl code: if regexps appear without any # context, it means they are applied to the default # variable being '$_'. return unless s#terms of the GNU General Public License as published by the Free Software#under the terms of the GNU Affero General Public License as published#; return unless s#^(\W*\s+)Foundation; either version \d, or \(at your option\) any later version\.#\1by the Free Software Foundation, either version 3 of the License,\n\1or (at your option) any later version.#m; return unless s#GNUnet is distributed in the hope that it will be useful, but WITHOUT ANY#GNUnet is distributed in the hope that it will be useful, but#; return unless s#WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR#WITHOUT ANY WARRANTY; without even the implied warranty of#; return unless s#^(\W*\s+)A PARTICULAR PURPOSE. See the GNU General Public License for more details.#\1MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n\1Affero General Public License for more details.#m; return unless s#^\W*\n\W*\s+You should have received a copy of the GNU General Public License along with\n\W*\s+GNUnet. see the file COPYING\. If not, .* see\s*\W*\s+\n##m; } else { # If this string is not in the file, leave it alone. return unless s#GNUnet is free software; you can redistribute it and/or modify#GNUnet is free software: you can redistribute it and/or modify it#; print STDERR "\nTrying regular style on $name\t"; # Patterns are designed to also match some typos and substitutions. return unless s#it under the terms of the GNU General Public Lice\w+ as published#under the terms of the GNU Affero General Public License as published#; return unless s#by the Free Software Foundation; either version \d, or \(at your#by the Free Software Foundation, either version 3 of the License,#; return unless s#option\) any later version\.#or (at your option) any later version.#; return unless s#General Public Lice\w+ for more details\.#Affero General Public License for more details.#; return unless s#^\W*\n\W*\s+You should have received a copy of the GNU General Public Lice\w+\n\W*\s+along with GNUnet. see the file COPYING\. If not, write to the\n\W*\s+Free Software Foundation, Inc\., (51 Franklin Street, Fifth Floor|59 Tem ?ple Place - Suite 330),\n\W*\s+Boston, MA 0211\d-130\d, USA\.\n##m; } print STDERR "OK"; } else { # This is the code in actual & current use: return unless m#GNUnet is free software: you can redistribute it and/or modify it#; print STDERR "\nTrying $name\t"; # There was a mistake in the replacement text! return unless s#under the terms of the GNU General Public License as published#under the terms of the GNU Affero General Public License as published#; # Don't apply this one twice! # return unless s#(\n\W*)(\s+)(Affero General Public License for more details\.)#\1\2\3\1\1\2You should have received a copy of the GNU Affero General Public License\1\2along with this program. If not, see .#; print STDERR "FIXED"; } # We directly overwrite the original file in the # assumption that we're in a healthy revertible git. open(O, '>', $f) or die "Cannot overwrite $f"; # Imagine, I could have left out $_ here... ;) print O $_; close O; } else { die "Cannot access $name"; } } # Reads a file from a stream into a variable all at once: sub slurp { # Perl sure gets clunky here local(*IN) = @_; local($save) = $/; undef $/; local($data) = ; $/ = $save; return $data; }