Generating a list of packages installed and removed

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#!/bin/bash
# Generate a list of package installations
SH_FN="/r/dnf-history.sh"
[ -f $SH_FN ] && rm -f $SH_FN

# First, determine the total number of installs performed to date
echo -n "Determining number of history entries: "
DNF_COUNT="$(dnf history list 2>/dev/null | awk '/^ *[0-9]/{print $1; exit }')"
echo $DNF_COUNT

# Now go through the entries and extract the command lines
for N in $(seq $DNF_COUNT)
do
    echo -n "$N/$DNF_COUNT: "
    X="$(dnf history info $N 2>/dev/null | awk '
        /^Begin time/ { print "DNF_TIME=\""substr($0, 18) "\"" }
        /Command Line/{ 
            i = $4 == "-y" ? 21 : 18
            op = $4 == "-y" ? $5 : $4
            CMD_or_OP = (op=="install" || op=="remove") ? "CMD" : "OP"
            print "DNF_" CMD_or_OP "=\"" substr($0, i) "\""
            exit
        }
    ')"
    eval "$X"

    # Write an entry to stdout
    echo -n "$N/$DNF_COUNT ($DNF_TIME) "
    [ "$DNF_CMD" ] && echo $DNF_CMD || echo "$DNF_OP"

    # Write an entry to the shell file
    DNF_DATE="${DNF_TIME:4:6}"
    (
        #[ "$DNF_DATE" != "$PREV_DATE" ] && echo "#   (DNF_DATE=|$DNF_DATE| PREV_DATE=|$PREV_DATE|)"
        [ "$DNF_DATE" != "$PREV_DATE" ] && echo
        echo -n "# $N: $DNF_TIME"
        [ "$DNF_OP" ] && echo -n "   $DNF_OP"
        echo
        [ "$DNF_CMD" ] && echo "dnf $DNF_CMD"
    ) >>$SH_FN
    PREV_DATE="$DNF_DATE"
    unset DNF_CMD DNF_OP
done

echo "Wrote command history to $SH_FN"