Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package gap-utils for openSUSE:Factory checked in at 2026-07-31 15:31:08 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/gap-utils (Old) and /work/SRC/openSUSE:Factory/.gap-utils.new.2004 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "gap-utils" Fri Jul 31 15:31:08 2026 rev:12 rq:1368516 version:0.97 Changes: -------- --- /work/SRC/openSUSE:Factory/gap-utils/gap-utils.changes 2026-06-08 14:25:22.777205282 +0200 +++ /work/SRC/openSUSE:Factory/.gap-utils.new.2004/gap-utils.changes 2026-07-31 16:07:17.572398574 +0200 @@ -1,0 +2,6 @@ +Thu Jul 30 07:04:42 UTC 2026 - Jan Engelhardt <[email protected]> + +- Update to release 0.97 + * Updates to the CI/CD and test scripts only + +------------------------------------------------------------------- Old: ---- utils-0.96.tar.gz New: ---- utils-0.97.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ gap-utils.spec ++++++ --- /var/tmp/diff_new_pack.SqQSoD/_old 2026-07-31 16:07:18.016414024 +0200 +++ /var/tmp/diff_new_pack.SqQSoD/_new 2026-07-31 16:07:18.020414163 +0200 @@ -17,7 +17,7 @@ Name: gap-utils -Version: 0.96 +Version: 0.97 Release: 0 Summary: GAP: Utility functions in GAP License: GPL-2.0-or-later @@ -27,8 +27,8 @@ Source: https://github.com/gap-packages/utils/releases/download/v%version/utils-%version.tar.gz BuildRequires: gap-rpm-devel BuildRequires: xz -Requires: gap-core >= 4.10.1 -Suggests: gap-curlinterface >= 2.3.0 +Requires: gap-core >= 4.12 +Suggests: gap-curlinterface >= 2.4.0 BuildArch: noarch %description ++++++ _scmsync.obsinfo ++++++ --- /var/tmp/diff_new_pack.SqQSoD/_old 2026-07-31 16:07:18.056415415 +0200 +++ /var/tmp/diff_new_pack.SqQSoD/_new 2026-07-31 16:07:18.064415694 +0200 @@ -1,5 +1,5 @@ -mtime: 1780822014 -commit: 3c5ca86eddcc9d019f22947ce56d2afb1dfe31946f9d1c90a10b2ab146c29ebd +mtime: 1785395100 +commit: 4be5da2d92b7572c4edb414067a019da76c55162b2ec36cf7b3f6b9a72c9cf21 url: https://src.opensuse.org/jengelh/gap-utils revision: master ++++++ build.specials.obscpio ++++++ ++++++ build.specials.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/.gitignore new/.gitignore --- old/.gitignore 1970-01-01 01:00:00.000000000 +0100 +++ new/.gitignore 2026-07-30 09:05:00.000000000 +0200 @@ -0,0 +1 @@ +.osc ++++++ utils-0.96.tar.gz -> utils-0.97.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/utils-0.96/CHANGES.md new/utils-0.97/CHANGES.md --- old/utils-0.96/CHANGES.md 2026-06-06 02:00:00.000000000 +0200 +++ new/utils-0.97/CHANGES.md 2026-07-29 02:00:00.000000000 +0200 @@ -1,5 +1,8 @@ # CHANGES log for the 'Utils' package +## Version 0.97 for GAP 4.16.0 (29/07/26) + * (29/07/26) various CI updates, etc. + ## Version 0.96 for GAP 4.16.0 (06/06/26) * (06/06/26) testall.g adjusted to fix issue in oscar-system/GAP.jl/pull/1379. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/utils-0.96/PackageInfo.g new/utils-0.97/PackageInfo.g --- old/utils-0.96/PackageInfo.g 2026-06-06 02:00:00.000000000 +0200 +++ new/utils-0.97/PackageInfo.g 2026-07-29 02:00:00.000000000 +0200 @@ -7,8 +7,8 @@ PackageName := "utils", Subtitle := "Utility functions in GAP", -Version := "0.96", -Date := "06/06/2026", # dd/mm/yyyy format +Version := "0.97", +Date := "29/07/2026", # dd/mm/yyyy format License := "GPL-2.0-or-later", Persons := [ @@ -123,9 +123,10 @@ ), Dependencies := rec( - GAP := ">=4.10.1", + GAP := ">=4.12", NeededOtherPackages := [ ], - SuggestedOtherPackages := [ [ "curlInterface", ">= 2.3.0" ] ], + SuggestedOtherPackages := [ [ "curlInterface", ">= 2.4.0" ] ], + TestPackages := [ [ "io", ">= 4.7.0" ] ], ExternalConditions := [ ] ), diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/utils-0.96/doc/_entities.xml new/utils-0.97/doc/_entities.xml --- old/utils-0.96/doc/_entities.xml 2026-06-06 02:00:00.000000000 +0200 +++ new/utils-0.97/doc/_entities.xml 2026-07-29 02:00:00.000000000 +0200 @@ -3,9 +3,9 @@ <!ENTITY Magma '<M>{\sf Magma}</M>'> <!ENTITY MathJax '<M>{\sf MathJax}</M>'> <!ENTITY RCWA '<Package>RCWA</Package>'> -<!ENTITY RELEASEDATE '6 June 2026'> +<!ENTITY RELEASEDATE '29 July 2026'> <!ENTITY RELEASEYEAR '2026'> <!ENTITY ResClasses '<Package>ResClasses</Package>'> <!ENTITY Utils '<Package>Utils</Package>'> -<!ENTITY VERSION '0.96'> +<!ENTITY VERSION '0.97'> <!ENTITY XMod '<Package>XMod</Package>'> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/utils-0.96/doc/_main.tex new/utils-0.97/doc/_main.tex --- old/utils-0.96/doc/_main.tex 2026-06-06 02:00:00.000000000 +0200 +++ new/utils-0.97/doc/_main.tex 2026-07-29 02:00:00.000000000 +0200 @@ -100,8 +100,8 @@ \mbox{}}}\\ \vfill -{\Huge 0.96 \mbox{}}\\[1cm] -{ 6 June 2026 \mbox{}}\\[1cm] +{\Huge 0.97 \mbox{}}\\[1cm] +{ 29 July 2026 \mbox{}}\\[1cm] \mbox{}\\[2cm] {\Large \textbf{\strut Thomas Breuer \strut\mbox{}}}\\ {\Large \textbf{\strut Sebastian Gutsche \strut\mbox{}}}\\ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/utils-0.96/doc/chap0.html new/utils-0.97/doc/chap0.html --- old/utils-0.96/doc/chap0.html 2026-06-06 02:00:00.000000000 +0200 +++ new/utils-0.97/doc/chap0.html 2026-07-29 02:00:00.000000000 +0200 @@ -29,10 +29,10 @@ <h2>Utility functions in <strong class="pkg">GAP</strong></h2> <p> - 0.96</p> + 0.97</p> <p> - 6 June 2026 + 29 July 2026 </p> </div> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/utils-0.96/doc/chap0.txt new/utils-0.97/doc/chap0.txt --- old/utils-0.96/doc/chap0.txt 2026-06-06 02:00:00.000000000 +0200 +++ new/utils-0.97/doc/chap0.txt 2026-07-29 02:00:00.000000000 +0200 @@ -6,10 +6,10 @@ [1X Utility functions in [5XGAP[105X [101X - 0.96 + 0.97 - 6 June 2026 + 29 July 2026 Thomas Breuer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/utils-0.96/doc/chap0_mj.html new/utils-0.97/doc/chap0_mj.html --- old/utils-0.96/doc/chap0_mj.html 2026-06-06 02:00:00.000000000 +0200 +++ new/utils-0.97/doc/chap0_mj.html 2026-07-29 02:00:00.000000000 +0200 @@ -32,10 +32,10 @@ <h2>Utility functions in <strong class="pkg">GAP</strong></h2> <p> - 0.96</p> + 0.97</p> <p> - 6 June 2026 + 29 July 2026 </p> </div> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/utils-0.96/doc/download.xml new/utils-0.97/doc/download.xml --- old/utils-0.96/doc/download.xml 2026-06-06 02:00:00.000000000 +0200 +++ new/utils-0.97/doc/download.xml 2026-07-29 02:00:00.000000000 +0200 @@ -82,7 +82,7 @@ </Item> </List> <P/> -<Example><![CDATA[ +<Log><![CDATA[ gap> url:= "https://www.gap-system.org/index.html";; gap> res1:= Download( url );; gap> res1.success; @@ -94,7 +94,7 @@ false gap> IsBound( res2.error ) and IsString( res2.error ); true -]]></Example> +]]></Log> </Description> </ManSection> Binary files old/utils-0.96/doc/manual.pdf and new/utils-0.97/doc/manual.pdf differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/utils-0.96/doc/title.xml new/utils-0.97/doc/title.xml --- old/utils-0.96/doc/title.xml 2026-06-06 02:00:00.000000000 +0200 +++ new/utils-0.97/doc/title.xml 2026-07-29 02:00:00.000000000 +0200 @@ -9,7 +9,7 @@ Utility functions in &GAP; </Subtitle> <Version> - 0.96 + 0.97 </Version> <Author> Thomas Breuer @@ -57,7 +57,7 @@ <Homepage>https://github.com/cdwensley</Homepage> </Author> <Date> - 6 June 2026 + 29 July 2026 </Date> <Abstract> The &Utils; package provides a space for utility functions in a variety of &GAP; packages to be collected together into a single package. In this way it is hoped that they will become more visible to package authors. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/utils-0.96/lib/download.gi new/utils-0.97/lib/download.gi --- old/utils-0.96/lib/download.gi 2026-06-06 02:00:00.000000000 +0200 +++ new/utils-0.97/lib/download.gi 2026-07-29 02:00:00.000000000 +0200 @@ -55,7 +55,7 @@ name:= "via SingleHTTPRequest (from the IO package)", isAvailable:= {} -> IsBoundGlobal( "SingleHTTPRequest" ), download:= function( url, opt ) - local rurl, pos, domain, uri, res; + local rurl, pos, authority, domain, port, portstr, uri, fragment, res; if not StartsWith( url, "http://" ) then return rec( success:= false, error:= "protocol is not http" ); @@ -63,16 +63,67 @@ return rec( success:= false, error:= "no support for given timeout" ); fi; - rurl:= ReplacedString( url, "http://", "" ); - pos:= Position( rurl, '/' ); - domain:= rurl{ [ 1 .. pos-1 ] }; - uri:= rurl{ [ pos .. Length( rurl ) ] }; + # Split the URL after 'http://' into the authority and HTTP request target. + # A query without an explicit path gets the default path '/'. + rurl:= url{ [ 8 .. Length( url ) ] }; + pos:= PositionProperty( rurl, c -> c in "/?#" ); + if pos = fail then + authority:= rurl; + uri:= "/"; + else + authority:= rurl{ [ 1 .. pos-1 ] }; + uri:= rurl{ [ pos .. Length( rurl ) ] }; + if StartsWith( uri, "?" ) then + uri:= Concatenation( "/", uri ); + elif StartsWith( uri, "#" ) then + uri:= "/"; + fi; + fi; + + # A fragment is interpreted by the client and must not be sent to the + # server as part of the request target. + fragment:= Position( uri, '#' ); + if fragment <> fail then + uri:= uri{ [ 1 .. fragment-1 ] }; + fi; + + # Separate the optional port from the host. IO's HTTP client uses IPv4 + # sockets, thus bracketed IPv6 addresses are not supported here. + domain:= authority; + port:= 80; + portstr:= fail; + if Length( authority ) = 0 or Position( authority, '@' ) <> fail then + return rec( success:= false, error:= "invalid URL authority" ); + elif authority[1] = '[' then + return rec( success:= false, + error:= "IPv6 addresses are not supported" ); + else + pos:= Position( authority, ':' ); + if pos <> fail then + if Position( authority, ':', pos ) <> fail then + return rec( success:= false, error:= "invalid URL authority" ); + fi; + domain:= authority{ [ 1 .. pos-1 ] }; + portstr:= authority{ [ pos+1 .. Length( authority ) ] }; + fi; + fi; + if Length( domain ) = 0 then + return rec( success:= false, error:= "invalid URL authority" ); + elif portstr <> fail then + port:= Int( portstr ); + if not IsPosInt( port ) or port > 65535 then + return rec( success:= false, error:= "invalid URL port" ); + fi; + fi; + + # Preserve the complete authority, including brackets and a non-default + # port, in the HTTP Host header. if IsBound( opt.target ) and IsString( opt.target ) then - res:= ValueGlobal( "SingleHTTPRequest" )( domain, 80, "GET", uri, - rec(), false, opt.target ); + res:= ValueGlobal( "SingleHTTPRequest" )( domain, port, "GET", uri, + rec( Host:= authority ), false, opt.target ); else - res:= ValueGlobal( "SingleHTTPRequest" )( domain, 80, "GET", uri, - rec(), false, false ); + res:= ValueGlobal( "SingleHTTPRequest" )( domain, port, "GET", uri, + rec( Host:= authority ), false, false ); fi; if res.statuscode = 0 then return rec( success:= false, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/utils-0.96/tst/download.tst new/utils-0.97/tst/download.tst --- old/utils-0.96/tst/download.tst 2026-06-06 02:00:00.000000000 +0200 +++ new/utils-0.97/tst/download.tst 2026-07-29 02:00:00.000000000 +0200 @@ -1,4 +1,4 @@ -#@local meths, i, urls, pair, url, expected, res1, good1, n, file, res2, good2, contents, r, res3, good3, bad +#@local meths, i, urls, pair, url, expected, res1, good1, n, file, res2, good2, contents, r, res3, good3, bad, server, baseurl, iometh ############################################################################ ## #W download.tst Utils Package Thomas Breuer @@ -11,21 +11,58 @@ gap> ReadPackage( "utils", "tst/loadall.g" );; gap> UtilsLoadingComplete; true +gap> LoadPackage( "io", false ); +true +gap> ReadPackage( "utils", "tst/http-server.g" );; +gap> server:= UTILS_StartHTTPTestServer();; +gap> baseurl:= Concatenation( "http://127.0.0.1:", +> String( server.port ) );; ## Test the available Download methods gap> meths:= List( Filtered( Download_Methods, r -> r.isAvailable() ), > ShallowCopy );; +gap> iometh:= First( meths, +> r -> StartsWith( r.name, "via SingleHTTPRequest" ) );; gap> for i in [ 1 .. Length( meths ) ] do > meths[i].position:= String( i ); > od; -gap> urls:= [ # a http url that gets redirected to https -> [ "http://www.gap-system.org/index.html", true ], -> # a http url that works as such -> [ "http://www.math.rwth-aachen.de/index.html", true ], -> # a https url that exists -> [ "https://www.gap-system.org/index.html", true ], -> # a https url that does not exist -> [ "https://www.gap-system.org/indexxxxx.html", false ], + +## Test URL parsing in the SingleHTTPRequest based method. +gap> res1:= iometh.download( Concatenation( baseurl, "?a=b#fragment" ), +> rec() );; +gap> res1.success; +true +gap> res1:= iometh.download( baseurl, rec() );; +gap> res1.success; +true +gap> res1:= iometh.download( Concatenation( baseurl, "#fragment" ), +> rec() );; +gap> res1.success; +true +gap> res1:= iometh.download( "http:///missing-authority", rec() );; +gap> res1.error; +"invalid URL authority" +gap> res1:= iometh.download( "http://127.0.0.1:80:90/", rec() );; +gap> res1.error; +"invalid URL authority" +gap> res1:= iometh.download( "http://:80/", rec() );; +gap> res1.error; +"invalid URL authority" +gap> res1:= iometh.download( "http://127.0.0.1:not-a-port/", rec() );; +gap> res1.success = false; +true +gap> res1:= iometh.download( "http://127.0.0.1:65536/", rec() );; +gap> res1.success = false; +true +gap> res1:= iometh.download( +> Concatenation( "http://[::1]:", String( server.port ), "/" ), +> rec() );; +gap> res1.success = false; +true +gap> res1.error; +"IPv6 addresses are not supported" +gap> urls:= [ # an http url that works as such +> [ Concatenation( baseurl, "/success" ), true ], > ];; ## The problem is that the methods do not behave consistently @@ -33,13 +70,15 @@ ## (Well, they even do not agree what failure means.) ## The test results depend on which methods are available at runtime, ## which makes them useless as automatic tests. -## Thus we test only working http and https urls. -gap> urls:= urls{ [ 2, 3 ] };; +## Thus we test only a working http url. gap> for pair in urls do > url:= pair[1]; > expected:= pair[2]; > res1:= List( meths, r -> [ r.download( url, rec() ), r.position ] );; > good1:= Filtered( res1, r -> r[1].success = true );; +> if expected = true and Length( good1 ) <> Length( meths ) then +> Print( "failure for url ", url, "\n" ); +> fi; > if expected = false and Length( good1 ) > 0 then > Print( "success for url ", url, "?\n" ); > fi; @@ -92,12 +131,23 @@ > od; ## test timeout -gap> res1:= Download( "https://httpbun.com/delay/3", rec( maxTime:= 1 ) );; +gap> url:= Concatenation( baseurl, "/delay/3" );; +gap> res1:= Download( url, rec( maxTime:= 1 ) );; gap> res1.success = false; true -gap> res1:= Download( "https://httpbun.com/delay/3", rec( maxTime:= 5 ) );; +gap> res1:= Download( url, rec( maxTime:= 5 ) );; gap> res1.success = true; true +## test errors and redirects +gap> res1:= Download( Concatenation( baseurl, "/missing" ) );; +gap> res1.success = false; +true +gap> res1:= Download( Concatenation( baseurl, "/redirect" ) );; +gap> res1.success = true; +true + +gap> UTILS_StopHTTPTestServer( server );; + ## gap> STOP_TEST( "download.tst" ); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/utils-0.96/tst/http-server.g new/utils-0.97/tst/http-server.g --- old/utils-0.96/tst/http-server.g 1970-01-01 01:00:00.000000000 +0100 +++ new/utils-0.97/tst/http-server.g 2026-07-29 02:00:00.000000000 +0200 @@ -0,0 +1,92 @@ +############################################################################# +## +## A small HTTP server for the download tests. +## + +BindGlobal( "UTILS_HandleHTTPTestRequest", function( listener, socket ) + local connection, line, parts, uri, body, status, location; + + IO_close( listener ); + connection:= IO_WrapFD( socket, IO.DefaultBufSize, IO.DefaultBufSize ); + line:= IO_ReadLine( connection ); + parts:= SplitString( line, " \r\n" ); + if Length( parts ) < 2 then + IO_Close( connection ); + IO_exit( 1 ); + fi; + uri:= parts[2]; + + repeat + line:= IO_ReadLine( connection ); + until line = fail or line = "" or line = "\n" or line = "\r\n"; + + body:= "download test response\n"; + status:= "200 OK"; + location:= ""; + if StartsWith( uri, "/delay/3" ) then + Sleep( 3 ); + elif StartsWith( uri, "/missing" ) then + body:= "not found\n"; + status:= "404 Not Found"; + elif StartsWith( uri, "/redirect" ) then + body:= ""; + status:= "302 Found"; + location:= "Location: /success\r\n"; + fi; + + IO_Write( connection, + "HTTP/1.1 ", status, "\r\n", + location, + "Content-Type: text/plain\r\n", + "Content-Length: ", String( Length( body ) ), "\r\n", + "Connection: close\r\n\r\n", + body ); + IO_Flush( connection ); + IO_Close( connection ); + IO_exit( 0 ); +end ); + +BindGlobal( "UTILS_StartHTTPTestServer", function() + local listener, address, port, pid, socket, handler; + + listener:= IO_socket( IO.PF_INET, IO.SOCK_STREAM, "tcp" ); + if listener = fail or + IO_bind( listener, IO_MakeIPAddressPort( "127.0.0.1", 0 ) ) = fail or + IO_listen( listener, 8 ) <> true then + Error( "cannot start the HTTP test server" ); + fi; + address:= IO_getsockname( listener ); + port:= 256 * INT_CHAR( address[3] ) + INT_CHAR( address[4] ); + + pid:= IO_fork(); + if pid = 0 then + while true do + socket:= IO_accept( listener, + IO_MakeIPAddressPort( "0.0.0.0", 0 ) ); + if socket = fail then + IO_exit( 0 ); + fi; + handler:= IO_fork(); + if handler = 0 then + UTILS_HandleHTTPTestRequest( listener, socket ); + elif handler < 0 then + IO_close( socket ); + IO_exit( 1 ); + else + IO_close( socket ); + IO_IgnorePid( handler ); + fi; + od; + elif pid < 0 then + IO_close( listener ); + Error( "cannot fork the HTTP test server" ); + fi; + + IO_close( listener ); + return rec( pid:= pid, port:= port ); +end ); + +BindGlobal( "UTILS_StopHTTPTestServer", function( server ) + IO_kill( server.pid, IO.SIGTERM ); + IO_WaitPid( server.pid, true ); +end ); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/utils-0.96/tst/utils09.tst new/utils-0.97/tst/utils09.tst --- old/utils-0.96/tst/utils09.tst 2026-06-06 02:00:00.000000000 +0200 +++ new/utils-0.97/tst/utils09.tst 2026-07-29 02:00:00.000000000 +0200 @@ -1,4 +1,4 @@ -# utils, chapter 9 +# utils, chapter 10 # # DO NOT EDIT THIS FILE - EDIT EXAMPLES IN THE SOURCE INSTEAD! # @@ -10,17 +10,99 @@ # gap> START_TEST("utils09.tst"); -# doc/download.xml:85-97 -gap> url:= "https://www.gap-system.org/index.html";; -gap> res1:= Download( url );; -gap> res1.success; +# doc/../lib/gslp.gd:34-46 +gap> gslp:= GeneralizedStraightLineProgram( "union", +> [ [ [[[1,2]]], 1 ], [ [[[1,3]]], 1 ] ] ); +<generalized straight line program> +gap> IsGeneralizedStraightLineProgram( gslp ); true -gap> IsBound( res1.result ) and IsString( res1.result ); +gap> slp:= StraightLineProgram( [[[1,2]]], 1 ); +<straight line program> +gap> IsGeneralizedStraightLineProgram( slp ); true -gap> res2:= Download( Concatenation( url, "xxx" ) );; -gap> res2.success; +gap> IsGeneralizedStraightLineProgram( [ slp, slp ] ); false -gap> IsBound( res2.error ) and IsString( res2.error ); + +# doc/../lib/gslp.gd:194-203 +gap> GeneralizedStraightLineProgram( [[[1,2]]], 1 ); +<straight line program> +gap> GeneralizedStraightLineProgram( "union", +> [ [ [[[1,2]]], 1 ], [ [[[1,3]]], 1 ] ] ); +<generalized straight line program> +gap> GeneralizedStraightLineProgram( "compose", +> [ [ [[[1,2]]], 1 ], [ [[[1,3]]], 1 ] ] ); +<generalized straight line program> + +# doc/../lib/gslp.gd:77-83 +gap> gslp:= GeneralizedStraightLineProgram( "union", +> [ [ [[[1,2]]], 1 ], [ [[[1,3]]], 1 ] ] ); +<generalized straight line program> +gap> DataOfGeneralizedStraightLineProgram( gslp ); +[ "union", [ <straight line program>, <straight line program> ] ] + +# doc/../lib/gslp.gd:111-116 +gap> NrInputsOfGeneralizedStraightLineProgram( +> GeneralizedStraightLineProgram( "union", +> [ [ [[[1,2]]], 1 ], [ [[[1,3]]], 1 ] ] ) ); +1 + +# doc/../lib/gslp.gd:146-155 +gap> NrOutputsOfGeneralizedStraightLineProgram( +> GeneralizedStraightLineProgram( "union", +> [ [ [[[1,2]]], 1 ], [ [[[1,3]]], 1 ] ] ) ); +2 +gap> NrOutputsOfGeneralizedStraightLineProgram( +> GeneralizedStraightLineProgram( "compose", +> [ [ [[[1,2]]], 1 ], [ [[[1,3]]], 1 ] ] ) ); +1 + +# doc/../lib/gslp.gd:248-260 +gap> gens:= [ (1,2,3,4,5,6) ];; +gap> gslp:= GeneralizedStraightLineProgram( "union", +> [ [ [[[1,2]]], 1 ], [ [[[1,3]]], 1 ] ] ); +<generalized straight line program> +gap> ResultOfGeneralizedStraightLineProgram( gslp, gens ); +[ (1,3,5)(2,4,6), (1,4)(2,5)(3,6) ] +gap> gslp:= GeneralizedStraightLineProgram( "compose", +> [ [ [[[1,2]]], 1 ], [ [[[1,3]]], 1 ] ] ); +<generalized straight line program> +gap> ResultOfGeneralizedStraightLineProgram( gslp, gens ); +[ () ] + +# doc/../lib/gslp.gd:292-317 +gap> gslp:= GeneralizedStraightLineProgram( "union", +> [ [ [[[1,2]]], 1 ], [ [[[1,3]]], 1 ] ] ); +<generalized straight line program> +gap> slp:= EquivalentStraightLineProgram( gslp ); +<straight line program> +gap> Display( slp ); +# input: +r:= [ g1 ]; +# program: +# return values: +[ r[1]^2, r[1]^3 ] +gap> gslp:= GeneralizedStraightLineProgram( "compose", +> [ [ [[[1,2]]], 1 ], [ [[[1,3]]], 1 ] ] ); +<generalized straight line program> +gap> slp:= EquivalentStraightLineProgram( gslp ); +<straight line program> +gap> Display( slp ); +# input: +r:= [ g1 ]; +# program: +r[2]:= r[1]^2; +r[1]:= r[2]; +# return values: +[ r[1]^3 ] + +# doc/../lib/gslp.gi:220-229 +gap> gslp:= GeneralizedStraightLineProgram( "union", +> [ [ [[[1,2]]], 1 ], [ [[[1,3]]], 1 ] ] );; +gap> IsInternallyConsistent( gslp ); +true +gap> gslp:= GeneralizedStraightLineProgram( "compose", +> [ [ [[[1,2]]], 1 ], [ [[[1,3]]], 1 ] ] );; +gap> IsInternallyConsistent( gslp ); true # diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/utils-0.96/tst/utils10.tst new/utils-0.97/tst/utils10.tst --- old/utils-0.96/tst/utils10.tst 2026-06-06 02:00:00.000000000 +0200 +++ new/utils-0.97/tst/utils10.tst 2026-07-29 02:00:00.000000000 +0200 @@ -1,4 +1,4 @@ -# utils, chapter 10 +# utils, chapter 11 # # DO NOT EDIT THIS FILE - EDIT EXAMPLES IN THE SOURCE INSTEAD! # @@ -10,100 +10,61 @@ # gap> START_TEST("utils10.tst"); -# doc/../lib/gslp.gd:34-46 -gap> gslp:= GeneralizedStraightLineProgram( "union", -> [ [ [[[1,2]]], 1 ], [ [[[1,3]]], 1 ] ] ); -<generalized straight line program> -gap> IsGeneralizedStraightLineProgram( gslp ); -true -gap> slp:= StraightLineProgram( [[[1,2]]], 1 ); -<straight line program> -gap> IsGeneralizedStraightLineProgram( slp ); -true -gap> IsGeneralizedStraightLineProgram( [ slp, slp ] ); -false - -# doc/../lib/gslp.gd:194-203 -gap> GeneralizedStraightLineProgram( [[[1,2]]], 1 ); -<straight line program> -gap> GeneralizedStraightLineProgram( "union", -> [ [ [[[1,2]]], 1 ], [ [[[1,3]]], 1 ] ] ); -<generalized straight line program> -gap> GeneralizedStraightLineProgram( "compose", -> [ [ [[[1,2]]], 1 ], [ [[[1,3]]], 1 ] ] ); -<generalized straight line program> - -# doc/../lib/gslp.gd:77-83 -gap> gslp:= GeneralizedStraightLineProgram( "union", -> [ [ [[[1,2]]], 1 ], [ [[[1,3]]], 1 ] ] ); -<generalized straight line program> -gap> DataOfGeneralizedStraightLineProgram( gslp ); -[ "union", [ <straight line program>, <straight line program> ] ] - -# doc/../lib/gslp.gd:111-116 -gap> NrInputsOfGeneralizedStraightLineProgram( -> GeneralizedStraightLineProgram( "union", -> [ [ [[[1,2]]], 1 ], [ [[[1,3]]], 1 ] ] ) ); -1 - -# doc/../lib/gslp.gd:146-155 -gap> NrOutputsOfGeneralizedStraightLineProgram( -> GeneralizedStraightLineProgram( "union", -> [ [ [[[1,2]]], 1 ], [ [[[1,3]]], 1 ] ] ) ); -2 -gap> NrOutputsOfGeneralizedStraightLineProgram( -> GeneralizedStraightLineProgram( "compose", -> [ [ [[[1,2]]], 1 ], [ [[[1,3]]], 1 ] ] ) ); -1 - -# doc/../lib/gslp.gd:248-260 -gap> gens:= [ (1,2,3,4,5,6) ];; -gap> gslp:= GeneralizedStraightLineProgram( "union", -> [ [ [[[1,2]]], 1 ], [ [[[1,3]]], 1 ] ] ); -<generalized straight line program> -gap> ResultOfGeneralizedStraightLineProgram( gslp, gens ); -[ (1,3,5)(2,4,6), (1,4)(2,5)(3,6) ] -gap> gslp:= GeneralizedStraightLineProgram( "compose", -> [ [ [[[1,2]]], 1 ], [ [[[1,3]]], 1 ] ] ); -<generalized straight line program> -gap> ResultOfGeneralizedStraightLineProgram( gslp, gens ); -[ () ] - -# doc/../lib/gslp.gd:292-317 -gap> gslp:= GeneralizedStraightLineProgram( "union", -> [ [ [[[1,2]]], 1 ], [ [[[1,3]]], 1 ] ] ); -<generalized straight line program> -gap> slp:= EquivalentStraightLineProgram( gslp ); -<straight line program> -gap> Display( slp ); -# input: -r:= [ g1 ]; -# program: -# return values: -[ r[1]^2, r[1]^3 ] -gap> gslp:= GeneralizedStraightLineProgram( "compose", -> [ [ [[[1,2]]], 1 ], [ [[[1,3]]], 1 ] ] ); -<generalized straight line program> -gap> slp:= EquivalentStraightLineProgram( gslp ); -<straight line program> -gap> Display( slp ); -# input: -r:= [ g1 ]; -# program: -r[2]:= r[1]^2; -r[1]:= r[2]; -# return values: -[ r[1]^3 ] - -# doc/../lib/gslp.gi:220-229 -gap> gslp:= GeneralizedStraightLineProgram( "union", -> [ [ [[[1,2]]], 1 ], [ [[[1,3]]], 1 ] ] );; -gap> IsInternallyConsistent( gslp ); -true -gap> gslp:= GeneralizedStraightLineProgram( "compose", -> [ [ [[[1,2]]], 1 ], [ [[[1,3]]], 1 ] ] );; -gap> IsInternallyConsistent( gslp ); -true +# doc/others.xml:57-62 +gap> IntOrInfinityToLaTeX( 10^3 ); +"1000" +gap> IntOrInfinityToLaTeX( infinity ); +"\\infty" + +# doc/others.xml:75-78 +gap> LaTeXStringFactorsInt( Factorial(12) ); +"2^{10} \\cdot 3^5 \\cdot 5^2 \\cdot 7 \\cdot 11" + +# doc/others.xml:120-165 +gap> ## permutation groups +gap> ConvertToMagmaInputString( Group( (1,2,3,4,5), (3,4,5) ) ); +"PermutationGroup<5|(1,2,3,4,5),\n(3,4,5)>;\n" +gap> ConvertToMagmaInputString( Group( (1,2,3,4,5) ), "c5" ); +"c5 := PermutationGroup<5|(1,2,3,4,5)>;\n" +gap> ## pc-group +gap> ConvertToMagmaInputString( DihedralGroup( IsPcGroup, 10 ) ); +"PolycyclicGroup< f1,f2 |\nf1^2,\nf2^5,\nf2^f1 = f2^4\n>;\n" +gap> ## fp-group +gap> F2 := FreeGroup( 2 );; +gap> f := F2.1;; g := F2.2;; +gap> relq8 := [ f^4, g^4, f*g*f*g^-1, f^2*g^2 ];; +gap> q8 := F2/relq8;; +gap> ConvertToMagmaInputString( q8 ); +no conversion function yet available for fp-groups +fail +gap> ## matrix group +gap> M := GL(2,5);; Size(M); +480 +gap> s1 := ConvertToMagmaInputString( M ); +"F := GF(5);\nP := GL(2,F);\ngens := [\nP![2,0,0,1],\nP![4,1,4,0]\n];\nsub<P |\ + gens>;\n" +gap> Print( s1 ); +F := GF(5); +P := GL(2,F); +gens := [ +P![2,0,0,1], +P![4,1,4,0] +]; +sub<P | gens>; +gap> n1 := [ [ Z(9)^0, Z(9)^0 ], [ Z(9)^0, Z(9) ] ];; +gap> n2 := [ [ Z(9)^0, Z(9)^3 ], [ Z(9)^4, Z(9)^2 ] ];; +gap> N := Group( n1, n2 );; Size( N ); +5760 +gap> s2 := ConvertToMagmaInputString( N, "gpN" );; +gap> Print( s2 ); +F := GF(3^2); +P := GL(2,F); +w := PrimitiveElement(F); +gens := [ +P![ 1, 1, 1,w^1], +P![ 1,w^3, 2,w^2] +]; +gpN := sub<P | gens>; # gap> STOP_TEST("utils10.tst", 1); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/utils-0.96/tst/utils11.tst new/utils-0.97/tst/utils11.tst --- old/utils-0.96/tst/utils11.tst 2026-06-06 02:00:00.000000000 +0200 +++ new/utils-0.97/tst/utils11.tst 2026-07-29 02:00:00.000000000 +0200 @@ -1,4 +1,4 @@ -# utils, chapter 11 +# utils, chapter 12 # # DO NOT EDIT THIS FILE - EDIT EXAMPLES IN THE SOURCE INSTEAD! # @@ -10,61 +10,23 @@ # gap> START_TEST("utils11.tst"); -# doc/others.xml:57-62 -gap> IntOrInfinityToLaTeX( 10^3 ); -"1000" -gap> IntOrInfinityToLaTeX( infinity ); -"\\infty" - -# doc/others.xml:75-78 -gap> LaTeXStringFactorsInt( Factorial(12) ); -"2^{10} \\cdot 3^5 \\cdot 5^2 \\cdot 7 \\cdot 11" - -# doc/others.xml:120-165 -gap> ## permutation groups -gap> ConvertToMagmaInputString( Group( (1,2,3,4,5), (3,4,5) ) ); -"PermutationGroup<5|(1,2,3,4,5),\n(3,4,5)>;\n" -gap> ConvertToMagmaInputString( Group( (1,2,3,4,5) ), "c5" ); -"c5 := PermutationGroup<5|(1,2,3,4,5)>;\n" -gap> ## pc-group -gap> ConvertToMagmaInputString( DihedralGroup( IsPcGroup, 10 ) ); -"PolycyclicGroup< f1,f2 |\nf1^2,\nf2^5,\nf2^f1 = f2^4\n>;\n" -gap> ## fp-group -gap> F2 := FreeGroup( 2 );; -gap> f := F2.1;; g := F2.2;; -gap> relq8 := [ f^4, g^4, f*g*f*g^-1, f^2*g^2 ];; -gap> q8 := F2/relq8;; -gap> ConvertToMagmaInputString( q8 ); -no conversion function yet available for fp-groups -fail -gap> ## matrix group -gap> M := GL(2,5);; Size(M); -480 -gap> s1 := ConvertToMagmaInputString( M ); -"F := GF(5);\nP := GL(2,F);\ngens := [\nP![2,0,0,1],\nP![4,1,4,0]\n];\nsub<P |\ - gens>;\n" -gap> Print( s1 ); -F := GF(5); -P := GL(2,F); -gens := [ -P![2,0,0,1], -P![4,1,4,0] -]; -sub<P | gens>; -gap> n1 := [ [ Z(9)^0, Z(9)^0 ], [ Z(9)^0, Z(9) ] ];; -gap> n2 := [ [ Z(9)^0, Z(9)^3 ], [ Z(9)^4, Z(9)^2 ] ];; -gap> N := Group( n1, n2 );; Size( N ); -5760 -gap> s2 := ConvertToMagmaInputString( N, "gpN" );; -gap> Print( s2 ); -F := GF(3^2); -P := GL(2,F); -w := PrimitiveElement(F); -gens := [ -P![ 1, 1, 1,w^1], -P![ 1,w^3, 2,w^2] -]; -gpN := sub<P | gens>; +# doc/obsolete.xml:49-66 +gap> s3 := SymmetricGroup( 3 );; +gap> L := KnownPropertiesOfObject( GeneratorsOfGroup( s3 ) );; +gap> Perform( L, Display ); +IsFinite +IsSmallList +IsGeneratorsOfMagmaWithInverses +IsAssociative +IsGeneratorsOfSemigroup +IsSubsetLocallyFiniteGroup +gap> Perform( s3, Display ); +() +(2,3) +(1,3) +(1,3,2) +(1,2,3) +(1,2) # gap> STOP_TEST("utils11.tst", 1); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/utils-0.96/tst/utils12.tst new/utils-0.97/tst/utils12.tst --- old/utils-0.96/tst/utils12.tst 2026-06-06 02:00:00.000000000 +0200 +++ new/utils-0.97/tst/utils12.tst 1970-01-01 01:00:00.000000000 +0100 @@ -1,32 +0,0 @@ -# utils, chapter 12 -# -# DO NOT EDIT THIS FILE - EDIT EXAMPLES IN THE SOURCE INSTEAD! -# -# This file has been generated by AutoDoc. It contains examples extracted from -# the package documentation. Each example is preceded by a comment which gives -# the name of a GAPDoc XML file and a line range from which the example were -# taken. Note that the XML file in turn may have been generated by AutoDoc -# from some other input. -# -gap> START_TEST("utils12.tst"); - -# doc/obsolete.xml:49-66 -gap> s3 := SymmetricGroup( 3 );; -gap> L := KnownPropertiesOfObject( GeneratorsOfGroup( s3 ) );; -gap> Perform( L, Display ); -IsFinite -IsSmallList -IsGeneratorsOfMagmaWithInverses -IsAssociative -IsGeneratorsOfSemigroup -IsSubsetLocallyFiniteGroup -gap> Perform( s3, Display ); -() -(2,3) -(1,3) -(1,3,2) -(1,2,3) -(1,2) - -# -gap> STOP_TEST("utils12.tst", 1);
