From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Phil Sainty Newsgroups: gmane.emacs.devel Subject: Re: PACKAGE-FEATURES, and hot update of Emacs packages Date: Sun, 28 Nov 2021 01:16:22 +1300 Message-ID: References: <5C502136-57BD-40D4-A1E8-A4313AD7CDFC@stanford.edu> Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII; format=flowed Content-Transfer-Encoding: 7bit Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="32042"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Orcon Webmail Cc: emacs-devel@gnu.org To: Qiantan Hong Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Sat Nov 27 13:19:59 2021 Return-path: Envelope-to: ged-emacs-devel@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1mqwgR-0008CN-Ar for ged-emacs-devel@m.gmane-mx.org; Sat, 27 Nov 2021 13:19:59 +0100 Original-Received: from localhost ([::1]:55326 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mqwgP-0007KZ-TP for ged-emacs-devel@m.gmane-mx.org; Sat, 27 Nov 2021 07:19:57 -0500 Original-Received: from eggs.gnu.org ([209.51.188.92]:37836) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mqwd6-0004hf-5e for emacs-devel@gnu.org; Sat, 27 Nov 2021 07:16:32 -0500 Original-Received: from smtp-2.orcon.net.nz ([60.234.4.43]:49557) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mqwd4-0004e0-GC for emacs-devel@gnu.org; Sat, 27 Nov 2021 07:16:31 -0500 Original-Received: from [10.253.37.70] (port=37730 helo=webmail.orcon.net.nz) by smtp-2.orcon.net.nz with esmtpa (Exim 4.90_1) (envelope-from ) id 1mqwcx-0007q6-4U; Sun, 28 Nov 2021 01:16:23 +1300 Original-Received: from ip-115-69-175-77.kinect.net.nz ([115.69.175.77]) via [10.253.37.253] by webmail.orcon.net.nz with HTTP (HTTP/1.1 POST); Sun, 28 Nov 2021 01:16:22 +1300 In-Reply-To: <5C502136-57BD-40D4-A1E8-A4313AD7CDFC@stanford.edu> X-Sender: psainty@orcon.net.nz X-GeoIP: -- Received-SPF: pass client-ip=60.234.4.43; envelope-from=psainty@orcon.net.nz; helo=smtp-2.orcon.net.nz X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Original-Sender: "Emacs-devel" Xref: news.gmane.io gmane.emacs.devel:280334 Archived-At: On 2021-11-27 22:31, Qiantan Hong wrote: > Then to really update p, one just need to > > (mapc (lambda (feature) (unload-feature feature t)) (package-features > p)) > (package-reinstall p) > (require p) Unloading a feature will trash the user's configuration, and so when you load the updated library only the default config will be set -- unless the user used `eval-after-load' (which certainly can't be assumed). As such, I don't think that could work as a reliable "hot update" process. My approach to this general issue (in libraries I've written) has been to detect at load time if the user had an older version of the library loaded, and to perform any appropriate in-place upgrades. E.g.: https://git.savannah.gnu.org/cgit/emacs.git/tree/lisp/so-long.el?id=aebba085cba1#n2012 This does require that the code knows both the previously-loaded and newly-loaded version numbers, which can be tricky if the previous version of the code wasn't storing its version; so I think it would be great if Emacs *automatically* tracked this information for packages (or any library that supplies a version) so that authors could write such update code without needing to have previously prepared for it. I don't think this currently happens. I can see the functions `package-get-version' and `package-desc-version' (which can be used with `package-alist'), but haven't spotted anything which is storing the version of a package that is/was loaded (and I don't think this information is as easily accessible when loading byte-compiled files, as version comments don't appear in the .elc file). I suppose (package-desc-version (package-load-descriptor DIR)) can be used for ELPA packages installed in the standard way, so maybe there's scope for using that; but I suspect that'd be too brittle an approach, as there are many non-standard ways of loading things. -Phil