List of commits:
Subject Hash Author Date (UTC)
Git integration. 0ebc5b3769e50c3463bdc39af0160c7db0d3f00b Jan Allersma 2019-01-03 17:34:18
Implement `hide` command. ab693b8fd91c93dfd7ee7b82cbae75b2a6043b0f Jan Allersma 2018-12-29 15:13:25
Resolve missing/erroneous build/run commands. e81d57882036a6475718b0653169c609d23b1c30 Jan Allersma 2018-12-25 13:06:00
Show working directory in status. ab188603dda062de4b2ea76c5bc1d2d41d98b8c2 Jan Allersma 2018-12-25 10:36:35
Add shell fallthrough. 02078135791fb3889152c11defaa2df21d0ae597 Jan Allersma 2018-12-22 19:47:36
Show dependencies when using `delete` command. cfa9779714d5e6d46ab5b4eeb84a915a15f23f54 Jan Allersma 2018-12-20 15:46:05
Resolve dep-tree by building project recursively. f53e38d790ec67d99ec8204af97273a53b73a9dc Jan Allersma 2018-12-19 14:54:07
Improve `dep-tree` command. 90bfa0340b7b874d65c08dc05c3d711abda1c469 Jan Allersma 2018-12-17 20:10:14
Implement experimental `dep-tree` command. 45d9dfdbfc99c59174e7c587621276b78ab7a4e9 Jan Allersma 2018-12-14 16:11:53
Implement `add` command. bbb2544bd06f29866465d651c32ca4d6e017f5e9 Jan Allersma 2018-12-11 15:43:10
Implement `exe` command. 1eaa36242201cf7ade5f23a14340e630c267db07 Jan Allersma 2018-12-11 13:23:32
Implement `run` and `build` commands. 14e9e25b6a06f587c1a50829e72c829ae59a87c2 Jan Allersma 2018-12-10 20:57:08
Implement non-recursive dependency check. 5ffd40604755d1c2dde9353c74f06a006deea33c Jan Allersma 2018-12-07 20:50:42
Restructure project. c2d98caf7897e87284fb2891e1d4b92d14cf37e1 Jan Allersma 2018-12-06 16:20:46
Initial commit. 4c152d55edc20ac55fd749a2b32b204134a664e3 Jan Allersma 2018-12-05 17:03:08
Commit 0ebc5b3769e50c3463bdc39af0160c7db0d3f00b - Git integration.
* Fix `add` command.
* Fix `hide` command.
* Format 'help' message correctly.
Author: Jan Allersma
Author date (UTC): 2019-01-03 17:34
Committer name: Jan Allersma
Committer date (UTC): 2019-01-03 17:34
Parent(s): ab693b8fd91c93dfd7ee7b82cbae75b2a6043b0f
Signing key:
Tree: 115aa55f33e73aba5630497ae76015113db1f812
File Lines added Lines deleted
src/backend/add.rs 7 6
src/backend/filesystem.rs 1 1
src/backend/git/exe.rs 73 0
src/backend/git/ignore.rs 13 3
src/backend/git/mod.rs 28 1
src/backend/git/rec.rs 0 1
src/backend/project.rs 35 6
src/parser.rs 11 7
File src/backend/add.rs changed (mode: 100644) (index 9fe9717..d94694a)
... ... extern crate serde_json;
3 3 use std::result::Result; use std::result::Result;
4 4 use std::path::PathBuf; use std::path::PathBuf;
5 5
6 pub fn add<I>(args: &mut I) -> Result<String, String> where I: Iterator<Item=String> {
6 pub fn add(args: &Vec<String>) -> Result<String, String> {
7 let mut it = args.iter().peekable();
7 8 let dep_dir: PathBuf; let dep_dir: PathBuf;
8 9
9 let dep_name = match args.next() {
10 Some(name) => name,
10 let dep_name: String = match it.next() {
11 Some(arg) => (*arg).clone(),
11 12 None => return Err(String::from("Missing dependency name!")) None => return Err(String::from("Missing dependency name!"))
12 13 }; };
13 14
 
... ... pub fn add<I>(args: &mut I) -> Result<String, String> where I: Iterator<Item=Str
23 24 return Err(String::from("Dependency already exists.")) return Err(String::from("Dependency already exists."))
24 25 } }
25 26
26 let mut args: String = args.into_iter().map(|arg| arg + " ").collect();
27 let mut args_s: String = it.map(|arg| arg.clone() + " ").collect();
27 28
28 match args.pop() {
29 Some(_) => update_module(dep_name, args),
29 match args_s.pop() {
30 Some(_) => update_module(dep_name, args_s),
30 31 None => update_module(dep_name, String::new()) None => update_module(dep_name, String::new())
31 32 } }
32 33 } }
File src/backend/filesystem.rs changed (mode: 100644) (index e7d35ba..3a5e3b9)
1 1 use std::{path, env, fs}; use std::{path, env, fs};
2 2 use std::io::{Result, Error, ErrorKind}; use std::io::{Result, Error, ErrorKind};
3 3
4 fn get_root (mut path: path::PathBuf) -> Option<path::PathBuf> {
4 fn get_root(mut path: path::PathBuf) -> Option<path::PathBuf> {
5 5 loop { loop {
6 6 let mut config = path.clone(); let mut config = path.clone();
7 7 config.push("beheer.json"); config.push("beheer.json");
File src/backend/git/exe.rs added (mode: 100644) (index 0000000..3102c93)
1 use backend;
2 use backend::system::OS;
3 use backend::deptree::Node;
4 use std::process::{Command, Stdio};
5 use std::path::PathBuf;
6
7 pub fn exe_rec(args: Vec<String>) -> Result<(), String> {
8 let tree: Node;
9 let mut dependency: &Node;
10
11 match backend::filesystem::get_current_project_root() {
12 Some(path) => {
13 match backend::deptree::print(&OS::current(), path) {
14 Ok(node) => {
15 tree = node;
16 dependency = &tree;
17 },
18 Err(e) => return Err(e)
19 }
20 }
21 None => return Err(String::from("Not in a project (sub)directory."))
22 }
23
24 loop {
25 match to_shell(&dependency.path, args.clone()) {
26 Ok(msg) => {
27 println!("{}", msg);
28 println!("Module {}: {}\n", dependency.name, "Git command successfully executed!");
29 },
30 Err(e) => return Err(e)
31 }
32
33 match dependency.depends_on.iter().next() {
34 Some(dep) => dependency = dep,
35 None => break
36 }
37 }
38 Ok(())
39 }
40
41 pub fn exe(path: &PathBuf, args: Vec<String>) -> Result<(), String> {
42 match to_shell(path, args) {
43 Ok(msg) => {
44 println!("{}", msg);
45 println!("Git command successfully executed!");
46 Ok(())
47 },
48 Err(e) => Err(e)
49 }
50 }
51
52 fn to_shell<I>(path: &PathBuf, args: I) -> Result<String, String> where I: IntoIterator<Item=String> {
53 let out = Command::new("git")
54 .current_dir(path)
55 .args(args)
56 .stdin(Stdio::inherit())
57 .stdout(Stdio::inherit())
58 .output();
59
60 match out {
61 Ok(response) => {
62 match response.status.success() {
63 true => Ok(String::from_utf8_lossy(&response.stdout).to_string()),
64 false => Err(String::from_utf8_lossy(&response.stderr).to_string())
65 }
66 },
67 Err(e) => {
68 let mut error = String::from("Git (sub)command failed: command invalid. Details: ");
69 error.push_str(&e.to_string());
70 Err(error)
71 }
72 }
73 }
File src/backend/git/ignore.rs changed (mode: 100644) (index 2b17844..8f135f3)
1 use std::io::Write;
1 use std::io::{ErrorKind, Write};
2 2 use std::path::PathBuf; use std::path::PathBuf;
3 3 use std::fs::OpenOptions; use std::fs::OpenOptions;
4 4
 
... ... pub fn add(path: &mut PathBuf, item: &mut String) -> Result<(), String> {
8 8
9 9 let file_options = OpenOptions::new() let file_options = OpenOptions::new()
10 10 .append(true) .append(true)
11 .open(path);
11 .open(&path);
12 12
13 13 match file_options { match file_options {
14 14 Ok(mut file) => { Ok(mut file) => {
 
... ... pub fn add(path: &mut PathBuf, item: &mut String) -> Result<(), String> {
17 17 Err(e) => Err(e.to_string()) Err(e) => Err(e.to_string())
18 18 } }
19 19 }, },
20 Err(e) => Err(e.to_string())
20 Err(e) => {
21 match e.kind() {
22 ErrorKind::NotFound => {
23 let mut error = String::from(path.to_str().unwrap());
24 error.push_str(" not found");
25 Err(error)
26 },
27 ErrorKind::PermissionDenied => Err(String::from("gitignore file unreadable: permission denied.")),
28 _ => Err(e.to_string())
29 }
30 }
21 31 } }
22 32 } }
File src/backend/git/mod.rs changed (mode: 100644) (index bf699b5..07c06c2)
1 mod rec;
2 1 pub mod status; pub mod status;
3 2 pub mod ignore; pub mod ignore;
3 mod exe;
4
5 pub fn to_shell<I>(args: &mut I) where I: Iterator<Item=String> {
6 match args.next() {
7 Some(ref arg) if arg == "rec" => match exe::exe_rec(args.collect()) {
8 Ok(_) => {},
9 Err(e) => println!("Executing recursive git command failed. Details: {}", e)
10 },
11 Some(git) => {
12 let path = match super::filesystem::get_current_project_root() {
13 Some(result) => result,
14 None => {
15 println!("Executing git command failed. Details: {}", "Not in a project (sub)directory.");
16 return;
17 }
18 };
19
20 let mut args: Vec<String> = args.collect();
21 args.insert(0, git);
22
23 match exe::exe(&path, args) {
24 Ok(_) => {},
25 Err(e) => println!("Executing git command failed. Details: {}", e)
26 }
27 },
28 None => {}
29 }
30 }
File src/backend/git/rec.rs deleted (index 27ff93a..0000000)
1 extern crate git2;
File src/backend/project.rs changed (mode: 100644) (index 83054f2..7540211)
... ... pub fn delete<I>(path: &mut I) -> Result<String, String> where I: Iterator<Item=
95 95 } }
96 96 } }
97 97
98 pub fn ignore<I>(args: &mut I) -> Result<(), String> where I: Iterator<Item=String> {
99 let mut path = match args.next() {
100 Some(arg) => arg,
98 pub fn add(args: &Vec<String>) -> Result<String, String> {
99 let mut path: String = match args.get(0) {
100 Some(arg) => arg.clone(),
101 101 None => return Err(String::from("Missing path as argument.")) None => return Err(String::from("Missing path as argument."))
102 102 }; };
103 103
104 match env::current_dir() {
105 Ok(mut dir) => super::git::ignore::add(&mut dir, &mut path),
104 match super::filesystem::get_current_module_root() {
105 Some(dir) => {
106 match super::git::ignore::add(&mut dir.clone(), &mut path) {
107 Ok(_) => {},
108 Err(e) => return Err(e)
109 }
110
111 match super::add::add(args) {
112 Ok(msg) => println!("{}", msg),
113 Err(e) => return Err(e)
114 }
115
116 match super::config::get_json(dir) {
117 Ok(json) => {
118 super::dep::check(json)
119 },
120 Err(e) => return Err(e)
121 }
122 },
123 None => Err(String::from("Not in a project (sub)directory."))
124 }
125 }
126
127 pub fn ignore(args: &Vec<String>) -> Result<(), String> {
128 let mut entry: String = args.get(0).unwrap().clone();
129
130 match super::filesystem::get_current_dep_root() {
131 Ok(mut dir) => {
132 dir.push(&entry);
133 super::git::ignore::add(&mut dir, &mut entry) // entry moet "beheer.json" worden.
134 },
106 135 Err(e) => Err(e.to_string()) Err(e) => Err(e.to_string())
107 136 } }
108 137 } }
 
... ... pub fn help() {
128 157 println!("$ beheer [FLAG] [COMMAND [ARGUMENTS]]"); println!("$ beheer [FLAG] [COMMAND [ARGUMENTS]]");
129 158 println!(""); println!("");
130 159
131 println!("--help -h\t\tShow this message");
160 println!("--help -h\t\t\t\tShow this message");
132 161 println!(""); println!("");
133 162
134 163 println!("init [DIRECTORY]\t\t Initialize new project in specified directory. Defaults to current directory."); println!("init [DIRECTORY]\t\t Initialize new project in specified directory. Defaults to current directory.");
File src/parser.rs changed (mode: 100644) (index cca6685..9d1a6ea)
... ... fn parse<I>(args: &mut I, open_shell: bool) -> bool where I: Iterator<Item=Strin
43 43 } }
44 44 } }
45 45 else if argument == "add" { else if argument == "add" {
46 match backend::add::add(args) {
46 match backend::project::add(&args.collect()) {
47 47 Ok(msg) => println!("{}", msg), Ok(msg) => println!("{}", msg),
48 48 Err(e) => println!("Could not add dependency: {}", e) Err(e) => println!("Could not add dependency: {}", e)
49 49 } }
50 50 } }
51 51 else if argument == "hide" { else if argument == "hide" {
52 let result = match backend::project::ignore(args) {
53 Ok(_) => backend::add::add(args),
54 Err(e) => Err(e)
55 };
56
57 match result {
52 let args: Vec<String> = args.collect();
53 match backend::project::add(&args) {
58 54 Ok(msg) => println!("{}", msg), Ok(msg) => println!("{}", msg),
59 55 Err(e) => println!("Could not add dependency: {}", e) Err(e) => println!("Could not add dependency: {}", e)
60 56 } }
57
58 match backend::project::ignore(&args) {
59 Ok(_) => println!("DONE! Dependency hidden."),
60 Err(e) => println!("Could not hide dependency: {}", e)
61 }
61 62 } }
62 63 else if argument == "delete" { else if argument == "delete" {
63 64 match backend::project::delete(args) { match backend::project::delete(args) {
 
... ... fn parse<I>(args: &mut I, open_shell: bool) -> bool where I: Iterator<Item=Strin
71 72 Err(e) => println!("Could not deduce dependency tree: {}", e) Err(e) => println!("Could not deduce dependency tree: {}", e)
72 73 } }
73 74 } }
75 else if argument == "git" {
76 backend::git::to_shell(args);
77 }
74 78 else { else {
75 79 return false; return false;
76 80 } }
Hints:
Before first commit, do not forget to setup your git environment:
git config --global user.name "your_name_here"
git config --global user.email "your@email_here"

Clone this repository using HTTP(S):
git clone https://rocketgit.com/user/kapstok/NHL-Beheer

Clone this repository using ssh (do not forget to upload a key first):
git clone ssh://rocketgit@ssh.rocketgit.com/user/kapstok/NHL-Beheer

Clone this repository using git:
git clone git://git.rocketgit.com/user/kapstok/NHL-Beheer

You are allowed to anonymously push to this repository.
This means that your pushed commits will automatically be transformed into a merge request:
... clone the repository ...
... make some changes and some commits ...
git push origin main