epm-autoorphans 4.92 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
        # ALT Linux only
        assure_exists /usr/share/apt/scripts/list-extras.lua apt-scripts
        if [ -z "$dryrun" ] ; then
35
            message "We will try remove all installed packages which are missed in repositories"
36 37 38
            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
            message "Skip follow packages installed via epm play:" $(echo $play_installed | xargs -n1000 echo)
51 52 53 54
            PKGLIST="$(estrlist exclude "$play_installed" "$PKGLIST")"
        fi

        # TODO: implement for other PMTYPE
55
        local hold_packages="$(epm mark --short showhold)"
56
        if [ -n "$hold_packages" ] ; then
57
            message "Skip follow packages on hold:" $(echo $hold_packages | xargs -n1000 echo)
58
            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
        else
70
            message "There are no orphan packages in the system."
71
        fi
72
        return 0
73
        ;;
74 75 76
esac

case $PMTYPE in
77 78 79 80 81 82 83 84 85 86 87 88
    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
89
        local PKGLIST=$(a= package-cleanup -q --orphans | grep -v "^eepm-")
90 91
        docmd epm remove $dryrun $PKGLIST
        ;;
92
    dnf-rpm|dnf5-rpm)
93 94 95 96
        # TODO: dnf list extras
        docmd epm upgrade
        assure_exists package-cleanup dnf-utils
        showcmd package-cleanup --orphans
97
        local PKGLIST=$(a= package-cleanup -q --orphans | grep -v "^eepm-")
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
        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
        ;;
128 129 130
    pisi)
        sudocmd pisi remove-orphaned
        ;;
131 132 133 134 135 136 137 138 139 140 141 142
    #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
143
        local PKGLIST=$(a= zypper packages --orphaned | tail -n +5 | cut -d \| -f 3 | sort -u)
144 145 146 147 148 149 150 151 152 153
        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
        ;;
    *)
154
        fatal 'Have no suitable command for $PMTYPE'
155
        ;;
156 157 158
esac

}