Merge branch 'org-id-uuid' of git://github.com/dmj/dmj-org-mode

This commit is contained in:
Carsten Dominik 2010-05-18 09:03:26 +02:00
commit 7bb31a512e
2 changed files with 44 additions and 16 deletions

View File

@ -29,6 +29,14 @@
`also-non-dangling-p' to `only-dangling-p', since due to a bug `also-non-dangling-p' to `only-dangling-p', since due to a bug
this was the default behavior all along. this was the default behavior all along.
2010-05-16 David Maus <dmaus@ictsoc.de>
* org-id.el (org-id-uuid): New function. Return string with
random (version 4) UUID.
(org-id-method): Make 'uuid the new default value.
(org-id-new): Use `org-id-uuid' if call to uuidgen program
does not return a UUID.
2010-05-15 Carsten Dominik <carsten.dominik@gmail.com> 2010-05-15 Carsten Dominik <carsten.dominik@gmail.com>
* org-latex.el (org-export-latex-format-image): Add support * org-latex.el (org-export-latex-format-image): Add support

View File

@ -37,8 +37,9 @@
;; time of the ID, with microsecond accuracy. This virtually ;; time of the ID, with microsecond accuracy. This virtually
;; guarantees globally unique identifiers, even if several people are ;; guarantees globally unique identifiers, even if several people are
;; creating IDs at the same time in files that will eventually be used ;; creating IDs at the same time in files that will eventually be used
;; together. As an external method `uuidgen' is supported, if installed ;; together.
;; on the system. ;;
;; By default Org uses UUIDs as global unique identifiers.
;; ;;
;; This file defines the following API: ;; This file defines the following API:
;; ;;
@ -84,18 +85,9 @@
:group 'org-id :group 'org-id
:type 'string) :type 'string)
(defcustom org-id-method (defcustom org-id-method 'uuid
(condition-case nil
(if (string-match "\\`[-0-9a-fA-F]\\{36\\}\\'"
(org-trim (shell-command-to-string
org-id-uuid-program)))
'uuidgen
'org)
(error 'org))
"The method that should be used to create new IDs. "The method that should be used to create new IDs.
If `uuidgen' is available on the system, it will be used as the default method.
if not, the method `org' is used.
An ID will consist of the optional prefix specified in `org-id-prefix', An ID will consist of the optional prefix specified in `org-id-prefix',
and a unique part created by the method this variable specifies. and a unique part created by the method this variable specifies.
@ -105,11 +97,13 @@ org Org's own internal method, using an encoding of the current time to
microsecond accuracy, and optionally the current domain of the microsecond accuracy, and optionally the current domain of the
computer. See the variable `org-id-include-domain'. computer. See the variable `org-id-include-domain'.
uuidgen Call the external command uuidgen." uuid Create random (version 4) UUIDs. If the program defined in
`org-id-uuid-program' is available it is used to create the ID.
Otherwise an internal functions is used."
:group 'org-id :group 'org-id
:type '(choice :type '(choice
(const :tag "Org's internal method" org) (const :tag "Org's internal method" org)
(const :tag "external: uuidgen" uuidgen))) (const :tag "external: uuidgen" uuid)))
(defcustom org-id-prefix nil (defcustom org-id-prefix nil
"The prefix for IDs. "The prefix for IDs.
@ -306,8 +300,10 @@ So a typical ID could look like \"Org:4nd91V40HI\"."
unique) unique)
(if (equal prefix ":") (setq prefix "")) (if (equal prefix ":") (setq prefix ""))
(cond (cond
((eq org-id-method 'uuidgen) ((memq org-id-method '(uuidgen uuid))
(setq unique (org-trim (shell-command-to-string org-id-uuid-program)))) (setq unique (org-trim (shell-command-to-string org-id-uuid-program)))
(unless (org-uuidgen-p unique)
(setq unique (org-id-uuid))))
((eq org-id-method 'org) ((eq org-id-method 'org)
(let* ((etime (org-id-reverse-string (org-id-time-to-b36))) (let* ((etime (org-id-reverse-string (org-id-time-to-b36)))
(postfix (if org-id-include-domain (postfix (if org-id-include-domain
@ -318,6 +314,30 @@ So a typical ID could look like \"Org:4nd91V40HI\"."
(t (error "Invalid `org-id-method'"))) (t (error "Invalid `org-id-method'")))
(concat prefix unique))) (concat prefix unique)))
(defun org-id-uuid ()
"Return string with random (version 4) UUID."
(let ((rnd (md5 (format "%s%s%s%s%s%s%s"
(random t)
(current-time)
(user-uid)
(emacs-pid)
(user-full-name)
user-mail-address
(recent-keys)))))
(format "%s-%s-4%s-%s%s-%s"
(substring rnd 0 8)
(substring rnd 8 12)
(substring rnd 13 16)
(format "%x"
(logior
#B10000000
(logand
#B10111111
(string-to-number
(substring rnd 16 18) 16))))
(substring rnd 18 20)
(substring rnd 20 32))))
(defun org-id-reverse-string (s) (defun org-id-reverse-string (s)
(mapconcat 'char-to-string (nreverse (string-to-list s)) "")) (mapconcat 'char-to-string (nreverse (string-to-list s)) ""))