56 try: |
57 try: |
57 return parsers.nonnormalentries(dmap) |
58 return parsers.nonnormalentries(dmap) |
58 except AttributeError: |
59 except AttributeError: |
59 return set(fname for fname, e in dmap.iteritems() |
60 return set(fname for fname, e in dmap.iteritems() |
60 if e[0] != 'n' or e[3] == -1) |
61 if e[0] != 'n' or e[3] == -1) |
61 |
|
62 def _trypending(root, vfs, filename): |
|
63 '''Open file to be read according to HG_PENDING environment variable |
|
64 |
|
65 This opens '.pending' of specified 'filename' only when HG_PENDING |
|
66 is equal to 'root'. |
|
67 |
|
68 This returns '(fp, is_pending_opened)' tuple. |
|
69 ''' |
|
70 if root == encoding.environ.get('HG_PENDING'): |
|
71 try: |
|
72 return (vfs('%s.pending' % filename), True) |
|
73 except IOError as inst: |
|
74 if inst.errno != errno.ENOENT: |
|
75 raise |
|
76 return (vfs(filename), False) |
|
77 |
62 |
78 class dirstate(object): |
63 class dirstate(object): |
79 |
64 |
80 def __init__(self, opener, ui, root, validate): |
65 def __init__(self, opener, ui, root, validate): |
81 '''Create a new dirstate object. |
66 '''Create a new dirstate object. |
383 except: # re-raises |
368 except: # re-raises |
384 f.discard() |
369 f.discard() |
385 raise |
370 raise |
386 |
371 |
387 def _opendirstatefile(self): |
372 def _opendirstatefile(self): |
388 fp, mode = _trypending(self._root, self._opener, self._filename) |
373 fp, mode = txnutil.trypending(self._root, self._opener, self._filename) |
389 if self._pendingmode is not None and self._pendingmode != mode: |
374 if self._pendingmode is not None and self._pendingmode != mode: |
390 fp.close() |
375 fp.close() |
391 raise error.Abort(_('working directory state may be ' |
376 raise error.Abort(_('working directory state may be ' |
392 'changed parallelly')) |
377 'changed parallelly')) |
393 self._pendingmode = mode |
378 self._pendingmode = mode |