GNU bug report logs - #41000
28.0.50; Package file(.el) is 0 bytes after downloading

Previous Next

Package: emacs;

Reported by: comproprasad <at> gmail.com

Date: Fri, 1 May 2020 14:42:01 UTC

Severity: normal

Found in version 28.0.50

Full log


View this message in rfc822 format

From: Stefan Kangas <stefan <at> marxist.se>
To: 41000 <at> debbugs.gnu.org
Cc: Compro Prasad <comproprasad <at> gmail.com>, Lars Ingebrigtsen <larsi <at> gnus.org>
Subject: bug#41000: Fwd: bug#41000: 28.0.50; Package file(.el) is 0 bytes after downloading
Date: Tue, 24 Aug 2021 16:29:18 +0200
It seems like the below was sent to me in private, without using
"Reply to all" so it never reached the bug tracker.  I am therefore
forwarding the full message here.

---------- Forwarded message ---------
Från: Compro Prasad <comproprasad <at> gmail.com>
Date: mån 11 maj 2020 kl 09:00
Subject: Re: bug#41000: 28.0.50; Package file(.el) is 0 bytes after downloading
To: Stefan Kangas <stefan <at> marxist.se>


On Sat, May 9, 2020 at 12:04 AM Stefan Kangas <stefan <at> marxist.se> wrote:
>
> Compro Prasad <comproprasad <at> gmail.com> writes:
>
> > There isn't a valid way to reproduce this issue. It mostly works fine. But
> > this has occured with me in the past too but thought it was already
> > reported.
>
> Could you tell us anything else regarding the circumstances when this
> happens, or is it completely random?
Its completely random and mostly rare. Network might be an issue. But am
not sure.
> How frequent is it?
Its rare.
> Also, could you please try using "emacs -Q" while installing and/or
> upgrading packages for a while to see if you can reproduce this issue
> there?
There isn't a valid way to reproduce this. It happens at random, maybe due
to network issues.
> > To be very specific I have mostly found the .el file having 0 bytes size.
> > Other files mostly had sizes greater than 0 bytes.
>
> Which other files are you referring to?  Do you mean other files inside
> a multi file package?
I am referring to the .el files of the package that I install using
package-install.

I have used an advice after package-install and also an after-init-hook
function that checks for any empty file which fixes this thing for now. Its
given below.

(defun compro/get-empty-pkgs ()
  "Get 0 bytes .el packages."
  (let ((default-directory package-user-dir))
    (seq-reduce
     (lambda (value-list file)
       (if (= (file-attribute-size (file-attributes file)) 0)
           (cons file value-list)
         value-list))
     (seq-filter
      (apply-partially #'s-suffix-p ".el")
      (seq-reduce
       (lambda (value-list file)
         (if (and
              (not (s-prefix-p "." file))
              (file-accessible-directory-p file))
             (append
              (seq-map
               (apply-partially #'concat file "/")
               (directory-files file))
              value-list)
           value-list))
       (directory-files "")
       '()))
     '())))

(defun compro/redownload-empty-pkgs ()
  "Redownload empty packages."
  (interactive)
  (let* ((pkgs (compro/get-empty-pkgs))
         (default-directory package-user-dir)
         (choice-list (list
                       (cons (intern "Delete and re-download all") 1)
                       (cons (intern "Manually select for re-downloading") 2)
                       (cons (intern "Fix everything manually") 3)))
         (choice (if pkgs
                     (alist-get
                      (intern
                       (completing-read
                        (concat
                         "Some files were not properly downloaded namely "
                         (s-join ", " pkgs)
                         ". What action do you want to take?  ")
                        choice-list))
                      choice-list)
                   3)))
    (if (= choice 3)
        (when (null pkgs)
          (message "No empty packages were found"))
      (package-refresh-contents)
      (seq-each
       (lambda (file)
         (let* ((values (s-split "/" file))
                (dir-name (car values))
                (pkg-values (s-split "-" dir-name))
                (pkg-name (s-join "-" (butlast pkg-values 1)))
                (each-choice
                 (if (= choice 1)
                     t
                   (yes-or-no-p
                    (concat "Delete and re-download " dir-name "? ")))))
           (when each-choice
             (delete-directory dir-name t)
             (ignore-errors
               (package-reinstall (intern pkg-name))))))
       pkgs))))
(add-hook 'after-init-hook 'compro/redownload-empty-packages)

(defun re-download (pkg &optional arg)
  "Advice for package-install."
  (let* ((pkg-name (symbol-name (if (package-desc-p pkg)
                                    (package-desc-name pkg)
                                  pkg)))
         (file-name (car
                     (sort
                      (seq-filter
                       (apply-partially #'s-prefix-p pkg-name)
                       (compro/get-empty-pkgs))
                      #'string-greaterp)))
         (dir (when file-name (car (s-split "/" file-name)))))
    (when dir
      (delete-directory dir)
      (ignore-errors (package-reinstall pkg)))))
(advice-add 'package-install :after 're-download)


My elisp skills aren't great but the above fixes my issue for now.
Would be nice to have something concrete to handle this issue.

Regards,
Compro Prasad




This bug report was last modified 3 years and 298 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.