File redmine.spec of Package redmine

#
# spec file for package redmine
#
# Copyright (c) 2024 SUSE LLC
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
# upon. The license for this file, and modifications and additions to the
# file, is the same license as for the pristine package itself (unless the
# license for the pristine package is not an Open Source License, in which
# case the license is the MIT License). An "Open Source License" is a
# license that conforms to the Open Source Definition (Version 1.9)
# published by the Open Source Initiative.

# Please submit bugfixes or comments via https://bugs.opensuse.org/
#


%define basedir  /srv/www/vhosts/redmine/
%define logdir   %{_localstatedir}/log/redmine/
%define datadir  %{_localstatedir}/lib/redmine/
%define confdir  %{_sysconfdir}/redmine/
%define rails_fix_ruby_shebang() \
  for S in $(grep -l '#!.*ruby' %* ) ; do \
    SB="${S}.backup" \
    cp ${S} ${SB} \
    perl -p -i -e 's|#!%{_bindir}/env ruby|#!%{_bindir}/ruby.%{rb_suffix}|g' $S \
    diff -urN ${SB} ${S} || : \
    rm ${SB} \
  done \
%{nil}
#
%define rb_build_versions %{redmine_ruby_build_versions}
%define rb_build_abi      %{redmine_ruby_abis}
%define rb_suffix         %{redmine_ruby_suffix}
%define rb_version        %{redmine_ruby_version}
#
Name:           redmine
Version:        6.0.4
Release:        0
Summary:        A flexible project management web application
License:        GPL-2.0-or-later
Group:          Productivity/Other
URL:            https://www.redmine.org/
Source:         https://www.redmine.org/releases/redmine-%{version}.tar.gz
Source1:        %{name}.service
Source2:        unicorn.rb
Source3:        opensuse-favicon.ico
Source4:        %{name}-update
Source5:        %{name}.sysuser
Source6:        %{name}-update.service
Source8:        %{name}-sidekiq.service
Source9:        sidekiq.rb
Source10:       %{name}-reminder.service
Source11:       %{name}-reminder.timer
Source12:       %{name}.apparmor
Source13:       %{name}.apparmor.abstractions
Source14:       %{name}-admin_constraint.rb
Source15:       %{name}.logrotate
Patch0:         redmine-6.0.4-gemdeps.patch
Patch1:         redmine-button_edit-text.patch
Patch2:         redmine-routes_sidekiq.patch
BuildRequires:  apparmor-abstractions
BuildRequires:  apparmor-rpm-macros
BuildRequires:  %{rubygem actionpack-xml_parser}
BuildRequires:  %{rubygem addressable}
#
BuildRequires:  %{rubygem bundler >= 1.12.0}
BuildRequires:  %{rubygem commonmarker:0.23 >= 0.23.8}
BuildRequires:  %{rubygem csv:3.2 >= 3.2.8}
BuildRequires:  %{rubygem deckar01-task_list == 2.3.2}
#
BuildRequires:  %{rubygem html-pipeline >= 2.13.2}
BuildRequires:  %{rubygem i18n:1.14 >= 1.14.1}
BuildRequires:  %{rubygem mail:2.8 >= 2.8.1}
BuildRequires:  %{rubygem marcel}
BuildRequires:  %{rubygem mini_magick:5.0 >= 5.0.1}
BuildRequires:  %{rubygem mini_mime:1.1}
BuildRequires:  %{rubygem mysql2:0.5 >= 0.5.0}
BuildRequires:  %{rubygem net-imap:0.4 >= 0.4.8}
BuildRequires:  %{rubygem net-ldap:0.17}
BuildRequires:  %{rubygem net-pop:0.1 >= 0.1.2}
BuildRequires:  %{rubygem net-smtp:0.4}
BuildRequires:  %{rubygem nokogiri:1.18 >= 1.18.3}
#
BuildRequires:  %{rubygem pg:1 >= 1.0.0}
#BuildRequires:  #{rubygem puma}
BuildRequires:  %{rubygem rack >= 3.1.3}
BuildRequires:  %{rubygem rack-openid}
BuildRequires:  %{rubygem rack-test >= 1.1}
BuildRequires:  %{rubygem rails:7.2 == 7.2.2.1}
BuildRequires:  %{rubygem rbpdf:1.21 >= 1.21.3}
BuildRequires:  %{rubygem redcarpet:3.6 >= 3.6.0}
BuildRequires:  %{rubygem roadie-rails:3.2}
BuildRequires:  %{rubygem rotp >= 5}
BuildRequires:  %{rubygem rouge:4.5}
BuildRequires:  %{rubygem rqrcode}
BuildRequires:  %{rubygem ruby-openid:2.9 >= 2.9.2}
BuildRequires:  %{rubygem rubyzip:2.3 >= 2.3.0}
BuildRequires:  %{rubygem sanitize:6.0}
BuildRequires:  %{rubygem sidekiq >= 6.0.6}
BuildRequires:  %{rubygem sprockets >= 4}
BuildRequires:  %{rubygem unicorn}
BuildRequires:  %{rubygem websocket-driver >= 0.7}
BuildRequires:  %{rubygem with_advisory_lock}
BuildRequires:  %{rubygem propshaft:1.1}
BuildRequires:  pkgconfig
BuildRequires:  rsync
BuildRequires:  ruby-common-rails
BuildRequires:  sysuser-tools
BuildRequires:  pkgconfig(systemd)
Requires:       apparmor-abstractions
Requires:       %{rb_suffix}-rubygem-mysql2
Requires:       %{rb_suffix}-rubygem-redmine_crm
Requires:       %{rb_suffix}-rubygem-with_advisory_lock
# PDF support
Recommends:     ghostscript
Recommends:     logrotate
BuildArch:      noarch
%{?systemd_requires}

%description
Redmine is a flexible project management web application. Written using the
Ruby on Rails framework, it is cross-platform and cross-database.

%prep
%autosetup -p1
touch Gemfile.lock
#rails_save_gemfile
rm -r .github
rm -r lib/plugins/*/test
find -type f \( -name '.*' -o -size 0 -not -name empty \) -delete
# only needed by upstream to generate the changelog file
rm bin/changelog.rb
# ???
rm {files,log}/delete.me
sed -i 's|%{_bindir}/env rake|%{_bindir}/rake|g' Rakefile
for file in \
	extra/mail_handler/rdm-mailhandler.rb \
	extra/svn/reposman.rb \
	; do
	sed -i 's|%{_bindir}/env ruby|%{_bindir}/ruby|g' "$file"
done

%build
tee Gemfile.local <<EOF
gem 'unicorn'
#gem 'puma'
gem 'sidekiq'
EOF
%rails_fix_ruby_shebang bin/*
%{rails_regen_gemfile_lock}
%{rails_fix_ruby_suffix}
%{rails_write_appinfo}

%sysusers_generate_pre %{SOURCE5} %{name} system-user-%{name}.conf

%install
install -d -m 0755 \
  %{buildroot}%{_sbindir} \
  %{buildroot}%{_sysusersdir} \
  %{buildroot}%{_unitdir}
install -dD -m 0750 \
  %{buildroot}%{confdir}  \
  %{buildroot}%{basedir}  \
  %{buildroot}%{logdir}   \
  %{buildroot}%{datadir}
mkdir -p public/plugin_assets

pushd config/
for i in *example ; do
  dst="${i%%.example}"
  echo "$i => $dst" ;
  cp $i %{buildroot}%{confdir}/$dst
  ln -s %{confdir}/$dst .
done
# The MariaDB version in Leap seems to want this variable instead?
sed -i 's/transaction_isolation/tx_isolation/' %{buildroot}%{confdir}/database.yml
ln -s %{confdir}/unicorn.rb .
popd
echo 'config.active_job.queue_adapter = :sidekiq' > %{buildroot}%{confdir}/additional_environment.rb
cp %{SOURCE3} public/favicon.ico
# license gets installed separately
# readme is not relevant with packaged themes
rsync -a \
  --exclude LICENSE.txt \
  --exclude themes/README \
  . %{buildroot}%{basedir}
install -m 0644 %{SOURCE9} %{buildroot}%{basedir}config/initializers
#
install -D -m 0640 %{SOURCE2} %{buildroot}%{confdir}/unicorn.rb

install -m 0755 %{SOURCE4} %{buildroot}%{_sbindir}/%{name}-update
install -m 0644 %{SOURCE6} %{buildroot}%{_unitdir}/%{name}-update.service
ln -s %{_sbindir}/service %{buildroot}%{_sbindir}/rc%{name}-update
install -m 0644 %{SOURCE1} %{buildroot}%{_unitdir}/%{name}.service
ln -s %{_sbindir}/service %{buildroot}%{_sbindir}/rc%{name}
install -m 0644 %{SOURCE8} %{buildroot}%{_unitdir}/%{name}-sidekiq.service
ln -s %{_sbindir}/service %{buildroot}%{_sbindir}/rc%{name}-sidekiq

install -m 0644 %{SOURCE10} %{buildroot}%{_unitdir}
install -m 0644 %{SOURCE11} %{buildroot}%{_unitdir}
ln -s %{_sbindir}/service %{buildroot}%{_sbindir}/rc%{name}-reminder

# log directory
rmdir %{buildroot}%{basedir}/log
ln -s %{logdir} %{buildroot}%{basedir}/log

install -d %{buildroot}%{_sysconfdir}/logrotate.d
sed \
  -e 's?__BINDIR__?%{_bindir}?' \
  -e 's?__LOGDIR__?%{logdir}?' \
  -e 's?__NAME__?%{name}?g' \
  %{SOURCE15} > %{buildroot}%{_sysconfdir}/logrotate.d/%{name}

# permissions clean up
chmod -R o=   %{buildroot}%{basedir} %{buildroot}%{confdir}
chmod    o+X  %{buildroot}%{basedir}
chmod -R o+rX %{buildroot}%{basedir}/public/
chmod    g+rx %{buildroot}%{basedir}/extra/mail_handler/rdm-mailhandler.rb

install -v -m 0644 %{SOURCE5} %{buildroot}%{_sysusersdir}/system-user-%{name}.conf

# how does this end up there ??
rm %{buildroot}/%{basedir}/%{name}.pre

# AppArmor
install -d %{buildroot}%{_sysconfdir}/apparmor.d
sed \
  -e 's?__BASE__?%{basedir}?' \
  -e 's?__RUBY_SUFFIX__?%{rb_suffix}?' \
  -e 's?__RUBY_VERSION__?%{rb_version}?' \
  %{SOURCE12} > %{buildroot}%{_sysconfdir}/apparmor.d/%{name}
chmod 0644 %{buildroot}%{_sysconfdir}/apparmor.d/%{name}
install -D -m 0644 %{SOURCE13} %{buildroot}%{_sysconfdir}/apparmor.d/abstractions/%{name}
# directory for plugin includes
install -d %{buildroot}%{_sysconfdir}/apparmor.d/%{name}.d

# Sidekiq Web UI
install -D -m 0644 %{SOURCE14} %{buildroot}%{basedir}/lib/openSUSE/admin_constraint.rb

%pre -f %{name}.pre
%service_add_pre %{name}-update.service %{name}-sidekiq.service %{name}.service %{name}-reminder.service

%post
touch %{basedir}/rebuild

%{apparmor_reload %{_sysconfdir}/apparmor.d/%{name}}

SECRET_TOKEN_FILE='%{basedir}/config/initializers/secret_token.rb'
if [ ! -f "$SECRET_TOKEN_FILE" ]
then
  (
    set -e
    cd %{basedir}
    umask 137
    rake.%{rb_suffix} generate_secret_token --trace
    chown redmine: "$SECRET_TOKEN_FILE"
  )
fi

%service_add_post %{name}-update.service %{name}-sidekiq.service %{name}.service %{name}-reminder.service

%preun
%service_del_preun %{name}-update.service %{name}-sidekiq.service %{name}.service %{name}-reminder.service

%postun
touch %{basedir}/rebuild
%service_del_postun %{name}-update.service %{name}-sidekiq.service %{name}.service %{name}-reminder.service

%posttrans
pushd %{basedir} >/dev/null
if [ -f Gemfile.lock ]
then
  rm Gemfile.lock
fi
%{_bindir}/bundle.%{rb_suffix} check
if [ -f Gemfile.lock ]
then
  chown root:%{name} Gemfile.lock
  chmod 0640 Gemfile.lock
fi
popd >/dev/null

%files
%license LICENSE.txt
%{_sbindir}/%{name}-update
%{_unitdir}/%{name}.service
%{_sbindir}/rc%{name}
%{_unitdir}/%{name}-sidekiq.service
%{_sbindir}/rc%{name}-sidekiq
%{_unitdir}/%{name}-update.service
%{_sbindir}/rc%{name}-update
%{_unitdir}/%{name}-reminder.service
%{_unitdir}/%{name}-reminder.timer
%{_sbindir}/rc%{name}-reminder
%config(noreplace) %{_sysconfdir}/logrotate.d/%{name}
%dir /srv/www/vhosts/
%defattr(-,root,redmine)
%dir %{basedir}
%dir %{basedir}/themes
%{basedir}/.appinfo.yml
%{basedir}/app/
%{basedir}/bin/
%{basedir}/config/
%{basedir}/config.ru
%{basedir}/CONTRIBUTING.md
%{basedir}/db/
%{basedir}/doc/
%{basedir}/extra/
%{basedir}/Gemfile*
%{basedir}/lib/
%{basedir}/log
%{basedir}/plugins/
%{basedir}/package.json
%{basedir}/yarn.lock
%{basedir}/Rakefile
%{basedir}/README.rdoc
%{basedir}/test/
%{basedir}/vendor/
%dir %{basedir}/public/
%{basedir}/public/404.html
%{basedir}/public/500.html
%{basedir}/public/favicon.ico
%{basedir}/public/help/
%attr(-,%{name},%{name}) %{basedir}/public/plugin_assets/
%dir %attr(-,%{name},%{name}) %{basedir}/files/
%attr(-,%{name},%{name}) %{basedir}/tmp/
#
%config(noreplace) %{confdir}
%dir %attr(-,%{name},%{name}) %{logdir}
%dir %attr(-,%{name},%{name}) %{datadir}

%{_sysusersdir}/system-user-%{name}.conf

%config %{_sysconfdir}/apparmor.d/%{name}
%config %{_sysconfdir}/apparmor.d/abstractions/%{name}
%dir %{_sysconfdir}/apparmor.d/%{name}.d

%ghost %{basedir}/config/initializers/secret_token.rb
%ghost %{basedir}/db/schema
%ghost %{basedir}/public/assets
%ghost %{basedir}/rebuild
%ghost %{basedir}/tmp/cache
%ghost %{basedir}/tmp/pids

%changelog
openSUSE Build Service is sponsored by