fork_manager/
template.rs

1use std::fs::{set_permissions, File};
2use std::io::Write;
3#[cfg(target_family = "unix")]
4use std::os::unix::fs::PermissionsExt;
5
6use minijinja::syntax::SyntaxConfig;
7use minijinja::{context, Environment};
8
9use super::{ForkManager, Result};
10
11pub fn remote_name(value: String) -> String {
12    value
13        .replace("https://", "")
14        .replace("git@", "")
15        .replace(":", "/")
16}
17
18pub fn generate(fm: &ForkManager) -> Result<()> {
19    // use a syntax which won't mess too much with bash for shellcheck
20    let syntax = SyntaxConfig::builder()
21        .block_delimiters("#{", "}#")
22        .variable_delimiters("'{", "}'")
23        .comment_delimiters("#/*", "#*/")
24        .build()?;
25    let mut env = Environment::new();
26    env.set_syntax(syntax);
27    env.add_filter("remote_name", remote_name);
28    env.add_template("update.sh", include_str!("update.sh"))?;
29    let tmpl = env.get_template("update.sh").unwrap();
30    let ctx = context! {
31        config => fm.config.config,
32        forks => fm.config.forks,
33        remotes => fm.config.remotes(),
34    };
35    let script = fm.args.project.join(&fm.args.update_script);
36    let mut file = File::create(&script)?;
37    let content = tmpl.render(ctx)?;
38    file.write_all(content.as_bytes())?;
39    file.write_all(&[b'\n'])?;
40    #[cfg(target_family = "unix")]
41    {
42        let mut perms = file.metadata()?.permissions();
43        perms.set_mode(0o755);
44        set_permissions(script, perms)?;
45    }
46    Ok(())
47}