From a5fa7e420594b95958ca389b32c3d2d419cb7bb4 Mon Sep 17 00:00:00 2001 From: Midgard Date: Tue, 8 Sep 2020 14:51:39 +0200 Subject: [PATCH 1/3] Check sed version instead of OS, dedupe sed script --- src/new_module.sh | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/src/new_module.sh b/src/new_module.sh index 192d703..143cb35 100755 --- a/src/new_module.sh +++ b/src/new_module.sh @@ -45,21 +45,17 @@ cp -r template_module "$module_dir" cd "$module_dir" # Fill in the blanks in the template -if [ "$(uname)" == "Darwin" ]; then - sed -i '' -e " - s/{YEAR}/$(date +%Y)/ - s%{AUTHOR}%$author% - s%{MODULE_NAME}%$module_name% - s%{MODULE}%$module% - " $(find . -type f) -else - sed -i " - s/{YEAR}/$(date +%Y)/ - s%{AUTHOR}%$author% - s%{MODULE_NAME}%$module_name% - s%{MODULE}%$module% - " $(find -type f) -fi +sed_script=" + s/{YEAR}/$(date +%Y)/ + s%{AUTHOR}%$author% + s%{MODULE_NAME}%$module_name% + s%{MODULE}%$module%" +case "$(sed --help 2>&1)" in + # GNU sed wants `-i` and BSD sed wants `-i ''` + *GNU*) sed -i -e "$sed_script" $(find . -type f); ;; + *) sed -i '' -e "$sed_script" $(find . -type f); ;; +esac + # Arduino IDE requires .ino sketches to have the same name as their directory mv main.ino "$module.ino" From b9aeefbae69650ca8460e684900c0223dabe14a8 Mon Sep 17 00:00:00 2001 From: Midgard Date: Tue, 8 Sep 2020 16:17:28 +0200 Subject: [PATCH 2/3] Make new_module script POSIX compliant --- src/new_module.sh | 72 +++++++++++++++++++++++++---------------------- 1 file changed, 39 insertions(+), 33 deletions(-) diff --git a/src/new_module.sh b/src/new_module.sh index 143cb35..152d989 100755 --- a/src/new_module.sh +++ b/src/new_module.sh @@ -1,62 +1,68 @@ -#!/bin/bash +#!/bin/sh -# "Bash strict mode", see http://redsymbol.net/articles/unofficial-bash-strict-mode/ -set -euo pipefail -IFS=$'\n\t' +print() { printf '%s' "$1"; } +println() { printf '%s\n' "$1"; } # Go to the current working directory so things work if people are in a different one and e.g. use ../src/new_module.sh -cd "$(dirname "$0")" +cd -- "`dirname "$0"`" # Make sure the template dir exists so we don't let people enter details unnecessarily if [ ! -d ./template_module ]; then - echo "template_module doesn't exist" >&2 + println "template_module doesn't exist" >&2 exit 1 fi # Ask for module name -read -p "Name of module (e.g. Oil gauge): " module_name -if [[ $module_name == *%* ]]; then - echo "Module name must not contain %" >&2 - exit 1 -fi +print "Name of module (e.g. Oil gauge): " +read module_name -# Determine a "clean" module name: lowercase, no spaces -module="$(tr [A-Z] [a-z] <<< "$module_name")" -module="${module// /_}" -module="${module//\'/}" +# Determine a "clean" module name for paths: lowercase, no spaces +module="`print "$module_name" | tr [A-Z] [a-z] | sed "s/ /_/g;s/'//g"`" # Make sure `modules` directory exists and target directory doesn't mkdir -p modules module_dir="modules/$module" -if [[ -e "$module_dir" ]]; then - echo "$module_dir already exists" >&2 +if [ -e "$module_dir" ]; then + println "$module_dir already exists" >&2 exit 1 fi # Ask for author name -read -p "How would you like to be credited? Your name: " author -if [[ $author == *%* ]]; then - echo "Author name must not contain %" >&2 - exit 1 -fi +print "How would you like to be credited? Your name: " +read author # Copy the template directory -cp -r template_module "$module_dir" -cd "$module_dir" +cp -r -- template_module "$module_dir" +cd -- "$module_dir" # Fill in the blanks in the template -sed_script=" +# `sed -i` is not portable so we create something like it ourselves +sed_inplace="`mktemp`" +cleanup_sed() { rm -f -- "$sed_inplace"; } +trap cleanup_sed EXIT +print ' + filename="$1" + shift 1 + tmpfile="`mktemp`" + sed "$@" -- "$filename" > "$tmpfile" + mv -- "$tmpfile" "$filename" +' > "$sed_inplace" +chmod 0500 -- "$sed_inplace" # Make executable +assert_no_percent() { + case "$1" in + *"%"*) println "$2 must not contain %" >&2; exit 1 ;; + esac +} +assert_no_percent "$author" "Author name" +assert_no_percent "$module_name" "Module name" +assert_no_percent "$module" "Module path name" +find . -type f -exec "$sed_inplace" '{}' -e " s/{YEAR}/$(date +%Y)/ s%{AUTHOR}%$author% s%{MODULE_NAME}%$module_name% - s%{MODULE}%$module%" -case "$(sed --help 2>&1)" in - # GNU sed wants `-i` and BSD sed wants `-i ''` - *GNU*) sed -i -e "$sed_script" $(find . -type f); ;; - *) sed -i '' -e "$sed_script" $(find . -type f); ;; -esac + s%{MODULE}%$module%" \; # Arduino IDE requires .ino sketches to have the same name as their directory -mv main.ino "$module.ino" +mv -- main.ino "$module.ino" -echo "The basic structure for your module is now ready in $module_dir" +println "The basic structure for your module is now ready in $module_dir" From 11e5f16425a6015705889a99157abeeb5bcbc035 Mon Sep 17 00:00:00 2001 From: Felix Van der Jeugt Date: Tue, 8 Sep 2020 16:52:19 +0200 Subject: [PATCH 3/3] Use non-streaming editor and avoid temporary script --- src/new_module.sh | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/src/new_module.sh b/src/new_module.sh index 152d989..6602843 100755 --- a/src/new_module.sh +++ b/src/new_module.sh @@ -35,19 +35,7 @@ read author cp -r -- template_module "$module_dir" cd -- "$module_dir" -# Fill in the blanks in the template -# `sed -i` is not portable so we create something like it ourselves -sed_inplace="`mktemp`" -cleanup_sed() { rm -f -- "$sed_inplace"; } -trap cleanup_sed EXIT -print ' - filename="$1" - shift 1 - tmpfile="`mktemp`" - sed "$@" -- "$filename" > "$tmpfile" - mv -- "$tmpfile" "$filename" -' > "$sed_inplace" -chmod 0500 -- "$sed_inplace" # Make executable +# Disallow % in fields that will be used in %-delimited ed substitution assert_no_percent() { case "$1" in *"%"*) println "$2 must not contain %" >&2; exit 1 ;; @@ -56,11 +44,25 @@ assert_no_percent() { assert_no_percent "$author" "Author name" assert_no_percent "$module_name" "Module name" assert_no_percent "$module" "Module path name" -find . -type f -exec "$sed_inplace" '{}' -e " - s/{YEAR}/$(date +%Y)/ - s%{AUTHOR}%$author% - s%{MODULE_NAME}%$module_name% - s%{MODULE}%$module%" \; + +# Fill in the blanks in the template +# `sed -i` is not portable so we create something like it ourselves +reced() { + for file in "$1"/*; do + if [ -f "$file" ]; then + ed "$file" <