5 # DESCRIPTION: resolve Isabelle components
10 PRG="$(basename "$0")"
15 echo "Usage: isabelle $PRG [OPTIONS] [COMPONENTS ...]"
18 echo " -I init user settings"
19 echo " -R URL component repository (default \$ISABELLE_COMPONENT_REPOSITORY)"
20 echo " -a resolve all missing components"
21 echo " -l list status"
23 echo " Resolve Isabelle components via download and installation."
24 echo " COMPONENTS are identified via base name."
26 echo " ISABELLE_COMPONENT_REPOSITORY=\"$ISABELLE_COMPONENT_REPOSITORY\""
38 ## process command line
43 COMPONENT_REPOSITORY="$ISABELLE_COMPONENT_REPOSITORY"
47 while getopts "IR:al" OPT
54 COMPONENT_REPOSITORY="$OPTARG"
68 shift $(($OPTIND - 1))
73 [ "$#" -eq 0 -a -z "$INIT_SETTINGS" -a -z "$ALL_MISSING" -a -z "$LIST_ONLY" ] && usage
75 if [ -z "$ALL_MISSING" ]; then
78 splitarray ":" "$ISABELLE_COMPONENTS_MISSING" "$@"
80 declare -a SELECTED_COMPONENTS=("${SPLITARRAY[@]}")
85 splitarray ":" "$ISABELLE_COMPONENTS"; declare -a AVAILABLE_COMPONENTS=("${SPLITARRAY[@]}")
86 splitarray ":" "$ISABELLE_COMPONENTS_MISSING"; declare -a MISSING_COMPONENTS=("${SPLITARRAY[@]}")
88 if [ -n "$INIT_SETTINGS" ]; then
89 SETTINGS="$ISABELLE_HOME_USER/etc/settings"
90 SETTINGS_CONTENT='init_components "$USER_HOME/.isabelle/contrib" "$ISABELLE_HOME/Admin/components/main"'
91 if [ -e "$SETTINGS" ]; then
92 echo "User settings file already exists!"
94 echo "Edit \"$SETTINGS\" manually"
95 echo "and add the following line near its start:"
97 echo " $SETTINGS_CONTENT"
100 echo "Initializing \"$SETTINGS\""
101 mkdir -p "$(dirname "$SETTINGS")"
102 echo "$SETTINGS_CONTENT" > "$SETTINGS"
104 elif [ -n "$LIST_ONLY" ]; then
106 echo "Available components:"
107 for NAME in "${AVAILABLE_COMPONENTS[@]}"; do echo " $NAME"; done
109 echo "Missing components:"
110 for NAME in "${MISSING_COMPONENTS[@]}"; do echo " $NAME"; done
112 for NAME in "${SELECTED_COMPONENTS[@]}"
114 BASE_NAME="$(basename "$NAME")"
116 for X in "${AVAILABLE_COMPONENTS[@]}" "${MISSING_COMPONENTS[@]}"
118 [ -z "$FULL_NAME" -a "$BASE_NAME" = "$(basename "$X")" ] && FULL_NAME="$X"
120 if [ -z "$FULL_NAME" ]; then
121 echo "Ignoring irrelevant component \"$NAME\""
122 elif [ -d "$FULL_NAME" ]; then
123 echo "Skipping existing component \"$FULL_NAME\""
125 if [ ! -e "${FULL_NAME}.tar.gz" ]; then
126 REMOTE="$COMPONENT_REPOSITORY/${BASE_NAME}.tar.gz"
127 echo "Getting \"$REMOTE\""
128 mkdir -p "$(dirname "$FULL_NAME")"
129 perl -MLWP::Simple -e "getprint '$REMOTE';" > "${FULL_NAME}.tar.gz"
130 if perl -e "exit((stat('${FULL_NAME}.tar.gz'))[7] == 0 ? 0 : 1);"
132 rm -f "${FULL_NAME}.tar.gz"
135 if [ -e "${FULL_NAME}.tar.gz" ]; then
136 echo "Unpacking \"${FULL_NAME}.tar.gz\""
137 tar -C "$(dirname "$FULL_NAME")" -x -f "${FULL_NAME}.tar.gz" || exit 2