160 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			160 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import os
 | |
| 
 | |
| import sublime
 | |
| from git import GitTextCommand, GitWindowCommand, git_root_exist
 | |
| 
 | |
| 
 | |
| class GitInit(object):
 | |
|     def git_init(self, directory):
 | |
|         if os.path.exists(directory):
 | |
|             self.run_command(['git', 'init'], self.git_inited, working_dir=directory)
 | |
|         else:
 | |
|             sublime.status_message("Directory does not exist.")
 | |
| 
 | |
|     def git_inited(self, result):
 | |
|         sublime.status_message(result)
 | |
| 
 | |
| 
 | |
| class GitInitCommand(GitInit, GitWindowCommand):
 | |
|     def run(self):
 | |
|         self.get_window().show_input_panel("Git directory", self.get_working_dir(), self.git_init, None, None)
 | |
| 
 | |
|     def is_enabled(self):
 | |
|         if not git_root_exist(self.get_working_dir()):
 | |
|             return True
 | |
|         else:
 | |
|             return False
 | |
| 
 | |
| 
 | |
| class GitBranchCommand(GitWindowCommand):
 | |
|     may_change_files = True
 | |
|     command_to_run_after_branch = ['checkout']
 | |
|     extra_flags = []
 | |
| 
 | |
|     def run(self):
 | |
|         self.run_command(['git', 'branch', '--no-color'] + self.extra_flags, self.branch_done)
 | |
| 
 | |
|     def branch_done(self, result):
 | |
|         self.results = result.rstrip().split('\n')
 | |
|         self.quick_panel(self.results, self.panel_done,
 | |
|             sublime.MONOSPACE_FONT)
 | |
| 
 | |
|     def panel_done(self, picked):
 | |
|         if 0 > picked < len(self.results):
 | |
|             return
 | |
|         picked_branch = self.results[picked]
 | |
|         if picked_branch.startswith("*"):
 | |
|             return
 | |
|         picked_branch = picked_branch.strip()
 | |
|         self.run_command(['git'] + self.command_to_run_after_branch + [picked_branch], self.update_status)
 | |
| 
 | |
|     def update_status(self, result):
 | |
|         global branch
 | |
|         branch = ""
 | |
|         for view in self.window.views():
 | |
|             view.run_command("git_branch_status")
 | |
| 
 | |
| 
 | |
| class GitMergeCommand(GitBranchCommand):
 | |
|     command_to_run_after_branch = ['merge']
 | |
|     extra_flags = ['--no-merge']
 | |
| 
 | |
| 
 | |
| class GitDeleteBranchCommand(GitBranchCommand):
 | |
|     command_to_run_after_branch = ['branch', '-d']
 | |
| 
 | |
| 
 | |
| class GitNewBranchCommand(GitWindowCommand):
 | |
|     def run(self):
 | |
|         self.get_window().show_input_panel("Branch name", "",
 | |
|             self.on_input, None, None)
 | |
| 
 | |
|     def on_input(self, branchname):
 | |
|         if branchname.strip() == "":
 | |
|             self.panel("No branch name provided")
 | |
|             return
 | |
|         self.run_command(['git', 'checkout', '-b', branchname])
 | |
| 
 | |
| 
 | |
| class GitNewTagCommand(GitWindowCommand):
 | |
|     def run(self):
 | |
|         self.get_window().show_input_panel("Tag name", "", self.on_input, None, None)
 | |
| 
 | |
|     def on_input(self, tagname):
 | |
|         if not tagname.strip():
 | |
|             self.panel("No branch name provided")
 | |
|             return
 | |
|         self.run_command(['git', 'tag', tagname])
 | |
| 
 | |
| 
 | |
| class GitShowTagsCommand(GitWindowCommand):
 | |
|     def run(self):
 | |
|         self.run_command(['git', 'tag'], self.fetch_tag)
 | |
| 
 | |
|     def fetch_tag(self, result):
 | |
|         self.results = result.rstrip().split('\n')
 | |
|         self.quick_panel(self.results, self.panel_done)
 | |
| 
 | |
|     def panel_done(self, picked):
 | |
|         if 0 > picked < len(self.results):
 | |
|             return
 | |
|         picked_tag = self.results[picked]
 | |
|         picked_tag = picked_tag.strip()
 | |
|         self.run_command(['git', 'show', picked_tag])
 | |
| 
 | |
| 
 | |
| class GitPushTagsCommand(GitWindowCommand):
 | |
|     def run(self):
 | |
|         self.run_command(['git', 'push', '--tags'])
 | |
| 
 | |
| 
 | |
| class GitCheckoutCommand(GitTextCommand):
 | |
|     may_change_files = True
 | |
| 
 | |
|     def run(self, edit):
 | |
|         self.run_command(['git', 'checkout', self.get_file_name()])
 | |
| 
 | |
| 
 | |
| class GitFetchCommand(GitWindowCommand):
 | |
|     def run(self):
 | |
|         self.run_command(['git', 'fetch'], callback=self.panel)
 | |
| 
 | |
| 
 | |
| class GitPullCommand(GitWindowCommand):
 | |
|     def run(self):
 | |
|         self.run_command(['git', 'pull'], callback=self.panel)
 | |
| 
 | |
| 
 | |
| class GitPullCurrentBranchCommand(GitWindowCommand):
 | |
|     command_to_run_after_describe = 'pull'
 | |
| 
 | |
|     def run(self):
 | |
|         self.run_command(['git', 'describe', '--contains',  '--all', 'HEAD'], callback=self.describe_done)
 | |
| 
 | |
|     def describe_done(self, result):
 | |
|         self.current_branch = result.strip()
 | |
|         self.run_command(['git', 'remote'], callback=self.remote_done)
 | |
| 
 | |
|     def remote_done(self, result):
 | |
|         self.remotes = result.rstrip().split('\n')
 | |
|         if len(self.remotes) == 1:
 | |
|             self.panel_done()
 | |
|         else:
 | |
|             self.quick_panel(self.remotes, self.panel_done, sublime.MONOSPACE_FONT)
 | |
| 
 | |
|     def panel_done(self, picked=0):
 | |
|         if picked < 0 or picked >= len(self.remotes):
 | |
|             return
 | |
|         self.picked_remote = self.remotes[picked]
 | |
|         self.picked_remote = self.picked_remote.strip()
 | |
|         self.run_command(['git', self.command_to_run_after_describe, self.picked_remote, self.current_branch])
 | |
| 
 | |
| 
 | |
| class GitPushCommand(GitWindowCommand):
 | |
|     def run(self):
 | |
|         self.run_command(['git', 'push'], callback=self.panel)
 | |
| 
 | |
| 
 | |
| class GitPushCurrentBranchCommand(GitPullCurrentBranchCommand):
 | |
|     command_to_run_after_describe = 'push'
 |