| #!/usr/bin/perl | |
| # | |
| # genpatch - A utility that generates patches for submission to | |
| # wine-patches@winehq.com | |
| # | |
| # By Steven Elliott <elliotsl@mindspring.com> | |
| # | |
| # This program is subject to the same license as Wine (www.winehq.com). | |
| use Getopt::Std; | |
| use File::Basename; | |
| use POSIX qw(strftime); | |
| use strict; | |
| my $gen_date; # date the patch was generated | |
| my %options; # command line options | |
| my @new_files; # new files as an array | |
| my $new_file; # new file being considered | |
| my $patches_dir; # location of the patch file | |
| # Default the patch name to the UTC time. Use a more descriptive date for the | |
| # patch generation date. | |
| $options{n} = strftime "%Y%m%d%H%M", gmtime; | |
| $gen_date = strftime "%Y/%m/%d %H:%M:%S UTC", gmtime; | |
| unless(getopts("n:c:f:a:", \%options)) | |
| { | |
| print STDERR "Usage: $0 [-n patch_name] [-c change_log] [-f patch_file] " . | |
| "[-a new_files]\n"; | |
| exit 1; | |
| } | |
| $options{f} = "patches/$options{n}.diff" unless(exists $options{f}); | |
| $patches_dir = dirname $options{f}; | |
| @new_files = split ' ', $options{a}; | |
| if(-d $patches_dir) | |
| { | |
| if(-e $options{f}) | |
| { | |
| print STDERR "$options{f} already exists. Aborting.\n"; | |
| exit 1; | |
| } | |
| } | |
| else | |
| { | |
| mkdir $patches_dir, (0777 & ~umask) or | |
| die "Unable to mkdir $patches_dir: $!"; | |
| } | |
| print "Generating $options{f}.\n"; | |
| open OPT_F, ">$options{f}" or die "Unable to open $options{f} for write: $!"; | |
| print OPT_F <<EOF; | |
| Name: $options{n} | |
| ChangeLog: $options{c} | |
| GenDate: $gen_date | |
| NewFiles: $options{a} | |
| EOF | |
| foreach $new_file (@new_files) | |
| { | |
| print "Adding $new_file as a new file.\n"; | |
| open DIFF_IN, "diff -u /dev/null $new_file|" or die "Unable to " . | |
| "invoke diff: $!"; | |
| print OPT_F <DIFF_IN>; | |
| close DIFF_IN; | |
| } | |
| print "Invoking cvs diff.\n"; | |
| open CVS_IN, "cvs diff -u|" or die "Unable to invoke cvs: $!"; | |
| print OPT_F <CVS_IN>; | |
| close CVS_IN; |