feat(SublimeText2.GitPackages): cache packages
This commit is contained in:
@@ -0,0 +1,317 @@
|
||||
# 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('^', '^^')
|
Reference in New Issue
Block a user