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