From patchwork Mon Mar 25 20:32:19 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Emil Velikov via arch-projects X-Patchwork-Id: 1049 Return-Path: Delivered-To: patchwork@archlinux.org Received: from apollo.archlinux.org (localhost [127.0.0.1]) by apollo.archlinux.org (Postfix) with ESMTP id 4769FCBA0BC4 for ; Mon, 25 Mar 2019 20:32:40 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on apollo X-Spam-Level: X-Spam-Status: No, score=-4.4 required=5.0 tests=BAYES_00=-1,DKIM_SIGNED=0.1, DKIM_VALID=-0.1,DKIM_VALID_AU=-0.1,MAILING_LIST_MULTI=-1, RCVD_IN_DNSWL_MED=-2.3,T_DMARC_POLICY_NONE=0.01 autolearn=ham autolearn_force=no version=3.4.2 X-Spam-BL-Results: [127.0.9.2] Received: from orion.archlinux.org (orion.archlinux.org [88.198.91.70]) by apollo.archlinux.org (Postfix) with ESMTPS for ; Mon, 25 Mar 2019 20:32:40 +0000 (UTC) Received: from orion.archlinux.org (localhost [127.0.0.1]) by orion.archlinux.org (Postfix) with ESMTP id 229AE116D75590; Mon, 25 Mar 2019 20:32:36 +0000 (UTC) Received: from luna.archlinux.org (luna.archlinux.org [5.9.250.164]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-384) server-signature RSA-PSS (4096 bits)) (No client certificate requested) by orion.archlinux.org (Postfix) with ESMTPS; Mon, 25 Mar 2019 20:32:36 +0000 (UTC) Received: from luna.archlinux.org (luna.archlinux.org [127.0.0.1]) by luna.archlinux.org (Postfix) with ESMTP id E5D922BF50; Mon, 25 Mar 2019 20:32:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=archlinux.org; s=luna2; t=1553545955; bh=fPS3ieFN0S/ilw69aFo36KXTlMMsVSKABHQjGMlxJ1s=; h=To:Date:In-Reply-To:References:Subject:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc; b=b6exUYeL6V8Iuww94S9kPsC9jzylpIxsGRBZTwB55CaX8VB876qs35kQIn5RUYfN1 R1UR2BivRkNbCPWdqbCuTNwo5zSJeQSImOxSO9QJYxl9dy0gupRzVv3NTsHwzSBoXB vnYmIwv/DIK/aGGY2LXs7qOMTNheL+v7yv8dmQARucQIakXDETQ/N/u1m+LojofaSW 7TsqzhRX3o8H5N/2GfWMiAmImxEAQrgj6AGNaN0wFIUHsaU8OI9EdScfzY6EK8YnSa +bvKlB5B91iYeMcnh0IJ6yxdechJMPgNzQu/gtY6QbMkVxIY9Im2pjKhzC8iP1ss+g D0kBHSjOxITLdHoxadA9Uxau1yJaNMRq8xV/H+9NoWhHDlccMX6aFr/BzWWv95Ck7w DRxPOcByuZ4oDVP5Y+jze9hNqzpktJQPWIRmmYHgarJ9pSZw6qElYo3Nb+nGUGD+oo liU/rnxPIadVyqHk2YW00MoWs7SXmn0ejTbVOz3ZUCLjR+7W3zACo5r6AT2AbTX+KO HFaB3eNk38Owowg4xfjRysEToUn0TBZueFlf4smtZre8/oHYfHKnMZtXWaA+L3Jt4R 8pO2XB6+62OyIyfXlmaco1+YN8Mjg7Wnee62uk4g3x3f+WSBU918sxTotAkjZYcJME haokzA85n7b87Or2hk6Pd2lg= Received: from luna.archlinux.org (luna.archlinux.org [127.0.0.1]) by luna.archlinux.org (Postfix) with ESMTP id 8922E2BF1D for ; Mon, 25 Mar 2019 20:32:33 +0000 (UTC) Received: from orion.archlinux.org (orion.archlinux.org [88.198.91.70]) by luna.archlinux.org (Postfix) with ESMTPS for ; Mon, 25 Mar 2019 20:32:33 +0000 (UTC) Received: from orion.archlinux.org (localhost [127.0.0.1]) by orion.archlinux.org (Postfix) with ESMTP id A80E7116D75588; Mon, 25 Mar 2019 20:32:31 +0000 (UTC) Received: from didactylos.localdomain (unknown [216.97.144.2]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-384) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: eschwartz) by orion.archlinux.org (Postfix) with ESMTPSA id 35246116D75579; Mon, 25 Mar 2019 20:32:31 +0000 (UTC) To: arch-projects@archlinux.org Date: Mon, 25 Mar 2019 16:32:19 -0400 Message-Id: <20190325203220.23083-2-eschwartz@archlinux.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190325203220.23083-1-eschwartz@archlinux.org> References: <20190325203220.23083-1-eschwartz@archlinux.org> MIME-Version: 1.0 Subject: [arch-projects] [devtools] [PATCH 2/3] add sogrep command X-BeenThere: arch-projects@archlinux.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Arch Linux projects development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , From: Eli Schwartz via arch-projects Reply-To: Arch Linux projects development discussion Cc: Eli Schwartz Errors-To: arch-projects-bounces@archlinux.org Sender: "arch-projects" This is the new and improved, canonical sogrep command, now with a valid license. The previous version of sogrep had several issues and inefficiencies, and ultimately wasn't really the finished project I wanted it to be. Due to a mistake in communication, I was totally unaware it was in the process of being merged at all, nor that there was a licensing issue, or I would have recommended waiting for both further improvements, and a declaration of license intent; nevertheless, here it is now, and I formally give this over into the GPLv2+ domain. Signed-off-by: Eli Schwartz --- sogrep | 101 +++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 76 insertions(+), 25 deletions(-) mode change 100644 => 100755 sogrep diff --git a/sogrep b/sogrep old mode 100644 new mode 100755 index 3be2672..56a0e70 --- a/sogrep +++ b/sogrep @@ -1,6 +1,24 @@ #!/bin/bash -# License: Unspecified +# +# sogrep - find shared library links in an Arch Linux repository. +# +# Copyright (c) 2019 by Eli Schwartz +# +# 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 . +# +# globals : ${SOLINKS_MIRROR:="https://mirror.pkgbuild.com"} : ${SOCACHE_DIR:="${XDG_CACHE_HOME:-${HOME}/.cache}/sogrep"} repos=('staging' 'testing' 'core' 'extra' @@ -9,54 +27,66 @@ repos=('staging' 'testing' 'core' 'extra' 'gnome-unstable' 'kde-unstable') arches=('x86_64') +# options +REFRESH=0 +VERBOSE=0 + +source /usr/share/makepkg/util/parseopts.sh source /usr/share/makepkg/util/util.sh recache() { - local repo arch + local repo arch verbosity=-s + + (( VERBOSE )) && verbosity=--progress-bar for repo in "${repos[@]}"; do for arch in "${arches[@]}"; do rm -rf "${SOCACHE_DIR}/${arch}/${repo}" mkdir -p "${SOCACHE_DIR}/${arch}/${repo}" - curl "${SOLINKS_MIRROR}/${repo}/os/${arch}/${repo}.links.tar.gz" | bsdtar -xf - -C "${SOCACHE_DIR}/${arch}/${repo}" + curl "$verbosity" "${SOLINKS_MIRROR}/${repo}/os/${arch}/${repo}.links.tar.gz" | bsdtar -xf - -C "${SOCACHE_DIR}/${arch}/${repo}" done done } search() { - local repo=$1 arch lib=$2 + local repo=$1 arch lib=$2 srepos=("${repos[@]}") if [[ $repo != all ]]; then - if ! in_array "$repo" "${repos[@]}"; then + if ! in_array "${repo}" "${repos[@]}"; then echo "${BASH_SOURCE[0]##*/}: unrecognized repo '$repo'" echo "Try '${BASH_SOURCE[0]##*/} --help' for more information." exit 1 fi - local repos=("${repo}") - fi - - if [[ ! -d ${SOCACHE_DIR} ]]; then - recache + srepos=("${repo}") fi for arch in "${arches[@]}"; do - for repo in "${repos[@]}"; do + 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}} - printf '%s/%s\n' "${repo}" "${pkg%-*-*/links}" - done < <(grep -rlZ "${lib}" "${db}") + pkg="${prefix}${pkg%-*-*/links}" + + if (( VERBOSE )); then + printf '%-35s %s\n' "${pkg}" "${match}" + else + printf '%s\n' "${pkg}" + fi + done < <(grep -rZ "${lib}" "${db}") | sort -u fi done - done | sort -u + done | resort } usage() { cat <<- _EOF_ Usage: ${BASH_SOURCE[0]##*/} [OPTIONS] REPO LIBNAME - Check the soname links database for pacman repositories containing + Check the soname links database for Arch 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. @@ -64,35 +94,56 @@ usage() { 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 +while :; do case $1 in + -v|--verbose) + resort() { cat; } + VERBOSE=1 + ;; -r|--refresh) - recache + REFRESH=1 ;; -h|--help) usage exit 0 ;; - *) - if (( $# < 2 )); then - echo "error: Not enough arguments passed." - echo "Try '${BASH_SOURCE[0]##*/} --help' for more information." - exit 1 - fi - search "$@" - exit $? + --) + 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 "$@"