summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
-rwxr-xr-xtools/git-setup23
-rwxr-xr-xtools/notsd-find-includes52
-rwxr-xr-xtools/notsd-fixup25
-rwxr-xr-xtools/notsd-fixup--includes215
-rwxr-xr-xtools/notsd-move (renamed from tools/move.sh)119
-rwxr-xr-xtools/notsd-reset (renamed from tools/reset.sh)0
-rw-r--r--tools/test-header.c1
-rwxr-xr-xtools/test-header.sh2
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