1
use sha2::{Digest, Sha256};
2
use std::env;
3
use std::fs;
4
use std::io::{self, Read};
5
use std::process::Command;
6

            
7
8
fn checksum(file_path: &str) -> io::Result<String> {
8
8
    let mut file = fs::File::open(file_path)?;
9
8
    let mut hasher = Sha256::new();
10
8
    let mut buffer = [0; 1024];
11

            
12
    loop {
13
40
        let bytes_read = file.read(&mut buffer)?;
14
40
        if bytes_read == 0 {
15
8
            break;
16
32
        }
17
32
        hasher.update(&buffer[..bytes_read]);
18
    }
19

            
20
8
    Ok(format!("{:x}", hasher.finalize()))
21
8
}
22

            
23
4
fn main() {
24
4
    println!("cargo:rerun-if-changed=../doc/disdoc.org");
25
4
    let status = Command::new("emacs")
26
4
        .args([
27
4
            "-q",
28
4
            "--batch",
29
4
            "--eval",
30
4
            "(setq org-confirm-babel-evaluate nil)",
31
4
            "../doc/disdoc.org",
32
4
            "-l",
33
4
            "ox-md",
34
4
            "--eval",
35
4
            "(org-md-export-to-markdown)",
36
4
            "-f",
37
4
            "save-buffer",
38
4
            "-f",
39
4
            "kill-emacs",
40
4
        ])
41
4
        .status()
42
4
        .expect("Failed to export doc");
43

            
44
4
    assert!(status.success(), "Building finance doc failed");
45

            
46
4
    fs::copy("../doc/disdoc.md", "../target/nomisync.md").expect("Can't update finance doc file");
47

            
48
4
    println!(
49
        "cargo:rustc-env=CARGO_TARGET_DIR={}/../",
50
4
        env::var("CARGO_MANIFEST_DIR").unwrap()
51
    );
52

            
53
4
    println!("cargo:rerun-if-changed=../doc/nomisync.org");
54
4
    let status = Command::new("emacs")
55
4
        .args([
56
4
            "-q",
57
4
            "--batch",
58
4
            "../doc/nomisync.org",
59
4
            "--eval",
60
4
            "(org-babel-do-load-languages 'org-babel-load-languages '((sql . t)))",
61
4
            "--eval",
62
4
            "(setq org-confirm-babel-evaluate nil)",
63
4
            "--eval",
64
4
            "(org-babel-tangle)",
65
4
            "-f",
66
4
            "kill-emacs",
67
4
        ])
68
4
        .status()
69
4
        .expect("Failed to export SQL");
70

            
71
4
    assert!(status.success(), "Building SQL from org failed");
72

            
73
4
    let status = Command::new("sqlfluff")
74
4
        .args([
75
4
            "fix",
76
4
            "--dialect",
77
4
            "postgres",
78
4
            "../doc/nomisync.sql",
79
4
            "--force",
80
4
        ])
81
4
        .status()
82
4
        .expect("Failed to format SQL");
83

            
84
4
    assert!(status.success(), "Building migrations failed");
85

            
86
4
    if fs::metadata("../doc/nomisync.sql").is_ok()
87
4
        && fs::metadata("../migrations/0002_nomisync.sql").is_ok()
88
    {
89
4
        if checksum("../doc/nomisync.sql").unwrap()
90
4
            == checksum("../migrations/0002_nomisync.sql").unwrap()
91
4
        {
92
4
            fs::remove_file("../doc/nomisync.sql").unwrap();
93
4
        } else {
94
            fs::copy("../doc/nomisync.sql", "../migrations/0002_nomisync.sql")
95
                .expect("Can't update finance migrations file");
96
        }
97
    } else if fs::metadata("../doc/nomisync.sql").is_ok() {
98
        fs::copy("../doc/nomisync.sql", "../migrations/0002_nomisync.sql")
99
            .expect("Can't create finance migrations file");
100
    }
101

            
102
4
    println!("cargo:rerun-if-changed=../migrations");
103
4
}