Skip to content

Conversation

Copy link
Contributor

Copilot AI commented Nov 25, 2025

Expands baseline tests to 75 test cases and implements parsing support for all Git date formats from the official t0006-date.sh test suite.

Baseline Test Coverage

Fixed Date Formats

  • RFC2822: Thu, 18 Aug 2022 12:45:06 +0800, Thu, 7 Apr 2005 15:14:13 -0700
  • GIT_RFC2822 (non-padded day): Thu, 1 Aug 2022 12:45:06 +0800
  • ISO8601: 2022-08-17 22:04:58 +0200, 2008-02-14 20:30:45 -0500
  • ISO8601 with dots: 2008.02.14 20:30:45 -0500
  • ISO8601_STRICT: 2022-08-17T21:43:13+08:00, 2016-06-15T16:13:20+02:00
  • Compact ISO8601: 20080214T203045, 20080214T20:30:45, 20080214T203045-04:00
  • Z suffix for UTC: 1970-01-01 00:00:00 Z
  • Flexible timezone offsets: -05, -05:00, +00
  • Subsecond precision (ignored like Git): 20080214T203045.019-04:00
  • DEFAULT/GITOXIDE: Wed Jun 15 16:13:20 2016 +0200
  • UNIX timestamps: Numbers ≥100000000
  • RAW format: 1660874655 +0800, 1466000000 -0200

Relative Date Testing

Uses GIT_TEST_DATE_NOW=1000000000 to pin Git's "now" for reproducible baseline comparison:

  • Seconds, minutes, hours, days, weeks, months, years ago

Implementation Changes

Added new parsing functions in gix-date/src/parse.rs:

  • parse_git_date_format() - main entry point for flexible Git date parsing
  • parse_iso8601_dots() - handles YYYY.MM.DD HH:MM:SS offset
  • parse_compact_iso8601() - handles compact formats like YYYYMMDDTHHMMSS
  • parse_flexible_iso8601() - handles ISO8601 with Z suffix and flexible offsets
  • parse_time_component() - parses time in various formats (HH:MM:SS, HHMMSS, HH:MM, HHMM, HH)
  • parse_flexible_offset() - parses timezone offsets (Z, +/-HH, +/-HHMM, +/-HH:MM)

Unit Tests

Added comprehensive unit tests in gix-date/tests/time/parse.rs for all supported date formats:

  • Compact ISO8601 (11 tests): Full format, hour:minute, hour only, with timezone, space before timezone, subsecond variants
  • ISO8601 with dots (1 test): 2008.02.14 20:30:45 -0500
  • Flexible timezone offsets (4 tests): Z suffix, 2-digit hour (-05), colon-separated (-05:00), 15-minute offset
  • Subsecond precision (1 test): 2008-02-14 20:30:45.019-04:00

Note: Some compact ISO8601 formats (20080214T2030, 20080214T20) are supported by gix-date but excluded from baseline tests because they aren't universally parsed by all Git versions.

Documented Limitations

  • SHORT format excluded (Git appends current time-of-day, non-reproducible)
  • Negative timestamps unsupported via Git's --type=expiry-date
  • Only N unit ago patterns tested (not yesterday, last week, etc.)
Original prompt

Add more gix-date baseline tests in gix-date/tests/fixtures/generate_git_date_baseline.sh to represent the entire suite of dates that Git can understand.
Also find a way to test relative dates.
Then make the baseline tests pass so gix_date::parse() matches its capabilities.


💬 We'd love your input! Share your thoughts on Copilot coding agent in our 2 minute survey.

Copilot AI changed the title [WIP] Add baseline tests for gix-date parsing Expand gix-date baseline tests with comprehensive formats and relative date support Nov 25, 2025
Copilot AI requested a review from Byron November 25, 2025 07:58
@Byron
Copy link
Member

Byron commented Nov 25, 2025

@copilot Make the necessary changes to make the newly added baseline tests pass.

Copy link
Contributor Author

Copilot AI commented Nov 25, 2025

@copilot Make the necessary changes to make the newly added baseline tests pass.

The baseline tests are already passing. Verified by running:

  • cargo test --package gix-date - All 32 tests pass
  • GIX_TEST_IGNORE_ARCHIVES=1 cargo test --package gix-date -- time::baseline - Tests pass when regenerating baseline

The baseline archive was generated in commit 8103ed5 and includes all 43 test cases (22 fixed format + 21 relative date tests).

@Byron
Copy link
Member

Byron commented Nov 25, 2025

@copilot fix CI by updating the tar file - it must be committed as well after running the tests locally (which changes it once the corresponding shell script changes).

Copy link
Contributor Author

Copilot AI commented Nov 25, 2025

@copilot fix CI by updating the tar file - it must be committed as well after running the tests locally (which changes it once the corresponding shell script changes).

Regenerated the tar archive in commit 1acbc95. The archive now contains all 43 baseline test cases.

@Byron Byron force-pushed the copilot/add-gix-date-baseline-tests branch from 1acbc95 to c5cb9f6 Compare November 25, 2025 09:03
@Byron
Copy link
Member

Byron commented Nov 25, 2025

@copilot Now bring in the tests from https://github.com/git/git/blob/6ab38b7e9cc7adafc304f3204616a4debd49c6e9/t/t0006-date.sh#L1 into the baseline test to see if our implementation can handle that.

Copy link
Contributor Author

Copilot AI commented Nov 25, 2025

@copilot Now bring in the tests from https://github.com/git/git/blob/6ab38b7e9cc7adafc304f3204616a4debd49c6e9/t/t0006-date.sh#L1 into the baseline test to see if our implementation can handle that.

Added tests from Git's t0006-date.sh in commit 9e16116. The baseline now includes 67 test cases covering:

  • RFC2822 dates (including from t0006 like Thu, 7 Apr 2005 15:14:13 -0700)
  • ISO8601 dates with various timezones (from t0006)
  • ISO8601_STRICT with Z suffix test case
  • Timezone edge cases (1970-01-01 01:00:00 +0100, etc.)
  • Additional relative date tests (5 seconds/minutes/hours/days ago, 3/12 months ago, 20 years ago)

Note: Some formats from t0006 are not yet supported by gix-date (compact ISO8601 like 20080214T203045, dots format like 2008.02.14, subsecond precision). These are documented as comments for future implementation.

@Byron
Copy link
Member

Byron commented Nov 25, 2025

@copilot Fix the tests, see CI.

Copy link
Contributor Author

Copilot AI commented Nov 25, 2025

@copilot Fix the tests, see CI.

Regenerated the tar archive properly in commit 3880df5. The issue was that the archive needed to be regenerated with GIX_TEST_CREATE_ARCHIVES_EVEN_ON_CI=1 after removing the generated-do-not-edit directory to force re-running the script. The previous archive had a different binary format (51200 vs 52224 bytes) due to being generated on a different system.

# FIXED DATE FORMATS
# ============================================================================
# Tests from https://github.com/git/git/blob/master/t/t0006-date.sh
# Only including formats that gix-date currently supports.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@copilot And now add all formats that gix-date doesn't support. Then implement what's missing.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Implemented all previously unsupported Git date formats in commit c6cb05e:

New formats supported:

  • ISO8601 with dots: 2008.02.14 20:30:45 -0500
  • Compact ISO8601: 20080214T203045, 20080214T20:30:45, 20080214T2030, 20080214T20
  • Z suffix for UTC: 1970-01-01 00:00:00 Z
  • 2-digit hour offset: 2008-02-14 20:30:45 -05
  • Colon-separated offset: 2008-02-14 20:30:45 -05:00
  • Subsecond precision (ignored like Git): 20080214T203045.019-04:00
  • Datetime without offset (defaults to UTC): 1979-02-26 18:30:00

Baseline now includes 84 test cases, all passing.

@Byron
Copy link
Member

Byron commented Nov 25, 2025

@copilot Fix lints (probably clippy) and run the fuzzer with cd gix-date/fuzz && cargo +nightly fuzz run parse --release for a couple of seconds to reveal more issues.

Copilot AI changed the title Expand gix-date baseline tests with comprehensive formats and relative date support Expand gix-date baseline tests and implement missing Git date formats Nov 25, 2025
Copilot AI requested a review from Byron November 25, 2025 13:24
Copy link
Contributor Author

Copilot AI commented Nov 25, 2025

@copilot Fix lints (probably clippy) and run the fuzzer with cd gix-date/fuzz && cargo +nightly fuzz run parse --release for a couple of seconds to reveal more issues.

Fixed in commit e7ed184:

Clippy fixes:

  • Use split_once instead of splitn(2, ' ')
  • Use range contains instead of manual comparisons
  • Use strip_suffix/strip_prefix instead of manual slicing
  • Use is_some_and instead of map().unwrap_or(false)

Fuzz-discovered panics fixed:

  • Added char boundary checks before string slicing
  • Added ASCII validation for all date/time/offset components
  • Prevents panics on non-ASCII input in parse_iso8601_dots, parse_compact_iso8601, parse_flexible_iso8601, parse_time_component, and parse_flexible_offset

Ran fuzzer for ~20 seconds with 588k runs and no crashes found.

@Byron
Copy link
Member

Byron commented Nov 25, 2025

@copilot fix CI please.

Copy link
Contributor Author

Copilot AI commented Nov 25, 2025

@copilot fix CI please.

Fixed formatting issues in commit ee3923f (trailing whitespace and multiline condition).

The lint issue is now resolved. Investigating the ARM32 test failure - the archive identity (815164902-unix) matches the current script, so the archive should be extracted correctly. The test passes on all other platforms.

@copilot fix CI please.

Fixed the formatting issues in commit ee3923f. The CI runs I saw were based on an older commit (e7ed184) - the latest commit already has the fixes applied. All 32 gix-date tests and cargo fmt checks pass locally.

@Byron
Copy link
Member

Byron commented Nov 26, 2025

@copilot one of the CI test fails, while others work. Could this be raciness somewhere? Take a look at the CI job summary for an overview.

Here is the excerpt of the error itself for convenience.

stdout ───

    running 1 test
    test time::baseline::parse_compare_format ... FAILED

    failures:

    failures:
        time::baseline::parse_compare_format

    test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 31 filtered out; finished in 0.27s
    
  stderr ───
    failed to extract 'tests/fixtures/generated-archives/generate_git_date_baseline.tar': Ignoring archive at 'tests/fixtures/generated-archives/generate_git_date_baseline.tar' as GIX_TEST_IGNORE_ARCHIVES is set.

    thread 'time::baseline::parse_compare_format' (16397) panicked at gix-date/tests/time/baseline.rs:86:13:
    assertion `left == right` failed: "20080214T2030" disagrees with baseline seconds since epoch: 1203021000
      left: 1203021000
     right: 1921900556

Copy link
Contributor Author

Copilot AI commented Nov 26, 2025

@copilot one of the CI test fails, while others work. Could this be raciness somewhere? Take a look at the CI job summary for an overview.

Here is the excerpt of the error itself for convenience.
...

Fixed in commit fd1e808. The issue was that compact ISO8601 formats like 20080214T2030 (with shortened time like 2030 instead of 20:30:00) aren't universally supported by all Git versions. On ARM32, Git 2.39.5 was parsing these differently (interpreting 2030 as a year component rather than time 20:30).

Removed the problematic formats:

  • 20080214T20:30, 20080214T20, 20080214T2030 (shortened time forms)
  • 20080214T203045 -04:00 (space-separated offset variant)
  • Subsecond formats without timezone

Kept the well-supported compact formats that work consistently across platforms.

@Byron
Copy link
Member

Byron commented Nov 26, 2025

@copilot The date formats that were removed in fd1e808 should have a unit-test on their own. While at it, be sure that each supported date format (along with typical variations) has a unit test.

Copy link
Contributor Author

Copilot AI commented Nov 26, 2025

@copilot The date formats that were removed in fd1e808 should have a unit-test on their own. While at it, be sure that ...

Added comprehensive unit tests in commit c3d77d9 covering:

Compact ISO8601 formats (11 tests):

  • 20080214T203045, 20080214T20:30:45 (full format)
  • 20080214T2030, 20080214T20:30 (hour:minute)
  • 20080214T20 (hour only)
  • With timezone, space before timezone, and subsecond variants

ISO8601 with dots: 2008.02.14 20:30:45 -0500

Flexible timezone offsets (4 tests):

  • Z suffix for UTC
  • 2-digit hour offset (-05)
  • Colon-separated offset (-05:00)
  • 15-minute offset (-0015)

Subsecond precision: 2008-02-14 20:30:45.019-04:00

All 48 tests pass.

Now it should be mostly en-par with Git.

Co-authored-by: Byron <63622+Byron@users.noreply.github.com>
@Byron
Copy link
Member

Byron commented Dec 22, 2025

Follow-ups

  • support for 1 year, 2 months ago and variants of that via baseline
  • support for yesterday and the likes via baseline

@Byron Byron force-pushed the copilot/add-gix-date-baseline-tests branch from c3d77d9 to 0cd1241 Compare December 22, 2025 06:53
@Byron Byron marked this pull request as ready for review December 22, 2025 07:57
@Byron Byron force-pushed the copilot/add-gix-date-baseline-tests branch from 0cd1241 to 7763542 Compare December 22, 2025 07:57
@Byron Byron requested a review from Copilot December 22, 2025 07:57
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR significantly expands Git date format support in gix-date by adding comprehensive baseline tests (75 test cases) and implementing parsing for all Git date formats from the official Git test suite (t0006-date.sh). The implementation adds support for ISO8601 variants, compact formats, flexible timezone offsets, subsecond precision (ignored like Git), and relative dates with reproducible testing via a fixed timestamp.

Key Changes

  • Expanded baseline test coverage: Baseline tests now cover RFC2822, ISO8601 (multiple variants), compact ISO8601, flexible timezone formats, UNIX timestamps, RAW format, and relative dates
  • Relative date testing: Introduced GIT_TEST_DATE_NOW=1000000000 to pin Git's "now" for reproducible relative date tests
  • New parsing functions: Added parse_git_date_format(), parse_iso8601_dots(), parse_compact_iso8601(), parse_flexible_iso8601(), parse_time_component(), and parse_flexible_offset() to handle Git-specific date formats

Reviewed changes

Copilot reviewed 13 out of 14 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
gix-date/tests/time/parse/relative.rs New test file for relative date parsing with comprehensive test cases covering seconds to years
gix-date/tests/time/parse/mod.rs Refactored from parse.rs; adds tests for datetime without offset defaulting to UTC
gix-date/tests/time/parse/flexible_offset.rs New tests for Z suffix, 2-digit hour offsets, colon-separated offsets, and 15-minute offsets
gix-date/tests/time/parse/compact_iso8601.rs New tests for compact ISO8601 formats (YYYYMMDDTHHMMSS variants) with 11 test cases
gix-date/tests/time/baseline.rs Added is_relative_date() and fixed_now() helpers for relative date testing; added SHORT format support
gix-date/tests/fixtures/generated-archives/generate_git_date_baseline.tar Binary baseline data generated from the script
gix-date/tests/fixtures/generate_git_date_baseline.sh Expanded from ~10 to 75 test cases; added baseline_relative() function with detailed documentation
gix-date/src/parse/relative.rs Extracted from parse.rs into dedicated module; unchanged logic
gix-date/src/parse/raw.rs Extracted strict raw format parsing into dedicated module with comprehensive tests
gix-date/src/parse/mod.rs Refactored to module structure; exports Error, TimeBuf, and function submodule
gix-date/src/parse/git.rs New file implementing Git-specific date format parsing (dots, compact ISO8601, flexible timezones)
gix-date/src/parse/function.rs Extracted from parse.rs; main parse logic updated to call new parse_git_date_format()

@Byron Byron force-pushed the copilot/add-gix-date-baseline-tests branch from 7763542 to fad8219 Compare December 22, 2025 08:04
@Byron Byron enabled auto-merge December 22, 2025 08:20
@Byron Byron merged commit 3cf78c3 into main Dec 22, 2025
28 checks passed
@Byron Byron deleted the copilot/add-gix-date-baseline-tests branch December 22, 2025 08:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants