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