Mercurial and Git clients can push and pull from this alias URL to interact with this repository. You can change to which repository an alias points by going to the Aliases link on the project page.
# serve.py - TortoiseHg dialog to start web server## Copyright 2010 Yuya Nishihara <yuya@tcha.org>## This software may be used and distributed according to the terms of the# GNU General Public License version 2, incorporated herein by reference.
import sys, os, httplib, socket
-from PyQt4.QtCore import Qt, pyqtSlot-from PyQt4.QtGui import QDialog, QSystemTrayIcon+from PyQt4.QtCore import *+from PyQt4.QtGui import *from mercurial import extensions, hgweb, util
from tortoisehg.hgqt import cmdui, qtlib
from tortoisehg.hgqt.i18n import _
try:fromtortoisehg.hgqt.ui_serveimportUi_ServeDialogexceptImportError:fromPyQt4importuicUi_ServeDialog=uic.loadUiType(os.path.join(os.path.dirname(__file__),'serve.ui'))[0]classServeDialog(QDialog):"""Dialog for serving repositories via web"""def__init__(self,parent=None):super(ServeDialog,self).__init__(parent)self.setWindowFlags((self.windowFlags()|Qt.WindowMinimizeButtonHint)&~Qt.WindowContextHelpButtonHint)# TODO: choose appropriate iconself.setWindowIcon(qtlib.geticon('proxy'))self._qui=Ui_ServeDialog()self._qui.setupUi(self)self._initcmd()self._initactions()# TODO: webconf tab (multi-repo support)self._updateform()def_initcmd(self):self._cmd=cmdui.Widget()# TODO: forget old logs?self._log_edit=self._cmd.core.output_textself._qui.details_tabs.addTab(self._log_edit,_('Log'))self._cmd.hide()self._cmd.commandStarted.connect(self._updateform)self._cmd.commandFinished.connect(self._updateform)def_initactions(self):self._qui.start_button.clicked.connect(self.start)self._qui.stop_button.clicked.connect(self.stop)@pyqtSlot()def_updateform(self):"""update form availability and status text"""self._updatestatus()self._qui.start_button.setEnabled(notself.isstarted())self._qui.stop_button.setEnabled(self.isstarted())self._qui.settings_button.setEnabled(notself.isstarted())self._qui.port_edit.setEnabled(notself.isstarted())def_updatestatus(self):defstatustext():ifself.isstarted():# TODO: escape special charslink='<a href="%s">%s</a>'%(self.rooturl,self.rooturl)return_('Running at %s')%linkelse:return_('Stopped')self._qui.status_edit.setText(statustext())@pyqtSlot()defstart(self):"""Start web server"""ifself.isstarted():return_setupwrapper()self._cmd.run(['serve','--port',str(self.port)])@pyqtSlot()defstop(self):"""Stop web server"""ifnotself.isstarted():returnself._cmd.cancel()self._fake_request()# TODO: sometimes it doesn't release the portdef_fake_request(self):"""Send fake request for server to run python code"""TIMEOUT=0.5# [sec]conn=httplib.HTTPConnection('localhost:%d'%self.port)origtimeout=socket.getdefaulttimeout()socket.setdefaulttimeout(TIMEOUT)try:conn.request('GET','/')res=conn.getresponse()res.read()except(socket.error,httplib.HTTPException):passfinally:socket.setdefaulttimeout(origtimeout)conn.close()defreject(self):self.stop()super(ServeDialog,self).reject()defisstarted(self):"""Is the web server running?"""returnself._cmd.core.is_running()@propertydefrooturl(self):"""Returns the root URL of the web server"""# TODO: scheme, hostname ?return'http://localhost:%d'%self.port@propertydefport(self):"""Port number of the web server"""returnint(self._qui.port_edit.value())defkeyPressEvent(self,event):ifself.isstarted()andevent.key()==Qt.Key_Escape:self.stop()returnreturnsuper(ServeDialog,self).keyPressEvent(event)defcloseEvent(self,event):ifself.isstarted():self._minimizetotray()event.ignore()returnreturnsuper(ServeDialog,self).closeEvent(event)@util.propertycachedef_trayicon(self):icon=QSystemTrayIcon(self.windowIcon(),parent=self)icon.activated.connect(self._restorefromtray)icon.setToolTip(self.windowTitle())# TODO: context menureturnicon# TODO: minimize to tray by minimize button@pyqtSlot()def_minimizetotray(self):self._trayicon.show()self.hide()@pyqtSlot()def_restorefromtray(self):self._trayicon.hide()self.show()@pyqtSlot()defon_settings_button_clicked(self):fromtortoisehg.hgqtimportsettingssettings.SettingsDialog(parent=self,focus='web.name').exec_()def_create_server(orig,ui,app):"""wrapper for hgweb.server.create_server to be interruptable"""server=orig(ui,app)server.accesslog=uiserver.errorlog=ui# TODO: ui.warnserver._serving=Falsedefserve_forever(orig):server._serving=Truewhileserver._serving:server.handle_request()defhandle_error(orig,request,client_address):type=sys.exc_info()[0]ifissubclass(type,KeyboardInterrupt):server._serving=Falseelse:orig(request,client_address)extensions.wrapfunction(server,'serve_forever',serve_forever)extensions.wrapfunction(server,'handle_error',handle_error)returnserver_setupwrapper_done=Falsedef_setupwrapper():"""Wrap hgweb.server.create_server to get along with thg"""global_setupwrapper_doneifnot_setupwrapper_done:extensions.wrapfunction(hgweb.server,'create_server',_create_server)_setupwrapper_done=Truedefrun(ui,*pats,**opts):# TODO: handle --web-confdlg=ServeDialog()dlg.start()returndlg
Attach a Trello Card
Add a tag
Your session has expired
You are no longer logged in. Please log in and try your request again.
Filter RSS Feed
This RSS feed URL allows you to see the contents of your current filter using any feed reader.
This link includes a special authentication token. If you share the URL with anyone else, they can see this RSS feed's activity. You can disable these tokens when needed.
Your current filter is unsaved; changing it won't affect this RSS feed.