diff options
Diffstat (limited to 'scripts/maint/findMergedChanges.pl')
-rwxr-xr-x | scripts/maint/findMergedChanges.pl | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/scripts/maint/findMergedChanges.pl b/scripts/maint/findMergedChanges.pl new file mode 100755 index 0000000000..d6c4105b74 --- /dev/null +++ b/scripts/maint/findMergedChanges.pl @@ -0,0 +1,73 @@ +#!/usr/bin/perl + +use warnings; +use strict; + +sub nChanges { + my ($branches, $fname) = @_; + local *F; + # requires perl 5.8. Avoids shell issues if we ever get a changes + # file named by the parents of Little Johnny Tables. + open F, "-|", "git", "log", "--no-merges", "--pretty=format:%H", $branches, "--", $fname + or die "$!"; + my @changes = <F>; + return scalar @changes +} + +my $look_for_type = "merged"; + +if (! @ARGV) { + print <<EOF +Usage: + findMergedChanges.pl [--merged/--unmerged/--weird/--list] [--branch=<branchname] [--head=<branchname>] changes/* + +A change is "merged" if it has ever been merged to release-0.2.4 and it has had +no subsequent changes in master. + +A change is "unmerged" if it has never been merged to release-0.2.4 and it +has had changes in master. + +A change is "weird" if it has been merged to release-0.2.4 and it *has* had +subsequent changes in master. + +Suggested application: + findMergedChanges.pl --merged changes/* | xargs -n 1 git rm + +EOF +} + +my $target_branch = "origin/release-0.2.4"; +my $head = "origin/master"; + +while (@ARGV and $ARGV[0] =~ /^--/) { + my $flag = shift @ARGV; + if ($flag =~ /^--(weird|merged|unmerged|list)/) { + $look_for_type = $1; + } elsif ($flag =~ /^--branch=(\S+)/) { + $target_branch = $1; + } elsif ($flag =~ /^--head=(\S+)/) { + $head = $1; + } else { + die "Unrecognized flag $flag"; + } +} + +for my $changefile (@ARGV) { + my $n_merged = nChanges($target_branch, $changefile); + my $n_postmerged = nChanges("${target_branch}..${head}", $changefile); + my $type; + + if ($n_merged != 0 and $n_postmerged == 0) { + $type = "merged"; + } elsif ($n_merged == 0 and $n_postmerged != 0) { + $type = "unmerged"; + } else { + $type = "weird"; + } + + if ($type eq $look_for_type) { + print "$changefile\n"; + } elsif ($look_for_type eq 'list') { + printf "% 8s: %s\n", $type, $changefile; + } +} |