summaryrefslogtreecommitdiff
path: root/aptitude-run-state-bundle
blob: 0beddfd82a4a0abb11f1333991a8fbef84482b6e (plain)
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
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
#!/bin/bash

NO_CLEAN=0
STATEDIR=0
UNPACK_ONLY=0
HELP=0
APPEND=1

DONE=0
while [ $DONE = 0 ]
do
  case "$1" in
      --append-args )
	  APPEND=1
	  shift
	  ;;
      --help )
	  HELP=1
	  shift
	  ;;
      --no-clean )
	  NO_CLEAN=1
	  shift
	  ;;
      --prepend-args )
	  APPEND=0
	  shift
	  ;;
      --really-clean )
	  NO_CLEAN=0
	  shift
	  ;;
      --statedir )
	  STATEDIR=1
	  NO_CLEAN=1
	  shift
	  ;;
      --unpack )
	  UNPACK_ONLY=1
	  shift
	  ;;
      * )
	  DONE=1
	  ;;
  esac
done

if ( [ $UNPACK_ONLY = 0 ] && [ "$#" -lt 1 ] ) ||
   ( [ $UNPACK_ONLY = 1 ] && [ "$#" -ne 1 ] ) ||
   [ $HELP = 1 ]
then
    echo "Usage: $0 [options] <input-file> [<program> [arguments ...]]"
    echo
    echo "This command will unpack the given archive of aptitude state"
    echo "information, then invoke the given program with the given"
    echo "list of arguments, passing appropriate -o options to cause"
    echo "aptitude to use the contents of that archive as its global"
    echo "data store."
    echo
    echo "Options:"
    echo "  --append-args    Place the generated arguments at the end of"
    echo "                   the command line (default)."
    echo "  --help           Display this message and exit."
    echo "  --no-clean       Do not remove the temporary directory after"
    echo "                   invoking aptitude."
    echo "  --prepend-args   Place the generated arguments at the beginning"
    echo "                   of the command line."
    echo "  --really-clean   Remove the state directory, even if --statedir"
    echo "                   was passed as an argument."
    echo "  --statedir       The <input-file> is an unpacked aptitude bundle,"
    echo "                   not a bundle file; implicitly sets --no-clean."
    echo "  --unpack         Just unpack the <input-file>, don't run aptitude."
    exit 1
fi

INPUTFILE="$1"
shift

if [ "$#" -lt 1 ]
then
    PROGRAM=aptitude
else
    PROGRAM="$1"
    shift
fi

if [ $STATEDIR = 0 ]
then
    tempdir=$(mktemp -p ${TMPDIR:-/tmp} -d aptitudebug.XXXXXXXXX) || exit 1
    if [ -z "$tempdir" ]
	then
	exit 1
    fi
else
    tempdir=$INPUTFILE
fi

trap '
if [ $NO_CLEAN = 1 ]
then echo "Leaving final state in $tempdir"
else echo "Removing $tempdir"; rm -fr $tempdir
fi' 0

if [ $STATEDIR = 0 ]
then
    if [ -d "$INPUTFILE" ]
    then
	echo "Can't use $INPUTFILE as the input bundle: it's a directory."
	exit 1
    fi
    if ! [ -f "$INPUTFILE" ]
    then
	echo "Can't use $INPUTFILE as the input bundle: file not found."
	exit 1
    fi

    if file "$INPUTFILE" | grep bzip2 2>/dev/null > /dev/null
    then
	DECOMPRESSOR=bunzip2
    else
	DECOMPRESSOR=gunzip
    fi

    ($DECOMPRESSOR -c < "$INPUTFILE") | (cd "$tempdir" && tar x) || exit 1
fi

if [ $UNPACK_ONLY = 1 ]
then
    exit 0
fi

if [ "$APPEND" = 1 ]
then
    "$PROGRAM" "$@" -o "Dir=$tempdir" -o "Dir::State::status=$tempdir/var/lib/dpkg/status"
else

    "$PROGRAM" -o "Dir=$tempdir" -o "Dir::State::status=$tempdir/var/lib/dpkg/status" "$@"
fi