From 041bddecacb23b4925bcd9bcdc4a86aec2ea719d Mon Sep 17 00:00:00 2001 From: Eliah Kagan Date: Sat, 2 Nov 2024 23:27:24 -0400 Subject: [PATCH 01/18] Set +x in index in same-rename-different-mode baseline Since #1618, which introduced `gix-merge::merge tree::run_baseline` and the functionality it tests, that test has failed on Windows when run with `GIX_TEST_IGNORE_ARCHIVES=1`. This happens because, while `chmod +x` commands run and exit indicating success in MSYS environments such as Git Bash, they do not actually make a change. Multiple cases (all sub-cases of the same faililing test) would fail this way. But the test fails fast, so only one is reported. The first to fail this way is `same-rename-different-mode`, which shows: --- STDERR: gix-merge::merge tree::run_baseline --- failed to extract 'tests\fixtures\generated-archives\tree-baseline.tar': Ignoring archive at 'tests\fixtures\generated-archives\tree-baseline.tar' as GIX_TEST_IGNORE_ARCHIVES is set. thread 'tree::run_baseline' panicked at gix-merge\tests\merge\tree\mod.rs:83:21: assertion `left != right` failed: same-rename-different-mode-A-B-reversed: Git caught up - adjust expectation Git works for the A/B case, but for B/A it forgets to set the executable bit left: Sha1(d75339daa64f3a1d98947623eee7bbb218e6c87d) right: Sha1(d75339daa64f3a1d98947623eee7bbb218e6c87d) This commit fixes that by using `git update-index --chmod=+x` to stage the intended effect of `chmod +x`. The `chmod +x` commands are still run, to avoid non-intended and potentially bug-prone or confusing differences between the metadata on disk and what is staged and commited, on systems where Unix-style permissions are supported on disk and `chmod +x` modifies them. Although only one of the two approaches is needed on any particular system in these tests, deciding based on the operating system is more complicated. It would also be misleading, because the effect of the two kinds of commands is not, in *general*, the same: one operates on files in the working tree, and the other operates on the index. Therefore, both are used, for simplicity and clarity. For readability, adjacent `chmod +x` commands are also combined into one. This way, each place that has both `chmod +x` logic and `git update-index --chmod=+x` logic can have a single command for each, that clearly relate to each other. As noted above, the change in this commit is not sufficient to fix that failing test, because a subsequent assertion still fails. This will be detailed and fixed in a subsequent commit. (This commit also does not yet update generated archives.) --- gix-merge/tests/fixtures/tree-baseline.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/gix-merge/tests/fixtures/tree-baseline.sh b/gix-merge/tests/fixtures/tree-baseline.sh index 928a52abea5..d71fc60694e 100644 --- a/gix-merge/tests/fixtures/tree-baseline.sh +++ b/gix-merge/tests/fixtures/tree-baseline.sh @@ -475,8 +475,8 @@ git init same-rename-different-mode git checkout A write_lines 1 2 3 4 5 >a/x.f - chmod +x a/x.f - chmod +x a/w + chmod +x a/x.f a/w + git update-index --chmod=+x a/x.f a/w git mv a a-renamed git commit -am "changed all content, add +x, renamed a -> a-renamed" @@ -486,8 +486,8 @@ git init same-rename-different-mode git commit -am "changed all content, renamed a -> a-renamed" git checkout expected - chmod +x a/x.f - chmod +x a/w + chmod +x a/x.f a/w + git update-index --chmod=+x a/x.f a/w write_lines 1 2 3 4 5 6 >a/x.f git mv a a-renamed git commit -am "Git, when branches are reversed, doesn't keep the +x flag on a/w so we specify our own expectation" From 6faf11a0e0916fdf03e4532d28e40674c369bf9b Mon Sep 17 00:00:00 2001 From: Eliah Kagan Date: Sun, 3 Nov 2024 00:18:47 -0400 Subject: [PATCH 02/18] Set +x in index in added-file-changed-content-and-mode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This fixes the second `gix-merge::merge tree::run_baseline` failure in which the baseline fixture `added-file-changed-content-and-mode` produced the wrong results when run on Windows, due to `chmod +x` having no effect (but reporting success) when run in Git Bash. The failure that this fixes, which is visible since the fix for the first baseline case failure was fixed in the preceding commit, is: --- STDERR: gix-merge::merge tree::run_baseline --- failed to extract 'tests\fixtures\generated-archives\tree-baseline.tar': Ignoring archive at 'tests\fixtures\generated-archives\tree-baseline.tar' as GIX_TEST_IGNORE_ARCHIVES is set. thread 'tree::run_baseline' panicked at gix-merge\tests\merge\tree\mod.rs:93:17: assertion failed: `(left == right)`: added-file-changed-content-and-mode-A-B-reversed: tree mismatch: We improve on executable bit handling, but loose on diff quality as we are definitely missing some tweaks [ Conflict { resolution: Ok( OursModifiedTheirsModifiedThenBlobContentMerge { merged_blob: ContentMerge { merged_blob_id: Sha1(7ad0b902fe3f9d6857ca2e02a84f17c3eae607d6), resolution: Conflict, }, }, ), ours: Addition { location: "new", relation: None, entry_mode: EntryMode( 33188, ), id: Sha1(ec046db5d8b05470e472330d75f419c81ed6c9d3), }, theirs: Addition { location: "new", relation: None, entry_mode: EntryMode( 33188, ), id: Sha1(8a1218a1024a212bb3db30becd860315f9f3ac52), }, map: Original, }, ] added-file-changed-content-and-mode-A-B-reversed Diff < left / right > : <297247d >c5c706c ├── a:fd269b6 │ └── x.f:100644:4406528 "original\n1\n2\n3\n4\n5\n" <└── new:100644:7ad0b90 "<<<<<<< B\noriginal\n1\n2\n3\n4\n5\n6\n=======\n1\n2\n3\n4\n5\n>>>>>>> A\n" >└── new:100644:c3e610f "<<<<<<< A\n1\n2\n3\n4\n5\n=======\noriginal\n1\n2\n3\n4\n5\n6\n>>>>>>> B\n" See the previous commit for a general description. The situation here differs because the file, `new`, is newly created at the same time as its mode is set, so it is not already in the index. While staging it and using the same approach used in the previous commit would work, this instead adds `--chmod=+x` to the existing `git add` commands to stage them with the desired permissions initially, since here those commands immediately follow the `chmod +x` commands. To make this work (and so it is clear), this also changes the path argument to refer to the specific file, rather than passing `.`, which had alredy been done in one place. These commands are (and were) only staging a single file, so this is sufficient. It turns out that the baseline cases fixed in the preceding commit and here are the only causes of failure for that test, so the test is now passing, even on Windows with `GIX_TEST_IGNORE_ARCHIVES=1`. --- gix-merge/tests/fixtures/tree-baseline.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gix-merge/tests/fixtures/tree-baseline.sh b/gix-merge/tests/fixtures/tree-baseline.sh index d71fc60694e..69b103ae986 100644 --- a/gix-merge/tests/fixtures/tree-baseline.sh +++ b/gix-merge/tests/fixtures/tree-baseline.sh @@ -530,13 +530,13 @@ git init added-file-changed-content-and-mode git checkout B write_lines original 1 2 3 4 5 6 >new chmod +x new - git add . + git add --chmod=+x new git commit -m "add new with content B and +x" git checkout expected echo -n $'<<<<<<< A\n1\n2\n3\n4\n5\n=======\noriginal\n1\n2\n3\n4\n5\n6\n>>>>>>> B\n' >new chmod +x new - git add new + git add --chmod=+x new git commit -m "Git has a better merge here, but that's due to better hunk handling/hunk splitting. We, however, consistently use +x" ) From ab45415a0119cbdcbd2fcbe8c7b6e2580432f705 Mon Sep 17 00:00:00 2001 From: Eliah Kagan Date: Sun, 3 Nov 2024 05:04:17 +0000 Subject: [PATCH 03/18] Update tree-baseline archive --- .../generated-archives/tree-baseline.tar | Bin 2681344 -> 2789376 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/gix-merge/tests/fixtures/generated-archives/tree-baseline.tar b/gix-merge/tests/fixtures/generated-archives/tree-baseline.tar index 4b74b96874d300e6e42ece4ad484d2dfc08b5641..bd50e785648cce991953eb04acf30de922a6d063 100644 GIT binary patch delta 98392 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 Date: Sun, 3 Nov 2024 01:31:49 -0500 Subject: [PATCH 04/18] Set +x in index in gix-archive basic fixture, adjust tests As far as I know, gix-archive has no limitations related to Unix executable bits, on any platform. On Windows, the *filesystem* does not support these, and `chmod +x` commands in fixtures run in Git Bash appear to succeed but actually have no effect. But +x metadata can be staged and committed in Git repositories. When that is done, gix-archive can use those metadata just as it does on a Unix-like system. This fixes the tests to reflect this ability. Changes: 1. Add a `git update-index --chmod=+x` command to the gix-archive `basic.sh` fixture for `dir/subdir/exe`, so that even if the `chmod +x` command has no effect, the executable bit is set. This only affects `dir/subdir/exe`. It does not affect `extra-exe`, since that is never staged. On Windows, `extra-exe` can never have any associated executable mode bits. 2. Update the `basic_usage_internal` test to assert that `dir/subdir/exe` is `EntryKind::BlobExecutable` on all platforms, i.e., no longer `EntryKind::Blob` on Windows. Without this change, the change in (1) causes the test to fail. This also refactors to remove the `expected_exe_mode` constant, since its value is now only used in one place (for `extra-exe`), and to remove `expected_link_mode`, which has unconditionally been another name for `EntryKind::Link` since 93e088a (#1444). 3. Update the `basic_usage_tar` test to assert that the mode stored for `prefix/dir/subdir/exe` is 493 (0o755) on all platforms, i.e., no longer 420 (0o644) on Windows. This is analogous to (2), and without this the `basic_usage_tar` test fails due to the changes in (1). As in (2), this includes refactoring: `expected_exe_mode` is removed now that the choice between 420 (0o644) and 493 (0o755) is only made in one place (for `prefix/extra-exe`), and `expected_symlink_type` is removed, since it has unconditionally been another name for `EntryType::Symlink` since 93e088a (#1444). For future reference, with (1) but before (2), the failure is: --- STDERR: gix-archive::archive from_tree::basic_usage_internal --- Archive at 'tests\fixtures\generated-archives\basic.tar' not found, creating fixture using script 'basic.sh' thread 'from_tree::basic_usage_internal' panicked at gix-archive\tests\archive.rs:36:13: assertion `left == right` failed left: [(".gitattributes", Blob, Sha1(45c160c35c17ad264b96431cceb9793160396e99)), ("a", Blob, Sha1(45b983be36b73c0788dc9cbcb76cbb80fc7bb057)), ("symlink-to-a", Link, Sha1(2e65efe2a145dda7ee51d1741299f848e5bf752e)), ("dir/b", Blob, Sha1(ab4a98190cf776b43cb0fe57cef231fb93fd07e6)), ("dir/subdir/exe", BlobExecutable, Sha1(e69de29bb2d1d6434b8b29ae775ad8c2e48c5391)), ("extra-file", Blob, Sha1(0000000000000000000000000000000000000000)), ("extra-exe", Blob, Sha1(0000000000000000000000000000000000000000)), ("extra-dir-empty", Tree, Sha1(0000000000000000000000000000000000000000)), ("extra-dir/symlink-to-extra", Link, Sha1(0000000000000000000000000000000000000000))] right: [(".gitattributes", Blob, Sha1(45c160c35c17ad264b96431cceb9793160396e99)), ("a", Blob, Sha1(45b983be36b73c0788dc9cbcb76cbb80fc7bb057)), ("symlink-to-a", Link, Sha1(2e65efe2a145dda7ee51d1741299f848e5bf752e)), ("dir/b", Blob, Sha1(ab4a98190cf776b43cb0fe57cef231fb93fd07e6)), ("dir/subdir/exe", Blob, Sha1(e69de29bb2d1d6434b8b29ae775ad8c2e48c5391)), ("extra-file", Blob, Sha1(0000000000000000000000000000000000000000)), ("extra-exe", Blob, Sha1(0000000000000000000000000000000000000000)), ("extra-dir-empty", Tree, Sha1(0000000000000000000000000000000000000000)), ("extra-dir/symlink-to-extra", Link, Sha1(0000000000000000000000000000000000000000))] And with (1) but before (3), the failure is: --- STDERR: gix-archive::archive from_tree::basic_usage_tar --- thread 'from_tree::basic_usage_tar' panicked at gix-archive\tests\archive.rs:116:13: assertion `left == right` failed left: [("prefix/.gitattributes", Regular, 56, 420), ("prefix/a", Regular, 3, 420), ("prefix/symlink-to-a", Symlink, 0, 420), ("prefix/dir/b", Regular, 3, 420), ("prefix/dir/subdir/exe", Regular, 0, 493), ("prefix/extra-file", Regular, 21, 420), ("prefix/extra-exe", Regular, 0, 420), ("prefix/extra-dir-empty", Directory, 0, 420), ("prefix/extra-dir/symlink-to-extra", Symlink, 0, 420)] right: [("prefix/.gitattributes", Regular, 56, 420), ("prefix/a", Regular, 3, 420), ("prefix/symlink-to-a", Symlink, 0, 420), ("prefix/dir/b", Regular, 3, 420), ("prefix/dir/subdir/exe", Regular, 0, 420), ("prefix/extra-file", Regular, 21, 420), ("prefix/extra-exe", Regular, 0, 420), ("prefix/extra-dir-empty", Directory, 0, 420), ("prefix/extra-dir/symlink-to-extra", Symlink, 0, 420)] note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace --- gix-archive/tests/archive.rs | 24 ++++++++---------------- gix-archive/tests/fixtures/basic.sh | 2 +- 2 files changed, 9 insertions(+), 17 deletions(-) diff --git a/gix-archive/tests/archive.rs b/gix-archive/tests/archive.rs index 1a0b1cf895a..8e563b584da 100644 --- a/gix-archive/tests/archive.rs +++ b/gix-archive/tests/archive.rs @@ -27,12 +27,6 @@ mod from_tree { entry.read_to_end(&mut buf).expect("stream can always be read"); } - let expected_link_mode = EntryKind::Link; - let expected_exe_mode = if cfg!(windows) { - EntryKind::Blob - } else { - EntryKind::BlobExecutable - }; assert_eq!( paths_and_modes, &[ @@ -48,7 +42,7 @@ mod from_tree { ), ( "symlink-to-a".into(), - expected_link_mode, + EntryKind::Link, hex_to_id("2e65efe2a145dda7ee51d1741299f848e5bf752e") ), ( @@ -58,7 +52,7 @@ mod from_tree { ), ( "dir/subdir/exe".into(), - expected_exe_mode, + EntryKind::BlobExecutable, hex_to_id("e69de29bb2d1d6434b8b29ae775ad8c2e48c5391") ), ( @@ -68,7 +62,7 @@ mod from_tree { ), ( "extra-exe".into(), - expected_exe_mode, + if cfg!(windows) { EntryKind::Blob } else { EntryKind::BlobExecutable }, hex_to_id("0000000000000000000000000000000000000000") ), ( @@ -78,7 +72,7 @@ mod from_tree { ), ( "extra-dir/symlink-to-extra".into(), - expected_link_mode, + EntryKind::Link, hex_to_id("0000000000000000000000000000000000000000") ) ] @@ -111,20 +105,18 @@ mod from_tree { header.mode()?, )); } - let expected_symlink_type = EntryType::Symlink; - let expected_exe_mode = if cfg!(windows) { 420 } else { 493 }; assert_eq!( out, [ ("prefix/.gitattributes", EntryType::Regular, 56, 420), ("prefix/a", EntryType::Regular, 3, 420), - ("prefix/symlink-to-a", expected_symlink_type, 0, 420), + ("prefix/symlink-to-a", EntryType::Symlink, 0, 420), ("prefix/dir/b", EntryType::Regular, 3, 420), - ("prefix/dir/subdir/exe", EntryType::Regular, 0, expected_exe_mode), + ("prefix/dir/subdir/exe", EntryType::Regular, 0, 493), ("prefix/extra-file", EntryType::Regular, 21, 420), - ("prefix/extra-exe", EntryType::Regular, 0, expected_exe_mode), + ("prefix/extra-exe", EntryType::Regular, 0, if cfg!(windows) { 420 } else { 493 }), ("prefix/extra-dir-empty", EntryType::Directory, 0, 420), - ("prefix/extra-dir/symlink-to-extra", expected_symlink_type, 0, 420) + ("prefix/extra-dir/symlink-to-extra", EntryType::Symlink, 0, 420) ] .into_iter() .map(|(path, b, c, d)| (bstr::BStr::new(path).to_owned(), b, c, d)) diff --git a/gix-archive/tests/fixtures/basic.sh b/gix-archive/tests/fixtures/basic.sh index 5cd4c2e859c..f8a8c8bea3e 100755 --- a/gix-archive/tests/fixtures/basic.sh +++ b/gix-archive/tests/fixtures/basic.sh @@ -20,6 +20,7 @@ echo "/dir-ignored/ export-ignore" > .gitattributes echo "/file-ignored export-ignore" >> .gitattributes git add . +git update-index --chmod=+x dir/subdir/exe # For Windows. git commit -m "init" echo "extra to be streamed" > extra-file @@ -28,4 +29,3 @@ mkdir extra-dir-empty extra-dir ln -s ../extra-file extra-dir/symlink-to-extra git rev-parse @^{tree} > head.hex - From 06a23531c36fe8c93d0c3c9b761c856c01d5f853 Mon Sep 17 00:00:00 2001 From: Eliah Kagan Date: Sun, 3 Nov 2024 02:21:03 -0500 Subject: [PATCH 05/18] Run `cargo fmt` --- gix-archive/tests/archive.rs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/gix-archive/tests/archive.rs b/gix-archive/tests/archive.rs index 8e563b584da..9ffc9bf60ad 100644 --- a/gix-archive/tests/archive.rs +++ b/gix-archive/tests/archive.rs @@ -62,7 +62,11 @@ mod from_tree { ), ( "extra-exe".into(), - if cfg!(windows) { EntryKind::Blob } else { EntryKind::BlobExecutable }, + if cfg!(windows) { + EntryKind::Blob + } else { + EntryKind::BlobExecutable + }, hex_to_id("0000000000000000000000000000000000000000") ), ( @@ -114,7 +118,12 @@ mod from_tree { ("prefix/dir/b", EntryType::Regular, 3, 420), ("prefix/dir/subdir/exe", EntryType::Regular, 0, 493), ("prefix/extra-file", EntryType::Regular, 21, 420), - ("prefix/extra-exe", EntryType::Regular, 0, if cfg!(windows) { 420 } else { 493 }), + ( + "prefix/extra-exe", + EntryType::Regular, + 0, + if cfg!(windows) { 420 } else { 493 } + ), ("prefix/extra-dir-empty", EntryType::Directory, 0, 420), ("prefix/extra-dir/symlink-to-extra", EntryType::Symlink, 0, 420) ] From f72ff21abf95603e18d4c2dfdfd8f81af924624e Mon Sep 17 00:00:00 2001 From: Eliah Kagan Date: Sun, 3 Nov 2024 04:09:22 -0500 Subject: [PATCH 06/18] Set +x in index in v2_all_file_kinds and v2_deeper_tree fixtures This adds `git update-index --chmod=+x` commands in two of the gix-index v2 fixture scripts so that they can set executable bits on Windows, where the plain `chmod +x` commands have no effect. --- gix-index/tests/fixtures/make_index/v2_all_file_kinds.sh | 4 ++-- gix-index/tests/fixtures/make_index/v2_deeper_tree.sh | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/gix-index/tests/fixtures/make_index/v2_all_file_kinds.sh b/gix-index/tests/fixtures/make_index/v2_all_file_kinds.sh index 0dae4a4027c..ebaab2d1e41 100755 --- a/gix-index/tests/fixtures/make_index/v2_all_file_kinds.sh +++ b/gix-index/tests/fixtures/make_index/v2_all_file_kinds.sh @@ -1,11 +1,10 @@ #!/usr/bin/env bash set -eu -o pipefail -export GIT_INDEX_VERSION=2; +export GIT_INDEX_VERSION=2 git init -q sub (cd sub - touch a b c git add . git commit -m "init" @@ -21,6 +20,7 @@ mkdir d (cd d && touch a b c) git add . +git update-index --chmod=+x b # For Windows. git commit -m "init" git rev-parse @^{tree} > head.tree diff --git a/gix-index/tests/fixtures/make_index/v2_deeper_tree.sh b/gix-index/tests/fixtures/make_index/v2_deeper_tree.sh index 09ba2a53464..a5734ad342d 100755 --- a/gix-index/tests/fixtures/make_index/v2_deeper_tree.sh +++ b/gix-index/tests/fixtures/make_index/v2_deeper_tree.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -eu -o pipefail -export GIT_INDEX_VERSION=2; +export GIT_INDEX_VERSION=2 mkdir sub (cd sub @@ -25,4 +25,5 @@ mkdir d ) git add . +git update-index --chmod=+x b # For Windows. git commit -m "init" From eab67358c135597936448f6b9faf85cd52bb3400 Mon Sep 17 00:00:00 2001 From: Eliah Kagan Date: Sun, 3 Nov 2024 09:48:24 +0000 Subject: [PATCH 07/18] Regenerate gix-index fixture archive --- .../generated-archives/v2_all_file_kinds.tar | Bin 128000 -> 128000 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/gix-index/tests/fixtures/generated-archives/v2_all_file_kinds.tar b/gix-index/tests/fixtures/generated-archives/v2_all_file_kinds.tar index ad35bdb4a35bc25d89b6abf69ca1405cf284296b..01ceee8b2f6cf1baeb17e5793fea23af696c35bc 100644 GIT binary patch delta 879 zcmZ{iPe>GT6vyZN_V=6F+1c6IT~;$Zlw`Ju+Uy@SD@00yLWmR#I#fzfB7~R1E{l;? zNJZ`MV1x&CWCz0__P6-Ec<_>-l!XT=4`CrCq7nrODsHngb_n$Hd%W-G``-KUcwI|U z*OD}VQY(Pch#-S}!3LSfjCc@c65b|^oRbjq&SqUqnE}kakF$g+a~m#3Iz`b?TJsGh z;WLz^pDE)w$h3y7Jf@6dH`9i)GV^8DC4+>5jI3-z+UG?DH;$Zn4aI{C|DqtcK?o)8 z)3U(f1JEMadTg=!f8Nt52=`X09w;h=R>yO?5y$lyEgT5EMWLNj^R0~DNZDTGv?Ym=iJkTE6-}mCtr@YULALmogq_aM@b2Q4pE0e%)HJo|D6fskOgJ`lp6bbp@+?Hv!KN9!>sv zu&+vp=<%wE9@V2UUC{MNJXTpP=(I(;P64vMn#y=hw9=BxZ{KR`%+32?l^z-s0V5MH z0pi#V1ex+2U{jt2%w<0y%oPu86E2?u332~4WL;dF1dIB+AxpS60~;5Z+&vWT+`}&Xs>7XI*o9xq@xG~iC=Ru^b(Xy;pI-h21Br+4e@vXe zt0d{y-t5>s$Q~}2TE8#@6(CYI+GKyU3PuQ3btj3#2v9ZbBxQC|>m(`Ro5+ebGnLI&IQFBB5%8vS2=Ozk*4+LW}Osf(VyP!$f@&iSOb}?J_S@;Vn2L#AIaJhb%qi#*Ad?i-_s-AhEz~ znlOFoH*u20{iz}uF@IaSz|taxmR2QM+VOy;mAhCUWZEN9Wr1$+F=Jp=W~5m)nNj*r zWd5CLk!h7{qD53}5y_1=DkI~6VfY&$XT`u`_5KJu(wcyt(1G67F52}YPl`or!a|rf z$(JcW+K5D>wUOAtShRNE?VBxaJkNn&z&92EOB^l31`IC&cGfUrc!MBY@q@$_A0W)N zF#zwjTl~%W%x#Nvx7|W-@O1C4Tj&=u`r~&mVR!zk#=fC5g)J+MpQ`Uc^3DzNXQqSJ zwWh}gK{2^92|h&i)al;mn8#;f6zseykf^@sF&|xq>hoSP4WoqWOI|St{e)u^{D=o{ zLAt;;s-Vy|_JCv?MMkhc(ewFyJ8tu&s=P%9R)J7dZX`>)@ Date: Sun, 3 Nov 2024 05:24:20 -0500 Subject: [PATCH 08/18] Set +x in index in status_changed.sh fixture This adds a `git update-index --chmod=+x` command in the gix-status `status_changed.sh` fixture script before the `git commit` command, so that the commit holds the same mode bits on Windows, where `chmod +x` does not take effect, as on Unix-like systems where it is generally does take effect. This change is done for the purpose of making the fixture be as was intended. But there is no corresponding change to be made to test cases that use it. The tests are asserting different things on Windows and non-Windows systems about changes in the working tree after a commit. The fixture script deliberately does not stage such changes, so for the `chmod +x` and `chmod -x` commands appearing after that in the fixture script, there is no change to the index that can correctly be made to unify the behavior across platforms. Windows doesn't support Unix-style executable permissions in the filesystem, so the state of the working tree still has to be asserted differently on Windows. Although the mode is different in the repo metadata due to this change, it still is not found to disagree with the mode on disk, since the latter information is absent. (Because the files are staged, is implicitly taken to agree with whichever of +x or -x is already recorded in the repo for them.) --- gix-status/tests/fixtures/status_changed.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gix-status/tests/fixtures/status_changed.sh b/gix-status/tests/fixtures/status_changed.sh index 06ff09ebf3f..18be3d1d8ae 100755 --- a/gix-status/tests/fixtures/status_changed.sh +++ b/gix-status/tests/fixtures/status_changed.sh @@ -14,6 +14,7 @@ mkdir dir/sub-dir (cd dir/sub-dir && ln -sf ../content symlink) git add -A +git update-index --chmod=+x executable # For Windows. git commit -m "Commit" chmod +x dir/content @@ -23,4 +24,4 @@ echo -n "foo" > executable rm empty ln -sf dir/content empty -git reset \ No newline at end of file +git reset From c50d73058c64809c7863c1be3bff88a0e91f86d8 Mon Sep 17 00:00:00 2001 From: Eliah Kagan Date: Sun, 3 Nov 2024 05:46:52 -0500 Subject: [PATCH 09/18] Set +x in index in other gix-status fixtures For these the current situation is simpler because the tests currently using them do not contain assertions whose correctness varies based on whether the affected files modes' have +x or -x. But it is the intent of the fixtures to record +x modes for some particular files in the test repository, so this modifies the scripts to do so, even on Windows where `chmod +x` does not take effect. This also allows the tests to include a broader range of metadata and, specifically, may verify in some comparisons that having a mode of 0o755 instead of 0o644 does not cause a problem, even though not explicitly asserted in detail. --- gix-status/tests/fixtures/status_many.sh | 1 + gix-status/tests/fixtures/status_removed.sh | 3 ++- gix-status/tests/fixtures/status_unchanged.sh | 3 ++- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/gix-status/tests/fixtures/status_many.sh b/gix-status/tests/fixtures/status_many.sh index a3d05017d3e..9a11f3f4f8d 100755 --- a/gix-status/tests/fixtures/status_many.sh +++ b/gix-status/tests/fixtures/status_many.sh @@ -12,6 +12,7 @@ git init -q changed-and-untracked echo "different content" > dir/content2 git add -A + git update-index --chmod=+x executable # For Windows. git commit -m "Commit" echo "change" >> executable diff --git a/gix-status/tests/fixtures/status_removed.sh b/gix-status/tests/fixtures/status_removed.sh index d6a06ec651b..c8249e10c89 100755 --- a/gix-status/tests/fixtures/status_removed.sh +++ b/gix-status/tests/fixtures/status_removed.sh @@ -13,6 +13,7 @@ mkdir dir/sub-dir (cd dir/sub-dir && ln -sf ../content symlink) git add -A +git update-index --chmod=+x executable # For Windows. git commit -m "Commit" rm -rf ./empty ./executable ./dir/content ./dir/sub-dir/symlink -git reset \ No newline at end of file +git reset diff --git a/gix-status/tests/fixtures/status_unchanged.sh b/gix-status/tests/fixtures/status_unchanged.sh index 14caa054cd9..a2beaa7e313 100755 --- a/gix-status/tests/fixtures/status_unchanged.sh +++ b/gix-status/tests/fixtures/status_unchanged.sh @@ -13,8 +13,9 @@ mkdir dir/sub-dir (cd dir/sub-dir && ln -sf ../content symlink) git add -A +git update-index --chmod=+x executable # For Windows. git commit -m "Commit" touch ./empty ./executable ./dir/content ./dir/sub-dir/symlink -git reset # ensure index timestamp is large enough to not mark everything racy \ No newline at end of file +git reset # ensure index timestamp is large enough to not mark everything racy From 9ec034f2abbd5b0a169ac1095001d11e73d6db0a Mon Sep 17 00:00:00 2001 From: Eliah Kagan Date: Sun, 3 Nov 2024 11:10:00 +0000 Subject: [PATCH 10/18] Regenerate gix-status fixture archives --- .../generated-archives/status_many.tar | Bin 144384 -> 144384 bytes .../generated-archives/status_removed.tar | Bin 70656 -> 70656 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/gix-status/tests/fixtures/generated-archives/status_many.tar b/gix-status/tests/fixtures/generated-archives/status_many.tar index 91dd6a9110f0efcf3986a72af0c7567ce8b16ad6..8e656859d8e5d1a1f98718e26d0255db17efa0cf 100644 GIT binary patch delta 1021 zcmd6mPe@cj9LM+fd-LADUDj2X_Oa~q??ZhSzTIuz{CBcIi4f^v5z-+fXfvpwj6HhL zlOX7bc8c-^D;+vG)wqa4QXvK%B*;^FkXS-0Fe?AxHm>V~4&6KaX6Ez#{l3F6znQ_T zI+#@-;d}xepnM zS{u!WOp_Z?KD7fQ5{*ndHFJ=WskK?C;Yma$as4qU3bj&>ItrN}wI&>X0+}Le%{aUW znPO_KI-G@tQeK;aJ>gn%)HPUe^V)Zi^U&Bz;^>s?z}#s)0RgUua2L21gP#z(W?q^! zE_iMo%`TS;uKJ;uw5F`(U&$qUw~(xU`|SCF^I$GG=jp4m*rBs&=zV_MkgKJTT%^A8 zfn%q6e`0NT*nF`4VcFlIfw1Tr-d$51&9c z^6DDgmUy@UKT9v_Q4{Z{3Xy9Sm;)B{6=B*40O3XjY)L$*LJ?txUq;*fL2UCoVWx(J z9WU9JnR&&HERxMh%-R6LBGWmUS(`f&Ge;H0wo;mHP55nVri59mBrqkq-Y8xlOZL4E zGHZ#bQ=;RC%G|Pt#a4c~ZL=c4O@v)wM)=GB)$7^crk9y9742w3v7_xGxmCuE3XAq`$=nEmxbeC&*n_kY7QfUWK+=W=$PFKSlxMM+NX?NLFRjC`Fs)*7yfxm^ c+8S?cJZTNwyq@BvUib#Q$_wj-ajfdh9|`C|jsO4v delta 1043 zcmd5)!AlfT9QOB{nRS}B-F9#%aZ1-|*C}##S6$7ZLkM|k|AL@H5iu2%hm5Eo2?Fty zJH$|zf|aI2i15gVnGq%(BP2XTM3|V+vVwvvx@qsJyF-WW9p-!Q`@Y}r&Ex&PfhBoh zNq&aoEf^Ms&SX1{h){&*t%%{aOghum-EpELZS`Nfe2YeAVHxOV7~)8cMv%}mTOmNr zBY+}3ItM?X{?a-7ku;c9Dr-%R3^l>E!%lp<`(I|ArLRz}4|-FjZvGSQSVV0f{C{nAf!c(Nz@5p?Ayw*AQ}}O{D2% zIYRW0GP-OGox`!<_FK)jk;e-|;IgUgYQ+9DDYNsO%368(yzl7#VFa9L`q z7t8QFG!6+a3sLoqRwCr}keJsM_RT0nf4c#BO%$mXf-RuYAn=fEis&^Ui&ldIWq75* YUUZt(i}XPN?g%tC3*TV}hhwMy07fWUz5oCK diff --git a/gix-status/tests/fixtures/generated-archives/status_removed.tar b/gix-status/tests/fixtures/generated-archives/status_removed.tar index 1828e56b98004741a4f2bafe818d3f319afcf23b..ec26788a7dc50c45b35d7edd6507093376e6a212 100644 GIT binary patch delta 383 zcmZoz!P2mTWdkeAV%B#+{EB5WD;E>XW_Ff;teaV**qJu-Jo?YPnfo3i%VwTA|5-P4 zKl{bJnYDwBZ83L|*kbNJzQx>&1U7S@VG-KQAM;0aGxr`Aj?Mg={&Q~TJMx`QeEvhjAmfqU}R9NY?`bhU;&Yw`0W{35=cWOr%x^s zZ~#k6oSyL&BnhISlC_i12pB*lf5zWKldPL8A~;p#;QOwEL${gLrrhOp`~Ln_zVpm2 zt`h~FH+^E|+RUoL!L*pyjBPV-$Pb{GO+Y*yAhuy!%&P~)PC)Dj#A-kl9-mpaF){M9 zFq!LZcDQqZaiW6$G!Di#aWe)(0~0et10w??V*>^Q149#IQ*#D`$%(=#lNlNR^O+bJ b7#Nvbn3?F7=4DoFcJ$c~)M~tphmivSAt8QY delta 368 zcmZoz!P2mTWdkeAVpajR&8$33ESuT)u`)@d#b!*=cg*|%qZt@D7#VmzS58(rU;&Y= zE9M7F0%@q^%*iDO93YY`2^YYUKpHApHu=l}16-2jlSK|r70C>4`Z0gG*zD+oTzPUC z`3=WP4O=D(I&WIVDzusP3bVvD)8*cNlU@h#?70Ma1>o4Kbjb8Y79VdU7%Kkpm+X4Vug zq0Rg4();&y{S(p80-p0hp&%$h~XSCU|WIy9X z1^sCpjBS(K9tg6T7@HX|7)(y&N}0^a_@Cd{$jH*b*x1n2Lbo(8vtqL%-+iERp=CUb F8~~3|dTsy! From d715e4a96d0977042e24c3dc6c864146f4be0b78 Mon Sep 17 00:00:00 2001 From: Eliah Kagan Date: Sun, 3 Nov 2024 15:07:38 -0500 Subject: [PATCH 11/18] Have gix-worktree-state checkout tests fail without symlinks A few of the gix-worktree-state checkout tests have been checking if the filesystem supports symlinks, while one was skipped (marked ignored) on Windows based on the idea that symlinks would not be created, and also had an assertion that assumed symlinks would not be successfully created. This commit changes such tests so that they run on all platforms, including Windows, and so that, on all platforms, they assert that the filesystem supports symlinks, and assert that expected symlinks are created after attempts to do so. (The reason to assert that the filesystem supports symlinks is so that if this is not detected, either due to a failure or detection or due to the filesystem really not supporting symlinks, the test failures will be clear, rather than having a later assertion fail for unclear reasons.) Since #1444, tests involving symlinks are expected to work even on Windows. That PR included changes to the way fixtures were run, and to other parts of the test suite, to cause symlinks to be created in cases where they had previously had not (#1443). A number of tests had been assumed not to work due to limitations of Windows, MSYS, or Git: - Although Windows will not allow all users to create symlinks under all configurations, the test suite expects to be run on a Windows system configured to permit this. - Although `ln -s` and similar commands in MSYS environments, including Git Bash, do not by default attempt to create actual symlinks, this does happen when symlink creation is enabled using the `MSYS` environment variable, as done in 0899c2e (#1444). (This situation differs from that of Unix-style executable bits, which do not have filesystem support on Windows. While `chmod +x` and `chmod -x` commands do not take effect on Windows, which slightly limits the ability to test such metadata and requires that a number of fixtures set the mode directly in the ndex, with symlinks there is no such inherent restriction. Provided that the `MSYS` environment variable is set to allow it, which gix-testtools takes care of since #1444, and that Windows permits the user running the test suite to create symlinks, which is already needed to properly run the test suite on Windows, the same `ln -s` commands in fixture scripts that work on Unix-like systems will also work on Windows.) - Although `git` commands will not check out symlinks as actual symlinks on Windows unless `core.symlinks` is set to `true`, this is not typically required for the way symlinks are used in the gitoixde test suite. Instead, we usually test the presence of expected symlink metadata in repository data structures such as an index and trees, as well as the ability of gitoxide to check out symlinks. (We do not intentionally test the ability to run `ln -s` in Git Bash, but this is needed in order to create a number of the repositories for testing. Having `git` check out symlinks is not typically needed for this.) In addition, since we are requiring that Windows test environments permit the user running the test suite to create symlinks, any failures that arise in the future due to greater sensitivity to `core.symlinks` (see #1353 for context) could be worked around by setting that configuration variable for the tests, either in gix-testtools via `GIT_CONFIG_{COUNT,KEY,VALUE}` or in the specifically affected fixture scripts. While #1444 updated a number of tests to reflect the ability to create symlinks in fixture scripts and the wish to test them on all platforms including Windows, some tests remain to be updated. This commit covers the gix-worktree-statte checkout tests. This does not cover even their associated fixtures, which can already create symlinks (given the above described conditions), but that should be updated so they can set intended executable permissions (see above on `chmod`). This will be done separately. --- gix-worktree-state/tests/state/checkout.rs | 22 ++++------------------ 1 file changed, 4 insertions(+), 18 deletions(-) diff --git a/gix-worktree-state/tests/state/checkout.rs b/gix-worktree-state/tests/state/checkout.rs index 752277a48b7..c496d04688b 100644 --- a/gix-worktree-state/tests/state/checkout.rs +++ b/gix-worktree-state/tests/state/checkout.rs @@ -173,20 +173,13 @@ fn delayed_driver_process() -> crate::Result { } #[test] -#[cfg_attr( - windows, - ignore = "on windows, the symlink to a directory doesn't seem to work and we really want to test with symlinks" -)] fn overwriting_files_and_lone_directories_works() -> crate::Result { for delay in [ gix_filter::driver::apply::Delay::Allow, gix_filter::driver::apply::Delay::Forbid, ] { let mut opts = opts_from_probe(); - assert!( - opts.fs.symlink, - "BUG: the probe must detect to be able to generate symlinks" - ); + assert!(opts.fs.symlink, "The probe must detect to be able to generate symlinks"); opts.overwrite_existing = true; opts.filter_process_delay = delay; opts.destination_is_initially_empty = false; @@ -244,8 +237,7 @@ fn overwriting_files_and_lone_directories_works() -> crate::Result { ); let symlink = destination.path().join("dir/sub-dir/symlink"); - // on windows, git won't create symlinks as its probe won't detect the capability, even though we do. - assert_eq!(std::fs::symlink_metadata(&symlink)?.is_symlink(), cfg!(unix)); + assert!(std::fs::symlink_metadata(&symlink)?.is_symlink()); assert_eq!( std::fs::read(symlink)?.as_bstr(), "➡other content\r\n", @@ -270,10 +262,7 @@ fn symlinks_become_files_if_disabled() -> crate::Result { #[test] fn symlinks_to_directories_are_usable() -> crate::Result { let opts = opts_from_probe(); - if !opts.fs.symlink { - eprintln!("Skipping directory symlink test on filesystem that doesn't support it"); - return Ok(()); - } + assert!(opts.fs.symlink, "The probe must detect to be able to generate symlinks"); let (_source_tree, destination, _index, outcome) = checkout_index_in_tmp_dir(opts.clone(), "make_dir_symlink", None)?; @@ -298,10 +287,7 @@ fn symlinks_to_directories_are_usable() -> crate::Result { #[test] fn dangling_symlinks_can_be_created() -> crate::Result { let opts = opts_from_probe(); - if !opts.fs.symlink { - eprintln!("Skipping dangling symlink test on filesystem that doesn't support it"); - return Ok(()); - } + assert!(opts.fs.symlink, "The probe must detect to be able to generate symlinks"); for (fixture, symlink_name, target_name) in [ ("make_dangling_symlink", "dangling", "non-existing-target"), From 22e7f33483bb67e53ec47b8767998f5ca002846b Mon Sep 17 00:00:00 2001 From: Eliah Kagan Date: Sun, 3 Nov 2024 15:41:13 -0500 Subject: [PATCH 12/18] Set +x in index in gix-worktree-state make_mixed* fixtures This adds `git update-index --chmod=+x` commands to the `make_mixed`, `make_mixed_without_submodules`, and `make_mixed_without_submodules_and_symlinks` fixtures used in gix-worktree-state `tests/state/checkout.rs` tests, so that files are staged and committed with the intended modes. The tests were actually passing before this change, but making it verifies that the tests still work even when the repository is as assumed. (Also, some of those tests are recently enabled or made more expansive on Windows, due to the preceding commit that makes them test symlinks, where applicable, on all platforms.) --- gix-worktree-state/tests/fixtures/make_mixed.sh | 1 + .../tests/fixtures/make_mixed_without_submodules.sh | 1 + .../tests/fixtures/make_mixed_without_submodules_and_symlinks.sh | 1 + 3 files changed, 3 insertions(+) diff --git a/gix-worktree-state/tests/fixtures/make_mixed.sh b/gix-worktree-state/tests/fixtures/make_mixed.sh index 8e23ccbfc30..47b112c07e4 100755 --- a/gix-worktree-state/tests/fixtures/make_mixed.sh +++ b/gix-worktree-state/tests/fixtures/make_mixed.sh @@ -17,6 +17,7 @@ mkdir dir/sub-dir (cd dir/sub-dir && ln -sf ../content symlink) git add -A +git update-index --chmod=+x executable # For Windows. git commit -m "Commit" git init module1 diff --git a/gix-worktree-state/tests/fixtures/make_mixed_without_submodules.sh b/gix-worktree-state/tests/fixtures/make_mixed_without_submodules.sh index 78d36a2f2d0..ace64b1cdde 100755 --- a/gix-worktree-state/tests/fixtures/make_mixed_without_submodules.sh +++ b/gix-worktree-state/tests/fixtures/make_mixed_without_submodules.sh @@ -17,4 +17,5 @@ mkdir dir/sub-dir (cd dir/sub-dir && ln -sf ../content symlink) git add -A +git update-index --chmod=+x executable # For Windows. git commit -m "Commit" diff --git a/gix-worktree-state/tests/fixtures/make_mixed_without_submodules_and_symlinks.sh b/gix-worktree-state/tests/fixtures/make_mixed_without_submodules_and_symlinks.sh index 77c3aea2362..cbaf0047d84 100755 --- a/gix-worktree-state/tests/fixtures/make_mixed_without_submodules_and_symlinks.sh +++ b/gix-worktree-state/tests/fixtures/make_mixed_without_submodules_and_symlinks.sh @@ -17,4 +17,5 @@ mkdir dir/sub-dir echo "even other content" > dir/sub-dir/file git add -A +git update-index --chmod=+x executable # For Windows. git commit -m "Commit" From 5aa1d1adbf516bc13032bcea5afb828acf7706d4 Mon Sep 17 00:00:00 2001 From: Eliah Kagan Date: Mon, 4 Nov 2024 10:45:40 -0500 Subject: [PATCH 13/18] Set +x in index in gix-worktree-stream basic fixture, adjust test As in 470c76e, this updates tests to reflect the ability of Git repositories to represent Unix-style executable permissions in an index and commits, and the ability of gitoxide to operate on this, on all platforms, including Windows where the filesystem itself does not support this kind of executable permissons. Changes: 1. Adds a `git update-index --chmod=+x` command in the basic.sh fixture for gix-worktree-steam, so `dir/subtree/exe` is marked executable in the repository, even on Windows where the filesystem itself does not support Unix-style executable permissions and where, in Git Bash, `chmod +x` has no effect. This does not affect `extra-exe`, which is never staged. Since `extra-exe` is just an extra file in the working tree, it cannot be marked `+x` on Windows. 2. Updates the `paths_and_modes` assertion in `will_provide_all_information_and_respect_export_ignore` to assert the correct mode, with `+x` set, in the staged/committed file `dir/subtree/exe`. The `extra-exe` part of the assertion is unchanged in meaning, but the `expected_exe_mode` would only be used in that one place now, so this removes it and replaces it with the conditional expression for its value based on whether we are using Windows. While doing that refactoring, this also removes the `expected_link_mode` constant, which has unconditionally aliased `EntryKind::Link` since 93e088a (#1444). These changes are directly analogous to (1) and (2) in 470c76e. Here, they are made to the gix-worktree-stream tests, while in 470c76e they were made to the gix-archive tests (along with another related change, in (3), for which there is nothing anlogous to be done here). For reference, with *this* commit's change (1) described above but without *this* commit's change (2), the failure is: --- STDERR: gix-worktree-stream::stream from_tree::will_provide_all_information_and_respect_export_ignore --- Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.45s thread 'from_tree::will_provide_all_information_and_respect_export_ignore' panicked at gix-worktree-stream\tests\stream.rs:119:9: assertion `left == right` failed left: [(".gitattributes", Blob, Sha1(45c160c35c17ad264b96431cceb9793160396e99)), ("a", Blob, Sha1(45b983be36b73c0788dc9cbcb76cbb80fc7bb057)), ("bigfile", Blob, Sha1(4995fde49ed64e043977e22539f66a0d372dd129)), ("symlink-to-a", Link, Sha1(2e65efe2a145dda7ee51d1741299f848e5bf752e)), ("dir/.gitattributes", Blob, Sha1(81b9a375276405703e05be6cecf0fc1c8b8eed64)), ("dir/b", Blob, Sha1(ab4a98190cf776b43cb0fe57cef231fb93fd07e6)), ("dir/subdir/exe", BlobExecutable, Sha1(e69de29bb2d1d6434b8b29ae775ad8c2e48c5391)), ("dir/subdir/streamed", Blob, Sha1(08991f58f4de5d85b61c0f87f3ac053c79d0e739)), ("extra-file", Blob, Sha1(0000000000000000000000000000000000000000)), ("extra-bigfile", Blob, Sha1(0000000000000000000000000000000000000000)), ("extra-exe", Blob, Sha1(0000000000000000000000000000000000000000)), ("extra-dir-empty", Tree, Sha1(0000000000000000000000000000000000000000)), ("extra-dir/symlink-to-extra", Link, Sha1(0000000000000000000000000000000000000000))] right: [(".gitattributes", Blob, Sha1(45c160c35c17ad264b96431cceb9793160396e99)), ("a", Blob, Sha1(45b983be36b73c0788dc9cbcb76cbb80fc7bb057)), ("bigfile", Blob, Sha1(4995fde49ed64e043977e22539f66a0d372dd129)), ("symlink-to-a", Link, Sha1(2e65efe2a145dda7ee51d1741299f848e5bf752e)), ("dir/.gitattributes", Blob, Sha1(81b9a375276405703e05be6cecf0fc1c8b8eed64)), ("dir/b", Blob, Sha1(ab4a98190cf776b43cb0fe57cef231fb93fd07e6)), ("dir/subdir/exe", Blob, Sha1(e69de29bb2d1d6434b8b29ae775ad8c2e48c5391)), ("dir/subdir/streamed", Blob, Sha1(08991f58f4de5d85b61c0f87f3ac053c79d0e739)), ("extra-file", Blob, Sha1(0000000000000000000000000000000000000000)), ("extra-bigfile", Blob, Sha1(0000000000000000000000000000000000000000)), ("extra-exe", Blob, Sha1(0000000000000000000000000000000000000000)), ("extra-dir-empty", Tree, Sha1(0000000000000000000000000000000000000000)), ("extra-dir/symlink-to-extra", Link, Sha1(0000000000000000000000000000000000000000))] note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace --- gix-worktree-stream/tests/fixtures/basic.sh | 2 +- gix-worktree-stream/tests/stream.rs | 14 ++++---------- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/gix-worktree-stream/tests/fixtures/basic.sh b/gix-worktree-stream/tests/fixtures/basic.sh index 1a29eb68a8b..55015a7b2d8 100755 --- a/gix-worktree-stream/tests/fixtures/basic.sh +++ b/gix-worktree-stream/tests/fixtures/basic.sh @@ -23,6 +23,7 @@ echo "/file-ignored export-ignore" >> .gitattributes dd if=/dev/zero of=bigfile bs=1024 count=156 git add . +git update-index --chmod=+x dir/subdir/exe git commit -m "init" echo "extra" > extra-file @@ -32,4 +33,3 @@ ln -s ../extra-file extra-dir/symlink-to-extra dd if=/dev/zero of=extra-bigfile bs=1024 count=156 git rev-parse @^{tree} > head.hex - diff --git a/gix-worktree-stream/tests/stream.rs b/gix-worktree-stream/tests/stream.rs index a34e640a1a2..672ef343b64 100644 --- a/gix-worktree-stream/tests/stream.rs +++ b/gix-worktree-stream/tests/stream.rs @@ -110,12 +110,6 @@ mod from_tree { } } - let expected_exe_mode = if cfg!(windows) { - EntryKind::Blob - } else { - EntryKind::BlobExecutable - }; - let expected_link_mode = EntryKind::Link; assert_eq!( paths_and_modes, &[ @@ -136,7 +130,7 @@ mod from_tree { ), ( "symlink-to-a".into(), - expected_link_mode, + EntryKind::Link, hex_to_id("2e65efe2a145dda7ee51d1741299f848e5bf752e") ), ( @@ -151,7 +145,7 @@ mod from_tree { ), ( "dir/subdir/exe".into(), - expected_exe_mode, + EntryKind::BlobExecutable, hex_to_id("e69de29bb2d1d6434b8b29ae775ad8c2e48c5391") ), ( @@ -171,7 +165,7 @@ mod from_tree { ), ( "extra-exe".into(), - expected_exe_mode, + if cfg!(windows) { EntryKind::Blob } else { EntryKind::BlobExecutable }, hex_to_id("0000000000000000000000000000000000000000") ), ( @@ -181,7 +175,7 @@ mod from_tree { ), ( "extra-dir/symlink-to-extra".into(), - expected_link_mode, + EntryKind::Link, hex_to_id("0000000000000000000000000000000000000000") ) ] From ccb06a75ff84736ad0233702784d5fd451317f50 Mon Sep 17 00:00:00 2001 From: Eliah Kagan Date: Mon, 4 Nov 2024 11:25:51 -0500 Subject: [PATCH 14/18] Run `cargo fmt` --- gix-worktree-stream/tests/stream.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/gix-worktree-stream/tests/stream.rs b/gix-worktree-stream/tests/stream.rs index 672ef343b64..f66e24698f2 100644 --- a/gix-worktree-stream/tests/stream.rs +++ b/gix-worktree-stream/tests/stream.rs @@ -165,7 +165,11 @@ mod from_tree { ), ( "extra-exe".into(), - if cfg!(windows) { EntryKind::Blob } else { EntryKind::BlobExecutable }, + if cfg!(windows) { + EntryKind::Blob + } else { + EntryKind::BlobExecutable + }, hex_to_id("0000000000000000000000000000000000000000") ), ( From 8720acbe8c4a9f4d9de0cf0d4f1d41c3b738e3ad Mon Sep 17 00:00:00 2001 From: Eliah Kagan Date: Mon, 4 Nov 2024 12:51:24 -0500 Subject: [PATCH 15/18] Avoid unneeded +x in make_rev_spec_parse_repos The make_rev_spec_parse_repos fixture script used `chmod 755` to make a looose object file writable (so it could be corrupted, to test the treatment of corrupted objects). But this also made it executable, which was not needed (on any platforms). This commit changes it from 755 to 644 so that it is still made writable, but not made executable. (It does not start out being executable.) This does not affect the results of any tests. --- gix/tests/fixtures/make_rev_spec_parse_repos.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gix/tests/fixtures/make_rev_spec_parse_repos.sh b/gix/tests/fixtures/make_rev_spec_parse_repos.sh index baa2d924df9..236304092fd 100755 --- a/gix/tests/fixtures/make_rev_spec_parse_repos.sh +++ b/gix/tests/fixtures/make_rev_spec_parse_repos.sh @@ -53,8 +53,8 @@ git init --bare blob.corrupt echo bnkxmdwz | git hash-object -w --stdin oid=$(echo bmwsjxzi | git hash-object -w --stdin) oidf=objects/$(oid_to_path "$oid") - chmod 755 $oidf - echo broken >$oidf + chmod 644 -- "$oidf" + echo broken >"$oidf" baseline "cafea" baseline "cafea^{object}" @@ -424,4 +424,4 @@ git init invalid-head rm .git/refs/heads/main baseline 'HEAD' baseline 'HEAD:file' -) \ No newline at end of file +) From 72cd7f337355c04782f3b804280005234416b8a1 Mon Sep 17 00:00:00 2001 From: Eliah Kagan Date: Mon, 4 Nov 2024 18:09:23 +0000 Subject: [PATCH 16/18] Regenerate gix make_rev_spec_parse_repos fixture archive --- .../make_rev_spec_parse_repos.tar | Bin 1125888 -> 1180672 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/gix/tests/fixtures/generated-archives/make_rev_spec_parse_repos.tar b/gix/tests/fixtures/generated-archives/make_rev_spec_parse_repos.tar index d6c7fa1911450d0143e01e675d0f2924c84ea221..cd856be153131bc045c20dbd6e2b8516bd0c7a5a 100644 GIT binary patch delta 47985 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 Y71&(yy7He^vgopVH^+`NAn4ft2XjgHC!n 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 H@4oxL59_91 From d74e919193e7d40018d7a602cb525f8fe8d33e84 Mon Sep 17 00:00:00 2001 From: Eliah Kagan Date: Mon, 4 Nov 2024 15:28:38 -0500 Subject: [PATCH 17/18] Fix `chmod` in make_rev_spec_parse_repos; regenerate archive on macOS In the preceding two commits, the make_rev_spec_parse_repos fixture was modified to avoid giving extra executable permissions to a loose object file where they are not needed, and the affected fixture archive was regenerated. Though the permissions change is itself good and causes no problems, the overall change caused two problems, which are corrected here: 1. I had taken the opportunity to follow better practices when running commands in a shell script whose arguments are formed by parameter expansion: adding quoting where splitting and globbing is not intended but could in principle also be indicated; and preceding the argument formed this way with a `--` to designate it clearly as a non-option argument, since `chmod` follows the XBD Utility Syntax Guidelines, which include `--` recognition. While adding quoting was a good change (in this case, just for clarity that no expansions are intended), the way I added `--` created a new problem where none had existed. This is because I wrongly thought of it as separating non-filename arguments from filename arguments, which is incorrect: in `chmod`, a mode argument is neither an option or an operand to an option. Accordingly, only some implementations of `chmod` allow it to be placed after the mode. This commit corrects that by placing it before the mode argument instead, which is portable while still achieving the goal of establishing the argument after it as as never being meant to be interpreted as an option (regardless of whether the system's `chmod` recognizes options after non-option arguments). 2. Due to #1622, regenerating `make_rev_spec_parse_repos.tar` with Git 2.47.0 causes revision::spec::from_bytes::regex::find_youngest_matching_commit::regex_matches to to fail on all systems with all versions of Git, whenever `GIX_TEST_IGNORE_ARCHIVES` is *not* set. This differs from the usual situation where it fails only when that *is* set and only when the available Git is >= 2.47.0. This causes the test to fail in the `test-fast` CI job, since the mitigation in #1635 for when the tests are detected to be running on CI deliberately covers only the `GIX_TEST_IGNORE_ARCHIVES` case. In the previous commit, I had regenerated that archive on an Ubuntu 24.04 LTS system with Git 2.47.0 installed from the git-core PPA, causing this problem. This commit regenerates the archive again on a macOS 15.0.1 system with Git 2.39.5 (Apple Git-154), using the command: TZ=UTC cargo nextest run --all --no-fail-fast All tests passed and the archive was successfully remade. I used `TZ=UTC` since I usually regenerate archives on a system whose time zone is configured to be UTC rather than local time, and more specifically because there is an unrelated bug (to be separately reported) causing an unrelated test to fail in some time zones in the two weeks that follow daylight saving time adjustments. --- .../make_rev_spec_parse_repos.tar | Bin 1180672 -> 1125888 bytes .../fixtures/make_rev_spec_parse_repos.sh | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/gix/tests/fixtures/generated-archives/make_rev_spec_parse_repos.tar b/gix/tests/fixtures/generated-archives/make_rev_spec_parse_repos.tar index cd856be153131bc045c20dbd6e2b8516bd0c7a5a..538e9943fc57304c9c4a997d41467856ce8d931d 100644 GIT binary patch delta 13902 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 VnsATGpK_$U!FJ5NLLt+){s%rFPb2^U delta 47764 zcmeHwdw5jUxi|YVduGq@pKnUA_7!bnDWRlQ`fXH1y4~Ii3hbnK)juk7L67-hURJ+9>puBXvu{#-UozY;RdvvA?)< zq`!Fh(%S0fBVq+wU!zbEPBrTzVwb!*@tk%aw6V{pupG^27g_#jpC~iE)F;Tsm@4-z z&3b-IzHCG;*hes9s&9iW-oMHxv;LcWU)WgAy*?#7-rwW%cpAdBmEk27)iuMHRn%0s z-aPj^P^>x9uTLoC4|VBwFi;u_rgZyb@mAq3C{E zj#h^ohUg2zRdvy@bD)mxRo5=ks~h!Y)fGB5-TL7Au^zpmzCK!4AFYPUoC90`WmfK> z`e=ArxVBMmjD)#jA=FeAty==sVI5FcV{87S{?+Lhf!!%6at?&n#;wpR!&MbaYZ`}P ziw{-T)aZ4!H7oRmk?_I?pyCQ%J9WJfJG!u<7HY@N)KrHnL0NCCtJmwQpfc=+S)0DJ zzM(N1u7I9ID{5E6Wj|Ei7^z#@s4uLmt*WVB*w~;~*TR@Igh5bQ5nZ7_R2O{!iiC^w zJF6PQQK%0G9Qs-fZ4@>vUAQpZ&``A$`WMw}>l%kZo77@WMMI-Gm>|I#aYTpFIkV2y zIIwhW(DTZ0O}H^!$*+GFbh)aorl#&8953u!^&)5&26;hExFK<|4Ph9CIvA6R+C|~C z%Z!GX)ZyILRzeHrmuMI}1_M_S4eLuAV31ZrVH~g(RF=jPDz8{nQC-{6SWXk6)5Ozk z7n#=`p2;gOG{>|YuDp6tb?p#n>e}ivq4mxZlPBCceu#55PW8-ieNDwe-u+qkjK4>x zuaUZ%%5b!SrYH3d<2L|wa^b?dDBX~74J+!F;=I&`!<7w1PG_Q@_b;ql7LMKz!wU1J z7Y@-^In}D_n(!S3g8~Ikb)dc)+bd7@0B?n!+A0heEh^F*>cemo()|Z>GNj0XjaE1C`w+|VYoV*CuUHMweNlZ)kJrL)S98?9U3+2uA(+0fdB=CQ`ry)P zcy<>ot*)sY2KRJj^=kYrXj}oR)FF5{!i@`yQoA!yho87wefa;>pVL_l4?!57%z{Ca zrmUWI|36NcF@D1IJEu&$f8vyB6Yjt3o`0G#Yr@O|{SH0ggx?JqYyR}yF{lt{#C#Hm z4^RA_@LL}`xCoxb}P|2YGk}JSN>o;=AV0Xlnhdo#C2>uv1Mm*kyRGF{X){hB&LL z@u7gHI=nDarxzp}OIL^zR##Qw zJVISCdiXQLZ=&Q+690*yGvONe|L0Vbr_z3{NCU3VY$18ee%&35w{*Ajv+kL7=d?sO z(&lSv?E`S3-!xr#=Qc(w>h)Vw?;QG{vMdbuPF3oF+^SEQGi4Ut8p+GzKP1l9Ux!B+ zJ3bPQ$ENyjHpa|OARQJd_q{5y{&_w*(-^a*Q{3o#wKwZO&L=yJF&h$MBl3jMKc}=S zE(`htr6nl<=ljk%Hf4AaSm5qe zntAnqFB-z%d-ZY%y|TXhZm(XC?CRA^I*%{I|C#q+v-WJ<@}rtJ-)a7x^taD%E*bUZ zbBhl?Yczi(e9qByhgW7fm%KKSkQxFSHAvsC7US`_O?c8Lx6 z)aR6qX-B=c6I?%|f~uT>)$d8D!Y%fhuN5SR&HCm@`LAvuooGS_N}Zwx7MnUB`uuF$ zNnf*MOxtPJec1;!U7(s;Of72eJQbWvA_iB(?C}9_`jq&9cYJX5TE=C8slot1xgB){yD{6NkyQz zBos=ye~=5YjhpQc3C;TO_A9PTU{U)L^|Ht%*B+Yzl*g>oh#ZsQLg%|45e%R}6M6H^ zkvz7(#brna5Tfy1W<=%)MJ%?-wLvlo(m?8H6%>EowZ>)uKbn+Koq^BwLDwUa0fZ?j zeN6$~4_qsu1NSC6z#_X``+6I|rIKn#L{MAcTI23cu0}(X*CJQ`5b(rKPH2%Ui(Fac z$|6@5xw6QWMXoGz^>tkMf1F&kZ+7L%29PNe)UZgs>p+Ids}MICkwzb&sdrp!0sD+g zs2LH(2GW>ogWV)sT(?KE6(}t$O$B~k$yWPXSEj?r*_uFFMx;~$pncx;uz(C}assRE zkN~S)B&Zon=(a`*0fT+wT4^_cR3x$DOc8MMOxF`qD$8irRRV&Ae%X&5O45v0LHMeD zw#x$~L&*F0n(qP0pm$C(X75ZV8FO3{vR=5{>yLl@$J1p`wrgMg?%aaAiar0ajy&gLQs3f}0J9wXKrSMcvN~hua=DAh~1~89grvc!;x=mXv82x6;Q(C|3Z{uY( zZKcb|c_*RQ8rdIY+a1~(iS-q=zuK5PPy4IXUZiMZTzgBA4egw=!g%zEoM{V|l%^8V z_r0S8wtlm{Nod_SbW+T(XmRZwMUHES6@_W#id{7Nw7BkW))fM;fUIj2pcVZ#xu$TL ziL5J?HIk9{ybC48{plez}b%q@#W~;JNGIBpiNLl1HWtWX<4=YNx zk-H!vHX=tvxSK{POzrO|i`N?TCcg3=b0wxF~Hr7b9JLFpR` zrDO8|)Z}eWz#)OVtsdKUntsmkgMBk!Grnu)J>DowqO+*qfsVgvY8uRLrw z^4{vy1$-@*2H0b3r4_>d$G<11+AP}VDVif4?|K0`(ZZ=52>4R~FB5*LxCEy86`Nw@ z+~)!aib&2}V;!k93URGe5t;U`;+9#TlggJ;JnOh3v#c`;tep4xNcpS8v=0=AZ1i<# zQ`1VHQkF=}_O|R0Fc~%S||%P6N8Y(Ic`u?!M0^$K7CxVeaEHz|p>!M6+^Q z=oM`(06aTH6L^|%^a~kRZ$$|hOeY-m*qUrcpM1$gvqpp#dWYJYB%{x`PAM()&af>7 z6rE**>FaYuOqL)_dP4p|S4;}7GYfihnhBJZmZsWAEHG+;Q45S(VAKMm78td_s0BuE zC>U+OD&HgBb5(JaVY4$j^jXVuuhb$kmAnmxBhnU3xTD|z3v}N z#>mqNk&>5NQtI#OFH`I zL1XVyW1)mB+YRf#N8HcYjFB-9^~s1Fcff*jq5DO_81s(j7VIYh=DF^JjZH(T= zi{Yv*=nZx6>H#75gBGvl|4^3h6K~;U3nyDR*}};dPPTBeg_A9ud_!?^tjaxxfphs4 zz(2baxW?mzwbzmEcm@Oi@+*LN-c6h#uZR2G|BJjHCidW0UK&gRp-kusiFtEV-Iwgf z$ovGLTcZMa+vk2kFz)bsZ$(6AL@s*svrD@H%3vCx{DsgWTnkI)8oqxKF0iYwxbGAh z_>fN&a{}G!D=7)4`UiY-eFoGw)&T!-4k+^xP#$o1NIleD767OFPAAvvsk^tkEM@t6 z2w~QU!!H-(kfu-t<_-zQ$Tb|9vPhppyUk+l&pIJo9DWpQH_zK6Vpq2$K5Xp#@N~3L40~6h}X}%Uy&HNo3{zZ-}-y* zM$hxUY{3lAc^d1>ilJEc*SDkNRpDP4@xtL~3&3_Q>e(8Wwe zXY_t-K`H6Bbn3RC?qHJ6?Uc?%X@~oHSL~eo4rA=t&S8QfKH+{zHO9_L$VTI^pQGVC zl_p#4c}_6OXLy}#%o+DzROWB=T$Wg2z2}q^nw9cY+H7@8*!r`6klEeEjX&oni35;aAyni7+mT-CJ+C7^_%7UexCWan(AoY*pi+L>+Uwlq% z0yp-|jOoVwEbSKd=stO)WO(kCRAW@Ww=mJ^V={1zX%aZcBVFXu)`-%Nt=lhcaTz1^ z1kmK}<1?g30Z~#EF*em2IS1FgM*5);ANaB)#|J)(hs}7{A<2gSh!$$r-85#J050G$ z>BqMCz_ob31rHnWunP~HB$*A|D}8P=?kGs~gGKI@-j?FSmV?5u8a&L$Lp>fMc$kHU zN<7TLLn9vMK}Exwq>mwl6kPbtYo94@?&7@fpx%S?elZSh3LiAYOwI=rV}aalwzv^l zVQ=H6Um+{RchjA}Ae|M?5ns&ebM*I%r@n3|9hvK<4SwFg^3cD2`X>f4!+nJIY2r-^ zalo|UpDW_<0~Jh2=i#Kp#Pvcv|4mVj=kLSAE<79%Wn=6h_n>B-&-4xq8r>^ykmC8< z@cheocoq+@;b8|P_sKsbeh#DqSY_ghaL(q5Pf7-i>_{FD!6NI$Ux1({AuvDyomejZ z2&D59QWmKpwfcm>RBIx&NT;+0jX90t7AQO`RSH$kC*8_UDK%72(m7qEl_YKKl-6LU z){t~w7iol~O`TGz_i=HZjrDI4A<8~?GaQLZCk6teJ>HSl3GsfDWhLIPLvpfyyXDI^ zcGGOx0fJ2^eNR$Yzb&!^$&zC7-=uiI7FlNfj!J^U@=E2eZ1H|qB~aUey7Ta`QicNC zWjybs^Y^0Ehlg=^Y7N!3f$CZ-%kh3g@l>O%5HC&K0|zlYJWpN=ojWhVDWIomr)Iz@ z*6${r`AQB*muF1O2u`h0UR_zM?nt4z(u}Q}J^>6Gt$~rQ)ux2E_JkyV}L4 zE|XfCV*_G@MN^2;pB40}>rl|_aZ&kFh^rSMs6*XghZH~Z7W*LC7&;!zCBfw$hyn(~ z2Usaid#8abTi29UL2#H$#ai5z?Tj~cE%PI|vJHzhc}B*;l?|#6c@+kx4nT@v+Tci$ z$BUCo+9A(R2qq#wVv&=c_iS-+O_LcoqyatzI|blFa60RX4U-NunXW&|96VW;_Sqzl2$2{&8LhO*xdM&WVeZ`Ecw?QIK zJ?2AX#v;1+G?@)}kI2(&sJBDt!PBcW7)nK~*W>ARn|Hi1=72k;?gDRzM4gSP*Voxq zp7IoDG478Bu0e7D2Pp*uZ}gN244lQ@Lu-Ke%4dhr8i4O+2GO>3YXJI)HLUx6PV=4W z6EFGp?0oz3Pk*;F>Ur8s?gNlkX5bM9LC~=J59vc;k>1I`*9$^Zz`F}}0{|y3M;zR@ zd~xvBf=`>g4)V&fwQuuIBQGogqb}V$#Aas3}M9|c>i5$UuILq zxT-)Li#k+kGQ+W9cY?GP-n8sM58KqZ>H}V&Iw3ody4Hrvya#Lm-g!PCOr>N7VDGiT zGB3{u#1kyxGVdW9F7uwT$*+19T;)9i;ni{PdRtc%|IMqs;J4Vh4s9WM3&~qZ-a_&g zlDCk&h2$+He`AsSF569Jh93@pBIr%M&$e7*-WD4`d!E*ZpCd1#Pi(mK`9Ons2*pA=KaOEZ^1Y$t8cHWi)Q-zLmzDW7nxfTQ~ziK#N?7^u$kNVPM zg2`Z6Nm(jLw&14)KP~ua!A}c*TJY0?pBDVQvGCL5EI0a>`#7E<|+pSi!s~eq<$vv!l!+Lz`%H;L*{7-6W%Az%&M~rX|;#jAk_qekdQo~>L zaxi-sBVNy|%WwtT{)dNG;R-gs^A+sxY28<_l`(Z~7a#o3c^yA|u>UUyZ~4nj&)vk# zDCZ6}WaM;E%{<8Yton0+{g+6>0Jr}dW=!$%8KW@e%POMy%VuZBx?pTOREThf)b+f7 zGzGhzy95Jv&?=;PQnOh2nrtLf>2?Ka8AlsqWrA$V>8B?%O@K% zD9SmH^fAggslN&JKXYO|81W49-J@J``yuBPkxk#uCGE0nvckijljV+Lxe(QdA<#+r z9+YR19D|^f^1~<}Msf^;PRgSwKSS+fAaqi`809CO=gd%OE}w|O(0OcuM)hDYbW*9+~+Jzz(8S8o%ZkfZW zQ?lP_sBFYk*RLg@e2~X#qU--cJoG^aY(oabF9^jr@tdbUOT>>$Fqaji8A#v9I0zm< z-5r45Q;WWa5(Z=MI)VmlUySvdsjQl)sePtsKW-7QOx;c-k!$U@!^NI*>>!eeHzAQk zr^<*VB5OpW1CTpWeaR$=lrP}|R+X*pAd<-at0(|EsJ=i<5k(9VTOB2m$lD^4n5Vu# zB$1b)j8>-|FZ93?ahK(5xS~VOhfr!F1&bwGEYV_#7E82PqQw#|mT0lW8_NCdE04O{q=}@~GfgZhNy~ZP)n*Z+ z&On?qPkTf>@e9Xx;)w~s2f%H<%6Z~&!goFLL`Z%0ZSzSjQtv>X$U!49k_9S|6pV%D z-60rVqkbxo=g}GM`aF*osS}LRJMA}9Ux{i~s-O0h0;@EXhMBL2ApV;pltK{sWB^K* zX=i~Hg1Ar(5JAK-WRb%T%7CRDJNXuJLwq+gV4d#H4YSW=tk`w;e?PN&(3oGo_kL~5 zu>reoH@P9<^$ssq%DLfNj-L`YOqr@94xB2*$ES)$^@IZv{ADU=N<-oG^} zB+deE$O$jys@hd!RbkH^&a0QC>^ z3}u!3)em9I@FH;%qP5G_#sg+E>`SViJ*Xq;m^tA0>q5N?#Wz4xr6r#n}}!ec8F(1g)PLhxEAp&zp$kTo;89x(z7+L zxU?j7vB=_C7SFPHmc_Fyo@MbYi)UFp>xS~I_Ibjsv~w~?G{me%3tKs}LbMcQYhwcJ zmjJsaa}{D$mBLe;RS}@-Q;cbH(}7+PtU;-3?Oi!l`@O==v|Vxn#Q_{`7k)&Bw$TL3 zfItZl_t63y41aUn2fNCI;Ucjj?9wD=92RSskxu3Im_|RJ_%76Y*sOPs z1PXbi5KUAJlFtO};$l~N5(sWTjg2jcH@e7zlRuf3}sZZ33tH5$VrfmIzO=rfF&eJ0sG&s-Eox{{LyH<()X<`aHUHbPB?r z5ACpFAUJBKnBflFyPM(qIuHt_nc>dcugeSvds1}5!mgB&cc{qh5Lw|)+Phid%E`3z zvT546h7~R?JJt0tw@Ho^D;(K=Mmcbw!gMR#L`RR_ny{zix8t0~)k%)gm|K8Md@M5B z(Z46(&C*aBjJ}@h_=)`*ra2t>Bm-r_LiJXG6+UY}hwhq=|9EjLn&j}^bk`i!orHe; z$Kd*Ti^k~xbz$qOU#+NF5WD3!2ThY4LHAUX+%|hRliUt_Hmt) z0tcGp+8t<;+wb^DYIBO*A96a{gxex}_mUxwzCl)Pu*8MBF3`Y2NO7vWUw2EKH@UCp z@TIlY%SXftw7y26Ae@37K3j6L&?%A{K(9!D+qRQU(B{5`=$H(mW3WRDM9!I=Duiu+ zfQ(JVE&>~CTR-<{veAv_c5HBnY%^v)#tn7NI$EaNB31i|jZHFDoS?FH9U1CO5o`t1 zX6*g}u`#nZ4(v_MS~Ap`T1P|>4PD!Vp^jS&dp6Vs0%>bSmZ8pKV-_2;*qFt}EH-Ab zF^i4eP&U>wHQ(F{hP&)R;9Q$A8=+91&jdNJ4@}#(ksA`*z;HcC;LsM^vYz;usRtIk zw%C1-CpLiLdObQu2FgNd{)$~0+5V|nWWzIo7h%4AkB|*-GDmE03HjM&U5p!nP^dVa z4+RC|jW4u(W7}R|Ve5*6Dc)c`VbIpxH_o?SeRTl3MG|&wi|lXbT#Um;+#RNE+nY}a zZG#SfZa4CF`o69=umeM?G2$1(-_@I2(VG&s=ZlVUCp|kY;d@($WS>Vv>eYi`dswh&8J|f26u|{As}+SZm)0`pfwTSIgy+F zmsBFx>enV@Et@lRLhaE>8{@6}cTGKC+BDIzpn&r@0{tCc6V5BhF)s0MMug_xgLAL& z(dLuT_c5VufDV(8<47~<=T@y z5FoV7UMnK3IArAwsj|#bReEEjqEWAihV`Wu0kQ~?MSv^0GVYmeMqggH9>&5VvhtU2ph|} z5I6&PJEh=hZ3{TYX&EV^3mWcrC_-xKepfZv#_*E%pLRC?tapdNkH(IVghT%iHnXgO diff --git a/gix/tests/fixtures/make_rev_spec_parse_repos.sh b/gix/tests/fixtures/make_rev_spec_parse_repos.sh index 236304092fd..887f0f1d7ab 100755 --- a/gix/tests/fixtures/make_rev_spec_parse_repos.sh +++ b/gix/tests/fixtures/make_rev_spec_parse_repos.sh @@ -53,7 +53,7 @@ git init --bare blob.corrupt echo bnkxmdwz | git hash-object -w --stdin oid=$(echo bmwsjxzi | git hash-object -w --stdin) oidf=objects/$(oid_to_path "$oid") - chmod 644 -- "$oidf" + chmod -- 644 "$oidf" echo broken >"$oidf" baseline "cafea" From d03971b27f5b4fffc009329edb05f8ac0baac1d8 Mon Sep 17 00:00:00 2001 From: Eliah Kagan Date: Mon, 4 Nov 2024 16:55:37 -0500 Subject: [PATCH 18/18] Enable gix-dir walk symlink tests even on Windows As detailed in d715e4a, most tests involving symlinks have been expected to work even on Windows since #1444, but some tests remain to be updated to be run on Windows or to include all symlink-related asertions on Windows. This includes 4 tests in `gix-dir/tests/walk/mod.rs`, which were ignored on Windows even though they are able to pass. This commit enables them on Windows. It also updates the associated fixture scripts to no longer say that symlink test can't run on Windows. But no changes to the fixture scripts are required for the tests to pass. (While doing so, I've made a small change, adding quoting to a here document delimiter to make clear that no expansions are intended to occur in the here document text. But this change is purely for clarity; nothing was broken in connection with that heredoc.) --- gix-dir/tests/fixtures/many-symlinks.sh | 7 +++---- gix-dir/tests/fixtures/many.sh | 2 +- gix-dir/tests/walk/mod.rs | 4 ---- 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/gix-dir/tests/fixtures/many-symlinks.sh b/gix-dir/tests/fixtures/many-symlinks.sh index fdebe1021a7..8d3d60e4865 100755 --- a/gix-dir/tests/fixtures/many-symlinks.sh +++ b/gix-dir/tests/fixtures/many-symlinks.sh @@ -1,8 +1,7 @@ #!/usr/bin/env bash set -eu -o pipefail -# Note that symlink creation fails on Windows for some reason, -# so these tests shouldn't be run there. +# These fixtures use symlinks. See `many.sh` for some that don't. git init breakout-symlink (cd breakout-symlink @@ -20,7 +19,7 @@ git init immediate-breakout-symlink git init excluded-symlinks-to-dir (cd excluded-symlinks-to-dir - cat <.gitignore + cat <<'EOF' >.gitignore src1 src2/ file1 @@ -42,4 +41,4 @@ EOF ln -s src/file file2 ) -ln -s excluded-symlinks-to-dir worktree-root-is-symlink \ No newline at end of file +ln -s excluded-symlinks-to-dir worktree-root-is-symlink diff --git a/gix-dir/tests/fixtures/many.sh b/gix-dir/tests/fixtures/many.sh index 54ec1cf8dac..268932ff3cc 100755 --- a/gix-dir/tests/fixtures/many.sh +++ b/gix-dir/tests/fixtures/many.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -eu -o pipefail -# Nothing here may use symlinks so these fixtures can be used on windows as well. +# These fixtures don't use symlinks. See `many-symlinks.sh` for some that do. git init with-nested-dot-git (cd with-nested-dot-git diff --git a/gix-dir/tests/walk/mod.rs b/gix-dir/tests/walk/mod.rs index 057271e0968..e4d08f7b0cf 100644 --- a/gix-dir/tests/walk/mod.rs +++ b/gix-dir/tests/walk/mod.rs @@ -19,7 +19,6 @@ use gix_dir::walk::ForDeletionMode; use gix_ignore::Kind::*; #[test] -#[cfg_attr(windows, ignore = "symlinks the way they are organized don't yet work on windows")] fn symlink_to_dir_can_be_excluded() -> crate::Result { let root = fixture_in("many-symlinks", "excluded-symlinks-to-dir"); let ((out, _root), entries) = collect(&root, None, |keep, ctx| { @@ -94,7 +93,6 @@ fn symlink_to_dir_can_be_excluded() -> crate::Result { } #[test] -#[cfg_attr(windows, ignore = "symlinks the way they are organized don't yet work on windows")] fn root_may_not_lead_through_symlinks() -> crate::Result { for (name, intermediate, expected) in [ ("immediate-breakout-symlink", "", 0), @@ -121,7 +119,6 @@ fn root_may_not_lead_through_symlinks() -> crate::Result { } #[test] -#[cfg_attr(windows, ignore = "symlinks the way they are organized don't yet work on windows")] fn root_may_be_a_symlink_if_it_is_the_worktree() -> crate::Result { let root = fixture_in("many-symlinks", "worktree-root-is-symlink"); let ((_out, _root), entries) = collect(&root, None, |keep, ctx| { @@ -2702,7 +2699,6 @@ fn decomposed_unicode_in_directory_is_returned_precomposed() -> crate::Result { } #[test] -#[cfg_attr(windows, ignore = "symlinks the way they are organized don't yet work on windows")] fn worktree_root_can_be_symlink() -> crate::Result { let root = fixture_in("many-symlinks", "symlink-to-breakout-symlink"); let troot = root.join("file");