cherry_pick.rs

 1use gh_workflow::*;
 2
 3use crate::tasks::workflows::{
 4    runners,
 5    steps::{self, NamedJob, RepositoryTarget, TokenPermissions, named},
 6    vars::{StepOutput, WorkflowInput},
 7};
 8
 9pub fn cherry_pick() -> Workflow {
10    let branch = WorkflowInput::string("branch", None);
11    let commit = WorkflowInput::string("commit", None);
12    let channel = WorkflowInput::string("channel", None);
13    let pr_number = WorkflowInput::string("pr_number", None);
14    let cherry_pick = run_cherry_pick(&branch, &commit, &channel);
15    named::workflow()
16        .run_name(format!("cherry_pick to {channel} #{pr_number}"))
17        .on(Event::default().workflow_dispatch(
18            WorkflowDispatch::default()
19                .add_input(commit.name, commit.input())
20                .add_input(branch.name, branch.input())
21                .add_input(channel.name, channel.input())
22                .add_input(pr_number.name, pr_number.input()),
23        ))
24        .add_job(cherry_pick.name, cherry_pick.job)
25}
26
27fn run_cherry_pick(
28    branch: &WorkflowInput,
29    commit: &WorkflowInput,
30    channel: &WorkflowInput,
31) -> NamedJob {
32    fn cherry_pick(
33        branch: &WorkflowInput,
34        commit: &WorkflowInput,
35        channel: &WorkflowInput,
36        token: &StepOutput,
37    ) -> Step<Run> {
38        named::bash(r#"./script/cherry-pick "$BRANCH" "$COMMIT" "$CHANNEL""#)
39            .add_env(("BRANCH", branch.to_string()))
40            .add_env(("COMMIT", commit.to_string()))
41            .add_env(("CHANNEL", channel.to_string()))
42            .add_env(("GIT_COMMITTER_NAME", "Zed Zippy"))
43            .add_env(("GIT_COMMITTER_EMAIL", "hi@zed.dev"))
44            .add_env(("GITHUB_TOKEN", token))
45    }
46
47    let (authenticate, token) = steps::authenticate_as_zippy()
48        .for_repository(RepositoryTarget::current())
49        .with_permissions([
50            (TokenPermissions::Contents, Level::Write),
51            (TokenPermissions::Workflows, Level::Write),
52            (TokenPermissions::PullRequests, Level::Write),
53        ])
54        .into();
55
56    named::job(
57        Job::default()
58            .runs_on(runners::LINUX_SMALL)
59            .add_step(steps::checkout_repo())
60            .add_step(authenticate)
61            .add_step(cherry_pick(branch, commit, channel, &token)),
62    )
63}