]> Kevux Git Server - rit/commitdiff
t98xx: fix Perforce tests with p4d r23 and newer
authorPatrick Steinhardt <ps@pks.im>
Wed, 31 Jul 2024 10:37:40 +0000 (12:37 +0200)
committerJunio C Hamano <gitster@pobox.com>
Wed, 31 Jul 2024 17:05:18 +0000 (10:05 -0700)
Some of the tests in t98xx modify the Perforce depot in ways that the
tool wouldn't normally allow. This is done to test behaviour of git-p4
in certain edge cases that we have observed in the wild, but which
should in theory not be possible.

Naturally, modifying the depot on disk directly is quite intimate with
the tool and thus prone to breakage when Perforce updates the way that
data is stored. And indeed, those tests are broken nowadays with r23 of
Perforce. While a file revision was previously stored as a plain file
"depot/file,v", it is now stored in a directory "depot/file,d" with
compression.

Adapt those tests to handle both old- and new-style depot layouts.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
t/t9800-git-p4-basic.sh
t/t9802-git-p4-filetype.sh
t/t9825-git-p4-handle-utf16-without-bom.sh

index 53af8e3..0816763 100755 (executable)
@@ -297,8 +297,20 @@ test_expect_success 'exit when p4 fails to produce marshaled output' '
 # p4 changes, files, or describe; just in p4 print.  If P4CLIENT is unset, the
 # message will include "Librarian checkout".
 test_expect_success 'exit gracefully for p4 server errors' '
-       test_when_finished "mv \"$db\"/depot/file1,v,hidden \"$db\"/depot/file1,v" &&
-       mv "$db"/depot/file1,v "$db"/depot/file1,v,hidden &&
+       # Note that newer Perforce versions started to store files
+       # compressed in directories. The case statement handles both
+       # old and new layout.
+       case "$(echo "$db"/depot/file1*)" in
+       *,v)
+               test_when_finished "mv \"$db\"/depot/file1,v,hidden \"$db\"/depot/file1,v" &&
+               mv "$db"/depot/file1,v "$db"/depot/file1,v,hidden;;
+       *,d)
+               path="$(echo "$db"/depot/file1,d/*.gz)" &&
+               test_when_finished "mv \"$path\",hidden \"$path\"" &&
+               mv "$path" "$path",hidden;;
+       *)
+               BUG "unhandled p4d layout";;
+       esac &&
        test_when_finished cleanup_git &&
        test_expect_code 1 git p4 clone --dest="$git" //depot@1 >out 2>err &&
        test_grep "Error from p4 print" err
index bb236cd..df01a5d 100755 (executable)
@@ -300,10 +300,22 @@ test_expect_success SYMLINKS 'empty symlink target' '
                #     text
                #     @@
                #
+               # Note that newer Perforce versions started to store files
+               # compressed in directories. The case statement handles both
+               # old and new layout.
                cd "$db/depot" &&
-               sed "/@target1/{; s/target1/@/; n; d; }" \
-                   empty-symlink,v >empty-symlink,v.tmp &&
-               mv empty-symlink,v.tmp empty-symlink,v
+               case "$(echo empty-symlink*)" in
+               empty-symlink,v)
+                       sed "/@target1/{; s/target1/@/; n; d; }" \
+                           empty-symlink,v >empty-symlink,v.tmp &&
+                       mv empty-symlink,v.tmp empty-symlink,v;;
+               empty-symlink,d)
+                       path="empty-symlink,d/$(ls empty-symlink,d/ | tail -n1)" &&
+                       rm "$path" &&
+                       gzip </dev/null >"$path";;
+               *)
+                       BUG "unhandled p4d layout";;
+               esac
        ) &&
        (
                # Make sure symlink really is empty.  Asking
index f049ff8..6a60b32 100755 (executable)
@@ -22,9 +22,25 @@ test_expect_success 'init depot with UTF-16 encoded file and artificially remove
                cd db &&
                p4d -jc &&
                # P4D automatically adds a BOM. Remove it here to make the file invalid.
-               sed -e "\$d" depot/file1,v >depot/file1,v.new &&
-               mv depot/file1,v.new depot/file1,v &&
-               printf "@$UTF16@" >>depot/file1,v &&
+               #
+               # Note that newer Perforce versions started to store files
+               # compressed in directories. The case statement handles both
+               # old and new layout.
+               case "$(echo depot/file1*)" in
+               depot/file1,v)
+                       sed -e "\$d" depot/file1,v >depot/file1,v.new &&
+                       mv depot/file1,v.new depot/file1,v &&
+                       printf "@$UTF16@" >>depot/file1,v;;
+               depot/file1,d)
+                       path="$(echo depot/file1,d/*.gz)" &&
+                       gunzip -c "$path" >"$path.unzipped" &&
+                       sed -e "\$d" "$path.unzipped" >"$path.new" &&
+                       printf "$UTF16" >>"$path.new" &&
+                       gzip -c "$path.new" >"$path" &&
+                       rm "$path.unzipped" "$path.new";;
+               *)
+                       BUG "unhandled p4d layout";;
+               esac &&
                p4d -jrF checkpoint.1
        )
 '