~vcs-imports/rsync/master

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# Do some git-status checking for the current dir and (optionally)
# the patches dir.

sub check_git_state
{
    my($master_branch, $fatal_unless_clean, $check_patches_dir) = @_;

    my($cur_branch) = check_git_status($fatal_unless_clean);
    (my $branch = $cur_branch) =~ s{^patch/([^/]+)/[^/]+$}{$1}; # change patch/BRANCH/PATCH_NAME into BRANCH
    if ($branch ne $master_branch) {
	print "The checkout is not on the $master_branch branch.\n";
	exit 1 if $master_branch ne 'master';
	print "Do you want me to continue with --branch=$branch? [n] ";
	$_ = <STDIN>;
	exit 1 unless /^y/i;
	$_[0] = $master_branch = $branch; # Updates caller's $master_branch too.
    }

    if ($check_patches_dir && -d 'patches/.git') {
	($branch) = check_git_status($fatal_unless_clean, 'patches');
	if ($branch ne $master_branch) {
	    print "The *patches* checkout is on branch $branch, not branch $master_branch.\n";
	    print "Do you want to change it to branch $master_branch? [n] ";
	    $_ = <STDIN>;
	    exit 1 unless /^y/i;
	    system "cd patches && git checkout '$master_branch'";
	}
    }

    return $cur_branch;
}

sub check_git_status
{
    my($fatal_unless_clean, $subdir) = @_;
    $subdir = '.' unless defined $subdir;
    my $status = `cd '$subdir' && git status`;
    my $is_clean = $status =~ /\nnothing to commit.+working directory clean/;
    my($cur_branch) = $status =~ /^(?:# )?On branch (.+)\n/;
    if ($fatal_unless_clean && !$is_clean) {
	if ($subdir eq '.') {
	    $subdir = '';
	} else {
	    $subdir = " *$subdir*";
	}
	die "The$subdir checkout is not clean:\n", $status;
    }
    ($cur_branch, $is_clean, $status);
}

1;