svnservice.py

来自「Wxpython Implemented on Windows CE, Sou」· Python 代码 · 共 1,071 行 · 第 1/4 页

PY
1,071
字号
#----------------------------------------------------------------------------
# Name:         SVNService.py
# Purpose:      Subversion Service for pydocview
#
# Author:       Morgan Hua
#
# Created:      5/13/05
# CVS-ID:       $Id: SVNService.py,v 1.4 2006/04/20 06:25:58 RD Exp $
# Copyright:    (c) 2005 ActiveGrid, Inc.
# License:      wxWindows License
#----------------------------------------------------------------------------

import wx
import os
import os.path
import ProjectEditor
import MessageService

import sys        # for errors
import traceback  # for errors

try:
    import pysvn  # python-subversion integration
    SVN_INSTALLED = True
except ImportError:
    SVN_INSTALLED = False

_ = wx.GetTranslation


#----------------------------------------------------------------------------
# Constants
#----------------------------------------------------------------------------
SVN_CONFIG_DIR = "SVNConfigDir"
SVN_REPOSITORY_URL = "SVNRepositoryURLs"

SPACE = 10
HALF_SPACE = 5


#----------------------------------------------------------------------------
# Classes
#----------------------------------------------------------------------------

class SVNService(wx.lib.pydocview.DocService):
    SVN_UPDATE_ALL_ID = wx.NewId()
    SVN_UPDATE_ID = wx.NewId()
    SVN_CHECKIN_ID = wx.NewId()
    SVN_CHECKIN_ALL_ID = wx.NewId()
    SVN_CHECKOUT_ID = wx.NewId()
    SVN_REVERT_ID = wx.NewId()
    SVN_ADD_ID = wx.NewId()
    SVN_DELETE_ID = wx.NewId()
    SVN_COMMAND_LIST = [SVN_UPDATE_ALL_ID, SVN_CHECKIN_ALL_ID, SVN_UPDATE_ID, SVN_CHECKIN_ID, SVN_CHECKOUT_ID, SVN_REVERT_ID, SVN_ADD_ID, SVN_DELETE_ID]


    def __init__(self):
        self._defaultURL = "svn://"

        global SVN_INSTALLED
        if SVN_INSTALLED:
            config = wx.ConfigBase_Get()
            
            configDir = config.Read(SVN_CONFIG_DIR, "")
            self._client = pysvn.Client(configDir)
            try:
                self._defaultURL = self._client.info('.').url
            except:
                pass
                
            self._client.callback_cancel = self.IfCancel
            self._client.callback_notify = self.UpdateStatus
            self._client.callback_get_log_message = self.GetLogMessage
            self._client.callback_get_login = self.GetLogin
            self._client.callback_ssl_server_trust_prompt = self.GetSSLServerTrust
            self._client.callback_ssl_client_cert_password_prompt = self.SSLClientPassword
            self._client.callback_ssl_client_cert_prompt = self.SSLClientCert
            self._client.callback_ssl_server_prompt = self.SSLServerPrompt

    #----------------------------------------------------------------------------
    # pysvn.Client() Callback Methods
    #----------------------------------------------------------------------------

    def IfCancel(self):
        """ return True if user wants to cancel current command """
        return False


    def UpdateStatus(self, eventDict):
        messageService = wx.GetApp().GetService(MessageService.MessageService)
        messageService.ShowWindow()

        view = messageService.GetView()
        view.AddLines(_("%s %s\n") % (eventDict['action'], eventDict['path']))


    def GetLogMessage(self):
        dlg = wx.TextEntryDialog(wx.GetApp().GetTopWindow(),
                _("Comment"),
                _("SVN Log Message"))

        dlg.CenterOnParent()
        if dlg.ShowModal() == wx.ID_OK:
            retcode = True
            message = dlg.GetValue()
        else:
            retcode = False
            message = _("Cancel Action")

        dlg.Destroy()

        return retcode, message


    def GetLogin(self, realm, username, maySave):
        dlg = wx.Dialog(wx.GetApp().GetTopWindow(), -1, _("SVN Login"))

        sizer = wx.FlexGridSizer(cols = 2, hgap = 5, vgap = 5)
        sizer.Add(wx.StaticText(dlg, -1, _("Username:")), 0, wx.ALIGN_CENTER_VERTICAL)
        usernameTxt = wx.TextCtrl(dlg, -1, username, size = (200, -1))
        sizer.Add(usernameTxt, 0, wx.ALIGN_CENTER_VERTICAL)
        sizer.Add(wx.StaticText(dlg, -1, _("Password:")), 0, wx.ALIGN_CENTER_VERTICAL)
        passwordTxt = wx.TextCtrl(dlg, -1, size=(200, -1), style=wx.TE_PASSWORD)
        sizer.Add(passwordTxt, 0, wx.ALIGN_CENTER_VERTICAL)

        savePasswordCheckbox = wx.CheckBox(dlg, -1, _("Remember Username and Password"))
        if not maySave:
            savePasswordCheckbox.Enable(False)

        buttonSizer = wx.BoxSizer(wx.HORIZONTAL)
        okBtn = wx.Button(dlg, wx.ID_OK)
        okBtn.SetDefault()
        buttonSizer.Add(okBtn, 0, wx.RIGHT, HALF_SPACE)
        buttonSizer.Add(wx.Button(dlg, wx.ID_CANCEL), 0)

        contentSizer = wx.BoxSizer(wx.VERTICAL)
        contentSizer.Add(sizer, 0, wx.LEFT|wx.TOP|wx.RIGHT, SPACE)
        contentSizer.Add(savePasswordCheckbox, 0, wx.TOP|wx.LEFT|wx.BOTTOM, SPACE)
        contentSizer.Add(buttonSizer, 0, wx.ALL|wx.ALIGN_RIGHT, SPACE)

        dlg.SetSizer(contentSizer)
        dlg.Fit()
        dlg.Layout()

        dlg.CenterOnParent()
        if dlg.ShowModal() == wx.ID_OK:
            retcode = True
            username = usernameTxt.GetValue().strip()
            password = passwordTxt.GetValue()
            save = savePasswordCheckbox.IsChecked()
        else:
            retcode = False
            username = None
            password = None
            save = False

        dlg.Destroy()
        return retcode, username, password, save


    def SSLServerPrompt(self):
        """ Not implemented, as per pysvn documentation """
        return


    def GetSSLServerTrust(self, trustDict):
        dlg = wx.Dialog(wx.GetApp().GetTopWindow(), -1, _("SSL Server Certificate"))

        sizer = wx.FlexGridSizer(cols = 2, hgap = 5, vgap = 5)
        for k in ['hostname', 'valid_from', 'valid_to', 'issuer_dname', 'realm']:
            if trustDict.has_key(k):
                sizer.Add(wx.StaticText(dlg, -1, "%s:" % k), 0, wx.ALIGN_CENTER_VERTICAL)
                sizer.Add(wx.StaticText(dlg, -1, "%s"  % trustDict[k]), 0, wx.ALIGN_CENTER_VERTICAL)

        box = wx.StaticBoxSizer(wx.StaticBox(dlg, -1, _("Certificate Info")), wx.VERTICAL)
        box.Add(sizer, 0, wx.EXPAND)

        certRadio = wx.RadioBox(dlg, -1, _("Certificate"), choices=[_("Accept Always"), _("Accept Once"), _("Reject")], majorDimension=1, style=wx.RA_SPECIFY_COLS)

        buttonSizer = wx.BoxSizer(wx.HORIZONTAL)
        okBtn = wx.Button(dlg, wx.ID_OK)
        okBtn.SetDefault()
        buttonSizer.Add(okBtn, 0, wx.RIGHT, HALF_SPACE)
        buttonSizer.Add(wx.Button(dlg, wx.ID_CANCEL), 0)

        contentSizer = wx.BoxSizer(wx.VERTICAL)
        contentSizer.Add(box, 0, wx.TOP|wx.LEFT|wx.RIGHT|wx.EXPAND, SPACE)
        contentSizer.Add(certRadio, 0, wx.TOP|wx.LEFT|wx.RIGHT|wx.BOTTOM|wx.EXPAND, SPACE)
        contentSizer.Add(buttonSizer, 0, wx.ALL|wx.ALIGN_RIGHT, SPACE)

        dlg.SetSizer(contentSizer)
        dlg.Fit()
        dlg.Layout()

        # default values for reject
        retcode = False
        acceptedFailures = 0
        save = False

        dlg.CenterOnParent()
        if dlg.ShowModal() == wx.ID_OK:
            cert = certRadio.GetStringSelection()
            if cert == _("Accept Always"):
                retcode = True
                acceptedFailures = trustDict.get('failures')
                save = True
            elif cert == _("Accept Once"):
                retcode = True
                acceptedFailures = trustDict.get('failures')
                save = False

        dlg.Destroy()
        return retcode, acceptedFailures, save


    def SSLClientPassword(self, realm, maySave):
        dlg = wx.Dialog(wx.GetApp().GetTopWindow(), -1, _("SSL Client Certificate Login"))

        sizer = wx.FlexGridSizer(cols = 2, hgap = 5, vgap = 5)
        sizer.Add(wx.StaticText(dlg, -1, _("Realm:")), 0, wx.ALIGN_CENTER_VERTICAL)
        sizer.Add(wx.StaticText(dlg, -1, realm), 0, wx.ALIGN_CENTER_VERTICAL)
        sizer.Add(wx.StaticText(dlg, -1, _("Password:")), 0, wx.ALIGN_CENTER_VERTICAL)
        passwordTxt = wx.TextCtrl(dlg, -1, size=(200, -1), style=wx.TE_PASSWORD)
        sizer.Add(passwordTxt, 0, wx.ALIGN_CENTER_VERTICAL)

        savePasswordCheckbox = wx.CheckBox(dlg, -1, _("Remember Password"))
        if not maySave:
            savePasswordCheckbox.Enable(False)

        buttonSizer = wx.BoxSizer(wx.HORIZONTAL)
        okBtn = wx.Button(dlg, wx.ID_OK)
        okBtn.SetDefault()
        buttonSizer.Add(okBtn, 0, wx.RIGHT, HALF_SPACE)
        buttonSizer.Add(wx.Button(dlg, wx.ID_CANCEL), 0)

        contentSizer = wx.BoxSizer(wx.VERTICAL)
        contentSizer.Add(sizer, 0, wx.LEFT|wx.TOP|wx.RIGHT, SPACE)
        contentSizer.Add(savePasswordCheckbox, 0, wx.TOP|wx.LEFT|wx.BOTTOM, SPACE)
        contentSizer.Add(buttonSizer, 0, wx.ALL|wx.ALIGN_RIGHT, SPACE)

        dlg.SetSizer(contentSizer)
        dlg.Fit()
        dlg.Layout()

        dlg.CenterOnParent()
        if dlg.ShowModal() == wx.ID_OK:
            retcode = True
            password = passwordTxt.GetValue()
            save = savePasswordCheckbox.IsChecked()
        else:
            retcode = False
            password = None
            save = False

        dlg.Destroy()
        return retcode, password, save


    def SSLClientCert(self):
        dlg = wx.FileDialog(wx.GetApp().GetTopWindow(),
            message="Choose certificate",
            style=wx.OPEN|wx.FILE_MUST_EXIST|wx.CHANGE_DIR
            )
            
        # dlg.CenterOnParent()  # wxBug: caused crash with wx.FileDialog
        if dlg.ShowModal() == wx.ID_OK:
            retcode = True
            certfile = dlg.GetPath()

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?