Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from __future__ import print_function
- import sys
- import sublime
- import sublime_plugin
- import os
- import os.path
- import subprocess
- from subprocess import Popen, PIPE
- panel = None
- class VcsCommand(sublime_plugin.TextCommand):
- def nothing(self, nothing1=None, nothing2=None, nothing3=None, **args):
- return
- def message(self, string):
- global panel
- if panel is None:
- panel = sublime.active_window().get_output_panel("VCS output")
- panel.run_command(
- "vcs_view_message",
- {
- "message": string
- }
- )
- sublime.active_window().run_command(
- 'show_panel',
- {"panel": "output.VCS output"}
- )
- panel.show(panel.size(), False)
- def is_vcs(file, vcs):
- if file is None:
- return False
- folder = os.path.dirname(file)
- return recurs(folder, vcs)
- def recurs(folder, vcs):
- vcsfolder = os.path.join(folder, vcs)
- if os.path.exists(vcsfolder):
- return True
- else:
- folder2 = os.path.abspath(os.path.join(folder, os.path.pardir))
- if folder == folder2:
- return False
- else:
- folder = folder2
- return recurs(folder, vcs)
- class GitCommand(VcsCommand):
- def is_enabled(self):
- file = self.view.file_name()
- return is_vcs(file, ".git")
- class SvnCommand(VcsCommand):
- def is_enabled(self):
- file = self.view.file_name()
- return is_vcs(file, ".svn")
- def safestr(text, fallback_encoding, method='decode'):
- try:
- unitext = getattr(text, method)('utf-8')
- except (UnicodeEncodeError, UnicodeDecodeError):
- unitext = getattr(text, method)(fallback_encoding)
- except AttributeError:
- unitext = str(text)
- return unitext
- def vcs_command(folder, commands, univ=False):
- try:
- plat = sublime_plugin.sys.platform
- si = None
- if plat == 'win32':
- si = subprocess.STARTUPINFO()
- si.dwFlags |= subprocess.STARTF_USESHOWWINDOW
- os.chdir(folder)
- proc = subprocess.Popen(commands, cwd=folder, startupinfo=si, stdout=PIPE, universal_newlines=univ)
- #proc.wait()
- out = proc.communicate()[0]
- ret = safestr(out, "utf-8")
- return ret
- except:
- raise
- class SvnRevertCommand(SvnCommand):
- def run(self, edit):
- file = self.view.file_name()
- folder = os.path.dirname(file)
- file = os.path.basename(file)
- self.message("SVN Revert " + file + "...")
- ret = vcs_command(folder, ["svn", "revert", file])
- self.message(ret)
- class SvnCommitCommand(SvnCommand):
- def run(self, edit):
- sublime.active_window().show_input_panel('Commit message', '', self.on_done_input, self.nothing, self.nothing)
- def on_done_input(self, value):
- file = self.view.file_name()
- folder = os.path.dirname(file)
- file = os.path.basename(file)
- self.message("SVN Commit " + file + "...")
- ret = vcs_command(folder, ["svn", "commit", "--message", value, file])
- self.message(ret)
- class SvnAddCommand(SvnCommand):
- def run(self, edit):
- file = self.view.file_name()
- folder = os.path.dirname(file)
- file = os.path.basename(file)
- self.message("SVN Add " + file + "...")
- ret = vcs_command(folder, ["svn", "add", file])
- self.message(ret)
- class SvnUpdateCommand(SvnCommand):
- def run(self, edit):
- file = self.view.file_name()
- folder = os.path.dirname(file)
- file = os.path.basename(file)
- self.message("SVN Update " + file + "...")
- ret = vcs_command(folder, ["svn", "update", file])
- self.message(ret)
- class SvnDiffCommand(SvnCommand):
- def run(self, edit):
- file = self.view.file_name()
- folder = os.path.dirname(file)
- self.message("Svn Diff " + file + "...")
- ret = vcs_command(folder, ["svn", "diff", "--diff-cmd", "diff", file], True)
- self.message("Done.")
- if len(ret) > 10:
- arg = {"output": ret}
- scratch_file = sublime.active_window().new_file()
- scratch_file.set_syntax_file("Packages/Diff/Diff.tmLanguage")
- scratch_file.set_name("SVN Diff")
- scratch_file.run_command("insert_diff", arg)
- scratch_file.set_scratch(True)
- scratch_file.set_read_only(True)
- else:
- self.message("No differences.")
- class SvnStatusCommand(SvnCommand):
- def run(self, edit):
- file = self.view.file_name()
- folder = os.path.dirname(file)
- self.message("Svn Status...")
- ret = vcs_command(folder, ["svn", "status", "-q"])
- self.message("Status done.")
- arg = {"output": ret}
- scratch_file = sublime.active_window().new_file()
- scratch_file.set_name("SVN Status")
- scratch_file.run_command("insert_diff", arg)
- scratch_file.set_scratch(True)
- scratch_file.set_read_only(True)
- class VcsViewMessageCommand(sublime_plugin.TextCommand):
- def run(self, edit, message=""):
- self.view.set_read_only(False)
- self.view.insert(edit, self.view.size(), message + '\n')
- self.view.set_read_only(True)
- class MyGitAddCommand(GitCommand):
- def run(self, edit):
- file = self.view.file_name()
- folder = os.path.dirname(file)
- file = os.path.basename(file)
- self.message("Git Add " + file + "...")
- ret = vcs_command(folder, ["git", "add", file])
- self.message("Add done.")
- class MyGitAddAllCommand(GitCommand):
- def run(self, edit):
- file = self.view.file_name()
- folder = os.path.dirname(file)
- self.message("Git Add all...")
- ret = vcs_command(folder, ["git", "add", "--all", "--verbose"])
- self.message(ret)
- class MyGitCommitCommand(GitCommand):
- def run(self, edit):
- sublime.active_window().show_input_panel('Commit message', '', self.on_done_input, self.nothing, self.nothing)
- def on_done_input(self, value):
- file = self.view.file_name()
- folder = os.path.dirname(file)
- self.message("Git Commit...")
- ret = vcs_command(folder, ["git", "commit", "-m", value])
- self.message(ret)
- class MyGitDiffCommand(GitCommand):
- def run(self, edit):
- file = self.view.file_name()
- folder = os.path.dirname(file)
- file = os.path.basename(file)
- self.message("Git Diff " + file + "...")
- ret = vcs_command(folder, ["git", "--no-pager", "diff", "--no-color", "--", file])
- self.message("Diff done.")
- if len(ret) > 10:
- arg = {"output": ret}
- scratch_file = sublime.active_window().new_file()
- scratch_file.set_syntax_file("Packages/Diff/Diff.tmLanguage")
- scratch_file.set_name("Git Diff")
- scratch_file.run_command("insert_diff", arg)
- scratch_file.set_scratch(True)
- scratch_file.set_read_only(True)
- else:
- self.message("No differences.")
- class MyGitPullCommand(GitCommand):
- def run(self, edit):
- file = self.view.file_name()
- folder = os.path.dirname(file)
- self.message("Git Pull...")
- ret = vcs_command(folder, ["git", "pull"])
- self.message(ret)
- self.message("Pull done.")
- class MyGitPushCommand(GitCommand):
- def run(self, edit):
- file = self.view.file_name()
- folder = os.path.dirname(file)
- self.message("Git Push...")
- ret = vcs_command(folder, ["git", "push", "--verbose"])
- self.message(ret)
- self.message("Push done.")
- class MyGitStatusCommand(GitCommand):
- def run(self, edit):
- file = self.view.file_name()
- folder = os.path.dirname(file)
- self.message("Git Status...")
- ret = vcs_command(folder, ["git", "status"])
- self.message("Status done.")
- arg = {"output": ret}
- scratch_file = sublime.active_window().new_file()
- scratch_file.set_name("Git Status")
- scratch_file.run_command("insert_diff", arg)
- scratch_file.set_scratch(True)
- scratch_file.set_read_only(True)
- class MyGitCheckoutCommand(GitCommand):
- def run(self, edit):
- file = self.view.file_name()
- folder = os.path.dirname(file)
- file = os.path.basename(file)
- self.message("Git Checkout " + file + "...")
- ret = vcs_command(folder, ["git", "checkout", "--", file])
- self.message(ret)
- self.message("Checkout done.")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement