diff options
Diffstat (limited to 'lib/Devscripts/Salsa/update_repo.pm')
-rwxr-xr-x | lib/Devscripts/Salsa/update_repo.pm | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/lib/Devscripts/Salsa/update_repo.pm b/lib/Devscripts/Salsa/update_repo.pm new file mode 100755 index 0000000..6615d79 --- /dev/null +++ b/lib/Devscripts/Salsa/update_repo.pm @@ -0,0 +1,137 @@ +# Updates projects +package Devscripts::Salsa::update_repo; # update_projects + +use strict; +use Devscripts::Output; +use GitLab::API::v4::Constants qw(:all); +use Moo::Role; + +with "Devscripts::Salsa::Repo"; + +our $prompt = 1; + +sub update_repo { + my ($self, @reponames) = @_; + if ($ds_yes < 0 and $self->config->command eq 'update_repo') { + ds_warn +"update_projects can't be launched when --info is set, use update_safe"; + return 1; + } + unless (@reponames or $self->config->all or $self->config->all_archived) { + ds_warn "Usage $0 update_projects <--all|--all-archived|names>"; + return 1; + } + if (@reponames and $self->config->all) { + ds_warn "--all with a project name makes no sense"; + return 1; + } + if (@reponames and $self->config->all_archived) { + ds_warn "--all-archived with a project name makes no sense"; + return 1; + } + return $self->_update_repo(@reponames); +} + +sub _update_repo { + my ($self, @reponames) = @_; + my $res = 0; + # Common options + my $configparams = {}; + # visibility can be modified only by group owners + $configparams->{visibility} = 'public' + if $self->access_level >= $GITLAB_ACCESS_LEVEL_OWNER; + # get project list using Devscripts::Salsa::Repo + my @repos = $self->get_repo($prompt, @reponames); + return @repos unless (ref $repos[0]); # get_repo returns 1 when fails + foreach my $repo (@repos) { + my $id = $repo->[0]; + my $str = $repo->[1]; + ds_verbose "Configuring $str"; + eval { + # apply new parameters + $self->api->edit_project($id, + { %$configparams, $self->desc($str) }); + # Set project avatar + my @avatar_file = $self->desc_multipart($str); + $self->api->edit_project_multipart($id, {@avatar_file}) + if (@avatar_file and $self->config->avatar_path); + # add hooks if needed + $str =~ s#^.*/##; + $self->add_hooks($id, $str); + }; + if ($@) { + ds_warn "update_projects has failed for $str\n"; + ds_verbose $@; + $res++; + unless ($self->config->no_fail) { + ds_verbose "Use --no-fail to continue"; + return 1; + } + next; + } elsif ($self->config->rename_head) { + # 1 - creates new branch if --rename-head + my $project = $self->api->project($id); + if ($project->{default_branch} ne $self->config->dest_branch) { + eval { + $self->api->create_branch( + $id, + { + ref => $self->config->source_branch, + branch => $self->config->dest_branch, + }); + }; + if ($@) { + ds_debug $@ if ($@); + $project = undef; + } + + eval { + $self->api->edit_project($id, + { default_branch => $self->config->dest_branch }); + # delete old branch only if "create_branch" succeed + if ($project) { + $self->api->delete_branch($id, + $self->config->source_branch); + } + }; + if ($@) { + ds_warn "Branch rename has failed for $str\n"; + ds_verbose $@; + $res++; + unless ($self->config->no_fail) { + ds_verbose "Use --no-fail to continue"; + return 1; + } + next; + } + } else { + ds_verbose "Head already renamed for $str"; + } + } + ds_verbose "Project $str updated"; + } + return $res; +} + +sub access_level { + my ($self) = @_; + my $user_id = $self->api->current_user()->{id}; + if ($self->group_id) { + my $tmp = $self->api->all_group_members($self->group_id, + { user_ids => $user_id }); + unless ($tmp) { + my $members + = $self->api->paginator('all_group_members', $self->group_id, + { query => $user_id }); + while ($_ = $members->next) { + return $_->{access_level} if ($_->{id} eq $user_id); + } + ds_warn "You're not member of this group"; + return 0; + } + return $tmp->[0]->{access_level}; + } + return $GITLAB_ACCESS_LEVEL_OWNER; +} + +1; |