mirror of
https://github.com/endeavouros-team/eos-pkgbuild-setup.git
synced 2026-06-13 01:54:36 +00:00
260 lines
7.6 KiB
Bash
Executable File
260 lines
7.6 KiB
Bash
Executable File
#!/bin/bash
|
|
#
|
|
# Copy built packages from old repo to new repo
|
|
# and if changed, transfer to github.
|
|
|
|
echo1() { echo "$@" ; } # for "return" values from functions (output to stdout)
|
|
echo2() { echo "$@" >&2 ; } # output to stderr
|
|
read2() { read "$@" >&2 ; } # output to stderr
|
|
|
|
DIE() {
|
|
echo2 "Error: $1"
|
|
exit 1
|
|
}
|
|
|
|
_date() {
|
|
date -Ru | tr -d ',' | awk '{print $1,$3,$2,$5,"UTC",$4}'
|
|
}
|
|
|
|
StateUpdate() {
|
|
local statefile=state
|
|
local stateval="$(head -n 1 $statefile)"
|
|
if [ -n "$(echo "$stateval" | awk '{print $2}')" ] ; then
|
|
DIE "file $PWD/state file is corrupted!"
|
|
fi
|
|
#Random ID generator, because the incrementing value is predictable
|
|
local NEW_UUID="$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1)"
|
|
|
|
echo $((stateval+1)) > $statefile
|
|
echo "$NEW_UUID" >> $statefile
|
|
_date >> $statefile
|
|
}
|
|
|
|
GetRepoName() {
|
|
local xx
|
|
reponame="$(basename "$PWD")"
|
|
case "$reponame" in
|
|
repo | eos-tools)
|
|
reponame="$(/usr/bin/ls -1F | grep "/$" | tr -d '/')" ;;
|
|
esac
|
|
case "$(echo "$reponame" | wc -l)" in
|
|
0) return 1 ;;
|
|
1) echo1 "$reponame" ;;
|
|
*)
|
|
echo2 "Potential repo names:"
|
|
while true ; do
|
|
echo2 "$reponame" | sed 's|^| |'
|
|
read2 -p "Select reponame: "
|
|
if [ -n "$REPLY" ] && [ -n "$(echo "$reponame" | grep "^$REPLY$")" ]; then
|
|
echo1 "$REPLY"
|
|
return
|
|
fi
|
|
echo2 "sorry, '$REPLY' is none of the above!"
|
|
done
|
|
;;
|
|
esac
|
|
}
|
|
|
|
CreateExcludes() {
|
|
local xx
|
|
local files="$(/usr/bin/ls -1a "$srcdir")"
|
|
|
|
for xx in $files ; do
|
|
case "$xx" in
|
|
*.sig | *.xz | *.zst | *.db | *.files) ;; # these we want to diff
|
|
. | ..) ;; # not directories
|
|
*) excludes+=" -x $xx" ;; # not these files/dirs either
|
|
esac
|
|
done
|
|
}
|
|
|
|
CheckDiff() {
|
|
case "$reponame" in
|
|
"")
|
|
DIE "cannot determine reponame!"
|
|
;;
|
|
endeavouros)
|
|
statefile="$PWD/state"
|
|
test -r "$statefile" && has_statefile=yes || DIE "file '$statefile' is missing!"
|
|
|
|
srcdir="$ASSETSDIR"
|
|
dstdir="$PWD/$reponame/x86_64"
|
|
git_adds="$reponame state"
|
|
;;
|
|
endeavouros-testing-dev) # was eos-tools
|
|
#srcdir="$PWD/../_BUILD_/repo-testing.x86_64"
|
|
srcdir="$ASSETSDIR"
|
|
dstdir="$PWD/$reponame" # was endeavouros-pkgtools
|
|
git_adds="$(basename "$dstdir")"
|
|
;;
|
|
*)
|
|
if true ; then
|
|
statefile="$PWD/state"
|
|
test -r "$statefile" && has_statefile=yes || DIE "file '$statefile' is missing!"
|
|
fi
|
|
srcdir="$ASSETSDIR"
|
|
dstdir="$PWD/repo"
|
|
if [ $has_statefile = yes ] ; then
|
|
git_adds="$(basename "$dstdir") state"
|
|
else
|
|
git_adds="$(basename "$dstdir")"
|
|
fi
|
|
;;
|
|
esac
|
|
|
|
test -d "$gitdir"/.git || DIE "folder '$gitdir/.git' not found!"
|
|
test -r "$srcdir"/$reponame.db || DIE "db file '$srcdir/$reponame.db' not found!"
|
|
test -d "$dstdir" || DIE "folder '$dstdir' not found!"
|
|
|
|
local excludes=""
|
|
CreateExcludes
|
|
|
|
LANG=C diff "$srcdir" "$dstdir" $excludes > $file_x86_64_diff
|
|
diff_x86_64=$?
|
|
case "$diff_x86_64" in
|
|
2) DIE "'diff $srcdir $dstdir' failed." ;;
|
|
esac
|
|
}
|
|
|
|
ReplaceAssets() {
|
|
case "$reponame" in
|
|
endeavouros)
|
|
if [ $diff_x86_64 -eq 1 ] ; then
|
|
rm -f "$dstdir"/*.{db,files,sig,xz,zst}
|
|
cp -p "$srcdir"/*.{db,files,sig,xz,zst} "$dstdir"
|
|
fi
|
|
;;
|
|
*)
|
|
rm -f "$dstdir"/*.{db,files,sig,xz,zst}
|
|
cp -p "$srcdir"/*.{db,files,sig,xz,zst} "$dstdir"
|
|
;;
|
|
esac
|
|
}
|
|
|
|
MirrorStateUpdate() {
|
|
cd "$gitdir"
|
|
if [ "$has_statefile" = "yes" ] ; then
|
|
StateUpdate
|
|
fi
|
|
}
|
|
|
|
RunOnlyIfAllowed() {
|
|
local cmd="$1"
|
|
while true ; do
|
|
read2 -p "Run '$cmd' at $PWD now (y/n)? "
|
|
case "$REPLY" in
|
|
[yY]*)
|
|
$cmd || DIE "'$cmd' failed."
|
|
break
|
|
;;
|
|
[nN]*)
|
|
break
|
|
;;
|
|
esac
|
|
done
|
|
}
|
|
|
|
GitUpdate() {
|
|
if false && [ "$reponame" = "endeavouros" ] ; then
|
|
local file
|
|
printf2 "==> You need to transfer the following files to github:"
|
|
for file in $git_adds ; do
|
|
printf " %s\n" "$file"
|
|
done
|
|
echo2 "==> Commands 'cd $gitdir ; git push', or use the browser for the same."
|
|
return
|
|
fi
|
|
|
|
local commit_msg="$1"
|
|
|
|
cd "$gitdir"
|
|
echo2 ""
|
|
echo2 "Adding files to github."
|
|
echo2 ""
|
|
# RunOnlyIfAllowed "git pull"
|
|
git add $git_adds
|
|
#git commit -m "." # dummy commit message
|
|
git commit -m "$commit_msg"
|
|
echo2 ""
|
|
git push || {
|
|
echo2 "You should run commands 'cd $PWD ; git push'"
|
|
}
|
|
}
|
|
|
|
GetArmCommitMessage() {
|
|
# Manually given Arm commits may not have the message, so get it from the github commit messages, or actual commits.
|
|
|
|
# Get commit message from github arm commit message.
|
|
local data=$(curl -Lsm 10 -o- https://github.com/endeavouros-arm/repo/commits/master/endeavouros)
|
|
local commit_msg=$(echo "$data" | grep -w "open markdown-title" | head -n1 | sed -e 's|.*">\([^<]*\)</a>|\1|')
|
|
|
|
if [ -z "$commit_msg" ] ; then
|
|
# Show actual committed packages from the github ARM page.
|
|
local commit=$(echo "$data" | grep -w "open markdown-title" | head -n1 | sed -e 's|.*/repo/commit/\(.*\)">.*|\1|')
|
|
data=$(curl -Lsm 10 -o- "https://github.com/endeavouros-arm/repo/commit/$commit")
|
|
readarray -t data < <(echo "$data" | grep "pkg.tar.zst<" | grep -w "a href" | sed 's|.*>endeavouros/\(.*\)</a>|\1|')
|
|
commit_msg="Updated"
|
|
for ((ix=1; ix < ${#data[@]}; ix=ix+2)) ; do
|
|
commit_msg+=" ${data[ix]}"
|
|
done
|
|
fi
|
|
echo "$commit_msg"
|
|
}
|
|
|
|
Main()
|
|
{
|
|
local commit_msg="$1"
|
|
local ASSETSDIR="$2"
|
|
|
|
# [ -f .GitUpdate ] || DIE "no .GitUpdate file in folder $PWD"
|
|
[ -d .git ] || DIE "no .git folder in $PWD"
|
|
[ -L .git ] && DIE ".git must not be symlink in $PWD"
|
|
|
|
local gitdir="$PWD" # has .git folder
|
|
local reponame="$(GetRepoName)"
|
|
local has_statefile=no
|
|
local srcdir=""
|
|
local dstdir=""
|
|
local git_adds=""
|
|
local statefile=""
|
|
local diff_x86_64=0 # 1 = has updates
|
|
local file_x86_64_diff=/tmp/diffs_x86_64.txt
|
|
|
|
CheckDiff
|
|
|
|
if [ $diff_x86_64 -ne 0 ] ; then
|
|
echo2 "==> x86_64 diffs:"
|
|
cat $file_x86_64_diff >&2
|
|
rm -f $file_x86_64_diff
|
|
fi
|
|
|
|
if [ $diff_x86_64 -ne 0 ] ; then
|
|
printf2 "\nChanges detected and shown above.\nWill replace local assets after 'git pull', then sync all to github.\n\n"
|
|
read2 -p "Continue (Y/n)? "
|
|
case "$REPLY" in
|
|
[nN]*) DIE "aborted!";;
|
|
esac
|
|
|
|
if [ -z "$commit_msg" ] ; then
|
|
read2 -p "Commit message is still empty. Give it now: " commit_msg
|
|
fi
|
|
if [ -z "$commit_msg" ] ; then
|
|
DIE "cannot continue without a commit message!"
|
|
fi
|
|
|
|
cd "$gitdir"
|
|
RunOnlyIfAllowed "git pull"
|
|
|
|
if [ $has_statefile = yes ] && [ $diff_x86_64 -ne 0 ] ; then
|
|
MirrorStateUpdate
|
|
fi
|
|
|
|
ReplaceAssets
|
|
GitUpdate "$commit_msg"
|
|
else
|
|
echo2 "No changes."
|
|
fi
|
|
}
|
|
|
|
Main "$@"
|