diff --git a/init.el b/init.el index 8b9ade5..1da28b9 100644 --- a/init.el +++ b/init.el @@ -37,29 +37,32 @@ PACKAGE is installed and the current version is deleted." (defvar days-between-updates 1) (defvar do-package-update-on-init t) +(defvar package-last-update-file + (expand-file-name (concat user-emacs-directory ".package-last-update"))) (require 'time-stamp) -;; Open the 'user-init-file' and write any changes. -(with-temp-file user-init-file - ;; Insert it's original content's. - (insert-file-contents user-init-file) - (forward-line time-stamp-line-limit) - (let ((bound (point))) - (goto-char (point-min)) - ;; We search for the time-stamp. - (let ((start (re-search-forward time-stamp-start bound t)) - (end (re-search-forward time-stamp-end bound t))) - (when (and start end) - ;; Assuming we have found a time-stamp, we check determine if it's - ;; time to update. - (setq do-package-update-on-init - (<= days-between-updates - (days-between - (current-time-string) - (buffer-substring-no-properties start end)))) - ;; Remember to update the time-stamp. - (when do-package-update-on-init - (time-stamp)))))) +;; Open the package-last-update-file +(with-temp-file package-last-update-file + (if (file-exists-p package-last-update-file) + (progn + ;; Insert it's original content's. + (insert-file-contents package-last-update-file) + (let ((start (re-search-forward time-stamp-start nil t)) + (end (re-search-forward time-stamp-end nil t))) + (when (and start end) + ;; Assuming we have found a time-stamp, we check determine if it's + ;; time to update. + (setq do-package-update-on-init + (<= days-between-updates + (days-between + (current-time-string) + (buffer-substring-no-properties start end)))) + ;; Remember to update the time-stamp. + (when do-package-update-on-init + (time-stamp))))) + ;; If no such file exists it is created with a time-stamp. + (insert "Time-stamp: <>") + (time-stamp))) (when do-package-update-on-init (package-refresh-contents)) diff --git a/init.org b/init.org index ac4ac54..5ab61cb 100644 --- a/init.org +++ b/init.org @@ -85,45 +85,49 @@ The =package-refresh-contents= function downloads archive descriptions, this is a major bottleneck in this configuration. To avoid this we can - try to only check for updates once every day or so. Here are to + try to only check for updates once every day or so. Here are three variables. The first specifies how often we should check for updates. The - second specifies wither one should update during the initialization. + second specifies wither one should update during the initialization. The + third is a path to a file where a time-stamp is stored in order to check + when packages were updated last. #+BEGIN_SRC emacs-lisp :tangle yes (defvar days-between-updates 1) (defvar do-package-update-on-init t) + (defvar package-last-update-file + (expand-file-name (concat user-emacs-directory ".package-last-update"))) #+END_SRC The tricky part is figuring out when the last time the Emacs was updated! Here is a hacky way of doing it, using [[http://www.gnu.org/software/emacs/manual/html_node/emacs/Time-Stamps.html][time-stamps]]. By adding a - time-stamp to the init file, we can search for it and determine wither or - not to do an update. After that we must run the =time-stamp=-function to - update the time-stamp. Note that if there is no time-stamp in the - init-file then packages will be updated every time you start Emacs. + time-stamp to the a file, we can determine wither or not to do an + update. After that we must run the =time-stamp=-function to update the + time-stamp. #+BEGIN_SRC emacs-lisp :tangle yes (require 'time-stamp) - ;; Open the 'user-init-file' and write any changes. - (with-temp-file user-init-file - ;; Insert it's original content's. - (insert-file-contents user-init-file) - (forward-line time-stamp-line-limit) - (let ((bound (point))) - (goto-char (point-min)) - ;; We search for the time-stamp. - (let ((start (re-search-forward time-stamp-start bound t)) - (end (re-search-forward time-stamp-end bound t))) - (when (and start end) - ;; Assuming we have found a time-stamp, we check determine if it's - ;; time to update. - (setq do-package-update-on-init - (<= days-between-updates - (days-between - (current-time-string) - (buffer-substring-no-properties start end)))) - ;; Remember to update the time-stamp. - (when do-package-update-on-init - (time-stamp)))))) + ;; Open the package-last-update-file + (with-temp-file package-last-update-file + (if (file-exists-p package-last-update-file) + (progn + ;; Insert it's original content's. + (insert-file-contents package-last-update-file) + (let ((start (re-search-forward time-stamp-start nil t)) + (end (re-search-forward time-stamp-end nil t))) + (when (and start end) + ;; Assuming we have found a time-stamp, we check determine if it's + ;; time to update. + (setq do-package-update-on-init + (<= days-between-updates + (days-between + (current-time-string) + (buffer-substring-no-properties start end)))) + ;; Remember to update the time-stamp. + (when do-package-update-on-init + (time-stamp))))) + ;; If no such file exists it is created with a time-stamp. + (insert "Time-stamp: <>") + (time-stamp))) #+END_SRC Now we can use the function above to make sure packages are installed and