Verified Commit f271c1e5 authored by Roman Lacko's avatar Roman Lacko
Browse files

GitLab::API: Add a RAII-style guard for sudo()

parent 2d180d3f
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ use URI::Escape;
use URI::QueryParam;

use GitLab::API::Cache;
use GitLab::API::Guard;
use GitLab::API::Iterator;

use parent "Exporter";
@@ -123,7 +124,7 @@ sub new {
}

sub sudo {
    my ($self, $who) = @_;
    my ($self, $who, $code) = @_;

    carp "Using sudo() without administrator privileges"
        if defined $who && !$self->is_admin;
@@ -132,7 +133,11 @@ sub sudo {
    $self->http->default_header(Sudo => $who);
    $self->{impersonate} = $who;

    return; # don't return default_header's output
    return if !defined $who || (!defined wantarray && !defined $code);

    my $guard = GitLab::API::Guard->new(sub { $self->sudo(undef); });
    return $code->() if defined $code;
    return $guard;
}

sub http     { return shift->{http};     }

GitLab/API/Guard.pm

0 → 100644
+13 −0
Original line number Diff line number Diff line
package GitLab::API::Guard;

sub new {
    my ($class, $clean) = @_;
    bless { _clean => $clean }, $class;
}

sub DESTROY {
    my ($self) = @_;
    $self->{_clean}->() if defined $self->{_clean};
}

1;