From a2cf90ca29d8aa65a8c159b5a020b73e9978b57a Mon Sep 17 00:00:00 2001 From: sergiotarxz Date: Mon, 28 Mar 2022 03:23:17 +0200 Subject: [PATCH] Adding a still very incomplete method to generate builds from releases. --- Build.PL | 2 + lib/Peace/Model/Release.pm | 66 +++++++++++++++++++++++++++++++- t/00009-release-model.t | 2 + web_tests/000001-release-model.t | 34 ++++++++++++++++ 4 files changed, 102 insertions(+), 2 deletions(-) create mode 100644 web_tests/000001-release-model.t diff --git a/Build.PL b/Build.PL index cc0df1e..b2490a1 100644 --- a/Build.PL +++ b/Build.PL @@ -18,6 +18,8 @@ my $build = Module::Build->new( 'Test::MockObject' => 0, 'Test::MockModule' => 0, 'Test::Pod::Coverage' => 0, + 'JSON' => 0, + 'YAML' => 0, }, install_path => { 'templates' => "$HOME/.local/share/peace/template", diff --git a/lib/Peace/Model/Release.pm b/lib/Peace/Model/Release.pm index 97b357e..dcc4840 100644 --- a/lib/Peace/Model/Release.pm +++ b/lib/Peace/Model/Release.pm @@ -7,6 +7,10 @@ use warnings; use Params::ValidationCompiler qw/validation_for/; use Types::Standard qw/InstanceOf Str HasMethods/; +use Path::Tiny; +use File::pushd; +use YAML; +use JSON; { my $validator = validation_for( @@ -36,6 +40,64 @@ use Types::Standard qw/InstanceOf Str HasMethods/; } } +{ + my $validator = validation_for( + params => { + arch => { type => Str }, + } + ); + sub generate_build { + my $self = shift; + my %params = $validator->(@_); + my $application = $self->application; + my $flatpak_builder_file = $application->flatpak_builder_file; + my $arch = $params{arch}; + my $dir = Path::Tiny->tempdir; + my $clone_dir = Path::Tiny->tempdir; + my $output_dir = Path::Tiny->new($ENV{HOME})->child('.peace-apps'); + local $ENV{HOME} = $dir; + say $dir; + system 'git', 'clone', $application->git_repo, $clone_dir; + my $current_dir = pushd $clone_dir; + my $flatpak_data = $self->_parse_flatpak_builder_file; + my $app_id = $flatpak_data->{"app-id"}; + my $sdk = $flatpak_data->{sdk}; + my $runtime = $flatpak_data->{runtime}; + + system 'flatpak', '--user', 'list'; + system 'flatpak', '--user', 'remote-add', '--if-not-exists', 'remote', $application->flatpak_repo; + say $sdk; + system 'flatpak', '--user', 'install', '--arch', $arch, '-y', "$sdk"; + say $runtime; + system 'flatpak', '--user', 'install', '--arch', $arch, '-y', "$runtime"; + system 'flatpak-builder', '--arch', $arch, '--install', '--user', 'build', $application->flatpak_builder_file, $app_id; + $output_dir = $output_dir->child($self->uuid); + $output_dir->mkpath; + system 'flatpak', 'build-bundle', '--arch', $arch, $dir->child('.local/share/flatpak/repo/'), $output_dir->child($arch), $app_id; + } +} + +sub _parse_flatpak_builder_file { + my $self = shift; + my $application = $self->application; + my $flatpak_builder_file = $application->flatpak_builder_file; + my $path = Path::Tiny->new($flatpak_builder_file); + my $payload = $path->slurp_utf8; + my $structure; + eval { + $structure = decode_json($payload); + }; + if (!defined $structure) { + eval { + ($structure) = Load($payload); + }; + } + if (!defined $structure) { + die "Unable to parse flatpak builder file."; + } + return $structure; +} + sub _dbh { my $self = shift; return $self->{dbh}; @@ -167,7 +229,7 @@ methods: =head1 METHODS -Peace::Model::Release implements the following methods: +Peace::Model::Release implements the following methods: =head2 uuid @@ -194,7 +256,7 @@ Allows to retrieve and set the release date creation as a L. Allows to retrieve and set the release application as a L. =head2 tag - + my $tag = $release->tag; $release->tag($tag); diff --git a/t/00009-release-model.t b/t/00009-release-model.t index 2f1a3c8..fa185cb 100644 --- a/t/00009-release-model.t +++ b/t/00009-release-model.t @@ -9,6 +9,8 @@ use Test::MockModule; use Peace::Model::Application; use Peace::Model::Developer; +use Peace::Test::Mock::Model::Developer; + use DBI; BEGIN { diff --git a/web_tests/000001-release-model.t b/web_tests/000001-release-model.t new file mode 100644 index 0000000..53fcce7 --- /dev/null +++ b/web_tests/000001-release-model.t @@ -0,0 +1,34 @@ +#!/usr/bin/env perl + +use v5.30.0; + +use strict; +use warnings; + +use Peace::Test::Mock::Model::Developer; +use Peace::Model::Application; +use Peace::Model::Release; + +{ + my $developer = Peace::Test::Mock::Model::Developer->new; + my $application = Peace::Model::Application->new( + name => 'OpenMG', + description => 'Stub', + url => 'https://gitea.sergiotarxz.freemyip.com/sergiotarxz/mangareader', + developer => $developer, + price => '99', + git_repo => + 'https://gitea.sergiotarxz.freemyip.com/sergiotarxz/mangareader', + flatpak_builder_file => 'me.sergiotarxz.openmg.json', + flatpak_repo => 'https://nightly.gnome.org/gnome-nightly.flatpakrepo', + verified => 1, + ); + my $uuid = 'random-uuid'; + my $release = Peace::Model::Release->new( + uuid => $uuid, + application => $application, + tag => 'main', + name => 'test', + ); + $release->generate_build( arch => 'x86_64' ); +}