1=head1 NAME 2 3Git - Perl interface to the Git version control system 4 5=cut 6 7 8package Git; 9 10use strict; 11 12 13BEGIN{ 14 15our($VERSION,@ISA,@EXPORT,@EXPORT_OK); 16 17# Totally unstable API. 18$VERSION='0.01'; 19 20 21=head1 SYNOPSIS 22 23 use Git; 24 25 my $version = Git::command_oneline('version'); 26 27 git_cmd_try { Git::command_noisy('update-server-info') } 28 '%s failed w/ code %d'; 29 30 my $repo = Git->repository (Directory => '/srv/git/cogito.git'); 31 32 33 my @revs = $repo->command('rev-list', '--since=last monday', '--all'); 34 35 my ($fh, $c) = $repo->command_output_pipe('rev-list', '--since=last monday', '--all'); 36 my $lastrev = <$fh>; chomp $lastrev; 37 $repo->command_close_pipe($fh, $c); 38 39 my $lastrev = $repo->command_oneline( [ 'rev-list', '--all' ], 40 STDERR => 0 ); 41 42 my $sha1 = $repo->hash_and_insert_object('file.txt'); 43 my $tempfile = tempfile(); 44 my $size = $repo->cat_blob($sha1, $tempfile); 45 46=cut 47 48 49require Exporter; 50 51@ISA=qw(Exporter); 52 53@EXPORT=qw(git_cmd_try); 54 55# Methods which can be called as standalone functions as well: 56@EXPORT_OK=qw(command command_oneline command_noisy 57 command_output_pipe command_input_pipe command_close_pipe 58 command_bidi_pipe command_close_bidi_pipe 59 version exec_path hash_object git_cmd_try 60 remote_refs); 61 62 63=head1 DESCRIPTION 64 65This module provides Perl scripts easy way to interface the Git version control 66system. The modules have an easy and well-tested way to call arbitrary Git 67commands; in the future, the interface will also provide specialized methods 68for doing easily operations which are not totally trivial to do over 69the generic command interface. 70 71While some commands can be executed outside of any context (e.g. 'version' 72or 'init'), most operations require a repository context, which in practice 73means getting an instance of the Git object using the repository() constructor. 74(In the future, we will also get a new_repository() constructor.) All commands 75called as methods of the object are then executed in the context of the 76repository. 77 78Part of the "repository state" is also information about path to the attached 79working copy (unless you work with a bare repository). You can also navigate 80inside of the working copy using the C<wc_chdir()> method. (Note that 81the repository object is self-contained and will not change working directory 82of your process.) 83 84TODO: In the future, we might also do 85 86 my $remoterepo = $repo->remote_repository (Name => 'cogito', Branch => 'master'); 87 $remoterepo ||= Git->remote_repository ('http://git.or.cz/cogito.git/'); 88 my @refs = $remoterepo->refs(); 89 90Currently, the module merely wraps calls to external Git tools. In the future, 91it will provide a much faster way to interact with Git by linking directly 92to libgit. This should be completely opaque to the user, though (performance 93increate nonwithstanding). 94 95=cut 96 97 98use Carp qw(carp croak);# but croak is bad - throw instead 99use Error qw(:try); 100use Cwd qw(abs_path); 101use IPC::Open2 qw(open2); 102 103} 104 105 106=head1 CONSTRUCTORS 107 108=over 4 109 110=item repository ( OPTIONS ) 111 112=item repository ( DIRECTORY ) 113 114=item repository () 115 116Construct a new repository object. 117C<OPTIONS> are passed in a hash like fashion, using key and value pairs. 118Possible options are: 119 120B<Repository> - Path to the Git repository. 121 122B<WorkingCopy> - Path to the associated working copy; not strictly required 123as many commands will happily crunch on a bare repository. 124 125B<WorkingSubdir> - Subdirectory in the working copy to work inside. 126Just left undefined if you do not want to limit the scope of operations. 127 128B<Directory> - Path to the Git working directory in its usual setup. 129The C<.git> directory is searched in the directory and all the parent 130directories; if found, C<WorkingCopy> is set to the directory containing 131it and C<Repository> to the C<.git> directory itself. If no C<.git> 132directory was found, the C<Directory> is assumed to be a bare repository, 133C<Repository> is set to point at it and C<WorkingCopy> is left undefined. 134If the C<$GIT_DIR> environment variable is set, things behave as expected 135as well. 136 137You should not use both C<Directory> and either of C<Repository> and 138C<WorkingCopy> - the results of that are undefined. 139 140Alternatively, a directory path may be passed as a single scalar argument 141to the constructor; it is equivalent to setting only the C<Directory> option 142field. 143 144Calling the constructor with no options whatsoever is equivalent to 145calling it with C<< Directory => '.' >>. In general, if you are building 146a standard porcelain command, simply doing C<< Git->repository() >> should 147do the right thing and setup the object to reflect exactly where the user 148is right now. 149 150=cut 151 152sub repository { 153my$class=shift; 154my@args=@_; 155my%opts= (); 156my$self; 157 158if(defined$args[0]) { 159if($#args%2!=1) { 160# Not a hash. 161$#args==0or throw Error::Simple("bad usage"); 162%opts= ( Directory =>$args[0] ); 163}else{ 164%opts=@args; 165} 166} 167 168if(not defined$opts{Repository}and not defined$opts{WorkingCopy}) { 169$opts{Directory} ||='.'; 170} 171 172if($opts{Directory}) { 173-d $opts{Directory}or throw Error::Simple("Directory not found:$!"); 174 175my$search= Git->repository(WorkingCopy =>$opts{Directory}); 176my$dir; 177try{ 178$dir=$search->command_oneline(['rev-parse','--git-dir'], 179 STDERR =>0); 180} catch Git::Error::Command with { 181$dir=undef; 182}; 183 184if($dir) { 185$dir=~ m#^/# or $dir = $opts{Directory} . '/' . $dir; 186$opts{Repository} =$dir; 187 188# If --git-dir went ok, this shouldn't die either. 189my$prefix=$search->command_oneline('rev-parse','--show-prefix'); 190$dir= abs_path($opts{Directory}) .'/'; 191if($prefix) { 192if(substr($dir, -length($prefix))ne$prefix) { 193 throw Error::Simple("rev-parse confused me -$dirdoes not have trailing$prefix"); 194} 195substr($dir, -length($prefix)) =''; 196} 197$opts{WorkingCopy} =$dir; 198$opts{WorkingSubdir} =$prefix; 199 200}else{ 201# A bare repository? Let's see... 202$dir=$opts{Directory}; 203 204unless(-d "$dir/refs"and-d "$dir/objects"and-e "$dir/HEAD") { 205# Mimick git-rev-parse --git-dir error message: 206 throw Error::Simple('fatal: Not a git repository'); 207} 208my$search= Git->repository(Repository =>$dir); 209try{ 210$search->command('symbolic-ref','HEAD'); 211} catch Git::Error::Command with { 212# Mimick git-rev-parse --git-dir error message: 213 throw Error::Simple('fatal: Not a git repository'); 214} 215 216$opts{Repository} = abs_path($dir); 217} 218 219delete$opts{Directory}; 220} 221 222$self= { opts => \%opts}; 223bless$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 { 263my($fh,$ctx) = command_output_pipe(@_); 264 265if(not defined wantarray) { 266# Nothing to pepper the possible exception with. 267 _cmd_close($fh,$ctx); 268 269}elsif(not wantarray) { 270local$/; 271my$text= <$fh>; 272try{ 273 _cmd_close($fh,$ctx); 274} catch Git::Error::Command with { 275# Pepper with the output: 276my$E=shift; 277$E->{'-outputref'} = \$text; 278 throw $E; 279}; 280return$text; 281 282}else{ 283my@lines= <$fh>; 284defined and chompfor@lines; 285try{ 286 _cmd_close($fh,$ctx); 287} catch Git::Error::Command with { 288my$E=shift; 289$E->{'-outputref'} = \@lines; 290 throw $E; 291}; 292return@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 { 308my($fh,$ctx) = command_output_pipe(@_); 309 310my$line= <$fh>; 311defined$lineand chomp$line; 312try{ 313 _cmd_close($fh,$ctx); 314} catch Git::Error::Command with { 315# Pepper with the output: 316my$E=shift; 317$E->{'-outputref'} = \$line; 318 throw $E; 319}; 320return$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 { 379my($self,$fh,$ctx) = _maybe_self(@_); 380$ctx||='<unknown>'; 381 _cmd_close($fh,$ctx); 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 return C<($pid, $pipe_in, $pipe_out, $ctx)>. 390See C<command_close_bidi_pipe()> for details. 391 392=cut 393 394sub command_bidi_pipe { 395my($pid,$in,$out); 396$pid= open2($in,$out,'git',@_); 397return($pid,$in,$out,join(' ',@_)); 398} 399 400=item command_close_bidi_pipe ( PID, PIPE_IN, PIPE_OUT [, CTX] ) 401 402Close the C<PIPE_IN> and C<PIPE_OUT> as returned from C<command_bidi_pipe()>, 403checking whether the command finished successfully. The optional C<CTX> 404argument is required if you want to see the command name in the error message, 405and it is the fourth value returned by C<command_bidi_pipe()>. The call idiom 406is: 407 408 my ($pid, $in, $out, $ctx) = $r->command_bidi_pipe('cat-file --batch-check'); 409 print "000000000\n" $out; 410 while (<$in>) { ... } 411 $r->command_close_bidi_pipe($pid, $in, $out, $ctx); 412 413Note that you should not rely on whatever actually is in C<CTX>; 414currently it is simply the command name but in future the context might 415have more complicated structure. 416 417=cut 418 419sub command_close_bidi_pipe { 420my($pid,$in,$out,$ctx) =@_; 421foreachmy$fh($in,$out) { 422unless(close$fh) { 423if($!) { 424 carp "error closing pipe:$!"; 425}elsif($?>>8) { 426 throw Git::Error::Command($ctx,$?>>8); 427} 428} 429} 430 431waitpid$pid,0; 432 433if($?>>8) { 434 throw Git::Error::Command($ctx,$?>>8); 435} 436} 437 438 439=item command_noisy ( COMMAND [, ARGUMENTS... ] ) 440 441Execute the given C<COMMAND> in the same way as command() does but do not 442capture the command output - the standard output is not redirected and goes 443to the standard output of the caller application. 444 445While the method is called command_noisy(), you might want to as well use 446it for the most silent Git commands which you know will never pollute your 447stdout but you want to avoid the overhead of the pipe setup when calling them. 448 449The function returns only after the command has finished running. 450 451=cut 452 453sub command_noisy { 454my($self,$cmd,@args) = _maybe_self(@_); 455 _check_valid_cmd($cmd); 456 457my$pid=fork; 458if(not defined$pid) { 459 throw Error::Simple("fork failed:$!"); 460}elsif($pid==0) { 461 _cmd_exec($self,$cmd,@args); 462} 463if(waitpid($pid,0) >0and$?>>8!=0) { 464 throw Git::Error::Command(join(' ',$cmd,@args),$?>>8); 465} 466} 467 468 469=item version () 470 471Return the Git version in use. 472 473=cut 474 475sub version { 476my$verstr= command_oneline('--version'); 477$verstr=~s/^git version //; 478$verstr; 479} 480 481 482=item exec_path () 483 484Return path to the Git sub-command executables (the same as 485C<git --exec-path>). Useful mostly only internally. 486 487=cut 488 489sub exec_path { command_oneline('--exec-path') } 490 491 492=item repo_path () 493 494Return path to the git repository. Must be called on a repository instance. 495 496=cut 497 498sub repo_path {$_[0]->{opts}->{Repository} } 499 500 501=item wc_path () 502 503Return path to the working copy. Must be called on a repository instance. 504 505=cut 506 507sub wc_path {$_[0]->{opts}->{WorkingCopy} } 508 509 510=item wc_subdir () 511 512Return path to the subdirectory inside of a working copy. Must be called 513on a repository instance. 514 515=cut 516 517sub wc_subdir {$_[0]->{opts}->{WorkingSubdir} ||=''} 518 519 520=item wc_chdir ( SUBDIR ) 521 522Change the working copy subdirectory to work within. The C<SUBDIR> is 523relative to the working copy root directory (not the current subdirectory). 524Must be called on a repository instance attached to a working copy 525and the directory must exist. 526 527=cut 528 529sub wc_chdir { 530my($self,$subdir) =@_; 531$self->wc_path() 532or throw Error::Simple("bare repository"); 533 534-d $self->wc_path().'/'.$subdir 535or throw Error::Simple("subdir not found:$!"); 536# Of course we will not "hold" the subdirectory so anyone 537# can delete it now and we will never know. But at least we tried. 538 539$self->{opts}->{WorkingSubdir} =$subdir; 540} 541 542 543=item config ( VARIABLE ) 544 545Retrieve the configuration C<VARIABLE> in the same manner as C<config> 546does. In scalar context requires the variable to be set only one time 547(exception is thrown otherwise), in array context returns allows the 548variable to be set multiple times and returns all the values. 549 550This currently wraps command('config') so it is not so fast. 551 552=cut 553 554sub config { 555my($self,$var) = _maybe_self(@_); 556 557try{ 558my@cmd= ('config'); 559unshift@cmd,$selfif$self; 560if(wantarray) { 561return command(@cmd,'--get-all',$var); 562}else{ 563return command_oneline(@cmd,'--get',$var); 564} 565} catch Git::Error::Command with { 566my$E=shift; 567if($E->value() ==1) { 568# Key not found. 569return; 570}else{ 571 throw $E; 572} 573}; 574} 575 576 577=item config_bool ( VARIABLE ) 578 579Retrieve the bool configuration C<VARIABLE>. The return value 580is usable as a boolean in perl (and C<undef> if it's not defined, 581of course). 582 583This currently wraps command('config') so it is not so fast. 584 585=cut 586 587sub config_bool { 588my($self,$var) = _maybe_self(@_); 589 590try{ 591my@cmd= ('config','--bool','--get',$var); 592unshift@cmd,$selfif$self; 593my$val= command_oneline(@cmd); 594returnundefunlessdefined$val; 595return$valeq'true'; 596} catch Git::Error::Command with { 597my$E=shift; 598if($E->value() ==1) { 599# Key not found. 600returnundef; 601}else{ 602 throw $E; 603} 604}; 605} 606 607=item config_int ( VARIABLE ) 608 609Retrieve the integer configuration C<VARIABLE>. The return value 610is simple decimal number. An optional value suffix of 'k', 'm', 611or 'g' in the config file will cause the value to be multiplied 612by 1024, 1048576 (1024^2), or 1073741824 (1024^3) prior to output. 613It would return C<undef> if configuration variable is not defined, 614 615This currently wraps command('config') so it is not so fast. 616 617=cut 618 619sub config_int { 620my($self,$var) = _maybe_self(@_); 621 622try{ 623my@cmd= ('config','--int','--get',$var); 624unshift@cmd,$selfif$self; 625return command_oneline(@cmd); 626} catch Git::Error::Command with { 627my$E=shift; 628if($E->value() ==1) { 629# Key not found. 630returnundef; 631}else{ 632 throw $E; 633} 634}; 635} 636 637=item get_colorbool ( NAME ) 638 639Finds if color should be used for NAMEd operation from the configuration, 640and returns boolean (true for "use color", false for "do not use color"). 641 642=cut 643 644sub get_colorbool { 645my($self,$var) =@_; 646my$stdout_to_tty= (-t STDOUT) ?"true":"false"; 647my$use_color=$self->command_oneline('config','--get-colorbool', 648$var,$stdout_to_tty); 649return($use_coloreq'true'); 650} 651 652=item get_color ( SLOT, COLOR ) 653 654Finds color for SLOT from the configuration, while defaulting to COLOR, 655and returns the ANSI color escape sequence: 656 657 print $repo->get_color("color.interactive.prompt", "underline blue white"); 658 print "some text"; 659 print $repo->get_color("", "normal"); 660 661=cut 662 663sub get_color { 664my($self,$slot,$default) =@_; 665my$color=$self->command_oneline('config','--get-color',$slot,$default); 666if(!defined$color) { 667$color=""; 668} 669return$color; 670} 671 672=item remote_refs ( REPOSITORY [, GROUPS [, REFGLOBS ] ] ) 673 674This function returns a hashref of refs stored in a given remote repository. 675The hash is in the format C<refname =\> hash>. For tags, the C<refname> entry 676contains the tag object while a C<refname^{}> entry gives the tagged objects. 677 678C<REPOSITORY> has the same meaning as the appropriate C<git-ls-remote> 679argument; either an URL or a remote name (if called on a repository instance). 680C<GROUPS> is an optional arrayref that can contain 'tags' to return all the 681tags and/or 'heads' to return all the heads. C<REFGLOB> is an optional array 682of strings containing a shell-like glob to further limit the refs returned in 683the hash; the meaning is again the same as the appropriate C<git-ls-remote> 684argument. 685 686This function may or may not be called on a repository instance. In the former 687case, remote names as defined in the repository are recognized as repository 688specifiers. 689 690=cut 691 692sub remote_refs { 693my($self,$repo,$groups,$refglobs) = _maybe_self(@_); 694my@args; 695if(ref$groupseq'ARRAY') { 696foreach(@$groups) { 697if($_eq'heads') { 698push(@args,'--heads'); 699}elsif($_eq'tags') { 700push(@args,'--tags'); 701}else{ 702# Ignore unknown groups for future 703# compatibility 704} 705} 706} 707push(@args,$repo); 708if(ref$refglobseq'ARRAY') { 709push(@args,@$refglobs); 710} 711 712my@self=$self? ($self) : ();# Ultra trickery 713my($fh,$ctx) = Git::command_output_pipe(@self,'ls-remote',@args); 714my%refs; 715while(<$fh>) { 716chomp; 717my($hash,$ref) =split(/\t/,$_,2); 718$refs{$ref} =$hash; 719} 720 Git::command_close_pipe(@self,$fh,$ctx); 721return \%refs; 722} 723 724 725=item ident ( TYPE | IDENTSTR ) 726 727=item ident_person ( TYPE | IDENTSTR | IDENTARRAY ) 728 729This suite of functions retrieves and parses ident information, as stored 730in the commit and tag objects or produced by C<var GIT_type_IDENT> (thus 731C<TYPE> can be either I<author> or I<committer>; case is insignificant). 732 733The C<ident> method retrieves the ident information from C<git-var> 734and either returns it as a scalar string or as an array with the fields parsed. 735Alternatively, it can take a prepared ident string (e.g. from the commit 736object) and just parse it. 737 738C<ident_person> returns the person part of the ident - name and email; 739it can take the same arguments as C<ident> or the array returned by C<ident>. 740 741The synopsis is like: 742 743 my ($name, $email, $time_tz) = ident('author'); 744 "$name <$email>" eq ident_person('author'); 745 "$name <$email>" eq ident_person($name); 746 $time_tz =~ /^\d+ [+-]\d{4}$/; 747 748=cut 749 750sub ident { 751my($self,$type) = _maybe_self(@_); 752my$identstr; 753if(lc$typeeq lc'committer'or lc$typeeq lc'author') { 754my@cmd= ('var','GIT_'.uc($type).'_IDENT'); 755unshift@cmd,$selfif$self; 756$identstr= command_oneline(@cmd); 757}else{ 758$identstr=$type; 759} 760if(wantarray) { 761return$identstr=~/^(.*) <(.*)> (\d+ [+-]\d{4})$/; 762}else{ 763return$identstr; 764} 765} 766 767sub ident_person { 768my($self,@ident) = _maybe_self(@_); 769$#ident==0and@ident=$self?$self->ident($ident[0]) : ident($ident[0]); 770return"$ident[0] <$ident[1]>"; 771} 772 773 774=item hash_object ( TYPE, FILENAME ) 775 776Compute the SHA1 object id of the given C<FILENAME> considering it is 777of the C<TYPE> object type (C<blob>, C<commit>, C<tree>). 778 779The method can be called without any instance or on a specified Git repository, 780it makes zero difference. 781 782The function returns the SHA1 hash. 783 784=cut 785 786# TODO: Support for passing FILEHANDLE instead of FILENAME 787sub hash_object { 788my($self,$type,$file) = _maybe_self(@_); 789 command_oneline('hash-object','-t',$type,$file); 790} 791 792 793=item hash_and_insert_object ( FILENAME ) 794 795Compute the SHA1 object id of the given C<FILENAME> and add the object to the 796object database. 797 798The function returns the SHA1 hash. 799 800=cut 801 802# TODO: Support for passing FILEHANDLE instead of FILENAME 803sub hash_and_insert_object { 804my($self,$filename) =@_; 805 806 carp "Bad filename\"$filename\""if$filename=~/[\r\n]/; 807 808$self->_open_hash_and_insert_object_if_needed(); 809my($in,$out) = ($self->{hash_object_in},$self->{hash_object_out}); 810 811unless(print$out $filename,"\n") { 812$self->_close_hash_and_insert_object(); 813 throw Error::Simple("out pipe went bad"); 814} 815 816chomp(my$hash= <$in>); 817unless(defined($hash)) { 818$self->_close_hash_and_insert_object(); 819 throw Error::Simple("in pipe went bad"); 820} 821 822return$hash; 823} 824 825sub _open_hash_and_insert_object_if_needed { 826my($self) =@_; 827 828return ifdefined($self->{hash_object_pid}); 829 830($self->{hash_object_pid},$self->{hash_object_in}, 831$self->{hash_object_out},$self->{hash_object_ctx}) = 832 command_bidi_pipe(qw(hash-object -w --stdin-paths)); 833} 834 835sub _close_hash_and_insert_object { 836my($self) =@_; 837 838return unlessdefined($self->{hash_object_pid}); 839 840my@vars=map{'hash_object_'.$_}qw(pid in out ctx); 841 842 command_close_bidi_pipe($self->{@vars}); 843delete$self->{@vars}; 844} 845 846=item cat_blob ( SHA1, FILEHANDLE ) 847 848Prints the contents of the blob identified by C<SHA1> to C<FILEHANDLE> and 849returns the number of bytes printed. 850 851=cut 852 853sub cat_blob { 854my($self,$sha1,$fh) =@_; 855 856$self->_open_cat_blob_if_needed(); 857my($in,$out) = ($self->{cat_blob_in},$self->{cat_blob_out}); 858 859unless(print$out $sha1,"\n") { 860$self->_close_cat_blob(); 861 throw Error::Simple("out pipe went bad"); 862} 863 864my$description= <$in>; 865if($description=~/ missing$/) { 866 carp "$sha1doesn't exist in the repository"; 867return-1; 868} 869 870if($description!~/^[0-9a-fA-F]{40} \S+ (\d+)$/) { 871 carp "Unexpected result returned from git cat-file"; 872return-1; 873} 874 875my$size=$1; 876 877my$blob; 878my$bytesRead=0; 879 880while(1) { 881my$bytesLeft=$size-$bytesRead; 882last unless$bytesLeft; 883 884my$bytesToRead=$bytesLeft<1024?$bytesLeft:1024; 885my$read=read($in,$blob,$bytesToRead,$bytesRead); 886unless(defined($read)) { 887$self->_close_cat_blob(); 888 throw Error::Simple("in pipe went bad"); 889} 890 891$bytesRead+=$read; 892} 893 894# Skip past the trailing newline. 895my$newline; 896my$read=read($in,$newline,1); 897unless(defined($read)) { 898$self->_close_cat_blob(); 899 throw Error::Simple("in pipe went bad"); 900} 901unless($read==1&&$newlineeq"\n") { 902$self->_close_cat_blob(); 903 throw Error::Simple("didn't find newline after blob"); 904} 905 906unless(print$fh $blob) { 907$self->_close_cat_blob(); 908 throw Error::Simple("couldn't write to passed in filehandle"); 909} 910 911return$size; 912} 913 914sub _open_cat_blob_if_needed { 915my($self) =@_; 916 917return ifdefined($self->{cat_blob_pid}); 918 919($self->{cat_blob_pid},$self->{cat_blob_in}, 920$self->{cat_blob_out},$self->{cat_blob_ctx}) = 921 command_bidi_pipe(qw(cat-file --batch)); 922} 923 924sub _close_cat_blob { 925my($self) =@_; 926 927return unlessdefined($self->{cat_blob_pid}); 928 929my@vars=map{'cat_blob_'.$_}qw(pid in out ctx); 930 931 command_close_bidi_pipe($self->{@vars}); 932delete$self->{@vars}; 933} 934 935=back 936 937=head1 ERROR HANDLING 938 939All functions are supposed to throw Perl exceptions in case of errors. 940See the L<Error> module on how to catch those. Most exceptions are mere 941L<Error::Simple> instances. 942 943However, the C<command()>, C<command_oneline()> and C<command_noisy()> 944functions suite can throw C<Git::Error::Command> exceptions as well: those are 945thrown when the external command returns an error code and contain the error 946code as well as access to the captured command's output. The exception class 947provides the usual C<stringify> and C<value> (command's exit code) methods and 948in addition also a C<cmd_output> method that returns either an array or a 949string with the captured command output (depending on the original function 950call context; C<command_noisy()> returns C<undef>) and $<cmdline> which 951returns the command and its arguments (but without proper quoting). 952 953Note that the C<command_*_pipe()> functions cannot throw this exception since 954it has no idea whether the command failed or not. You will only find out 955at the time you C<close> the pipe; if you want to have that automated, 956use C<command_close_pipe()>, which can throw the exception. 957 958=cut 959 960{ 961package Git::Error::Command; 962 963@Git::Error::Command::ISA =qw(Error); 964 965sub new { 966my$self=shift; 967my$cmdline=''.shift; 968my$value=0+shift; 969my$outputref=shift; 970my(@args) = (); 971 972local$Error::Depth =$Error::Depth +1; 973 974push(@args,'-cmdline',$cmdline); 975push(@args,'-value',$value); 976push(@args,'-outputref',$outputref); 977 978$self->SUPER::new(-text =>'command returned error',@args); 979} 980 981sub stringify { 982my$self=shift; 983my$text=$self->SUPER::stringify; 984$self->cmdline() .': '.$text.': '.$self->value() ."\n"; 985} 986 987sub cmdline { 988my$self=shift; 989$self->{'-cmdline'}; 990} 991 992sub cmd_output { 993my$self=shift; 994my$ref=$self->{'-outputref'}; 995defined$refor undef; 996if(ref$refeq'ARRAY') { 997return@$ref; 998}else{# SCALAR 999return$$ref;1000}1001}1002}10031004=over 410051006=item git_cmd_try { CODE } ERRMSG10071008This magical statement will automatically catch any C<Git::Error::Command>1009exceptions thrown by C<CODE> and make your program die with C<ERRMSG>1010on its lips; the message will have %s substituted for the command line1011and %d for the exit status. This statement is useful mostly for producing1012more user-friendly error messages.10131014In case of no exception caught the statement returns C<CODE>'s return value.10151016Note that this is the only auto-exported function.10171018=cut10191020sub git_cmd_try(&$) {1021my($code,$errmsg) =@_;1022my@result;1023my$err;1024my$array=wantarray;1025try{1026if($array) {1027@result= &$code;1028}else{1029$result[0] = &$code;1030}1031} catch Git::Error::Command with {1032my$E=shift;1033$err=$errmsg;1034$err=~s/\%s/$E->cmdline()/ge;1035$err=~s/\%d/$E->value()/ge;1036# We can't croak here since Error.pm would mangle1037# that to Error::Simple.1038};1039$errand croak $err;1040return$array?@result:$result[0];1041}104210431044=back10451046=head1 COPYRIGHT10471048Copyright 2006 by Petr Baudis E<lt>pasky@suse.czE<gt>.10491050This module is free software; it may be used, copied, modified1051and distributed under the terms of the GNU General Public Licence,1052either version 2, or (at your option) any later version.10531054=cut105510561057# Take raw method argument list and return ($obj, @args) in case1058# the method was called upon an instance and (undef, @args) if1059# it was called directly.1060sub _maybe_self {1061# This breaks inheritance. Oh well.1062ref$_[0]eq'Git'?@_: (undef,@_);1063}10641065# Check if the command id is something reasonable.1066sub _check_valid_cmd {1067my($cmd) =@_;1068$cmd=~/^[a-z0-9A-Z_-]+$/or throw Error::Simple("bad command:$cmd");1069}10701071# Common backend for the pipe creators.1072sub _command_common_pipe {1073my$direction=shift;1074my($self,@p) = _maybe_self(@_);1075my(%opts,$cmd,@args);1076if(ref$p[0]) {1077($cmd,@args) = @{shift@p};1078%opts=ref$p[0] ? %{$p[0]} :@p;1079}else{1080($cmd,@args) =@p;1081}1082 _check_valid_cmd($cmd);10831084my$fh;1085if($^Oeq'MSWin32') {1086# ActiveState Perl1087#defined $opts{STDERR} and1088# warn 'ignoring STDERR option - running w/ ActiveState';1089$directioneq'-|'or1090die'input pipe for ActiveState not implemented';1091# the strange construction with *ACPIPE is just to1092# explain the tie below that we want to bind to1093# a handle class, not scalar. It is not known if1094# it is something specific to ActiveState Perl or1095# just a Perl quirk.1096 tie (*ACPIPE,'Git::activestate_pipe',$cmd,@args);1097$fh= *ACPIPE;10981099}else{1100my$pid=open($fh,$direction);1101if(not defined$pid) {1102 throw Error::Simple("open failed:$!");1103}elsif($pid==0) {1104if(defined$opts{STDERR}) {1105close STDERR;1106}1107if($opts{STDERR}) {1108open(STDERR,'>&',$opts{STDERR})1109or die"dup failed:$!";1110}1111 _cmd_exec($self,$cmd,@args);1112}1113}1114returnwantarray? ($fh,join(' ',$cmd,@args)) :$fh;1115}11161117# When already in the subprocess, set up the appropriate state1118# for the given repository and execute the git command.1119sub _cmd_exec {1120my($self,@args) =@_;1121if($self) {1122$self->repo_path()and$ENV{'GIT_DIR'} =$self->repo_path();1123$self->wc_path()and chdir($self->wc_path());1124$self->wc_subdir()and chdir($self->wc_subdir());1125}1126 _execv_git_cmd(@args);1127dieqq[exec "@args" failed:$!];1128}11291130# Execute the given Git command ($_[0]) with arguments ($_[1..])1131# by searching for it at proper places.1132sub _execv_git_cmd {exec('git',@_); }11331134# Close pipe to a subprocess.1135sub _cmd_close {1136my($fh,$ctx) =@_;1137if(not close$fh) {1138if($!) {1139# It's just close, no point in fatalities1140 carp "error closing pipe:$!";1141}elsif($?>>8) {1142# The caller should pepper this.1143 throw Git::Error::Command($ctx,$?>>8);1144}1145# else we might e.g. closed a live stream; the command1146# dying of SIGPIPE would drive us here.1147}1148}114911501151sub DESTROY {1152my($self) =@_;1153$self->_close_hash_and_insert_object();1154$self->_close_cat_blob();1155}115611571158# Pipe implementation for ActiveState Perl.11591160package Git::activestate_pipe;1161use strict;11621163sub TIEHANDLE {1164my($class,@params) =@_;1165# FIXME: This is probably horrible idea and the thing will explode1166# at the moment you give it arguments that require some quoting,1167# but I have no ActiveState clue... --pasky1168# Let's just hope ActiveState Perl does at least the quoting1169# correctly.1170my@data=qx{git@params};1171bless{ i =>0, data => \@data},$class;1172}11731174sub READLINE {1175my$self=shift;1176if($self->{i} >=scalar@{$self->{data}}) {1177returnundef;1178}1179my$i=$self->{i};1180if(wantarray) {1181$self->{i} =$#{$self->{'data'}} +1;1182returnsplice(@{$self->{'data'}},$i);1183}1184$self->{i} =$i+1;1185return$self->{'data'}->[$i];1186}11871188sub CLOSE {1189my$self=shift;1190delete$self->{data};1191delete$self->{i};1192}11931194sub EOF {1195my$self=shift;1196return($self->{i} >=scalar@{$self->{data}});1197}1198119912001;# Famous last words