#!/usr/bin/env perl # # InspIRCd -- Internet Relay Chat Daemon # # Copyright (C) 2020 Sadie Powell # # This file is part of InspIRCd. InspIRCd is free software: you can # redistribute it and/or modify it under the terms of the GNU General Public # License as published by the Free Software Foundation, version 2. # # This program is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more # details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # use v5.10.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 POSIX qw(strftime); use TOML qw(from_toml); use lib dirname $RealDir; use make::common; use make::console; 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 console_format "Updating <|GREEN $name|> ..."; my $unpackdir = File::Temp->newdir; my $vendordir = catdir $RealDir, $name; my $success = 0; if (defined $info->{git}) { $success ||= execute 'git', 'clone', $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`); } 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; create_directory $dirname, 0750; 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;