bazaar.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. from __future__ import annotations
  2. import logging
  3. from pip._internal.utils.misc import HiddenText, display_path
  4. from pip._internal.utils.subprocess import make_command
  5. from pip._internal.utils.urls import path_to_url
  6. from pip._internal.vcs.versioncontrol import (
  7. AuthInfo,
  8. RemoteNotFoundError,
  9. RevOptions,
  10. VersionControl,
  11. vcs,
  12. )
  13. logger = logging.getLogger(__name__)
  14. class Bazaar(VersionControl):
  15. name = "bzr"
  16. dirname = ".bzr"
  17. repo_name = "branch"
  18. schemes = (
  19. "bzr+http",
  20. "bzr+https",
  21. "bzr+ssh",
  22. "bzr+sftp",
  23. "bzr+ftp",
  24. "bzr+lp",
  25. "bzr+file",
  26. )
  27. @staticmethod
  28. def get_base_rev_args(rev: str) -> list[str]:
  29. return ["-r", rev]
  30. def fetch_new(
  31. self, dest: str, url: HiddenText, rev_options: RevOptions, verbosity: int
  32. ) -> None:
  33. rev_display = rev_options.to_display()
  34. logger.info(
  35. "Checking out %s%s to %s",
  36. url,
  37. rev_display,
  38. display_path(dest),
  39. )
  40. if verbosity <= 0:
  41. flags = ["--quiet"]
  42. elif verbosity == 1:
  43. flags = []
  44. else:
  45. flags = [f"-{'v'*verbosity}"]
  46. cmd_args = make_command(
  47. "checkout", "--lightweight", *flags, rev_options.to_args(), url, dest
  48. )
  49. self.run_command(cmd_args)
  50. def switch(
  51. self,
  52. dest: str,
  53. url: HiddenText,
  54. rev_options: RevOptions,
  55. verbosity: int = 0,
  56. ) -> None:
  57. self.run_command(make_command("switch", url), cwd=dest)
  58. def update(
  59. self,
  60. dest: str,
  61. url: HiddenText,
  62. rev_options: RevOptions,
  63. verbosity: int = 0,
  64. ) -> None:
  65. flags = []
  66. if verbosity <= 0:
  67. flags.append("-q")
  68. output = self.run_command(
  69. make_command("info"), show_stdout=False, stdout_only=True, cwd=dest
  70. )
  71. if output.startswith("Standalone "):
  72. # Older versions of pip used to create standalone branches.
  73. # Convert the standalone branch to a checkout by calling "bzr bind".
  74. cmd_args = make_command("bind", *flags, url)
  75. self.run_command(cmd_args, cwd=dest)
  76. cmd_args = make_command("update", *flags, rev_options.to_args())
  77. self.run_command(cmd_args, cwd=dest)
  78. @classmethod
  79. def get_url_rev_and_auth(cls, url: str) -> tuple[str, str | None, AuthInfo]:
  80. # hotfix the URL scheme after removing bzr+ from bzr+ssh:// re-add it
  81. url, rev, user_pass = super().get_url_rev_and_auth(url)
  82. if url.startswith("ssh://"):
  83. url = "bzr+" + url
  84. return url, rev, user_pass
  85. @classmethod
  86. def get_remote_url(cls, location: str) -> str:
  87. urls = cls.run_command(
  88. ["info"], show_stdout=False, stdout_only=True, cwd=location
  89. )
  90. for line in urls.splitlines():
  91. line = line.strip()
  92. for x in ("checkout of branch: ", "parent branch: "):
  93. if line.startswith(x):
  94. repo = line.split(x)[1]
  95. if cls._is_local_repository(repo):
  96. return path_to_url(repo)
  97. return repo
  98. raise RemoteNotFoundError
  99. @classmethod
  100. def get_revision(cls, location: str) -> str:
  101. revision = cls.run_command(
  102. ["revno"],
  103. show_stdout=False,
  104. stdout_only=True,
  105. cwd=location,
  106. )
  107. return revision.splitlines()[-1]
  108. @classmethod
  109. def is_commit_id_equal(cls, dest: str, name: str | None) -> bool:
  110. """Always assume the versions don't match"""
  111. return False
  112. vcs.register(Bazaar)