GeezerVison is showing github.com — Merge pull request #11 from oSoMoN/compact-range-of-lines · uutils/diffutils@02632e9
File treeExpand file treeCollapse file tree Open diff view settings Expand file treeCollapse file tree Open diff view settings Collapse file Copy file name to clipboardExpand all lines: src/normal_diff.rs +44Lines changed: 44 additions & 0 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -111,6 +111,8 @@ fn make_diff(expected: &[u8], actual: &[u8]) -> Vec<Mismatch> { | 111 | 111 |
| 112 | 112 | #[must_use] | 113 | 113 | pub fn diff(expected: &[u8], actual: &[u8]) -> Vec<u8> { | | 114 | + // See https://www.gnu.org/software/diffutils/manual/html_node/Detailed-Normal.html | | 115 | + // for details on the syntax of the normal format. | 114 | 116 | let mut output = Vec::new(); | 115 | 117 | let diff_results = make_diff(expected, actual); | 116 | 118 | for result in diff_results { | @@ -121,6 +123,7 @@ pub fn diff(expected: &[u8], actual: &[u8]) -> Vec<u8> { | 121 | 123 | match (expected_count, actual_count) { | 122 | 124 | (0, 0) => unreachable!(), | 123 | 125 | (0, _) => writeln!( | | 126 | + // 'a' stands for "Add lines" | 124 | 127 | &mut output, | 125 | 128 | "{}a{},{}", | 126 | 129 | line_number_expected - 1, | @@ -129,14 +132,43 @@ pub fn diff(expected: &[u8], actual: &[u8]) -> Vec<u8> { | 129 | 132 | ) | 130 | 133 | .unwrap(), | 131 | 134 | (_, 0) => writeln!( | | 135 | + // 'd' stands for "Delete lines" | 132 | 136 | &mut output, | 133 | 137 | "{},{}d{}", | 134 | 138 | line_number_expected, | 135 | 139 | expected_count + line_number_expected - 1, | 136 | 140 | line_number_actual - 1 | 137 | 141 | ) | 138 | 142 | .unwrap(), | | 143 | + (1, 1) => writeln!( | | 144 | + // 'c' stands for "Change lines" | | 145 | + // exactly one line replaced by one line | | 146 | + &mut output, | | 147 | + "{}c{}", | | 148 | + line_number_expected, | | 149 | + line_number_actual | | 150 | + ) | | 151 | + .unwrap(), | | 152 | + (1, _) => writeln!( | | 153 | + // one line replaced by multiple lines | | 154 | + &mut output, | | 155 | + "{}c{},{}", | | 156 | + line_number_expected, | | 157 | + line_number_actual, | | 158 | + actual_count + line_number_actual - 1 | | 159 | + ) | | 160 | + .unwrap(), | | 161 | + (_, 1) => writeln!( | | 162 | + // multiple lines replaced by one line | | 163 | + &mut output, | | 164 | + "{},{}c{}", | | 165 | + line_number_expected, | | 166 | + expected_count + line_number_expected - 1, | | 167 | + line_number_actual | | 168 | + ) | | 169 | + .unwrap(), | 139 | 170 | _ => writeln!( | | 171 | + // general case: multiple lines replaced by multiple lines | 140 | 172 | &mut output, | 141 | 173 | "{},{}c{},{}", | 142 | 174 | line_number_expected, | @@ -173,6 +205,18 @@ pub fn diff(expected: &[u8], actual: &[u8]) -> Vec<u8> { | 173 | 205 | mod tests { | 174 | 206 | use super::*; | 175 | 207 | use pretty_assertions::assert_eq; | | 208 | + | | 209 | + #[test] | | 210 | + fn test_basic() { | | 211 | + let mut a = Vec::new(); | | 212 | + a.write_all(b"a\n").unwrap(); | | 213 | + let mut b = Vec::new(); | | 214 | + b.write_all(b"b\n").unwrap(); | | 215 | + let diff = diff(&a, &b); | | 216 | + let expected = b"1c1\n< a\n---\n> b\n".to_vec(); | | 217 | + assert_eq!(diff, expected); | | 218 | + } | | 219 | + | 176 | 220 | #[test] | 177 | 221 | fn test_permutations() { | 178 | 222 | let target = "target/normal-diff/"; | |
|