diff options
Diffstat (limited to 'r14-xdg-update')
-rw-r--r-- | r14-xdg-update | 215 |
1 files changed, 215 insertions, 0 deletions
diff --git a/r14-xdg-update b/r14-xdg-update new file mode 100644 index 000000000..9c0929d60 --- /dev/null +++ b/r14-xdg-update @@ -0,0 +1,215 @@ +#!/bin/sh +# +# A script to perform R14.0.0 XDG compliance updates. +# This script should be needed to run only once. + +# TODO: Do we need to trap whether the user is running this script while +# in a Trinity session? Most files can be updated "live" but some can't, +# such as kdeglobals. + +# Allow forced execution of this script regardless of the kdeglobals setting. +if [ "$1" = "force" ]; then + FORCE="true" +fi + +# TODO: As the user should not be logged into a Trinity session when running +# this script, or an administrator might run this script remotely, the +# $TDEHOME variable probably is not set or knowable from within this script. +# We presume $HOME/.trinity, but should provide a way to pass a command line +# parameter to change that location. +PROFILE_DIR="$HOME/.trinity" + +# TODO: How to handle environments where files/directories are locked +# administratively and can't be updated. The nominal validation checks +# in this script provide some notice but no direct remedy. + +Wait_For_Response () { +unset response +# -r Backslash does not act as an escape character. +# -p Display "PROMPT" without a trailing newline, before attempting to read any input. +while true; do + read -r -p "$1 (y/n): " yn + case $yn in + [Yy]* ) response=y; break;; + [Nn]* ) response=n; break;; + * ) echo "Please answer yes (y/Y) or no (n/N).";; + esac +done +} + +Proceed_From_Response () { +if [ "$response" = "n" -o "$response" = "N" ]; then + echo "Exiting." + echo + exit 0 +else + echo "Continuing." + echo +fi +} + +Display_Message () { +if [ "$DISPLAY" != "" ]; then + echo -e "$MESSAGE" | xmessage -center -file - > /dev/null 2>/dev/null +else + echo -e "$MESSAGE" +fi +} + +# Do not update when $TDEHOME is a sym link to another profile directory. Trinity should have +# full reign within its own profile directory (limited to administrative locking), but the error +# check is a conservative approach. +TDEHOME_LINK="`readlink \"$PROFILE_DIR\"`" +if [ "$TDEHOME_LINK" != "" ]; then + # Force this entry to ensure the updates eventually are performed should the user copy the + # original kdeglobals file into a new Trinity profile. + $TDEDIR/bin/kwriteconfig --file kdeglobals --group "R14 XDG Updates" --key Updated --type bool 'false' + # Are we in X? Display an X dialog explaining breakage. + if [ "$DISPLAY" != "" ]; then + echo "[r14-xdg-update] Warning! The profile directory $PROFILE_DIR is a" 1>&2 + echo "[r14-xdg-update] sym link to $TDEHOME_LINK!" 1>&2 + echo "[r14-xdg-update] R14 updates will not be performed because Trinity needs its own separate profile directory." 1>&2 + echo "[r14-xdg-update] Without R14 updates some Trinity apps will fail to function correctly." 1>&2 + fi + MESSAGE="Oops! The profile directory $PROFILE_DIR is a sym link to $TDEHOME_LINK.\n\nTrinity R14 XDG compliance updates will not be performed because\nTrinity needs its own separate profile directory.\n\nWithout R14 XDG compliance updates, some Trinity apps will fail to\nfunction properly.\n\nFailures include the following:\n\n* Many left-side icon lists will not populate,\n such as the Panel and Konqueror configuration dialogs.\n\n* User-defined keyboard shortcuts fail (khotkeysrc).\n System defined shortcuts remain functional.\n\n* User-defined app preferences fail (profilerc).\n\n* Konqueror navigation/sidebar panel won't open.\n\n* User-defined konqueror service menus, kicker customization,\n konqueror sidebar, Recent Documents list fail.\n\nPossible remedies:\n\n* If necessary contact your system administrator.\n\n* Break the sym link to allow Trinity to create a fresh Trinity profile.\n\n* Use the migratekde3 script to migrate a KDE3 profile to Trinity." + # Are we in X? Display an X dialog explaining breakage. + if [ "$DISPLAY" != "" ]; then + echo -e "$MESSAGE" | xmessage -center -file - -buttons Continue,Quit > /dev/null 2>/dev/null + if [ "$?" = "102" ]; then + # User select the Quit button: quit this script. + unset PROFILE_DIR + unset TDEHOME_LINK + exit 1 + fi + else + echo + echo -e "$MESSAGE" + echo + Wait_For_Response "Break the sym link now and migrate the $TDEHOME_LINK profile to a new Trinity profile?" + Proceed_From_Response + unlink "$HOME/.trinity" 2>/dev/null + if [ "`readlink \"$HOME/.trinity\"`" != "" ]; then + echo "Unable to break the sym link. Check your file and directory privileges. Quitting." + unset PROFILE_DIR + unset TDEHOME_LINK + exit 1 + else + sh $TDEDIR/bin/migratekde3 + echo + fi + fi +fi +R14_UPDATED="`$TDEDIR/bin/kreadconfig --file kdeglobals --group "R14 XDG Updates" --key Updated`" +if [ "$R14_UPDATED" != "true" ] || [ "$FORCE" = "true" ]; then + if [ "$DISPLAY" != "" ]; then + echo -n "[r14-xdg-update] " + fi + echo -e "Performing a profile update for Trinity release R14 XDG compliance." + if [ "$DISPLAY" != "" ]; then + echo -n "[r14-xdg-update] " + fi + echo -e "Updating *.desktop files." + find "$PROFILE_DIR" -name "*.desktop" -exec sed -i 's|X-KDE-|X-TDE-|g' {} \; 2>/dev/null + find "$PROFILE_DIR" -name "*.desktop" -exec sed -i 's|KDE\;|TDE\;|g' {} \; 2>/dev/null + if [ "$DISPLAY" != "" ]; then + echo -n "[r14-xdg-update] " + fi + echo -e "Updating references of $TDEDIR/share/applications/kde to share/applications/tde." + # Exclude KMail mail files --- we don't want to touch those files. + find "$PROFILE_DIR" -path "$PROFILE_DIR/share/apps/kmail/mail" -prune -o -type f -exec sed -i "s|$TDEDIR/share/applications/kde|$TDEDIR/share/applications/tde|g" {} \; 2>/dev/null + # Preserve keyboard shortcuts. + if [ "$DISPLAY" != "" ]; then + echo -n "[r14-xdg-update] " + fi + echo -e "Updating user-defined keyboard shortcuts in khotkeysrc." + sed -i -e 's|CommandURL=kde-|CommandURL=tde-|g' -e 's|K Menu - kde-|K Menu - tde-|g' "$PROFILE_DIR/share/config/khotkeysrc" 2>/dev/null + # Preserve app preferences. + if [ "$DISPLAY" != "" ]; then + echo -n "[r14-xdg-update] " + fi + echo -e "Updating user-defined app prefernces in profilerc." + sed -i -e 's|Application=kde-|Application=tde-|g' "$PROFILE_DIR/share/config/profilerc" 2>/dev/null + # Preserve kicker/panel icons. + if [ "$DISPLAY" != "" ]; then + echo -n "[r14-xdg-update] " + fi + echo -e "Updating kicker/panel customizations in kickerrc." + sed -i -e 's|StorageId\[\$e\]=kde-|StorageId\[\$e\]=tde-|g' "$PROFILE_DIR/share/config/kickerrc" 2>/dev/null + # Update sym link files in $HOME/.trinity/Autostart. + ( cd "$PROFILE_DIR/Autostart" + if [ "$DISPLAY" != "" ]; then + echo -n "[r14-xdg-update] " + fi + echo "Updating Autostart files." + for i in `find . -type l`; do + LINK="`readlink $i`" + LINK_PATH="`dirname $LINK`" + LINK_NAME="`basename $LINK`" + if [ -n "`echo $LINK_PATH | grep \"$TDEDIR/share/applications/kde\"`" ]; then + NEW_LINK_PATH="`echo $LINK_PATH | sed 's|/share/applications/kde|/share/applications/tde|'`" + fi + unlink $i + ln -sf $NEW_LINK_PATH/$LINK_NAME $LINK_NAME + if [ "$?" != "0" ]; then + if [ "$DISPLAY" != "" ]; then + echo -n "[r14-xdg-update] " + fi + echo "There was an error with creating a new sym link for $LINK." 1>&2 + fi + done + ) + # Perform some nominal update validations. + # This test includes *.desktop files in the profile Autostart directory. + R14_UPDATE_TEST1="`find \"$PROFILE_DIR\" -name \"*.desktop\" -exec grep \"X-KDE\" {} \; 2>/dev/null`" + if [ "$R14_UPDATE_TEST1" != "" ]; then + MESSAGE="Some Trinity profile R14 XDG compliance updates failed.\n\n(Check *.desktop files for 'X-KDE'.)" + Display_Message "$MESSAGE" + fi + R14_UPDATE_TEST2="`find \"$PROFILE_DIR\" -name \"*.desktop\" -exec grep -q \"KDE;\" {} \; 2>/dev/null`" + if [ "$R14_UPDATE_TEST2" != "" ]; then + MESSAGE="Some Trinity profile R14 XDG compliance updates failed.\n\n(Check *.desktop files for 'KDE;'.)" + Display_Message "$MESSAGE" + fi + R14_UPDATE_TEST3="`find \"$PROFILE_DIR\" \"$PROFILE_DIR/share/apps/kmail/mail\" -prune -o -type f -exec grep -q \"$TDEDIR/share/applications/kde\" {} \; 2>/dev/null`" + if [ "$R14_UPDATE_TEST3" != "" ]; then + MESSAGE="Some Trinity profile R14 XDG compliance updates failed.\n\n(Check files for '$TDEDIR/share/applications/kde'.)" + Display_Message "$MESSAGE" + fi + R14_UPDATE_TEST4="`grep -q \"CommandURL=kde-\" \"$PROFILE_DIR/share/config/khotkeysrc\" 2>/dev/null`" + if [ "$R14_UPDATE_TEST4" != "" ]; then + MESSAGE="Some Trinity profile R14 XDG compliance updates failed.\n\n(Check khotkeysrc for 'CommandURL=kde-'.)" + Display_Message "$MESSAGE" + fi + R14_UPDATE_TEST5="`grep -q \"K Menu - kde-\" \"$PROFILE_DIR/share/config/khotkeysrc\" 2>/dev/null`" + if [ "$R14_UPDATE_TEST5" != "" ]; then + MESSAGE="Some Trinity profile R14 XDG compliance updates failed.\n\n(Check khotkeysrc for 'K Menu - kde-'.)" + Display_Message "$MESSAGE" + fi + R14_UPDATE_TEST6="`grep -q \"Application=kde-\" \"$PROFILE_DIR/share/config/profilerc\" 2>/dev/null`" + if [ "$R14_UPDATE_TEST6" != "" ]; then + MESSAGE="Some Trinity profile R14 XDG compliance updates failed.\n\n(Check profilerc for 'Application=kde-'.)" + Display_Message "$MESSAGE" + fi + R14_UPDATE_TEST7="`grep -q \"StorageId\[\$e\]=kde-\" \"$PROFILE_DIR/share/config/kickerrc\" 2>/dev/null`" + if [ "$R14_UPDATE_TEST7" != "" ]; then + MESSAGE="Some Trinity profile R14 XDG compliance updates failed.\n\n(Check kickerrc for 'StorageId[$e]=kde-'.)" + Display_Message "$MESSAGE" + fi + if [ "$R14_UPDATE_TEST1" = "" ] && [ "$R14_UPDATE_TEST2" = "" ] && [ "$R14_UPDATE_TEST3" = "" ] \ + && [ "$R14_UPDATE_TEST4" = "" ] && [ "$R14_UPDATE_TEST5" = "" ] && [ "$R14_UPDATE_TEST6" = "" ] \ + && [ "$R14_UPDATE_TEST7" = "" ]; then + $TDEDIR/bin/kwriteconfig --file kdeglobals --group "R14 XDG Updates" --key Updated --type bool 'true' + else + $TDEDIR/bin/kwriteconfig --file kdeglobals --group "R14 XDG Updates" --key Updated --type bool 'false' + fi +fi +unset PROFILE_DIR +unset R14_UPDATED +unset TDEHOME_LINK +unset R14_UPDATE_TEST1 +unset R14_UPDATE_TEST2 +unset R14_UPDATE_TEST3 +unset R14_UPDATE_TEST4 +unset R14_UPDATE_TEST5 +unset R14_UPDATE_TEST6 +exit 0 |