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_AUTHOR_NAME", "zed-zippy[bot]"))
43 .add_env((
44 "GIT_AUTHOR_EMAIL",
45 "<234243425+zed-zippy[bot]@users.noreply.github.com>",
46 ))
47 .add_env(("GIT_COMMITTER_NAME", "zed-zippy[bot]"))
48 .add_env((
49 "GIT_COMMITTER_EMAIL",
50 "<234243425+zed-zippy[bot]@users.noreply.github.com>",
51 ))
52 .add_env(("GITHUB_TOKEN", token))
53 }
54
55 let (authenticate, token) = steps::authenticate_as_zippy()
56 .for_repository(RepositoryTarget::current())
57 .with_permissions([
58 (TokenPermissions::Contents, Level::Write),
59 (TokenPermissions::Workflows, Level::Write),
60 (TokenPermissions::PullRequests, Level::Write),
61 ])
62 .into();
63
64 named::job(
65 Job::default()
66 .runs_on(runners::LINUX_SMALL)
67 .add_step(steps::checkout_repo())
68 .add_step(authenticate)
69 .add_step(cherry_pick(branch, commit, channel, &token)),
70 )
71}