hgext/fsmonitor/state.py
changeset 30548 29b35dac3b1f
parent 29205 a0939666b836
child 31225 15c998528c36
equal deleted inserted replaced
30547:c2154979409d 30548:29b35dac3b1f
    57                 return None, None, None
    57                 return None, None, None
    58 
    58 
    59             state = file.read().split('\0')
    59             state = file.read().split('\0')
    60             # state = hostname\0clock\0ignorehash\0 + list of files, each
    60             # state = hostname\0clock\0ignorehash\0 + list of files, each
    61             # followed by a \0
    61             # followed by a \0
       
    62             if len(state) < 3:
       
    63                 self._ui.log(
       
    64                     'fsmonitor', 'fsmonitor: state file truncated (expected '
       
    65                     '3 chunks, found %d), nuking state\n', len(state))
       
    66                 self.invalidate()
       
    67                 return None, None, None
    62             diskhostname = state[0]
    68             diskhostname = state[0]
    63             hostname = socket.gethostname()
    69             hostname = socket.gethostname()
    64             if diskhostname != hostname:
    70             if diskhostname != hostname:
    65                 # file got moved to a different host
    71                 # file got moved to a different host
    66                 self._ui.log('fsmonitor', 'fsmonitor: stored hostname "%s" '
    72                 self._ui.log('fsmonitor', 'fsmonitor: stored hostname "%s" '
    83         if clock is None:
    89         if clock is None:
    84             self.invalidate()
    90             self.invalidate()
    85             return
    91             return
    86 
    92 
    87         try:
    93         try:
    88             file = self._opener('fsmonitor.state', 'wb')
    94             file = self._opener('fsmonitor.state', 'wb', atomictemp=True)
    89         except (IOError, OSError):
    95         except (IOError, OSError):
    90             self._ui.warn(_("warning: unable to write out fsmonitor state\n"))
    96             self._ui.warn(_("warning: unable to write out fsmonitor state\n"))
    91             return
    97             return
    92 
    98 
    93         try:
    99         with file:
    94             file.write(struct.pack(_versionformat, _version))
   100             file.write(struct.pack(_versionformat, _version))
    95             file.write(socket.gethostname() + '\0')
   101             file.write(socket.gethostname() + '\0')
    96             file.write(clock + '\0')
   102             file.write(clock + '\0')
    97             file.write(ignorehash + '\0')
   103             file.write(ignorehash + '\0')
    98             if notefiles:
   104             if notefiles:
    99                 file.write('\0'.join(notefiles))
   105                 file.write('\0'.join(notefiles))
   100                 file.write('\0')
   106                 file.write('\0')
   101         finally:
       
   102             file.close()
       
   103 
   107 
   104     def invalidate(self):
   108     def invalidate(self):
   105         try:
   109         try:
   106             os.unlink(os.path.join(self._rootdir, '.hg', 'fsmonitor.state'))
   110             os.unlink(os.path.join(self._rootdir, '.hg', 'fsmonitor.state'))
   107         except OSError as inst:
   111         except OSError as inst: