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 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}