--- Begin Message ---
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 <[email protected]>
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 <[email protected]>
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)
--- End Message ---