Usuń niepotrzebne zależności z Cygwin

15

W Cygwin, gdy instaluję nowy pakiet, automatycznie instaluje on wszelkie zależności potrzebne dla tego pakietu.

Później, jeśli zdecyduję się usunąć ten pakiet, jak mogę usunąć zależności, które z nim zainstalowałem, które nie są już potrzebne?

Josh
źródło

Odpowiedzi:

8

Oto moje obecne rozwiązanie, które wymyśliłem. Używam mojej (bardzo) ograniczonej wiedzy o bash i Google.

#!/bin/bash
# Print a list of packages that no other package depends on

PackageCount=0
PackageIter=0

# Populate package array
declare -A Packages
PackageList=$(cygcheck.exe -c | cut -d' ' -f1 | tail -n +3)
for P in $PackageList; do
    Packages[${P,,}]=0
    ((PackageCount++))
done

# Determine the last mirror used
LastMirror=$(sed -n '/last-mirror/{n;p}' /etc/setup/setup.rc | tr -d '\t')
echo "[DEBUG] LastMirror = $LastMirror"

# Download the setup.ini file from the mirror server
echo "[DEBUG] Downloading setup.ini from mirror"
if which bzcat &>/dev/null; then
    wget --quiet "${LastMirror}$(uname -m)/setup.bz2" -O - | bzcat > setup.ini
else
    wget --quiet "${LastMirror}$(uname -m)/setup.ini" -O setup.ini
fi

for P in $PackageList; do
    ((PackageIter++))
    echo -ne "[DEBUG] Processing packages $((PackageIter * 100 / PackageCount))%\r"

    deps=$(sed -n "/^@ $P$/,/^requires/p" setup.ini | grep -i '^requires' | cut -d' ' -f2-)

    for dep in $deps; do
        if [[ ${Packages[${dep,,}]} ]]; then
            Packages[${dep,,}]=$((Packages[${dep,,}]+1))
        fi
    done
done

echo -e "\n== Packages =="

for P in $PackageList; do
    if [[ ${Packages[${P,,}]} == 0 ]]; then
        echo $P
    fi
done

rm setup.ini

Chciałbym zobaczyć, czy ktoś ma lepsze rozwiązanie lub jakieś wskazówki dotyczące ulepszenia mojego skryptu.

Josh
źródło
Nie wiem, czy nadal jesteś na stronie, ale edytowałem twój skrypt, aby naprawić N=$N+1błąd - w bashu spowoduje to utworzenie ciągu zamiast matematyki. Otaczanie instrukcji (( ))pozwala na wykonanie prawdziwej matematyki w bash (jak musieliście odkryć w dalszej części skryptu). Nie zmieniłem też tej części, ale nie trzeba przechowywać liczby elementów w tablicy. Zamiast tego $PackageCountmożesz uzyskać dostęp, ${#PackageList}aby uzyskać bezpośrednio liczbę elementów.
piojo,