summary refs log tree commit diff stats
diff options
context:
space:
mode:
authortoonn <toonn@toonn.io>2019-06-20 16:54:51 +0200
committertoonn <toonn@toonn.io>2019-06-20 16:54:51 +0200
commitb1abf1327f38853f0101c585c2b1e868df400f9d (patch)
tree138fd48b3286e0eb55c9b3f1337ad553c3fde91a
parent9ce8a9d9c39ab63736c8df112cbaaad0a38def23 (diff)
parent85445558bd57ffcadc05ca5b89ec76ec69a384bc (diff)
downloadranger-b1abf1327f38853f0101c585c2b1e868df400f9d.tar.gz
Merge branch 'shellcheck'
-rw-r--r--HACKING.md6
-rw-r--r--Makefile42
-rwxr-xr-xranger/data/scope.sh142
3 files changed, 104 insertions, 86 deletions
diff --git a/HACKING.md b/HACKING.md
index 6e200a43..c3faf3ca 100644
--- a/HACKING.md
+++ b/HACKING.md
@@ -7,8 +7,10 @@ Coding Style
 * Use syntax compatible with Python `2.6+` and `3.1+`.
 * Use docstrings with `pydoc` in mind
 * Follow the PEP8 style guide: https://www.python.org/dev/peps/pep-0008/
-* Always run `make test` before submitting a new PR. `pylint`, `flake8` and
-  `pytest` needs to be installed.
+* Always run `make test` before submitting a new PR. `pylint`, `flake8`,
+  `pytest`, `doctest` and `shellcheck` need to be installed. (If you don't
+  change any shell scripts you can run `make test_py` and you don't need the
+  `shellcheck` dependency but it's an awesome tool, so check it out : )
 * When breaking backward compatibility with old configuration files or plugins,
   please include a temporary workaround code that provides a compatibility
   layer and mark it with a comment that includes the word `COMPAT`. For
diff --git a/Makefile b/Makefile
index c6b3b35d..87c5ff1b 100644
--- a/Makefile
+++ b/Makefile
@@ -38,21 +38,24 @@ options: help
 	@echo 'DESTDIR = $(DESTDIR)'
 
 help:
-	@echo 'make:              Test and compile ranger.'
-	@echo 'make install:      Install $(NAME)'
-	@echo 'make pypi_sdist:   Release a new sdist to PyPI'
-	@echo 'make clean:        Remove the compiled files (*.pyc, *.pyo)'
-	@echo 'make doc:          Create the pydoc documentation'
-	@echo 'make cleandoc:     Remove the pydoc documentation'
-	@echo 'make man:          Compile the manpage with "pod2man"'
-	@echo 'make manhtml:      Compile the html manpage with "pod2html"'
-	@echo 'make snapshot:     Create a tar.gz of the current git revision'
-	@echo 'make test:         Test everything'
-	@echo 'make test_pylint:  Test using pylint'
-	@echo 'make test_flake8:  Test using flake8'
-	@echo 'make test_doctest: Test using doctest'
-	@echo 'make test_pytest:  Test using pytest'
-	@echo 'make todo:         Look for TODO and XXX markers in the source code'
+	@echo 'make:                 Test and compile ranger.'
+	@echo 'make install:         Install $(NAME)'
+	@echo 'make pypi_sdist:      Release a new sdist to PyPI'
+	@echo 'make clean:           Remove the compiled files (*.pyc, *.pyo)'
+	@echo 'make doc:             Create the pydoc documentation'
+	@echo 'make cleandoc:        Remove the pydoc documentation'
+	@echo 'make man:             Compile the manpage with "pod2man"'
+	@echo 'make manhtml:         Compile the html manpage with "pod2html"'
+	@echo 'make snapshot:        Create a tar.gz of the current git revision'
+	@echo 'make test:            Test everything'
+	@echo 'make test_pylint:     Test using pylint'
+	@echo 'make test_flake8:     Test using flake8'
+	@echo 'make test_doctest:    Test using doctest'
+	@echo 'make test_pytest:     Test using pytest'
+	@echo 'make test_other:      Verify the manpage is complete'
+	@echo 'make test_py:         Run all python tests, including manpage completeness'
+	@echo 'make test_shellcheck: Test using shellcheck'
+	@echo 'make todo:            Look for TODO and XXX markers in the source code'
 
 install:
 	$(PYTHON) setup.py install $(SETUPOPTS) \
@@ -108,11 +111,18 @@ test_pytest:
 	@echo "Running py.test tests..."
 	py.test tests
 
+test_py: test_pylint test_flake8 test_doctest test_pytest test_other
+	@echo "Finished python and documentation tests!"
+
+test_shellcheck:
+	@echo "Running shellcheck..."
+	sed '2,$$s/^\(\s*\)#/\1/' ./ranger/data/scope.sh | shellcheck -a -
+
 test_other:
 	@echo "Checking completeness of man page..."
 	@tests/manpage_completion_test.py
 
-test: test_pylint test_flake8 test_doctest test_pytest test_other
+test: test_py test_shellcheck
 	@echo "Finished testing: All tests passed!"
 
 man:
diff --git a/ranger/data/scope.sh b/ranger/data/scope.sh
index 9202146d..306eeed0 100755
--- a/ranger/data/scope.sh
+++ b/ranger/data/scope.sh
@@ -3,29 +3,34 @@
 set -o noclobber -o noglob -o nounset -o pipefail
 IFS=$'\n'
 
-# If the option `use_preview_script` is set to `true`,
-# then this script will be called and its output will be displayed in ranger.
-# ANSI color codes are supported.
-# STDIN is disabled, so interactive scripts won't work properly
-
-# This script is considered a configuration file and must be updated manually.
-# It will be left untouched if you upgrade ranger.
-
-# Meanings of exit codes:
-# code | meaning    | action of ranger
-# -----+------------+-------------------------------------------
-# 0    | success    | Display stdout as preview
-# 1    | no preview | Display no preview at all
-# 2    | plain text | Display the plain content of the file
-# 3    | fix width  | Don't reload when width changes
-# 4    | fix height | Don't reload when height changes
-# 5    | fix both   | Don't ever reload
-# 6    | image      | Display the image `$IMAGE_CACHE_PATH` points to as an image preview
-# 7    | image      | Display the file directly as an image
-
-# Script arguments
+## If the option `use_preview_script` is set to `true`,
+## then this script will be called and its output will be displayed in ranger.
+## ANSI color codes are supported.
+## STDIN is disabled, so interactive scripts won't work properly
+
+## This script is considered a configuration file and must be updated manually.
+## It will be left untouched if you upgrade ranger.
+
+## Because of some automated testing we do on the script #'s for comments need
+## to be doubled up. Code that is commented out, because it's an alternative for
+## example, gets only one #.
+
+## Meanings of exit codes:
+## code | meaning    | action of ranger
+## -----+------------+-------------------------------------------
+## 0    | success    | Display stdout as preview
+## 1    | no preview | Display no preview at all
+## 2    | plain text | Display the plain content of the file
+## 3    | fix width  | Don't reload when width changes
+## 4    | fix height | Don't reload when height changes
+## 5    | fix both   | Don't ever reload
+## 6    | image      | Display the image `$IMAGE_CACHE_PATH` points to as an image preview
+## 7    | image      | Display the file directly as an image
+
+## Script arguments
 FILE_PATH="${1}"         # Full path of the highlighted file
 PV_WIDTH="${2}"          # Width of the preview pane (number of fitting characters)
+## shellcheck disable=SC2034 # PV_HEIGHT is provided for convenience and unused
 PV_HEIGHT="${3}"         # Height of the preview pane (number of fitting characters)
 IMAGE_CACHE_PATH="${4}"  # Full path that should be used to cache image preview
 PV_IMAGE_ENABLED="${5}"  # 'True' if image previews are enabled, 'False' otherwise.
@@ -33,7 +38,7 @@ PV_IMAGE_ENABLED="${5}"  # 'True' if image previews are enabled, 'False' otherwi
 FILE_EXTENSION="${FILE_PATH##*.}"
 FILE_EXTENSION_LOWER="$(printf "%s" "${FILE_EXTENSION}" | tr '[:upper:]' '[:lower:]')"
 
-# Settings
+## Settings
 HIGHLIGHT_SIZE_MAX=262143  # 256KiB
 HIGHLIGHT_TABWIDTH=${HIGHLIGHT_TABWIDTH:-8}
 HIGHLIGHT_STYLE=${HIGHLIGHT_STYLE:-pablo}
@@ -43,48 +48,48 @@ PYGMENTIZE_STYLE=${PYGMENTIZE_STYLE:-autumn}
 
 handle_extension() {
     case "${FILE_EXTENSION_LOWER}" in
-        # Archive
+        ## Archive
         a|ace|alz|arc|arj|bz|bz2|cab|cpio|deb|gz|jar|lha|lz|lzh|lzma|lzo|\
         rpm|rz|t7z|tar|tbz|tbz2|tgz|tlz|txz|tZ|tzo|war|xpi|xz|Z|zip)
             atool --list -- "${FILE_PATH}" && exit 5
             bsdtar --list --file "${FILE_PATH}" && exit 5
             exit 1;;
         rar)
-            # Avoid password prompt by providing empty password
+            ## Avoid password prompt by providing empty password
             unrar lt -p- -- "${FILE_PATH}" && exit 5
             exit 1;;
         7z)
-            # Avoid password prompt by providing empty password
+            ## Avoid password prompt by providing empty password
             7z l -p -- "${FILE_PATH}" && exit 5
             exit 1;;
 
-        # PDF
+        ## PDF
         pdf)
-            # Preview as text conversion
-            pdftotext -l 10 -nopgbrk -q -- "${FILE_PATH}" - | fmt -w ${PV_WIDTH} && exit 5
-            mutool draw -F txt -i -- "${FILE_PATH}" 1-10 | fmt -w ${PV_WIDTH} && exit 5
+            ## Preview as text conversion
+            pdftotext -l 10 -nopgbrk -q -- "${FILE_PATH}" - | fmt -w "${PV_WIDTH}" && exit 5
+            mutool draw -F txt -i -- "${FILE_PATH}" 1-10 | fmt -w "${PV_WIDTH}" && exit 5
             exiftool "${FILE_PATH}" && exit 5
             exit 1;;
 
-        # BitTorrent
+        ## BitTorrent
         torrent)
             transmission-show -- "${FILE_PATH}" && exit 5
             exit 1;;
 
-        # OpenDocument
+        ## OpenDocument
         odt|ods|odp|sxw)
-            # Preview as text conversion
+            ## Preview as text conversion
             odt2txt "${FILE_PATH}" && exit 5
             exit 1;;
 
-        # HTML
+        ## HTML
         htm|html|xhtml)
-            # Preview as text conversion
+            ## Preview as text conversion
             w3m -dump "${FILE_PATH}" && exit 5
             lynx -dump -- "${FILE_PATH}" && exit 5
             elinks -dump "${FILE_PATH}" && exit 5
             ;; # Continue with next handler on failure
-        # JSON
+        ## JSON
         json)
             jq --color-output . "${FILE_PATH}" && exit 5
             python -m json.tool -- "${FILE_PATH}" && exit 5
@@ -93,46 +98,47 @@ handle_extension() {
 }
 
 handle_image() {
-    # Size of the preview if there are multiple options or it has to be rendered
-    # from vector graphics. If the conversion program allows specifying only one
-    # dimension while keeping the aspect ratio, the width will be used.
+    ## Size of the preview if there are multiple options or it has to be
+    ## rendered from vector graphics. If the conversion program allows
+    ## specifying only one dimension while keeping the aspect ratio, the width
+    ## will be used.
     local DEFAULT_SIZE="1920x1080"
 
     local mimetype="${1}"
     case "${mimetype}" in
-        # SVG
+        ## SVG
         # image/svg+xml|image/svg)
         #     convert -- "${FILE_PATH}" "${IMAGE_CACHE_PATH}" && exit 6
         #     exit 1;;
 
-        # DjVu
+        ## DjVu
         # image/vnd.djvu)
         #     ddjvu -format=tiff -quality=90 -page=1 -size="${DEFAULT_SIZE}" \
         #           - "${IMAGE_CACHE_PATH}" < "${FILE_PATH}" \
         #           && exit 6 || exit 1;;
 
-        # Image
+        ## Image
         image/*)
             local orientation
             orientation="$( identify -format '%[EXIF:Orientation]\n' -- "${FILE_PATH}" )"
-            # If orientation data is present and the image actually
-            # needs rotating ("1" means no rotation)...
+            ## If orientation data is present and the image actually
+            ## needs rotating ("1" means no rotation)...
             if [[ -n "$orientation" && "$orientation" != 1 ]]; then
-                # ...auto-rotate the image according to the EXIF data.
+                ## ...auto-rotate the image according to the EXIF data.
                 convert -- "${FILE_PATH}" -auto-orient "${IMAGE_CACHE_PATH}" && exit 6
             fi
 
-            # `w3mimgdisplay` will be called for all images (unless overridden as above),
-            # but might fail for unsupported types.
+            ## `w3mimgdisplay` will be called for all images (unless overriden
+            ## as above), but might fail for unsupported types.
             exit 7;;
 
-        # Video
+        ## Video
         # video/*)
         #     # Thumbnail
         #     ffmpegthumbnailer -i "${FILE_PATH}" -o "${IMAGE_CACHE_PATH}" -s 0 && exit 6
         #     exit 1;;
 
-        # PDF
+        ## PDF
         # application/pdf)
         #     pdftoppm -f 1 -l 1 \
         #              -scale-to-x "${DEFAULT_SIZE%x*}" \
@@ -142,18 +148,18 @@ handle_image() {
         #              -- "${FILE_PATH}" "${IMAGE_CACHE_PATH%.*}" \
         #         && exit 6 || exit 1;;
 
-        # ePub, MOBI, FB2 (using Calibre)
-        # application/epub+zip|application/x-mobipocket-ebook|application/x-fictionbook+xml)
-        #     ebook-meta --get-cover="${IMAGE_CACHE_PATH}" -- "${FILE_PATH}" > /dev/null \
-        #         && exit 6 || exit 1;;
 
-        # ePub (using <https://github.com/marianosimone/epub-thumbnailer>)
-        # application/epub+zip)
-        #     epub-thumbnailer \
-        #         "${FILE_PATH}" "${IMAGE_CACHE_PATH}" "${DEFAULT_SIZE%x*}" \
-        #         && exit 6 || exit 1;;
+        ## ePub, MOBI, FB2 (using Calibre)
+        # application/epub+zip|application/x-mobipocket-ebook|\
+        # application/x-fictionbook+xml)
+        #     # ePub (using https://github.com/marianosimone/epub-thumbnailer)
+        #     epub-thumbnailer "${FILE_PATH}" "${IMAGE_CACHE_PATH}" \
+        #         "${DEFAULT_SIZE%x*}" && exit 6
+        #     ebook-meta --get-cover="${IMAGE_CACHE_PATH}" -- "${FILE_PATH}" \
+        #         >/dev/null && exit 6
+        #     exit 1;;
 
-        # Font
+        ## Font
         application/font*|application/*opentype)
             preview_png="/tmp/$(basename "${IMAGE_CACHE_PATH%.*}").png"
             if fontimage -o "${preview_png}" \
@@ -174,8 +180,8 @@ handle_image() {
             fi
             ;;
 
-        # Preview archives using the first image inside.
-        # (Very useful for comic book collections for example.)
+        ## Preview archives using the first image inside.
+        ## (Very useful for comic book collections for example.)
         # application/zip|application/x-rar|application/x-7z-compressed|\
         #     application/x-xz|application/x-bzip2|application/x-gzip|application/x-tar)
         #     local fn=""; local fe=""
@@ -216,9 +222,9 @@ handle_image() {
 handle_mime() {
     local mimetype="${1}"
     case "${mimetype}" in
-        # Text
+        ## Text
         text/* | */xml)
-            # Syntax highlight
+            ## Syntax highlight
             if [[ "$( stat --printf='%s' -- "${FILE_PATH}" )" -gt "${HIGHLIGHT_SIZE_MAX}" ]]; then
                 exit 2
             fi
@@ -236,21 +242,21 @@ handle_mime() {
                 -- "${FILE_PATH}" && exit 5
             exit 2;;
 
-        # DjVu
+        ## DjVu
         image/vnd.djvu)
-            # Preview as text conversion (requires djvulibre)
-            djvutxt "${FILE_PATH}" | fmt -w ${PV_WIDTH} && exit 5
+            ## Preview as text conversion (requires djvulibre)
+            djvutxt "${FILE_PATH}" | fmt -w "${PV_WIDTH}" && exit 5
             exiftool "${FILE_PATH}" && exit 5
             exit 1;;
 
-        # Image
+        ## Image
         image/*)
-            # Preview as text conversion
+            ## Preview as text conversion
             # img2txt --gamma=0.6 --width="${PV_WIDTH}" -- "${FILE_PATH}" && exit 4
             exiftool "${FILE_PATH}" && exit 5
             exit 1;;
 
-        # Video and audio
+        ## Video and audio
         video/* | audio/*)
             mediainfo "${FILE_PATH}" && exit 5
             exiftool "${FILE_PATH}" && exit 5