Changeset db36d1f7e96a…
Parent 61482ea34fd0…
by
Changes to 64 files · Browse files at db36d1f7e96a Showing diff from parent 61482ea34fd0 Diff from another changeset...
@@ -35,13 +35,13 @@ pfile = pfile[:-1]
path = os.path.dirname(os.path.dirname(os.path.realpath(pfile)))
thgpath = os.path.normpath(path)
- testpath = os.path.join(thgpath, 'thgutil')
+ testpath = os.path.join(thgpath, 'tortoisehg')
if os.path.isdir(testpath) and thgpath not in sys.path:
sys.path.insert(0, thgpath)
_thg_path()
-from thgutil import paths, debugthg, hglib, cachethg
-from hggtk import gtklib
+from tortoisehg.util import paths, debugthg, hglib, cachethg
+from tortoisehg.hgtk import gtklib
if debugthg.debug('N'):
debugf = debugthg.debugf
@@ -62,7 +62,7 @@ self.allvfs = {}
self.inv_dirs = set()
- from thgutil import menuthg
+ from tortoisehg.util import menuthg
self.hgtk = paths.find_in_path('hgtk')
self.menu = menuthg.menuThg()
self.notify = os.path.expanduser('~/.tortoisehg/notify')
|
@@ -35,7 +35,7 @@ # Fix for nautilus python extensions in lib64 on x86_64
sed -i "s,lib/nautilus,%{_lib}/nautilus,g" setup.py
-cat > thgutil/config.py << EOT
+cat > tortoisehg/util/config.py << EOT
bin_path = "%{_bindir}"
license_path = "%{_docdir}/%{name}-%{version}/COPYING.txt"
locale_path = "%{_datadir}/locale"
@@ -62,8 +62,8 @@%defattr(-,root,root,-)
%doc COPYING.txt ReleaseNotes.txt doc/build/html/
%{_bindir}/hgtk
-%{python_sitelib}/hggtk/
-%{python_sitelib}/thgutil/
+%{python_sitelib}/tortoisehg/hgtk/
+%{python_sitelib}/tortoisehg/util/
%{python_sitelib}/tortoisehg-*.egg-info
%{_datadir}/pixmaps/tortoisehg/
%{_datadir}/locale/*/LC_MESSAGES/tortoisehg.mo
|
|
@@ -1,73 +0,0 @@ - # rename.py - TortoiseHg's dialogs for handling renames
-#
-# Copyright 2009 Steve Borho <steve@borho.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
-import gtk
-import cStringIO
-
-from mercurial import hg, ui, util, commands
-
-from thgutil.i18n import _
-from thgutil import hglib, paths
-
-from hggtk import dialog
-
-def run(ui, *pats, **opts):
- fname, target = '', ''
- try:
- fname = pats[0]
- target = pats[1]
- except IndexError:
- pass
- fname = util.normpath(fname)
- if target:
- target = hglib.toutf(util.normpath(target))
- else:
- target = hglib.toutf(fname)
- title = _('Rename ') + hglib.toutf(fname)
- dlg = dialog.entry_dialog(None, title, True, target, rename_resp)
- dlg.orig = fname
- return dlg
-
-def rename_resp(dlg, response):
- if response != gtk.RESPONSE_OK:
- dlg.destroy()
- return
- try:
- root = paths.find_root()
- repo = hg.repository(ui.ui(), root)
- except (ImportError, hglib.RepoError):
- dlg.destroy()
- return
-
- new_name = hglib.fromutf(dlg.entry.get_text())
- opts = {}
- opts['force'] = False # Checkbox? Nah.
- opts['after'] = False
- opts['dry_run'] = False
-
- saved = sys.stderr
- errors = cStringIO.StringIO()
- toquit = False
- try:
- sys.stderr = errors
- repo.ui.pushbuffer()
- repo.ui.quiet = True
- try:
- commands.rename(repo.ui, repo, dlg.orig, new_name, **opts)
- toquit = True
- except (util.Abort, hglib.RepoError), inst:
- dlg.error_dialog(None, _('rename error'), str(inst))
- toquit = False
- finally:
- sys.stderr = saved
- textout = errors.getvalue() + repo.ui.popbuffer()
- errors.close()
- if len(textout) > 1:
- dlg.error_dialog(None, _('rename error'), textout)
- elif toquit:
- dlg.destroy()
|
@@ -11,13 +11,13 @@
if hasattr(sys, "frozen"):
# Prepend C:\Program Files\TortoiseHg\gtk (equiv) to the path
- from thgutil import paths
+ from tortoisehg.util import paths
gtkpath = os.path.join(paths.bin_path, 'gtk')
os.environ['PATH'] = os.pathsep.join([gtkpath, os.environ['PATH']])
else:
# if hgtk is a symlink, insert symlink target directory in sys.path
thgpath = os.path.dirname(os.path.realpath(__file__))
- testpath = os.path.join(thgpath, 'thgutil')
+ testpath = os.path.join(thgpath, 'tortoisehg')
if os.path.isdir(testpath) and thgpath not in sys.path:
sys.path.insert(0, thgpath)
@@ -30,14 +30,14 @@demandimport.ignore.append('win32com.shell')
demandimport.enable()
from mercurial import ui, util
-from thgutil.hgversion import hgversion, checkhgversion
+from tortoisehg.util.hgversion import hgversion, checkhgversion
import cStringIO
import traceback
try:
- import hggtk.hgtk
+ import tortoisehg.hgtk.hgtk
except ImportError:
- sys.stderr.write("abort: couldn't find hggtk libraries in [%s]\n" %
+ sys.stderr.write("abort: couldn't find hgtk libraries in [%s]\n" %
';'.join(sys.path))
sys.stderr.write("(check your install and PYTHONPATH)\n")
sys.exit(-1)
@@ -51,19 +51,19 @@ sys.exit(1)
if not capt or 'THGDEBUG' in os.environ:
- sys.exit(hggtk.hgtk.dispatch(sys.argv[1:]))
+ sys.exit(tortoisehg.hgtk.hgtk.dispatch(sys.argv[1:]))
else:
mystderr = cStringIO.StringIO()
origstderr = sys.stderr
sys.stderr = mystderr
try:
- ret = hggtk.hgtk.dispatch(sys.argv[1:])
+ ret = tortoisehg.hgtk.hgtk.dispatch(sys.argv[1:])
sys.stderr = origstderr
mystderr.seek(0)
for l in mystderr.readlines():
if l.startswith('Traceback') or l.startswith('TypeError'):
- from hggtk.bugreport import run
- from hggtk.hgtk import gtkrun
+ from tortoisehg.hgtk.bugreport import run
+ from tortoisehg.hgtk.hgtk import gtkrun
error = 'Recoverable runtime error (stderr):\n'
error += mystderr.getvalue()
opts = {}
|
@@ -56,7 +56,8 @@ # Specific definitios for Windows NT-alike installations
_scripts = []
_data_files = []
- _packages = ['hggtk', 'hggtk.logview', 'thgutil']
+ _packages = ['tortoisehg.hgtk', 'tortoisehg.hgtk.logview',
+ 'tortoisehg.util']
extra = {}
hgextmods = []
@@ -128,7 +129,8 @@ # Specific definitios for Posix installations
_extra = {}
_scripts = ['hgtk']
- _packages = ['hggtk', 'hggtk.logview', 'thgutil']
+ _packages = ['tortoisehg.hgtk', 'tortoisehg.hgtk.logview',
+ 'tortoisehg.util']
_data_files = [(os.path.join('share/pixmaps/tortoisehg', root),
[os.path.join(root, file_) for file_ in files])
for root, dirs, files in os.walk('icons')]
@@ -139,7 +141,7 @@ ['contrib/nautilus-thg.py'])]
# Create a config.py. Distributions will need to supply their own
- cfgfile = os.path.join('thgutil', 'config.py')
+ cfgfile = os.path.join('tortoisehg', 'util', 'config.py')
if not os.path.exists(cfgfile) and not os.path.exists('.hg/requires'):
f = open(cfgfile, "w")
f.write('bin_path = "/usr/bin"\n')
@@ -168,15 +170,15 @@except OSError:
version = "unknown"
-verfile = os.path.join("thgutil", "__version__.py")
+verfile = os.path.join('tortoisehg', 'util', '__version__.py')
if version != 'unknown' or not os.path.exists(verfile):
f = file(verfile, "w")
f.write('# this file is autogenerated by setup.py\n')
f.write('version = "%s"\n' % version)
f.close()
else:
- import thgutil.__version__
- version = thgutil.__version__.version
+ import tortoisehg.util.__version__
+ version = tortoisehg.util.__version__.version
setup(name="tortoisehg",
version=version,
|
@@ -24,12 +24,11 @@ demandimport.ignore.append('win32com.shell')
demandimport.enable()
from mercurial import ui, error
-from thgutil.i18n import agettext as _
-from thgutil import thread2, paths, shlib
+from tortoisehg.util.i18n import agettext as _
+from tortoisehg.util import thread2, paths, shlib
if hasattr(sys, "frozen"):
# Insert PATH to binary installer gtk directory
- from thgutil import paths
gtkpath = os.path.join(paths.bin_path, 'gtk')
os.environ['PATH'] = os.pathsep.join([gtkpath, os.environ['PATH']])
# Give stdout/stderr closed attributes to prevent ui.py errors
@@ -45,7 +44,7 @@ # Try and find a custom icon
print "SetIcon(%s)" % name
hinst = GetModuleHandle(None)
- from thgutil.paths import get_tortoise_icon
+ from tortoisehg.util.paths import get_tortoise_icon
iconPathName = get_tortoise_icon(name)
if iconPathName and os.path.isfile(iconPathName):
icon_flags = win32con.LR_LOADFROMFILE | win32con.LR_DEFAULTSIZE
@@ -172,7 +171,7 @@ def launchgui(self):
def launch():
import gtk
- from hggtk import taskbarui, hgtk
+ from tortoisehg.hgtk import taskbarui
dlg = taskbarui.TaskBarUI(logger.getqueue(), requests)
dlg.show_all()
dlg.connect('destroy', gtk.main_quit)
|
@@ -11,10 +11,10 @@ import gtk
import threading
-from thgutil.i18n import _
-from thgutil import version, paths, hglib
+from tortoisehg.util.i18n import _
+from tortoisehg.util import version, paths, hglib
-from hggtk import gtklib, hgtk
+from tortoisehg.hgtk import gtklib, hgtk
def browse_url(url):
def start_browser():
|
@@ -12,10 +12,10 @@
from mercurial import hg, ui
-from thgutil.i18n import _
-from thgutil import hglib, paths
+from tortoisehg.util.i18n import _
+from tortoisehg.util import hglib, paths
-from hggtk import hgcmd, gtklib
+from tortoisehg.hgtk import hgcmd, gtklib
_working_dir_parent_ = _('= Working Directory Parent =')
|
@@ -12,10 +12,10 @@
from mercurial import hg, ui
-from thgutil.i18n import _
-from thgutil import hglib, paths, i18n, settings
+from tortoisehg.util.i18n import _
+from tortoisehg.util import hglib, paths, i18n, settings
-from hggtk import changesetinfo, gtklib, hgcmd, gdialog
+from tortoisehg.hgtk import changesetinfo, gtklib, hgcmd, gdialog
keep = i18n.keepgettext()
|
Change 1 of 1
Show Entire File
tortoisehg/hgtk/bugreport.py
Stacked
renamed from hggtk/bugreport.py
|
||
---|---|---|
@@ -10,9 +10,9 @@ import pango
from mercurial import extensions
-from thgutil.i18n import _
-from thgutil import hglib, version
-from hggtk import gdialog
+from tortoisehg.util.i18n import _
+from tortoisehg.util import hglib, version
+from tortoisehg.hgtk import gdialog
class BugReport(gdialog.GDialog):
"""GTK+ based dialog for displaying traceback info to the user in a
|
Change 1 of 3
Show Entire File
tortoisehg/hgtk/changeset.py
Stacked
renamed from hggtk/changeset.py
|
||
---|---|---|
@@ -13,11 +13,11 @@
from mercurial import cmdutil, context, util, ui, hg, patch, mdiff
-from thgutil.i18n import _
-from thgutil.hglib import *
-from thgutil import shlib
+from tortoisehg.util.i18n import _
+from tortoisehg.util.hglib import *
+from tortoisehg.util import shlib
-from hggtk import gdialog, gtklib, hgcmd
+from tortoisehg.hgtk import gdialog, gtklib, hgcmd
class ChangeSet(gdialog.GDialog):
'GTK+ based dialog for displaying repository logs'
@@ -677,7 +677,7 @@
def ann_file(self, menuitem):
'User selected annotate file from the file list context menu'
- from hggtk import datamine
+ from tortoisehg.hgtk import datamine
rev = self.currev
dialog = datamine.DataMineDialog(self.ui, self.repo, self.cwd, [], {})
dialog.display()
@@ -694,7 +694,7 @@ self.glog_parent.reload_log(**opts)
else:
# Else launch our own glog instance
- from hggtk import history
+ from tortoisehg.hgtk import history
dlg = history.run(self.ui, filehist=self.curfile)
dlg.display()
|
Change 1 of 1
Show Entire File
tortoisehg/hgtk/changesetinfo.py
Stacked
renamed from hggtk/changesetinfo.py
|
||
---|---|---|
@@ -10,10 +10,10 @@ import os
import gtk
-from thgutil.i18n import _
-from thgutil import hglib
+from tortoisehg.util.i18n import _
+from tortoisehg.util import hglib
-from hggtk import gtklib
+from tortoisehg.hgtk import gtklib
def changesetinfo(repo, revid, head=False):
def lbl(str, bold=False, right=False):
|
@@ -12,9 +12,9 @@ import traceback
from mercurial import ui, util
-from thgutil.i18n import _
-from thgutil import hglib, shlib, settings
-from hggtk import gdialog, gtklib, hgcmd
+from tortoisehg.util.i18n import _
+from tortoisehg.util import hglib, shlib, settings
+from tortoisehg.hgtk import gdialog, gtklib, hgcmd
class CloneDialog(gtk.Dialog):
""" Dialog to clone a Mercurial repo """
|
@@ -18,12 +18,11 @@
from mercurial import ui, hg, util, patch, cmdutil
-from thgutil.i18n import _
-from thgutil import shlib, hglib
+from tortoisehg.util.i18n import _
+from tortoisehg.util import shlib, hglib
-from hggtk.status import GStatus, FM_STATUS, FM_CHECKED, FM_PATH_UTF8
-from hggtk.status import DM_REJECTED, DM_CHUNK_ID
-from hggtk import gtklib, thgconfig, gdialog, hgcmd
+from tortoisehg.hgtk.status import GStatus, FM_STATUS, FM_CHECKED, FM_PATH_UTF8
+from tortoisehg.hgtk import gtklib, thgconfig, gdialog, hgcmd
class BranchOperationDialog(gtk.Dialog):
def __init__(self, branch, close, mergebranches):
@@ -745,7 +744,7 @@
def changelog_clicked(self, toolbutton, data=None):
- from hggtk import history
+ from tortoisehg.hgtk import history
dlg = history.run(self.ui)
dlg.display()
return True
|
@@ -15,14 +15,13 @@
from mercurial import util
-from thgutil.i18n import _
-from thgutil import hglib
-from thgutil import thread2
+from tortoisehg.util.i18n import _
+from tortoisehg.util import hglib, thread2
-from hggtk.logview.colormap import AnnotateColorMap, AnnotateColorSaturation
-from hggtk.logview.treeview import TreeView as LogTreeView
-
-from hggtk import gtklib, gdialog, changeset
+from tortoisehg.hgtk.logview.colormap import AnnotateColorMap
+from tortoisehg.hgtk.logview.colormap import AnnotateColorSaturation
+from tortoisehg.hgtk.logview.treeview import TreeView as LogTreeView
+from tortoisehg.hgtk import gtklib, gdialog, changeset
class DataMineDialog(gdialog.GDialog):
COL_REVID = 0
@@ -161,7 +160,7 @@ self.add_annotate_page(self.curpath, self.currev)
def cmenu_file_log(self, menuitem):
- from hggtk import history
+ from tortoisehg.hgtk import history
dlg = history.run(self.ui, filehist=self.curpath)
dlg.display()
|
@@ -15,8 +15,8 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
import gtk
-from thgutil.i18n import _
-from hggtk import gtklib
+from tortoisehg.util.i18n import _
+from tortoisehg.hgtk import gtklib
def entry_dialog(parent, msg, visible=True, default='', respfunc=None):
""" Allow a user to enter a text string (username/password)
|
@@ -17,10 +17,10 @@
from mercurial import cmdutil, util, ui, hg, commands
-from thgutil.i18n import _
-from thgutil import settings, hglib, paths
+from tortoisehg.util.i18n import _
+from tortoisehg.util import settings, hglib, paths
-from hggtk import gtklib
+from tortoisehg.hgtk import gtklib
class SimpleMessage(gtklib.MessageDialog):
def run(self):
@@ -344,7 +344,7 @@ if not url.startswith('http'):
docpath = os.path.dirname(paths.get_license_path())
url = os.path.join(docpath, url)
- from hggtk import about
+ from tortoisehg.hgtk import about
about.browseurl(url)
def launch(self, item, app):
@@ -517,7 +517,7 @@ return True, textout
def _do_diff(self, canonpats, options):
- from hggtk import visdiff
+ from tortoisehg.hgtk import visdiff
options['canonpats'] = canonpats
dialog = visdiff.run(self.ui, **options)
if not dialog:
@@ -530,7 +530,7 @@ self._do_diff(file and [file] or [], self.opts)
def _view_files(self, files, otherparent):
- from hggtk import thgconfig
+ from tortoisehg.hgtk import thgconfig
def cleanup():
shutil.rmtree(self.tmproot)
|
@@ -11,8 +11,8 @@ import gobject
import mercurial
-from thgutil.i18n import _
-from hggtk import gtklib, gdialog
+from tortoisehg.util.i18n import _
+from tortoisehg.hgtk import gtklib, gdialog
class GotoRevDialog(gtk.Dialog):
|
@@ -12,10 +12,10 @@ import gobject
import pango
-from thgutil.i18n import _
-from thgutil import paths, hglib
+from tortoisehg.util.i18n import _
+from tortoisehg.util import paths, hglib
-from hggtk import hgtk
+from tortoisehg.hgtk import hgtk
if gtk.gtk_version < (2, 14, 0):
# at least on 2.12.12, gtk widgets can be confused by control
@@ -329,7 +329,7 @@ pass
else:
def selectlang(senderitem):
- from hggtk import dialog
+ from tortoisehg.hgtk import dialog
spell = gtkspell.get_from_text_view(textview)
lang = ''
while True:
|
@@ -15,11 +15,11 @@
from mercurial import hg, ui, mdiff, cmdutil, match, util
-from thgutil.i18n import _
-from thgutil.hglib import toutf, fromutf, diffexpand, RepoError
-from thgutil import shlib, paths, thread2, settings
+from tortoisehg.util.i18n import _
+from tortoisehg.util.hglib import toutf, fromutf, diffexpand, RepoError
+from tortoisehg.util import shlib, paths, thread2, settings
-from hggtk import gtklib
+from tortoisehg.hgtk import gtklib
# This function and some key bits below borrowed ruthelessly from
# Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
|
@@ -12,10 +12,10 @@ import os
import Queue
-from thgutil.i18n import _
-from thgutil import shlib, hglib
+from tortoisehg.util.i18n import _
+from tortoisehg.util import shlib, hglib
-from hggtk import gtklib, hgthread
+from tortoisehg.hgtk import gtklib, hgthread
class CmdDialog(gtk.Dialog):
def __init__(self, cmdline, progressbar=True):
|
@@ -15,10 +15,10 @@
from mercurial import hg, ui, extensions
-from thgutil.i18n import _
-from thgutil import hglib, settings
+from tortoisehg.util.i18n import _
+from tortoisehg.util import hglib, settings
-from hggtk import gtklib, dialog, thgconfig, hgcmd
+from tortoisehg.hgtk import gtklib, dialog, thgconfig, hgcmd
class EmailDialog(gtk.Window):
""" Send patches or bundles via email """
|
@@ -12,10 +12,10 @@
from mercurial import hg, ui, match, util
-from thgutil.i18n import _
-from thgutil import shlib, hglib, paths
+from tortoisehg.util.i18n import _
+from tortoisehg.util import shlib, hglib, paths
-from hggtk import gtklib, gdialog
+from tortoisehg.hgtk import gtklib, gdialog
class HgIgnoreDialog(gtk.Window):
'Edit a reposiory .hgignore file'
|
@@ -10,10 +10,10 @@
from mercurial import hg, ui, util
-from thgutil.i18n import _
-from thgutil import hglib, shlib
+from tortoisehg.util.i18n import _
+from tortoisehg.util import hglib, shlib
-from hggtk import dialog, gtklib
+from tortoisehg.hgtk import dialog, gtklib
class InitDialog(gtk.Dialog):
""" Dialog to initialize a Mercurial repo """
|
@@ -11,10 +11,10 @@
from mercurial import ui, util
-from thgutil.i18n import _
-from thgutil import hglib, thread2
+from tortoisehg.util.i18n import _
+from tortoisehg.util import hglib, thread2
-from hggtk import dialog, gdialog
+from tortoisehg.hgtk import dialog, gdialog
class GtkUi(ui.ui):
'''
|
|
|
@@ -22,9 +22,9 @@ import mercurial.ui as _ui
from mercurial import hg, util, fancyopts, cmdutil, extensions
-from thgutil.i18n import agettext as _
-from thgutil import hglib, paths, shlib
-from thgutil import version as thgversion
+from tortoisehg.util.i18n import agettext as _
+from tortoisehg.util import hglib, paths, shlib
+from tortoisehg.util import version as thgversion
nonrepo_commands = '''userconfig clone debugcomplete init about help
version thgstatus serve'''
@@ -55,7 +55,7 @@ except KeyboardInterrupt:
print _('\nCaught keyboard interrupt, aborting.\n')
except:
- from hggtk.bugreport import run
+ from tortoisehg.hgtk.bugreport import run
if '--debugger' in args:
pdb.post_mortem(sys.exc_info()[2])
error = traceback.format_exc()
@@ -275,7 +275,7 @@
def about(ui, *pats, **opts):
"""about TortoiseHg"""
- from hggtk.about import run
+ from tortoisehg.hgtk.about import run
gtkrun(run, ui, *pats, **opts)
def add(ui, *pats, **opts):
@@ -286,12 +286,12 @@
def thgstatus(ui, *pats, **opts):
"""update TortoiseHg status cache"""
- from hggtk.thgstatus import run
+ from tortoisehg.util.thgstatus import run
run(ui, *pats, **opts)
def clone(ui, *pats, **opts):
"""clone tool"""
- from hggtk.clone import run
+ from tortoisehg.hgtk.clone import run
gtkrun(run, ui, *pats, **opts)
def commit(ui, *pats, **opts):
@@ -302,89 +302,89 @@ if len(repo.parents()) > 1:
os.chdir(repo.root)
pats = []
- from hggtk.commit import run
+ from tortoisehg.hgtk.commit import run
gtkrun(run, ui, *pats, **opts)
def shelve(ui, *pats, **opts):
"""shelve/unshelve tool"""
- from hggtk.thgshelve import run
+ from tortoisehg.hgtk.thgshelve import run
gtkrun(run, ui, *pats, **opts)
def userconfig(ui, *pats, **opts):
"""user configuration editor"""
- from hggtk.thgconfig import run
+ from tortoisehg.hgtk.thgconfig import run
opts['repomode'] = False
gtkrun(run, ui, *pats, **opts)
def repoconfig(ui, *pats, **opts):
"""repository configuration editor"""
- from hggtk.thgconfig import run
+ from tortoisehg.hgtk.thgconfig import run
opts['repomode'] = True
gtkrun(run, ui, *pats, **opts)
def rename(ui, *pats, **opts):
"""rename a single file or directory"""
if not pats or len(pats) > 2:
- from hggtk import gdialog
+ from tortoisehg.hgtk import gdialog
gdialog.Prompt(_('Rename error'),
_('rename takes one or two path arguments'), None).run()
return
- from hggtk.rename import run
+ from tortoisehg.hgtk.rename import run
gtkrun(run, ui, *pats, **opts)
def guess(ui, *pats, **opts):
"""guess previous renames or copies"""
- from hggtk.guess import run
+ from tortoisehg.hgtk.guess import run
gtkrun(run, ui, *pats, **opts)
def datamine(ui, *pats, **opts):
"""repository search and annotate tool"""
- from hggtk.datamine import run
+ from tortoisehg.hgtk.datamine import run
gtkrun(run, ui, *pats, **opts)
def hgignore(ui, *pats, **opts):
"""ignore filter editor"""
- from hggtk.hgignore import run
+ from tortoisehg.hgtk.hgignore import run
gtkrun(run, ui, *pats, **opts)
def hginit(ui, *pats, **opts):
"""repository initialization tool"""
- from hggtk.hginit import run
+ from tortoisehg.hgtk.hginit import run
gtkrun(run, ui, *pats, **opts)
def log(ui, *pats, **opts):
"""changelog viewer"""
- from hggtk.history import run
+ from tortoisehg.hgtk.history import run
gtkrun(run, ui, *pats, **opts)
def merge(ui, *pats, **opts):
"""merge tool"""
- from hggtk.merge import run
+ from tortoisehg.hgtk.merge import run
gtkrun(run, ui, *pats, **opts)
def recovery(ui, *pats, **opts):
"""recover, rollback & verify"""
- from hggtk.recovery import run
+ from tortoisehg.hgtk.recovery import run
gtkrun(run, ui, *pats, **opts)
def remove(ui, *pats, **opts):
"""file status viewer in remove mode"""
- from hggtk.status import run
+ from tortoisehg.hgtk.status import run
gtkrun(run, ui, *pats, **opts)
def revert(ui, *pats, **opts):
"""file status viewer in revert mode"""
- from hggtk.status import run
+ from tortoisehg.hgtk.status import run
gtkrun(run, ui, *pats, **opts)
def forget(ui, *pats, **opts):
"""file status viewer in forget mode"""
- from hggtk.status import run
+ from tortoisehg.hgtk.status import run
gtkrun(run, ui, *pats, **opts)
def serve(ui, *pats, **opts):
"""web server"""
- from hggtk.serve import run
+ from tortoisehg.hgtk.serve import run
if paths.find_root() == None and not opts['webdir_conf']:
raise hglib.RepoError(_("There is no Mercurial repository here"
" (.hg not found)"))
@@ -392,12 +392,12 @@
def status(ui, *pats, **opts):
"""file status & diff viewer"""
- from hggtk.status import run
+ from tortoisehg.hgtk.status import run
gtkrun(run, ui, *pats, **opts)
def synch(ui, *pats, **opts):
"""repository synchronization tool"""
- from hggtk.synch import run
+ from tortoisehg.hgtk.synch import run
cmd = opts['alias']
if cmd in ('push', 'outgoing', 'email'):
opts['pushmode'] = True
@@ -407,12 +407,12 @@
def update(ui, *pats, **opts):
"""update/checkout tool"""
- from hggtk.update import run
+ from tortoisehg.hgtk.update import run
gtkrun(run, ui, *pats, **opts)
def vdiff(ui, *pats, **opts):
"""launch configured visual diff tool"""
- from hggtk.visdiff import run, rawextdiff
+ from tortoisehg.hgtk.visdiff import run, rawextdiff
if opts.get('raw'):
rawextdiff(ui, *pats, **opts)
return
@@ -614,7 +614,7 @@
def archive(ui, *pats, **opts):
"""create an unversioned archive of a repository revision"""
- from hggtk.archive import run
+ from tortoisehg.hgtk.archive import run
gtkrun(run, ui, *pats, **opts)
globalopts = [
|
Change 1 of 1
Show Entire File
tortoisehg/hgtk/histdetails.py
Stacked
renamed from hggtk/histdetails.py
|
||
---|---|---|
@@ -8,9 +8,9 @@ import gtk
import gobject
-from thgutil.i18n import _
+from tortoisehg.util.i18n import _
-from hggtk import gtklib
+from tortoisehg.hgtk import gtklib
class LogDetailsDialog(gtk.Dialog):
|
@@ -14,14 +14,14 @@
from mercurial import ui, hg, cmdutil, commands, extensions, util
-from thgutil.i18n import _
-from thgutil import hglib, paths
+from tortoisehg.util.i18n import _
+from tortoisehg.util import hglib, paths
-from hggtk.logview.treeview import TreeView as LogTreeView
+from tortoisehg.hgtk.logview.treeview import TreeView as LogTreeView
-from hggtk import gdialog, gtklib, hgcmd, datamine, logfilter, gorev
-from hggtk import backout, status, hgemail, tagadd, update, merge, archive
-from hggtk import changeset, thgconfig, thgmq, histdetails
+from tortoisehg.hgtk import gdialog, gtklib, hgcmd, datamine, logfilter, gorev
+from tortoisehg.hgtk import backout, status, hgemail, tagadd, update, merge
+from tortoisehg.hgtk import archive, changeset, thgconfig, thgmq, histdetails
def create_menu(label, callback):
menuitem = gtk.MenuItem(label, True)
@@ -122,7 +122,7 @@ elif not parents == newparents:
self.refresh_model()
- from hggtk import synch
+ from tortoisehg.hgtk import synch
parents = [x.node() for x in self.repo.parents()]
dlg = synch.SynchDialog([], False, True)
dlg.set_notify_func(synch_callback, parents)
|
renamed from hggtk/logview/__init__.py
|
||
---|---|---|
renamed from hggtk/logview/colormap.py
|
||
---|---|---|
renamed from hggtk/logview/graphcell.py
|
||
---|---|---|
renamed from hggtk/logview/revgraph.py
|
||
---|---|---|
Change 1 of 1
Show Entire File
tortoisehg/hgtk/logview/treemodel.py
Stacked
renamed from hggtk/logview/treemodel.py
|
||
---|---|---|
@@ -17,8 +17,8 @@ import gtk
import gobject
from mercurial import util, templatefilters
-from thgutil import hglib
-from hggtk import gtklib
+from tortoisehg.util import hglib
+from tortoisehg.hgtk import gtklib
# treemodel row enumerated attributes
LINES = 0 # These elements come from the changelog walker
|
Change 1 of 1
Show Entire File
tortoisehg/hgtk/logview/treeview.py
Stacked
renamed from hggtk/logview/treeview.py
|
||
---|---|---|
@@ -21,12 +21,12 @@ import re
import time
-from thgutil.i18n import _
-from thgutil import hglib
+from tortoisehg.util.i18n import _
+from tortoisehg.util import hglib
-from hggtk.logview import treemodel
-from hggtk.logview.graphcell import CellRendererGraph
-from hggtk.logview.revgraph import *
+from tortoisehg.hgtk.logview import treemodel
+from tortoisehg.hgtk.logview.graphcell import CellRendererGraph
+from tortoisehg.hgtk.logview.revgraph import *
class TreeView(gtk.ScrolledWindow):
|
@@ -12,10 +12,10 @@
from mercurial import hg, ui
-from thgutil.i18n import _
-from thgutil import hglib, paths
+from tortoisehg.util.i18n import _
+from tortoisehg.util import hglib, paths
-from hggtk import changesetinfo, gtklib, commit, gdialog, hgcmd
+from tortoisehg.hgtk import changesetinfo, gtklib, commit, gdialog, hgcmd
class MergeDialog(gtk.Window):
""" Dialog to merge revisions of a Mercurial repo """
|
@@ -15,10 +15,10 @@
from mercurial import hg, ui
-from thgutil.i18n import _
-from thgutil import hglib, shlib, paths
+from tortoisehg.util.i18n import _
+from tortoisehg.util import hglib, shlib, paths
-from hggtk import gdialog, dialog, gtklib, hgthread
+from tortoisehg.hgtk import gdialog, dialog, gtklib, hgthread
class RecoveryDialog(gtk.Window):
def __init__(self):
|
|
@@ -0,0 +1,73 @@ + # rename.py - TortoiseHg's dialogs for handling renames
+#
+# Copyright 2009 Steve Borho <steve@borho.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
+import gtk
+import cStringIO
+
+from mercurial import hg, ui, util, commands
+
+from tortoisehg.util.i18n import _
+from tortoisehg.util import hglib, paths
+
+from tortoisehg.hgtk import dialog
+
+def run(ui, *pats, **opts):
+ fname, target = '', ''
+ try:
+ fname = pats[0]
+ target = pats[1]
+ except IndexError:
+ pass
+ fname = util.normpath(fname)
+ if target:
+ target = hglib.toutf(util.normpath(target))
+ else:
+ target = hglib.toutf(fname)
+ title = _('Rename ') + hglib.toutf(fname)
+ dlg = dialog.entry_dialog(None, title, True, target, rename_resp)
+ dlg.orig = fname
+ return dlg
+
+def rename_resp(dlg, response):
+ if response != gtk.RESPONSE_OK:
+ dlg.destroy()
+ return
+ try:
+ root = paths.find_root()
+ repo = hg.repository(ui.ui(), root)
+ except (ImportError, hglib.RepoError):
+ dlg.destroy()
+ return
+
+ new_name = hglib.fromutf(dlg.entry.get_text())
+ opts = {}
+ opts['force'] = False # Checkbox? Nah.
+ opts['after'] = False
+ opts['dry_run'] = False
+
+ saved = sys.stderr
+ errors = cStringIO.StringIO()
+ toquit = False
+ try:
+ sys.stderr = errors
+ repo.ui.pushbuffer()
+ repo.ui.quiet = True
+ try:
+ commands.rename(repo.ui, repo, dlg.orig, new_name, **opts)
+ toquit = True
+ except (util.Abort, hglib.RepoError), inst:
+ dlg.error_dialog(None, _('rename error'), str(inst))
+ toquit = False
+ finally:
+ sys.stderr = saved
+ textout = errors.getvalue() + repo.ui.popbuffer()
+ errors.close()
+ if len(textout) > 1:
+ dlg.error_dialog(None, _('rename error'), textout)
+ elif toquit:
+ dlg.destroy()
|
@@ -20,10 +20,10 @@ from mercurial import hg, ui, commands, cmdutil, util
from mercurial.hgweb import server
-from thgutil.i18n import _
-from thgutil import hglib, paths
+from tortoisehg.util.i18n import _
+from tortoisehg.util import hglib, paths
-from hggtk import dialog, gdialog, gtklib, thgconfig
+from tortoisehg.hgtk import dialog, gdialog, gtklib, thgconfig
gservice = None
class ServeDialog(gtk.Window):
|
@@ -18,10 +18,10 @@ from mercurial import cmdutil, util, commands, patch, mdiff
from mercurial import merge as merge_
-from thgutil.i18n import _
-from thgutil import hglib, shlib, paths
+from tortoisehg.util.i18n import _
+from tortoisehg.util import hglib, shlib, paths, hgshelve
-from hggtk import dialog, gdialog, hgshelve, gtklib, guess, hgignore
+from tortoisehg.hgtk import dialog, gdialog, gtklib, guess, hgignore
# file model row enumerations
FM_CHECKED = 0
@@ -1334,7 +1334,7 @@ def remove(menuitem, files):
self.hg_remove(files)
def log(menuitem, files):
- from hggtk import history
+ from tortoisehg.hgtk import history
dlg = history.run(self.ui, canonpats=files)
dlg.display()
def forget(menuitem, files):
|
@@ -17,11 +17,11 @@
from mercurial import hg, ui, extensions, url
-from thgutil.i18n import _
-from thgutil import hglib, settings, paths
+from tortoisehg.util.i18n import _
+from tortoisehg.util import hglib, settings, paths
-from hggtk import dialog, gtklib, hgthread, history, thgconfig, hgemail
-from hggtk import thgshelve
+from tortoisehg.hgtk import dialog, gtklib, hgthread, history, thgconfig
+from tortoisehg.hgtk import thgshelve, hgemail
class SynchDialog(gtk.Window):
def __init__(self, repos=[], pushmode=False, fromlog=False):
|
@@ -12,10 +12,10 @@
from mercurial import hg, ui, util
-from thgutil.i18n import _
-from thgutil import hglib, settings, i18n
+from tortoisehg.util.i18n import _
+from tortoisehg.util import hglib, settings, i18n
-from hggtk import dialog, gtklib
+from tortoisehg.hgtk import dialog, gtklib
keep = i18n.keepgettext()
|
Change 1 of 2
Show Entire File
tortoisehg/hgtk/taskbarui.py
Stacked
renamed from hggtk/taskbarui.py
|
||
---|---|---|
@@ -9,9 +9,9 @@ import gtk
import gobject
-from thgutil.i18n import _
-from thgutil import hglib, settings, menuthg
-from hggtk import gtklib
+from tortoisehg.util.i18n import _
+from tortoisehg.util import hglib, settings, menuthg
+from tortoisehg.hgtk import gtklib
shellcmds = '''about add clone commit datamine init log recovery
shelve synch status thgstatus userconf repoconf remove rename
@@ -207,7 +207,7 @@ return frame
def about(self, button):
- from hggtk import about
+ from tortoisehg.hgtk import about
dlg = about.AboutDialog()
dlg.show_all()
|
Change 1 of 2
Show Changes Only
tortoisehg/hgtk/thgconfig.py
Stacked
renamed from hggtk/thgconfig.py
|
||
---|---|---|
|
|
# thgconfig.py - Configuration dialog for TortoiseHg and Mercurial
#
# Copyright 2007 Steve Borho <steve@borho.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 gtk
import os
import sys
import re
import urlparse
import threading
from mercurial import hg, ui, util, url, filemerge
-from thgutil.i18n import _
-from thgutil import hglib, settings, paths
+from tortoisehg.util.i18n import _
+from tortoisehg.util import hglib, settings, paths
-from hggtk import dialog, gdialog, gtklib, hgcmd
+from tortoisehg.hgtk import dialog, gdialog, gtklib, hgcmd
_unspecstr = _('<unspecified>')
_unspeclocalstr = hglib.fromutf(_unspecstr)
_pwfields = ('http_proxy.passwd', 'smtp.password')
_tortoise_info = (
(_('Three-way Merge Tool'), 'ui.merge', [],
_('Graphical merge program for resolving merge conflicts. If left'
' unspecified, Mercurial will use the first applicable tool it finds'
' on your system or use its internal merge tool that leaves conflict'
' markers in place. Chose internal:merge to force conflict markers,'
' internal:prompt to always select local or other, or internal:dump'
' to leave files in the working directory for manual merging')),
(_('Visual Diff Command'), 'tortoisehg.vdiff', [],
_('Specify visual diff tool; must be an extdiff command')),
(_('Skip Diff Window'), 'tortoisehg.vdiffnowin', ['False', 'True'],
_("Bypass the builtin visual diff dialog and directly use your"
" visual diff tool's directory diff feature. Only enable this"
" feature if you know your diff tool has a valid extdiff"
" configuration. Default: False")),
(_('Visual Editor'), 'tortoisehg.editor', [],
_('Specify the visual editor used to view files, etc')),
(_('CLI Editor'), 'ui.editor', [],
_('The editor to use during a commit and other'
' instances where Mercurial needs multiline input from'
' the user. Only used by command line interface commands.')),
(_('Tab Width'), 'tortoisehg.tabwidth', [],
_('Specify the number of spaces that tabs expand to in various'
' TortoiseHG windows.'
' Default: Not expanded')),
(_('Max Diff Size'), 'tortoisehg.maxdiff', ['1024', '0'],
_('The maximum size file (in KB) that TortoiseHg will '
'show changes for in the changelog, status, and commit windows.'
' A value of zero implies no limit. Default: 1024 (1MB)')),
(_('Bottom Diffs'), 'gtools.diffbottom', ['False', 'True'],
_('Show the diff panel below the file list in status, shelve, and'
' commit dialogs.'
' Default: False (show diffs to right of file list)')),
(_('Capture Stderr'), 'tortoisehg.stderrcapt', ['True', 'False'],
_('Redirect stderr to a buffer which is parsed at the end of'
' the process for runtime errors. Default: True')),
(_('Fork hgtk'), 'tortoisehg.hgtkfork', ['True', 'False'],
_('When running hgtk from the command line, fork a background'
' process to run graphical dialogs. Default: True')),
(_('Full path title'), 'tortoisehg.fullpath', ['False', 'True'],
_('Show a full directory path of the repository in the dialog title'
' instead of just the root directory name. Default: False')))
_commit_info = (
(_('Username'), 'ui.username', [],
_('Name associated with commits')),
(_('Summary Line Length'), 'tortoisehg.summarylen', ['0', '70'],
_('Maximum length of the commit message summary line.'
' If set, TortoiseHG will issue a warning if the'
' summary line is too long or not separated by a'
' blank line. Default: 0 (unenforced)')),
(_('Message Line Length'), 'tortoisehg.messagewrap', ['0', '80'],
_('Word wrap length of the commit message. If'
' set, the popup menu can be used to format'
' the message and a warning will be issued'
' if any lines are too long at commit.'
' Default: 0 (unenforced)')),
(_('Push After Commit'), 'tortoisehg.pushafterci', ['False', 'True'],
_('Attempt to push to default push target after every successful'
' commit. Default: False')),
(_('Auto Commit List'), 'tortoisehg.autoinc', [],
_('Comma separated list of files that are automatically included'
' in every commit. Intended for use only as a repository setting.'
' Default: None'))
)
_log_info = (
(_('Author Coloring'), 'tortoisehg.authorcolor', ['False', 'True'],
_('Color changesets by author name. If not enabled,'
' the changes are colored green for merge, red for'
' non-trivial parents, black for normal.'
' Default: False')),
(_('Long Summary'), 'tortoisehg.longsummary', ['False', 'True'],
_('If true, concatenate multiple lines of changeset summary'
' until they reach 80 characters.'
' Default: False')),
(_('Log Batch Size'), 'tortoisehg.graphlimit', ['500'],
_('The number of revisions to read and display in the'
' changelog viewer in a single batch.'
' Default: 500')),
(_('Copy Hash'), 'tortoisehg.copyhash', ['False', 'True'],
_('Allow the changelog viewer to copy the changeset hash'
' of the currently selected changeset into the clipboard.'
' DEPRECATED. Default: False')),
(_('Dead Branches'), 'tortoisehg.deadbranch', [],
_('Comma separated list of branch names that should be ignored'
' when building a list of branch names for a repository.'
' Default: None')),
)
_paths_info = (
(_('After pull operation'), 'tortoisehg.postpull',
['none', 'update', 'fetch', 'rebase'],
_('Operation which is performed directly after a successful pull.'
' update equates to pull --update, fetch equates to the fetch'
' extension, rebase equates to pull --rebase. Default: none')),)
_web_info = (
(_('Name'), 'web.name', ['unknown'],
_('Repository name to use in the web interface.'
' Default is the working directory.')),
(_('Description'), 'web.description', ['unknown'],
_("Textual description of the repository's purpose or"
" contents.")),
(_('Contact'), 'web.contact', ['unknown'],
_('Name or email address of the person in charge of the'
' repository.')),
(_('Style'), 'web.style',
['paper', 'monoblue', 'coal', 'spartan', 'gitweb', 'old'],
_('Which template map style to use')),
(_('Archive Formats'), 'web.allow_archive', ['bz2', 'gz', 'zip'],
_('Comma separated list of archive formats allowed for'
' downloading')),
(_('Port'), 'web.port', ['8000'], _('Port to listen on')),
(_('Push Requires SSL'), 'web.push_ssl', ['True', 'False'],
_('Whether to require that inbound pushes be transported'
' over SSL to prevent password sniffing.')),
(_('Stripes'), 'web.stripes', ['1', '0'],
_('How many lines a "zebra stripe" should span in multiline output.'
' Default is 1; set to 0 to disable.')),
(_('Max Files'), 'web.maxfiles', ['10'],
_('Maximum number of files to list per changeset.')),
(_('Max Changes'), 'web.maxchanges', ['10'],
_('Maximum number of changes to list on the changelog.')),
(_('Allow Push'), 'web.allow_push', ['*'],
_('Whether to allow pushing to the repository. If empty or not'
' set, push is not allowed. If the special value "*", any remote'
' user can push, including unauthenticated users. Otherwise, the'
' remote user must have been authenticated, and the authenticated'
' user name must be present in this list (separated by whitespace'
' or ","). The contents of the allow_push list are examined after'
' the deny_push list.')),
(_('Deny Push'), 'web.deny_push', ['*'],
_('Whether to deny pushing to the repository. If empty or not set,'
' push is not denied. If the special value "*", all remote users'
' are denied push. Otherwise, unauthenticated users are all'
' denied, and any authenticated user name present in this list'
' (separated by whitespace or ",") is also denied. The contents'
' of the deny_push list are examined before the allow_push list.')),
(_('Encoding'), 'web.encoding', ['UTF-8'],
_('Character encoding name')))
_proxy_info = (
(_('Host'), 'http_proxy.host', [],
_('Host name and (optional) port of proxy server, for'
' example "myproxy:8000"')),
(_('Bypass List'), 'http_proxy.no', [],
_('Optional. Comma-separated list of host names that'
' should bypass the proxy')),
(_('User'), 'http_proxy.user', [],
_('Optional. User name to authenticate with at the'
' proxy server')),
(_('Password'), 'http_proxy.passwd', [],
_('Optional. Password to authenticate with at the'
' proxy server')))
_email_info = (
(_('From'), 'email.from', [],
_('Email address to use in the "From" header and for the SMTP envelope')),
(_('To'), 'email.to', [],
_('Comma-separated list of recipient email addresses')),
(_('Cc'), 'email.cc', [],
_('Comma-separated list of carbon copy recipient email'
' addresses')),
(_('Bcc'), 'email.bcc', [],
_('Comma-separated list of blind carbon copy recipient'
' email addresses')),
(_('method'), 'email.method', ['smtp'],
_('Optional. Method to use to send email messages. If value is "smtp" (default),'
' use SMTP (configured below). Otherwise, use as name of program to run that'
' acts like sendmail (takes "-f" option for sender, list of recipients on'
' command line, message on stdin). Normally, setting this to "sendmail" or'
' "/usr/sbin/sendmail" is enough to use sendmail to send messages.')),
(_('SMTP Host'), 'smtp.host', [], _('Host name of mail server')),
(_('SMTP Port'), 'smtp.port', ['25'],
_('Port to connect to on mail server.'
' Default: 25')),
(_('SMTP TLS'), 'smtp.tls', ['False', 'True'],
_('Connect to mail server using TLS.'
' Default: False')),
(_('SMTP Username'), 'smtp.username', [],
_('Username to authenticate to mail server with')),
(_('SMTP Password'), 'smtp.password', [],
_('Password to authenticate to mail server with')),
(_('Local Hostname'), 'smtp.local_hostname', [],
_('Hostname the sender can use to identify itself to the mail server.')))
_diff_info = (
(_('Patch EOL'), 'patch.eol', ['strict', 'crlf', 'lf'],
_('Normalize file line endings during and after patch to lf or'
' crlf. Strict does no normalization.'
' Default: strict')),
(_('Git Format'), 'diff.git', ['False', 'True'],
_('Use git extended diff header format.'
' Default: False')),
(_('No Dates'), 'diff.nodates', ['False', 'True'],
_('Do not include modification dates in diff headers.'
' Default: False')),
(_('Show Function'), 'diff.showfunc', ['False', 'True'],
_('Show which function each change is in.'
' Default: False')),
(_('Ignore White Space'), 'diff.ignorews', ['False', 'True'],
_('Ignore white space when comparing lines.'
' Default: False')),
(_('Ignore WS Amount'), 'diff.ignorewsamount', ['False', 'True'],
_('Ignore changes in the amount of white space.'
' Default: False')),
(_('Ignore Blank Lines'), 'diff.ignoreblanklines', ['False', 'True'],
_('Ignore changes whose lines are all blank.'
' Default: False')))
class PathEditDialog(gtk.Dialog):
_protocols = (('ssh', _('ssh')), ('http', _('http')),
('https', _('https')), ('local', _('local')))
def __init__(self, path, alias, list):
gtk.Dialog.__init__(self, parent=None, flags=gtk.DIALOG_MODAL,
buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
gtk.STOCK_OK, gtk.RESPONSE_OK))
gtklib.set_tortoise_keys(self)
self.connect('response', self.response)
self.connect('key-press-event', self.key_press)
self.set_title(_('Edit remote repository path'))
self.set_has_separator(False)
self.set_resizable(False)
self.newpath, self.newalias = None, None
self.list = list
self.entries = {}
# Tuple: (internal name, translated name)
for name in (('URL', _('URL')), ('Port', _('Port')),
('Folder', _('Folder')), ('Host', _('Host')),
('User', _('User')), ('Password', _('Password')),
('Alias', _('Alias'))):
entry = gtk.Entry()
entry.set_alignment(0)
label = gtk.Label(name[1])
label.set_alignment(1, 0.5)
self.entries[name[0]] = [entry, label, None]
# persistent settings
self.settings = settings.Settings('pathedit')
# configure individual widgets
self.entries['Alias'][0].set_width_chars(18)
self.entries['URL'][0].set_width_chars(60)
self.entries['Port'][0].set_width_chars(8)
self.entries['User'][0].set_width_chars(18)
self.entries['Password'][0].set_width_chars(24)
self.entries['Password'][0].set_visibility(False)
def createtable(cols=2):
newtable = gtk.Table(1, cols)
def addrow(header, cell):
row = newtable.get_property('n-rows')
newtable.set_property('n-rows', row + 1)
newtable.attach(header, 0, 1, row, row + 1, gtk.FILL, 0, 4, 2)
newtable.attach(cell, 1, 2, row, row + 1, gtk.FILL|gtk.EXPAND, 0, 4, 2)
return newtable, addrow
# table for main entries
toptable, addrow = createtable()
self.vbox.pack_start(toptable, False, False, 2)
## alias (and 'Browse...' button)
hbox = gtk.HBox()
hbox.pack_start(self.entries['Alias'][0], False, False)
hbox.pack_start(gtk.Label(''))
browse = gtk.Button(_('Browse...'))
browse.connect('clicked', self.browse_clicked)
hbox.pack_start(browse, False, False)
addrow(self.entries['Alias'][1], hbox)
## final URL
addrow(self.entries['URL'][1], self.entries['URL'][0])
self.expander = expander = gtk.Expander(_('URL Details'))
self.vbox.pack_start(expander, True, True, 2)
# table for separated entries
entrytable, addrow = createtable()
expander.add(entrytable)
## path type
typelabel = gtk.Label(_('Type'))
typelabel.set_alignment(1, 0.5)
self.protocolcombo = gtk.combo_box_new_text()
for name, label in self._protocols:
self.protocolcombo.append_text(label)
hbox = gtk.HBox()
hbox.pack_start(self.protocolcombo, False, False)
hbox.pack_start(gtk.Label(''))
addrow(typelabel, hbox)
## host & port
hbox = gtk.HBox()
hbox.pack_start(self.entries['Host'][0])
hbox.pack_start(self.entries['Port'][1], False, False, 4)
hbox.pack_start(self.entries['Port'][0], False, False)
addrow(self.entries['Host'][1], hbox)
## folder
addrow(self.entries['Folder'][1], self.entries['Folder'][0])
## username & password
hbox = gtk.HBox()
hbox.pack_start(self.entries['User'][0], False, False)
hbox.pack_start(self.entries['Password'][1], False, False, 4)
hbox.pack_start(self.entries['Password'][0], False, False)
addrow(self.entries['User'][1], hbox)
# prepare to show
self.load_settings()
self.setentries(path, alias)
self.sethandlers()
self.lastproto = None
self.update_sensitive()
self.show_all()
def protocolindex(self, pname):
for (i, (name, label)) in enumerate(self._protocols):
if name == pname:
return i
return None
def protocolname(self, plabel):
for (name, label) in self._protocols:
if label == plabel:
return name
return None
def sethandlers(self, enable=True):
# protocol combobox
if enable:
self.pcombo_hid = self.protocolcombo.connect('changed', self.changed)
else:
h = self.pcombo_hid
if h and self.protocolcombo.handler_is_connected(h):
self.protocolcombo.disconnect(h)
# other entries
for n, (e, l, h) in self.entries.iteritems():
if enable:
handler = (n == 'URL' and self.changedurl or self.changed)
self.entries[n][2] = e.connect('changed', handler)
else:
if e.handler_is_connected(h):
e.disconnect(h)
def urlparse(self, path):
m = re.match(r'^ssh://(([^@]+)@)?([^:/]+)(:(\d+))?(/(.*))?$', path)
if m:
user = m.group(2)
host = m.group(3)
port = m.group(5)
folder = m.group(7) or "."
passwd = ''
scheme = 'ssh'
elif path.startswith('http://') or path.startswith('https://'):
snpaqf = urlparse.urlparse(path)
scheme, netloc, folder, params, query, fragment = snpaqf
host, port, user, passwd = url.netlocsplit(netloc)
if folder.startswith('/'): folder = folder[1:]
else:
user, host, port, passwd = [''] * 4
folder = path
scheme = 'local'
return user, host, port, folder, passwd, scheme
def setentries(self, path, alias=None):
if alias == None:
alias = self.entries['Alias'][0].get_text()
user, host, port, folder, pw, scheme = self.urlparse(path)
self.entries['Alias'][0].set_text(alias)
if scheme == 'local':
self.entries['URL'][0].set_text(path)
else:
self.entries['URL'][0].set_text(url.hidepassword(path))
self.entries['User'][0].set_text(user or '')
self.entries['Host'][0].set_text(host or '')
self.entries['Port'][0].set_text(port or '')
self.entries['Folder'][0].set_text(folder or '')
self.entries['Password'][0].set_text(pw or '')
self.protocolcombo.set_active(self.protocolindex(scheme) or 0)
def update_sensitive(self):
proto = self.protocolname(self.protocolcombo.get_active_text())
if proto == self.lastproto:
return
self.lastproto = proto
if proto == 'local':
for n in ('User', 'Password', 'Port', 'Host'):
self.entries[n][0].set_sensitive(False)
self.entries[n][1].set_sensitive(False)
elif proto == 'ssh':
for n in ('User', 'Port', 'Host'):
self.entries[n][0].set_sensitive(True)
self.entries[n][1].set_sensitive(True)
self.entries['Password'][0].set_sensitive(False)
self.entries['Password'][1].set_sensitive(False)
else:
for n in ('User', 'Password', 'Port', 'Host'):
self.entries[n][0].set_sensitive(True)
self.entries[n][1].set_sensitive(True)
def load_settings(self):
expanded = self.settings.get_value('expanded', False, True)
self.expander.set_property('expanded', expanded)
def store_settings(self):
expanded = self.expander.get_property('expanded')
self.settings.set_value('expanded', expanded)
self.settings.write()
def browse_clicked(self, button):
if self.protocolname(self.protocolcombo.get_active_text()) == 'local':
initial = self.entries['URL'][0].get_text()
else:
initial = None
path = gtklib.NativeFolderSelectDialog(initial=initial,
title=_('Select Local Folder')).run()
if path:
self.entries['URL'][0].set_text(path)
def changed(self, combo):
newurl = self.buildurl()
self.sethandlers(False)
self.entries['URL'][0].set_text(url.hidepassword(newurl))
self.sethandlers(True)
self.update_sensitive()
def changedurl(self, combo):
self.sethandlers(False)
self.setentries(self.entries['URL'][0].get_text())
self.sethandlers(True)
self.update_sensitive()
def response(self, widget, response_id):
if response_id != gtk.RESPONSE_OK:
self.store_settings()
self.destroy()
return
aliasinput = self.entries['Alias'][0]
newalias = aliasinput.get_text()
if newalias == '':
ret = dialog.error_dialog(self, _('Alias name is empty'),
_('Please enter alias name'))
aliasinput.grab_focus()
return
if newalias in self.list:
ret = gdialog.Confirm(_('Confirm Overwrite'), [], self,
_("Overwrite existing '%s' path?") % newalias).run()
if ret != gtk.RESPONSE_YES:
return
self.newpath = self.buildurl()
self.newalias = newalias
self.store_settings()
self.destroy()
def key_press(self, widget, event):
if event.keyval in (gtk.keysyms.Return, gtk.keysyms.KP_Enter):
self.response(widget, gtk.RESPONSE_OK)
def buildurl(self):
proto = self.protocolname(self.protocolcombo.get_active_text())
host = self.entries['Host'][0].get_text()
port = self.entries['Port'][0].get_text()
folder = self.entries['Folder'][0].get_text()
user = self.entries['User'][0].get_text()
pwd = self.entries['Password'][0].get_text()
if proto == 'ssh':
ret = 'ssh://'
if user:
ret += user + '@'
ret += host
if port:
ret += ':' + port
ret += '/' + folder
elif proto == 'local':
ret = folder
else:
ret = proto + '://'
netloc = url.netlocunsplit(host, port, user, pwd)
ret += netloc + '/' + folder
return ret
class ConfigDialog(gtk.Dialog):
def __init__(self, configrepo=False):
""" Initialize the Dialog. """
gtk.Dialog.__init__(self, parent=None, flags=0,
buttons=(gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE))
gtklib.set_tortoise_keys(self)
self.ui = ui.ui()
try:
root = paths.find_root()
if root:
repo = hg.repository(self.ui, root)
name = self.get_reponame(repo)
self.ui = repo.ui
else:
repo = None
self.root = root
except hglib.RepoError:
repo = None
if configrepo:
dialog.error_dialog(self, _('No repository found'),
_('no repo at ') + root)
self.destroy()
return
try:
import iniparse
iniparse.INIConfig
self.readonly = False
except ImportError:
dialog.error_dialog(self, _('Iniparse package not found'),
_('Please install iniparse package\n'
'Settings are only shown, no changing is possible'))
print 'Please install http://code.google.com/p/iniparse/'
self.readonly = True
# Catch close events
self.connect('response', self.should_live)
self.connect('delete-event', self.delete_event)
combo = gtk.combo_box_new_text()
combo.append_text(_('User global settings'))
if repo:
combo.append_text(_('%s repository settings') % hglib.toutf(name))
combo.connect('changed', self.fileselect)
hbox = gtk.HBox()
hbox.pack_start(combo, False, False, 2)
edit = gtk.Button(_('Edit File'))
hbox.pack_start(edit, False, False, 2)
edit.connect('clicked', self.edit_clicked)
self.vbox.pack_start(hbox, False, False, 4)
# Create a new notebook, place the position of the tabs
self.notebook = notebook = gtk.Notebook()
notebook.set_tab_pos(gtk.POS_TOP)
self.vbox.pack_start(notebook, True, True)
notebook.show()
self.show_tabs = True
self.show_border = True
self._btn_apply = gtk.Button(_('Apply'))
self._btn_apply.connect('clicked', self._apply_clicked)
self.action_area.pack_end(self._btn_apply)
self.dirty = False
self.pages = []
self.tooltips = gtk.Tooltips()
self.history = settings.Settings('thgconfig')
# add spell ckeck entry if spell check is supported
tortoise_info = _tortoise_info
if gtklib.hasspellcheck():
tortoise_info += ((
_('Spell Check Language'), 'tortoisehg.spellcheck', [],
_('Default language for spell check. '
'System language is used if not specified. '
'Examples: en, en_GB, en_US')),)
# create pages for each section of configuration file
self.tortoise_frame = self.add_page(notebook, 'TortoiseHG')
self.fill_frame(self.tortoise_frame, tortoise_info)
self.commit_frame = self.add_page(notebook, _('Commit'))
self.fill_frame(self.commit_frame, _commit_info)
self.log_frame = self.add_page(notebook, _('Changelog'))
self.fill_frame(self.log_frame, _log_info)
self.paths_frame = self.add_page(notebook, _('Sync'))
vbox = self.fill_frame(self.paths_frame, _paths_info)
self.fill_path_frame(vbox)
self.web_frame = self.add_page(notebook, _('Web'))
self.fill_frame(self.web_frame, _web_info)
self.proxy_frame = self.add_page(notebook, _('Proxy'))
self.fill_frame(self.proxy_frame, _proxy_info)
self.email_frame = self.add_page(notebook, _('Email'))
self.fill_frame(self.email_frame, _email_info)
self.diff_frame = self.add_page(notebook, _('Diff'))
self.fill_frame(self.diff_frame, _diff_info)
self.configrepo = configrepo
# Force dialog into clean state in the beginning
self._btn_apply.set_sensitive(False)
self.dirty = False
combo.set_active(configrepo and 1 or 0)
def fileselect(self, combo):
'select another hgrc file'
if self.dirty:
ret = gdialog.Confirm(_('Unapplied changes'), [], self,
_('Lose changes and switch files?.')).run()
if ret != gtk.RESPONSE_YES:
return
self.configrepo = combo.get_active() and True or False
self.refresh()
def get_reponame(self, repo):
if repo.ui.config('tortoisehg', 'fullpath', False):
name = repo.root
else:
name = repo.ui.config('web', 'name') \
or os.path.basename(repo.root)
return hglib.toutf(name)
def refresh(self):
if self.configrepo:
repo = hg.repository(ui.ui(), self.root)
name = self.get_reponame(repo)
self.rcpath = [os.sep.join([repo.root, '.hg', 'hgrc'])]
self.set_title(_('TortoiseHg Configure Repository - ') + hglib.toutf(name))
gtklib.set_tortoise_icon(self, 'settings_repo.ico')
else:
self.rcpath = util.user_rcpath()
self.set_title(_('TortoiseHg Configure User-Global Settings'))
gtklib.set_tortoise_icon(self, 'settings_user.ico')
self.ini = self.load_config(self.rcpath)
self.refresh_vlist()
self.pathdata.clear()
if 'paths' in self.ini:
for name in self.ini['paths']:
path = self.ini['paths'][name]
safepath = hglib.toutf(url.hidepassword(path))
self.pathdata.append([hglib.toutf(name), safepath,
hglib.toutf(path)])
self.refresh_path_list()
self._btn_apply.set_sensitive(False)
self.dirty = False
def edit_clicked(self, button):
def doedit():
util.system("%s \"%s\"" % (editor, self.fn))
# reload configs, in case they have been written since opened
if self.configrepo:
repo = hg.repository(ui.ui(), self.root)
u = repo.ui
else:
u = ui.ui()
editor = (u.config('tortoisehg', 'editor') or
u.config('gtools', 'editor') or
os.environ.get('HGEDITOR') or
u.config('ui', 'editor') or
os.environ.get('EDITOR', 'vi'))
if os.path.basename(editor) in ('vi', 'vim', 'hgeditor'):
gdialog.Prompt(_('No visual editor configured'),
_('Please configure a visual editor.'), self).run()
self.focus_field('tortoisehg.editor')
return True
thread = threading.Thread(target=doedit, name='edit config')
thread.setDaemon(True)
thread.start()
return True
def delete_event(self, dlg, event):
return True
def should_live(self, *args):
if self.dirty and not self.readonly:
ret = gdialog.CustomPrompt(_('Confirm Exit'),
_("Exit after saving changes?"), self,
(_('&Yes'), _('&No (discard changes)'),
_('&Cancel')), default=2, esc=2).run()
if ret == 2:
if len(args) != 0:
self.emit_stop_by_name('response')
return True
elif ret == 0:
self._apply_clicked()
return False
def focus_field(self, focusfield):
'''Set page and focus to requested datum'''
for page_num, (vbox, info, widgets) in enumerate(self.pages):
for w, (label, cpath, values, tip) in enumerate(info):
if cpath == focusfield:
self.notebook.set_current_page(page_num)
widgets[w].grab_focus()
return
def new_path(self, newpath, alias='new'):
'''Add a new path to [paths], give default name, focus'''
i = self.pathdata.insert_before(None, None)
safepath = url.hidepassword(newpath)
if alias in [row[0] for row in self.pathdata]:
num = 0
while len([row for row in self.pathdata if row[0] == alias]) > 0:
num += 1
alias = 'new_%d' % num
self.pathdata.set_value(i, 0, alias)
self.pathdata.set_value(i, 1, '%s' % hglib.toutf(safepath))
self.pathdata.set_value(i, 2, '%s' % hglib.toutf(newpath))
self.pathtree.get_selection().select_iter(i)
self.pathtree.set_cursor(
self.pathdata.get_path(i),
self.pathtree.get_column(0))
self.refresh_path_list()
- # This method may be called from hggtk.sync, so ensure page is visible
+ # This method may be called from hgtk.sync, so ensure page is visible
self.notebook.set_current_page(3)
self.dirty_event()
def dirty_event(self, *args):
if not self.dirty:
self._btn_apply.set_sensitive(not self.readonly)
self.dirty = True
def _add_path(self, *args):
self.new_path('http://')
self._edit_path(new=True)
def _edit_path(self, *args, **opts):
selection = self.pathtree.get_selection()
if not selection.count_selected_rows():
return
model, path = selection.get_selected()
dialog = PathEditDialog(model[path][2], model[path][0],
[p[0] for p in self.pathdata if p[0] != model[path][0]])
dialog.set_transient_for(self)
dialog.run()
if dialog.newpath:
if model[path][0] != dialog.newalias:
# remove existing path
rows = [row for row in model if row[0] == dialog.newalias]
if len(rows) > 0:
del model[rows[0].iter]
# update path info
model[path][0] = dialog.newalias
model[path][1] = url.hidepassword(dialog.newpath)
model[path][2] = dialog.newpath
self.dirty_event()
elif opts.has_key('new') and opts['new'] == True:
del self.pathdata[path]
self.refresh_path_list()
self.dirty_event()
def _remove_path(self, *args):
selection = self.pathtree.get_selection()
if not selection.count_selected_rows():
return
model, path = selection.get_selected()
next_iter = self.pathdata.iter_next(path)
del self.pathdata[path]
if next_iter:
selection.select_iter(next_iter)
elif len(self.pathdata):
selection.select_path(len(self.pathdata) - 1)
self.refresh_path_list()
self.dirty_event()
def _test_path(self, *args):
selection = self.pathtree.get_selection()
if not selection.count_selected_rows():
return
if not self.root:
dialog.error_dialog(self, _('No Repository Found'),
_('Path testing cannot work without a repository'))
return
model, path = selection.get_selected()
testpath = hglib.fromutf(model[path][2])
if not testpath:
return
if testpath[0] == '~':
testpath = os.path.expanduser(testpath)
cmdline = ['hg', 'incoming', '--verbose', testpath]
# Do not use progressbar, as it may show plaintext passwords
dlg = hgcmd.CmdDialog(cmdline, progressbar=False)
dlg.run()
dlg.hide()
def _default_path(self, *args):
selection = self.pathtree.get_selection()
if not selection.count_selected_rows():
return
model, path = selection.get_selected()
if model[path][0] == 'default':
return
# collect rows has 'default' alias
rows = [row for row in model if row[0] == 'default']
if len(rows) > 0:
ret = gdialog.Confirm(_('Confirm Overwrite'), [], self,
_("Overwrite existing '%s' path?") % 'default').run()
if ret != gtk.RESPONSE_YES:
return
# remove old default path
default_iter = rows[0].iter
del model[default_iter]
# set 'default' alias to selected path
model[path][0] = 'default'
self.refresh_path_list()
self.dirty_event()
def _pathtree_changed(self, sel):
self.refresh_path_list()
def _pathtree_pressed(self, widget, event):
if event.button == 1 and event.type == gtk.gdk._2BUTTON_PRESS:
x, y = int(event.x), int(event.y)
pathinfo = self.pathtree.get_path_at_pos(x, y)
if pathinfo is not None:
self._edit_path()
elif event.button == 1:
selection = self.pathtree.get_selection()
selection.unselect_all()
self.refresh_path_list()
def refresh_path_list(self):
"""Update sensitivity of buttons"""
selection = self.pathtree.get_selection()
path_selected = (len(self.pathdata) > 0
and selection.count_selected_rows() > 0)
repo_available = self.root is not None
if path_selected:
model, path = selection.get_selected()
default_path = model[path][0] == 'default'
else:
default_path = False
self._editpathbutton.set_sensitive(path_selected)
self._delpathbutton.set_sensitive(path_selected)
self._testpathbutton.set_sensitive(repo_available and path_selected)
self._defaultpathbutton.set_sensitive(not default_path and path_selected)
def fill_path_frame(self, frvbox):
frame = gtk.Frame(_('Remote repository paths'))
frame.set_border_width(10)
frvbox.pack_start(frame, True, True, 2)
vbox = gtk.VBox()
vbox.set_border_width(5)
frame.add(vbox)
# Initialize data model for 'Paths' tab
self.pathdata = gtk.ListStore(str, str, str)
# Define view model for 'Paths' tab
self.pathtree = gtk.TreeView(self.pathdata)
self.pathtree.set_enable_search(False)
self.pathtree.add_events(gtk.gdk.BUTTON_PRESS_MASK)
self.pathtree.connect("cursor-changed", self._pathtree_changed)
self.pathtree.connect("button-press-event", self._pathtree_pressed)
renderer = gtk.CellRendererText()
column = gtk.TreeViewColumn(_('Alias'), renderer, text=0)
self.pathtree.append_column(column)
renderer = gtk.CellRendererText()
column = gtk.TreeViewColumn(_('Repository Path'), renderer, text=1)
self.pathtree.append_column(column)
scrolledwindow = gtk.ScrolledWindow()
scrolledwindow.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
scrolledwindow.add(self.pathtree)
vbox.add(scrolledwindow)
buttonbox = gtk.HBox()
self.addButton = gtk.Button(_('_Add'))
self.addButton.set_use_underline(True)
self.addButton.connect('clicked', self._add_path)
buttonbox.pack_start(self.addButton)
self._editpathbutton = gtk.Button(_('_Edit'))
self._editpathbutton.set_use_underline(True)
self._editpathbutton.connect('clicked', self._edit_path)
buttonbox.pack_start(self._editpathbutton)
self._delpathbutton = gtk.Button(_('_Remove'))
self._delpathbutton.set_use_underline(True)
self._delpathbutton.connect('clicked', self._remove_path)
buttonbox.pack_start(self._delpathbutton)
self._testpathbutton = gtk.Button(_('_Test'))
self._testpathbutton.set_use_underline(True)
self._testpathbutton.connect('clicked', self._test_path)
buttonbox.pack_start(self._testpathbutton)
self._defaultpathbutton = gtk.Button(_('Set as _default'))
self._defaultpathbutton.set_use_underline(True)
self._defaultpathbutton.connect('clicked', self._default_path)
buttonbox.pack_start(self._defaultpathbutton)
vbox.pack_start(buttonbox, False, False, 4)
def set_help(self, widget, event, buffer, tooltip):
text = ' '.join(tooltip.splitlines())
buffer.set_text(text)
def fill_frame(self, frame, info):
widgets = []
descframe = gtk.Frame(_('Description'))
descframe.set_border_width(4)
desctext = gtk.TextView()
desctext.set_wrap_mode(gtk.WRAP_WORD)
desctext.set_editable(False)
desctext.set_sensitive(False)
scrolledwindow = gtk.ScrolledWindow()
scrolledwindow.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
scrolledwindow.add(desctext)
scrolledwindow.set_border_width(4)
descframe.add(scrolledwindow)
vbox = gtk.VBox()
table = gtk.Table(len(info), 2, False)
vbox.pack_start(table, False, False, 2)
if info != _paths_info:
vbox.pack_start(gtk.Label(), True, True, 0)
vbox.pack_start(descframe, False, False, 2)
frame.add(vbox)
for row, (label, cpath, values, tooltip) in enumerate(info):
vlist = gtk.ListStore(str, bool)
combo = gtk.ComboBoxEntry(vlist, 0)
combo.connect('changed', self.dirty_event)
combo.child.connect('focus-in-event', self.set_help,
desctext.get_buffer(), tooltip)
combo.set_row_separator_func(lambda model, path: model[path][1])
combo.child.set_width_chars(40)
if cpath in _pwfields:
combo.child.set_visibility(False)
widgets.append(combo)
lbl = gtk.Label(label + ':')
lbl.set_alignment(1.0, 0.0)
eventbox = gtk.EventBox()
eventbox.set_visible_window(False)
eventbox.add(lbl)
table.attach(eventbox, 0, 1, row, row+1, gtk.FILL, 0, 4, 2)
table.attach(combo, 1, 2, row, row+1, gtk.FILL|gtk.EXPAND, 0, 4, 2)
self.tooltips.set_tip(eventbox, tooltip)
self.pages.append((vbox, info, widgets))
return vbox
def refresh_vlist(self):
for vbox, info, widgets in self.pages:
for row, (label, cpath, values, tooltip) in enumerate(info):
ispw = cpath in _pwfields
combo = widgets[row]
vlist = combo.get_model()
vlist.clear()
# Get currently configured value from this config file
curvalue = self.get_ini_config(cpath)
if cpath == 'tortoisehg.vdiff':
# Special case, add extdiff.cmd.* to possible values
for name, value in self.ui.configitems('extdiff'):
if name.startswith('cmd.'):
if name[4:] not in values:
values.append(name[4:])
elif not name.startswith('opts.'):
if name not in values:
values.append(name)
elif cpath == 'ui.merge':
# Special case, add [merge-tools] to possible values
hglib.mergetools(self.ui, values)
currow = None
if not ispw:
vlist.append([_unspecstr, False])
if values:
vlist.append([_('Suggested'), True])
for v in values:
vlist.append([hglib.toutf(v), False])
if v == curvalue:
currow = len(vlist) - 1
if cpath in self.history.get_keys() and not ispw:
separator = False
for v in self.history.mrul(cpath):
if v in values: continue
if not separator:
vlist.append([_('History'), True])
separator = True
vlist.append([hglib.toutf(v), False])
if v == curvalue:
currow = len(vlist) - 1
if curvalue is None and len(vlist):
combo.set_active(0)
elif currow is None and curvalue:
combo.child.set_text(hglib.toutf(curvalue))
elif currow:
combo.set_active(currow)
def add_page(self, notebook, tab):
frame = gtk.Frame()
frame.set_border_width(4)
frame.show()
label = gtk.Label(tab)
notebook.append_page(frame, label)
return frame
def get_ini_config(self, cpath):
'''Retrieve a value from the parsed config file'''
try:
# Presumes single section/key level depth
section, key = cpath.split('.', 1)
return self.ini[section][key]
except KeyError:
return None
def load_config(self, rcpath):
for fn in rcpath:
if os.path.exists(fn):
break
else:
fn = rcpath[0]
f = open(fn, 'w')
f.write(_('# Generated by tortoisehg-config\n'))
f.close()
self.fn = fn
try:
import iniparse
return iniparse.INIConfig(file(fn), optionxformvalue=None)
except ImportError:
from mercurial import config
cfg = config.config()
cfg.read(fn)
return cfg
def record_new_value(self, cpath, newvalue, keephistory=True):
# 'newvalue' is converted to local encoding
section, key = cpath.split('.', 1)
if newvalue == _unspeclocalstr or newvalue == '':
try:
del self.ini[section][key]
except KeyError:
pass
return
if section not in self.ini:
if hasattr(self.ini, '_new_namespace'):
self.ini._new_namespace(section)
else:
self.ini.new_namespace(section)
self.ini[section][key] = newvalue
if not keephistory:
return
if cpath not in self.history.get_keys():
self.history.set_value(cpath, [])
elif newvalue in self.history.get_keys():
self.history.get_value(cpath).remove(newvalue)
self.history.mrul(cpath).add(newvalue)
def _apply_clicked(self, *args):
if self.readonly:
#dialog? Read only access, please install ...
return
# Reload history, since it may have been modified externally
self.history.read()
# flush changes on paths page
if len(self.pathdata):
refreshlist = []
for row in self.pathdata:
name = hglib.fromutf(row[0])
path = hglib.fromutf(row[2])
if not name:
gdialog.Prompt(_('Invalid path'),
_('Skipped saving path with no alias'), self).run()
continue
cpath = '.'.join(['paths', name])
self.record_new_value(cpath, path, False)
refreshlist.append(name)
for name in self.ini.paths:
if name not in refreshlist:
del self.ini['paths'][name]
elif 'paths' in list(self.ini):
for name in list(self.ini.paths):
del self.ini['paths'][name]
# Flush changes on all pages
for vbox, info, widgets in self.pages:
for w, (label, cpath, values, tip) in enumerate(info):
newvalue = hglib.fromutf(widgets[w].child.get_text())
self.record_new_value(cpath, newvalue)
self.history.write()
self.refresh_vlist()
try:
f = open(self.fn, "w")
f.write(str(self.ini))
f.close()
self._btn_apply.set_sensitive(False)
self.dirty = False
except IOError, e:
dialog.error_dialog(self, _('Unable to write configuration file'),
str(e))
return 0
def run(ui, *pats, **opts):
dlg = ConfigDialog(opts.get('repomode'))
if opts.get('focus', ''):
dlg.focus_field(opts['focus'])
return dlg
|
@@ -10,10 +10,10 @@ import gobject
import pango
-from thgutil.i18n import _
-from thgutil import hglib
+from tortoisehg.util.i18n import _
+from tortoisehg.util import hglib
-from hggtk import gtklib, hgcmd
+from tortoisehg.hgtk import gtklib, hgcmd
# MQ patches row enumerations
MQ_INDEX = 0
|
Change 1 of 1
Show Entire File
tortoisehg/hgtk/thgshelve.py
Stacked
renamed from hggtk/thgshelve.py
|
||
---|---|---|
@@ -12,11 +12,11 @@
from mercurial import util
-from thgutil.i18n import _
-from thgutil import hglib
+from tortoisehg.util.i18n import _
+from tortoisehg.util import hglib, hgshelve
-from hggtk.status import GStatus, FM_STATUS, FM_CHECKED
-from hggtk import hgshelve, gdialog, gtklib
+from tortoisehg.hgtk.status import GStatus, FM_STATUS, FM_CHECKED
+from tortoisehg.hgtk import gdialog, gtklib
class GShelve(GStatus):
"""GTK+ based dialog for displaying repository status and shelving changes.
|
@@ -12,10 +12,10 @@
from mercurial import hg, ui
-from thgutil.i18n import _
-from thgutil import hglib, paths
+from tortoisehg.util.i18n import _
+from tortoisehg.util import hglib, paths
-from hggtk import hgcmd, gtklib
+from tortoisehg.hgtk import hgcmd, gtklib
_branch_tip_ = _('= Current Branch Tip =')
|
@@ -15,10 +15,10 @@
from mercurial import hg, ui, cmdutil, util
-from thgutil.i18n import _
-from thgutil import hglib, settings, paths
+from tortoisehg.util.i18n import _
+from tortoisehg.util import hglib, settings, paths
-from hggtk import gdialog, gtklib
+from tortoisehg.hgtk import gdialog, gtklib
try:
import win32con
|
@@ -22,7 +22,7 @@ _encodingmode = encoding.encodingmode
_fallbackencoding = encoding.fallbackencoding
-from thgutil.hgversion import hgversion
+from tortoisehg.util.hgversion import hgversion
def tounicode(s):
"""
|
@@ -21,8 +21,8 @@ from mercurial import cmdutil, commands, cmdutil, hg, mdiff, patch, revlog
from mercurial import util, fancyopts
-from thgutil.i18n import _
-from thgutil import hglib
+from tortoisehg.util.i18n import _
+from tortoisehg.util import hglib
lines_re = re.compile(r'@@ -(\d+),(\d+) \+(\d+),(\d+) @@\s*(.*)')
|
@@ -7,7 +7,7 @@
import gettext, sys
from gettext import gettext as _
-from thgutil import paths, hglib
+from tortoisehg.util import paths, hglib
gettext.bindtextdomain("tortoisehg", paths.get_locale_path())
gettext.textdomain("tortoisehg")
|
@@ -66,7 +66,7 @@ return _winreg.QueryValue(_winreg.HKEY_LOCAL_MACHINE,
r"Software\TortoiseHg")
except:
- return os.path.dirname(os.path.dirname(__file__))
+ return os.path.dirname(os.path.dirname(os.path.dirname(__file__)))
def netdrive_status(drive):
"""
@@ -99,7 +99,7 @@ return None
def get_prog_root():
- path = os.path.dirname(os.path.dirname(__file__))
+ path = os.path.dirname(os.path.dirname(os.path.dirname(__file__)))
return path
def netdrive_status(drive):
|
Change 1 of 1
Show Entire File
tortoisehg/util/thgstatus.py
Stacked
renamed from hggtk/thgstatus.py
|
||
---|---|---|
@@ -8,7 +8,7 @@ '''update TortoiseHg status cache'''
from mercurial import hg
-from thgutil import paths, shlib
+from tortoisehg.util import paths, shlib
import os
def cachefilepath(repo):
|
@@ -5,7 +5,7 @@ # This software may be used and distributed according to the terms of the
# GNU General Public License version 2, incorporated herein by reference.
-from thgutil.i18n import _
+from tortoisehg.util.i18n import _
def version():
try:
|
@@ -18,12 +18,12 @@ pfile = pfile[:-1]
path = os.path.dirname(os.path.dirname(os.path.realpath(pfile)))
thgpath = os.path.normpath(path)
- testpath = os.path.join(thgpath, 'thgutil')
+ testpath = os.path.join(thgpath, 'tortoisehg')
if os.path.isdir(testpath) and thgpath not in sys.path:
sys.path.insert(0, thgpath)
_thg_path()
-from thgutil.menuthg import thgcmenu
+from tortoisehg.util.menuthg import thgcmenu
regkeytmpl = u'[HKEY_CURRENT_USER\\Software\\TortoiseHg\\CMenu\\%s\\%s]'
regheaders = ( u'Windows Registry Editor Version 5.00',
|
Loading...