64 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			64 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import os
 | |
| import re
 | |
| 
 | |
| import sublime
 | |
| from git import GitWindowCommand, git_root
 | |
| 
 | |
| 
 | |
| class GitStatusCommand(GitWindowCommand):
 | |
|     force_open = False
 | |
| 
 | |
|     def run(self):
 | |
|         self.run_command(['git', 'status', '--porcelain'], self.status_done)
 | |
| 
 | |
|     def status_done(self, result):
 | |
|         self.results = filter(self.status_filter, result.rstrip().split('\n'))
 | |
|         if len(self.results):
 | |
|             self.show_status_list()
 | |
|         else:
 | |
|             sublime.status_message("Nothing to show")
 | |
| 
 | |
|     def show_status_list(self):
 | |
|         self.quick_panel(self.results, self.panel_done,
 | |
|             sublime.MONOSPACE_FONT)
 | |
| 
 | |
|     def status_filter(self, item):
 | |
|         # for this class we don't actually care
 | |
|         if not re.match(r'^[ MADRCU?!]{1,2}\s+.*', item):
 | |
|             return False
 | |
|         return len(item) > 0
 | |
| 
 | |
|     def panel_done(self, picked):
 | |
|         if 0 > picked < len(self.results):
 | |
|             return
 | |
|         picked_file = self.results[picked]
 | |
|         # first 2 characters are status codes, the third is a space
 | |
|         picked_status = picked_file[:2]
 | |
|         picked_file = picked_file[3:]
 | |
|         self.panel_followup(picked_status, picked_file, picked)
 | |
| 
 | |
|     def panel_followup(self, picked_status, picked_file, picked_index):
 | |
|         # split out solely so I can override it for laughs
 | |
| 
 | |
|         s = sublime.load_settings("Git.sublime-settings")
 | |
|         root = git_root(self.get_working_dir())
 | |
|         if picked_status == '??' or s.get('status_opens_file') or self.force_open:
 | |
|             if(os.path.isfile(os.path.join(root, picked_file))):
 | |
|                 self.window.open_file(os.path.join(root, picked_file))
 | |
|         else:
 | |
|             self.run_command(['git', 'diff', '--no-color', '--', picked_file.strip('"')],
 | |
|                 self.diff_done, working_dir=root)
 | |
| 
 | |
|     def diff_done(self, result):
 | |
|         if not result.strip():
 | |
|             return
 | |
|         self.scratch(result, title="Git Diff")
 | |
| 
 | |
| 
 | |
| class GitOpenModifiedFilesCommand(GitStatusCommand):
 | |
|     force_open = True
 | |
| 
 | |
|     def show_status_list(self):
 | |
|         for line_index in range(0, len(self.results)):
 | |
|             self.panel_done(line_index)
 |