diff options
author | Josip Sokcevic <sokcevic@google.com> | 2024-02-29 09:48:37 -0800 |
---|---|---|
committer | LUCI <gerrit-scoped@luci-project-accounts.iam.gserviceaccount.com> | 2024-03-07 17:21:51 +0000 |
commit | edadb25c0270398e9afa3eb0093d6b94aa51c3f4 (patch) | |
tree | 93632765156d4aa4b5c64cbab38af8d4d3ac3736 | |
parent | 96edb9b573d6c58b1990090c467ce0c2809bc0b1 (diff) | |
download | git-repo-edadb25c0270398e9afa3eb0093d6b94aa51c3f4.tar.gz |
sync: introduce --force-checkoutv2.43
In some cases (e.g. in a CI system), it's desirable to be able to
instruct repo to force checkout. This flag passes --force flag to `git
checkout` operations.
Bug: b/327624021
Change-Id: I579edda546fb8147c4e1a267e2605fcf6e597421
Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/411518
Commit-Queue: Josip Sokcevic <sokcevic@google.com>
Reviewed-by: Gavin Mak <gavinmak@google.com>
Reviewed-by: George Engelbrecht <engeg@google.com>
Tested-by: Josip Sokcevic <sokcevic@google.com>
-rw-r--r-- | project.py | 7 | ||||
-rw-r--r-- | subcmds/sync.py | 29 |
2 files changed, 31 insertions, 5 deletions
@@ -1515,6 +1515,7 @@ class Project: | |||
1515 | self, | 1515 | self, |
1516 | syncbuf, | 1516 | syncbuf, |
1517 | force_sync=False, | 1517 | force_sync=False, |
1518 | force_checkout=False, | ||
1518 | submodules=False, | 1519 | submodules=False, |
1519 | errors=None, | 1520 | errors=None, |
1520 | verbose=False, | 1521 | verbose=False, |
@@ -1602,7 +1603,7 @@ class Project: | |||
1602 | syncbuf.info(self, "discarding %d commits", len(lost)) | 1603 | syncbuf.info(self, "discarding %d commits", len(lost)) |
1603 | 1604 | ||
1604 | try: | 1605 | try: |
1605 | self._Checkout(revid, quiet=True) | 1606 | self._Checkout(revid, force_checkout=force_checkout, quiet=True) |
1606 | if submodules: | 1607 | if submodules: |
1607 | self._SyncSubmodules(quiet=True) | 1608 | self._SyncSubmodules(quiet=True) |
1608 | except GitError as e: | 1609 | except GitError as e: |
@@ -2857,10 +2858,12 @@ class Project: | |||
2857 | except OSError: | 2858 | except OSError: |
2858 | return False | 2859 | return False |
2859 | 2860 | ||
2860 | def _Checkout(self, rev, quiet=False): | 2861 | def _Checkout(self, rev, force_checkout=False, quiet=False): |
2861 | cmd = ["checkout"] | 2862 | cmd = ["checkout"] |
2862 | if quiet: | 2863 | if quiet: |
2863 | cmd.append("-q") | 2864 | cmd.append("-q") |
2865 | if force_checkout: | ||
2866 | cmd.append("-f") | ||
2864 | cmd.append(rev) | 2867 | cmd.append(rev) |
2865 | cmd.append("--") | 2868 | cmd.append("--") |
2866 | if GitCommand(self, cmd).Wait() != 0: | 2869 | if GitCommand(self, cmd).Wait() != 0: |
diff --git a/subcmds/sync.py b/subcmds/sync.py index c6682a5b..7acb6e5b 100644 --- a/subcmds/sync.py +++ b/subcmds/sync.py | |||
@@ -278,6 +278,11 @@ directories if they have previously been linked to a different | |||
278 | object directory. WARNING: This may cause data to be lost since | 278 | object directory. WARNING: This may cause data to be lost since |
279 | refs may be removed when overwriting. | 279 | refs may be removed when overwriting. |
280 | 280 | ||
281 | The --force-checkout option can be used to force git to switch revs even if the | ||
282 | index or the working tree differs from HEAD, and if there are untracked files. | ||
283 | WARNING: This may cause data to be lost since uncommitted changes may be | ||
284 | removed. | ||
285 | |||
281 | The --force-remove-dirty option can be used to remove previously used | 286 | The --force-remove-dirty option can be used to remove previously used |
282 | projects with uncommitted changes. WARNING: This may cause data to be | 287 | projects with uncommitted changes. WARNING: This may cause data to be |
283 | lost since uncommitted changes may be removed with projects that no longer | 288 | lost since uncommitted changes may be removed with projects that no longer |
@@ -376,6 +381,14 @@ later is required to fix a server side protocol bug. | |||
376 | "may cause loss of data", | 381 | "may cause loss of data", |
377 | ) | 382 | ) |
378 | p.add_option( | 383 | p.add_option( |
384 | "--force-checkout", | ||
385 | dest="force_checkout", | ||
386 | action="store_true", | ||
387 | help="force checkout even if it results in throwing away " | ||
388 | "uncommitted modifications. " | ||
389 | "WARNING: this may cause loss of data", | ||
390 | ) | ||
391 | p.add_option( | ||
379 | "--force-remove-dirty", | 392 | "--force-remove-dirty", |
380 | dest="force_remove_dirty", | 393 | dest="force_remove_dirty", |
381 | action="store_true", | 394 | action="store_true", |
@@ -991,12 +1004,17 @@ later is required to fix a server side protocol bug. | |||
991 | 1004 | ||
992 | return _FetchMainResult(all_projects) | 1005 | return _FetchMainResult(all_projects) |
993 | 1006 | ||
994 | def _CheckoutOne(self, detach_head, force_sync, verbose, project): | 1007 | def _CheckoutOne( |
1008 | self, detach_head, force_sync, force_checkout, verbose, project | ||
1009 | ): | ||
995 | """Checkout work tree for one project | 1010 | """Checkout work tree for one project |
996 | 1011 | ||
997 | Args: | 1012 | Args: |
998 | detach_head: Whether to leave a detached HEAD. | 1013 | detach_head: Whether to leave a detached HEAD. |
999 | force_sync: Force checking out of the repo. | 1014 | force_sync: Force checking out of .git directory (e.g. overwrite |
1015 | existing git directory that was previously linked to a different | ||
1016 | object directory). | ||
1017 | force_checkout: Force checking out of the repo content. | ||
1000 | verbose: Whether to show verbose messages. | 1018 | verbose: Whether to show verbose messages. |
1001 | project: Project object for the project to checkout. | 1019 | project: Project object for the project to checkout. |
1002 | 1020 | ||
@@ -1011,7 +1029,11 @@ later is required to fix a server side protocol bug. | |||
1011 | errors = [] | 1029 | errors = [] |
1012 | try: | 1030 | try: |
1013 | project.Sync_LocalHalf( | 1031 | project.Sync_LocalHalf( |
1014 | syncbuf, force_sync=force_sync, errors=errors, verbose=verbose | 1032 | syncbuf, |
1033 | force_sync=force_sync, | ||
1034 | force_checkout=force_checkout, | ||
1035 | errors=errors, | ||
1036 | verbose=verbose, | ||
1015 | ) | 1037 | ) |
1016 | success = syncbuf.Finish() | 1038 | success = syncbuf.Finish() |
1017 | except GitError as e: | 1039 | except GitError as e: |
@@ -1082,6 +1104,7 @@ later is required to fix a server side protocol bug. | |||
1082 | self._CheckoutOne, | 1104 | self._CheckoutOne, |
1083 | opt.detach_head, | 1105 | opt.detach_head, |
1084 | opt.force_sync, | 1106 | opt.force_sync, |
1107 | opt.force_checkout, | ||
1085 | opt.verbose, | 1108 | opt.verbose, |
1086 | ), | 1109 | ), |
1087 | projects, | 1110 | projects, |