git-svn-tutorial: gsquash

File gsquash, 1.4 KB (added by packy, 5 years ago)

script to automatically perform an interactive rebase on commits not dcommited to SVN

Line 
1#!/usr/bin/perl
2
3use Getopt::Long;
4
5my $commits = 20;
6my $fake    = 0;
7my $verbose = 1;
8my $help    = 0;
9
10GetOptions "commits=i"  => \$commits,
11           "fake-mode!" => \$fake,
12           "help"       => \$help,
13           "verbose"    => \$verbose;
14
15if ($help) {
16    my($program) = +(split m{/}, $0)[-1];
17    print <<HELP;
18Usage: $program [-verbose] [-fake] <target_branch> [-commits N]
19
20Switches:
21  -verbose     show the git commands and their output
22  -fake        show the git commands but do not run them
23  -commits N   search the past N commits for things not dcommitted to svn
24HELP
25    exit;
26}
27
28
29sub run($) {
30    my($cmd) = @_;
31
32    print "\$ $cmd\n" if $verbose || $fake;
33
34    return if ($fake);
35
36    if ($verbose) {
37        print `$cmd`;
38    }
39    else {
40        # don't echo the results to the screen
41        system $cmd;
42    }
43}
44
45sub get_head {
46    my $back = shift || 1;
47
48    # make it a negative number
49    if ($back > 0) {
50        $back *= -1;
51    }
52
53    my $sep = '=-=SPLIT=-=';
54    my $data = `git log $back --pretty=format:"commit %h%n%s%n%n%b$sep"`;
55    my @commits = split /\n$sep\n?/, $data;
56
57    my $head = 0;
58    foreach my $commit (@commits) {
59        my ($sha1)   = $commit =~ /^commit (\S+)/s;
60        my ($svn_id) = $commit =~ /git-svn-id: \S+\@(\d+)\s+/;
61
62        next if ($svn_id);
63        $head++;
64    }
65
66    return "HEAD~".$head;
67}
68
69#
70# main program
71#
72
73my $HEAD = get_head($commits);
74
75run "git rebase -i $HEAD";