about summary refs log tree commit diff
path: root/Functions/Calendar/age
diff options
context:
space:
mode:
Diffstat (limited to 'Functions/Calendar/age')
-rw-r--r--Functions/Calendar/age73
1 files changed, 73 insertions, 0 deletions
diff --git a/Functions/Calendar/age b/Functions/Calendar/age
new file mode 100644
index 000000000..4ed3bd8c2
--- /dev/null
+++ b/Functions/Calendar/age
@@ -0,0 +1,73 @@
+# Match the age of a file, for use as a glob qualifer.  Can
+# take one or two arguments, which can be supplied by one of two
+# ways (always the same for both arguments):
+#
+#   print *(e:age 2006/10/04 2006/10/09:)
+#
+# Match all files modified between the start of those dates.
+#
+#   print *(e:age 2006/10/04)
+#
+# Match all files modified on that date.  If the second argument is
+# omitted it is taken to be exactly 24 hours after the first argument
+# (even if the first argument contains a time).
+#
+#   print *(e:age 2006/10/04:10:15 2006/10/04:10:45)
+#
+# Supply times.  All the time and formats handled by calendar_scandate
+# are allowed, but whitespace must be quoted to ensure age receives
+# the correct arguments.
+#
+#   AGEREF1=2006/10/04:10:15
+#   AGEREF2=2006/10/04:10:45
+#   print *(+age)
+#
+# The same example using the other form of argument passing.  The
+# dates stay in effect until unset, but will be overridden if
+# any argument is passed in the first format.
+
+emulate -L zsh
+integer mystat disable_stat
+
+zmodload -i zsh/stat
+# Allow the builtin stat to be hidden.
+zmodload -i zsh/parameter
+if [[ $builtins[stat] != defined ]]; then
+  (( disable_stat = 1 ))
+  enable stat
+fi
+
+autoload -U calendar_scandate
+
+local -a vals
+
+[[ -e $REPLY ]] || return 1
+stat -A vals +mtime $REPLY || return 1
+
+if (( $# >= 1 )); then
+  local AGEREF=$1
+  # if 1 argument given, never use globally defined AGEREF2
+  local AGEREF2=$2
+fi
+
+integer mtime=$vals[1] date1 date2
+local REPLY
+
+if calendar_scandate $AGEREF; then
+  date1=$REPLY
+
+  if [[ -n $AGEREF2 ]] && calendar_scandate $AGEREF2; then
+    date2=$REPLY
+  else
+    (( date2 = date1 + 24 * 60 * 60 ))
+  fi
+
+  (( date1 <= mtime && mtime <= date2 ))
+else
+  mystat=1
+fi
+
+# If the builtin stat was previously disabled, disable it again.
+(( disable_stat )) && disable stat
+
+return $mystat