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)