epm-autoorphans 4.84 KB
Newer Older
1 2
#!/bin/sh
#
3 4
# Copyright (C) 2015, 2017  Etersoft
# Copyright (C) 2015, 2017  Vitaly Lipatov <lav@etersoft.ru>
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#

20 21
__epm_orphan_altrpm()
{
22
    docmd apt-cache list-extras
23 24
}

25 26
epm_autoorphans()
{
27

28
[ -z "$*" ] || fatal "No arguments are allowed here"
29

30 31
case $BASEDISTRNAME in
    alt)
32 33 34 35 36 37 38
        # ALT Linux only
        assure_exists /usr/share/apt/scripts/list-extras.lua apt-scripts
        if [ -z "$dryrun" ] ; then
            echo "We will try remove all installed packages which are missed in repositories"
            warning "Use with caution!"
        fi
        epm Upgrade || fatal
39
        info "Retrieving orphaned packages list ..."
40 41 42 43 44
        local PKGLIST=$(__epm_orphan_altrpm \
            | sed -e "s/\.32bit//g" \
            | grep -v -- "^eepm$" \
            | grep -v -- "^distro_info$" \
            | grep -v -- "^kernel")
45

46
        # TODO: implement for other PMTYPE
47
        info "Retrieving packages installed via epm play ..."
48 49
        local play_installed="$(epm play --list-installed-packages)"
        if [ -n "$play_installed" ] ; then
50 51 52 53 54
            echo "Skip follow packages installed via epm play: $(echo $play_installed | xargs -n1000 echo)"
            PKGLIST="$(estrlist exclude "$play_installed" "$PKGLIST")"
        fi

        # TODO: implement for other PMTYPE
55
        local hold_packages="$(epm mark --short showhold)"
56 57 58
        if [ -n "$hold_packages" ] ; then
            echo "Skip follow packages on hold: $(echo $hold_packages | xargs -n1000 echo)"
            PKGLIST="$(estrlist exclude "$hold_packages" "$PKGLIST")"
59
        fi
60

61 62 63 64 65
        if [ -n "$PKGLIST" ] ; then
            if [ -z "$dryrun" ] ; then
                showcmd epm remove $dryrun $force $PKGLIST
                confirm_info "We will remove packages above."
            fi
66 67
            info
            info
68
            docmd epm remove $dryrun $force $(subst_option non_interactive --auto) $PKGLIST
69 70 71
        else
            echo "There are no orphan packages in the system."
        fi
72
        return 0
73
        ;;
74 75 76
esac

case $PMTYPE in
77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
    apt-dpkg|aptitude-dpkg)
        assure_exists deborphan
        showcmd deborphan
        a='' deborphan | docmd epm remove $dryrun
        ;;
    #aura)
    #    sudocmd aura -Oj
    #    ;;
    yum-rpm)
        docmd epm upgrade
        assure_exists package-cleanup yum-utils
        showcmd package-cleanup --orphans
        local PKGLIST=$(package-cleanup -q --orphans | grep -v "^eepm-")
        docmd epm remove $dryrun $PKGLIST
        ;;
    dnf-rpm)
        # TODO: dnf list extras
        docmd epm upgrade
        assure_exists package-cleanup dnf-utils
        showcmd package-cleanup --orphans
        local PKGLIST=$(package-cleanup -q --orphans | grep -v "^eepm-")
        docmd epm remove $dryrun $PKGLIST
        ;;
    urpm-rpm)
        if [ -n "$dryrun" ] ; then
            fatal "--dry-run is not supported yet"
        else
            showcmd urpme --report-orphans
            sudocmd urpme --auto-orphans
        fi
        ;;
    #emerge)
    #    sudocmd emerge --depclean
    #    assure_exists revdep-rebuild
    #    sudocmd revdep-rebuild
    #    ;;
    pacman)
        if [ -n "$dryrun" ] ; then
            info "Autoorphans packages list:"
            sudocmd pacman -Qdtq
        else
            sudocmd pacman -Qdtq | sudocmd pacman -Rs -
        fi
        ;;
    slackpkg)
        # clean-system removes non official packages
        sudocmd slackpkg clean-system
        ;;
    eopkg)
        sudocmd eopkg remove-orphans
        ;;
    #guix)
    #    sudocmd guix gc
    #    ;;
    #pkgng)
    #    sudocmd pkg autoremove
    #    ;;
    zypper-rpm)
        # https://www.linux.org.ru/forum/desktop/11931830
        assure_exists zypper zypper 1.9.2
        # For zypper < 1.9.2: zypper se -si | grep 'System Packages'
        sudocmd zypper packages --orphaned
        # FIXME: x86_64/i586 are duplicated
        local PKGLIST=$(zypper packages --orphaned | tail -n +5 | cut -d \| -f 3 | sort -u)
        docmd epm remove $dryrun --clean-deps $PKGLIST
        ;;
    xbps)
        if [ -n "$dryrun" ] ; then
            fatal "--dry-run is not supported yet"
        else
            sudocmd xbps-remove -o
        fi
        ;;
    *)
        fatal "Have no suitable command for $PMTYPE"
        ;;
153 154 155
esac

}