def _normalize_stacked_on_url(self, branch): """Normalize and return the stacked-on location of `branch`. In the common case, `branch` will either be unstacked or stacked on a relative path, in which case this is very easy: just return the location. If `branch` is stacked on the absolute URL of another Launchpad branch, we normalize this to a relative path (mutating the branch) and return the relative path. If `branch` is stacked on some other absolute URL we don't recognise, we just return that and rely on the `branchChanged` XML-RPC method recording a complaint in the appropriate place. """ stacked_on_url = get_stacked_on_url(branch) if stacked_on_url is None: return None if "://" not in stacked_on_url: # Assume it's a relative path. return stacked_on_url uri = URI(stacked_on_url) if uri.scheme not in ["http", "bzr+ssh", "sftp"]: return stacked_on_url launchpad_domain = config.vhost.mainsite.hostname if not uri.underDomain(launchpad_domain): return stacked_on_url # We use TransportConfig directly because the branch # is still locked at this point! We're effectively # 'borrowing' the lock that is being released. branch_config = TransportConfig(branch._transport, "branch.conf") branch_config.set_option(uri.path, "stacked_on_location") return uri.path
def _normalize_stacked_on_url(self, branch): """Normalize and return the stacked-on location of `branch`. In the common case, `branch` will either be unstacked or stacked on a relative path, in which case this is very easy: just return the location. If `branch` is stacked on the absolute URL of another Launchpad branch, we normalize this to a relative path (mutating the branch) and return the relative path. If `branch` is stacked on some other absolute URL we don't recognise, we just return that and rely on the `branchChanged` XML-RPC method recording a complaint in the appropriate place. """ stacked_on_url = get_stacked_on_url(branch) if stacked_on_url is None: return None if '://' not in stacked_on_url: # Assume it's a relative path. return stacked_on_url uri = URI(stacked_on_url) if uri.scheme not in ['http', 'bzr+ssh', 'sftp']: return stacked_on_url launchpad_domain = config.vhost.mainsite.hostname if not uri.underDomain(launchpad_domain): return stacked_on_url # We use TransportConfig directly because the branch # is still locked at this point! We're effectively # 'borrowing' the lock that is being released. branch_config = TransportConfig(branch._transport, 'branch.conf') branch_config.set_option(uri.path, 'stacked_on_location') return uri.path
def set_branch_stacked_on_url(bzrdir, stacked_on_url): """Set the stacked_on_location for the branch at 'bzrdir'. We cannot use Branch.set_stacked_on, since that requires us to first open the branch. Opening the branch requires a working stacked_on_url: something we don't yet have. """ branch_transport = bzrdir.get_branch_transport(None) branch_config = TransportConfig(branch_transport, 'branch.conf') stacked_on_url = branch_config.set_option( stacked_on_url, 'stacked_on_location')
def set_branch_stacked_on_url(bzrdir, stacked_on_url): """Set the stacked_on_location for the branch at 'bzrdir'. We cannot use Branch.set_stacked_on, since that requires us to first open the branch. Opening the branch requires a working stacked_on_url: something we don't yet have. """ branch_transport = bzrdir.get_branch_transport(None) branch_config = TransportConfig(branch_transport, 'branch.conf') stacked_on_url = branch_config.set_option(stacked_on_url, 'stacked_on_location')