| #!/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; |