summary refs log tree commit diff
path: root/contrib/scripts/nm-python-black-format.sh
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/scripts/nm-python-black-format.sh')
-rwxr-xr-xcontrib/scripts/nm-python-black-format.sh100
1 files changed, 100 insertions, 0 deletions
diff --git a/contrib/scripts/nm-python-black-format.sh b/contrib/scripts/nm-python-black-format.sh
new file mode 100755
index 00000000..eae84fdb
--- /dev/null
+++ b/contrib/scripts/nm-python-black-format.sh
@@ -0,0 +1,100 @@
+#!/bin/bash
+
+set -e
+
+_print() {
+    printf '%s\n' "$*" >&2
+}
+
+die() {
+    _print "$*"
+    exit 1
+}
+
+NM_ROOT="$(git rev-parse --show-toplevel)" || die "not inside a git repository"
+NM_PREFIX="$(git rev-parse --show-prefix)" || die "not inside a git repository"
+
+cd "$NM_ROOT" || die "failed to cd into \$NM_ROOT\""
+
+if [ ! -f "./src/core/main.c" ]; then
+    die "Error: \"$NM_ROOT\" does not look like NetworkManager source tree"
+fi
+
+BLACK="${BLACK:-black}"
+
+if ! command -v "$BLACK" &> /dev/null; then
+    _print "Error: black is not installed. On RHEL/Fedora/CentOS run 'dnf install black'"
+    exit 77
+fi
+
+OLD_IFS="$IFS"
+
+usage() {
+    printf "Usage: %s [OPTION]...\n" "$(basename "$0")"
+    printf "Reformat python source files using python black.\n\n"
+    printf "OPTIONS:\n"
+    printf "    -i                   Reformat files (this is the default)\n"
+    printf "    -n|--dry-run|--check Only check the files (contrary to \"-i\")\n"
+    printf "    --show-filenames     Only print the filenames that would be checked/formatted\n"
+    printf "    -h                   Print this help message\n"
+}
+
+TEST_ONLY=0
+SHOW_FILENAMES=0
+
+while (( $# )); do
+    case "$1" in
+        -h)
+            usage
+            exit 0
+            ;;
+        -n|--dry-run|--check)
+            TEST_ONLY=1
+            shift
+            continue
+            ;;
+        -i)
+            TEST_ONLY=0
+            shift
+            continue
+            ;;
+        --show-filenames)
+            SHOW_FILENAMES=1
+            shift
+            continue
+            ;;
+        *)
+            usage
+            exit 1
+            ;;
+    esac
+done
+
+IFS=$'\n'
+FILES=()
+FILES+=( $(git ls-tree --name-only -r HEAD | grep '\.py$') )
+FILES+=( $(git grep -l '#!.*\<p[y]thon3\?\>') )
+FILES=( $(printf "%s\n" "${FILES[@]}" | sort -u) )
+
+# Filter out paths that are forked from upstream projects and not
+# ours to reformat.
+FILES=( $(
+    printf "%s\n" "${FILES[@]}" |
+    sed \
+        -e '/^src\/[cn]-[^/]\+\//d' \
+        -e '/^src\/libnm-systemd-[^/]\+\/src\//d'
+) )
+
+IFS="$OLD_IFS"
+
+if [ $SHOW_FILENAMES = 1 ]; then
+    printf '%s\n' "${FILES[@]}"
+    exit 0
+fi
+
+EXTRA_ARGS=()
+if [ $TEST_ONLY = 1 ]; then
+    EXTRA_ARGS+=('--check')
+fi
+
+"$BLACK" "${EXTRA_ARGS[@]}" "${FILES[@]}"