##// END OF EJS Templates
overlayworkingctx: add _auditconflicts to write()...
Phil Cohen -
r35325:72fbdd37 default
parent child Browse files
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