Files
ChocolateyPackages/EthanBrown.SublimeText2.GitPackages/tools/PackageCache/SideBarGit/sidebar/SideBarGit.py
2013-04-04 08:55:33 -04:00

317 lines
9.2 KiB
Python

# coding=utf8
import sublime
import os
import subprocess
from SideBarItem import SideBarItem
class Object():
pass
s = sublime.load_settings('SideBarGit.sublime-settings')
path_to_git_unixes = s.get('path_to_git_unixes');
class SideBarGit:
last_stdout = ''
def run(
self,
object,
modal = False,
background = False,
refresh_funct_view = False,
refresh_funct_command = False,
refresh_funct_item = False,
refresh_funct_to_status_bar = False,
refresh_funct_title = False,
refresh_funct_no_results = False,
refresh_funct_syntax_file = False
):
if not refresh_funct_view:
pass
else:
object = Object()
object.command = refresh_funct_command
object.item = SideBarItem(refresh_funct_item, os.path.isdir(refresh_funct_item))
object.to_status_bar = refresh_funct_to_status_bar
object.title = refresh_funct_title
object.no_results = refresh_funct_no_results
object.syntax_file = refresh_funct_syntax_file
debug = False
if debug:
print '----------------------------------------------------------'
print 'GIT:'
print object.command
print 'CWD:'
print object.item.forCwdSystemPath()
print 'PATH:'
print object.item.forCwdSystemName()
failed = False
if sublime.platform() == 'windows':
object.command = map(self.escapeCMDWindows, object.command)
if sublime.platform() is not 'windows' and object.command[0] == 'git':
if path_to_git_unixes != '':
object.command[0] = s.get('path_to_git_unixes')
elif os.path.exists('/usr/local/git/bin'):
object.command[0] = '/usr/local/git/bin/git'
cwd = object.item.forCwdSystemPath()
try:
if sublime.platform() == 'windows':
process = subprocess.Popen(
#" ".join(object.command),
object.command,
cwd=cwd,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
shell=True,
universal_newlines=True)
else:
process = subprocess.Popen(
object.command,
cwd=cwd,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
shell=False,
universal_newlines=True)
if background:
if debug:
print 'SUCCESS'
print '----------------------------------------------------------'
return True
stdout, stderr = process.communicate()
SideBarGit.last_stdout = str(stdout).rstrip()
self.last_stdout = str(stdout).rstrip()
stdout = stdout.strip()
if stdout.find('fatal:') == 0 or stdout.find('error:') == 0 or stdout.find('Permission denied') == 0 or stderr:
print 'FAILED'
failed = True
else:
if debug:
print 'SUCCESS'
if stdout:
if debug:
print 'STDOUT'
print stdout
if stderr:
print 'STDERR'
print stderr
except OSError as (errno, strerror):
print 'FAILED'
failed = True
print errno
print strerror
SideBarGit.last_stdout = ''
self.last_stdout = ''
except IOError as (errno, strerror):
print 'FAILED'
failed = True
print errno
print strerror
SideBarGit.last_stdout = ''
self.last_stdout = ''
if debug:
print '----------------------------------------------------------'
try:
object.to_status_bar
except:
object.to_status_bar = False
try:
object.silent
return
except:
pass
if failed:
try:
strerror
if errno == 2:
self.alert(strerror+'\nPossible error:\n'+object.command[0]+' not found on $PATH')
else:
self.alert(strerror)
return False
except:
if not stdout and not stderr:
return False
if stdout.find('Permission denied') == 0 or stdout.find('fatal: The remote end hung up unexpectedly') == 0:
self.alert((stdout or '')+'\n'+(stderr or '')+'\nPossible error:\nssh keys not in .ssh/ directory or keys not opened')
else:
self.alert((stdout or '')+'\n'+(stderr or ''))
return False
else:
if stdout != '' and refresh_funct_view == False and (object.to_status_bar or " ".join(object.command).find('git push') == 0 or stdout.find('nothing to commit') == 0):
self.status(stdout)
else:
if stdout == '' and refresh_funct_view == False:
try:
self.status(object.no_results)
except:
self.status('No output to show')
return True
if stdout == '' and refresh_funct_view != False:
try:
stdout = object.no_results
except:
stdout = 'No output to show'
if stdout == '':
return True
if refresh_funct_view == False:
view = sublime.active_window().new_file()
else:
view = refresh_funct_view
try:
view.set_name(object.title.decode('utf-8'))
except:
view.set_name('No Title')
try:
if object.syntax_file != False:
view.set_syntax_file(object.syntax_file)
except:
pass
try:
object.word_wrap
view.settings().set('word_wrap', False)
except:
pass
view.settings().set('fallback_encoding', 'UTF-8')
view.settings().set('encoding', 'UTF-8')
view.settings().set('default_dir', object.item.dirname())
view.set_scratch(True)
if refresh_funct_view == False:
view.settings().set('SideBarGitIsASideBarGitTab', True)
view.settings().set('SideBarGitCommand', object.command)
view.settings().set('SideBarGitModal', modal)
view.settings().set('SideBarGitBackground', background)
view.settings().set('SideBarGitItem', object.item.path())
try:
view.settings().set('SideBarGitToStatusBar', object.to_status_bar)
except:
view.settings().set('SideBarGitToStatusBar', False)
try:
view.settings().set('SideBarGitTitle', object.title)
except:
view.settings().set('SideBarGitTitle', 'No Title')
try:
view.settings().set('SideBarGitNoResults', object.no_results)
except:
view.settings().set('SideBarGitNoResults', 'No output to show')
try:
view.settings().set('SideBarGitSyntaxFile', object.syntax_file)
except:
view.settings().set('SideBarGitSyntaxFile', False)
content = "[SideBarGit@SublimeText "
content += object.item.name().decode('utf-8')
content += "/] "
content += (" ".join(object.command)).decode('utf-8')
content += "\n\n"
content += "# Improve this command, the output or the tab title by posting here:"
content += "\n"
content += "# http://www.sublimetext.com/forum/viewtopic.php?f=5&t=3405"
content += "\n"
content += "# Tip: F5 will run the command again and refresh the contents of this tab"
content += "\n\n"
try:
content += stdout
except:
content += unicode(stdout, 'UTF-8', errors='ignore')
edit = view.begin_edit()
view.replace(edit, sublime.Region(0, view.size()), content);
view.sel().clear()
view.sel().add(sublime.Region(0))
view.end_edit(edit)
return True
def confirm(self, message, function, arg1):
if int(sublime.version()) >= 2186:
if sublime.ok_cancel_dialog(u'Side Bar Git : '+message):
function(arg1, True)
else:
import functools
sublime.active_window().run_command('hide_panel');
sublime.active_window().show_input_panel("Confirmation Required:", message.decode('utf-8'), functools.partial(function, arg1, True), None, None)
def prompt(self, message, default, function, arg1):
import functools
sublime.active_window().run_command('hide_panel');
sublime.active_window().show_input_panel(message.decode('utf-8'), default.decode('utf-8'), functools.partial(function, arg1, True), None, None)
def alert(self, message):
try:
sublime.error_message('Git : '+(message.decode('utf-8')))
except:
try:
sublime.error_message('Git : '+message)
except:
print message
def status(self, message):
message = message[:200] + (message[200:] and '')
message = message.replace('\n', ' ')
try:
v = sublime.active_window().active_view()
v.set_status('SideBarGit', 'Git : '+(message.decode('utf-8')))
sublime.set_timeout(lambda: SideBarGit().statusRemove(v), 16000)
except:#there is no tabs opened
sublime.status_message('Git : '+(message.decode('utf-8')))
def statusRemove(self, v):
try:
v.erase_status('SideBarGit')
except:#this view is not there
pass
def quickPanel(self, function, extra, data):
import functools
window = sublime.active_window()
# window.show_input_panel("BUG!", '', '', None, None)
# window.run_command('hide_panel');
data = [item[:70] for item in data]
window.show_quick_panel(data, functools.partial(self.quickPanelDone, function, extra, data))
def quickPanelDone(self, function, extra, data, result):
if result != -1:
function(extra, data, result)
def getSelectedRepos(self, items):
repos = []
reposTemp = []
for item in items:
original = item.path()
while not os.path.exists(item.join('.git')):
if item.dirname() == item.path():
break;
item.path(item.dirname())
if os.path.exists(item.join('.git')):
try:
index = reposTemp.index(item.path())
except ValueError:
reposTemp.append(item.path())
index = reposTemp.index(item.path())
repos.append(Object())
repos[index].repository = item
repos[index].items = []
repos[index].items.append(SideBarItem(original, os.path.isdir(original)))
return repos
def escapeCMDWindows(self, string):
return string.replace('^', '^^')