X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=topbloke.git;a=blobdiff_plain;f=Topbloke.pm;h=b1303e17707506748a1c3b171c207f8c097e6667;hp=f1c06154fc41dd1237249fc51c5eee107b68daba;hb=c0f7fab5983a34c10790e39e7f48b546ca4011f7;hpb=98c96c9695b93d1ed7cf2ea81d1851364faad0ba diff --git a/Topbloke.pm b/Topbloke.pm index f1c0615..b1303e1 100644 --- a/Topbloke.pm +++ b/Topbloke.pm @@ -14,8 +14,13 @@ BEGIN { $VERSION = 1.00; @ISA = qw(Exporter); - @EXPORT = qw(parse_branch_spec current_tb_branch run_git_1line - setup_config check_no_unwanted_metadata); + @EXPORT = qw(debug + run_git run_git_1line run_git_check_nooutput + run_git_test_anyoutput + git_config git_dir chdir_toplevel + current_branch parse_branch_spec + setup_config check_no_unwanted_metadata + wf_start wf wf_abort wf_done wf_contents); %EXPORT_TAGS = ( ); @EXPORT_OK = qw(); } @@ -103,7 +108,15 @@ sub git_dir () { return $git_dir; } -sub current_tb_branch () { +sub chdir_toplevel () { + my $toplevel; + run_git(sub { $toplevel = $_; }, + qw(rev-parse --show-toplevel)); + die "not in working tree?\n" unless defined $toplevel; + chdir $toplevel or die "chdir toplevel $toplevel: $!\n"; +} + +sub current_branch () { open R, git_dir().'/HEAD' or die "open HEAD $!"; my $ref = ; defined $ref or die $!; close R; @@ -176,7 +189,7 @@ sub parse_branch_spec ($) { } } if (defined $rel_levels) { - my $branch = current_tb_branch(); + my $branch = current_branch(); if (!defined $branch->{Nick}) { die "relative branch spec \`$orig',". " but current branch not a topbloke branch\n"; @@ -196,9 +209,10 @@ sub setup_config () { foreach my $iteration (qw(0 1)) { foreach my $file (@files) { my $cfgname = "merge.topbloke-$file"; - my $current_estatus; - my $current = run_git_1line(\$current_estatus, - qw(config), "$cfgname.driver"); + my ($current, $current_estatus); + run_git(\$current_estatus, + sub { $current = $_; }, + qw(config), "$cfgname.driver"); $current = "## failed $current_estatus" if $current_estatus; next if $current =~ m/^topbloke-merge-driver --v$version /o; die "$file $current ?" if $iteration; @@ -250,4 +264,37 @@ sub check_no_unwanted_metadata ($) { qw(.topbloke)); } +sub wf_start ($) { + my ($path) = @_; + my $fh = new IO::File "$path.tmp", '>' or die "create $path.tmp: $!\n"; + return [ $fh, $path ]; +} + +sub wf ($$) { + my ($wf, $data) = @_; + my ($fh, $path) = @$wf; + print $fh $data or die "write $path.tmp: $!\n"; +} + +sub wf_abort ($) { + my ($wf) = @_; + my ($fh, $path) = @$wf; + close $fh; + unlink "$path.tmp" or die "remove $path.tmp: $!\n"; +} + +sub wf_done ($) { + my ($wf) = @_; + my ($fh, $path) = @$wf; + close $fh or die "finish writing $path.tmp: $!\n"; + rename "$path.tmp", $path or die "install new $path: $!\n"; +} + +sub wf_contents ($$) { + my ($path,$contents) = @_; + my $wf = wf_start($path); + wf($wf, $contents); + wf_done($wf); +} + 1;