Show More
@@ -2092,9 +2092,50 b' class overlayworkingctx(committablectx):' | |||||
2092 | except error.ManifestLookupError: |
|
2092 | except error.ManifestLookupError: | |
2093 | return False |
|
2093 | return False | |
2094 |
|
2094 | |||
|
2095 | def _auditconflicts(self, path): | |||
|
2096 | """Replicates conflict checks done by wvfs.write(). | |||
|
2097 | ||||
|
2098 | Since we never write to the filesystem and never call `applyupdates` in | |||
|
2099 | IMM, we'll never check that a path is actually writable -- e.g., because | |||
|
2100 | it adds `a/foo`, but `a` is actually a file in the other commit. | |||
|
2101 | """ | |||
|
2102 | def fail(path, component): | |||
|
2103 | # p1() is the base and we're receiving "writes" for p2()'s | |||
|
2104 | # files. | |||
|
2105 | if 'l' in self.p1()[component].flags(): | |||
|
2106 | raise error.Abort("error: %s conflicts with symlink %s " | |||
|
2107 | "in %s." % (path, component, | |||
|
2108 | self.p1().rev())) | |||
|
2109 | else: | |||
|
2110 | raise error.Abort("error: '%s' conflicts with file '%s' in " | |||
|
2111 | "%s." % (path, component, | |||
|
2112 | self.p1().rev())) | |||
|
2113 | ||||
|
2114 | # Test that each new directory to be created to write this path from p2 | |||
|
2115 | # is not a file in p1. | |||
|
2116 | components = path.split('/') | |||
|
2117 | for i in xrange(len(components)): | |||
|
2118 | component = "/".join(components[0:i]) | |||
|
2119 | if component in self.p1(): | |||
|
2120 | fail(path, component) | |||
|
2121 | ||||
|
2122 | # Test the other direction -- that this path from p2 isn't a directory | |||
|
2123 | # in p1 (test that p1 doesn't any paths matching `path/*`). | |||
|
2124 | match = matchmod.match('/', '', [path + '/'], default=b'relpath') | |||
|
2125 | matches = self.p1().manifest().matches(match) | |||
|
2126 | if len(matches) > 0: | |||
|
2127 | if len(matches) == 1 and matches.keys()[0] == path: | |||
|
2128 | return | |||
|
2129 | raise error.Abort("error: file '%s' cannot be written because " | |||
|
2130 | " '%s/' is a folder in %s (containing %d " | |||
|
2131 | "entries: %s)" | |||
|
2132 | % (path, path, self.p1(), len(matches), | |||
|
2133 | ', '.join(matches.keys()))) | |||
|
2134 | ||||
2095 | def write(self, path, data, flags=''): |
|
2135 | def write(self, path, data, flags=''): | |
2096 | if data is None: |
|
2136 | if data is None: | |
2097 | raise error.ProgrammingError("data must be non-None") |
|
2137 | raise error.ProgrammingError("data must be non-None") | |
|
2138 | self._auditconflicts(path) | |||
2098 | self._markdirty(path, exists=True, data=data, date=util.makedate(), |
|
2139 | self._markdirty(path, exists=True, data=data, date=util.makedate(), | |
2099 | flags=flags) |
|
2140 | flags=flags) | |
2100 |
|
2141 |
General Comments 0
You need to be logged in to leave comments.
Login now