home *** CD-ROM | disk | FTP | other *** search
/ vim.ftp.fu-berlin.de / 2015-02-03.vim.ftp.fu-berlin.de.tar / vim.ftp.fu-berlin.de / unix / vim-6.2.tar.bz2 / vim-6.2.tar / vim62 / runtime / ftplugin / spec.vim < prev    next >
Encoding:
Text File  |  2002-04-10  |  4.7 KB  |  167 lines

  1. " Plugin to update the %changelog section of RPM spec files
  2. " Filename: spec.vim
  3. " Maintainer: Gustavo Niemeyer <niemeyer@conectiva.com>
  4. " Last Change: Wed, 10 Apr 2002 16:28:52 -0300
  5.  
  6. if exists("b:did_ftplugin")
  7.     finish
  8. endif
  9. let b:did_ftplugin = 1
  10.  
  11. if !exists("no_plugin_maps") && !exists("no_spec_maps")
  12.     if !hasmapto("<Plug>SpecChangelog")
  13.         map <buffer> <LocalLeader>c <Plug>SpecChangelog
  14.     endif
  15. endif
  16.  
  17. noremap <buffer> <unique> <script> <Plug>SpecChangelog :call <SID>SpecChangelog("")<CR>
  18.  
  19. if !exists("*s:SpecChangelog")
  20.     function s:SpecChangelog(format)
  21.         if strlen(a:format) == 0
  22.             if !exists("g:spec_chglog_format")
  23.                 let email = input("Email address: ")
  24.                 let g:spec_chglog_format = "%a %b %d %Y " . l:email
  25.                 echo "\r"
  26.             endif
  27.             let format = g:spec_chglog_format
  28.         else
  29.             if !exists("g:spec_chglog_format")
  30.                 let g:spec_chglog_format = a:format
  31.             endif
  32.             let format = a:format
  33.         endif
  34.         let line = 0
  35.         let name = ""
  36.         let ver = ""
  37.         let rel = ""
  38.         let nameline = -1
  39.         let verline = -1
  40.         let relline = -1
  41.         let chgline = -1
  42.         while (line <= line("$"))
  43.             let linestr = getline(line)
  44.             if (name == "" && linestr =~? '^Name:')
  45.                 let nameline = line
  46.                 let name = substitute(strpart(linestr,5), '^[     ]*\([^     ]\+\)[        ]*$','\1','')
  47.             elseif (ver == "" && linestr =~? '^Version:')
  48.                 let verline = line
  49.                 let ver = substitute(strpart(linestr,8), '^[     ]*\([^     ]\+\)[        ]*$','\1','')
  50.             elseif (rel == "" && linestr =~? '^Release:')
  51.                 let relline = line
  52.                 let rel = substitute(strpart(linestr,8), '^[     ]*\([^     ]\+\)[        ]*$','\1','')
  53.             elseif (linestr =~? '^%changelog')
  54.                 let chgline = line
  55.                 execute line
  56.                 break
  57.             endif
  58.             let line = line+1
  59.         endwhile
  60.         if (nameline != -1 && verline != -1 && relline != -1)
  61.             let include_release_info = exists("g:spec_chglog_release_info")
  62.             let name = s:ParseRpmVars(name, nameline)
  63.             let ver = s:ParseRpmVars(ver, verline)
  64.             let rel = s:ParseRpmVars(rel, relline)
  65.         else
  66.             let include_release_info = 0
  67.         endif
  68.         if (chgline == -1)
  69.             let option = confirm("Can't find %changelog. Create one? ","&End of file\n&Here\n&Cancel",3)
  70.             if (option == 1)
  71.                 call append(line("$"),"")
  72.                 call append(line("$"),"%changelog")
  73.                 execute line("$")
  74.                 let chgline = line(".")
  75.             elseif (option == 2)
  76.                 call append(line("."),"%changelog")
  77.                 normal j
  78.                 chgline = line(".")
  79.             endif
  80.         endif
  81.         if (chgline != -1)
  82.             let parsed_format = "* ".strftime(format)
  83.             let release_info = "+ ".name."-".ver."-".rel
  84.             let wrong_format = 0
  85.             let wrong_release = 0
  86.             let insert_line = 0
  87.             if (getline(chgline+1) != parsed_format)
  88.                 let wrong_format = 1
  89.             endif
  90.             if (include_release_info && getline(chgline+2) != release_info)
  91.                 let wrong_release = 1
  92.             endif
  93.             if (wrong_format || wrong_release)
  94.                 if (include_release_info && !wrong_release && !exists("g:spec_chglog_never_increase_release"))
  95.                     let option = confirm("Increase release? ","&Yes\n&No",1)
  96.                     if (option == 1)
  97.                         execute relline
  98.                         normal 
  99.                         let rel = substitute(strpart(getline(relline),8), '^[     ]*\([^     ]\+\)[        ]*$','\1','')
  100.                         let release_info = "+ ".name."-".ver."-".rel
  101.                     endif
  102.                 endif
  103.                 let n = 0
  104.                 call append(chgline+n, parsed_format)
  105.                 if include_release_info
  106.                     let n = n + 1
  107.                     call append(chgline+n, release_info)
  108.                 endif
  109.                 let n = n + 1
  110.                 call append(chgline+n,"- ")
  111.                 let n = n + 1
  112.                 call append(chgline+n,"")
  113.                 let insert_line = chgline+n
  114.             else
  115.                 let line = chgline
  116.                 if !exists("g:spec_chglog_prepend")
  117.                     while !(getline(line+2) =~ '^\( *\|\*.*\)$')
  118.                         let line = line+1
  119.                     endwhile
  120.                 endif
  121.                 call append(line+1,"- ")
  122.                 let insert_line = line+2
  123.             endif
  124.             execute insert_line
  125.             startinsert!
  126.         endif
  127.     endfunction
  128. endif
  129.  
  130. function s:ParseRpmVars(str, strline)
  131.     let end = -1
  132.     let ret = ""
  133.     while (1)
  134.         let start = match(a:str, "\%{", end+1)
  135.         if (start == -1)
  136.             let ret = ret . strpart(a:str, end+1)
  137.             break
  138.         endif
  139.         let ret = ret . strpart(a:str, end+1, start-(end+1))
  140.         let end = match(a:str, "}", start)
  141.         if (end == -1)
  142.             let ret = ret . strpart(a:str, start)
  143.             break
  144.         endif
  145.         let varname = strpart(a:str, start+2, end-(start+2))
  146.         execute a:strline
  147.         let definestr = "^[ \t]*%define[ \t]\\+" . varname . "[ \t]\\+\\(.*\\)$"
  148.         let linenum = search(definestr, "bW")
  149.         if (linenum != -1)
  150.             let ret = ret .  substitute(getline(linenum), definestr, "\\1", "")
  151.         else
  152.             let ret = ret . strpart(str, start, end+1-start)
  153.         endif
  154.     endwhile
  155.     return ret
  156. endfunction
  157.  
  158. " The following lines, along with the macros/matchit.vim plugin,
  159. " make it easy to navigate the different sections of a spec file
  160. " with the % key (thanks to Max Ischenko).
  161.  
  162. let b:match_ignorecase = 0
  163. let b:match_words =
  164.   \ '^Name:^%description:^%clean:^%setup:^%build:^%install:^%files:' .
  165.   \ '^%package:^%preun:^%postun:^%changelog'
  166.  
  167.