##
##  syncthing.spec -- OpenPKG RPM Package Specification
##  Copyright (c) 2000-2025 OpenPKG Project <http://openpkg.org/>
##
##  Permission to use, copy, modify, and distribute this software for
##  any purpose with or without fee is hereby granted, provided that
##  the above copyright notice and this permission notice appear in all
##  copies.
##
##  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
##  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
##  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
##  IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
##  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
##  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
##  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
##  USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
##  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
##  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
##  OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
##  SUCH DAMAGE.
##

#   package information
%define       V_syncthing_base  2.0.10
%define       V_syncthing_snap  20250924

#   package information
Name:         syncthing
Summary:      Folder Synchronization Service
URL:          https://syncthing.net/
Vendor:       The Syncthing Authors
Packager:     OpenPKG Project
Distribution: OpenPKG Community
Class:        EVAL
Group:        Filesystem
License:      MPL
Version:      %{V_syncthing_base}.%{V_syncthing_snap}
Release:      20250924

#   list of sources
Source0:      http://download.openpkg.org/components/versioned/syncthing/syncthing-%{V_syncthing_snap}.tar.xz
Source1:      rc.syncthing

#   build information
BuildPreReq:  OpenPKG, openpkg >= 20160101, go
PreReq:       OpenPKG, openpkg >= 20160101

%description
    Syncthing pursues the following goals: Define a protocol for
    synchronization of a folder between a number of collaborating
    devices. This protocol should be well defined, unambiguous, easily
    understood, free to use, efficient, secure and language neutral.
    This is called the Block Exchange Protocol. Provide the reference
    implementation to demonstrate the usability of said protocol. This
    is the syncthing(1) utility.

%track
    prog syncthing = {
        version   = %{V_syncthing_base}
        url       = https://github.com/syncthing/syncthing/releases
        regex     = v(\d+\.\d+\.\d+)\.tar\.gz
    }

%prep
    %setup -q -n syncthing

%build
    #   build program
    (   export GOPATH=`pwd`
        cd $GOPATH/src/github.com/syncthing/syncthing
        %{l_bash} build.sh
        rm -f bin/testutil
    ) || exit $?

%install
    #   create directory hierarchy
    %{l_shtool} mkdir -f -p -m 755 \
        $RPM_BUILD_ROOT%{l_prefix}/bin \
        $RPM_BUILD_ROOT%{l_prefix}/etc/rc.d \
        $RPM_BUILD_ROOT%{l_prefix}/etc/syncthing \
        $RPM_BUILD_ROOT%{l_prefix}/var/syncthing/run \
        $RPM_BUILD_ROOT%{l_prefix}/var/syncthing/log \
        $RPM_BUILD_ROOT%{l_prefix}/var/syncthing/data \
        $RPM_BUILD_ROOT%{l_prefix}/var/syncthing/state \
        $RPM_BUILD_ROOT%{l_prefix}/man/man1 \
        $RPM_BUILD_ROOT%{l_prefix}/man/man7

    #   install program
    %{l_shtool} install -c -s -m 755 \
        src/github.com/syncthing/syncthing/bin/* \
        $RPM_BUILD_ROOT%{l_prefix}/bin/

    #   install manpages
    %{l_shtool} install -c -m 644 \
        src/github.com/syncthing/syncthing/man/*.1 \
        $RPM_BUILD_ROOT%{l_prefix}/man/man1/
    %{l_shtool} install -c -m 644 \
        src/github.com/syncthing/syncthing/man/*.7 \
        $RPM_BUILD_ROOT%{l_prefix}/man/man7/

    #   install run-command script
    %{l_shtool} install -c -m 755 %{l_value -s -a} \
        %{SOURCE rc.syncthing} $RPM_BUILD_ROOT%{l_prefix}/etc/rc.d/

    #   determine installation files
    %{l_rpmtool} files -v -ofiles -r$RPM_BUILD_ROOT \
        %{l_files_std} \
        '%config %{l_prefix}/etc/syncthing/*' \
        '%attr(-,%{l_rusr},%{l_rgrp}) %{l_prefix}/var/syncthing/*'

%files -f files

%clean

%post
    if [ $1 -eq 1 ]; then
        #   create initial configuration
        datadir="$RPM_INSTALL_PREFIX/var/syncthing/data"
        statedir="$RPM_INSTALL_PREFIX/var/syncthing/state"
        su - %{l_rusr} -c \
            "$RPM_INSTALL_PREFIX/bin/syncthing -generate=$statedir" | \
        %{l_shtool} prop \
            -p "Creating initial device state: $RPM_INSTALL_PREFIX/var/syncthing/state"
        %{l_shtool} subst \
            -e "s;\\( path=\"\\)[^\"]*\\(\"\\);\\1$datadir\\2;" \
            $statedir/config.xml
        (   echo "After starting SyncThing with"
            echo "    \$ $RPM_INSTALL_PREFIX/bin/openpkg rc syncthing start"
            echo "you can access the SyncThing GUI under"
            echo "    http://127.0.0.1:8384/"
            echo "and find the synchronized data folder under"
            echo "    $RPM_INSTALL_PREFIX/var/syncthing/data"
        ) | %{l_rpmtool} msg -b -t notice
    elif [ $1 -eq 2 ]; then
        #   after upgrade, restart service
        eval `%{l_rc} syncthing status 2>/dev/null`
        [ ".$syncthing_active" = .yes ] && %{l_rc} syncthing restart
    fi
    exit 0

%preun
    if [ $1 -eq 0 ]; then
        #   before erase, stop service and remove log files
        %{l_rc} syncthing stop 2>/dev/null
        rm -rf $RPM_INSTALL_PREFIX/var/syncthing/log/*   >/dev/null 2>&1 || true
        rm -rf $RPM_INSTALL_PREFIX/var/syncthing/run/*   >/dev/null 2>&1 || true
        rm -rf $RPM_INSTALL_PREFIX/var/syncthing/data/*  >/dev/null 2>&1 || true
        rm -rf $RPM_INSTALL_PREFIX/var/syncthing/state/* >/dev/null 2>&1 || true
    fi
    exit 0

