You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			113 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Python
		
	
			
		
		
	
	
			113 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Python
		
	
import logging
 | 
						|
from typing import List, Optional, Tuple
 | 
						|
 | 
						|
from pip._internal.utils.misc import HiddenText, display_path
 | 
						|
from pip._internal.utils.subprocess import make_command
 | 
						|
from pip._internal.utils.urls import path_to_url
 | 
						|
from pip._internal.vcs.versioncontrol import (
 | 
						|
    AuthInfo,
 | 
						|
    RemoteNotFoundError,
 | 
						|
    RevOptions,
 | 
						|
    VersionControl,
 | 
						|
    vcs,
 | 
						|
)
 | 
						|
 | 
						|
logger = logging.getLogger(__name__)
 | 
						|
 | 
						|
 | 
						|
class Bazaar(VersionControl):
 | 
						|
    name = "bzr"
 | 
						|
    dirname = ".bzr"
 | 
						|
    repo_name = "branch"
 | 
						|
    schemes = (
 | 
						|
        "bzr+http",
 | 
						|
        "bzr+https",
 | 
						|
        "bzr+ssh",
 | 
						|
        "bzr+sftp",
 | 
						|
        "bzr+ftp",
 | 
						|
        "bzr+lp",
 | 
						|
        "bzr+file",
 | 
						|
    )
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def get_base_rev_args(rev: str) -> List[str]:
 | 
						|
        return ["-r", rev]
 | 
						|
 | 
						|
    def fetch_new(
 | 
						|
        self, dest: str, url: HiddenText, rev_options: RevOptions, verbosity: int
 | 
						|
    ) -> None:
 | 
						|
        rev_display = rev_options.to_display()
 | 
						|
        logger.info(
 | 
						|
            "Checking out %s%s to %s",
 | 
						|
            url,
 | 
						|
            rev_display,
 | 
						|
            display_path(dest),
 | 
						|
        )
 | 
						|
        if verbosity <= 0:
 | 
						|
            flag = "--quiet"
 | 
						|
        elif verbosity == 1:
 | 
						|
            flag = ""
 | 
						|
        else:
 | 
						|
            flag = f"-{'v'*verbosity}"
 | 
						|
        cmd_args = make_command(
 | 
						|
            "checkout", "--lightweight", flag, rev_options.to_args(), url, dest
 | 
						|
        )
 | 
						|
        self.run_command(cmd_args)
 | 
						|
 | 
						|
    def switch(self, dest: str, url: HiddenText, rev_options: RevOptions) -> None:
 | 
						|
        self.run_command(make_command("switch", url), cwd=dest)
 | 
						|
 | 
						|
    def update(self, dest: str, url: HiddenText, rev_options: RevOptions) -> None:
 | 
						|
        output = self.run_command(
 | 
						|
            make_command("info"), show_stdout=False, stdout_only=True, cwd=dest
 | 
						|
        )
 | 
						|
        if output.startswith("Standalone "):
 | 
						|
            # Older versions of pip used to create standalone branches.
 | 
						|
            # Convert the standalone branch to a checkout by calling "bzr bind".
 | 
						|
            cmd_args = make_command("bind", "-q", url)
 | 
						|
            self.run_command(cmd_args, cwd=dest)
 | 
						|
 | 
						|
        cmd_args = make_command("update", "-q", rev_options.to_args())
 | 
						|
        self.run_command(cmd_args, cwd=dest)
 | 
						|
 | 
						|
    @classmethod
 | 
						|
    def get_url_rev_and_auth(cls, url: str) -> Tuple[str, Optional[str], AuthInfo]:
 | 
						|
        # hotfix the URL scheme after removing bzr+ from bzr+ssh:// re-add it
 | 
						|
        url, rev, user_pass = super().get_url_rev_and_auth(url)
 | 
						|
        if url.startswith("ssh://"):
 | 
						|
            url = "bzr+" + url
 | 
						|
        return url, rev, user_pass
 | 
						|
 | 
						|
    @classmethod
 | 
						|
    def get_remote_url(cls, location: str) -> str:
 | 
						|
        urls = cls.run_command(
 | 
						|
            ["info"], show_stdout=False, stdout_only=True, cwd=location
 | 
						|
        )
 | 
						|
        for line in urls.splitlines():
 | 
						|
            line = line.strip()
 | 
						|
            for x in ("checkout of branch: ", "parent branch: "):
 | 
						|
                if line.startswith(x):
 | 
						|
                    repo = line.split(x)[1]
 | 
						|
                    if cls._is_local_repository(repo):
 | 
						|
                        return path_to_url(repo)
 | 
						|
                    return repo
 | 
						|
        raise RemoteNotFoundError
 | 
						|
 | 
						|
    @classmethod
 | 
						|
    def get_revision(cls, location: str) -> str:
 | 
						|
        revision = cls.run_command(
 | 
						|
            ["revno"],
 | 
						|
            show_stdout=False,
 | 
						|
            stdout_only=True,
 | 
						|
            cwd=location,
 | 
						|
        )
 | 
						|
        return revision.splitlines()[-1]
 | 
						|
 | 
						|
    @classmethod
 | 
						|
    def is_commit_id_equal(cls, dest: str, name: Optional[str]) -> bool:
 | 
						|
        """Always assume the versions don't match"""
 | 
						|
        return False
 | 
						|
 | 
						|
 | 
						|
vcs.register(Bazaar)
 |