diff --git a/doc/ChangeLog b/doc/ChangeLog index 255aa5dd0..71f739cf4 100644 --- a/doc/ChangeLog +++ b/doc/ChangeLog @@ -1,3 +1,7 @@ +2009-09-28 Carsten Dominik + + * org.texi (Pushing to MobileOrg): Document `org-mobile-files'. + 2009-09-26 Carsten Dominik * org.texi (Processing LaTeX fragments): Document that the size of diff --git a/doc/org.texi b/doc/org.texi index f415eec94..bd8485803 100644 --- a/doc/org.texi +++ b/doc/org.texi @@ -11680,10 +11680,10 @@ operation of @i{MobileOrg} itself (see @uref{http://ncogni.to/mobileorg/}). @node Setting up the staging area, Pushing to MobileOrg, MobileOrg, MobileOrg @section Setting up the staging area -Org-mode has commands to prepare a directory with files for @i{MobileOrg}, and to -read captured notes from there. If Emacs can directly write to the WebDAV -directory accessed by @i{MobileOrg}, all you need to do is to point to this -directory using the variable @code{org-mobile-directory}. +Org-mode has commands to prepare a directory with files for @i{MobileOrg}, +and to read captured notes from there. If Emacs can directly write to the +WebDAV directory accessed by @i{MobileOrg}, all you need to do is to point to +this directory using the variable @code{org-mobile-directory}. If Emacs cannot access the WebDAV directory directly, you can use a local directory for staging. Other means must then be used to keep this directory @@ -11707,18 +11707,22 @@ from the WebDAV directory using @file{scp}. @node Pushing to MobileOrg, Pulling from MobileOrg, Setting up the staging area, MobileOrg @section Pushing to MobileOrg - -This operation copies all files currently listed in @code{org-agenda-files} -to the directory @code{org-mobile-directory}. It also creates (in the same -directory) a special Org file @file{agendas.org}. This file is an Org-mode -style outline, containing every custom agenda view defined by the user. -While creating the agendas, Org-mode will force@footnote{See the variable -@code{org-mobile-force-id-on-agenda-items}.} an ID property on all entries -referenced by the agendas, so that these entries can be uniquely identified -if @i{MobileOrg} flags them for further action. Finally, Org writes the file -@file{index.org}, containing links to all other files. If @i{MobileOrg} is -configured to request this file from the WebDAV server, all agendas and Org -files will be downloaded to the iPhone. +This operation copies all files currently listed in @code{org-mobile-files} +to the directory @code{org-mobile-directory}. By default this list contains +all agenda files (as listed in @code{org-agenda-files}), but additional files +can be included by customizing @code{org-mobiles-files}. The push operation +also creates (in the same directory) a special Org file @file{agendas.org}. +This file is an Org-mode style outline, containing every custom agenda view +defined by the user. While creating the agendas, Org-mode will +force@footnote{See the variable @code{org-mobile-force-id-on-agenda-items}.} +an ID property on all entries referenced by the agendas, so that these +entries can be uniquely identified if @i{MobileOrg} flags them for further +action. Finally, Org writes the file @file{index.org}, containing links to +all other files. If @i{MobileOrg} is configured to request this file from +the WebDAV server, all agendas and Org files will be downloaded to the +iPhone. To speed up the download, MobileOrg will only read files whose +checksums@footnote{stored automatically in the file @file{checksums.dat}} +have changed. @node Pulling from MobileOrg, , Pushing to MobileOrg, MobileOrg @section Pulling from MobileOrg diff --git a/lisp/ChangeLog b/lisp/ChangeLog index f828ea8b8..daa78c73e 100755 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -2,6 +2,15 @@ * org-mobile.el (org-mobile-files-alist): Add the list of tags to the index file. + (org-mobile-files): New option. + (org-mobile-files-alist, org-mobile-checksum-files): New variable. + (org-mobile-prepare-file-lists, org-mobile-files-alist): New + functions. + (org-mobile-push): Start by creating the files lists. + (org-mobile-copy-agenda-files): Move killing the buffer to after + the save-excursion has exited. + (org-mobile-write-checksums): Write checksums also for files in + sub-directories. * org.el (org-ctrl-c-ctrl-c): Pass prefix arg to org-table-recalculate when cursor is in TBLFM line. diff --git a/lisp/org-mobile.el b/lisp/org-mobile.el index 83136c757..48527cd08 100644 --- a/lisp/org-mobile.el +++ b/lisp/org-mobile.el @@ -27,7 +27,9 @@ ;; ;; This file contains the code to interact with Richard Moreland's iPhone ;; application MobileOrg. This code is documented in Appendix B of the -;; Org-mode manual. +;; Org-mode manual. The code is not specific for the iPhone, however. +;; Any external viewer and flagging application that uses the same +;; conventions could be used. (require 'org) (require 'org-agenda) @@ -37,6 +39,26 @@ :tag "Org Mobile" :group 'org) +(defcustom org-mobile-files '(org-agenda-files) + "Files to be staged for MobileOrg. +This is basically a list of filesand directories. Files will be staged +directly. Directories will be search for files with the extension `.org'. +In addition to this, the list may also contain the following symbols: + +org-agenda-files + This means, include the complete, unrestricted list of files given in + the variable `org-agenda-files'. +org-agenda-text-search-extra-files + Include the files given in the variable + `org-agenda-text-search-extra-files'" + :group 'org-mobile + :type '(list :greedy t + (option (const :tag "org-agenda-files" org-agenda-files)) + (option (const :tag "org-agenda-text-search-extra-files" + org-agenda-text-search-extra-files)) + (repeat :inline t :tag "Additional files" + (file)))) + (defcustom org-mobile-directory "" "The WebDAV directory where the interaction with the mobile takes place." :group 'org-mobile @@ -115,6 +137,43 @@ using `rsync' or `scp'.") (defvar org-mobile-last-flagged-files nil "List of files containing entreis flagged in the latest pull.") +(defvar org-mobile-files-alist nil) +(defvar org-mobile-checksum-files nil) + +(defun org-mobile-prepare-file-lists () + (setq org-mobile-files-alist (org-mobile-files-alist)) + (setq org-mobile-checksum-files (mapcar 'cdr org-mobile-files-alist))) + +(defun org-mobile-files-alist () + "Expand the list in `org-mobile-files' to a list of existing files." + (let* ((files + (apply 'append (mapcar + (lambda (f) + (cond + ((eq f 'org-agenda-files) (org-agenda-files t)) + ((eq f 'org-agenda-text-search-extra-files) + org-agenda-text-search-extra-files) + ((and (stringp f) (file-directory-p f)) + (directory-files f 'full "\\.org\\'")) + ((and (stringp f) (file-exists-p f)) + (list f)) + (t nil))) + org-mobile-files))) + (orgdir-uname (file-name-as-directory (file-truename org-directory))) + (orgdir-re (concat "\\`" (regexp-quote orgdir-uname))) + uname seen rtn) + ;; Make the files unique, and determine the name under which they will + ;; be listed. + (while (setq file (pop files)) + (setq uname (file-truename file)) + (unless (member uname seen) + (push uname seen) + (if (string-match orgdir-re uname) + (setq link-name (substring uname (match-end 0))) + (setq link-name (file-name-nondirectory uname))) + (push (cons file link-name) rtn))) + (nreverse rtn))) + ;;;###autoload (defun org-mobile-push () "Push the current state of Org affairs to the WebDAV directory. @@ -122,6 +181,7 @@ This will create the index file, copy all agenda files there, and also create all custom agenda views, for upload to the mobile phone." (interactive) (org-mobile-check-setup) + (org-mobile-prepare-file-lists) (run-hooks 'org-mobile-pre-push-hook) (org-mobile-create-sumo-agenda) (org-save-all-org-buffers) ; to save any IDs created by this process @@ -222,8 +282,8 @@ agenda view showing the flagged items." (save-excursion (setq buf (find-file file)) (insert "\n") - (save-buffer) - (kill-buffer buf))))) + (save-buffer)) + (kill-buffer buf)))) (defun org-mobile-write-checksums () "Create checksums for all files in `org-mobile-directory'. @@ -231,12 +291,19 @@ The table of checksums is written to the file mobile-checksums." (let ((cmd (cond ((executable-find "shasum")) ((executable-find "sha1sum")) ((executable-find "md5sum")) - ((executable-find "md5"))))) + ((executable-find "md5")))) + (files org-mobile-checksum-files)) (if (not cmd) (message "Checksums could not be generated: no executable") (with-temp-buffer (cd org-mobile-directory) - (if (equal 0 (shell-command (concat cmd " *.org > checksums.dat"))) + (if (file-exists-p "agendas.org") + (push "agendas.org" files)) + (if (file-exists-p "mobileorg.org") + (push "mobileorg.org" files)) + (setq cmd (concat cmd " " (mapconcat 'shell-quote-argument files " ") + " > checksums.dat")) + (if (equal 0 (shell-command cmd)) (message "Checksums written") (message "Checksums could not be generated"))))))