diff options
Diffstat (limited to 'tools')
-rwxr-xr-x | tools/git-setup | 23 | ||||
-rwxr-xr-x | tools/notsd-find-includes | 52 | ||||
-rwxr-xr-x | tools/notsd-fixup | 25 | ||||
-rwxr-xr-x | tools/notsd-fixup--includes | 215 | ||||
-rwxr-xr-x | tools/notsd-move (renamed from tools/move.sh) | 119 | ||||
-rwxr-xr-x | tools/notsd-reset (renamed from tools/reset.sh) | 0 | ||||
-rw-r--r-- | tools/test-header.c | 1 | ||||
-rwxr-xr-x | tools/test-header.sh | 2 |
8 files changed, 382 insertions, 55 deletions
diff --git a/tools/git-setup b/tools/git-setup new file mode 100755 index 0000000000..f40a7724d9 --- /dev/null +++ b/tools/git-setup @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +cd "$(dirname -- "$0")" +cd "$(git rev-parse --show-toplevel)" + +if [ -f .git/hooks/pre-commit.sample ] && [ ! -f .git/hooks/pre-commit ]; then + # This part is allowed to fail + cp -p .git/hooks/pre-commit.sample .git/hooks/pre-commit && \ + chmod +x .git/hooks/pre-commit && \ + echo "Activated pre-commit hook." || : +fi + +declare -A fetch +git config -f .gitconfig --get-regexp '.*' | while read -r key val; do + if [[ $key = *.fetch ]]; then + if [[ -z "${fetch[$key]}" ]]; then + git config --local --unset-all "$key" + fetch[$key]='true' + fi + git config --local --add "$key" "$val" + else + git config --local "$key" "$val" + fi +done diff --git a/tools/notsd-find-includes b/tools/notsd-find-includes new file mode 100755 index 0000000000..6dfb406fa3 --- /dev/null +++ b/tools/notsd-find-includes @@ -0,0 +1,52 @@ +#!/usr/bin/env bash + +phase=phase0 + +phase0() { + phase=phase0 + local line="$1" + case "$line" in + '#include'*|'typedef '*';') + phase1 "$line" + ;; + *) + ;; + esac +} + +phase1() { + phase=phase1 + local line="$1" + case "$line" in + '') + ;; + '#include'*) + ;; + 'typedef '*';') + ;; + *) + phase2 "$line" + ;; + esac +} + +phase2() { + phase=phase2 + local line="$1" + printf '%s\n' "$line" + cat +} + +main() { + current_file="$1" + set -o pipefail + { + IFS='' + while read -r line; do + "$phase" "$line" + IFS='' + done + } < "$current_file" | grep '^#include' | ifne printf '%s\n' "$current_file" +} + +main "$@" diff --git a/tools/notsd-fixup b/tools/notsd-fixup new file mode 100755 index 0000000000..feec1b8921 --- /dev/null +++ b/tools/notsd-fixup @@ -0,0 +1,25 @@ +#!/usr/bin/env bash + +fixup_makefiles() ( + find -type f -name Makefile|while read -r filename; do + sed -r -i "s|(/\.\.)*/config.mk|/$(realpath -ms --relative-to="${filename%/*}" config.mk)|" "$filename" + done +) + +fixup_includes() ( + find $(find . -type d -name include) -type d | while read -r dir; do + lib="${dir##*/}" + pushd "$dir" + find . -type f -exec sed -ri -e "s|$lib/||" -- {} + + popd + done + + find src \( -name '*.h' -o -name '*.c' \) -type f -exec "$0"--includes {} \; +) + +main() { + fixup_makefiles + fixup_includes +} + +main "$@" diff --git a/tools/notsd-fixup--includes b/tools/notsd-fixup--includes new file mode 100755 index 0000000000..957733cdc0 --- /dev/null +++ b/tools/notsd-fixup--includes @@ -0,0 +1,215 @@ +#!/usr/bin/env bash + +panic() { + >&2 echo panic + exit 2 +} + +out() { + printf '%q ' "$@" +} + +# system +# linux +# public +# protected +# private +classify() { + local path=$1 + if [[ "$path" = linux/* ]]; then + out linux "$path" + elif [[ -f "${current_file%/*}/${path}" ]]; then + out private "$path" + elif [[ "$path" != systemd/* ]] && + [[ "$path" != libudev.h ]] && + cpp -include "$path" <<<'' &>/dev/null; + then + out system "$path" + else + case "$path" in + asm/sgidefs.h|dbus/dbus.h|efi.h|efilib.h|gio/gio.h|glib.h|libmount.h) + out system "$path" + ;; + util.h|*/util.h) + if [[ "$current_file" = */systemd-boot/* ]]; then + out private util.h + else + out protected basic/util.h + fi + ;; + *) + file=$(find src -type f -name "${path##*/}") + if [[ -f "$file" ]]; then + case "$file" in + */src/*) + if [[ "${current_file%/*}" = "${file%/*}" ]]; then + out private "${file##*/}" + else + out protected "${file##*/src/}" + fi + ;; + */libsystemd/include/*|*/libudev/include/*) + out public "${file##*/include/}" + ;; + */include/*) + out protected "${file##*/include/}" + ;; + *) + if [[ "${current_file%/*}" = "${file%/*}" ]]; then + out private "${file##*/}" + else + out protected "${file##*/}" + fi + ;; + esac + else + >&2 printf 'Cannot figure out: %q\n' "$path" + exit 2 + fi + ;; + esac + fi +} + +phase=phase0 +hook=: + +phase0() { + phase=phase0 + hook=: + local line="$1" + case "$line" in + '#include'*|'typedef '*';') + phase1 "$line" + ;; + *) + printf '%s\n' "$line" + ;; + esac +} + +phase1_tail= +system=() +linux=() +public=() +protected=() +typedef=(); typedef_last=true +private=() +phase1_flush() { + local b=: + if [[ ${#system[@]} -gt 0 ]]; then + printf '%s\n' "${system[@]}" | sort -u + b=echo + fi + if [[ ${#linux[@]} -gt 0 ]]; then + $b + printf '%s\n' "${linux[@]}" + b=echo + fi + if [[ ${#public[@]} -gt 0 ]]; then + $b + printf '%s\n' "${public[@]}" | sort -u + b=echo + fi + if [[ ${#protected[@]} -gt 0 ]]; then + $b + printf '%s\n' "${protected[@]}" | sort -u + b=echo + fi + if [[ ${#typedef[@]} -gt 0 ]] && ! $typedef_last; then + $b + printf '%s\n' "${typedef[@]}" | sort -u + b=echo + fi + if [[ ${#private[@]} -gt 0 ]]; then + $b + printf '%s\n' "${private[@]}" | sort -u + b=echo + fi + if [[ ${#typedef[@]} -gt 0 ]] && $typedef_last; then + $b + printf '%s\n' "${typedef[@]}" + fi + printf '%s' "$phase1_tail" +} +phase1() { + phase=phase1 + hook=phase1_flush + local line="$1" + case "$line" in + '') + phase1_tail+=$'\n' + ;; + '#include'*) + phase1_tail='' + local re='^#include [<"]([^">]*)[">](.*)' + if [[ "$line" =~ $re ]]; then + IFS=' ' + local buf + buf="$(classify "${BASH_REMATCH[1]}")" || panic + read -r class path <<<"$buf" + case "$class" in + system) + printf -v line '#include <%s>%s' "$path" "${BASH_REMATCH[2]}" + system+=("$line") + ;; + linux) + printf -v line '#include <%s>%s' "$path" "${BASH_REMATCH[2]}" + linux+=("$line") + ;; + public) + printf -v line '#include <%s>%s' "$path" "${BASH_REMATCH[2]}" + public+=("$line") + ;; + protected) + printf -v line '#include "%s"%s' "$path" "${BASH_REMATCH[2]}" + protected+=("$line") + ;; + private) + if [[ ${#typedef[@]} -gt 0 ]]; then + typedef_last=false + fi + printf -v line '#include "%s"%s' "$path" "${BASH_REMATCH[2]}" + private+=("$line") + ;; + esac + else + panic + fi + ;; + 'typedef '*';') + phase1_tail='' + typedef+=("$line") + ;; + *) + phase1_flush + phase2 "$line" + ;; + esac +} + +phase2() { + phase=phase2 + hook=: + local line="$1" + printf '%s\n' "$line" + cat +} + +main() { + current_file="$1" + printf ' => %s\n' "$current_file" + set -o pipefail + trap 'rm -f -- "$current_file.tmp"' EXIT + { + IFS='' + while read -r line; do + "$phase" "$line" + IFS='' + done + "$hook" + } < "$current_file" > "$current_file.tmp" + mv -Tf "$current_file.tmp" "$current_file" +} + +main "$@" diff --git a/tools/move.sh b/tools/notsd-move index a0ca642d57..6e7cebe2d0 100755 --- a/tools/move.sh +++ b/tools/notsd-move @@ -1,13 +1,14 @@ #!/usr/bin/env bash -in_array() { +in_array() ( + set +x local needle=$1; shift local item for item in "$@"; do [[ $item = $needle ]] && return 0 # Found done return 1 # Not Found -} +) split_lib() { local d=$1 @@ -659,43 +660,44 @@ move_files() ( ) breakup_makefile() ( - touch .tmp.move.all - files=(.tmp.move.all) - file=/dev/null - IFS='' - while read -r line; do - if [[ $line = '#@'* ]]; then - file="${line#'#@'}" - file="${file%% *}" - elif [[ $file = all ]]; then - printf '%s\n' "$line" | tee -a "${files[@]}" >/dev/null - else + set -x + mkdir -p build-aux/Makefile.{once,each}.{head,tail} + + touch .tmp.move.all + files=(.tmp.move.all) + file=/dev/null + IFS='' + declare -i i=0 + trap 'printf "Makefile.am:%d:%s\n" $i "$line"' EXIT + while read -r line; do + i+=1 + if [[ $line = '#@'* ]]; then + file="${line#'#@'}" + file="${file%% *}" + if [[ $file = auto/* ]]; then + IFS=/ + read -r auto dir makefile <<<"$file" + IFS='' + [[ $auto = auto ]] + [[ $makefile = Makefile ]] + d="$(find src -type d -name "$dir")" + [[ -n "$d" ]] + [[ "$(wc -l <<<"$d")" = 1 ]] + file="$d/Makefile" + fi + elif [[ $file = all ]]; then + printf '%s\n' "$line" | tee -a "${files[@]}" >/dev/null + else if ! in_array "$file" "${files[@]}"; then cat .tmp.move.all > "$file" files+=("$file") fi - printf '%s\n' "$line" >> "$file" - fi - done < <(fixup_makefile <Makefile.am) - rm .tmp.move.all -) - -fixup_includes() ( - find src \( -name '*.h' -o -name '*.c' \) \ - -exec grep '#include ["<]sd-' -l -- {} + | - xargs -d $'\n' sed -ri \ - -e 's|#include "(sd-[^"]*)"|#include <systemd/\1>|' \ - -e 's|#include <(sd-[^>]*)>|#include <systemd/\1>|' -) - -fixup_makefile() { - sed -r \ - -e '/^[^# ]*:/ { s|^(\s*)\S+/|\1$(outdir)/| }' \ - -e 's|^if (.*)|ifneq ($(\1),)|' \ - -e 's|--version-script=.*/([^/]+)\.sym|--version-script=$(srcdir)/\1.sym|g' -} + printf '%s\n' "$line" >> "$file" + fi + done < <(fixup_makefile <Makefile.am) + trap -- EXIT + rm .tmp.move.all -fixup_makefiles() ( sed -ri \ -e '/^ \$\(AM_V_at\)\$\(MKDIR_P\) \$\(dir \$@\)/d' \ -e 's/ \$\(CFLAGS\) / /g' \ @@ -706,11 +708,15 @@ fixup_makefiles() ( src/libsystemd/src/Makefile \ src/libsystemd/src/sd-journal/Makefile \ src/grp-udev/libudev-core/Makefile - find -type f -name Makefile|while read -r filename; do - sed -r -i "s|(/\.\.)*/config.mk|/$(realpath -ms --relative-to="${filename%/*}" config.mk)|" "$filename" - done ) +fixup_makefile() { + sed -r \ + -e '/^[^# ]*:/ { s|^(\s*)\S+/|\1$(outdir)/| }' \ + -e 's|^if (.*)|ifneq ($(\1),)|' \ + -e 's|--version-script=.*/([^/]+)\.sym|--version-script=$(srcdir)/\1.sym|g' +} + breakup_zshcompletion() ( sed_expr=' 1 { @@ -735,38 +741,41 @@ breakup_zshcompletion() ( ) move() ( - find . \( -name Makefile -o -name '*.mk' \) -delete + find . \( -name Makefile -o -name '*.mk' \) -delete >&2 echo ' => breakup_zshcompletion' breakup_zshcompletion >&2 echo ' => move_files' move_files >&2 echo ' => breakup_makefile' - #breakup_makefile - >&2 echo ' => fixup_includes' - fixup_includes - >&2 echo ' => fixup_makefiles' - #fixup_makefiles + "$0" breakup_makefile |& tail -n20 > .tmp.log || { r=$?; cat .tmp.log; exit $r; } + >&2 echo ' => ./tools/notsd-fixup' + ./tools/notsd-fixup ) main() { set -e + set -o pipefail - if [[ -n "$(git status -s)" ]] || [[ -n "$(git clean -xdn)" ]]; then - echo 'There are changes in the current directory.' >&2 - exit 1 - fi + if [[ $# -gt 0 ]]; then + "$@" + else + if [[ -n "$(git status -s)" ]] || [[ -n "$(git clean -xdn)" ]]; then + echo 'There are changes in the current directory.' >&2 + exit 1 + fi - git checkout -b tmp/postmove + git checkout -b tmp/postmove - move + move - git add . - git commit -m './tools/move.sh' - git merge -s ours notsystemd/postmove - git checkout notsystemd/postmove - git merge tmp/postmove - git branch -d tmp/postmove + git add . + git commit -m './tools/notsd-move' + git merge -s ours notsystemd/postmove + git checkout notsystemd/postmove + git merge tmp/postmove + git branch -d tmp/postmove + fi } main "$@" diff --git a/tools/reset.sh b/tools/notsd-reset index d7141587fa..d7141587fa 100755 --- a/tools/reset.sh +++ b/tools/notsd-reset diff --git a/tools/test-header.c b/tools/test-header.c new file mode 100644 index 0000000000..76e8197013 --- /dev/null +++ b/tools/test-header.c @@ -0,0 +1 @@ +int main() { return 0; } diff --git a/tools/test-header.sh b/tools/test-header.sh new file mode 100755 index 0000000000..b11285af7d --- /dev/null +++ b/tools/test-header.sh @@ -0,0 +1,2 @@ +#!/bin/bash +gcc -c -o /dev/null -I/usr/include/efi -I/usr/include/efi/x86_64 -I/usr/include/libmount $(find src -type d |sed 's|^|-I&|') -include ./config.h -include "$(realpath -- "$1")" test-header.c |