Git fork
at reftables-rust 1780 lines 48 kB view raw
1=head1 NAME 2 3Git - Perl interface to the Git version control system 4 5=cut 6 7 8package Git; 9 10require v5.26; 11use strict; 12use warnings $ENV{GIT_PERL_FATAL_WARNINGS} ? qw(FATAL all) : (); 13 14BEGIN { 15 16our ($VERSION, @ISA, @EXPORT, @EXPORT_OK); 17 18# Totally unstable API. 19$VERSION = '0.01'; 20 21 22=head1 SYNOPSIS 23 24 use Git; 25 26 my $version = Git::command_oneline('version'); 27 28 git_cmd_try { Git::command_noisy('update-server-info') } 29 '%s failed w/ code %d'; 30 31 my $repo = Git->repository (Directory => '/srv/git/cogito.git'); 32 33 34 my @revs = $repo->command('rev-list', '--since=last monday', '--all'); 35 36 my ($fh, $c) = $repo->command_output_pipe('rev-list', '--since=last monday', '--all'); 37 my $lastrev = <$fh>; chomp $lastrev; 38 $repo->command_close_pipe($fh, $c); 39 40 my $lastrev = $repo->command_oneline( [ 'rev-list', '--all' ], 41 STDERR => 0 ); 42 43 my $sha1 = $repo->hash_and_insert_object('file.txt'); 44 my $tempfile = tempfile(); 45 my $size = $repo->cat_blob($sha1, $tempfile); 46 47=cut 48 49 50require Exporter; 51 52@ISA = qw(Exporter); 53 54@EXPORT = qw(git_cmd_try); 55 56# Methods which can be called as standalone functions as well: 57@EXPORT_OK = qw(command command_oneline command_noisy 58 command_output_pipe command_input_pipe command_close_pipe 59 command_bidi_pipe command_close_bidi_pipe 60 version exec_path html_path hash_object git_cmd_try 61 remote_refs prompt 62 get_tz_offset get_record 63 credential credential_read credential_write 64 temp_acquire temp_is_locked temp_release temp_reset temp_path 65 unquote_path); 66 67 68=head1 DESCRIPTION 69 70This module provides Perl scripts easy way to interface the Git version control 71system. The modules have an easy and well-tested way to call arbitrary Git 72commands; in the future, the interface will also provide specialized methods 73for doing easily operations which are not totally trivial to do over 74the generic command interface. 75 76While some commands can be executed outside of any context (e.g. 'version' 77or 'init'), most operations require a repository context, which in practice 78means getting an instance of the Git object using the repository() constructor. 79(In the future, we will also get a new_repository() constructor.) All commands 80called as methods of the object are then executed in the context of the 81repository. 82 83Part of the "repository state" is also information about path to the attached 84working copy (unless you work with a bare repository). You can also navigate 85inside of the working copy using the C<wc_chdir()> method. (Note that 86the repository object is self-contained and will not change working directory 87of your process.) 88 89TODO: In the future, we might also do 90 91 my $remoterepo = $repo->remote_repository (Name => 'cogito', Branch => 'master'); 92 $remoterepo ||= Git->remote_repository ('http://git.or.cz/cogito.git/'); 93 my @refs = $remoterepo->refs(); 94 95Currently, the module merely wraps calls to external Git tools. In the future, 96it will provide a much faster way to interact with Git by linking directly 97to libgit. This should be completely opaque to the user, though (performance 98increase notwithstanding). 99 100=cut 101 102 103sub carp { require Carp; goto &Carp::carp } 104sub croak { require Carp; goto &Carp::croak } 105use Git::LoadCPAN::Error qw(:try); 106} 107 108 109=head1 CONSTRUCTORS 110 111=over 4 112 113=item repository ( OPTIONS ) 114 115=item repository ( DIRECTORY ) 116 117=item repository () 118 119Construct a new repository object. 120C<OPTIONS> are passed in a hash like fashion, using key and value pairs. 121Possible options are: 122 123B<Repository> - Path to the Git repository. 124 125B<WorkingCopy> - Path to the associated working copy; not strictly required 126as many commands will happily crunch on a bare repository. 127 128B<WorkingSubdir> - Subdirectory in the working copy to work inside. 129Just left undefined if you do not want to limit the scope of operations. 130 131B<Directory> - Path to the Git working directory in its usual setup. 132The C<.git> directory is searched in the directory and all the parent 133directories; if found, C<WorkingCopy> is set to the directory containing 134it and C<Repository> to the C<.git> directory itself. If no C<.git> 135directory was found, the C<Directory> is assumed to be a bare repository, 136C<Repository> is set to point at it and C<WorkingCopy> is left undefined. 137If the C<$GIT_DIR> environment variable is set, things behave as expected 138as well. 139 140You should not use both C<Directory> and either of C<Repository> and 141C<WorkingCopy> - the results of that are undefined. 142 143Alternatively, a directory path may be passed as a single scalar argument 144to the constructor; it is equivalent to setting only the C<Directory> option 145field. 146 147Calling the constructor with no options whatsoever is equivalent to 148calling it with C<< Directory => '.' >>. In general, if you are building 149a standard porcelain command, simply doing C<< Git->repository() >> should 150do the right thing and setup the object to reflect exactly where the user 151is right now. 152 153=cut 154 155sub repository { 156 my $class = shift; 157 my @args = @_; 158 my %opts = (); 159 my $self; 160 161 if (defined $args[0]) { 162 if ($#args % 2 != 1) { 163 # Not a hash. 164 $#args == 0 or throw Error::Simple("bad usage"); 165 %opts = ( Directory => $args[0] ); 166 } else { 167 %opts = @args; 168 } 169 } 170 171 if (not defined $opts{Repository} and not defined $opts{WorkingCopy} 172 and not defined $opts{Directory}) { 173 $opts{Directory} = '.'; 174 } 175 176 if (defined $opts{Directory}) { 177 -d $opts{Directory} or throw Error::Simple("Directory not found: $opts{Directory} $!"); 178 179 my $search = Git->repository(WorkingCopy => $opts{Directory}); 180 181 # This rev-parse will throw an exception if we're not in a 182 # repository, which is what we want, but it's kind of noisy. 183 # Ideally we'd capture stderr and relay it, but doing so is 184 # awkward without depending on it fitting in a pipe buffer. So 185 # we just reproduce a plausible error message ourselves. 186 my $out; 187 try { 188 # Note that "--is-bare-repository" must come first, as 189 # --git-dir output could contain newlines. 190 $out = $search->command([qw(rev-parse --is-bare-repository --absolute-git-dir)], 191 STDERR => 0); 192 } catch Git::Error::Command with { 193 throw Error::Simple("fatal: not a git repository: $opts{Directory}"); 194 }; 195 196 chomp $out; 197 my ($bare, $dir) = split /\n/, $out, 2; 198 199 # We know this is an absolute path, because we used 200 # --absolute-git-dir above. 201 $opts{Repository} = $dir; 202 203 if ($bare ne 'true') { 204 require Cwd; 205 # If --git-dir went ok, this shouldn't die either. 206 my $prefix = $search->command_oneline('rev-parse', '--show-prefix'); 207 $dir = Cwd::abs_path($opts{Directory}) . '/'; 208 if ($prefix) { 209 if (substr($dir, -length($prefix)) ne $prefix) { 210 throw Error::Simple("rev-parse confused me - $dir does not have trailing $prefix"); 211 } 212 substr($dir, -length($prefix)) = ''; 213 } 214 $opts{WorkingCopy} = $dir; 215 $opts{WorkingSubdir} = $prefix; 216 217 } 218 219 delete $opts{Directory}; 220 } 221 222 $self = { opts => \%opts }; 223 bless $self, $class; 224} 225 226=back 227 228=head1 METHODS 229 230=over 4 231 232=item command ( COMMAND [, ARGUMENTS... ] ) 233 234=item command ( [ COMMAND, ARGUMENTS... ], { Opt => Val ... } ) 235 236Execute the given Git C<COMMAND> (specify it without the 'git-' 237prefix), optionally with the specified extra C<ARGUMENTS>. 238 239The second more elaborate form can be used if you want to further adjust 240the command execution. Currently, only one option is supported: 241 242B<STDERR> - How to deal with the command's error output. By default (C<undef>) 243it is delivered to the caller's C<STDERR>. A false value (0 or '') will cause 244it to be thrown away. If you want to process it, you can get it in a filehandle 245you specify, but you must be extremely careful; if the error output is not 246very short and you want to read it in the same process as where you called 247C<command()>, you are set up for a nice deadlock! 248 249The method can be called without any instance or on a specified Git repository 250(in that case the command will be run in the repository context). 251 252In scalar context, it returns all the command output in a single string 253(verbatim). 254 255In array context, it returns an array containing lines printed to the 256command's stdout (without trailing newlines). 257 258In both cases, the command's stdin and stderr are the same as the caller's. 259 260=cut 261 262sub command { 263 my ($fh, $ctx) = command_output_pipe(@_); 264 265 if (not defined wantarray) { 266 # Nothing to pepper the possible exception with. 267 _cmd_close($ctx, $fh); 268 269 } elsif (not wantarray) { 270 local $/; 271 my $text = <$fh>; 272 try { 273 _cmd_close($ctx, $fh); 274 } catch Git::Error::Command with { 275 # Pepper with the output: 276 my $E = shift; 277 $E->{'-outputref'} = \$text; 278 throw $E; 279 }; 280 return $text; 281 282 } else { 283 my @lines = <$fh>; 284 defined and chomp for @lines; 285 try { 286 _cmd_close($ctx, $fh); 287 } catch Git::Error::Command with { 288 my $E = shift; 289 $E->{'-outputref'} = \@lines; 290 throw $E; 291 }; 292 return @lines; 293 } 294} 295 296 297=item command_oneline ( COMMAND [, ARGUMENTS... ] ) 298 299=item command_oneline ( [ COMMAND, ARGUMENTS... ], { Opt => Val ... } ) 300 301Execute the given C<COMMAND> in the same way as command() 302does but always return a scalar string containing the first line 303of the command's standard output. 304 305=cut 306 307sub command_oneline { 308 my ($fh, $ctx) = command_output_pipe(@_); 309 310 my $line = <$fh>; 311 defined $line and chomp $line; 312 try { 313 _cmd_close($ctx, $fh); 314 } catch Git::Error::Command with { 315 # Pepper with the output: 316 my $E = shift; 317 $E->{'-outputref'} = \$line; 318 throw $E; 319 }; 320 return $line; 321} 322 323 324=item command_output_pipe ( COMMAND [, ARGUMENTS... ] ) 325 326=item command_output_pipe ( [ COMMAND, ARGUMENTS... ], { Opt => Val ... } ) 327 328Execute the given C<COMMAND> in the same way as command() 329does but return a pipe filehandle from which the command output can be 330read. 331 332The function can return C<($pipe, $ctx)> in array context. 333See C<command_close_pipe()> for details. 334 335=cut 336 337sub command_output_pipe { 338 _command_common_pipe('-|', @_); 339} 340 341 342=item command_input_pipe ( COMMAND [, ARGUMENTS... ] ) 343 344=item command_input_pipe ( [ COMMAND, ARGUMENTS... ], { Opt => Val ... } ) 345 346Execute the given C<COMMAND> in the same way as command_output_pipe() 347does but return an input pipe filehandle instead; the command output 348is not captured. 349 350The function can return C<($pipe, $ctx)> in array context. 351See C<command_close_pipe()> for details. 352 353=cut 354 355sub command_input_pipe { 356 _command_common_pipe('|-', @_); 357} 358 359 360=item command_close_pipe ( PIPE [, CTX ] ) 361 362Close the C<PIPE> as returned from C<command_*_pipe()>, checking 363whether the command finished successfully. The optional C<CTX> argument 364is required if you want to see the command name in the error message, 365and it is the second value returned by C<command_*_pipe()> when 366called in array context. The call idiom is: 367 368 my ($fh, $ctx) = $r->command_output_pipe('status'); 369 while (<$fh>) { ... } 370 $r->command_close_pipe($fh, $ctx); 371 372Note that you should not rely on whatever actually is in C<CTX>; 373currently it is simply the command name but in future the context might 374have more complicated structure. 375 376=cut 377 378sub command_close_pipe { 379 my ($self, $fh, $ctx) = _maybe_self(@_); 380 $ctx ||= '<unknown>'; 381 _cmd_close($ctx, $fh); 382} 383 384=item command_bidi_pipe ( COMMAND [, ARGUMENTS... ] ) 385 386Execute the given C<COMMAND> in the same way as command_output_pipe() 387does but return both an input pipe filehandle and an output pipe filehandle. 388 389The function will return C<($pid, $pipe_in, $pipe_out, $ctx)>. 390See C<command_close_bidi_pipe()> for details. 391 392=cut 393 394sub command_bidi_pipe { 395 my ($pid, $in, $out); 396 my ($self) = _maybe_self(@_); 397 local %ENV = %ENV; 398 my $cwd_save = undef; 399 if ($self) { 400 shift; 401 require Cwd; 402 $cwd_save = Cwd::getcwd(); 403 _setup_git_cmd_env($self); 404 } 405 require IPC::Open2; 406 $pid = IPC::Open2::open2($in, $out, 'git', @_); 407 chdir($cwd_save) if $cwd_save; 408 return ($pid, $in, $out, join(' ', @_)); 409} 410 411=item command_close_bidi_pipe ( PID, PIPE_IN, PIPE_OUT [, CTX] ) 412 413Close the C<PIPE_IN> and C<PIPE_OUT> as returned from C<command_bidi_pipe()>, 414checking whether the command finished successfully. The optional C<CTX> 415argument is required if you want to see the command name in the error message, 416and it is the fourth value returned by C<command_bidi_pipe()>. The call idiom 417is: 418 419 my ($pid, $in, $out, $ctx) = $r->command_bidi_pipe(qw(cat-file --batch-check)); 420 print $out "000000000\n"; 421 while (<$in>) { ... } 422 $r->command_close_bidi_pipe($pid, $in, $out, $ctx); 423 424Note that you should not rely on whatever actually is in C<CTX>; 425currently it is simply the command name but in future the context might 426have more complicated structure. 427 428C<PIPE_IN> and C<PIPE_OUT> may be C<undef> if they have been closed prior to 429calling this function. This may be useful in a query-response type of 430commands where caller first writes a query and later reads response, eg: 431 432 my ($pid, $in, $out, $ctx) = $r->command_bidi_pipe(qw(cat-file --batch-check)); 433 print $out "000000000\n"; 434 close $out; 435 while (<$in>) { ... } 436 $r->command_close_bidi_pipe($pid, $in, undef, $ctx); 437 438This idiom may prevent potential dead locks caused by data sent to the output 439pipe not being flushed and thus not reaching the executed command. 440 441=cut 442 443sub command_close_bidi_pipe { 444 local $?; 445 my ($self, $pid, $in, $out, $ctx) = _maybe_self(@_); 446 _cmd_close($ctx, (grep { defined } ($in, $out))); 447 waitpid $pid, 0; 448 if ($? >> 8) { 449 throw Git::Error::Command($ctx, $? >>8); 450 } 451} 452 453 454=item command_noisy ( COMMAND [, ARGUMENTS... ] ) 455 456Execute the given C<COMMAND> in the same way as command() does but do not 457capture the command output - the standard output is not redirected and goes 458to the standard output of the caller application. 459 460While the method is called command_noisy(), you might want to as well use 461it for the most silent Git commands which you know will never pollute your 462stdout but you want to avoid the overhead of the pipe setup when calling them. 463 464The function returns only after the command has finished running. 465 466=cut 467 468sub command_noisy { 469 my ($self, $cmd, @args) = _maybe_self(@_); 470 _check_valid_cmd($cmd); 471 472 my $pid = fork; 473 if (not defined $pid) { 474 throw Error::Simple("fork failed: $!"); 475 } elsif ($pid == 0) { 476 _cmd_exec($self, $cmd, @args); 477 } 478 if (waitpid($pid, 0) > 0 and $?>>8 != 0) { 479 throw Git::Error::Command(join(' ', $cmd, @args), $? >> 8); 480 } 481} 482 483 484=item version () 485 486Return the Git version in use. 487 488=cut 489 490sub version { 491 my $verstr = command_oneline('--version'); 492 $verstr =~ s/^git version //; 493 $verstr; 494} 495 496 497=item exec_path () 498 499Return path to the Git sub-command executables (the same as 500C<git --exec-path>). Useful mostly only internally. 501 502=cut 503 504sub exec_path { command_oneline('--exec-path') } 505 506 507=item html_path () 508 509Return path to the Git html documentation (the same as 510C<git --html-path>). Useful mostly only internally. 511 512=cut 513 514sub html_path { command_oneline('--html-path') } 515 516 517=item get_tz_offset ( TIME ) 518 519Return the time zone offset from GMT in the form +/-HHMM where HH is 520the number of hours from GMT and MM is the number of minutes. This is 521the equivalent of what strftime("%z", ...) would provide on a GNU 522platform. 523 524If TIME is not supplied, the current local time is used. 525 526=cut 527 528sub get_tz_offset { 529 # some systems don't handle or mishandle %z, so be creative. 530 my $t = shift || time; 531 my @t = localtime($t); 532 $t[5] += 1900; 533 require Time::Local; 534 my $gm = Time::Local::timegm(@t); 535 my $sign = qw( + + - )[ $gm <=> $t ]; 536 return sprintf("%s%02d%02d", $sign, (gmtime(abs($t - $gm)))[2,1]); 537} 538 539=item get_record ( FILEHANDLE, INPUT_RECORD_SEPARATOR ) 540 541Read one record from FILEHANDLE delimited by INPUT_RECORD_SEPARATOR, 542removing any trailing INPUT_RECORD_SEPARATOR. 543 544=cut 545 546sub get_record { 547 my ($fh, $rs) = @_; 548 local $/ = $rs; 549 my $rec = <$fh>; 550 chomp $rec if defined $rec; 551 $rec; 552} 553 554=item prompt ( PROMPT , ISPASSWORD ) 555 556Query user C<PROMPT> and return answer from user. 557 558Honours GIT_ASKPASS and SSH_ASKPASS environment variables for querying 559the user. If no *_ASKPASS variable is set or an error occurred, 560the terminal is tried as a fallback. 561If C<ISPASSWORD> is set and true, the terminal disables echo. 562 563=cut 564 565sub prompt { 566 my ($prompt, $isPassword) = @_; 567 my $ret; 568 if (exists $ENV{'GIT_ASKPASS'}) { 569 $ret = _prompt($ENV{'GIT_ASKPASS'}, $prompt); 570 } 571 if (!defined $ret && exists $ENV{'SSH_ASKPASS'}) { 572 $ret = _prompt($ENV{'SSH_ASKPASS'}, $prompt); 573 } 574 if (!defined $ret) { 575 print STDERR $prompt; 576 STDERR->flush; 577 if (defined $isPassword && $isPassword) { 578 require Term::ReadKey; 579 Term::ReadKey::ReadMode('noecho'); 580 $ret = ''; 581 while (defined(my $key = Term::ReadKey::ReadKey(0))) { 582 last if $key =~ /[\012\015]/; # \n\r 583 $ret .= $key; 584 } 585 Term::ReadKey::ReadMode('restore'); 586 print STDERR "\n"; 587 STDERR->flush; 588 } else { 589 chomp($ret = <STDIN>); 590 } 591 } 592 return $ret; 593} 594 595sub _prompt { 596 my ($askpass, $prompt) = @_; 597 return unless length $askpass; 598 $prompt =~ s/\n/ /g; 599 my $ret; 600 open my $fh, "-|", $askpass, $prompt or return; 601 $ret = <$fh>; 602 $ret =~ s/[\015\012]//g; # strip \r\n, chomp does not work on all systems (i.e. windows) as expected 603 close ($fh); 604 return $ret; 605} 606 607=item repo_path () 608 609Return path to the git repository. Must be called on a repository instance. 610 611=cut 612 613sub repo_path { $_[0]->{opts}->{Repository} } 614 615 616=item wc_path () 617 618Return path to the working copy. Must be called on a repository instance. 619 620=cut 621 622sub wc_path { $_[0]->{opts}->{WorkingCopy} } 623 624 625=item wc_subdir () 626 627Return path to the subdirectory inside of a working copy. Must be called 628on a repository instance. 629 630=cut 631 632sub wc_subdir { $_[0]->{opts}->{WorkingSubdir} ||= '' } 633 634 635=item wc_chdir ( SUBDIR ) 636 637Change the working copy subdirectory to work within. The C<SUBDIR> is 638relative to the working copy root directory (not the current subdirectory). 639Must be called on a repository instance attached to a working copy 640and the directory must exist. 641 642=cut 643 644sub wc_chdir { 645 my ($self, $subdir) = @_; 646 $self->wc_path() 647 or throw Error::Simple("bare repository"); 648 649 -d $self->wc_path().'/'.$subdir 650 or throw Error::Simple("subdir not found: $subdir $!"); 651 # Of course we will not "hold" the subdirectory so anyone 652 # can delete it now and we will never know. But at least we tried. 653 654 $self->{opts}->{WorkingSubdir} = $subdir; 655} 656 657 658=item config ( VARIABLE ) 659 660Retrieve the configuration C<VARIABLE> in the same manner as C<config> 661does. In scalar context requires the variable to be set only one time 662(exception is thrown otherwise), in array context returns allows the 663variable to be set multiple times and returns all the values. 664 665=cut 666 667sub config { 668 return _config_common({}, @_); 669} 670 671 672=item config_bool ( VARIABLE ) 673 674Retrieve the bool configuration C<VARIABLE>. The return value 675is usable as a boolean in perl (and C<undef> if it's not defined, 676of course). 677 678=cut 679 680sub config_bool { 681 my $val = scalar _config_common({'kind' => '--bool'}, @_); 682 683 # Do not rewrite this as return (defined $val && $val eq 'true') 684 # as some callers do care what kind of falsehood they receive. 685 if (!defined $val) { 686 return undef; 687 } else { 688 return $val eq 'true'; 689 } 690} 691 692 693=item config_path ( VARIABLE ) 694 695Retrieve the path configuration C<VARIABLE>. The return value 696is an expanded path or C<undef> if it's not defined. 697 698=cut 699 700sub config_path { 701 return _config_common({'kind' => '--path'}, @_); 702} 703 704 705=item config_int ( VARIABLE ) 706 707Retrieve the integer configuration C<VARIABLE>. The return value 708is simple decimal number. An optional value suffix of 'k', 'm', 709or 'g' in the config file will cause the value to be multiplied 710by 1024, 1048576 (1024^2), or 1073741824 (1024^3) prior to output. 711It would return C<undef> if configuration variable is not defined. 712 713=cut 714 715sub config_int { 716 return scalar _config_common({'kind' => '--int'}, @_); 717} 718 719=item config_regexp ( RE ) 720 721Retrieve the list of configuration key names matching the regular 722expression C<RE>. The return value is a list of strings matching 723this regex. 724 725=cut 726 727sub config_regexp { 728 my ($self, $regex) = _maybe_self(@_); 729 try { 730 my @cmd = ('config', '--name-only', '--get-regexp', $regex); 731 unshift @cmd, $self if $self; 732 my @matches = command(@cmd); 733 return @matches; 734 } catch Git::Error::Command with { 735 my $E = shift; 736 if ($E->value() == 1) { 737 my @matches = (); 738 return @matches; 739 } else { 740 throw $E; 741 } 742 }; 743} 744 745# Common subroutine to implement bulk of what the config* family of methods 746# do. This currently wraps command('config') so it is not so fast. 747sub _config_common { 748 my ($opts) = shift @_; 749 my ($self, $var) = _maybe_self(@_); 750 751 try { 752 my @cmd = ('config', $opts->{'kind'} ? $opts->{'kind'} : ()); 753 unshift @cmd, $self if $self; 754 if (wantarray) { 755 return command(@cmd, '--get-all', $var); 756 } else { 757 return command_oneline(@cmd, '--get', $var); 758 } 759 } catch Git::Error::Command with { 760 my $E = shift; 761 if ($E->value() == 1) { 762 # Key not found. 763 return; 764 } else { 765 throw $E; 766 } 767 }; 768} 769 770=item get_colorbool ( NAME ) 771 772Finds if color should be used for NAMEd operation from the configuration, 773and returns boolean (true for "use color", false for "do not use color"). 774 775=cut 776 777sub get_colorbool { 778 my ($self, $var) = @_; 779 my $stdout_to_tty = (-t STDOUT) ? "true" : "false"; 780 my $use_color = $self->command_oneline('config', '--get-colorbool', 781 $var, $stdout_to_tty); 782 return ($use_color eq 'true'); 783} 784 785=item get_color ( SLOT, COLOR ) 786 787Finds color for SLOT from the configuration, while defaulting to COLOR, 788and returns the ANSI color escape sequence: 789 790 print $repo->get_color("color.interactive.prompt", "underline blue white"); 791 print "some text"; 792 print $repo->get_color("", "normal"); 793 794=cut 795 796sub get_color { 797 my ($self, $slot, $default) = @_; 798 my $color = $self->command_oneline('config', '--get-color', $slot, $default); 799 if (!defined $color) { 800 $color = ""; 801 } 802 return $color; 803} 804 805=item remote_refs ( REPOSITORY [, GROUPS [, REFGLOBS ] ] ) 806 807This function returns a hashref of refs stored in a given remote repository. 808The hash is in the format C<refname =\> hash>. For tags, the C<refname> entry 809contains the tag object while a C<refname^{}> entry gives the tagged objects. 810 811C<REPOSITORY> has the same meaning as the appropriate C<git-ls-remote> 812argument; either a URL or a remote name (if called on a repository instance). 813C<GROUPS> is an optional arrayref that can contain 'tags' to return all the 814tags and/or 'heads' to return all the heads. C<REFGLOB> is an optional array 815of strings containing a shell-like glob to further limit the refs returned in 816the hash; the meaning is again the same as the appropriate C<git-ls-remote> 817argument. 818 819This function may or may not be called on a repository instance. In the former 820case, remote names as defined in the repository are recognized as repository 821specifiers. 822 823=cut 824 825sub remote_refs { 826 my ($self, $repo, $groups, $refglobs) = _maybe_self(@_); 827 my @args; 828 if (ref $groups eq 'ARRAY') { 829 foreach (@$groups) { 830 if ($_ eq 'heads') { 831 push (@args, '--heads'); 832 } elsif ($_ eq 'tags') { 833 push (@args, '--tags'); 834 } else { 835 # Ignore unknown groups for future 836 # compatibility 837 } 838 } 839 } 840 push (@args, $repo); 841 if (ref $refglobs eq 'ARRAY') { 842 push (@args, @$refglobs); 843 } 844 845 my @self = $self ? ($self) : (); # Ultra trickery 846 my ($fh, $ctx) = Git::command_output_pipe(@self, 'ls-remote', @args); 847 my %refs; 848 while (<$fh>) { 849 chomp; 850 my ($hash, $ref) = split(/\t/, $_, 2); 851 $refs{$ref} = $hash; 852 } 853 Git::command_close_pipe(@self, $fh, $ctx); 854 return \%refs; 855} 856 857 858=item ident ( TYPE | IDENTSTR ) 859 860=item ident_person ( TYPE | IDENTSTR | IDENTARRAY ) 861 862This suite of functions retrieves and parses ident information, as stored 863in the commit and tag objects or produced by C<var GIT_type_IDENT> (thus 864C<TYPE> can be either I<author> or I<committer>; case is insignificant). 865 866The C<ident> method retrieves the ident information from C<git var> 867and either returns it as a scalar string or as an array with the fields parsed. 868Alternatively, it can take a prepared ident string (e.g. from the commit 869object) and just parse it. 870 871C<ident_person> returns the person part of the ident - name and email; 872it can take the same arguments as C<ident> or the array returned by C<ident>. 873 874The synopsis is like: 875 876 my ($name, $email, $time_tz) = ident('author'); 877 "$name <$email>" eq ident_person('author'); 878 "$name <$email>" eq ident_person($name); 879 $time_tz =~ /^\d+ [+-]\d{4}$/; 880 881=cut 882 883sub ident { 884 my ($self, $type) = _maybe_self(@_); 885 my $identstr; 886 if (lc $type eq lc 'committer' or lc $type eq lc 'author') { 887 my @cmd = ('var', 'GIT_'.uc($type).'_IDENT'); 888 unshift @cmd, $self if $self; 889 $identstr = command_oneline(@cmd); 890 } else { 891 $identstr = $type; 892 } 893 if (wantarray) { 894 return $identstr =~ /^(.*) <(.*)> (\d+ [+-]\d{4})$/; 895 } else { 896 return $identstr; 897 } 898} 899 900sub ident_person { 901 my ($self, @ident) = _maybe_self(@_); 902 $#ident == 0 and @ident = $self ? $self->ident($ident[0]) : ident($ident[0]); 903 return "$ident[0] <$ident[1]>"; 904} 905 906=item hash_object ( TYPE, FILENAME ) 907 908Compute the SHA1 object id of the given C<FILENAME> considering it is 909of the C<TYPE> object type (C<blob>, C<commit>, C<tree>). 910 911The method can be called without any instance or on a specified Git repository, 912it makes zero difference. 913 914The function returns the SHA1 hash. 915 916=cut 917 918# TODO: Support for passing FILEHANDLE instead of FILENAME 919sub hash_object { 920 my ($self, $type, $file) = _maybe_self(@_); 921 command_oneline('hash-object', '-t', $type, $file); 922} 923 924 925=item hash_and_insert_object ( FILENAME ) 926 927Compute the SHA1 object id of the given C<FILENAME> and add the object to the 928object database. 929 930The function returns the SHA1 hash. 931 932=cut 933 934# TODO: Support for passing FILEHANDLE instead of FILENAME 935sub hash_and_insert_object { 936 my ($self, $filename) = @_; 937 938 carp "Bad filename \"$filename\"" if $filename =~ /[\r\n]/; 939 940 $self->_open_hash_and_insert_object_if_needed(); 941 my ($in, $out) = ($self->{hash_object_in}, $self->{hash_object_out}); 942 943 unless (print $out $filename, "\n") { 944 $self->_close_hash_and_insert_object(); 945 throw Error::Simple("out pipe went bad"); 946 } 947 948 chomp(my $hash = <$in>); 949 unless (defined($hash)) { 950 $self->_close_hash_and_insert_object(); 951 throw Error::Simple("in pipe went bad"); 952 } 953 954 return $hash; 955} 956 957sub _open_hash_and_insert_object_if_needed { 958 my ($self) = @_; 959 960 return if defined($self->{hash_object_pid}); 961 962 ($self->{hash_object_pid}, $self->{hash_object_in}, 963 $self->{hash_object_out}, $self->{hash_object_ctx}) = 964 $self->command_bidi_pipe(qw(hash-object -w --stdin-paths --no-filters)); 965} 966 967sub _close_hash_and_insert_object { 968 my ($self) = @_; 969 970 return unless defined($self->{hash_object_pid}); 971 972 my @vars = map { 'hash_object_' . $_ } qw(pid in out ctx); 973 974 command_close_bidi_pipe(@$self{@vars}); 975 delete @$self{@vars}; 976} 977 978=item cat_blob ( SHA1, FILEHANDLE ) 979 980Prints the contents of the blob identified by C<SHA1> to C<FILEHANDLE> and 981returns the number of bytes printed. 982 983=cut 984 985sub cat_blob { 986 my ($self, $sha1, $fh) = @_; 987 988 $self->_open_cat_blob_if_needed(); 989 my ($in, $out) = ($self->{cat_blob_in}, $self->{cat_blob_out}); 990 991 unless (print $out $sha1, "\n") { 992 $self->_close_cat_blob(); 993 throw Error::Simple("out pipe went bad"); 994 } 995 996 my $description = <$in>; 997 if ($description =~ / missing$/) { 998 carp "$sha1 doesn't exist in the repository"; 999 return -1; 1000 } 1001 1002 if ($description !~ /^[0-9a-fA-F]{40}(?:[0-9a-fA-F]{24})? \S+ (\d+)$/) { 1003 carp "Unexpected result returned from git cat-file"; 1004 return -1; 1005 } 1006 1007 my $size = $1; 1008 1009 my $blob; 1010 my $bytesLeft = $size; 1011 1012 while (1) { 1013 last unless $bytesLeft; 1014 1015 my $bytesToRead = $bytesLeft < 1024 ? $bytesLeft : 1024; 1016 my $read = read($in, $blob, $bytesToRead); 1017 unless (defined($read)) { 1018 $self->_close_cat_blob(); 1019 throw Error::Simple("in pipe went bad"); 1020 } 1021 unless (print $fh $blob) { 1022 $self->_close_cat_blob(); 1023 throw Error::Simple("couldn't write to passed in filehandle"); 1024 } 1025 $bytesLeft -= $read; 1026 } 1027 1028 # Skip past the trailing newline. 1029 my $newline; 1030 my $read = read($in, $newline, 1); 1031 unless (defined($read)) { 1032 $self->_close_cat_blob(); 1033 throw Error::Simple("in pipe went bad"); 1034 } 1035 unless ($read == 1 && $newline eq "\n") { 1036 $self->_close_cat_blob(); 1037 throw Error::Simple("didn't find newline after blob"); 1038 } 1039 1040 return $size; 1041} 1042 1043sub _open_cat_blob_if_needed { 1044 my ($self) = @_; 1045 1046 return if defined($self->{cat_blob_pid}); 1047 1048 ($self->{cat_blob_pid}, $self->{cat_blob_in}, 1049 $self->{cat_blob_out}, $self->{cat_blob_ctx}) = 1050 $self->command_bidi_pipe(qw(cat-file --batch)); 1051} 1052 1053sub _close_cat_blob { 1054 my ($self) = @_; 1055 1056 return unless defined($self->{cat_blob_pid}); 1057 1058 my @vars = map { 'cat_blob_' . $_ } qw(pid in out ctx); 1059 1060 command_close_bidi_pipe(@$self{@vars}); 1061 delete @$self{@vars}; 1062} 1063 1064# Given PORT, a port number or service name, return its numerical 1065# value else undef. 1066sub port_num { 1067 my ($port) = @_; 1068 1069 # Port can be either a positive integer within the 16-bit range... 1070 if ($port =~ /^\d+$/ && $port > 0 && $port <= (2**16 - 1)) { 1071 return $port; 1072 } 1073 1074 # ... or a symbolic port (service name). 1075 return scalar getservbyname($port, ''); 1076} 1077 1078=item credential_read( FILEHANDLE ) 1079 1080Reads credential key-value pairs from C<FILEHANDLE>. Reading stops at EOF or 1081when an empty line is encountered. Each line must be of the form C<key=value> 1082with a non-empty key. Function returns hash with all read values. Any white 1083space (other than new-line character) is preserved. 1084 1085=cut 1086 1087sub credential_read { 1088 my ($self, $reader) = _maybe_self(@_); 1089 my %credential; 1090 while (<$reader>) { 1091 chomp; 1092 if ($_ eq '') { 1093 last; 1094 } elsif (!/^([^=]+)=(.*)$/) { 1095 throw Error::Simple("unable to parse git credential data:\n$_"); 1096 } 1097 $credential{$1} = $2; 1098 } 1099 return %credential; 1100} 1101 1102=item credential_write( FILEHANDLE, CREDENTIAL_HASHREF ) 1103 1104Writes credential key-value pairs from hash referenced by 1105C<CREDENTIAL_HASHREF> to C<FILEHANDLE>. Keys and values cannot contain 1106new-lines or NUL bytes characters, and key cannot contain equal signs nor be 1107empty (if they do Error::Simple is thrown). Any white space is preserved. If 1108value for a key is C<undef>, it will be skipped. 1109 1110If C<'url'> key exists it will be written first. (All the other key-value 1111pairs are written in sorted order but you should not depend on that). Once 1112all lines are written, an empty line is printed. 1113 1114=cut 1115 1116sub credential_write { 1117 my ($self, $writer, $credential) = _maybe_self(@_); 1118 my ($key, $value); 1119 1120 # Check if $credential is valid prior to writing anything 1121 while (($key, $value) = each %$credential) { 1122 if (!defined $key || !length $key) { 1123 throw Error::Simple("credential key empty or undefined"); 1124 } elsif ($key =~ /[=\n\0]/) { 1125 throw Error::Simple("credential key contains invalid characters: $key"); 1126 } elsif (defined $value && $value =~ /[\n\0]/) { 1127 throw Error::Simple("credential value for key=$key contains invalid characters: $value"); 1128 } 1129 } 1130 1131 for $key (sort { 1132 # url overwrites other fields, so it must come first 1133 return -1 if $a eq 'url'; 1134 return 1 if $b eq 'url'; 1135 return $a cmp $b; 1136 } keys %$credential) { 1137 if (defined $credential->{$key}) { 1138 print $writer $key, '=', $credential->{$key}, "\n"; 1139 } 1140 } 1141 print $writer "\n"; 1142} 1143 1144sub _credential_run { 1145 my ($self, $credential, $op) = _maybe_self(@_); 1146 my ($pid, $reader, $writer, $ctx) = command_bidi_pipe('credential', $op); 1147 1148 credential_write $writer, $credential; 1149 close $writer; 1150 1151 if ($op eq "fill") { 1152 %$credential = credential_read $reader; 1153 } 1154 if (<$reader>) { 1155 throw Error::Simple("unexpected output from git credential $op response:\n$_\n"); 1156 } 1157 1158 command_close_bidi_pipe($pid, $reader, undef, $ctx); 1159} 1160 1161=item credential( CREDENTIAL_HASHREF [, OPERATION ] ) 1162 1163=item credential( CREDENTIAL_HASHREF, CODE ) 1164 1165Executes C<git credential> for a given set of credentials and specified 1166operation. In both forms C<CREDENTIAL_HASHREF> needs to be a reference to 1167a hash which stores credentials. Under certain conditions the hash can 1168change. 1169 1170In the first form, C<OPERATION> can be C<'fill'>, C<'approve'> or C<'reject'>, 1171and function will execute corresponding C<git credential> sub-command. If 1172it's omitted C<'fill'> is assumed. In case of C<'fill'> the values stored in 1173C<CREDENTIAL_HASHREF> will be changed to the ones returned by the C<git 1174credential fill> command. The usual usage would look something like: 1175 1176 my %cred = ( 1177 'protocol' => 'https', 1178 'host' => 'example.com', 1179 'username' => 'bob' 1180 ); 1181 Git::credential \%cred; 1182 if (try_to_authenticate($cred{'username'}, $cred{'password'})) { 1183 Git::credential \%cred, 'approve'; 1184 ... do more stuff ... 1185 } else { 1186 Git::credential \%cred, 'reject'; 1187 } 1188 1189In the second form, C<CODE> needs to be a reference to a subroutine. The 1190function will execute C<git credential fill> to fill the provided credential 1191hash, then call C<CODE> with C<CREDENTIAL_HASHREF> as the sole argument. If 1192C<CODE>'s return value is defined, the function will execute C<git credential 1193approve> (if return value yields true) or C<git credential reject> (if return 1194value is false). If the return value is undef, nothing at all is executed; 1195this is useful, for example, if the credential could neither be verified nor 1196rejected due to an unrelated network error. The return value is the same as 1197what C<CODE> returns. With this form, the usage might look as follows: 1198 1199 if (Git::credential { 1200 'protocol' => 'https', 1201 'host' => 'example.com', 1202 'username' => 'bob' 1203 }, sub { 1204 my $cred = shift; 1205 return !!try_to_authenticate($cred->{'username'}, 1206 $cred->{'password'}); 1207 }) { 1208 ... do more stuff ... 1209 } 1210 1211=cut 1212 1213sub credential { 1214 my ($self, $credential, $op_or_code) = (_maybe_self(@_), 'fill'); 1215 1216 if ('CODE' eq ref $op_or_code) { 1217 _credential_run $credential, 'fill'; 1218 my $ret = $op_or_code->($credential); 1219 if (defined $ret) { 1220 _credential_run $credential, $ret ? 'approve' : 'reject'; 1221 } 1222 return $ret; 1223 } else { 1224 _credential_run $credential, $op_or_code; 1225 } 1226} 1227 1228{ # %TEMP_* Lexical Context 1229 1230my (%TEMP_FILEMAP, %TEMP_FILES); 1231 1232=item temp_acquire ( NAME ) 1233 1234Attempts to retrieve the temporary file mapped to the string C<NAME>. If an 1235associated temp file has not been created this session or was closed, it is 1236created, cached, and set for autoflush and binmode. 1237 1238Internally locks the file mapped to C<NAME>. This lock must be released with 1239C<temp_release()> when the temp file is no longer needed. Subsequent attempts 1240to retrieve temporary files mapped to the same C<NAME> while still locked will 1241cause an error. This locking mechanism provides a weak guarantee and is not 1242threadsafe. It does provide some error checking to help prevent temp file refs 1243writing over one another. 1244 1245In general, the L<File::Handle> returned should not be closed by consumers as 1246it defeats the purpose of this caching mechanism. If you need to close the temp 1247file handle, then you should use L<File::Temp> or another temp file faculty 1248directly. If a handle is closed and then requested again, then a warning will 1249issue. 1250 1251=cut 1252 1253sub temp_acquire { 1254 my $temp_fd = _temp_cache(@_); 1255 1256 $TEMP_FILES{$temp_fd}{locked} = 1; 1257 $temp_fd; 1258} 1259 1260=item temp_is_locked ( NAME ) 1261 1262Returns true if the internal lock created by a previous C<temp_acquire()> 1263call with C<NAME> is still in effect. 1264 1265When temp_acquire is called on a C<NAME>, it internally locks the temporary 1266file mapped to C<NAME>. That lock will not be released until C<temp_release()> 1267is called with either the original C<NAME> or the L<File::Handle> that was 1268returned from the original call to temp_acquire. 1269 1270Subsequent attempts to call C<temp_acquire()> with the same C<NAME> will fail 1271unless there has been an intervening C<temp_release()> call for that C<NAME> 1272(or its corresponding L<File::Handle> that was returned by the original 1273C<temp_acquire()> call). 1274 1275If true is returned by C<temp_is_locked()> for a C<NAME>, an attempt to 1276C<temp_acquire()> the same C<NAME> will cause an error unless 1277C<temp_release> is first called on that C<NAME> (or its corresponding 1278L<File::Handle> that was returned by the original C<temp_acquire()> call). 1279 1280=cut 1281 1282sub temp_is_locked { 1283 my ($self, $name) = _maybe_self(@_); 1284 my $temp_fd = \$TEMP_FILEMAP{$name}; 1285 1286 defined $$temp_fd && $$temp_fd->opened && $TEMP_FILES{$$temp_fd}{locked}; 1287} 1288 1289=item temp_release ( NAME ) 1290 1291=item temp_release ( FILEHANDLE ) 1292 1293Releases a lock acquired through C<temp_acquire()>. Can be called either with 1294the C<NAME> mapping used when acquiring the temp file or with the C<FILEHANDLE> 1295referencing a locked temp file. 1296 1297Warns if an attempt is made to release a file that is not locked. 1298 1299The temp file will be truncated before being released. This can help to reduce 1300disk I/O where the system is smart enough to detect the truncation while data 1301is in the output buffers. Beware that after the temp file is released and 1302truncated, any operations on that file may fail miserably until it is 1303re-acquired. All contents are lost between each release and acquire mapped to 1304the same string. 1305 1306=cut 1307 1308sub temp_release { 1309 my ($self, $temp_fd, $trunc) = _maybe_self(@_); 1310 1311 if (exists $TEMP_FILEMAP{$temp_fd}) { 1312 $temp_fd = $TEMP_FILES{$temp_fd}; 1313 } 1314 unless ($TEMP_FILES{$temp_fd}{locked}) { 1315 carp "Attempt to release temp file '", 1316 $temp_fd, "' that has not been locked"; 1317 } 1318 temp_reset($temp_fd) if $trunc and $temp_fd->opened; 1319 1320 $TEMP_FILES{$temp_fd}{locked} = 0; 1321 undef; 1322} 1323 1324sub _temp_cache { 1325 my ($self, $name) = _maybe_self(@_); 1326 1327 my $temp_fd = \$TEMP_FILEMAP{$name}; 1328 if (defined $$temp_fd and $$temp_fd->opened) { 1329 if ($TEMP_FILES{$$temp_fd}{locked}) { 1330 throw Error::Simple("Temp file with moniker '" . 1331 $name . "' already in use"); 1332 } 1333 } else { 1334 if (defined $$temp_fd) { 1335 # then we're here because of a closed handle. 1336 carp "Temp file '", $name, 1337 "' was closed. Opening replacement."; 1338 } 1339 my $fname; 1340 1341 my $tmpdir; 1342 if (defined $self) { 1343 $tmpdir = $self->repo_path(); 1344 } 1345 1346 my $n = $name; 1347 $n =~ s/\W/_/g; # no strange chars 1348 1349 require File::Temp; 1350 ($$temp_fd, $fname) = File::Temp::tempfile( 1351 "Git_${n}_XXXXXX", UNLINK => 1, DIR => $tmpdir, 1352 ) or throw Error::Simple("couldn't open new temp file"); 1353 1354 $$temp_fd->autoflush; 1355 binmode $$temp_fd; 1356 $TEMP_FILES{$$temp_fd}{fname} = $fname; 1357 } 1358 $$temp_fd; 1359} 1360 1361=item temp_reset ( FILEHANDLE ) 1362 1363Truncates and resets the position of the C<FILEHANDLE>. 1364 1365=cut 1366 1367sub temp_reset { 1368 my ($self, $temp_fd) = _maybe_self(@_); 1369 1370 truncate $temp_fd, 0 1371 or throw Error::Simple("couldn't truncate file"); 1372 sysseek($temp_fd, 0, Fcntl::SEEK_SET()) and seek($temp_fd, 0, Fcntl::SEEK_SET()) 1373 or throw Error::Simple("couldn't seek to beginning of file"); 1374 sysseek($temp_fd, 0, Fcntl::SEEK_CUR()) == 0 and tell($temp_fd) == 0 1375 or throw Error::Simple("expected file position to be reset"); 1376} 1377 1378=item temp_path ( NAME ) 1379 1380=item temp_path ( FILEHANDLE ) 1381 1382Returns the filename associated with the given tempfile. 1383 1384=cut 1385 1386sub temp_path { 1387 my ($self, $temp_fd) = _maybe_self(@_); 1388 1389 if (exists $TEMP_FILEMAP{$temp_fd}) { 1390 $temp_fd = $TEMP_FILEMAP{$temp_fd}; 1391 } 1392 $TEMP_FILES{$temp_fd}{fname}; 1393} 1394 1395sub END { 1396 unlink values %TEMP_FILEMAP if %TEMP_FILEMAP; 1397} 1398 1399} # %TEMP_* Lexical Context 1400 1401=item prefix_lines ( PREFIX, STRING [, STRING... ]) 1402 1403Prefixes lines in C<STRING> with C<PREFIX>. 1404 1405=cut 1406 1407sub prefix_lines { 1408 my $prefix = shift; 1409 my $string = join("\n", @_); 1410 $string =~ s/^/$prefix/mg; 1411 return $string; 1412} 1413 1414=item unquote_path ( PATH ) 1415 1416Unquote a quoted path containing c-escapes as returned by ls-files etc. 1417when not using -z or when parsing the output of diff -u. 1418 1419=cut 1420 1421{ 1422 my %cquote_map = ( 1423 "a" => chr(7), 1424 "b" => chr(8), 1425 "t" => chr(9), 1426 "n" => chr(10), 1427 "v" => chr(11), 1428 "f" => chr(12), 1429 "r" => chr(13), 1430 "\\" => "\\", 1431 "\042" => "\042", 1432 ); 1433 1434 sub unquote_path { 1435 local ($_) = @_; 1436 my ($retval, $remainder); 1437 if (!/^\042(.*)\042$/) { 1438 return $_; 1439 } 1440 ($_, $retval) = ($1, ""); 1441 while (/^([^\\]*)\\(.*)$/) { 1442 $remainder = $2; 1443 $retval .= $1; 1444 for ($remainder) { 1445 if (/^([0-3][0-7][0-7])(.*)$/) { 1446 $retval .= chr(oct($1)); 1447 $_ = $2; 1448 last; 1449 } 1450 if (/^([\\\042abtnvfr])(.*)$/) { 1451 $retval .= $cquote_map{$1}; 1452 $_ = $2; 1453 last; 1454 } 1455 # This is malformed 1456 throw Error::Simple("invalid quoted path $_[0]"); 1457 } 1458 $_ = $remainder; 1459 } 1460 $retval .= $_; 1461 return $retval; 1462 } 1463} 1464 1465=item get_comment_line_char ( ) 1466 1467Gets the core.commentchar configuration value. 1468The value falls-back to '#' if core.commentchar is set to 'auto'. 1469 1470=cut 1471 1472sub get_comment_line_char { 1473 my $comment_line_char = config("core.commentchar") || '#'; 1474 $comment_line_char = '#' if ($comment_line_char eq 'auto'); 1475 $comment_line_char = '#' if (length($comment_line_char) != 1); 1476 return $comment_line_char; 1477} 1478 1479=item comment_lines ( STRING [, STRING... ]) 1480 1481Comments lines following core.commentchar configuration. 1482 1483=cut 1484 1485sub comment_lines { 1486 my $comment_line_char = get_comment_line_char; 1487 return prefix_lines("$comment_line_char ", @_); 1488} 1489 1490=back 1491 1492=head1 ERROR HANDLING 1493 1494All functions are supposed to throw Perl exceptions in case of errors. 1495See the L<Error> module on how to catch those. Most exceptions are mere 1496L<Error::Simple> instances. 1497 1498However, the C<command()>, C<command_oneline()> and C<command_noisy()> 1499functions suite can throw C<Git::Error::Command> exceptions as well: those are 1500thrown when the external command returns an error code and contain the error 1501code as well as access to the captured command's output. The exception class 1502provides the usual C<stringify> and C<value> (command's exit code) methods and 1503in addition also a C<cmd_output> method that returns either an array or a 1504string with the captured command output (depending on the original function 1505call context; C<command_noisy()> returns C<undef>) and $<cmdline> which 1506returns the command and its arguments (but without proper quoting). 1507 1508Note that the C<command_*_pipe()> functions cannot throw this exception since 1509it has no idea whether the command failed or not. You will only find out 1510at the time you C<close> the pipe; if you want to have that automated, 1511use C<command_close_pipe()>, which can throw the exception. 1512 1513=cut 1514 1515{ 1516 package Git::Error::Command; 1517 1518 @Git::Error::Command::ISA = qw(Error); 1519 1520 sub new { 1521 my $self = shift; 1522 my $cmdline = '' . shift; 1523 my $value = 0 + shift; 1524 my $outputref = shift; 1525 my(@args) = (); 1526 1527 local $Error::Depth = $Error::Depth + 1; 1528 1529 push(@args, '-cmdline', $cmdline); 1530 push(@args, '-value', $value); 1531 push(@args, '-outputref', $outputref); 1532 1533 $self->SUPER::new(-text => 'command returned error', @args); 1534 } 1535 1536 sub stringify { 1537 my $self = shift; 1538 my $text = $self->SUPER::stringify; 1539 $self->cmdline() . ': ' . $text . ': ' . $self->value() . "\n"; 1540 } 1541 1542 sub cmdline { 1543 my $self = shift; 1544 $self->{'-cmdline'}; 1545 } 1546 1547 sub cmd_output { 1548 my $self = shift; 1549 my $ref = $self->{'-outputref'}; 1550 defined $ref or undef; 1551 if (ref $ref eq 'ARRAY') { 1552 return @$ref; 1553 } else { # SCALAR 1554 return $$ref; 1555 } 1556 } 1557} 1558 1559=over 4 1560 1561=item git_cmd_try { CODE } ERRMSG 1562 1563This magical statement will automatically catch any C<Git::Error::Command> 1564exceptions thrown by C<CODE> and make your program die with C<ERRMSG> 1565on its lips; the message will have %s substituted for the command line 1566and %d for the exit status. This statement is useful mostly for producing 1567more user-friendly error messages. 1568 1569In case of no exception caught the statement returns C<CODE>'s return value. 1570 1571Note that this is the only auto-exported function. 1572 1573=cut 1574 1575sub git_cmd_try(&$) { 1576 my ($code, $errmsg) = @_; 1577 my @result; 1578 my $err; 1579 my $array = wantarray; 1580 try { 1581 if ($array) { 1582 @result = &$code; 1583 } else { 1584 $result[0] = &$code; 1585 } 1586 } catch Git::Error::Command with { 1587 my $E = shift; 1588 $err = $errmsg; 1589 $err =~ s/\%s/$E->cmdline()/ge; 1590 $err =~ s/\%d/$E->value()/ge; 1591 # We can't croak here since Error.pm would mangle 1592 # that to Error::Simple. 1593 }; 1594 $err and croak $err; 1595 return $array ? @result : $result[0]; 1596} 1597 1598 1599=back 1600 1601=head1 COPYRIGHT 1602 1603Copyright 2006 by Petr Baudis E<lt>pasky@suse.czE<gt>. 1604 1605This module is free software; it may be used, copied, modified 1606and distributed under the terms of the GNU General Public Licence, 1607either version 2, or (at your option) any later version. 1608 1609=cut 1610 1611 1612# Take raw method argument list and return ($obj, @args) in case 1613# the method was called upon an instance and (undef, @args) if 1614# it was called directly. 1615sub _maybe_self { 1616 UNIVERSAL::isa($_[0], 'Git') ? @_ : (undef, @_); 1617} 1618 1619# Check if the command id is something reasonable. 1620sub _check_valid_cmd { 1621 my ($cmd) = @_; 1622 $cmd =~ /^[a-z0-9A-Z_-]+$/ or throw Error::Simple("bad command: $cmd"); 1623} 1624 1625# Common backend for the pipe creators. 1626sub _command_common_pipe { 1627 my $direction = shift; 1628 my ($self, @p) = _maybe_self(@_); 1629 my (%opts, $cmd, @args); 1630 if (ref $p[0]) { 1631 ($cmd, @args) = @{shift @p}; 1632 %opts = ref $p[0] ? %{$p[0]} : @p; 1633 } else { 1634 ($cmd, @args) = @p; 1635 } 1636 _check_valid_cmd($cmd); 1637 1638 my $fh; 1639 if ($^O eq 'MSWin32') { 1640 # ActiveState Perl 1641 #defined $opts{STDERR} and 1642 # warn 'ignoring STDERR option - running w/ ActiveState'; 1643 $direction eq '-|' or 1644 die 'input pipe for ActiveState not implemented'; 1645 # the strange construction with *ACPIPE is just to 1646 # explain the tie below that we want to bind to 1647 # a handle class, not scalar. It is not known if 1648 # it is something specific to ActiveState Perl or 1649 # just a Perl quirk. 1650 tie (*ACPIPE, 'Git::activestate_pipe', $cmd, @args); 1651 $fh = *ACPIPE; 1652 1653 } else { 1654 my $pid = open($fh, $direction); 1655 if (not defined $pid) { 1656 throw Error::Simple("open failed: $!"); 1657 } elsif ($pid == 0) { 1658 if ($opts{STDERR}) { 1659 open (STDERR, '>&', $opts{STDERR}) 1660 or die "dup failed: $!"; 1661 } elsif (defined $opts{STDERR}) { 1662 open (STDERR, '>', '/dev/null') 1663 or die "opening /dev/null failed: $!"; 1664 } 1665 _cmd_exec($self, $cmd, @args); 1666 } 1667 } 1668 return wantarray ? ($fh, join(' ', $cmd, @args)) : $fh; 1669} 1670 1671# When already in the subprocess, set up the appropriate state 1672# for the given repository and execute the git command. 1673sub _cmd_exec { 1674 my ($self, @args) = @_; 1675 _setup_git_cmd_env($self); 1676 _execv_git_cmd(@args); 1677 die qq[exec "@args" failed: $!]; 1678} 1679 1680# set up the appropriate state for git command 1681sub _setup_git_cmd_env { 1682 my $self = shift; 1683 if ($self) { 1684 $self->repo_path() and $ENV{'GIT_DIR'} = $self->repo_path(); 1685 $self->repo_path() and $self->wc_path() 1686 and $ENV{'GIT_WORK_TREE'} = $self->wc_path(); 1687 $self->wc_path() and chdir($self->wc_path()); 1688 $self->wc_subdir() and chdir($self->wc_subdir()); 1689 } 1690} 1691 1692# Execute the given Git command ($_[0]) with arguments ($_[1..]) 1693# by searching for it at proper places. 1694sub _execv_git_cmd { exec('git', @_); } 1695 1696sub _is_sig { 1697 my ($v, $n) = @_; 1698 1699 # We are avoiding a "use POSIX qw(SIGPIPE SIGABRT)" in the hot 1700 # Git.pm codepath. 1701 require POSIX; 1702 no strict 'refs'; 1703 $v == *{"POSIX::$n"}->(); 1704} 1705 1706# Close pipe to a subprocess. 1707sub _cmd_close { 1708 my $ctx = shift @_; 1709 foreach my $fh (@_) { 1710 if (close $fh) { 1711 # nop 1712 } elsif ($!) { 1713 # It's just close, no point in fatalities 1714 carp "error closing pipe: $!"; 1715 } elsif ($? >> 8) { 1716 # The caller should pepper this. 1717 throw Git::Error::Command($ctx, $? >> 8); 1718 } elsif ($? & 127 && _is_sig($? & 127, "SIGPIPE")) { 1719 # we might e.g. closed a live stream; the command 1720 # dying of SIGPIPE would drive us here. 1721 } elsif ($? & 127 && _is_sig($? & 127, "SIGABRT")) { 1722 die sprintf('BUG?: got SIGABRT ($? = %d, $? & 127 = %d) when closing pipe', 1723 $?, $? & 127); 1724 } elsif ($? & 127) { 1725 die sprintf('got signal ($? = %d, $? & 127 = %d) when closing pipe', 1726 $?, $? & 127); 1727 } 1728 } 1729} 1730 1731 1732sub DESTROY { 1733 my ($self) = @_; 1734 $self->_close_hash_and_insert_object(); 1735 $self->_close_cat_blob(); 1736} 1737 1738 1739# Pipe implementation for ActiveState Perl. 1740 1741package Git::activestate_pipe; 1742 1743sub TIEHANDLE { 1744 my ($class, @params) = @_; 1745 # FIXME: This is probably horrible idea and the thing will explode 1746 # at the moment you give it arguments that require some quoting, 1747 # but I have no ActiveState clue... --pasky 1748 # Let's just hope ActiveState Perl does at least the quoting 1749 # correctly. 1750 my @data = qx{git @params}; 1751 bless { i => 0, data => \@data }, $class; 1752} 1753 1754sub READLINE { 1755 my $self = shift; 1756 if ($self->{i} >= scalar @{$self->{data}}) { 1757 return undef; 1758 } 1759 my $i = $self->{i}; 1760 if (wantarray) { 1761 $self->{i} = $#{$self->{'data'}} + 1; 1762 return splice(@{$self->{'data'}}, $i); 1763 } 1764 $self->{i} = $i + 1; 1765 return $self->{'data'}->[ $i ]; 1766} 1767 1768sub CLOSE { 1769 my $self = shift; 1770 delete $self->{data}; 1771 delete $self->{i}; 1772} 1773 1774sub EOF { 1775 my $self = shift; 1776 return ($self->{i} >= scalar @{$self->{data}}); 1777} 1778 1779 17801; # Famous last words