unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
From: "Евгений Бойков via Bug reports for GNU Emacs, the Swiss army knife of text editors" <bug-gnu-emacs@gnu.org>
To: Stefan Monnier <monnier@iro.umontreal.ca>
Cc: Philip Kaludercic <philipk@posteo.net>,
	63757@debbugs.gnu.org, Eli Zaretskii <eliz@gnu.org>
Subject: bug#63757: 29.0.91 order of package paths changed: random old versions of packages in load-path
Date: Sun, 4 Jun 2023 15:37:31 +1000	[thread overview]
Message-ID: <CAKOwOe69tmtzL73iGDx6Bs6bBP06X5zkzvxsSwnaXa342KfDCQ@mail.gmail.com> (raw)
In-Reply-To: <CAKOwOe7R4QA81SSp+0ft8fGRQJfey=j1cs5qY0W-tHJH2Z7s=g@mail.gmail.com>

[-- Attachment #1: Type: text/plain, Size: 10296 bytes --]

Excuse me for extra messages, I've already found a bug in the previous
patch.
I need a review, especially with in-place operations.

move "Prefer VC packages" to `package-process-define-package`
drop `package-disabled-p` and "Prefer builtin packages" comment

diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el
index ba0e3618f28..87c57990705 100644
--- a/lisp/emacs-lisp/package.el
+++ b/lisp/emacs-lisp/package.el
@@ -686,7 +686,7 @@ Convert EXP into a `package-desc' object using the

 If there already exists a package by the same name in
 `package-alist', insert this object there such that the packages
-are sorted with the highest version first."
+are sorted with VC packages first and the highest version second."
   (when (eq (car-safe exp) 'define-package)
     (let* ((new-pkg-desc (apply #'package-desc-from-define (cdr exp)))
            (name (package-desc-name new-pkg-desc))
@@ -696,13 +696,29 @@ are sorted with the highest version first."
           ;; If there's no old package, just add this to `package-alist'.
           (push (list name new-pkg-desc) package-alist)
         ;; If there is, insert the new package at the right place in the
list.
-        (while
-            (if (and (cdr old-pkgs)
-                     (version-list-< version
-                                     (package-desc-version (cadr
old-pkgs))))
-                (setq old-pkgs (cdr old-pkgs))
-              (push new-pkg-desc (cdr old-pkgs))
-              nil)))
+        (progn
+          ;; Prefer newer packages
+          (while
+              (if (and (cdr old-pkgs)
+                       (version-list-< version
+                                       (package-desc-version (cadr
old-pkgs))))
+                  (setq old-pkgs (cdr old-pkgs))
+                (push new-pkg-desc (cdr old-pkgs))
+                nil))
+          ;; Prefer VC packages with greater priority than newer packages
+          (let* ((pkg-desc
+                  (apply 'append
+                         (cl-reduce
+                          (lambda (p1 p2)
+                            (if (package-vc-p p1)
+                                (push p1 (cl-first p2))
+                              (push p1 (cl-second p2)))
+                            p2)
+                          (cdr (assq name package-alist))
+                          :initial-value (list nil nil)
+                          :from-end t))))
+            (setf (cdr (assq name package-alist)) pkg-desc)
+            (setq new-pkg-desc (car pkg-desc)))))
       new-pkg-desc)))

 (declare-function package-vc-commit "package-vc" (pkg))
@@ -916,17 +932,7 @@ correspond to previously loaded files."

 (defun package--get-activatable-pkg (pkg-name)
   ;; Is "activatable" a word?
-  (let ((pkg-descs (sort (cdr (assq pkg-name package-alist))
-                         (lambda (p1 p2)
-                           (let ((v1 (package-desc-version p1))
-                                 (v2 (package-desc-version p2)))
-                             (or
-                              ;; Prefer VC packages.
-                              (package-vc-p p1)
-                              (package-vc-p p2)
-                              ;; Prefer builtin packages.
-                              (package-disabled-p p1 v1)
-                              (not (package-disabled-p p2 v2))))))))
+  (let ((pkg-descs (cdr (assq pkg-name package-alist))))
     ;; Check if PACKAGE is available in `package-alist'.
     (while
         (when pkg-descs

On Sun, Jun 4, 2023 at 2:46 PM Евгений Бойков <artscan@list.ru> wrote:

> move "Prefer VC packages" to `package-process-define-package`
> drop `package-disabled-p` and "Prefer builtin packages" comment
>
>
> diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el
> index ba0e3618f28..65ec07b945a 100644
> --- a/lisp/emacs-lisp/package.el
> +++ b/lisp/emacs-lisp/package.el
> @@ -686,7 +686,7 @@ Convert EXP into a `package-desc' object using the
>
>  If there already exists a package by the same name in
>  `package-alist', insert this object there such that the packages
> -are sorted with the highest version first."
> +are sorted with VC packages first and the highest version second."
>    (when (eq (car-safe exp) 'define-package)
>      (let* ((new-pkg-desc (apply #'package-desc-from-define (cdr exp)))
>             (name (package-desc-name new-pkg-desc))
> @@ -696,13 +696,30 @@ are sorted with the highest version first."
>            ;; If there's no old package, just add this to `package-alist'.
>            (push (list name new-pkg-desc) package-alist)
>          ;; If there is, insert the new package at the right place in the
> list.
> -        (while
> -            (if (and (cdr old-pkgs)
> -                     (version-list-< version
> -                                     (package-desc-version (cadr
> old-pkgs))))
> -                (setq old-pkgs (cdr old-pkgs))
> -              (push new-pkg-desc (cdr old-pkgs))
> -              nil)))
> +        (progn
> +          ;; Prefer newer packages
> +          (while
> +              (if (and (cdr old-pkgs)
> +                       (version-list-< version
> +                                       (package-desc-version (cadr
> old-pkgs))))
> +                  (setq old-pkgs (cdr old-pkgs))
> +                (push new-pkg-desc (cdr old-pkgs))
> +                nil))
> +          ;; Prefer VC packages
> +          (let* ((pkg-desc0 (cdr (assq name package-alist)))
> +                 (pkg-desc
> +                  (apply 'append
> +                         (cl-reduce
> +                          (lambda (p1 p2)
> +                            (if (package-vc-p p1)
> +                                (push p1 (cl-first p2))
> +                              (push p1 (cl-second p2)))
> +                            p2)
> +                          pkg-desc0
> +                          :initial-value (list nil nil)
> +                          :from-end t))))
> +            (setf pkg-desc0 pkg-desc)
> +            (setq new-pkg-desc (car pkg-desc)))))
>        new-pkg-desc)))
>
>  (declare-function package-vc-commit "package-vc" (pkg))
> @@ -916,17 +933,7 @@ correspond to previously loaded files."
>
>  (defun package--get-activatable-pkg (pkg-name)
>    ;; Is "activatable" a word?
> -  (let ((pkg-descs (sort (cdr (assq pkg-name package-alist))
> -                         (lambda (p1 p2)
> -                           (let ((v1 (package-desc-version p1))
> -                                 (v2 (package-desc-version p2)))
> -                             (or
> -                              ;; Prefer VC packages.
> -                              (package-vc-p p1)
> -                              (package-vc-p p2)
> -                              ;; Prefer builtin packages.
> -                              (package-disabled-p p1 v1)
> -                              (not (package-disabled-p p2 v2))))))))
> +  (let ((pkg-descs (cdr (assq pkg-name package-alist))))
>      ;; Check if PACKAGE is available in `package-alist'.
>      (while
>          (when pkg-descs
>
>
> On Sun, Jun 4, 2023 at 12:06 AM Stefan Monnier <monnier@iro.umontreal.ca>
> wrote:
>
>> >> Won't this work:
>> >>
>> >> diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el
>> >> index 01826da273d..7eb185e7042 100644
>> >> --- a/lisp/emacs-lisp/package.el
>> >> +++ b/lisp/emacs-lisp/package.el
>> >> @@ -927,7 +927,9 @@ package--get-activatable-pkg
>> >>                                (package-vc-p p2)
>> >>                                ;; Prefer builtin packages.
>> >>                                (package-disabled-p p1 v1)
>> >> -                              (not (package-disabled-p p2 v2))))))))
>> >> +                              (not (package-disabled-p p2 v2))
>> >> +                              ;; Prever newer packages
>> >> +                              (version-list-< v2 v1)))))))
>> >>      ;; Check if PACKAGE is available in `package-alist'.
>> >>      (while
>> >>          (when pkg-descs
>> >
>> > Ping?
>>
>> The packages should already be sorted by version in `package-alist`, so
>> at best this will paper over the problem.  This said, the `sort` call's
>> predicate looks weird indeed:
>>
>>                          (lambda (p1 p2)
>>                            (let ((v1 (package-desc-version p1))
>>                                  (v2 (package-desc-version p2)))
>>                              (or
>>                               ;; Prefer VC packages.
>>                               (package-vc-p p1)
>>                               (package-vc-p p2)
>>                               ;; Prefer builtin packages.
>>                               (package-disabled-p p1 v1)
>>                               (not (package-disabled-p p2 v2))))))))
>>
>> - If both p1 and p2 are VC, then it will return non-nil, so
>>   they're both "strictly less than" the other :-(
>> - If neither is VC nor disabled, we return non-nil, which again means
>> they're
>>    both "strictly less than" the other.
>> - The comment says "Prefer builtin packages" but the code checks
>>   `package-disabled-p`.
>>
>> And now that I look more carefully, maybe this `sort` is the culprit
>> after all, because it operates directly on the list contained in
>> `packages-alist`, modifying it in-place :-(
>>
>> I think we should *not* sort here: we should instead sort when we
>> populate `package-alist` (like we already do).  So the "Prefer VC" part
>> of the sorting should be moved to `package-process-define-package`
>> (and the `package-disabled-p` can be dropped because it's already taken
>> care of by the loop that follows the above code).
>>
>>
>>         Stefan
>>
>>
>
> --
> __________________________
>
> С уважением,
> Бойков Евгений Алексеевич
> сот. 8-924-202-25-65
> e-mail: artscan@list.ru
>


-- 
__________________________

С уважением,
Бойков Евгений Алексеевич
сот. 8-924-202-25-65
e-mail: artscan@list.ru

[-- Attachment #2: Type: text/html, Size: 13147 bytes --]

  reply	other threads:[~2023-06-04  5:37 UTC|newest]

Thread overview: 65+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-05-27 16:30 bug#63757: 29.0.91 order of package paths changed: random old versions of packages in load-path Евгений Бойков via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-05-29 11:09 ` Eli Zaretskii
2023-05-29 14:24   ` Philip Kaludercic
2023-06-03 10:19     ` Philip Kaludercic
2023-06-03 10:38       ` Eli Zaretskii
2023-06-03 11:50         ` Евгений Бойков via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-06-03 12:53           ` Евгений Бойков via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-06-03 13:33             ` Евгений Бойков via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-06-03 14:06       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-06-04  4:46         ` Евгений Бойков via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-06-04  5:37           ` Евгений Бойков via Bug reports for GNU Emacs, the Swiss army knife of text editors [this message]
2023-06-04  5:41             ` Eli Zaretskii
2023-06-04  7:47               ` Philip Kaludercic
2023-06-04  8:03                 ` Eli Zaretskii
2023-06-04  9:19                   ` Philip Kaludercic
2023-06-04 10:14                     ` Eli Zaretskii
2023-06-04 11:39                       ` Philip Kaludercic
2023-06-04 12:08                         ` Eli Zaretskii
2023-06-04 12:12                           ` Philip Kaludercic
2023-06-04 12:19                             ` Eli Zaretskii
2023-06-04 12:32                               ` Philip Kaludercic
2023-06-04 12:46                                 ` Eli Zaretskii
2023-06-04 13:21                                   ` Philip Kaludercic
2023-06-04 14:03                                     ` Евгений Бойков via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-06-04 14:24                                       ` Philip Kaludercic
2023-06-04 14:30                                       ` Eli Zaretskii
2023-06-04 14:47                                         ` Евгений Бойков via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-06-04 14:55                                           ` Eli Zaretskii
2023-06-04 16:36                                             ` Евгений Бойков via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-06-04 15:12                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-06-04 15:20                                         ` Eli Zaretskii
2023-06-04 15:47                                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-06-04 16:15                                             ` Philip Kaludercic
2023-06-04 16:30                                               ` Eli Zaretskii
2023-06-04 16:53                                                 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-06-04 17:37                                                   ` Philip Kaludercic
2023-06-04 18:32                                                     ` Eli Zaretskii
2023-06-04 16:44                                               ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-06-04 18:40                                                 ` Philip Kaludercic
2023-06-04 19:38                                                   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-06-05  7:55                                                     ` Philip Kaludercic
2023-06-05 14:55                                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-06-07 15:36                                                         ` Eli Zaretskii
2023-06-07 18:38                                                           ` Philip Kaludercic
2023-06-07 19:20                                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-06-08  9:26                                                               ` Eli Zaretskii
2023-06-04 16:28                                             ` Eli Zaretskii
2023-06-04 15:45                                         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-06-04 14:46                                   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-06-04 14:54                                     ` Eli Zaretskii
2023-06-04 15:03                                     ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-06-04 12:14                           ` Евгений Бойков via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-06-04  7:52               ` Евгений Бойков via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-06-04  8:06                 ` Eli Zaretskii
2023-06-04  8:43                   ` Евгений Бойков via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-06-04  8:54                     ` Eli Zaretskii
2023-06-04  9:10                       ` Ruijie Yu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-06-04  9:17                       ` Philip Kaludercic
2023-06-04 10:16                         ` Eli Zaretskii
2023-06-04  9:52                       ` Евгений Бойков via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-06-04 14:54           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-05-29 13:25 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-05-29 15:44   ` Евгений Бойков via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-05-30  2:44     ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-06-03  8:37       ` Eli Zaretskii

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CAKOwOe69tmtzL73iGDx6Bs6bBP06X5zkzvxsSwnaXa342KfDCQ@mail.gmail.com \
    --to=bug-gnu-emacs@gnu.org \
    --cc=63757@debbugs.gnu.org \
    --cc=artscan@list.ru \
    --cc=eliz@gnu.org \
    --cc=monnier@iro.umontreal.ca \
    --cc=philipk@posteo.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).