mirror of
				https://github.com/pytorch/pytorch.git
				synced 2025-11-04 16:04:58 +08:00 
			
		
		
		
	Pull Request resolved: https://github.com/pytorch/pytorch/pull/155821 Approved by: https://github.com/ezyang, https://github.com/zou3519
		
			
				
	
	
		
			106 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			106 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
#!/usr/bin/env python3
 | 
						|
 | 
						|
from __future__ import annotations
 | 
						|
 | 
						|
import argparse
 | 
						|
import re
 | 
						|
import sys
 | 
						|
from pathlib import Path
 | 
						|
from typing import Any
 | 
						|
from typing_extensions import TypedDict  # Python 3.11+
 | 
						|
 | 
						|
import yaml
 | 
						|
 | 
						|
 | 
						|
Step = dict[str, Any]
 | 
						|
 | 
						|
 | 
						|
class Script(TypedDict):
 | 
						|
    extension: str
 | 
						|
    script: str
 | 
						|
 | 
						|
 | 
						|
def extract(step: Step) -> Script | None:
 | 
						|
    run = step.get("run")
 | 
						|
 | 
						|
    # https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#using-a-specific-shell
 | 
						|
    shell = step.get("shell", "bash")
 | 
						|
    extension = {
 | 
						|
        "bash": ".sh",
 | 
						|
        "pwsh": ".ps1",
 | 
						|
        "python": ".py",
 | 
						|
        "sh": ".sh",
 | 
						|
        "cmd": ".cmd",
 | 
						|
        "powershell": ".ps1",
 | 
						|
    }.get(shell)
 | 
						|
 | 
						|
    is_gh_script = step.get("uses", "").startswith("actions/github-script@")
 | 
						|
    gh_script = step.get("with", {}).get("script")
 | 
						|
 | 
						|
    if run is not None and extension is not None:
 | 
						|
        script = {
 | 
						|
            "bash": f"#!/usr/bin/env bash\nset -eo pipefail\n{run}",
 | 
						|
            "sh": f"#!/usr/bin/env sh\nset -e\n{run}",
 | 
						|
        }.get(shell, run)
 | 
						|
        return {"extension": extension, "script": script}  # type: ignore[typeddict-item]
 | 
						|
    elif is_gh_script and gh_script is not None:
 | 
						|
        return {"extension": ".js", "script": gh_script}
 | 
						|
    else:
 | 
						|
        return None
 | 
						|
 | 
						|
 | 
						|
def main() -> None:
 | 
						|
    parser = argparse.ArgumentParser()
 | 
						|
    parser.add_argument("--out", required=True)
 | 
						|
    args = parser.parse_args()
 | 
						|
 | 
						|
    out = Path(args.out)
 | 
						|
    if out.exists():
 | 
						|
        sys.exit(f"{out} already exists; aborting to avoid overwriting")
 | 
						|
 | 
						|
    gha_expressions_found = False
 | 
						|
 | 
						|
    for p in Path(".github/workflows").iterdir():
 | 
						|
        with open(p, "rb") as f:
 | 
						|
            workflow = yaml.safe_load(f)
 | 
						|
 | 
						|
        for job_name, job in workflow["jobs"].items():
 | 
						|
            job_dir = out / p / job_name
 | 
						|
            if "steps" not in job:
 | 
						|
                continue
 | 
						|
            steps = job["steps"]
 | 
						|
            index_chars = len(str(len(steps) - 1))
 | 
						|
            for i, step in enumerate(steps, start=1):
 | 
						|
                extracted = extract(step)
 | 
						|
                if extracted:
 | 
						|
                    script = extracted["script"]
 | 
						|
                    step_name = step.get("name", "")
 | 
						|
                    if "${{" in script:
 | 
						|
                        gha_expressions_found = True
 | 
						|
                        print(
 | 
						|
                            f"{p} job `{job_name}` step {i}: {step_name}",
 | 
						|
                            file=sys.stderr,
 | 
						|
                        )
 | 
						|
 | 
						|
                    job_dir.mkdir(parents=True, exist_ok=True)
 | 
						|
 | 
						|
                    sanitized = re.sub(
 | 
						|
                        "[^a-zA-Z_]+",
 | 
						|
                        "_",
 | 
						|
                        f"_{step_name}",
 | 
						|
                    ).rstrip("_")
 | 
						|
                    extension = extracted["extension"]
 | 
						|
                    filename = f"{i:0{index_chars}}{sanitized}{extension}"
 | 
						|
                    (job_dir / filename).write_text(script)
 | 
						|
 | 
						|
    if gha_expressions_found:
 | 
						|
        sys.exit(
 | 
						|
            "Each of the above scripts contains a GitHub Actions "
 | 
						|
            "${{ <expression> }} which must be replaced with an `env` variable"
 | 
						|
            " for security reasons."
 | 
						|
        )
 | 
						|
 | 
						|
 | 
						|
if __name__ == "__main__":
 | 
						|
    main()
 |