345 lines
9.4 KiB
Bash
345 lines
9.4 KiB
Bash
#! /bin/sh
|
|
|
|
# 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]
|
|
Encoding=UTF-8
|
|
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 . -name $APPLICATION.desktop| sort -r | head -n 1`
|
|
if [ -s "$FILE" ]; then
|
|
cp -v "$FILE" $RPM_BUILD_ROOT/usr/share/applications/
|
|
icon_file=`sed -n '/^\[Desktop Entry\]/,/(\[.*|$)/ s,Icon=\(.*\),\1,p' "$FILE"`
|
|
icon_file=`find $RPM_SOURCE_DIR $RPM_BUILD_DIR -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 -v "$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"
|
|
|
|
# dos2unix for the poor
|
|
sed -e 's/
|
|
//' "$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 grep -q ^X-SuSE-translate= $FILE; then
|
|
echo "ERROR: $FILE contains X-SuSE-translate - called the macro twice?"
|
|
exit 1
|
|
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
|
|
#
|
|
cp $FILE ${FILE}.old
|
|
/usr/bin/suse-desktop-merge $FILE > ${FILE}_ || exit 1
|
|
perl /usr/share/update-desktop-files/untranslate.pl ${FILE}_ > ${FILE}.new
|
|
if ! cmp -s ${FILE}.old ${FILE}.new; then
|
|
echo "UNTRANSLATE DOES NOT WORK"
|
|
diff -u ${FILE}.old ${FILE}.new
|
|
exit 1
|
|
fi
|
|
mv ${FILE}_ $FILE
|
|
rm -f ${FILE}.old ${FILE}.new
|
|
else
|
|
#
|
|
# this file will not get translated
|
|
#
|
|
sed -e '/^\[Desktop Entry\]/a \
|
|
X-SuSE-translate=false' $FILE > ${FILE}_ && mv ${FILE}_ $FILE
|
|
fi
|