bluto

Release package and announcement generator
Info | Log | Files | Refs | README | LICENSE

commit 318443a32dc3c5a9628e24d943c87e5ebcc69e2f
parent 613f01c50bd01ebc63cb283dcfdbcc7b4b1cdb8d
Author: lash <dev@holbrook.no>
Date:   Thu, 20 Jun 2024 02:54:56 +0100

Create output tree structure

Diffstat:
A.gitignore | 1+
MBluto.pm | 55++++++++++++++++++++++++++++++++++++++++++-------------
MBluto/Announce.pm | 1-
MBluto/Archive.pm | 44+++++++++++++++++++++++++++++---------------
MBluto/RSS.pm | 15++++++++++++---
ABluto/Tree.pm | 29+++++++++++++++++++++++++++++
Mto_std.pl | 21++++++++++++---------
7 files changed, 125 insertions(+), 41 deletions(-)

diff --git a/.gitignore b/.gitignore @@ -0,0 +1 @@ +*_build/ diff --git a/Bluto.pm b/Bluto.pm @@ -6,18 +6,20 @@ use SemVer; use Log::Term::Ansi qw/error info debug warn trace/; use Bluto::Archive; use Bluto::Announce; +use Bluto::Tree; use constant { VCS_TAG_PREFIX => 'v' }; use constant { VERSION => '0.0.1' }; -my %config; -my @m_tech; -my @m_url; -my @m_vcs; -my @m_src; -my @m_author_maintainer = [undef, undef, undef]; -my @m_author_origin = [undef, undef, undef]; -my %m_main = ( +our %config; +our $have_version_match = undef; +our @m_tech; +our @m_url; +our @m_vcs; +our @m_src; +our @m_author_maintainer = [undef, undef, undef]; +our @m_author_origin = [undef, undef, undef]; +our %m_main = ( name => undef, slug => undef, version => undef, @@ -35,7 +37,6 @@ my %m_main = ( author_origin => \@m_author_origin, engine => undef, ); -my $have_version_match = undef; sub _set_single { my $cfg = shift; @@ -102,6 +103,18 @@ sub _set_author { return 0; } +sub _check_ini { + my $env = shift; + + my $fp = File::Spec->catfile($env->{src_dir}, 'bluto.ini'); + if ( ! -f $fp ) { + error('ini file not found: ' . $fp); + return 1; + } + info('using ini file: ' . $fp); + return 0; +} + sub _check_readme { my $env = shift; my $f; @@ -120,11 +133,19 @@ sub _check_readme { return 1; } +sub _prepare_out { + my $release = shift; + my $env = shift; + + return Bluto::Tree::prepare($release, $env); +} + sub check_sanity { my $env = shift; my $r = 0; $r += _check_readme($env); + $r += _check_ini($env); return $r; } @@ -202,9 +223,16 @@ sub from_config { if (!defined $have_version_match) { error("no changelog found for version " . $m_main{version}); return undef; - } + } + + $r = _prepare_out(\%m_main, $env); + if ($r > 0) { + error('output location preparations fail'); + return undef; + } - my $targz = Bluto::Archive::create($m_main{slug}, $m_main{version}, $m_main{author_maintainer}[2], $m_main{tag_prefix}, $env->{src_dir}, 0); + #my $targz = Bluto::Archive::create($m_main{slug}, $m_main{version}, $m_main{author_maintainer}[2], $m_main{tag_prefix}, $env->{src_dir}, $env->{out_dir}, 0); + my $targz = Bluto::Archive::create(\%m_main, $env, 0); if (!defined $targz) { error('failed to generate archive'); return undef; @@ -278,12 +306,13 @@ sub from_config { return $have_version_match; } -sub get_rss { +sub create_rss { my $env = shift; my $out = Bluto::Announce::get_asciidoc(\%m_main, $env); - return Bluto::RSS::to_string(\%m_main, $env, $out); + #return Bluto::RSS::to_string(\%m_main, $env, $out); + return Bluto::RSS::to_file(\%m_main, $env, $out); } 1; diff --git a/Bluto/Announce.pm b/Bluto/Announce.pm @@ -17,7 +17,6 @@ sub _adapt_headings { $this = '=' x length($last); } elsif ($_ =~ /^---/) { if ($last !~ /^\W+$/) { - debug('last is ' . $last); $this = '-' x (length($last) - 1); } else { $this = $_; diff --git a/Bluto/Archive.pm b/Bluto/Archive.pm @@ -1,16 +1,18 @@ package Bluto::Archive; use Cwd; -use File::Basename qw/ basename /; +use File::Basename qw/ basename fileparse /; use Digest::SHA; use Log::Term::Ansi qw/error info debug warn trace/; +use Bluto::Tree; sub seal { my $targz = shift; my $keygrip = shift; - my $safe = shift; + # TODO: intended to be numeric flags but now we just use the first bit to force sign or not + my $safe = shift; if (!defined $keygrip) { if ($safe) { @@ -46,27 +48,37 @@ sub seal { } sub create { - my $slug = shift; - my $version = shift; - my $keygrip = shift; - my $git_prefix = shift; - my $src_dir = shift; + my $release = shift; + my $env = shift; my $flags = shift; + my $keygrip = $release->{author_maintainer}[2]; + my $old_dir = cwd; - chdir($src_dir); + chdir($env->{src_dir}); - my $targz = $slug . '-' . $version . '.tar.gz'; - my $targz_local = File::Spec->catfile($src_dir, $targz); - if (! -f $targz_local ) { - debug("no package file found, looked for: " . $targz); + my $targz_local = undef; + my $targz_stem = $release->{slug} . '-' . $release->{version}; + + my $rev = `git rev-parse HEAD --abbrev-ref`; + if (!defined $rev) { + error('unable to determine revision'); + chdir($old_dir); + return undef; + } + chomp($rev); + my $targz = $targz_stem . '+build.' . $rev . '.tar.gz'; + $targz_local = File::Spec->catfile(Bluto::Tree->release_path, $targz); - my @cmd = ('git', 'archive', $git_prefix . $version, '--format', 'tar.gz', '-o', $targz); + if (! -f $targz_local ) { + debug("no package file found, looked for: " . $targz_local); + my @cmd = ('git', 'archive', $release->{tag_prefix} . $release->{version}, '--format', 'tar.gz', '-o', $targz_local); system(@cmd); if ($?) { error("package file generation fail: " . $e); unlink($targz); + chdir($old_dir); return undef; } @@ -79,18 +91,20 @@ sub create { if (! -f $targz_local ) { error("package generation reported ok but still no file"); + chdir($old_dir); return undef; } my $seal = seal($targz_local, $keygrip, $flags & 1); if (!defined $seal) { error("failed sealing archive"); - unlink($targz); + unlink($targz_local); + chdir($old_dir); return undef; } info('sealed archive as sha256 ' . $seal . ' signed by ' . $keygrip); } else { - info("using existing package file: " . $targz); + info("using existing package file: " . $targz_local); warn("existing package file is not being checked in any way 8|"); } diff --git a/Bluto/RSS.pm b/Bluto/RSS.pm @@ -7,14 +7,16 @@ use XML::RSS; use Template; use Log::Term::Ansi qw/error info debug warn trace/; +use Bluto::Tree qw /announce_path/; sub get_feed_filepath { my $release = shift; my $env = shift; - + my $fn = $release->{slug} . '.bluto.rss'; - my $fp = File::Spec->catfile($env->{feed_dir}, $fn); + #my $fp = File::Spec->catfile($env->{feed_dir}, $fn); + my $fp = File::Spec->catfile(Bluto::Tree->announce_path, $fn); return $fp; } @@ -22,6 +24,7 @@ sub process { my $release = shift; my $env = shift; my $body = shift; + my $force = 1; my $rss_title = $release->{slug} . ' ' . $release->{version}; my $rss; @@ -96,7 +99,9 @@ sub to_string { my $body = shift; my $rss = process($release, $env, $body); - return $rss->as_string; + if (!defined $rss) { + return undef; + } } sub to_file { @@ -105,7 +110,11 @@ sub to_file { my $body = shift; my $rss = process($release, $env, $body); + if (!defined $rss) { + return undef; + } $rss->save(get_feed_filepath($release, $env)); + return get_feed_filepath($release, $env); } 1; diff --git a/Bluto/Tree.pm b/Bluto/Tree.pm @@ -0,0 +1,29 @@ +package Bluto::Tree; + + +use File::Spec qw/ catfile /; +use File::Path qw/ make_path /; + +our $_release_path; +our $_announce_path; + +sub release_path() { + return $_release_path; +} +sub announce_path() { + return $_announce_path; +} + +sub prepare { + my $release = shift; + my $env = shift; + + $_release_path = File::Spec->catfile($env->{out_dir}, $release->{slug}, 'release'); + File::Path->make_path(release_path); + $_announce_path = File::Spec->catfile($env->{out_dir}, $release->{slug}, 'announce'); + File::Path->make_path(announce_path); + + return 0; +} + +1; diff --git a/to_std.pl b/to_std.pl @@ -6,9 +6,10 @@ use strict; # standard imports use Getopt::Long qw/ :config auto_help /; -use File::Temp qw/ tempdir /; +#use File::Temp qw/ tempdir /; use File::Basename qw/ dirname /; use File::Spec qw/ catfile /; +use File::Path qw/ make_path /; use Cwd qw/ getcwd abs_path /; # external imports @@ -28,17 +29,13 @@ sub croak { my %env = ( src_dir => File::Spec->catfile(getcwd, '.bluto'), - out_dir => getcwd, - feed_dir => getcwd, + out_dir => File::Spec->catfile(getcwd, 'bluto_build'), + feed_dir => undef, content_dir => getcwd, template_path => 'base.tt', engine => undef, readme => undef, ); -#my $src_dir = -#my $out_dir = getcwd; -#my $feed_dir = getcwd; -#my $content_dir = getcwd; GetOptions( 'd:s', \$env{src_dir}, 'o:s', \$env{out_dir}, @@ -51,6 +48,10 @@ foreach my $k (keys %env ) { } } +if (!defined $env{feed_dir}) { + $env{feed_dir} = $env{out_dir}; +} + $env{engine} = 'bluto v' . SemVer->new(Bluto::VERSION). " (perl $^V)"; foreach my $k (keys %env ) { if (defined $env{$k}) { @@ -71,7 +72,9 @@ if (!defined $version) { die("config processing failed"); } -my $rss = Bluto::get_rss(\%env); -print($rss); +my $rss = Bluto::create_rss(\%env); +if (!defined $rss) { + die("rss processing failed"); +} #my @change = $cfg->vars();