File redmine.spec of Package redmine

#
# spec file for package redmine
#
# Copyright (c) 2025 SUSE LLC
# Copyright (c) 2023-2025 Georg Pfuetzenreuter
#
# 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 systemd_units %{name}-update.service %{name}.service %{name}.socket %{name}-sidekiq.service %{name}-reminder.service %{name}-reminder.timer
%{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.7
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:        puma.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
Source16:       %{name}.socket
Patch0:         redmine-6.0.7-gemdeps.patch
Patch1:         redmine-button_edit-text.patch
Patch2:         redmine-routes_sidekiq.patch
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.20}
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 propshaft:1.1}
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.2}
BuildRequires:  %{rubygem rbpdf:1.21 >= 1.21.4}
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 websocket-driver >= 0.7}
BuildRequires:  %{rubygem with_advisory_lock}
BuildRequires:  apparmor-abstractions
BuildRequires:  apparmor-rpm-macros
BuildRequires:  pkgconfig
BuildRequires:  rsync
BuildRequires:  ruby-common-rails
BuildRequires:  sysuser-tools
BuildRequires:  pkgconfig(systemd)
Requires:       %{rb_suffix}-rubygem-mysql2
Requires:       %{rb_suffix}-rubygem-redmine_crm
Requires:       %{rb_suffix}-rubygem-with_advisory_lock
Requires:       apparmor-abstractions
# 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

rm -r .github 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.%{rb_suffix}|g' Rakefile
sed -i 's|%{_bindir}/env ruby|%{_bindir}/ruby.%{rb_suffix}|g' extra/mail_handler/rdm-mailhandler.rb extra/svn/reposman.rb

%{rails_fix_ruby_shebang bin/*}
%{rails_fix_ruby_suffix}

tee Gemfile.local <<EOF
gem 'puma'
gem 'sidekiq'
EOF

%build
%{rails_regen_gemfile_lock}
%{rails_write_appinfo}

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

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

pushd config/

for i in *example ; do
  dst="${i%%.example}"
  cp -v $i %{buildroot}%{confdir}/$dst
  ln -sv %{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

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}/puma.rb

# redmine-update.service
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

# redmine.service
install -m 0644 %{SOURCE1} %{buildroot}%{_unitdir}
ln -s %{_sbindir}/service %{buildroot}%{_sbindir}/rc%{name}

# redmine.socket
install -m 0644 %{SOURCE16} %{buildroot}%{_unitdir}

# redmine-sidekiq.service
install -m 0644 %{SOURCE8} %{buildroot}%{_unitdir}
ln -s %{_sbindir}/service %{buildroot}%{_sbindir}/rc%{name}-sidekiq

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

# redmine-reminder.timer
install -m 0644 %{SOURCE11} %{buildroot}%{_unitdir}

# 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 the sniplet from sysusers_generate_pre 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 %{systemd_units}

%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 %{systemd_units}

%preun
%service_del_preun %{systemd_units}

%postun
touch %{basedir}/rebuild
%service_del_postun %{systemd_units}

%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

%{_unitdir}/%{name}-update.service
%{_sbindir}/rc%{name}-update
%{_sbindir}/%{name}-update

%{_unitdir}/%{name}.service
%{_unitdir}/%{name}.socket
%{_sbindir}/rc%{name}

%{_unitdir}/%{name}-sidekiq.service
%{_sbindir}/rc%{name}-sidekiq

%{_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/

%dir %{confdir}
%config %{confdir}/puma.rb
%config(noreplace) %{confdir}/additional_environment.rb
%config(noreplace) %{confdir}/configuration.yml
%config(noreplace) %{confdir}/database.yml
%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