I found more accurately what is happen when the bug appear.
So to explain I have this function:
def getRequiredDependencies(software : ISM::SoftwareInformation) : Array(ISM::SoftwareDependency)
dependencies = Hash(String,SoftwareDependency).new
currentDependencies = software.dependencies
nextDependencies = Array(ISM::SoftwareDependency).new
loop do
if currentDependencies.empty?
break
end
currentDependencies.each do |dependency|
#Inextricable dependencies or need multiple version or just need to fusion options
if dependencies.has_key? dependency.hiddenName
#Inextricable dependencies
if dependencies[dependency.hiddenName] == dependency
exit 1
else
#Multiple versions of single software requested
if dependencies[dependency.hiddenName].version != dependency.version
exit 1
#When versions are equal but options are differents
else
#Fusion of all options and add it as well to the nextDependencies
end
end
else
dependencies[dependency.hiddenName] = dependency
nextDependencies += dependency.dependencies
end
end
currentDependencies = nextDependencies.dup
nextDependencies.clear
end
return dependencies.values
end
This function return the dependencies tree of a given software. It work in a single software.
But now a bug appear.
Now I made this function to get the dependencies of a list of software.
def getDependenciesTable(softwareList : Array(ISM::SoftwareInformation)) : Hash(ISM::SoftwareDependency,Array(ISM::SoftwareDependency))
dependenciesTable = Hash(ISM::SoftwareDependency,Array(ISM::SoftwareDependency)).new
softwareList.each do |software|
dependenciesTable[software.toSoftwareDependency] = getRequiredDependencies(software)
end
return dependenciesTable
end
When this list contain only one software, it work, but if I have more than 1 item, the result of getRequiredDependencies is wrong.
Look. Result when I request only one software:
ism@calculate /usr/share/ism $ ism software install file
File
[#<ISM::SoftwareDependency:0x7f1cacf2e210 @name="Zstd", @options=[], @version="1.5.0">, #<ISM::SoftwareDependency:0x7f1cab71f2d0 @name="Xz", @options=[], @version="5.2.5">, #<ISM::SoftwareDependency:0x7f1cab71f420 @name="Bzip2", @options=[], @version="1.0.8">, #<ISM::SoftwareDependency:0x7f1cab71f6f0 @name="Zlib", @options=[], @version="1.2.11">, #<ISM::SoftwareDependency:0x7f1cacf2e870 @name="Glibc", @options=[], @version="2.34.0">, #<ISM::SoftwareDependency:0x7f1cab6f8c00 @name="Iana-Etc", @options=[], @version="0.0.0-+20210611">, #<ISM::SoftwareDependency:0x7f1cab71fd20 @name="Man-Pages", @options=[], @version="5.13.0">, #<ISM::SoftwareDependency:0x7f1cab6f8720 @name="SystemBase", @options=["Pass3"], @version="0.2.0">, #<ISM::SoftwareDependency:0x7f1cacf2e630 @name="Util-Linux", @options=["Pass1"], @version="2.37.2">, #<ISM::SoftwareDependency:0x7f1cab6f8150 @name="Texinfo", @options=["Pass1"], @version="6.8.0">, #<ISM::SoftwareDependency:0x7f1cab6f8240 @name="Python", @options=["Pass1"], @version="3.9.6">, #<ISM::SoftwareDependency:0x7f1cab71fba0 @name="Perl", @options=["Pass1"], @version="5.34.0">, #<ISM::SoftwareDependency:0x7f1cab71fcc0 @name="Bison", @options=["Pass1"], @version="3.7.6">, #<ISM::SoftwareDependency:0x7f1cacf2e330 @name="Gettext", @options=["Pass1"], @version="0.21.0">, #<ISM::SoftwareDependency:0x7f1cab6f8e40 @name="Libstdc++", @options=["Pass2"], @version="11.2.0">, #<ISM::SoftwareDependency:0x7f1cab71f870 @name="SystemBase", @options=["Pass2"], @version="0.2.0">, #<ISM::SoftwareDependency:0x7f1cacf2e660 @name="Gcc", @options=["Pass2"], @version="11.2.0">, #<ISM::SoftwareDependency:0x7f1cab6f8e10 @name="Binutils", @options=["Pass2"], @version="2.37.0">, #<ISM::SoftwareDependency:0x7f1cacf2e4b0 @name="Xz", @options=["Pass1"], @version="5.2.5">, #<ISM::SoftwareDependency:0x7f1cab71f3c0 @name="Tar", @options=["Pass1"], @version="1.34.0">, #<ISM::SoftwareDependency:0x7f1cab71f4e0 @name="Sed", @options=["Pass1"], @version="4.8.0">, #<ISM::SoftwareDependency:0x7f1cab6f84b0 @name="Patch", @options=["Pass1"], @version="2.7.6">, #<ISM::SoftwareDependency:0x7f1cab6f86f0 @name="Make", @options=["Pass1"], @version="4.3.0">, #<ISM::SoftwareDependency:0x7f1cab6f8a80 @name="Gzip", @options=["Pass1"], @version="1.10.0">, #<ISM::SoftwareDependency:0x7f1cab71f600 @name="Grep", @options=["Pass1"], @version="3.7.0">, #<ISM::SoftwareDependency:0x7f1cab6f8c90 @name="Gawk", @options=["Pass1"], @version="5.1.0">, #<ISM::SoftwareDependency:0x7f1cab6f8f30 @name="Findutils", @options=["Pass1"], @version="4.8.0">, #<ISM::SoftwareDependency:0x7f1cacf2e0f0 @name="File", @options=["Pass1"], @version="5.40.0">, #<ISM::SoftwareDependency:0x7f1cacf2e1e0 @name="Diffutils", @options=["Pass1"], @version="3.8.0">, #<ISM::SoftwareDependency:0x7f1cacf2e690 @name="Coreutils", @options=["Pass1"], @version="8.32.0">, #<ISM::SoftwareDependency:0x7f1cacf2e390 @name="Bash", @options=["Pass1"], @version="5.1.8">, #<ISM::SoftwareDependency:0x7f1cacf2e7e0 @name="Ncurses", @options=["Pass1"], @version="6.2.0">, #<ISM::SoftwareDependency:0x7f1cab71f240 @name="M4", @options=["Pass1"], @version="1.4.19">, #<ISM::SoftwareDependency:0x7f1cab6f88a0 @name="Libstdc++", @options=["Pass1"], @version="11.2.0">, #<ISM::SoftwareDependency:0x7f1cab71f8a0 @name="Glibc", @options=["Pass1"], @version="2.34.0">, #<ISM::SoftwareDependency:0x7f1cab6f8ba0 @name="Linux-API-Headers", @options=["Pass1"], @version="5.13.12">, #<ISM::SoftwareDependency:0x7f1cab71f540 @name="Gcc", @options=["Pass1"], @version="11.2.0">, #<ISM::SoftwareDependency:0x7f1cab6f8ea0 @name="Binutils", @options=["Pass1"], @version="2.37.0">, #<ISM::SoftwareDependency:0x7f1cacf2e4e0 @name="SystemBase", @options=["Pass1"], @version="0.2.0">]
When I request 2 softwares. You will see the dependencies of File are differents:
ism@calculate /usr/share/ism $ ism software install diffutils file
Diffutils
[#<ISM::SoftwareDependency:0x7ff29b4e65d0 @name="Check", @options=[], @version="0.15.2">, #<ISM::SoftwareDependency:0x7ff29b4e6180 @name="Coreutils", @options=[], @version="8.32.0">, #<ISM::SoftwareDependency:0x7ff29b4e6390 @name="Meson", @options=[], @version="0.59.1">, #<ISM::SoftwareDependency:0x7ff299cb0930 @name="Ninja", @options=[], @version="1.10.2">, #<ISM::SoftwareDependency:0x7ff299cb0810 @name="Python", @options=[], @version="3.9.6">, #<ISM::SoftwareDependency:0x7ff299cd6bd0 @name="Openssl", @options=[], @version="1.1.1+l">, #<ISM::SoftwareDependency:0x7ff299cb0d20 @name="Libffi", @options=[], @version="3.4.2">, #<ISM::SoftwareDependency:0x7ff299cd6a20 @name="Libelf", @options=[], @version="0.185.0">, #<ISM::SoftwareDependency:0x7ff299cd6ae0 @name="Kmod", @options=[], @version="29.0.0">, #<ISM::SoftwareDependency:0x7ff299cb0a20 @name="Automake", @options=[], @version="1.16.4">, #<ISM::SoftwareDependency:0x7ff29b4e65a0 @name="Autoconf", @options=[], @version="2.71.0">, #<ISM::SoftwareDependency:0x7ff29b4e66c0 @name="Intltool", @options=[], @version="0.51.0">, #<ISM::SoftwareDependency:0x7ff299cd6e40 @name="XML-Parser", @options=[], @version="2.46.0">, #<ISM::SoftwareDependency:0x7ff299cd69c0 @name="Perl", @options=[], @version="5.34.0">, #<ISM::SoftwareDependency:0x7ff299cd6cc0 @name="Less", @options=[], @version="590.0.0">, #<ISM::SoftwareDependency:0x7ff299cb0960 @name="Inetutils", @options=[], @version="2.1.0">, #<ISM::SoftwareDependency:0x7ff299cd6090 @name="Expat", @options=[], @version="2.4.1">, #<ISM::SoftwareDependency:0x7ff299cd6b10 @name="Gperf", @options=[], @version="3.1.0">, #<ISM::SoftwareDependency:0x7ff299cb0d50 @name="Gdbm", @options=[], @version="1.20.0">, #<ISM::SoftwareDependency:0x7ff299cd6f90 @name="Libtool", @options=[], @version="2.4.6">, #<ISM::SoftwareDependency:0x7ff299cd66f0 @name="Bash", @options=[], @version="5.1.8">, #<ISM::SoftwareDependency:0x7ff29b4e67b0 @name="Grep", @options=[], @version="3.7.0">, #<ISM::SoftwareDependency:0x7ff299cb0c90 @name="Bison", @options=[], @version="3.7.6">, #<ISM::SoftwareDependency:0x7ff29b4e6300 @name="Gettext", @options=[], @version="0.21.0">, #<ISM::SoftwareDependency:0x7ff299cb0e40 @name="Psmisc", @options=[], @version="23.4.0">, #<ISM::SoftwareDependency:0x7ff299cb0570 @name="Sed", @options=[], @version="4.8.0">, #<ISM::SoftwareDependency:0x7ff299cb04b0 @name="Ncurses", @options=[], @version="6.2.0">, #<ISM::SoftwareDependency:0x7ff299cd6240 @name="Pkg-Config", @options=[], @version="0.29.2">, #<ISM::SoftwareDependency:0x7ff299cb05d0 @name="Gcc", @options=[], @version="11.2.0">, #<ISM::SoftwareDependency:0x7ff299cb0ea0 @name="Shadow", @options=[], @version="4.9.0">, #<ISM::SoftwareDependency:0x7ff299cb09c0 @name="Libcap", @options=[], @version="2.53.0">, #<ISM::SoftwareDependency:0x7ff299cd6ba0 @name="Acl", @options=[], @version="2.3.1">, #<ISM::SoftwareDependency:0x7ff29b4e63f0 @name="Attr", @options=[], @version="2.5.1">, #<ISM::SoftwareDependency:0x7ff29b4e6510 @name="Mpc", @options=[], @version="1.2.1">, #<ISM::SoftwareDependency:0x7ff299cd63c0 @name="Mpfr", @options=[], @version="4.1.0">, #<ISM::SoftwareDependency:0x7ff299cd6300 @name="Gmp", @options=[], @version="6.2.1">, #<ISM::SoftwareDependency:0x7ff299cd6ed0 @name="Binutils", @options=[], @version="2.37.0">, #<ISM::SoftwareDependency:0x7ff29b4e64b0 @name="DejaGnu", @options=[], @version="1.6.3">, #<ISM::SoftwareDependency:0x7ff29b4e6720 @name="Expect", @options=[], @version="5.45.4">, #<ISM::SoftwareDependency:0x7ff29b4e62a0 @name="Tcl", @options=[], @version="8.6.11">, #<ISM::SoftwareDependency:0x7ff299cb0300 @name="Flex", @options=[], @version="2.6.4">, #<ISM::SoftwareDependency:0x7ff29b4e6000 @name="Bc", @options=[], @version="5.0.0">, #<ISM::SoftwareDependency:0x7ff29b4e6450 @name="M4", @options=[], @version="1.4.19">, #<ISM::SoftwareDependency:0x7ff299cb08a0 @name="Readline", @options=[], @version="8.1.0">, #<ISM::SoftwareDependency:0x7ff299cd6030 @name="File", @options=[], @version="5.40.0">, #<ISM::SoftwareDependency:0x7ff29b4e61e0 @name="Zstd", @options=[], @version="1.5.0">, #<ISM::SoftwareDependency:0x7ff299cd62a0 @name="Xz", @options=[], @version="5.2.5">, #<ISM::SoftwareDependency:0x7ff299cd63f0 @name="Bzip2", @options=[], @version="1.0.8">, #<ISM::SoftwareDependency:0x7ff299cd66c0 @name="Zlib", @options=[], @version="1.2.11">, #<ISM::SoftwareDependency:0x7ff29b4e6810 @name="Glibc", @options=[], @version="2.34.0">, #<ISM::SoftwareDependency:0x7ff299cb0bd0 @name="Iana-Etc", @options=[], @version="0.0.0-+20210611">, #<ISM::SoftwareDependency:0x7ff299cd6cf0 @name="Man-Pages", @options=[], @version="5.13.0">, #<ISM::SoftwareDependency:0x7ff299cb06f0 @name="SystemBase", @options=["Pass3"], @version="0.2.0">, #<ISM::SoftwareDependency:0x7ff29b4e6600 @name="Util-Linux", @options=["Pass1"], @version="2.37.2">, #<ISM::SoftwareDependency:0x7ff299cb0120 @name="Texinfo", @options=["Pass1"], @version="6.8.0">, #<ISM::SoftwareDependency:0x7ff299cb0210 @name="Python", @options=["Pass1"], @version="3.9.6">, #<ISM::SoftwareDependency:0x7ff299cd6b70 @name="Perl", @options=["Pass1"], @version="5.34.0">, #<ISM::SoftwareDependency:0x7ff299cd6c90 @name="Bison", @options=["Pass1"], @version="3.7.6">, #<ISM::SoftwareDependency:0x7ff29b4e62d0 @name="Gettext", @options=["Pass1"], @version="0.21.0">, #<ISM::SoftwareDependency:0x7ff299cb0e10 @name="Libstdc++", @options=["Pass2"], @version="11.2.0">, #<ISM::SoftwareDependency:0x7ff299cd6840 @name="SystemBase", @options=["Pass2"], @version="0.2.0">, #<ISM::SoftwareDependency:0x7ff29b4e6630 @name="Gcc", @options=["Pass2"], @version="11.2.0">, #<ISM::SoftwareDependency:0x7ff299cb0de0 @name="Binutils", @options=["Pass2"], @version="2.37.0">, #<ISM::SoftwareDependency:0x7ff29b4e6420 @name="Xz", @options=["Pass1"], @version="5.2.5">, #<ISM::SoftwareDependency:0x7ff299cd6390 @name="Tar", @options=["Pass1"], @version="1.34.0">, #<ISM::SoftwareDependency:0x7ff299cd64b0 @name="Sed", @options=["Pass1"], @version="4.8.0">, #<ISM::SoftwareDependency:0x7ff299cb0480 @name="Patch", @options=["Pass1"], @version="2.7.6">, #<ISM::SoftwareDependency:0x7ff299cb06c0 @name="Make", @options=["Pass1"], @version="4.3.0">, #<ISM::SoftwareDependency:0x7ff299cb0a50 @name="Gzip", @options=["Pass1"], @version="1.10.0">, #<ISM::SoftwareDependency:0x7ff299cd65d0 @name="Grep", @options=["Pass1"], @version="3.7.0">, #<ISM::SoftwareDependency:0x7ff299cb0c60 @name="Gawk", @options=["Pass1"], @version="5.1.0">, #<ISM::SoftwareDependency:0x7ff299cb0f00 @name="Findutils", @options=["Pass1"], @version="4.8.0">, #<ISM::SoftwareDependency:0x7ff29b4e60c0 @name="File", @options=["Pass1"], @version="5.40.0">, #<ISM::SoftwareDependency:0x7ff29b4e61b0 @name="Diffutils", @options=["Pass1"], @version="3.8.0">, #<ISM::SoftwareDependency:0x7ff29b4e6570 @name="Coreutils", @options=["Pass1"], @version="8.32.0">, #<ISM::SoftwareDependency:0x7ff29b4e6360 @name="Bash", @options=["Pass1"], @version="5.1.8">, #<ISM::SoftwareDependency:0x7ff29b4e66f0 @name="Ncurses", @options=["Pass1"], @version="6.2.0">, #<ISM::SoftwareDependency:0x7ff299cd6210 @name="M4", @options=["Pass1"], @version="1.4.19">, #<ISM::SoftwareDependency:0x7ff299cb0870 @name="Libstdc++", @options=["Pass1"], @version="11.2.0">, #<ISM::SoftwareDependency:0x7ff299cd6870 @name="Glibc", @options=["Pass1"], @version="2.34.0">, #<ISM::SoftwareDependency:0x7ff299cb0b70 @name="Linux-API-Headers", @options=["Pass1"], @version="5.13.12">, #<ISM::SoftwareDependency:0x7ff299cd6510 @name="Gcc", @options=["Pass1"], @version="11.2.0">, #<ISM::SoftwareDependency:0x7ff299cb0e70 @name="Binutils", @options=["Pass1"], @version="2.37.0">, #<ISM::SoftwareDependency:0x7ff29b4e6480 @name="SystemBase", @options=["Pass1"], @version="0.2.0">]
File
[#<ISM::SoftwareDependency:0x7ff29b4e61b0 @name="Diffutils", @options=["Pass1"], @version="3.8.0">, #<ISM::SoftwareDependency:0x7ff29b4e6570 @name="Coreutils", @options=["Pass1"], @version="8.32.0">, #<ISM::SoftwareDependency:0x7ff29b4e6360 @name="Bash", @options=["Pass1"], @version="5.1.8">, #<ISM::SoftwareDependency:0x7ff29b4e66f0 @name="Ncurses", @options=["Pass1"], @version="6.2.0">, #<ISM::SoftwareDependency:0x7ff299cd6210 @name="M4", @options=["Pass1"], @version="1.4.19">, #<ISM::SoftwareDependency:0x7ff299cb0870 @name="Libstdc++", @options=["Pass1"], @version="11.2.0">, #<ISM::SoftwareDependency:0x7ff299cd6870 @name="Glibc", @options=["Pass1"], @version="2.34.0">, #<ISM::SoftwareDependency:0x7ff299cb0b70 @name="Linux-API-Headers", @options=["Pass1"], @version="5.13.12">, #<ISM::SoftwareDependency:0x7ff299cd6510 @name="Gcc", @options=["Pass1"], @version="11.2.0">, #<ISM::SoftwareDependency:0x7ff299cb0e70 @name="Binutils", @options=["Pass1"], @version="2.37.0">, #<ISM::SoftwareDependency:0x7ff29b4e6480 @name="SystemBase", @options=["Pass1"], @version="0.2.0">]
I suspect getRequiredDependencies to alterate it argument software, I am almost sure it is that, but I dont know how it is possible.
Because I did a test, and after a getRequiredDependencies, the array is alterated