#!/bin/sh # # scratchpkg # # Copyright (c) 2018 by Emmett1 (emmett1.2miligrams@gmail.com) # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # cmp_copy() { # usage: # cmp_copy # reponame=${2##*/} for p in $1/*; do [ -d $p ] || continue pname=${p##*/} if [ ! -d $2/$pname ]; then mkdir -p $2/$pname for f in $p/* $p/.pkgfiles $p/.checksums; do [ -f $f ] || continue case $f in */update) continue;; esac fname=${f##*/} echo "+ $reponame/$pname/$fname" cp $f $2/$pname/$fname done else for f in $p/* $p/.pkgfiles $p/.checksums; do [ -f $f ] || continue case $f in */update) continue;; esac fname=${f##*/} cmp -s $f $2/$pname/$fname || { echo "* $reponame/$pname/$fname" cp $f $2/$pname/$fname } done fi done for p in $2/*; do [ -d $p ] || continue pname=${p##*/} for f in $p/* $p/.pkgfiles $p/.checksums; do [ -f $f ] || continue fname=${f##*/} if [ ! -f $1/$pname/$fname ]; then echo "- $reponame/$pname/$fname" rm $2/$pname/$fname fi done if [ ! -d $1/$pname ]; then rmdir $2/$pname fi done } sync_repo() { # usage: # sync_repo # url=$(echo $1 | cut -d / -f -5) portdir=$2 case $1 in *github.com/*) branch=$(echo $1 | cut -d / -f 7) repodir=$(echo $1 | cut -d / -f 8-);; *gitlab.com/*) branch=$(echo $1 | cut -d / -f 8) repodir=$(echo $1 | cut -d / -f 9-);; *) # will add more git service branch=$(echo $1 | cut -d / -f 8) repodir=$(echo $1 | cut -d / -f 9-);; esac # if branch not in the url, assume it master branch [ "$branch" ] || branch=master echo "fetching ports: $1" # cloning ports repository git clone --depth 1 -q -b $branch $url $tmprepo || { echo " failed sync repo" exit 1 } # copying ports to port directory by comparing cmp_copy $tmprepo/$repodir $portdir # cleanup tmp cloned repo rm -fr $tmprepo echo "ports synced: $2" } tmprepo=/tmp/tmprepo repo_file=/etc/scratchpkg.repo if [ ! -e "$repo_file" ]; then echo "missing repo file: $repo_file" exit 1 fi if [ "$(id -u)" != 0 ]; then echo "this operation need root access." exit 1 fi grep -Ev '^(#|$)' "$repo_file" | awk '{print $1,$2}' | while read -r repodir repourl; do if [ "$repodir" ] && [ "$repourl" ]; then sync_repo $repourl $repodir fi done exit 0