Show More
@@ -2092,9 +2092,50 b' class overlayworkingctx(committablectx):' | |||
|
2092 | 2092 | except error.ManifestLookupError: |
|
2093 | 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 | 2135 | def write(self, path, data, flags=''): |
|
2096 | 2136 | if data is None: |
|
2097 | 2137 | raise error.ProgrammingError("data must be non-None") |
|
2138 | self._auditconflicts(path) | |
|
2098 | 2139 | self._markdirty(path, exists=True, data=data, date=util.makedate(), |
|
2099 | 2140 | flags=flags) |
|
2100 | 2141 |
General Comments 0
You need to be logged in to leave comments.
Login now