#!/usr/bin/env perl use strict; use warnings; use v5.10; use File::Basename; use utf8; use ACU::API::Projects; use ACU::API::Submission; use ACU::LDAP; use ACU::Log; $ACU::Log::log_file = "/var/log/hooks/" . basename($0) . ".log"; use ACU::Process; my $promo; my $id_project; my $repo_login; # First, extract information, from config then guess from repository adress if (my $tmp = `git config hooks.promo`) { chomp $tmp; $promo = $tmp; } if (my $tmp = `git config hooks.idproject`) { chomp $tmp; $id_project = $tmp; } if (my $tmp = `git config hooks.login`) { chomp $tmp; $repo_login = $tmp; } $promo = $1 if (!$promo && $ENV{'GL_REPO'} =~ m/([0-9]{4}).*/); $id_project = $1 if (!$id_project && $ENV{'GL_REPO'} =~ m/.*\/(.*)\//); $repo_login = $1 if (!$repo_login && $ENV{'GL_REPO'} =~ m/.*\/.*\/(.*)/); exit(0) if (!$promo || !$id_project || !$repo_login); for my $ref (@ARGV) { my $tag; if ($ref =~ m<^refs/tags/ACU-(.+)$>) { $tag = $1; } elsif ($ref =~ m<^refs/tags/(.+)$>) { $tag = $1; } else { next; } log DEBUG, "Tag $tag on repository $ENV{GL_REPO} from IP $ENV{'SSH_CLIENT'} updated."; my $project = get_project_info($tag); # Extract matching tag my @rendus = grep { exists $_->{vcs} and $_->{vcs}{tag} eq $tag; } @{ $project->{submissions} }; if (@rendus) { eval { Process::Client::launch("send_git", { "year" => $promo, "id" => $id_project, "rendu" => $tag, "login" => $repo_login, # "path" => "ssh://git\@localhost/".$ENV{GL_REPO}, # Optional }, undef, # Don't give any file 1 # Launch in background ); }; if ($@) { my $err = $@; log DEBUG, "ERROR: ".$err; } # Send data to API my $last_commit = `git log "refs/tags/$tag" -1 --decorate --tags`; eval { API::Submission::add($promo, $id_project, $tag, $repo_login, $last_commit); }; if ($@) { my $err = $@; log DEBUG, "ERROR: ".$err; log DONE, "Tag '$tag' effectué avec succès !"; } else { log DONE, "Tag '$tag' effectué avec succès ! Vérifiez-le sur l'intranet."; } } } exit 0; sub get_project_info { my $project; eval { $project = API::Projects::get($id_project, $promo); }; if ($@ or !$project) { my $err = $@; log TRACE, $err; log ERROR, "Impossible d'envoyer de tags ; si le problème persiste, passez au laboratoire."; exit(1); } log TRACE, $project; return $project; }