summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--Doc/Zsh/contrib.yo22
-rw-r--r--Functions/MIME/zsh-mime-handler6
3 files changed, 33 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index b8302c199..829973181 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2013-09-08  Peter Stephenson  <p.w.stephenson@ntlworld.com>
+
+	* 31711: Doc/Zsh/contrib.yo, Functions/MIME/zsh-mime-handler:
+	add execute-never style for MIME handler for files on alien file
+	systems.
+
 2013-09-07  Luka Perkov  <luka@openwrt.org>
 
 	* 31708: Completion/Unix/Command/_git: _git: add --fixup and
diff --git a/Doc/Zsh/contrib.yo b/Doc/Zsh/contrib.yo
index 48c510582..9d3fc7562 100644
--- a/Doc/Zsh/contrib.yo
+++ b/Doc/Zsh/contrib.yo
@@ -2881,6 +2881,28 @@ hence executable files are executed directly and not passed to a
 handler, and the option tt(AUTO_CD) may be used to change to directories
 that happen to have MIME suffixes.
 )
+kindex(execute-never, MIME style)
+item(tt(execute-never))(
+This style is useful in combination with tt(execute-as-is).  It is
+set to an array of patterns corresponding to full paths to files that
+should never be treated as executable, even if the file passed to
+the MIME handler matches tt(execute-as-is).  This is useful for file
+systems that don't handle execute permission or that contain executables
+from another operating system.  For example, if tt(/mnt/windows) is a
+Windows mount, then
+
+example(zstyle ':mime:*' execute-never '/mnt/windows/*')
+
+will ensure that any files found in that area will be executed as MIME
+types even if they are executable.  As this example shows, the complete
+file name is matched against the pattern, regardless of how the file
+was passed to the handler.  The file is resolved to a full path using
+the tt(:A) modifier described in
+ifzman(the subsection Modifers in zmanref(zshexpn))\
+ifnzman(noderef(Modifiers)));
+this means that symbolic links are resolved where possible, so that
+links into other file systems behave in the correct fashion.
+)
 kindex(file-path, MIME style)
 item(tt(file-path))(
 Used if the style tt(find-file-in-path) is true for the same context.
diff --git a/Functions/MIME/zsh-mime-handler b/Functions/MIME/zsh-mime-handler
index 7245c20e2..24e5184fc 100644
--- a/Functions/MIME/zsh-mime-handler
+++ b/Functions/MIME/zsh-mime-handler
@@ -76,13 +76,14 @@ suffix=${suffix#*.}
 
 local handler flags no_sh no_bg arg bg_flag="&"
 integer i
-local -a exec_asis hand_nonex
+local -a exec_asis hand_nonex exec_never
 
 # Set to a list of patterns which are ignored and executed as they are,
 # despite being called for interpretation by the mime handler.
 # Defaults to executable files, which ensures that they are executed as
 # they are, even if they have a suffix.
 zsh-mime-contexts -a $suffix execute-as-is exec_asis || exec_asis=('*(*)' '*(/)')
+zsh-mime-contexts -a $suffix execute-never exec_never
 
 # Set to a list of patterns for which the handler will be used even
 # if the file doesn't exist on the disk.
@@ -125,6 +126,9 @@ fi
 for pattern in $exec_asis; do
   files=(${dirpref}${~pattern})
   if [[ -n ${files[(r)$1]} ]]; then
+    for pattern in $exec_never; do
+      [[ ${1:A} = ${~pattern} ]] && break 2
+    done
     if (( list )); then
       for (( i = 1; i <= $#; i++ )); do
 	(( i == 1 )) || print -n " "