Adds handling of the compression and temporary storage into namcap.py so it can be removed from the bash script. https://bugs.archlinux.org/task/59844 mentions "use setuptools entry points." instead of the bash script but I don't know how to do that. I just removed it from the bash script for now. diff --git a/namcap b/namcap index ea0bc94..019b077 100755 --- a/namcap +++ b/namcap @@ -1,39 +1,2 @@ #!/bin/bash - -args='' -tmp=$(mktemp -d --tmpdir namcap.XXXXXXXXXX) -cleanup() { - rm -rf "${tmp}" -} -trap 'cleanup' 0 - -for arg in "${@}"; do - if echo "${arg}" | grep -q -E "^.+\.pkg\.tar\..+$" && [ -f "${arg}" ]; then - - extra_opts='' - case "${arg##*.}" in - gz|z|Z) cmd='gzip' ;; - bz2|bz) cmd='bzip2' ;; - xz) cmd='xz' ;; - lzo) cmd='lzop' ;; - lrz) cmd='lrzip' - extra_opts="-q -o -" ;; - lz4) cmd='lz4' - extra_opts="-q" ;; - lz) cmd='lzip' - extra_opts="-q" ;; - zst) cmd='zstd' - extra_opts="-q" ;; - *) echo 'Unsupported compression'; exit 1;; - esac - - tar="${tmp}/$(basename "${arg%.*}")" - $cmd -dcf $extra_opts "${arg}" > "${tar}" - - args="${args} ${tar}" - else - args="${args} ${arg}" - fi -done - -/usr/bin/env python3 -m namcap ${args} +/usr/bin/env python3 -m namcap ${@} diff --git a/namcap.py b/namcap.py index a7f532a..c5b54ca 100755 --- a/namcap.py +++ b/namcap.py @@ -23,6 +23,9 @@ import getopt import os import sys import tarfile +import subprocess +import tempfile +import pathlib import Namcap.depends import Namcap.tags @@ -237,14 +240,51 @@ if len(active_modules) == 0: # Go through each package, get the info, and apply the rules for package in packages: - if not os.access(package, os.R_OK): + pkgpath = pathlib.Path(package) + + if not pkgpath.is_file(): print("Error: Problem reading %s" % package) - usage() + parser.print_usage() + continue # Skip to next package if any + + if pkgpath.with_suffix('').suffix == '.tar': + # What compression is used? + extra_opts = '' + if pkgpath.suffix == '.gz' or pkgpath.suffix == '.z' or pkgpath.suffix == '.Z': + cmd = 'gzip' + elif pkgpath.suffix == '.bz2' or pkgpath.suffix == '.bz': + cmd = 'bzip2' + elif pkgpath.suffix == '.xz': + cmd = 'xz' + elif pkgpath.suffix == '.lzo': + cmd = 'lzop' + elif pkgpath.suffix == '.lrz': + cmd = 'lrzip' + extra_opts="-q -o -" + elif pkgpath.suffix == '.lz4': + cmd = 'lz4' + extra_opts="-q" + elif pkgpath.suffix == '.lz': + cmd = 'lzip' + extra_opts="-q" + elif pkgpath.suffix == '.zst': + cmd = 'zstd' + extra_opts="-q" + else: + print("Unsupported compression!") + continue # Skip to next package if any + + # Run decompression and put the .tar file in a temporary directory + tmpdir = tempfile.TemporaryDirectory(prefix='namcap.') + tmpfilepath = pathlib.Path(tmpdir.name).joinpath(pkgpath.with_suffix('').name) + subprocess.run(cmd + ' -dcf ' + extra_opts + pkgpath.as_posix() + ' > ' + tmpfilepath.as_posix(), shell=True) + + if tmpfilepath.is_file() and tarfile.is_tarfile(tmpfilepath): + process_realpackage(package, active_modules) - if os.path.isfile(package) and tarfile.is_tarfile(package): - process_realpackage(package, active_modules) elif 'PKGBUILD' in package: process_pkgbuild(package, active_modules) + else: print("Error: %s not package or PKGBUILD" % package)