mirror of
https://gitlab.com/TECHNOFAB/soonix.git
synced 2026-03-24 15:39:24 +01:00
Compare commits
1 commit
880ebb6e42
...
6693b7cab8
| Author | SHA1 | Date | |
|---|---|---|---|
| 6693b7cab8 |
3 changed files with 64 additions and 86 deletions
|
|
@ -22,5 +22,4 @@ in rec {
|
||||||
};
|
};
|
||||||
|
|
||||||
mkShellHook = userConfig: (make userConfig).config.shellHook;
|
mkShellHook = userConfig: (make userConfig).config.shellHook;
|
||||||
mkCLI = userConfig: (make userConfig).config.packages.soonix;
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -154,7 +154,16 @@ in {
|
||||||
config = let
|
config = let
|
||||||
hooks = config.hooks;
|
hooks = config.hooks;
|
||||||
# allow excluding gitignore since stuff like renovate can't use/commit it anyways
|
# allow excluding gitignore since stuff like renovate can't use/commit it anyways
|
||||||
runHooks = concatMapStringsSep "\n" (hookName: let
|
getHookNames = {includeGitignored ? true}:
|
||||||
|
if includeGitignored
|
||||||
|
then (builtins.attrNames hooks)
|
||||||
|
else
|
||||||
|
map
|
||||||
|
(hook: hook.name)
|
||||||
|
(builtins.filter (hook: !hook.hook.gitignore) (builtins.attrValues hooks));
|
||||||
|
|
||||||
|
runHooks = args:
|
||||||
|
concatMapStringsSep "\n" (hookName: let
|
||||||
hook = hooks.${hookName};
|
hook = hooks.${hookName};
|
||||||
modes = {
|
modes = {
|
||||||
link =
|
link =
|
||||||
|
|
@ -162,12 +171,8 @@ in {
|
||||||
''
|
''
|
||||||
if [[ ! -L "${hook.output}" ]] || [[ "$(readlink "${hook.output}")" != "${hook.generatedDerivation}" ]]; then
|
if [[ ! -L "${hook.output}" ]] || [[ "$(readlink "${hook.output}")" != "${hook.generatedDerivation}" ]]; then
|
||||||
_soonix_log "info" "${hookName}" "Creating symlink: ${hook.output} -> ${hook.generatedDerivation}"
|
_soonix_log "info" "${hookName}" "Creating symlink: ${hook.output} -> ${hook.generatedDerivation}"
|
||||||
if [[ "$CHECK_MODE" != "true" ]]; then
|
|
||||||
mkdir -p "$(dirname "${hook.output}")"
|
mkdir -p "$(dirname "${hook.output}")"
|
||||||
ln -sf "${hook.generatedDerivation}" "${hook.output}"
|
ln -sf "${hook.generatedDerivation}" "${hook.output}"
|
||||||
else
|
|
||||||
_soonix_log "info" "${hookName}" "Would create symlink: ${hook.output} -> ${hook.generatedDerivation}"
|
|
||||||
fi
|
|
||||||
_changed=true
|
_changed=true
|
||||||
else
|
else
|
||||||
_soonix_log "info" "${hookName}" "Symlink up to date: ${hook.output}"
|
_soonix_log "info" "${hookName}" "Symlink up to date: ${hook.output}"
|
||||||
|
|
@ -178,14 +183,10 @@ in {
|
||||||
''
|
''
|
||||||
if [[ ! -f "${hook.output}" ]] || ! cmp -s "${hook.generatedDerivation}" "${hook.output}"; then
|
if [[ ! -f "${hook.output}" ]] || ! cmp -s "${hook.generatedDerivation}" "${hook.output}"; then
|
||||||
_soonix_log "info" "${hookName}" "Copying file: ${hook.generatedDerivation} -> ${hook.output}"
|
_soonix_log "info" "${hookName}" "Copying file: ${hook.generatedDerivation} -> ${hook.output}"
|
||||||
if [[ "$CHECK_MODE" != "true" ]]; then
|
|
||||||
mkdir -p "$(dirname "${hook.output}")"
|
mkdir -p "$(dirname "${hook.output}")"
|
||||||
# required since they're read only
|
# required since they're read only
|
||||||
rm -f "${hook.output}"
|
rm -f "${hook.output}"
|
||||||
cp "${hook.generatedDerivation}" "${hook.output}"
|
cp "${hook.generatedDerivation}" "${hook.output}"
|
||||||
else
|
|
||||||
_soonix_log "info" "${hookName}" "Would copy file: ${hook.generatedDerivation} -> ${hook.output}"
|
|
||||||
fi
|
|
||||||
_changed=true
|
_changed=true
|
||||||
else
|
else
|
||||||
_soonix_log "info" "${hookName}" "File up to date: ${hook.output}"
|
_soonix_log "info" "${hookName}" "File up to date: ${hook.output}"
|
||||||
|
|
@ -199,20 +200,11 @@ in {
|
||||||
_soonix_add_to_gitignore "${hook.output}"
|
_soonix_add_to_gitignore "${hook.output}"
|
||||||
''
|
''
|
||||||
else "";
|
else "";
|
||||||
|
|
||||||
isGitignored =
|
|
||||||
if hook.hook.gitignore
|
|
||||||
then "true"
|
|
||||||
else "false";
|
|
||||||
in
|
in
|
||||||
builtins.addErrorContext "[soonix] while generating script for ${hookName}"
|
builtins.addErrorContext "[soonix] while generating script for ${hookName}"
|
||||||
# sh
|
# sh
|
||||||
''
|
''
|
||||||
# Process hook: ${hookName}
|
# Process hook: ${hookName}
|
||||||
# Skip if SKIP_GITIGNORE is set and this hook is gitignored
|
|
||||||
if [[ "$SKIP_GITIGNORE" == "true" && "${isGitignored}" == "true" ]]; then
|
|
||||||
: # skip
|
|
||||||
else
|
|
||||||
while IFS= read -r line; do
|
while IFS= read -r line; do
|
||||||
case "$line" in
|
case "$line" in
|
||||||
UPDATED) _soonix_updated+=("${hookName}") ;;
|
UPDATED) _soonix_updated+=("${hookName}") ;;
|
||||||
|
|
@ -225,7 +217,6 @@ in {
|
||||||
|
|
||||||
${modes.${hook.hook.mode} or (throw "Mode ${hook.hook.mode} doesnt exist")}
|
${modes.${hook.hook.mode} or (throw "Mode ${hook.hook.mode} doesnt exist")}
|
||||||
|
|
||||||
if [[ "$CHECK_MODE" != "true" ]]; then
|
|
||||||
# Add to gitignore if requested
|
# Add to gitignore if requested
|
||||||
${optionalGitignore}
|
${optionalGitignore}
|
||||||
|
|
||||||
|
|
@ -234,7 +225,6 @@ in {
|
||||||
_soonix_log "info" "${hookName}" "Running extra command: ${hook.hook.extra}"
|
_soonix_log "info" "${hookName}" "Running extra command: ${hook.hook.extra}"
|
||||||
eval "${hook.hook.extra}"
|
eval "${hook.hook.extra}"
|
||||||
fi
|
fi
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ "$_changed" == "true" ]]; then
|
if [[ "$_changed" == "true" ]]; then
|
||||||
echo "UPDATED"
|
echo "UPDATED"
|
||||||
|
|
@ -245,17 +235,13 @@ in {
|
||||||
_soonix_log "error" "${hookName}" "Failed to process hook"
|
_soonix_log "error" "${hookName}" "Failed to process hook"
|
||||||
_soonix_failed+=("${hookName}")
|
_soonix_failed+=("${hookName}")
|
||||||
}
|
}
|
||||||
fi
|
|
||||||
'')
|
'')
|
||||||
(builtins.attrNames hooks);
|
(getHookNames args);
|
||||||
|
|
||||||
generateShellHook =
|
generateShellHook = args:
|
||||||
builtins.addErrorContext "[soonix] while generating shell hook"
|
builtins.addErrorContext "[soonix] while generating shell hook"
|
||||||
# sh
|
# sh
|
||||||
''
|
''
|
||||||
CHECK_MODE=''${CHECK_MODE:-false}
|
|
||||||
SKIP_GITIGNORE=''${SKIP_GITIGNORE:-false}
|
|
||||||
|
|
||||||
_soonix_log() {
|
_soonix_log() {
|
||||||
local level="$1"
|
local level="$1"
|
||||||
local hook="$2"
|
local hook="$2"
|
||||||
|
|
@ -289,16 +275,13 @@ in {
|
||||||
_soonix_failed=()
|
_soonix_failed=()
|
||||||
_soonix_uptodate=()
|
_soonix_uptodate=()
|
||||||
|
|
||||||
${runHooks}
|
${runHooks args}
|
||||||
|
|
||||||
local output=$'\E[msoonix:\E[38;5;8m'
|
local output=$'\E[msoonix:\E[38;5;8m'
|
||||||
local status=0
|
local status=0
|
||||||
|
|
||||||
if [[ ''${#_soonix_updated[@]} -gt 0 ]]; then
|
if [[ ''${#_soonix_updated[@]} -gt 0 ]]; then
|
||||||
output="$output [updated: ''${_soonix_updated[*]}]" >&2
|
output="$output [updated: ''${_soonix_updated[*]}]" >&2
|
||||||
if [[ "$CHECK_MODE" == "true" ]]; then
|
|
||||||
status=2
|
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
if [[ ''${#_soonix_uptodate[@]} -gt 0 ]]; then
|
if [[ ''${#_soonix_uptodate[@]} -gt 0 ]]; then
|
||||||
output="$output [unchanged: ''${_soonix_uptodate[*]}]" >&2
|
output="$output [unchanged: ''${_soonix_uptodate[*]}]" >&2
|
||||||
|
|
@ -310,8 +293,8 @@ in {
|
||||||
|
|
||||||
printf "%s\E[m\n" "$output" >&2
|
printf "%s\E[m\n" "$output" >&2
|
||||||
|
|
||||||
if [[ $status -ne 0 ]]; then
|
if [[ $status -eq 1 ]]; then
|
||||||
exit $status
|
exit 1
|
||||||
fi
|
fi
|
||||||
'';
|
'';
|
||||||
|
|
||||||
|
|
@ -325,7 +308,7 @@ in {
|
||||||
# nothing to do if no hooks exist
|
# nothing to do if no hooks exist
|
||||||
shellHook =
|
shellHook =
|
||||||
if (builtins.length (builtins.attrNames config.hooks) > 0)
|
if (builtins.length (builtins.attrNames config.hooks) > 0)
|
||||||
then generateShellHook
|
then generateShellHook {}
|
||||||
else "";
|
else "";
|
||||||
shellHookFile = pkgs.writeShellScript "shellHook" shellHook;
|
shellHookFile = pkgs.writeShellScript "shellHook" shellHook;
|
||||||
devshellModule = {
|
devshellModule = {
|
||||||
|
|
@ -342,7 +325,6 @@ in {
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
SKIP_GITIGNORE=false
|
SKIP_GITIGNORE=false
|
||||||
CHECK_MODE=false
|
|
||||||
COMMAND=""
|
COMMAND=""
|
||||||
|
|
||||||
show_help() {
|
show_help() {
|
||||||
|
|
@ -354,7 +336,6 @@ in {
|
||||||
|
|
||||||
COMMANDS:
|
COMMANDS:
|
||||||
update Update all managed files
|
update Update all managed files
|
||||||
check Check if all files are up to date (dry-run)
|
|
||||||
list List all managed file targets
|
list List all managed file targets
|
||||||
help Show this help message
|
help Show this help message
|
||||||
|
|
||||||
|
|
@ -371,7 +352,7 @@ in {
|
||||||
|
|
||||||
while [[ $# -gt 0 ]]; do
|
while [[ $# -gt 0 ]]; do
|
||||||
case "$1" in
|
case "$1" in
|
||||||
update|check|list|help)
|
update|list|help)
|
||||||
COMMAND="$1"
|
COMMAND="$1"
|
||||||
shift
|
shift
|
||||||
;;
|
;;
|
||||||
|
|
@ -415,18 +396,17 @@ in {
|
||||||
'') (builtins.attrNames hooks)}
|
'') (builtins.attrNames hooks)}
|
||||||
;;
|
;;
|
||||||
update)
|
update)
|
||||||
|
if [[ "$SKIP_GITIGNORE" == "true" ]]; then
|
||||||
function _soonix() {
|
function _soonix() {
|
||||||
${generateShellHook}
|
${generateShellHook {includeGitignored = false;}}
|
||||||
}
|
}
|
||||||
_soonix
|
_soonix
|
||||||
;;
|
else
|
||||||
check)
|
|
||||||
CHECK_MODE=true
|
|
||||||
echo "Checking files..."
|
|
||||||
function _soonix() {
|
function _soonix() {
|
||||||
${generateShellHook}
|
${generateShellHook {}}
|
||||||
}
|
}
|
||||||
_soonix
|
_soonix
|
||||||
|
fi
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
'';
|
'';
|
||||||
|
|
|
||||||
|
|
@ -87,7 +87,6 @@ in {
|
||||||
assert_file_contains "${soonixBin}" "test.json"
|
assert_file_contains "${soonixBin}" "test.json"
|
||||||
|
|
||||||
assert_file_contains "${soonixBin}" "SKIP_GITIGNORE"
|
assert_file_contains "${soonixBin}" "SKIP_GITIGNORE"
|
||||||
assert_file_contains "${soonixBin}" "CHECK_MODE"
|
|
||||||
'';
|
'';
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue