diff --git a/tools/getsource.sh b/tools/getsource.sh index bd54108..3620387 100755 --- a/tools/getsource.sh +++ b/tools/getsource.sh @@ -1,159 +1,215 @@ -#!/bin/bash - -# getsource - Get build files for Arch/AUR packages on Arch Linux -# Copyright (C) 2018 Pekka Helenius +#!/usr/bin/env bash # -# 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. +# getsource - Get build files from Arch Linux official and AUR repositories # -# 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. +# Copyright (C) 2021 Pekka Helenius # -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -########################################################### - -# TODO: Add support for wider range of processor architectures (below) -# TODO: Add directory support (getsource wine ~/winesource) +# 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 . +# +# TODO: Add support for wider range of processor architectures +# TODO: Add directory support (e.g. getsource wine ~/winesource) # TODO: create subdir for source files automatically to the current main dir -########################################################### +LIBRARY=${LIBRARY:-'/usr/share/makepkg'} -ARCH_DOMAINURL="https://git.archlinux.org" -ARCH_GITBASES=('packages.git' 'community.git') +source "$LIBRARY/util/message.sh" -AUR_DOMAINURL="https://aur.archlinux.org" -AUR_GITBASES=('aur.git') +# check if messages are to be printed using color +if [[ -t 2 && $USE_COLOR != "n" ]]; then + colorize +else + unset ALL_OFF BOLD BLUE GREEN RED YELLOW +fi -CURDIR=$(pwd | awk '{print $NF}' FS=/) +PACKAGE=$(pwd | awk '{print $NF}' FS=/) if [[ -n "$1" ]]; then - CURDIR="$1" + PACKAGE="$1" else - read -r -p "Source package name? [Default: $CURDIR] " response + read -r -p "Source package name? [Default: $PACKAGE ] " response if [[ -n $response ]]; then - CURDIR=$response + PACKAGE=$response + else + echo "Assuming current dir name [ $PACKAGE ]" fi fi INPUT="${CURDIR}" +BUILDSCRIPT="PKGBUILD" +URLFILE="baseurl.html" + +ARCHIVEFORMATS=( + 'tar.gz' + 'tar.xz' + 'tar.lz' + 'tar.zst' +) + ################################## -function check_database() { - for GITBASE in ${2}; do +DBS_TO_CHECK=('arch' 'aur' 'arch_deepscan') - if [[ "$1" != "$AUR_DOMAINURL" ]]; then - BASEURL="$1/svntogit/$GITBASE/tree/trunk?h=packages/$CURDIR" - DOMAINURL=$ARCH_DOMAINURL - else - BASEURL="$1/cgit/$GITBASE/snapshot/$CURDIR.tar.gz" - DOMAINURL=$AUR_DOMAINURL - fi +ARCH_DATABASES=( + 'core' + 'extra' + 'community' + 'community-testing' +) + +# TODO +# Fetch from pacman.conf +CUSTOM_DATABASES=() + +ARCH_GITBASES=( + 'archlinux/svntogit-packages' +) + +################################## - wget -q -T 10 "$BASEURL" -o - - if [[ $? -eq 0 ]]; then - wget -q "$BASEURL" - if [[ "$1" != "$AUR_DOMAINURL" ]]; then - mv ./trunk?h=packages%2F$CURDIR ./baseurl.html - else - tar xf "$CURDIR.tar.gz" - fi - break +function get_url() { + if ! wget -q -T 10 "${1}" -O - >/dev/null; then return 1; fi + if wget -q -c "${1}" -O "${2}"; then return 0; fi + return 1 +} + +function fetch_database() { + + case "${1}" in + #custom) TODO + #BASEURL=".*/\1/; s/\/blob//g" | grep trunk) ) + for i in ${FILEHREFS[@]}; do + FILENAMES+=( $(echo "${i}" | sed 's/.*\///g') ) + done + DOMAINURL="https://raw.githubusercontent.com" + download_sourcefiles && return 0 fi - done + done + return 1 + ;; + aur) + local ISSNAPSHOT + DOMAINURL="https://aur.archlinux.org" + local SNAPSHOTURL="${DOMAINURL}/packages/${PACKAGE}/" + REPOMSG="Using Arch Linux user repositories (AUR)" + + if get_url "${SNAPSHOTURL}" "${URLFILE}"; then + FILEHREFS=($(grep -oP '(?<=href\=\"\/).*?(?=\"\>Download snapshot)' "${URLFILE}")) + FILENAMES=($(grep -oP '(?<=snapshot\/).*?(?=\"\>Download snapshot)' "${URLFILE}")) + download_sourcefiles && return 0 + fi + return 1 + ;; + arch_deepscan) + arch_repos_deepscan + ;; + esac + + [[ -f "${URLFILE}" ]] || return 1 - if [[ ! -f ./baseurl.html ]]; then - return 1 - fi } ################################## function arch_repos_deepscan() { - ARCH_DATABASES=(core extra community community-testing) + for ARCH_DB in ${ARCH_DATABASES[@]}; do + ARCH_DB_URL="https://www.archlinux.org/packages/${ARCH_DB}/x86_64/${PACKAGE}" + get_url "${ARCH_DB_URL}" "${URLFILE}" + done + + if [[ -f "${URLFILE}" ]]; then + msg "$(gettext "Selecting another package name:")" + PACKAGE=$(grep "Source Files" "${URLFILE}" | sed "s/.*href=[\"'].*packages\///g; s/[\"'].*//g") + warning "$(gettext "Package name is %s.")" "$PACKAGE" + rm -rf "${URLFILE}" + fetch_database arch ${ARCH_GITBASES[@]} + download_sourcefiles + else + error "$(gettext "Couldn't find package %s.")" "$PACKAGE" + exit 1 + fi - for ARCH_DB in ${ARCH_DATABASES[*]}; do +} - ARCH_DB_URL="https://www.archlinux.org/packages/$ARCH_DB/x86_64/$CURDIR" +################################## - wget -q -T 10 "$ARCH_DB_URL" -o - - if [[ $? -eq 0 ]]; then - wget -q "$ARCH_DB_URL" - mv ./$CURDIR ./baseurl_2.html - break - fi +function download_sourcefiles() { + + if [[ -f "${URLFILE}" ]]; then + + msg "${REPOMSG}" + + local a=0 + for FILEURL in ${FILEHREFS[@]}; do + echo "${DOMAINURL}/${FILEURL} ${FILENAMES[$a]}" + msg2 "$(gettext "Downloading %s...")" "${FILENAMES[$a]}" + $(wget -q "${DOMAINURL}/${FILEURL}" -O "${FILENAMES[$a]}") + + [[ -f "${FILENAMES[$a]}" ]] || warning "$(gettext "Couldn't download %s")" "${FILENAMES[$a]}" + let a++ done - if [[ -f baseurl_2.html ]]; then - echo -e "Selecting another package name:\n" - CURDIR=$(grep "Source Files" baseurl_2.html | sed "s/.*href=[\"'].*packages\///g; s/[\"'].*//g") - echo -e "Package name is $CURDIR" - rm baseurl_2.html - check_database "$ARCH_DOMAINURL" "${ARCH_GITBASES[*]}" - arch_dl_files - else - echo -e "\nCouldn't find package $CURDIR\n" - exit 1 + rm -rf "${URLFILE}" + + if [[ ISSNAPSHOT ]]; then + for ARCHIVEFORMAT in "${ARCHIVEFORMATS[@]}"; do + find . -iname "*${ARCHIVEFORMAT}" -exec tar xf {} --strip-components=1 \; + done fi -} + if [[ $? -eq 0 ]]; then + msg "$(gettext "Source files for %s downloaded".)" "$PACKAGE" + return 0 + fi -################################## + fi -function arch_dl_files() { - if [[ -f baseurl.html ]]; then - FILELIST=$(cat baseurl.html | grep -E "ls-mode" | sed "s/.*href=[\"']//g; s/[\"']>plain.*//g") - - for file in $FILELIST; do - if [[ ! -f $file ]]; then - # Wget only if file doesn't exist - wget -q $DOMAINURL/$file - mv $(echo "$file" | sed 's/.*trunk//g; s/\///1' | sed 's/\//%2F/g') $(echo $file | sed 's/.*trunk//g; s/?.*//g; s/\///g') - fi - done - rm baseurl.html - echo -e "\nSource files for $CURDIR downloaded\n" - - elif [[ -f "$CURDIR.tar.gz" ]]; then - mv ./$CURDIR/* ./ - rm -Rf {"$CURDIR.tar.gz",$CURDIR} - echo -e "\nSource files for $CURDIR downloaded\n" - else - arch_repos_deepscan - fi } ################################## -check_database "$ARCH_DOMAINURL" "${ARCH_GITBASES[*]}" - -if [[ ! $? -eq 0 ]]; then - check_database "$AUR_DOMAINURL" "${AUR_GITBASES[*]}" -fi +# TODO +# +#DBS_TO_CHECK+=('custom') -arch_dl_files +for db in ${DBS_TO_CHECK[@]}; do + [[ $(fetch_database "${db}") ]] && break +done ################################## -# Check if we are raspberry pi (ARM 7) or not -if [[ $(cat /proc/cpuinfo | grep -i armv7 -m1 | wc -l) -eq 1 ]]; then - if [[ -f PKGBUILD ]]; then - cat PKGBUILD | grep arch= | grep -E "any|armv7h" > /dev/null - if [[ $? -ne 0 ]]; then - sed -i "s/arch=.*/arch=('any')/" PKGBUILD - echo -e "Modified architecture in PKGBUILD to 'any'\n" - fi - fi +if [[ -f ${BUILDSCRIPT} ]]; then + sed -i "s/^arch=.*/arch=('any')/" ${BUILDSCRIPT} + if [[ $? -eq 0 ]]; then msg "$(gettext "Set architecture to 'any' in ${BUILDSCRIPT}.")"; fi fi - -################################## - -rm -rf ./{"${INPUT}"*.1,*trunk*} 2>/dev/null