mercurial/crecord.py
changeset 38047 dabc2237963c
parent 37084 f0b6fbea00cf
child 38082 1978abdb216c
equal deleted inserted replaced
38046:ee7b6fa52d9d 38047:dabc2237963c
    62         curses.error
    62         curses.error
    63     except ImportError:
    63     except ImportError:
    64         # wcurses is not shipped on Windows by default, or python is not
    64         # wcurses is not shipped on Windows by default, or python is not
    65         # compiled with curses
    65         # compiled with curses
    66         curses = False
    66         curses = False
       
    67 
       
    68 class fallbackerror(error.Abort):
       
    69     """Error that indicates the client should try to fallback to text mode."""
       
    70     # Inherits from error.Abort so that existing behavior is preserved if the
       
    71     # calling code does not know how to fallback.
    67 
    72 
    68 def checkcurses(ui):
    73 def checkcurses(ui):
    69     """Return True if the user wants to use curses
    74     """Return True if the user wants to use curses
    70 
    75 
    71     This method returns True if curses is found (and that python is built with
    76     This method returns True if curses is found (and that python is built with
   527     origsigtstp = sentinel = object()
   532     origsigtstp = sentinel = object()
   528     if util.safehasattr(signal, 'SIGTSTP'):
   533     if util.safehasattr(signal, 'SIGTSTP'):
   529         origsigtstp = signal.getsignal(signal.SIGTSTP)
   534         origsigtstp = signal.getsignal(signal.SIGTSTP)
   530     try:
   535     try:
   531         curses.wrapper(chunkselector.main)
   536         curses.wrapper(chunkselector.main)
   532         if chunkselector.initerr is not None:
   537         if chunkselector.initexc is not None:
   533             raise error.Abort(chunkselector.initerr)
   538             raise chunkselector.initexc
   534         # ncurses does not restore signal handler for SIGTSTP
   539         # ncurses does not restore signal handler for SIGTSTP
   535     finally:
   540     finally:
   536         if origsigtstp is not sentinel:
   541         if origsigtstp is not sentinel:
   537             signal.signal(signal.SIGTSTP, origsigtstp)
   542             signal.signal(signal.SIGTSTP, origsigtstp)
   538     return chunkselector.opts
   543     return chunkselector.opts
  1716 
  1721 
  1717     def _main(self, stdscr):
  1722     def _main(self, stdscr):
  1718         self.stdscr = stdscr
  1723         self.stdscr = stdscr
  1719         # error during initialization, cannot be printed in the curses
  1724         # error during initialization, cannot be printed in the curses
  1720         # interface, it should be printed by the calling code
  1725         # interface, it should be printed by the calling code
  1721         self.initerr = None
  1726         self.initexc = None
  1722         self.yscreensize, self.xscreensize = self.stdscr.getmaxyx()
  1727         self.yscreensize, self.xscreensize = self.stdscr.getmaxyx()
  1723 
  1728 
  1724         curses.start_color()
  1729         curses.start_color()
  1725         try:
  1730         try:
  1726             curses.use_default_colors()
  1731             curses.use_default_colors()
  1749         self.numpadlines = self.getnumlinesdisplayed(ignorefolding=True) + 1
  1754         self.numpadlines = self.getnumlinesdisplayed(ignorefolding=True) + 1
  1750 
  1755 
  1751         try:
  1756         try:
  1752             self.chunkpad = curses.newpad(self.numpadlines, self.xscreensize)
  1757             self.chunkpad = curses.newpad(self.numpadlines, self.xscreensize)
  1753         except curses.error:
  1758         except curses.error:
  1754             self.initerr = _('this diff is too large to be displayed')
  1759             self.initexc = fallbackerror(
       
  1760                 _('this diff is too large to be displayed'))
  1755             return
  1761             return
  1756         # initialize selecteditemendline (initial start-line is 0)
  1762         # initialize selecteditemendline (initial start-line is 0)
  1757         self.selecteditemendline = self.getnumlinesdisplayed(
  1763         self.selecteditemendline = self.getnumlinesdisplayed(
  1758             self.currentselecteditem, recursechildren=False)
  1764             self.currentselecteditem, recursechildren=False)
  1759 
  1765