—#!/usr/bin/env perl
use
strictures 2;
use
GitLab::API::v4;
use
JSON::MaybeXS;
use
Log::Any::Adapter;
use
Try::Tiny;
if
(!
@ARGV
) {
"USAGE: gitlab-api-v4 help\n"
;
exit
0;
}
my
$config
= GitLab::API::v4::Config->new();
$config
->get_options(
'a|all'
=> \
my
$all
,
'p|pretty'
=> \
my
$pretty
,
'c|canonical'
=> \
my
$canonical
,
'h|help'
=> \
my
$help
,
'v|verbose'
=> \
my
$verbose
,
'q|quiet'
=> \
my
$quiet
,
);
if
(
$help
or (
@ARGV
and
$ARGV
[0] eq
'help'
)) {
pod2usage(
-verbose
=> 2 );
exit
0;
}
if
(
@ARGV
and
$ARGV
[0] eq
'configure'
) {
$config
->configure();
exit
0;
}
my
$min_level
=
'info'
;
$min_level
=
'trace'
if
$verbose
;
$min_level
=
'error'
if
$quiet
;
Log::Any::Adapter->set(
'Screen'
,
min_level
=>
$min_level
,
stderr
=> 1,
);
my
$method
=
shift
@ARGV
;
die
"ERROR: No API method specified.\n"
if
!
$method
;
my
$orig_method
=
$method
;
$method
=~ s{-}{_}g;
die
"ERROR: Unknown API method \"$orig_method\".\n"
if
!GitLab::API::v4->can(
$method
);
my
@args
;
while
(
@ARGV
and
$ARGV
[0] !~ m{:}) {
my
$arg
=
shift
@ARGV
;
next
if
$arg
eq
'--'
;
push
@args
,
$arg
;
}
my
$aliases
= {
access_level
=> {
guest
=>
$GITLAB_ACCESS_LEVEL_GUEST
,
reporter
=>
$GITLAB_ACCESS_LEVEL_REPORTER
,
developer
=>
$GITLAB_ACCESS_LEVEL_DEVELOPER
,
master
=>
$GITLAB_ACCESS_LEVEL_MASTER
,
owner
=>
$GITLAB_ACCESS_LEVEL_OWNER
,
},
};
my
$params
= {};
while
(
@ARGV
) {
my
$arg
=
shift
@ARGV
;
next
if
$arg
eq
'--'
;
if
(
$arg
=~ m{^([^:]+):(.*)$}s) {
my
(
$key
,
$value
) = ($1, $2);
$key
=~ s{-}{_}g;
if
(
$aliases
->{
$key
} and
exists
$aliases
->{
$key
}->{
$value
}) {
$value
=
$aliases
->{
$key
}->{
$value
};
}
$params
->{
$key
} =
$value
;
}
else
{
die
"ERROR: Invalid API parameter \"$arg\".\n"
;
}
}
# Make sure we don't leak tokens in the logs.
my
$debug_config
= { %{
$config
->args() } };
$debug_config
->{private_token} =
'xxxx'
if
$debug_config
->{private_token};
$debug_config
->{access_token} =
'xxxx'
if
$debug_config
->{access_token};
$log
->debug(
'config: '
. encode_json(
$debug_config
));
$log
->debug(
"method: $method"
);
$log
->debug(
'arguments: '
. encode_json(\
@args
));
$log
->debug(
'params: '
. encode_json(
$params
));
my
$api
= GitLab::API::v4->new(
$config
->args() );
if
(
$all
) {
unshift
@args
,
$method
;
$method
=
'paginator'
;
}
my
$data
=
$api
->
$method
(
@args
,
%$params
?
$params
: (),
);
$data
=
$data
->all()
if
$all
;
binmode
STDOUT,
':utf8'
;
my
$json
= JSON::MaybeXS->new(
allow_nonref
=> 1);
$json
->pretty()
if
$pretty
;
$json
->canonical()
if
$canonical
;
$json
->encode(
$data
);
__END__
=encoding utf8
=head1 NAME
gitlab-api-v4 - Command line interface to the GitLab API v4.
=head1 SYNOPSIS
# Generally:
gitlab-api-v4 [<options>] <method> [<arg> ...] [<param>:<value> ...]
# List all groups:
gitlab-api-v4 groups
# List information about a project:
gitlab-api-v4 project <project_id>
# Create an admin user:
gitlab-api-v4 create-user \
username:foo \
password:xxxxxxxx \
email:user@example.com \
"name:Foo Smith" \
admin:1
=head1 CONFIGURING
You may configure this module with environment variables, command line options,
and a configuration file. To setup the configuration file run:
gitlab-api-v4 configure
This will ask several interactive questions to help you configure this script.
The information, which may include GitLab authentication tokens, is stored in
C<~/.gitlab-api-v4.json>.
Read more at L<GitLab::API::v4::Config>.
=head1 OPTIONS
=head2 url
--url=<url>
Sets L<GitLab::API::v4/url>.
=head2 access-token
--access-token=<token>
Sets L<GitLab::API::v4/access_token>.
=head2 private-token
--private-token=<token>
Sets L<GitLab::API::v4/private_token>.
=head2 retries
--retries=<count>
Sets L<GitLab::API::v4/retries>.
=head2 all
--all
-a
Retrieves all results when the results would normally be paged.
See L<GitLab::API::v4::Paginator/all> for details.
=head2 pretty
--pretty
-p
Enables the L<JSON::PP/pretty> feature.
=head2 canonical
--canonical
-c
Enables the L<JSON::PP/canonical> feature.
=head1 API METHOD
<method>
The API method to call - one of the methods documented in
L<GitLab::API::v4/API METHODS>.
=head1 API ARGUMENTS
<arg> ...
Any arguments that the L</API METHOD> requires.
=head1 API PARAMETERS
<param>:<value> ...
Any parameters that the L</API METHOD> accepts.
=head2 access-level
access-level:guest
access-level:reporter
access-level:developer
access-level:master
access-level:owner
There are mappings setup for the various C<access-level> parameters
so that you can, for example, specify C<access-level:guest> and it
will be automatically converted to C<access-level:10>.
=head1 SUPPORT
See L<GitLab::API::v4/SUPPORT>.
=head1 AUTHORS
See L<GitLab::API::v4/AUTHORS>.
=head1 COPYRIGHT AND LICENSE
See L<GitLab::API::v4/COPYRIGHT AND LICENSE>.
=cut