summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarsten Dominik <carsten.dominik@gmail.com>2009-09-28 19:25:50 +0100
committerCarsten Dominik <carsten.dominik@gmail.com>2009-09-28 19:25:50 +0100
commitd90df8b1471df902995170ead19104661eabfb6e (patch)
tree161f2be29e9280ca89bb32534d177b1668d4db27
parent7baa702f653a0f0c74394bb2c7db562dbf99ac19 (diff)
downloadorg-mode-d90df8b1471df902995170ead19104661eabfb6e.tar.gz
org-mobile.el: More flexibility to add files
The new variable org-mobile-files can now be configured to include non-agenda files into the staging area for MobileOrg. Furthermore, files that are located in a subdirectory of `org-directory' will also end up in a sub-directory in the staging area.
-rw-r--r--doc/ChangeLog4
-rw-r--r--doc/org.texi36
-rwxr-xr-xlisp/ChangeLog9
-rw-r--r--lisp/org-mobile.el77
4 files changed, 105 insertions, 21 deletions
diff --git a/doc/ChangeLog b/doc/ChangeLog
index 255aa5d..71f739c 100644
--- a/doc/ChangeLog
+++ b/doc/ChangeLog
@@ -1,3 +1,7 @@
+2009-09-28 Carsten Dominik <carsten.dominik@gmail.com>
+
+ * org.texi (Pushing to MobileOrg): Document `org-mobile-files'.
+
2009-09-26 Carsten Dominik <carsten.dominik@gmail.com>
* org.texi (Processing LaTeX fragments): Document that the size of
diff --git a/doc/org.texi b/doc/org.texi
index f415eec..bd84858 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 f828ea8..daa78c7 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 83136c7..48527cd 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"))))))