in sync/downstream.py [0:0]
def wpt_to_gecko_commits(self, dependencies: list[WptCommit] | None = None) -> None:
"""Create a patch based on wpt branch, apply it to corresponding gecko branch.
If there is a commit with wpt-type metadata, this function will remove it. The
sha1 will be stashed in self.data["metadata-commit"] so it can be restored next time
we call ensure_metadata_commit()
"""
# The logic here is that we can retain any dependent commits as long as we have
# at least the set in the dependencies array, followed by the gecko commits created
# from the wpt_commits, interspersed with any number of manifest commits,
# followed by zero or one metadata commits
if dependencies:
expected_commits: list[tuple[str, WptCommit | None, bool]] = [
(item.sha1, item, True)
for item in dependencies]
else:
# If no dependencies are supplied, retain the ones that we alredy have, if any
expected_commits = []
for commit in self.gecko_commits:
assert isinstance(commit, sync_commit.GeckoCommit)
if commit.metadata.get("wpt-type") == "dependency":
expected_commits.append((commit.metadata["wpt-commit"], None, True))
else:
break
# Expect all the new commits
for commit in self.wpt_commits:
assert isinstance(commit, WptCommit)
if not commit.is_merge:
expected_commits.append((commit.sha1, commit, False))
existing = [
commit for commit in self.gecko_commits
if commit.metadata.get("wpt-commit") and
commit.metadata.get("wpt-type") in ("dependency", None)]
if TYPE_CHECKING:
existing_commits = cast(List[GeckoCommit], existing)
else:
existing_commits = existing
retain_commits = 0
for gecko_commit, (wpt_sha1, _, _) in zip(existing_commits, expected_commits):
if gecko_commit.metadata.get("wpt-commit") != wpt_sha1:
break
retain_commits += 1
keep_commits = existing_commits[:retain_commits]
maybe_add_commits = expected_commits[retain_commits:]
# Strip out any leading commits that come from currently applied dependencies that are
# not being retained
strip_count = 0
for _, wpt_commit, _ in maybe_add_commits:
if wpt_commit is not None:
break
strip_count += 1
add_commits = maybe_add_commits[strip_count:]
if len(keep_commits) == len(existing_commits) and not add_commits:
logger.info("Commits did not change")
return
logger.info("Keeping %i existing commits; adding %i new commits" % (len(keep_commits),
len(add_commits)))
if self.metadata_commit:
# If we have a metadata commit, store it in self.data["metadata-commit"]
# remove it when updating commits, and reapply it when we next call
# ensure_metadata_commit
self.data["metadata-commit"] = self.metadata_commit.sha1
reset_head = None
if not keep_commits:
reset_head = self.data["gecko-base"]
elif len(keep_commits) < len(existing_commits):
reset_head = keep_commits[-1]
elif ("metadata-commit" in self.data and
self.gecko_commits[-1].metadata.get("wpt-type") == "metadata"):
reset_head = self.gecko_commits[-2]
# Clear the set of affected tests since there are updates
del self.data["affected-tests"]
gecko_work = self.gecko_worktree.get()
if reset_head:
self.gecko_commits.head = reset_head # type: ignore
gecko_work.git.reset(hard=True)
for _, wpt_commit, is_dependency in add_commits:
assert wpt_commit is not None
logger.info("Moving commit %s" % wpt_commit.sha1)
if is_dependency:
metadata = {
"wpt-type": "dependency",
"wpt-commit": wpt_commit.sha1
}
msg_filter = None
else:
metadata = {
"wpt-pr": str(self.pr),
"wpt-commit": wpt_commit.sha1
}
msg_filter = self.message_filter
wpt_commit.move(gecko_work,
dest_prefix=env.config["gecko"]["path"]["wpt"],
msg_filter=msg_filter,
metadata=metadata,
patch_fallback=True)