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'
|