# HG changeset patch
# User David Wilhelm <d...@jumbledpile.com>
# Date 1274950836 25200
# Node ID e9b3f33388e8a8565fb53b431fa526c36d274987
# Parent  35821e37c0250337207875b391f8281b1917c87e
shelve: show unshelve errors

diff --git a/tortoisehg/hgtk/thgshelve.py b/tortoisehg/hgtk/thgshelve.py
--- a/tortoisehg/hgtk/thgshelve.py
+++ b/tortoisehg/hgtk/thgshelve.py
@@ -10,7 +10,7 @@
 import os
 import gtk
 
-from mercurial import util
+from mercurial import util, patch, ui
 
 from tortoisehg.util.i18n import _
 from tortoisehg.util import hglib, hgshelve
@@ -30,6 +30,7 @@
     def init(self):
         GStatus.init(self)
         self.mode = 'shelve'
+        self.ui = ErrBufUI(self.ui)
 
     def parse_opts(self):
         GStatus.parse_opts(self)
@@ -206,13 +207,17 @@
         opts = {'addremove': None, 'include': [], 'force': None,
                 'append': None, 'exclude': [], 'inspect': None}
         try:
+            self.ui.errorq = []
             self.ui.quiet = True
             hgshelve.unshelve(self.ui, self.repo, **opts)
             self.ui.quiet = False
             self.reload_status()
+        except (util.Abort, IOError, patch.PatchError), e:
+            gdialog.Prompt(_('Unshelve Abort'),
+                           ''.join(self.ui.errorq), self).run()
         except Exception, e:
             gdialog.Prompt(_('Unshelve Error'),
-                    _('Error: %s') % e, self).run()
+                           _('Error: %s') % e, self).run()
 
     def abandon(self):
         try:
@@ -245,6 +250,22 @@
         self.abandon()
         self.activate_shelve_buttons(True)
 
+
+class ErrBufUI(ui.ui):
+    """ui subclass to save hg and thg errors"""
+
+    def __init__(self, src=None, errorq=[]):
+        ui.ui.__init__(self, src)
+        if src and hasattr(src, 'errorq'):
+            self.errorq = src.errorq
+        else:
+            self.errorq = errorq
+
+    def warn(self, *msg, **opts):
+        self.errorq.extend(msg)
+        ui.ui.warn(self, *msg, **opts)
+
+
 def run(_ui, *pats, **opts):
     cmdoptions = {
         'user':opts.get('user', ''), 'date':opts.get('date', ''),
diff --git a/tortoisehg/util/hgshelve.py b/tortoisehg/util/hgshelve.py
--- a/tortoisehg/util/hgshelve.py
+++ b/tortoisehg/util/hgshelve.py
@@ -411,7 +411,11 @@
                                        dir=dir)
         os.close(fd)
         ui.debug(_('backup %r as %r\n') % (f, tmpname))
-        util.copyfile(repo.wjoin(f), tmpname)
+        try:
+            util.copyfile(repo.wjoin(f), tmpname)
+        except:
+            ui.warn(_('file copy of %s failed\n') % f)
+            raise
         backups[f] = tmpname
 
     return backups
@@ -556,6 +560,9 @@
     try:
         fp = cStringIO.StringIO()
         fp.write(repo.opener('shelve').read())
+    except:
+        ui.warn(_('nothing to unshelve\n'))
+    else:
         if opts['inspect']:
             ui.status(fp.getvalue())
         else:
@@ -565,7 +572,11 @@
                 if isinstance(chunk, header):
                     files += chunk.files()
             backupdir = repo.join('shelve-backups')
-            backups = makebackup(ui, repo, backupdir, set(files))
+            try:
+                backups = makebackup(ui, repo, backupdir, set(files))
+            except:
+                ui.warn(_('unshelve backup aborted\n'))
+                raise
 
             ui.debug(_('applying shelved patch\n'))
             patchdone = 0
@@ -596,8 +607,8 @@
                 ui.debug(_('removing shelved patches\n'))
                 os.unlink(repo.join('shelve'))
                 ui.status(_('unshelve completed\n'))
-    except IOError:
-        ui.warn(_('nothing to unshelve\n'))
+            else:
+                raise patch.PatchError
 
 
 def abandon(ui, repo):

------------------------------------------------------------------------------

_______________________________________________
Tortoisehg-develop mailing list
Tortoisehg-develop@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tortoisehg-develop

Reply via email to