https://bz.mercurial-scm.org/show_bug.cgi?id=6504

            Bug ID: 6504
           Summary: regression in url parsing on python 3.9
           Product: Mercurial
           Version: stable branch
          Hardware: PC
                OS: Linux
            Status: UNCONFIRMED
          Severity: bug
          Priority: wish
         Component: hgweb
          Assignee: bugzi...@mercurial-scm.org
          Reporter: pierre-yves.da...@ens-lyon.org
                CC: mercurial-devel@mercurial-scm.org
    Python Version: ---

Starting with Python 3.9, mercurial is no longer able to parse hgweb call using
';' as parameter separator.

This is the fault of a behavior change of the `urllib.parse.parse_qsl`
function:

Changed in version 3.9.2: Added separator parameter with the default value of
&. Python versions earlier than Python 3.9.2 allowed using both ; and & as
query parameter separator. This has been changed to allow only a single
separator key, with & as the default separator.

They are no obvious way to restore the previous behavior…

This result in the following test failure.

--- /home/marmoute/src/mercurial-dev/tests/test-archive.t
+++ /home/marmoute/src/mercurial-dev/tests/test-archive.t.err
@@ -350,49 +350,59 @@
   >     sys.stderr.write(str(e) + '\n')
   > EOF
   $ "$PYTHON" getarchive.py "$TIP" gz | gunzip | tar tf - 2>/dev/null
-  test-archive-1701ef1f1510/.hg_archival.txt
-  test-archive-1701ef1f1510/.hgsub
-  test-archive-1701ef1f1510/.hgsubstate
-  test-archive-1701ef1f1510/bar
-  test-archive-1701ef1f1510/baz/bletch
-  test-archive-1701ef1f1510/foo
-  test-archive-1701ef1f1510/subrepo/sub
+  HTTP Error 400: no such method: archive;node=1701ef1f1510;type=gz
+  
+  gzip: stdin: unexpected end of file
+  [2]
   $ "$PYTHON" getarchive.py "$TIP" bz2 | bunzip2 | tar tf - 2>/dev/null
-  test-archive-1701ef1f1510/.hg_archival.txt
-  test-archive-1701ef1f1510/.hgsub
-  test-archive-1701ef1f1510/.hgsubstate
-  test-archive-1701ef1f1510/bar
-  test-archive-1701ef1f1510/baz/bletch
-  test-archive-1701ef1f1510/foo
-  test-archive-1701ef1f1510/subrepo/sub
+  HTTP Error 400: no such method: archive;node=1701ef1f1510;type=bz2
+  
+  bunzip2: Compressed file ends unexpectedly;
+       perhaps it is corrupted?  *Possible* reason follows.
+  bunzip2: Inappropriate ioctl for device
+       Input file = (stdin), output file = (stdout)
+  
+  It is possible that the compressed file(s) have become corrupted.
+  You can use the -tvv option to test integrity of such files.
+  
+  You can use the `bzip2recover' program to attempt to recover
+  data from undamaged sections of corrupted files.
+  
+  [2]
   $ "$PYTHON" getarchive.py "$TIP" zip > archive.zip
+  HTTP Error 400: no such method: archive;node=1701ef1f1510;type=zip
   $ unzip -t archive.zip
   Archive:  archive.zip
-      testing: test-archive-1701ef1f1510/.hg_archival.txt*OK (glob)
-      testing: test-archive-1701ef1f1510/.hgsub*OK (glob)
-      testing: test-archive-1701ef1f1510/.hgsubstate*OK (glob)
-      testing: test-archive-1701ef1f1510/bar*OK (glob)
-      testing: test-archive-1701ef1f1510/baz/bletch*OK (glob)
-      testing: test-archive-1701ef1f1510/foo*OK (glob)
-      testing: test-archive-1701ef1f1510/subrepo/sub*OK (glob)
-  No errors detected in compressed data of archive.zip.
+    End-of-central-directory signature not found.  Either this file is not
+    a zipfile, or it constitutes one disk of a multi-part archive.  In the
+    latter case the central directory and zipfile comment will be found on
+    the last disk(s) of this archive.
+  unzip:  cannot find zipfile directory in one of archive.zip or
+          archive.zip.zip, and cannot find archive.zip.ZIP, period.
+  [9]

 test that we can download single directories and files

   $ "$PYTHON" getarchive.py "$TIP" gz baz | gunzip | tar tf - 2>/dev/null
-  test-archive-1701ef1f1510/baz/bletch
+  HTTP Error 400: no such method: archive;node=1701ef1f1510;type=gz;file=baz
+  
+  gzip: stdin: unexpected end of file
+  [2]
   $ "$PYTHON" getarchive.py "$TIP" gz foo | gunzip | tar tf - 2>/dev/null
-  test-archive-1701ef1f1510/foo
+  HTTP Error 400: no such method: archive;node=1701ef1f1510;type=gz;file=foo
+  
+  gzip: stdin: unexpected end of file
+  [2]

 test that we detect file patterns that match no files

   $ "$PYTHON" getarchive.py "$TIP" gz foobar
-  HTTP Error 404: file(s) not found: foobar
+  HTTP Error 400: no such method:
archive;node=1701ef1f1510;type=gz;file=foobar

 test that we reject unsafe patterns

   $ "$PYTHON" getarchive.py "$TIP" gz relre:baz
-  HTTP Error 404: file(s) not found: relre:baz
+  HTTP Error 400: no such method:
archive;node=1701ef1f1510;type=gz;file=relre:baz

   $ killdaemons.py


ERROR: test-archive.t output changed
!
Failed test-archive.t: output changed

-- 
You are receiving this mail because:
You are on the CC list for the bug.
_______________________________________________
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel

Reply via email to