#!/usr/bin/perl -w # This script is used to turn one or more of the "patch/*" branches # into one or more diffs in the "patches" directory. Pass the option # --gen if you want generated files in the diffs. Pass the name of # one or more diffs if you want to just update a subset of all the # diffs. use strict; die "No 'patches' directory present in the current dir.\n" unless -d 'patches'; die "No '.git' directory present in the current dir.\n" unless -d '.git'; my @extra_files; open(IN, '<', 'Makefile.in') or die "Couldn't open Makefile.in: $!\n"; while () { if (s/^GENFILES=//) { while (s/\\$//) { $_ .= ; } @extra_files = split(' ', $_); last; } } close IN; my $incl_generated_files = shift if @ARGV && $ARGV[0] eq '--gen'; system "git-checkout master" and exit 1; if ($incl_generated_files) { die "'a' must not exist in the current directory.\n" if -e 'a'; die "'b' must not exist in the current directory.\n" if -e 'b'; system "make gen && rsync -a @extra_files a/" and exit 1; } my $last_touch = time; my(@patches, %local_patch); if (@ARGV) { foreach (@ARGV) { s{^(patches|patch|origin/patch)/} {}; s{\.diff$} {}; push(@patches, $_); } open(PIPE, '-|', 'git-branch', '-l') or die $!; } else { open(PIPE, '-|', 'git-branch', '-a') or die $!; } while () { if (m# origin/patch/(.*)#) { push(@patches, $1); } elsif (m# patch/(.*)#) { $local_patch{$1} = 1; } } close PIPE; my(%parent, %description); foreach my $patch (@patches) { my $branch = ($local_patch{$patch} ? '' : 'origin/') . "patch/$patch"; open(PIPE, '-|', 'git-diff', "master...$branch", '--', "PATCH.$patch") or die $!; while () { last if /^@@ /; } my $desc = ''; while () { next if /^-/; # huh?? s/^.//; if (m#patch -p1 ', "patches/$patch.diff") or die $!; print OUT $description{$patch}, "\n"; if (system("git-rebase -m $parent") != 0) { print qq|"git-rebase -m $parent" incomplete -- please fix.\n|; $ENV{PS1} = "[$parent] patch/$patch: "; system $ENV{SHELL} and exit 1; } if ($incl_generated_files) { system "make gen && rsync -a @extra_files b/" and exit 1; } $last_touch = time; open(PIPE, '-|', 'git-diff', $parent) or die $!; DIFF: while () { while (m{^diff --git a/PATCH}) { while () { last if m{^diff --git a/}; } last DIFF if !defined $_; } print OUT $_; } close PIPE; if ($incl_generated_files) { open(PIPE, '-|', 'diff', '-up', 'a', 'b') or die $!; while () { s/^((?:---|\+\+\+) [^\t]+)\t.*/$1/; print OUT $_; } close PIPE; } close OUT; }