pax_global_header00006660000000000000000000000064127441030120014504gustar00rootroot0000000000000052 comment=2b95db564dbbc7a2b0e2d12dbea150836943351d pacapt-2.3.13/000077500000000000000000000000001274410301200130425ustar00rootroot00000000000000pacapt-2.3.13/.gitignore000066400000000000000000000000321274410301200150250ustar00rootroot00000000000000*~ pacapt.dev tests/tmp/* pacapt-2.3.13/CHANGELOG.md000066400000000000000000000056571274410301200146700ustar00rootroot00000000000000## v2.3.13 * `lib/dpkg`: Fix `-Qs` for old `dpkg`. For developers: * Test scripts can now be automated thanks to `tests/*`; * `tests/slitz40`: Add; * `tests/dpkg`: Update. ## v2.3.12 * `lib/dpkg`: Fix #84 (incorrect implementation of `-Qs`.) For developers: * `bin/gen_tests.rb`: Add; * `lib/dpkg`: Add and update test cases; * `CONTRIBUTING`: Add new section `Writting test cases`. ## v2.3.11 * `lib/tazpkg`: Improve `-U`. ## v2.3.10 * `lib/tazpkg`: Support `-Scc`. ## v2.3.9 * `lib/tazpkg`: Support `SliTaz` distribution. For developers: * `contrib/*`: Add instructions to build packages on some distributions (Credit: `Pival81`). ## v2.3.8 * `lib/alpine`: Support `Alpine` distirubtion (Credit: `Carl X. Su`, `Cuong Manh Le`); * `lib/dnf`: Support new package manager on `Fedora` system (Credit: `Huy Ngô`); * `lib/termux`: Support `termux` on Android (Credit: `Jiawei Zhou`); * `lib/zypper`: New option `-Sw` (Forgot to merge #72); * `lib/yum`: New option `-Qs` (Credit: `Siôn Le Roux`); For developers: * Improve translation method `_translate_all`; ## v2.2.7 * `lib/zypper`: Complete query/removal options (Credit: `Janne Heß`); * `lib/cave`: Fix an issue with `-R` option; * New option `--noconfirm` to help non-interactive scripts (Cf. #43). Currently available for `pkgng`, `yum`, `dpkg` and `zypper`. For developers: * `lib/{00_core,zz_main}`: Refactor to support future option translation; * Refactor code supports `-w` (download only) and `-v` (debug) options; * Improve coding quality thanks to `shellcheck`; * Move `compile.sh` to `bin/compile.sh`; * Use `lib/00_core#_translate_all` to add future option translation; * `bin/check`: Add script to inspect coding style issues (Cf. #54). ## v2.1.6 * `lib/sun_tools`: `SunOS` support (Credit: `Daniel YC Lin`); * Fix a minor bug related to argument parsing (4287ff16e869a0960ea54233); * Improve documentation; * `lib/dnf`: Add some initial support; * Adding `GREP` and `AWK` environments to future non-`Linux` systems; * `compile.sh` will exit if it can't detect version information; * `README` has a table of supported operations generated by `compile.sh`; * In debug mode, `pacapt` will print body of function it would execute. ## v2.0.5 * `lib/zz_main`: Improve secondary option parsing; * `lib/pkg_tools`: Remove `Rns` support. ## v2.0.4 * `openbsd/pkg_tools`: Add (Credit: `Somasis`); * `homebrew/Su*`: Use `--all` flag when upgrading; * `homebrew/*`: Some typo fixes; * `compile.sh`: `git` becomes optional (useful for `docker` tester.); * `compile.sh`: Get list of authors from `README.md`; * `Makefile`: Various improvements; * `lib/00_core`: Add `_removing_is_dangerous` method; * `lib/00_core`: `_not_implemented` now returns `1`; * `lib/help.txt`: Remove list of authors from help message; * `CHANGELOG.md`: Add. ## v2.0.3 * `homebrew/Qs`: Add; * `homebrew/*`: Fix minor bugs. ## v2.0.2 * `lib/zz_main`: Fix quoting issue (Credit: `Cuong Manh Le`). ## v2.0.1 * `git log v2.0.1`. pacapt-2.3.13/CONTRIBUTING.md000066400000000000000000000041341274410301200152750ustar00rootroot00000000000000## Table of contents 1. [Coding style](#coding-style) 1. [Testing. Writting test cases](#testing-writting-test-cases) 1. [Generating pacapt script](#generating-pacapt-script) 1. [Branches](#branches) 1. [Closed branches](#closed-branches) ## Coding style 1. Don't use tab or smart tab; 1. Use `2-space` instead of a tab; 1. Contribute to library file under `./lib/` directory; 1. We try to follow the convention from: https://github.com/icy/bash-coding-style. ## Testing. Writting test cases See also `tests/README.md`. 1. Use `make shellcheck` if you have a network connection, and enough `Perl` packages (`JSON`, `URI::Escape`) on your system; 1. Use `PACAPT_DEBUG=foo` where `foo` is a package manager (`dpkg`, `pacman`, `zypper`, ...) to print what `pacapt` will do. Use `PACAPT_DEBUG=auto` for auto-detection; 1. You can use `docker` for testing, by mounting the `pacapt.dev` script to the container. See also `docker.i` section in `Makefile`. Example: ```` $ make pacapt.dev $ docker run --rm -ti \ -v $PWD/pacapt.dev:/usr/bin/pacman \ debian:stable /bin/bash # you are in container now ```` ## Generating `pacapt` script 1. The `pacapt` script is generated from the latest stable branch, it is there to make installation process simple; 1. Please **do not** use `make pacapt` to update `pacapt`, and/or modify it manually; 1. For your development, use `make pacapt.dev`; To generate the table of implemented options, use `PACAPT_STATS=1`. This table is manually replaced the one in `README` file. ## Branches 1. `ng`: The current development branch. Some pull requests are merged on to this branch, but the work may not be ready for production. 1. `v2.0`: The current stable branch. All future `v2.x` releases come from this branch. 1. `your feature branch`: For new feature or bug fix, please work on your own branch and create pull request. Do not put different ideas on a same branch because that makes future tracking harder. ## Closed branches 1. `master`: The old stable code of the `pacapt`. This branch is closed on May 4th, 2014. pacapt-2.3.13/COPYING000066400000000000000000000003661274410301200141020ustar00rootroot00000000000000Copyright (C) 2010 - 2014 Anh K. Huynh Usage of the works is permitted provided that this instrument is retained with the works, so that any entity that uses the works is notified of this instrument. DISCLAIMER: THE WORKS ARE WITHOUT WARRANTY. pacapt-2.3.13/Makefile000066400000000000000000000042621274410301200145060ustar00rootroot00000000000000BINDIR=/usr/local/bin/ DISTRO=debian:stable default: @echo "This is an experimental Makefile. Use it at your own risk." @echo "" @echo " pacapt.dev : Generate development script." @echo ' install.dev : Install development script into $$BINDIR.' @echo " pacapt : Generate stable script." @echo ' install : Install stable script into $$BINDIR.' @echo " clean : (Experimental) Remove git-ignored files." @echo " shellcheck : Syntax and style checking. Use http://shellcheck.net/." @echo " docker.i : Launch interactive Docker container which mounts." @echo ' your local 'pacapt.dev' script to $$BINDIR/pacman.' @echo "" @echo "Environments" @echo "" @echo " VERSION : Version information. Default: git commit hash." @echo " BINDIR : Destination directory. Default: /usr/local/bin." @echo " DISTRO : Container image. Default: debian:stable." # Build and install development script pacapt.dev: ./lib/*.sh ./lib/*.txt bin/compile.sh @./bin/compile.sh > $(@) @bash -n $(@) @chmod 755 $(@) @echo 1>&2 "The output file is '$(@)' (unstable version)" install.dev: pacapt.dev @if [ -e $(@) ] && ! file $(@) | grep -q 'script'; then \ echo >&2 "Makefile Will not overwrite non-script $(@)"; \ exit 1; \ else \ install -vm755 pacapt.dev $(BINDIR)/pacapt; \ fi # Build and install stable script pacapt: ./lib/*.sh ./lib/*.txt bin/compile.sh @./bin/compile.sh > $(@) @bash -n $(@) @chmod 755 $(@) @echo 1>&2 "The output file is '$(@)' (stable version)" install: $(BINDIR)/pacapt $(BINDIR)/pacman: @if [ ! -e $(@) ]; then \ ln -vs $(BINDIR)/pacapt $(@); \ fi $(BINDIR)/pacapt: pacapt @if [ -e $(@) ] && ! file $(@) | grep -q 'script'; then \ echo >&2 "Makefile Will not overwrite non-script $(@)"; \ exit 1; \ else \ install -vm755 pacapt $(BINDIR)/pacapt; \ fi docker.i: @docker run --rm -ti \ -v $(PWD)/pacapt.dev:$(BINDIR)/pacman \ $(DISTRO) /bin/bash clean: @if git clean -nX | grep -q .; then \ git clean -nX; \ echo -n "Remove these files? [y/N] "; \ read ANS; \ case "$$ANS" in \ [yY]*) git clean -fX ;; \ *) exit 1;; \ esac ; \ fi shellcheck: @./bin/check.sh _check_files bin/*.sh lib/*.sh pacapt-2.3.13/README.md000066400000000000000000000143751274410301200143330ustar00rootroot00000000000000## Table of contents * [Name](#name) * [Description](#description) * [Installation](#installation) * [Installation from Pival81 repository](#installation-from-pival81-repository) * [Usage](#usage) * [Implemented Operations](#implemented-operations) * [Support](#support) * [Development](#development) * [License](#license) * [Authors](#authors-contributors) ## Name `pacapt` - An `Arch`'s pacman-like package manager for some `Unices`. ## Description An `Arch`'s pacman-like package manager for some `Unices`. Actually this `Bash` script provides a wrapper for system's package manager. For example, on `CentOS` machines, you can install `htop` with command $ pacapt -S htop Instead of remembering various options/tools on different `OS`s, you only need a common way to manipulate packages. Not all options of the native package manager are ported; the tool only provides a very basic interface to search, install, remove packages, and/or update the system. `Arch`'s pacman is chosen, as pacman is quite smart when it divides all packages-related operations into three major groups: `Synchronize`, `Query` and `Remove/Clean up`. It has a clean man page, and it is the only tool needed to manipulate official packages on system. (`Debian`, for example, requires you to use `apt-get`, `dpkg`, and/or `aptitude`.) The tool supports the following package managers: * `pacman` by `Arch Linux`, `ArchBang`, `Manjaro`, etc. * `dpkg/apt-get` by `Debian`, `Ubuntu`, etc. * `homebrew` by `Mac OS X` * `macports` by `Mac OS X` * `yum/rpm` by `Redhat`, `CentOS`, `Fedora`, etc. * `portage` by `Gentoo` * `zypper` by `OpenSUSE` * `pkgng` by `FreeBSD` * `cave` by `Exherbo Linux` * `pkg_tools` by `OpenBSD` * `sun_tools` by `Solaris(SunOS)` * `apk` by `Alpine Linux` * `tazpkg` by `SliTaz Linux` ## Installation 1. This script shouldn't be installed on an Arch-based system; 2. On `FreeBSD` and `Alpine Linux`, please install `bash` package first; 3. Download the stable script and make it executable ```` $ sudo wget -O /usr/local/bin/pacapt \ https://github.com/icy/pacapt/raw/ng/pacapt $ sudo chmod 755 /usr/local/bin/pacapt $ sudo ln -sv /usr/local/bin/pacapt /usr/local/bin/pacman || true ```` On some system, `/usr/local/bin` is not in the search paths when the command is executed by `sudo`. You may want to use `/usr/bin/pacman` or `/usr/bin/pacapt` instead. This stable script is generated from the latest stable branch, which is `v2.0` at the moment. If you want to compile a script from its components, please make sure you use a correct branch. See `CONTRIBUTING.md` for details. ## Installation from Pival81 repository @Pival81 creates specification to build packages on various Linux distributions (CentOS, Debian, Fedora, OpenSUSE, RHEL, Ubuntu). The specification can be found under the `contrib/` directory. @Pival81 also builds packages which are ready to use on your machine. See the following link for details. http://software.opensuse.org/download.html?project=home:Pival81&package=pacapt ## Usage Some basic command line options * `-h` (`--help`): Print help message; * `-P`: Print list of suppoted operations; * `-V`: Print script version Some popular options of the original `ArchLinux`'s `pacman` program are supported and listed in the table in the next section. A short description can be found at https://github.com/icy/pacapt/blob/ng/lib/help.txt. ## Implemented operations _(Note: This table is generated automatically from the latest development work. Some features may be missing in the stable script. Please don't change this table manually when you create new pull request.)_ ``` Q Qc Qi Ql Qm Qo Qp Qs Qu R Rn Rns Rs S Sc Scc Sccc Si Sii Sl Ss Su Suy Sw Sy U apk y . y y . y . y y y y y y y y y y y y y y y y y y y cave y . y y . y y y y y y y y y y y y y . . y y y . y y dnf y y y y y y y y y y . . . y y y y y . y y y y y y y dpkg y . y y . y y y y y y y y y y y y y y . y y y . y y homebrew y y y y . y . y y y . . y y y y y y . . y y y . y . macports . y . y . y . . y y . . y y y y . y . . y y y . y . pkgng y . y y . y y . y y . . y y y y . y . . y y y . y . pkg_tools y . y y . y y . y y y y y y y y . y . y y y y . y . portage y y y y . y . . y y . . y y y y y y . . y y y . y . sun_tools y . y y . y . y . y . . . . . . . . . . . . . . . y tazpkg y . y y . y . . . y . . . y y y . . . . y y y . y y yum y y y y y y y y y y . . y y y y y y y . y y y . y y zypper y y y y y y y y y y y y y y y y y y y y y y y y y y ``` ## Support Please use the ticket system at https://github.com/icy/pacapt/issues . ## Development Make sure you read some instructions in `CONTRIBUTING.md`. A development script can be compiled from the source code. ```` $ git clone https://github.com/icy/pacapt.git $ cd pacapt # switch to development branch $ git checkout ng # compile the script $ ./bin/compile.sh > pacapt.dev # check if syntax is good $ bash -n pacapt.dev $ sudo install -m755 ./pacapt.dev /usr/local/bin/pacapt ```` Please read the sample `Makefile` for some details. ## License This work is released under the terms of Fair license (http://opensource.org/licenses/fair). ## AUTHORS. CONTRIBUTORS Many people have contributed to the project by sending pull requests and/or reporting on the ticket system. Here is an incomplete list of authors and contributors. * 10sr (10sr) * Alexander Dupuy (dupuy) * Anh K. Huynh (icy) * Alex Lyon (Arcterus) * Carl X. Su (bcbcarl) * Cuong Manh Le (Gnouc) * Daniel YC Lin (dlintw) * Danny George (dangets) * Darshit Shah (darnir) * Eric Crosson (EricCrosson) * GijsTimmers (GijsTimmers) * Hà-Dương Nguyễn (cmpitg) * Huy Ngô (NgoHuy) * James Pearson (xiongchiamiov) * Janne Heß (dasJ) * Jiawei Zhou (4679) * Karol Blazewicz * Kevin Brubeck (unhammer) * Konrad Borowski (xfix) * Kylie McClain (somasis) * Pival81 * Siôn Le Roux (sinisterstuf) * Vojtech Letal (letalvoj) pacapt-2.3.13/TODO000066400000000000000000000021571274410301200135370ustar00rootroot00000000000000[x] Add tests [x] For Gentoo system: pacapt -Q => eix -I pacapt -Qc

=> emerge -p --changelog

pacapt -Qi

=> emerge --info

pacapt -Ql

=> exists("qlist") && qlist

|| equery files

pacapt -Qm => orphan packages, not supported pacapt -Qo => equery belongs pacapt -Qp => not supported, Gentoo virtually has no definition of "package file" pacapt -S

=> emerge -a

pacapt -Ss

=> eix

|| emerge --search

pacapt -Su => emerge -auND world pacapt -Sy => emerge --sync ; exists("layman") && layman --sync-all pacapt -Suy => emerge --sync ; exists("layman") && layman --sync-all ; emerge -auND world pacapt -R

=> emerge --depclean

pacapt -Sc = clean all distfiles except for installed packages (exact version), those which are less than one month old, bigger than 50MB, or fetch-restricted: => eclean-dist -d -t1m -s50 -f pacapt -Scc => eclean -i distfiles -f => remove "-a" -v => -v -w => --fetchonly pacapt-2.3.13/bin/000077500000000000000000000000001274410301200136125ustar00rootroot00000000000000pacapt-2.3.13/bin/check.sh000077500000000000000000000044001274410301200152240ustar00rootroot00000000000000#!/usr/bin/env bash # Purpose: Check script for error # Author : Anh K. Huynh # Date : 2015 Aug 06 # License: MIT license _simple_check() { bash -n "$@" } _perl_check() { perl -MURI::Escape -MJSON -e 'exit(0)' } _shellcheck() { local _data _data="$( \ perl -MURI::Escape \ -e ' my $stream = do { local $/; ; }; print uri_escape($stream); ' )" curl -LsSo- \ 'http://www.shellcheck.net/shellcheck.php' \ -H 'Accept: application/json, text/javascript, */*' \ -H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' \ -H 'Host: www.shellcheck.net' \ -H 'Referer: http://www.shellcheck.net/' \ -H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:39.0) Gecko/20100101 Firefox/39.0' \ -H 'X-Requested-With: XMLHttpRequest' \ --data "script=$_data" } _shellcheck_output_format() { perl -e ' use JSON; my $stream = do { local $/; <>; }; my $output = decode_json($stream); my $colors = { "error" => "\e[1;31m", "warning" => "\e[1;33m", "style" => "\e[1;36m", "default" => "\e[0m", "reset" => "\e[0m" }; foreach (keys @{$output}) { my $comment = @{$output}[$_]; my $color = $colors->{$comment->{"level"}} || $colors->{"default"}; printf("%s%7s %4d: line %4d col %2d, msg %s%s\n", $color, $comment->{"level"}, $comment->{"code"}, $comment->{"line"}, $comment->{"column"}, $comment->{"message"}, $colors->{"reset"} ); } ' } # See discussion in https://github.com/icy/pacapt/pull/59 _has_shellcheck() { command -v shellcheck >/dev/null 2>&1 } _check_file() { local _file="${1:-/x/x/x/x/x/x/x/}" echo >&2 ":: $FUNCNAME: $1" [[ -f "$_file" ]] \ || { echo >&2 ":: File not found '$_file'" return 1 } _simple_check "$_file" || return if _has_shellcheck; then shellcheck -f json "$_file" | _shellcheck_output_format else _shellcheck < "$_file" | _shellcheck_output_format fi } _check_files() { _has_shellcheck \ || { echo >&2 ":: WARN: shellcheck not found." echo >&2 ":: WARN: Scripts will be checked by remote web server." } while (( $# )); do _check_file "$1" shift done } _perl_check || exit 1 "$@" pacapt-2.3.13/bin/compile.sh000077500000000000000000000135741274410301200156130ustar00rootroot00000000000000#!/usr/bin/env bash # Purpose: `Compile` libraries from `lib/*` to create `pacapt` script. # Author : Anh K. Huynh # License: Fair license (http://www.opensource.org/licenses/fair) # Source : http://github.com/icy/pacapt/ # Copyright (C) 2010 - 2015 Anh K. Huynh et al. # # Usage of the works is permitted provided that this instrument is # retained with the works, so that any entity that uses the works is # notified of this instrument. # # DISCLAIMER: THE WORKS ARE WITHOUT WARRANTY. set -u set -e unset GREP_OPTIONS VERSION="${VERSION:-$(git log --pretty="%h" -1 2>/dev/null || true)}" VERSION="${VERSION:-unknown}" if [[ "${VERSION}" == "unknown" ]]; then echo >&2 ":: Unable to get version information." echo >&2 ":: You may to install or reconfigure your 'git' package." exit 1 fi : "${PACAPT_STATS=}" # List implemented operations to STDERR : "${GREP:=grep}" # Need to update on SunOS : "${AWK:=awk}" # Need to update on SunOS # At compile time, `_sun_tools_init` is not yet defined. if [[ -f "lib/sun_tools.sh" ]]; then source "lib/sun_tools.sh" : _sun_tools_init fi export GREP AWK VERSION PACAPT_STATS ######################################################################## # Print the shebang and header ######################################################################## cat <&2 "pacapt version '$VERSION' has been generated" exit fi ######################################################################## # For developers only # # PxO Q Qi Qs ... # dpkg x o o ... # yum o o o ... # ######################################################################## _soperations="$( echo "${_operations[@]}" \ | sed -e 's# #\n#g' \ | sed -e 's#^.*_\([A-Z][a-z]*\)#\1#g' \ | sort -u )" # Print the headers _ret="$(printf "| %9s " "")" for _sopt in $_soperations; do _size="$(( ${#_sopt} + 1))" _ret="$(printf "%s%${_size}s" "$_ret" "$_sopt")" done printf >&2 "%s\n" "$_ret" i=0 # index rs=0 # restart _operations+=( "xxx_yyy" ) while :; do _ret="" [[ "$i" -lt "${#_operations[@]}" ]] \ || break _cur_pkg="${_operations[$i]}" _cur_pkg="${_cur_pkg%_*}" for _sopt in $_soperations; do # Detect flag for this secondary option _flag="." # Start from the #rs index, # go to boundary of the next package name. # xx_Qi, xx_Qs,... yy_Qi, yy_Qs,... # i=$rs while [[ "$i" -lt "${#_operations[@]}" ]]; do _opt="${_operations[$i]}" _cur2_opt="${_opt##*_}" _cur2_pkg="${_opt%_*}" # echo >&2 "(cur_pkg = $_cur_pkg, look up $_sopt [from $rs], found $_cur2_opt)" # Reach the boundary of the next package name if [[ "$_cur2_pkg" != "$_cur_pkg" ]]; then break else if [[ "$_cur2_opt" == "$_sopt" ]]; then _flag="y" break else (( i ++ )) ||: fi fi done _size="$(( ${#_sopt} + 1))" _ret="$(printf "%s%${_size}s" "$_ret" "$_flag")" done # Detect the next #restart index i=$rs while [[ "$i" -lt "${#_operations[@]}" ]]; do _opt="${_operations[$i]}" _cur2_pkg="${_opt%_*}" if [[ "$_cur2_pkg" != "$_cur_pkg" ]]; then rs=$i break fi (( i ++ )) ||: done if [[ "$_cur_pkg" != "xxx" ]]; then printf >&2 "| %9s %s\n" "$_cur_pkg" "$_ret" fi done ######################################################################## # Print statistics and the fancy table ######################################################################## echo >&2 "pacapt version '$VERSION' has been generated" pacapt-2.3.13/bin/gen_tests.rb000066400000000000000000000052351274410301200161370ustar00rootroot00000000000000#!/usr/bin/env ruby # Purpose: Generate test scripts # Author : Anh K. Huynh # License: MIT # Date : 2016 July 18th # Example: # # $ ruby -n ./bin/gen_tests.rb < lib/dpkg.txt > ./test.sh # $ docker run --rm \ # -v $PWD/test.sh:/tmp/test.sh \ # -v $PWD/pacapt.dev:/usr/bin/pacman \ # ubuntu:14.04 \ # /bin/sh /tmp/test.sh 2>test.log # BEGIN { new_test = true puts "#!/bin/sh" puts "" puts "export PATH=/usr/bin:$PATH" puts "" puts "N_TEST=0" puts "N_FAIL=0" puts "F_TMP=" puts "" puts "set -u" puts "" puts "_log() { echo \":: $*\" 1>&2 ; }" puts "_fail() { _log \"Fail $*\"; echo \"Fail: $*\"; }" # red puts "_erro() { _log \"Erro $*\"; echo \"Erro: $*\"; }" # red puts "_info() { _log \"Info $*\"; echo \"Info: $*\"; }" # cyan puts "_pass() { _log \"Pass $*\"; echo \"Pass: $*\"; }" # cyan puts "_exec() { _log \"Exec $*\"; echo \"Exec: $*\"; }" # yellow puts "_warn() { _log \"Warn $*\"; echo \"Warn: $*\"; }" # yellow puts "_slog() {" puts " if [ -n \"${F_TMP:-}\" ]; then" puts " echo 1>&2 ':: Exec output'" puts " cat 1>&2 $F_TMP" puts " rm -f \"${F_TMP}\"" puts " echo 1>&2" puts " fi" puts "}" } if gs = $_.match(/^in(.*)/) if new_test puts "" outputs = [] new_test = false puts "_slog" puts "export F_TMP=\"$(mktemp)\"" puts "if [ -z ${F_TMP:-} ]; then" puts " _fail 'Unable to create temporary file.'" puts "fi" end cmd = gs[1].strip.gsub("\$LOG", "$F_TMP") cmd = \ case cmd when "clear" then "echo > $F_TMP" when /\A! (.+)\z/ then "#{$1.strip}" else "pacman #{cmd}" end # FIXME: We wanted to use `tee` here, but that will create new pipes, # FIXME: and hence some feature didn't work (e.g., export FOO=). puts "if [ -n \"${F_TMP:-}\" ]; then" puts " _exec \"#{cmd}\"" puts " { #{cmd} ; } 1>>$F_TMP 2>&1" puts "fi" elsif gs = $_.match(/^ou(.*)/) new_test = true expected = gs[1].strip puts "N_TEST=$(( N_TEST + 1 ))" puts "if [ -n \"${F_TMP:-}\" ]; then" if expected.empty? or expected == "empty" puts " ret=\"`grep -Ec '.+' $F_TMP`\"" puts " if [ $ret -ge 1 ]; then" else puts " ret=\"`grep -Ec \"#{expected}\" $F_TMP`\"" puts " if [ $ret -eq 0 ]; then" end puts " _fail 'Expected \"#{expected}\"'" puts " N_FAIL=$(( N_FAIL + 1 ))" puts " else" puts " _pass 'Matched \"#{expected}\"'" puts " fi" puts "else" puts " N_FAIL=$(( N_FAIL + 1 ))" puts "fi" end END { puts "_slog" puts "if [ $N_FAIL -ge 1 ]; then" puts " _fail \"$N_FAIL/$N_TEST test(s) failed.\"" puts " exit 1" puts "else" puts " _pass \"All $N_TEST tests(s) passed.\"" puts "fi" } pacapt-2.3.13/contrib/000077500000000000000000000000001274410301200145025ustar00rootroot00000000000000pacapt-2.3.13/contrib/README.md000066400000000000000000000017761274410301200157740ustar00rootroot00000000000000 First, install all the dependencies For Fedora: ```` # dnf install @development-tools # dnf install fedora-packager # dnf install rpmdevtools ```` For CentOS, RHEL: ```` # yum install rpm-build ```` For OpenSuSE, refer to the OpenSuSE wiki (https://en.opensuse.org/SDB:Compiling_software#Prerequisites). Now, if you haven't created the rpmbuild directory in your home yet, you can do this using this command: ```` $ cd $HOME $ rpmdev-setuptree ```` Ok, now we're set up for compiling, now just download the latest release of pacapt (you can find it on the github page, go on Releases), download it in .tar.gz format: ```` $ cd $HOME/rpmbuild/SOURCES $ wget https://github.com/icy/pacapt/archive/v2.3.13.tar.gz $ mv v2.3.13.tar.gz pacapt-2.3.13.tar.gz ```` And now download the spec file in this contrib directory and place it in ````$HOME/rpmbuild/SPECS```` Then, compile it: ```` $ rpmbuild -ba $HOME/rpmbuild/SPECS/pacapt.spec ```` And you're done! Your generated RPM will be in ````$HOME/rpmbuild/RPMS/noarch>/```` pacapt-2.3.13/contrib/pacapt.spec000066400000000000000000000052421274410301200166310ustar00rootroot00000000000000%global debug_package %{nil} Name: pacapt Version: 2.3.13 Release: 1%{?dist} Summary: An Arch's pacman-like package manager for some Unices. License: custom URL: github.com/icy/pacapt Source0: %{name}-%{version}.tar.gz BuildArch: noarch %description An Arch's pacman-like package manager for some Unices. Actually this Bash script provides a wrapper for system's package manager. For example, on CentOS machines, you can install htop with command $ pacapt -S htop Instead of remembering various options/tools on different OSs, you only need a common way to manipulate packages. Not all options of the native package manager are ported; the tool only provides a very basic interface to search, install, remove packages, and/or update the system. Arch's pacman is chosen, as pacman is quite smart when it divides all packages-related operations into three major groups: Synchronize, Query and Remove/Clean up. It has a clean man page, and it is the only tool needed to manipulate official packages on system. (Debian, for example, requires you to use apt-get, dpkg, and/or aptitude.) The tool supports the following package managers: pacman by Arch Linux, ArchBang, Manjaro, etc. dpkg/apt-get by Debian, Ubuntu, etc. homebrew by Mac OS X macports by Mac OS X yum/rpm by Redhat, CentOS, Fedora, etc. portage by Gentoo zypper by OpenSUSE pkgng by FreeBSD cave by Exherbo Linux pkg_tools by OpenBSD sun_tools by Solaris(SunOS) apk by Alpine Linux %prep %setup -q %build rm -rf bin,lib,.gitignore,CHANGELOG.md,CONTRIBUTING.md,COPYING,Makefile,README.md,TODO %install mkdir -p %buildroot/usr/local/bin install -m755 pacapt %buildroot/usr/local/bin ln -s /usr/local/bin/pacapt %buildroot/usr/local/bin/pacman %clean rm -rf %_buildrootdir %files /usr/local/bin/pacapt /usr/local/bin/pacman %changelog * Fri Jul 21 2016 Ky-Anh Huynh(icy) - 1 - Updated version (2.3.12 -> 2.3.13) * Fri Jul 20 2016 Ky-Anh Huynh(icy) - 1 - Updated version (2.3.11 -> 2.3.12) * Fri Jul 11 2016 Ky-Anh Huynh(icy) - 1 - Updated version (2.3.10 -> 2.3.11) * Fri Jul 11 2016 Ky-Anh Huynh(icy) - 1 - Updated version (2.3.9 -> 2.3.10) * Fri Jul 8 2016 Ky-Anh Huynh(icy) - 1 - Updated version (2.3.8 -> 2.3.9) * Fri Jul 8 2016 Valerio Pizzi(Pival81) - 1 - Changed the installation directory (/usr/local/bin instead of /bin). * Fri Jun 10 2016 Valerio Pizzi(Pival81) - 1 - Updated version (2.2.7 -> 2.3.8) * Thu Jun 9 2016 Valerio Pizzi(Pival81) - 1 - Initial package. pacapt-2.3.13/lib/000077500000000000000000000000001274410301200136105ustar00rootroot00000000000000pacapt-2.3.13/lib/00_core.sh000066400000000000000000000147271274410301200154060ustar00rootroot00000000000000#!/bin/bash # Purpose: Provide some basic functions # Author : Anh K. Huynh # License: Fair license (http://www.opensource.org/licenses/fair) # Source : http://github.com/icy/pacapt/ # Copyright (C) 2010 - 2014 Anh K. Huynh # # Usage of the works is permitted provided that this instrument is # retained with the works, so that any entity that uses the works is # notified of this instrument. # # DISCLAIMER: THE WORKS ARE WITHOUT WARRANTY. _error() { echo >&2 "Error: $*" return 1 } _die() { echo >&2 "$@" exit 1 } _not_implemented() { echo >&2 "${_PACMAN}: '${_POPT}:${_SOPT}:${_TOPT}' operation is invalid or not implemented." return 1 } _removing_is_dangerous() { echo >&2 "${_PACMAN}: removing with '$*' is too dangerous" return 1 } # Detect package type from /etc/issue # FIXME: Using new `issue` file (location) _issue2pacman() { local _pacman _pacman="$1"; shift # The following line is added by Daniel YC Lin to support SunOS. # # [ `uname` = "$1" ] && _PACMAN="$_pacman" && return # # This is quite tricky and fast, however I don't think it works # on Linux/BSD systems. To avoid extra check, I slightly modify # the code to make sure it's only applicable on SunOS. # [[ "$(uname)" == "SunOS" ]] && _PACMAN="$_pacman" && return $GREP -qis "$@" /etc/issue \ && _PACMAN="$_pacman" && return $GREP -qis "$@" /etc/os-release \ && _PACMAN="$_pacman" && return } # Detect package type _PACMAN_detect() { _issue2pacman sun_tools "SunOS" && return _issue2pacman pacman "Arch Linux" && return _issue2pacman dpkg "Debian GNU/Linux" && return _issue2pacman dpkg "Ubuntu" && return _issue2pacman cave "Exherbo Linux" && return _issue2pacman yum "CentOS" && return _issue2pacman yum "Red Hat" && return # # FIXME: The multiple package issue. # # On #63, Huy commented out this line. This is because new generation # of Fedora uses `dnf`, and `yum` becomes a legacy tool. On old Fedora # system, `yum` is still detectable by looking up `yum` binary. # # I'm not sure how to support this case easily. Let's wait, e.g, 5 years # from now to make `dnf` becomes a default? Oh no! # # And here why `pacman` is still smart. Debian has a set of tools. # Fedora has `yum` (and a set of add-ons). Now Fedora moves to `dnf`. # This means that a package manager is not a heart of a system ;) # # _issue2pacman yum "Fedora" && return _issue2pacman zypper "SUSE" && return _issue2pacman pkg_tools "OpenBSD" && return _issue2pacman pkg_tools "Bitrig" && return _issue2pacman apk "Alpine Linux" && return [[ -z "$_PACMAN" ]] || return # Prevent a loop when this script is installed on non-standard system if [[ -x "/usr/bin/pacman" ]]; then $GREP -q "$FUNCNAME" '/usr/bin/pacman' >/dev/null 2>&1 [[ $? -ge 1 ]] && _PACMAN="pacman" \ && return fi [[ -x "/usr/bin/apt-get" ]] && _PACMAN="dpkg" && return [[ -x "/data/data/com.termux/files/usr/bin/apt-get" ]] && _PACMAN="dpkg" && return [[ -x "/usr/bin/cave" ]] && _PACMAN="cave" && return [[ -x "/usr/bin/dnf" ]] && _PACMAN="dnf" && return [[ -x "/usr/bin/yum" ]] && _PACMAN="yum" && return [[ -x "/opt/local/bin/port" ]] && _PACMAN="macports" && return [[ -x "/usr/bin/emerge" ]] && _PACMAN="portage" && return [[ -x "/usr/bin/zypper" ]] && _PACMAN="zypper" && return [[ -x "/usr/sbin/pkg" ]] && _PACMAN="pkgng" && return # make sure pkg_add is after pkgng, FreeBSD base comes with it until converted [[ -x "/usr/sbin/pkg_add" ]] && _PACMAN="pkg_tools" && return [[ -x "/usr/sbin/pkgadd" ]] && _PACMAN="sun_tools" && return [[ -x "/sbin/apk" ]] && _PACMAN="apk" && return [[ -x "/usr/bin/tazpkg" ]] && _PACMAN="tazpkg" && return command -v brew >/dev/null && _PACMAN="homebrew" && return return 1 } # Translate -w option. Please note this is only valid when installing # a package from remote, aka. when '-S' operation is performed. _translate_w() { echo "$_EOPT" | $GREP -q ":w:" || return 0 local _opt= local _ret=0 case "$_PACMAN" in "dpkg") _opt="-d";; "cave") _opt="-f";; "macports") _opt="fetch";; "portage") _opt="--fetchonly";; "zypper") _opt="--download-only";; "pkgng") _opt="fetch";; "yum") _opt="--downloadonly"; if ! rpm -q 'yum-downloadonly' >/dev/null 2>&1; then _error "'yum-downloadonly' package is required when '-w' is used." _ret=1 fi ;; "tazpkg") _error "$_PACMAN: Use '$_PACMAN get' to download and save packages to current directory." _ret=1 ;; "apk") _opt="fetch";; *) _opt="" _ret=1 _error "$_PACMAN: Option '-w' is not supported/implemented." ;; esac echo $_opt return "$_ret" } _translate_debug() { echo "$_EOPT" | $GREP -q ":v:" || return 0 case "$_PACMAN" in "tazpkg") _error "$_PACMAN: Option '-v' (debug) is not supported/implemented by tazpkg" return 1 ;; esac echo "-v" } # Translate the --noconfirm option. # FIXME: does "yes | pacapt" just help? _translate_noconfirm() { echo "$_EOPT" | $GREP -q ":noconfirm:" || return 0 local _opt= local _ret=0 case "$_PACMAN" in # FIXME: Update environment DEBIAN_FRONTEND=noninteractive # FIXME: There is also --force-yes for a stronger case "dpkg") _opt="--yes";; "dnf") _opt="--assumeyes";; "yum") _opt="--assumeyes";; # FIXME: pacman has 'assume-yes' and 'assume-no' # FIXME: zypper has better mode. Similar to dpkg (Debian). "zypper") _opt="--non-interactive";; "pkgng") _opt="-y";; "tazpkg") _opt="--auto";; *) _opt="" _ret=1 _error "$_PACMAN: Option '--noconfirm' is not supported/implemented." ;; esac echo $_opt return $_ret } _translate_all() { local _args="" local _debug="$(_translate_debug)" local _noconfirm="$(_translate_noconfirm)" _args="$(_translate_w)" || return 1 _args="${_args}${_noconfirm:+ }${_noconfirm}" || return 1 _args="${_args}${_debug:+ }${_debug}" || return 1 export _EOPT="${_args# }" } _print_supported_operations() { local _pacman="$1" echo -n "pacapt: available operations:" $GREP -E "^${_pacman}_[^ \t]+\(\)" "$0" \ | $AWK -F '(' '{print $1}' \ | sed -e "s/${_pacman}_//g" \ | while read O; do echo -n " $O" done echo } _print_pacapt_version() { cat < # Cuong Manh Le # License: Fair license (http://www.opensource.org/licenses/fair) # Source : http://github.com/icy/pacapt/ # Copyright (C) 2016 CuongLM # # Usage of the works is permitted provided that this instrument is # retained with the works, so that any entity that uses the works is # notified of this instrument. # # DISCLAIMER: THE WORKS ARE WITHOUT WARRANTY. _apk_init() { : } apk_Q() { if [[ -z "$_TOPT" ]]; then apk info else _not_implemented fi } apk_Qi() { apk info -a -- "$@" } apk_Ql() { apk info -L -- "$@" } apk_Qo() { apk info --who-owns -- "$@" } apk_Qs() { apk info -- "*$@*" } apk_Qu() { apk version -l '<' } apk_R() { apk del -- "$@" } apk_Rn() { apk del --purge -- "$@" } apk_Rns() { apk del --purge -r -- "$@" } apk_Rs() { apk del -r -- "$@" } apk_S() { case ${_EOPT} in # Download only ("fetch") shift apk fetch -- "$@" ;; (*) apk add $_TOPT -- "$@" ;; esac } apk_Sc() { apk cache -v clean } apk_Scc() { rm -rf /var/cache/apk/* } apk_Sccc() { apk_Scc } apk_Si() { apk_Qi "$@" } apk_Sii() { apk info -r -- "$@" } apk_Sl() { apk search -v -- "$@" } apk_Ss() { apk_Sl "$@" } apk_Su() { apk upgrade } apk_Suy() { if [ "$#" -gt 0 ]; then apk add -U -u -- "$@" else apk upgrade -U -a fi } apk_Sy() { apk update } apk_Sw() { apk fetch -- "$@" } apk_U() { apk add --allow-untrusted -- "$@" } pacapt-2.3.13/lib/cave.sh000066400000000000000000000050771274410301200150730ustar00rootroot00000000000000#!/bin/bash # Purpose: Gentoo (+ Paludis) / Exherbo support # Author : Somasis # License: Fair license (http://www.opensource.org/licenses/fair) # Source : http://github.com/somasis/pacapt/ # Copyright (C) 2014 Somasis # # Usage of the works is permitted provided that this instrument is # retained with the works, so that any entity that uses the works is # notified of this instrument. # # DISCLAIMER: THE WORKS ARE WITHOUT WARRANTY. # cave uses asterisks pretty liberally, this is for output parsing correctness _cave_init() { shopt -u globstar } cave_Q() { if [[ "$_TOPT" == "q" ]]; then cave show -f "${@:-world}" \ | grep -v '^$' else cave show -f "${@:-world}" fi } cave_Qi() { cave show "$@" } cave_Ql() { if [[ -n "$@" ]]; then cave contents "$@" return fi cave show -f "${@:-world}" \ | grep -v '^$' \ | while read _pkg; do if [[ "$_TOPT" == "q" ]]; then cave --color no contents "$_pkg" else cave contents "$_pkg" fi done } cave_Qo() { cave owner "$@" } cave_Qp() { _not_implemented } cave_Qu() { if [[ -z "$@" ]];then cave resolve -c world \ | grep '^u.*' \ | while read _pkg; do echo "$_pkg" | cut -d'u' -f2- done else cave resolve -c world \ | grep '^u.*' \ | grep -- "$@" fi } cave_Qs() { cave show -f world | grep -- "$@" } cave_Rs() { if [[ "$_TOPT" == "" ]]; then cave uninstall -r "$@" \ && echo "Control-C to stop uninstalling..." \ && sleep 2s \ && cave uninstall -xr "$@" else cave purge "$@" \ && echo "Control-C to stop uninstalling (+ dependencies)..." \ && sleep 2s \ && cave purge -x "$@" fi } cave_Rn() { _not_implemented } cave_Rns() { _not_implemented } cave_R() { cave uninstall "$@" \ && echo "Control-C to stop uninstalling..." \ && sleep 2s \ && cave uninstall -x "$@" } cave_Si() { cave show "$@" } cave_Suy() { cave sync && cave resolve -c "${@:-world}" \ && echo "Control-C to stop upgrading..." \ && sleep 2s \ && cave resolve -cx "${@:-world}" } cave_Su() { cave resolve -c "$@" \ && echo "Control-C to stop upgrading..." \ && sleep 2s \ && cave resolve -cx "$@" } cave_Sy() { cave sync "$@" } cave_Ss() { cave search "$@" } cave_Sc() { cave fix-cache "$@" } cave_Scc() { cave fix-cache "$@" } cave_Sccc() { #rm -fv /var/cache/paludis/* _not_implemented } cave_S() { cave resolve $_TOPT "$@" \ && echo "Control-C to stop installing..." \ && sleep 2s \ && cave resolve -x $_TOPT "$@" } cave_U() { _not_implemented } pacapt-2.3.13/lib/dnf.sh000066400000000000000000000026101274410301200147120ustar00rootroot00000000000000#!/bin/bash # Purpose: Support next-generation Yum package manager # Author : Severus # License: Fair license (http://www.opensource.org/licenses/fair) # Source : http://github.com/icy/pacapt/ # Copyright (C) 2015 Severus # # Usage of the works is permitted provided that this instrument is # retained with the works, so that any entity that uses the works is # notified of this instrument. # # DISCLAIMER: THE WORKS ARE WITHOUT WARRANTY. _dnf_init() { : } dnf_S() { dnf install $_TOPT "$@" } dnf_Suy() { dnf upgrade "$@" } dnf_Sw() { dnf download "$@" } dnf_Si() { dnf info "$@" } dnf_Sl() { dnf list available "$@" } dnf_Ss() { dnf search "$@" } dnf_Sc() { dnf clean expire-cache "$@" } dnf_Scc() { dnf clean packages "$@" } dnf_Sccc() { dnf clean all "$@" } dnf_Su() { dnf upgrade "$@" } dnf_Sy() { dnf clean expire-cache && dnf check-update } dnf_Q() { if [[ "$_TOPT" == "q" ]]; then rpm -qa --qf "%{NAME}\n" elif [[ "$_TOPT" == "" ]]; then rpm -qa --qf "%{NAME} %{VERSION}\n" else _not_implemented fi } dnf_Qi() { dnf info "$@" } dnf_Qu() { dnf list updates "$@" } dnf_Qs() { rpm -qa "*$@*" } dnf_Ql() { rpm -ql "$@" } dnf_Qo() { rpm -qf "$@" } dnf_Qp() { rpm -qp "$@" } dnf_Qc() { rpm -q --changelog "$@" } dnf_Qm() { dnf list extras } dnf_R() { dnf remove "$@" } dnf_U() { dnf install "$@" } pacapt-2.3.13/lib/dpkg.sh000066400000000000000000000050111274410301200150660ustar00rootroot00000000000000#!/bin/bash # Purpose: Debian / Ubuntu support # Author : Anh K. Huynh # License: Fair license (http://www.opensource.org/licenses/fair) # Source : http://github.com/icy/pacapt/ # Copyright (C) 2010 - 2014 Anh K. Huynh # # Usage of the works is permitted provided that this instrument is # retained with the works, so that any entity that uses the works is # notified of this instrument. # # DISCLAIMER: THE WORKS ARE WITHOUT WARRANTY. _dpkg_init() { : } dpkg_Q() { if [[ "$_TOPT" == "q" ]]; then dpkg -l \ | grep -E '^[hi]i' \ | awk '{print $2}' elif [[ "$_TOPT" == "" ]]; then dpkg -l "$@" \ | grep -E '^[hi]i' else _not_implemented fi } dpkg_Qi() { dpkg-query -s "$@" } dpkg_Ql() { if [[ -n "$@" ]]; then dpkg-query -L "$@" return fi dpkg -l \ | grep -E '^[hi]i' \ | awk '{print $2}' \ | while read _pkg; do if [[ "$_TOPT" == "q" ]]; then dpkg-query -L "$_pkg" else dpkg-query -L "$_pkg" \ | while read _line; do echo "$_pkg $_line" done fi done } dpkg_Qo() { dpkg-query -S "$@" } dpkg_Qp() { dpkg-deb -I "$@" } dpkg_Qu() { apt-get upgrade --trivial-only "$@" } # NOTE: Some field is available for dpkg >= 1.16.2 # NOTE: Debian:Squeeze has dpkg < 1.16.2 dpkg_Qs() { # dpkg >= 1.16.2 dpkg-query -W -f='${db:Status-Abbrev} ${binary:Package}\t${Version}\t${binary:Summary}\n' dpkg-query -W -f='${Status} ${Package}\t${Version}\t${Description}\n' \ | grep -E '^((hold)|(install)|(deinstall))' \ | sed -r -e 's#^(\w+ ){3}##g' \ | grep "${@:-.}" } dpkg_Rs() { if [[ "$_TOPT" == "" ]]; then apt-get autoremove "$@" else _not_implemented fi } dpkg_Rn() { apt-get purge "$@" } dpkg_Rns() { apt-get --purge autoremove "$@" } dpkg_R() { apt-get remove "$@" } dpkg_Si() { apt-cache show "$@" } dpkg_Suy() { apt-get update \ && apt-get upgrade "$@" } dpkg_Su() { apt-get upgrade "$@" } # See also https://github.com/icy/pacapt/pull/78 # This `-w` option is implemented in `00_core/_translate_w` # # dpkg_Sw() { # apt-get --download-only install "$@" # } # FIXME: Should we remove "$@"? dpkg_Sy() { apt-get update "$@" } dpkg_Ss() { apt-cache search "$@" } dpkg_Sc() { apt-get clean "$@" } dpkg_Scc() { apt-get autoclean "$@" } dpkg_S() { apt-get install $_TOPT "$@" } dpkg_U() { dpkg -i "$@" } dpkg_Sii() { apt-cache rdepends "$@" } dpkg_Sccc() { rm -fv /var/cache/apt/*.bin rm -fv /var/cache/apt/archives/*.* rm -fv /var/lib/apt/lists/*.* apt-get autoclean } pacapt-2.3.13/lib/help.txt000066400000000000000000000040241274410301200153010ustar00rootroot00000000000000NAME pacapt - An Arch's pacman-like package manager for some Unices. More details can be found at https://github.com/icy/pacapt . SYNTAX $ pacapt OPERATIONS Basic -h or --help print this help message -P print supported operations -V print version information Query -Q list all installed packages -Qc show package's changelog -Qi print package status -Ql list package's files -Qm list installed packages that aren't available in any installation source -Qo query package that provides -Qp query a package file (don't use package database) -Qs search for installed package Synchronize -S install package(s) -Ss search for packages -Su upgrade the system -Sy update package database -Suy update package database, then upgrade the system Remove / Clean up -R remove some packages -Sc delete old downloaded packages -Scc delete all downloaded packages -Sccc clean variant files. (debian) See also http://dragula.viettug.org/blogs/646 OPTIONS -w download packages but don't install them --noconfirm don't wait for user's confirmation EXAMPLES 1. To install a package from Debian's backports repository $ pacapt -S foobar -t lenny-backports $ pacapt -S -- -t lenny-backports foobar 2. To update package database and then update your system $ pacapt -Syu 3. To download a package without installing it $ pacapt -Sw foobar NOTES When being executed on Arch-based system, the tool simply invokes the system package manager (`/usr/bin/pacman`.) Though you can specify option by its own word, for example, $ pacapt -S -y -u it's always the best to combine them $ pacapt -Syu pacapt-2.3.13/lib/homebrew.sh000066400000000000000000000045001274410301200157530ustar00rootroot00000000000000#!/bin/bash # Purpose: Homebrew support # Author : James Pearson # License: Fair license (http://www.opensource.org/licenses/fair) # Source : http://github.com/icy/pacapt/ # Copyright (C) 2010 - 2014 James Pearson # # Usage of the works is permitted provided that this instrument is # retained with the works, so that any entity that uses the works is # notified of this instrument. # # DISCLAIMER: THE WORKS ARE WITHOUT WARRANTY. _homebrew_init() { : } homebrew_Qi() { brew info "$@" } homebrew_Ql() { brew list "$@" } homebrew_Qo() { local pkg prefix cellar # FIXME: What happens if the file is not exectutable? cd "$(dirname -- "$(which "$@")")" pkg="$(pwd -P)/$(basename -- "$@")" prefix="$(brew --prefix)" cellar="$(brew --cellar)" for package in $cellar/*; do files=(${package}/*/${pkg/#$prefix\//}) if [[ -e "${files[${#files[@]} - 1]}" ]]; then echo "${package/#$cellar\//}" break fi done } homebrew_Qc() { brew log "$@" } homebrew_Qu() { brew outdated | grep "$@" } homebrew_Qs() { brew list | grep "$@" } homebrew_Q() { if [[ "$_TOPT" == "" ]]; then if [[ "$@" == "" ]]; then brew list else brew list | grep "$@" fi else _not_implemented fi } # FIXME: make sure "join" does exit # FIXME: Add quoting support, be cause "join" can fail homebrew_Rs() { if [[ "$_TOPT" == "s" ]]; then brew rm "$@" brew rm $(join <(brew leaves) <(brew deps "$@")) else _not_implemented fi } homebrew_R() { brew remove "$@" } homebrew_Si() { brew info "$@" } homebrew_Suy() { brew update \ && brew upgrade --all "$@" } homebrew_Su() { brew upgrade --all "$@" } homebrew_Sy() { brew update "$@" } homebrew_Ss() { brew search "$@" } homebrew_Sc() { brew cleanup "$@" } homebrew_Scc() { brew cleanup -s "$@" } homebrew_Sccc() { # See more discussion in # https://github.com/icy/pacapt/issues/47 local _dcache _dcache="$(brew --cache)" case "$_dcache" in ""|"/"|" ") _error "$FUNCNAME: Unable to delete '$_dcache'." ;; *) # FIXME: This is quite stupid!!! But it's an easy way # FIXME: to avoid some warning from #shellcheck. # FIXME: Please note that, $_dcache is not empty now. rm -rf "${_dcache:-/x/x/x/x/x/x/x/x/x/x/x//x/x/x/x/x/}/" ;; esac } homebrew_S() { brew install $_TOPT "$@" } pacapt-2.3.13/lib/macports.sh000066400000000000000000000023311274410301200157730ustar00rootroot00000000000000#!/bin/bash # Purpose: Macports support # Author : 10sr # License: Fair license (http://www.opensource.org/licenses/fair) # Source : http://github.com/icy/pacapt/ # Copyright (C) 2010 - 2014 10sr # # Usage of the works is permitted provided that this instrument is # retained with the works, so that any entity that uses the works is # notified of this instrument. # # DISCLAIMER: THE WORKS ARE WITHOUT WARRANTY. _macports_init() { : } macports_Ql() { port contents "$@" } macports_Qo() { port provides "$@" } macports_Qc() { port log "$@" } macports_Qu() { port outdated "$@" } macports_Rs() { if [[ "$_TOPT" == "" ]]; then port uninstall --follow-dependencies "$@" else _not_implemented fi } macports_R() { port uninstall "$@" } macports_Si() { port info "$@" } macports_Suy() { port selfupdate \ && port upgrade outdated "$@" } macports_Su() { port upgrade outdate "$@" } # FIXME: update or sync? macports_Sy() { port selfupdate "$@" } macports_Ss() { port search "$@" } macports_Sc() { port clean --all inactive "$@" } macports_Scc() { port clean --all installed "$@" } macports_S() { if [[ "$_TOPT" == "fetch" ]]; then port patch "$@" else port install "$@" fi } pacapt-2.3.13/lib/pkg_tools.sh000066400000000000000000000047661274410301200161620ustar00rootroot00000000000000#!/bin/bash # Purpose: OpenBSD support # Author : Somasis # License: Fair license (http://www.opensource.org/licenses/fair) # Source : http://github.com/somasis/pacapt # Copyright (C) 2014 Somasis # # Usage of the works is permitted provided that this instrument is # retained with the works, so that any entity that uses the works is # notified of this instrument. # # DISCLAIMER: THE WORKS ARE WITHOUT WARRANTY. _pkg_tools_init() { : } pkg_tools_Qi() { # disable searching mirrors for packages export PKG_PATH= pkg_info "$@" } pkg_tools_Ql() { export PKG_PATH= pkg_info -L "$@" } pkg_tools_Qo() { export PKG_PATH= pkg_info -E "$@" } pkg_tools_Qp() { _not_implemented } pkg_tools_Qu() { export PKG_PATH= pkg_add -u "$@" } pkg_tools_Q() { export PKG_PATH= # the dash after the pkg name is so we don't catch partial matches # because all packages in openbsd have the format 'pkgname-pkgver' if [[ "$_TOPT" == "q" && ! -z "$@" ]]; then pkg_info -q | grep "^${*}-" elif [[ "$_TOPT" == "q" && -z "$@" ]];then pkg_info -q elif [[ "$_TOPT" == "" && ! -z "$@" ]]; then pkg_info | grep "^${*}-" elif [[ "$_TOPT" == "" && -z "$@" ]];then pkg_info else _not_implemented fi } pkg_tools_Rs() { if [[ "$_TOPT" == "" ]]; then pkg_delete -D dependencies "$@" else _not_implemented fi } pkg_tools_Rn() { if [[ "$_TOPT" == "" ]];then pkg_delete -c "$@" else _not_implemented fi } pkg_tools_Rns() { _not_implemented } pkg_tools_R() { pkg_delete "$@" } pkg_tools_Si() { pkg_info "$@" } pkg_tools_Sl() { pkg_info -L "$@" } pkg_tools_Suy() { # pkg_tools doesn't really have any concept of a database # there's actually not really any database to update, so # this function is mostly just for convienience since on arch # doing -Su is normally a bad thing to do since it's a partial upgrade pkg_tools_Su "$@" } pkg_tools_Su() { pkg_add -u "$@" } pkg_tools_Sy() { _not_implemented } pkg_tools_Ss() { if [[ -z "$@" ]];then _not_implemented else pkg_info -Q "$@" fi } pkg_tools_Sc() { # by default no cache directory is used if [[ -z "$PKG_CACHE" ]];then echo "You have no cache directory set, set \$PKG_CACHE for a cache directory." elif [[ ! -d "$PKG_CACHE" ]];then echo "You have a cache directory set, but it does not exist. Create \"$PKG_CACHE\"." else _removing_is_dangerous "rm -rf $PKG_CACHE/*" fi } pkg_tools_Scc() { _not_implemented } pkg_tools_S() { pkg_add "$@" } pacapt-2.3.13/lib/pkgng.sh000066400000000000000000000030461274410301200152550ustar00rootroot00000000000000#!/bin/bash # Purpose: FreeBSD support # Author : Konrad Borowski # Date : Dec 18 2013 # License: Fair license (http://www.opensource.org/licenses/fair) # Source : http://github.com/icy/pacapt/ # Pull : https://github.com/icy/pacapt/pull/25 # Note : The pull request is applicable to `master` branch. # Anh K. Huynh slightly modified the pull request to # use them on the `ng` branch (on May 05 2014) # Copyright (C) 2013 - 2014 Konrad Borowski # # Usage of the works is permitted provided that this instrument is # retained with the works, so that any entity that uses the works is # notified of this instrument. # # DISCLAIMER: THE WORKS ARE WITHOUT WARRANTY. _pkgng_init() { : } pkgng_Qi() { pkg info "$@" } pkgng_Ql() { pkg info -l "$@" } pkgng_Qo() { pkg which "$@" } pkgng_Qp() { pkg query -F "$@" '%n %v' } pkgng_Qu() { pkg upgrade -n "$@" } pkgng_Q() { if [[ "$_TOPT" == "q" ]]; then pkg query '%n' "$@" elif [[ "$_TOPT" == "" ]]; then pkg query '%n %v' "$@" else _not_implemented fi } pkgng_Rs() { if [[ "$_TOPT" == "" ]]; then pkg remove "$@" pkg autoremove else _not_implemented fi } pkgng_R() { pkg remove "$@" } pkgng_Si() { pkg search -S name -ef "$@" } pkgng_Suy() { pkg upgrade "$@" } pkgng_Su() { pkg upgrade -U "$@" } pkgng_Sy() { pkg update "$@" } pkgng_Ss() { pkg search "$@" } pkgng_Sc() { pkg clean "$@" } pkgng_Scc() { pkg clean -a "$@" } pkgng_S() { if [[ "$_TOPT" == "fetch" ]]; then pkg fetch "$@" else pkg install "$@" fi } pacapt-2.3.13/lib/portage.sh000066400000000000000000000045631274410301200156150ustar00rootroot00000000000000#!/bin/bash # Purpose: Gentoo support # Author : Hà-Dương Nguyễn # License: Fair license (http://www.opensource.org/licenses/fair) # Source : http://github.com/icy/pacapt/ # Copyright (C) 2010 - 2014 Hà-Dương Nguyễn # # Usage of the works is permitted provided that this instrument is # retained with the works, so that any entity that uses the works is # notified of this instrument. # # DISCLAIMER: THE WORKS ARE WITHOUT WARRANTY. _portage_init() { : } portage_Qi() { emerge --info "$@" } portage_Ql() { if [[ -x '/usr/bin/qlist' ]]; then qlist "$@" elif [[ -x '/usr/bin/equery' ]]; then equery files "$@" else _error "'portage-utils' or 'gentoolkit' package is required to perform this opreation." fi } portage_Qo() { if [[ -x '/usr/bin/equery' ]]; then equery belongs "$@" else _error "'gentoolkit' package is required to perform this operation." fi } portage_Qc() { emerge -p --changelog "$@" } # FIXME: may not be correct portage_Qu() { emerge -uvN "$@" } portage_Q() { if [[ "$_TOPT" == "" ]]; then if [[ -x '/usr/bin/eix' ]]; then eix -I "$@" elif [[ -x '/usr/bin/equery' ]]; then equery list -i "$@" else LS_COLORS=never \ ls -1 -d /var/db/pkg/*/* fi else _not_implemented fi } portage_Rs() { if [[ "$_TOPT" == "" ]]; then emerge --depclean world "$@" else _not_implemented fi } portage_R() { emerge --depclean "@" } portage_Si() { emerge --info "$@" } portage_Suy() { if [[ -x '/usr/bin/layman' ]]; then layman --sync-all \ && emerge --sync \ && emerge -auND world "$@" else emerge --sync \ && emerge -uND world "$@" fi } portage_Su() { emerge -uND world "$@" } portage_Sy() { if [[ -x "/usr/bin/layman" ]]; then layman --sync-all \ && emerge --sync "$@" else emerge --sync "$@" fi } portage_Ss() { if [[ -x "/usr/bin/eix" ]]; then eix "$@" else emerge --search "$@" fi } portage_Sc() { if [[ -x "/usr/bin/eclean-dist" ]]; then eclean-dist -d -t1m -s50 -f "$@" else _error "'gentoolkit' package is required to perform this operation." fi } portage_Scc() { if [[ -x "/usr/bin/eclean" ]]; then eclean -i distfiles "$@" else _error "'gentoolkit' package is required to perform this operation." fi } portage_Sccc() { rm -fv /usr/portage/distfiles/*.* } portage_S() { emerge "$@" } pacapt-2.3.13/lib/sun_tools.sh000066400000000000000000000023201274410301200161660ustar00rootroot00000000000000#!/bin/bash # Purpose: SunOS support # Author : Daniel YC Lin # License: Fair license (http://www.opensource.org/licenses/fair) # Source : http://github.com/dlintw/pacapt # Copyright (C) 2015 Daniel YC Lin # # Usage of the works is permitted provided that this instrument is # retained with the works, so that any entity that uses the works is # notified of this instrument. # # DISCLAIMER: THE WORKS ARE WITHOUT WARRANTY. _sun_tools_init() { # The purpose of `if` is to make sure this function # can be invoked on other system (Linux, BSD). if [[ "$(uname)" == "SunOS" ]]; then export GREP=/usr/xpg4/bin/grep export AWK=nawk fi } sun_tools_Qi() { pkginfo -l "$@" } sun_tools_Ql() { pkginfo -l "$@" } sun_tools_Qo() { $GREP "$@" /var/sadm/install/contents } sun_tools_Qs() { pkginfo | $GREP -i "$@" } sun_tools_Q() { # the dash after the pkg name is so we don't catch partial matches # because all packages in openbsd have the format 'pkgname-pkgver' if [[ "$_TOPT" == "q" && ! -z "$@" ]]; then pkginfo | $GREP "$@" elif [[ "$_TOPT" == "q" && -z "$@" ]]; then pkginfo else pkginfo "$@" fi } sun_tools_R() { pkgrm "$@" } sun_tools_U() { pkgadd "$@" } pacapt-2.3.13/lib/tazpkg.sh000066400000000000000000000037221274410301200154500ustar00rootroot00000000000000#!/bin/bash # Purpose: Provide Slitaz support for pacapt script # Author : Anh K. Huynh # Date : 2016 July 08th # License: MIT _tazpkg_init() { : } tazpkg_Q() { if [[ "$_TOPT" == "q" ]]; then tazpkg list "$@" \ | awk '{ if (NF == 2 || NF == 3) { print $1; }}' elif [[ "$_TOPT" == "" ]]; then tazpkg list "$@" else _not_implemented fi } tazpkg_Qi() { tazpkg info "$@" } tazpkg_Ql() { if [[ -z "$@" ]]; then _not_implemented return fi if [[ "$_TOPT" == "q" ]]; then { tazpkg list-files "$@" tazpkg list-config "$@" } \ | grep ^/ else tazpkg list-files "$@" tazpkg list-config "$@" fi } tazpkg_Sy() { tazpkg recharge } tazpkg_Su() { tazpkg up } tazpkg_Suy() { tazpkg_Sy \ && tazpkg_Su } tazpkg_S() { local _forced="" grep -q -- "--forced" <<<"*" if [[ $? -eq 0 ]]; then _forced="--forced" fi while (( $# )); do if [[ "$1" == "--forced" ]]; then _forced="--forced" shift continue fi tazpkg get-install "$1" $_forced shift done } tazpkg_R() { local _auto="" grep -q -- "--auto" <<<"*" if [[ $? -eq 0 ]]; then _auto="--auto" fi while (( $# )); do if [[ "$1" == "--auto" ]]; then _auto="--auto" shift continue fi tazpkg remove "$1" $_auto shift done } tazpkg_Sc() { tazpkg clean-cache } tazpkg_Scc() { tazpkg clean-cache cd /var/lib/tazpkg/ \ && { rm -fv \ ./*.bak \ ID \ packages.* \ files.list.* } } # Option: tazpkg search ... [option] # -i: installed packages # -l: available packages tazpkg_Ss() { tazpkg search "$@" } tazpkg_Qo() { tazpkg search-pkgname "$@" } tazpkg_U() { local _forced="" grep -q -- "--forced" <<<"*" if [[ $? -eq 0 ]]; then _forced="--forced" fi while (( $# )); do if [[ "$1" == "--forced" ]]; then _forced="--forced" shift continue fi tazpkg install "$1" $_forced shift done } pacapt-2.3.13/lib/yum.sh000066400000000000000000000026401274410301200147600ustar00rootroot00000000000000#!/bin/bash # Purpose: RedHat / Fedora Core support # Author : Anh K. Huynh # License: Fair license (http://www.opensource.org/licenses/fair) # Source : http://github.com/icy/pacapt/ # Copyright (C) 2010 - 2014 Anh K. Huynh # # Usage of the works is permitted provided that this instrument is # retained with the works, so that any entity that uses the works is # notified of this instrument. # # DISCLAIMER: THE WORKS ARE WITHOUT WARRANTY. _yum_init() { : } yum_Q() { if [[ "$_TOPT" == "q" ]]; then rpm -qa --qf "%{NAME}\n" elif [[ "$_TOPT" == "" ]]; then rpm -qa --qf "%{NAME} %{VERSION}\n" else _not_implemented fi } yum_Qi() { yum info "$@" } yum_Qs() { rpm -qa "*$@*" } yum_Ql() { rpm -ql "$@" } yum_Qo() { rpm -qf "$@" } yum_Qp() { rpm -qp "$@" } yum_Qc() { rpm -q --changelog "$@" } yum_Qu() { yum list updates "$@" } yum_Qm() { yum list extras "$@" } yum_Rs() { if [[ "$_TOPT" == "" ]]; then yum erase "$@" else _not_implemented fi } yum_R() { yum erase "$@" } yum_Si() { yum info "$@" } yum_Suy() { yum update "$@" } yum_Su() { yum update "$@" } yum_Sy() { yum check-update "$@" } yum_Ss() { yum -C search "$@" } yum_Sc() { yum clean expire-cache "$@" } yum_Scc() { yum clean packages "$@" } yum_Sccc() { yum clean all "$@" } yum_S() { yum install $_TOPT "$@" } yum_U() { yum localinstall "$@" } yum_Sii() { yum resolvedep "$@" } pacapt-2.3.13/lib/zypper.sh000066400000000000000000000047311274410301200155020ustar00rootroot00000000000000#!/bin/bash # Purpose: OpenSUSE support # Author : Anh K. Huynh # License: Fair license (http://www.opensource.org/licenses/fair) # Source : http://github.com/icy/pacapt/ # Copyright (C) 2010 - 2014 Anh K. Huynh # # Usage of the works is permitted provided that this instrument is # retained with the works, so that any entity that uses the works is # notified of this instrument. # # DISCLAIMER: THE WORKS ARE WITHOUT WARRANTY. _zypper_init() { : } zypper_Qc() { rpm -q --changelog "$@" } zypper_Qi() { zypper info "$@" } zypper_Ql() { rpm -ql "$@" } zypper_Qu() { zypper list-updates "$@" } zypper_Qm() { zypper search -si "$@" \ | grep 'System Packages' } zypper_Qo() { rpm -qf "$@" } zypper_Qp() { rpm -qip "$@" } zypper_Qs() { zypper search --installed-only "$@" } zypper_Q() { if [[ "$_TOPT" == "q" ]]; then zypper search -i "$@" \ | grep ^i \ | awk '{print $3}' elif [[ "$_TOPT" == "" ]]; then zypper search -i "$@" else _not_implemented fi } zypper_Rs() { if [[ "$_TOPT" == "s" ]]; then zypper remove "$@" --clean-deps else _not_implemented fi } zypper_R() { zypper remove "$@" } zypper_Rn() { # Remove configuration files while read file; do if [[ -f "$file" ]]; then rm -fv "$file" fi done < <(rpm -ql "$@") # Now remove the package per-se zypper remove "$@" } zypper_Rs() { if [[ "$_TOPT" == "s" ]]; then zypper remove "$@" --clean-deps else _not_implemented fi } zypper_Rns() { # Remove configuration files while read file; do if [[ -f "$file" ]]; then rm -fv "$file" fi done < <(rpm -ql "$@") zypper remove "$@" --clean-deps } zypper_Suy() { zypper dup "$@" } zypper_Sy() { zypper refresh "$@" } zypper_Sl() { if [[ $# -eq 0 ]]; then zypper pa -R else zypper pa -r "$@" fi } zypper_Ss() { zypper search "$@" } zypper_Su() { zypper --no-refresh dup "$@" } zypper_Sc() { zypper clean "$@" } zypper_Scc() { zypper clean "$@" } zypper_Sccc() { # Not way to do this in zypper _not_implemented } zypper_Si() { zypper info --requires "$@" } zypper_Sii() { # Ugly and slow, but does the trick local packages= packages="$(zypper pa -R | cut -d \| -f 3 | tr -s '\n' ' ')" for package in $packages; do zypper info --requires "$package" \ | grep -q "$@" && echo $package done } zypper_S() { zypper install $_TOPT "$@" } zypper_Sw() { zypper install --download-only "$@" } zypper_U() { zypper install "$@" } pacapt-2.3.13/lib/zz_main.sh000066400000000000000000000140021274410301200156100ustar00rootroot00000000000000#!/bin/bash # Purpose: A wrapper for all Unix package managers # Author : Anh K. Huynh # License: Fair license (http://www.opensource.org/licenses/fair) # Source : http://github.com/icy/pacapt/ # Copyright (C) 2010 - 2014 Anh K. Huynh # # Usage of the works is permitted provided that this instrument is # retained with the works, so that any entity that uses the works is # notified of this instrument. # # DISCLAIMER: THE WORKS ARE WITHOUT WARRANTY. set -u unset GREP_OPTIONS : "${PACAPT_DEBUG=}" # Show what will be going : "${GREP:=grep}" # Need to update in, e.g, _sun_tools_init : "${AWK:=awk}" # Need to update in, e.g, _sun_tools_init _sun_tools_init # Dirty tricky patch for SunOS export PACAPT_DEBUG GREP AWK _POPT="" # primary operation _SOPT="" # secondary operation _TOPT="" # options for operations _EOPT="" # extra options (directly given to package manager) # these options will be translated by (_translate_all) method. _PACMAN="" # name of the package manager _PACMAN_detect \ || _die "'pacapt' doesn't support your package manager." if [[ -z "$PACAPT_DEBUG" ]]; then [[ "$_PACMAN" != "pacman" ]] \ || exec "/usr/bin/pacman" "$@" elif [[ "$PACAPT_DEBUG" != "auto" ]]; then _PACMAN="$PACAPT_DEBUG" fi while :; do _args="${1-}" [[ "${_args:0:1}" == "-" ]] || break case "${_args}" in "--help") _help exit 0 ;; "--noconfirm") shift _EOPT="$_EOPT:noconfirm:" continue ;; "-"|"--") shift break ;; esac i=1 while [[ "$i" -lt "${#_args}" ]]; do _opt="${_args:$i:1}" (( i ++ )) case "$_opt" in h) _help exit 0 ;; V) _print_pacapt_version $PACAPT_VERSION; exit 0 ;; P) _print_supported_operations $_PACMAN exit 0 ;; Q|S|R|U) if [[ -n "$_POPT" && "$_POPT" != "$_opt" ]]; then _error "Only one operation may be used at a time" exit 1 fi _POPT="$_opt" ;; # Comment 2015 May 26th: This part deals with the 2nd option. # Most of the time, there is only one 2nd option. But some # operation may need extra and/or duplicate (e.g, Sy <> Syy). # # See also # # * https://github.com/icy/pacapt/issues/13 # # This implementation works, but with a bug. #Rsn works # but #Rns is translated to #Rn (incorrectly.) # Thanks Huy-Ngo for this nice catch. # # FIXME: Please check pacman(8) to see if they are really 2nd operation # s|l|i|p|o|m|n) if [[ "$_SOPT" == '' ]]; then _SOPT="$_opt" continue fi # Understand it: # If there is already an option recorded, the incoming option # will come and compare itself with known one. # We have a table # # known one vs. incoming ? | result # < | one-new # = | one-one # > | new-one # # Let's say, after this step, the 3rd option comes (named X), # and the current result is "a-b". We have a table # # a(b) vs. X | result # < | aX (b dropped) # = | aa (b dropped) # > | Xa (b dropped) # # In any case, the first one matters. # if [[ "${_SOPT:0:1}" < "$_opt" ]]; then _SOPT="${_SOPT:0:1}$_opt" elif [[ "${_SOPT:0:1}" == "$_opt" ]]; then _SOPT="$_opt$_opt" else _SOPT="$_opt${_SOPT:0:1}" fi ;; q) _TOPT="$_opt" ;; # Thanks to James Pearson u) if [[ "${_SOPT:0:1}" == "y" ]]; then _SOPT="uy" else _SOPT="u" fi ;; y) if [[ "${_SOPT:0:1}" == "u" ]]; then _SOPT="uy" else _SOPT="y" fi ;; c) if [[ "${_SOPT:0:2}" == "cc" ]]; then _SOPT="ccc" elif [[ "${_SOPT:0:1}" == "c" ]]; then _SOPT="cc" else _SOPT="$_opt" fi ;; w|v) _EOPT="$_EOPT:$_opt:" ;; *) # FIXME: If option is unknown, we will break the loop # FIXME: and this option will be used by the native program. # FIXME: break 2 _die "pacapt: Unknown option '$_opt'." ;; esac done shift # If the primary option and the secondary are known # we would break the argument detection, but for sure we will look # forward to see there is anything interesting... if [[ -n "$_POPT" && -n "$_SOPT" ]]; then case "${1:-}" in "-w"|"--noconfirm") ;; *) break;; esac # Don't have anything from the **first** argument. Something wrong. # FIXME: This means that user must enter at least primary action # FIXME: or secondary action in the very first part... elif [[ -z "${_POPT}${_SOPT}${_TOPT}" ]]; then break fi done [[ -n "$_POPT" ]] \ || _die "Usage: pacapt # -h for help, -P list supported functions" _validate_operation "${_PACMAN}_${_POPT}${_SOPT}" \ || { _not_implemented exit 1 } _translate_all || exit # pacman man page (examples) says: # "pacman -Syu gpm = Update package list, upgrade all packages, # and then install gpm if it wasn't already installed." # # Instead, just disallow specific packages, as (ex-)yum users likely # expect to just update/upgrade one package (and its dependencies) # and apt-get and pacman have no way to do this. # if [[ -n "$@" ]]; then case "${_POPT}${_SOPT}" in "Su"|"Sy"|"Suy") echo 1>&2 "WARNING ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" echo 1>&2 " The -Sy/u options refresh and/or upgrade all packages." echo 1>&2 " To install packages as well, use separate commands:" echo 1>&2 echo 1>&2 " $0 -S$_SOPT; $0 -S ${*}" echo 1>&2 "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" esac fi if [[ -n "$PACAPT_DEBUG" ]]; then echo "pacapt: $_PACMAN, p=$_POPT, s=$_SOPT, t=$_TOPT, e=$_EOPT" echo "pacapt: execute '${_PACMAN}_${_POPT}${_SOPT} $_EOPT ${*}'" declare -f "${_PACMAN}_${_POPT}${_SOPT}" else "_${_PACMAN}_init" "${_PACMAN}_${_POPT}${_SOPT}" $_EOPT "$@" fi pacapt-2.3.13/pacapt000077500000000000000000001131341274410301200142430ustar00rootroot00000000000000#!/usr/bin/env bash # # Purpose: A wrapper for all Unix package managers # License: Fair license (http://www.opensource.org/licenses/fair) # Source : http://github.com/icy/pacapt/ # Version: 2.3.13 # Authors: Anh K. Huynh et al. # Copyright (C) 2010 - 2016 \ # | 10sr (10sr) # | Alexander Dupuy (dupuy) # | Anh K. Huynh (icy) # | Alex Lyon (Arcterus) # | Carl X. Su (bcbcarl) # | Cuong Manh Le (Gnouc) # | Daniel YC Lin (dlintw) # | Danny George (dangets) # | Darshit Shah (darnir) # | Eric Crosson (EricCrosson) # | GijsTimmers (GijsTimmers) # | Hà-Dương Nguyễn (cmpitg) # | Huy Ngô (NgoHuy) # | James Pearson (xiongchiamiov) # | Janne Heß (dasJ) # | Jiawei Zhou (4679) # | Karol Blazewicz # | Kevin Brubeck (unhammer) # | Konrad Borowski (xfix) # | Kylie McClain (somasis) # | Pival81 # | Siôn Le Roux (sinisterstuf) # | Vojtech Letal (letalvoj) # # Usage of the works is permitted provided that this instrument is # retained with the works, so that any entity that uses the works is # notified of this instrument. # # DISCLAIMER: THE WORKS ARE WITHOUT WARRANTY. # export PACAPT_VERSION='2.3.13' _help() { cat <<'EOF' NAME pacapt - An Arch's pacman-like package manager for some Unices. More details can be found at https://github.com/icy/pacapt . SYNTAX $ pacapt OPERATIONS Basic -h or --help print this help message -P print supported operations -V print version information Query -Q list all installed packages -Qc show package's changelog -Qi print package status -Ql list package's files -Qm list installed packages that aren't available in any installation source -Qo query package that provides -Qp query a package file (don't use package database) -Qs search for installed package Synchronize -S install package(s) -Ss search for packages -Su upgrade the system -Sy update package database -Suy update package database, then upgrade the system Remove / Clean up -R remove some packages -Sc delete old downloaded packages -Scc delete all downloaded packages -Sccc clean variant files. (debian) See also http://dragula.viettug.org/blogs/646 OPTIONS -w download packages but don't install them --noconfirm don't wait for user's confirmation EXAMPLES 1. To install a package from Debian's backports repository $ pacapt -S foobar -t lenny-backports $ pacapt -S -- -t lenny-backports foobar 2. To update package database and then update your system $ pacapt -Syu 3. To download a package without installing it $ pacapt -Sw foobar NOTES When being executed on Arch-based system, the tool simply invokes the system package manager (`/usr/bin/pacman`.) Though you can specify option by its own word, for example, $ pacapt -S -y -u it's always the best to combine them $ pacapt -Syu EOF } _error() { echo >&2 "Error: $*" return 1 } _die() { echo >&2 "$@" exit 1 } _not_implemented() { echo >&2 "${_PACMAN}: '${_POPT}:${_SOPT}:${_TOPT}' operation is invalid or not implemented." return 1 } _removing_is_dangerous() { echo >&2 "${_PACMAN}: removing with '$*' is too dangerous" return 1 } _issue2pacman() { local _pacman _pacman="$1"; shift # The following line is added by Daniel YC Lin to support SunOS. # # [ `uname` = "$1" ] && _PACMAN="$_pacman" && return # # This is quite tricky and fast, however I don't think it works # on Linux/BSD systems. To avoid extra check, I slightly modify # the code to make sure it's only applicable on SunOS. # [[ "$(uname)" == "SunOS" ]] && _PACMAN="$_pacman" && return $GREP -qis "$@" /etc/issue \ && _PACMAN="$_pacman" && return $GREP -qis "$@" /etc/os-release \ && _PACMAN="$_pacman" && return } _PACMAN_detect() { _issue2pacman sun_tools "SunOS" && return _issue2pacman pacman "Arch Linux" && return _issue2pacman dpkg "Debian GNU/Linux" && return _issue2pacman dpkg "Ubuntu" && return _issue2pacman cave "Exherbo Linux" && return _issue2pacman yum "CentOS" && return _issue2pacman yum "Red Hat" && return # # FIXME: The multiple package issue. # # On #63, Huy commented out this line. This is because new generation # of Fedora uses `dnf`, and `yum` becomes a legacy tool. On old Fedora # system, `yum` is still detectable by looking up `yum` binary. # # I'm not sure how to support this case easily. Let's wait, e.g, 5 years # from now to make `dnf` becomes a default? Oh no! # # And here why `pacman` is still smart. Debian has a set of tools. # Fedora has `yum` (and a set of add-ons). Now Fedora moves to `dnf`. # This means that a package manager is not a heart of a system ;) # # _issue2pacman yum "Fedora" && return _issue2pacman zypper "SUSE" && return _issue2pacman pkg_tools "OpenBSD" && return _issue2pacman pkg_tools "Bitrig" && return _issue2pacman apk "Alpine Linux" && return [[ -z "$_PACMAN" ]] || return # Prevent a loop when this script is installed on non-standard system if [[ -x "/usr/bin/pacman" ]]; then $GREP -q "$FUNCNAME" '/usr/bin/pacman' >/dev/null 2>&1 [[ $? -ge 1 ]] && _PACMAN="pacman" \ && return fi [[ -x "/usr/bin/apt-get" ]] && _PACMAN="dpkg" && return [[ -x "/data/data/com.termux/files/usr/bin/apt-get" ]] && _PACMAN="dpkg" && return [[ -x "/usr/bin/cave" ]] && _PACMAN="cave" && return [[ -x "/usr/bin/dnf" ]] && _PACMAN="dnf" && return [[ -x "/usr/bin/yum" ]] && _PACMAN="yum" && return [[ -x "/opt/local/bin/port" ]] && _PACMAN="macports" && return [[ -x "/usr/bin/emerge" ]] && _PACMAN="portage" && return [[ -x "/usr/bin/zypper" ]] && _PACMAN="zypper" && return [[ -x "/usr/sbin/pkg" ]] && _PACMAN="pkgng" && return # make sure pkg_add is after pkgng, FreeBSD base comes with it until converted [[ -x "/usr/sbin/pkg_add" ]] && _PACMAN="pkg_tools" && return [[ -x "/usr/sbin/pkgadd" ]] && _PACMAN="sun_tools" && return [[ -x "/sbin/apk" ]] && _PACMAN="apk" && return [[ -x "/usr/bin/tazpkg" ]] && _PACMAN="tazpkg" && return command -v brew >/dev/null && _PACMAN="homebrew" && return return 1 } _translate_w() { echo "$_EOPT" | $GREP -q ":w:" || return 0 local _opt= local _ret=0 case "$_PACMAN" in "dpkg") _opt="-d";; "cave") _opt="-f";; "macports") _opt="fetch";; "portage") _opt="--fetchonly";; "zypper") _opt="--download-only";; "pkgng") _opt="fetch";; "yum") _opt="--downloadonly"; if ! rpm -q 'yum-downloadonly' >/dev/null 2>&1; then _error "'yum-downloadonly' package is required when '-w' is used." _ret=1 fi ;; "tazpkg") _error "$_PACMAN: Use '$_PACMAN get' to download and save packages to current directory." _ret=1 ;; "apk") _opt="fetch";; *) _opt="" _ret=1 _error "$_PACMAN: Option '-w' is not supported/implemented." ;; esac echo $_opt return "$_ret" } _translate_debug() { echo "$_EOPT" | $GREP -q ":v:" || return 0 case "$_PACMAN" in "tazpkg") _error "$_PACMAN: Option '-v' (debug) is not supported/implemented by tazpkg" return 1 ;; esac echo "-v" } _translate_noconfirm() { echo "$_EOPT" | $GREP -q ":noconfirm:" || return 0 local _opt= local _ret=0 case "$_PACMAN" in # FIXME: Update environment DEBIAN_FRONTEND=noninteractive # FIXME: There is also --force-yes for a stronger case "dpkg") _opt="--yes";; "dnf") _opt="--assumeyes";; "yum") _opt="--assumeyes";; # FIXME: pacman has 'assume-yes' and 'assume-no' # FIXME: zypper has better mode. Similar to dpkg (Debian). "zypper") _opt="--non-interactive";; "pkgng") _opt="-y";; "tazpkg") _opt="--auto";; *) _opt="" _ret=1 _error "$_PACMAN: Option '--noconfirm' is not supported/implemented." ;; esac echo $_opt return $_ret } _translate_all() { local _args="" local _debug="$(_translate_debug)" local _noconfirm="$(_translate_noconfirm)" _args="$(_translate_w)" || return 1 _args="${_args}${_noconfirm:+ }${_noconfirm}" || return 1 _args="${_args}${_debug:+ }${_debug}" || return 1 export _EOPT="${_args# }" } _print_supported_operations() { local _pacman="$1" echo -n "pacapt: available operations:" $GREP -E "^${_pacman}_[^ \t]+\(\)" "$0" \ | $AWK -F '(' '{print $1}' \ | sed -e "s/${_pacman}_//g" \ | while read O; do echo -n " $O" done echo } _print_pacapt_version() { cat <= 1.16.2 dpkg-query -W -f='${db:Status-Abbrev} ${binary:Package}\t${Version}\t${binary:Summary}\n' dpkg-query -W -f='${Status} ${Package}\t${Version}\t${Description}\n' \ | grep -E '^((hold)|(install)|(deinstall))' \ | sed -r -e 's#^(\w+ ){3}##g' \ | grep "${@:-.}" } dpkg_Rs() { if [[ "$_TOPT" == "" ]]; then apt-get autoremove "$@" else _not_implemented fi } dpkg_Rn() { apt-get purge "$@" } dpkg_Rns() { apt-get --purge autoremove "$@" } dpkg_R() { apt-get remove "$@" } dpkg_Si() { apt-cache show "$@" } dpkg_Suy() { apt-get update \ && apt-get upgrade "$@" } dpkg_Su() { apt-get upgrade "$@" } dpkg_Sy() { apt-get update "$@" } dpkg_Ss() { apt-cache search "$@" } dpkg_Sc() { apt-get clean "$@" } dpkg_Scc() { apt-get autoclean "$@" } dpkg_S() { apt-get install $_TOPT "$@" } dpkg_U() { dpkg -i "$@" } dpkg_Sii() { apt-cache rdepends "$@" } dpkg_Sccc() { rm -fv /var/cache/apt/*.bin rm -fv /var/cache/apt/archives/*.* rm -fv /var/lib/apt/lists/*.* apt-get autoclean } _homebrew_init() { : } homebrew_Qi() { brew info "$@" } homebrew_Ql() { brew list "$@" } homebrew_Qo() { local pkg prefix cellar # FIXME: What happens if the file is not exectutable? cd "$(dirname -- "$(which "$@")")" pkg="$(pwd -P)/$(basename -- "$@")" prefix="$(brew --prefix)" cellar="$(brew --cellar)" for package in $cellar/*; do files=(${package}/*/${pkg/#$prefix\//}) if [[ -e "${files[${#files[@]} - 1]}" ]]; then echo "${package/#$cellar\//}" break fi done } homebrew_Qc() { brew log "$@" } homebrew_Qu() { brew outdated | grep "$@" } homebrew_Qs() { brew list | grep "$@" } homebrew_Q() { if [[ "$_TOPT" == "" ]]; then if [[ "$@" == "" ]]; then brew list else brew list | grep "$@" fi else _not_implemented fi } homebrew_Rs() { if [[ "$_TOPT" == "s" ]]; then brew rm "$@" brew rm $(join <(brew leaves) <(brew deps "$@")) else _not_implemented fi } homebrew_R() { brew remove "$@" } homebrew_Si() { brew info "$@" } homebrew_Suy() { brew update \ && brew upgrade --all "$@" } homebrew_Su() { brew upgrade --all "$@" } homebrew_Sy() { brew update "$@" } homebrew_Ss() { brew search "$@" } homebrew_Sc() { brew cleanup "$@" } homebrew_Scc() { brew cleanup -s "$@" } homebrew_Sccc() { # See more discussion in # https://github.com/icy/pacapt/issues/47 local _dcache _dcache="$(brew --cache)" case "$_dcache" in ""|"/"|" ") _error "$FUNCNAME: Unable to delete '$_dcache'." ;; *) # FIXME: This is quite stupid!!! But it's an easy way # FIXME: to avoid some warning from #shellcheck. # FIXME: Please note that, $_dcache is not empty now. rm -rf "${_dcache:-/x/x/x/x/x/x/x/x/x/x/x//x/x/x/x/x/}/" ;; esac } homebrew_S() { brew install $_TOPT "$@" } _macports_init() { : } macports_Ql() { port contents "$@" } macports_Qo() { port provides "$@" } macports_Qc() { port log "$@" } macports_Qu() { port outdated "$@" } macports_Rs() { if [[ "$_TOPT" == "" ]]; then port uninstall --follow-dependencies "$@" else _not_implemented fi } macports_R() { port uninstall "$@" } macports_Si() { port info "$@" } macports_Suy() { port selfupdate \ && port upgrade outdated "$@" } macports_Su() { port upgrade outdate "$@" } macports_Sy() { port selfupdate "$@" } macports_Ss() { port search "$@" } macports_Sc() { port clean --all inactive "$@" } macports_Scc() { port clean --all installed "$@" } macports_S() { if [[ "$_TOPT" == "fetch" ]]; then port patch "$@" else port install "$@" fi } _pkgng_init() { : } pkgng_Qi() { pkg info "$@" } pkgng_Ql() { pkg info -l "$@" } pkgng_Qo() { pkg which "$@" } pkgng_Qp() { pkg query -F "$@" '%n %v' } pkgng_Qu() { pkg upgrade -n "$@" } pkgng_Q() { if [[ "$_TOPT" == "q" ]]; then pkg query '%n' "$@" elif [[ "$_TOPT" == "" ]]; then pkg query '%n %v' "$@" else _not_implemented fi } pkgng_Rs() { if [[ "$_TOPT" == "" ]]; then pkg remove "$@" pkg autoremove else _not_implemented fi } pkgng_R() { pkg remove "$@" } pkgng_Si() { pkg search -S name -ef "$@" } pkgng_Suy() { pkg upgrade "$@" } pkgng_Su() { pkg upgrade -U "$@" } pkgng_Sy() { pkg update "$@" } pkgng_Ss() { pkg search "$@" } pkgng_Sc() { pkg clean "$@" } pkgng_Scc() { pkg clean -a "$@" } pkgng_S() { if [[ "$_TOPT" == "fetch" ]]; then pkg fetch "$@" else pkg install "$@" fi } _pkg_tools_init() { : } pkg_tools_Qi() { # disable searching mirrors for packages export PKG_PATH= pkg_info "$@" } pkg_tools_Ql() { export PKG_PATH= pkg_info -L "$@" } pkg_tools_Qo() { export PKG_PATH= pkg_info -E "$@" } pkg_tools_Qp() { _not_implemented } pkg_tools_Qu() { export PKG_PATH= pkg_add -u "$@" } pkg_tools_Q() { export PKG_PATH= # the dash after the pkg name is so we don't catch partial matches # because all packages in openbsd have the format 'pkgname-pkgver' if [[ "$_TOPT" == "q" && ! -z "$@" ]]; then pkg_info -q | grep "^${*}-" elif [[ "$_TOPT" == "q" && -z "$@" ]];then pkg_info -q elif [[ "$_TOPT" == "" && ! -z "$@" ]]; then pkg_info | grep "^${*}-" elif [[ "$_TOPT" == "" && -z "$@" ]];then pkg_info else _not_implemented fi } pkg_tools_Rs() { if [[ "$_TOPT" == "" ]]; then pkg_delete -D dependencies "$@" else _not_implemented fi } pkg_tools_Rn() { if [[ "$_TOPT" == "" ]];then pkg_delete -c "$@" else _not_implemented fi } pkg_tools_Rns() { _not_implemented } pkg_tools_R() { pkg_delete "$@" } pkg_tools_Si() { pkg_info "$@" } pkg_tools_Sl() { pkg_info -L "$@" } pkg_tools_Suy() { # pkg_tools doesn't really have any concept of a database # there's actually not really any database to update, so # this function is mostly just for convienience since on arch # doing -Su is normally a bad thing to do since it's a partial upgrade pkg_tools_Su "$@" } pkg_tools_Su() { pkg_add -u "$@" } pkg_tools_Sy() { _not_implemented } pkg_tools_Ss() { if [[ -z "$@" ]];then _not_implemented else pkg_info -Q "$@" fi } pkg_tools_Sc() { # by default no cache directory is used if [[ -z "$PKG_CACHE" ]];then echo "You have no cache directory set, set \$PKG_CACHE for a cache directory." elif [[ ! -d "$PKG_CACHE" ]];then echo "You have a cache directory set, but it does not exist. Create \"$PKG_CACHE\"." else _removing_is_dangerous "rm -rf $PKG_CACHE/*" fi } pkg_tools_Scc() { _not_implemented } pkg_tools_S() { pkg_add "$@" } _portage_init() { : } portage_Qi() { emerge --info "$@" } portage_Ql() { if [[ -x '/usr/bin/qlist' ]]; then qlist "$@" elif [[ -x '/usr/bin/equery' ]]; then equery files "$@" else _error "'portage-utils' or 'gentoolkit' package is required to perform this opreation." fi } portage_Qo() { if [[ -x '/usr/bin/equery' ]]; then equery belongs "$@" else _error "'gentoolkit' package is required to perform this operation." fi } portage_Qc() { emerge -p --changelog "$@" } portage_Qu() { emerge -uvN "$@" } portage_Q() { if [[ "$_TOPT" == "" ]]; then if [[ -x '/usr/bin/eix' ]]; then eix -I "$@" elif [[ -x '/usr/bin/equery' ]]; then equery list -i "$@" else LS_COLORS=never \ ls -1 -d /var/db/pkg/*/* fi else _not_implemented fi } portage_Rs() { if [[ "$_TOPT" == "" ]]; then emerge --depclean world "$@" else _not_implemented fi } portage_R() { emerge --depclean "@" } portage_Si() { emerge --info "$@" } portage_Suy() { if [[ -x '/usr/bin/layman' ]]; then layman --sync-all \ && emerge --sync \ && emerge -auND world "$@" else emerge --sync \ && emerge -uND world "$@" fi } portage_Su() { emerge -uND world "$@" } portage_Sy() { if [[ -x "/usr/bin/layman" ]]; then layman --sync-all \ && emerge --sync "$@" else emerge --sync "$@" fi } portage_Ss() { if [[ -x "/usr/bin/eix" ]]; then eix "$@" else emerge --search "$@" fi } portage_Sc() { if [[ -x "/usr/bin/eclean-dist" ]]; then eclean-dist -d -t1m -s50 -f "$@" else _error "'gentoolkit' package is required to perform this operation." fi } portage_Scc() { if [[ -x "/usr/bin/eclean" ]]; then eclean -i distfiles "$@" else _error "'gentoolkit' package is required to perform this operation." fi } portage_Sccc() { rm -fv /usr/portage/distfiles/*.* } portage_S() { emerge "$@" } _sun_tools_init() { # The purpose of `if` is to make sure this function # can be invoked on other system (Linux, BSD). if [[ "$(uname)" == "SunOS" ]]; then export GREP=/usr/xpg4/bin/grep export AWK=nawk fi } sun_tools_Qi() { pkginfo -l "$@" } sun_tools_Ql() { pkginfo -l "$@" } sun_tools_Qo() { $GREP "$@" /var/sadm/install/contents } sun_tools_Qs() { pkginfo | $GREP -i "$@" } sun_tools_Q() { # the dash after the pkg name is so we don't catch partial matches # because all packages in openbsd have the format 'pkgname-pkgver' if [[ "$_TOPT" == "q" && ! -z "$@" ]]; then pkginfo | $GREP "$@" elif [[ "$_TOPT" == "q" && -z "$@" ]]; then pkginfo else pkginfo "$@" fi } sun_tools_R() { pkgrm "$@" } sun_tools_U() { pkgadd "$@" } _tazpkg_init() { : } tazpkg_Q() { if [[ "$_TOPT" == "q" ]]; then tazpkg list "$@" \ | awk '{ if (NF == 2 || NF == 3) { print $1; }}' elif [[ "$_TOPT" == "" ]]; then tazpkg list "$@" else _not_implemented fi } tazpkg_Qi() { tazpkg info "$@" } tazpkg_Ql() { if [[ -z "$@" ]]; then _not_implemented return fi if [[ "$_TOPT" == "q" ]]; then { tazpkg list-files "$@" tazpkg list-config "$@" } \ | grep ^/ else tazpkg list-files "$@" tazpkg list-config "$@" fi } tazpkg_Sy() { tazpkg recharge } tazpkg_Su() { tazpkg up } tazpkg_Suy() { tazpkg_Sy \ && tazpkg_Su } tazpkg_S() { local _forced="" grep -q -- "--forced" <<<"*" if [[ $? -eq 0 ]]; then _forced="--forced" fi while (( $# )); do if [[ "$1" == "--forced" ]]; then _forced="--forced" shift continue fi tazpkg get-install "$1" $_forced shift done } tazpkg_R() { local _auto="" grep -q -- "--auto" <<<"*" if [[ $? -eq 0 ]]; then _auto="--auto" fi while (( $# )); do if [[ "$1" == "--auto" ]]; then _auto="--auto" shift continue fi tazpkg remove "$1" $_auto shift done } tazpkg_Sc() { tazpkg clean-cache } tazpkg_Scc() { tazpkg clean-cache cd /var/lib/tazpkg/ \ && { rm -fv \ ./*.bak \ ID \ packages.* \ files.list.* } } tazpkg_Ss() { tazpkg search "$@" } tazpkg_Qo() { tazpkg search-pkgname "$@" } tazpkg_U() { local _forced="" grep -q -- "--forced" <<<"*" if [[ $? -eq 0 ]]; then _forced="--forced" fi while (( $# )); do if [[ "$1" == "--forced" ]]; then _forced="--forced" shift continue fi tazpkg install "$1" $_forced shift done } _yum_init() { : } yum_Q() { if [[ "$_TOPT" == "q" ]]; then rpm -qa --qf "%{NAME}\n" elif [[ "$_TOPT" == "" ]]; then rpm -qa --qf "%{NAME} %{VERSION}\n" else _not_implemented fi } yum_Qi() { yum info "$@" } yum_Qs() { rpm -qa "*$@*" } yum_Ql() { rpm -ql "$@" } yum_Qo() { rpm -qf "$@" } yum_Qp() { rpm -qp "$@" } yum_Qc() { rpm -q --changelog "$@" } yum_Qu() { yum list updates "$@" } yum_Qm() { yum list extras "$@" } yum_Rs() { if [[ "$_TOPT" == "" ]]; then yum erase "$@" else _not_implemented fi } yum_R() { yum erase "$@" } yum_Si() { yum info "$@" } yum_Suy() { yum update "$@" } yum_Su() { yum update "$@" } yum_Sy() { yum check-update "$@" } yum_Ss() { yum -C search "$@" } yum_Sc() { yum clean expire-cache "$@" } yum_Scc() { yum clean packages "$@" } yum_Sccc() { yum clean all "$@" } yum_S() { yum install $_TOPT "$@" } yum_U() { yum localinstall "$@" } yum_Sii() { yum resolvedep "$@" } _zypper_init() { : } zypper_Qc() { rpm -q --changelog "$@" } zypper_Qi() { zypper info "$@" } zypper_Ql() { rpm -ql "$@" } zypper_Qu() { zypper list-updates "$@" } zypper_Qm() { zypper search -si "$@" \ | grep 'System Packages' } zypper_Qo() { rpm -qf "$@" } zypper_Qp() { rpm -qip "$@" } zypper_Qs() { zypper search --installed-only "$@" } zypper_Q() { if [[ "$_TOPT" == "q" ]]; then zypper search -i "$@" \ | grep ^i \ | awk '{print $3}' elif [[ "$_TOPT" == "" ]]; then zypper search -i "$@" else _not_implemented fi } zypper_Rs() { if [[ "$_TOPT" == "s" ]]; then zypper remove "$@" --clean-deps else _not_implemented fi } zypper_R() { zypper remove "$@" } zypper_Rn() { # Remove configuration files while read file; do if [[ -f "$file" ]]; then rm -fv "$file" fi done < <(rpm -ql "$@") # Now remove the package per-se zypper remove "$@" } zypper_Rs() { if [[ "$_TOPT" == "s" ]]; then zypper remove "$@" --clean-deps else _not_implemented fi } zypper_Rns() { # Remove configuration files while read file; do if [[ -f "$file" ]]; then rm -fv "$file" fi done < <(rpm -ql "$@") zypper remove "$@" --clean-deps } zypper_Suy() { zypper dup "$@" } zypper_Sy() { zypper refresh "$@" } zypper_Sl() { if [[ $# -eq 0 ]]; then zypper pa -R else zypper pa -r "$@" fi } zypper_Ss() { zypper search "$@" } zypper_Su() { zypper --no-refresh dup "$@" } zypper_Sc() { zypper clean "$@" } zypper_Scc() { zypper clean "$@" } zypper_Sccc() { # Not way to do this in zypper _not_implemented } zypper_Si() { zypper info --requires "$@" } zypper_Sii() { # Ugly and slow, but does the trick local packages= packages="$(zypper pa -R | cut -d \| -f 3 | tr -s '\n' ' ')" for package in $packages; do zypper info --requires "$package" \ | grep -q "$@" && echo $package done } zypper_S() { zypper install $_TOPT "$@" } zypper_Sw() { zypper install --download-only "$@" } zypper_U() { zypper install "$@" } _validate_operation() { case "$1" in "apk_Q") ;; "apk_Qi") ;; "apk_Ql") ;; "apk_Qo") ;; "apk_Qs") ;; "apk_Qu") ;; "apk_R") ;; "apk_Rn") ;; "apk_Rns") ;; "apk_Rs") ;; "apk_S") ;; "apk_Sc") ;; "apk_Scc") ;; "apk_Sccc") ;; "apk_Si") ;; "apk_Sii") ;; "apk_Sl") ;; "apk_Ss") ;; "apk_Su") ;; "apk_Suy") ;; "apk_Sy") ;; "apk_Sw") ;; "apk_U") ;; "cave_Q") ;; "cave_Qi") ;; "cave_Ql") ;; "cave_Qo") ;; "cave_Qp") ;; "cave_Qu") ;; "cave_Qs") ;; "cave_Rs") ;; "cave_Rn") ;; "cave_Rns") ;; "cave_R") ;; "cave_Si") ;; "cave_Suy") ;; "cave_Su") ;; "cave_Sy") ;; "cave_Ss") ;; "cave_Sc") ;; "cave_Scc") ;; "cave_Sccc") ;; "cave_S") ;; "cave_U") ;; "dnf_S") ;; "dnf_Suy") ;; "dnf_Sw") ;; "dnf_Si") ;; "dnf_Sl") ;; "dnf_Ss") ;; "dnf_Sc") ;; "dnf_Scc") ;; "dnf_Sccc") ;; "dnf_Su") ;; "dnf_Sy") ;; "dnf_Q") ;; "dnf_Qi") ;; "dnf_Qu") ;; "dnf_Qs") ;; "dnf_Ql") ;; "dnf_Qo") ;; "dnf_Qp") ;; "dnf_Qc") ;; "dnf_Qm") ;; "dnf_R") ;; "dnf_U") ;; "dpkg_Q") ;; "dpkg_Qi") ;; "dpkg_Ql") ;; "dpkg_Qo") ;; "dpkg_Qp") ;; "dpkg_Qu") ;; "dpkg_Qs") ;; "dpkg_Rs") ;; "dpkg_Rn") ;; "dpkg_Rns") ;; "dpkg_R") ;; "dpkg_Si") ;; "dpkg_Suy") ;; "dpkg_Su") ;; "dpkg_Sy") ;; "dpkg_Ss") ;; "dpkg_Sc") ;; "dpkg_Scc") ;; "dpkg_S") ;; "dpkg_U") ;; "dpkg_Sii") ;; "dpkg_Sccc") ;; "homebrew_Qi") ;; "homebrew_Ql") ;; "homebrew_Qo") ;; "homebrew_Qc") ;; "homebrew_Qu") ;; "homebrew_Qs") ;; "homebrew_Q") ;; "homebrew_Rs") ;; "homebrew_R") ;; "homebrew_Si") ;; "homebrew_Suy") ;; "homebrew_Su") ;; "homebrew_Sy") ;; "homebrew_Ss") ;; "homebrew_Sc") ;; "homebrew_Scc") ;; "homebrew_Sccc") ;; "homebrew_S") ;; "macports_Ql") ;; "macports_Qo") ;; "macports_Qc") ;; "macports_Qu") ;; "macports_Rs") ;; "macports_R") ;; "macports_Si") ;; "macports_Suy") ;; "macports_Su") ;; "macports_Sy") ;; "macports_Ss") ;; "macports_Sc") ;; "macports_Scc") ;; "macports_S") ;; "pkgng_Qi") ;; "pkgng_Ql") ;; "pkgng_Qo") ;; "pkgng_Qp") ;; "pkgng_Qu") ;; "pkgng_Q") ;; "pkgng_Rs") ;; "pkgng_R") ;; "pkgng_Si") ;; "pkgng_Suy") ;; "pkgng_Su") ;; "pkgng_Sy") ;; "pkgng_Ss") ;; "pkgng_Sc") ;; "pkgng_Scc") ;; "pkgng_S") ;; "pkg_tools_Qi") ;; "pkg_tools_Ql") ;; "pkg_tools_Qo") ;; "pkg_tools_Qp") ;; "pkg_tools_Qu") ;; "pkg_tools_Q") ;; "pkg_tools_Rs") ;; "pkg_tools_Rn") ;; "pkg_tools_Rns") ;; "pkg_tools_R") ;; "pkg_tools_Si") ;; "pkg_tools_Sl") ;; "pkg_tools_Suy") ;; "pkg_tools_Su") ;; "pkg_tools_Sy") ;; "pkg_tools_Ss") ;; "pkg_tools_Sc") ;; "pkg_tools_Scc") ;; "pkg_tools_S") ;; "portage_Qi") ;; "portage_Ql") ;; "portage_Qo") ;; "portage_Qc") ;; "portage_Qu") ;; "portage_Q") ;; "portage_Rs") ;; "portage_R") ;; "portage_Si") ;; "portage_Suy") ;; "portage_Su") ;; "portage_Sy") ;; "portage_Ss") ;; "portage_Sc") ;; "portage_Scc") ;; "portage_Sccc") ;; "portage_S") ;; "sun_tools_Qi") ;; "sun_tools_Ql") ;; "sun_tools_Qo") ;; "sun_tools_Qs") ;; "sun_tools_Q") ;; "sun_tools_R") ;; "sun_tools_U") ;; "tazpkg_Q") ;; "tazpkg_Qi") ;; "tazpkg_Ql") ;; "tazpkg_Sy") ;; "tazpkg_Su") ;; "tazpkg_Suy") ;; "tazpkg_S") ;; "tazpkg_R") ;; "tazpkg_Sc") ;; "tazpkg_Scc") ;; "tazpkg_Ss") ;; "tazpkg_Qo") ;; "tazpkg_U") ;; "yum_Q") ;; "yum_Qi") ;; "yum_Qs") ;; "yum_Ql") ;; "yum_Qo") ;; "yum_Qp") ;; "yum_Qc") ;; "yum_Qu") ;; "yum_Qm") ;; "yum_Rs") ;; "yum_R") ;; "yum_Si") ;; "yum_Suy") ;; "yum_Su") ;; "yum_Sy") ;; "yum_Ss") ;; "yum_Sc") ;; "yum_Scc") ;; "yum_Sccc") ;; "yum_S") ;; "yum_U") ;; "yum_Sii") ;; "zypper_Qc") ;; "zypper_Qi") ;; "zypper_Ql") ;; "zypper_Qu") ;; "zypper_Qm") ;; "zypper_Qo") ;; "zypper_Qp") ;; "zypper_Qs") ;; "zypper_Q") ;; "zypper_Rs") ;; "zypper_R") ;; "zypper_Rn") ;; "zypper_Rs") ;; "zypper_Rns") ;; "zypper_Suy") ;; "zypper_Sy") ;; "zypper_Sl") ;; "zypper_Ss") ;; "zypper_Su") ;; "zypper_Sc") ;; "zypper_Scc") ;; "zypper_Sccc") ;; "zypper_Si") ;; "zypper_Sii") ;; "zypper_S") ;; "zypper_Sw") ;; "zypper_U") ;; *) return 1 ;; esac } set -u unset GREP_OPTIONS : "${PACAPT_DEBUG=}" # Show what will be going : "${GREP:=grep}" # Need to update in, e.g, _sun_tools_init : "${AWK:=awk}" # Need to update in, e.g, _sun_tools_init _sun_tools_init # Dirty tricky patch for SunOS export PACAPT_DEBUG GREP AWK _POPT="" # primary operation _SOPT="" # secondary operation _TOPT="" # options for operations _EOPT="" # extra options (directly given to package manager) # these options will be translated by (_translate_all) method. _PACMAN="" # name of the package manager _PACMAN_detect \ || _die "'pacapt' doesn't support your package manager." if [[ -z "$PACAPT_DEBUG" ]]; then [[ "$_PACMAN" != "pacman" ]] \ || exec "/usr/bin/pacman" "$@" elif [[ "$PACAPT_DEBUG" != "auto" ]]; then _PACMAN="$PACAPT_DEBUG" fi while :; do _args="${1-}" [[ "${_args:0:1}" == "-" ]] || break case "${_args}" in "--help") _help exit 0 ;; "--noconfirm") shift _EOPT="$_EOPT:noconfirm:" continue ;; "-"|"--") shift break ;; esac i=1 while [[ "$i" -lt "${#_args}" ]]; do _opt="${_args:$i:1}" (( i ++ )) case "$_opt" in h) _help exit 0 ;; V) _print_pacapt_version $PACAPT_VERSION; exit 0 ;; P) _print_supported_operations $_PACMAN exit 0 ;; Q|S|R|U) if [[ -n "$_POPT" && "$_POPT" != "$_opt" ]]; then _error "Only one operation may be used at a time" exit 1 fi _POPT="$_opt" ;; # Comment 2015 May 26th: This part deals with the 2nd option. # Most of the time, there is only one 2nd option. But some # operation may need extra and/or duplicate (e.g, Sy <> Syy). # # See also # # * https://github.com/icy/pacapt/issues/13 # # This implementation works, but with a bug. #Rsn works # but #Rns is translated to #Rn (incorrectly.) # Thanks Huy-Ngo for this nice catch. # # FIXME: Please check pacman(8) to see if they are really 2nd operation # s|l|i|p|o|m|n) if [[ "$_SOPT" == '' ]]; then _SOPT="$_opt" continue fi # Understand it: # If there is already an option recorded, the incoming option # will come and compare itself with known one. # We have a table # # known one vs. incoming ? | result # < | one-new # = | one-one # > | new-one # # Let's say, after this step, the 3rd option comes (named X), # and the current result is "a-b". We have a table # # a(b) vs. X | result # < | aX (b dropped) # = | aa (b dropped) # > | Xa (b dropped) # # In any case, the first one matters. # if [[ "${_SOPT:0:1}" < "$_opt" ]]; then _SOPT="${_SOPT:0:1}$_opt" elif [[ "${_SOPT:0:1}" == "$_opt" ]]; then _SOPT="$_opt$_opt" else _SOPT="$_opt${_SOPT:0:1}" fi ;; q) _TOPT="$_opt" ;; # Thanks to James Pearson u) if [[ "${_SOPT:0:1}" == "y" ]]; then _SOPT="uy" else _SOPT="u" fi ;; y) if [[ "${_SOPT:0:1}" == "u" ]]; then _SOPT="uy" else _SOPT="y" fi ;; c) if [[ "${_SOPT:0:2}" == "cc" ]]; then _SOPT="ccc" elif [[ "${_SOPT:0:1}" == "c" ]]; then _SOPT="cc" else _SOPT="$_opt" fi ;; w|v) _EOPT="$_EOPT:$_opt:" ;; *) # FIXME: If option is unknown, we will break the loop # FIXME: and this option will be used by the native program. # FIXME: break 2 _die "pacapt: Unknown option '$_opt'." ;; esac done shift # If the primary option and the secondary are known # we would break the argument detection, but for sure we will look # forward to see there is anything interesting... if [[ -n "$_POPT" && -n "$_SOPT" ]]; then case "${1:-}" in "-w"|"--noconfirm") ;; *) break;; esac # Don't have anything from the **first** argument. Something wrong. # FIXME: This means that user must enter at least primary action # FIXME: or secondary action in the very first part... elif [[ -z "${_POPT}${_SOPT}${_TOPT}" ]]; then break fi done [[ -n "$_POPT" ]] \ || _die "Usage: pacapt # -h for help, -P list supported functions" _validate_operation "${_PACMAN}_${_POPT}${_SOPT}" \ || { _not_implemented exit 1 } _translate_all || exit if [[ -n "$@" ]]; then case "${_POPT}${_SOPT}" in "Su"|"Sy"|"Suy") echo 1>&2 "WARNING ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" echo 1>&2 " The -Sy/u options refresh and/or upgrade all packages." echo 1>&2 " To install packages as well, use separate commands:" echo 1>&2 echo 1>&2 " $0 -S$_SOPT; $0 -S ${*}" echo 1>&2 "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" esac fi if [[ -n "$PACAPT_DEBUG" ]]; then echo "pacapt: $_PACMAN, p=$_POPT, s=$_SOPT, t=$_TOPT, e=$_EOPT" echo "pacapt: execute '${_PACMAN}_${_POPT}${_SOPT} $_EOPT ${*}'" declare -f "${_PACMAN}_${_POPT}${_SOPT}" else "_${_PACMAN}_init" "${_PACMAN}_${_POPT}${_SOPT}" $_EOPT "$@" fi pacapt-2.3.13/tests/000077500000000000000000000000001274410301200142045ustar00rootroot00000000000000pacapt-2.3.13/tests/Makefile000066400000000000000000000013671274410301200156530ustar00rootroot00000000000000TESTS = *.txt .PHONY: default default: @grep -E "^# [a-z].+:" Makefile # gen: # gen: Generating `pacapt.dev` tmp/pacapt.dev:: @( cd ../ && make -s pacapt.dev ; ) @mkdir -p ./tmp/ @cp -u ../pacapt.dev tmp/ @chmod 755 $(@) # all: # all: Execute all test scripts # all: To execute a subset of tests, list them with TESTS=... # all: for example, `make all TESTS="foo.txt bar.txt" .PHONY: all all: tmp/pacapt.dev @./test.sh $(TESTS) # gen: # gen: Generate test scripts but don't execute them .PHONY: gen gen: tmp/pacapt.dev @TESTS_DO_NOT_RUN=1 ./test.sh *.txt # clean: # clean: Remove all temporary files under /tmp/ # clean: (but still keep all log files.) .PHONY: clen clean: @rm -fv tmp/*.sh tmp/pacapt.dev @echo Please remove tmp/*.log manually. pacapt-2.3.13/tests/README.md000066400000000000000000000071461274410301200154730ustar00rootroot00000000000000## Table of contents 1. [Preparing test environment](#preparing-test-environment) 1. [Invoking test scripts](#invoking-test-script) 1. [Writting test cases](#writting-test-cases) 1. [Notes](#notes-on-writting-test-cases) ## Preparing test environment We run `#bourne` test scripts inside `Docker` container. We will need the following things 1. A fast network to download base images from http://hub.docker.com/, and to execute `pacman -Sy` command; 1. Our user environment can execute `docker run` command to create new container and mount some host volumes; 1. A basic `Ruby` environment to execute `./bin/gen_tests.rb` script. Basically we execute the following command $ cd $ mkdir -p tests/tmp/ $ ruby -n ./bin/gen_tests.rb \ < tests/dpkg.txt \ > tests/tmp/test.sh $ cd tests/tmp/ $ docker run --rm \ -v $PWD/test.sh:/tmp/test.sh \ -v $PWD/pacapt.dev:/usr/bin/pacman \ ubuntu:14.04 \ /tmp/test.sh This command will return 0 if all tests pass, or return 1 if any test fails. For more details, please see in `Makefile` and `test.sh`. ## Invoking test scripts There are `Makefile` and `test.sh` written and tested in an Arch/Ubuntu machine. It is expected to work in similar environment with `GNU Make`, `Bash` and `Docker`. $ make # List all sections $ make all # Execute all test scripts # or a subset of tests, as below $ make TESTS="foo.txt bar.txt" This script will create a temporary directory `tests/tmp/` to store all logs and details. If there is any test script fails, the process is stopped for investigation. ## Writting test cases See examples in `tests/dpkg.txt`. Each test case combines of input command and output regular expressions used by `grep -E`. Input command is started by `in `, output regexp is started by `ou `. For example, in -Sy in -Qs htop ou ^htop the test is passed if the following group of commands returns successfully pacman -Sy pacman -Qs htop | grep -qE '^htop' If we want to execute some command other than `pacman` script, use `!` to write our original command. For example, in ! echo Y | pacman -S htop in ! echo Y | pacman -R htop in -Qi htop ou ^Status: deinstall On `Debian`/`Ubuntu` system, this test case is to ensure that the script can install `htop` package, then remove it. An alternative test is echo Y | pacman -S htop echo Y | pacman -R htop pacman -Qi htop | grep -E '^Status: deinstall' ## Notes on writting test cases 1. To specify a list of container images, use `im image [image]...`; 1. Each test case has its own temporary file to store all output; 1. Multiple uses of `test.in` is possible, and all results are appended to test's temporary file. If we want to clear the contents of this output please use `in clear`; 1. Multiple uses of `test.ou` is possible; any fail check will increase the total number of failed tests; 1. To make sure that test's temporary file is empty, use `ou empty`; 1. Tests are executed by orders provided in the source file. It's better to execute `pacman -Sy` to update package manager's database before any other tests, and it's also better to test `clean up` features (`pacman -Sc`, `pacman -Scc`, ...) at the very end of the source file. See `lib/dpkg.sh` for an example; 1. All tests are executed by `#bourne` shell. Forget `#bash`:) 1. In any input command, `$LOG` (if any) is replaced by the path to test's temporary file; 1. It's very easy to trick the test mechanism; it's our duty to make the tests as simple as possible. pacapt-2.3.13/tests/dpkg.txt000066400000000000000000000023341274410301200156740ustar00rootroot00000000000000#!/bin/sh # FIXME: debian:squeeze It's unable to run `pacman -Sy` im ubuntu:14.04 debian:wheezy # Remove `docker-clean` because we need *.deb files under /var/cache in ! rm -fv /etc/apt/apt.conf.d/docker-clean ou ^removed .*docker-clean # Update package databses in -Sy # Simple query that lists all packages in -Qq ou ^apt$ # Listing with version and packge name in -Q # ou ^ii +apt +.+ubuntu ou ^ii +apt + # Information of `apt` in -Qi apt ou ^Package: apt$ ou ^Status: install ok installed$ ou ^Priority: important$ # File listing for `apt` in -Ql apt ou ^/usr/bin/apt-key # File listing (all packages) # FIXME: Debian-squeeze doesn't have /usr/bin/apt in -Ql ou ^apt /usr/bin/apt-key$ # File listing (all packages), files only in -Qql ou ^/usr/bin/apt-key$ # Look up package name in -Qo /bin/bash ou ^bash: /bin/bash$ # Install and Deinstall a package in ! echo Y | pacman -S screen in ! echo Y | pacman -R screen in -Qi screen ou ^Status: deinstall # Query information from a .deb package in ! export DEB_FILE=`find /var/cache/apt/ -type f -iname "screen*.deb"` in -Qp $DEB_FILE ou ^ Package: screen # Clean up package databases in -Sc in clear in -sS tmux ou tmux # Strong cleaning up in -Sccc in clear in -sS tmux ou empty pacapt-2.3.13/tests/slitaz40.txt000066400000000000000000000021511274410301200164160ustar00rootroot00000000000000#!/bin/sh im icymatter/slitaz40-minimal in -Sy ou (Connecting to)|(Recharging repository) ou (is ready to use)|(Main is up to date) in -Q ou ^busybox.+[[:digit:]]+ # FIXME: slitaz generates some special characters in -Qq ou ^busybox in -Qi busybox ou Package.+:.+busybox in -Ql busybox ou ^/bin/busybox in -sS htop ou ^htop((-)|( +))[[:digit:]]+ in -Qs htop ou not implemented in ! echo Y | pacman -S htop ou htop.+ is installed. in ! echo Y | pacman -S --forced htop ou Unknown option in ! echo Y | pacman -S -- --forced htop ou htop.+ is installed. # FIXME: Slitaz-4.0: test passed # FIXME: Slitaz-5.0: test failed. Possibly a tazpkg bug? in ! echo N | pacman -R htop ou Uninstallation of htop cancelled # FIXME: Weird, slitaz doesn't understand Y :) # FIXME: It's actually a timeout problem here...? in ! echo Y | pacman -R htop ou Uninstallation of htop cancelled in ! echo y | pacman -R htop ou Removing all files installed in -Sccc ou not implemented in -Scc in clear # FIXME: Slitaz-4.0: passed # FIXME: Slitaz-5.0: failed; `-Ss` runs `-Sy` automatically. in -sS htop ou No 'packages.list' found to check pacapt-2.3.13/tests/test.sh000077500000000000000000000025331274410301200155250ustar00rootroot00000000000000#!/bin/bash # Purpose: Execute test using data from foobar.txt # $1: Input file _test() { local _file="${1:-}" local _basename="$(basename "$_file" .txt)" local _images= # See if input is provided with .txt extension if [[ "$(basename "$_file")" == "$_basename" ]]; then _file="$_file.txt" fi if [[ ! -f "$_file" ]]; then echo >&2 ":: File not found '$_file'. Return(1)." return 1 fi echo >&2 ":: Generating 'tmp/$_basename.sh'..." ruby -n ../bin/gen_tests.rb < "$_file" > "tmp/$_basename.sh" chmod 755 "tmp/$_basename.sh" bash -n "tmp/$_basename.sh" if [[ $? -ge 1 ]]; then return 1 fi if [[ "${TESTS_DO_NOT_RUN:-}" == 1 ]]; then return 0 fi _images="$(grep -m1 -E '^im ' "$_file")" _count=0 for _img in $_images; do [[ $_img == "im" ]] && continue (( _count ++ )) echo >&2 ":: Testing $_basename with $_img" ( cd tmp/ || return 1 docker run --rm \ -v $PWD/pacapt.dev:/usr/bin/pacman \ -v "$PWD/$_basename.sh:/tmp/test.sh" \ $_img \ /tmp/test.sh 2>"$_basename.${_img//\//-}.log" ) if [[ $? -ge 1 ]]; then echo >&2 "FAIL: $_basename/$_img" return 1 fi done if [[ $_count == 0 ]]; then echo >&2 "WARN: $_basename: Forget to specify 'im ' instruction?" fi } while (( $# )); do _test $1 || exit 1 shift done