mirror of
https://github.com/anope/anope.git
synced 2026-06-12 15:44:46 +02:00
118 lines
4.0 KiB
Perl
Executable File
118 lines
4.0 KiB
Perl
Executable File
#!/usr/bin/env perl
|
|
#
|
|
# Anope IRC Services <https://www.anope.org/>
|
|
#
|
|
# Copyright (C) 2003-2026 Anope Contributors
|
|
#
|
|
# Anope is free software. You can use, modify, and/or distribute it under the
|
|
# terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
|
# for the complete terms of this license and docs/AUTHORS.txt for a list of
|
|
# contributors.
|
|
#
|
|
# Based on the original code of Epona by Lara
|
|
# Based on the original code of Services by Andy Church
|
|
#
|
|
# SPDX-License-Identifier: GPL-2.0-only
|
|
|
|
use v5.26.0;
|
|
use strict;
|
|
use warnings FATAL => qw(all);
|
|
|
|
use File::Basename qw(basename dirname);
|
|
use File::Copy qw(move);
|
|
use File::Spec::Functions qw(abs2rel catdir catfile);
|
|
use File::Temp qw(tempdir);
|
|
use FindBin qw($RealDir);
|
|
use File::Path qw(mkpath);
|
|
use POSIX qw(strftime);
|
|
use TOML qw(from_toml);
|
|
|
|
use constant {
|
|
CC_BOLD => -t STDOUT ? "\e[1m" : '',
|
|
CC_RESET => -t STDOUT ? "\e[0m" : '',
|
|
CC_GREEN => -t STDOUT ? "\e[1;32m" : '',
|
|
CC_RED => -t STDOUT ? "\e[1;31m" : '',
|
|
};
|
|
|
|
sub execute(@) {
|
|
say "${\CC_BOLD}\$${\CC_RESET} @_";
|
|
return system @_;
|
|
}
|
|
|
|
sub print_error {
|
|
print STDERR "${\CC_BOLD}Error:${\CC_RESET} ";
|
|
for my $line (@_) {
|
|
say STDERR $line;
|
|
}
|
|
exit 1;
|
|
}
|
|
|
|
my $config = catfile $RealDir, 'update.toml';
|
|
open(my $fh, $config) or print_error "unable to read $config: $!";
|
|
my $contents = do { local $/; <$fh> };
|
|
close $fh;
|
|
|
|
my ($data, $error) = from_toml $contents;
|
|
print_error "unable to parse $config: $!" if $error;
|
|
|
|
while (my ($name, $info) = each %{$data}) {
|
|
say "Updating ${\CC_GREEN}$name${\CC_RESET} ...";
|
|
|
|
my $unpackdir = File::Temp->newdir;
|
|
my $vendordir = catdir $RealDir, $name;
|
|
my $success = 0;
|
|
if (defined $info->{git}) {
|
|
my @extra_args;
|
|
push @extra_args, '--branch', $info->{branch} if defined $info->{branch};
|
|
$success ||= execute 'git', 'clone', @extra_args, $info->{git}, $unpackdir;
|
|
chomp(my $tag = `git -C $unpackdir describe --abbrev=0 --tags HEAD 2>/dev/null`) unless $success;
|
|
$success ||= execute 'git', '-C', $unpackdir, 'checkout', $tag if $tag;
|
|
chomp($info->{version} = `git -C $unpackdir describe --always --tags HEAD 2>/dev/null`);
|
|
if (defined $info->{patches}) {
|
|
my $patches = catfile($unpackdir, $info->{patches});
|
|
for my $patch (glob $patches) {
|
|
$success |= execute 'git', '-C', $unpackdir, 'apply', $patch;
|
|
}
|
|
}
|
|
} elsif (defined $info->{tarball}) {
|
|
my $tarball = catfile $unpackdir, basename $info->{tarball};
|
|
$success ||= execute 'wget', '--output-document', $tarball, $info->{tarball};
|
|
$success ||= execute 'tar', 'fx', $tarball, '-C', $unpackdir, '--strip-components', 1;
|
|
} else {
|
|
print_error "unable to update $name; no git or tarball specified!";
|
|
}
|
|
print_error "unable to update $name: download failed!" if $success;
|
|
|
|
unlink $vendordir;
|
|
my $glob = $info->{files} or print_error "unable to update $name: no file glob specified!";
|
|
for my $file (glob catfile $unpackdir, $glob) {
|
|
my $pathname = abs2rel $file, $unpackdir;
|
|
for (my $i = 0; $i < ($info->{depth} // 0); ++$i) {
|
|
$pathname =~ s/[^\/]+\///;
|
|
}
|
|
my $filename = catfile $vendordir, $pathname;
|
|
my $dirname = dirname $filename;
|
|
mkdir $dirname, 0750 or print_error "unable to create $dirname: $!." unless -e $dirname;
|
|
move $file, $filename;
|
|
}
|
|
}
|
|
|
|
my $readme = catfile $RealDir, 'README.md';
|
|
open($fh, $readme) or print_error "unable to read $readme: $!";
|
|
$contents = do { local $/; <$fh> };
|
|
close $fh;
|
|
|
|
open($fh, '>', $readme) or print_error "unable to write $readme: $!";
|
|
print $fh $contents =~ s/\n\#\#.*//rs;
|
|
for my $name (sort keys %{$data}) {
|
|
my $info = $data->{$name};
|
|
printf $fh "\n## %s\n\n", $name;
|
|
printf $fh "**Author** — [%s](mailto:%s)\n\n", $info->{author}, $info->{email} if $info->{email};
|
|
printf $fh "**Author** — %s\n\n", $info->{author} unless $info->{email};
|
|
printf $fh "**License** — %s\n\n", $info->{license};
|
|
printf $fh "**Version** — %s\n\n", $info->{version};
|
|
my $website = $info->{website} // $info->{git};
|
|
printf $fh "**Website** — [%s](%s)\n", $website, $website;
|
|
}
|
|
close $fh;
|