qx13468 28d94f21ed trunk eingeführt
git-svn-id: https://vimsuite.svn.sourceforge.net/svnroot/vimsuite/trunk@133 eb2d0018-73a3-4aeb-bfe9-1def61c9ec69
2007-04-12 15:34:18 +00:00

532 lines
17 KiB
VimL

" ===========================================================================
" File: ccm.vim
" Author: Stefan Liebl (S.Liebl@gmx.de)
" Description: handles version controlling with Continuus
" ===========================================================================
if exists('g:noccm')
finish
endif
" --------------------------
" config datei für Continuus
" --------------------------
if !exists('g:ccm')
let g:ccm = 'ccm '
endif
" --------
" commands
" --------
command -nargs=0 CCMconnect call s:CCMconnect()
command -nargs=? CCMcheckout call s:CCMcheckout(expand('%:p'), '<args>')
command -nargs=? CCMcheckpoint call s:CCMcheckpoint(expand('%:p'), '<args>')
command -nargs=0 CCMchangeable call s:CCMchangeable('qx13468')
command -nargs=0 CCMdiff call s:CCMdiff(expand('%:p'))
command -nargs=0 CCMobject call s:CCM_get_object(expand('%:p'))
command -nargs=0 CCMhistory call s:CCMhistory(expand('%:p'))
" ----
" Menu
" ----
let s:CCMMenuLocation = 100
let s:CCMmenuname = '&CCM.'
"-------------------------
function s:CCMRedrawMenu()
"-------------------------
exec 'anoremenu '.s:CCMMenuLocation.'.40 '.s:CCMmenuname.
\'check\ &out<tab>:CCMcheckout'.
\' :CCMcheckout<CR>'
exec 'anoremenu '.s:CCMMenuLocation.'.40 '.s:CCMmenuname.
\'check&point<tab>:CCMcheckpoint'.
\' :CCMcheckpoint ""<CR>'
exec 'anoremenu '.s:CCMMenuLocation.'.40 '.s:CCMmenuname.
\'&diff<tab>:CCMdiff'.
\' :CCMdiff<CR>'
exec 'anoremenu '.s:CCMMenuLocation.'.40 '.s:CCMmenuname.
\'show\ &history<tab>:CCMhistory'.
\' :CCMhistory<CR>'
endfunction
if !exists('noccmmenu')
call s:CCMRedrawMenu()
endif
" -------------------
" Regular Expressions
" -------------------
let s:any = '.*'
let s:word = '\(\w\+\)'
let s:noPathSeparator = '\([^/\\]\+\)'
"-----------------------------
function s:CCM_run_silent(cmd)
"-----------------------------
let expression = g:ccm .' '. a:cmd
echo expression
let output = system(expression)
return split(output, "\n")
endfunction
"----------------------
function s:CCM_run(cmd)
"----------------------
call s:CCMconnect()
let output = s:CCM_run_silent(a:cmd)
for line in output
echo line
endfor
echo '---'
return output
endfunction
let s:connected = 0
"-------------------------
function s:CCMconnected()
"-------------------------
let output = s:CCM_run_silent('status')
if (match(output, "Current project:") >= 0)
let s:connected = 1
endif
return s:connected
endfunction
"-----------------------
function s:CCMconnect()
"-----------------------
if !s:connected
if !s:CCMconnected()
let output = s:CCM_run_silent('start')
let s:connected = 1
endif
endif
endfunction
"---------------------------
function s:Set_compare_cmd()
"---------------------------
let vimdiff = g:gvim
let commands = ' -c ' . '\"winsize 201 60\" -c \"set winwidth=100\"'
let options = ' -d' . ' %file1 %file2' . ' --servername DIFF'
let compare_cmd = Double_quote(vimdiff . commands . options)
let output = s:CCM_run('set cli_compare_cmd ' . compare_cmd)
"let output = s:CCM_run('set compare_cmd')
endfunction
"---------------------------
function s:CCM_query(string)
"---------------------------
let query_string = 'query ' . a:string
let query_format = ' /nf /no_sort /u /f ' . '"%objectname"'
let output = s:CCM_run(query_string . query_format)
return output
endfunction
"-------------------------------
function s:CCM_get_owner(object)
"-------------------------------
let query_string = 'properties ' . a:object['objectname']
let query_format = ' /f ' . '"%owner"'
let output = s:CCM_run(query_string . query_format)
return output
endfunction
"--------------------------------
function s:CCM_long_query(string)
"--------------------------------
let query_string = 'query ' . a:string
let query_format = ' /u /f ' . '"%objectname %status %owner %task"'
let output = s:CCM_run(query_string . query_format)
return output
endfunction
"------------------------------------
function s:CCM_get_project(filename)
"------------------------------------
" in Verzeichnis des Files wechseln
let dirname = fnamemodify(a:filename, ':p:h')
let cwd_old = getcwd()
execute 'cd ' . dirname
" project ermitteln
let query_string = 'work_area -show '
let output = s:CCM_run(query_string)
for line in output
let projectname = substitute(line, '\(\S\+\).*', '\1', '')
endfor
if projectname == ''
echo 'No project found for ' . a:filename
echo '=============================='
echo ' '
endif
" Verzeichnis zurücksetzen
execute 'cd ' . cwd_old
let project = s:CCM_split_object(projectname)
return project
endfunction
"-----------------------------------
function s:CCM_get_object(filename)
"-----------------------------------
let basename = fnamemodify(a:filename, ':t')
let dirname = fnamemodify(a:filename, ':p:h')
let object = {}
let project = s:CCM_get_project(a:filename)
if project != {}
let query_string = '"'
\ . 'name=' . Single_quote(basename)
\ . ' and is_member_of(' . Single_quote(project['displayname']) . ')"'
let objectnames = s:CCM_query(query_string)
let object = s:CCM_choose_object(a:filename, objectnames, project)
if object == {}
echo 'no object found for ' . a:filename
else
echo object['objectname']
endif
else
echo 'No Project'
endif
return object
endfunction
"------------------------------------------------------------
function s:CCM_choose_object(filename, objectnames, project)
"------------------------------------------------------------
let result = {}
for line in a:objectnames
let object = s:CCM_split_object(line)
let objectpath = s:CCM_get_path(object, a:project)
let object['path'] = objectpath
if object['path'] == a:filename
let result = object
endif
endfor
return result
endfunction
"---------------------------------------
function s:CCM_split_object(objectname)
"---------------------------------------
let object = {}
let reName = '\([^-]\+\)'
let reVersion = '\([^:]\+\)'
let reType = '\([^:]\+\)'
let reInstance = '\(\d\+\)'
let regexp = reName.'-'.reVersion
let regexp = regexp.'\%('.':'.reType.':'.reInstance
let regexp = regexp.'\)\?'
let object['name'] = substitute(a:objectname, regexp, '\1', '')
let object['version'] = substitute(a:objectname, regexp, '\2', '')
let object['type'] = substitute(a:objectname, regexp, '\3', '')
let object['instance'] = substitute(a:objectname, regexp, '\4', '')
let object['displayname'] = object['name'].'-'.object['version']
let object['objectname'] = object['displayname'].':'.object['type'].':'.object['instance']
return object
endfunction
"----------------------------------------
function s:CCM_get_path(object, project)
"----------------------------------------
let query_string = 'finduse'
\ .' /n "'.a:object['name'].'"'
\ .' /v "'.a:object['version'].'"'
\ .' /t "'.a:object['type'].'"'
\ .' /i "'.a:object['instance'].'"'
\ .' /working_proj'
let lines = s:CCM_run(query_string)
for line in lines
let regexp = '.*\s\(\S*' . a:object['name'] . '\)-'.a:object['version'].'@' . a:project['displayname']
let relpath = substitute(line, regexp, '\1', '')
let foundpath = findfile(relpath)
if foundpath == ''
let relpath = substitute(relpath, '[^/\\]\+[/\\]\(.*\)', '\1', '')
let foundpath = findfile(relpath)
endif
if foundpath != ''
let path = fnamemodify(foundpath, ':p')
return path
endif
endfor
return ''
endfunction
"-----------------------------------
function s:CCM_get_successor(object)
"-----------------------------------
let query_string = 'is_successor_of(' . Single_quote(a:object['objectname']) . ')'
let predecessor = s:CCM_query(query_string)
if predecessor == ''
echo 'no successor found for ' . a:object['objectname']
else
" delete <CR>
let predecessor = matchstr(predecessor, '\p\+')
endif
return predecessor
endfunction
"-------------------------------------
function s:CCM_get_predecessor(object)
"-------------------------------------
let query_string = 'is_predecessor_of(' . Single_quote(a:object['objectname']) . ')'
let query_answer = s:CCM_query(query_string)
let predecessor = {}
if query_answer[0] == ''
echo 'no predecessor found for ' . a:object['objectname']
else
let predecessorname = matchstr(query_answer, '\p\+')
let predecessor = s:CCM_split_object(predecessorname)
endif
return predecessor
endfunction
"-----------------------------------
function s:CCM_get_hist_root(object)
"-----------------------------------
let query_string = '"'
\ . 'name=' . Single_quote(a:object['name'])
\ . ' and instance=' . Single_quote(a:object['instance'])
\ . ' and is_hist_root()"'
let hist_root = s:CCM_query(query_string)
if hist_root == ''
echo 'no hist_root found for ' . a:object['objectname']
else
let hist_root = matchstr(hist_root, '\p\+')
endif
return hist_root
endfunction
"--------------------------------
function s:CCM_get_default_task()
"--------------------------------
let output = s:CCM_run('task /default')
if match(output[0], '\d\+') >= 0
let task = matchstr(output[0], '\d\+')
else
let task = 'none'
endif
return task
endfunction
"--------------------------------------------------
function s:CCM_check_out(object, project, comment)
"--------------------------------------------------
let default_task = s:CCM_get_default_task()
if default_task == 'none'
echo 'no default task!'
else
let comment = '/comment "' . a:comment . '"'
let task = '/task ' . default_task
let project = '/project ' . a:project['displayname']
let object = a:object['objectname']
let expression = 'checkout ' . comment .' '. task . ' '. object
" cd to directory
let objectpath = s:CCM_get_path(a:object, a:project)
let old_cwd = getcwd()
execute 'cd ' . fnamemodify(objectpath, ':p:h')
let output = s:CCM_run(expression)
" go back
execute 'cd ' . old_cwd
endif
endfunction
"----------------------------------------------
function s:CCM_check_in(object, state, comment)
"----------------------------------------------
let comment = '/comment "' . a:comment . '" '
let state = '/state ' . a:state . ' '
let expression = 'checkin ' . comment . state . a:object['objectname']
echo 'comment:' . comment
echo 'state:' . state
echo 'expression:' . expression
echo 'execute'
let output = s:CCM_run(expression)
endfunction
"----------------------------------------
function s:CCMcheckout(filename, comment)
"----------------------------------------
let object = s:CCM_get_object(a:filename)
let project = s:CCM_get_project(a:filename)
if object != {}
let output = s:CCM_check_out(object, project, a:comment)
endif
endfunction
"------------------------------------------
function s:CCMcheckpoint(filename, comment)
"------------------------------------------
let object = s:CCM_get_object(a:filename)
if object != {}
if (a:comment == '')
if has('gui')
let l:comment = inputdialog('comment:')
else
echo 'enter a comment'
return
endif
else
let l:comment = a:comment
endif
let state = 'checkpoint'
let output = s:CCM_check_in(object, state, l:comment)
endif
endfunction
"------------------------------
function s:CCMchangeable(owner)
"------------------------------
let object = ''
if project == '?'
let owner = 'owner=' . Single_quote(a:owner)
let project = ' and project=' . Single_quote('bmsk')
let released = ' and status!=' . Single_quote('released')
let integrate = ' and status!=' . Single_quote('integrate')
let rejected = ' and status!=' . Single_quote('rejected')
let status = released . integrate . rejected
let query_string = '"' . owner . project . status . '"'
let object = s:CCM_long_query(query_string)
endif
if object == ''
echo 'no working objects found for ' . a:owner
endif
return object
endfunction
"---------------------------
function s:CCMdiff(filename)
"---------------------------
let object = s:CCM_get_object(a:filename)
if object != {}
let predecessor = s:CCM_get_predecessor(object)
if predecessor != {}
let output = s:CCM_run_silent('diff /g ' . predecessor['objectname'] . ' ' . a:filename)
endif
endif
endfunction
"---------------------------------
function s:CCM_view_object(object)
"---------------------------------
let file_content = s:CCM_run_silent('type ' . a:object['objectname'])
return file_content
endfunction
"------------------------------
function s:CCMhistory(filename)
"------------------------------
let object = s:CCM_get_object(a:filename)
if object != {}
let expression = 'history /g ' . object['objectname']
let output = s:CCM_run(expression)
endif
endfunction
"-----------------------
function s:Wait(seconds)
"-----------------------
let starttime = localtime()
while ((localtime() - starttime) < a:seconds)
endwhile
endfunction
"------------------------------
" Funktionen für Change Synergy
"------------------------------
"command ChangeSynergyBeautify call s:ChangeSynergyBeautify()
command ChangeSynergyCreateCRTaskList call s:ChangeSynergyCreateCRTaskList()
command ChangeSynergyCreateCRList call s:ChangeSynergyCreateCRList()
command ChangeSynergyCreateTaskList call s:ChangeSynergyCreateTaskList()
let s:CR_text = 'CR '
let s:Task_text = 'Task '
" Umformatieren der CR-Liste aus dem ChangeSynergy Bericht
function s:ChangeSynergyBeautify()
DelAllMultipleEmptyLines
call s:ChangeSynergyDeleteRejected()
call s:ChangeSynergyFormatTasks()
call s:ChangeSynergyFormatCRs()
endfunction
" Liste mit allen CRs incl. Tasks aus Bericht
function s:ChangeSynergyCreateCRTaskList()
call s:ChangeSynergyBeautify()
let RE = '^\(' . s:CR_text . '.*\)'
execute ':%s/' . RE . '/\r\1/e'
normal ggdddw
endfunction
" Liste mit allen CRs aus Bericht
function s:ChangeSynergyCreateCRList()
call s:ChangeSynergyBeautify()
let RE = '^' . s:Task_text . '.*\n'
execute ':%s/' . RE . '//e'
execute ':3,$sort'
endfunction
" Liste mit allen Tasks aus Bericht
function s:ChangeSynergyCreateTaskList()
call s:ChangeSynergyBeautify()
let RE = '^' . s:CR_text . '.*\n'
execute ':%s/' . RE . '//e'
execute ':3,$sort'
endfunction
" Löschen der CRs mit Status 'rejected'
function s:ChangeSynergyDeleteRejected()
let RE = s:ComposeCrTaskRE('rejected')
execute ':%s/' . RE . '//e'
endfunction
" Task umfomatieren
function s:ChangeSynergyFormatTasks()
let RE = '\%('
\ . 'Task Number:\s\+\(\d\+\)'
\ . '\s\+'
\ . 'Resolver:\s\+\(.\+\)'
\ . '\s\+'
\ . 'Status:\s\+\(\w\+\)'
\ . '\n'
\ . 'Synopsis:\s\+\(.*\)'
\ . '\n'
\ . '\)'
" execute '%:s/' . RE . '/' . s:Task_text . '\1\t\2:\t\4/e'
execute '%:s/' . RE . '/\=printf("%s%4s %-32s: %s", s:Task_text, submatch(1), submatch(2), submatch(4))/e'
endfunction
" CR umfomatieren
function s:ChangeSynergyFormatCRs()
let RE = '\%('
\ . 'CR ID:\s\+\(\d\+\)'
\ . '\s\+'
\ . 'Resolver:\s\+\(.\+\)'
\ . '\s\+'
\ . 'Status:\s\+\(\w\+\)'
\ . '\n'
\ . 'Synopsis:\s\+\(.*\)'
\ . '\n'
\ . '\)'
" execute '%:s/' . RE . '/' . s:CR_text . '\1\t\2:\t\4/e'
execute '%:s/' . RE . '/\=printf("%s %4s %-32s: %s", s:CR_text, submatch(1), submatch(2), submatch(4))/e'
endfunction
" Zusammensetzen der Regular Expression für ChangeRequests aus dem Bericht
" Open PST + CR + Task
function s:ComposeCrTaskRE(CRstatus)
if a:CRstatus == ''
let CRstatus = '\w\+'
else
let CRstatus = a:CRstatus
endif
let taskRE = '\(Task Number:.*\nSynopsis:.*\n\n\)'
let crRE = 'CR ID:.*Status:\s\+\(' . CRstatus . '\)\nSynopsis:.*\n\%(\s*\n\)*' . taskRE . '*'
return crRE
endfunction
EchoDebug 'loaded ccm.vim'