1use gh_workflow::*;
2
3use crate::tasks::workflows::{
4 runners,
5 steps::{self, NamedJob, named},
6 vars::{self, Input, StepOutput},
7};
8
9pub fn cherry_pick() -> Workflow {
10 let branch = Input::string("branch", None);
11 let commit = Input::string("commit", None);
12 let channel = Input::string("channel", None);
13 let cherry_pick = run_cherry_pick(&branch, &commit, &channel);
14 named::workflow()
15 .on(Event::default().workflow_dispatch(
16 WorkflowDispatch::default()
17 .add_input(commit.name, commit.input())
18 .add_input(branch.name, branch.input())
19 .add_input(channel.name, channel.input()),
20 ))
21 .add_job(cherry_pick.name, cherry_pick.job)
22}
23
24fn run_cherry_pick(branch: &Input, commit: &Input, channel: &Input) -> NamedJob {
25 fn authenticate_as_zippy() -> (Step<Use>, StepOutput) {
26 let step = named::uses(
27 "actions",
28 "create-github-app-token",
29 "bef1eaf1c0ac2b148ee2a0a74c65fbe6db0631f1",
30 ) // v2
31 .add_with(("app-id", vars::ZED_ZIPPY_APP_ID))
32 .add_with(("private-key", vars::ZED_ZIPPY_APP_PRIVATE_KEY))
33 .id("get-app-token");
34 let output = StepOutput::new(&step, "token");
35 (step, output)
36 }
37
38 fn cherry_pick(
39 branch: &Input,
40 commit: &Input,
41 channel: &Input,
42 token: &StepOutput,
43 ) -> Step<Run> {
44 named::bash(&format!("./script/cherry-pick {branch} {commit} {channel}"))
45 .add_env(("GIT_COMMITTER_NAME", "Zed Zippy"))
46 .add_env(("GIT_COMMITTER_EMAIL", "hi@zed.dev"))
47 .add_env(("GITHUB_TOKEN", token))
48 }
49
50 let (authenticate, token) = authenticate_as_zippy();
51
52 named::job(
53 Job::default()
54 .runs_on(runners::LINUX_SMALL)
55 .add_step(steps::checkout_repo())
56 .add_step(authenticate)
57 .add_step(cherry_pick(branch, commit, channel, &token)),
58 )
59}