annotate autoload/p44vim.vim @ 3:14a272d72b0a

Only open file for edit if it's readonly just before writing to it.
author Ludovic Chabant <ludovic@chabant.com>
date Thu, 24 Sep 2020 22:50:09 -0700
parents 74b2ef146e82
children 52e1502091e0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2 " Utilities {{{
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
3
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
4 function! s:trace(msg) abort
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
5 if g:p44v_trace
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
6 echom "p44vim: ".a:msg
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
7 endif
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
8 endfunction
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
9
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
10 function! s:throw(msg) abort
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
11 throw "p44vim: ".a:msg
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
12 endfunction
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
13
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
14 function! s:run_perforce_command(...) abort
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
15 let l:args = a:000
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
16 if a:0 == 1 && type(a:1) == type([])
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
17 let l:args = a:1
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
18 endif
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
19 let l:cmd = ['p4']
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
20 call extend(l:cmd, l:args)
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
21 let l:strcmd = join(map(l:cmd, 'shellescape(v:val)'))
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
22 call s:trace("Running command: ".l:strcmd)
1
953baa4a16bb Print P4's output when trace is enabled.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
23 let l:cmd_out = system(l:strcmd)
953baa4a16bb Print P4's output when trace is enabled.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
24 if g:p44v_trace
953baa4a16bb Print P4's output when trace is enabled.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
25 call s:trace(l:cmd_out)
953baa4a16bb Print P4's output when trace is enabled.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
26 endif
953baa4a16bb Print P4's output when trace is enabled.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
27 return l:cmd_out
0
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
28 endfunction
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
29
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
30 function! s:get_p4_depot_root(path) abort
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
31 let l:cur = a:path
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
32 let l:prev_cur = ''
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
33 while l:cur != l:prev_cur
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
34 if filereadable(l:cur.'/.p4config') ||
2
74b2ef146e82 Also detect P4 depot roots with .p4ignore.txt.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
35 \filereadable(l:cur.'/.p4ignore') ||
74b2ef146e82 Also detect P4 depot roots with .p4ignore.txt.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
36 \filereadable(l:cur.'/.p4ignore.txt')
0
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
37 return l:cur
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
38 endif
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
39 let l:prev_cur = l:cur
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
40 let l:cur = fnamemodify(l:cur, ':h')
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
41 endwhile
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
42 call s:throw("No p4 depot found at: ".a:path)
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
43 endfunction
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
44
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
45 " }}}
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
46
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
47 " Auto-commands {{{
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
48
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
49 let s:ignore_next_w12 = 0
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
50
3
14a272d72b0a Only open file for edit if it's readonly just before writing to it.
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
51 function! s:maybe_auto_edit_buffer() abort
14a272d72b0a Only open file for edit if it's readonly just before writing to it.
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
52 if &readonly
14a272d72b0a Only open file for edit if it's readonly just before writing to it.
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
53 call p44vim#p4edit()
14a272d72b0a Only open file for edit if it's readonly just before writing to it.
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
54 endif
0
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
55 endfunction
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
56
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
57 function! s:maybe_ignore_w12() abort
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
58 if s:ignore_next_w12
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
59 let v:fcs_choice = '' " Ignore the warning, keep the file.
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
60 let s:ignore_next_w12 = 0
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
61 endif
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
62 endfunction
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
63
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
64 function! p44vim#install_p4_auto_commands() abort
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
65 call s:trace("Scanning buffer '".bufname('%')."' for Perforce setup...")
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
66 try
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
67 let l:repo_root = s:get_p4_depot_root(expand('%:h'))
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
68 catch /^p44vim\:/
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
69 return
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
70 endtry
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
71
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
72 let b:p44v_repo_root = l:repo_root
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
73 call s:trace("Setting up P4 auto-commands for: ".bufname('%'))
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
74
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
75 augroup p44v_auto
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
76 autocmd!
3
14a272d72b0a Only open file for edit if it's readonly just before writing to it.
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
77 autocmd BufWritePre * call <SID>maybe_auto_edit_buffer()
0
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
78 autocmd FileChangedShell * call <SID>maybe_ignore_w12()
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
79 augroup END
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
80 endfunction
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
81
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
82 " }}}
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
83
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
84 " Commands {{{
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
85
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
86 function! p44vim#p4sync(...) abort
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
87 let l:cmd = ['sync'] + a:000
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
88 call s:run_perforce_command(l:cmd)
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
89 endfunction
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
90
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
91 function! p44vim#p4edit(...) abort
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
92 if a:0
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
93 let l:filenames = a:000
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
94 else
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
95 let l:filenames = [expand('%:p')]
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
96 endif
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
97 let l:cmd = ['edit'] + l:filenames
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
98 let l:ignore_next_w12 = 1
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
99 call s:run_perforce_command(l:cmd)
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
100 set noreadonly
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
101 endfunction
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
102
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
103 function! p44vim#p4revert(...) abort
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
104 if a:0
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
105 let l:filenames = a:000
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
106 else
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
107 let l:filenames = [expand('%:p')]
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
108 endif
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
109 let l:cmd = ['revert'] + l:filenames
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
110 call s:run_perforce_command(l:cmd)
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
111 silent edit
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
112 endfunction
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
113
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
114 " }}}
4aede5f1af45 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
115