kicad/qa/resources/linux/verifyMetadataFiles.sh

304 lines
14 KiB
Bash
Executable File
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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