Skip to content

Commit

Permalink
Draft: add debug log (#26)
Browse files Browse the repository at this point in the history
* add debug logger

* fix

* fix regex

* change regex

* implement remove_generation and add test

* fix: needless borrow

* refactor

* fmt

* fix test
  • Loading branch information
hirosassa authored Nov 5, 2022
1 parent 5c55661 commit f4c1d8c
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 11 deletions.
3 changes: 2 additions & 1 deletion src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ mod template;
use anyhow::{Context, Result};
use clap::Parser;
use clap_verbosity_flag::Verbosity;
use log::{error, info};
use log::{debug, error, info};
use notifier::Notifiable;
use parser::Parsable;
use std::io::{self, Read};
Expand Down Expand Up @@ -51,6 +51,7 @@ fn run() -> Result<()> {
env_logger::Builder::new()
.filter_level(cli.verbose.log_level_filter())
.init();
debug!("verbose mode");

let config =
config::Config::new(&cli).with_context(|| format!("failed to load config: {:?}", cli))?;
Expand Down
4 changes: 2 additions & 2 deletions src/notifier/gitlab.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@ impl GitlabNotifier {

let base_url = Self::get_base_url()?;
let token = Self::get_token()?;
let client = Gitlab::new(&base_url, &token)
.with_context(|| "failed to create client".to_string())?;
let client =
Gitlab::new(base_url, token).with_context(|| "failed to create client".to_string())?;
let project = Self::get_project()?;
Ok(Self {
client,
Expand Down
76 changes: 68 additions & 8 deletions src/parser.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
use anyhow::Result;
use log::debug;
use regex::Regex;
use std::collections::HashMap;

Expand All @@ -16,20 +17,23 @@ pub struct DiffParser {
diff: Regex,
skaffold: Regex,
suppress_skaffold: bool,
generation: Regex,
}

impl DiffParser {
pub fn new(suppress_skaffold: bool) -> Result<Self> {
let kind = Regex::new(r"(?m)^diff -u\s.*/(?P<kind>[^/\s]+)\s.*/([^/\s]+)$")?; // matches line like "diff -uN /var/folders/fl/blahblah/[apiVersion].[kind].[namespace].[name] /var/folders/fl/blahblah/[apiVersion].[kind].[namespace].[name]"
let header = Regex::new(r"(?m)^.*/var/folders/.*$")?; // matches diff header that contains "/var/folders/fl/blahblah/"
let kind = Regex::new(r"(?m)^diff -u -N\s.*/(?P<kind>[^/\s]+)\s.*/([^/\s]+)$")?; // matches line like "diff -u -N /var/folders/fl/blahblah/[apiVersion].[kind].[namespace].[name] /var/folders/fl/blahblah/[apiVersion].[kind].[namespace].[name]"
let header = Regex::new(r"(?m)^((diff -u -N)|(\-\-\-)|(\+\+\+)).*$")?; // matches diff header that starts with "diff -u -N" or "---" or "+++"
let diff = Regex::new(r"(?m)^[\-\+].*$")?;
let skaffold = Regex::new(r"(?m)^(.*labels:.*\r?\n?)?.*skaffold.dev/run-id.*\r?\n?")?;
let generation = Regex::new(r"(?m)^.*generation: \d+.*\r?\n?")?;
Ok(Self {
kind,
header,
diff,
skaffold,
suppress_skaffold,
generation,
})
}

Expand Down Expand Up @@ -57,10 +61,26 @@ impl DiffParser {
.collect()
}

fn suppress_generation_fields(
&self,
result: HashMap<String, String>,
) -> HashMap<String, String> {
result
.iter()
.map(|(kind, diff)| (kind, self.remove_generation_fields(diff)))
.filter(|(_kind, diff)| self.is_there_any_diff(diff))
.map(|(kind, diff)| (kind.to_string(), diff))
.collect()
}

fn remove_skaffold_labels(&self, diff: &str) -> String {
self.skaffold.replace_all(diff, "").to_string()
}

fn remove_generation_fields(&self, diff: &str) -> String {
self.generation.replace_all(diff, "").to_string()
}

fn is_there_any_diff(&self, body: &str) -> bool {
self.diff.is_match(body)
}
Expand All @@ -69,18 +89,22 @@ impl DiffParser {
impl Parsable for DiffParser {
fn parse(&self, diff: &str) -> Result<ParseResult> {
let kinds = self.parse_kinds(diff);
eprintln!("{:?}", kinds);
debug!("kinds: {:?}", kinds);
let chunked_diff = self.parse_diff(diff);
debug!("chunked diff: {:?}", chunked_diff);

let mut result: HashMap<_, _> = kinds
.iter()
.zip(chunked_diff.iter())
.map(|(k, v)| (k.to_string(), v.to_string()))
.collect();

result = self.suppress_generation_fields(result);

if self.suppress_skaffold {
result = self.suppress_skaffold_labels(result);
}
debug!("result: {:?}", result);

Ok(ParseResult {
kind_result: result,
Expand All @@ -97,19 +121,19 @@ mod tests {
let diff = "diff -u -N /var/folders/fl/blahblah/v1.Service.test.test-app1 /var/folders/fl/blahblah/v1.Service.test.test-app1
--- /var/folders/fl/blahblah/v1.Service.test.test-app 2022-02-22 22:00:00.000000000 +0900
+++ /var/folders/fl/blahblah/v1.Service.test.test-app 2022-02-22 22:00:00.000000000 +0900
ABCDE
FGHIJ
- ABCDE
+ FGHIJ
diff -u -N /var/folders/fl/blahblah/v1.Service.test.test-app2 /var/folders/fl/blahblah/v1.Service.test.test-app2
--- /var/folders/fl/blahblah/v1.Service.test.test-app 2022-02-22 22:00:00.000000000 +0900
+++ /var/folders/fl/blahblah/v1.Service.test.test-app 2022-02-22 22:00:00.000000000 +0900
12345
67890";
- 12345
+ 67890";
let parser = self::DiffParser::new(false).unwrap();
let actual = parser.parse(diff).unwrap();
assert_eq!(actual.kind_result.len(), 2);

let keys = vec!["v1.Service.test.test-app1", "v1.Service.test.test-app2"];
let values = vec!["ABCDE\nFGHIJ", "12345\n67890"];
let values = vec!["- ABCDE\n+ FGHIJ", "- 12345\n+ 67890"];
for (k, v) in keys.iter().zip(values) {
assert_eq!(actual.kind_result[&k.to_string()], v.to_string())
}
Expand Down Expand Up @@ -279,6 +303,42 @@ hij";
creationTimestamp: null
spec:
containers:
";
assert_eq!(actual, expected);
}

#[test]
fn test_remove_generation_fields_removes_generation_fields() {
let diff = "
@@ -5,9 +5,7 @@
- generation: 18
+ generation: 19
name: test-app
namespace: test
";
let parser = self::DiffParser::new(true).unwrap();
let actual = parser.remove_generation_fields(diff);
let expected = "
@@ -5,9 +5,7 @@
name: test-app
namespace: test
";
assert_eq!(actual, expected);
}

#[test]
fn test_remove_generation_fields_do_nothing() {
let diff = "
@@ -5,9 +5,7 @@
name: test-app
namespace: test
";
let parser = self::DiffParser::new(true).unwrap();
let actual = parser.remove_generation_fields(diff);
let expected = "
@@ -5,9 +5,7 @@
name: test-app
namespace: test
";
assert_eq!(actual, expected);
}
Expand Down

0 comments on commit f4c1d8c

Please sign in to comment.