From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from localhost (localhost [127.0.0.1]) by arlo.cworth.org (Postfix) with ESMTP id E11FA6DE0C7A for ; Sun, 20 Nov 2016 08:50:44 -0800 (PST) X-Virus-Scanned: Debian amavisd-new at cworth.org X-Spam-Flag: NO X-Spam-Score: 0.064 X-Spam-Level: X-Spam-Status: No, score=0.064 tagged_above=-999 required=5 tests=[AWL=-0.066, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=-0.01, RCVD_IN_MSPIKE_WL=-0.01, SPF_PASS=-0.001] autolearn=disabled Received: from arlo.cworth.org ([127.0.0.1]) by localhost (arlo.cworth.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id D-9zwa5BTNLw for ; Sun, 20 Nov 2016 08:50:44 -0800 (PST) Received: from mail-wm0-f65.google.com (mail-wm0-f65.google.com [74.125.82.65]) by arlo.cworth.org (Postfix) with ESMTPS id 573DE6DE0C3A for ; Sun, 20 Nov 2016 08:50:42 -0800 (PST) Received: by mail-wm0-f65.google.com with SMTP id m203so20307226wma.3 for ; Sun, 20 Nov 2016 08:50:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=otHtU/8LMt6eqdXxBlLgHSGl8s5Me7bYuJ2o2uQgccs=; b=VyuFKOVykcjW/JH9Fnp/6Apfqk3ZDgv36CRWG5n38TP/8f7vasW9KcLLNrZ02/P4fx 1Tsdd9tSrvSidt2+owkCfC7jJhPVgYzWKd/oDcsc5Tkyx+KbiYXaj8QyxwW5S+1JSTYL FST1+kppnCDyiZOheoTu2c3vpZ8Mw+wNNi7A22pvknNQimDymteKr0aFacGbkZoqFFLZ gUZL2HT3n0OqE1v6GnMAiTxthEABMVg8vrJZRftdk1AVE1DYdkm0TE7+c4AKUz1tgYLZ GAEsuBCOEEcPQ2Kze8kPdGge4VE5ShBaUENwGrwe+cZUSRNINaymEC3laxRh5bHJF8s/ B1/A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=otHtU/8LMt6eqdXxBlLgHSGl8s5Me7bYuJ2o2uQgccs=; b=a+Hou31mcDsgpyzVGE97EwJWEpi+mweZxgOV1zrfd9SrLLXhCzGE219vQrGZzOFner gx9GfcfcUtWSHlJGxp68bLlBBPg0BG64Euye+UTERkvH1PtcIK6Ltmsdo+/kVJBiskD6 IuJkgCFPC+YlMxqKn64D/0xdRdqzv5JgUoZejuUa3Eg6U/6O5i9ax3QtwOAAnfW831Sv A4+TQif2iCw6ijQP7FOlRAZB6eynhMiOL+61f8QEU/eNCvTw2gPZkYWzwi4eYWBnNayw qzlX5tyivHM6eEuc8ZXtWAGE9J8pmBd9t70c1TPqbKEjth4Oye569afSpe5wfyDcL/l8 7ikw== X-Gm-Message-State: AKaTC03ZpKDgMFlkvphiWqY7ckqu2ECl7/AKHuQzrBsxdp3FhCzg/cz04p8KfXSm2gG68w== X-Received: by 10.28.164.196 with SMTP id n187mr8560958wme.44.1479660640559; Sun, 20 Nov 2016 08:50:40 -0800 (PST) Received: from localhost (5751dfa2.skybroadband.com. [87.81.223.162]) by smtp.gmail.com with ESMTPSA id e6sm20183047wjw.33.2016.11.20.08.50.39 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 20 Nov 2016 08:50:40 -0800 (PST) From: Mark Walters To: notmuch@notmuchmail.org Subject: [PATCH 2/2] emacs: address: save hash Date: Sun, 20 Nov 2016 16:50:34 +0000 Message-Id: <1479660634-17956-3-git-send-email-markwalters1009@gmail.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1479660634-17956-1-git-send-email-markwalters1009@gmail.com> References: <1479660634-17956-1-git-send-email-markwalters1009@gmail.com> X-BeenThere: notmuch@notmuchmail.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: "Use and development of the notmuch mail system." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 20 Nov 2016 16:50:45 -0000 This allows the user to save the address hash so that it is much faster for the first completion after a restart. This defaults to off as there are privacy implications to saving this information. The code tries hard to avoid overwriting the wrong file. It also notes if changes have been made to any of the relevant user settings, so that the user does not get surprising results (i.e., outdated options being used). Finally it stores some version information so that is easy for us to update the format of the save file. --- emacs/notmuch-address.el | 83 +++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 79 insertions(+), 4 deletions(-) diff --git a/emacs/notmuch-address.el b/emacs/notmuch-address.el index 2eaca79..15c709d 100644 --- a/emacs/notmuch-address.el +++ b/emacs/notmuch-address.el @@ -37,11 +37,15 @@ (defvar notmuch-address-full-harvest-finished nil "t indicates that full completion address harvesting has been -finished. Use notmuch-address--harvest-ready to access.") +finished. Use notmuch-address--harvest-ready to access as that +will load a saved hash if necessary (and available).") (defun notmuch-address--harvest-ready () - "Return t if there is a full address hash available." - notmuch-address-full-harvest-finished) + "Return t if there is a full address hash available. + +If the hash is not present it attempts to load a saved hash." + (or notmuch-address-full-harvest-finished + (notmuch-address--load-address-hash))) (defcustom notmuch-address-command 'internal "Determines how address completion candidates are generated. @@ -91,6 +95,17 @@ This should be a list of the form '(DIRECTION FILTER), where :group 'notmuch-send :group 'notmuch-external) +(defcustom notmuch-address-save-filename nil + "Filename to save the cached completion addresses. + +All the addresses notmuch uses for address completion will be +cached in this file. This has obvious privacy implications so you +should make sure it is not somewhere publicly readable." + :type '(choice (const :tag "Off" nil) + (file :tag "Filename")) + :group 'notmuch-send + :group 'notmuch-external) + (defcustom notmuch-address-selection-function 'notmuch-address-selection-function "The function to select address from given list. The function is called with PROMPT, COLLECTION, and INITIAL-INPUT as arguments @@ -327,6 +342,64 @@ execution, CALLBACK is called when harvesting finishes." ;; return value nil) +(defvar notmuch-address--save-hash-version 1 + "Version format of the save hash.") + +(defun notmuch-address--get-address-hash () + "Returns the saved address hash as a plist. + +Returns nil if the save file does not exist, or it does not seem +to be a saved address hash." + (when notmuch-address-save-filename + (condition-case nil + (with-temp-buffer + (insert-file-contents notmuch-address-save-filename) + (let ((name (read (current-buffer))) + (plist (read (current-buffer)))) + ;; We do two simple sanity checks on the loaded file. We just + ;; check a version is specified, not that it is the current + ;; version, as we are allowed to over-write and a save-file with + ;; an older version. + (when (and (string= name "notmuch-address-hash") + (plist-get plist :version)) + plist))) + ;; The error case catches any of the reads failing. + (error nil)))) + +(defun notmuch-address--load-address-hash () + "Read the saved address hash and set the corresponding variables." + (let ((load-plist (notmuch-address--get-address-hash))) + (when (and load-plist + ;; If the user's setting have changed, or the version + ;; has changed, return nil to make sure the new settings + ;; take effect. + (equal (plist-get load-plist :completion-settings) + notmuch-address-internal-completion) + (equal (plist-get load-plist :version) + notmuch-address--save-hash-version)) + (setq notmuch-address-last-harvest (plist-get load-plist :last-harvest) + notmuch-address-completions (plist-get load-plist :completions) + notmuch-address-full-harvest-finished t) + ;; Return t to say load was successful. + t))) + +(defun notmuch-address--save-address-hash () + (when notmuch-address-save-filename + (if (or (not (file-exists-p notmuch-address-save-filename)) + ;; The file exists, check it is a file we saved + (notmuch-address--get-address-hash)) + (with-temp-file notmuch-address-save-filename + (let ((save-plist (list :version notmuch-address--save-hash-version + :completion-settings notmuch-address-internal-completion + :last-harvest notmuch-address-last-harvest + :completions notmuch-address-completions))) + (print "notmuch-address-hash" (current-buffer)) + (print save-plist (current-buffer)))) + (message "\ +Warning: notmuch-address-save-filename %s exists but doesn't +appear to be an address savefile. Not overwriting." + notmuch-address-save-filename)))) + (defun notmuch-address-harvest-trigger () (let ((now (float-time))) (when (> (- now notmuch-address-last-harvest) 86400) @@ -337,7 +410,9 @@ execution, CALLBACK is called when harvesting finishes." ;; again when the trigger is next ;; called (if (string= event "finished\n") - (setq notmuch-address-full-harvest-finished t) + (progn + (notmuch-address--save-address-hash) + (setq notmuch-address-full-harvest-finished t)) (setq notmuch-address-last-harvest 0))))))) ;; -- 2.1.4