Skip to content

Commit

Permalink
feat(gschema-overrides): Make include array truly optional & includ… (
Browse files Browse the repository at this point in the history
#360)

* feat(gschema-overrides): Make `include` array truly optional & include all gschemas by default

* chore(gschema-overrides): Make recipe input matching log a bit clearer

* docs(gschema-overrides): Make some points clearer

* docs(gschema-overrides): Fix some unfinished line

* docs(gschema-override): Some indentation fixes

* docs(gschema-overrides): Remove redundant comment in module.yml
  • Loading branch information
fiftydinar authored Nov 14, 2024
1 parent 9368c5d commit f176a35
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 32 deletions.
6 changes: 4 additions & 2 deletions modules/gschema-overrides/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ This module is similar to using `dconf` configuration, but is better because it
What does this module do?

- It copies all content from `/usr/share/glib-2.0/schemas/`, except existing gschema.overrides to avoid conflicts, into temporary test location.
- It copies your gschema.overrides you provided in this module from `files/gschema-overrides/` into temporary test location.
- It copies all your included gschema.overrides by default or schemas you strictly specified in the module recipe from `files/gschema-overrides/` into temporary test location.
- It tests them for errors in temporary test location by using `glib-compile-schemas` with `--strict` flag. If errors are found, build will fail.
- If test is passed successfully, it copies your gschema.overrides to `/usr/share/glib-2.0/schemas/`.
- It compiles gschema using `glib-compile-schemas` in `/usr/share/glib-2.0/schemas/` location to include your changes.
Expand All @@ -22,7 +22,9 @@ To use this module, you need to include your gschema.override file(s) in this lo

`files/gschema-overrides/`

Then you need to include those file(s) in recipe file, like in example configuration.
Then you can just set `type: gschema-overrides` in module recipe & be good to go.

Optionally, you can include only specific file(s) in the module recipe, if you don't want every gschema override, like in example configuration.

It is highly recommended to use `zz1-` prefix before your gschema.override name, to ensure that your changes are going to be applied.

Expand Down
96 changes: 67 additions & 29 deletions modules/gschema-overrides/gschema-overrides.sh
Original file line number Diff line number Diff line change
Expand Up @@ -4,49 +4,87 @@ set -euo pipefail

get_yaml_array INCLUDE '.include[]' "$1"

schema_include_location="${CONFIG_DIRECTORY}/gschema-overrides"
schema_test_location="/tmp/bluebuild-schema-test"
schema_location="/usr/share/glib-2.0/schemas"
gschema_extension=false
SCHEMA_INCLUDE_LOCATION="${CONFIG_DIRECTORY}/gschema-overrides"
SCHEMA_TEST_LOCATION="/tmp/bluebuild-schema-test"
SCHEMA_LOCATION="/usr/share/glib-2.0/schemas"
readarray -t MODULE_FILES < <(find "${SCHEMA_INCLUDE_LOCATION}" -type f)
readarray -t SCHEMA_MODULE_FILES < <(find "${SCHEMA_INCLUDE_LOCATION}" -type f -name "*.gschema.override" -printf "%f\n")

echo "Installing gschema-overrides module"
# Abort the build if no files are found in ${SCHEMA_INCLUDE_LOCATION}
if [[ ${#MODULE_FILES[@]} -eq 0 ]]; then
echo "ERROR: You don't have any files in '${SCHEMA_INCLUDE_LOCATION/#\/tmp/}/' location inside the repo"
echo " Please make sure that you put at least 1 file in that location before using this module"
exit 1
fi

# Abort build if file in module is not included
if [[ ${#INCLUDE[@]} == 0 ]]; then
echo "Module failed because gschema-overrides aren't included into the module."
# Abort the build if no gschema.override files are found in ${SCHEMA_INCLUDE_LOCATION}
if [[ ${#SCHEMA_MODULE_FILES[@]} -eq 0 ]]; then
echo "ERROR: Files found, but you don't have any '.gschema.override' files in '${SCHEMA_INCLUDE_LOCATION/#\/tmp/}/' location inside the repo"
echo " Please make sure that you named the files correctly"
exit 1
fi

# Abort build if included file does not have .gschema.override extension
# Abort the build if recipe input does not match any of the included files
if [[ ${#INCLUDE[@]} -gt 0 ]]; then
for file in "${INCLUDE[@]}"; do
if [[ "$file" == *.gschema.override ]]; then
gschema_extension=true
else
echo "Module failed because included files in module don't have .gschema.override extension."
for input in "${INCLUDE[@]}"; do
match_found=false
for file in "${SCHEMA_MODULE_FILES[@]}"; do
if [[ "${input}" == "${file}" ]]; then
match_found=true
break
fi
done
if [[ "${match_found}" == false ]]; then
echo "ERROR: Module failed because '${input}' file specified in module recipe doesn't match any of the included files in '${SCHEMA_INCLUDE_LOCATION/#\/tmp/}/' location inside the repo"
exit 1
fi
fi
done
fi

# Apply gschema-override when all conditions above are satisfied
if [[ ${#INCLUDE[@]} -gt 0 ]] && $gschema_extension; then
printf "Applying the following gschema-overrides:\n"

printf "Applying the following gschema-overrides:\n"

if [[ ${#INCLUDE[@]} -gt 0 ]]; then
for file in "${INCLUDE[@]}"; do
printf "%s\n" "$file"
printf "%s\n" "${file}"
done
else
for file in "${SCHEMA_MODULE_FILES[@]}"; do
printf "%s\n" "${file}"
done
mkdir -p "$schema_test_location" "$schema_location"
find "$schema_location" -type f ! -name "*.gschema.override" -exec cp {} "$schema_test_location" \;
fi

mkdir -p "${SCHEMA_TEST_LOCATION}" "${SCHEMA_LOCATION}"
find "${SCHEMA_LOCATION}" -type f ! -name "*.gschema.override" -exec cp {} "${SCHEMA_TEST_LOCATION}" \;

if [[ ${#INCLUDE[@]} -gt 0 ]]; then
for file in "${INCLUDE[@]}"; do
file_path="${schema_include_location}/${file}"
cp "$file_path" "$schema_test_location"
file_path="${SCHEMA_INCLUDE_LOCATION}/${file}"
cp "${file_path}" "${SCHEMA_TEST_LOCATION}"
done
else
for file in "${SCHEMA_MODULE_FILES[@]}"; do
file_path="${SCHEMA_INCLUDE_LOCATION}/${file}"
cp "${file_path}" "${SCHEMA_TEST_LOCATION}"
done
echo "Running error-checking test for your gschema-overrides. If test fails, build also fails."
glib-compile-schemas --strict "$schema_test_location"
echo "Compiling gschema to include your changes with gschema-override"
fi

echo "Running error-checking test for your gschema-overrides. If test fails, build also fails."
glib-compile-schemas --strict "${SCHEMA_TEST_LOCATION}"

echo "Compiling gschema to include your changes with gschema-override"

if [[ ${#INCLUDE[@]} -gt 0 ]]; then
for file in "${INCLUDE[@]}"; do
file_path="${schema_test_location}/${file}"
cp "$file_path" "$schema_location"
done
glib-compile-schemas "$schema_location" &>/dev/null
file_path="${SCHEMA_TEST_LOCATION}/${file}"
cp "${file_path}" "${SCHEMA_LOCATION}"
done
else
for file in "${SCHEMA_MODULE_FILES[@]}"; do
file_path="${SCHEMA_TEST_LOCATION}/${file}"
cp "${file_path}" "${SCHEMA_LOCATION}"
done
fi

glib-compile-schemas "${SCHEMA_LOCATION}" &>/dev/null
2 changes: 1 addition & 1 deletion modules/gschema-overrides/module.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@ shortdesc: The `gschema-overrides` module can be used for including system-setti
example: |
type: gschema-overrides
include:
- zz1-myoverride.gschema.override # test & compile the override file included in files/gschema-overrides/zz1-myoverride.gschema.override
- zz1-myoverride.gschema.override # test & compile specific override file included in files/gschema-overrides/zz1-myoverride.gschema.override

0 comments on commit f176a35

Please sign in to comment.