Skip to content

Commit be7811f

Browse files
committed
Support shelf changelist
1 parent c5e3636 commit be7811f

1 file changed

Lines changed: 115 additions & 25 deletions

File tree

autoload/project/git.vim

Lines changed: 115 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -390,7 +390,7 @@ function! s:OpenChangedFile()
390390
execute 'e '.s:GetAbsolutePath(file)
391391
endfunction
392392

393-
function! s:CanShowDiff(file_regexp)
393+
function! s:CanShowDiff()
394394
if mode() != 'n'
395395
return 0
396396
endif
@@ -401,7 +401,7 @@ function! s:CanShowDiff(file_regexp)
401401
return 0
402402
endif
403403

404-
let file = s:GetCurrentMatchstr(a:file_regexp)
404+
let file = s:GetCurrentMatchstr(s:file_regexp)
405405
let num = s:GetBufWinnr(s:diff_buffer)
406406
if empty(file) && num == -1
407407
return 0
@@ -411,12 +411,13 @@ function! s:CanShowDiff(file_regexp)
411411
endfunction
412412

413413
function! s:ShowDiffOnChangelist()
414-
if !s:CanShowDiff(s:file_regexp)
414+
if !s:CanShowDiff()
415415
return
416416
endif
417417

418418
let file = s:GetCurrentFile()
419419
" Avoid E242
420+
echom 'show '.file
420421
try
421422
call s:OpenBuffer(s:diff_buffer, 'vertical')
422423
call s:SetupDiffBuffer(s:GetAbsolutePath(file))
@@ -505,7 +506,7 @@ function! VimProjectAddChangeDetails(job, data, ...)
505506
endfunction
506507

507508
function! s:ShowDiffOnGitLog(hash)
508-
if !s:CanShowDiff(s:file_regexp)
509+
if !s:CanShowDiff()
509510
return
510511
endif
511512
let file = s:GetCurrentFile()
@@ -760,11 +761,11 @@ function! s:RenameFolder()
760761
echo
761762
endfunction
762763

763-
function! s:GetShelfFolder(name)
764+
function! s:GetShelfFolder()
764765
let config_home = project#GetVariable('config_home')
765766
let project = project#GetVariable('project')
766767
let config = project#GetProjectConfigPath(config_home, project)
767-
return config.'/shelf/'.a:name
768+
return config.'/shelf/'
768769
endfunction
769770

770771
function! s:ShelfFile() range
@@ -781,18 +782,26 @@ function! s:ShelfFile() range
781782

782783
let name = input('Shelf ['.join(files, ', ').'] to: ')
783784
if !empty(name)
784-
let folder = s:GetShelfFolder(name)
785+
let folder = s:GetShelfFolder().name
785786
if !isdirectory(folder) && exists('*mkdir')
786787
call mkdir(folder, 'p')
787788
endif
788789

789790
for file in files
790791
let cmd = 'git diff "'.file.'" > '.folder.'/'.file.'.patch'
791-
" echom cmd
792792
call project#RunShellCmd(cmd)
793793
if v:shell_error
794794
return
795795
endif
796+
797+
let patch_files = map(files, {idx, v -> v.'.patch'})
798+
let target = {
799+
\'name': '[Shelf] '.name,
800+
\'files': patch_files,
801+
\'expand': 1
802+
\}
803+
804+
call add(s:changelist, target)
796805
call s:ShowStatus(1)
797806
call s:CloseBuffer(s:diff_buffer)
798807
endfor
@@ -861,6 +870,8 @@ function! VimProjectAllFolderNames(A, L, P)
861870
let folder_names = map(copy(s:changelist), {idx, v -> v.name})
862871
call filter(folder_names, {idx, v ->
863872
\v != s:untracked_folder_name
873+
\&& v != s:unmerged_folder_name
874+
\&& v != s:staged_folder_name
864875
\&& v != folder.name
865876
\&& v =~ a:A
866877
\})
@@ -1043,6 +1054,10 @@ function! s:GetPrefixAndSuffix(folder)
10431054
endif
10441055
endfor
10451056

1057+
if has_key(a:folder, 'is_shelf')
1058+
let file_num = len(a:folder.files)
1059+
endif
1060+
10461061
if !file_num
10471062
let prefix = empty
10481063
elseif file_num == 1
@@ -1065,36 +1080,36 @@ function! s:UpdatePresetChangelist()
10651080
call add(unmerged_folder.files, s:GetFilename(file))
10661081
endfor
10671082

1068-
let default_folder = s:changelist[0]
1069-
let default_folder.files = []
1070-
for file in (s:changed_files + s:untracked_files)
1083+
let untracked_folder = s:FindUntrackedFolder()
1084+
let untracked_folder.files = []
1085+
for file in s:untracked_files
10711086
let included = 0
10721087
for folder in s:changelist
1073-
if s:IsStagedFolder(folder)
1074-
continue
1075-
endif
10761088
if s:HasFile(folder.files, file)
10771089
let included = 1
10781090
endif
10791091
endfor
10801092

10811093
if !included
1082-
call add(default_folder.files, s:GetFilename(file))
1094+
call add(untracked_folder.files, s:GetFilename(file))
10831095
endif
10841096
endfor
10851097

1086-
let untracked_folder = s:FindUntrackedFolder()
1087-
let untracked_folder.files = []
1088-
for file in s:untracked_files
1098+
let default_folder = s:changelist[0]
1099+
let default_folder.files = []
1100+
for file in (s:changed_files + s:untracked_files)
10891101
let included = 0
10901102
for folder in s:changelist
1103+
if s:IsStagedFolder(folder)
1104+
continue
1105+
endif
10911106
if s:HasFile(folder.files, file)
10921107
let included = 1
10931108
endif
10941109
endfor
10951110

10961111
if !included
1097-
call add(untracked_folder.files, s:GetFilename(file))
1112+
call add(default_folder.files, s:GetFilename(file))
10981113
endif
10991114
endfor
11001115

@@ -1105,6 +1120,45 @@ function! s:UpdatePresetChangelist()
11051120
endfor
11061121
endfunction
11071122

1123+
function! s:UpdateFolderOrNew(name, files)
1124+
for folder in s:changelist
1125+
if folder.name == a:name
1126+
let folder.files = a:files
1127+
return
1128+
endif
1129+
endfor
1130+
1131+
let new = {
1132+
\ 'name': a:name,
1133+
\ 'files': a:files,
1134+
\ 'expand': 0,
1135+
\ 'is_shelf': 1,
1136+
\}
1137+
1138+
call add(s:changelist, new)
1139+
endfunction
1140+
1141+
function! s:IsShelfFolder(folder)
1142+
return has_key(a:folder, 'is_shelf')
1143+
endfunction
1144+
1145+
function! s:UpdateShelfChangelist()
1146+
let shelf_folder = s:GetShelfFolder()
1147+
if !isdirectory(shelf_folder)
1148+
return
1149+
endif
1150+
let cmd = 'ls '.shelf_folder
1151+
let folder_names = project#RunShellCmd(cmd)
1152+
for folder_name in folder_names
1153+
let folder_path = shelf_folder.folder_name
1154+
if isdirectory(folder_path)
1155+
let folder_path_cmd = 'ls '.folder_path
1156+
let files = project#RunShellCmd(folder_path_cmd)
1157+
call s:UpdateFolderOrNew(folder_name, files)
1158+
endif
1159+
endfor
1160+
endfunction
1161+
11081162
function! s:UpdateChangelistDisplay()
11091163
let s:display = []
11101164
for folder in s:changelist
@@ -1122,13 +1176,21 @@ function! s:UpdateChangelistDisplay()
11221176
else
11231177
let affected_files = s:changed_files + s:untracked_files
11241178
endif
1125-
let all_files = s:SortAffectedFiles(affected_files)
1126-
for file in all_files
1127-
if s:HasFile(folder.files, file)
1128-
let file_item = s:GetChangedFileDisplay(file)
1179+
1180+
if s:IsShelfFolder(folder)
1181+
for file in folder.files
1182+
let file_item = s:GetShelfFileDisplay(file)
11291183
call add(s:display, file_item)
1130-
endif
1131-
endfor
1184+
endfor
1185+
else
1186+
let all_files = s:SortAffectedFiles(affected_files)
1187+
for file in all_files
1188+
if s:HasFile(folder.files, file)
1189+
let file_item = s:GetChangedFileDisplay(file)
1190+
call add(s:display, file_item)
1191+
endif
1192+
endfor
1193+
endif
11321194
endif
11331195
call add(s:display, '')
11341196
endfor
@@ -1183,12 +1245,30 @@ function! s:GetChangedFileDisplay(file, prefix = ' ')
11831245
endif
11841246
endfunction
11851247

1248+
function! s:GetShelfFileDisplay(file, prefix = ' ')
1249+
let sign = s:GetFileChangeSign(a:file)
1250+
" sign_mark is used by s:HighlightFiles
1251+
let sign_mark = ''
1252+
if sign == 'D'
1253+
let sign_mark = '$' " $ Deleted - Comment
1254+
elseif sign == 'A' || sign == '?'
1255+
let sign_mark = '!' " ! Add or untrack - diffAdded
1256+
endif
1257+
let splitter = '|'
1258+
1259+
let icon = project#GetIcon(a:file)
1260+
1261+
" Use unicode space for highlight
1262+
return a:prefix.sign_mark.icon.splitter.a:file.' '
1263+
endfunction
1264+
11861265
function! s:UpdateChangelist(run_git = 0)
11871266
if a:run_git
11881267
call s:ParseGitStatus()
11891268
endif
11901269

11911270
call s:UpdatePresetChangelist()
1271+
call s:UpdateShelfChangelist()
11921272
call s:UpdateChangelistDisplay()
11931273
return 1
11941274
endfunction
@@ -1292,6 +1372,12 @@ function! s:ShowStatus(run_git = 0)
12921372
let save_eventignore = &eventignore
12931373
set eventignore=all
12941374

1375+
let num = s:GetBufWinnr(s:changelist_buffer)
1376+
let on_changelist_buffer = num != -1
1377+
if on_changelist_buffer
1378+
let lnum = line('.')
1379+
endif
1380+
12951381
call s:OpenBuffer(s:changelist_buffer, 'belowright')
12961382
call s:SetupChangelistBuffer()
12971383
let success = s:UpdateChangelist(a:run_git)
@@ -1301,6 +1387,10 @@ function! s:ShowStatus(run_git = 0)
13011387
endif
13021388

13031389
let &eventignore = save_eventignore
1390+
1391+
if on_changelist_buffer
1392+
execute lnum
1393+
endif
13041394
endfunction
13051395

13061396
function! s:SetupChangelistBuffer()

0 commit comments

Comments
 (0)