2
3
use strict;
4
use warnings;
5
+use autodie;
6
7
use Getopt::Long;
8
use File::Basename;
9
+use Git;
10
9
-my $VERSION = "0.1";
11
+my $VERSION = "0.2";
12
13
my %options = (
14
help => 0,
56
"insecure|k",
57
"verbose|v",
58
"file|f=s@",
59
+ 'gpg|g:s',
60
);
61
62
if ($options{help}) {
65
66
print <<EOHIPPUS;
67
65
-$0 [-f AUTHFILE1] [-f AUTHFILEN] [-d] [-v] [-k] get
68
+$0 [(-f <authfile>)...] [-g <program>] [-d] [-v] [-k] get
69
70
Version $VERSION by tzz\@lifelogs.com. License: BSD.
71
72
Options:
73
71
- -f|--file AUTHFILE : specify netrc-style files. Files with the .gpg extension
72
- will be decrypted by GPG before parsing. Multiple -f
73
- arguments are OK. They are processed in order, and the
74
- first matching entry found is returned via the credential
75
- helper protocol (see below).
74
+ -f|--file <authfile>: specify netrc-style files. Files with the .gpg
75
+ extension will be decrypted by GPG before parsing.
76
+ Multiple -f arguments are OK. They are processed in
77
+ order, and the first matching entry found is returned
78
+ via the credential helper protocol (see below).
79
77
- When no -f option is given, .authinfo.gpg, .netrc.gpg,
78
- .authinfo, and .netrc files in your home directory are used
79
- in this order.
80
+ When no -f option is given, .authinfo.gpg, .netrc.gpg,
81
+ .authinfo, and .netrc files in your home directory are
82
+ used in this order.
83
81
- -k|--insecure : ignore bad file ownership or permissions
84
+ -g|--gpg <program> : specify the program for GPG. By default, this is the
85
+ value of gpg.program in the git repository or global
86
+ option or gpg.
87
83
- -d|--debug : turn on debugging (developer info)
88
+ -k|--insecure : ignore bad file ownership or permissions
89
85
- -v|--verbose : be more verbose (show files and information found)
90
+ -d|--debug : turn on debugging (developer info)
91
+
92
+ -v|--verbose : be more verbose (show files and information found)
93
94
To enable this credential helper:
95
106
107
git config credential.helper '$shortname -f AUTHFILE -v'
108
102
-Only "get" mode is supported by this credential helper. It opens every AUTHFILE
103
-and looks for the first entry that matches the requested search criteria:
109
+Only "get" mode is supported by this credential helper. It opens every
110
+<authfile> and looks for the first entry that matches the requested search
111
+criteria:
112
113
'port|protocol':
114
The protocol that will be used (e.g., https). (protocol=X)
128
protocol=https
129
username=tzz
130
123
-this credential helper will look for the first entry in every AUTHFILE that
131
+this credential helper will look for the first entry in every <authfile> that
132
matches
133
134
machine github.com port https login tzz
145
back to "protocol". Any redundant entry tokens (part of the original query) are
146
skipped.
147
140
-Again, note that only the first matching entry from all the AUTHFILEs, processed
141
-in the sequence given on the command line, is used.
148
+Again, note that only the first matching entry from all the <authfile>s,
149
+processed in the sequence given on the command line, is used.
150
151
Netrc/authinfo tokens can be quoted as 'STRING' or "STRING".
152
160
my $mode = shift @ARGV;
161
162
# Credentials must get a parameter, so die if it's missing.
155
-die "Syntax: $0 [-f AUTHFILE1] [-f AUTHFILEN] [-d] get" unless defined $mode;
163
+die "Syntax: $0 [(-f <authfile>)...] [-d] get" unless defined $mode;
164
165
# Only support 'get' mode; with any other unsupported ones we just exit.
166
exit 0 unless $mode eq 'get';
180
$files = $options{file} = [ map { glob $_ } @candidates ];
181
}
182
183
+load_config(\%options);
184
+
185
my $query = read_credential_data_from_stdin();
186
187
FILE:
243
244
my $io;
245
if ($gpgmode) {
236
- my @cmd = (qw(gpg --decrypt), $file);
246
+ my @cmd = ($options{'gpg'}, qw(--decrypt), $file);
247
log_verbose("Using GPG to open $file: [@cmd]");
248
open $io, "-|", @cmd;
249
} else {
420
printf "%s=%s\n", $git_token, $entry->{$git_token};
421
}
422
}
423
+sub load_config {
424
+ # load settings from git config
425
+ my $options = shift;
426
+ # set from command argument, gpg.program option, or default to gpg
427
+ $options->{'gpg'} //= Git->repository()->config('gpg.program')
428
+ // 'gpg';
429
+ log_verbose("using $options{'gpg'} for GPG operations");
430
+}
431
sub log_verbose {
432
return unless $options{verbose};
433
printf STDERR @_;