From: "Ezekiel Newren via GitGitGadget" <gitgitgadget@gmail•com>
To: git@vger•kernel.org
Cc: "Elijah Newren" <newren@gmail•com>,
"brian m. carlson" <sandals@crustytoothpaste•net>,
"Taylor Blau" <me@ttaylorr•com>,
"Christian Brabandt" <cb@256bit•org>,
"Phillip Wood" <phillip.wood123@gmail•com>,
"Eli Schwartz" <eschwartz@gentoo•org>,
"Haelwenn (lanodan) Monnier" <contact@hacktivis•me>,
"Johannes Schindelin" <Johannes.Schindelin@gmx•de>,
"Matthias Aßhauer" <mha1993@live•de>,
"Patrick Steinhardt" <ps@pks•im>, "Sam James" <sam@gentoo•org>,
"Collin Funk" <collin.funk1@gmail•com>,
"Mike Hommey" <mh@glandium•org>,
"Pierre-Emmanuel Patry" <pierre-emmanuel.patry@embecosm•com>,
"Ben Knoble" <ben.knoble@gmail•com>,
"Ezekiel Newren" <ezekielnewren@gmail•com>,
"Ezekiel Newren" <ezekielnewren@gmail•com>
Subject: [PATCH v2 14/17] xdiff: implement a white space iterator in Rust
Date: Fri, 15 Aug 2025 01:22:49 +0000 [thread overview]
Message-ID: <f20efdff7aa0a02ca2585de0cd9de21bbff22d58.1755220973.git.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.1980.v2.git.git.1755220973.gitgitgadget@gmail.com>
From: Ezekiel Newren <ezekielnewren@gmail•com>
Xdiff has traditionally implemented the logic for iterating over
whitespace in every location that needed to do so. Create a consolidated
iterator in Rust that we can call from each location. Write Rust unit
tests to ensure the correctness of the Rust whitespace iterator and the
chunked_iter_equal() function.
Signed-off-by: Ezekiel Newren <ezekielnewren@gmail•com>
---
rust/xdiff/src/lib.rs | 10 ++
rust/xdiff/src/xutils.rs | 292 +++++++++++++++++++++++++++++++++++++++
2 files changed, 302 insertions(+)
create mode 100644 rust/xdiff/src/xutils.rs
diff --git a/rust/xdiff/src/lib.rs b/rust/xdiff/src/lib.rs
index 96975975a1ba..9cf0462bcdb9 100644
--- a/rust/xdiff/src/lib.rs
+++ b/rust/xdiff/src/lib.rs
@@ -1,3 +1,13 @@
+pub mod xutils;
+
+pub const XDF_IGNORE_WHITESPACE: u64 = 1 << 1;
+pub const XDF_IGNORE_WHITESPACE_CHANGE: u64 = 1 << 2;
+pub const XDF_IGNORE_WHITESPACE_AT_EOL: u64 = 1 << 3;
+pub const XDF_IGNORE_CR_AT_EOL: u64 = 1 << 4;
+pub const XDF_WHITESPACE_FLAGS: u64 = XDF_IGNORE_WHITESPACE |
+ XDF_IGNORE_WHITESPACE_CHANGE |
+ XDF_IGNORE_WHITESPACE_AT_EOL |
+ XDF_IGNORE_CR_AT_EOL;
#[no_mangle]
diff --git a/rust/xdiff/src/xutils.rs b/rust/xdiff/src/xutils.rs
new file mode 100644
index 000000000000..38126b47292f
--- /dev/null
+++ b/rust/xdiff/src/xutils.rs
@@ -0,0 +1,292 @@
+use crate::*;
+
+pub(crate) fn xdl_isspace(v: u8) -> bool {
+ match v {
+ b'\t' | b'\n' | b'\r' | b' ' => true,
+ _ => false,
+ }
+}
+
+pub struct WhitespaceIter<'a> {
+ line: &'a [u8],
+ index: usize,
+ flags: u64,
+}
+
+
+impl<'a> WhitespaceIter<'a> {
+ pub fn new(line: &'a [u8], flags: u64) -> Self {
+ Self {
+ line,
+ index: 0,
+ flags,
+ }
+ }
+}
+
+impl<'a> Iterator for WhitespaceIter<'a> {
+ type Item = &'a [u8];
+
+ fn next(&mut self) -> Option<Self::Item> {
+ if self.index >= self.line.len() {
+ return None;
+ }
+
+ loop {
+ let start = self.index;
+ if self.index == self.line.len() {
+ return None;
+ }
+
+ /* return contiguous run of not space bytes */
+ while self.index < self.line.len() {
+ if xdl_isspace(self.line[self.index]) {
+ break;
+ }
+ self.index += 1;
+ }
+ if self.index > start {
+ return Some(&self.line[start..self.index]);
+ }
+ /* the current byte had better be a space */
+ if !xdl_isspace(self.line[self.index]) {
+ panic!("xdl_line_iter_next xdl_isspace() is false")
+ }
+
+ while self.index < self.line.len() && xdl_isspace(self.line[self.index]) {
+ self.index += 1;
+ }
+
+
+ if self.index <= start {
+ panic!("xdl_isspace() cannot simultaneously be true and false");
+ }
+
+ if (self.flags & XDF_IGNORE_WHITESPACE_AT_EOL) != 0
+ && self.index == self.line.len()
+ {
+ return None;
+ }
+ if (self.flags & XDF_IGNORE_WHITESPACE) != 0 {
+ continue;
+ }
+ if (self.flags & XDF_IGNORE_WHITESPACE_CHANGE) != 0 {
+ if self.index == self.line.len() {
+ continue;
+ }
+ return Some(" ".as_bytes());
+ }
+ if (self.flags & XDF_IGNORE_CR_AT_EOL) != 0 {
+ if start < self.line.len() && self.index == self.line.len() {
+ let mut end = self.line.len();
+ if end > 0 && self.line[end - 1] == b'\n' {
+ if end - start == 1 {
+ return Some(&self.line[start..end]);
+ } else {
+ end -= 1;
+ }
+ if end > 0 && self.line[end - 1] == b'\r' {
+ self.index = end;
+ end -= 1;
+ if end - start == 0 {
+ continue;
+ }
+ return Some(&self.line[start..end]);
+ }
+ }
+ }
+ }
+ return Some(&self.line[start..self.index]);
+ }
+ }
+}
+
+pub fn chunked_iter_equal<'a, T, IT0, IT1>(mut it0: IT0, mut it1: IT1) -> bool
+where
+ T: Eq + 'a,
+ IT0: Iterator<Item = &'a [T]>,
+ IT1: Iterator<Item = &'a [T]>,
+{
+ let mut run_option0: Option<&[T]> = it0.next();
+ let mut run_option1: Option<&[T]> = it1.next();
+ let mut i0 = 0;
+ let mut i1 = 0;
+
+ while let (Some(run0), Some(run1)) = (run_option0, run_option1) {
+ while i0 < run0.len() && i1 < run1.len() {
+ if run0[i0] != run1[i1] {
+ return false;
+ }
+
+ i0 += 1;
+ i1 += 1;
+ }
+
+ if i0 == run0.len() {
+ i0 = 0;
+ run_option0 = it0.next();
+ }
+ if i1 == run1.len() {
+ i1 = 0;
+ run_option1 = it1.next();
+ }
+ }
+
+ while let Some(run0) = run_option0 {
+ if run0.len() == 0 {
+ run_option0 = it0.next();
+ } else {
+ break;
+ }
+ }
+
+ while let Some(run1) = run_option1 {
+ if run1.len() == 0 {
+ run_option1 = it1.next();
+ } else {
+ break;
+ }
+ }
+
+ run_option0.is_none() && run_option1.is_none()
+}
+
+#[cfg(test)]
+mod tests {
+ use crate::*;
+ use crate::xutils::{chunked_iter_equal, WhitespaceIter};
+
+ fn extract_string<'a>(line: &[u8], flags: u64, buffer: &'a mut Vec<u8>) -> &'a str {
+ let it = WhitespaceIter::new(line, flags);
+ buffer.clear();
+ for run in it {
+ #[cfg(test)]
+ let _view = unsafe { std::str::from_utf8_unchecked(run) };
+ buffer.extend_from_slice(run);
+ }
+ unsafe { std::str::from_utf8_unchecked(buffer.as_slice()) }
+ }
+
+ fn get_str_it<'a>(slice: &'a [&'a str]) -> impl Iterator<Item = &'a [u8]> + 'a {
+ slice.iter().map(|v| (*v).as_bytes())
+ }
+
+ #[test]
+ fn test_ignore_space() {
+ let tv_individual = vec![
+ ("ab\r", "ab\r", XDF_IGNORE_CR_AT_EOL),
+ ("ab \r", "ab \r", XDF_IGNORE_CR_AT_EOL),
+ ("\r \t a \r", "\r \t a \r", XDF_IGNORE_CR_AT_EOL),
+ ("\r a \r", "\r a \r", XDF_IGNORE_CR_AT_EOL),
+ ("\r", "\r", XDF_IGNORE_CR_AT_EOL),
+ ("", "", XDF_IGNORE_CR_AT_EOL),
+ ("\r a \r", "\r a \r", XDF_IGNORE_CR_AT_EOL),
+
+ ("\r \t a \n", "\r \t a \r\n", XDF_IGNORE_CR_AT_EOL),
+ ("\r a \n", "\r a \r\n", XDF_IGNORE_CR_AT_EOL),
+ ("\n", "\r\n", XDF_IGNORE_CR_AT_EOL),
+ ("\n", "\n", XDF_IGNORE_CR_AT_EOL),
+ ("\r a \n", "\r a \n", XDF_IGNORE_CR_AT_EOL),
+
+ ("1\n", "1\r\n", XDF_IGNORE_CR_AT_EOL),
+ ("1", "1\r\n", XDF_IGNORE_WHITESPACE_CHANGE),
+
+ ("\r \t a \r\n", "\r \t a \r\n", 0),
+ ("\r a \r\n", "\r a \r\n", 0),
+ ("\r\n", "\r\n", 0),
+ ("\n", "\n", 0),
+ ("\r a \n", "\r a \n", 0),
+ (" \n", " \n", 0),
+ ("a \n", "a \n", 0),
+ (" a \t asdf \t \r\n", " a \t asdf \t \r\n", 0),
+ ("\t a b \t \n", "\t a b \t \n", 0),
+ (" a b \t \r\n", " a b \t \r\n", 0),
+ ("\t a \n", "\t a \n", 0),
+ ("\t\t\ta\t\n", "\t\t\ta\t\n", 0),
+ ("a\n", "a\n", 0),
+ ("\ta\n", "\ta\n", 0),
+
+ ("a", "\r \t a \r\n", XDF_IGNORE_WHITESPACE),
+ ("a", "\r a \r\n", XDF_IGNORE_WHITESPACE),
+ ("", "\r\n", XDF_IGNORE_WHITESPACE),
+ ("", "\n", XDF_IGNORE_WHITESPACE),
+ ("a", "\r a \n", XDF_IGNORE_WHITESPACE),
+ ("", " \n", XDF_IGNORE_WHITESPACE),
+ ("a", "a \n", XDF_IGNORE_WHITESPACE),
+ ("aasdf", " a \t asdf \t \r\n", XDF_IGNORE_WHITESPACE),
+ ("ab", "\t a b \t \n", XDF_IGNORE_WHITESPACE),
+ ("ab", " a b \t \r\n", XDF_IGNORE_WHITESPACE),
+ ("a", "\t a \n", XDF_IGNORE_WHITESPACE),
+ ("a", "\t\t\ta\t\n", XDF_IGNORE_WHITESPACE),
+ ("a", "a\n", XDF_IGNORE_WHITESPACE),
+ ("a", "\ta\n", XDF_IGNORE_WHITESPACE),
+
+ ("", " \n", XDF_IGNORE_WHITESPACE_AT_EOL),
+ ("a", "a \n", XDF_IGNORE_WHITESPACE_AT_EOL),
+ (" a \t asdf", " a \t asdf \t \r\n", XDF_IGNORE_WHITESPACE_AT_EOL),
+ ("\t a b", "\t a b \t \n", XDF_IGNORE_WHITESPACE_AT_EOL),
+
+ (" a b", " a b \t \r\n", XDF_IGNORE_WHITESPACE_CHANGE),
+ (" a", "\t a \n", XDF_IGNORE_WHITESPACE_CHANGE),
+ (" a", "\t\t\ta\t\n", XDF_IGNORE_WHITESPACE_CHANGE),
+ ("a", "a\n", XDF_IGNORE_WHITESPACE_CHANGE),
+ (" a", "\ta\n", XDF_IGNORE_WHITESPACE_CHANGE),
+
+ ("ab", " a b \t \r\n", XDF_IGNORE_WHITESPACE | XDF_IGNORE_WHITESPACE_CHANGE),
+ ("a", "\t a \n", XDF_IGNORE_WHITESPACE | XDF_IGNORE_WHITESPACE_CHANGE),
+ ("a", "\t\t\ta\t\n", XDF_IGNORE_WHITESPACE | XDF_IGNORE_WHITESPACE_CHANGE),
+ ("a", "a\n", XDF_IGNORE_WHITESPACE | XDF_IGNORE_WHITESPACE_CHANGE),
+ ("a", "\ta\n", XDF_IGNORE_WHITESPACE | XDF_IGNORE_WHITESPACE_CHANGE),
+ ];
+
+ let mut buffer = Vec::<u8>::new();
+ for (expected, input, flags) in tv_individual {
+ let actual = extract_string(input.as_bytes(), flags, &mut buffer);
+ assert_eq!(expected, actual, "input: {:?} flags: 0x{:x}", input, flags);
+ }
+ }
+
+ #[test]
+ fn test_chunked_iter_equal() {
+ let tv_str: Vec<(Vec<&str>, Vec<&str>)> = vec![
+ /* equal cases */
+ (vec!["", "", "abc"], vec!["", "abc"]),
+ (vec!["c", "", "a"], vec!["c", "a"]),
+ (vec!["a", "", "b", "", "c"], vec!["a", "b", "c"]),
+ (vec!["", "", "a"], vec!["a"]),
+ (vec!["", "a"], vec!["a"]),
+ (vec![""], vec![]),
+ (vec!["", ""], vec![""]),
+ (vec!["a"], vec!["", "", "a"]),
+ (vec!["a"], vec!["", "a"]),
+ (vec![], vec![""]),
+ (vec![""], vec!["", ""]),
+ (vec!["hello ", "world"], vec!["hel", "lo wo", "rld"]),
+ (vec!["hel", "lo wo", "rld"], vec!["hello ", "world"]),
+ (vec!["hello world"], vec!["hello world"]),
+ (vec!["abc", "def"], vec!["def", "abc"]),
+ (vec![], vec![]),
+
+ /* different cases */
+ (vec!["abc"], vec![]),
+ (vec!["", "", ""], vec!["", "a"]),
+ (vec!["", "a"], vec!["b", ""]),
+ (vec!["abc"], vec!["abc", "de"]),
+ (vec!["abc", "de"], vec!["abc"]),
+ (vec![], vec!["a"]),
+ (vec!["a"], vec![]),
+ (vec!["abc", "kj"], vec!["abc", "de"]),
+ ];
+
+ for (lhs, rhs) in tv_str.iter() {
+ let a: Vec<u8> = get_str_it(lhs).flatten().copied().collect();
+ let b: Vec<u8> = get_str_it(rhs).flatten().copied().collect();
+ let expected = a.as_slice() == b.as_slice();
+
+ let it0 = get_str_it(lhs);
+ let it1 = get_str_it(rhs);
+ let actual = chunked_iter_equal(it0, it1);
+ assert_eq!(expected, actual);
+ }
+ }
+}
--
gitgitgadget
next prev parent reply other threads:[~2025-08-15 1:23 UTC|newest]
Thread overview: 204+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-07-17 20:32 [PATCH 0/7] RFC: Accelerate xdiff and begin its rustification Ezekiel Newren via GitGitGadget
2025-07-17 20:32 ` [PATCH 1/7] xdiff: introduce rust Ezekiel Newren via GitGitGadget
2025-07-17 21:30 ` brian m. carlson
2025-07-17 21:54 ` Junio C Hamano
2025-07-17 22:39 ` Taylor Blau
2025-07-18 23:15 ` Ezekiel Newren
2025-07-23 21:57 ` brian m. carlson
2025-07-23 22:26 ` Junio C Hamano
2025-07-28 19:11 ` Ezekiel Newren
2025-07-31 22:37 ` brian m. carlson
2025-07-22 22:02 ` Mike Hommey
2025-07-22 23:52 ` brian m. carlson
2025-07-17 22:38 ` Taylor Blau
2025-07-17 20:32 ` [PATCH 2/7] xdiff/xprepare: remove superfluous forward declarations Ezekiel Newren via GitGitGadget
2025-07-17 22:41 ` Taylor Blau
2025-07-17 20:32 ` [PATCH 3/7] xdiff: delete unnecessary fields from xrecord_t and xdfile_t Ezekiel Newren via GitGitGadget
2025-07-17 20:32 ` [PATCH 4/7] xdiff: make fields of xrecord_t Rust friendly Ezekiel Newren via GitGitGadget
2025-07-17 22:46 ` Taylor Blau
2025-07-17 23:13 ` brian m. carlson
2025-07-17 23:37 ` Elijah Newren
2025-07-18 0:23 ` Taylor Blau
2025-07-18 0:21 ` Taylor Blau
2025-07-18 13:35 ` Phillip Wood
2025-07-28 19:34 ` Ezekiel Newren
2025-07-28 19:52 ` Phillip Wood
2025-07-28 20:14 ` Ezekiel Newren
2025-07-31 14:20 ` Phillip Wood
2025-07-31 20:58 ` Ezekiel Newren
2025-08-01 9:14 ` Phillip Wood
2025-07-28 20:53 ` Junio C Hamano
2025-07-28 20:00 ` Collin Funk
2025-07-20 1:39 ` Johannes Schindelin
2025-07-17 20:32 ` [PATCH 5/7] xdiff: separate parsing lines from hashing them Ezekiel Newren via GitGitGadget
2025-07-17 22:59 ` Taylor Blau
2025-07-18 13:34 ` Phillip Wood
2025-07-17 20:32 ` [PATCH 6/7] xdiff: conditionally use Rust's implementation of xxhash Ezekiel Newren via GitGitGadget
2025-07-17 23:29 ` Taylor Blau
2025-07-18 19:00 ` Junio C Hamano
2025-07-31 21:13 ` Ezekiel Newren
2025-08-02 7:53 ` Matthias Aßhauer
2025-07-19 21:53 ` Johannes Schindelin
2025-07-20 10:14 ` Phillip Wood
2025-09-23 9:57 ` gitoxide-compatible licensing of Git's Rust code, was " Johannes Schindelin
2025-09-23 17:48 ` Jeff King
2025-09-24 13:48 ` Phillip Wood
2025-09-25 2:25 ` Jeff King
2025-09-25 5:42 ` Patrick Steinhardt
2025-09-26 10:06 ` Phillip Wood
2025-10-03 3:18 ` Jeff King
2025-10-03 9:51 ` Phillip Wood
2025-10-07 9:11 ` Patrick Steinhardt
2025-11-17 13:37 ` Johannes Schindelin
2025-10-05 5:32 ` Yee Cheng Chin
2025-07-17 20:32 ` [PATCH 7/7] github_workflows: install rust Ezekiel Newren via GitGitGadget
2025-07-17 21:23 ` brian m. carlson
2025-07-18 23:01 ` Ezekiel Newren
2025-07-25 23:56 ` Ben Knoble
2025-07-19 21:54 ` Johannes Schindelin
2025-07-17 21:51 ` [PATCH 0/7] RFC: Accelerate xdiff and begin its rustification brian m. carlson
2025-07-17 22:25 ` Taylor Blau
2025-07-18 0:29 ` brian m. carlson
2025-07-22 12:21 ` Patrick Steinhardt
2025-07-22 15:56 ` Junio C Hamano
2025-07-22 16:03 ` Sam James
2025-07-22 21:37 ` Elijah Newren
2025-07-22 21:55 ` Sam James
2025-07-22 22:08 ` Collin Funk
2025-07-18 9:23 ` Christian Brabandt
2025-07-18 16:26 ` Junio C Hamano
2025-07-19 0:32 ` Elijah Newren
2025-07-18 13:34 ` Phillip Wood
2025-07-18 21:25 ` Eli Schwartz
2025-07-19 0:48 ` Haelwenn (lanodan) Monnier
2025-07-22 12:21 ` Patrick Steinhardt
2025-07-22 14:24 ` Patrick Steinhardt
2025-07-22 15:14 ` Eli Schwartz
2025-07-22 15:56 ` Sam James
2025-07-23 4:32 ` Patrick Steinhardt
2025-07-24 9:01 ` Pierre-Emmanuel Patry
2025-07-24 10:00 ` Patrick Steinhardt
2025-07-28 9:06 ` Pierre-Emmanuel Patry
2025-07-18 14:38 ` Junio C Hamano
2025-07-18 21:56 ` Ezekiel Newren
2025-07-21 10:14 ` Phillip Wood
2025-07-21 18:33 ` Junio C Hamano
2025-07-19 21:53 ` Johannes Schindelin
2025-07-20 8:45 ` Matthias Aßhauer
2025-08-15 1:22 ` [PATCH v2 00/17] " Ezekiel Newren via GitGitGadget
2025-08-15 1:22 ` [PATCH v2 01/17] doc: add a policy for using Rust brian m. carlson via GitGitGadget
2025-08-15 17:03 ` Matthias Aßhauer
2025-08-15 21:31 ` Junio C Hamano
2025-08-16 8:06 ` Matthias Aßhauer
2025-08-19 2:06 ` Ezekiel Newren
2025-08-15 1:22 ` [PATCH v2 02/17] xdiff: introduce rust Ezekiel Newren via GitGitGadget
2025-08-15 1:22 ` [PATCH v2 03/17] xdiff/xprepare: remove superfluous forward declarations Ezekiel Newren via GitGitGadget
2025-08-15 1:22 ` [PATCH v2 04/17] xdiff: delete unnecessary fields from xrecord_t and xdfile_t Ezekiel Newren via GitGitGadget
2025-08-15 1:22 ` [PATCH v2 05/17] xdiff: make fields of xrecord_t Rust friendly Ezekiel Newren via GitGitGadget
2025-08-15 1:22 ` [PATCH v2 06/17] xdiff: separate parsing lines from hashing them Ezekiel Newren via GitGitGadget
2025-08-15 1:22 ` [PATCH v2 07/17] xdiff: conditionally use Rust's implementation of xxhash Ezekiel Newren via GitGitGadget
2025-08-15 1:22 ` [PATCH v2 08/17] github workflows: install rust Ezekiel Newren via GitGitGadget
2025-08-15 1:22 ` [PATCH v2 09/17] Do support Windows again after requiring Rust Johannes Schindelin via GitGitGadget
2025-08-15 17:12 ` Matthias Aßhauer
2025-08-15 21:48 ` Junio C Hamano
2025-08-15 22:11 ` Johannes Schindelin
2025-08-15 23:37 ` Junio C Hamano
2025-08-15 23:37 ` Junio C Hamano
2025-08-16 8:53 ` Matthias Aßhauer
2025-08-17 15:57 ` Junio C Hamano
2025-08-19 2:22 ` Ezekiel Newren
2025-08-15 1:22 ` [PATCH v2 10/17] win+Meson: allow for xdiff to be compiled with MSVC Johannes Schindelin via GitGitGadget
2025-08-15 1:22 ` [PATCH v2 11/17] win+Meson: do allow linking with the Rust-built xdiff Johannes Schindelin via GitGitGadget
2025-08-15 1:22 ` [PATCH v2 12/17] github workflows: define rust versions and targets in the same place Ezekiel Newren via GitGitGadget
2025-08-15 1:22 ` [PATCH v2 13/17] github workflows: upload Cargo.lock Ezekiel Newren via GitGitGadget
2025-08-15 1:22 ` Ezekiel Newren via GitGitGadget [this message]
2025-08-15 1:22 ` [PATCH v2 15/17] xdiff: create line_hash() and line_equal() Ezekiel Newren via GitGitGadget
2025-08-15 1:22 ` [PATCH v2 16/17] xdiff: optimize case where --ignore-cr-at-eol is the only whitespace flag Ezekiel Newren via GitGitGadget
2025-08-15 1:22 ` [PATCH v2 17/17] xdiff: use rust's version of whitespace processing Ezekiel Newren via GitGitGadget
2025-08-15 15:07 ` [-SPAM-] [PATCH v2 00/17] RFC: Accelerate xdiff and begin its rustification Ramsay Jones
2025-08-19 2:00 ` Elijah Newren
2025-08-24 16:52 ` Patrick Steinhardt
2025-08-18 22:31 ` Junio C Hamano
2025-08-18 23:52 ` Ben Knoble
2025-08-19 1:52 ` Elijah Newren
2025-08-19 9:47 ` Junio C Hamano
2025-08-23 3:55 ` [PATCH v3 00/15] RFC: Cleanup " Ezekiel Newren via GitGitGadget
2025-08-23 3:55 ` [PATCH v3 01/15] doc: add a policy for using Rust brian m. carlson via GitGitGadget
2025-08-23 3:55 ` [PATCH v3 02/15] xdiff: introduce rust Ezekiel Newren via GitGitGadget
2025-08-23 13:43 ` rsbecker
2025-08-23 14:26 ` Kristoffer Haugsbakk
2025-08-23 15:06 ` rsbecker
2025-08-23 18:30 ` Elijah Newren
2025-08-23 19:24 ` brian m. carlson
2025-08-23 20:04 ` rsbecker
2025-08-23 20:36 ` Sam James
2025-08-23 21:17 ` Haelwenn (lanodan) Monnier
2025-08-27 1:57 ` Taylor Blau
2025-08-27 14:39 ` rsbecker
2025-08-27 17:06 ` Junio C Hamano
2025-08-27 17:15 ` rsbecker
2025-08-27 20:12 ` Taylor Blau
2025-08-27 20:22 ` Junio C Hamano
2025-09-02 11:16 ` Patrick Steinhardt
2025-09-02 11:30 ` Sam James
2025-09-02 17:27 ` brian m. carlson
2025-09-02 18:47 ` Sam James
2025-09-03 18:22 ` Collin Funk
2025-09-03 5:40 ` Patrick Steinhardt
2025-09-03 16:22 ` Ramsay Jones
2025-09-03 22:10 ` Junio C Hamano
2025-09-03 22:48 ` Josh Steadmon
2025-09-04 11:10 ` Patrick Steinhardt
2025-09-04 15:45 ` Junio C Hamano
2025-09-05 8:23 ` Patrick Steinhardt
2025-09-04 0:57 ` brian m. carlson
2025-09-04 11:39 ` Patrick Steinhardt
2025-09-04 13:53 ` Sam James
2025-09-05 3:55 ` Elijah Newren
2025-09-04 23:17 ` Ezekiel Newren
2025-09-05 3:54 ` Elijah Newren
2025-09-05 6:50 ` Patrick Steinhardt
2025-09-07 4:10 ` Elijah Newren
2025-09-07 16:09 ` rsbecker
2025-09-08 10:12 ` Phillip Wood
2025-09-08 15:32 ` rsbecker
2025-09-08 15:10 ` Ezekiel Newren
2025-09-08 15:41 ` rsbecker
2025-09-08 15:31 ` Elijah Newren
2025-09-08 15:36 ` rsbecker
2025-09-08 16:13 ` Elijah Newren
2025-09-08 17:01 ` rsbecker
2025-09-08 6:40 ` Patrick Steinhardt
2025-09-05 10:31 ` Phillip Wood
2025-09-05 11:32 ` Sam James
2025-09-05 13:14 ` Phillip Wood
2025-09-05 13:23 ` Patrick Steinhardt
2025-09-05 15:37 ` Junio C Hamano
2025-09-08 6:40 ` Patrick Steinhardt
2025-08-23 14:29 ` Ezekiel Newren
2025-08-23 3:55 ` [PATCH v3 03/15] github workflows: install rust Ezekiel Newren via GitGitGadget
2025-08-23 3:55 ` [PATCH v3 04/15] win+Meson: do allow linking with the Rust-built xdiff Johannes Schindelin via GitGitGadget
2025-08-23 3:55 ` [PATCH v3 05/15] github workflows: upload Cargo.lock Ezekiel Newren via GitGitGadget
2025-08-23 3:55 ` [PATCH v3 06/15] ivec: create a vector type that is interoperable between C and Rust Ezekiel Newren via GitGitGadget
2025-08-23 8:12 ` Kristoffer Haugsbakk
2025-08-23 9:29 ` Ezekiel Newren
2025-08-23 16:14 ` Junio C Hamano
2025-08-23 16:37 ` Ezekiel Newren
2025-08-23 18:05 ` Junio C Hamano
2025-08-23 20:29 ` Ezekiel Newren
2025-08-25 19:16 ` Elijah Newren
2025-08-26 5:40 ` Junio C Hamano
2025-08-24 13:31 ` Ben Knoble
2025-08-25 20:40 ` Ezekiel Newren
2025-08-26 13:30 ` D. Ben Knoble
2025-08-26 18:47 ` Ezekiel Newren
2025-08-26 22:01 ` brian m. carlson
2025-08-23 3:55 ` [PATCH v3 07/15] xdiff/xprepare: remove superfluous forward declarations Ezekiel Newren via GitGitGadget
2025-08-23 3:55 ` [PATCH v3 08/15] xdiff: delete unnecessary fields from xrecord_t and xdfile_t Ezekiel Newren via GitGitGadget
2025-08-23 3:55 ` [PATCH v3 09/15] xdiff: make fields of xrecord_t Rust friendly Ezekiel Newren via GitGitGadget
2025-08-23 3:55 ` [PATCH v3 10/15] xdiff: use one definition for freeing xdfile_t Ezekiel Newren via GitGitGadget
2025-08-23 3:55 ` [PATCH v3 11/15] xdiff: replace chastore with an ivec in xdfile_t Ezekiel Newren via GitGitGadget
2025-08-23 3:55 ` [PATCH v3 12/15] xdiff: delete nrec field from xdfile_t Ezekiel Newren via GitGitGadget
2025-08-23 3:55 ` [PATCH v3 13/15] xdiff: delete recs " Ezekiel Newren via GitGitGadget
2025-08-23 3:55 ` [PATCH v3 14/15] xdiff: make xdfile_t more rust friendly Ezekiel Newren via GitGitGadget
2025-08-23 3:55 ` [PATCH v3 15/15] xdiff: implement xdl_trim_ends() in Rust Ezekiel Newren via GitGitGadget
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=f20efdff7aa0a02ca2585de0cd9de21bbff22d58.1755220973.git.gitgitgadget@gmail.com \
--to=gitgitgadget@gmail$(echo .)com \
--cc=Johannes.Schindelin@gmx$(echo .)de \
--cc=ben.knoble@gmail$(echo .)com \
--cc=cb@256bit$(echo .)org \
--cc=collin.funk1@gmail$(echo .)com \
--cc=contact@hacktivis$(echo .)me \
--cc=eschwartz@gentoo$(echo .)org \
--cc=ezekielnewren@gmail$(echo .)com \
--cc=git@vger$(echo .)kernel.org \
--cc=me@ttaylorr$(echo .)com \
--cc=mh@glandium$(echo .)org \
--cc=mha1993@live$(echo .)de \
--cc=newren@gmail$(echo .)com \
--cc=phillip.wood123@gmail$(echo .)com \
--cc=pierre-emmanuel.patry@embecosm$(echo .)com \
--cc=ps@pks$(echo .)im \
--cc=sam@gentoo$(echo .)org \
--cc=sandals@crustytoothpaste$(echo .)net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox