forked from artix/artools
		
	Compare commits
	
		
			46 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 98926fbdd0 | |||
| a1a2289e18 | |||
| 057cbf1691 | |||
| 0b05cbeba1 | |||
| ed5dad3066 | |||
| 76cce316a2 | |||
| 7c152b4f60 | |||
| 79c831c616 | |||
| 6b27c82b86 | |||
| 2cc5047dda | |||
| 08ab8c2137 | |||
| 9ddd962c2c | |||
| a8c07bd7f3 | |||
| 1fcf78bb47 | |||
| 167265944d | |||
| 7ef931026e | |||
| bef2a0b3fa | |||
| 8d6f12f5a9 | |||
| bf6fc3fcff | |||
| 11c73f1086 | |||
| 62e4795000 | |||
| 2f92ba003b | |||
| c19b80adbd | |||
| 1812296bc3 | |||
| cfb3ced261 | |||
| 77c7d1db8e | |||
| eb9f03c5c1 | |||
| 16d0c1759d | |||
| 922afb4e69 | |||
| d22017e1a1 | |||
| 1ea7d2ca8b | |||
| 3cd8632c61 | |||
| b425eac181 | |||
| 4b2d516258 | |||
| defd0c7ad6 | |||
| cf0cd1772e | |||
| 761ccf7644 | |||
| 5684aab444 | |||
| df8d8fb4a0 | |||
| be5fa4af09 | |||
| f0b84c0442 | |||
| f0262f3cbd | |||
| 1905aef7d7 | |||
| 0a80e2b4e1 | |||
| 4679c59de0 | |||
| f308217f62 | 
							
								
								
									
										14
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								Makefile
									
									
									
									
									
								
							| @@ -1,4 +1,4 @@ | ||||
| VERSION=0.12 | ||||
| VERSION=0.13 | ||||
|  | ||||
| CHROOT_VERSION=0.9 | ||||
|  | ||||
| @@ -40,7 +40,9 @@ PKG_BIN = \ | ||||
| 	bin/pkg/buildtree \ | ||||
| 	bin/pkg/lddd \ | ||||
| 	bin/pkg/finddeps \ | ||||
| 	bin/pkg/find-libdeps | ||||
| 	bin/pkg/find-libdeps \ | ||||
| 	bin/pkg/links-add \ | ||||
| 	bin/pkg/sogrep | ||||
|  | ||||
| LN_COMMITPKG = \ | ||||
| 	extrapkg \ | ||||
| @@ -87,6 +89,9 @@ LN_DEPLOYPKG = \ | ||||
| PKG_LIBS = \ | ||||
| 	$(wildcard lib/pkg/*) | ||||
|  | ||||
| PKG_LISTS = \ | ||||
| 	$(wildcard data/pkglists/*.list) | ||||
|  | ||||
| PKG_UTIL = lib/util-pkg.sh | ||||
|  | ||||
| PKG_DATA = \ | ||||
| @@ -168,6 +173,8 @@ install_pkg: | ||||
|  | ||||
| 	$(LN) find-libdeps $(DESTDIR)$(BINDIR)/find-libprovides | ||||
|  | ||||
| 	$(LN) links-add $(DESTDIR)$(BINDIR)/links-remove | ||||
|  | ||||
| 	for l in $(LN_COMMITPKG); do $(LN) commitpkg $(DESTDIR)$(BINDIR)/$$l; done | ||||
| 	for l in $(LN_BUILDPKG); do $(LN) buildpkg $(DESTDIR)$(BINDIR)/$$l; done | ||||
| 	for l in $(LN_DEPLOYPKG); do $(LN) deploypkg $(DESTDIR)$(BINDIR)/$$l; done | ||||
| @@ -181,6 +188,9 @@ install_pkg: | ||||
|  | ||||
| 	install $(DIRMODE) $(DESTDIR)$(DATADIR)/$(TOOLS)/patches | ||||
| 	install $(FILEMODE) $(PATCHES) $(DESTDIR)$(DATADIR)/$(TOOLS)/patches | ||||
|  | ||||
| 	install $(DIRMODE) $(DESTDIR)$(DATADIR)/$(TOOLS)/pkglists | ||||
| 	install $(FILEMODE) $(PKG_LISTS) $(DESTDIR)$(DATADIR)/$(TOOLS)/pkglists | ||||
| install_cpio: | ||||
| 	+make CPIODIR=$(CPIODIR) DESTDIR=$(DESTDIR) -C initcpio install | ||||
|  | ||||
|   | ||||
| @@ -28,6 +28,7 @@ artools | ||||
| - pkg: | ||||
|   * namcap | ||||
|   * git-subrepo | ||||
|   * jshon | ||||
|  | ||||
| - iso: | ||||
|   * dosfstools | ||||
|   | ||||
| @@ -71,9 +71,14 @@ else | ||||
|     cache_dirs=("$cache_dir") | ||||
| fi | ||||
|  | ||||
| pacconf_cmd=$(command -v pacman-conf || command -v pacconf) | ||||
| host_mirrors=($($pacconf_cmd --repo world Server 2> /dev/null | sed -r 's#(.*/)world/os/.*#\1$repo/os/$arch#')) | ||||
|      | ||||
| copy_hostconf () { | ||||
|     cp -a /etc/pacman.d/gnupg "$1/etc/pacman.d" | ||||
|  | ||||
|      | ||||
|     printf 'Server = %s\n' "${host_mirrors[@]}" >"$working_dir/etc/pacman.d/mirrorlist" | ||||
|      | ||||
|     [[ -n $pacman_conf ]] && cp $pacman_conf "$1/etc/pacman.conf" | ||||
|  | ||||
|     [[ -n $makepkg_conf ]] && cp $makepkg_conf "$1/etc/makepkg.conf" | ||||
| @@ -104,6 +109,13 @@ chroot_extra_mount() { | ||||
|     for m in ${bindmounts_rw[@]}; do | ||||
|         chroot_mount "${m%%:*}" "$1${m##*:}" -B | ||||
|     done | ||||
|      | ||||
|     for host_mirror in "${host_mirrors[@]}"; do | ||||
|         if [[ $host_mirror == *file://* ]]; then | ||||
|             host_mirror_path=$(echo "$host_mirror" | sed -r 's#file://(/.*)/\$repo/os/\$arch#\1#g') | ||||
|             chroot_mount "$host_mirror_path" "$1$host_mirror_path" -Br | ||||
|         fi | ||||
|     done | ||||
| } | ||||
|  | ||||
| umask 0022 | ||||
|   | ||||
| @@ -26,9 +26,10 @@ if [ ! -e "$1" ]; then | ||||
|     exit 1 | ||||
| fi | ||||
|  | ||||
| msg2 "Signing [%s] with key %s" "${file_to_sign##*/}" "${GPGKEY}..." | ||||
| if [[ -n "${BUILDBOT_GPGP}" ]]; then | ||||
|     msg2 "Signing [%s]" "${file_to_sign##*/}" | ||||
|     gpg --batch --passphrase "${BUILDBOT_GPGP}" --detach-sign "$file_to_sign" | ||||
| else | ||||
|     msg2 "Signing [%s] with key %s" "${file_to_sign##*/}" "${GPGKEY}..." | ||||
|     gpg --detach-sign --use-agent -u "${GPGKEY}" "$file_to_sign" | ||||
| fi | ||||
|   | ||||
| @@ -157,12 +157,12 @@ done | ||||
|  | ||||
| shift $(($OPTIND - 1)) | ||||
|  | ||||
| ${pretend} && display_settings && exit 1 | ||||
|  | ||||
| check_root | ||||
|  | ||||
| prepare_traps | ||||
|  | ||||
| prepare_build | ||||
|  | ||||
| ${pretend} && display_settings && exit 1 | ||||
|  | ||||
| build | ||||
|   | ||||
| @@ -17,24 +17,24 @@ | ||||
|  | ||||
| pull_tree_arch(){ | ||||
|     cd ${TREE_DIR_ARCH} | ||||
|     for tree in ${tree_names[@]};do | ||||
|     for tree in ${TREE_NAMES_ARCH[@]};do | ||||
|         if [[ -d ${tree} ]];then | ||||
|             cd ${tree} | ||||
|             pull_tree "${tree}" | ||||
|             pull_tree "${tree}" "$(get_local_head)" "Arch" | ||||
|             cd .. | ||||
|         else | ||||
|             clone_tree "${HOST_TREE_ARCH}" "${tree}" | ||||
|             clone_tree "${HOST_TREE_ARCH}" "${tree}" "Arch" | ||||
|         fi | ||||
|     done | ||||
| } | ||||
|  | ||||
| pull_tree_artix(){ | ||||
|     cd ${TREE_DIR_ARTIX} | ||||
|     for tree in ${tree_names[@]};do | ||||
|     for tree in ${TREE_NAMES_ARTIX[@]};do | ||||
|         if [[ -d ${tree} ]];then | ||||
|             config_tree "${tree}" | ||||
|             cd ${tree} | ||||
|             pull_tree "${tree}" | ||||
|             pull_tree "${tree}" "$(get_local_head)" | ||||
|             cd .. | ||||
|         else | ||||
|             clone_tree "${HOST_TREE_ARTIX}" "${tree}" | ||||
| @@ -59,7 +59,6 @@ show_deps(){ | ||||
|  | ||||
|     local archver=$(get_full_version $pkg) | ||||
|  | ||||
|     msg "git tree: %s" "$git_tree_arch" | ||||
|     msg2 "repo: %s" "$repo" | ||||
|     [[ -n ${pkgbase} ]] && msg2 "pkgbase: %s" "${pkgbase}" | ||||
|     msg2 "pkgname: %s" "${pkgname[*]}" | ||||
| @@ -83,22 +82,28 @@ from_arch(){ | ||||
|  | ||||
|     src=$package/repos/$repo | ||||
|  | ||||
|     dest=${TREE_DIR_ARTIX}/$git_tree_arch/$pkg/trunk | ||||
|     local git_tree_artix=$(find_tree "${TREE_DIR_ARTIX}" "$pkg") | ||||
|     local tree_dir=$(get_artix_tree "$pkg" "$git_tree_artix" "$git_tree_arch") | ||||
|  | ||||
|     dest=${TREE_DIR_ARTIX}/$tree_dir/$pkg/trunk | ||||
|  | ||||
|     msg "tree: %s" "$tree_dir" | ||||
|     show_deps "$src" "$repo" | ||||
|  | ||||
|     if [[ -d $dest ]];then | ||||
|         cd ${TREE_DIR_ARTIX}/$git_tree_arch | ||||
|  | ||||
|         cd ${TREE_DIR_ARTIX}/$git_tree_artix | ||||
|  | ||||
|         . $dest/PKGBUILD 2>/dev/null | ||||
|         local artixver=$(get_full_version $pkg) | ||||
|  | ||||
|         msg2 "Artix Version: %s" "$artixver" | ||||
|     else | ||||
|         subrepo_new "$pkg" "$git_tree_arch" | ||||
|         subrepo_new "$pkg" "$tree_dir" "$git_tree_arch" | ||||
|     fi | ||||
|  | ||||
|     info "Sync from archlinux (%s)" "$git_tree_arch" | ||||
|     msg "Sync (%s) from [%s] to [%s]" "$pkg" "$git_tree_arch" "$tree_dir" | ||||
|  | ||||
|     sync_pkg "$src" "$dest" | ||||
|     patch_pkg "$pkg" | ||||
| } | ||||
| @@ -118,7 +123,7 @@ view_build(){ | ||||
|  | ||||
| sync_repos(){ | ||||
|     ${sync_arch} && pull_tree_arch | ||||
|     pull_tree_artix | ||||
|     ${sync_artix} && pull_tree_artix | ||||
| } | ||||
|  | ||||
| load_user_info | ||||
| @@ -129,6 +134,7 @@ load_vars /etc/makepkg.conf | ||||
|  | ||||
| sync=false | ||||
| sync_arch=true | ||||
| sync_artix=true | ||||
| import=false | ||||
| view=false | ||||
| createnew=false | ||||
| @@ -136,21 +142,21 @@ conf=false | ||||
|  | ||||
| PACKAGE='' | ||||
|  | ||||
| tree_names=(packages community) | ||||
| TEAM=${tree_names[0]} | ||||
| SUBORG='' | ||||
| TEAM=${TREE_NAMES_ARTIX[0]} | ||||
| GROUP=${TREE_NAMES_ARTIX[0]} | ||||
|  | ||||
| usage() { | ||||
|     echo "Usage: ${0##*/} [options]" | ||||
|     echo '    -p <pkg>      Package name' | ||||
|     echo '    -t <team>     Team name (only with -n)' | ||||
|     echo "                  [default: ${TEAM}]" | ||||
|     echo '    -o <org>      Org of subrepo (only with -c)' | ||||
|     echo '    -g <group>    Group name, the superrepo (only with -n)' | ||||
|     echo "                  [default: ${GROUP}]" | ||||
|     echo "    -s            Clone or pull repos" | ||||
|     echo "    -z            Don't clone or pull arch repos" | ||||
|     echo "    -y            Don't clone or pull artix repos" | ||||
|     echo '    -i            Import a package from arch repos' | ||||
|     echo '    -n            Make new remote subrepo and clone it' | ||||
|     echo '    -c            Configure subrepo url' | ||||
|     echo '    -v            View package depends' | ||||
|     echo '    -h            This help' | ||||
|     echo '' | ||||
| @@ -160,19 +166,19 @@ usage() { | ||||
|  | ||||
| orig_argv=("$0" "$@") | ||||
|  | ||||
| opts='p:t:o:csinzvh' | ||||
| opts='p:t:g:sinzyvh' | ||||
|  | ||||
| while getopts "${opts}" arg; do | ||||
|     case "${arg}" in | ||||
|         p) PACKAGE="$OPTARG" ;; | ||||
|         t) TEAM="$OPTARG" ;; | ||||
|         o) SUBORG="$OPTARG" ;; | ||||
|         g) GROUP="$OPTARG" ;; | ||||
|         s) sync=true ;; | ||||
|         z) sync_arch=false ;; | ||||
|         y) sync_artix=false ;; | ||||
|         i) import=true ;; | ||||
|         n) createnew=true ;; | ||||
|         v) view=true ;; | ||||
|         c) conf=true ;; | ||||
|         h|?) usage 0 ;; | ||||
|         *) echo "invalid argument '${arg}'"; usage 1 ;; | ||||
|     esac | ||||
| @@ -189,6 +195,4 @@ ${view} && view_build "${PACKAGE}" | ||||
|  | ||||
| ${import} && from_arch "${PACKAGE}" | ||||
|  | ||||
| ${createnew} && subrepo_new "${PACKAGE}" "${TEAM}" | ||||
|  | ||||
| ${conf} && subrepo_config "${PACKAGE}" "${SUBORG}" | ||||
| ${createnew} && subrepo_new "${PACKAGE}" "${GROUP}" "${TEAM}" | ||||
|   | ||||
| @@ -15,17 +15,14 @@ | ||||
| . @libdir@/artools/util-base.sh | ||||
| . @libdir@/artools/util-pkg.sh | ||||
|  | ||||
| is_valid_repo(){ | ||||
|     local src="$1" | ||||
|     case $src in | ||||
|         core|extra|community|multilib|testing|staging|community-testing|community-staging|multilib-testing|multilib-staging|trunk) return 0 ;; | ||||
|         *) return 1 ;; | ||||
|     esac | ||||
| } | ||||
|  | ||||
| commit_pkg(){ | ||||
|     local git_tree=$(find_tree "${TREE_DIR_ARTIX}" "${PACKAGE}") | ||||
|     if [[ -n ${git_tree} ]];then | ||||
|  | ||||
|         cd ${TREE_DIR_ARTIX}/${git_tree} | ||||
|  | ||||
|         local head=$(get_local_head) | ||||
|  | ||||
|         cd ${TREE_DIR_ARTIX}/${git_tree}/${PACKAGE} | ||||
|  | ||||
|         . trunk/PKGBUILD | ||||
| @@ -33,8 +30,6 @@ commit_pkg(){ | ||||
|         local ver=$(get_full_version "${PACKAGE}") | ||||
|         local commit_msg="" | ||||
|  | ||||
|         local head=$(get_local_head) | ||||
|  | ||||
|         if ${remove};then | ||||
|             local action='remove' | ||||
|             if [[ "${REPO_SRC}" == 'trunk' ]];then | ||||
| @@ -59,6 +54,7 @@ commit_pkg(){ | ||||
|  | ||||
|         ${push} && pull_tree "${git_tree}" "$head" | ||||
|  | ||||
|         subrepo_pull "${PACKAGE}" | ||||
|         subrepo_push "${PACKAGE}" | ||||
|         subrepo_clean "${PACKAGE}" | ||||
|  | ||||
| @@ -73,14 +69,17 @@ commit_pkg(){ | ||||
| symlink_commit_pkg(){ | ||||
|     local git_tree=$(find_tree "${TREE_DIR_ARTIX}" "${PACKAGE}") | ||||
|     if [[ -n ${git_tree} ]];then | ||||
|  | ||||
|         cd ${TREE_DIR_ARTIX}/${git_tree} | ||||
|  | ||||
|         local head=$(get_local_head) | ||||
|  | ||||
|         cd ${TREE_DIR_ARTIX}/${git_tree}/${PACKAGE} | ||||
|  | ||||
|         . trunk/PKGBUILD | ||||
|         [[ $arch == 'any' ]] && CARCH=any | ||||
|         local ver=$(get_full_version "${PACKAGE}") | ||||
|  | ||||
|         local head=$(get_local_head) | ||||
|  | ||||
|         if [[ ${REPO_SRC} == 'trunk' ]];then | ||||
|             local action='add' | ||||
|             local dest="${REPO_DEST}-$CARCH" | ||||
| @@ -112,6 +111,7 @@ symlink_commit_pkg(){ | ||||
|  | ||||
|         ${push} && pull_tree "${git_tree}" "$head" | ||||
|  | ||||
|         subrepo_pull "${PACKAGE}" | ||||
|         subrepo_push "${PACKAGE}" | ||||
|         subrepo_clean "${PACKAGE}" | ||||
|  | ||||
|   | ||||
| @@ -18,7 +18,7 @@ | ||||
| show_version_table(){ | ||||
|     msg_table_header "%-20s %-20s %-25s %-30s %-30s" "Arch Repo" "Artix Repo" "Package" "Arch version" "Artix version" | ||||
|  | ||||
|     for tree in ${tree_names[@]};do | ||||
|     for tree in ${TREE_NAMES_ARTIX[@]};do | ||||
|  | ||||
|         local git=$(find ${TREE_DIR_ARTIX}/$tree/ -mindepth 1 -maxdepth 1 -type d) | ||||
|  | ||||
| @@ -99,8 +99,6 @@ upgrades=false | ||||
| downgrades=false | ||||
| move=false | ||||
|  | ||||
| tree_names=(packages community) | ||||
|  | ||||
| usage() { | ||||
|     echo "Usage: ${0##*/} [options]" | ||||
|     echo '    -u            Show upgrade packages' | ||||
|   | ||||
| @@ -16,12 +16,18 @@ | ||||
| . @libdir@/artools/util-pkg.sh | ||||
|  | ||||
| update_repo(){ | ||||
|     local repo="$1" pkgfile ver ext=db.tar.xz | ||||
|     local repo="$1" pkgfile ver | ||||
|     local repo_path=${REPOS_ROOT}/$repo/os/${ARCH} packages=() | ||||
|  | ||||
|     . PKGBUILD | ||||
|  | ||||
|     for name in ${pkgname[@]};do | ||||
|     local pkgsearch=(${pkgname[@]}) | ||||
|     if check_option "debug" "y"; then | ||||
|         pkgbase=${pkgbase:-${pkgname[@]}} | ||||
|         pkgsearch+=("${pkgbase}-debug") | ||||
|     fi | ||||
|  | ||||
|     for name in ${pkgsearch[@]}; do | ||||
|         pkgarch=$(get_pkg_arch "$name") | ||||
|         ver=$(get_full_version "$name") | ||||
|         if pkgfile=$(find_cached_package "$name" "$ver" "$pkgarch");then | ||||
| @@ -45,7 +51,11 @@ update_repo(){ | ||||
|         fi | ||||
|     done | ||||
|     cd $repo_path | ||||
|     [[ -n $action ]] && repo-$action -R $repo.$ext ${packages[@]} | ||||
|     if [[ -n $action ]]; then | ||||
|         repo-$action -R $repo.${PKGDBEXT} ${packages[@]} | ||||
|         ${linksdb} && links-$action $repo.${LINKSDBEXT} ${packages[@]} | ||||
|     fi | ||||
|  | ||||
|     return 0 | ||||
| } | ||||
|  | ||||
| @@ -58,6 +68,7 @@ load_vars /etc/makepkg.conf | ||||
| add_pkg=false | ||||
| del_pkg=false | ||||
| sign_pkg=false | ||||
| linksdb=false | ||||
|  | ||||
| cmd=${0##*/} | ||||
| dest_repo=${cmd#*-} | ||||
| @@ -66,6 +77,7 @@ usage() { | ||||
|     echo "Usage: ${cmd} [options]" | ||||
|     echo '    -a                 Add package(s) to repository' | ||||
|     echo '    -r                 Remove package(s) from repository' | ||||
|     echo '    -l                 Use links db' | ||||
|     echo '    -s                 Sign package(s)' | ||||
|     echo '    -h                 This help' | ||||
|     echo '' | ||||
| @@ -73,12 +85,13 @@ usage() { | ||||
|     exit $1 | ||||
| } | ||||
|  | ||||
| opts='arsh' | ||||
| opts='arlsh' | ||||
|  | ||||
| while getopts "${opts}" arg; do | ||||
|     case "${arg}" in | ||||
|         a) add_pkg=true; del_pkg=false ;; | ||||
|         r) del_pkg=true; add_pkg=false ;; | ||||
|         l) linksdb=true ;; | ||||
|         s) sign_pkg=true ;; | ||||
|         h|?) usage 0 ;; | ||||
|         *) echo "invalid argument '${arg}'"; usage 1 ;; | ||||
|   | ||||
| @@ -23,7 +23,7 @@ process_sofile() { | ||||
|     # extract the major version: 1 | ||||
|     soversion="${1##*\.so\.}" | ||||
|     if [[ "$soversion" = "$1" ]] && (($IGNORE_INTERNAL)); then | ||||
|         continue | ||||
|         return | ||||
|     fi | ||||
|     if ! in_array "${soname}=${soversion}-$2" ${soobjects[@]}; then | ||||
|     # libfoo.so=1-64 | ||||
|   | ||||
							
								
								
									
										518
									
								
								bin/pkg/links-add.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										518
									
								
								bin/pkg/links-add.in
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,518 @@ | ||||
| #!/bin/bash | ||||
| # | ||||
| #   links-add - add a package to a given repo database file | ||||
| #   links-remove - remove a package entry from a given repo database file | ||||
| # | ||||
| #   Copyright (c) 2006-2018 Pacman Development Team <pacman-dev@archlinux.org> | ||||
| #   Copyright (c) 2019 artoo@artixlinux.org | ||||
| # | ||||
| #   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 2 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 <http://www.gnu.org/licenses/>. | ||||
|  | ||||
| shopt -s extglob | ||||
|  | ||||
| declare -r REPO_DB_NAME="links" | ||||
|  | ||||
| QUIET=0 | ||||
| ONLYADDNEW=0 | ||||
| SIGN=0 | ||||
| KEY=0 | ||||
| VERIFY=0 | ||||
| REPO_DB_FILE= | ||||
| REPO_DB_PREFIX= | ||||
| REPO_DB_SUFFIX= | ||||
| LOCKFILE= | ||||
| CLEAN_LOCK=0 | ||||
|  | ||||
| . @libdir@/artools/util-base.sh | ||||
|  | ||||
| # ensure we have a sane umask set | ||||
| umask 0022 | ||||
|  | ||||
| # print usage instructions | ||||
| usage() { | ||||
|     cmd=${0##*/} | ||||
|     printf -- "%s \n\n" "$cmd" | ||||
|     if [[ $cmd == "links-add" ]] ; then | ||||
|         printf -- "Usage: links-add [options] <path-to-db> <package> ...\n" | ||||
|         printf -- "\n" | ||||
|         printf -- "\ | ||||
| links-add will update a package database by reading a package file.\n\ | ||||
| Multiple packages to add can be specified on the command line.\n" | ||||
|         printf -- "\n" | ||||
|         printf -- "Options:\n" | ||||
|         printf -- "  -n, --new         only add packages that are not already in the database\n" | ||||
|     elif [[ $cmd == "links-remove" ]] ; then | ||||
|         printf -- "Usage: links-remove [options] <path-to-db> <packagename> ...\n" | ||||
|         printf -- "\n" | ||||
|         printf -- "\ | ||||
| links-remove will update a package database by removing the package name\n\ | ||||
| specified on the command line from the given repo database. Multiple\n\ | ||||
| packages to remove can be specified on the command line.\n" | ||||
|         printf -- "\n" | ||||
|         printf -- "Options:\n" | ||||
|     else | ||||
|         printf -- "Please move along, there is nothing to see here.\n" | ||||
|         return | ||||
|     fi | ||||
|     printf -- "  --nocolor         turn off color in output\n" | ||||
|     printf -- "  -q, --quiet       minimize output\n" | ||||
|     printf -- "  -s, --sign        sign database with GnuPG after update\n" | ||||
|     printf -- "  -k, --key <key>   use the specified key to sign the database\n" | ||||
|     printf -- "  -v, --verify      verify database's signature before update\n" | ||||
|     printf -- "\n\ | ||||
| See %s(8) for more details and descriptions of the available options.\n" $cmd | ||||
|     printf "\n" | ||||
|     if [[ $cmd == "links-add" ]] ; then | ||||
|         printf -- "Example:  links-add /path/to/repo.${LINKSDBEXT} pacman-5.1.3-1-x86_64.pkg.tar.xz\n" | ||||
|     elif [[ $cmd == "links-remove" ]] ; then | ||||
|         printf -- "Example:  links-remove /path/to/repo.${LINKSDBEXT} kernel26\n" | ||||
|     fi | ||||
| } | ||||
|  | ||||
| find_pkgentry() { | ||||
|     local pkgname=$1 | ||||
|     local pkgentry | ||||
|  | ||||
|     for pkgentry in "$tmpdir/${REPO_DB_NAME}/$pkgname"*; do | ||||
|         name=${pkgentry##*/} | ||||
|         if [[ ${name%-*-*} = $pkgname ]]; then | ||||
|             echo $pkgentry | ||||
|             return 0 | ||||
|         fi | ||||
|     done | ||||
|     return 1 | ||||
| } | ||||
|  | ||||
| check_gpg() { | ||||
|     if ! type -p gpg >/dev/null; then | ||||
|         error "Cannot find the gpg binary! Is GnuPG installed?" | ||||
|         exit 1 # $E_MISSING_PROGRAM | ||||
|     fi | ||||
|  | ||||
|     if (( ! VERIFY )); then | ||||
|         if ! gpg --list-key ${GPGKEY} &>/dev/null; then | ||||
|             if [[ ! -z $GPGKEY ]]; then | ||||
|                 error "The key ${GPGKEY} does not exist in your keyring." | ||||
|             elif (( ! KEY )); then | ||||
|                 error "There is no key in your keyring." | ||||
|             fi | ||||
|             exit 1 | ||||
|         fi | ||||
|     fi | ||||
| } | ||||
|  | ||||
| # sign the package database once repackaged | ||||
| create_signature() { | ||||
|     (( ! SIGN )) && return | ||||
|     local dbfile=$1 | ||||
|     local ret=0 | ||||
|     msg "Signing database '%s'..." "${dbfile##*/.tmp.}" | ||||
|  | ||||
|     local SIGNWITHKEY="" | ||||
|     if [[ -n $GPGKEY ]]; then | ||||
|         SIGNWITHKEY="-u ${GPGKEY}" | ||||
|     fi | ||||
|     gpg --detach-sign --use-agent --no-armor ${SIGNWITHKEY} "$dbfile" &>/dev/null || ret=$? | ||||
|  | ||||
|     if (( ! ret )); then | ||||
|         msg2 "Created signature file '%s'" "${dbfile##*/.tmp.}.sig" | ||||
|     else | ||||
|         warning "Failed to sign package database file '%s'" "${dbfile##*/.tmp.}" | ||||
|     fi | ||||
| } | ||||
|  | ||||
| # verify the existing package database signature | ||||
| verify_signature() { | ||||
|     (( ! VERIFY )) && return | ||||
|     local dbfile=$1 | ||||
|     local ret=0 | ||||
|     msg "Verifying database signature..." | ||||
|  | ||||
|     if [[ ! -f $dbfile.sig ]]; then | ||||
|         warning "No existing signature found, skipping verification." | ||||
|         return | ||||
|     fi | ||||
|     gpg --verify "$dbfile.sig" || ret=$? | ||||
|     if (( ! ret )); then | ||||
|         msg2 "Database signature file verified." | ||||
|     else | ||||
|         error "Database signature was NOT valid!" | ||||
|         exit 1 | ||||
|     fi | ||||
| } | ||||
|  | ||||
| verify_repo_extension() { | ||||
|     local repofile=$1 | ||||
|  | ||||
|     case $repofile in | ||||
|         *.links.tar.gz)  TAR_OPT="z" ;; | ||||
|         *.links.tar.bz2) TAR_OPT="j" ;; | ||||
|         *.links.tar.xz)  TAR_OPT="J" ;; | ||||
|         *.links.tar.zst) TAR_OPT="--zstd" ;; | ||||
|         *.links.tar.Z)   TAR_OPT="Z" ;; | ||||
|         *.links.tar)     TAR_OPT="" ;; | ||||
|         *) error "'%s' does not have a valid database archive extension." \ | ||||
|                 "$repofile" | ||||
|             exit 1 ;; | ||||
|     esac | ||||
|  | ||||
|     printf '%s' "$TAR_OPT" | ||||
| } | ||||
|  | ||||
| # write an entry to the pacman database | ||||
| #   arg1 - path to package | ||||
| db_write_entry() { | ||||
|     # blank out all variables | ||||
|     local pkgfile=$1 | ||||
|  | ||||
|     local pkgname pkgver | ||||
|  | ||||
|     # read info from the zipped package | ||||
|     local line var val | ||||
|     while read -r line; do | ||||
|         [[ ${line:0:1} = '#' ]] && continue | ||||
|         IFS=' =' read -r var val < <(printf '%s\n' "$line") | ||||
|         # normalize whitespace with an extglob | ||||
|         declare "$var=${val//+([[:space:]])/ }" | ||||
|  | ||||
|     done< <(bsdtar -xOqf "$pkgfile" .PKGINFO) | ||||
|  | ||||
|     # ensure $pkgname and $pkgver variables were found | ||||
|     if [[ -z $pkgname || -z $pkgver ]]; then | ||||
|         error "Invalid package file '%s'." "$pkgfile" | ||||
|         return 1 | ||||
|     fi | ||||
|  | ||||
|     if [[ -d $tmpdir/${REPO_DB_NAME}/$pkgname-$pkgver ]]; then | ||||
|         warning "An entry for '%s' already existed" "$pkgname-$pkgver" | ||||
|         if (( ONLYADDNEW )); then | ||||
|             return 0 | ||||
|         fi | ||||
|     fi | ||||
|  | ||||
|     # remove an existing entry if it exists, ignore failures | ||||
|     db_remove_entry "$pkgname" | ||||
|  | ||||
|     local tmppkg=$tmpdir/pkg/$pkgname-$pkgver | ||||
|  | ||||
|     mkdir "$tmppkg" | ||||
|  | ||||
|     bsdtar -xof $pkgfile -C $tmppkg --include={opt,{,usr/}{lib{,32},{s,}bin}}'/*' 2>/dev/null | ||||
|  | ||||
|     pushd "$tmpdir/${REPO_DB_NAME}" >/dev/null | ||||
|     mkdir "$pkgname-$pkgver" | ||||
|     pushd "$pkgname-$pkgver" >/dev/null | ||||
|  | ||||
|     # create links entry | ||||
|     msg2 "Creating '%s' db entry..." "${REPO_DB_NAME}" | ||||
|  | ||||
|     local linksentry=$tmpdir/${REPO_DB_NAME}/$pkgname-$pkgver/${REPO_DB_NAME} | ||||
|  | ||||
|     for f in $(find $tmppkg -type f); do | ||||
|         readelf -d "$f" 2> /dev/null | sed -nr 's/.*Shared library: \[(.*)\].*/\1/p' | ||||
|     done | sort -u > $linksentry | ||||
|  | ||||
|     popd >/dev/null | ||||
|     popd >/dev/null | ||||
|  | ||||
|     return 0 | ||||
| } | ||||
|  | ||||
| # remove existing entries from the DB | ||||
| #   arg1 - package name | ||||
| db_remove_entry() { | ||||
|     local pkgname=$1 | ||||
|     local notfound=1 | ||||
|     local pkgentry=$(find_pkgentry "$pkgname") | ||||
|     while [[ -n $pkgentry ]]; do | ||||
|         notfound=0 | ||||
|  | ||||
|         msg2 "Removing existing entry '%s'..." \ | ||||
|         "${pkgentry##*/}" | ||||
|         rm -rf "$pkgentry" | ||||
|  | ||||
|         # remove entries in "links" database | ||||
|         local linksentry=$(echo "$pkgentry" | sed 's/\(.*\)\/db\//\1\/links\//') | ||||
|         rm -rf "$linksentry" | ||||
|  | ||||
|         pkgentry=$(find_pkgentry "$pkgname") | ||||
|     done | ||||
|     return $notfound | ||||
| } | ||||
|  | ||||
| prepare_repo_db() { | ||||
|     local repodir dbfile | ||||
|  | ||||
|     # ensure the path to the DB exists; $LOCKFILE is always an absolute path | ||||
|     repodir=${LOCKFILE%/*}/ | ||||
|  | ||||
|     if [[ ! -d $repodir ]]; then | ||||
|         error "%s does not exist or is not a directory." "$repodir" | ||||
|         exit 1 | ||||
|     fi | ||||
|  | ||||
|     # check lock file | ||||
|     if ( set -o noclobber; echo "$$" > "$LOCKFILE") 2> /dev/null; then | ||||
|         CLEAN_LOCK=1 | ||||
|     else | ||||
|         error "Failed to acquire lockfile: %s." "$LOCKFILE" | ||||
|         [[ -f $LOCKFILE ]] && error "Held by process %s" "$(cat "$LOCKFILE")" | ||||
|         exit 1 | ||||
|     fi | ||||
|  | ||||
|     dbfile=${repodir}/$REPO_DB_PREFIX.${REPO_DB_NAME}.$REPO_DB_SUFFIX | ||||
|  | ||||
|     if [[ -f $dbfile ]]; then | ||||
|         # there are two situations we can have here: | ||||
|         # a DB with some entries, or a DB with no contents at all. | ||||
|         if ! bsdtar -tqf "$dbfile" '*/links' >/dev/null 2>&1; then | ||||
|             # check empty case | ||||
|             if [[ -n $(bsdtar -tqf "$dbfile" '*' 2>/dev/null) ]]; then | ||||
|                 error "Repository file '%s' is not a proper links database." "$dbfile" | ||||
|                 exit 1 | ||||
|             fi | ||||
|         fi | ||||
|         verify_signature "$dbfile" | ||||
|         msg "Extracting %s to a temporary location..." "${dbfile##*/}" | ||||
|         bsdtar -xf "$dbfile" -C "$tmpdir/${REPO_DB_NAME}" | ||||
|     else | ||||
|         case $cmd in | ||||
|             links-remove) | ||||
|                 # only a missing "db" database is currently an error | ||||
|                 # TODO: remove if statement | ||||
|                 if [[ ${REPO_DB_NAME} == "links" ]]; then | ||||
|                     error "Repository file '%s' was not found." "$dbfile" | ||||
|                     exit 1 | ||||
|                 fi | ||||
|                 ;; | ||||
|             links-add) | ||||
|                 # check if the file can be created (write permission, directory existence, etc) | ||||
|                 if ! touch "$dbfile"; then | ||||
|                     error "Repository file '%s' could not be created." "$dbfile" | ||||
|                     exit 1 | ||||
|                 fi | ||||
|                 rm -f "$dbfile" | ||||
|                 ;; | ||||
|         esac | ||||
|     fi | ||||
| } | ||||
|  | ||||
| add() { | ||||
|     if [[ ! -f $1 ]]; then | ||||
|         error "File '%s' not found." "$1" | ||||
|         return 1 | ||||
|     fi | ||||
|  | ||||
|     pkgfile=$1 | ||||
|     if ! bsdtar -tqf "$pkgfile" .PKGINFO >/dev/null 2>&1; then | ||||
|         error "'%s' is not a package file, skipping" "$pkgfile" | ||||
|         return 1 | ||||
|     fi | ||||
|  | ||||
|     msg "Adding package '%s'" "$pkgfile" | ||||
|  | ||||
|     db_write_entry "$pkgfile" | ||||
| } | ||||
|  | ||||
| remove() { | ||||
|     pkgname=$1 | ||||
|     msg "Searching for package '%s'..." "$pkgname" | ||||
|  | ||||
|     if ! db_remove_entry "$pkgname"; then | ||||
|         error "Package matching '%s' not found." "$pkgname" | ||||
|         return 1 | ||||
|     fi | ||||
|  | ||||
|     return 0 | ||||
| } | ||||
|  | ||||
| rotate_db() { | ||||
|     dirname=${LOCKFILE%/*} | ||||
|  | ||||
|     pushd "$dirname" >/dev/null | ||||
|  | ||||
|     filename=${REPO_DB_PREFIX}.${REPO_DB_NAME}.${REPO_DB_SUFFIX} | ||||
|     tempname=$dirname/.tmp.$filename | ||||
|  | ||||
|     # hardlink or move the previous version of the database and signature to .old | ||||
|     # extension as a backup measure | ||||
|     if [[ -f $filename ]]; then | ||||
|         ln -f "$filename" "$filename.old" 2>/dev/null || \ | ||||
|             mv -f "$filename" "$filename.old" | ||||
|  | ||||
|         if [[ -f $filename.sig ]]; then | ||||
|             ln -f "$filename.sig" "$filename.old.sig" 2>/dev/null || \ | ||||
|                 mv -f "$filename.sig" "$filename.old.sig" | ||||
|         else | ||||
|             rm -f "$filename.old.sig" | ||||
|         fi | ||||
|     fi | ||||
|  | ||||
|     # rotate the newly-created database and signature into place | ||||
|     mv "$tempname" "$filename" | ||||
|     if [[ -f $tempname.sig ]]; then | ||||
|         mv "$tempname.sig" "$filename.sig" | ||||
|     fi | ||||
|  | ||||
|     dblink=${filename%.tar*} | ||||
|     rm -f "$dblink" "$dblink.sig" | ||||
|     ln -s "$filename" "$dblink" 2>/dev/null || \ | ||||
|         ln "$filename" "$dblink" 2>/dev/null || \ | ||||
|         cp "$filename" "$dblink" | ||||
|     if [[ -f "$filename.sig" ]]; then | ||||
|         ln -s "$filename.sig" "$dblink.sig" 2>/dev/null || \ | ||||
|             ln "$filename.sig" "$dblink.sig" 2>/dev/null || \ | ||||
|             cp "$filename.sig" "$dblink.sig" | ||||
|     fi | ||||
|  | ||||
|     popd >/dev/null | ||||
| } | ||||
|  | ||||
| create_db() { | ||||
|     TAR_OPT=$(verify_repo_extension "$REPO_DB_FILE") | ||||
|     # $LOCKFILE is already guaranteed to be absolute so this is safe | ||||
|     dirname=${LOCKFILE%/*} | ||||
|  | ||||
|     filename=${REPO_DB_PREFIX}.${REPO_DB_NAME}.${REPO_DB_SUFFIX} | ||||
|     # this ensures we create it on the same filesystem, making moves atomic | ||||
|     tempname=$dirname/.tmp.$filename | ||||
|  | ||||
|     pushd "$tmpdir/${REPO_DB_NAME}" >/dev/null | ||||
|     if ( shopt -s nullglob; files=(*); (( ${#files[*]} )) ); then | ||||
|         bsdtar -c${TAR_OPT}f "$tempname" * | ||||
|     else | ||||
|         # we have no packages remaining? zip up some emptyness | ||||
|         warning "No packages remain, creating empty database." | ||||
|         bsdtar -c${TAR_OPT}f "$tempname" -T /dev/null | ||||
|     fi | ||||
|     popd >/dev/null | ||||
|  | ||||
|     create_signature "$tempname" | ||||
| } | ||||
|  | ||||
| trap_exit() { | ||||
|     # unhook all traps to avoid race conditions | ||||
|     trap '' EXIT TERM HUP QUIT INT ERR | ||||
|  | ||||
|     echo | ||||
|     error "$@" | ||||
|     clean_up 1 | ||||
| } | ||||
|  | ||||
| clean_up() { | ||||
|     local exit_code=${1:-$?} | ||||
|  | ||||
|     # unhook all traps to avoid race conditions | ||||
|     trap '' EXIT TERM HUP QUIT INT ERR | ||||
|  | ||||
|     [[ -d $tmpdir ]] && rm -rf "$tmpdir" | ||||
|     (( CLEAN_LOCK )) && [[ -f $LOCKFILE ]] && rm -f "$LOCKFILE" | ||||
|  | ||||
|     exit $exit_code | ||||
| } | ||||
|  | ||||
| # PROGRAM START | ||||
| case $1 in | ||||
|     -h|--help) usage; exit 0;; | ||||
| esac | ||||
|  | ||||
| # figure out what program we are | ||||
| cmd=${0##*/} | ||||
|  | ||||
| if [[ $cmd != "links-add" && $cmd != "links-remove" ]]; then | ||||
|     error "Invalid command name '%s' specified." "$cmd" | ||||
|     exit 1 | ||||
| fi | ||||
|  | ||||
| tmpdir=$(mktemp -d "${TMPDIR:-/tmp}/repo-tools.XXXXXXXXXX") || (\ | ||||
|     error "Cannot create temp directory for database building."; \ | ||||
|     exit 1) | ||||
|  | ||||
| for repo in "pkg" "${REPO_DB_NAME}"; do | ||||
|     mkdir "$tmpdir/$repo" | ||||
| done | ||||
|  | ||||
| trap 'clean_up' EXIT | ||||
| for signal in TERM HUP QUIT; do | ||||
|     trap "trap_exit \"$(gettext "%s signal caught. Exiting...")\" \"$signal\"" "$signal" | ||||
| done | ||||
| trap 'trap_exit "$(gettext "Aborted by user! Exiting...")"' INT | ||||
| trap 'trap_exit "$(gettext "An unknown error has occurred. Exiting...")"' ERR | ||||
|  | ||||
| declare -a args | ||||
| # parse arguments | ||||
| while (( $# )); do | ||||
|     case $1 in | ||||
|         -q|--quiet) QUIET=1 ;; | ||||
|         -n|--new) ONLYADDNEW=1 ;; | ||||
|         -s|--sign) SIGN=1 ;; | ||||
|         -k|--key) KEY=1 ; shift; GPGKEY=$1 ;; | ||||
|         -v|--verify) VERIFY=1 ;; | ||||
|         *) args+=("$1") ;; | ||||
|     esac | ||||
|     shift | ||||
| done | ||||
|  | ||||
| REPO_DB_FILE=${args[0]} | ||||
| if [[ -z $REPO_DB_FILE ]]; then | ||||
|     usage | ||||
|     exit 1 | ||||
| fi | ||||
|  | ||||
| if [[ $REPO_DB_FILE == /* ]]; then | ||||
|     LOCKFILE=$REPO_DB_FILE.lck | ||||
| else | ||||
|     LOCKFILE=$PWD/$REPO_DB_FILE.lck | ||||
| fi | ||||
|  | ||||
| verify_repo_extension "$REPO_DB_FILE" >/dev/null | ||||
|  | ||||
| REPO_DB_PREFIX=${REPO_DB_FILE##*/} | ||||
| REPO_DB_PREFIX=${REPO_DB_PREFIX%.links.*} | ||||
| REPO_DB_SUFFIX=${REPO_DB_FILE##*.links.} | ||||
|  | ||||
| if (( SIGN || VERIFY )); then | ||||
|     check_gpg | ||||
| fi | ||||
|  | ||||
| if (( VERIFY && ${#args[@]} == 1 )); then | ||||
|     dbfile=${repodir}/$REPO_DB_PREFIX.${REPO_DB_NAME}.$REPO_DB_SUFFIX | ||||
|  | ||||
|     if [[ -f $dbfile ]]; then | ||||
|         verify_signature "$dbfile" | ||||
|     fi | ||||
|     exit 0 | ||||
| fi | ||||
|  | ||||
| prepare_repo_db | ||||
|  | ||||
| fail=0 | ||||
| for arg in "${args[@]:1}"; do | ||||
|     case $cmd in | ||||
|         links-add) add "$arg" ;; | ||||
|         links-remove) remove "$arg" ;; | ||||
|     esac || fail=1 | ||||
| done | ||||
|  | ||||
| # if the whole operation was a success, re-zip and rotate databases | ||||
| if (( !fail )); then | ||||
|     msg "Creating updated database file '%s'" "$REPO_DB_FILE" | ||||
|     create_db | ||||
|     rotate_db | ||||
| else | ||||
|     msg "No packages modified, nothing to do." | ||||
|     exit 1 | ||||
| fi | ||||
|  | ||||
| exit 0 | ||||
| @@ -237,18 +237,21 @@ download_sources() { | ||||
|     local copydir=$1 | ||||
|     local makepkg_user=$2 | ||||
|  | ||||
|     local builddir | ||||
|     builddir="$(mktemp -d)" | ||||
|     chown "$makepkg_user:" "$builddir" | ||||
| #     local builddir | ||||
| #     builddir="$(mktemp -d)" | ||||
| #     chown "$makepkg_user:" "$builddir" | ||||
|  | ||||
|     setup_workdir | ||||
|     chown "$makepkg_user:" "$WORKDIR" | ||||
|  | ||||
|     # Ensure sources are downloaded | ||||
|     sudo -u "$makepkg_user" --preserve-env=GNUPGHOME \ | ||||
|         env SRCDEST="$SRCDEST" BUILDDIR="$builddir" \ | ||||
|         env SRCDEST="$SRCDEST" BUILDDIR="$WORKDIR" \ | ||||
|         makepkg --config="$copydir/etc/makepkg.conf" --verifysource -o || | ||||
|         die "Could not download sources." | ||||
|  | ||||
|     # Clean up garbage from verifysource | ||||
|     rm -rf "$builddir" | ||||
| #     rm -rf "$builddir" | ||||
| } | ||||
|  | ||||
| # Usage: move_products $copydir $owner | ||||
| @@ -336,7 +339,7 @@ main() { | ||||
|     [[ -n $makepkg_user && -z $(id -u "$makepkg_user") ]] && die 'Invalid makepkg user.' | ||||
|     makepkg_user=${makepkg_user:-${SUDO_USER:-$USER}} | ||||
|  | ||||
|     check_root SOURCE_DATE_EPOCH,GNUPGHOME | ||||
|     check_root SOURCE_DATE_EPOCH,GNUPGHOME,SRCDEST,SRCPKGDEST,PKGDEST,LOGDEST,MAKEFLAGS,PACKAGER | ||||
|  | ||||
|     # Canonicalize chrootdir, getting rid of trailing / | ||||
|     chrootdir=$(readlink -e "$passeddir") | ||||
| @@ -382,9 +385,11 @@ main() { | ||||
|         sync_chroot "$chrootdir/root" "$copydir" "$copy" | ||||
|     fi | ||||
|  | ||||
|     bindmounts_rw+=("${PWD}:/startdir" "${SRCDEST}:/srcdest") | ||||
|  | ||||
|     $update_first && chroot-run \ | ||||
|             -r "${bindmounts_ro[@]}" \ | ||||
|             -w "${bindmounts_rw[@]}" \ | ||||
|             -r "${bindmounts_ro[*]}" \ | ||||
|             -w "${bindmounts_rw[*]}" \ | ||||
|             "$copydir" \ | ||||
|             pacman -Syu --noconfirm | ||||
|  | ||||
| @@ -404,8 +409,6 @@ main() { | ||||
|  | ||||
|     prepare_chroot "$copydir" "$USER_HOME" "$keepbuilddir" "$run_namcap" | ||||
|  | ||||
|     bindmounts_rw+=("${PWD}:/startdir" "${SRCDEST}:/srcdest") | ||||
|  | ||||
|     if chroot-run \ | ||||
|         -r "${bindmounts_ro[*]}" \ | ||||
|         -w "${bindmounts_rw[*]}" \ | ||||
|   | ||||
| @@ -79,15 +79,21 @@ write_details() { | ||||
| } | ||||
|  | ||||
| write_pkg_yaml(){ | ||||
|     local pkgfile=$(print_all_package_names) | ||||
|  | ||||
|     Yaml=$(write_yaml_header) | ||||
|  | ||||
|     Yaml+=$(write_empty_line) | ||||
|  | ||||
|     local full=$(get_full_version) | ||||
|  | ||||
|     local ver=${full:-0} | ||||
|  | ||||
|     pkgbase=${pkgbase:-${pkgname[0]}} | ||||
|  | ||||
|     Yaml+=$(write_yaml_map 0 "pkgbase") | ||||
|     Yaml+=$(write_yaml_map 2 "pkgname" "${pkgbase:-$pkgname}") | ||||
|     Yaml+=$(write_yaml_map 2 "pkgname" "${pkgbase}") | ||||
|     ${details} && write_details '' | ||||
|     Yaml+=$(write_yaml_map 2 "fullver" "${ver}") | ||||
|  | ||||
|     Yaml+=$(write_empty_line) | ||||
|  | ||||
| @@ -99,6 +105,8 @@ write_pkg_yaml(){ | ||||
|  | ||||
|     Yaml+=$(write_empty_line) | ||||
|  | ||||
|     local pkgfile=$(print_all_package_names) | ||||
|  | ||||
|     Yaml+=$(write_yaml_map 0 "pkgfile") | ||||
|     for f in ${pkgfile[@]};do | ||||
|         Yaml+=$(write_yaml_seq 2 "${f##*/}") | ||||
| @@ -136,4 +144,6 @@ PACKAGE="$1"/PKGBUILD; shift | ||||
|  | ||||
| . "$PACKAGE" | ||||
|  | ||||
| . /etc/makepkg.conf | ||||
|  | ||||
| write_pkg_yaml | ||||
|   | ||||
							
								
								
									
										140
									
								
								bin/pkg/sogrep.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										140
									
								
								bin/pkg/sogrep.in
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,140 @@ | ||||
| #!/bin/bash | ||||
| # | ||||
| #   sogrep - find shared library links in an Arch Linux repository. | ||||
| # | ||||
| #   Copyright (c) 2019 by Eli Schwartz <eschwartz@archlinux.org> | ||||
| #   Copyright (c) 2019 artoo@artixlinux.org | ||||
| # | ||||
| #   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 2 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 <https://www.gnu.org/licenses/>. | ||||
| # | ||||
|  | ||||
| . @libdir@/artools/util-base.sh | ||||
|  | ||||
| load_user_info | ||||
|  | ||||
| load_config "${USERCONFDIR}/artools/artools.conf" || load_config "${SYSCONFDIR}/artools.conf" | ||||
|  | ||||
| # options | ||||
| REFRESH=0 | ||||
| VERBOSE=0 | ||||
|  | ||||
| recache() { | ||||
|     local repo verbosity=-s | ||||
|  | ||||
|     (( VERBOSE )) && verbosity=--progress-bar | ||||
|  | ||||
|     for repo in "${ARTIX_REPOS[@]}"; do | ||||
|             rm -rf "${SOCACHE_DIR}/${ARCH}/${repo}" | ||||
|             mkdir -p "${SOCACHE_DIR}/${ARCH}/${repo}" | ||||
|             curl "$verbosity" "${SOLINKS_MIRROR}/${repo}/os/${ARCH}/${repo}.${LINKSDBEXT}" | bsdtar -xf - -C "${SOCACHE_DIR}/${ARCH}/${repo}" | ||||
|     done | ||||
| } | ||||
|  | ||||
| search() { | ||||
|     local repo=$1 lib=$2 srepos=("${ARTIX_REPOS[@]}") | ||||
|  | ||||
|     if [[ $repo != all ]]; then | ||||
|         if ! in_array "${repo}" "${ARTIX_REPOS[@]}"; then | ||||
|             echo "${BASH_SOURCE[0]##*/}: unrecognized repo '$repo'" | ||||
|             echo "Try '${BASH_SOURCE[0]##*/} --help' for more information." | ||||
|             exit 1 | ||||
|         fi | ||||
|         srepos=("${repo}") | ||||
|     fi | ||||
|  | ||||
|     for repo in "${srepos[@]}"; do | ||||
|         local prefix= | ||||
|         (( VERBOSE && ${#srepos[@]} > 1 )) && prefix=${repo}/ | ||||
|         db=${SOCACHE_DIR}/${ARCH}/${repo}/ | ||||
|         if [[ -d ${db} ]]; then | ||||
|             while read -rd '' pkg; do | ||||
|                 read -r match | ||||
|                 pkg=${pkg#${db}} | ||||
|                 pkg="${prefix}${pkg%-*-*/links}" | ||||
|  | ||||
|                 if (( VERBOSE )); then | ||||
|                     printf '%-45s %s\n' "${pkg}" "${match}" | ||||
|                 else | ||||
|                     printf '%s\n' "${pkg}" | ||||
|                 fi | ||||
|             done < <(grep -rZ "${lib}" "${db}") | sort -u | ||||
|         fi | ||||
|     done | ||||
| } | ||||
|  | ||||
| usage() { | ||||
|     cat <<- _EOF_ | ||||
|         Usage: ${BASH_SOURCE[0]##*/} [OPTIONS] REPO LIBNAME | ||||
|  | ||||
|         Check the soname links database for Artix Linux repositories containing | ||||
|         packages linked to a given shared library. If the repository specified | ||||
|         is "all", then all repositories will be searched, otherwise only the | ||||
|         named repository will be searched. | ||||
|  | ||||
|         If the links database does not exist, it will be downloaded first. | ||||
|  | ||||
|         OPTIONS | ||||
|             -v, --verbose   Show matched links in addition to pkgname | ||||
|             -r, --refresh   Refresh the links databases | ||||
|             -h, --help      Show this help text | ||||
| _EOF_ | ||||
| } | ||||
|  | ||||
| # utility function to resort with multiple repos + no-verbose | ||||
| resort() { sort -u; } | ||||
|  | ||||
| if (( $# == 0 )); then | ||||
|     echo "error: No arguments passed." | ||||
|     echo "Try '${BASH_SOURCE[0]##*/} --help' for more information." | ||||
|     exit 1 | ||||
| fi | ||||
| OPT_SHORT='vrh' | ||||
| OPT_LONG=('verbose' 'refresh' 'help') | ||||
| if ! parseopts "$OPT_SHORT" "${OPT_LONG[@]}" -- "$@"; then | ||||
|     exit 1 | ||||
| fi | ||||
| set  -- "${OPTRET[@]}" | ||||
|  | ||||
| while :; do | ||||
|     case $1 in | ||||
|         -v|--verbose) | ||||
|             resort() { cat; } | ||||
|             VERBOSE=1 | ||||
|             ;; | ||||
|         -r|--refresh) | ||||
|             REFRESH=1 | ||||
|             ;; | ||||
|         -h|--help) | ||||
|             usage | ||||
|             exit 0 | ||||
|             ;; | ||||
|         --) | ||||
|             shift; break | ||||
|             ;; | ||||
|     esac | ||||
|     shift | ||||
| done | ||||
|  | ||||
| if ! (( ( REFRESH && $# == 0 ) || $# == 2 )); then | ||||
|     echo "error: Incorrect number of arguments passed." | ||||
|     echo "Try '${BASH_SOURCE[0]##*/} --help' for more information." | ||||
|     exit 1 | ||||
| fi | ||||
|  | ||||
| if (( REFRESH )) || [[ ! -d ${SOCACHE_DIR} ]]; then | ||||
|     recache | ||||
|     (( $# == 2 )) || exit 0 | ||||
| fi | ||||
|  | ||||
| search "$@" | ||||
| @@ -17,11 +17,33 @@ | ||||
|  | ||||
| # HOST_TREE_ARTIX='gitea@gitea.artixlinux.org:artix' | ||||
|  | ||||
| # HOST_TREE_ARCH=git://projects.archlinux.org/svntogit | ||||
| # TREE_DIR_ARTIX=${WORKSPACE_DIR}/artixlinux | ||||
|  | ||||
| # TREE_NAMES_ARTIX=( | ||||
| #         packages | ||||
| #         community | ||||
| #         packages-kernel | ||||
| #         packages-openrc | ||||
| #         packages-runit | ||||
| #         packages-xorg | ||||
| #         packages-python | ||||
| #         packages-perl | ||||
| #         packages-qt5 | ||||
| #         packages-ruby | ||||
| # ) | ||||
|  | ||||
| # HOST_TREE_ARCH=git://git.archlinux.org/svntogit | ||||
|  | ||||
| # TREE_DIR_ARCH=${WORKSPACE_DIR}/archlinux | ||||
|  | ||||
| # TREE_NAMES_ARCH=(packages community) | ||||
|  | ||||
| # default repos root | ||||
| # REPOS_ROOT=${WORKSPACE_DIR}/repos | ||||
|  | ||||
| # default mirror for sogrep | ||||
| # SOLINKS_MIRROR="http://mirror1.artixlinux.org/repos" | ||||
|  | ||||
| ############################################# | ||||
| ################ artools-iso ################ | ||||
| ############################################# | ||||
|   | ||||
| @@ -1,4 +1,6 @@ | ||||
| #!/hint/bash | ||||
| # shellcheck disable=2034 | ||||
|  | ||||
| # | ||||
| # /etc/makepkg.conf | ||||
| # | ||||
| @@ -37,8 +39,8 @@ CHOST="x86_64-pc-linux-gnu" | ||||
|  | ||||
| #-- Compiler and Linker Flags | ||||
| CPPFLAGS="-D_FORTIFY_SOURCE=2" | ||||
| CFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fstack-protector-strong -fno-plt" | ||||
| CXXFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fstack-protector-strong -fno-plt" | ||||
| CFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fno-plt" | ||||
| CXXFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fno-plt" | ||||
| LDFLAGS="-Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now" | ||||
| #-- Make Flags: change this for DistCC/SMP systems | ||||
| #MAKEFLAGS="-j2" | ||||
| @@ -143,3 +145,5 @@ COMPRESSZ=(compress -c -f) | ||||
| # | ||||
| PKGEXT='.pkg.tar.xz' | ||||
| SRCEXT='.src.tar.gz' | ||||
|  | ||||
| # vim: set ft=sh ts=2 sw=2 et: | ||||
|   | ||||
							
								
								
									
										63
									
								
								data/pkglists/freedesktop.list
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								data/pkglists/freedesktop.list
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,63 @@ | ||||
| accountsservice | ||||
| cairo | ||||
| colord | ||||
| cppunit | ||||
| dbus | ||||
| dbus-glib | ||||
| dbus-python | ||||
| desktop-file-utils | ||||
| fontconfig | ||||
| geoclue2 | ||||
| glu | ||||
| gst-plugins-bad | ||||
| gst-plugins-base | ||||
| gst-plugins-good | ||||
| gst-plugins-ugly | ||||
| gstreamer | ||||
| harfbuzz | ||||
| hicolor-icon-theme | ||||
| libatasmart | ||||
| libbsd | ||||
| libdrm | ||||
| libevdev | ||||
| libinput | ||||
| libmbim | ||||
| libnice | ||||
| libqmi | ||||
| libvdpau | ||||
| libxcb | ||||
| libxft | ||||
| libxi | ||||
| media-player-info | ||||
| mesa | ||||
| modemmanager | ||||
| networkmanager | ||||
| orc | ||||
| p11-kit | ||||
| polkit | ||||
| poppler | ||||
| poppler-data | ||||
| pulseaudio | ||||
| pyxdg | ||||
| r | ||||
| sdl | ||||
| shared-mime-info | ||||
| sound-theme-freedesktop | ||||
| startup-notification | ||||
| systemdcompat | ||||
| telepathy-glib | ||||
| ttf-dejavu | ||||
| udisks2 | ||||
| upower | ||||
| wayland | ||||
| wayland-protocols | ||||
| webrtc-audio-processing | ||||
| xcb-proto | ||||
| xcb-util | ||||
| xcb-util-cursor | ||||
| xcb-util-image | ||||
| xcb-util-keysyms | ||||
| xcb-util-renderutil | ||||
| xcb-util-wm | ||||
| xdg-user-dirs | ||||
| xdg-utils | ||||
							
								
								
									
										63
									
								
								data/pkglists/gnome.list
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								data/pkglists/gnome.list
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,63 @@ | ||||
| adwaita-icon-theme | ||||
| atk | ||||
| at-spi2-atk | ||||
| at-spi2-core | ||||
| babl | ||||
| cantarell-fonts | ||||
| cogl | ||||
| dconf | ||||
| flatpak | ||||
| gamin | ||||
| gcab | ||||
| gconf | ||||
| gcr | ||||
| gdk-pixbuf2 | ||||
| gegl02 | ||||
| git | ||||
| glade | ||||
| glib2 | ||||
| glib-networking | ||||
| gnome-common | ||||
| gnome-keyring | ||||
| gobject-introspection | ||||
| gsettings-desktop-schemas | ||||
| gssdp | ||||
| gtk2 | ||||
| gtk3 | ||||
| gtk-doc | ||||
| gtksourceview3 | ||||
| gupnp | ||||
| gupnp-igd | ||||
| gvfs | ||||
| json-glib | ||||
| libcloudproviders | ||||
| libcroco | ||||
| libgee | ||||
| libglade | ||||
| libgnome-keyring | ||||
| libgudev | ||||
| libnotify | ||||
| librsvg | ||||
| libsecret | ||||
| libsoup | ||||
| libxml2 | ||||
| libxslt | ||||
| meld | ||||
| mobile-broadband-provider-info | ||||
| modemmanager | ||||
| networkmanager | ||||
| network-manager-applet | ||||
| orca | ||||
| ostree | ||||
| pango | ||||
| pyatspi | ||||
| pygobject | ||||
| pygobject2 | ||||
| pygtk | ||||
| rest | ||||
| ttf-bitstream-vera | ||||
| vala | ||||
| vte | ||||
| vte3 | ||||
| yelp-tools | ||||
| yelp-xsl | ||||
							
								
								
									
										4
									
								
								data/pkglists/kde.list
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								data/pkglists/kde.list
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | ||||
| phonon-gstreamer | ||||
| polkit-qt | ||||
| extra-cmake-modules | ||||
| phonon | ||||
							
								
								
									
										17
									
								
								data/pkglists/kernel.list
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								data/pkglists/kernel.list
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | ||||
| linux | ||||
| nvidia | ||||
| nvidia-utils | ||||
| acpi_call | ||||
| bbswitch | ||||
| broadcom-wl | ||||
| tp_smapi | ||||
| r8168 | ||||
| virtualbox-modules-artix | ||||
| linux-lts | ||||
| nvidia-lts | ||||
| acpi_call-lts | ||||
| bbswitch-lts | ||||
| broadcom-wl-lts | ||||
| tp_smapi-lts | ||||
| r8168-lts | ||||
| linux-firmware | ||||
							
								
								
									
										31
									
								
								data/pkglists/lxqt.list
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								data/pkglists/lxqt.list
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | ||||
| lxqt-about | ||||
| lxqt-admin | ||||
| lxqt-config | ||||
| lxqt-globalkeys | ||||
| lxqt-notificationd | ||||
| lxqt-openssh-askpass | ||||
| lxqt-panel | ||||
| lxqt-policykit | ||||
| lxqt-powermanagement | ||||
| lxqt-qtplugin | ||||
| lxqt-runner | ||||
| lxqt-session | ||||
| lxqt-sudo | ||||
| lxqt-themes | ||||
| lxqt-build-tools | ||||
|  | ||||
| compton-conf | ||||
| lximage-qt | ||||
| obconf-qt | ||||
| openbox | ||||
| pcmanfm-qt | ||||
| qterminal | ||||
| liblxqt | ||||
| libqtxdg | ||||
| lxmenu-data | ||||
| libfm-qt | ||||
| libfm | ||||
| qtermwidget | ||||
| libsysstat | ||||
| libstatgrab | ||||
| qps | ||||
							
								
								
									
										37
									
								
								data/pkglists/xorg.list
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								data/pkglists/xorg.list
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | ||||
| libdmx | ||||
| libfontenc | ||||
| libice | ||||
| libpciaccess | ||||
| libsm | ||||
| libx11 | ||||
| libxau | ||||
| libxaw | ||||
| libxcomposite | ||||
| libxcursor | ||||
| libxdamage | ||||
| libxdmcp | ||||
| libxext | ||||
| libxfixes | ||||
| libxfont2 | ||||
| libxi|libxft | ||||
| libxinerama | ||||
| libxkbfile | ||||
| libxkbui | ||||
| libxmu | ||||
| libxpm | ||||
| libxrandr | ||||
| libxrender | ||||
| libxres | ||||
| libxshmfence | ||||
| libxss | ||||
| libxt | ||||
| libxtst | ||||
| libxv | ||||
| libxvmc | ||||
| libxxf86vm | ||||
| pixman | ||||
| xbitmaps | ||||
| xkeyboard-config | ||||
| xorgproto | ||||
| xterm | ||||
| xtrans | ||||
| @@ -21,7 +21,7 @@ is_subvolume() { | ||||
| } | ||||
|  | ||||
| is_same_fs() { | ||||
|     [[ "$(stat -c %d "$1")" == "$(stat -c %d "$1")" ]] | ||||
|     [[ "$(stat -c %d "$1")" == "$(stat -c %d "$2")" ]] | ||||
| } | ||||
|  | ||||
| subvolume_delete_recursive() { | ||||
|   | ||||
| @@ -64,8 +64,30 @@ slock() { | ||||
|     fi | ||||
| } | ||||
|  | ||||
| _setup_workdir=false | ||||
| setup_workdir() { | ||||
|     [[ -z ${WORKDIR:-} ]] && WORKDIR=$(mktemp -d --tmpdir "${0##*/}.XXXXXXXXXX") | ||||
|     _setup_workdir=true | ||||
|     trap 'trap_abort' INT QUIT TERM HUP | ||||
|     trap 'trap_exit' EXIT | ||||
| } | ||||
|  | ||||
| trap_abort() { | ||||
|     trap - EXIT INT QUIT TERM HUP | ||||
|     abort | ||||
| } | ||||
|  | ||||
| trap_exit() { | ||||
|     local r=$? | ||||
|     trap - EXIT INT QUIT TERM HUP | ||||
|     cleanup $r | ||||
| } | ||||
|  | ||||
| cleanup() { | ||||
|     exit ${1:-0} | ||||
|     if [[ -n ${WORKDIR:-} ]] && $_setup_workdir; then | ||||
|         rm -rf "$WORKDIR" | ||||
|     fi | ||||
|     exit "${1:-0}" | ||||
| } | ||||
|  | ||||
| abort() { | ||||
| @@ -95,10 +117,11 @@ msg_row_notify(){ | ||||
|  | ||||
| msg_row(){ | ||||
|     local mesg=$1; shift | ||||
|     printf "${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2 | ||||
| #     printf "${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2 | ||||
|     printf "${WHITE} ${mesg}${ALL_OFF}\n" "$@" >&2 | ||||
| } | ||||
|  | ||||
| msg_row_upgrade(){ | ||||
|     local mesg=$1; shift | ||||
|     printf "${RED}${RED} ${mesg} ${ALL_OFF}\n" "$@" >&2 | ||||
|     printf "${RED} ${mesg} ${ALL_OFF}\n" "$@" >&2 | ||||
| } | ||||
|   | ||||
| @@ -74,15 +74,52 @@ init_artools_pkg(){ | ||||
|  | ||||
|     TREE_DIR_ARTIX=${TREE_DIR_ARTIX:-"${WORKSPACE_DIR}/artixlinux"} | ||||
|  | ||||
|     [[ -z ${TREE_NAMES_ARTIX[@]} ]] && \ | ||||
|     TREE_NAMES_ARTIX=( | ||||
|         packages | ||||
|         community | ||||
|         packages-kernel | ||||
|         packages-openrc | ||||
|         packages-runit | ||||
|         packages-xorg | ||||
|         packages-python | ||||
|         packages-perl | ||||
|         packages-qt5 | ||||
|         packages-ruby | ||||
| #         packages-desktop | ||||
| #         packages-kde | ||||
| #         packages-gnome | ||||
|     ) | ||||
|  | ||||
|     HOST_TREE_ARTIX=${HOST_TREE_ARTIX:-"gitea@${GIT_DOMAIN}:artixlinux"} | ||||
|  | ||||
|     TREE_DIR_ARCH=${TREE_DIR_ARCH:-"${WORKSPACE_DIR}/archlinux"} | ||||
|  | ||||
|     HOST_TREE_ARCH=${HOST_TREE_ARCH:-'git://projects.archlinux.org/svntogit'} | ||||
|     TREE_NAMES_ARCH=(packages community) | ||||
|  | ||||
|     HOST_TREE_ARCH=${HOST_TREE_ARCH:-'git://git.archlinux.org/svntogit'} | ||||
|  | ||||
|     CHROOTS_PKG="${CHROOTS_DIR}/buildpkg" | ||||
|  | ||||
|     REPOS_ROOT=${REPOS_ROOT:-"${WORKSPACE_DIR}/repos"} | ||||
|  | ||||
|     SOLINKS_MIRROR=${SOLINKS_MIRROR:-'http://mirror1.artixlinux.org/repos'} | ||||
|  | ||||
|     SOCACHE_DIR="${XDG_CACHE_HOME:-$USER_HOME/.cache}/sogrep" | ||||
|  | ||||
|     DBEXT=${DBEXT:-'xz'} | ||||
|  | ||||
|     LINKSDBEXT=${LINKSDBEXT:-"links.tar.${DBEXT}"} | ||||
|  | ||||
|     PKGDBEXT=${PKGDBEXT:-"db.tar.${DBEXT}"} | ||||
|  | ||||
|     [[ -z ${ARTIX_REPOS[@]} ]] && \ | ||||
|     ARTIX_REPOS=( | ||||
|         'goblins' 'gremlins' 'system' 'world' | ||||
|         'galaxy-goblins' 'galaxy-gremlins' 'galaxy' | ||||
|         'lib32-goblins' 'lib32-gremlns' 'lib32' | ||||
|         'gnome-wobble' 'kde-wobble' | ||||
|     ) | ||||
| } | ||||
|  | ||||
| init_artools_iso(){ | ||||
|   | ||||
| @@ -63,7 +63,7 @@ load_profile(){ | ||||
|  | ||||
|     PASSWORD=${PASSWORD:-'artix'} | ||||
|  | ||||
|     ADDGROUPS=${ADDGROUPS:-"video,power,cdrom,network,lp,scanner,wheel,users,log"} | ||||
|     ADDGROUPS=${ADDGROUPS:-"video,power,optical,network,lp,scanner,wheel,users,log"} | ||||
|  | ||||
|     if [[ -z ${SERVICES[@]} ]];then | ||||
|         SERVICES=('acpid' 'bluetooth' 'cronie' 'cupsd' 'syslog-ng' 'NetworkManager') | ||||
|   | ||||
							
								
								
									
										190
									
								
								lib/pkg/gitea.sh
									
									
									
									
									
								
							
							
						
						
									
										190
									
								
								lib/pkg/gitea.sh
									
									
									
									
									
								
							| @@ -19,7 +19,7 @@ create_repo(){ | ||||
|  | ||||
|     msg2 "Create package repo [%s] in org (%s)" "${pkg}" "${org}" | ||||
|  | ||||
|     curl -X POST "${GIT_URL}/api/v1/org/$org/repos?access_token=${GIT_TOKEN}" \ | ||||
|     curl -s -X POST "${GIT_URL}/api/v1/org/$org/repos?access_token=${GIT_TOKEN}" \ | ||||
|         -H "accept: application/json" \ | ||||
|         -H "content-type: application/json" \ | ||||
|         -d "$json" | ||||
| @@ -33,192 +33,30 @@ delete_repo(){ | ||||
|  | ||||
|     msg2 "Delete package repo [%s] in org (%s)" "${pkg}" "${org}" | ||||
|  | ||||
|     curl -X DELETE "${GIT_URL}/api/v1/repos/$org/$gitname?access_token=${GIT_TOKEN}" \ | ||||
|     curl -s -X DELETE "${GIT_URL}/api/v1/repos/$org/$gitname?access_token=${GIT_TOKEN}" \ | ||||
|         -H  "accept: application/json" | ||||
| } | ||||
|  | ||||
| load_team_id(){ | ||||
|     local org="$1" tree="$2" id=0 | ||||
|     local org="$1" team="$2" id=0 | ||||
|  | ||||
|     case $org in | ||||
|         packagesA) | ||||
|             case $tree in | ||||
|                 packages) id=70 ;; | ||||
|                 community) id=71 ;; | ||||
|             esac | ||||
|         ;; | ||||
|         packagesB) | ||||
|             case $tree in | ||||
|                 packages) id=72 ;; | ||||
|                 community) id=73 ;; | ||||
|             esac | ||||
|         ;; | ||||
|         packagesC) | ||||
|             case $tree in | ||||
|                 packages) id=74 ;; | ||||
|                 community) id=75 ;; | ||||
|             esac | ||||
|         ;; | ||||
|         packagesD) | ||||
|             case $tree in | ||||
|                 packages) id=76 ;; | ||||
|                 community) id=77 ;; | ||||
|             esac | ||||
|         ;; | ||||
|         packagesE) | ||||
|             case $tree in | ||||
|                 packages) id=78 ;; | ||||
|                 community) id=79 ;; | ||||
|             esac | ||||
|         ;; | ||||
|         packagesF) | ||||
|             case $tree in | ||||
|                 packages) id=80 ;; | ||||
|                 community) id=81 ;; | ||||
|             esac | ||||
|         ;; | ||||
|         packagesG) | ||||
|             case $tree in | ||||
|                 packages) id=82 ;; | ||||
|                 community) id=83 ;; | ||||
|             esac | ||||
|         ;; | ||||
|         packagesH) | ||||
|             case $tree in | ||||
|                 packages) id=84 ;; | ||||
|                 community) id=85 ;; | ||||
|             esac | ||||
|         ;; | ||||
|         packagesI) | ||||
|             case $tree in | ||||
|                 packages) id=86 ;; | ||||
|                 community) id=87 ;; | ||||
|             esac | ||||
|         ;; | ||||
|         packagesJ) | ||||
|             case $tree in | ||||
|                 packages) id=88 ;; | ||||
|                 community) id=89 ;; | ||||
|             esac | ||||
|         ;; | ||||
|         packagesK) | ||||
|             case $tree in | ||||
|                 packages) id=90 ;; | ||||
|                 community) id=91 ;; | ||||
|             esac | ||||
|         ;; | ||||
|         packagesL) | ||||
|             case $tree in | ||||
|                 packages) id=92 ;; | ||||
|                 community) id=93 ;; | ||||
|             esac | ||||
|         ;; | ||||
|         packagesM) | ||||
|             case $tree in | ||||
|                 packages) id=94 ;; | ||||
|                 community) id=95 ;; | ||||
|             esac | ||||
|         ;; | ||||
|         packagesN) | ||||
|             case $tree in | ||||
|                 packages) id=96 ;; | ||||
|                 community) id=97 ;; | ||||
|             esac | ||||
|         ;; | ||||
|         packagesO) | ||||
|             case $tree in | ||||
|                 packages) id=98 ;; | ||||
|                 community) id=99 ;; | ||||
|             esac | ||||
|         ;; | ||||
|         packagesP) | ||||
|             case $tree in | ||||
|                 packages) id=100 ;; | ||||
|                 community) id=101 ;; | ||||
|             esac | ||||
|         ;; | ||||
|         packagesQ) | ||||
|             case $tree in | ||||
|                 packages) id=105 ;; | ||||
|                 community) id=106 ;; | ||||
|             esac | ||||
|         ;; | ||||
|         packagesR) | ||||
|             case $tree in | ||||
|                 packages) id=107 ;; | ||||
|                 community) id=108 ;; | ||||
|             esac | ||||
|         ;; | ||||
|         packagesS) | ||||
|             case $tree in | ||||
|                 packages) id=109 ;; | ||||
|                 community) id=110 ;; | ||||
|             esac | ||||
|         ;; | ||||
|         packagesT) | ||||
|             case $tree in | ||||
|                 packages) id=111 ;; | ||||
|                 community) id=112 ;; | ||||
|             esac | ||||
|         ;; | ||||
|         packagesU) | ||||
|             case $tree in | ||||
|                 packages) id=113 ;; | ||||
|                 community) id=114 ;; | ||||
|             esac | ||||
|         ;; | ||||
|         packagesV) | ||||
|             case $tree in | ||||
|                 packages) id=115 ;; | ||||
|                 community) id=116 ;; | ||||
|             esac | ||||
|         ;; | ||||
|         packagesW) | ||||
|             case $tree in | ||||
|                 packages) id=117 ;; | ||||
|                 community) id=118 ;; | ||||
|             esac | ||||
|         ;; | ||||
|         packagesX) | ||||
|             case $tree in | ||||
|                 packages) id=119 ;; | ||||
|                 community) id=120 ;; | ||||
|             esac | ||||
|         ;; | ||||
|         packagesY) | ||||
|             case $tree in | ||||
|                 packages) id=121 ;; | ||||
|                 community) id=122 ;; | ||||
|             esac | ||||
|         ;; | ||||
|         packagesZ) | ||||
|             case $tree in | ||||
|                 packages) id=123 ;; | ||||
|                 community) id=124 ;; | ||||
|             esac | ||||
|         ;; | ||||
|         packagesPython) | ||||
|             case $tree in | ||||
|                 packages) id=103 ;; | ||||
|                 community) id=104 ;; | ||||
|             esac | ||||
|         ;; | ||||
|         packagesPerl) | ||||
|             case $tree in | ||||
|                 packages) id=102 ;; | ||||
|                 community) id=125 ;; | ||||
|             esac | ||||
|         ;; | ||||
|     local ids=($(curl -s -X GET "${GIT_URL}/api/v1/orgs/$org/teams?access_token=${GIT_TOKEN}" \ | ||||
|         -H  "accept: application/json" | jshon -a -e id)) | ||||
|  | ||||
|     case $team in | ||||
|         packages) id="${ids[2]}" ;; | ||||
|         community) id="${ids[1]}" ;; | ||||
|     esac | ||||
|  | ||||
|     echo $id | ||||
| } | ||||
|  | ||||
| add_repo_to_team(){ | ||||
|     local pkg="$1" org="$2" tree="$3" | ||||
|     local id=$(load_team_id "$org" "$tree") | ||||
|     local pkg="$1" org="$2" team="$3" | ||||
|     local id=$(load_team_id "$org" "$team") | ||||
|  | ||||
|     msg2 "Adding package repo [%s] to team (%s)" "$pkg" "$tree" | ||||
|     msg2 "Adding package repo [%s] to team (%s)" "$pkg" "$team" | ||||
|  | ||||
|     curl -X PUT "${GIT_URL}/api/v1/teams/$id/repos/$org/$pkg?access_token=${GIT_TOKEN}" \ | ||||
|     curl -s -X PUT "${GIT_URL}/api/v1/teams/$id/repos/$org/$pkg?access_token=${GIT_TOKEN}" \ | ||||
|         -H  "accept: application/json" | ||||
| } | ||||
|   | ||||
| @@ -23,7 +23,7 @@ get_remote_head(){ | ||||
| get_pkg_org(){ | ||||
|     local pkg="$1" org= sub= | ||||
|     case ${pkg} in | ||||
| #         ruby-*) org=${pkg:0:6}; sub="${org:5}"; echo "packagesRuby" ;; | ||||
|         ruby-*) org=${pkg:0:6}; sub="${org:5}"; echo "packagesRuby" ;; | ||||
|         perl-*) org=${pkg:0:6}; sub="${org:5}"; echo "packagesPerl" ;; | ||||
|         python-*) org=${pkg:0:8}; sub="${org:7}"; echo "packagesPython" ;; | ||||
|         python2-*) org=${pkg:0:9}; sub="${org:8}"; echo "packagesPython" ;; | ||||
| @@ -35,18 +35,10 @@ get_pkg_org(){ | ||||
|  | ||||
| subrepo_push(){ | ||||
|     local pkg="$1" | ||||
|     msg2 "Update (%s)" "$pkg" | ||||
|     msg2 "Push (%s)" "$pkg" | ||||
|     git subrepo push "$pkg" | ||||
| } | ||||
|  | ||||
| subrepo_config(){ | ||||
|     local pkg="$1" org="$2" | ||||
|     local gitname=$(get_compliant_name "$pkg") | ||||
|     local url=gitea@"${GIT_DOMAIN}":"$org"/"$gitname".git | ||||
|     msg2 "Update .gitrepo (%s) [%s]" "$pkg" "$url" | ||||
|     git subrepo config "$pkg" remote "$url" | ||||
| } | ||||
|  | ||||
| subrepo_clean(){ | ||||
|     local pkg="$1" | ||||
|     msg2 "Clean (%s)" "$pkg" | ||||
| @@ -55,20 +47,21 @@ subrepo_clean(){ | ||||
|  | ||||
| subrepo_pull(){ | ||||
|     local pkg="$1" | ||||
|     msg2 "Pull (%s)" "$pkg" | ||||
|     git subrepo pull "$pkg" | ||||
| } | ||||
|  | ||||
| subrepo_clone(){ | ||||
|     local pkg="$1" org="$2" | ||||
|     local gitname=$(get_compliant_name "$pkg") | ||||
|     msg2 "Getting package repo [%s] from org (%s)" "$pkg" "$org/$gitname" | ||||
|     msg2 "Clone [%s] from (%s)" "$pkg" "$org/$gitname" | ||||
|     git subrepo clone gitea@"${GIT_DOMAIN}":"$org"/"$gitname".git "$pkg" | ||||
| } | ||||
|  | ||||
| clone_tree(){ | ||||
|     local timer=$(get_timer) url="$1" tree="$2" | ||||
|     local timer=$(get_timer) url="$1" tree="$2" os="${3:-$(get_osname)}" | ||||
|  | ||||
|     msg "Cloning (%s) ..." "$tree" | ||||
|     msg "Cloning %s (%s) ..." "$tree" "$os" | ||||
|  | ||||
|     git clone $url/$tree.git | ||||
|     show_elapsed_time "${FUNCNAME}" "${timer}" | ||||
| @@ -86,11 +79,10 @@ has_changes(){ | ||||
| } | ||||
|  | ||||
| pull_tree(){ | ||||
|     local tree="$1" | ||||
|     local local_head=${2:-$(get_local_head)} | ||||
|     local tree="$1" local_head="$2" os="${3:-$(get_osname)}" | ||||
|     local remote_head=$(get_remote_head) | ||||
|  | ||||
|     msg "Checking (%s)" "${tree}" | ||||
|     msg "Checking %s (%s)" "${tree}" "$os" | ||||
|     if $(has_changes "${local_head}" "${remote_head}");then | ||||
|         git pull origin master | ||||
|     fi | ||||
| @@ -151,10 +143,10 @@ config_tree(){ | ||||
| } | ||||
|  | ||||
| subrepo_new(){ | ||||
|     local pkg="$1" team="$2" | ||||
|     local dest=${TREE_DIR_ARTIX}/$team/$pkg/trunk | ||||
|     local pkg="$1" tree="$2" team="${3:-$2}" | ||||
|     local dest=${TREE_DIR_ARTIX}/$tree/$pkg/trunk | ||||
|  | ||||
|     cd ${TREE_DIR_ARTIX}/$team | ||||
|     cd ${TREE_DIR_ARTIX}/$tree | ||||
|  | ||||
|     local org=$(get_pkg_org "$pkg") | ||||
|  | ||||
|   | ||||
| @@ -90,10 +90,45 @@ find_repo(){ | ||||
|     echo $repo | ||||
| } | ||||
|  | ||||
| get_cases(){ | ||||
|     local pkglist="${DATADIR}/pkglists/$1.list" | ||||
|     local _space="s| ||g" _clean=':a;N;$!ba;s/\n/ /g' _com_rm="s|#.*||g" | ||||
|  | ||||
|     local pkgs=($(sed "$_com_rm" "$pkglist" | sed "$_space" | sed "$_clean")) | ||||
|  | ||||
|     local cases= | ||||
|     for p in ${pkgs[@]};do | ||||
|         cases=${cases:-}${cases:+|}${p} | ||||
|     done | ||||
|     echo $cases | ||||
| } | ||||
|  | ||||
| get_artix_tree(){ | ||||
|     local pkg="$1" artix_tree="${2:-$3}" tree | ||||
|     eval "case $pkg in | ||||
|         $(get_cases kernel)) tree=packages-kernel ;; | ||||
|         python-*|python2-*) tree=packages-python ;; | ||||
|         perl-*) tree=packages-perl ;; | ||||
|         ruby-*) tree=packages-ruby ;; | ||||
|         xorg*|xf86*|$(get_cases xorg)) tree=packages-xorg ;; | ||||
|         *-openrc) tree=packages-openrc ;; | ||||
|         *-runit) tree=packages-runit ;; | ||||
|         qt5-*) tree=packages-qt5 ;; | ||||
|         lxqt*|$(get_cases lxqt)) tree=packages-lxqt ;; | ||||
|         *) tree=$artix_tree | ||||
|     esac" | ||||
|     echo $tree | ||||
|  | ||||
| #         $(get_cases freedesktop)) tree=packages-desktop ;; | ||||
| #         $(get_cases kde)) tree=packages-kde ;; | ||||
| #         $(get_cases gnome)) tree=packages-gnome ;; | ||||
|  | ||||
| } | ||||
|  | ||||
| get_import_path(){ | ||||
|     local pkg="$1" import_path= | ||||
|     for tree in ${tree_names[@]};do | ||||
|         [[ -d ${TREE_DIR_ARCH}/$tree/$pkg ]] && import_path=${TREE_DIR_ARCH}/$tree/$pkg | ||||
|     for tree in ${TREE_NAMES_ARCH[@]};do | ||||
|         [[ -d ${TREE_DIR_ARCH}/$tree/$pkg/repos ]] && import_path=${TREE_DIR_ARCH}/$tree/$pkg | ||||
|     done | ||||
|     echo $import_path | ||||
| } | ||||
| @@ -108,6 +143,14 @@ pkgver_equal() { | ||||
|     fi | ||||
| } | ||||
|  | ||||
| is_valid_repo(){ | ||||
|     local src="$1" | ||||
|     case $src in | ||||
|         core|extra|community|multilib|testing|staging|community-testing|community-staging|multilib-testing|multilib-staging|trunk) return 0 ;; | ||||
|         *) return 1 ;; | ||||
|     esac | ||||
| } | ||||
|  | ||||
| find_cached_package() { | ||||
|     local searchdirs=("$PKGDEST" "$PWD") results=() | ||||
|     local targetname=$1 targetver=$2 targetarch=$3 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user