emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] 04/09: Expire project info in ggtags-update-tags


From: Leo Liu
Subject: [elpa] 04/09: Expire project info in ggtags-update-tags
Date: Tue, 18 Feb 2014 02:56:16 +0000

leoliu pushed a commit to branch master
in repository elpa.

commit e2f0d3be78fdddf7a9ccd4bc885ec4313970fb49
Author: Leo Liu <address@hidden>
Date:   Thu Feb 13 17:59:45 2014 +0800

    Expire project info in ggtags-update-tags
    
    1. Tweak ggtags-project-expired-p to treat negative timestamp as
       expiration.
    2. Enhance ggtags-make-project to allow updating project info.
    3. Teach ggtags-find-project to update project info if expired so that
       all buffer-local values of ggtags-project get the new value.
---
 ggtags.el |   44 +++++++++++++++++++++++++++-----------------
 1 files changed, 27 insertions(+), 17 deletions(-)

diff --git a/ggtags.el b/ggtags.el
index a511d25..1b64973 100644
--- a/ggtags.el
+++ b/ggtags.el
@@ -286,7 +286,7 @@ properly update `ggtags-mode-map'."
   (when-let (bounds (funcall ggtags-bounds-of-tag-function))
     (buffer-substring (car bounds) (cdr bounds))))
 
-;;; Store for project settings
+;;; Store for project info and settings
 
 (defvar ggtags-projects (make-hash-table :size 7 :test #'equal))
 
@@ -297,6 +297,7 @@ properly update `ggtags-mode-map'."
   root tag-size has-rtags dirty-p timestamp)
 
 (defun ggtags-make-project (root)
+  "Create or update project info for ROOT."
   (check-type root string)
   (let* ((default-directory (file-name-as-directory root))
          (tag-size (or (nth 7 (file-attributes "GTAGS")) -1))
@@ -305,18 +306,23 @@ properly update `ggtags-mode-map'."
           (when rtags-size
             (or (> rtags-size (* 32 1024))
                 (with-demoted-errors
-                  (not (equal "" (ggtags-process-string "global" "-crs"))))))))
-    (puthash default-directory (ggtags-project--make
-                                :root default-directory :has-rtags has-rtags
-                                :tag-size tag-size :timestamp (float-time))
-             ggtags-projects)))
+                  (not (equal "" (ggtags-process-string "global" "-crs")))))))
+         (project (or (gethash default-directory ggtags-projects)
+                      (puthash default-directory
+                               (ggtags-project--make :root default-directory)
+                               ggtags-projects))))
+    (setf (ggtags-project-has-rtags project) has-rtags
+          (ggtags-project-tag-size project) tag-size
+          (ggtags-project-timestamp project) (float-time))
+    project))
 
 (defvar-local ggtags-project 'unset)
 
 (defun ggtags-project-expired-p (project)
-  (> (- (float-time)
-        (ggtags-project-timestamp project))
-     ggtags-project-duration))
+  (or (< (ggtags-project-timestamp project) 0)
+      (> (- (float-time)
+            (ggtags-project-timestamp project))
+         ggtags-project-duration)))
 
 (defun ggtags-project-oversize-p (&optional project)
   (pcase ggtags-oversize-limit
@@ -328,11 +334,10 @@ properly update `ggtags-mode-map'."
 ;;;###autoload
 (defun ggtags-find-project ()
   (if (ggtags-project-p ggtags-project)
-      (if (not (ggtags-project-expired-p ggtags-project))
-          ggtags-project
-        (remhash (ggtags-project-root ggtags-project) ggtags-projects)
-        (kill-local-variable 'ggtags-project)
-        (ggtags-find-project))
+      (if (ggtags-project-expired-p ggtags-project)
+          ;; Update the project info by side-effect.
+          (ggtags-make-project (ggtags-project-root ggtags-project))
+        ggtags-project)
     (let ((root (or (ignore-errors (file-name-as-directory
                                     ;; Resolves symbolic links
                                     (ggtags-process-string "global" "-pr")))
@@ -342,10 +347,11 @@ properly update `ggtags-mode-map'."
                     ;; let's help it out.
                     (when-let (gtags (locate-dominating-file
                                       default-directory "GTAGS"))
-                      (file-truename gtags)))))
+                              (file-truename gtags)))))
       (setq ggtags-project
             (and root (or (gethash root ggtags-projects)
-                          (ggtags-make-project root)))))))
+                          (ggtags-make-project root))))
+      (and ggtags-project (ggtags-find-project)))))
 
 (defun ggtags-current-project-root ()
   (and (ggtags-find-project)
@@ -436,7 +442,11 @@ properly update `ggtags-mode-map'."
   "Update GNU Global tag database.
 Do nothing if GTAGS exceeds the oversize limit unless FORCE is
 non-nil."
-  (interactive "p")
+  (interactive (progn
+                 (ggtags-check-project)
+                 ;; Mark project info expired.
+                 (setf (ggtags-project-timestamp (ggtags-find-project)) -1)
+                 (list t)))
   (when (or force (and (ggtags-find-project)
                        (not (ggtags-project-oversize-p))
                        (ggtags-project-dirty-p (ggtags-find-project))))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]