Changeset b9a2f80328f0…
Parent eb184492d83c…
by
Changes to 3 files · Browse files at b9a2f80328f0 Showing diff from parent eb184492d83c Diff from another changeset...
@@ -197,6 +197,12 @@ opts['files'] = [os.path.abspath(x) for x in pats]
run(**opts)
+def shelve(ui, *pats, **opts):
+ """shelve/unshelve tool"""
+ from hggtk.thgshelve import run
+ opts['files'] = [os.path.abspath(x) for x in pats]
+ run(**opts)
+
def userconfig(ui, **opts):
"""user configuration editor"""
from hggtk.thgconfig import run
@@ -489,6 +495,7 @@ _('hgtk log [OPTIONS] [FILE]')),
"^merge": (merge, [], _('hgtk merge')),
"^recovery|rollback|verify": (recovery, [], _('hgtk recovery')),
+ "^shelve|unshelve": (shelve, [], _('hgtk shelve')),
"^synch|pull|push|incoming|outgoing|email": (synch, [], _('hgtk synch')),
"^status|st": (status, [], _('hgtk status [FILE]...')),
"^userconfig": (userconfig, [], _('hgtk userconfig')),
|
|
@@ -185,19 +185,6 @@ self._showdiff_toggled_id = self.showdiff_toggle.connect('toggled',
self._showdiff_toggled )
tbuttons.append(self.showdiff_toggle)
-
- # Shelving does not work when visualizing diffs between
- # revisions (though this could eventually be made to work)
- if not self.opts.get('rev'):
- self.shelve_btn = self.make_toolbutton(gtk.STOCK_FILE, 'Shelve',
- self._shelve_clicked, tip='set aside selected changes')
- self.unshelve_btn = self.make_toolbutton(gtk.STOCK_EDIT, 'Unshelve',
- self._unshelve_clicked, tip='restore shelved changes')
- tbuttons += [
- gtk.SeparatorToolItem(),
- self.shelve_btn,
- self.unshelve_btn,
- ]
return tbuttons
@@ -378,7 +365,6 @@ self.filetree.get_selection().set_mode(gtk.SELECTION_SINGLE)
self.filetree.get_selection().connect('changed',
self._merge_tree_selection_changed, False)
- self._activate_shelve_buttons(False)
scroller.add(self.merge_diff_text)
diff_frame.add(scroller)
@@ -925,16 +911,6 @@ def _has_shelve_file(self):
return os.path.exists(self.repo.join('shelve'))
- def _activate_shelve_buttons(self, status):
- if not hasattr(self, 'shelve_btn'):
- return
- if status:
- self.shelve_btn.set_sensitive(True)
- self.unshelve_btn.set_sensitive(self._has_shelve_file())
- else:
- self.shelve_btn.set_sensitive(False)
- self.unshelve_btn.set_sensitive(False)
-
def _showdiff_toggled(self, togglebutton, data=None):
# prevent movement events while setting position
self._diffpane.handler_block(self._diffpane_moved_id)
@@ -942,15 +918,12 @@ if togglebutton.get_active():
if hasattr(self, 'merge_diff_text'):
self._merge_tree_selection_changed(self.filetree.get_selection(), True)
- self._activate_shelve_buttons(False)
else:
- self._activate_shelve_buttons(True)
self._tree_selection_changed(self.filetree.get_selection(), True)
self._diffpane.set_position(self._setting_lastpos)
else:
self._setting_lastpos = self._diffpane.get_position()
self._diffpane.set_position(64000)
- self._activate_shelve_buttons(False)
self._diffpane.handler_unblock(self._diffpane_moved_id)
return True
@@ -967,15 +940,13 @@ if self.showdiff_toggle.get_active():
if paned.get_position() >= sizemax - 55:
self.showdiff_toggle.set_active(False)
- self._activate_shelve_buttons(self.showdiff_toggle.get_active())
elif paned.get_position() < sizemax - 55:
self.showdiff_toggle.set_active(True)
+ selection = self.filetree.get_selection()
if hasattr(self, 'merge_diff_text'):
- self._merge_tree_selection_changed(self.filetree.get_selection(), True)
- self._activate_shelve_buttons(False)
+ self._merge_tree_selection_changed(selection, True)
else:
- self._tree_selection_changed(self.filetree.get_selection(), True)
- self._activate_shelve_buttons(True)
+ self._tree_selection_changed(selection, True)
self.showdiff_toggle.handler_unblock(self._showdiff_toggled_id)
return False
@@ -1065,73 +1036,6 @@ shell_notify(wfiles)
self.reload_status()
- def _shelve_selected(self):
- # get list of hunks that have not been rejected
- hlist = [x[DM_CHUNK_ID] for x in self.diff_model if not x[DM_REJECTED]]
- if not hlist:
- Prompt('Shelve', 'Please select diff chunks to shelve',
- self).run()
- return
-
- doforce = False
- doappend = False
- if self._has_shelve_file():
- from gtklib import MessageDialog
- dialog = MessageDialog(flags=gtk.DIALOG_MODAL)
- dialog.set_title('Shelve')
- dialog.set_markup('<b>Shelve file exists!</b>')
- dialog.add_buttons('Overwrite', 1, 'Append', 2, 'Cancel', -1)
- dialog.set_transient_for(self)
- rval = dialog.run()
- dialog.destroy()
- if rval == -1:
- return
- if rval == 1:
- doforce = True
- if rval == 2:
- doappend = True
-
- # capture the selected hunks to shelve
- fc = []
- sc = []
- for n, c in enumerate(self._shelve_chunks):
- if isinstance(c, hgshelve.header):
- if len(fc) > 1 or (len(fc) == 1 and fc[0].binary()):
- sc += fc
- fc = [c]
- elif n in hlist:
- fc.append(c)
- if len(fc) > 1 or (len(fc) == 1 and fc[0].binary()):
- sc += fc
-
- def filter_patch(ui, chunks):
- return sc
-
- # shelve them!
- self.ui.interactive = True # hgshelve only works 'interactively'
- opts = {'addremove': None, 'include': [], 'force': doforce,
- 'append': doappend, 'exclude': []}
- hgshelve.filterpatch = filter_patch
- hgshelve.shelve(self.ui, self.repo, **opts)
- self.reload_status()
-
- def _unshelve(self):
- opts = {'addremove': None, 'include': [], 'force': None,
- 'append': None, 'exclude': [], 'inspect': None}
- try:
- hgshelve.unshelve(self.ui, self.repo, **opts)
- self.reload_status()
- except:
- pass
-
- def _shelve_clicked(self, toolbutton, data=None):
- self._shelve_selected()
- self._activate_shelve_buttons(True)
-
- def _unshelve_clicked(self, toolbutton, data=None):
- self._unshelve()
- self._activate_shelve_buttons(True)
-
def _remove_clicked(self, toolbutton, data=None):
remove_list = self._relevant_files('C')
delete_list = self._relevant_files('?I')
|
|
|
@@ -1,5 +1,5 @@ #
-# commit.py - commit dialog for TortoiseHg
+# thgshelve.py - commit dialog for TortoiseHg
#
# Copyright 2007 Brad Schick, brad at gmail . com
# Copyright (C) 2007 TK Soh <teekaysoh@gmail.com>
@@ -9,23 +9,20 @@import os
import pygtk
pygtk.require('2.0')
-import errno
import gtk
-import pango
-import tempfile
import cStringIO
from mercurial.i18n import _
-from mercurial.node import *
from mercurial import ui, hg
from shlib import shell_notify
from gdialog import *
from status import *
from hgcmd import CmdDialog
from hglib import fromutf
+import hgshelve
-class GCommit(GStatus):
- """GTK+ based dialog for displaying repository status and committing changes.
+class GShelve(GStatus):
+ """GTK+ based dialog for displaying repository status and shelving changes.
Also provides related operations like add, delete, remove, revert, refresh,
ignore, diff, and edit.
@@ -35,33 +32,13 @@
def init(self):
GStatus.init(self)
- self._last_commit_id = None
def parse_opts(self):
GStatus.parse_opts(self)
- # Need an entry, because extdiff code expects it
- if not self.test_opt('rev'):
- self.opts['rev'] = ''
-
- if self.test_opt('message'):
- buffer = gtk.TextBuffer()
- buffer.set_text(self.opts['message'])
- self.text.set_buffer(buffer)
-
- if self.test_opt('logfile'):
- buffer = gtk.TextBuffer()
- buffer.set_text('Comment will be read from file ' + self.opts['logfile'])
- self.text.set_buffer(buffer)
- self.text.set_sensitive(False)
-
-
def get_title(self):
root = os.path.basename(self.repo.root)
- user = self.opts.get('user')
- date = self.opts.get('date')
- pats = ' '.join(self.pats)
- return ' '.join([root, 'commit', pats, user, date])
+ return ' '.join([root, 'shelve'])
def get_icon(self):
return 'menucommit.ico'
@@ -76,14 +53,14 @@
def save_settings(self):
settings = GStatus.save_settings(self)
- settings['gcommit'] = self._vpaned.get_position()
+ settings['gshelve'] = self._vpaned.get_position()
return settings
def load_settings(self, settings):
GStatus.load_settings(self, settings)
if settings:
- self._setting_vpos = settings['gcommit']
+ self._setting_vpos = settings['gshelve']
else:
self._setting_vpos = -1
@@ -91,435 +68,139 @@ def get_tbbuttons(self):
tbbuttons = GStatus.get_tbbuttons(self)
tbbuttons.insert(2, gtk.SeparatorToolItem())
- self._undo_button = self.make_toolbutton(gtk.STOCK_UNDO, '_Undo',
- self._undo_clicked, tip='undo recent commit')
- self._commit_button = self.make_toolbutton(gtk.STOCK_OK, '_Commit',
- self._commit_clicked, tip='commit')
- tbbuttons.insert(2, self._undo_button)
- tbbuttons.insert(2, self._commit_button)
+ self.shelve_btn = self.make_toolbutton(gtk.STOCK_FILE, 'Shelve',
+ self._shelve_clicked, tip='set aside selected changes')
+ self.unshelve_btn = self.make_toolbutton(gtk.STOCK_EDIT, 'Unshelve',
+ self._unshelve_clicked, tip='restore shelved changes')
+ tbbuttons.insert(2, self.unshelve_btn)
+ tbbuttons.insert(2, self.shelve_btn)
return tbbuttons
-
- def changed_cb(self, combobox):
- model = combobox.get_model()
- index = combobox.get_active()
- if index >= 0:
- buffer = self.text.get_buffer()
- begin, end = buffer.get_bounds()
- cur_msg = buffer.get_text(begin, end)
- if len(cur_msg):
- response = Confirm('Discard Message', [], self,
- 'Discard current commit message?').run()
- if response != gtk.RESPONSE_YES:
- return
- buffer.set_text(model[index][1])
-
- def _update_recent_messages(self, msg=None):
- if msg is not None:
- self._mru_messages.add(msg)
- self.settings.write()
-
- liststore = self.msg_cbbox.get_model()
- liststore.clear()
- for msg in self._mru_messages:
- sumline = msg.split("\n")[0]
- liststore.append([sumline, msg])
- #self.msg_cbbox.set_active(-1)
-
def get_body(self):
status_body = GStatus.get_body(self)
-
- vbox = gtk.VBox()
-
- mbox = gtk.HBox()
-
- label = gtk.Label('Branch: ')
- mbox.pack_start(label, False, False, 2)
- self.branchentry = gtk.Entry()
- mbox.pack_start(self.branchentry, False, False, 2)
-
- label = gtk.Label('Recent Commit Messages: ')
- mbox.pack_start(label, False, False, 2)
- self.msg_cbbox = gtk.combo_box_new_text()
- liststore = gtk.ListStore(str, str)
- self.msg_cbbox = gtk.ComboBox(liststore)
- cell = gtk.CellRendererText()
- self.msg_cbbox.pack_start(cell, True)
- self.msg_cbbox.add_attribute(cell, 'text', 0)
- #cell = gtk.CellRendererText()
- #self.msg_cbbox.pack_start(cell, True)
- #self.msg_cbbox.add_attribute(cell, 'text', 1)
- mbox.pack_start(self.msg_cbbox)
- vbox.pack_start(mbox, False, False)
- self._mru_messages = self.settings.mrul('recent_messages')
- self._update_recent_messages()
- self.msg_cbbox.connect('changed', self.changed_cb)
-
- frame = gtk.Frame()
- frame.set_shadow_type(gtk.SHADOW_ETCHED_IN)
- scroller = gtk.ScrolledWindow()
- scroller.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
- frame.add(scroller)
- vbox.pack_start(frame)
-
- self.text = gtk.TextView()
- self.text.set_wrap_mode(gtk.WRAP_WORD)
- self.text.modify_font(pango.FontDescription(self.fontcomment))
- scroller.add(self.text)
-
+ vbox = gtk.VBox() # For named shelf collection
self._vpaned = gtk.VPaned()
self._vpaned.add1(vbox)
self._vpaned.add2(status_body)
self._vpaned.set_position(self._setting_vpos)
-
- # make ctrl-o trigger commit button
- accel_group = gtk.AccelGroup()
- self.add_accel_group(accel_group)
- self._commit_button.add_accelerator("clicked", accel_group, ord("o"),
- gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE)
+ self._activate_shelve_buttons(True)
return self._vpaned
def get_menu_info(self):
- """Returns menu info in this order: merge, addrem, unknown, clean, ignored, deleted
+ """
+ Returns menu info in this order:
+ merge, addrem, unknown, clean, ignored, deleted
"""
merge, addrem, unknown, clean, ignored, deleted, unresolved, resolved \
= GStatus.get_menu_info(self)
- return (merge + (('_commit', self._commit_file),),
- addrem + (('_commit', self._commit_file),),
- unknown + (('_commit', self._commit_file),),
+ return (merge + (('_shelve', self._shelve_file),),
+ addrem + (('_shelve', self._shelve_file),),
+ unknown + (('_shelve', self._shelve_file),),
clean,
ignored,
- deleted + (('_commit', self._commit_file),),
+ deleted + (('_shelve', self._shelve_file),),
unresolved,
resolved,
)
def should_live(self, widget=None, event=None):
- # If there are more than a few character typed into the commit
- # message, ask if the exit should continue.
- live = False
- buffer = self.text.get_buffer()
- begin, end = buffer.get_bounds()
- cur_msg = buffer.get_text(begin, end)
- if buffer.get_char_count() > 10 and cur_msg != self.qheader:
- dialog = Confirm('Exit', [], self, 'Save commit message at exit?')
- res = dialog.run()
- if res == gtk.RESPONSE_YES:
- self._update_recent_messages(cur_msg)
- elif res != gtk.RESPONSE_NO:
- live = True
- if not live and self.main:
- self._destroying(widget)
- return live
+ return False
def reload_status(self):
if not self._ready: return False
success = GStatus.reload_status(self)
- self.branchentry.set_text(self.repo.dirstate.branch())
- self._check_merge()
- self._check_patch_queue()
- self._check_undo()
return success
-
### End of overridable methods ###
- def _check_undo(self):
- can_undo = os.path.exists(self.repo.sjoin("undo")) and \
- self._last_commit_id is not None
- self._undo_button.set_sensitive(can_undo)
+ def _activate_shelve_buttons(self, status):
+ if status:
+ self.shelve_btn.set_sensitive(True)
+ self.unshelve_btn.set_sensitive(self._has_shelve_file())
+ else:
+ self.shelve_btn.set_sensitive(False)
+ self.unshelve_btn.set_sensitive(False)
+ def _shelve_selected(self):
+ # get list of hunks that have not been rejected
+ hlist = [x[DM_CHUNK_ID] for x in self.diff_model if not x[DM_REJECTED]]
+ if not hlist:
+ Prompt('Shelve', 'Please select diff chunks to shelve',
+ self).run()
+ return
- def _check_merge(self):
- # disable the checkboxes on the filelist if repo in merging state
- merged = len(self.repo.changectx(None).parents()) > 1
+ doforce = False
+ doappend = False
+ if self._has_shelve_file():
+ from gtklib import MessageDialog
+ dialog = MessageDialog(flags=gtk.DIALOG_MODAL)
+ dialog.set_title('Shelve')
+ dialog.set_markup('<b>Shelve file exists!</b>')
+ dialog.add_buttons('Overwrite', 1, 'Append', 2, 'Cancel', -1)
+ dialog.set_transient_for(self)
+ rval = dialog.run()
+ dialog.destroy()
+ if rval == -1:
+ return
+ if rval == 1:
+ doforce = True
+ if rval == 2:
+ doappend = True
+
+ # capture the selected hunks to shelve
+ fc = []
+ sc = []
+ for n, c in enumerate(self._shelve_chunks):
+ if isinstance(c, hgshelve.header):
+ if len(fc) > 1 or (len(fc) == 1 and fc[0].binary()):
+ sc += fc
+ fc = [c]
+ elif n in hlist:
+ fc.append(c)
+ if len(fc) > 1 or (len(fc) == 1 and fc[0].binary()):
+ sc += fc
+
+ def filter_patch(ui, chunks):
+ return sc
+
+ # shelve them!
+ self.ui.interactive = True # hgshelve only works 'interactively'
+ opts = {'addremove': None, 'include': [], 'force': doforce,
+ 'append': doappend, 'exclude': []}
+ hgshelve.filterpatch = filter_patch
+ hgshelve.shelve(self.ui, self.repo, **opts)
+ self.reload_status()
- self.get_toolbutton('Re_vert').set_sensitive(not merged)
- self.get_toolbutton('_Add').set_sensitive(not merged)
- self.get_toolbutton('_Remove').set_sensitive(not merged)
- self.get_toolbutton('Move').set_sensitive(not merged)
-
- if merged:
- # select all changes if repo is merged
- for entry in self.filemodel:
- if entry[FM_STATUS] in 'MARD':
- entry[FM_CHECKED] = True
- self._update_check_count()
+ def _unshelve(self):
+ opts = {'addremove': None, 'include': [], 'force': None,
+ 'append': None, 'exclude': [], 'inspect': None}
+ try:
+ hgshelve.unshelve(self.ui, self.repo, **opts)
+ self.reload_status()
+ except:
+ pass
- # pre-fill commit message
- self.text.get_buffer().set_text('merge')
+ def _shelve_clicked(self, toolbutton, data=None):
+ self._shelve_selected()
+ self._activate_shelve_buttons(True)
+ def _unshelve_clicked(self, toolbutton, data=None):
+ self._unshelve()
+ self._activate_shelve_buttons(True)
- def _check_patch_queue(self):
- '''See if an MQ patch is applied, switch to qrefresh mode'''
- self.qheader = None
- if not hasattr(self.repo, 'mq'): return
- if not self.repo.mq.applied: return
- patch = self.repo.mq.lookup('qtip')
- ph = self.repo.mq.readheaders(patch)
- title = os.path.basename(self.repo.root) + ' qrefresh ' + patch
- self.set_title(title)
- self.qheader = '\n'.join(ph.message)
- self.text.get_buffer().set_text(self.qheader)
- self.get_toolbutton('_Commit').set_label('QRefresh')
-
- def _commit_clicked(self, toolbutton, data=None):
- if not self._ready_message():
- return True
-
- if len(self.repo.changectx(None).parents()) > 1:
- # as of Mercurial 1.0, merges must be committed without
- # specifying file list.
- self._hg_commit([])
- shell_notify(self._relevant_files('MAR'))
- self.reload_status()
- else:
- commitable = 'MAR'
- addremove_list = self._relevant_files('?!')
- if len(addremove_list) and self._should_addremove(addremove_list):
- commitable += '?!'
-
- commit_list = self._relevant_files(commitable)
- if len(commit_list) > 0:
- self._commit_selected(commit_list)
- return True
- else:
- Prompt('Nothing Commited', 'No committable files selected', self).run()
+ def _shelve_file(self, stat, file):
+ self._hg_shelve([file])
return True
- def _commit_selected(self, files):
- import hgshelve
- # 1a. get list of chunks not rejected
- files = [util.pconvert(f) for f in files]
- hlist = [x[DM_CHUNK_ID] for x in self.diff_model if not x[DM_REJECTED]]
- repo, chunks, ui = self.repo, self._shelve_chunks, self.ui
-
- # 2. backup changed files, so we can restore them in the end
- backups = {}
- backupdir = repo.join('record-backups')
- try:
- os.mkdir(backupdir)
- except OSError, err:
- if err.errno != errno.EEXIST:
- Prompt('Commit', 'Unable to create ' + backupdir,
- self).run()
- return
- try:
- # backup continues
- for f in files:
- if f not in self._filechunks: continue
- if len(self._filechunks[f]) == 1: continue
- if f not in self.modified: continue
- fd, tmpname = tempfile.mkstemp(prefix=f.replace('/', '_')+'.',
- dir=backupdir)
- os.close(fd)
- ui.debug(_('backup %r as %r\n') % (f, tmpname))
- util.copyfile(repo.wjoin(f), tmpname)
- backups[f] = tmpname
-
- fp = cStringIO.StringIO()
- for n, c in enumerate(chunks):
- if c.filename() in backups and n in hlist:
- c.write(fp)
- dopatch = fp.tell()
- fp.seek(0)
-
- if backups:
- if self.qheader is not None:
- # 3a. apply filtered patch to top patch's parent
- hg.revert(repo, self._node1, backups.has_key)
- else:
- # 3a. apply filtered patch to clean repo (clean)
- hg.revert(repo, repo.dirstate.parents()[0], backups.has_key)
-
- # 3b. (apply)
- if dopatch:
- try:
- ui.debug(_('applying patch\n'))
- ui.debug(fp.getvalue())
- pfiles = {}
- patch.internalpatch(fp, ui, 1, repo.root, files=pfiles)
- patch.updatedir(ui, repo, pfiles)
- except patch.PatchError, err:
- s = str(err)
- if s:
- raise util.Abort(s)
- else:
- Prompt('Commit', 'Unable to apply patch', self).run()
- raise util.Abort(_('patch failed to apply'))
- del fp
-
- # 4. We prepared working directory according to filtered patch.
- # Now is the time to delegate the job to commit/qrefresh or the like!
-
- # it is important to first chdir to repo root -- we'll call a
- # highlevel command with list of pathnames relative to repo root
- cwd = os.getcwd()
- os.chdir(repo.root)
- try:
- self._hg_commit(files)
- finally:
- os.chdir(cwd)
-
- return 0
- finally:
- # 5. finally restore backed-up files
- try:
- for realname, tmpname in backups.iteritems():
- ui.debug(_('restoring %r to %r\n') % (tmpname, realname))
- util.copyfile(tmpname, repo.wjoin(realname))
- os.unlink(tmpname)
- os.rmdir(backupdir)
- except OSError:
- pass
- self.reload_status()
-
-
- def _commit_file(self, stat, file):
- if self._ready_message():
- if stat not in '?!' or self._should_addremove([file]):
- self._hg_commit([file])
- return True
-
-
- def _undo_clicked(self, toolbutton, data=None):
- response = Confirm('Undo commit', [], self, 'Undo last commit').run()
- if response != gtk.RESPONSE_YES:
- return
-
- tip = self._get_tip_rev(True)
- if not tip == self._last_commit_id:
- Prompt('Undo commit',
- 'Unable to undo!\n\n'
- 'Tip revision differs from last commit.',
- self).run()
- return
-
- try:
- self.repo.rollback()
- self._last_commit_id = None
- self.reload_status()
- except:
- Prompt('Undo commit', 'Errors during rollback!', self).run()
-
-
- def _should_addremove(self, files):
- if self.test_opt('addremove'):
- return True
- else:
- response = Confirm('Add/Remove', files, self).run()
- if response == gtk.RESPONSE_YES:
- # This will stay set for further commits (meaning no more prompts). Problem?
- self.opts['addremove'] = True
- return True
- return False
-
-
- def _ready_message(self):
- begin, end = self.text.get_buffer().get_bounds()
- message = self.text.get_buffer().get_text(begin, end)
- if not self.test_opt('logfile') and not message:
- Prompt('Nothing Commited', 'Please enter commit message', self).run()
- self.text.grab_focus()
- return False
- else:
- if not self.test_opt('logfile'):
- self.opts['message'] = message
- return True
-
-
- def _hg_commit(self, files):
- if not self.repo.ui.config('ui', 'username'):
- Prompt('Commit: Invalid username',
- 'Your username has not been configured.\n\n'
- 'Please configure your username and try again',
- self).run()
-
- # bring up the config dialog for user to enter their username.
- # But since we can't be sure they will do it right, we will
- # have them to retry, to re-trigger the checking mechanism.
- from thgconfig import ConfigDialog
- dlg = ConfigDialog(self.repo.root, False)
- dlg.show_all()
- dlg.focus_field('ui.username')
- dlg.run()
- dlg.hide()
- self.repo = hg.repository(ui.ui(), self.repo.root)
- self.ui = self.repo.ui
- return
-
- newbranch = fromutf(self.branchentry.get_text())
- if newbranch != self.repo.dirstate.branch():
- if newbranch in self.repo.branchtags():
- if newbranch not in [p.branch() for p in self.repo.parents()]:
- response = Confirm('Override Branch', [], self,
- 'A branch named "%s" already exists,\n'
- 'override?' % newbranch).run()
- else:
- response = gtk.RESPONSE_YES
- else:
- response = Confirm('New Branch', [], self,
- 'Create new named branch "%s"?' % newbranch).run()
- if response == gtk.RESPONSE_YES:
- self.repo.dirstate.setbranch(newbranch)
- elif response != gtk.RESPONSE_NO:
- return
-
- # call the threaded CmdDialog to do the commit, so the the large commit
- # won't get locked up by potential large commit. CmdDialog will also
- # display the progress of the commit operation.
- cmdline = ['hg', 'commit', '--verbose', '--repository', self.repo.root]
- if self.qheader is not None:
- cmdline[1] = 'qrefresh'
- if self.opts['addremove']:
- cmdline += ['--addremove']
- cmdline += ['--message', fromutf(self.opts['message'])]
- cmdline += [self.repo.wjoin(x) for x in files]
- dialog = CmdDialog(cmdline, True)
- dialog.set_transient_for(self)
- dialog.run()
- dialog.hide()
-
- # refresh overlay icons and commit dialog
- if dialog.return_code() == 0:
- shell_notify([self.cwd] + files)
- if self.qheader is None:
- self.text.set_buffer(gtk.TextBuffer())
- self._update_recent_messages(self.opts['message'])
- self._last_commit_id = self._get_tip_rev(True)
-
- def _get_tip_rev(self, refresh=False):
- if refresh:
- self.repo.invalidate()
- cl = self.repo.changelog
- tip = cl.node(nullrev + len(cl))
- return hex(tip)
def launch(root='', files=[], cwd='', main=True):
u = ui.ui()
u.updateopts(debug=False, traceback=False)
repo = hg.repository(u, path=root)
- # move cwd to repo root if repo is merged, so we can show
- # all the changed files
- if len(repo.changectx(None).parents()) > 1 and repo.root != cwd:
- cwd = repo.root
- repo = hg.repository(u, path=cwd)
- files = [cwd]
-
- ct = repo.ui.config('tortoisehg', 'commit', 'internal')
- if ct not in ['', 'internal']:
- from hglib import thgdispatch
- args = ['--repository', root, ct]
- try:
- ret = thgdispatch(repo.ui, args=args)
- except SystemExit:
- pass
- return None
-
cmdoptions = {
'user':'', 'date':'',
'modified':True, 'added':True, 'removed':True, 'deleted':True,
@@ -528,7 +209,7 @@ 'check': True, 'git':False, 'logfile':'', 'addremove':False,
}
- dialog = GCommit(u, repo, cwd, files, cmdoptions, main)
+ dialog = GShelve(u, repo, cwd, files, cmdoptions, main)
dialog.display()
return dialog
|
Loading...