diff options
Diffstat (limited to 'project.py')
| -rw-r--r-- | project.py | 196 |
1 files changed, 105 insertions, 91 deletions
diff --git a/project.py b/project.py index 2bde23f3f..13361d1e3 100644 --- a/project.py +++ b/project.py | |||
| @@ -40,13 +40,7 @@ from git_config import GetSchemeFromUrl | |||
| 40 | from git_config import GetUrlCookieFile | 40 | from git_config import GetUrlCookieFile |
| 41 | from git_config import GitConfig | 41 | from git_config import GitConfig |
| 42 | from git_config import IsId | 42 | from git_config import IsId |
| 43 | from git_refs import GitRefs | 43 | import git_refs |
| 44 | from git_refs import HEAD | ||
| 45 | from git_refs import R_HEADS | ||
| 46 | from git_refs import R_M | ||
| 47 | from git_refs import R_PUB | ||
| 48 | from git_refs import R_TAGS | ||
| 49 | from git_refs import R_WORKTREE_M | ||
| 50 | import git_status | 44 | import git_status |
| 51 | import git_superproject | 45 | import git_superproject |
| 52 | from git_trace2_event_log import EventLog | 46 | from git_trace2_event_log import EventLog |
| @@ -209,7 +203,7 @@ class ReviewableBranch: | |||
| 209 | "--reverse", | 203 | "--reverse", |
| 210 | "--date-order", | 204 | "--date-order", |
| 211 | not_rev(self.base), | 205 | not_rev(self.base), |
| 212 | R_HEADS + self.name, | 206 | git_refs.R_HEADS + self.name, |
| 213 | "--", | 207 | "--", |
| 214 | ) | 208 | ) |
| 215 | try: | 209 | try: |
| @@ -232,7 +226,7 @@ class ReviewableBranch: | |||
| 232 | def unabbrev_commits(self): | 226 | def unabbrev_commits(self): |
| 233 | r = {} | 227 | r = {} |
| 234 | for commit in self.project.bare_git.rev_list( | 228 | for commit in self.project.bare_git.rev_list( |
| 235 | not_rev(self.base), R_HEADS + self.name, "--" | 229 | not_rev(self.base), git_refs.R_HEADS + self.name, "--" |
| 236 | ): | 230 | ): |
| 237 | r[commit[0:8]] = commit | 231 | r[commit[0:8]] = commit |
| 238 | return r | 232 | return r |
| @@ -240,13 +234,17 @@ class ReviewableBranch: | |||
| 240 | @property | 234 | @property |
| 241 | def date(self): | 235 | def date(self): |
| 242 | return self.project.bare_git.log( | 236 | return self.project.bare_git.log( |
| 243 | "--pretty=format:%cd", "-n", "1", R_HEADS + self.name, "--" | 237 | "--pretty=format:%cd", |
| 238 | "-n", | ||
| 239 | "1", | ||
| 240 | git_refs.R_HEADS + self.name, | ||
| 241 | "--", | ||
| 244 | ) | 242 | ) |
| 245 | 243 | ||
| 246 | @property | 244 | @property |
| 247 | def modified_files(self) -> List[str]: | 245 | def modified_files(self) -> List[str]: |
| 248 | return self.project.bare_git.diff( | 246 | return self.project.bare_git.diff( |
| 249 | "--name-only", f"{self.base}...{R_HEADS}{self.name}" | 247 | "--name-only", f"{self.base}...{git_refs.R_HEADS}{self.name}" |
| 250 | ).splitlines() | 248 | ).splitlines() |
| 251 | 249 | ||
| 252 | @property | 250 | @property |
| @@ -747,7 +745,7 @@ class Project: | |||
| 747 | else: | 745 | else: |
| 748 | self.work_git = None | 746 | self.work_git = None |
| 749 | self.bare_git = self._GitGetByExec(self, bare=True, gitdir=self.gitdir) | 747 | self.bare_git = self._GitGetByExec(self, bare=True, gitdir=self.gitdir) |
| 750 | self.bare_ref = GitRefs(self.gitdir) | 748 | self.bare_ref = git_refs.GitRefs(self.gitdir) |
| 751 | self.bare_objdir = self._GitGetByExec( | 749 | self.bare_objdir = self._GitGetByExec( |
| 752 | self, bare=True, gitdir=self.objdir | 750 | self, bare=True, gitdir=self.objdir |
| 753 | ) | 751 | ) |
| @@ -784,8 +782,8 @@ class Project: | |||
| 784 | # If the local checkout is in a bad state, don't barf. Let the | 782 | # If the local checkout is in a bad state, don't barf. Let the |
| 785 | # callers process this like the head is unreadable. | 783 | # callers process this like the head is unreadable. |
| 786 | return None | 784 | return None |
| 787 | if b and b.startswith(R_HEADS): | 785 | if b and b.startswith(git_refs.R_HEADS): |
| 788 | return b[len(R_HEADS) :] | 786 | return b[len(git_refs.R_HEADS) :] |
| 789 | return None | 787 | return None |
| 790 | 788 | ||
| 791 | def _GetHead(self) -> Optional[str]: | 789 | def _GetHead(self) -> Optional[str]: |
| @@ -916,7 +914,7 @@ class Project: | |||
| 916 | def _IsDirtyLegacy(self, consider_untracked: bool = True) -> bool: | 914 | def _IsDirtyLegacy(self, consider_untracked: bool = True) -> bool: |
| 917 | """Check dirty state with plumbing supported by older Git.""" | 915 | """Check dirty state with plumbing supported by older Git.""" |
| 918 | self._RefreshIndexStatCache() | 916 | self._RefreshIndexStatCache() |
| 919 | if self.work_git.DiffZ("diff-index", "-M", "--cached", HEAD): | 917 | if self.work_git.DiffZ("diff-index", "-M", "--cached", git_refs.HEAD): |
| 920 | return True | 918 | return True |
| 921 | if self.work_git.DiffZ("diff-files"): | 919 | if self.work_git.DiffZ("diff-files"): |
| 922 | return True | 920 | return True |
| @@ -965,7 +963,7 @@ class Project: | |||
| 965 | # The snapshot already failed; don't run git status again. | 963 | # The snapshot already failed; don't run git status again. |
| 966 | is_dirty = self._IsDirtyLegacy(consider_untracked=True) | 964 | is_dirty = self._IsDirtyLegacy(consider_untracked=True) |
| 967 | try: | 965 | try: |
| 968 | head = self.work_git.rev_parse(HEAD) | 966 | head = self.work_git.rev_parse(git_refs.HEAD) |
| 969 | except error.GitError: | 967 | except error.GitError: |
| 970 | head = None | 968 | head = None |
| 971 | return is_dirty, head | 969 | return is_dirty, head |
| @@ -1019,8 +1017,8 @@ class Project: | |||
| 1019 | heads = {} | 1017 | heads = {} |
| 1020 | 1018 | ||
| 1021 | for name, ref_id in all_refs.items(): | 1019 | for name, ref_id in all_refs.items(): |
| 1022 | if name.startswith(R_HEADS): | 1020 | if name.startswith(git_refs.R_HEADS): |
| 1023 | name = name[len(R_HEADS) :] | 1021 | name = name[len(git_refs.R_HEADS) :] |
| 1024 | b = self.GetBranch(name) | 1022 | b = self.GetBranch(name) |
| 1025 | b.current = name == current | 1023 | b.current = name == current |
| 1026 | b.published = None | 1024 | b.published = None |
| @@ -1028,8 +1026,8 @@ class Project: | |||
| 1028 | heads[name] = b | 1026 | heads[name] = b |
| 1029 | 1027 | ||
| 1030 | for name, ref_id in all_refs.items(): | 1028 | for name, ref_id in all_refs.items(): |
| 1031 | if name.startswith(R_PUB): | 1029 | if name.startswith(git_refs.R_PUB): |
| 1032 | name = name[len(R_PUB) :] | 1030 | name = name[len(git_refs.R_PUB) :] |
| 1033 | b = heads.get(name) | 1031 | b = heads.get(name) |
| 1034 | if b: | 1032 | if b: |
| 1035 | b.published = ref_id | 1033 | b.published = ref_id |
| @@ -1120,7 +1118,9 @@ class Project: | |||
| 1120 | if not get_all: | 1118 | if not get_all: |
| 1121 | return details | 1119 | return details |
| 1122 | 1120 | ||
| 1123 | changes = self.work_git.DiffZ("diff-index", "--cached", HEAD).keys() | 1121 | changes = self.work_git.DiffZ( |
| 1122 | "diff-index", "--cached", git_refs.HEAD | ||
| 1123 | ).keys() | ||
| 1124 | if changes: | 1124 | if changes: |
| 1125 | details.extend(changes) | 1125 | details.extend(changes) |
| 1126 | if not get_all: | 1126 | if not get_all: |
| @@ -1209,7 +1209,7 @@ class Project: | |||
| 1209 | """Render status using plumbing supported by older Git.""" | 1209 | """Render status using plumbing supported by older Git.""" |
| 1210 | self._RefreshIndexStatCache() | 1210 | self._RefreshIndexStatCache() |
| 1211 | rb = self.IsRebaseInProgress() | 1211 | rb = self.IsRebaseInProgress() |
| 1212 | di = self.work_git.DiffZ("diff-index", "-M", "--cached", HEAD) | 1212 | di = self.work_git.DiffZ("diff-index", "-M", "--cached", git_refs.HEAD) |
| 1213 | df = self.work_git.DiffZ("diff-files") | 1213 | df = self.work_git.DiffZ("diff-files") |
| 1214 | do = self.work_git.LsOthers() | 1214 | do = self.work_git.LsOthers() |
| 1215 | if quiet and (rb or di or df or do): | 1215 | if quiet and (rb or di or df or do): |
| @@ -1243,7 +1243,7 @@ class Project: | |||
| 1243 | left_right = self.work_git.rev_list( | 1243 | left_right = self.work_git.rev_list( |
| 1244 | "--left-right", | 1244 | "--left-right", |
| 1245 | "--count", | 1245 | "--count", |
| 1246 | f"{local_merge}...{R_HEADS}{branch_name}", | 1246 | f"{local_merge}...{git_refs.R_HEADS}{branch_name}", |
| 1247 | ) | 1247 | ) |
| 1248 | left, right = left_right[0].split() | 1248 | left, right = left_right[0].split() |
| 1249 | behind = int(left) | 1249 | behind = int(left) |
| @@ -1366,7 +1366,7 @@ class Project: | |||
| 1366 | cmd = ["diff"] | 1366 | cmd = ["diff"] |
| 1367 | if out.is_on: | 1367 | if out.is_on: |
| 1368 | cmd.append("--color") | 1368 | cmd.append("--color") |
| 1369 | cmd.append(HEAD) | 1369 | cmd.append(git_refs.HEAD) |
| 1370 | if absolute_paths: | 1370 | if absolute_paths: |
| 1371 | cmd.append("--src-prefix=a/%s/" % self.RelPath(local)) | 1371 | cmd.append("--src-prefix=a/%s/" % self.RelPath(local)) |
| 1372 | cmd.append("--dst-prefix=b/%s/" % self.RelPath(local)) | 1372 | cmd.append("--dst-prefix=b/%s/" % self.RelPath(local)) |
| @@ -1395,7 +1395,7 @@ class Project: | |||
| 1395 | If so, returns the SHA-1 hash of the last published | 1395 | If so, returns the SHA-1 hash of the last published |
| 1396 | state for the branch. | 1396 | state for the branch. |
| 1397 | """ | 1397 | """ |
| 1398 | key = R_PUB + branch | 1398 | key = git_refs.R_PUB + branch |
| 1399 | if all_refs is None: | 1399 | if all_refs is None: |
| 1400 | try: | 1400 | try: |
| 1401 | return self.bare_git.rev_parse(key) | 1401 | return self.bare_git.rev_parse(key) |
| @@ -1414,14 +1414,14 @@ class Project: | |||
| 1414 | heads = set() | 1414 | heads = set() |
| 1415 | canrm = {} | 1415 | canrm = {} |
| 1416 | for name, ref_id in all_refs.items(): | 1416 | for name, ref_id in all_refs.items(): |
| 1417 | if name.startswith(R_HEADS): | 1417 | if name.startswith(git_refs.R_HEADS): |
| 1418 | heads.add(name) | 1418 | heads.add(name) |
| 1419 | elif name.startswith(R_PUB): | 1419 | elif name.startswith(git_refs.R_PUB): |
| 1420 | canrm[name] = ref_id | 1420 | canrm[name] = ref_id |
| 1421 | 1421 | ||
| 1422 | for name, ref_id in canrm.items(): | 1422 | for name, ref_id in canrm.items(): |
| 1423 | n = name[len(R_PUB) :] | 1423 | n = name[len(git_refs.R_PUB) :] |
| 1424 | if R_HEADS + n not in heads: | 1424 | if git_refs.R_HEADS + n not in heads: |
| 1425 | self.bare_git.DeleteRef(name, ref_id) | 1425 | self.bare_git.DeleteRef(name, ref_id) |
| 1426 | 1426 | ||
| 1427 | def GetUploadableBranches(self, selected_branch=None): | 1427 | def GetUploadableBranches(self, selected_branch=None): |
| @@ -1430,10 +1430,10 @@ class Project: | |||
| 1430 | branch = self.GetBranch(selected_branch) | 1430 | branch = self.GetBranch(selected_branch) |
| 1431 | if not branch.LocalMerge: | 1431 | if not branch.LocalMerge: |
| 1432 | return [] | 1432 | return [] |
| 1433 | head_id = self.bare_ref.get(R_HEADS + selected_branch) | 1433 | head_id = self.bare_ref.get(git_refs.R_HEADS + selected_branch) |
| 1434 | if not head_id: | 1434 | if not head_id: |
| 1435 | return [] | 1435 | return [] |
| 1436 | pub_id = self.bare_ref.get(R_PUB + selected_branch) | 1436 | pub_id = self.bare_ref.get(git_refs.R_PUB + selected_branch) |
| 1437 | if pub_id and pub_id == head_id: | 1437 | if pub_id and pub_id == head_id: |
| 1438 | return [] | 1438 | return [] |
| 1439 | rb = self.GetUploadableBranch(selected_branch) | 1439 | rb = self.GetUploadableBranch(selected_branch) |
| @@ -1520,8 +1520,8 @@ class Project: | |||
| 1520 | dest_branch = self.dest_branch | 1520 | dest_branch = self.dest_branch |
| 1521 | if dest_branch is None: | 1521 | if dest_branch is None: |
| 1522 | dest_branch = branch.merge | 1522 | dest_branch = branch.merge |
| 1523 | if not dest_branch.startswith(R_HEADS): | 1523 | if not dest_branch.startswith(git_refs.R_HEADS): |
| 1524 | dest_branch = R_HEADS + dest_branch | 1524 | dest_branch = git_refs.R_HEADS + dest_branch |
| 1525 | 1525 | ||
| 1526 | if not branch.remote.projectname: | 1526 | if not branch.remote.projectname: |
| 1527 | branch.remote.projectname = self.name | 1527 | branch.remote.projectname = self.name |
| @@ -1550,10 +1550,10 @@ class Project: | |||
| 1550 | 1550 | ||
| 1551 | cmd.append(url) | 1551 | cmd.append(url) |
| 1552 | 1552 | ||
| 1553 | if dest_branch.startswith(R_HEADS): | 1553 | if dest_branch.startswith(git_refs.R_HEADS): |
| 1554 | dest_branch = dest_branch[len(R_HEADS) :] | 1554 | dest_branch = dest_branch[len(git_refs.R_HEADS) :] |
| 1555 | 1555 | ||
| 1556 | ref_spec = f"{R_HEADS + branch.name}:refs/for/{dest_branch}" | 1556 | ref_spec = f"{git_refs.R_HEADS + branch.name}:refs/for/{dest_branch}" |
| 1557 | opts = [] | 1557 | opts = [] |
| 1558 | if topic is not None: | 1558 | if topic is not None: |
| 1559 | opts += [f"topic={topic}"] | 1559 | opts += [f"topic={topic}"] |
| @@ -1607,7 +1607,9 @@ class Project: | |||
| 1607 | if not dryrun: | 1607 | if not dryrun: |
| 1608 | msg = f"posted to {branch.remote.review} for {dest_branch}" | 1608 | msg = f"posted to {branch.remote.review} for {dest_branch}" |
| 1609 | self.bare_git.UpdateRef( | 1609 | self.bare_git.UpdateRef( |
| 1610 | R_PUB + branch.name, R_HEADS + branch.name, message=msg | 1610 | git_refs.R_PUB + branch.name, |
| 1611 | git_refs.R_HEADS + branch.name, | ||
| 1612 | message=msg, | ||
| 1611 | ) | 1613 | ) |
| 1612 | 1614 | ||
| 1613 | @staticmethod | 1615 | @staticmethod |
| @@ -2020,7 +2022,9 @@ class Project: | |||
| 2020 | """Get revisionId of a commit.""" | 2022 | """Get revisionId of a commit.""" |
| 2021 | if self.revisionId: | 2023 | if self.revisionId: |
| 2022 | return self.revisionId | 2024 | return self.revisionId |
| 2023 | if all_refs is None and not self.revisionExpr.startswith(R_TAGS): | 2025 | if all_refs is None and not self.revisionExpr.startswith( |
| 2026 | git_refs.R_TAGS | ||
| 2027 | ): | ||
| 2024 | all_refs = self._allrefs | 2028 | all_refs = self._allrefs |
| 2025 | return self.GetRevisionId(all_refs) | 2029 | return self.GetRevisionId(all_refs) |
| 2026 | 2030 | ||
| @@ -2031,7 +2035,7 @@ class Project: | |||
| 2031 | """ | 2035 | """ |
| 2032 | if self.work_git: | 2036 | if self.work_git: |
| 2033 | if not self.use_git_worktrees and self.bare_ref.is_loaded: | 2037 | if not self.use_git_worktrees and self.bare_ref.is_loaded: |
| 2034 | head = self.bare_ref.get(HEAD) | 2038 | head = self.bare_ref.get(git_refs.HEAD) |
| 2035 | if head: | 2039 | if head: |
| 2036 | return head | 2040 | return head |
| 2037 | try: | 2041 | try: |
| @@ -2052,7 +2056,7 @@ class Project: | |||
| 2052 | # so GetRevisionId always returns a commit SHA. | 2056 | # so GetRevisionId always returns a commit SHA. |
| 2053 | if ( | 2057 | if ( |
| 2054 | all_refs is not None | 2058 | all_refs is not None |
| 2055 | and not rev.startswith(R_TAGS) | 2059 | and not rev.startswith(git_refs.R_TAGS) |
| 2056 | and rev in all_refs | 2060 | and rev in all_refs |
| 2057 | ): | 2061 | ): |
| 2058 | return all_refs[rev] | 2062 | return all_refs[rev] |
| @@ -2163,8 +2167,8 @@ class Project: | |||
| 2163 | return | 2167 | return |
| 2164 | 2168 | ||
| 2165 | head = self._GetHead() | 2169 | head = self._GetHead() |
| 2166 | if head and head.startswith(R_HEADS): | 2170 | if head and head.startswith(git_refs.R_HEADS): |
| 2167 | branch = head[len(R_HEADS) :] | 2171 | branch = head[len(git_refs.R_HEADS) :] |
| 2168 | try: | 2172 | try: |
| 2169 | head = all_refs[head] | 2173 | head = all_refs[head] |
| 2170 | except KeyError: | 2174 | except KeyError: |
| @@ -2235,7 +2239,9 @@ class Project: | |||
| 2235 | return | 2239 | return |
| 2236 | else: | 2240 | else: |
| 2237 | if verbose: | 2241 | if verbose: |
| 2238 | lost_output = self._revlist("--count", not_rev(revid), HEAD) | 2242 | lost_output = self._revlist( |
| 2243 | "--count", not_rev(revid), git_refs.HEAD | ||
| 2244 | ) | ||
| 2239 | lost = int(lost_output[0]) if lost_output else 0 | 2245 | lost = int(lost_output[0]) if lost_output else 0 |
| 2240 | if lost: | 2246 | if lost: |
| 2241 | syncbuf.info(self, "discarding %d commits", lost) | 2247 | syncbuf.info(self, "discarding %d commits", lost) |
| @@ -2277,14 +2283,14 @@ class Project: | |||
| 2277 | self._CopyAndLinkFiles() | 2283 | self._CopyAndLinkFiles() |
| 2278 | return | 2284 | return |
| 2279 | 2285 | ||
| 2280 | gain_output = self._revlist("--count", not_rev(HEAD), revid) | 2286 | gain_output = self._revlist("--count", not_rev(git_refs.HEAD), revid) |
| 2281 | upstream_gain = int(gain_output[0]) if gain_output else 0 | 2287 | upstream_gain = int(gain_output[0]) if gain_output else 0 |
| 2282 | 2288 | ||
| 2283 | # See if we can perform a fast forward merge. This can happen if our | 2289 | # See if we can perform a fast forward merge. This can happen if our |
| 2284 | # branch isn't in the exact same state as we last published. | 2290 | # branch isn't in the exact same state as we last published. |
| 2285 | try: | 2291 | try: |
| 2286 | self.work_git.merge_base( | 2292 | self.work_git.merge_base( |
| 2287 | "--is-ancestor", HEAD, revid, log_as_error=False | 2293 | "--is-ancestor", git_refs.HEAD, revid, log_as_error=False |
| 2288 | ) | 2294 | ) |
| 2289 | # Skip the published logic. | 2295 | # Skip the published logic. |
| 2290 | pub = False | 2296 | pub = False |
| @@ -2330,7 +2336,9 @@ class Project: | |||
| 2330 | 2336 | ||
| 2331 | # Examine the local commits not in the remote. Find the | 2337 | # Examine the local commits not in the remote. Find the |
| 2332 | # last one attributed to this user, if any. | 2338 | # last one attributed to this user, if any. |
| 2333 | local_changes = self._revlist(not_rev(revid), HEAD, format="%H %ce") | 2339 | local_changes = self._revlist( |
| 2340 | not_rev(revid), git_refs.HEAD, format="%H %ce" | ||
| 2341 | ) | ||
| 2334 | last_mine = None | 2342 | last_mine = None |
| 2335 | cnt_mine = 0 | 2343 | cnt_mine = 0 |
| 2336 | for commit in local_changes: | 2344 | for commit in local_changes: |
| @@ -2375,7 +2383,7 @@ class Project: | |||
| 2375 | # In case of manifest sync the revisionExpr might be a SHA1. | 2383 | # In case of manifest sync the revisionExpr might be a SHA1. |
| 2376 | branch.merge = self.revisionExpr | 2384 | branch.merge = self.revisionExpr |
| 2377 | if not branch.merge.startswith("refs/"): | 2385 | if not branch.merge.startswith("refs/"): |
| 2378 | branch.merge = R_HEADS + branch.merge | 2386 | branch.merge = git_refs.R_HEADS + branch.merge |
| 2379 | branch.Save() | 2387 | branch.Save() |
| 2380 | 2388 | ||
| 2381 | if cnt_mine > 0 and self.rebase: | 2389 | if cnt_mine > 0 and self.rebase: |
| @@ -2654,11 +2662,11 @@ class Project: | |||
| 2654 | if not branch_merge: | 2662 | if not branch_merge: |
| 2655 | branch_merge = self.revisionExpr | 2663 | branch_merge = self.revisionExpr |
| 2656 | head = self.work_git.GetHead() | 2664 | head = self.work_git.GetHead() |
| 2657 | if head == (R_HEADS + name): | 2665 | if head == (git_refs.R_HEADS + name): |
| 2658 | return True | 2666 | return True |
| 2659 | 2667 | ||
| 2660 | all_refs = self.bare_ref.all | 2668 | all_refs = self.bare_ref.all |
| 2661 | if R_HEADS + name in all_refs: | 2669 | if git_refs.R_HEADS + name in all_refs: |
| 2662 | git_command.GitCommand( | 2670 | git_command.GitCommand( |
| 2663 | self, ["checkout", "-q", name, "--"], verify_command=True | 2671 | self, ["checkout", "-q", name, "--"], verify_command=True |
| 2664 | ).Wait() | 2672 | ).Wait() |
| @@ -2668,22 +2676,22 @@ class Project: | |||
| 2668 | branch.remote = self.GetRemote() | 2676 | branch.remote = self.GetRemote() |
| 2669 | branch.merge = branch_merge | 2677 | branch.merge = branch_merge |
| 2670 | if not branch.merge.startswith("refs/") and not IsId(branch_merge): | 2678 | if not branch.merge.startswith("refs/") and not IsId(branch_merge): |
| 2671 | branch.merge = R_HEADS + branch_merge | 2679 | branch.merge = git_refs.R_HEADS + branch_merge |
| 2672 | 2680 | ||
| 2673 | if revision is None: | 2681 | if revision is None: |
| 2674 | revid = self.GetRevisionId(all_refs) | 2682 | revid = self.GetRevisionId(all_refs) |
| 2675 | else: | 2683 | else: |
| 2676 | revid = self.work_git.rev_parse(revision) | 2684 | revid = self.work_git.rev_parse(revision) |
| 2677 | 2685 | ||
| 2678 | if head.startswith(R_HEADS): | 2686 | if head.startswith(git_refs.R_HEADS): |
| 2679 | try: | 2687 | try: |
| 2680 | head = all_refs[head] | 2688 | head = all_refs[head] |
| 2681 | except KeyError: | 2689 | except KeyError: |
| 2682 | head = None | 2690 | head = None |
| 2683 | if revid and head and revid == head: | 2691 | if revid and head and revid == head: |
| 2684 | ref = R_HEADS + name | 2692 | ref = git_refs.R_HEADS + name |
| 2685 | self.work_git.update_ref(ref, revid) | 2693 | self.work_git.update_ref(ref, revid) |
| 2686 | self.work_git.symbolic_ref(HEAD, ref) | 2694 | self.work_git.symbolic_ref(git_refs.HEAD, ref) |
| 2687 | branch.Save() | 2695 | branch.Save() |
| 2688 | return True | 2696 | return True |
| 2689 | 2697 | ||
| @@ -2705,7 +2713,7 @@ class Project: | |||
| 2705 | True if the checkout succeeded; False if the | 2713 | True if the checkout succeeded; False if the |
| 2706 | branch doesn't exist. | 2714 | branch doesn't exist. |
| 2707 | """ | 2715 | """ |
| 2708 | rev = R_HEADS + name | 2716 | rev = git_refs.R_HEADS + name |
| 2709 | head = self.work_git.GetHead() | 2717 | head = self.work_git.GetHead() |
| 2710 | if head == rev: | 2718 | if head == rev: |
| 2711 | # Already on the branch. | 2719 | # Already on the branch. |
| @@ -2718,7 +2726,7 @@ class Project: | |||
| 2718 | # Branch does not exist in this project. | 2726 | # Branch does not exist in this project. |
| 2719 | return False | 2727 | return False |
| 2720 | 2728 | ||
| 2721 | if head.startswith(R_HEADS): | 2729 | if head.startswith(git_refs.R_HEADS): |
| 2722 | try: | 2730 | try: |
| 2723 | head = all_refs[head] | 2731 | head = all_refs[head] |
| 2724 | except KeyError: | 2732 | except KeyError: |
| @@ -2727,7 +2735,7 @@ class Project: | |||
| 2727 | if head == revid: | 2735 | if head == revid: |
| 2728 | # Same revision; just update HEAD to point to the new | 2736 | # Same revision; just update HEAD to point to the new |
| 2729 | # target branch, but otherwise take no other action. | 2737 | # target branch, but otherwise take no other action. |
| 2730 | self.work_git.SetHead(R_HEADS + name) | 2738 | self.work_git.SetHead(git_refs.R_HEADS + name) |
| 2731 | return True | 2739 | return True |
| 2732 | 2740 | ||
| 2733 | git_command.GitCommand( | 2741 | git_command.GitCommand( |
| @@ -2749,7 +2757,7 @@ class Project: | |||
| 2749 | True if the abandon succeeded; Raises GitCommandError if it didn't; | 2757 | True if the abandon succeeded; Raises GitCommandError if it didn't; |
| 2750 | None if the branch didn't exist. | 2758 | None if the branch didn't exist. |
| 2751 | """ | 2759 | """ |
| 2752 | rev = R_HEADS + name | 2760 | rev = git_refs.R_HEADS + name |
| 2753 | all_refs = self.bare_ref.all | 2761 | all_refs = self.bare_ref.all |
| 2754 | if rev not in all_refs: | 2762 | if rev not in all_refs: |
| 2755 | # Doesn't exist | 2763 | # Doesn't exist |
| @@ -2781,8 +2789,8 @@ class Project: | |||
| 2781 | left = self._allrefs | 2789 | left = self._allrefs |
| 2782 | cb = self.CurrentBranch | 2790 | cb = self.CurrentBranch |
| 2783 | for name in left.keys(): | 2791 | for name in left.keys(): |
| 2784 | if name.startswith(R_HEADS): | 2792 | if name.startswith(git_refs.R_HEADS): |
| 2785 | name = name[len(R_HEADS) :] | 2793 | name = name[len(git_refs.R_HEADS) :] |
| 2786 | if cb is None or name != cb: | 2794 | if cb is None or name != cb: |
| 2787 | kill.append(name) | 2795 | kill.append(name) |
| 2788 | 2796 | ||
| @@ -2792,13 +2800,13 @@ class Project: | |||
| 2792 | return [] | 2800 | return [] |
| 2793 | 2801 | ||
| 2794 | rev = self.GetCommitRevisionId(left) | 2802 | rev = self.GetCommitRevisionId(left) |
| 2795 | head = left.get(R_HEADS + cb) if cb is not None else None | 2803 | head = left.get(git_refs.R_HEADS + cb) if cb is not None else None |
| 2796 | if ( | 2804 | if ( |
| 2797 | cb is not None | 2805 | cb is not None |
| 2798 | and head == rev | 2806 | and head == rev |
| 2799 | and not self.IsDirty(consider_untracked=False) | 2807 | and not self.IsDirty(consider_untracked=False) |
| 2800 | ): | 2808 | ): |
| 2801 | self.work_git.DetachHead(HEAD) | 2809 | self.work_git.DetachHead(git_refs.HEAD) |
| 2802 | kill.append(cb) | 2810 | kill.append(cb) |
| 2803 | 2811 | ||
| 2804 | if kill: | 2812 | if kill: |
| @@ -2825,14 +2833,16 @@ class Project: | |||
| 2825 | self.bare_git.DetachHead(old) | 2833 | self.bare_git.DetachHead(old) |
| 2826 | else: | 2834 | else: |
| 2827 | branch = ( | 2835 | branch = ( |
| 2828 | old[len(R_HEADS) :] if old.startswith(R_HEADS) else old | 2836 | old[len(git_refs.R_HEADS) :] |
| 2837 | if old.startswith(git_refs.R_HEADS) | ||
| 2838 | else old | ||
| 2829 | ) | 2839 | ) |
| 2830 | if branch not in kill: | 2840 | if branch not in kill: |
| 2831 | self.bare_git.SetHead(old) | 2841 | self.bare_git.SetHead(old) |
| 2832 | left = self._allrefs | 2842 | left = self._allrefs |
| 2833 | 2843 | ||
| 2834 | for branch in kill: | 2844 | for branch in kill: |
| 2835 | if (R_HEADS + branch) not in left: | 2845 | if (git_refs.R_HEADS + branch) not in left: |
| 2836 | self.CleanPublishedCache() | 2846 | self.CleanPublishedCache() |
| 2837 | break | 2847 | break |
| 2838 | 2848 | ||
| @@ -2842,7 +2852,7 @@ class Project: | |||
| 2842 | 2852 | ||
| 2843 | kept = [] | 2853 | kept = [] |
| 2844 | for branch in kill: | 2854 | for branch in kill: |
| 2845 | if R_HEADS + branch in left: | 2855 | if git_refs.R_HEADS + branch in left: |
| 2846 | branch = self.GetBranch(branch) | 2856 | branch = self.GetBranch(branch) |
| 2847 | branch.current = branch.name == cb | 2857 | branch.current = branch.name == cb |
| 2848 | base = branch.LocalMerge | 2858 | base = branch.LocalMerge |
| @@ -3335,7 +3345,7 @@ class Project: | |||
| 3335 | if not default: | 3345 | if not default: |
| 3336 | return None | 3346 | return None |
| 3337 | for cand in (default.upstreamExpr, default.revisionExpr): | 3347 | for cand in (default.upstreamExpr, default.revisionExpr): |
| 3338 | if cand and not IsId(cand) and not cand.startswith(R_TAGS): | 3348 | if cand and not IsId(cand) and not cand.startswith(git_refs.R_TAGS): |
| 3339 | return cand | 3349 | return cand |
| 3340 | return None | 3350 | return None |
| 3341 | 3351 | ||
| @@ -3390,12 +3400,12 @@ class Project: | |||
| 3390 | else: | 3400 | else: |
| 3391 | current_branch_only = False | 3401 | current_branch_only = False |
| 3392 | 3402 | ||
| 3393 | if self.revisionExpr.startswith(R_TAGS): | 3403 | if self.revisionExpr.startswith(git_refs.R_TAGS): |
| 3394 | # This is a tag and its commit id should never change. | 3404 | # This is a tag and its commit id should never change. |
| 3395 | tag_name = self.revisionExpr[len(R_TAGS) :] | 3405 | tag_name = self.revisionExpr[len(git_refs.R_TAGS) :] |
| 3396 | elif upstream and upstream.startswith(R_TAGS): | 3406 | elif upstream and upstream.startswith(git_refs.R_TAGS): |
| 3397 | # This is a tag and its commit id should never change. | 3407 | # This is a tag and its commit id should never change. |
| 3398 | tag_name = upstream[len(R_TAGS) :] | 3408 | tag_name = upstream[len(git_refs.R_TAGS) :] |
| 3399 | 3409 | ||
| 3400 | if is_sha1 or tag_name is not None: | 3410 | if is_sha1 or tag_name is not None: |
| 3401 | has_shallow = self._HasShallow() | 3411 | has_shallow = self._HasShallow() |
| @@ -3427,9 +3437,9 @@ class Project: | |||
| 3427 | 3437 | ||
| 3428 | update_ref_cmds = [] | 3438 | update_ref_cmds = [] |
| 3429 | 3439 | ||
| 3430 | for r, ref_id in GitRefs(ref_dir).all.items(): | 3440 | for r, ref_id in git_refs.GitRefs(ref_dir).all.items(): |
| 3431 | if r not in all_refs: | 3441 | if r not in all_refs: |
| 3432 | if r.startswith(R_TAGS) or remote.WritesTo(r): | 3442 | if r.startswith(git_refs.R_TAGS) or remote.WritesTo(r): |
| 3433 | update_ref_cmds.append(f"create {r} {ref_id}\n") | 3443 | update_ref_cmds.append(f"create {r} {ref_id}\n") |
| 3434 | all_refs[r] = ref_id | 3444 | all_refs[r] = ref_id |
| 3435 | ids.add(ref_id) | 3445 | ids.add(ref_id) |
| @@ -3527,7 +3537,7 @@ class Project: | |||
| 3527 | branch = upstream | 3537 | branch = upstream |
| 3528 | if branch is not None and branch.strip(): | 3538 | if branch is not None and branch.strip(): |
| 3529 | if not branch.startswith("refs/"): | 3539 | if not branch.startswith("refs/"): |
| 3530 | branch = R_HEADS + branch | 3540 | branch = git_refs.R_HEADS + branch |
| 3531 | spec.append(str(("+%s:" % branch) + remote.ToLocal(branch))) | 3541 | spec.append(str(("+%s:" % branch) + remote.ToLocal(branch))) |
| 3532 | 3542 | ||
| 3533 | # If mirroring repo and we cannot deduce the tag or branch to fetch, | 3543 | # If mirroring repo and we cannot deduce the tag or branch to fetch, |
| @@ -4014,8 +4024,8 @@ class Project: | |||
| 4014 | |revid|, since there is then nothing to materialize. | 4024 | |revid|, since there is then nothing to materialize. |
| 4015 | """ | 4025 | """ |
| 4016 | old = self._GetHead() | 4026 | old = self._GetHead() |
| 4017 | if old and old.startswith(R_HEADS): | 4027 | if old and old.startswith(git_refs.R_HEADS): |
| 4018 | old = old[len(R_HEADS) :] | 4028 | old = old[len(git_refs.R_HEADS) :] |
| 4019 | if head != revid: | 4029 | if head != revid: |
| 4020 | self._Reproject(revid, verbose=verbose) | 4030 | self._Reproject(revid, verbose=verbose) |
| 4021 | self.work_git.DetachHead( | 4031 | self.work_git.DetachHead( |
| @@ -4035,7 +4045,7 @@ class Project: | |||
| 4035 | commit the branch is at; the ref write fails if it moved meanwhile. | 4045 | commit the branch is at; the ref write fails if it moved meanwhile. |
| 4036 | """ | 4046 | """ |
| 4037 | self._Reproject(revid, verbose=verbose) | 4047 | self._Reproject(revid, verbose=verbose) |
| 4038 | self.work_git.UpdateRef(HEAD, revid, old=head, message=message) | 4048 | self.work_git.UpdateRef(git_refs.HEAD, revid, old=head, message=message) |
| 4039 | 4049 | ||
| 4040 | def _Reproject(self, revid: str, verbose: bool = False) -> None: | 4050 | def _Reproject(self, revid: str, verbose: bool = False) -> None: |
| 4041 | """Make the index and worktree match |revid| with repo.reprojectcmd. | 4051 | """Make the index and worktree match |revid| with repo.reprojectcmd. |
| @@ -4431,13 +4441,13 @@ class Project: | |||
| 4431 | # Set up the m/ space to point to the worktree-specific ref | 4441 | # Set up the m/ space to point to the worktree-specific ref |
| 4432 | # space. We'll update the worktree-specific ref space on each | 4442 | # space. We'll update the worktree-specific ref space on each |
| 4433 | # checkout. | 4443 | # checkout. |
| 4434 | ref = R_M + self.manifest.branch | 4444 | ref = git_refs.R_M + self.manifest.branch |
| 4435 | if not self.bare_ref.symref(ref): | 4445 | if not self.bare_ref.symref(ref): |
| 4436 | self.bare_git.symbolic_ref( | 4446 | self.bare_git.symbolic_ref( |
| 4437 | "-m", | 4447 | "-m", |
| 4438 | "redirecting to worktree scope", | 4448 | "redirecting to worktree scope", |
| 4439 | ref, | 4449 | ref, |
| 4440 | R_WORKTREE_M + self.manifest.branch, | 4450 | git_refs.R_WORKTREE_M + self.manifest.branch, |
| 4441 | ) | 4451 | ) |
| 4442 | 4452 | ||
| 4443 | # We can't update this ref with git worktrees until it exists. | 4453 | # We can't update this ref with git worktrees until it exists. |
| @@ -4445,18 +4455,18 @@ class Project: | |||
| 4445 | if not os.path.exists(self.worktree): | 4455 | if not os.path.exists(self.worktree): |
| 4446 | return | 4456 | return |
| 4447 | 4457 | ||
| 4448 | base = R_WORKTREE_M | 4458 | base = git_refs.R_WORKTREE_M |
| 4449 | active_git = self.work_git | 4459 | active_git = self.work_git |
| 4450 | 4460 | ||
| 4451 | self._InitAnyMRef(HEAD, self.bare_git, detach=True) | 4461 | self._InitAnyMRef(git_refs.HEAD, self.bare_git, detach=True) |
| 4452 | else: | 4462 | else: |
| 4453 | base = R_M | 4463 | base = git_refs.R_M |
| 4454 | active_git = self.bare_git | 4464 | active_git = self.bare_git |
| 4455 | 4465 | ||
| 4456 | self._InitAnyMRef(base + self.manifest.branch, active_git) | 4466 | self._InitAnyMRef(base + self.manifest.branch, active_git) |
| 4457 | 4467 | ||
| 4458 | def _InitMirrorHead(self): | 4468 | def _InitMirrorHead(self): |
| 4459 | self._InitAnyMRef(HEAD, self.bare_git) | 4469 | self._InitAnyMRef(git_refs.HEAD, self.bare_git) |
| 4460 | 4470 | ||
| 4461 | def _InitAnyMRef(self, ref, active_git, detach=False): | 4471 | def _InitAnyMRef(self, ref, active_git, detach=False): |
| 4462 | """Initialize |ref| in |active_git| to the value in the manifest. | 4472 | """Initialize |ref| in |active_git| to the value in the manifest. |
| @@ -4659,10 +4669,12 @@ class Project: | |||
| 4659 | self._createDotGit(dotgit) | 4669 | self._createDotGit(dotgit) |
| 4660 | 4670 | ||
| 4661 | if init_dotgit: | 4671 | if init_dotgit: |
| 4662 | self.work_git.UpdateRef(HEAD, self.GetRevisionId(), detach=True) | 4672 | self.work_git.UpdateRef( |
| 4673 | git_refs.HEAD, self.GetRevisionId(), detach=True | ||
| 4674 | ) | ||
| 4663 | 4675 | ||
| 4664 | # Finish checking out the worktree. | 4676 | # Finish checking out the worktree. |
| 4665 | cmd = ["read-tree", "--reset", "-u", "-v", HEAD] | 4677 | cmd = ["read-tree", "--reset", "-u", "-v", git_refs.HEAD] |
| 4666 | try: | 4678 | try: |
| 4667 | if git_command.GitCommand(self, cmd).Wait() != 0: | 4679 | if git_command.GitCommand(self, cmd).Wait() != 0: |
| 4668 | raise error.GitError( | 4680 | raise error.GitError( |
| @@ -5051,7 +5063,7 @@ class Project: | |||
| 5051 | # "refs/heads/.invalid" placeholder used for unborn branches, | 5063 | # "refs/heads/.invalid" placeholder used for unborn branches, |
| 5052 | # empty repositories, or when the reftables backend is used | 5064 | # empty repositories, or when the reftables backend is used |
| 5053 | # (which will be the default in Git 3.0). | 5065 | # (which will be the default in Git 3.0). |
| 5054 | if not ref or ref == R_HEADS + ".invalid": | 5066 | if not ref or ref == git_refs.R_HEADS + ".invalid": |
| 5055 | return None | 5067 | return None |
| 5056 | return ref | 5068 | return ref |
| 5057 | else: | 5069 | else: |
| @@ -5068,7 +5080,7 @@ class Project: | |||
| 5068 | try: | 5080 | try: |
| 5069 | # Catch AssertionError raised by GetDotgitPath when worktree | 5081 | # Catch AssertionError raised by GetDotgitPath when worktree |
| 5070 | # .git pointer file is malformed (e.g. missing 'gitdir:'). | 5082 | # .git pointer file is malformed (e.g. missing 'gitdir:'). |
| 5071 | path = self.GetDotgitPath(subpath=HEAD) | 5083 | path = self.GetDotgitPath(subpath=git_refs.HEAD) |
| 5072 | if not platform_utils.islink(path): | 5084 | if not platform_utils.islink(path): |
| 5073 | with open( | 5085 | with open( |
| 5074 | path, "r", encoding="utf-8", errors="replace" | 5086 | path, "r", encoding="utf-8", errors="replace" |
| @@ -5080,13 +5092,15 @@ class Project: | |||
| 5080 | pass | 5092 | pass |
| 5081 | 5093 | ||
| 5082 | try: | 5094 | try: |
| 5083 | return self.symbolic_ref("-q", HEAD, log_as_error=False) | 5095 | return self.symbolic_ref( |
| 5096 | "-q", git_refs.HEAD, log_as_error=False | ||
| 5097 | ) | ||
| 5084 | except error.GitError: | 5098 | except error.GitError: |
| 5085 | pass | 5099 | pass |
| 5086 | 5100 | ||
| 5087 | try: | 5101 | try: |
| 5088 | # If symbolic-ref fails, try to treat as detached HEAD. | 5102 | # If symbolic-ref fails, try to treat as detached HEAD. |
| 5089 | return self.rev_parse(HEAD) | 5103 | return self.rev_parse(git_refs.HEAD) |
| 5090 | except error.GitError as e: | 5104 | except error.GitError as e: |
| 5091 | logger.warning( | 5105 | logger.warning( |
| 5092 | "project %s: unparseable HEAD; trying to recover.\n" | 5106 | "project %s: unparseable HEAD; trying to recover.\n" |
| @@ -5134,7 +5148,7 @@ class Project: | |||
| 5134 | cmdv = [] | 5148 | cmdv = [] |
| 5135 | if message is not None: | 5149 | if message is not None: |
| 5136 | cmdv.extend(["-m", message]) | 5150 | cmdv.extend(["-m", message]) |
| 5137 | cmdv.append(HEAD) | 5151 | cmdv.append(git_refs.HEAD) |
| 5138 | cmdv.append(ref) | 5152 | cmdv.append(ref) |
| 5139 | self.symbolic_ref(*cmdv) | 5153 | self.symbolic_ref(*cmdv) |
| 5140 | 5154 | ||
| @@ -5142,7 +5156,7 @@ class Project: | |||
| 5142 | cmdv = ["--no-deref"] | 5156 | cmdv = ["--no-deref"] |
| 5143 | if message is not None: | 5157 | if message is not None: |
| 5144 | cmdv.extend(["-m", message]) | 5158 | cmdv.extend(["-m", message]) |
| 5145 | cmdv.append(HEAD) | 5159 | cmdv.append(git_refs.HEAD) |
| 5146 | cmdv.append(new) | 5160 | cmdv.append(new) |
| 5147 | self.update_ref(*cmdv) | 5161 | self.update_ref(*cmdv) |
| 5148 | 5162 | ||
| @@ -5479,7 +5493,7 @@ class MetaProject(Project): | |||
| 5479 | all_refs = self.bare_ref.all | 5493 | all_refs = self.bare_ref.all |
| 5480 | revid = self.GetRevisionId(all_refs) | 5494 | revid = self.GetRevisionId(all_refs) |
| 5481 | head = self._GetHead() | 5495 | head = self._GetHead() |
| 5482 | if head and head.startswith(R_HEADS): | 5496 | if head and head.startswith(git_refs.R_HEADS): |
| 5483 | try: | 5497 | try: |
| 5484 | head = all_refs[head] | 5498 | head = all_refs[head] |
| 5485 | except KeyError: | 5499 | except KeyError: |
| @@ -5487,7 +5501,7 @@ class MetaProject(Project): | |||
| 5487 | 5501 | ||
| 5488 | if revid == head: | 5502 | if revid == head: |
| 5489 | return False | 5503 | return False |
| 5490 | elif self._revlist("-1", not_rev(HEAD), revid): | 5504 | elif self._revlist("-1", not_rev(git_refs.HEAD), revid): |
| 5491 | return True | 5505 | return True |
| 5492 | return False | 5506 | return False |
| 5493 | 5507 | ||
