Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
810 changes: 792 additions & 18 deletions src/formatting.rs

Large diffs are not rendered by default.

39 changes: 39 additions & 0 deletions src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ use nu_formatter::Mode;
use rayon::iter::{IntoParallelIterator, ParallelIterator};
use std::convert::TryFrom;
use std::{
collections::BTreeMap,
io::{self, Write},
path::{Path, PathBuf},
};
Expand Down Expand Up @@ -334,9 +335,22 @@ fn discover_nu_files(
})
.collect();

let nu_files = deduplicate_discovered_files(nu_files);

Ok((nu_files, invalid_paths))
}

fn deduplicate_discovered_files(paths: Vec<PathBuf>) -> Vec<PathBuf> {
let mut unique: BTreeMap<PathBuf, PathBuf> = BTreeMap::new();

for path in paths {
let key = path.canonicalize().unwrap_or_else(|_| path.clone());
unique.entry(key).or_insert(path);
}

unique.into_values().collect()
}

/// Build override rules for excluded patterns
fn build_overrides(excludes: &[String]) -> Result<ignore::overrides::Override, ConfigError> {
let mut builder = OverrideBuilder::new(".");
Expand Down Expand Up @@ -466,4 +480,29 @@ mod tests {
let exit_code = display_diagnostic_and_compute_exit_code(&results, check_mode);
assert_eq!(exit_code, expected);
}

#[test]
fn discover_nu_files_deduplicates_overlapping_paths() {
let dir = tempdir().unwrap();
let nested = dir.path().join("nested");
fs::create_dir_all(&nested).unwrap();

let target = nested.join("a.nu");
fs::write(&target, "let x = 1").unwrap();

let (files, invalid) =
discover_nu_files(vec![dir.path().to_path_buf(), nested.clone()], &[])
.expect("discovery should succeed");

assert!(invalid.is_empty());

let canonical_target = target.canonicalize().unwrap();
let matches = files
.iter()
.filter_map(|path| path.canonicalize().ok())
.filter(|path| *path == canonical_target)
.count();

assert_eq!(matches, 1, "file should be discovered exactly once");
}
}
7 changes: 4 additions & 3 deletions tests/fixtures/expected/comment.nu
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ let z = 3 # inline comment
# consecutive
# comments
def foo [] { 1 }
def bar [] {
# comment inside block
print "hello" }
def bar [] {
# comment inside block
print "hello"
}
3 changes: 3 additions & 0 deletions tests/fixtures/expected/issue108.nu
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
def foo []: nothing -> nothing {
let xs = [1 2 3]
}
5 changes: 5 additions & 0 deletions tests/fixtures/expected/issue109.nu
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
def foo []: nothing -> nothing {
for h in [1 2 3] {
print $h
}
}
6 changes: 6 additions & 0 deletions tests/fixtures/expected/issue110.nu
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
def foo []: nothing -> nothing {
let x = (bar
"4444444444444444444444444444444444444444"
"5555555555555555555555555555555555555555"
)
}
4 changes: 4 additions & 0 deletions tests/fixtures/expected/issue116.nu
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
def foo []: bool -> bool {
let yesno: bool = ($in | str trim) == "yes"
$yesno
}
7 changes: 7 additions & 0 deletions tests/fixtures/expected/issue119.nu
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
def foo []: nothing -> nothing {
let result = $items | from json | if ($in | default [] | where value == "ERR" | is-empty) {
$in # test
} else {
null
}
}
3 changes: 3 additions & 0 deletions tests/fixtures/expected/issue120.nu
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
def foo [] {
if true { 1 } else { 2 }
}
3 changes: 3 additions & 0 deletions tests/fixtures/expected/issue121.nu
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
def foo [] {
if true { 1 } else { 2 }
}
3 changes: 3 additions & 0 deletions tests/fixtures/expected/issue122.nu
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
def foo [] {
let user = { name:"Alice", age:30 }
}
2 changes: 1 addition & 1 deletion tests/fixtures/expected/subexpression.nu
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,4 @@ let result = (1 + 2) * 3
let value = ($x + (($y * 2)))
print (echo "hello")
let msg = $"Hello ($name)"
if (true) { print "yes" }
if true { print "yes" }
3 changes: 3 additions & 0 deletions tests/fixtures/input/issue108.nu
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
def foo []: nothing -> nothing {
let xs = [1 2 3]
}
5 changes: 5 additions & 0 deletions tests/fixtures/input/issue109.nu
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
def foo []: nothing -> nothing {
for h in [1 2 3] {
print $h
}
}
6 changes: 6 additions & 0 deletions tests/fixtures/input/issue110.nu
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
def foo []: nothing -> nothing {
let x = (bar
"4444444444444444444444444444444444444444"
"5555555555555555555555555555555555555555"
)
}
4 changes: 4 additions & 0 deletions tests/fixtures/input/issue116.nu
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
def foo []: bool -> bool {
let yesno: bool = ($in | str trim) == "yes"
$yesno
}
6 changes: 6 additions & 0 deletions tests/fixtures/input/issue119.nu
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
def foo []: nothing -> nothing {
let result = $items | from json | if ($in | default [] | where value == "ERR" | is-empty) {
$in # test
} else { null
}
}
3 changes: 3 additions & 0 deletions tests/fixtures/input/issue120.nu
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
def foo [] {
if(true){1}else{2}
}
3 changes: 3 additions & 0 deletions tests/fixtures/input/issue121.nu
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
def foo [] {
if true {1}else{2}
}
3 changes: 3 additions & 0 deletions tests/fixtures/input/issue122.nu
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
def foo [] {
let user = {name:"Alice"age:30}
}
8 changes: 8 additions & 0 deletions tests/ground_truth.rs
Original file line number Diff line number Diff line change
Expand Up @@ -808,4 +808,12 @@ issue_fixture_tests!(
("issue97", issue97_test, idempotency_issue97_test),
("issue100", issue100_test, idempotency_issue100_test),
("issue101", issue101_test, idempotency_issue101_test),
("issue108", issue108_test, idempotency_issue108_test),
("issue109", issue109_test, idempotency_issue109_test),
("issue110", issue110_test, idempotency_issue110_test),
("issue116", issue116_test, idempotency_issue116_test),
("issue119", issue119_test, idempotency_issue119_test),
("issue120", issue120_test, idempotency_issue120_test),
("issue121", issue121_test, idempotency_issue121_test),
("issue122", issue122_test, idempotency_issue122_test),
);
Loading