yum group buildsys-build renamed to build
[Fedora-Rebuild.git] / lib / Fedora / Rebuild / Mock.pm
blobaed4bb1f4854a12c0d2b77b94917a7e1e62eb34d
1 package Fedora::Rebuild::Mock;
2 use strict;
3 use warnings;
4 use version 0.77; our $VERSION = version->declare("v0.9.1");
6 use Moose;
7 use Carp;
8 use File::Spec;
9 use File::Temp;
10 use URI;
11 use namespace::clean;
13 # Archicture of mock environment. E.g. "x86_64".
14 has architecture => (
15 is => 'ro',
16 isa => 'Str',
17 required => 1
20 # Reference to list of repository URLs.
21 has repositories => (
22 is => 'ro',
23 isa => 'ArrayRef[Str]',
24 required => 1
27 # Create a mock environment with shared caches, root trees etc. that should be
28 # kept in mock cache.
29 # Default is false.
30 has shared => (
31 is => 'ro',
32 isa => 'Bool',
33 required => 0,
34 default => 0
37 # Directory with mock configuration.
38 has config_dir => (
39 is => 'ro',
40 isa => 'Str',
41 lazy_build => 1,
42 init_arg => undef
45 # Base name of configuration file without extension.
46 has config_root => (
47 is => 'ro',
48 isa => 'Str',
49 default => 'config'
52 sub BUILD {
53 my $self = shift;
55 if (!defined $self->architecture || $self->architecture eq '') {
56 corak("architecture attribute must be non-empty string");
58 if ($self->architecture =~ /['"\n]/s) {
59 croak("architecture attribute cannot contain " .
60 "apostrophe or a double quote or new line");
63 for my $repo (@{$self->repositories}) {
64 if ($repo =~ /['"\s]/s) {
65 croak("repository cannot contain apostrophe or a double quote "
66 . "or a white space");
72 # Create a directory. Caller is responsible for removing it.
73 # Croaks on error.
74 sub _build_config_dir {
75 my $directory;
76 local $! = undef;
77 eval { $directory = File::Temp::tempdir(CLEANUP => 0); } or
78 croak ("Could not create temporary mock configuration directory: " .
79 "$!\n");
80 return $directory;
84 # Write mock configuration file into the config directory. Returns the full
85 # pathname to the file.
86 # Croeaks on error.
87 sub config_file {
88 my $self=shift;
89 my $arch = $self->architecture;
90 # Embed the config_dir random name into mock chroot to allow parallel run
91 # of more mock instances. Otherwise mock returns failure on existing lock.
92 my (undef, undef, $dir) = File::Spec->splitpath($self->config_dir);
94 my $file_name = File::Spec->catfile($self->config_dir,
95 ($self->config_root . '.cfg'));
96 my $fh;
97 local $! = undef;
98 open($fh, '>', $file_name) or
99 croak("Could not create mock configuration file: $!\n");
100 $! = undef;
102 binmode($fh, ':utf8');
103 if ($self->shared) {
104 print $fh <<"FILE";
105 config_opts['plugin_conf']['ccache_enable'] = True
106 config_opts['plugin_conf']['yum_cache_enable'] = True
107 config_opts['plugin_conf']['root_cache_enable'] = True
108 config_opts['root'] = 'fedorarebuild-$arch'
109 FILE
110 } else {
111 print $fh <<"FILE";
112 config_opts['plugin_conf']['ccache_enable'] = False
113 config_opts['plugin_conf']['yum_cache_enable'] = False
114 config_opts['plugin_conf']['root_cache_enable'] = False
115 config_opts['root'] = 'fedorarebuild-$arch-$dir'
116 FILE
118 print $fh <<"FILE";
119 config_opts['target_arch'] = '$arch'
120 config_opts['legal_host_arches'] = ('$arch',)
121 config_opts['chroot_setup_cmd'] = 'groupinstall build'
123 config_opts['yum.conf'] = """
124 [main]
125 cachedir=/var/cache/yum
126 debuglevel=1
127 reposdir=/dev/null
128 logfile=/var/log/yum.log
129 retries=20
130 obsoletes=1
131 gpgcheck=0
132 assumeyes=1
133 syslog_ident=mock
134 syslog_device=
136 FILE
138 my $id = 0;
139 for my $repo (@{$self->repositories}) {
140 my $url = URI->new($repo);
141 print $fh "[$id]\n";
142 print $fh "name=$id\n";
143 print $fh "baseurl=$url\n";
144 $id++;
147 print $fh qq{"""\n};
148 $fh->close;
149 if ($!) {
150 croak("Could not write mock configuration file `" . $file_name .
151 "': $!\n");
153 return $file_name;
157 # Links configuration file from global configuration directory to this
158 # specific directory.
159 # Croaks on error.
160 sub inherit_file {
161 my ($self, $file) = @_;
162 local $! = undef;
164 my $target = File::Spec->catfile('/etc/mock', $file);
165 my $link = File::Spec->catfile($self->config_dir, $file);
167 if (-l $link or -e $link) {
168 unlink $link or croak("Could not remove old `" . $link .
169 "': $!\n");
171 if (!symlink($target, $link)) {
172 croak("Could not inherit mock file `" . $file . "' into `" .
173 $self->directory . "': $!\n");
178 # Creates mock configuration and return name of configuration directory and
179 # base name of configuration file without extension.
180 # Removal of the directory is on caller discretion.
181 # Croaks on error.
182 sub make_configuration {
183 my $self = shift;
184 $self->config_file;
185 $self->inherit_file('logging.ini');
186 $self->inherit_file('site-defaults.cfg');
188 return ($self->config_dir, $self->config_root);