From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED!not-for-mail From: Jean-Christophe Helary Newsgroups: gmane.emacs.devel Subject: package.el strings Date: Wed, 24 May 2017 14:08:15 +0900 Message-ID: NNTP-Posting-Host: blaine.gmane.org Mime-Version: 1.0 (Mac OS X Mail 10.3 \(3273\)) Content-Type: multipart/mixed; boundary="Apple-Mail=_D630F334-E68C-4A56-AE19-5F8B8C66F254" X-Trace: blaine.gmane.org 1495611958 22797 195.159.176.226 (24 May 2017 07:45:58 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Wed, 24 May 2017 07:45:58 +0000 (UTC) To: emacs-devel Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Wed May 24 09:45:51 2017 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by blaine.gmane.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dDQzO-0005p6-R4 for ged-emacs-devel@m.gmane.org; Wed, 24 May 2017 09:45:51 +0200 Original-Received: from localhost ([::1]:53304 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dDQzT-0000U2-Tx for ged-emacs-devel@m.gmane.org; Wed, 24 May 2017 03:45:55 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:52709) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dDQzL-0000Tl-HM for emacs-devel@gnu.org; Wed, 24 May 2017 03:45:48 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dDQzG-00056F-Ly for emacs-devel@gnu.org; Wed, 24 May 2017 03:45:47 -0400 Original-Received: from mail-pf0-x22d.google.com ([2607:f8b0:400e:c00::22d]:34583) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dDQzG-00055t-7v for emacs-devel@gnu.org; Wed, 24 May 2017 03:45:42 -0400 Original-Received: by mail-pf0-x22d.google.com with SMTP id 9so135210169pfj.1 for ; Wed, 24 May 2017 00:45:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:mime-version:subject:message-id:date:to; bh=oJ3Fng+IQySImtmL5aAj4zIravJND2HZN38nHB7/Mfs=; b=achNJEE5uSioWyrYkhEXgbwyqyMfO/UWpTLxneqXg43Q7ZecKt1SkolG77R0yZrnrS 9rlzhV7XP0TzupsLK59XdKiGSLlmzva/b4pujfXYDJr/UkaHBdQSPny6zR4ZvHsRC+x/ SihC4Kh/EbMwgcMbvd2o4gl0eXkloHzMoegjHINLKGc+8CvaY+gz6VkBcOg2IEqgCuPv PfI9bXj35LPv13FB6FZYezvALqdtfZwKjhmOraQb+2ke7YTBfd9YQ9qD2zH97HMj20Uy gE7eUoeXjxwfI+Zb/C06iiIrJkQ+R+g6Y4vVTPGb8Rujl6s4RuMz595YDN3fTfJjMCLF abZA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:mime-version:subject:message-id:date:to; bh=oJ3Fng+IQySImtmL5aAj4zIravJND2HZN38nHB7/Mfs=; b=TeZK/nVXiF8KmwHWsL/R+Lq/+PwZvcV4kiXLmyycIe+2nG5bwKoiUIegExcZRdTvuj VPM5k8hOf716FLDdnoVXAzBCjHgxj6s5VxpVDLqKci47TWUcoCC3Rh+xZsgLw9wKP3uP NWjdz7j0NJRQJ6WRNjeMBpvC1LsgWtMbPWJA1t7oKzI+j2XF8/ugb2m5+71OvH2/3+nv SEoK1mzsGmyDfVdaU2EBMZ7Y0rkS1jZdCb4QnA39oNrCJkhnQi6lgUSUKJmd/xw9BPAm f2u/2GF1kM/2QCrSlP0hQ/ylWmrc63X37XTKTkuRG4xZaEXRb4MWQFke7LfaZNXwC/if Lh6Q== X-Gm-Message-State: AODbwcAFOL3jRVFi8JZ5lswgYWdeehjj5XRg2wQG3Teofv4o8Vpm6htY WapPrbOYSO6vlltf7gA= X-Received: by 10.98.69.68 with SMTP id s65mr37250703pfa.178.1495611940778; Wed, 24 May 2017 00:45:40 -0700 (PDT) Original-Received: from [192.168.24.54] (pl25298.ag0304.nttpc.ne.jp. [133.232.153.210]) by smtp.gmail.com with ESMTPSA id c29sm6709082pfj.101.2017.05.24.00.45.39 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 24 May 2017 00:45:39 -0700 (PDT) X-Mailer: Apple Mail (2.3273) X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:400e:c00::22d X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.21 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.org@gnu.org Original-Sender: "Emacs-devel" Xref: news.gmane.org gmane.emacs.devel:215155 Archived-At: --Apple-Mail=_D630F334-E68C-4A56-AE19-5F8B8C66F254 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=us-ascii I've tried to straighten up the strings so that they stand on their own = and don't rely of complex concatenations and variable substitutions. = That makes for much less "smart" code but the resulting code/strings are = more readable. There is one big chunk left though (I put 2 TODOs there). It is the = (describe-package-1) function. The function itself is about 200 lines = long and there are 2 places I'm not sure yet what to do with, one uses = prin1/princ and the other uses insert to generate strings. I'll check = that part later. Let me know what you think. Jean-Christophe --Apple-Mail=_D630F334-E68C-4A56-AE19-5F8B8C66F254 Content-Disposition: attachment; filename=package.el_0524.diff Content-Type: application/octet-stream; x-unix-mode=0644; name="package.el_0524.diff" Content-Transfer-Encoding: quoted-printable diff=20--git=20a/lisp/emacs-lisp/package.el=20= b/lisp/emacs-lisp/package.el=0Aindex=20c0ecb0447f..c493d95fba=20100644=0A= ---=20a/lisp/emacs-lisp/package.el=0A+++=20b/lisp/emacs-lisp/package.el=0A= @@=20-468,13=20+468,13=20@@=20This=20is,=20approximately,=20the=20= inverse=20of=20`version-to-list'.=0A=20=20=20=20=20=20=20=20=20=20=20= (push=20(int-to-string=20num)=20str-list)=0A=20=20=20=20=20=20=20=20=20=20= =20(push=20"."=20str-list))=0A=20=20=20=20=20=20=20=20=20=20((<=20num=20= -4)=0A-=20=20=20=20=20=20=20=20=20=20(error=20"Invalid=20version=20list=20= `%s'"=20vlist))=0A+=20=20=20=20=20=20=20=20=20=20(error=20"Invalid=20= version=20list=20`%s'."=20vlist))=0A=20=20=20=20=20=20=20=20=20=20(t=0A=20= =20=20=20=20=20=20=20=20=20=20;;=20pre,=20or=20beta,=20or=20alpha=0A=20=20= =20=20=20=20=20=20=20=20=20(cond=20((equal=20"."=20(car=20str-list))=0A=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(pop=20str-list))=0A=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20((not=20(string-match=20= "[0-9]+"=20(car=20str-list)))=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20(error=20"Invalid=20version=20list=20`%s'"=20vlist)))=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20(error=20"Invalid=20version=20= list=20`%s'."=20vlist)))=0A=20=20=20=20=20=20=20=20=20=20=20(push=20= (cond=20((=3D=20num=20-1)=20"pre")=0A=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20((=3D=20num=20-2)=20"beta")=0A=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20((=3D=20num=20= -3)=20"alpha")=0A@@=20-494,7=20+494,7=20@@=20This=20is,=20approximately,=20= the=20inverse=20of=20`version-to-list'.=0A=20=20=20=20=20(`single=20= ".el")=0A=20=20=20=20=20(`tar=20".tar")=0A=20=20=20=20=20(`dir=20"")=0A-=20= =20=20=20(kind=20(error=20"Unknown=20package=20kind:=20%s"=20kind))))=0A= +=20=20=20=20(kind=20(error=20"Unknown=20package=20kind:=20%s."=20= kind))))=0A=20=0A=20(defun=20package-desc--keywords=20(pkg-desc)=0A=20=20= =20(let=20((keywords=20(cdr=20(assoc=20:keywords=20(package-desc-extras=20= pkg-desc)))))=0A@@=20-581,7=20+581,7=20@@=20loaded=20and/or=20activated,=20= customize=20`package-load-list'.")=0A=20=20=20=20=20=20=20=20=20= (goto-char=20(point-min))=0A=20=20=20=20=20=20=20=20=20(let=20((pkg-desc=20= (or=20(package-process-define-package=0A=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(read=20= (current-buffer)))=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20(error=20"Can't=20find=20define-package=20= in=20%s"=20pkg-file))))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20(error=20"Can't=20find=20= define-package=20in=20%s."=20pkg-file))))=0A=20=20=20=20=20=20=20=20=20=20= =20(setf=20(package-desc-dir=20pkg-desc)=20pkg-dir)=0A=20=20=20=20=20=20=20= =20=20=20=20(if=20(file-exists-p=20signed-file)=0A=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20(setf=20(package-desc-signed=20pkg-desc)=20t))=0A@@=20= -635,7=20+635,7=20@@=20Return=20the=20max=20version=20(as=20a=20string)=20= if=20the=20package=20is=20held=20at=20a=20lower=20version."=0A=20=20=20=20= =20=20=20=20=20=20=20((stringp=20force)=20=20=20=20=20=20=20=20=20=20=20=20= =20=20;=20held=0A=20=20=20=20=20=20=20=20=20=20=20=20(unless=20= (version-list-=3D=20version=20(version-to-list=20force))=0A=20=20=20=20=20= =20=20=20=20=20=20=20=20=20force))=0A-=20=20=20=20=20=20=20=20=20=20(t=20= (error=20"Invalid=20element=20in=20`package-load-list'")))))=0A+=20=20=20= =20=20=20=20=20=20=20(t=20(error=20"Invalid=20element=20in=20= `package-load-list'.")))))=0A=20=0A=20(defun=20package-built-in-p=20= (package=20&optional=20min-version)=0A=20=20=20"Return=20true=20if=20= PACKAGE=20is=20built-in=20to=20Emacs.=0A@@=20-664,7=20+664,7=20@@=20= PKG-DESC=20is=20a=20`package-desc'=20object."=0A=20=20=20(let*=20= ((old-lp=20load-path)=0A=20=20=20=20=20=20=20=20=20=20(pkg-dir=20= (package-desc-dir=20pkg-desc))=0A=20=20=20=20=20=20=20=20=20=20= (pkg-dir-dir=20(file-name-as-directory=20pkg-dir)))=0A-=20=20=20=20= (with-demoted-errors=20"Error=20loading=20autoloads:=20%s"=0A+=20=20=20=20= (with-demoted-errors=20"Error=20loading=20autoloads:=20%s."=0A=20=20=20=20= =20=20=20(load=20(package--autoloads-file-name=20pkg-desc)=20nil=20t))=0A= =20=20=20=20=20(when=20(and=20(eq=20old-lp=20load-path)=0A=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20(not=20(or=20(member=20pkg-dir=20= load-path)=0A@@=20-706,7=20+706,7=20@@=20correspond=20to=20previously=20= loaded=20files=20(those=20returned=20by=0A=20=20=20(let*=20((name=20= (package-desc-name=20pkg-desc))=0A=20=20=20=20=20=20=20=20=20=20(pkg-dir=20= (package-desc-dir=20pkg-desc)))=0A=20=20=20=20=20(unless=20pkg-dir=0A-=20= =20=20=20=20=20(error=20"Internal=20error:=20unable=20to=20find=20= directory=20for=20`%s'"=0A+=20=20=20=20=20=20(error=20"Internal=20error:=20= unable=20to=20find=20directory=20for=20`%s'."=0A=20=20=20=20=20=20=20=20=20= =20=20=20=20=20(package-desc-full-name=20pkg-desc)))=0A=20=20=20=20=20;;=20= Activate=20its=20dependencies=20recursively.=0A=20=20=20=20=20;;=20= FIXME:=20This=20doesn't=20check=20whether=20the=20activated=20version=20= is=20the=0A@@=20-714,7=20+714,7=20@@=20correspond=20to=20previously=20= loaded=20files=20(those=20returned=20by=0A=20=20=20=20=20(when=20deps=0A=20= =20=20=20=20=20=20(dolist=20(req=20(package-desc-reqs=20pkg-desc))=0A=20=20= =20=20=20=20=20=20=20(unless=20(package-activate=20(car=20req))=0A-=20=20= =20=20=20=20=20=20=20=20(error=20"Unable=20to=20activate=20package=20= `%s'.\nRequired=20package=20`%s-%s'=20is=20unavailable"=0A+=20=20=20=20=20= =20=20=20=20=20(error=20"Unable=20to=20activate=20package=20= `%s'.\nRequired=20package=20`%s-%s'=20is=20unavailable."=0A=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20name=20(car=20req)=20= (package-version-join=20(cadr=20req))))))=0A=20=20=20=20=20= (package--load-files-for-activation=20pkg-desc=20reload)=0A=20=20=20=20=20= ;;=20Add=20info=20node.=0A@@=20-819,7=20+819,7=20@@=20untar=20into=20a=20= directory=20named=20DIR;=20otherwise,=20signal=20an=20error."=0A=20=20=20= =20=20=20=20=20=20=20=20=20=20;;=20directories=20with=20a=20trailing=20= slash=20(Bug#13136).=0A=20=20=20=20=20=20=20=20=20=20=20=20=20(and=20= (string-equal=20dir=20name)=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20(eq=20(tar-header-link-type=20tar-data)=205))=0A-=20=20=20=20=20= =20=20=20=20=20=20=20(error=20"Package=20does=20not=20untar=20cleanly=20= into=20directory=20%s/"=20dir)))))=0A+=20=20=20=20=20=20=20=20=20=20=20=20= (error=20"Package=20does=20not=20untar=20cleanly=20into=20directory=20= %s/."=20dir)))))=0A=20=20=20(tar-untar-buffer))=0A=20=0A=20(defun=20= package--alist-to-plist-args=20(alist)=0A@@=20-855,13=20+855,13=20@@=20= untar=20into=20a=20directory=20named=20DIR;=20otherwise,=20signal=20an=20= error."=0A=20=20=20=20=20=20=20=20(let=20((el-file=20(expand-file-name=20= (format=20"%s.el"=20name)=20pkg-dir)))=0A=20=20=20=20=20=20=20=20=20=20= (make-directory=20pkg-dir=20t)=0A=20=20=20=20=20=20=20=20=20=20= (package--write-file-no-coding=20el-file)))=0A-=20=20=20=20=20=20(kind=20= (error=20"Unknown=20package=20kind:=20%S"=20kind)))=0A+=20=20=20=20=20=20= (kind=20(error=20"Unknown=20package=20kind:=20%S."=20kind)))=0A=20=20=20=20= =20(package--make-autoloads-and-stuff=20pkg-desc=20pkg-dir)=0A=20=20=20=20= =20;;=20Update=20package-alist.=0A=20=20=20=20=20(let=20((new-desc=20= (package-load-descriptor=20pkg-dir)))=0A=20=20=20=20=20=20=20(unless=20= (equal=20(package-desc-full-name=20new-desc)=0A=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20(package-desc-full-name=20= pkg-desc))=0A-=20=20=20=20=20=20=20=20(error=20"The=20retrieved=20= package=20(`%s')=20doesn't=20match=20what=20the=20archive=20offered=20= (`%s')"=0A+=20=20=20=20=20=20=20=20(error=20"The=20retrieved=20package=20= (`%s')=20doesn't=20match=20what=20the=20archive=20offered=20(`%s')."=0A=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(package-desc-full-name=20= new-desc)=20(package-desc-full-name=20pkg-desc)))=0A=20=20=20=20=20=20=20= ;;=20Activation=20has=20to=20be=20done=20before=20compilation,=20so=20= that=20if=20we're=0A=20=20=20=20=20=20=20;;=20upgrading=20and=20macros=20= have=20changed=20we=20load=20the=20new=20definitions=0A@@=20-968,7=20= +968,7=20@@=20Signal=20an=20error=20if=20the=20entire=20string=20was=20= not=20used."=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20t)=0A=20=20=20=20=20=20=20=20=20=20=20=20=20(end-of-file=20nil))))=0A= =20=20=20=20=20(if=20more-left=0A-=20=20=20=20=20=20=20=20(error=20= "Can't=20read=20whole=20string")=0A+=20=20=20=20=20=20=20=20(error=20= "Can't=20read=20whole=20string.")=0A=20=20=20=20=20=20=20(car=20= read-data))))=0A=20=0A=20(defun=20package--prepare-dependencies=20(deps)=0A= @@=20-979,12=20+979,12=20@@=20of=20\"0\"=20(meaning=20any=20version)=20= and=20an=20appropriate=20level=20of=20lists=0A=20is=20wrapped=20around=20= any=20parts=20requiring=20it."=0A=20=20=20(cond=0A=20=20=20=20((not=20= (listp=20deps))=0A-=20=20=20=20(error=20"Invalid=20requirement=20= specifier:=20%S"=20deps))=0A+=20=20=20=20(error=20"Invalid=20requirement=20= specifier:=20%S."=20deps))=0A=20=20=20=20(t=20(mapcar=20(lambda=20(dep)=0A= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(cond=0A=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20((symbolp=20dep)=20`(,dep=20"0"))=0A= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20((stringp=20dep)=0A= -=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(error=20"Invalid=20= requirement=20specifier:=20%S"=20dep))=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20(error=20"Invalid=20requirement=20specifier:=20%S."=20= dep))=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20((and=20= (listp=20dep)=20(null=20(cdr=20dep)))=0A=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20(list=20(car=20dep)=20"0"))=0A=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20(t=20dep)))=0A@@=20-1003,12=20+1003,12=20= @@=20error.=20=20If=20there=20is=20a=20package,=20narrow=20the=20buffer=20= to=20the=20file's=0A=20boundaries."=0A=20=20=20(goto-char=20(point-min))=0A= =20=20=20(unless=20(re-search-forward=20"^;;;=20\\([^=20]*\\)\\.el=20= ---[=20\t]*\\(.*?\\)[=20\t]*\\(-\\*-.*-\\*-[=20\t]*\\)?$"=20nil=20t)=0A-=20= =20=20=20(error=20"Package=20lacks=20a=20file=20header"))=0A+=20=20=20=20= (error=20"Package=20lacks=20a=20file=20header."))=0A=20=20=20(let=20= ((file-name=20(match-string-no-properties=201))=0A=20=20=20=20=20=20=20=20= =20(desc=20=20=20=20=20=20(match-string-no-properties=202))=0A=20=20=20=20= =20=20=20=20=20(start=20=20=20=20=20(line-beginning-position)))=0A=20=20=20= =20=20(unless=20(search-forward=20(concat=20";;;=20"=20file-name=20".el=20= ends=20here"))=0A-=20=20=20=20=20=20(error=20"Package=20lacks=20a=20= terminating=20comment"))=0A+=20=20=20=20=20=20(error=20"Package=20lacks=20= a=20terminating=20comment."))=0A=20=20=20=20=20;;=20Try=20to=20include=20= a=20trailing=20newline.=0A=20=20=20=20=20(forward-line)=0A=20=20=20=20=20= (narrow-to-region=20start=20(point))=0A@@=20-1023,7=20+1023,7=20@@=20= boundaries."=0A=20=20=20=20=20=20=20=20=20=20=20=20(homepage=20= (lm-homepage)))=0A=20=20=20=20=20=20=20(unless=20pkg-version=0A=20=20=20=20= =20=20=20=20=20(error=0A-=20=20=20=20=20=20=20=20=20=20=20=20"Package=20= lacks=20a=20\"Version\"=20or=20\"Package-Version\"=20header"))=0A+=20=20=20= =20=20=20=20=20=20=20=20=20"Package=20lacks=20a=20\"Version\"=20or=20= \"Package-Version\"=20header."))=0A=20=20=20=20=20=20=20= (package-desc-from-define=0A=20=20=20=20=20=20=20=20file-name=20= pkg-version=20desc=0A=20=20=20=20=20=20=20=20(if=20requires-str=0A@@=20= -1060,11=20+1060,11=20@@=20The=20return=20result=20is=20a=20= `package-desc'."=0A=20=20=20=20=20=20=20=20=20=20(desc-file=20= (package--description-file=20dir-name))=0A=20=20=20=20=20=20=20=20=20=20= (tar-desc=20(tar-get-file-descriptor=20(concat=20dir-name=20= desc-file))))=0A=20=20=20=20=20(unless=20tar-desc=0A-=20=20=20=20=20=20= (error=20"No=20package=20descriptor=20file=20found"))=0A+=20=20=20=20=20=20= (error=20"No=20package=20descriptor=20file=20found."))=0A=20=20=20=20=20= (with-current-buffer=20(tar--extract=20tar-desc)=0A=20=20=20=20=20=20=20= (unwind-protect=0A=20=20=20=20=20=20=20=20=20=20=20(or=20= (package--read-pkg-desc=20'tar)=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20= =20(error=20"Can't=20find=20define-package=20in=20%s"=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20=20(error=20"Can't=20find=20define-package=20in=20= %s."=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (tar-header-name=20tar-desc)))=0A=20=20=20=20=20=20=20=20=20(kill-buffer=20= (current-buffer))))))=0A=20=0A@@=20-1089,7=20+1089,7=20@@=20The=20return=20= result=20is=20a=20`package-desc'."=0A=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20;;=20set=20the=20'dir=20kind,=0A=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20(setf=20(package-desc-kind=20info)=20'dir))))=0A=20=20=20=20=20= =20=20=20=20(unless=20info=0A-=20=20=20=20=20=20=20=20=20=20(error=20"No=20= .el=20files=20with=20package=20headers=20in=20`%s'"=20= default-directory))=0A+=20=20=20=20=20=20=20=20=20=20(error=20"No=20.el=20= files=20with=20package=20headers=20in=20`%s'."=20default-directory))=0A=20= =20=20=20=20=20=20=20=20;;=20and=20return=20the=20info.=0A=20=20=20=20=20= =20=20=20=20info))))=0A=20=0A@@=20-1149,7=20+1149,7=20@@=20buffer=20is=20= killed=20afterwards.=20=20Return=20the=20last=20value=20in=20BODY."=0A=20= =20=20=20=20=20(if=20(string-match-p=20"\\`https?:"=20,location)=0A=20=20= =20=20=20=20=20=20=20=20(url-insert-file-contents=20(concat=20,location=20= ,file))=0A=20=20=20=20=20=20=20=20(unless=20(file-name-absolute-p=20= ,location)=0A-=20=20=20=20=20=20=20=20=20(error=20"Archive=20location=20= %s=20is=20not=20an=20absolute=20file=20name"=0A+=20=20=20=20=20=20=20=20=20= (error=20"Archive=20location=20%s=20is=20not=20an=20absolute=20file=20= name."=0A=20=20=20=20=20=20=20=20=20=20=20=20,location))=0A=20=20=20=20=20= =20=20=20(insert-file-contents=20(expand-file-name=20,file=20= ,location)))=0A=20=20=20=20=20=20,@body))=0A@@=20-1191,11=20+1191,11=20= @@=20errors=20signaled=20by=20ERROR-FORM=20or=20by=20BODY).=0A=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (require=20'url-handlers)=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20(unless-error=20,body=0A=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20(when-let=20((er=20(plist-get=20status=20= :error)))=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(error=20= "Error=20retrieving:=20%s=20%S"=20,url-sym=20er))=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20(error=20"Error=20retrieving:=20%s=20%S."=20= ,url-sym=20er))=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (with-current-buffer=20,b-sym=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20(goto-char=20(point-min))=0A=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20(unless=20(search-forward-regexp=20"^\r?\n\r?"=20= nil=20'noerror)=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20(error=20"Error=20retrieving:=20%s=20%S"=20,url-sym=20= "incomprehensible=20buffer")))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20(error=20"Error=20retrieving:=20%s=20%S."=20,url-sym=20= "incomprehensible=20buffer")))=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20(url-insert-buffer-contents=20,b-sym=20,url-sym)=0A=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20(kill-buffer=20,b-sym)=0A=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20(goto-char=20(point-min)))))=0A@@=20= -1205,7=20+1205,7=20@@=20errors=20signaled=20by=20ERROR-FORM=20or=20by=20= BODY).=0A=20=20=20=20=20=20=20=20=20=20=20=20(unless-error=20,body=0A=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (let=20((url=20(expand-file-name=20,file=20,url-1)))=0A=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (unless=20(file-name-absolute-p=20url)=0A-=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(error=20"Location=20= %s=20is=20not=20a=20url=20nor=20an=20absolute=20file=20name"=20url))=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20(error=20"Location=20%s=20is=20not=20a=20url=20nor=20an=20= absolute=20file=20name."=20url))=0A=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(insert-file-contents=20= url))))))))=0A=20=0A=20(define-error=20'bad-signature=20"Failed=20to=20= verify=20signature")=0A@@=20-1268,7=20+1268,7=20@@=20else,=20even=20if=20= an=20error=20is=20signaled."=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20(funcall=20callback=20nil))=0A=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(when=20unwind=20(funcall=20= unwind))=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (unless=20allow-unsigned=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20(error=20"Unsigned=20file=20`%s'=20at=20%s"=20file=20= location)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20(error=20"Unsigned=20file=20`%s'=20at=20%s."=20file=20location)))=0A= =20=20=20=20=20=20=20;;=20OTOH,=20an=20error=20here=20means=20"bad=20= signature",=20which=20we=20never=0A=20=20=20=20=20=20=20;;=20suppress.=20= =20(Bug#22089)=0A=20=20=20=20=20=20=20(unwind-protect=0A@@=20-1397,7=20= +1397,7=20@@=20Will=20throw=20an=20error=20if=20the=20archive=20version=20= is=20too=20new."=0A=20=20=20=20=20=20=20=20=20=20=20= (insert-file-contents=20filename))=0A=20=20=20=20=20=20=20=20=20(let=20= ((contents=20(read=20(current-buffer))))=0A=20=20=20=20=20=20=20=20=20=20= =20(if=20(>=20(car=20contents)=20package-archive-version)=0A-=20=20=20=20= =20=20=20=20=20=20=20=20=20=20(error=20"Package=20archive=20version=20%d=20= is=20higher=20than=20%d"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (error=20"Package=20archive=20version=20%d=20is=20higher=20than=20%d."=0A= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(car=20contents)=20= package-archive-version))=0A=20=20=20=20=20=20=20=20=20=20=20(cdr=20= contents))))))=0A=20=0A@@=20-1510,7=20+1510,7=20@@=20Once=20it's=20= empty,=20run=20`package--post-download-archives-hook'."=0A=20=20=20=20=20= (package--build-compatibility-table)=0A=20=20=20=20=20;;=20We=20message=20= before=20running=20the=20hook,=20so=20the=20hook=20can=20give=0A=20=20=20= =20=20;;=20messages=20as=20well.=0A-=20=20=20=20(message=20"Package=20= refresh=20done")=0A+=20=20=20=20(message=20"Package=20refresh=20done.")=0A= =20=20=20=20=20(run-hooks=20'package--post-download-archives-hook)))=0A=20= =0A=20(defun=20package--download-one-archive=20(archive=20file=20= &optional=20async)=0A@@=20-1578,7=20+1578,7=20@@=20downloads=20in=20the=20= background."=0A=20=20=20=20=20(when=20(and=20package-check-signature=20= (file-exists-p=20default-keyring))=0A=20=20=20=20=20=20=20= (condition-case-unless-debug=20error=0A=20=20=20=20=20=20=20=20=20=20=20= (package-import-keyring=20default-keyring)=0A-=20=20=20=20=20=20=20=20= (error=20(message=20"Cannot=20import=20default=20keyring:=20%S"=20(cdr=20= error))))))=0A+=20=20=20=20=20=20=20=20(error=20(message=20"Cannot=20= import=20default=20keyring:=20%S."=20(cdr=20error))))))=0A=20=20=20= (package--download-and-read-archives=20async))=0A=20=0A=20=0C=0A@@=20= -1621,11=20+1621,11=20@@=20SEEN=20is=20used=20internally=20to=20detect=20= infinite=20recursion."=0A=20=20=20=20=20=20=20=20=20=20=20=20=20;;=20we=20= re-add=20it=20(along=20with=20its=20dependencies)=20at=20an=20earlier=20= place=0A=20=20=20=20=20=20=20=20=20=20=20=20=20;;=20below=20(bug#16994).=0A= =20=20=20=20=20=20=20=20=20=20=20=20=20(if=20(memq=20already=20seen)=20=20= =20=20=20;Avoid=20inf-loop=20on=20dependency=20cycles.=0A-=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20(message=20"Dependency=20cycle=20going=20= through=20%S"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (message=20"Dependency=20cycle=20going=20through=20%S."=0A=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (package-desc-full-name=20already))=0A=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20(setq=20packages=20(delq=20already=20packages))=0A=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20(setq=20already=20nil))=0A-=20=20=20=20=20=20= =20=20=20=20(error=20"Need=20package=20`%s-%s',=20but=20only=20%s=20is=20= being=20installed"=0A+=20=20=20=20=20=20=20=20=20=20(error=20"Need=20= package=20`%s-%s',=20but=20only=20%s=20is=20being=20installed."=0A=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20next-pkg=20= (package-version-join=20next-version)=0A=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20(package-version-join=20(package-desc-version=20= already)))))=0A=20=20=20=20=20=20=20(cond=0A@@=20-1654,20=20+1654,20=20= @@=20SEEN=20is=20used=20internally=20to=20detect=20infinite=20= recursion."=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (setq=20problem=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20(if=20(stringp=20disabled)=0A=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (format-message=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20"Package=20`%s'=20held=20at=20version=20= %s,=20but=20version=20%s=20required"=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20"Package=20`%s'=20= held=20at=20version=20%s,=20but=20version=20%s=20required."=0A=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20next-pkg=20disabled=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20(package-version-join=20= next-version))=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20(format-message=20"Required=20package=20`%s'=20is=20= disabled"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20(format-message=20"Required=20package=20`%s'=20is=20= disabled."=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= next-pkg)))))=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(t=20= (setq=20found=20pkg-desc)))))=0A=20=20=20=20=20=20=20=20=20=20=20(unless=20= found=0A=20=20=20=20=20=20=20=20=20=20=20=20=20(cond=0A=20=20=20=20=20=20= =20=20=20=20=20=20=20=20(problem=20(error=20"%s"=20problem))=0A=20=20=20=20= =20=20=20=20=20=20=20=20=20=20(found-something=0A-=20=20=20=20=20=20=20=20= =20=20=20=20=20=20(error=20"Need=20package=20`%s-%s',=20but=20only=20%s=20= is=20available"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20(error=20= "Need=20package=20`%s-%s',=20but=20only=20%s=20is=20available."=0A=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20next-pkg=20= (package-version-join=20next-version)=0A=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20found-something))=0A-=20=20=20=20=20=20=20= =20=20=20=20=20=20(t=20(error=20"Package=20`%s-%s'=20is=20unavailable"=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20(t=20(error=20"Package=20`%s-%s'=20= is=20unavailable."=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20next-pkg=20(package-version-join=20next-version)))))=0A= =20=20=20=20=20=20=20=20=20=20=20(setq=20packages=0A=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20(package-compute-transaction=20(cons=20= found=20packages)=0A@@=20-1806,7=20+1806,7=20@@=20if=20all=20the=20= in-between=20dependencies=20are=20also=20in=20PACKAGE-LIST."=0A=20=20=20= "Download=20and=20install=20a=20tar=20package."=0A=20=20=20;;=20This=20= won't=20happen,=20unless=20the=20archive=20is=20doing=20something=20= wrong.=0A=20=20=20(when=20(eq=20(package-desc-kind=20pkg-desc)=20'dir)=0A= -=20=20=20=20(error=20"Can't=20install=20directory=20package=20from=20= archive"))=0A+=20=20=20=20(error=20"Can't=20install=20directory=20= package=20from=20archive."))=0A=20=20=20(let*=20((location=20= (package-archive-base=20pkg-desc))=0A=20=20=20=20=20=20=20=20=20=20(file=20= (concat=20(package-desc-full-name=20pkg-desc)=0A=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(package-desc-suffix=20= pkg-desc))))=0A@@=20-1971,7=20+1971,7=20@@=20to=20install=20it=20but=20= still=20mark=20it=20as=20selected."=0A=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20(package-desc-reqs=20pkg)))=0A=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (package-compute-transaction=20()=20(list=20(list=20pkg))))))=0A=20=20=20= =20=20=20=20=20=20(package-download-transaction=20transaction)=0A-=20=20=20= =20=20=20(message=20"`%s'=20is=20already=20installed"=20name))))=0A+=20=20= =20=20=20=20(message=20"`%s'=20is=20already=20installed."=20name))))=0A=20= =0A=20(defun=20package-strip-rcs-id=20(str)=0A=20=20=20"Strip=20RCS=20= version=20ID=20from=20the=20version=20string=20STR.=0A@@=20-2047,22=20= +2047,22=20@@=20If=20some=20packages=20are=20not=20installed=20propose=20= to=20install=20them."=0A=20=20=20;;=20using=20here,=20because=20the=20= outcome=20is=20the=20same=20either=20way=20(nothing=0A=20=20=20;;=20gets=20= installed).=0A=20=20=20(if=20(not=20package-selected-packages)=0A-=20=20=20= =20=20=20(message=20"`package-selected-packages'=20is=20empty,=20nothing=20= to=20install")=0A+=20=20=20=20=20=20(message=20= "`package-selected-packages'=20is=20empty,=20nothing=20to=20install.")=0A= =20=20=20=20=20(let*=20((not-installed=20(seq-remove=20= #'package-installed-p=20package-selected-packages))=0A=20=20=20=20=20=20=20= =20=20=20=20=20(available=20(seq-filter=20(lambda=20(p)=20(assq=20p=20= package-archive-contents))=20not-installed))=0A=20=20=20=20=20=20=20=20=20= =20=20=20(difference=20(-=20(length=20not-installed)=20(length=20= available))))=0A=20=20=20=20=20=20=20(cond=0A=20=20=20=20=20=20=20=20= (available=0A=20=20=20=20=20=20=20=20=20(when=20(y-or-n-p=0A-=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20(format=20"%s=20packages=20will=20be=20= installed:\n%s,=20proceed?"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20(format=20"Number=20of=20packages=20that=20will=20be=20installed:=20= %s.\n%s,=20proceed?"=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20(length=20available)=0A=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20(mapconcat=20#'symbol-name=20= available=20",=20")))=0A=20=20=20=20=20=20=20=20=20=20=20(mapc=20(lambda=20= (p)=20(package-install=20p=20'dont-select))=20available)))=0A=20=20=20=20= =20=20=20=20((>=20difference=200)=0A-=20=20=20=20=20=20=20=20(message=20= "%s=20packages=20are=20not=20available=20(the=20rest=20already=20= installed),=20maybe=20you=20need=20to=20`M-x=20= package-refresh-contents'"=0A+=20=20=20=20=20=20=20=20(message=20"Number=20= of=20packages=20that=20are=20not=20available:=20%s.=20The=20rest=20is=20= already=20installed.=20Consider=20`M-x=20package-refresh-contents'."=0A=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20difference))=0A=20=20=20= =20=20=20=20=20(t=0A-=20=20=20=20=20=20=20=20(message=20"All=20your=20= packages=20are=20already=20installed"))))))=0A+=20=20=20=20=20=20=20=20= (message=20"All=20your=20packages=20are=20already=20installed."))))))=0A=20= =0A=20=0C=0A=20;;;=20Package=20Deletion=0A@@=20-2116,13=20+2116,13=20@@=20= If=20NOSAVE=20is=20non-nil,=20the=20package=20is=20not=20removed=20from=0A= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20(expand-file-name=20package-user-dir))=0A=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20(expand-file-name=20dir)))=0A=20=20=20=20=20=20=20= =20=20=20=20=20;;=20Don't=20delete=20"system"=20packages.=0A-=20=20=20=20= =20=20=20=20=20=20=20(error=20"Package=20`%s'=20is=20a=20system=20= package,=20not=20deleting"=0A+=20=20=20=20=20=20=20=20=20=20=20(error=20= "Package=20`%s'=20is=20a=20system=20package,=20not=20deleting."=0A=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(package-desc-full-name=20= pkg-desc)))=0A=20=20=20=20=20=20=20=20=20=20=20((and=20(null=20force)=0A=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(setq=20= pkg-used-elsewhere-by=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20(package--used-elsewhere-p=20pkg-desc)))=0A=20=20=20=20= =20=20=20=20=20=20=20=20;;=20Don't=20delete=20packages=20used=20as=20= dependency=20elsewhere.=0A-=20=20=20=20=20=20=20=20=20=20=20(error=20= "Package=20`%s'=20is=20used=20by=20`%s'=20as=20dependency,=20not=20= deleting"=0A+=20=20=20=20=20=20=20=20=20=20=20(error=20"Package=20`%s'=20= is=20used=20by=20`%s'=20as=20dependency,=20not=20deleting."=0A=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(package-desc-full-name=20= pkg-desc)=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (package-desc-name=20pkg-used-elsewhere-by)))=0A=20=20=20=20=20=20=20=20=20= =20=20(t=0A@@=20-2171,13=20+2171,13=20@@=20will=20be=20deleted."=0A=20=20= =20=20=20(let=20((removable=20(package--removable-packages)))=0A=20=20=20= =20=20=20=20(if=20removable=0A=20=20=20=20=20=20=20=20=20=20=20(when=20= (y-or-n-p=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(format=20= "%s=20packages=20will=20be=20deleted:\n%s,=20proceed?=20"=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20(format=20"Number=20of=20packages=20= that=20will=20be=20deleted:=20%s.\n%s,=20proceed?=20"=0A=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20(length=20removable)=0A=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(mapconcat=20= #'symbol-name=20removable=20",=20")))=0A=20=20=20=20=20=20=20=20=20=20=20= =20=20(mapc=20(lambda=20(p)=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20(package-delete=20(cadr=20(assq=20p=20package-alist))=20= t))=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= removable))=0A-=20=20=20=20=20=20=20=20(message=20"Nothing=20to=20= autoremove")))))=0A+=20=20=20=20=20=20=20=20(message=20"Nothing=20to=20= autoremove.")))))=0A=20=0A=20=0C=0A=20;;;;=20Package=20description=20= buffer.=0A@@=20-2207,7=20+2207,7=20@@=20will=20be=20deleted."=0A=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20(symbol-name=20guess)))))=0A=20=20=20=20=20=20=20=20=20=20= (list=20(intern=20val))))))=0A=20=20=20(if=20(not=20(or=20= (package-desc-p=20package)=20(and=20package=20(symbolp=20package))))=0A-=20= =20=20=20=20=20(message=20"No=20package=20specified")=0A+=20=20=20=20=20=20= (message=20"No=20packages=20specified.")=0A=20=20=20=20=20= (help-setup-xref=20(list=20#'describe-package=20package)=0A=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (called-interactively-p=20'interactive))=0A=20=20=20=20=20= (with-help-window=20(help-buffer)=0A@@=20-2232,6=20+2232,7=20@@=20= Otherwise=20no=20newline=20is=20inserted."=0A=20=0A=20(declare-function=20= lm-commentary=20"lisp-mnt"=20(&optional=20file))=0A=20=0A+;;=20TODO=20->=20= prin1=20/=20princ=0A=20(defun=20describe-package-1=20(pkg)=0A=20=20=20= (require=20'lisp-mnt)=0A=20=20=20(let*=20((desc=20(or=0A@@=20-2265,6=20= +2266,7=20@@=20Otherwise=20no=20newline=20is=20inserted."=0A=20=20=20=20=20= (princ=20status)=0A=20=20=20=20=20(princ=20"=20package.\n\n")=0A=20=0A+=20= =20=20=20;;=20TODO=20->=20insert=0A=20=20=20=20=20= (package--print-help-section=20"Status")=0A=20=20=20=20=20(cond=20= (built-in=0A=20=20=20=20=20=20=20=20=20=20=20=20(insert=20(propertize=20= (capitalize=20status)=0A@@=20-2641,12=20+2643,12=20@@=20Installed=20= obsolete=20packages=20are=20always=20displayed.")=0A=20=20=20"Toggle=20= visibility=20of=20obsolete=20available=20packages."=0A=20=20=20= (interactive)=0A=20=20=20(unless=20(derived-mode-p=20'package-menu-mode)=0A= -=20=20=20=20(user-error=20"The=20current=20buffer=20is=20not=20a=20= Package=20Menu"))=0A+=20=20=20=20(user-error=20"The=20current=20buffer=20= is=20not=20a=20Package=20Menu."))=0A=20=20=20(setq=20= package-menu--hide-packages=0A=20=20=20=20=20=20=20=20=20(not=20= package-menu--hide-packages))=0A-=20=20(message=20"%s=20packages"=20(if=20= package-menu--hide-packages=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20"Hiding=20obsolete=20or=20= unwanted"=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20"Displaying=20all"))=0A+=20=20(if=20= package-menu--hide-packages=0A+=20=20=20=20=20=20(message=20"Hiding=20= obsolete=20or=20unwanted=20packages.")=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20(message=20"Displaying=20all=20packages."))=0A=20=20= =20(revert-buffer=20nil=20'no-confirm))=0A=20=0A=20(defun=20= package--remove-hidden=20(pkg-list)=0A@@=20-2947,7=20+2949,7=20@@=20This=20= fetches=20the=20contents=20of=20each=20archive=20specified=20in=0A=20= `package-archives',=20and=20then=20refreshes=20the=20package=20menu."=0A=20= =20=20(interactive)=0A=20=20=20(unless=20(derived-mode-p=20= 'package-menu-mode)=0A-=20=20=20=20(user-error=20"The=20current=20buffer=20= is=20not=20a=20Package=20Menu"))=0A+=20=20=20=20(user-error=20"The=20= current=20buffer=20is=20not=20a=20Package=20Menu."))=0A=20=20=20(setq=20= package-menu--old-archive-contents=20package-archive-contents)=0A=20=20=20= (setq=20package-menu--new-package-list=20nil)=0A=20=20=20= (package-refresh-contents=20package-menu-async))=0A@@=20-2969,11=20= +2971,10=20@@=20If=20optional=20arg=20BUTTON=20is=20non-nil,=20describe=20= its=20associated=20package."=0A=20=20=20=20=20(let=20((hidden=0A=20=20=20= =20=20=20=20=20=20=20=20=20(cl-remove-if-not=20(lambda=20(e)=20= (string-match=20re=20(symbol-name=20(car=20e))))=0A=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= package-archive-contents)))=0A-=20=20=20=20=20=20(message=20= (substitute-command-keys=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20(concat=20"Hiding=20%s=20packages,=20type=20= `\\[package-menu-toggle-hiding]'"=0A-=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20"=20to=20toggle=20or=20= `\\[customize-variable]=20RET=20package-hidden-regexps'"=0A-=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20"=20to=20= customize=20it"))=0A-=20=20=20=20=20=20=20=20(length=20hidden)))))=0A+=20= =20=20=20=20=20(message=20"Number=20of=20packages=20to=20hide:=20%s,=20= type=20%s=20to=20toggle=20or=20%s=20to=20customize=20it."=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20(length=20hidden)=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20(substitute-command-key=20= "`\\[package-menu-toggle-hiding]'")=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20(substitute-command-key=20"`\\[customize-variable]=20RET=20= package-hidden-regexps'"=20)))))=0A=20=0A=20(defun=20= package-menu-describe-package=20(&optional=20button)=0A=20=20=20= "Describe=20the=20current=20package.=0A@@=20-2983,7=20+2984,7=20@@=20If=20= optional=20arg=20BUTTON=20is=20non-nil,=20describe=20its=20associated=20= package."=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (tabulated-list-get-id))))=0A=20=20=20=20=20(if=20pkg-desc=0A=20=20=20=20= =20=20=20=20=20(describe-package=20pkg-desc)=0A-=20=20=20=20=20=20= (user-error=20"No=20package=20here"))))=0A+=20=20=20=20=20=20(user-error=20= "No=20package=20here."))))=0A=20=0A=20;;=20fixme=20numeric=20argument=0A=20= (defun=20package-menu-mark-delete=20(&optional=20_num)=0A@@=20-3104,7=20= +3105,7=20@@=20consideration."=0A=20=20=20"Mark=20all=20upgradable=20= packages=20in=20the=20Package=20Menu.=0A=20Implementation=20of=20= `package-menu-mark-upgrades'."=0A=20=20=20(unless=20(derived-mode-p=20= 'package-menu-mode)=0A-=20=20=20=20(error=20"The=20current=20buffer=20is=20= not=20a=20Package=20Menu"))=0A+=20=20=20=20(error=20"The=20current=20= buffer=20is=20not=20a=20Package=20Menu."))=0A=20=20=20(setq=20= package-menu--mark-upgrades-pending=20nil)=0A=20=20=20(let=20((upgrades=20= (package-menu--find-upgrades)))=0A=20=20=20=20=20(if=20(null=20upgrades)=0A= @@=20-3121,9=20+3122,8=20@@=20Implementation=20of=20= `package-menu-mark-upgrades'."=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20(package-menu-mark-install))=0A=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20(t=0A=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20(package-menu-mark-delete))))))=0A-=20=20=20=20=20= =20(message=20"%d=20package%s=20marked=20for=20upgrading."=0A-=20=20=20=20= =20=20=20=20(length=20upgrades)=0A-=20=20=20=20=20=20=20=20(if=20(=3D=20= (length=20upgrades)=201)=20""=20"s")))))=0A+=20=20=20=20=20=20(message=20= "Number=20of=20packages=20marked=20for=20upgrading:=20%d."=0A+=20=20=20=20= =20=20=20=20(length=20upgrades)))))=0A=20=0A=20(defun=20= package-menu-mark-upgrades=20()=0A=20=20=20"Mark=20all=20upgradable=20= packages=20in=20the=20Package=20Menu.=0A@@=20-3141,22=20+3141,6=20@@=20= immediately."=0A=20=20=20=20=20(setq=20= package-menu--mark-upgrades-pending=20t)=0A=20=20=20=20=20(message=20= "Waiting=20for=20refresh=20to=20finish...")))=0A=20=0A-(defun=20= package-menu--list-to-prompt=20(packages)=0A-=20=20"Return=20a=20string=20= listing=20PACKAGES=20that's=20usable=20in=20a=20prompt.=0A-PACKAGES=20is=20= a=20list=20of=20`package-desc'=20objects.=0A-Formats=20the=20returned=20= string=20to=20be=20usable=20in=20a=20minibuffer=0A-prompt=20(see=20= `package-menu--prompt-transaction-p')."=0A-=20=20(cond=0A-=20=20=20;;=20= None=0A-=20=20=20((not=20packages)=20"")=0A-=20=20=20;;=20More=20than=20= 1=0A-=20=20=20((cdr=20packages)=0A-=20=20=20=20(format=20"these=20%d=20= packages=20(%s)"=0A-=20=20=20=20=20=20(length=20packages)=0A-=20=20=20=20= =20=20(mapconcat=20#'package-desc-full-name=20packages=20",=20")))=0A-=20= =20=20;;=20Exactly=201=0A-=20=20=20(t=20(format-message=20"package=20= `%s'"=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (package-desc-full-name=20(car=20packages))))))=0A=20=0A=20(defun=20= package-menu--prompt-transaction-p=20(delete=20install=20upgrade)=0A=20=20= =20"Prompt=20the=20user=20about=20DELETE,=20INSTALL,=20and=20UPGRADE.=0A= @@=20-3164,16=20+3148,19=20@@=20DELETE,=20INSTALL,=20and=20UPGRADE=20are=20= lists=20of=20`package-desc'=20objects.=0A=20Either=20may=20be=20nil,=20= but=20not=20all."=0A=20=20=20(y-or-n-p=0A=20=20=20=20(concat=0A-=20=20=20= =20(when=20delete=20"Delete=20")=0A-=20=20=20=20= (package-menu--list-to-prompt=20delete)=0A-=20=20=20=20(when=20(and=20= delete=20install)=0A-=20=20=20=20=20=20(if=20upgrade=20";=20"=20";=20and=20= "))=0A-=20=20=20=20(when=20install=20"Install=20")=0A-=20=20=20=20= (package-menu--list-to-prompt=20install)=0A-=20=20=20=20(when=20(and=20= upgrade=20(or=20install=20delete))=20";=20and=20")=0A-=20=20=20=20(when=20= upgrade=20"Upgrade=20")=0A-=20=20=20=20(package-menu--list-to-prompt=20= upgrade)=0A-=20=20=20=20"?=20")))=0A+=20=20=20=20(when=20delete=0A+=20=20= =20=20(format-message=20"Number=20of=20packages=20to=20delete:=20%d=20= (%s).\n"=0A+=20=20=20=20=20=20(length=20delete)=0A+=20=20=20=20=20=20= (mapconcat=20#'package-desc-full-name=20delete=20",=20")))=0A+=20=20=20=20= (when=20install=0A+=20=20=20=20(format-message=20"Number=20of=20packages=20= to=20install:=20%d=20(%s).\n"=0A+=20=20=20=20=20=20(length=20install)=0A= +=20=20=20=20=20=20(mapconcat=20#'package-desc-full-name=20install=20",=20= ")))=0A+=20=20=20=20(when=20upgrade=0A+=20=20=20=20(format-message=20= "Number=20of=20packages=20to=20upgrade:=20%d=20(%s).\n"=0A+=20=20=20=20=20= =20(length=20upgrade)=0A+=20=20=20=20=20=20(mapconcat=20= #'package-desc-full-name=20upgrade=20",=20")))=0A+=20=20=20=20"Do=20you=20= want=20to=20proceed?=20")))=0A=20=0A=20(defun=20= package-menu--partition-transaction=20(install=20delete)=0A=20=20=20= "Return=20an=20alist=20describing=20an=20INSTALL=20DELETE=20transaction.=0A= @@=20-3211,7=20+3198,7=20@@=20objects=20removed."=0A=20=20=20=20=20=20=20= (condition-case-unless-debug=20err=0A=20=20=20=20=20=20=20=20=20=20=20= (let=20((inhibit-message=20package-menu-async))=0A=20=20=20=20=20=20=20=20= =20=20=20=20=20(package-delete=20elt=20nil=20'nosave))=0A-=20=20=20=20=20= =20=20=20(error=20(message=20"Error=20trying=20to=20delete=20`%s':=20%S"=0A= +=20=20=20=20=20=20=20=20(error=20(message=20"Error=20trying=20to=20= delete=20`%s':=20%S."=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20(package-desc-full-name=20elt)=0A=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20err))))))=0A=20=0A@@=20-3237,7=20+3224,7=20@@=20packages=20= marked=20for=20deletion=20are=20removed.=0A=20Optional=20argument=20= NOQUERY=20non-nil=20means=20do=20not=20ask=20the=20user=20to=20confirm."=0A= =20=20=20(interactive)=0A=20=20=20(unless=20(derived-mode-p=20= 'package-menu-mode)=0A-=20=20=20=20(error=20"The=20current=20buffer=20is=20= not=20in=20Package=20Menu=20mode"))=0A+=20=20=20=20(error=20"The=20= current=20buffer=20is=20not=20in=20Package=20Menu=20mode."))=0A=20=20=20= (let=20(install-list=20delete-list=20cmd=20pkg-desc)=0A=20=20=20=20=20= (save-excursion=0A=20=20=20=20=20=20=20(goto-char=20(point-min))=0A@@=20= -3252,30=20+3239,26=20@@=20Optional=20argument=20NOQUERY=20non-nil=20= means=20do=20not=20ask=20the=20user=20to=20confirm."=0A=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20(push=20pkg-desc=20install-list))))=0A= =20=20=20=20=20=20=20=20=20(forward-line)))=0A=20=20=20=20=20(unless=20= (or=20delete-list=20install-list)=0A-=20=20=20=20=20=20(user-error=20"No=20= operations=20specified"))=0A+=20=20=20=20=20=20(user-error=20"No=20= operations=20specified."))=0A=20=20=20=20=20(let-alist=20= (package-menu--partition-transaction=20install-list=20delete-list)=0A=20=20= =20=20=20=20=20(when=20(or=20noquery=0A=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20(package-menu--prompt-transaction-p=20.delete=20.install=20= .upgrade))=0A-=20=20=20=20=20=20=20=20(let=20((message-template=0A-=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20(concat=20"Package=20menu:=20= Operation=20%s=20["=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20(when=20.delete=20=20(format=20"Delet__=20%s"=20= (length=20.delete)))=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20(when=20(and=20.delete=20.install)=20";=20")=0A-=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(when=20= .install=20(format=20"Install__=20%s"=20(length=20.install)))=0A-=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(when=20(and=20= .upgrade=20(or=20.install=20.delete))=20";=20")=0A-=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(when=20.upgrade=20(format=20= "Upgrad__=20%s"=20(length=20.upgrade)))=0A-=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20"]")))=0A-=20=20=20=20=20=20=20=20= =20=20(message=20(replace-regexp-in-string=20"__"=20"ing"=20= message-template)=20"started")=0A+=20=20=20=20=20=20=20=20=20=20(message=20= "Package=20menu=20operation=20started:=20[deleting=20%s;=20installing=20= %s;=20upgrading=20%s].=20"=0A+=09=20=20=20=20=20=20=20(length=20.delete)=0A= +=09=20=20=20=20=20=20=20(length=20.install)=0A+=09=20=20=20=20=20=20=20= (length=20.upgrade))=0A=20=20=20=20=20=20=20=20=20=20=20;;=20Packages=20= being=20upgraded=20are=20not=20marked=20as=20selected.=0A=20=20=20=20=20=20= =20=20=20=20=20(package--update-selected-packages=20.install=20.delete)=0A= =20=20=20=20=20=20=20=20=20=20=20(package-menu--perform-transaction=20= install-list=20delete-list)=0A=20=20=20=20=20=20=20=20=20=20=20(when=20= package-selected-packages=0A=20=20=20=20=20=20=20=20=20=20=20=20=20= (if-let=20((removable=20(package--removable-packages)))=0A-=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20(message=20"Package=20menu:=20Operation=20= finished.=20=20%d=20packages=20%s"=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20(message=20"Package=20menu=20operation=20completed.=20Number=20= of=20packages=20no=20longer=20needed:=20%d.=20Type=20%s=20for=20= removal."=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (length=20removable)=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20(substitute-command-keys=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20"are=20no=20longer=20needed,=20type=20= `\\[package-autoremove]'=20to=20remove=20them"))=0A-=20=20=20=20=20=20=20= =20=20=20=20=20=20=20(message=20(replace-regexp-in-string=20"__"=20"ed"=20= message-template)=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= "finished"))))))))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20(substitute-command-keys=20"`\\[package-autoremove]'"))=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20(message=20"Package=20menu=20operation=20= completed:=20[deleted=20%s;=20installed=20%s;=20upgraded=20%s].=20"=0A+=09= =20=20=20=20=20=20=20(length=20.delete)=0A+=09=20=20=20=20=20=20=20= (length=20.install)=0A+=09=20=20=20=20=20=20=20(length=20= .upgrade))))))))=0A=20=0A=20(defun=20package-menu--version-predicate=20= (A=20B)=0A=20=20=20(let=20((vA=20(or=20(aref=20(cadr=20A)=201)=20=20= '(0)))=0A@@=20-3342,11=20+3325,9=20@@=20Store=20this=20list=20in=20= `package-menu--new-package-list'."=0A=20(defun=20= package-menu--find-and-notify-upgrades=20()=0A=20=20=20"Notify=20the=20= user=20of=20upgradable=20packages."=0A=20=20=20(when-let=20((upgrades=20= (package-menu--find-upgrades)))=0A-=20=20=20=20(message=20"%d=20= package%s=20can=20be=20upgraded;=20type=20`%s'=20to=20mark=20%s=20for=20= upgrading."=0A+=20=20=20=20(message=20"Number=20of=20packages=20that=20= can=20be=20upgraded:=20%d.=20Type=20`%s'=20to=20mark=20for=20upgrading."=0A= =20=20=20=20=20=20=20(length=20upgrades)=0A-=20=20=20=20=20=20(if=20(=3D=20= (length=20upgrades)=201)=20""=20"s")=0A-=20=20=20=20=20=20= (substitute-command-keys=20"\\[package-menu-mark-upgrades]")=0A-=20=20=20= =20=20=20(if=20(=3D=20(length=20upgrades)=201)=20"it"=20"them"))))=0A+=20= =20=20=20=20=20(substitute-command-keys=20= "\\[package-menu-mark-upgrades]"))))=0A=20=0A=20(defun=20= package-menu--post-refresh=20()=0A=20=20=20"If=20there's=20a=20= *Packages*=20buffer,=20revert=20it=20and=20check=20for=20new=20packages=20= and=20upgrades.=0A= --Apple-Mail=_D630F334-E68C-4A56-AE19-5F8B8C66F254--