diff --git a/genom3/Makefile b/genom3/Makefile index ed9bee02a62cca3e497c6aba964c95139550148b..a93cd71b4b52c354201b8be34432660c03aa2dc2 100644 --- a/genom3/Makefile +++ b/genom3/Makefile @@ -2,6 +2,7 @@ # Created: Anthony Mallet on Fri, 19 Oct 2012 # +PKGREVISION= 1 VERSION= 2.99.22 DISTNAME= genom-${VERSION} PKGNAME= genom3-${VERSION} diff --git a/genom3/distinfo b/genom3/distinfo index 2acecd8c0df1d107507f16087c6bcb4d46eea8e7..b78b9906b5b410b72eab138bdf8cb780f602b56b 100644 --- a/genom3/distinfo +++ b/genom3/distinfo @@ -1,3 +1,4 @@ SHA1 (genom-2.99.22.tar.gz) = 6cdae22a3f7b4fd84d21e6a5c44654cd7c6ba34d RMD160 (genom-2.99.22.tar.gz) = 2a439662c5c5d5fa4e9c15842de58e5958fbeb81 Size (genom-2.99.22.tar.gz) = 1346320 bytes +SHA1 (patch-aa) = a4d9b791b516e2c0f5b9599f6c11d77020042fdc diff --git a/genom3/patches/patch-aa b/genom3/patches/patch-aa new file mode 100644 index 0000000000000000000000000000000000000000..cb358edf3f9120cbb94641f8c4a44e08c5cc2976 --- /dev/null +++ b/genom3/patches/patch-aa @@ -0,0 +1,100 @@ +upstream commit 297ddbc6d61d9b7a98bb704cc0564176523a183a + +Fix some objects iterators in the generator so that they stop randomizing lists + +Fix the 'throws' method of components/remotes/services/tasks so that the +returned list is kept in a deterministic order. This is important for several +reasons, the most important one being that the client and server md5 digests +rely on it. + +The problem was that in order to remove duplicates in the list, the tcl "lsort +-unique" procedure was used. While this actually removes duplicates, this +paradoxically introduces a randomization of the list, because the string +representation of genom objects in Tcl is based on their address in memory. +So just use a trivial duplicates removal that preserves order instead. + +diff --git engine/tcl/component.c engine/tcl/component.c +index d62a063..20e0976 100644 +--- engine/tcl/component.c ++++ engine/tcl/component.c +@@ -130,8 +130,8 @@ comp_cmd(ClientData v, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) + + case compidx_throws: { + Tcl_Obj *argv[] = { +- Tcl_NewStringObj("lsort", -1), +- Tcl_NewStringObj("-unique", -1), ++ Tcl_NewStringObj("object", -1), ++ Tcl_NewStringObj("unique", -1), + NULL, + }; + prop_s p; +diff --git engine/tcl/object.tcl engine/tcl/object.tcl +index 8b76321..425c48a 100644 +--- engine/tcl/object.tcl ++++ engine/tcl/object.tcl +@@ -271,5 +271,20 @@ namespace eval object { + } + + ++ # --- unique ------------------------------------------------------------- ++ ++ # Remove duplicates in a list while preserving order: only the first item is ++ # kept. ++ # ++ proc unique { list } { ++ set r [list] ++ foreach e $list { ++ if {[lsearch -exact $r $e] < 0} { lappend r $e } ++ } ++ return $r ++ } ++ namespace export unique ++ ++ + namespace ensemble create + } +diff --git engine/tcl/remote.c engine/tcl/remote.c +index 3c6486f..4397c79 100644 +--- engine/tcl/remote.c ++++ engine/tcl/remote.c +@@ -132,8 +132,8 @@ remote_cmd(ClientData v, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) + + case remoteidx_throws: { + Tcl_Obj *argv[] = { +- Tcl_NewStringObj("lsort", -1), +- Tcl_NewStringObj("-unique", -1), ++ Tcl_NewStringObj("object", -1), ++ Tcl_NewStringObj("unique", -1), + NULL, + }; + hiter i; +diff --git engine/tcl/service.c engine/tcl/service.c +index 0757463..ceb3f93 100644 +--- engine/tcl/service.c ++++ engine/tcl/service.c +@@ -140,8 +140,8 @@ service_cmd(ClientData v, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) + + case serviceidx_throws: { + Tcl_Obj *argv[] = { +- Tcl_NewStringObj("lsort", -1), +- Tcl_NewStringObj("-unique", -1), ++ Tcl_NewStringObj("object", -1), ++ Tcl_NewStringObj("unique", -1), + NULL, + }; + hiter i; +diff --git engine/tcl/task.c engine/tcl/task.c +index 82ab066..a044e2c 100644 +--- engine/tcl/task.c ++++ engine/tcl/task.c +@@ -101,8 +101,8 @@ task_cmd(ClientData v, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) + + case taskidx_throws: { + Tcl_Obj *argv[] = { +- Tcl_NewStringObj("lsort", -1), +- Tcl_NewStringObj("-unique", -1), ++ Tcl_NewStringObj("object", -1), ++ Tcl_NewStringObj("unique", -1), + NULL, + }; + prop_s p;