summaryrefslogtreecommitdiffstats
path: root/lib/Devscripts/Salsa/update_repo.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Devscripts/Salsa/update_repo.pm')
-rw-r--r--lib/Devscripts/Salsa/update_repo.pm132
1 files changed, 132 insertions, 0 deletions
diff --git a/lib/Devscripts/Salsa/update_repo.pm b/lib/Devscripts/Salsa/update_repo.pm
new file mode 100644
index 0000000..03ef333
--- /dev/null
+++ b/lib/Devscripts/Salsa/update_repo.pm
@@ -0,0 +1,132 @@
+# Updates repositories
+package Devscripts::Salsa::update_repo;
+
+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_repo can't be launched when -i is set, use update_safe";
+ return 1;
+ }
+ unless (@reponames or $self->config->all) {
+ ds_warn "Repository name is missing";
+ return 1;
+ }
+ if (@reponames and $self->config->all) {
+ ds_warn "--all with a reponame makes no sense";
+ return 1;
+ }
+ return $self->_update_repo(@reponames);
+}
+
+sub _update_repo {
+ my ($self, @reponames) = @_;
+ my $res = 0;
+ # Common options
+ my $configparams = { wiki_enabled => 0, };
+ # visibility can be modified only by group owners
+ $configparams->{visibility} = 'public'
+ if $self->access_level >= $GITLAB_ACCESS_LEVEL_OWNER;
+ # get repo 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) {
+ ds_verbose "Configuring $repo->[1]";
+ my $id = $repo->[0];
+ my $str = $repo->[1];
+ eval {
+ # apply new parameters
+ $self->api->edit_project($id,
+ { %$configparams, $self->desc($repo->[1]) });
+ # add hooks if needed
+ $str =~ s#^.*/##;
+ $self->add_hooks($id, $str);
+ };
+ if ($@) {
+ $res++;
+ if ($self->config->no_fail) {
+ ds_verbose $@;
+ ds_warn
+"update_repo has failed for $repo->[1]. Use --verbose to see errors\n";
+ next;
+ } else {
+ ds_warn $@;
+ return 1;
+ }
+ } 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 ($@) {
+ $res++;
+ if ($self->config->no_fail) {
+ ds_verbose $@;
+ ds_warn
+"Branch rename has failed for $repo->[1]. Use --verbose to see errors\n";
+ next;
+ } else {
+ ds_warn $@;
+ return 1;
+ }
+ }
+ } 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->group_member($self->group_id, $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->{access_level};
+ }
+ return $GITLAB_ACCESS_LEVEL_OWNER;
+}
+
+1;