Advertisement
Guest User

Untitled

a guest
Mar 3rd, 2016
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.59 KB | None | 0 0
  1. from __future__ import print_function
  2. import sys
  3. import sublime
  4. import sublime_plugin
  5. import os
  6. import os.path
  7. import subprocess
  8. from subprocess import Popen, PIPE
  9.  
  10.  
  11. panel = None
  12.  
  13. class VcsCommand(sublime_plugin.TextCommand):
  14.  
  15.     def nothing(self, nothing1=None, nothing2=None, nothing3=None, **args):
  16.         return
  17.  
  18.     def message(self, string):
  19.         global panel
  20.         if panel is None:
  21.             panel = sublime.active_window().get_output_panel("VCS output")
  22.         panel.run_command(
  23.             "vcs_view_message",
  24.             {
  25.                 "message": string
  26.             }
  27.         )
  28.         sublime.active_window().run_command(
  29.             'show_panel',
  30.             {"panel": "output.VCS output"}
  31.         )
  32.         panel.show(panel.size(), False)
  33.  
  34. def is_vcs(file, vcs):
  35.     if file is None:
  36.         return False
  37.     folder = os.path.dirname(file)
  38.     return recurs(folder, vcs)
  39.  
  40. def recurs(folder, vcs):
  41.     vcsfolder = os.path.join(folder, vcs)
  42.     if os.path.exists(vcsfolder):
  43.         return True
  44.     else:
  45.         folder2 = os.path.abspath(os.path.join(folder, os.path.pardir))
  46.         if folder == folder2:
  47.             return False
  48.         else:
  49.             folder = folder2
  50.             return recurs(folder, vcs)
  51.  
  52. class GitCommand(VcsCommand):
  53.     def is_enabled(self):
  54.         file = self.view.file_name()
  55.         return is_vcs(file, ".git")
  56.  
  57. class SvnCommand(VcsCommand):
  58.     def is_enabled(self):
  59.         file = self.view.file_name()
  60.         return is_vcs(file, ".svn")
  61.  
  62. def safestr(text, fallback_encoding, method='decode'):
  63.     try:
  64.         unitext = getattr(text, method)('utf-8')
  65.     except (UnicodeEncodeError, UnicodeDecodeError):
  66.         unitext = getattr(text, method)(fallback_encoding)
  67.     except AttributeError:
  68.         unitext = str(text)
  69.     return unitext
  70.  
  71. def vcs_command(folder, commands, univ=False):
  72.     try:
  73.         plat = sublime_plugin.sys.platform
  74.         si = None
  75.         if plat == 'win32':
  76.             si = subprocess.STARTUPINFO()
  77.             si.dwFlags |= subprocess.STARTF_USESHOWWINDOW
  78.         os.chdir(folder)
  79.         proc = subprocess.Popen(commands, cwd=folder, startupinfo=si, stdout=PIPE, universal_newlines=univ)
  80.         #proc.wait()
  81.         out = proc.communicate()[0]
  82.         ret = safestr(out, "utf-8")
  83.         return ret
  84.  
  85.     except:
  86.         raise
  87.  
  88. class SvnRevertCommand(SvnCommand):
  89.     def run(self, edit):
  90.         file = self.view.file_name()
  91.         folder = os.path.dirname(file)
  92.         file = os.path.basename(file)
  93.         self.message("SVN Revert " + file + "...")
  94.         ret = vcs_command(folder, ["svn", "revert", file])
  95.         self.message(ret)
  96.  
  97. class SvnCommitCommand(SvnCommand):
  98.     def run(self, edit):
  99.         sublime.active_window().show_input_panel('Commit message', '', self.on_done_input, self.nothing, self.nothing)
  100.  
  101.     def on_done_input(self, value):
  102.           file = self.view.file_name()
  103.           folder = os.path.dirname(file)
  104.           file = os.path.basename(file)
  105.           self.message("SVN Commit " + file + "...")
  106.           ret = vcs_command(folder, ["svn", "commit", "--message", value, file])
  107.           self.message(ret)
  108.  
  109. class SvnAddCommand(SvnCommand):
  110.     def run(self, edit):
  111.         file = self.view.file_name()
  112.         folder = os.path.dirname(file)
  113.         file = os.path.basename(file)
  114.         self.message("SVN Add " + file + "...")
  115.         ret = vcs_command(folder, ["svn", "add", file])
  116.         self.message(ret)
  117.  
  118. class SvnUpdateCommand(SvnCommand):
  119.     def run(self, edit):
  120.         file = self.view.file_name()
  121.         folder = os.path.dirname(file)
  122.         file = os.path.basename(file)
  123.         self.message("SVN Update " + file + "...")
  124.         ret = vcs_command(folder, ["svn", "update", file])
  125.         self.message(ret)
  126.  
  127. class SvnDiffCommand(SvnCommand):
  128.     def run(self, edit):
  129.         file = self.view.file_name()
  130.         folder = os.path.dirname(file)
  131.         self.message("Svn Diff " + file + "...")
  132.         ret = vcs_command(folder, ["svn", "diff", "--diff-cmd", "diff", file], True)
  133.         self.message("Done.")
  134.  
  135.         if len(ret) > 10:
  136.           arg = {"output": ret}
  137.           scratch_file = sublime.active_window().new_file()
  138.           scratch_file.set_syntax_file("Packages/Diff/Diff.tmLanguage")
  139.           scratch_file.set_name("SVN Diff")
  140.           scratch_file.run_command("insert_diff", arg)
  141.           scratch_file.set_scratch(True)
  142.           scratch_file.set_read_only(True)
  143.         else:
  144.           self.message("No differences.")
  145.  
  146. class SvnStatusCommand(SvnCommand):
  147.     def run(self, edit):
  148.         file = self.view.file_name()
  149.         folder = os.path.dirname(file)
  150.         self.message("Svn Status...")
  151.         ret = vcs_command(folder, ["svn", "status", "-q"])
  152.         self.message("Status done.")
  153.         arg = {"output": ret}
  154.         scratch_file = sublime.active_window().new_file()
  155.         scratch_file.set_name("SVN Status")
  156.         scratch_file.run_command("insert_diff", arg)
  157.         scratch_file.set_scratch(True)
  158.         scratch_file.set_read_only(True)
  159.  
  160.  
  161. class VcsViewMessageCommand(sublime_plugin.TextCommand):
  162.     def run(self, edit, message=""):
  163.         self.view.set_read_only(False)
  164.         self.view.insert(edit, self.view.size(), message + '\n')
  165.         self.view.set_read_only(True)
  166.  
  167. class MyGitAddCommand(GitCommand):
  168.     def run(self, edit):
  169.         file = self.view.file_name()
  170.         folder = os.path.dirname(file)
  171.         file = os.path.basename(file)
  172.         self.message("Git Add " + file + "...")
  173.         ret = vcs_command(folder, ["git", "add", file])
  174.         self.message("Add done.")
  175.  
  176. class MyGitAddAllCommand(GitCommand):
  177.     def run(self, edit):
  178.         file = self.view.file_name()
  179.         folder = os.path.dirname(file)
  180.         self.message("Git Add all...")
  181.         ret = vcs_command(folder, ["git", "add", "--all", "--verbose"])
  182.         self.message(ret)
  183.  
  184. class MyGitCommitCommand(GitCommand):
  185.     def run(self, edit):
  186.         sublime.active_window().show_input_panel('Commit message', '', self.on_done_input, self.nothing, self.nothing)
  187.  
  188.     def on_done_input(self, value):
  189.           file = self.view.file_name()
  190.           folder = os.path.dirname(file)
  191.           self.message("Git Commit...")
  192.           ret = vcs_command(folder, ["git", "commit", "-m", value])
  193.           self.message(ret)
  194.  
  195. class MyGitDiffCommand(GitCommand):
  196.     def run(self, edit):
  197.         file = self.view.file_name()
  198.         folder = os.path.dirname(file)
  199.         file = os.path.basename(file)
  200.         self.message("Git Diff " + file + "...")
  201.         ret = vcs_command(folder, ["git", "--no-pager", "diff", "--no-color", "--", file])
  202.         self.message("Diff done.")
  203.  
  204.         if len(ret) > 10:
  205.           arg = {"output": ret}
  206.           scratch_file = sublime.active_window().new_file()
  207.           scratch_file.set_syntax_file("Packages/Diff/Diff.tmLanguage")
  208.           scratch_file.set_name("Git Diff")
  209.           scratch_file.run_command("insert_diff", arg)
  210.           scratch_file.set_scratch(True)
  211.           scratch_file.set_read_only(True)
  212.         else:
  213.           self.message("No differences.")
  214.  
  215. class MyGitPullCommand(GitCommand):
  216.     def run(self, edit):
  217.         file = self.view.file_name()
  218.         folder = os.path.dirname(file)
  219.         self.message("Git Pull...")
  220.         ret = vcs_command(folder, ["git", "pull"])
  221.         self.message(ret)
  222.         self.message("Pull done.")
  223.  
  224. class MyGitPushCommand(GitCommand):
  225.     def run(self, edit):
  226.         file = self.view.file_name()
  227.         folder = os.path.dirname(file)
  228.         self.message("Git Push...")
  229.         ret = vcs_command(folder, ["git", "push", "--verbose"])
  230.         self.message(ret)
  231.         self.message("Push done.")
  232.  
  233. class MyGitStatusCommand(GitCommand):
  234.     def run(self, edit):
  235.         file = self.view.file_name()
  236.         folder = os.path.dirname(file)
  237.         self.message("Git Status...")
  238.         ret = vcs_command(folder, ["git", "status"])
  239.         self.message("Status done.")
  240.         arg = {"output": ret}
  241.         scratch_file = sublime.active_window().new_file()
  242.         scratch_file.set_name("Git Status")
  243.         scratch_file.run_command("insert_diff", arg)
  244.         scratch_file.set_scratch(True)
  245.         scratch_file.set_read_only(True)
  246.  
  247. class MyGitCheckoutCommand(GitCommand):
  248.     def run(self, edit):
  249.         file = self.view.file_name()
  250.         folder = os.path.dirname(file)
  251.         file = os.path.basename(file)
  252.         self.message("Git Checkout " + file + "...")
  253.         ret = vcs_command(folder, ["git", "checkout", "--", file])
  254.         self.message(ret)
  255.         self.message("Checkout done.")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement