1 package Fedora
::Rebuild
::Mock
;
4 use version
0.77; our $VERSION = version
->declare("v0.9.1");
13 # Archicture of mock environment. E.g. "x86_64".
20 # Reference to list of repository URLs.
23 isa
=> 'ArrayRef[Str]',
27 # Create a mock environment with shared caches, root trees etc. that should be
37 # Directory with mock configuration.
45 # Base name of configuration file without extension.
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.
74 sub _build_config_dir
{
77 eval { $directory = File
::Temp
::tempdir
(CLEANUP
=> 0); } or
78 croak
("Could not create temporary mock configuration directory: " .
84 # Write mock configuration file into the config directory. Returns the full
85 # pathname to the file.
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'));
98 open($fh, '>', $file_name) or
99 croak
("Could not create mock configuration file: $!\n");
102 binmode($fh, ':utf8');
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'
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'
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'] = """
125 cachedir=/var/cache/yum
128 logfile=/var/log/yum.log
139 for my $repo (@
{$self->repositories}) {
140 my $url = URI
->new($repo);
142 print $fh "name=$id\n";
143 print $fh "baseurl=$url\n";
150 croak("Could
not write mock configuration file
`" . $file_name .
157 # Links configuration file from global configuration directory to this
158 # specific directory.
161 my ($self, $file) = @_;
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 .
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.
182 sub make_configuration {
185 $self->inherit_file('logging.ini');
186 $self->inherit_file('site-defaults.cfg');
188 return ($self->config_dir, $self->config_root);