GitRoot
craft your forge, build your project, grow your community freely
1// SPDX-FileCopyrightText: 2025 Romain Maneschi <romain@gitroot.dev>
2//
3// SPDX-License-Identifier: EUPL-1.2
4
5#![no_main]
6
7use gitroot_plugin_sdk::{Commit, Exec, Plugin, PluginExecRight, PluginRun, Server};
8use gitroot_plugin_sdk::{PluginRunWhen, PluginWrite};
9
10pub use gitroot_plugin_sdk::exports::*;
11pub use gitroot_plugin_sdk::imports::*;
12use serde::{Deserialize, Serialize};
13use std::cell::RefCell;
14
15struct Hop {
16 server: &'static Server,
17 conf: RefCell<Option<Conf>>,
18}
19
20impl Hop {
21 fn new(server: &'static Server) -> Self {
22 Self {
23 server: server,
24 conf: RefCell::new(None),
25 }
26 }
27}
28
29#[derive(Serialize, Deserialize)]
30struct Conf {
31 exec: Vec<Exec>,
32}
33
34impl Plugin for Hop {
35 fn init(
36 &self,
37 repo_name: String,
38 conf_has_changed: bool,
39 serialized_conf: String,
40 ) -> Result<(), String> {
41 return serde_json::from_str(serialized_conf.as_str())
42 .map(|conf: Conf| *self.conf.borrow_mut() = Some(conf))
43 .map_err(|err| err.to_string());
44 }
45
46 fn start_commit(&self, commit: Commit) -> Result<(), String> {
47 Ok(())
48 }
49
50 fn add_file(&self, path: String) -> Result<(), String> {
51 Ok(())
52 }
53
54 fn mod_file(&self, from_path: String, to_path: String) -> Result<(), String> {
55 Ok(())
56 }
57
58 fn del_file(&self, path: String) -> Result<(), String> {
59 Ok(())
60 }
61
62 fn end_commit(&self, commit: Commit) -> Result<(), String> {
63 Ok(())
64 }
65
66 fn finish(&self) -> Result<(), String> {
67 let conf_guard = self.conf.borrow();
68 let conf = conf_guard.as_ref().unwrap();
69 let _ = self.server.exec(&conf.exec).map(|log| {
70 log.split("\n")
71 .for_each(|l| self.server.log(format!("Exec > {}", l.to_string())));
72 });
73 Ok(())
74 }
75}
76
77#[cfg_attr(all(target_arch = "wasm32"), unsafe(export_name = "install"))]
78pub extern "C" fn install() {
79 let conf = PluginRun {
80 path: String::from("*"),
81 branch: vec![String::from("main")],
82 when: vec![PluginRunWhen::ADD, PluginRunWhen::MOD],
83 write: PluginWrite {
84 git: vec![],
85 web: vec![],
86 exec: vec![PluginExecRight {
87 command: String::from("cat"),
88 }],
89 },
90 configuration: serde_json::to_value(Conf {
91 exec: vec![Exec {
92 cmd: String::from("cat"),
93 args: vec![String::from("README.md")],
94 env: vec![],
95 }],
96 })
97 .unwrap(),
98 };
99 Server::init(vec![conf], |server| Hop::new(server));
100}