kicad/qa/resources/linux/verifyMetadataFiles.sh

304 lines
14 KiB
Bash
Raw Normal View History

#!/bin/bash
# WARNING: This script will modify file associations and MIME types on the system it
# runs on. Use at your own risk!
# The root of the code directory is the first argument
KICAD_CODE_DIR=$1
# The root of the build directory is the second argument
KICAD_BUILD_DIR=$2
KICAD_LAUNCHER_DIR=$KICAD_BUILD_DIR/resources/linux/launchers
KICAD_METAINFO_DIR=$KICAD_BUILD_DIR/resources/linux/metainfo
KICAD_MIME_DIR=$KICAD_BUILD_DIR/resources/linux/mime
KICAD_ICON_DIR=$KICAD_CODE_DIR/resources/linux/icons/hicolor
KICAD_MIME_TEST_FILES=$KICAD_CODE_DIR/qa/resources/linux/mimeFiles
###################################################################
# Verify the metainfo file
# There are two different checkers we can use, and each distro prefers
# different ones - so lets just test using them both and make them both
# happy.
###################################################################
METAINFO_VALID=1
echo "Validating metainfo files"
# Test using appstreamcli to see its errors
appstreamcli validate --explain --pedantic $KICAD_METAINFO_DIR/org.kicad.kicad.metainfo.xml
[ $? -ne 0 ] && METAINFO_VALID=0
# Test using the appstream-util package to see its errors
appstream-util validate-strict $KICAD_METAINFO_DIR/org.kicad.kicad.metainfo.xml
[ $? -ne 0 ] && METAINFO_VALID=0
if [ $METAINFO_VALID -eq 1 ]
then
echo "Metainfo files passed both checkers successfully"
fi
###################################################################
# Verify the launcher files
###################################################################
LAUNCHERS_VALID=1
echo ""
echo "Validating desktop launcher files"
# Bitmap2component
desktop-file-validate $KICAD_LAUNCHER_DIR/org.kicad.bitmap2component.desktop
[ $? -ne 0 ] && LAUNCHERS_VALID=0
# Eeschema standalone
desktop-file-validate $KICAD_LAUNCHER_DIR/org.kicad.eeschema.desktop
[ $? -ne 0 ] && LAUNCHERS_VALID=0
# GerbView
desktop-file-validate $KICAD_LAUNCHER_DIR/org.kicad.gerbview.desktop
[ $? -ne 0 ] && LAUNCHERS_VALID=0
# Main KiCad application
desktop-file-validate $KICAD_LAUNCHER_DIR/org.kicad.kicad.desktop
[ $? -ne 0 ] && LAUNCHERS_VALID=0
# PCB calculator
desktop-file-validate $KICAD_LAUNCHER_DIR/org.kicad.pcbcalculator.desktop
[ $? -ne 0 ] && LAUNCHERS_VALID=0
# Pcbnew standalond
desktop-file-validate $KICAD_LAUNCHER_DIR/org.kicad.pcbnew.desktop
[ $? -ne 0 ] && LAUNCHERS_VALID=0
if [ $LAUNCHERS_VALID -eq 1 ]
then
echo "All launcher files valid"
else
echo "Errors with launcher files"
fi
###################################################################
# Install the desktop and MIME-type files and update the databases
###################################################################
GERBER_MIME_INSTALLED=0
KICAD_MIME_INSTALLED=0
echo ""
echo "Installing MIME type files for testing"
mkdir -p ~/.local/share/mime
xdg-mime install --mode user $KICAD_MIME_DIR/kicad-gerbers.xml
[ $? -eq 0 ] && GERBER_MIME_INSTALLED=1
xdg-icon-resource install --mode user --context mimetypes --size 128 $KICAD_ICON_DIR/128x128/mimetypes/application-x-kicad-pcb.png
xdg-icon-resource install --mode user --context mimetypes --size 128 $KICAD_ICON_DIR/128x128/mimetypes/application-x-kicad-project.png
xdg-icon-resource install --mode user --context mimetypes --size 128 $KICAD_ICON_DIR/128x128/mimetypes/application-x-kicad-schematic.png
xdg-mime install --mode user $KICAD_MIME_DIR/kicad-kicad.xml
[ $? -eq 0 ] && KICAD_MIME_INSTALLED=1
# Install the desktop files
echo ""
echo "Installing desktop files for testing"
# Ensure the directory exists (it might not in the CI image)
mkdir -p ~/.local/share/applications
# For some reason, desktop-file-install doesn't seem to actually install it properly, so just copy them
cp $KICAD_LAUNCHER_DIR/org.kicad.bitmap2component.desktop ~/.local/share/applications/
cp $KICAD_LAUNCHER_DIR/org.kicad.eeschema.desktop ~/.local/share/applications/
cp $KICAD_LAUNCHER_DIR/org.kicad.gerbview.desktop ~/.local/share/applications/
cp $KICAD_LAUNCHER_DIR/org.kicad.kicad.desktop ~/.local/share/applications/
cp $KICAD_LAUNCHER_DIR/org.kicad.pcbcalculator.desktop ~/.local/share/applications/
cp $KICAD_LAUNCHER_DIR/org.kicad.pcbnew.desktop ~/.local/share/applications/
# Force a database update to get the desktop files and MIME types associated
update-desktop-database ~/.local/share/applications/
update-mime-database ~/.local/share/mime/
###################################################################
# Validate the MIME types
###################################################################
KICAD_MIME_VALID=1
GERBER_MIME_VALID=1
# Fake a Gnome desktop environment to force xdg-mime to query using gio and ensure the MIME types are installed
# for a desktop environment. Otherwise it fallsback to using the "file --mime-type" command, which has prebuilt
# magic files from https://github.com/file/file/blob/master/magic/Magdir/kicad and isn't affected by the MIME
# type files we just installed.
export DE=gnome
# Test install the gerber MIME file to test with it
echo ""
if [ $GERBER_MIME_INSTALLED -eq 1 ]
then
echo "Validating Gerber MIME-type"
# Test the drl extension default
OUT_STR=$(xdg-mime query default application/x-excellon 2>&1)
printf " Testing drill file default application: %s\n" "$OUT_STR"
[[ "$OUT_STR" != "org.kicad.gerbview.desktop" ]] && echo " ERROR" && GERBER_MIME_VALID=0
# Test the gerber extension default
OUT_STR=$(xdg-mime query default application/x-gerber 2>&1)
printf " Testing gerber file default application: %s\n" "$OUT_STR"
[[ "$OUT_STR" != "org.kicad.gerbview.desktop" ]] && echo " ERROR" && GERBER_MIME_VALID=0
# Test the drl extension
OUT_STR=$(xdg-mime query filetype $KICAD_MIME_TEST_FILES/gerbers/drillFiles/drillFile.drl 2>&1)
printf " Testing drill file with extension drl: %s\n" "$OUT_STR"
[[ "$OUT_STR" != "application/x-excellon" ]] && echo " ERROR" && GERBER_MIME_VALID=0
# Test the parsing of the header for M48
OUT_STR=$(xdg-mime query filetype $KICAD_MIME_TEST_FILES/gerbers/drillFiles/drillFileNoExt 2>&1)
printf " Testing drill file header M48 check: %s\n" "$OUT_STR"
[[ "$OUT_STR" != "application/x-excellon" ]] && echo " ERROR" && GERBER_MIME_VALID=0
# Test the official gbr extension
OUT_STR=$(xdg-mime query filetype $KICAD_MIME_TEST_FILES/gerbers/gerberFiles/gerber.gbr 2>&1)
printf " Testing gerber file with gbr extension: %s\n" "$OUT_STR"
[[ "$OUT_STR" != "application/x-gerber" ]] && echo " ERROR" && GERBER_MIME_VALID=0
# Test the parsing of the header for a comment (G04)
OUT_STR=$(xdg-mime query filetype $KICAD_MIME_TEST_FILES/gerbers/gerberFiles/gerberCommentNoExt 2>&1)
printf " Testing gerber file header G04 check: %s\n" "$OUT_STR"
[[ "$OUT_STR" != "application/x-gerber" ]] && echo " ERROR" && GERBER_MIME_VALID=0
# Test the parsing of the header for %FSLA
OUT_STR=$(xdg-mime query filetype $KICAD_MIME_TEST_FILES/gerbers/gerberFiles/gerberFSLANoExt 2>&1)
printf " Testing gerber file header %%FLSA check: %s\n" "$OUT_STR"
[[ "$OUT_STR" != "application/x-gerber" ]] && echo " ERROR" && GERBER_MIME_VALID=0
# Test the parsing of the header for %MO
OUT_STR=$(xdg-mime query filetype $KICAD_MIME_TEST_FILES/gerbers/gerberFiles/gerberMONoExt 2>&1)
printf " Testing gerber file header %%MO check: %s\n" "$OUT_STR"
[[ "$OUT_STR" != "application/x-gerber" ]] && echo " ERROR" && GERBER_MIME_VALID=0
# Test the parsing of the header for %TF.
OUT_STR=$(xdg-mime query filetype $KICAD_MIME_TEST_FILES/gerbers/gerberFiles/gerberTFNoExt 2>&1)
printf " Testing gerber file header %%TF. check: %s\n" "$OUT_STR"
[[ "$OUT_STR" != "application/x-gerber" ]] && echo " ERROR" && GERBER_MIME_VALID=0
# Test the parsing of the header for G75*.
OUT_STR=$(xdg-mime query filetype $KICAD_MIME_TEST_FILES/gerbers/gerberFiles/gerberG75NoExt 2>&1)
printf " Testing gerber file header G75* check: %s\n" "$OUT_STR"
[[ "$OUT_STR" != "application/x-gerber" ]] && echo " ERROR" && GERBER_MIME_VALID=0
# Test parsing another popular gerber extension (will require a lookup)
OUT_STR=$(xdg-mime query filetype $KICAD_MIME_TEST_FILES/gerbers/gerberFiles/gerber.gts 2>&1)
printf " Testing gerber file with gts extension (not glob'd): %s\n" "$OUT_STR"
[[ "$OUT_STR" != "application/x-gerber" ]] && echo " ERROR" && GERBER_MIME_VALID=0
if [ $GERBER_MIME_VALID -eq 1 ]
then
echo "All Gerber MIME-type files valid"
else
echo "Errors with Gerber MIME-type files"
fi
else
echo "Gerber MIME type files not installed, skipping validation"
GERBER_MIME_VALID=0
fi
# Test install the KiCad MIME file to test with it
echo ""
if [ $KICAD_MIME_INSTALLED -eq 1 ]
then
echo "Validating KiCad MIME-type"
# Test the KiCad project file extension default
OUT_STR=$(xdg-mime query default application/x-kicad-project 2>&1)
printf " Testing KiCad project file default application: %s\n" "$OUT_STR"
[[ "$OUT_STR" != "org.kicad.kicad.desktop" ]] && echo " ERROR" && KICAD_MIME_VALID=0
# Test the KiCad schematic file extension default
OUT_STR=$(xdg-mime query default application/x-kicad-schematic 2>&1)
printf " Testing KiCad schematic file default application: %s\n" "$OUT_STR"
[[ "$OUT_STR" != "org.kicad.eeschema.desktop" ]] && echo " ERROR" && KICAD_MIME_VALID=0
# Test the KiCad project file extension default
OUT_STR=$(xdg-mime query default application/x-kicad-pcb 2>&1)
printf " Testing KiCad board file default application: %s\n" "$OUT_STR"
[[ "$OUT_STR" != "org.kicad.pcbnew.desktop" ]] && echo " ERROR" && KICAD_MIME_VALID=0
# Test the old pcbnew board file extension (brd) - (will cause lookup since not glob'd)
OUT_STR=$(xdg-mime query filetype $KICAD_MIME_TEST_FILES/kicad/boardFiles/brd.brd 2>&1)
printf " Testing old Pcbnew board file with extension brd: %s\n" "$OUT_STR"
[[ "$OUT_STR" != "application/x-kicad-pcb" ]] && echo " ERROR" && KICAD_MIME_VALID=0
# Test the old pcbnew board file with header check
OUT_STR=$(xdg-mime query filetype $KICAD_MIME_TEST_FILES/kicad/boardFiles/brdNoExt 2>&1)
printf " Testing old Pcbnew board file header: %s\n" "$OUT_STR"
[[ "$OUT_STR" != "application/x-kicad-pcb" ]] && echo " ERROR" && KICAD_MIME_VALID=0
# Test the new pcbnew board file extension (kicad_pcb)
OUT_STR=$(xdg-mime query filetype $KICAD_MIME_TEST_FILES/kicad/boardFiles/kicadpcb.kicad_pcb 2>&1)
printf " Testing new Pcbnew board file with extension kicad_pcb: %s\n" "$OUT_STR"
[[ "$OUT_STR" != "application/x-kicad-pcb" ]] && echo " ERROR" && KICAD_MIME_VALID=0
# Test the new pcbnew board file with header check
OUT_STR=$(xdg-mime query filetype $KICAD_MIME_TEST_FILES/kicad/boardFiles/kicadpcbNoExt 2>&1)
printf " Testing new Pcbnew board file header: %s\n" "$OUT_STR"
[[ "$OUT_STR" != "application/x-kicad-pcb" ]] && echo " ERROR" && KICAD_MIME_VALID=0
# Test the old eeschema schematic file extension (sch)
OUT_STR=$(xdg-mime query filetype $KICAD_MIME_TEST_FILES/kicad/schematicFiles/sch.sch 2>&1)
printf " Testing old Eeschema schematic file with extension sch: %s\n" "$OUT_STR"
[[ "$OUT_STR" != "application/x-kicad-schematic" ]] && echo " ERROR" && KICAD_MIME_VALID=0
# Test the brd extension
OUT_STR=$(xdg-mime query filetype $KICAD_MIME_TEST_FILES/kicad/schematicFiles/schNoExt 2>&1)
printf " Testing old Eeschema schematic file header: %s\n" "$OUT_STR"
[[ "$OUT_STR" != "application/x-kicad-schematic" ]] && echo " ERROR" && KICAD_MIME_VALID=0
# Test the new Eeschema schematic file extension (kicad_sch)
OUT_STR=$(xdg-mime query filetype $KICAD_MIME_TEST_FILES/kicad/schematicFiles/kicadsch.kicad_sch 2>&1)
printf " Testing new Eeschema schematic file with extension kicad_sch: %s\n" "$OUT_STR"
[[ "$OUT_STR" != "application/x-kicad-schematic" ]] && echo " ERROR" && KICAD_MIME_VALID=0
# Test the new Eeschema board file with header check
OUT_STR=$(xdg-mime query filetype $KICAD_MIME_TEST_FILES/kicad/schematicFiles/kicadschNoExt 2>&1)
printf " Testing new Eeschema schematic file header: %s\n" "$OUT_STR"
[[ "$OUT_STR" != "application/x-kicad-schematic" ]] && echo " ERROR" && KICAD_MIME_VALID=0
# Test the old project file extension (pro)
OUT_STR=$(xdg-mime query filetype $KICAD_MIME_TEST_FILES/kicad/projectFiles/pro.pro 2>&1)
printf " Testing old KiCad project file with extension pro: %s\n" "$OUT_STR"
[[ "$OUT_STR" != "application/x-kicad-project" ]] && echo " ERROR" && KICAD_MIME_VALID=0
# Test the new project file extension (kicad_pro)
OUT_STR=$(xdg-mime query filetype $KICAD_MIME_TEST_FILES/kicad/projectFiles/kicadpro.kicad_pro 2>&1)
printf " Testing new KiCad project file with extension kicad_pro: %s\n" "$OUT_STR"
[[ "$OUT_STR" != "application/x-kicad-project" ]] && echo " ERROR" && KICAD_MIME_VALID=0
if [ $KICAD_MIME_VALID -eq 1 ]
then
echo "All KiCad MIME-type files valid"
else
echo "Errors with KiCad MIME-type files"
fi
else
echo "KiCad MIME type files not installed, skipping validation"
KICAD_MIME_VALID=0
fi
###################################################################
# Process return codes to flag errors for CI
###################################################################
[ $METAINFO_VALID -ne 0 ] && exit 1
[ $LAUNCHERS_VALID -ne 0 ] && exit 1
[ $KICAD_MIME_VALID -ne 0 ] && exit 1
[ $GERBER_MIME_VALID -ne 0 ] && exit 1
exit 0