From 12e3360f833dbc83e995aed1ba67b74fc95e3ec3 Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Sat, 10 Sep 2016 18:59:03 -0400 Subject: sync other tools from master --- tools/find_includes | 52 +++++++++++++ tools/fixup.sh | 9 +++ tools/fixup_includes | 215 +++++++++++++++++++++++++++++++++++++++++++++++++++ tools/git-setup | 23 ++++++ tools/test-header.c | 1 + tools/test-header.sh | 2 + 6 files changed, 302 insertions(+) create mode 100755 tools/find_includes create mode 100755 tools/fixup.sh create mode 100755 tools/fixup_includes create mode 100755 tools/git-setup create mode 100644 tools/test-header.c create mode 100755 tools/test-header.sh diff --git a/tools/find_includes b/tools/find_includes new file mode 100755 index 0000000000..6dfb406fa3 --- /dev/null +++ b/tools/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/fixup.sh b/tools/fixup.sh new file mode 100755 index 0000000000..651feb6cf8 --- /dev/null +++ b/tools/fixup.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + +for lib in basic shared systemd-network systemd; do + pushd src/lib${lib}/include/${lib} + find . -type f -exec sed -ri -e "s|$lib/||" -- {} + + popd +done + +find src \( -name '*.h' -o -name '*.c' \) -type f -exec ./fixup_includes {} \; diff --git a/tools/fixup_includes b/tools/fixup_includes new file mode 100755 index 0000000000..957733cdc0 --- /dev/null +++ b/tools/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/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/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 -- cgit v1.2.3-54-g00ecf