org-macro.el: Allow modification-time from vc.el

* org-macro.el (org-macro--vc-modified-time): New function.
* org-macro.el (org-macro-initialize-templates): Add support for new
  function.
* doc/org.texi (Macro replacement): Document new behavior.
* etc/ORG-NEWS: Mention new behavior.
This commit is contained in:
Rasmus 2016-05-18 11:23:46 +02:00
parent 44ad9ff3e4
commit 291938d0b0
3 changed files with 39 additions and 5 deletions

View File

@ -10247,13 +10247,15 @@ argument to the @code{@{@{@{date@}@}@}} macro that will be used only if
understood by @code{format-time-string}.
@item @{@{@{time(@var{FORMAT})@}@}@}
@itemx @{@{@{modification-time(@var{FORMAT})@}@}@}
@itemx @{@{@{modification-time(@var{FORMAT}, @var{VC})@}@}@}
@cindex time, macro
@cindex modification time, macro
These macros refer to the date and time when the document is exported and to
the modification date and time of the file being exported, respectively.
@var{FORMAT} should be a format string understood by
@code{format-time-string}.
the modification date and time, respectively. @var{FORMAT} should be a
format string understood by @code{format-time-string}. If the second
argument to the @code{modification-time} macro is non-@code{nil}, Org
retrieves the information from the version control system, using
@file{vc.el}, instead of the file attributes.
@item @{@{@{input-file@}@}@}
@cindex input file, macro

View File

@ -105,6 +105,9 @@ becomes
: ("pdf" . (lambda (file link) (foo)))
*** The ~{{{modification-time}}}~ macro can obtain time via =vc=
The modification time will be determined via =vc.el= if the second
argument is non-nil. See the manual for details.
** New features
*** New org-protocol key=value syntax

View File

@ -58,6 +58,10 @@
(declare-function org-file-contents "org" (file &optional noerror))
(declare-function org-mode "org" ())
(declare-function org-remove-double-quotes "org" (s))
(declare-function org-with-wide-buffer "org-macs" (&rest body))
(declare-function vc-backend "vc-hooks" (f))
(declare-function vc-call "vc-hooks" (&rest args))
(declare-function vc-exec-after "vc-dispatcher" (code))
;;; Variables
@ -145,7 +149,8 @@ function installs the following ones: \"property\",
(mapc update-templates
(list (cons "input-file" (file-name-nondirectory visited-file))
(cons "modification-time"
(format "(eval (format-time-string \"$1\" '%s))"
(format "(eval (format-time-string \"$1\" (or (and (org-string-nw-p \"$2\") (org-macro--vc-modified-time %s)) '%s)))"
(prin1-to-string visited-file)
(prin1-to-string
(nth 5 (file-attributes visited-file)))))))))
(setq org-macro-templates templates)))
@ -276,6 +281,30 @@ Return a list of arguments, as strings. This is the opposite of
s nil t)
"\000"))
(defun org-macro--vc-modified-time (file)
(save-window-excursion
(when (vc-backend file)
(let ((buf (get-buffer-create " *org-vc*"))
(case-fold-search t)
date)
(unwind-protect
(progn
(vc-call print-log file buf nil nil 1)
(with-current-buffer buf
(vc-exec-after
(lambda ()
(goto-char (point-min))
(when (re-search-forward "Date:?[ \t]*" nil t)
(let ((time (parse-time-string
(buffer-substring
(point) (line-end-position)))))
(when (cl-some #'identity time)
(setq date (apply #'encode-time time))))))))
(let ((proc (get-buffer-process buf)))
(while (and proc (accept-process-output proc .5 nil t)))))
(kill-buffer buf))
date))))
(provide 'org-macro)
;;; org-macro.el ends here