diff options
-rw-r--r-- | HACKING.md | 6 | ||||
-rw-r--r-- | Makefile | 42 | ||||
-rwxr-xr-x | ranger/data/scope.sh | 142 |
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 |