9da15e9c8c208ffd6a51b524edc828c85dce5355
   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=cut
  43
  44
  45require Exporter;
  46
  47@ISA = qw(Exporter);
  48
  49@EXPORT = qw(git_cmd_try);
  50
  51# Methods which can be called as standalone functions as well:
  52@EXPORT_OK = qw(command command_oneline command_noisy
  53                command_output_pipe command_input_pipe command_close_pipe
  54                version exec_path hash_object git_cmd_try);
  55
  56
  57=head1 DESCRIPTION
  58
  59This module provides Perl scripts easy way to interface the Git version control
  60system. The modules have an easy and well-tested way to call arbitrary Git
  61commands; in the future, the interface will also provide specialized methods
  62for doing easily operations which are not totally trivial to do over
  63the generic command interface.
  64
  65While some commands can be executed outside of any context (e.g. 'version'
  66or 'init-db'), most operations require a repository context, which in practice
  67means getting an instance of the Git object using the repository() constructor.
  68(In the future, we will also get a new_repository() constructor.) All commands
  69called as methods of the object are then executed in the context of the
  70repository.
  71
  72Part of the "repository state" is also information about path to the attached
  73working copy (unless you work with a bare repository). You can also navigate
  74inside of the working copy using the C<wc_chdir()> method. (Note that
  75the repository object is self-contained and will not change working directory
  76of your process.)
  77
  78TODO: In the future, we might also do
  79
  80        my $remoterepo = $repo->remote_repository (Name => 'cogito', Branch => 'master');
  81        $remoterepo ||= Git->remote_repository ('http://git.or.cz/cogito.git/');
  82        my @refs = $remoterepo->refs();
  83
  84Currently, the module merely wraps calls to external Git tools. In the future,
  85it will provide a much faster way to interact with Git by linking directly
  86to libgit. This should be completely opaque to the user, though (performance
  87increate nonwithstanding).
  88
  89=cut
  90
  91
  92use Carp qw(carp croak); # but croak is bad - throw instead
  93use Error qw(:try);
  94use Cwd qw(abs_path);
  95
  96require XSLoader;
  97XSLoader::load('Git', $VERSION);
  98
  99}
 100
 101my $instance_id = 0;
 102
 103
 104=head1 CONSTRUCTORS
 105
 106=over 4
 107
 108=item repository ( OPTIONS )
 109
 110=item repository ( DIRECTORY )
 111
 112=item repository ()
 113
 114Construct a new repository object.
 115C<OPTIONS> are passed in a hash like fashion, using key and value pairs.
 116Possible options are:
 117
 118B<Repository> - Path to the Git repository.
 119
 120B<WorkingCopy> - Path to the associated working copy; not strictly required
 121as many commands will happily crunch on a bare repository.
 122
 123B<WorkingSubdir> - Subdirectory in the working copy to work inside.
 124Just left undefined if you do not want to limit the scope of operations.
 125
 126B<Directory> - Path to the Git working directory in its usual setup.
 127The C<.git> directory is searched in the directory and all the parent
 128directories; if found, C<WorkingCopy> is set to the directory containing
 129it and C<Repository> to the C<.git> directory itself. If no C<.git>
 130directory was found, the C<Directory> is assumed to be a bare repository,
 131C<Repository> is set to point at it and C<WorkingCopy> is left undefined.
 132If the C<$GIT_DIR> environment variable is set, things behave as expected
 133as well.
 134
 135You should not use both C<Directory> and either of C<Repository> and
 136C<WorkingCopy> - the results of that are undefined.
 137
 138Alternatively, a directory path may be passed as a single scalar argument
 139to the constructor; it is equivalent to setting only the C<Directory> option
 140field.
 141
 142Calling the constructor with no options whatsoever is equivalent to
 143calling it with C<< Directory => '.' >>. In general, if you are building
 144a standard porcelain command, simply doing C<< Git->repository() >> should
 145do the right thing and setup the object to reflect exactly where the user
 146is right now.
 147
 148=cut
 149
 150sub repository {
 151        my $class = shift;
 152        my @args = @_;
 153        my %opts = ();
 154        my $self;
 155
 156        if (defined $args[0]) {
 157                if ($#args % 2 != 1) {
 158                        # Not a hash.
 159                        $#args == 0 or throw Error::Simple("bad usage");
 160                        %opts = ( Directory => $args[0] );
 161                } else {
 162                        %opts = @args;
 163                }
 164        }
 165
 166        if (not defined $opts{Repository} and not defined $opts{WorkingCopy}) {
 167                $opts{Directory} ||= '.';
 168        }
 169
 170        if ($opts{Directory}) {
 171                -d $opts{Directory} or throw Error::Simple("Directory not found: $!");
 172
 173                my $search = Git->repository(WorkingCopy => $opts{Directory});
 174                my $dir;
 175                try {
 176                        $dir = $search->command_oneline(['rev-parse', '--git-dir'],
 177                                                        STDERR => 0);
 178                } catch Git::Error::Command with {
 179                        $dir = undef;
 180                };
 181
 182                if ($dir) {
 183                        $dir =~ m#^/# or $dir = $opts{Directory} . '/' . $dir;
 184                        $opts{Repository} = $dir;
 185
 186                        # If --git-dir went ok, this shouldn't die either.
 187                        my $prefix = $search->command_oneline('rev-parse', '--show-prefix');
 188                        $dir = abs_path($opts{Directory}) . '/';
 189                        if ($prefix) {
 190                                if (substr($dir, -length($prefix)) ne $prefix) {
 191                                        throw Error::Simple("rev-parse confused me - $dir does not have trailing $prefix");
 192                                }
 193                                substr($dir, -length($prefix)) = '';
 194                        }
 195                        $opts{WorkingCopy} = $dir;
 196                        $opts{WorkingSubdir} = $prefix;
 197
 198                } else {
 199                        # A bare repository? Let's see...
 200                        $dir = $opts{Directory};
 201
 202                        unless (-d "$dir/refs" and -d "$dir/objects" and -e "$dir/HEAD") {
 203                                # Mimick git-rev-parse --git-dir error message:
 204                                throw Error::Simple('fatal: Not a git repository');
 205                        }
 206                        my $search = Git->repository(Repository => $dir);
 207                        try {
 208                                $search->command('symbolic-ref', 'HEAD');
 209                        } catch Git::Error::Command with {
 210                                # Mimick git-rev-parse --git-dir error message:
 211                                throw Error::Simple('fatal: Not a git repository');
 212                        }
 213
 214                        $opts{Repository} = abs_path($dir);
 215                }
 216
 217                delete $opts{Directory};
 218        }
 219
 220        $self = { opts => \%opts, id => $instance_id++ };
 221        bless $self, $class;
 222}
 223
 224
 225=back
 226
 227=head1 METHODS
 228
 229=over 4
 230
 231=item command ( COMMAND [, ARGUMENTS... ] )
 232
 233=item command ( [ COMMAND, ARGUMENTS... ], { Opt => Val ... } )
 234
 235Execute the given Git C<COMMAND> (specify it without the 'git-'
 236prefix), optionally with the specified extra C<ARGUMENTS>.
 237
 238The second more elaborate form can be used if you want to further adjust
 239the command execution. Currently, only one option is supported:
 240
 241B<STDERR> - How to deal with the command's error output. By default (C<undef>)
 242it is delivered to the caller's C<STDERR>. A false value (0 or '') will cause
 243it to be thrown away. If you want to process it, you can get it in a filehandle
 244you specify, but you must be extremely careful; if the error output is not
 245very short and you want to read it in the same process as where you called
 246C<command()>, you are set up for a nice deadlock!
 247
 248The method can be called without any instance or on a specified Git repository
 249(in that case the command will be run in the repository context).
 250
 251In scalar context, it returns all the command output in a single string
 252(verbatim).
 253
 254In array context, it returns an array containing lines printed to the
 255command's stdout (without trailing newlines).
 256
 257In both cases, the command's stdin and stderr are the same as the caller's.
 258
 259=cut
 260
 261sub command {
 262        my ($fh, $ctx) = command_output_pipe(@_);
 263
 264        if (not defined wantarray) {
 265                # Nothing to pepper the possible exception with.
 266                _cmd_close($fh, $ctx);
 267
 268        } elsif (not wantarray) {
 269                local $/;
 270                my $text = <$fh>;
 271                try {
 272                        _cmd_close($fh, $ctx);
 273                } catch Git::Error::Command with {
 274                        # Pepper with the output:
 275                        my $E = shift;
 276                        $E->{'-outputref'} = \$text;
 277                        throw $E;
 278                };
 279                return $text;
 280
 281        } else {
 282                my @lines = <$fh>;
 283                chomp @lines;
 284                try {
 285                        _cmd_close($fh, $ctx);
 286                } catch Git::Error::Command with {
 287                        my $E = shift;
 288                        $E->{'-outputref'} = \@lines;
 289                        throw $E;
 290                };
 291                return @lines;
 292        }
 293}
 294
 295
 296=item command_oneline ( COMMAND [, ARGUMENTS... ] )
 297
 298=item command_oneline ( [ COMMAND, ARGUMENTS... ], { Opt => Val ... } )
 299
 300Execute the given C<COMMAND> in the same way as command()
 301does but always return a scalar string containing the first line
 302of the command's standard output.
 303
 304=cut
 305
 306sub command_oneline {
 307        my ($fh, $ctx) = command_output_pipe(@_);
 308
 309        my $line = <$fh>;
 310        defined $line and chomp $line;
 311        try {
 312                _cmd_close($fh, $ctx);
 313        } catch Git::Error::Command with {
 314                # Pepper with the output:
 315                my $E = shift;
 316                $E->{'-outputref'} = \$line;
 317                throw $E;
 318        };
 319        return $line;
 320}
 321
 322
 323=item command_output_pipe ( COMMAND [, ARGUMENTS... ] )
 324
 325=item command_output_pipe ( [ COMMAND, ARGUMENTS... ], { Opt => Val ... } )
 326
 327Execute the given C<COMMAND> in the same way as command()
 328does but return a pipe filehandle from which the command output can be
 329read.
 330
 331The function can return C<($pipe, $ctx)> in array context.
 332See C<command_close_pipe()> for details.
 333
 334=cut
 335
 336sub command_output_pipe {
 337        _command_common_pipe('-|', @_);
 338}
 339
 340
 341=item command_input_pipe ( COMMAND [, ARGUMENTS... ] )
 342
 343=item command_input_pipe ( [ COMMAND, ARGUMENTS... ], { Opt => Val ... } )
 344
 345Execute the given C<COMMAND> in the same way as command_output_pipe()
 346does but return an input pipe filehandle instead; the command output
 347is not captured.
 348
 349The function can return C<($pipe, $ctx)> in array context.
 350See C<command_close_pipe()> for details.
 351
 352=cut
 353
 354sub command_input_pipe {
 355        _command_common_pipe('|-', @_);
 356}
 357
 358
 359=item command_close_pipe ( PIPE [, CTX ] )
 360
 361Close the C<PIPE> as returned from C<command_*_pipe()>, checking
 362whether the command finished successfuly. The optional C<CTX> argument
 363is required if you want to see the command name in the error message,
 364and it is the second value returned by C<command_*_pipe()> when
 365called in array context. The call idiom is:
 366
 367        my ($fh, $ctx) = $r->command_output_pipe('status');
 368        while (<$fh>) { ... }
 369        $r->command_close_pipe($fh, $ctx);
 370
 371Note that you should not rely on whatever actually is in C<CTX>;
 372currently it is simply the command name but in future the context might
 373have more complicated structure.
 374
 375=cut
 376
 377sub command_close_pipe {
 378        my ($self, $fh, $ctx) = _maybe_self(@_);
 379        $ctx ||= '<unknown>';
 380        _cmd_close($fh, $ctx);
 381}
 382
 383
 384=item command_noisy ( COMMAND [, ARGUMENTS... ] )
 385
 386Execute the given C<COMMAND> in the same way as command() does but do not
 387capture the command output - the standard output is not redirected and goes
 388to the standard output of the caller application.
 389
 390While the method is called command_noisy(), you might want to as well use
 391it for the most silent Git commands which you know will never pollute your
 392stdout but you want to avoid the overhead of the pipe setup when calling them.
 393
 394The function returns only after the command has finished running.
 395
 396=cut
 397
 398sub command_noisy {
 399        my ($self, $cmd, @args) = _maybe_self(@_);
 400        _check_valid_cmd($cmd);
 401
 402        my $pid = fork;
 403        if (not defined $pid) {
 404                throw Error::Simple("fork failed: $!");
 405        } elsif ($pid == 0) {
 406                _cmd_exec($self, $cmd, @args);
 407        }
 408        if (waitpid($pid, 0) > 0 and $?>>8 != 0) {
 409                throw Git::Error::Command(join(' ', $cmd, @args), $? >> 8);
 410        }
 411}
 412
 413
 414=item version ()
 415
 416Return the Git version in use.
 417
 418Implementation of this function is very fast; no external command calls
 419are involved.
 420
 421=cut
 422
 423# Implemented in Git.xs.
 424
 425
 426=item exec_path ()
 427
 428Return path to the Git sub-command executables (the same as
 429C<git --exec-path>). Useful mostly only internally.
 430
 431Implementation of this function is very fast; no external command calls
 432are involved.
 433
 434=cut
 435
 436# Implemented in Git.xs.
 437
 438
 439=item repo_path ()
 440
 441Return path to the git repository. Must be called on a repository instance.
 442
 443=cut
 444
 445sub repo_path { $_[0]->{opts}->{Repository} }
 446
 447
 448=item wc_path ()
 449
 450Return path to the working copy. Must be called on a repository instance.
 451
 452=cut
 453
 454sub wc_path { $_[0]->{opts}->{WorkingCopy} }
 455
 456
 457=item wc_subdir ()
 458
 459Return path to the subdirectory inside of a working copy. Must be called
 460on a repository instance.
 461
 462=cut
 463
 464sub wc_subdir { $_[0]->{opts}->{WorkingSubdir} ||= '' }
 465
 466
 467=item wc_chdir ( SUBDIR )
 468
 469Change the working copy subdirectory to work within. The C<SUBDIR> is
 470relative to the working copy root directory (not the current subdirectory).
 471Must be called on a repository instance attached to a working copy
 472and the directory must exist.
 473
 474=cut
 475
 476sub wc_chdir {
 477        my ($self, $subdir) = @_;
 478        $self->wc_path()
 479                or throw Error::Simple("bare repository");
 480
 481        -d $self->wc_path().'/'.$subdir
 482                or throw Error::Simple("subdir not found: $!");
 483        # Of course we will not "hold" the subdirectory so anyone
 484        # can delete it now and we will never know. But at least we tried.
 485
 486        $self->{opts}->{WorkingSubdir} = $subdir;
 487}
 488
 489
 490=item config ( VARIABLE )
 491
 492Retrieve the configuration C<VARIABLE> in the same manner as C<repo-config>
 493does. In scalar context requires the variable to be set only one time
 494(exception is thrown otherwise), in array context returns allows the
 495variable to be set multiple times and returns all the values.
 496
 497Must be called on a repository instance.
 498
 499This currently wraps command('repo-config') so it is not so fast.
 500
 501=cut
 502
 503sub config {
 504        my ($self, $var) = @_;
 505        $self->repo_path()
 506                or throw Error::Simple("not a repository");
 507
 508        try {
 509                if (wantarray) {
 510                        return $self->command('repo-config', '--get-all', $var);
 511                } else {
 512                        return $self->command_oneline('repo-config', '--get', $var);
 513                }
 514        } catch Git::Error::Command with {
 515                my $E = shift;
 516                if ($E->value() == 1) {
 517                        # Key not found.
 518                        return undef;
 519                } else {
 520                        throw $E;
 521                }
 522        };
 523}
 524
 525
 526=item ident ( TYPE | IDENTSTR )
 527
 528=item ident_person ( TYPE | IDENTSTR | IDENTARRAY )
 529
 530This suite of functions retrieves and parses ident information, as stored
 531in the commit and tag objects or produced by C<var GIT_type_IDENT> (thus
 532C<TYPE> can be either I<author> or I<committer>; case is insignificant).
 533
 534The C<ident> method retrieves the ident information from C<git-var>
 535and either returns it as a scalar string or as an array with the fields parsed.
 536Alternatively, it can take a prepared ident string (e.g. from the commit
 537object) and just parse it.
 538
 539C<ident_person> returns the person part of the ident - name and email;
 540it can take the same arguments as C<ident> or the array returned by C<ident>.
 541
 542The synopsis is like:
 543
 544        my ($name, $email, $time_tz) = ident('author');
 545        "$name <$email>" eq ident_person('author');
 546        "$name <$email>" eq ident_person($name);
 547        $time_tz =~ /^\d+ [+-]\d{4}$/;
 548
 549Both methods must be called on a repository instance.
 550
 551=cut
 552
 553sub ident {
 554        my ($self, $type) = @_;
 555        my $identstr;
 556        if (lc $type eq lc 'committer' or lc $type eq lc 'author') {
 557                $identstr = $self->command_oneline('var', 'GIT_'.uc($type).'_IDENT');
 558        } else {
 559                $identstr = $type;
 560        }
 561        if (wantarray) {
 562                return $identstr =~ /^(.*) <(.*)> (\d+ [+-]\d{4})$/;
 563        } else {
 564                return $identstr;
 565        }
 566}
 567
 568sub ident_person {
 569        my ($self, @ident) = @_;
 570        $#ident == 0 and @ident = $self->ident($ident[0]);
 571        return "$ident[0] <$ident[1]>";
 572}
 573
 574
 575=item hash_object ( TYPE, FILENAME )
 576
 577=item hash_object ( TYPE, FILEHANDLE )
 578
 579Compute the SHA1 object id of the given C<FILENAME> (or data waiting in
 580C<FILEHANDLE>) considering it is of the C<TYPE> object type (C<blob>,
 581C<commit>, C<tree>).
 582
 583In case of C<FILEHANDLE> passed instead of file name, all the data
 584available are read and hashed, and the filehandle is automatically
 585closed. The file handle should be freshly opened - if you have already
 586read anything from the file handle, the results are undefined (since
 587this function works directly with the file descriptor and internal
 588PerlIO buffering might have messed things up).
 589
 590The method can be called without any instance or on a specified Git repository,
 591it makes zero difference.
 592
 593The function returns the SHA1 hash.
 594
 595Implementation of this function is very fast; no external command calls
 596are involved.
 597
 598=cut
 599
 600sub hash_object {
 601        my ($self, $type, $file) = _maybe_self(@_);
 602
 603        # hash_object_* implemented in Git.xs.
 604
 605        if (ref($file) eq 'GLOB') {
 606                my $hash = hash_object_pipe($type, fileno($file));
 607                close $file;
 608                return $hash;
 609        } else {
 610                hash_object_file($type, $file);
 611        }
 612}
 613
 614
 615
 616=back
 617
 618=head1 ERROR HANDLING
 619
 620All functions are supposed to throw Perl exceptions in case of errors.
 621See the L<Error> module on how to catch those. Most exceptions are mere
 622L<Error::Simple> instances.
 623
 624However, the C<command()>, C<command_oneline()> and C<command_noisy()>
 625functions suite can throw C<Git::Error::Command> exceptions as well: those are
 626thrown when the external command returns an error code and contain the error
 627code as well as access to the captured command's output. The exception class
 628provides the usual C<stringify> and C<value> (command's exit code) methods and
 629in addition also a C<cmd_output> method that returns either an array or a
 630string with the captured command output (depending on the original function
 631call context; C<command_noisy()> returns C<undef>) and $<cmdline> which
 632returns the command and its arguments (but without proper quoting).
 633
 634Note that the C<command_*_pipe()> functions cannot throw this exception since
 635it has no idea whether the command failed or not. You will only find out
 636at the time you C<close> the pipe; if you want to have that automated,
 637use C<command_close_pipe()>, which can throw the exception.
 638
 639=cut
 640
 641{
 642        package Git::Error::Command;
 643
 644        @Git::Error::Command::ISA = qw(Error);
 645
 646        sub new {
 647                my $self = shift;
 648                my $cmdline = '' . shift;
 649                my $value = 0 + shift;
 650                my $outputref = shift;
 651                my(@args) = ();
 652
 653                local $Error::Depth = $Error::Depth + 1;
 654
 655                push(@args, '-cmdline', $cmdline);
 656                push(@args, '-value', $value);
 657                push(@args, '-outputref', $outputref);
 658
 659                $self->SUPER::new(-text => 'command returned error', @args);
 660        }
 661
 662        sub stringify {
 663                my $self = shift;
 664                my $text = $self->SUPER::stringify;
 665                $self->cmdline() . ': ' . $text . ': ' . $self->value() . "\n";
 666        }
 667
 668        sub cmdline {
 669                my $self = shift;
 670                $self->{'-cmdline'};
 671        }
 672
 673        sub cmd_output {
 674                my $self = shift;
 675                my $ref = $self->{'-outputref'};
 676                defined $ref or undef;
 677                if (ref $ref eq 'ARRAY') {
 678                        return @$ref;
 679                } else { # SCALAR
 680                        return $$ref;
 681                }
 682        }
 683}
 684
 685=over 4
 686
 687=item git_cmd_try { CODE } ERRMSG
 688
 689This magical statement will automatically catch any C<Git::Error::Command>
 690exceptions thrown by C<CODE> and make your program die with C<ERRMSG>
 691on its lips; the message will have %s substituted for the command line
 692and %d for the exit status. This statement is useful mostly for producing
 693more user-friendly error messages.
 694
 695In case of no exception caught the statement returns C<CODE>'s return value.
 696
 697Note that this is the only auto-exported function.
 698
 699=cut
 700
 701sub git_cmd_try(&$) {
 702        my ($code, $errmsg) = @_;
 703        my @result;
 704        my $err;
 705        my $array = wantarray;
 706        try {
 707                if ($array) {
 708                        @result = &$code;
 709                } else {
 710                        $result[0] = &$code;
 711                }
 712        } catch Git::Error::Command with {
 713                my $E = shift;
 714                $err = $errmsg;
 715                $err =~ s/\%s/$E->cmdline()/ge;
 716                $err =~ s/\%d/$E->value()/ge;
 717                # We can't croak here since Error.pm would mangle
 718                # that to Error::Simple.
 719        };
 720        $err and croak $err;
 721        return $array ? @result : $result[0];
 722}
 723
 724
 725=back
 726
 727=head1 COPYRIGHT
 728
 729Copyright 2006 by Petr Baudis E<lt>pasky@suse.czE<gt>.
 730
 731This module is free software; it may be used, copied, modified
 732and distributed under the terms of the GNU General Public Licence,
 733either version 2, or (at your option) any later version.
 734
 735=cut
 736
 737
 738# Take raw method argument list and return ($obj, @args) in case
 739# the method was called upon an instance and (undef, @args) if
 740# it was called directly.
 741sub _maybe_self {
 742        # This breaks inheritance. Oh well.
 743        ref $_[0] eq 'Git' ? @_ : (undef, @_);
 744}
 745
 746# Check if the command id is something reasonable.
 747sub _check_valid_cmd {
 748        my ($cmd) = @_;
 749        $cmd =~ /^[a-z0-9A-Z_-]+$/ or throw Error::Simple("bad command: $cmd");
 750}
 751
 752# Common backend for the pipe creators.
 753sub _command_common_pipe {
 754        my $direction = shift;
 755        my ($self, @p) = _maybe_self(@_);
 756        my (%opts, $cmd, @args);
 757        if (ref $p[0]) {
 758                ($cmd, @args) = @{shift @p};
 759                %opts = ref $p[0] ? %{$p[0]} : @p;
 760        } else {
 761                ($cmd, @args) = @p;
 762        }
 763        _check_valid_cmd($cmd);
 764
 765        my $fh;
 766        if ($^O eq '##INSERT_ACTIVESTATE_STRING_HERE##') {
 767                # ActiveState Perl
 768                #defined $opts{STDERR} and
 769                #       warn 'ignoring STDERR option - running w/ ActiveState';
 770                $direction eq '-|' or
 771                        die 'input pipe for ActiveState not implemented';
 772                tie ($fh, 'Git::activestate_pipe', $cmd, @args);
 773
 774        } else {
 775                my $pid = open($fh, $direction);
 776                if (not defined $pid) {
 777                        throw Error::Simple("open failed: $!");
 778                } elsif ($pid == 0) {
 779                        if (defined $opts{STDERR}) {
 780                                close STDERR;
 781                        }
 782                        if ($opts{STDERR}) {
 783                                open (STDERR, '>&', $opts{STDERR})
 784                                        or die "dup failed: $!";
 785                        }
 786                        _cmd_exec($self, $cmd, @args);
 787                }
 788        }
 789        return wantarray ? ($fh, join(' ', $cmd, @args)) : $fh;
 790}
 791
 792# When already in the subprocess, set up the appropriate state
 793# for the given repository and execute the git command.
 794sub _cmd_exec {
 795        my ($self, @args) = @_;
 796        if ($self) {
 797                $self->repo_path() and $ENV{'GIT_DIR'} = $self->repo_path();
 798                $self->wc_path() and chdir($self->wc_path());
 799                $self->wc_subdir() and chdir($self->wc_subdir());
 800        }
 801        _execv_git_cmd(@args);
 802        die "exec failed: $!";
 803}
 804
 805# Execute the given Git command ($_[0]) with arguments ($_[1..])
 806# by searching for it at proper places.
 807# _execv_git_cmd(), implemented in Git.xs.
 808
 809# Close pipe to a subprocess.
 810sub _cmd_close {
 811        my ($fh, $ctx) = @_;
 812        if (not close $fh) {
 813                if ($!) {
 814                        # It's just close, no point in fatalities
 815                        carp "error closing pipe: $!";
 816                } elsif ($? >> 8) {
 817                        # The caller should pepper this.
 818                        throw Git::Error::Command($ctx, $? >> 8);
 819                }
 820                # else we might e.g. closed a live stream; the command
 821                # dying of SIGPIPE would drive us here.
 822        }
 823}
 824
 825
 826# Trickery for .xs routines: In order to avoid having some horrid
 827# C code trying to do stuff with undefs and hashes, we gate all
 828# xs calls through the following and in case we are being ran upon
 829# an instance call a C part of the gate which will set up the
 830# environment properly.
 831sub _call_gate {
 832        my $xsfunc = shift;
 833        my ($self, @args) = _maybe_self(@_);
 834
 835        if (defined $self) {
 836                # XXX: We ignore the WorkingCopy! To properly support
 837                # that will require heavy changes in libgit.
 838                # For now, when we will need to do it we could temporarily
 839                # chdir() there and then chdir() back after the call is done.
 840
 841                xs__call_gate($self->{id}, $self->repo_path());
 842        }
 843
 844        # Having to call throw from the C code is a sure path to insanity.
 845        local $SIG{__DIE__} = sub { throw Error::Simple("@_"); };
 846        &$xsfunc(@args);
 847}
 848
 849sub AUTOLOAD {
 850        my $xsname;
 851        our $AUTOLOAD;
 852        ($xsname = $AUTOLOAD) =~ s/.*:://;
 853        throw Error::Simple("&Git::$xsname not defined") if $xsname =~ /^xs_/;
 854        $xsname = 'xs_'.$xsname;
 855        _call_gate(\&$xsname, @_);
 856}
 857
 858sub DESTROY { }
 859
 860
 861# Pipe implementation for ActiveState Perl.
 862
 863package Git::activestate_pipe;
 864use strict;
 865
 866sub TIEHANDLE {
 867        my ($class, @params) = @_;
 868        # FIXME: This is probably horrible idea and the thing will explode
 869        # at the moment you give it arguments that require some quoting,
 870        # but I have no ActiveState clue... --pasky
 871        my $cmdline = join " ", @params;
 872        my @data = qx{$cmdline};
 873        bless { i => 0, data => \@data }, $class;
 874}
 875
 876sub READLINE {
 877        my $self = shift;
 878        if ($self->{i} >= scalar @{$self->{data}}) {
 879                return undef;
 880        }
 881        return $self->{'data'}->[ $self->{i}++ ];
 882}
 883
 884sub CLOSE {
 885        my $self = shift;
 886        delete $self->{data};
 887        delete $self->{i};
 888}
 889
 890sub EOF {
 891        my $self = shift;
 892        return ($self->{i} >= scalar @{$self->{data}});
 893}
 894
 895
 8961; # Famous last words