# HG changeset patch
# User David Wilhelm <d...@jumbledpile.com>
# Date 1274799873 25200
# Node ID 898e42b5d07f240a24060ff48891b83c1ad56d41
# 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
@@ -9,8 +9,9 @@
 
 import os
 import gtk
+from sys import stderr
 
-from mercurial import util
+from mercurial import util, patch
 
 from tortoisehg.util.i18n import _
 from tortoisehg.util import hglib, hgshelve
@@ -30,6 +31,7 @@
     def init(self):
         GStatus.init(self)
         self.mode = 'shelve'
+        self.err_pos = 0
 
     def parse_opts(self):
         GStatus.parse_opts(self)
@@ -202,6 +204,13 @@
         self.chunks.clear_filechunks() # do not keep chunks
         self.reload_status()
 
+    def get_stderr_text(self):
+        '''return the most recent lines from stderr'''
+        stderr.seek(self.err_pos)
+        outstr = ''.join(stderr.readlines())
+        self.err_pos = stderr.tell()
+        return outstr
+
     def unshelve(self):
         opts = {'addremove': None, 'include': [], 'force': None,
                 'append': None, 'exclude': [], 'inspect': None}
@@ -211,8 +220,13 @@
             self.ui.quiet = False
             self.reload_status()
         except Exception, e:
-            gdialog.Prompt(_('Unshelve Error'),
-                    _('Error: %s') % e, self).run()
+            # get the file that caused the backup/patch error from stderr
+            if isinstance(e, (IOError, patch.PatchError)):
+                gdialog.Prompt(_('Unshelve Abort'),
+                               self.get_stderr_text(), self).run()
+            else:
+                gdialog.Prompt(_('Unshelve Error'),
+                        _('Error: %s') % e, self).run()
 
     def abandon(self):
         try:
@@ -245,6 +259,7 @@
         self.abandon()
         self.activate_shelve_buttons(True)
 
+
 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