351 else |
351 else |
352 " The file is tracked, we can try to get is revision number |
352 " The file is tracked, we can try to get is revision number |
353 let hgCommand = s:HGGetOption("HGCommandHGExec", "hg") . " parents -b " |
353 let hgCommand = s:HGGetOption("HGCommandHGExec", "hg") . " parents -b " |
354 let statustext=system(hgCommand) |
354 let statustext=system(hgCommand) |
355 if(v:shell_error) |
355 if(v:shell_error) |
356 return "" |
356 return "" |
357 endif |
357 endif |
358 let revision=substitute(statustext, '^changeset:\s*\(\d\+\):.*\_$\_.*$', '\1', "") |
358 let revision=substitute(statustext, '^changeset:\s*\(\d\+\):.*\_$\_.*$', '\1', "") |
359 |
359 |
360 if a:branchVar != "" && match(statustext, '^\_.*\_^branch:') >= 0 |
360 if a:branchVar != "" && match(statustext, '^\_.*\_^branch:') >= 0 |
361 let branch=substitute(statustext, '^\_.*\_^branch:\s*\(\S\+\)\n\_.*$', '\1', "") |
361 let branch=substitute(statustext, '^\_.*\_^branch:\s*\(\S\+\)\n\_.*$', '\1', "") |
362 let returnExpression=returnExpression . " | let " . a:branchVar . "='" . branch . "'" |
362 let returnExpression=returnExpression . " | let " . a:branchVar . "='" . branch . "'" |
363 endif |
363 endif |
364 endif |
364 endif |
365 if (exists('revision')) |
365 if (exists('revision')) |
366 let returnExpression = "let " . a:revisionVar . "='" . revision . "' " . returnExpression |
366 let returnExpression = "let " . a:revisionVar . "='" . revision . "' " . returnExpression |
367 endif |
367 endif |
476 " will be replaced with this string with 'v' prefix. |
476 " will be replaced with this string with 'v' prefix. |
477 " Return: |
477 " Return: |
478 " 1 if new document installed, 0 otherwise. |
478 " 1 if new document installed, 0 otherwise. |
479 " Note: Cleaned and generalized by guo-peng Wen |
479 " Note: Cleaned and generalized by guo-peng Wen |
480 "''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' |
480 "''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' |
|
481 " Helper function to make mkdir as portable as possible |
|
482 function! s:HGFlexiMkdir(dir) |
|
483 if exists("*mkdir") " we can use Vim's own mkdir() |
|
484 call mkdir(a:dir) |
|
485 elseif !exists("+shellslash") |
|
486 call system('mkdir -p "'.a:dir.'"') |
|
487 else " M$ |
|
488 let l:ssl = &shellslash |
|
489 try |
|
490 set shellslash |
|
491 call system('mkdir "'.a:dir.'"') |
|
492 finally |
|
493 let &shellslash = l:ssl |
|
494 endtry |
|
495 endif |
|
496 endfunction |
481 |
497 |
482 function! s:HGInstallDocumentation(full_name, revision) |
498 function! s:HGInstallDocumentation(full_name, revision) |
483 " Name of the document path based on the system we use: |
499 " Figure out document path based on full name of this script: |
484 if (has("unix")) |
500 let l:vim_plugin_path = fnamemodify(a:full_name, ':h') |
485 " On UNIX like system, using forward slash: |
501 let l:vim_doc_path = fnamemodify(a:full_name, ':h:h') . "/doc" |
486 let l:slash_char = '/' |
502 if filewritable(l:vim_doc_path) != 2 |
487 let l:mkdir_cmd = ':silent !mkdir -p ' |
503 echomsg "hgcommand: Trying to update docs at: " . l:vim_doc_path |
488 else |
504 silent! call <SID>HGFlexiMkdir(l:vim_doc_path) |
489 " On M$ system, use backslash. Also mkdir syntax is different. |
505 if filewritable(l:vim_doc_path) != 2 |
490 " This should only work on W2K and up. |
506 " Try first item in 'runtimepath': |
491 let l:slash_char = '\' |
507 let l:vimfiles = matchstr(&runtimepath, '[^,]\+\ze,') |
492 let l:mkdir_cmd = ':silent !mkdir ' |
508 let l:vim_doc_path = l:vimfiles . "/doc" |
493 endif |
509 if filewritable(l:vim_doc_path) != 2 |
494 |
510 echomsg "hgcommand: Trying to update docs at: " . l:vim_doc_path |
495 let l:doc_path = l:slash_char . 'doc' |
511 silent! call <SID>HGFlexiMkdir(l:vim_doc_path) |
496 let l:doc_home = l:slash_char . '.vim' . l:slash_char . 'doc' |
512 if filewritable(l:vim_doc_path) != 2 |
497 |
513 " Put a warning: |
498 " Figure out document path based on full name of this script: |
514 echomsg "Unable to open documentation directory" |
499 let l:vim_plugin_path = fnamemodify(a:full_name, ':h') |
515 echomsg " type `:help add-local-help' for more information." |
500 let l:vim_doc_path = fnamemodify(a:full_name, ':h:h') . l:doc_path |
516 return 0 |
501 if (!(filewritable(l:vim_doc_path) == 2)) |
|
502 echomsg "Doc path: " . l:vim_doc_path |
|
503 execute l:mkdir_cmd . '"' . l:vim_doc_path . '"' |
|
504 if (!(filewritable(l:vim_doc_path) == 2)) |
|
505 " Try a default configuration in user home: |
|
506 let l:vim_doc_path = expand("~") . l:doc_home |
|
507 if (!(filewritable(l:vim_doc_path) == 2)) |
|
508 execute l:mkdir_cmd . '"' . l:vim_doc_path . '"' |
|
509 if (!(filewritable(l:vim_doc_path) == 2)) |
|
510 " Put a warning: |
|
511 echomsg "Unable to open documentation directory" |
|
512 echomsg " type :help add-local-help for more informations." |
|
513 return 0 |
|
514 endif |
|
515 endif |
|
516 endif |
517 endif |
517 endif |
518 endif |
518 |
519 endif |
519 " Exit if we have problem to access the document directory: |
520 endif |
520 if (!isdirectory(l:vim_plugin_path) |
521 |
521 \ || !isdirectory(l:vim_doc_path) |
522 " Full name of script and documentation file: |
522 \ || filewritable(l:vim_doc_path) != 2) |
523 let l:script_name = fnamemodify(a:full_name, ':t') |
523 return 0 |
524 let l:doc_name = fnamemodify(a:full_name, ':t:r') . '.txt' |
524 endif |
525 let l:doc_file = l:vim_doc_path . "/" . l:doc_name |
525 |
526 |
526 " Full name of script and documentation file: |
527 " Bail out if document file is still up to date: |
527 let l:script_name = fnamemodify(a:full_name, ':t') |
528 if filereadable(l:doc_file) && getftime(a:full_name) < getftime(l:doc_file) |
528 let l:doc_name = fnamemodify(a:full_name, ':t:r') . '.txt' |
529 return 0 |
529 let l:plugin_file = l:vim_plugin_path . l:slash_char . l:script_name |
530 endif |
530 let l:doc_file = l:vim_doc_path . l:slash_char . l:doc_name |
531 |
531 |
532 " Create a new buffer & read in the plugin file (me): |
532 " Bail out if document file is still up to date: |
533 setl nomodeline |
533 if (filereadable(l:doc_file) && |
534 1 new! |
534 \ getftime(l:plugin_file) < getftime(l:doc_file)) |
535 setl noswapfile modifiable |
535 return 0 |
536 sil exe 'read ' . a:full_name |
536 endif |
537 |
537 |
538 setl modeline |
538 " Prepare window position restoring command: |
539 let l:buf = bufnr("%") |
539 if (strlen(@%)) |
540 |
540 let l:go_back = 'b ' . bufnr("%") |
541 norm zR |
541 else |
542 norm gg |
542 let l:go_back = 'enew!' |
543 |
543 endif |
544 " Delete from first line to a line starts with |
544 |
545 " === START_DOC |
545 " Create a new buffer & read in the plugin file (me): |
546 sil 1,/^=\{3,}\s\+START_DOC\C/ d |
546 setl nomodeline |
547 |
547 exe 'enew!' |
548 " Delete from a line starts with |
548 exe 'r ' . l:plugin_file |
549 " === END_DOC |
549 |
550 " to the end of the documents: |
550 setl modeline |
551 sil /^=\{3,}\s\+END_DOC\C/,$ d |
551 let l:buf = bufnr("%") |
552 |
552 setl noswapfile modifiable |
553 " Remove fold marks: |
553 |
554 sil %s/{\{3}[1-9]/ /e |
554 norm zR |
555 |
555 norm gg |
556 " Add modeline for help doc: the modeline string is mangled intentionally |
556 |
557 " to avoid it be recognized by VIM: |
557 " Delete from first line to a line starts with |
558 call append(line('$'), '') |
558 " === START_DOC |
559 call append(line('$'), ' v' . 'im:tw=78:ts=8:ft=help:norl:') |
559 1,/^=\{3,}\s\+START_DOC\C/ d |
560 |
560 |
561 " Replace revision: |
561 " Delete from a line starts with |
562 sil exe "normal :1s/#version#/ v" . a:revision . "/\<CR>" |
562 " === END_DOC |
563 |
563 " to the end of the documents: |
564 " Save the help document and wipe out buffer: |
564 /^=\{3,}\s\+END_DOC\C/,$ d |
565 sil exe 'wq! ' . l:doc_file . ' | bw ' . l:buf |
565 |
566 |
566 " Remove fold marks: |
567 " Build help tags: |
567 %s/{\{3}[1-9]/ / |
568 sil exe 'helptags ' . l:vim_doc_path |
568 |
569 |
569 " Add modeline for help doc: the modeline string is mangled intentionally |
570 return 1 |
570 " to avoid it be recognized by VIM: |
|
571 call append(line('$'), '') |
|
572 call append(line('$'), ' v' . 'im:tw=78:ts=8:ft=help:norl:') |
|
573 |
|
574 " Replace revision: |
|
575 exe "normal :1s/#version#/ v" . a:revision . "/\<CR>" |
|
576 |
|
577 " Save the help document: |
|
578 exe 'w! ' . l:doc_file |
|
579 exe l:go_back |
|
580 exe 'bw ' . l:buf |
|
581 |
|
582 " Build help tags: |
|
583 exe 'helptags ' . l:vim_doc_path |
|
584 |
|
585 return 1 |
|
586 endfunction |
571 endfunction |
587 |
572 |
588 " Section: Public functions {{{1 |
573 " Section: Public functions {{{1 |
589 |
574 |
590 " Function: HGGetRevision() {{{2 |
575 " Function: HGGetRevision() {{{2 |