def mkdir(self, relpath, mode=None): # We hook into mkdir so that we can request the creation of a branch # and so that we can provide useful errors in the special case where # the user tries to make a directory like "~foo/bar". That is, a # directory that has too little information to be translated into a # Launchpad branch. deferred = AsyncVirtualTransport._getUnderlyingTransportAndPath( self, relpath) @no_traceback_failures def maybe_make_branch_in_db(failure): # Looks like we are trying to make a branch. failure.trap(NoSuchFile) return self.server.createBranch(self._abspath(relpath)) @no_traceback_failures def real_mkdir(result): transport, path = result return getattr(transport, 'mkdir')(path, mode) deferred.addCallback(real_mkdir) deferred.addErrback(maybe_make_branch_in_db) return deferred