]> git.eshelyaron.com Git - emacs.git/commitdiff
Use unar and lsar to handle RAR archives in arc-mode
authorNicolas Petton <nicolas@petton.fr>
Wed, 30 Sep 2015 08:04:09 +0000 (10:04 +0200)
committerNicolas Petton <nicolas@petton.fr>
Wed, 30 Sep 2015 08:13:26 +0000 (10:13 +0200)
* lisp/arc-mode.el (archive-rar-extract, archive-extract-by-file): Rely
on unar and lsar instead of unrar-free for RAR archives (Bug#17663).

lisp/arc-mode.el

index f852f2d1a408978ba8c0d1c611be51e096b20709..7d2cab3edeea3c1a9690d7ceae9dcec59103496e 100644 (file)
@@ -1162,7 +1162,7 @@ using `make-temp-file', and the generated name is returned."
                   nil
                   `(:file ,stdout-file)
                   nil
-                  (append (cdr command) (list archive name dest)))
+                   `(,archive ,name ,@(cdr command) ,dest))
          (with-temp-buffer
            (insert-file-contents stdout-file)
            (goto-char (point-min))
@@ -2038,27 +2038,26 @@ This doesn't recover lost files, it just undoes changes in the buffer itself."
          (maxsize 5)
          (files ()))
     (with-temp-buffer
-      (call-process "unrar-free" nil t nil "--list" (or file copy))
+      (call-process "lsar" nil t nil "-l" (or file copy))
       (if copy (delete-file copy))
       (goto-char (point-min))
-      (re-search-forward "^-+\n")
-      (while (looking-at (concat " \\(.*\\)\n" ;Name.
-                                 ;; Size ; Packed.
-                                 " +\\([0-9]+\\) +[0-9]+"
-                                 ;; Ratio ; Date'
-                                 " +\\([0-9%]+\\) +\\([-0-9]+\\)"
-                                 ;; Time ; Attr.
-                                 " +\\([0-9:]+\\) +[^ \n]\\{6,10\\}"
-                                 ;; CRC; Meth ; Var.
-                                 " +[0-9A-F]+ +[^ \n]+ +[0-9.]+\n"))
+      (re-search-forward "^\\(\s+=+\s?+\\)+\n")
+      (while (looking-at (concat "^\s+[0-9.]+\s+-+\s+"   ; Flags
+                                 "\\([0-9-]+\\)\s+"      ; Size
+                                 "\\([0-9.%]+\\)\s+"     ; Ratio
+                                 "\\([0-9a-zA-Z]+\\)\s+" ; Mode
+                                 "\\([0-9-]+\\)\s+"      ; Date
+                                 "\\([0-9:]+\\)\s+"      ; Time
+                                 "\\(.*\\)\n"            ; Name
+                                 ))
         (goto-char (match-end 0))
-        (let ((name (match-string 1))
-              (size (match-string 2)))
+        (let ((name (match-string 6))
+              (size (match-string 1)))
           (if (> (length name) maxname) (setq maxname (length name)))
           (if (> (length size) maxsize) (setq maxsize (length size)))
           (push (vector name name nil nil
                         ;; Size, Ratio.
-                        size (match-string 3)
+                        size (match-string 2)
                         ;; Date, Time.
                         (match-string 4) (match-string 5))
                 files))))
@@ -2091,7 +2090,7 @@ This doesn't recover lost files, it just undoes changes in the buffer itself."
       ;; The code below assumes the name is relative and may do undesirable
       ;; things otherwise.
       (error "Can't extract files with non-relative names")
-    (archive-extract-by-file archive name '("unrar-free" "--extract") "All OK")))
+    (archive-extract-by-file archive name `("unar" "-no-directory" "-o") "Successfully extracted")))
 
 ;;; Section: Rar self-extracting .exe archives.