1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
use crate::result::Result;
use etc::{Etc, Read};
use std::process::Command;
mod manifest;
mod redep;
pub use self::{manifest::Manifest, redep::redirect as redep};
pub struct Registry(
pub String,
);
impl Registry {
pub fn new() -> Result<Registry> {
let mut substrate = dirs::home_dir().expect("Could not find home directory");
substrate.push(".substrate");
let registry = substrate.to_string_lossy().to_owned();
if !substrate.exists() {
Command::new("git")
.args(vec![
"clone",
"https://github.com/paritytech/substrate.git",
®istry,
"--depth=1",
])
.status()?;
}
Ok(Registry(registry.to_string()))
}
pub fn source(&self) -> Result<Vec<String>> {
Ok(etc::find_all(&self.0, "Cargo.toml")?
.iter()
.map(|mani| {
toml::from_slice::<manifest::Manifest>(&Etc::from(mani).read().unwrap_or_default())
.unwrap_or_default()
.package
.name
})
.filter(|s| !s.is_empty() && !s.contains("node-template"))
.collect())
}
pub fn update(&self) -> Result<()> {
Command::new("git")
.args(vec!["-C", &self.0, "pull", "origin", "master"])
.status()?;
Ok(())
}
pub fn tag(&self) -> Result<Vec<String>> {
Ok(String::from_utf8_lossy(
&Command::new("git")
.args(vec!["-C", &self.0, "tag", "--list"])
.output()?
.stdout,
)
.to_string()
.split('\n')
.collect::<Vec<&str>>()
.iter()
.filter(|t| t.starts_with('v'))
.map(|t| t.to_string())
.collect())
}
}