Show More
@@ -9,10 +9,8 b' import errno' | |||||
9 | from node import nullid |
|
9 | from node import nullid | |
10 | from i18n import _ |
|
10 | from i18n import _ | |
11 | import scmutil, util, ignore, osutil, parsers, encoding |
|
11 | import scmutil, util, ignore, osutil, parsers, encoding | |
12 |
import |
|
12 | import os, stat, errno | |
13 | import cStringIO |
|
|||
14 |
|
13 | |||
15 | _format = ">cllll" |
|
|||
16 | propertycache = util.propertycache |
|
14 | propertycache = util.propertycache | |
17 | filecache = scmutil.filecache |
|
15 | filecache = scmutil.filecache | |
18 | _rangemask = 0x7fffffff |
|
16 | _rangemask = 0x7fffffff | |
@@ -508,38 +506,7 b' class dirstate(object):' | |||||
508 | # use the modification time of the newly created temporary file as the |
|
506 | # use the modification time of the newly created temporary file as the | |
509 | # filesystem's notion of 'now' |
|
507 | # filesystem's notion of 'now' | |
510 | now = util.fstat(st).st_mtime |
|
508 | now = util.fstat(st).st_mtime | |
511 | copymap = self._copymap |
|
509 | finish(parsers.pack_dirstate(self._map, self._copymap, self._pl, now)) | |
512 | try: |
|
|||
513 | finish(parsers.pack_dirstate(self._map, copymap, self._pl, now)) |
|
|||
514 | return |
|
|||
515 | except AttributeError: |
|
|||
516 | pass |
|
|||
517 |
|
||||
518 | now = int(now) |
|
|||
519 | cs = cStringIO.StringIO() |
|
|||
520 | pack = struct.pack |
|
|||
521 | write = cs.write |
|
|||
522 | write("".join(self._pl)) |
|
|||
523 | for f, e in self._map.iteritems(): |
|
|||
524 | if e[0] == 'n' and e[3] == now: |
|
|||
525 | # The file was last modified "simultaneously" with the current |
|
|||
526 | # write to dirstate (i.e. within the same second for file- |
|
|||
527 | # systems with a granularity of 1 sec). This commonly happens |
|
|||
528 | # for at least a couple of files on 'update'. |
|
|||
529 | # The user could change the file without changing its size |
|
|||
530 | # within the same second. Invalidate the file's stat data in |
|
|||
531 | # dirstate, forcing future 'status' calls to compare the |
|
|||
532 | # contents of the file. This prevents mistakenly treating such |
|
|||
533 | # files as clean. |
|
|||
534 | e = (e[0], 0, -1, -1) # mark entry as 'unset' |
|
|||
535 | self._map[f] = e |
|
|||
536 |
|
||||
537 | if f in copymap: |
|
|||
538 | f = "%s\0%s" % (f, copymap[f]) |
|
|||
539 | e = pack(_format, e[0], e[1], e[2], e[3], len(f)) |
|
|||
540 | write(e) |
|
|||
541 | write(f) |
|
|||
542 | finish(cs.getvalue()) |
|
|||
543 |
|
510 | |||
544 | def _dirignore(self, f): |
|
511 | def _dirignore(self, f): | |
545 | if f == '.': |
|
512 | if f == '.': |
@@ -326,7 +326,8 b' static PyObject *pack_dirstate(PyObject ' | |||||
326 | if (getintat(v, 3, &mtime) == -1) |
|
326 | if (getintat(v, 3, &mtime) == -1) | |
327 | goto bail; |
|
327 | goto bail; | |
328 | if (*s == 'n' && mtime == (uint32_t)now) { |
|
328 | if (*s == 'n' && mtime == (uint32_t)now) { | |
329 |
/* See |
|
329 | /* See pure/parsers.py:pack_dirstate for why we do | |
|
330 | * this. */ | |||
330 | if (PyDict_SetItem(map, k, dirstate_unset) == -1) |
|
331 | if (PyDict_SetItem(map, k, dirstate_unset) == -1) | |
331 | goto bail; |
|
332 | goto bail; | |
332 | mode = 0, size = -1, mtime = -1; |
|
333 | mode = 0, size = -1, mtime = -1; |
@@ -7,7 +7,7 b'' | |||||
7 |
|
7 | |||
8 | from mercurial.node import bin, nullid |
|
8 | from mercurial.node import bin, nullid | |
9 | from mercurial import util |
|
9 | from mercurial import util | |
10 | import struct, zlib |
|
10 | import struct, zlib, cStringIO | |
11 |
|
11 | |||
12 | _pack = struct.pack |
|
12 | _pack = struct.pack | |
13 | _unpack = struct.unpack |
|
13 | _unpack = struct.unpack | |
@@ -87,3 +87,29 b' def parse_dirstate(dmap, copymap, st):' | |||||
87 | copymap[f] = c |
|
87 | copymap[f] = c | |
88 | dmap[f] = e[:4] |
|
88 | dmap[f] = e[:4] | |
89 | return parents |
|
89 | return parents | |
|
90 | ||||
|
91 | def pack_dirstate(dmap, copymap, pl, now): | |||
|
92 | now = int(now) | |||
|
93 | cs = cStringIO.StringIO() | |||
|
94 | write = cs.write | |||
|
95 | write("".join(pl)) | |||
|
96 | for f, e in dmap.iteritems(): | |||
|
97 | if e[0] == 'n' and e[3] == now: | |||
|
98 | # The file was last modified "simultaneously" with the current | |||
|
99 | # write to dirstate (i.e. within the same second for file- | |||
|
100 | # systems with a granularity of 1 sec). This commonly happens | |||
|
101 | # for at least a couple of files on 'update'. | |||
|
102 | # The user could change the file without changing its size | |||
|
103 | # within the same second. Invalidate the file's stat data in | |||
|
104 | # dirstate, forcing future 'status' calls to compare the | |||
|
105 | # contents of the file. This prevents mistakenly treating such | |||
|
106 | # files as clean. | |||
|
107 | e = (e[0], 0, -1, -1) # mark entry as 'unset' | |||
|
108 | dmap[f] = e | |||
|
109 | ||||
|
110 | if f in copymap: | |||
|
111 | f = "%s\0%s" % (f, copymap[f]) | |||
|
112 | e = _pack(">cllll", e[0], e[1], e[2], e[3], len(f)) | |||
|
113 | write(e) | |||
|
114 | write(f) | |||
|
115 | return cs.getvalue() |
General Comments 0
You need to be logged in to leave comments.
Login now