%global gitproject0 gitprep
%global gitowner0 yuki-kimoto
%global commit0 fc8757147413d35f9132062233624ddeaf33d500
%global commitdate0 20241209
%global shortcommit0 %(c=%{commit0}; echo ${c:0:7})
%global localport 10222
%global pkguser git
%global pkggroup git
%global pkghome %{_localstatedir}/lib/%{name}/data/rep
%global sysusers g %{pkggroup} -\
u %{pkguser} -:%{pkggroup} "gitprep server daemon" %{pkghome} %{_bindir}/bash
Name: gitprep
Summary: Portable GitHub system on your own server
Version: 2.6.3
Release: 0.rc1.%{commitdate0}.%{shortcommit0}.2%{?dist}
License: (GPL-1.0-or-later OR Artistic-1.0-Perl) and MIT
URL: https://github.com/yuki-kimoto/gitprep
Source: https://github.com/%{gitowner0}/%{gitproject0}/archive/%{commit0}.tar.gz#/%{name}-%{shortcommit0}.tar.gz
BuildArch: noarch
Patch1: gitprep-2.6.3-default-branch-handling.patch
BuildRequires: perl-interpreter
BuildRequires: perl-generators
BuildRequires: perl(DBIx::Custom)
BuildRequires: perl(DBD::SQLite)
BuildRequires: systemd-rpm-macros
Requires: perl(Mojolicious)
Requires: perl(Mojo::ByteStream)
Requires: perl(Mojolicious::Plugin::INIConfig)
Requires: perl(Mojolicious::Plugin::AutoRoute)
Requires: perl(Mojolicious::Plugin::BasicAuth)
Requires: perl(Mojolicious::Plugin::DBViewer)
Requires: perl(Mojolicious::Plugin::AccessLog)
Requires: perl(Mojolicious::Plugin::RequestBase)
Requires: perl(DBD::SQLite)
Requires: perl(IO::Select)
Requires: perl(Symbol)
Requires: perl(Imager)
Requires: git-core
Requires: httpd-filesystem
Requires(post): policycoreutils policycoreutils-python-utils
%{?systemd_requires}
Recommends: logrotate
%global pkgdatadir %{_datadir}/%{name}
%global __provides_exclude_from %{pkgdatadir}
%global __requires_exclude ^perl\\(Gitprep
%{?perl_default_filter}
%description
GitPrep is a portable Github-like system which can be installed and hosted
on your own Unix/Linux server.
Features:
- Github clone: GitPrep has the same interface as GitHub.
- Support issue system.
- Portable: You can install GitPrep on your own Unix/Linux server.
- Only needs Perl 5.10.1+.
- Smart HTTP support: you can pull and push repository via HTTP.
- Built-in web server, and reverse proxy support.
- SSL support.
- Public key authentication support.
- Git branches and tags protection support.
#-------------------------------------------------------------------------------
%prep
#-------------------------------------------------------------------------------
%autosetup -p 1 -n %{name}-%{commit0}
find . -name '.git*' | xargs -r rm -rf
# The rpm package fully relies on dependency packages, thus unbundle
# the 'extlib' directory.
find . -type f | while read FILE
do sed -i -e '\#use lib "$FindBin::Bin.*/extlib/#d' "${FILE}"
done
for FILE in gitprep morbo
do sed -i -e '/PERL5LIB/d;s#$DIR/extlib/bin/#%{_bindir}/#g' "${FILE}"
done
# Fix version.
sed -i "/\\\$VERSION =/s/=.*/= 'v%{version}';/" ./lib/Gitprep.pm
#-------------------------------------------------------------------------------
%build
#-------------------------------------------------------------------------------
# Nothing to do.
#-------------------------------------------------------------------------------
%install
#-------------------------------------------------------------------------------
# Program.
install -d -m755 '%{buildroot}%{pkgdatadir}/'
cp -a gitprep lib morbo public script setup_database templates svg \
'%{buildroot}%{pkgdatadir}/'
rm -f '%{buildroot}%{pkgdatadir}/lib/D.pm' # Unneeded.
# Gitprep shell script.
cat > '%{buildroot}%{pkgdatadir}/script/gitprep-shell' <<- 'EOF'
#!%{_bindir}/bash
exec perl '%{pkgdatadir}/script/gitprep-shell-raw' "${@}"
EOF
chmod +x '%{buildroot}%{pkgdatadir}/script/gitprep-shell'
# Data,
install -d -m755 '%{buildroot}%{_localstatedir}/lib/%{name}/data'
ln -s '%{_localstatedir}/lib/%{name}/data' '%{buildroot}%{pkgdatadir}/'
# Lock.
install -d -m755 '%{buildroot}%{_localstatedir}/lib/%{name}/lock'
> '%{buildroot}%{_localstatedir}/lib/%{name}/lock/authorized_keys'
ln -s '%{_localstatedir}/lib/%{name}/lock' '%{buildroot}%{pkgdatadir}/'
# Temporary directory.
install -d -m755 '%{buildroot}%{_rundir}/%{name}'
install -d -m755 '%{buildroot}%{_tmpfilesdir}'
cat > '%{buildroot}%{_tmpfilesdir}/%{name}.conf' <<- 'EOF'
d %{_rundir}/%{name} 770 %{pkguser} %{pkggroup}
EOF
ln -s '%{_rundir}/%{name}' '%{buildroot}%{pkgdatadir}/tmp'
# Logging.
install -d -m755 '%{buildroot}%{_localstatedir}/log/%{name}'
ln -s '%{_localstatedir}/log/%{name}' '%{buildroot}%{pkgdatadir}/log'
# Configuration.
install -d -m755 '%{buildroot}%{_sysconfdir}/'
sed -e '/ssh_rep_url_base=/a\
ssh_rep_url_base=/~' \
-e '/mojo_log_file_path=/s#=.*#=%{_localstatedir}/log/%{name}/production.log#' \
-e '/access_log_file_path=/s#=.*#=%{_localstatedir}/log/%{name}/access.log#' \
-e '/^listen=/s/:10020/:%{localport}/' \
-e '/\[hypnotoad]/a\
;;; Daemon pid file.\
pid_file=%{_rundir}/%{name}/pid.file\
' < gitprep.conf.example > '%{buildroot}%{_sysconfdir}/gitprep.conf'
ln -s '%{_sysconfdir}/gitprep.conf' '%{buildroot}%{pkgdatadir}/'
# Command.
install -d -m755 '%{buildroot}%{_sbindir}/'
cat > '%{buildroot}%{_sbindir}/gitprepd' <<- 'EOF'
#!/usr/bin/bash
exec '%{pkgdatadir}/gitprep' "${@}"
EOF
# Daemon user/group.
install -d -m755 '%{buildroot}%{_localstatedir}/lib/%{name}/data/rep'
install -d -m755 '%{buildroot}%{_sysusersdir}'
echo '%{sysusers}' > '%{buildroot}%{_sysusersdir}/%{name}.conf'
# Systemd service.
install -d -m755 '%{buildroot}%{_unitdir}'
cat > '%{buildroot}%{_unitdir}/%{name}.service' <<- 'EOF'
[Unit]
Description=Portable GitHub system on your own server
After=syslog.target network-online.target
[Service]
Type=forking
PIDFile=%{_rundir}/%{name}/pid.file
User=%{pkguser}
Group=%{pkggroup}
ExecStart=%{_sbindir}/gitprepd
[Install]
WantedBy=multi-user.target
EOF
# Logrotate.
install -d -m755 '%{buildroot}%{_sysconfdir}/logrotate.d'
cat > '%{buildroot}%{_sysconfdir}/logrotate.d/%{name}' << 'EOF'
%{_localstatedir}/log/%{name}/*.log {
copytruncate
missingok
notifempty
}
EOF
# Apache proxy.
install -d -m755 '%{buildroot}%{_sysconfdir}/httpd/conf.d'
cat > '%{buildroot}%{_sysconfdir}/httpd/conf.d/%{name}.conf' << 'EOF'
# Gitprep reverse proxy.
ProxyRequests Off
RedirectMatch ^/gitprep$ /gitprep/
Require local
ProxyPreserveHost On
ProxyPass http://localhost:%{localport}/ keepalive=On
RequestHeader setifempty X-Forwarded-Proto "https" \
expr=%{REQUEST_SCHEME}=='https'
RequestHeader setifempty X-Forwarded-Proto "http" \
expr=%{REQUEST_SCHEME}!='https'
RequestHeader setifempty X-Request-Base "/gitprep/"
EOF
#-------------------------------------------------------------------------------
%pre
#-------------------------------------------------------------------------------
%sysusers_create - << 'EOF'
%{sysusers}
EOF
#-------------------------------------------------------------------------------
%post
#-------------------------------------------------------------------------------
%tmpfiles_create '%{_tmpfilesdir}/%{name}.conf'
cd '%{pkgdatadir}'
./setup_database
(
umask 077
cd '%{_localstatedir}/lib/%{name}/data'
mkdir -p rep/.ssh
touch rep/.ssh/authorized_keys
)
semanage fcontext -a -t ssh_home_t \
'%{_localstatedir}/lib/%{name}/data/rep/\.ssh(/.*)?' >&- 2>&- || :
restorecon -r '%{_localstatedir}/lib/%{name}/data/rep/\.ssh' || :
find data/* -follow -print0 | xargs -r0 chown '%{pkguser}:%{pkggroup}'
%systemd_post %{name}.service
#-------------------------------------------------------------------------------
%preun
#-------------------------------------------------------------------------------
%systemd_preun %{name}.service
#-------------------------------------------------------------------------------
%postun
#-------------------------------------------------------------------------------
%systemd_postun_with_restart %{name}.service
#-------------------------------------------------------------------------------
%files
#-------------------------------------------------------------------------------
%doc CHANGES README.md
%{pkgdatadir}
%attr(0755, -, -) %{_sbindir}/*
%attr(-, %{pkguser}, %{pkggroup}) %{_localstatedir}/lib/%{name}
%attr(750, %{pkguser}, %{pkggroup}) %{_localstatedir}/log/%{name}
%{_unitdir}/*
%{_sysusersdir}/*
%{_tmpfilesdir}/*
%config(noreplace) %{_sysconfdir}/%{name}.conf
%config(noreplace) %{_sysconfdir}/httpd/conf.d/%{name}.conf
%config(noreplace) %{_sysconfdir}/logrotate.d/%{name}
%ghost %attr(0770, %{pkguser}, %{pkggroup}) %{_rundir}/%{name}
#-------------------------------------------------------------------------------
%changelog
#-------------------------------------------------------------------------------
* Mon Dec 9 2024 Patrick Monnerat 2.6.3-0.rc1.20241209.fc87571.2
- Patch "default-branch-handling" to fix writing to an obsolete db field.
* Mon Dec 9 2024 Patrick Monnerat 2.6.3-0.rc1.20241209.fc87571.1
- New snapshot.
* Thu Nov 21 2024 Patrick Monnerat 2.6.3-0.rc1.20241121.3e7f91b.1
- New snapshot.
- Unbundle extlib in prep section.
- Adjust selinux type of .ssh directory.
* Wed Oct 23 2024 Patrick Monnerat 2.6.3-0.rc1.20241023.6bfc718.1
- New snapshot.
- Rename command as "gitprepd" to avoid conflicts with possible local install.
* Mon Oct 7 2024 Patrick Monnerat 2.6.3-0.rc1.20241007.5412bdd.1
- New snapshot.
* Wed Sep 25 2024 Patrick Monnerat 2.6.3-0.rc1.20240925.61c4039.1
- New snapshot.
* Tue Aug 27 2024 Patrick Monnerat 2.6.3-0.rc1.20240827.9df7c7d.1
- New snapshot.
* Tue Aug 20 2024 Patrick Monnerat 2.6.3-0.rc1.20240820.4cd0a5a.1
- New snapshot.
* Sat Jul 13 2024 Patrick Monnerat 2.6.3-0.rc1.20240711.07623ed.1
- New snapshot.
* Sun Jul 09 2023 Patrick Monnerat 2.6.3-0.rc1.20240624.3fe6c48.1
- Initial rpm packaging.
- Patch "noextlib" unbundles external libraries.