update-desktop-files/suse_update_desktop_file.sh

361 lines
9.9 KiB
Bash
Raw Normal View History

# macro: suse_update_desktop_file
#
# Used to add easily a category to .desktop files according to XDG
# standard.
#
. /usr/lib/rpm/map-desktop-category.sh
#
# parse arguments
#
INSTALL=no
I18N=yes
CREATE=no
RESET=no
UNIMPORTANT=no
NAME=no
COMMENT=no
GNAME=no
while [ "${1:0:1}" = "-" ]; do
case ${1} in
-u|--unimportant)
UNIMPORTANT=yes
shift
continue;;
-n|--no-i18n)
I18N=no
shift
continue;;
-i|--install)
INSTALL=yes
shift
continue;;
-r|--reset)
RESET=yes
shift
continue;;
-d|--docid)
shift
DOCID="${1}"
shift
continue;;
-D|--docpath)
shift
DOCPATH="${1}"
if ! [ -r "$RPM_BUILD_ROOT/opt/kde3/share/doc/HTML/en/$DOCPATH/index.docbook" -o -r $RPM_BUILD_ROOT/usr/share/gnome/help/$DOCPATH/C/$DOCPATH.xml -o -r $RPM_BUILD_ROOT/usr/share/gnome/help/${DOCPATH/\///C/} ] ; then
echo WARNING: suse_update_desktop_file: DocPath target $DOCPATH for $FILE does not exist
fi
shift
continue;;
-c|--create)
CREATE=yes
INSTALL=yes
shift
continue;;
-C|--comment)
shift
COMMENT="${1}"
shift
continue;;
-N|--name)
shift
NAME="${1}"
shift
continue;;
-G|--genericname)
shift
GNAME="${1}"
shift
continue;;
*)
echo "UNKNOWN OPTION: $1"
exit 1 ;;
esac
done
APPLICATION="$1"
shift
if [ "$CREATE" = "yes" ]; then
NAME="$1"
shift
GNAME="$1"
shift
EXEC="$1"
shift
ICON="$1"
shift
if [ -z "$NAME" -o -z "$EXEC" ]; then
echo ERROR: after --create you should define
echo DESKTOP_FILE_NAME NAME GENERICNAME EXECUTABLE \[ ICON CATEGORIES... \]
exit 1
fi
mkdir -p $RPM_BUILD_ROOT/usr/share/applications/
cat > $RPM_SOURCE_DIR/$APPLICATION.desktop << EOF
[Desktop Entry]
Name=$NAME
GenericName=$GNAME
Type=Application
Exec=$EXEC
Icon=$ICON
EOF
NAME=no
GNAME=no
fi
if [ "$INSTALL" = "yes" ]; then
mkdir -p $RPM_BUILD_ROOT/usr/share/applications/
FILE=`find $RPM_SOURCE_DIR $RPM_BUILD_DIR /usr/share/update-desktop-files/templates . -name $APPLICATION.desktop| sort -r | head -n 1`
if [ -s "$FILE" ]; then
cp "$FILE" $RPM_BUILD_ROOT/usr/share/applications/
icon_file=`sed -n '/^\[Desktop Entry\]/,/(\[.*|$)/ s,Icon=\(.*\),\1,p' "$FILE"`
icon_file=`find $RPM_SOURCE_DIR /usr/share/update-desktop-files/kappfinder-icons -maxdepth 1 -name ${icon_file}.png -o -name ${icon_file}.xpm -o -name $icon_file | sort -r | head -n 1`
if [ -s "$icon_file" ]; then
mkdir -p $RPM_BUILD_ROOT/usr/share/pixmaps/
cp "$icon_file" $RPM_BUILD_ROOT/usr/share/pixmaps/
fi
fi
fi
while [ "$1" ]; do
CATEGORIES="$CATEGORIES;$1"
shift
done
CATEGORIES="${CATEGORIES#;}"
if [ -z "$APPLICATION" ]; then
echo ERROR: suse_update_desktop_file: no application argument given
echo Example: use "qbrew" to edit qbrew.desktop
exit 1
fi
#
# find file
#
for i in /$RPM_BUILD_ROOT/opt/kde3/share/applications/kde/ /$RPM_BUILD_ROOT/opt/kde3/share/applnk /$RPM_BUILD_ROOT/usr/share/applications/ /$RPM_BUILD_ROOT/usr/share/gnome/apps/ ; do
[ -e "$i" ] && DIRS="$DIRS $i"
done
if [ "${APPLICATION:0:1}" == "/" -a -e "$APPLICATION" ]; then
FILE_="$APPLICATION"
else
FILE_=`find $DIRS -name $APPLICATION.desktop`
fi
if [ -z "$FILE_" ]; then
echo ERROR: suse_update_desktop_file: unable to find $APPLICATION
exit 1
fi
FILE=""
for i in $FILE_; do
#
# fix old files
#
sed -e 's/\[KDE Desktop Entry\]/[Desktop Entry]/' "$i" > "${i}_" && mv "${i}_" "$i"
if [ "$FILE" ]; then
echo ERROR: suse_update_desktop_file: $APPLICATION has multiple desktop files
exit 1
fi
FILE=$i
done
#
# move KDE legacy files to XDG path
#
if echo $FILE | grep -q /opt/kde3/share/applnk/ ; then
if ! echo $FILE | grep -q /opt/kde3/share/applnk/.hidden/ ; then
if ! echo $FILE | grep -q /opt/kde3/share/applnk/Settings/ ; then
if ! echo $FILE | grep -q /opt/kde3/share/applnk/System/ScreenSavers/ ; then
echo WARNING: file is in old KDE legacy path, moving it to XDG path
mkdir -p $RPM_BUILD_ROOT/opt/kde3/share/applications/kde/
mv "$FILE" $RPM_BUILD_ROOT/opt/kde3/share/applications/kde/
FILE="$RPM_BUILD_ROOT/opt/kde3/share/applications/kde/${FILE##*/}"
fi
fi
fi
fi
#
# validate file
#
if [ ! -r "$FILE" ]; then
echo ERROR: suse_update_desktop_file: unable to read $FILE
exit 1
fi
# esp. for susehelp
FILE_DOCPATH=`sed -n -e '/^\[Desktop Entry\]/,/(\[.*|$)/ s,;, ,g' -e 's,^DocPath=\\(.*\\),\\1,p' ${FILE}`
if [ -n "$FILE_DOCPATH" ] ; then
if [ ! -r "$RPM_BUILD_ROOT/opt/kde3/share/doc/HTML/en/$FILE_DOCPATH/index.docbook" ] && [ ! -r "$RPM_BUILD_ROOT/usr/share/gnome/help/$FILE_DOCPATH/C/$FILE_DOCPATH.xml" ] && [ ! -r $RPM_BUILD_ROOT/usr/share/gnome/help/${DOCPATH/\///C/} ] ; then
echo WARNING: suse_update_desktop_file: DocPath target $FILE_DOCPATH for $FILE does not exist
fi
fi
#
# update Categories
#
if [ "$RESET" = "no" ]; then
CATIN=`sed -n -e '/^\[Desktop Entry\]/,/(\[.*|$)/ s,;, ,g' -e 's,^Categories=\\(.*\\),\\1,p' ${FILE}`
fi
CATIN="$CATIN ${CATEGORIES//;/ }"
if [ -z "$CATIN" ]; then
case "${FILE%/*}" in
*/opt/kde3/*) CATIN="Qt KDE" ;;
*/usr/share/gnome*) CATIN="GTK" ;;
esac
fi
unset CAT
unset DCAT
for i in $CATIN; do
ret=""
mapCategory $i
if [ -z "$ret" ]; then
echo WARNING: Category \"$i\" is unknown \!
echo WARNING: it is ignored, until you registered a Category at adrian@suse.de .
else
echo "$CAT" | grep -q "[=;]$i;" || CAT="$CAT$ret;"
fi
done
echo "" >> "${FILE}"
CAT="${CAT#;}"
if grep -q ^Categories= $FILE; then
sed -e '/^\[Desktop Entry\]/,/(\[.*|$)/ s,^Categories=.*,Categories='${CAT}',' "$FILE" > "${FILE}.new" &&
mv "${FILE}.new" "${FILE}"
else
if [ -n "${CAT%;}" ]; then
sed -e '/^\[Desktop Entry\]/a \
'"Categories=${CAT%;};" $FILE > ${FILE}_ && mv ${FILE}_ $FILE
fi
fi
if [ "$UNIMPORTANT" = "yes" ]; then
sed -e '/^\[Desktop Entry\]/a \
X-SuSE-Unimportant=true' $FILE > ${FILE}_ && mv ${FILE}_ $FILE
fi
if [ "$DOCID" ]; then
sed -e '/^\[Desktop Entry\]/a \
'"X-SuSE-DocTeamID=$DOCID" $FILE > ${FILE}_ && mv ${FILE}_ $FILE
fi
#
# check or set DocPath
#
DOCPATH_IS_GUESS=false
if [ -z "$DOCPATH" ] ; then
if [ -f $RPM_BUILD_ROOT/usr/share/gnome/help/$APPLICATION/C/$APPLICATION.xml ] ; then
DOCPATH=$APPLICATION
DOCPATH_IS_GUESS=true
fi
if [ -f $RPM_BUILD_ROOT/opt/kde3/share/doc/HTML/en/$APPLICATION/index.docbook ] ; then
DOCPATH=$APPLICATION
DOCPATH_IS_GUESS=true
fi
# NOTE: Here we can add guess for application/file.xml
fi
if [ -n "$DOCPATH" ] ; then
if [ -n "$FILE_DOCPATH" ] ; then
# DocPath already exists. Update it only from command line, not from guess.
if $DOCPATH_IS_GUESS ; then
if [ "$DOCPATH" != "$FILE_DOCPATH" ] ; then
echo WARNING: suse_update_desktop_file: DocPath target $FILE_DOCPATH differs from guess $DOCPATH for $FILE
fi
else
sed -e '/^\[Desktop Entry\]/,/(\[.*|$)/ s,^DocPath=.*,DocPath='${DOCPATH}',' "$FILE" > "${FILE}.new" &&
mv "${FILE}.new" "${FILE}"
fi
else
sed -e '/^\[Desktop Entry\]/a \
'"DocPath=${DOCPATH}" $FILE > ${FILE}.new && mv ${FILE}.new $FILE
if $DOCPATH_IS_GUESS ; then
echo NOTE: suse_update_desktop_file: Guessing DocPath=$DOCPATH in $FILE
fi
fi
fi
if [ "$I18N" = "yes" ]; then
if [ "$NAME" != "no" ]; then
grep -v '^Name\[' $FILE > ${FILE}_
if [ -n "$NAME" ]; then
if ! grep -q ^Name= ${FILE}_; then
sed -e '/^\[Desktop Entry\]/a '"Name=${NAME//,/\,}" ${FILE}_ > $FILE
else
sed -e '/^\[Desktop Entry\]/,/(\[.*|$)/ s,^Name=.*,Name='"${NAME//,/\,}"',' ${FILE}_ > $FILE
fi
else
grep -v "^Name=" ${FILE}_ > $FILE
fi
fi
if [ "$GNAME" != "no" ]; then
grep -v '^GenericName\[' $FILE > ${FILE}_
if [ -n "$GNAME" ]; then
if ! grep -q ^GenericName= ${FILE}_; then
sed -e '/^\[Desktop Entry\]/a '"GenericName=${GNAME//,/\,}" ${FILE}_ > $FILE
else
sed -e '/^\[Desktop Entry\]/,/(\[.*|$)/ s,^GenericName=.*,GenericName='"${GNAME//,/\,}"',' ${FILE}_ > $FILE
fi
else
grep -v "^GenericName=" ${FILE}_ > $FILE
fi
fi
if [ "$COMMENT" != "no" ]; then
grep -v '^Comment\[' $FILE > ${FILE}_
if [ -n "$COMMENT" ]; then
if ! grep -q ^Comment= ${FILE}_; then
sed -e '/^\[Desktop Entry\]/a '"Comment=${COMMENT//,/\,}" ${FILE}_ > $FILE
else
sed -e '/^\[Desktop Entry\]/,/(\[.*|$)/ s,^Comment=.*,Comment='"${COMMENT//,/\,}"',' ${FILE}_ > $FILE
fi
else
grep -v "^Comment=" ${FILE}_ > $FILE
fi
fi
if ! iconv -f utf-8 -t utf-8 $FILE &> /dev/null ; then
echo "ERROR: $FILE is not an UTF-8 file"
exit 1
fi
#
# Merge translations
#
for L in /usr/share/update-desktop-files/locale/translations_*; do
perl /usr/share/update-desktop-files/translate.pl $L $FILE > ${FILE}_ && mv ${FILE}_ $FILE || exit 1
done
else
#
# this file will not get translated
#
sed -e '/^\[Desktop Entry\]/a \
X-SuSE-translate=false' $FILE > ${FILE}_ && mv ${FILE}_ $FILE
fi
#
# CheckHardware checking
#
_EXEC="`sed -n -e '/^\[Desktop Entry\]/,/(\[.*|$)/ s,^Exec=\(.*\),\1,p' $FILE`"
EXEC="${_EXEC#CheckHardware }"
EXEC="${EXEC#--sound }"
EXEC="${EXEC#--3D }"
EXEC="${EXEC#--sound }"
_3D=""
_SOUND=""
grep -q "^X-SuSE-needs-3D$" "$FILE" && _3D="--3D"
grep -q "^X-SuSE-needs-Sound$" "$FILE" && _SOUND="--sound"
grep -q "^$RPM_PACKAGE_NAME$" /usr/share/update-desktop-files/packages-sound \
&& _SOUND="--sound"
grep -q "^$RPM_PACKAGE_NAME$" /usr/share/update-desktop-files/packages-3D \
&& _3D="--3D"
CHK=""
if [ "$_3D" ]; then
CHK="CheckHardware"
EXEC="$_3D $EXEC"
fi
if [ "$_SOUND" ]; then
CHK="CheckHardware"
EXEC="$_SOUND $EXEC"
fi
if [ "$EXEC" != "$_EXEC" ]; then
sed -e "s,^Exec=.*,Exec=${CHK} ${EXEC}," "$FILE" > "${FILE}.new" &&
mv "${FILE}.new" "${FILE}"
fi
/usr/bin/desktop-file-validate "${FILE}" || true