# epo: Portage dopen

## Earthwings

[DISCLAIMER]

 Dieser Beitrag enthält ein unzureichend getestetes Skript. Benutzung auf eigene Gefahr. 

Das Skript habe ich bisher nur unter Portage-2.0.51 getestet. Falls es wider Erwarten auch mit 2.0.50 funktioniert, bitte hier posten. Alle weiteren Kommentare, Flames etc. ebenfalls hier rein.

[/DISCLAIMER]

 *Quote:*   

> !!! All ebuilds that could satisfy "=xorg-x11-6.7.99.902" have been masked

 

Manchmal wünscht man sich das alte "ACCEPT_KEYWORDS=~arch emerge <pkg>" zurück, da es auf die Dauer lästig ist, von Hand die Einträge in package.* vorzunehmen. Abhilfe schafft ein kleines Script, das den letzten emerge Befehl analysiert und alle notwendigen Einträge in package.* macht. Das ganze sieht dann so aus:

 *Quote:*   

> 
> 
> $ emerge =xorg-x11-6.7.99.902
> 
> Calculating dependencies
> ...

 

Zur Installation des Skripts genügt folgendes:

```

wget -P /sbin http://www.stud.uni-karlsruhe.de/~uxhz/gentoo/misc/epo

chmod +x /sbin/epo

```

Sobald beim emergen die "!!! All ebuilds that could satisfy ... have been masked" Fehlermeldung kommt, einfach "epo" starten.

Das funktioniert allerdings nicht mit "--pretend" (-p), da dieser Befehl nicht in emerge.log landet. Der Vollständigkeit halber hier das Skript:

```

#!/bin/bash

 ###########################################################################

 #   Copyright (C) 2004 by Dennis Nienhüser                                #

 #   fragfred@gmx.de                                                       #

 #   http://www.stud.uni-karlsruhe.de/~uxhz/gentoo/misc/epo                #

 #                                                                         #

 #   This program is free software; you can redistribute it and/or modify  #

 #   it under the terms of the GNU General Public License as published by  #

 #   the Free Software Foundation; either version 2 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 General Public License for more details.                          #

 #                                                                         #

 #   You should have received a copy of the GNU General Public License     #

 #   along with this program; if not, write to the                         #

 #   Free Software Foundation, Inc.,                                       #

 #   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             #

 ###########################################################################

source /sbin/functions.sh

PNAME="epo"

PVERSION="0.1"

PORTLOGFILE="/var/log/emerge.log"

function askUser() {

    if [[ "$1" == "--yes" ]]

    then

        answer="Yes"

    else

        answer=""

    fi

    while [[ "${answer}" != "Yes" && "${answer}" != "No" ]]

    do

        read -p "Please type \"Yes\" or \"No\" " answer

    done

    echo ${answer}

}

function getLastEmergeCommand() {

    tail -n 100 ${PORTLOGFILE} | grep "Started emerge on" -A 1 | tail -n 1 | cut -f 4 -d "[color=green]*[/color]"

}

mkdir -p /etc/portage

unmask="nothing"

while [ -n "${unmask}${keywords}" ]

do

    echo

    last="$(getLastEmergeCommand $@) --pretend 2>&1"

    ebegin "Starting emerge in the background. Please wait a while"

    echo "\$${last/--ask/}"

    out="$(${last/--ask/})"

    eend

    einfo "Looking for packages to add to package.{unmask,keywords}"

    # Sorting the output attempts to unmask/keyword the ebuild with the lowest version number

    # that satisfies the dependency. foo-1.8 and foo-1.12 will be sorted 'wrong' though, resulting

    # in foo-1.12 being unmasked/keyworded.

    unmask="$(echo "$out" | grep "masked by: package.mask" | cut -d " " -f 2 | sort | head -n 1)"

    keywords="$(echo "$out" | egrep "masked by: ~.[color=green]*[/color] keyword" | cut -d " " -f 2,5 | sort | head -n 1)"

    if [ -z "${keywords}" ]

    then

        keywords="$(echo "$out" | egrep "masked by: .[color=green]*[/color] keyword" | cut -d " " -f 2,6 | sort | head -n 1)"

    fi

    if [ -n "${unmask}" ]

    then

        echo

        einfo "=${unmask}"

        einfo "will be added to /etc/portage/package.unmask"

    fi

    if [ -n "${keywords}" ]

    then

        echo

        einfo "=${keywords}"

        einfo "will be added to /etc/portage/package.keywords"

    fi

    if [ -n "${unmask}${keywords}" ]

    then

        echo

        einfo "Do you want me to apply these changes?"

        answer="$(askUser $1)"

        if [[ ${answer} == "Yes" ]]

        then

            if [ -n "${unmask}" ]

            then

                echo >> /etc/portage/package.unmask

                echo "# ${PNAME}-${PVERSION} added the next entry" >> /etc/portage/package.unmask

                echo "# at $(date)" >> /etc/portage/package.unmask

                echo "=${unmask}" >> /etc/portage/package.unmask

            fi

            if [ -n "${keywords}" ]

            then

                echo >> /etc/portage/package.keywords

                echo "# ${PNAME}-${PVERSION} added the next entry" >> /etc/portage/package.keywords

                echo "# at $(date)" >> /etc/portage/package.keywords

                echo "=${keywords}" >> /etc/portage/package.keywords

            fi

        else

            echo "Exiting."

            exit 1

        fi

    fi

done

last="$(getLastEmergeCommand $@)"

echo

einfo "Nothing to do. The last emerge command was"

einfo "${last}"

einfo "Do you want me to re-run it?"

answer="$(askUser $1)"

if [[ "${answer}" == "Yes" ]]

then

    ${last}

else

    echo "Exiting."

    exit 2

fi

exit 0

```

----------

## Carlo

Wie kommst Du auf epo? Im olympischen Dopingrausch!?

----------

## Earthwings

 *Carlo wrote:*   

> Wie kommst Du auf epo? Im olympischen Dopingrausch!?

 

Ja, so in der Art... /etc/portage sollte drinstecken, und das Wortspiel konnte ich mir dann nicht verkneifen   :Cool: 

----------

## Phlogiston

wie siehts aus mit diesem Script? Hats jemand schon erfolgreich im Dauerbetrieb?

----------

## urias

ja, und bisher keine Probleme  :Smile: 

----------

## Phlogiston

ja hier läufts nun auch, wirklich praktisch. Schön wäre noch, wänn ein Y für Yes auch reichen würde  :Wink: 

Greets

Phlogiston

----------

## gentop

Ist echt ein super hilfreiches Skript! Danke   :Cool: 

//gentop

----------

## Finswimmer

Irgendwie habe ich das Prinzip noch nicht durchschaut...

Ich hab folgenden Update Befehl:

LINGUAS="de" emerge -u -D  --newuse world

Wenn ich den starte, kommt:

```

tobi-rechner filme # emerge --update --deep --newuse world

Calculating world dependencies -

!!! All ebuilds that could satisfy ">=x11-libs/cairo-0.9.2" have been masked.

!!! One of the following masked packages is required to complete your request:

- x11-libs/cairo-1.0.2 (masked by: ~x86 keyword)

For more information, see MASKED PACKAGES section in the emerge man page or

section 2.2 "Software Availability" in the Gentoo Handbook.

!!!    (dependency required by "x11-libs/gtk+-2.8.6" [ebuild])

!!! Problem with ebuild app-office/dia-0.94-r3

!!! Possibly a DEPEND/*DEPEND problem.

!!! Depgraph creation failed.

```

Soweit so gut.

Dann epo:

```
tobi-rechner filme # epo

 * Starting emerge in the background. Please wait a while ...

$ emerge --update --deep --newuse world --pretend 2>&1                                                                                                                      [ ok ]

 * Looking for packages to add to package.{unmask,keywords}

 * Nothing to do. The last emerge command was

 *  emerge --update --deep --newuse world

 * Do you want me to re-run it?

Please type "Yes" or "No" Yes

```

Und nun? Hm.....

Danke

----------

## Earthwings

In was für einem Terminal lässt du das laufen? Screen vielleicht?

----------

## Finswimmer

Nee. Normal im Terminal.

Ich glaube, er hat das Problem, dass in emerge.log kein Fehler abgespeichert wird...

Soll heißen: Er sagt nicht, dass dieses und jenes Programm masked ist.

Tobi

----------

## Earthwings

Die Fehlermeldung wird von der Ausgabe von emerge übernommen. Dort fängt er die Zeile - x11-libs/cairo-1.0.2 (masked by: ~x86 keyword) ab. Ist in der Ausgabe das ~x86 grün?

----------

## Finswimmer

 *Quote:*   

> !!! All ebuilds that could satisfy "=gcc-4.0.2-r1" have been masked.
> 
> !!! One of the following masked packages is required to complete your request:
> 
> - sys-devel/gcc-4.0.2-r1 (masked by: -* keyword)
> ...

 

!!! All ebuilds that could satisfy "=gcc-4.0.2-r1" have been masked. 

Das ist rot.

=gcc-4.0.2-r1 <-- Das ist grün.

Der Rest ist schwarz.

Auch masked by: -* keyword ist schwarz.

Danke

Tobi

----------

## Qubit

Hi Earthwings,

Erstmal Lob für dein Tool! Gerade bei xorg-7 ect. sehr hilfreich!

Allerdings greift dein Suchmuster wohl nicht bei z.B

```
emerge -pv e KEYWORD=-*
```

Etwa so könnte man die egrep-Zeile im epo-script bei Zeile 74 erweitern.

```

egrep "masked by: [-~].* keyword" | cut -d " " -f 2,5 | sort | head -n 1

```

Gruß Qubit.

----------

