Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package git-repo for openSUSE:Factory 
checked in at 2022-02-11 23:10:14
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/git-repo (Old)
 and      /work/SRC/openSUSE:Factory/.git-repo.new.1956 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "git-repo"

Fri Feb 11 23:10:14 2022 rev:2 rq:953738 version:2.21

Changes:
--------
--- /work/SRC/openSUSE:Factory/git-repo/git-repo.changes        2022-01-11 
21:24:19.073171876 +0100
+++ /work/SRC/openSUSE:Factory/.git-repo.new.1956/git-repo.changes      
2022-02-11 23:12:14.899438609 +0100
@@ -1,0 +2,14 @@
+Fri Feb 04 11:15:47 UTC 2022 - [email protected]
+
+- remove obsolete patch fix-python-readlink.patch
+- Update to version 2.21:
+  * project: mark gc.log as safe to discard when migrating .git/
+  * init: add an option --enable-git-lfs-filter
+  * init: make bad --repo-rev settings more clear
+  * project: Ignore failure to remove the sample hooks
+  * branches: Fix "not in" handling
+  * project: store objects in project-objects directly
+  * project: move --reference handling to project-objects
+  * test_project: use os.readlink instead of Path.readlink
+
+-------------------------------------------------------------------

Old:
----
  fix-python-readlink.patch
  git-repo-2.20.obscpio
  git-repo-2.20.tar.xz

New:
----
  git-repo-2.21.obscpio
  git-repo-2.21.tar.xz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ git-repo.spec ++++++
--- /var/tmp/diff_new_pack.IIhTaY/_old  2022-02-11 23:12:15.311439800 +0100
+++ /var/tmp/diff_new_pack.IIhTaY/_new  2022-02-11 23:12:15.315439813 +0100
@@ -17,14 +17,12 @@
 
 
 Name:           git-repo
-Version:        2.20
+Version:        2.21
 Release:        0
 Summary:        The Multiple Git Repository Tool
 License:        Apache-2.0
 URL:            https://gerrit.googlesource.com/git-repo
 Source:         %{name}-%{version}.tar.xz
-# PATCH-FIX-UPSTREAM fix-python-readlink.patch -- Path.readlink is only 
available on Python >= 3.9, use os.readlink instead
-Patch0:         fix-python-readlink.patch
 # SECTION tests
 BuildRequires:  git
 BuildRequires:  gpg2
@@ -42,7 +40,6 @@
 
 %prep
 %setup -q
-%patch0 -p1
 # fix shebang
 sed -i -E "s|#!/usr/bin/env python.*|#!/usr/bin/python3|" repo run_tests
 # remove unnecessary document

++++++ _service ++++++
--- /var/tmp/diff_new_pack.IIhTaY/_old  2022-02-11 23:12:15.351439917 +0100
+++ /var/tmp/diff_new_pack.IIhTaY/_new  2022-02-11 23:12:15.355439928 +0100
@@ -2,7 +2,7 @@
   <service mode="disabled" name="obs_scm">
     <param name="scm">git</param>
     <param name="url">https://gerrit.googlesource.com/git-repo</param>    
-    <param name="revision">v2.20</param>
+    <param name="revision">v2.21</param>
     <param name="match-tag">*</param>
     <param name="versionformat">@PARENT_TAG@</param>
     <param name="versionrewrite-pattern">v(.*)</param>

++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.IIhTaY/_old  2022-02-11 23:12:15.375439986 +0100
+++ /var/tmp/diff_new_pack.IIhTaY/_new  2022-02-11 23:12:15.379439998 +0100
@@ -1,6 +1,6 @@
 <servicedata>
 <service name="tar_scm">
                 <param 
name="url">https://gerrit.googlesource.com/git-repo</param>
-              <param 
name="changesrevision">98bb76577d9e7e0ffdeb643f1654ec006f6bbc8c</param></service></servicedata>
+              <param 
name="changesrevision">8e91248655acf1c8044ed8c1b265b804a99eb07f</param></service></servicedata>
 (No newline at EOF)
 

++++++ git-repo-2.20.obscpio -> git-repo-2.21.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/git-repo-2.20/.pytest_cache/.gitignore 
new/git-repo-2.21/.pytest_cache/.gitignore
--- old/git-repo-2.20/.pytest_cache/.gitignore  1970-01-01 01:00:00.000000000 
+0100
+++ new/git-repo-2.21/.pytest_cache/.gitignore  2022-01-26 17:46:03.000000000 
+0100
@@ -0,0 +1,2 @@
+# Created by pytest automatically.
+*
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/git-repo-2.20/.pytest_cache/CACHEDIR.TAG 
new/git-repo-2.21/.pytest_cache/CACHEDIR.TAG
--- old/git-repo-2.20/.pytest_cache/CACHEDIR.TAG        1970-01-01 
01:00:00.000000000 +0100
+++ new/git-repo-2.21/.pytest_cache/CACHEDIR.TAG        2022-01-26 
17:46:03.000000000 +0100
@@ -0,0 +1,4 @@
+Signature: 8a477f597d28d172789f06886806bc55
+# This file is a cache directory tag created by pytest.
+# For information about cache directory tags, see:
+#      http://www.bford.info/cachedir/spec.html
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/git-repo-2.20/.pytest_cache/README.md 
new/git-repo-2.21/.pytest_cache/README.md
--- old/git-repo-2.20/.pytest_cache/README.md   1970-01-01 01:00:00.000000000 
+0100
+++ new/git-repo-2.21/.pytest_cache/README.md   2022-01-26 17:46:03.000000000 
+0100
@@ -0,0 +1,8 @@
+# pytest cache directory #
+
+This directory contains data from the pytest's cache plugin,
+which provides the `--lf` and `--ff` options, as well as the `cache` fixture.
+
+**Do not** commit this to version control.
+
+See [the docs](https://docs.pytest.org/en/stable/cache.html) for more 
information.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/git-repo-2.20/.pytest_cache/v/cache/lastfailed 
new/git-repo-2.21/.pytest_cache/v/cache/lastfailed
--- old/git-repo-2.20/.pytest_cache/v/cache/lastfailed  1970-01-01 
01:00:00.000000000 +0100
+++ new/git-repo-2.21/.pytest_cache/v/cache/lastfailed  2022-01-26 
17:46:03.000000000 +0100
@@ -0,0 +1,50 @@
+{
+  "tests/test_editor.py::EditString": true,
+  "tests/test_editor.py::EditorTestCase": true,
+  "tests/test_editor.py::GetEditor": true,
+  "tests/test_error.py::PickleTests": true,
+  "tests/test_git_command.py::GitCallUnitTest": true,
+  "tests/test_git_command.py::GitRequireTests": true,
+  "tests/test_git_command.py::UserAgentUnitTest": true,
+  "tests/test_git_config.py::GitConfigReadOnlyTests": true,
+  "tests/test_git_config.py::GitConfigReadWriteTests": true,
+  "tests/test_git_superproject.py::SuperprojectTestCase": true,
+  "tests/test_git_trace2_event_log.py::EventLogTestCase": true,
+  "tests/test_hooks.py::RepoHookShebang": true,
+  "tests/test_manifest_xml.py::ContactinfoElementTests": true,
+  "tests/test_manifest_xml.py::DefaultElementTests": true,
+  "tests/test_manifest_xml.py::ExtendProjectElementTests": true,
+  "tests/test_manifest_xml.py::IncludeElementTests": true,
+  "tests/test_manifest_xml.py::ManifestParseTestCase": true,
+  "tests/test_manifest_xml.py::ManifestValidateFilePaths": true,
+  "tests/test_manifest_xml.py::ProjectElementTests": true,
+  "tests/test_manifest_xml.py::RemoteElementTests": true,
+  "tests/test_manifest_xml.py::RemoveProjectElementTests": true,
+  "tests/test_manifest_xml.py::SuperProjectElementTests": true,
+  "tests/test_manifest_xml.py::ValueTests": true,
+  "tests/test_manifest_xml.py::XmlManifestTests": true,
+  "tests/test_platform_utils.py::RemoveTests": true,
+  "tests/test_project.py::CopyFile": true,
+  "tests/test_project.py::CopyLinkTestCase": true,
+  "tests/test_project.py::LinkFile": true,
+  "tests/test_project.py::MigrateWorkTreeTests": true,
+  "tests/test_project.py::ReviewableBranchTests": true,
+  "tests/test_ssh.py::SshTests": true,
+  "tests/test_subcmds.py::AllCommands": true,
+  "tests/test_subcmds_init.py::InitCommand": true,
+  "tests/test_wrapper.py::CheckGitVersion": true,
+  "tests/test_wrapper.py::CheckRepoRev": true,
+  "tests/test_wrapper.py::CheckRepoVerify": true,
+  "tests/test_wrapper.py::GitCheckoutTestCase": true,
+  "tests/test_wrapper.py::NeedSetupGnuPG": true,
+  "tests/test_wrapper.py::ParseGitVersion": true,
+  "tests/test_wrapper.py::RepoWrapperTestCase": true,
+  "tests/test_wrapper.py::RepoWrapperUnitTest": true,
+  "tests/test_wrapper.py::Requirements": true,
+  "tests/test_wrapper.py::ResolveRepoRev": true,
+  "tests/test_wrapper.py::RunCommand": true,
+  "tests/test_wrapper.py::RunGit": true,
+  "tests/test_wrapper.py::SetGitTrace2ParentSid": true,
+  "tests/test_wrapper.py::SetupGnuPG": true,
+  "tests/test_wrapper.py::VerifyRev": true
+}
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/git-repo-2.20/.pytest_cache/v/cache/nodeids 
new/git-repo-2.21/.pytest_cache/v/cache/nodeids
--- old/git-repo-2.20/.pytest_cache/v/cache/nodeids     1970-01-01 
01:00:00.000000000 +0100
+++ new/git-repo-2.21/.pytest_cache/v/cache/nodeids     2022-01-26 
17:46:03.000000000 +0100
@@ -0,0 +1,186 @@
+[
+  "tests/test_editor.py::EditString::test_cat_editor",
+  "tests/test_editor.py::EditString::test_no_editor",
+  "tests/test_editor.py::GetEditor::test_basic",
+  "tests/test_error.py::PickleTests::testExceptionLookup",
+  "tests/test_error.py::PickleTests::testPickle",
+  "tests/test_git_command.py::GitCallUnitTest::test_version_tuple",
+  "tests/test_git_command.py::GitRequireTests::test_equal_nonfatal",
+  "tests/test_git_command.py::GitRequireTests::test_newer_nonfatal",
+  "tests/test_git_command.py::GitRequireTests::test_older_fatal",
+  "tests/test_git_command.py::GitRequireTests::test_older_fatal_msg",
+  "tests/test_git_command.py::GitRequireTests::test_older_nonfatal",
+  "tests/test_git_command.py::UserAgentUnitTest::test_smoke_git",
+  "tests/test_git_command.py::UserAgentUnitTest::test_smoke_os",
+  "tests/test_git_command.py::UserAgentUnitTest::test_smoke_repo",
+  "tests/test_git_config.py::GitConfigReadOnlyTests::test_GetBoolean_false",
+  "tests/test_git_config.py::GitConfigReadOnlyTests::test_GetBoolean_invalid",
+  "tests/test_git_config.py::GitConfigReadOnlyTests::test_GetBoolean_true",
+  
"tests/test_git_config.py::GitConfigReadOnlyTests::test_GetBoolean_undefined",
+  "tests/test_git_config.py::GitConfigReadOnlyTests::test_GetInt_invalid",
+  "tests/test_git_config.py::GitConfigReadOnlyTests::test_GetInt_undefined",
+  "tests/test_git_config.py::GitConfigReadOnlyTests::test_GetInt_valid",
+  
"tests/test_git_config.py::GitConfigReadOnlyTests::test_GetString_from_missing_file",
+  
"tests/test_git_config.py::GitConfigReadOnlyTests::test_GetString_with_empty_config_values",
+  
"tests/test_git_config.py::GitConfigReadOnlyTests::test_GetString_with_true_value",
+  
"tests/test_git_config.py::GitConfigReadWriteTests::test_GetSyncAnalysisStateData",
+  "tests/test_git_config.py::GitConfigReadWriteTests::test_SetBoolean",
+  "tests/test_git_config.py::GitConfigReadWriteTests::test_SetString",
+  
"tests/test_git_superproject.py::SuperprojectTestCase::test_superproject_get_all_project_commit_ids_mock_ls_tree",
+  
"tests/test_git_superproject.py::SuperprojectTestCase::test_superproject_get_superproject_invalid_branch",
+  
"tests/test_git_superproject.py::SuperprojectTestCase::test_superproject_get_superproject_invalid_url",
+  
"tests/test_git_superproject.py::SuperprojectTestCase::test_superproject_get_superproject_mock_fetch",
+  
"tests/test_git_superproject.py::SuperprojectTestCase::test_superproject_get_superproject_mock_init",
+  
"tests/test_git_superproject.py::SuperprojectTestCase::test_superproject_get_superproject_no_superproject",
+  
"tests/test_git_superproject.py::SuperprojectTestCase::test_superproject_update_project_revision_id",
+  
"tests/test_git_superproject.py::SuperprojectTestCase::test_superproject_update_project_revision_id_from_local_manifest_group",
+  
"tests/test_git_superproject.py::SuperprojectTestCase::test_superproject_update_project_revision_id_no_superproject_tag",
+  
"tests/test_git_superproject.py::SuperprojectTestCase::test_superproject_update_project_revision_id_with_pinned_manifest",
+  
"tests/test_git_superproject.py::SuperprojectTestCase::test_superproject_write_manifest_file",
+  "tests/test_git_trace2_event_log.py::EventLogTestCase::test_command_event",
+  
"tests/test_git_trace2_event_log.py::EventLogTestCase::test_data_event_config",
+  
"tests/test_git_trace2_event_log.py::EventLogTestCase::test_def_params_event_no_repo_config",
+  
"tests/test_git_trace2_event_log.py::EventLogTestCase::test_def_params_event_repo_config",
+  "tests/test_git_trace2_event_log.py::EventLogTestCase::test_error_event",
+  
"tests/test_git_trace2_event_log.py::EventLogTestCase::test_exit_event_result_integer",
+  
"tests/test_git_trace2_event_log.py::EventLogTestCase::test_exit_event_result_none",
+  
"tests/test_git_trace2_event_log.py::EventLogTestCase::test_initial_state_no_parent_sid",
+  
"tests/test_git_trace2_event_log.py::EventLogTestCase::test_initial_state_with_parent_sid",
+  "tests/test_git_trace2_event_log.py::EventLogTestCase::test_start_event",
+  "tests/test_git_trace2_event_log.py::EventLogTestCase::test_version_event",
+  
"tests/test_git_trace2_event_log.py::EventLogTestCase::test_write_no_git_config",
+  
"tests/test_git_trace2_event_log.py::EventLogTestCase::test_write_non_string",
+  
"tests/test_git_trace2_event_log.py::EventLogTestCase::test_write_with_filename",
+  
"tests/test_git_trace2_event_log.py::EventLogTestCase::test_write_with_git_config",
+  "tests/test_hooks.py::RepoHookShebang::test_direct_interp",
+  "tests/test_hooks.py::RepoHookShebang::test_env_interp",
+  "tests/test_hooks.py::RepoHookShebang::test_no_shebang",
+  "tests/test_manifest_xml.py::ContactinfoElementTests::test_contactinfo",
+  "tests/test_manifest_xml.py::DefaultElementTests::test_default",
+  
"tests/test_manifest_xml.py::ExtendProjectElementTests::test_extend_project_dest_path_multi_match",
+  
"tests/test_manifest_xml.py::ExtendProjectElementTests::test_extend_project_dest_path_multi_match_path_specified",
+  
"tests/test_manifest_xml.py::ExtendProjectElementTests::test_extend_project_dest_path_single_match",
+  
"tests/test_manifest_xml.py::IncludeElementTests::test_allow_bad_name_from_user",
+  "tests/test_manifest_xml.py::IncludeElementTests::test_bad_name_checks",
+  "tests/test_manifest_xml.py::IncludeElementTests::test_group_levels",
+  "tests/test_manifest_xml.py::ManifestValidateFilePaths::test_bad_paths",
+  "tests/test_manifest_xml.py::ManifestValidateFilePaths::test_normal_path",
+  
"tests/test_manifest_xml.py::ManifestValidateFilePaths::test_symlink_targets",
+  "tests/test_manifest_xml.py::ProjectElementTests::test_bad_path_name_checks",
+  "tests/test_manifest_xml.py::ProjectElementTests::test_group",
+  "tests/test_manifest_xml.py::ProjectElementTests::test_set_revision_id",
+  "tests/test_manifest_xml.py::ProjectElementTests::test_toplevel_path",
+  "tests/test_manifest_xml.py::ProjectElementTests::test_trailing_slash",
+  "tests/test_manifest_xml.py::RemoteElementTests::test_remote",
+  
"tests/test_manifest_xml.py::RemoveProjectElementTests::test_remove_one_optional_project_doesnt_exist",
+  
"tests/test_manifest_xml.py::RemoveProjectElementTests::test_remove_one_project",
+  
"tests/test_manifest_xml.py::RemoveProjectElementTests::test_remove_one_project_doesnt_exist",
+  
"tests/test_manifest_xml.py::RemoveProjectElementTests::test_remove_one_project_one_remains",
+  "tests/test_manifest_xml.py::SuperProjectElementTests::test_defalut_remote",
+  "tests/test_manifest_xml.py::SuperProjectElementTests::test_remote",
+  "tests/test_manifest_xml.py::SuperProjectElementTests::test_superproject",
+  
"tests/test_manifest_xml.py::SuperProjectElementTests::test_superproject_revision",
+  
"tests/test_manifest_xml.py::SuperProjectElementTests::test_superproject_revision_default_negative",
+  
"tests/test_manifest_xml.py::SuperProjectElementTests::test_superproject_revision_remote",
+  "tests/test_manifest_xml.py::ValueTests::test_bool_default",
+  "tests/test_manifest_xml.py::ValueTests::test_bool_false",
+  "tests/test_manifest_xml.py::ValueTests::test_bool_invalid",
+  "tests/test_manifest_xml.py::ValueTests::test_bool_true",
+  "tests/test_manifest_xml.py::ValueTests::test_int_default",
+  "tests/test_manifest_xml.py::ValueTests::test_int_good",
+  "tests/test_manifest_xml.py::ValueTests::test_int_invalid",
+  "tests/test_manifest_xml.py::XmlManifestTests::test_empty",
+  "tests/test_manifest_xml.py::XmlManifestTests::test_link",
+  "tests/test_manifest_xml.py::XmlManifestTests::test_remote_annotations",
+  "tests/test_manifest_xml.py::XmlManifestTests::test_repo_hooks",
+  "tests/test_manifest_xml.py::XmlManifestTests::test_repo_hooks_unordered",
+  "tests/test_manifest_xml.py::XmlManifestTests::test_todict_empty",
+  "tests/test_manifest_xml.py::XmlManifestTests::test_toxml_empty",
+  "tests/test_manifest_xml.py::XmlManifestTests::test_unknown_tags",
+  "tests/test_platform_utils.py::RemoveTests::testMissingOk",
+  "tests/test_project.py::CopyFile::test_basic",
+  "tests/test_project.py::CopyFile::test_dest_block_symlink",
+  "tests/test_project.py::CopyFile::test_dest_block_symlink_traversal",
+  "tests/test_project.py::CopyFile::test_dest_subdir",
+  "tests/test_project.py::CopyFile::test_src_block_copy_from_dir",
+  "tests/test_project.py::CopyFile::test_src_block_copy_to_dir",
+  "tests/test_project.py::CopyFile::test_src_block_symlink",
+  "tests/test_project.py::CopyFile::test_src_block_symlink_traversal",
+  "tests/test_project.py::CopyFile::test_src_subdir",
+  "tests/test_project.py::CopyFile::test_update",
+  "tests/test_project.py::LinkFile::test_basic",
+  "tests/test_project.py::LinkFile::test_dest_subdir",
+  "tests/test_project.py::LinkFile::test_src_block_relative",
+  "tests/test_project.py::LinkFile::test_src_self",
+  "tests/test_project.py::LinkFile::test_src_subdir",
+  "tests/test_project.py::LinkFile::test_update",
+  "tests/test_project.py::MigrateWorkTreeTests::test_standard",
+  "tests/test_project.py::MigrateWorkTreeTests::test_unknown",
+  "tests/test_project.py::ReviewableBranchTests::test_smoke",
+  "tests/test_ssh.py::SshTests::test_context_manager_child_cleanup",
+  "tests/test_ssh.py::SshTests::test_context_manager_empty",
+  "tests/test_ssh.py::SshTests::test_parse_ssh_version",
+  "tests/test_ssh.py::SshTests::test_ssh_sock",
+  "tests/test_ssh.py::SshTests::test_version",
+  "tests/test_subcmds.py::AllCommands::test_help_desc_style",
+  "tests/test_subcmds.py::AllCommands::test_naming",
+  "tests/test_subcmds.py::AllCommands::test_required_basic",
+  "tests/test_subcmds_init.py::InitCommand::test_cli_parser_bad",
+  "tests/test_subcmds_init.py::InitCommand::test_cli_parser_good",
+  "tests/test_wrapper.py::CheckGitVersion::test_new",
+  "tests/test_wrapper.py::CheckGitVersion::test_old",
+  "tests/test_wrapper.py::CheckGitVersion::test_unknown",
+  "tests/test_wrapper.py::CheckRepoRev::test_verify_fails",
+  "tests/test_wrapper.py::CheckRepoRev::test_verify_ignore",
+  "tests/test_wrapper.py::CheckRepoRev::test_verify_works",
+  "tests/test_wrapper.py::CheckRepoVerify::test_gpg_initialized",
+  "tests/test_wrapper.py::CheckRepoVerify::test_need_gpg_setup",
+  "tests/test_wrapper.py::CheckRepoVerify::test_no_verify",
+  "tests/test_wrapper.py::NeedSetupGnuPG::test_empty_keyring",
+  "tests/test_wrapper.py::NeedSetupGnuPG::test_missing_dir",
+  "tests/test_wrapper.py::NeedSetupGnuPG::test_missing_keyring",
+  "tests/test_wrapper.py::NeedSetupGnuPG::test_new_keyring",
+  "tests/test_wrapper.py::NeedSetupGnuPG::test_old_keyring",
+  "tests/test_wrapper.py::ParseGitVersion::test_autoload",
+  "tests/test_wrapper.py::ParseGitVersion::test_bad_ver",
+  "tests/test_wrapper.py::ParseGitVersion::test_extended_ver",
+  "tests/test_wrapper.py::ParseGitVersion::test_normal_ver",
+  "tests/test_wrapper.py::RepoWrapperUnitTest::test_get_gitc_manifest_dir",
+  
"tests/test_wrapper.py::RepoWrapperUnitTest::test_get_gitc_manifest_dir_no_gitc",
+  "tests/test_wrapper.py::RepoWrapperUnitTest::test_gitc_init_parser",
+  "tests/test_wrapper.py::RepoWrapperUnitTest::test_gitc_parse_clientdir",
+  
"tests/test_wrapper.py::RepoWrapperUnitTest::test_gitc_parse_clientdir_no_gitc",
+  "tests/test_wrapper.py::RepoWrapperUnitTest::test_init_parser",
+  "tests/test_wrapper.py::RepoWrapperUnitTest::test_python_constraints",
+  "tests/test_wrapper.py::RepoWrapperUnitTest::test_version",
+  "tests/test_wrapper.py::Requirements::test_assert_all_new_python",
+  "tests/test_wrapper.py::Requirements::test_assert_all_new_repo",
+  "tests/test_wrapper.py::Requirements::test_assert_all_old_python",
+  "tests/test_wrapper.py::Requirements::test_assert_all_old_repo",
+  "tests/test_wrapper.py::Requirements::test_assert_all_unknown",
+  "tests/test_wrapper.py::Requirements::test_assert_ver_new",
+  "tests/test_wrapper.py::Requirements::test_assert_ver_old",
+  "tests/test_wrapper.py::Requirements::test_assert_ver_unknown",
+  "tests/test_wrapper.py::Requirements::test_corrupt_data",
+  "tests/test_wrapper.py::Requirements::test_format_ver",
+  "tests/test_wrapper.py::Requirements::test_missing_file",
+  "tests/test_wrapper.py::Requirements::test_valid_data",
+  "tests/test_wrapper.py::ResolveRepoRev::test_branch_name",
+  "tests/test_wrapper.py::ResolveRepoRev::test_explicit_branch",
+  "tests/test_wrapper.py::ResolveRepoRev::test_explicit_tag",
+  "tests/test_wrapper.py::ResolveRepoRev::test_full_commit",
+  "tests/test_wrapper.py::ResolveRepoRev::test_partial_commit",
+  "tests/test_wrapper.py::ResolveRepoRev::test_tag_name",
+  "tests/test_wrapper.py::ResolveRepoRev::test_unknown",
+  "tests/test_wrapper.py::RunCommand::test_capture",
+  "tests/test_wrapper.py::RunCommand::test_check",
+  "tests/test_wrapper.py::RunGit::test_capture",
+  "tests/test_wrapper.py::RunGit::test_check",
+  "tests/test_wrapper.py::SetGitTrace2ParentSid::test_append",
+  "tests/test_wrapper.py::SetGitTrace2ParentSid::test_first_set",
+  "tests/test_wrapper.py::SetGitTrace2ParentSid::test_global_context",
+  "tests/test_wrapper.py::SetupGnuPG::test_full",
+  "tests/test_wrapper.py::VerifyRev::test_unsigned_commit",
+  "tests/test_wrapper.py::VerifyRev::test_verify_fails",
+  "tests/test_wrapper.py::VerifyRev::test_verify_passes"
+]
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/git-repo-2.20/.pytest_cache/v/cache/stepwise 
new/git-repo-2.21/.pytest_cache/v/cache/stepwise
--- old/git-repo-2.20/.pytest_cache/v/cache/stepwise    1970-01-01 
01:00:00.000000000 +0100
+++ new/git-repo-2.21/.pytest_cache/v/cache/stepwise    2022-01-26 
17:46:03.000000000 +0100
@@ -0,0 +1 @@
+[]
\ No newline at end of file
Binary files old/git-repo-2.20/__pycache__/color.cpython-38.pyc and 
new/git-repo-2.21/__pycache__/color.cpython-38.pyc differ
Binary files old/git-repo-2.20/__pycache__/command.cpython-38.pyc and 
new/git-repo-2.21/__pycache__/command.cpython-38.pyc differ
Binary files old/git-repo-2.20/__pycache__/editor.cpython-38.pyc and 
new/git-repo-2.21/__pycache__/editor.cpython-38.pyc differ
Binary files old/git-repo-2.20/__pycache__/error.cpython-38.pyc and 
new/git-repo-2.21/__pycache__/error.cpython-38.pyc differ
Binary files old/git-repo-2.20/__pycache__/event_log.cpython-38.pyc and 
new/git-repo-2.21/__pycache__/event_log.cpython-38.pyc differ
Binary files old/git-repo-2.20/__pycache__/fetch.cpython-38.pyc and 
new/git-repo-2.21/__pycache__/fetch.cpython-38.pyc differ
Binary files old/git-repo-2.20/__pycache__/git_command.cpython-38.pyc and 
new/git-repo-2.21/__pycache__/git_command.cpython-38.pyc differ
Binary files old/git-repo-2.20/__pycache__/git_config.cpython-38.pyc and 
new/git-repo-2.21/__pycache__/git_config.cpython-38.pyc differ
Binary files old/git-repo-2.20/__pycache__/git_refs.cpython-38.pyc and 
new/git-repo-2.21/__pycache__/git_refs.cpython-38.pyc differ
Binary files old/git-repo-2.20/__pycache__/git_superproject.cpython-38.pyc and 
new/git-repo-2.21/__pycache__/git_superproject.cpython-38.pyc differ
Binary files old/git-repo-2.20/__pycache__/git_trace2_event_log.cpython-38.pyc 
and new/git-repo-2.21/__pycache__/git_trace2_event_log.cpython-38.pyc differ
Binary files old/git-repo-2.20/__pycache__/gitc_utils.cpython-38.pyc and 
new/git-repo-2.21/__pycache__/gitc_utils.cpython-38.pyc differ
Binary files old/git-repo-2.20/__pycache__/hooks.cpython-38.pyc and 
new/git-repo-2.21/__pycache__/hooks.cpython-38.pyc differ
Binary files old/git-repo-2.20/__pycache__/main.cpython-38.pyc and 
new/git-repo-2.21/__pycache__/main.cpython-38.pyc differ
Binary files old/git-repo-2.20/__pycache__/manifest_xml.cpython-38.pyc and 
new/git-repo-2.21/__pycache__/manifest_xml.cpython-38.pyc differ
Binary files old/git-repo-2.20/__pycache__/pager.cpython-38.pyc and 
new/git-repo-2.21/__pycache__/pager.cpython-38.pyc differ
Binary files old/git-repo-2.20/__pycache__/platform_utils.cpython-38.pyc and 
new/git-repo-2.21/__pycache__/platform_utils.cpython-38.pyc differ
Binary files old/git-repo-2.20/__pycache__/progress.cpython-38.pyc and 
new/git-repo-2.21/__pycache__/progress.cpython-38.pyc differ
Binary files old/git-repo-2.20/__pycache__/project.cpython-38.pyc and 
new/git-repo-2.21/__pycache__/project.cpython-38.pyc differ
Binary files old/git-repo-2.20/__pycache__/repo_trace.cpython-38.pyc and 
new/git-repo-2.21/__pycache__/repo_trace.cpython-38.pyc differ
Binary files old/git-repo-2.20/__pycache__/repocpython-38.pyc and 
new/git-repo-2.21/__pycache__/repocpython-38.pyc differ
Binary files old/git-repo-2.20/__pycache__/ssh.cpython-38.pyc and 
new/git-repo-2.21/__pycache__/ssh.cpython-38.pyc differ
Binary files old/git-repo-2.20/__pycache__/wrapper.cpython-38.pyc and 
new/git-repo-2.21/__pycache__/wrapper.cpython-38.pyc differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/git-repo-2.20/docs/internal-fs-layout.md 
new/git-repo-2.21/docs/internal-fs-layout.md
--- old/git-repo-2.20/docs/internal-fs-layout.md        2022-01-10 
18:41:45.000000000 +0100
+++ new/git-repo-2.21/docs/internal-fs-layout.md        2022-01-26 
17:46:03.000000000 +0100
@@ -163,6 +163,7 @@
 | repo.clonefilter         | `--clone-filter`          | Filter setting when 
using [partial git clones] |
 | repo.depth               | `--depth`                 | Create shallow 
checkouts when cloning |
 | repo.dissociate          | `--dissociate`            | Dissociate from any 
reference/mirrors after initial clone |
+| repo.git-lfs             | `--git-lfs`               | Enable [Git LFS] 
support |
 | repo.mirror              | `--mirror`                | Checkout is a repo 
mirror |
 | repo.partialclone        | `--partial-clone`         | Create [partial git 
clones] |
 | repo.partialcloneexclude | `--partial-clone-exclude` | Comma-delimited list 
of project names (not paths) to exclude while using [partial git clones] |
@@ -254,6 +255,7 @@
 
 
 [git-config]: https://git-scm.com/docs/git-config
+[Git LFS]: https://git-lfs.github.com/
 [git worktree]: https://git-scm.com/docs/git-worktree
 [gitsubmodules]: https://git-scm.com/docs/gitsubmodules
 [manifest-format.md]: ./manifest-format.md
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/git-repo-2.20/git_command.py 
new/git-repo-2.21/git_command.py
--- old/git-repo-2.20/git_command.py    2022-01-10 18:41:45.000000000 +0100
+++ new/git-repo-2.21/git_command.py    2022-01-26 17:46:03.000000000 +0100
@@ -169,7 +169,8 @@
                disable_editor=False,
                ssh_proxy=None,
                cwd=None,
-               gitdir=None):
+               gitdir=None,
+               objdir=None):
     env = self._GetBasicEnv()
 
     if disable_editor:
@@ -194,13 +195,24 @@
         cwd = project.worktree
       if not gitdir:
         gitdir = project.gitdir
+    # Git on Windows wants its paths only using / for reliability.
+    if platform_utils.isWindows():
+      if objdir:
+        objdir = objdir.replace('\\', '/')
+      if gitdir:
+        gitdir = gitdir.replace('\\', '/')
+
+    if objdir:
+      # Set to the place we want to save the objects.
+      env['GIT_OBJECT_DIRECTORY'] = objdir
+      if gitdir:
+        # Allow git to search the original place in case of local or unique 
refs
+        # that git will attempt to resolve even if we aren't fetching them.
+        env['GIT_ALTERNATE_OBJECT_DIRECTORIES'] = gitdir + '/objects'
 
     command = [GIT]
     if bare:
       if gitdir:
-        # Git on Windows wants its paths only using / for reliability.
-        if platform_utils.isWindows():
-          gitdir = gitdir.replace('\\', '/')
         env[GIT_DIR] = gitdir
       cwd = None
     command.append(cmdv[0])
@@ -234,6 +246,11 @@
         dbg += ': export GIT_DIR=%s\n' % env[GIT_DIR]
         LAST_GITDIR = env[GIT_DIR]
 
+      if 'GIT_OBJECT_DIRECTORY' in env:
+        dbg += ': export GIT_OBJECT_DIRECTORY=%s\n' % 
env['GIT_OBJECT_DIRECTORY']
+      if 'GIT_ALTERNATE_OBJECT_DIRECTORIES' in env:
+        dbg += ': export GIT_ALTERNATE_OBJECT_DIRECTORIES=%s\n' % 
env['GIT_ALTERNATE_OBJECT_DIRECTORIES']
+
       dbg += ': '
       dbg += ' '.join(command)
       if stdin == subprocess.PIPE:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/git-repo-2.20/manifest_xml.py 
new/git-repo-2.21/manifest_xml.py
--- old/git-repo-2.20/manifest_xml.py   2022-01-10 18:41:45.000000000 +0100
+++ new/git-repo-2.21/manifest_xml.py   2022-01-26 17:46:03.000000000 +0100
@@ -666,6 +666,10 @@
   def HasSubmodules(self):
     return self.manifestProject.config.GetBoolean('repo.submodules')
 
+  @property
+  def EnableGitLfs(self):
+    return self.manifestProject.config.GetBoolean('repo.git-lfs')
+
   def GetDefaultGroupsStr(self):
     """Returns the default group string for the platform."""
     return 'default,platform-' + platform.system().lower()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/git-repo-2.20/project.py new/git-repo-2.21/project.py
--- old/git-repo-2.20/project.py        2022-01-10 18:41:45.000000000 +0100
+++ new/git-repo-2.21/project.py        2022-01-26 17:46:03.000000000 +0100
@@ -1120,7 +1120,7 @@
     self._InitRemote()
 
     if is_new:
-      alt = os.path.join(self.gitdir, 'objects/info/alternates')
+      alt = os.path.join(self.objdir, 'objects/info/alternates')
       try:
         with open(alt) as fd:
           # This works for both absolute and relative alternate directories.
@@ -1169,7 +1169,7 @@
     mp = self.manifest.manifestProject
     dissociate = mp.config.GetBoolean('repo.dissociate')
     if dissociate:
-      alternates_file = os.path.join(self.gitdir, 'objects/info/alternates')
+      alternates_file = os.path.join(self.objdir, 'objects/info/alternates')
       if os.path.exists(alternates_file):
         cmd = ['repack', '-a', '-d']
         p = GitCommand(self, cmd, bare=True, capture_stdout=bool(output_redir),
@@ -2192,8 +2192,10 @@
     retry_cur_sleep = retry_sleep_initial_sec
     ok = prune_tried = False
     for try_n in range(retry_fetches):
-      gitcmd = GitCommand(self, cmd, bare=True, ssh_proxy=ssh_proxy,
-                          merge_output=True, capture_stdout=quiet or 
bool(output_redir))
+      gitcmd = GitCommand(
+          self, cmd, bare=True, objdir=os.path.join(self.objdir, 'objects'),
+          ssh_proxy=ssh_proxy,
+          merge_output=True, capture_stdout=quiet or bool(output_redir))
       if gitcmd.stdout and not quiet and output_redir:
         output_redir.write(gitcmd.stdout)
       ret = gitcmd.Wait()
@@ -2309,7 +2311,8 @@
       cmd.append(str(f))
     cmd.append('+refs/tags/*:refs/tags/*')
 
-    ok = GitCommand(self, cmd, bare=True).Wait() == 0
+    ok = GitCommand(
+        self, cmd, bare=True, objdir=os.path.join(self.objdir, 
'objects')).Wait() == 0
     platform_utils.remove(bundle_dst, missing_ok=True)
     platform_utils.remove(bundle_tmp, missing_ok=True)
     return ok
@@ -2504,8 +2507,8 @@
         if ref_dir or mirror_git:
           if not mirror_git:
             mirror_git = os.path.join(ref_dir, self.name + '.git')
-          repo_git = os.path.join(ref_dir, '.repo', 'projects',
-                                  self.relpath + '.git')
+          repo_git = os.path.join(ref_dir, '.repo', 'project-objects',
+                                  self.name + '.git')
           worktrees_git = os.path.join(ref_dir, '.repo', 'worktrees',
                                        self.name + '.git')
 
@@ -2523,15 +2526,16 @@
               # The alternate directory is relative to the object database.
               ref_dir = os.path.relpath(ref_dir,
                                         os.path.join(self.objdir, 'objects'))
-            _lwrite(os.path.join(self.gitdir, 'objects/info/alternates'),
+            _lwrite(os.path.join(self.objdir, 'objects/info/alternates'),
                     os.path.join(ref_dir, 'objects') + '\n')
 
         m = self.manifest.manifestProject.config
         for key in ['user.name', 'user.email']:
           if m.Has(key, include_defaults=False):
             self.config.SetString(key, m.GetString(key))
-        self.config.SetString('filter.lfs.smudge', 'git-lfs smudge --skip -- 
%f')
-        self.config.SetString('filter.lfs.process', 'git-lfs filter-process 
--skip')
+        if not self.manifest.EnableGitLfs:
+          self.config.SetString('filter.lfs.smudge', 'git-lfs smudge --skip -- 
%f')
+          self.config.SetString('filter.lfs.process', 'git-lfs filter-process 
--skip')
         self.config.SetBoolean('core.bare', True if self.manifest.IsMirror 
else None)
     except Exception:
       if init_obj_dir and os.path.exists(self.objdir):
@@ -2551,7 +2555,10 @@
 
     # Delete sample hooks.  They're noise.
     for hook in glob.glob(os.path.join(hooks, '*.sample')):
-      platform_utils.remove(hook, missing_ok=True)
+      try:
+        platform_utils.remove(hook, missing_ok=True)
+      except PermissionError:
+        pass
 
     for stock_hook in _ProjectHooks():
       name = os.path.basename(stock_hook)
@@ -2813,7 +2820,8 @@
     }
     # Paths that we know will be in both, but are safe to clobber in 
.repo/projects/.
     SAFE_TO_CLOBBER = {
-        'COMMIT_EDITMSG', 'FETCH_HEAD', 'HEAD', 'gitk.cache', 'index', 
'ORIG_HEAD',
+        'COMMIT_EDITMSG', 'FETCH_HEAD', 'HEAD', 'gc.log', 'gitk.cache', 
'index',
+        'ORIG_HEAD',
     }
 
     # First see if we'd succeed before starting the migration.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/git-repo-2.20/repo new/git-repo-2.21/repo
--- old/git-repo-2.20/repo      2022-01-10 18:41:45.000000000 +0100
+++ new/git-repo-2.21/repo      2022-01-26 17:46:03.000000000 +0100
@@ -149,7 +149,7 @@
 BUG_URL = 
'https://bugs.chromium.org/p/gerrit/issues/entry?template=Repo+tool+issue'
 
 # increment this whenever we make important changes to this script
-VERSION = (2, 17)
+VERSION = (2, 21)
 
 # increment this if the MAINTAINER_KEYS block is modified
 KEYRING_VERSION = (2, 3)
@@ -382,6 +382,11 @@
   group.add_option('--no-clone-bundle',
                    dest='clone_bundle', action='store_false',
                    help='disable use of /clone.bundle on HTTP/HTTPS (default 
if --partial-clone)')
+  group.add_option('--git-lfs', action='store_true',
+                   help='enable Git LFS support')
+  group.add_option('--no-git-lfs',
+                   dest='git_lfs', action='store_false',
+                   help='disable Git LFS support')
 
   # Tool.
   group = parser.add_option_group('repo Version options')
@@ -618,6 +623,7 @@
             "REPO_URL set correctly?" % url, file=sys.stderr)
 
   except CloneFailure:
+    print('fatal: double check your --repo-rev setting.', file=sys.stderr)
     if opt.quiet:
       print('fatal: repo init failed; run without --quiet to see why',
             file=sys.stderr)
Binary files old/git-repo-2.20/subcmds/__pycache__/__init__.cpython-38.pyc and 
new/git-repo-2.21/subcmds/__pycache__/__init__.cpython-38.pyc differ
Binary files old/git-repo-2.20/subcmds/__pycache__/abandon.cpython-38.pyc and 
new/git-repo-2.21/subcmds/__pycache__/abandon.cpython-38.pyc differ
Binary files old/git-repo-2.20/subcmds/__pycache__/branches.cpython-38.pyc and 
new/git-repo-2.21/subcmds/__pycache__/branches.cpython-38.pyc differ
Binary files old/git-repo-2.20/subcmds/__pycache__/checkout.cpython-38.pyc and 
new/git-repo-2.21/subcmds/__pycache__/checkout.cpython-38.pyc differ
Binary files old/git-repo-2.20/subcmds/__pycache__/cherry_pick.cpython-38.pyc 
and new/git-repo-2.21/subcmds/__pycache__/cherry_pick.cpython-38.pyc differ
Binary files old/git-repo-2.20/subcmds/__pycache__/diff.cpython-38.pyc and 
new/git-repo-2.21/subcmds/__pycache__/diff.cpython-38.pyc differ
Binary files old/git-repo-2.20/subcmds/__pycache__/diffmanifests.cpython-38.pyc 
and new/git-repo-2.21/subcmds/__pycache__/diffmanifests.cpython-38.pyc differ
Binary files old/git-repo-2.20/subcmds/__pycache__/download.cpython-38.pyc and 
new/git-repo-2.21/subcmds/__pycache__/download.cpython-38.pyc differ
Binary files old/git-repo-2.20/subcmds/__pycache__/forall.cpython-38.pyc and 
new/git-repo-2.21/subcmds/__pycache__/forall.cpython-38.pyc differ
Binary files old/git-repo-2.20/subcmds/__pycache__/gitc_delete.cpython-38.pyc 
and new/git-repo-2.21/subcmds/__pycache__/gitc_delete.cpython-38.pyc differ
Binary files old/git-repo-2.20/subcmds/__pycache__/gitc_init.cpython-38.pyc and 
new/git-repo-2.21/subcmds/__pycache__/gitc_init.cpython-38.pyc differ
Binary files old/git-repo-2.20/subcmds/__pycache__/grep.cpython-38.pyc and 
new/git-repo-2.21/subcmds/__pycache__/grep.cpython-38.pyc differ
Binary files old/git-repo-2.20/subcmds/__pycache__/help.cpython-38.pyc and 
new/git-repo-2.21/subcmds/__pycache__/help.cpython-38.pyc differ
Binary files old/git-repo-2.20/subcmds/__pycache__/info.cpython-38.pyc and 
new/git-repo-2.21/subcmds/__pycache__/info.cpython-38.pyc differ
Binary files old/git-repo-2.20/subcmds/__pycache__/init.cpython-38.pyc and 
new/git-repo-2.21/subcmds/__pycache__/init.cpython-38.pyc differ
Binary files old/git-repo-2.20/subcmds/__pycache__/list.cpython-38.pyc and 
new/git-repo-2.21/subcmds/__pycache__/list.cpython-38.pyc differ
Binary files old/git-repo-2.20/subcmds/__pycache__/manifest.cpython-38.pyc and 
new/git-repo-2.21/subcmds/__pycache__/manifest.cpython-38.pyc differ
Binary files old/git-repo-2.20/subcmds/__pycache__/overview.cpython-38.pyc and 
new/git-repo-2.21/subcmds/__pycache__/overview.cpython-38.pyc differ
Binary files old/git-repo-2.20/subcmds/__pycache__/prune.cpython-38.pyc and 
new/git-repo-2.21/subcmds/__pycache__/prune.cpython-38.pyc differ
Binary files old/git-repo-2.20/subcmds/__pycache__/rebase.cpython-38.pyc and 
new/git-repo-2.21/subcmds/__pycache__/rebase.cpython-38.pyc differ
Binary files old/git-repo-2.20/subcmds/__pycache__/selfupdate.cpython-38.pyc 
and new/git-repo-2.21/subcmds/__pycache__/selfupdate.cpython-38.pyc differ
Binary files old/git-repo-2.20/subcmds/__pycache__/smartsync.cpython-38.pyc and 
new/git-repo-2.21/subcmds/__pycache__/smartsync.cpython-38.pyc differ
Binary files old/git-repo-2.20/subcmds/__pycache__/stage.cpython-38.pyc and 
new/git-repo-2.21/subcmds/__pycache__/stage.cpython-38.pyc differ
Binary files old/git-repo-2.20/subcmds/__pycache__/start.cpython-38.pyc and 
new/git-repo-2.21/subcmds/__pycache__/start.cpython-38.pyc differ
Binary files old/git-repo-2.20/subcmds/__pycache__/status.cpython-38.pyc and 
new/git-repo-2.21/subcmds/__pycache__/status.cpython-38.pyc differ
Binary files old/git-repo-2.20/subcmds/__pycache__/sync.cpython-38.pyc and 
new/git-repo-2.21/subcmds/__pycache__/sync.cpython-38.pyc differ
Binary files old/git-repo-2.20/subcmds/__pycache__/upload.cpython-38.pyc and 
new/git-repo-2.21/subcmds/__pycache__/upload.cpython-38.pyc differ
Binary files old/git-repo-2.20/subcmds/__pycache__/version.cpython-38.pyc and 
new/git-repo-2.21/subcmds/__pycache__/version.cpython-38.pyc differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/git-repo-2.20/subcmds/branches.py 
new/git-repo-2.21/subcmds/branches.py
--- old/git-repo-2.20/subcmds/branches.py       2022-01-10 18:41:45.000000000 
+0100
+++ new/git-repo-2.21/subcmds/branches.py       2022-01-26 17:46:03.000000000 
+0100
@@ -151,7 +151,7 @@
         fmt = out.write
         paths = []
         non_cur_paths = []
-        if i.IsSplitCurrent or (in_cnt < project_cnt - in_cnt):
+        if i.IsSplitCurrent or (in_cnt <= project_cnt - in_cnt):
           in_type = 'in'
           for b in i.projects:
             if not i.IsSplitCurrent or b.current:
@@ -163,9 +163,9 @@
           in_type = 'not in'
           have = set()
           for b in i.projects:
-            have.add(b.project)
+            have.add(b.project.relpath)
           for p in projects:
-            if p not in have:
+            if p.relpath not in have:
               paths.append(p.relpath)
 
         s = ' %s %s' % (in_type, ', '.join(paths))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/git-repo-2.20/subcmds/init.py 
new/git-repo-2.21/subcmds/init.py
--- old/git-repo-2.20/subcmds/init.py   2022-01-10 18:41:45.000000000 +0100
+++ new/git-repo-2.21/subcmds/init.py   2022-01-26 17:46:03.000000000 +0100
@@ -291,6 +291,15 @@
     if opt.submodules:
       m.config.SetBoolean('repo.submodules', opt.submodules)
 
+    if opt.git_lfs is not None:
+      if opt.git_lfs:
+        git_require((2, 17, 0), fail=True, msg='Git LFS support')
+
+      m.config.SetBoolean('repo.git-lfs', opt.git_lfs)
+      if not is_new:
+        print('warning: Changing --git-lfs settings will only affect new 
project checkouts.\n'
+              '         Existing projects will require manual updates.\n', 
file=sys.stderr)
+
     if opt.use_superproject is not None:
       m.config.SetBoolean('repo.superproject', opt.use_superproject)
 
@@ -520,8 +529,12 @@
     # Handle new --repo-rev requests.
     if opt.repo_rev:
       wrapper = Wrapper()
-      remote_ref, rev = wrapper.check_repo_rev(
-          rp.gitdir, opt.repo_rev, repo_verify=opt.repo_verify, 
quiet=opt.quiet)
+      try:
+        remote_ref, rev = wrapper.check_repo_rev(
+            rp.gitdir, opt.repo_rev, repo_verify=opt.repo_verify, 
quiet=opt.quiet)
+      except wrapper.CloneFailure:
+        print('fatal: double check your --repo-rev setting.', file=sys.stderr)
+        sys.exit(1)
       branch = rp.GetBranch('default')
       branch.merge = remote_ref
       rp.work_git.reset('--hard', rev)
Binary files 
old/git-repo-2.20/tests/__pycache__/test_editor.cpython-38-pytest-6.2.5.pyc and 
new/git-repo-2.21/tests/__pycache__/test_editor.cpython-38-pytest-6.2.5.pyc 
differ
Binary files 
old/git-repo-2.20/tests/__pycache__/test_error.cpython-38-pytest-6.2.5.pyc and 
new/git-repo-2.21/tests/__pycache__/test_error.cpython-38-pytest-6.2.5.pyc 
differ
Binary files 
old/git-repo-2.20/tests/__pycache__/test_git_command.cpython-38-pytest-6.2.5.pyc
 and 
new/git-repo-2.21/tests/__pycache__/test_git_command.cpython-38-pytest-6.2.5.pyc
 differ
Binary files 
old/git-repo-2.20/tests/__pycache__/test_git_config.cpython-38-pytest-6.2.5.pyc 
and 
new/git-repo-2.21/tests/__pycache__/test_git_config.cpython-38-pytest-6.2.5.pyc 
differ
Binary files 
old/git-repo-2.20/tests/__pycache__/test_git_superproject.cpython-38-pytest-6.2.5.pyc
 and 
new/git-repo-2.21/tests/__pycache__/test_git_superproject.cpython-38-pytest-6.2.5.pyc
 differ
Binary files 
old/git-repo-2.20/tests/__pycache__/test_git_trace2_event_log.cpython-38-pytest-6.2.5.pyc
 and 
new/git-repo-2.21/tests/__pycache__/test_git_trace2_event_log.cpython-38-pytest-6.2.5.pyc
 differ
Binary files 
old/git-repo-2.20/tests/__pycache__/test_hooks.cpython-38-pytest-6.2.5.pyc and 
new/git-repo-2.21/tests/__pycache__/test_hooks.cpython-38-pytest-6.2.5.pyc 
differ
Binary files 
old/git-repo-2.20/tests/__pycache__/test_manifest_xml.cpython-38-pytest-6.2.5.pyc
 and 
new/git-repo-2.21/tests/__pycache__/test_manifest_xml.cpython-38-pytest-6.2.5.pyc
 differ
Binary files 
old/git-repo-2.20/tests/__pycache__/test_platform_utils.cpython-38-pytest-6.2.5.pyc
 and 
new/git-repo-2.21/tests/__pycache__/test_platform_utils.cpython-38-pytest-6.2.5.pyc
 differ
Binary files 
old/git-repo-2.20/tests/__pycache__/test_project.cpython-38-pytest-6.2.5.pyc 
and 
new/git-repo-2.21/tests/__pycache__/test_project.cpython-38-pytest-6.2.5.pyc 
differ
Binary files 
old/git-repo-2.20/tests/__pycache__/test_ssh.cpython-38-pytest-6.2.5.pyc and 
new/git-repo-2.21/tests/__pycache__/test_ssh.cpython-38-pytest-6.2.5.pyc differ
Binary files 
old/git-repo-2.20/tests/__pycache__/test_subcmds.cpython-38-pytest-6.2.5.pyc 
and 
new/git-repo-2.21/tests/__pycache__/test_subcmds.cpython-38-pytest-6.2.5.pyc 
differ
Binary files 
old/git-repo-2.20/tests/__pycache__/test_subcmds_init.cpython-38-pytest-6.2.5.pyc
 and 
new/git-repo-2.21/tests/__pycache__/test_subcmds_init.cpython-38-pytest-6.2.5.pyc
 differ
Binary files 
old/git-repo-2.20/tests/__pycache__/test_wrapper.cpython-38-pytest-6.2.5.pyc 
and 
new/git-repo-2.21/tests/__pycache__/test_wrapper.cpython-38-pytest-6.2.5.pyc 
differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/git-repo-2.20/tests/fixtures/.repo_not.present.gitconfig.json 
new/git-repo-2.21/tests/fixtures/.repo_not.present.gitconfig.json
--- old/git-repo-2.20/tests/fixtures/.repo_not.present.gitconfig.json   
1970-01-01 01:00:00.000000000 +0100
+++ new/git-repo-2.21/tests/fixtures/.repo_not.present.gitconfig.json   
2022-01-26 17:46:03.000000000 +0100
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/git-repo-2.20/tests/fixtures/.repo_test.gitconfig.json 
new/git-repo-2.21/tests/fixtures/.repo_test.gitconfig.json
--- old/git-repo-2.20/tests/fixtures/.repo_test.gitconfig.json  1970-01-01 
01:00:00.000000000 +0100
+++ new/git-repo-2.21/tests/fixtures/.repo_test.gitconfig.json  2022-01-26 
17:46:03.000000000 +0100
@@ -0,0 +1,38 @@
+{
+  "section.empty": [
+    null
+  ],
+  "section.nonempty": [
+    "true"
+  ],
+  "section.boolinvalid": [
+    "oops"
+  ],
+  "section.booltrue": [
+    "true"
+  ],
+  "section.boolfalse": [
+    "false"
+  ],
+  "section.intinvalid": [
+    "oops"
+  ],
+  "section.inthex": [
+    "0x10"
+  ],
+  "section.inthexk": [
+    "0x10k"
+  ],
+  "section.int": [
+    "10"
+  ],
+  "section.intk": [
+    "10k"
+  ],
+  "section.intm": [
+    "10m"
+  ],
+  "section.intg": [
+    "10g"
+  ]
+}
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/git-repo-2.20/tests/test_project.py 
new/git-repo-2.21/tests/test_project.py
--- old/git-repo-2.20/tests/test_project.py     2022-01-10 18:41:45.000000000 
+0100
+++ new/git-repo-2.21/tests/test_project.py     2022-01-26 17:46:03.000000000 
+0100
@@ -382,7 +382,7 @@
 
       # Make sure the dir was transformed into a symlink.
       self.assertTrue(dotgit.is_symlink())
-      self.assertEqual(str(dotgit.readlink()), 
'../../.repo/projects/src/test.git')
+      self.assertEqual(os.readlink(dotgit), 
'../../.repo/projects/src/test.git')
 
       # Make sure files were moved over.
       gitdir = tempdir / '.repo/projects/src/test.git'

++++++ git-repo-2.20.tar.xz -> git-repo-2.21.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/git-repo-2.20/.pytest_cache/.gitignore 
new/git-repo-2.21/.pytest_cache/.gitignore
--- old/git-repo-2.20/.pytest_cache/.gitignore  1970-01-01 01:00:00.000000000 
+0100
+++ new/git-repo-2.21/.pytest_cache/.gitignore  2022-01-26 17:46:03.000000000 
+0100
@@ -0,0 +1,2 @@
+# Created by pytest automatically.
+*
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/git-repo-2.20/.pytest_cache/CACHEDIR.TAG 
new/git-repo-2.21/.pytest_cache/CACHEDIR.TAG
--- old/git-repo-2.20/.pytest_cache/CACHEDIR.TAG        1970-01-01 
01:00:00.000000000 +0100
+++ new/git-repo-2.21/.pytest_cache/CACHEDIR.TAG        2022-01-26 
17:46:03.000000000 +0100
@@ -0,0 +1,4 @@
+Signature: 8a477f597d28d172789f06886806bc55
+# This file is a cache directory tag created by pytest.
+# For information about cache directory tags, see:
+#      http://www.bford.info/cachedir/spec.html
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/git-repo-2.20/.pytest_cache/README.md 
new/git-repo-2.21/.pytest_cache/README.md
--- old/git-repo-2.20/.pytest_cache/README.md   1970-01-01 01:00:00.000000000 
+0100
+++ new/git-repo-2.21/.pytest_cache/README.md   2022-01-26 17:46:03.000000000 
+0100
@@ -0,0 +1,8 @@
+# pytest cache directory #
+
+This directory contains data from the pytest's cache plugin,
+which provides the `--lf` and `--ff` options, as well as the `cache` fixture.
+
+**Do not** commit this to version control.
+
+See [the docs](https://docs.pytest.org/en/stable/cache.html) for more 
information.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/git-repo-2.20/.pytest_cache/v/cache/lastfailed 
new/git-repo-2.21/.pytest_cache/v/cache/lastfailed
--- old/git-repo-2.20/.pytest_cache/v/cache/lastfailed  1970-01-01 
01:00:00.000000000 +0100
+++ new/git-repo-2.21/.pytest_cache/v/cache/lastfailed  2022-01-26 
17:46:03.000000000 +0100
@@ -0,0 +1,50 @@
+{
+  "tests/test_editor.py::EditString": true,
+  "tests/test_editor.py::EditorTestCase": true,
+  "tests/test_editor.py::GetEditor": true,
+  "tests/test_error.py::PickleTests": true,
+  "tests/test_git_command.py::GitCallUnitTest": true,
+  "tests/test_git_command.py::GitRequireTests": true,
+  "tests/test_git_command.py::UserAgentUnitTest": true,
+  "tests/test_git_config.py::GitConfigReadOnlyTests": true,
+  "tests/test_git_config.py::GitConfigReadWriteTests": true,
+  "tests/test_git_superproject.py::SuperprojectTestCase": true,
+  "tests/test_git_trace2_event_log.py::EventLogTestCase": true,
+  "tests/test_hooks.py::RepoHookShebang": true,
+  "tests/test_manifest_xml.py::ContactinfoElementTests": true,
+  "tests/test_manifest_xml.py::DefaultElementTests": true,
+  "tests/test_manifest_xml.py::ExtendProjectElementTests": true,
+  "tests/test_manifest_xml.py::IncludeElementTests": true,
+  "tests/test_manifest_xml.py::ManifestParseTestCase": true,
+  "tests/test_manifest_xml.py::ManifestValidateFilePaths": true,
+  "tests/test_manifest_xml.py::ProjectElementTests": true,
+  "tests/test_manifest_xml.py::RemoteElementTests": true,
+  "tests/test_manifest_xml.py::RemoveProjectElementTests": true,
+  "tests/test_manifest_xml.py::SuperProjectElementTests": true,
+  "tests/test_manifest_xml.py::ValueTests": true,
+  "tests/test_manifest_xml.py::XmlManifestTests": true,
+  "tests/test_platform_utils.py::RemoveTests": true,
+  "tests/test_project.py::CopyFile": true,
+  "tests/test_project.py::CopyLinkTestCase": true,
+  "tests/test_project.py::LinkFile": true,
+  "tests/test_project.py::MigrateWorkTreeTests": true,
+  "tests/test_project.py::ReviewableBranchTests": true,
+  "tests/test_ssh.py::SshTests": true,
+  "tests/test_subcmds.py::AllCommands": true,
+  "tests/test_subcmds_init.py::InitCommand": true,
+  "tests/test_wrapper.py::CheckGitVersion": true,
+  "tests/test_wrapper.py::CheckRepoRev": true,
+  "tests/test_wrapper.py::CheckRepoVerify": true,
+  "tests/test_wrapper.py::GitCheckoutTestCase": true,
+  "tests/test_wrapper.py::NeedSetupGnuPG": true,
+  "tests/test_wrapper.py::ParseGitVersion": true,
+  "tests/test_wrapper.py::RepoWrapperTestCase": true,
+  "tests/test_wrapper.py::RepoWrapperUnitTest": true,
+  "tests/test_wrapper.py::Requirements": true,
+  "tests/test_wrapper.py::ResolveRepoRev": true,
+  "tests/test_wrapper.py::RunCommand": true,
+  "tests/test_wrapper.py::RunGit": true,
+  "tests/test_wrapper.py::SetGitTrace2ParentSid": true,
+  "tests/test_wrapper.py::SetupGnuPG": true,
+  "tests/test_wrapper.py::VerifyRev": true
+}
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/git-repo-2.20/.pytest_cache/v/cache/nodeids 
new/git-repo-2.21/.pytest_cache/v/cache/nodeids
--- old/git-repo-2.20/.pytest_cache/v/cache/nodeids     1970-01-01 
01:00:00.000000000 +0100
+++ new/git-repo-2.21/.pytest_cache/v/cache/nodeids     2022-01-26 
17:46:03.000000000 +0100
@@ -0,0 +1,186 @@
+[
+  "tests/test_editor.py::EditString::test_cat_editor",
+  "tests/test_editor.py::EditString::test_no_editor",
+  "tests/test_editor.py::GetEditor::test_basic",
+  "tests/test_error.py::PickleTests::testExceptionLookup",
+  "tests/test_error.py::PickleTests::testPickle",
+  "tests/test_git_command.py::GitCallUnitTest::test_version_tuple",
+  "tests/test_git_command.py::GitRequireTests::test_equal_nonfatal",
+  "tests/test_git_command.py::GitRequireTests::test_newer_nonfatal",
+  "tests/test_git_command.py::GitRequireTests::test_older_fatal",
+  "tests/test_git_command.py::GitRequireTests::test_older_fatal_msg",
+  "tests/test_git_command.py::GitRequireTests::test_older_nonfatal",
+  "tests/test_git_command.py::UserAgentUnitTest::test_smoke_git",
+  "tests/test_git_command.py::UserAgentUnitTest::test_smoke_os",
+  "tests/test_git_command.py::UserAgentUnitTest::test_smoke_repo",
+  "tests/test_git_config.py::GitConfigReadOnlyTests::test_GetBoolean_false",
+  "tests/test_git_config.py::GitConfigReadOnlyTests::test_GetBoolean_invalid",
+  "tests/test_git_config.py::GitConfigReadOnlyTests::test_GetBoolean_true",
+  
"tests/test_git_config.py::GitConfigReadOnlyTests::test_GetBoolean_undefined",
+  "tests/test_git_config.py::GitConfigReadOnlyTests::test_GetInt_invalid",
+  "tests/test_git_config.py::GitConfigReadOnlyTests::test_GetInt_undefined",
+  "tests/test_git_config.py::GitConfigReadOnlyTests::test_GetInt_valid",
+  
"tests/test_git_config.py::GitConfigReadOnlyTests::test_GetString_from_missing_file",
+  
"tests/test_git_config.py::GitConfigReadOnlyTests::test_GetString_with_empty_config_values",
+  
"tests/test_git_config.py::GitConfigReadOnlyTests::test_GetString_with_true_value",
+  
"tests/test_git_config.py::GitConfigReadWriteTests::test_GetSyncAnalysisStateData",
+  "tests/test_git_config.py::GitConfigReadWriteTests::test_SetBoolean",
+  "tests/test_git_config.py::GitConfigReadWriteTests::test_SetString",
+  
"tests/test_git_superproject.py::SuperprojectTestCase::test_superproject_get_all_project_commit_ids_mock_ls_tree",
+  
"tests/test_git_superproject.py::SuperprojectTestCase::test_superproject_get_superproject_invalid_branch",
+  
"tests/test_git_superproject.py::SuperprojectTestCase::test_superproject_get_superproject_invalid_url",
+  
"tests/test_git_superproject.py::SuperprojectTestCase::test_superproject_get_superproject_mock_fetch",
+  
"tests/test_git_superproject.py::SuperprojectTestCase::test_superproject_get_superproject_mock_init",
+  
"tests/test_git_superproject.py::SuperprojectTestCase::test_superproject_get_superproject_no_superproject",
+  
"tests/test_git_superproject.py::SuperprojectTestCase::test_superproject_update_project_revision_id",
+  
"tests/test_git_superproject.py::SuperprojectTestCase::test_superproject_update_project_revision_id_from_local_manifest_group",
+  
"tests/test_git_superproject.py::SuperprojectTestCase::test_superproject_update_project_revision_id_no_superproject_tag",
+  
"tests/test_git_superproject.py::SuperprojectTestCase::test_superproject_update_project_revision_id_with_pinned_manifest",
+  
"tests/test_git_superproject.py::SuperprojectTestCase::test_superproject_write_manifest_file",
+  "tests/test_git_trace2_event_log.py::EventLogTestCase::test_command_event",
+  
"tests/test_git_trace2_event_log.py::EventLogTestCase::test_data_event_config",
+  
"tests/test_git_trace2_event_log.py::EventLogTestCase::test_def_params_event_no_repo_config",
+  
"tests/test_git_trace2_event_log.py::EventLogTestCase::test_def_params_event_repo_config",
+  "tests/test_git_trace2_event_log.py::EventLogTestCase::test_error_event",
+  
"tests/test_git_trace2_event_log.py::EventLogTestCase::test_exit_event_result_integer",
+  
"tests/test_git_trace2_event_log.py::EventLogTestCase::test_exit_event_result_none",
+  
"tests/test_git_trace2_event_log.py::EventLogTestCase::test_initial_state_no_parent_sid",
+  
"tests/test_git_trace2_event_log.py::EventLogTestCase::test_initial_state_with_parent_sid",
+  "tests/test_git_trace2_event_log.py::EventLogTestCase::test_start_event",
+  "tests/test_git_trace2_event_log.py::EventLogTestCase::test_version_event",
+  
"tests/test_git_trace2_event_log.py::EventLogTestCase::test_write_no_git_config",
+  
"tests/test_git_trace2_event_log.py::EventLogTestCase::test_write_non_string",
+  
"tests/test_git_trace2_event_log.py::EventLogTestCase::test_write_with_filename",
+  
"tests/test_git_trace2_event_log.py::EventLogTestCase::test_write_with_git_config",
+  "tests/test_hooks.py::RepoHookShebang::test_direct_interp",
+  "tests/test_hooks.py::RepoHookShebang::test_env_interp",
+  "tests/test_hooks.py::RepoHookShebang::test_no_shebang",
+  "tests/test_manifest_xml.py::ContactinfoElementTests::test_contactinfo",
+  "tests/test_manifest_xml.py::DefaultElementTests::test_default",
+  
"tests/test_manifest_xml.py::ExtendProjectElementTests::test_extend_project_dest_path_multi_match",
+  
"tests/test_manifest_xml.py::ExtendProjectElementTests::test_extend_project_dest_path_multi_match_path_specified",
+  
"tests/test_manifest_xml.py::ExtendProjectElementTests::test_extend_project_dest_path_single_match",
+  
"tests/test_manifest_xml.py::IncludeElementTests::test_allow_bad_name_from_user",
+  "tests/test_manifest_xml.py::IncludeElementTests::test_bad_name_checks",
+  "tests/test_manifest_xml.py::IncludeElementTests::test_group_levels",
+  "tests/test_manifest_xml.py::ManifestValidateFilePaths::test_bad_paths",
+  "tests/test_manifest_xml.py::ManifestValidateFilePaths::test_normal_path",
+  
"tests/test_manifest_xml.py::ManifestValidateFilePaths::test_symlink_targets",
+  "tests/test_manifest_xml.py::ProjectElementTests::test_bad_path_name_checks",
+  "tests/test_manifest_xml.py::ProjectElementTests::test_group",
+  "tests/test_manifest_xml.py::ProjectElementTests::test_set_revision_id",
+  "tests/test_manifest_xml.py::ProjectElementTests::test_toplevel_path",
+  "tests/test_manifest_xml.py::ProjectElementTests::test_trailing_slash",
+  "tests/test_manifest_xml.py::RemoteElementTests::test_remote",
+  
"tests/test_manifest_xml.py::RemoveProjectElementTests::test_remove_one_optional_project_doesnt_exist",
+  
"tests/test_manifest_xml.py::RemoveProjectElementTests::test_remove_one_project",
+  
"tests/test_manifest_xml.py::RemoveProjectElementTests::test_remove_one_project_doesnt_exist",
+  
"tests/test_manifest_xml.py::RemoveProjectElementTests::test_remove_one_project_one_remains",
+  "tests/test_manifest_xml.py::SuperProjectElementTests::test_defalut_remote",
+  "tests/test_manifest_xml.py::SuperProjectElementTests::test_remote",
+  "tests/test_manifest_xml.py::SuperProjectElementTests::test_superproject",
+  
"tests/test_manifest_xml.py::SuperProjectElementTests::test_superproject_revision",
+  
"tests/test_manifest_xml.py::SuperProjectElementTests::test_superproject_revision_default_negative",
+  
"tests/test_manifest_xml.py::SuperProjectElementTests::test_superproject_revision_remote",
+  "tests/test_manifest_xml.py::ValueTests::test_bool_default",
+  "tests/test_manifest_xml.py::ValueTests::test_bool_false",
+  "tests/test_manifest_xml.py::ValueTests::test_bool_invalid",
+  "tests/test_manifest_xml.py::ValueTests::test_bool_true",
+  "tests/test_manifest_xml.py::ValueTests::test_int_default",
+  "tests/test_manifest_xml.py::ValueTests::test_int_good",
+  "tests/test_manifest_xml.py::ValueTests::test_int_invalid",
+  "tests/test_manifest_xml.py::XmlManifestTests::test_empty",
+  "tests/test_manifest_xml.py::XmlManifestTests::test_link",
+  "tests/test_manifest_xml.py::XmlManifestTests::test_remote_annotations",
+  "tests/test_manifest_xml.py::XmlManifestTests::test_repo_hooks",
+  "tests/test_manifest_xml.py::XmlManifestTests::test_repo_hooks_unordered",
+  "tests/test_manifest_xml.py::XmlManifestTests::test_todict_empty",
+  "tests/test_manifest_xml.py::XmlManifestTests::test_toxml_empty",
+  "tests/test_manifest_xml.py::XmlManifestTests::test_unknown_tags",
+  "tests/test_platform_utils.py::RemoveTests::testMissingOk",
+  "tests/test_project.py::CopyFile::test_basic",
+  "tests/test_project.py::CopyFile::test_dest_block_symlink",
+  "tests/test_project.py::CopyFile::test_dest_block_symlink_traversal",
+  "tests/test_project.py::CopyFile::test_dest_subdir",
+  "tests/test_project.py::CopyFile::test_src_block_copy_from_dir",
+  "tests/test_project.py::CopyFile::test_src_block_copy_to_dir",
+  "tests/test_project.py::CopyFile::test_src_block_symlink",
+  "tests/test_project.py::CopyFile::test_src_block_symlink_traversal",
+  "tests/test_project.py::CopyFile::test_src_subdir",
+  "tests/test_project.py::CopyFile::test_update",
+  "tests/test_project.py::LinkFile::test_basic",
+  "tests/test_project.py::LinkFile::test_dest_subdir",
+  "tests/test_project.py::LinkFile::test_src_block_relative",
+  "tests/test_project.py::LinkFile::test_src_self",
+  "tests/test_project.py::LinkFile::test_src_subdir",
+  "tests/test_project.py::LinkFile::test_update",
+  "tests/test_project.py::MigrateWorkTreeTests::test_standard",
+  "tests/test_project.py::MigrateWorkTreeTests::test_unknown",
+  "tests/test_project.py::ReviewableBranchTests::test_smoke",
+  "tests/test_ssh.py::SshTests::test_context_manager_child_cleanup",
+  "tests/test_ssh.py::SshTests::test_context_manager_empty",
+  "tests/test_ssh.py::SshTests::test_parse_ssh_version",
+  "tests/test_ssh.py::SshTests::test_ssh_sock",
+  "tests/test_ssh.py::SshTests::test_version",
+  "tests/test_subcmds.py::AllCommands::test_help_desc_style",
+  "tests/test_subcmds.py::AllCommands::test_naming",
+  "tests/test_subcmds.py::AllCommands::test_required_basic",
+  "tests/test_subcmds_init.py::InitCommand::test_cli_parser_bad",
+  "tests/test_subcmds_init.py::InitCommand::test_cli_parser_good",
+  "tests/test_wrapper.py::CheckGitVersion::test_new",
+  "tests/test_wrapper.py::CheckGitVersion::test_old",
+  "tests/test_wrapper.py::CheckGitVersion::test_unknown",
+  "tests/test_wrapper.py::CheckRepoRev::test_verify_fails",
+  "tests/test_wrapper.py::CheckRepoRev::test_verify_ignore",
+  "tests/test_wrapper.py::CheckRepoRev::test_verify_works",
+  "tests/test_wrapper.py::CheckRepoVerify::test_gpg_initialized",
+  "tests/test_wrapper.py::CheckRepoVerify::test_need_gpg_setup",
+  "tests/test_wrapper.py::CheckRepoVerify::test_no_verify",
+  "tests/test_wrapper.py::NeedSetupGnuPG::test_empty_keyring",
+  "tests/test_wrapper.py::NeedSetupGnuPG::test_missing_dir",
+  "tests/test_wrapper.py::NeedSetupGnuPG::test_missing_keyring",
+  "tests/test_wrapper.py::NeedSetupGnuPG::test_new_keyring",
+  "tests/test_wrapper.py::NeedSetupGnuPG::test_old_keyring",
+  "tests/test_wrapper.py::ParseGitVersion::test_autoload",
+  "tests/test_wrapper.py::ParseGitVersion::test_bad_ver",
+  "tests/test_wrapper.py::ParseGitVersion::test_extended_ver",
+  "tests/test_wrapper.py::ParseGitVersion::test_normal_ver",
+  "tests/test_wrapper.py::RepoWrapperUnitTest::test_get_gitc_manifest_dir",
+  
"tests/test_wrapper.py::RepoWrapperUnitTest::test_get_gitc_manifest_dir_no_gitc",
+  "tests/test_wrapper.py::RepoWrapperUnitTest::test_gitc_init_parser",
+  "tests/test_wrapper.py::RepoWrapperUnitTest::test_gitc_parse_clientdir",
+  
"tests/test_wrapper.py::RepoWrapperUnitTest::test_gitc_parse_clientdir_no_gitc",
+  "tests/test_wrapper.py::RepoWrapperUnitTest::test_init_parser",
+  "tests/test_wrapper.py::RepoWrapperUnitTest::test_python_constraints",
+  "tests/test_wrapper.py::RepoWrapperUnitTest::test_version",
+  "tests/test_wrapper.py::Requirements::test_assert_all_new_python",
+  "tests/test_wrapper.py::Requirements::test_assert_all_new_repo",
+  "tests/test_wrapper.py::Requirements::test_assert_all_old_python",
+  "tests/test_wrapper.py::Requirements::test_assert_all_old_repo",
+  "tests/test_wrapper.py::Requirements::test_assert_all_unknown",
+  "tests/test_wrapper.py::Requirements::test_assert_ver_new",
+  "tests/test_wrapper.py::Requirements::test_assert_ver_old",
+  "tests/test_wrapper.py::Requirements::test_assert_ver_unknown",
+  "tests/test_wrapper.py::Requirements::test_corrupt_data",
+  "tests/test_wrapper.py::Requirements::test_format_ver",
+  "tests/test_wrapper.py::Requirements::test_missing_file",
+  "tests/test_wrapper.py::Requirements::test_valid_data",
+  "tests/test_wrapper.py::ResolveRepoRev::test_branch_name",
+  "tests/test_wrapper.py::ResolveRepoRev::test_explicit_branch",
+  "tests/test_wrapper.py::ResolveRepoRev::test_explicit_tag",
+  "tests/test_wrapper.py::ResolveRepoRev::test_full_commit",
+  "tests/test_wrapper.py::ResolveRepoRev::test_partial_commit",
+  "tests/test_wrapper.py::ResolveRepoRev::test_tag_name",
+  "tests/test_wrapper.py::ResolveRepoRev::test_unknown",
+  "tests/test_wrapper.py::RunCommand::test_capture",
+  "tests/test_wrapper.py::RunCommand::test_check",
+  "tests/test_wrapper.py::RunGit::test_capture",
+  "tests/test_wrapper.py::RunGit::test_check",
+  "tests/test_wrapper.py::SetGitTrace2ParentSid::test_append",
+  "tests/test_wrapper.py::SetGitTrace2ParentSid::test_first_set",
+  "tests/test_wrapper.py::SetGitTrace2ParentSid::test_global_context",
+  "tests/test_wrapper.py::SetupGnuPG::test_full",
+  "tests/test_wrapper.py::VerifyRev::test_unsigned_commit",
+  "tests/test_wrapper.py::VerifyRev::test_verify_fails",
+  "tests/test_wrapper.py::VerifyRev::test_verify_passes"
+]
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/git-repo-2.20/.pytest_cache/v/cache/stepwise 
new/git-repo-2.21/.pytest_cache/v/cache/stepwise
--- old/git-repo-2.20/.pytest_cache/v/cache/stepwise    1970-01-01 
01:00:00.000000000 +0100
+++ new/git-repo-2.21/.pytest_cache/v/cache/stepwise    2022-01-26 
17:46:03.000000000 +0100
@@ -0,0 +1 @@
+[]
\ No newline at end of file
Binary files old/git-repo-2.20/__pycache__/color.cpython-38.pyc and 
new/git-repo-2.21/__pycache__/color.cpython-38.pyc differ
Binary files old/git-repo-2.20/__pycache__/command.cpython-38.pyc and 
new/git-repo-2.21/__pycache__/command.cpython-38.pyc differ
Binary files old/git-repo-2.20/__pycache__/editor.cpython-38.pyc and 
new/git-repo-2.21/__pycache__/editor.cpython-38.pyc differ
Binary files old/git-repo-2.20/__pycache__/error.cpython-38.pyc and 
new/git-repo-2.21/__pycache__/error.cpython-38.pyc differ
Binary files old/git-repo-2.20/__pycache__/event_log.cpython-38.pyc and 
new/git-repo-2.21/__pycache__/event_log.cpython-38.pyc differ
Binary files old/git-repo-2.20/__pycache__/fetch.cpython-38.pyc and 
new/git-repo-2.21/__pycache__/fetch.cpython-38.pyc differ
Binary files old/git-repo-2.20/__pycache__/git_command.cpython-38.pyc and 
new/git-repo-2.21/__pycache__/git_command.cpython-38.pyc differ
Binary files old/git-repo-2.20/__pycache__/git_config.cpython-38.pyc and 
new/git-repo-2.21/__pycache__/git_config.cpython-38.pyc differ
Binary files old/git-repo-2.20/__pycache__/git_refs.cpython-38.pyc and 
new/git-repo-2.21/__pycache__/git_refs.cpython-38.pyc differ
Binary files old/git-repo-2.20/__pycache__/git_superproject.cpython-38.pyc and 
new/git-repo-2.21/__pycache__/git_superproject.cpython-38.pyc differ
Binary files old/git-repo-2.20/__pycache__/git_trace2_event_log.cpython-38.pyc 
and new/git-repo-2.21/__pycache__/git_trace2_event_log.cpython-38.pyc differ
Binary files old/git-repo-2.20/__pycache__/gitc_utils.cpython-38.pyc and 
new/git-repo-2.21/__pycache__/gitc_utils.cpython-38.pyc differ
Binary files old/git-repo-2.20/__pycache__/hooks.cpython-38.pyc and 
new/git-repo-2.21/__pycache__/hooks.cpython-38.pyc differ
Binary files old/git-repo-2.20/__pycache__/main.cpython-38.pyc and 
new/git-repo-2.21/__pycache__/main.cpython-38.pyc differ
Binary files old/git-repo-2.20/__pycache__/manifest_xml.cpython-38.pyc and 
new/git-repo-2.21/__pycache__/manifest_xml.cpython-38.pyc differ
Binary files old/git-repo-2.20/__pycache__/pager.cpython-38.pyc and 
new/git-repo-2.21/__pycache__/pager.cpython-38.pyc differ
Binary files old/git-repo-2.20/__pycache__/platform_utils.cpython-38.pyc and 
new/git-repo-2.21/__pycache__/platform_utils.cpython-38.pyc differ
Binary files old/git-repo-2.20/__pycache__/progress.cpython-38.pyc and 
new/git-repo-2.21/__pycache__/progress.cpython-38.pyc differ
Binary files old/git-repo-2.20/__pycache__/project.cpython-38.pyc and 
new/git-repo-2.21/__pycache__/project.cpython-38.pyc differ
Binary files old/git-repo-2.20/__pycache__/repo_trace.cpython-38.pyc and 
new/git-repo-2.21/__pycache__/repo_trace.cpython-38.pyc differ
Binary files old/git-repo-2.20/__pycache__/repocpython-38.pyc and 
new/git-repo-2.21/__pycache__/repocpython-38.pyc differ
Binary files old/git-repo-2.20/__pycache__/ssh.cpython-38.pyc and 
new/git-repo-2.21/__pycache__/ssh.cpython-38.pyc differ
Binary files old/git-repo-2.20/__pycache__/wrapper.cpython-38.pyc and 
new/git-repo-2.21/__pycache__/wrapper.cpython-38.pyc differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/git-repo-2.20/docs/internal-fs-layout.md 
new/git-repo-2.21/docs/internal-fs-layout.md
--- old/git-repo-2.20/docs/internal-fs-layout.md        2022-01-10 
18:41:45.000000000 +0100
+++ new/git-repo-2.21/docs/internal-fs-layout.md        2022-01-26 
17:46:03.000000000 +0100
@@ -163,6 +163,7 @@
 | repo.clonefilter         | `--clone-filter`          | Filter setting when 
using [partial git clones] |
 | repo.depth               | `--depth`                 | Create shallow 
checkouts when cloning |
 | repo.dissociate          | `--dissociate`            | Dissociate from any 
reference/mirrors after initial clone |
+| repo.git-lfs             | `--git-lfs`               | Enable [Git LFS] 
support |
 | repo.mirror              | `--mirror`                | Checkout is a repo 
mirror |
 | repo.partialclone        | `--partial-clone`         | Create [partial git 
clones] |
 | repo.partialcloneexclude | `--partial-clone-exclude` | Comma-delimited list 
of project names (not paths) to exclude while using [partial git clones] |
@@ -254,6 +255,7 @@
 
 
 [git-config]: https://git-scm.com/docs/git-config
+[Git LFS]: https://git-lfs.github.com/
 [git worktree]: https://git-scm.com/docs/git-worktree
 [gitsubmodules]: https://git-scm.com/docs/gitsubmodules
 [manifest-format.md]: ./manifest-format.md
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/git-repo-2.20/git_command.py 
new/git-repo-2.21/git_command.py
--- old/git-repo-2.20/git_command.py    2022-01-10 18:41:45.000000000 +0100
+++ new/git-repo-2.21/git_command.py    2022-01-26 17:46:03.000000000 +0100
@@ -169,7 +169,8 @@
                disable_editor=False,
                ssh_proxy=None,
                cwd=None,
-               gitdir=None):
+               gitdir=None,
+               objdir=None):
     env = self._GetBasicEnv()
 
     if disable_editor:
@@ -194,13 +195,24 @@
         cwd = project.worktree
       if not gitdir:
         gitdir = project.gitdir
+    # Git on Windows wants its paths only using / for reliability.
+    if platform_utils.isWindows():
+      if objdir:
+        objdir = objdir.replace('\\', '/')
+      if gitdir:
+        gitdir = gitdir.replace('\\', '/')
+
+    if objdir:
+      # Set to the place we want to save the objects.
+      env['GIT_OBJECT_DIRECTORY'] = objdir
+      if gitdir:
+        # Allow git to search the original place in case of local or unique 
refs
+        # that git will attempt to resolve even if we aren't fetching them.
+        env['GIT_ALTERNATE_OBJECT_DIRECTORIES'] = gitdir + '/objects'
 
     command = [GIT]
     if bare:
       if gitdir:
-        # Git on Windows wants its paths only using / for reliability.
-        if platform_utils.isWindows():
-          gitdir = gitdir.replace('\\', '/')
         env[GIT_DIR] = gitdir
       cwd = None
     command.append(cmdv[0])
@@ -234,6 +246,11 @@
         dbg += ': export GIT_DIR=%s\n' % env[GIT_DIR]
         LAST_GITDIR = env[GIT_DIR]
 
+      if 'GIT_OBJECT_DIRECTORY' in env:
+        dbg += ': export GIT_OBJECT_DIRECTORY=%s\n' % 
env['GIT_OBJECT_DIRECTORY']
+      if 'GIT_ALTERNATE_OBJECT_DIRECTORIES' in env:
+        dbg += ': export GIT_ALTERNATE_OBJECT_DIRECTORIES=%s\n' % 
env['GIT_ALTERNATE_OBJECT_DIRECTORIES']
+
       dbg += ': '
       dbg += ' '.join(command)
       if stdin == subprocess.PIPE:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/git-repo-2.20/manifest_xml.py 
new/git-repo-2.21/manifest_xml.py
--- old/git-repo-2.20/manifest_xml.py   2022-01-10 18:41:45.000000000 +0100
+++ new/git-repo-2.21/manifest_xml.py   2022-01-26 17:46:03.000000000 +0100
@@ -666,6 +666,10 @@
   def HasSubmodules(self):
     return self.manifestProject.config.GetBoolean('repo.submodules')
 
+  @property
+  def EnableGitLfs(self):
+    return self.manifestProject.config.GetBoolean('repo.git-lfs')
+
   def GetDefaultGroupsStr(self):
     """Returns the default group string for the platform."""
     return 'default,platform-' + platform.system().lower()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/git-repo-2.20/project.py new/git-repo-2.21/project.py
--- old/git-repo-2.20/project.py        2022-01-10 18:41:45.000000000 +0100
+++ new/git-repo-2.21/project.py        2022-01-26 17:46:03.000000000 +0100
@@ -1120,7 +1120,7 @@
     self._InitRemote()
 
     if is_new:
-      alt = os.path.join(self.gitdir, 'objects/info/alternates')
+      alt = os.path.join(self.objdir, 'objects/info/alternates')
       try:
         with open(alt) as fd:
           # This works for both absolute and relative alternate directories.
@@ -1169,7 +1169,7 @@
     mp = self.manifest.manifestProject
     dissociate = mp.config.GetBoolean('repo.dissociate')
     if dissociate:
-      alternates_file = os.path.join(self.gitdir, 'objects/info/alternates')
+      alternates_file = os.path.join(self.objdir, 'objects/info/alternates')
       if os.path.exists(alternates_file):
         cmd = ['repack', '-a', '-d']
         p = GitCommand(self, cmd, bare=True, capture_stdout=bool(output_redir),
@@ -2192,8 +2192,10 @@
     retry_cur_sleep = retry_sleep_initial_sec
     ok = prune_tried = False
     for try_n in range(retry_fetches):
-      gitcmd = GitCommand(self, cmd, bare=True, ssh_proxy=ssh_proxy,
-                          merge_output=True, capture_stdout=quiet or 
bool(output_redir))
+      gitcmd = GitCommand(
+          self, cmd, bare=True, objdir=os.path.join(self.objdir, 'objects'),
+          ssh_proxy=ssh_proxy,
+          merge_output=True, capture_stdout=quiet or bool(output_redir))
       if gitcmd.stdout and not quiet and output_redir:
         output_redir.write(gitcmd.stdout)
       ret = gitcmd.Wait()
@@ -2309,7 +2311,8 @@
       cmd.append(str(f))
     cmd.append('+refs/tags/*:refs/tags/*')
 
-    ok = GitCommand(self, cmd, bare=True).Wait() == 0
+    ok = GitCommand(
+        self, cmd, bare=True, objdir=os.path.join(self.objdir, 
'objects')).Wait() == 0
     platform_utils.remove(bundle_dst, missing_ok=True)
     platform_utils.remove(bundle_tmp, missing_ok=True)
     return ok
@@ -2504,8 +2507,8 @@
         if ref_dir or mirror_git:
           if not mirror_git:
             mirror_git = os.path.join(ref_dir, self.name + '.git')
-          repo_git = os.path.join(ref_dir, '.repo', 'projects',
-                                  self.relpath + '.git')
+          repo_git = os.path.join(ref_dir, '.repo', 'project-objects',
+                                  self.name + '.git')
           worktrees_git = os.path.join(ref_dir, '.repo', 'worktrees',
                                        self.name + '.git')
 
@@ -2523,15 +2526,16 @@
               # The alternate directory is relative to the object database.
               ref_dir = os.path.relpath(ref_dir,
                                         os.path.join(self.objdir, 'objects'))
-            _lwrite(os.path.join(self.gitdir, 'objects/info/alternates'),
+            _lwrite(os.path.join(self.objdir, 'objects/info/alternates'),
                     os.path.join(ref_dir, 'objects') + '\n')
 
         m = self.manifest.manifestProject.config
         for key in ['user.name', 'user.email']:
           if m.Has(key, include_defaults=False):
             self.config.SetString(key, m.GetString(key))
-        self.config.SetString('filter.lfs.smudge', 'git-lfs smudge --skip -- 
%f')
-        self.config.SetString('filter.lfs.process', 'git-lfs filter-process 
--skip')
+        if not self.manifest.EnableGitLfs:
+          self.config.SetString('filter.lfs.smudge', 'git-lfs smudge --skip -- 
%f')
+          self.config.SetString('filter.lfs.process', 'git-lfs filter-process 
--skip')
         self.config.SetBoolean('core.bare', True if self.manifest.IsMirror 
else None)
     except Exception:
       if init_obj_dir and os.path.exists(self.objdir):
@@ -2551,7 +2555,10 @@
 
     # Delete sample hooks.  They're noise.
     for hook in glob.glob(os.path.join(hooks, '*.sample')):
-      platform_utils.remove(hook, missing_ok=True)
+      try:
+        platform_utils.remove(hook, missing_ok=True)
+      except PermissionError:
+        pass
 
     for stock_hook in _ProjectHooks():
       name = os.path.basename(stock_hook)
@@ -2813,7 +2820,8 @@
     }
     # Paths that we know will be in both, but are safe to clobber in 
.repo/projects/.
     SAFE_TO_CLOBBER = {
-        'COMMIT_EDITMSG', 'FETCH_HEAD', 'HEAD', 'gitk.cache', 'index', 
'ORIG_HEAD',
+        'COMMIT_EDITMSG', 'FETCH_HEAD', 'HEAD', 'gc.log', 'gitk.cache', 
'index',
+        'ORIG_HEAD',
     }
 
     # First see if we'd succeed before starting the migration.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/git-repo-2.20/repo new/git-repo-2.21/repo
--- old/git-repo-2.20/repo      2022-01-10 18:41:45.000000000 +0100
+++ new/git-repo-2.21/repo      2022-01-26 17:46:03.000000000 +0100
@@ -149,7 +149,7 @@
 BUG_URL = 
'https://bugs.chromium.org/p/gerrit/issues/entry?template=Repo+tool+issue'
 
 # increment this whenever we make important changes to this script
-VERSION = (2, 17)
+VERSION = (2, 21)
 
 # increment this if the MAINTAINER_KEYS block is modified
 KEYRING_VERSION = (2, 3)
@@ -382,6 +382,11 @@
   group.add_option('--no-clone-bundle',
                    dest='clone_bundle', action='store_false',
                    help='disable use of /clone.bundle on HTTP/HTTPS (default 
if --partial-clone)')
+  group.add_option('--git-lfs', action='store_true',
+                   help='enable Git LFS support')
+  group.add_option('--no-git-lfs',
+                   dest='git_lfs', action='store_false',
+                   help='disable Git LFS support')
 
   # Tool.
   group = parser.add_option_group('repo Version options')
@@ -618,6 +623,7 @@
             "REPO_URL set correctly?" % url, file=sys.stderr)
 
   except CloneFailure:
+    print('fatal: double check your --repo-rev setting.', file=sys.stderr)
     if opt.quiet:
       print('fatal: repo init failed; run without --quiet to see why',
             file=sys.stderr)
Binary files old/git-repo-2.20/subcmds/__pycache__/__init__.cpython-38.pyc and 
new/git-repo-2.21/subcmds/__pycache__/__init__.cpython-38.pyc differ
Binary files old/git-repo-2.20/subcmds/__pycache__/abandon.cpython-38.pyc and 
new/git-repo-2.21/subcmds/__pycache__/abandon.cpython-38.pyc differ
Binary files old/git-repo-2.20/subcmds/__pycache__/branches.cpython-38.pyc and 
new/git-repo-2.21/subcmds/__pycache__/branches.cpython-38.pyc differ
Binary files old/git-repo-2.20/subcmds/__pycache__/checkout.cpython-38.pyc and 
new/git-repo-2.21/subcmds/__pycache__/checkout.cpython-38.pyc differ
Binary files old/git-repo-2.20/subcmds/__pycache__/cherry_pick.cpython-38.pyc 
and new/git-repo-2.21/subcmds/__pycache__/cherry_pick.cpython-38.pyc differ
Binary files old/git-repo-2.20/subcmds/__pycache__/diff.cpython-38.pyc and 
new/git-repo-2.21/subcmds/__pycache__/diff.cpython-38.pyc differ
Binary files old/git-repo-2.20/subcmds/__pycache__/diffmanifests.cpython-38.pyc 
and new/git-repo-2.21/subcmds/__pycache__/diffmanifests.cpython-38.pyc differ
Binary files old/git-repo-2.20/subcmds/__pycache__/download.cpython-38.pyc and 
new/git-repo-2.21/subcmds/__pycache__/download.cpython-38.pyc differ
Binary files old/git-repo-2.20/subcmds/__pycache__/forall.cpython-38.pyc and 
new/git-repo-2.21/subcmds/__pycache__/forall.cpython-38.pyc differ
Binary files old/git-repo-2.20/subcmds/__pycache__/gitc_delete.cpython-38.pyc 
and new/git-repo-2.21/subcmds/__pycache__/gitc_delete.cpython-38.pyc differ
Binary files old/git-repo-2.20/subcmds/__pycache__/gitc_init.cpython-38.pyc and 
new/git-repo-2.21/subcmds/__pycache__/gitc_init.cpython-38.pyc differ
Binary files old/git-repo-2.20/subcmds/__pycache__/grep.cpython-38.pyc and 
new/git-repo-2.21/subcmds/__pycache__/grep.cpython-38.pyc differ
Binary files old/git-repo-2.20/subcmds/__pycache__/help.cpython-38.pyc and 
new/git-repo-2.21/subcmds/__pycache__/help.cpython-38.pyc differ
Binary files old/git-repo-2.20/subcmds/__pycache__/info.cpython-38.pyc and 
new/git-repo-2.21/subcmds/__pycache__/info.cpython-38.pyc differ
Binary files old/git-repo-2.20/subcmds/__pycache__/init.cpython-38.pyc and 
new/git-repo-2.21/subcmds/__pycache__/init.cpython-38.pyc differ
Binary files old/git-repo-2.20/subcmds/__pycache__/list.cpython-38.pyc and 
new/git-repo-2.21/subcmds/__pycache__/list.cpython-38.pyc differ
Binary files old/git-repo-2.20/subcmds/__pycache__/manifest.cpython-38.pyc and 
new/git-repo-2.21/subcmds/__pycache__/manifest.cpython-38.pyc differ
Binary files old/git-repo-2.20/subcmds/__pycache__/overview.cpython-38.pyc and 
new/git-repo-2.21/subcmds/__pycache__/overview.cpython-38.pyc differ
Binary files old/git-repo-2.20/subcmds/__pycache__/prune.cpython-38.pyc and 
new/git-repo-2.21/subcmds/__pycache__/prune.cpython-38.pyc differ
Binary files old/git-repo-2.20/subcmds/__pycache__/rebase.cpython-38.pyc and 
new/git-repo-2.21/subcmds/__pycache__/rebase.cpython-38.pyc differ
Binary files old/git-repo-2.20/subcmds/__pycache__/selfupdate.cpython-38.pyc 
and new/git-repo-2.21/subcmds/__pycache__/selfupdate.cpython-38.pyc differ
Binary files old/git-repo-2.20/subcmds/__pycache__/smartsync.cpython-38.pyc and 
new/git-repo-2.21/subcmds/__pycache__/smartsync.cpython-38.pyc differ
Binary files old/git-repo-2.20/subcmds/__pycache__/stage.cpython-38.pyc and 
new/git-repo-2.21/subcmds/__pycache__/stage.cpython-38.pyc differ
Binary files old/git-repo-2.20/subcmds/__pycache__/start.cpython-38.pyc and 
new/git-repo-2.21/subcmds/__pycache__/start.cpython-38.pyc differ
Binary files old/git-repo-2.20/subcmds/__pycache__/status.cpython-38.pyc and 
new/git-repo-2.21/subcmds/__pycache__/status.cpython-38.pyc differ
Binary files old/git-repo-2.20/subcmds/__pycache__/sync.cpython-38.pyc and 
new/git-repo-2.21/subcmds/__pycache__/sync.cpython-38.pyc differ
Binary files old/git-repo-2.20/subcmds/__pycache__/upload.cpython-38.pyc and 
new/git-repo-2.21/subcmds/__pycache__/upload.cpython-38.pyc differ
Binary files old/git-repo-2.20/subcmds/__pycache__/version.cpython-38.pyc and 
new/git-repo-2.21/subcmds/__pycache__/version.cpython-38.pyc differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/git-repo-2.20/subcmds/branches.py 
new/git-repo-2.21/subcmds/branches.py
--- old/git-repo-2.20/subcmds/branches.py       2022-01-10 18:41:45.000000000 
+0100
+++ new/git-repo-2.21/subcmds/branches.py       2022-01-26 17:46:03.000000000 
+0100
@@ -151,7 +151,7 @@
         fmt = out.write
         paths = []
         non_cur_paths = []
-        if i.IsSplitCurrent or (in_cnt < project_cnt - in_cnt):
+        if i.IsSplitCurrent or (in_cnt <= project_cnt - in_cnt):
           in_type = 'in'
           for b in i.projects:
             if not i.IsSplitCurrent or b.current:
@@ -163,9 +163,9 @@
           in_type = 'not in'
           have = set()
           for b in i.projects:
-            have.add(b.project)
+            have.add(b.project.relpath)
           for p in projects:
-            if p not in have:
+            if p.relpath not in have:
               paths.append(p.relpath)
 
         s = ' %s %s' % (in_type, ', '.join(paths))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/git-repo-2.20/subcmds/init.py 
new/git-repo-2.21/subcmds/init.py
--- old/git-repo-2.20/subcmds/init.py   2022-01-10 18:41:45.000000000 +0100
+++ new/git-repo-2.21/subcmds/init.py   2022-01-26 17:46:03.000000000 +0100
@@ -291,6 +291,15 @@
     if opt.submodules:
       m.config.SetBoolean('repo.submodules', opt.submodules)
 
+    if opt.git_lfs is not None:
+      if opt.git_lfs:
+        git_require((2, 17, 0), fail=True, msg='Git LFS support')
+
+      m.config.SetBoolean('repo.git-lfs', opt.git_lfs)
+      if not is_new:
+        print('warning: Changing --git-lfs settings will only affect new 
project checkouts.\n'
+              '         Existing projects will require manual updates.\n', 
file=sys.stderr)
+
     if opt.use_superproject is not None:
       m.config.SetBoolean('repo.superproject', opt.use_superproject)
 
@@ -520,8 +529,12 @@
     # Handle new --repo-rev requests.
     if opt.repo_rev:
       wrapper = Wrapper()
-      remote_ref, rev = wrapper.check_repo_rev(
-          rp.gitdir, opt.repo_rev, repo_verify=opt.repo_verify, 
quiet=opt.quiet)
+      try:
+        remote_ref, rev = wrapper.check_repo_rev(
+            rp.gitdir, opt.repo_rev, repo_verify=opt.repo_verify, 
quiet=opt.quiet)
+      except wrapper.CloneFailure:
+        print('fatal: double check your --repo-rev setting.', file=sys.stderr)
+        sys.exit(1)
       branch = rp.GetBranch('default')
       branch.merge = remote_ref
       rp.work_git.reset('--hard', rev)
Binary files 
old/git-repo-2.20/tests/__pycache__/test_editor.cpython-38-pytest-6.2.5.pyc and 
new/git-repo-2.21/tests/__pycache__/test_editor.cpython-38-pytest-6.2.5.pyc 
differ
Binary files 
old/git-repo-2.20/tests/__pycache__/test_error.cpython-38-pytest-6.2.5.pyc and 
new/git-repo-2.21/tests/__pycache__/test_error.cpython-38-pytest-6.2.5.pyc 
differ
Binary files 
old/git-repo-2.20/tests/__pycache__/test_git_command.cpython-38-pytest-6.2.5.pyc
 and 
new/git-repo-2.21/tests/__pycache__/test_git_command.cpython-38-pytest-6.2.5.pyc
 differ
Binary files 
old/git-repo-2.20/tests/__pycache__/test_git_config.cpython-38-pytest-6.2.5.pyc 
and 
new/git-repo-2.21/tests/__pycache__/test_git_config.cpython-38-pytest-6.2.5.pyc 
differ
Binary files 
old/git-repo-2.20/tests/__pycache__/test_git_superproject.cpython-38-pytest-6.2.5.pyc
 and 
new/git-repo-2.21/tests/__pycache__/test_git_superproject.cpython-38-pytest-6.2.5.pyc
 differ
Binary files 
old/git-repo-2.20/tests/__pycache__/test_git_trace2_event_log.cpython-38-pytest-6.2.5.pyc
 and 
new/git-repo-2.21/tests/__pycache__/test_git_trace2_event_log.cpython-38-pytest-6.2.5.pyc
 differ
Binary files 
old/git-repo-2.20/tests/__pycache__/test_hooks.cpython-38-pytest-6.2.5.pyc and 
new/git-repo-2.21/tests/__pycache__/test_hooks.cpython-38-pytest-6.2.5.pyc 
differ
Binary files 
old/git-repo-2.20/tests/__pycache__/test_manifest_xml.cpython-38-pytest-6.2.5.pyc
 and 
new/git-repo-2.21/tests/__pycache__/test_manifest_xml.cpython-38-pytest-6.2.5.pyc
 differ
Binary files 
old/git-repo-2.20/tests/__pycache__/test_platform_utils.cpython-38-pytest-6.2.5.pyc
 and 
new/git-repo-2.21/tests/__pycache__/test_platform_utils.cpython-38-pytest-6.2.5.pyc
 differ
Binary files 
old/git-repo-2.20/tests/__pycache__/test_project.cpython-38-pytest-6.2.5.pyc 
and 
new/git-repo-2.21/tests/__pycache__/test_project.cpython-38-pytest-6.2.5.pyc 
differ
Binary files 
old/git-repo-2.20/tests/__pycache__/test_ssh.cpython-38-pytest-6.2.5.pyc and 
new/git-repo-2.21/tests/__pycache__/test_ssh.cpython-38-pytest-6.2.5.pyc differ
Binary files 
old/git-repo-2.20/tests/__pycache__/test_subcmds.cpython-38-pytest-6.2.5.pyc 
and 
new/git-repo-2.21/tests/__pycache__/test_subcmds.cpython-38-pytest-6.2.5.pyc 
differ
Binary files 
old/git-repo-2.20/tests/__pycache__/test_subcmds_init.cpython-38-pytest-6.2.5.pyc
 and 
new/git-repo-2.21/tests/__pycache__/test_subcmds_init.cpython-38-pytest-6.2.5.pyc
 differ
Binary files 
old/git-repo-2.20/tests/__pycache__/test_wrapper.cpython-38-pytest-6.2.5.pyc 
and 
new/git-repo-2.21/tests/__pycache__/test_wrapper.cpython-38-pytest-6.2.5.pyc 
differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/git-repo-2.20/tests/fixtures/.repo_not.present.gitconfig.json 
new/git-repo-2.21/tests/fixtures/.repo_not.present.gitconfig.json
--- old/git-repo-2.20/tests/fixtures/.repo_not.present.gitconfig.json   
1970-01-01 01:00:00.000000000 +0100
+++ new/git-repo-2.21/tests/fixtures/.repo_not.present.gitconfig.json   
2022-01-26 17:46:03.000000000 +0100
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/git-repo-2.20/tests/fixtures/.repo_test.gitconfig.json 
new/git-repo-2.21/tests/fixtures/.repo_test.gitconfig.json
--- old/git-repo-2.20/tests/fixtures/.repo_test.gitconfig.json  1970-01-01 
01:00:00.000000000 +0100
+++ new/git-repo-2.21/tests/fixtures/.repo_test.gitconfig.json  2022-01-26 
17:46:03.000000000 +0100
@@ -0,0 +1,38 @@
+{
+  "section.empty": [
+    null
+  ],
+  "section.nonempty": [
+    "true"
+  ],
+  "section.boolinvalid": [
+    "oops"
+  ],
+  "section.booltrue": [
+    "true"
+  ],
+  "section.boolfalse": [
+    "false"
+  ],
+  "section.intinvalid": [
+    "oops"
+  ],
+  "section.inthex": [
+    "0x10"
+  ],
+  "section.inthexk": [
+    "0x10k"
+  ],
+  "section.int": [
+    "10"
+  ],
+  "section.intk": [
+    "10k"
+  ],
+  "section.intm": [
+    "10m"
+  ],
+  "section.intg": [
+    "10g"
+  ]
+}
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/git-repo-2.20/tests/test_project.py 
new/git-repo-2.21/tests/test_project.py
--- old/git-repo-2.20/tests/test_project.py     2022-01-10 18:41:45.000000000 
+0100
+++ new/git-repo-2.21/tests/test_project.py     2022-01-26 17:46:03.000000000 
+0100
@@ -382,7 +382,7 @@
 
       # Make sure the dir was transformed into a symlink.
       self.assertTrue(dotgit.is_symlink())
-      self.assertEqual(str(dotgit.readlink()), 
'../../.repo/projects/src/test.git')
+      self.assertEqual(os.readlink(dotgit), 
'../../.repo/projects/src/test.git')
 
       # Make sure files were moved over.
       gitdir = tempdir / '.repo/projects/src/test.git'

++++++ git-repo.obsinfo ++++++
--- /var/tmp/diff_new_pack.IIhTaY/_old  2022-02-11 23:12:15.655440796 +0100
+++ /var/tmp/diff_new_pack.IIhTaY/_new  2022-02-11 23:12:15.659440807 +0100
@@ -1,5 +1,5 @@
 name: git-repo
-version: 2.20
-mtime: 1641836505
-commit: 98bb76577d9e7e0ffdeb643f1654ec006f6bbc8c
+version: 2.21
+mtime: 1643215563
+commit: 8e91248655acf1c8044ed8c1b265b804a99eb07f
 

Reply via email to