repo v2.39-cr1
Merge commits up to v2.39
    * tag 'v2.39':
      sync: PersistentTransport call parent init
      sync: TeeStringIO write should return int
      sync: Fix tracking of broken links
      project: Speculative fix for project corruption
      cleanup: convert exceptions to OSError
      cleanup: delete redundant "r" open mode
      cleanup: use new dict & set generator styles
      manifest_xml: Fix empty project list when DOCTYPE is present
      cleanup: leverage yield from in more places
      git_config: GetBoolean should return bool
      project: using --depth results in error when including submanifests
      repo: drop Python 2 compat logic
      delete Python 2 (object) compat
      tests: Set HOME to a temporary directory when running tests.
      tests: added python 3.12
      github: add python 3.11 to test-ci.yml
      github: pin ubuntu to 20.04 to make py36 work
      python-support: update with current status & guidelines
      hooks: drop support for Python 2
      main: drop Python 2 check
      Update logger.warn to logger.warning
      git_command: read1 needs a size in py3.6
      git_command: lru_cache needs maxsize for py36 & 37
      sync: Fix print statement in _PostRepoFetch
      git_command: Augment underlying git errors with suggestions
      project: Invoke realpath on dotgit for symmetry with gitdir to ensure a short relpath.
      Reset info logs back to print in sync
      Track expected git errors in logs
      tests: Fix tox error in py36 use virtualenv<20.22.0
      Use non-deprecated API for obtaining UTC time
      main: Use repo logger
      project: Use repo logger
      subcmds: Use repo logger
      github: add PR closer
      tests: test_subcmds_sync.py: fix for py3.6 & 3.7
      tests: test_git_superproject.py: fix py3.6 & 3.7
      start: Use repo logger
      project: Use IsId instead of ID_RE.match
      project: Optimise GetCommitRevisionId when revisionId is set
      manifest_xml: use a set instead of (sorted) list in projectsDiff
      Log ErrorEvent for failing GitCommands
      logging: Use log.formatter for coloring logs
      sync: Preserve errors on KeyboardInterrupt
      fix black formatting of standalone programs
      sync: Use repo logger within sync
      project: Preserve stderr on upload
      tox.ini: add isort as dependency
      isort: format codebase
      tweak stdlib imports to follow Google style guide
      upload: Suggest full sync if hooks fail with partially synced tree
      sync: Ignore repo project when checking partial syncs
      upload: fix error handling
      docs: Document .repo_localsyncstate.json
      gitc: drop support
      tox: enable python 3.11 testing
      flake8: exclude venv and .tox folder
      Raise RepoExitError in place of sys.exit
      sync: Warn if partial sync state is detected
      main: Pass path to python binary as arg0 when restarting repo
      Raise repo exit errors in place of sys.exit
      Prefix error events with RepoErrorEvent:
      Refactor errors for sync command
      Update errors to extend BaseRepoError
      [repo logging] Add logging module
      sync: Track last completed fetch/checkout

There are also additional changes to resolve the following merge
conflicts.
- subcmds/sync.py due to changes from
https://gerrit-review.git.corp.google.com/c/git-repo/+/384974
- project.py due to changes from
https://gerrit-review.git.corp.google.com/c/git-repo/+/383715
tree: 91aea08567b37a953c876606e47ce8019333c2ae
  1. .github/
  2. docs/
  3. hooks/
  4. man/
  5. release/
  6. subcmds/
  7. tests/
  8. .flake8
  9. .gitattributes
  10. .gitignore
  11. .gitreview
  12. .isort.cfg
  13. .mailmap
  14. .project
  15. .pydevproject
  16. color.py
  17. command.py
  18. completion.bash
  19. editor.py
  20. error.py
  21. event_log.py
  22. fetch.py
  23. git_command.py
  24. git_config.py
  25. git_refs.py
  26. git_ssh
  27. git_superproject.py
  28. git_trace2_event_log.py
  29. git_trace2_event_log_base.py
  30. hooks.py
  31. LICENSE
  32. main.py
  33. MANIFEST.in
  34. manifest_xml.py
  35. pager.py
  36. platform_utils.py
  37. platform_utils_win32.py
  38. progress.py
  39. project.py
  40. pyproject.toml
  41. README.md
  42. repo
  43. repo_logging.py
  44. repo_trace.py
  45. requirements.json
  46. run_tests
  47. run_tests.vpython3
  48. setup.py
  49. ssh.py
  50. SUBMITTING_PATCHES.md
  51. tox.ini
  52. wrapper.py
README.md

repo

Repo is a tool built on top of Git. Repo helps manage many Git repositories, does the uploads to revision control systems, and automates parts of the development workflow. Repo is not meant to replace Git, only to make it easier to work with Git. The repo command is an executable Python script that you can put anywhere in your path.

Contact

Please use the repo-discuss mailing list or issue tracker for questions.

You can file a new bug report under the “repo” component.

Please do not e-mail individual developers for support. They do not have the bandwidth for it, and often times questions have already been asked on repo-discuss or bugs posted to the issue tracker. So please search those sites first.

Install

Many distros include repo, so you might be able to install from there.

# Debian/Ubuntu.
$ sudo apt-get install repo

# Gentoo.
$ sudo emerge dev-vcs/repo

You can install it manually as well as it's a single script.

$ mkdir -p ~/.bin
$ PATH="${HOME}/.bin:${PATH}"
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/.bin/repo
$ chmod a+rx ~/.bin/repo