Package: vim-scripts
Version: 20130814
Severity: wishlist
Tags: patch

Hi!

While trying to improve the state of the deb support [D] in several
programs and tools, I came across vim-scripts, which is currently
missing support for control.tar.xz and control.tar. Here's a patch
updating the current one (and the entire patch), although I was
unable to properly test it because I could not seem to even get the
original code to work, I'm assuming that I was doing something wrong,
so I just wanted to post it here so that it does not get lost.

 [D] <https://wiki.debian.org/Teams/Dpkg/DebSupport>

Thanks,
Guillem
diff --git a/debian/patches/deb.vim-xz.diff b/debian/patches/deb.vim-xz.diff
index b329564..d67e774 100644
--- a/debian/patches/deb.vim-xz.diff
+++ b/debian/patches/deb.vim-xz.diff
@@ -2,10 +2,20 @@ Subject: Add support for xz-compressed debs
 Author: Jakub Wilk <jw...@debian.org>
 Bug-Debian: http://bugs.debian.org/644172
 
-diff --git a/autoload/deb.vim b/autoload/deb.vim
+---
+ autoload/deb.vim |   41 +++++++++++++++++++++++++++++++++++------
+ 1 file changed, 35 insertions(+), 6 deletions(-)
+
 --- a/autoload/deb.vim
 +++ b/autoload/deb.vim
-@@ -32,6 +32,8 @@
+@@ -26,12 +26,14 @@ fun! deb#read(debfile, member)
+ 
+     let l:archmember = s:dataFileName(a:debfile) " default archive member to extract
+     if l:archmember == ""
+-        echohl WarningMsg | echo "***error*** (deb#read) no valid data file found in debian archive"
++        echohl WarningMsg | echo "***error*** (deb#read) no valid data member found in debian archive"
+         return
+     elseif l:archmember == "data.tar.gz"
          let l:unpcmp = "tar zxfO "
      elseif l:archmember == "data.tar.bz2"
          let l:unpcmp = "tar jxfO "
@@ -14,12 +24,70 @@ diff --git a/autoload/deb.vim b/autoload/deb.vim
      elseif l:archmember == "data.tar.lzma"
          if !s:hascmd("lzma")
              return
-@@ -230,7 +232,7 @@
+@@ -42,9 +44,18 @@ fun! deb#read(debfile, member)
+     endif
+ 
+     if a:member =~ '^\* ' " information control file
+-        let l:archmember = "control.tar.gz"
+         let l:target = substitute(l:target, "^\* ", "", "")
+-        let l:unpcmp = "tar zxfO "
++        let l:archmember = s:controlFileName(a:debfile)
++        if l:archmember == ""
++            echohl WarningMsg | echo "***error*** (deb#read) no valid control member found in debian archive"
++            return
++        elseif l:archmember == "control.tar.gz"
++            let l:unpcmp = "tar zxfO "
++        elseif l:archmember == "control.tar.xz"
++            let l:unpcmp = "tar JxfO "
++        elseif l:archmember == "control.tar"
++            let l:unpcmp = "tar xfO "
++        endif
+     elseif a:member =~ ' -> ' " symbolic link
+         let l:target = split(a:member,' -> ')[0]
+         let l:linkname = split(a:member,' -> ')[1]
+@@ -151,7 +162,13 @@ fun! deb#browse(file)
+ 
+     " display information control files
+     let l:infopos = line(".")
+-    exe "silent read! ar p " . s:QuoteFile(a:file) . " control.tar.gz | tar zt"
++    let l:ctrlmember = s:controlFileName(a:file)
++    if l:ctrlmember == ""
++       echohl WarningMsg | echo "***error*** (deb#Browser) no valid control member found in debian archive"
++       return
++    endif
++
++    exe "silent read! ar p " . s:QuoteFile(a:file) . " " . l:ctrlmember . " | tar zt"
+ 
+     $put=''
+ 
+@@ -227,16 +244,28 @@ fun! s:DebBrowseSelect()
+ 
+ endfun
+ 
++" return control file name for debian package. This can be either control.tar,
++" control.tar.gz or control.tar.xz
++fun s:controlFileName(deb)
++    return s:findFileName(a:deb, ["control.tar.gz", "control.tar.xz", "control.tar"])
++endfun
++
  " return data file name for debian package. This can be either data.tar.gz,
  " data.tar.bz2 or data.tar.lzma
  fun s:dataFileName(deb)
 -    for fn in ["data.tar.gz", "data.tar.bz2", "data.tar.lzma", "data.tar"]
-+    for fn in ["data.tar.gz", "data.tar.bz2", "data.tar.lzma", "data.tar.xz", "data.tar"]
++    return s:findFileName(a:deb, ["data.tar.gz", "data.tar.bz2", "data.tar.lzma", "data.tar.xz", "data.tar"])
++endfun
++
++" return a file name for debian package. This will be the first match from
++" the files passed as arguments.
++fun s:findFileName(deb, list)
++    for fn in a:list
          " [0:-2] is to remove trailing null character from command output
          if (system("ar t " . "'" . a:deb . "'" . " " . fn))[0:-2] == fn
              return fn
+         endif
+     endfor
+-    return "" " no debian data format in this archive
++    return "" " cannot find file in this debian archive
+ endfun
+ 
+ fun s:QuoteFile(file)
Subject: Add support for xz-compressed debs
Author: Jakub Wilk <jw...@debian.org>
Bug-Debian: http://bugs.debian.org/644172

---
 autoload/deb.vim |   41 +++++++++++++++++++++++++++++++++++------
 1 file changed, 35 insertions(+), 6 deletions(-)

--- a/autoload/deb.vim
+++ b/autoload/deb.vim
@@ -26,12 +26,14 @@ fun! deb#read(debfile, member)
 
     let l:archmember = s:dataFileName(a:debfile) " default archive member to extract
     if l:archmember == ""
-        echohl WarningMsg | echo "***error*** (deb#read) no valid data file found in debian archive"
+        echohl WarningMsg | echo "***error*** (deb#read) no valid data member found in debian archive"
         return
     elseif l:archmember == "data.tar.gz"
         let l:unpcmp = "tar zxfO "
     elseif l:archmember == "data.tar.bz2"
         let l:unpcmp = "tar jxfO "
+    elseif l:archmember == "data.tar.xz"
+	let l:unpcmp = "tar JxfO "
     elseif l:archmember == "data.tar.lzma"
         if !s:hascmd("lzma")
             return
@@ -42,9 +44,18 @@ fun! deb#read(debfile, member)
     endif
 
     if a:member =~ '^\* ' " information control file
-        let l:archmember = "control.tar.gz"
         let l:target = substitute(l:target, "^\* ", "", "")
-        let l:unpcmp = "tar zxfO "
+        let l:archmember = s:controlFileName(a:debfile)
+        if l:archmember == ""
+            echohl WarningMsg | echo "***error*** (deb#read) no valid control member found in debian archive"
+            return
+        elseif l:archmember == "control.tar.gz"
+            let l:unpcmp = "tar zxfO "
+        elseif l:archmember == "control.tar.xz"
+            let l:unpcmp = "tar JxfO "
+        elseif l:archmember == "control.tar"
+            let l:unpcmp = "tar xfO "
+        endif
     elseif a:member =~ ' -> ' " symbolic link
         let l:target = split(a:member,' -> ')[0]
         let l:linkname = split(a:member,' -> ')[1]
@@ -151,7 +162,13 @@ fun! deb#browse(file)
 
     " display information control files
     let l:infopos = line(".")
-    exe "silent read! ar p " . s:QuoteFile(a:file) . " control.tar.gz | tar zt"
+    let l:ctrlmember = s:controlFileName(a:file)
+    if l:ctrlmember == ""
+       echohl WarningMsg | echo "***error*** (deb#Browser) no valid control member found in debian archive"
+       return
+    endif
+
+    exe "silent read! ar p " . s:QuoteFile(a:file) . " " . l:ctrlmember . " | tar zt"
 
     $put=''
 
@@ -227,16 +244,28 @@ fun! s:DebBrowseSelect()
 
 endfun
 
+" return control file name for debian package. This can be either control.tar,
+" control.tar.gz or control.tar.xz
+fun s:controlFileName(deb)
+    return s:findFileName(a:deb, ["control.tar.gz", "control.tar.xz", "control.tar"])
+endfun
+
 " return data file name for debian package. This can be either data.tar.gz,
 " data.tar.bz2 or data.tar.lzma
 fun s:dataFileName(deb)
-    for fn in ["data.tar.gz", "data.tar.bz2", "data.tar.lzma", "data.tar"]
+    return s:findFileName(a:deb, ["data.tar.gz", "data.tar.bz2", "data.tar.lzma", "data.tar.xz", "data.tar"])
+endfun
+
+" return a file name for debian package. This will be the first match from
+" the files passed as arguments.
+fun s:findFileName(deb, list)
+    for fn in a:list
         " [0:-2] is to remove trailing null character from command output
         if (system("ar t " . "'" . a:deb . "'" . " " . fn))[0:-2] == fn
             return fn
         endif
     endfor
-    return "" " no debian data format in this archive
+    return "" " cannot find file in this debian archive
 endfun
 
 fun s:QuoteFile(file)

Reply via email to