#!@-PERL-@ -w # -*- perl -*- # # This perl script is used to make a patch for your GnuCash # development work. All patches should be submitted to the # mailing list gnucash-patches@gnucash.org. For more info # consult the README. # # This script requires the programs 'makepatch', 'gzip', # 'diff', and 'uuencode'. # # Author: Dave Peticolas use strict; use File::Basename; ########################################################### # This section must be configured for your own setup. # ########################################################### # The directory with the original gnucash sources my $old = undef; chomp(my $cwd = `pwd`); my ($new, $gnc_home) = fileparse($cwd); ########################################################### # This section should not need to be modified. # ########################################################### # Allow the user to override the defaults with evnt vars. if($ENV{'GNC_MAKEPATCH_OLD_DIR'}) { $old = $ENV{'GNC_MAKEPATCH_OLD_DIR'}; } if($ENV{'GNC_MAKEPATCH_NEW_DIR'}) { $new = $ENV{'GNC_MAKEPATCH_NEW_DIR'}; } if($ENV{'GNC_MAKEPATCH_HOME_DIR'}) { $gnc_home = $ENV{'GNC_MAKEPATCH_HOME_DIR'}; } # Switch to the home directory print "Changing directory to $gnc_home\n"; chdir $gnc_home or die "Can't cd!\n"; if (not defined($old)) { if (not -f "$new/CVS/Root") { print "Source not checked out of CVS and no \$old set. Quitting...\n"; exit(1); } if (not -d "tmp") { mkdir "tmp"; } chdir "tmp"; system("cvs -d `cat ../$new/CVS/Root` co gnucash"); chdir ".."; $old = "tmp/gnucash"; } chdir $gnc_home . "/" . $new or die "Can't cd!\n"; # Start out with our basic makepatch arguments my @args = ('-verbose', '-diff', 'diff -u', '-exclude-vc'); # Add in the exclude patterns from the __DATA__ section push_exclusions(\@args); sub push_exclusions { my $args = shift; foreach my $pat () { chomp($pat); push(@{$args}, '-exclude', $pat) if $pat; } my @cvsignores = `find . -name '.cvsignore'`; foreach my $one_ignore (@cvsignores) { my ($name, $path) = fileparse($one_ignore); open (IG, $one_ignore); foreach my $fl () { chomp $fl; $path =~ s/^\.\///; push(@{$args}, '-exclude', $path . $fl) if $fl; } close (IG); } } # Add the from and to directories for makepatch push(@args, $old, $new); print "Arguments are: " . join("; ", @args) . "\n"; chdir $gnc_home or die "Can't cd!\n"; # Erase the old files #unlink('gnc.diff', 'gnucash.diff.gz', 'gnucash.diff.gz.uue'); if (not -d "diffs") { mkdir "diffs"; } my $date = `date '+%s'`; chomp($date); my $who = `whoami`; chomp($who); my $outfilename = "gnucash-$date-$who.diff"; # Invoke makepatch with standard out redirected to 'gnucash.diff' open(OLDOUT, ">&STDOUT"); open(STDOUT, "> diffs/$outfilename") || die "Can't redirect stdout"; system('makepatch', @args); close(STDOUT); open(STDOUT, ">&OLDOUT"); print "makepatch done\n"; # Compress the patch if (-f "diffs/$outfilename") { system("gzip", "-9vf", "diffs/$outfilename"); } # UU encode the compressed patch # 'gnucash.diff.gz.uue' is the file you send. if (-f "diffs/$outfilename.gz") { system("uuencode diffs/$outfilename.gz $outfilename.gz > diffs/$outfilename.gz.uue"); } print "diffs/$outfilename.gz.uue\n"; exit(0); __DATA__ #*# *.a *.bak *.bin *.diff *.diffs *.gmo *.lo *.log *.mo *.moc *.o *.orig *.patch *.rej *.tar.gz *.wrap *.xac.*.xac *~ .#*