Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to calculate a module's dist hash

Tags:

raku

zef

I have Perl 6 installed in ~/.rakudo-star/rakudo-star-2018.04, using LoneStar. When zef installs a module, it gets installed into a subdirectory of the Rakudo Perl 6 directory. In here is a directory named perl6/site/resources, which seem to hold all the installed files. How can I figure out which module is contained in which file, using Perl 6?

like image 818
Tyil Avatar asked Mar 05 '23 23:03

Tyil


2 Answers

If you want to get the source of a namespace that would get loaded you can do:

my $module-name = 'Test';

# Get a Distribution object which provides an IO interface to its contents
my $compunit         = $*REPO.resolve(CompUnit::DependencySpecification.new(:short-name{$module-name}));
my $distribution     = $compunit.distribution;
my $handle-from-name = $distribution.content($distribution.meta<provides>{$module-name}.keys[0]).open;
say $handle-from-name.slurp(:close);

# Or if we already know the name-path:
my $handle-from-path = $distribution.content("lib/Test.pm6").open;
say $handle-from-path.slurp(:close);

Note that $compunit.distribution will only work if resolve returned a CompUnit from a CompUnit::Repository::Installation repository.

rakudo@1812 is the framework to improve this further, allowing individual repositories to be queried ( $*REPO.resolve iterates the linked list of repos to give a result ) and unifying behavior for resolve/candidates/etc between CompUnit::Repository::Installation and CompUnit::Repository::FileSystem.

like image 86
ugexe Avatar answered Mar 11 '23 14:03

ugexe


If I remember correctly, you shouldn't. It's zef the one that must take care of it. But if you positively have to, use the SHA1 signatures in the directory with zef locate

zef --sha1 locate 5417D0588AE3C30CF7F84DA87D27D4521713522A

will output (in my system)

===> From Distribution: zef:ver<0.4.4>:auth<github:ugexe>:api<>
lib/Zef/Service/Shell/PowerShell/download.pm6 => /home/jmerelo/.rakudobrew/moar-2018.06/install/share/perl6/site/sources/5417D0588AE3C30CF7F84DA87D27D4521713522A

From your question, it's not too clear if what you want to do is the opposite, that is, find out which SHA1 corresponds to which file; in that case, try and to this:

zef locate bin/lwp-download.pl

which will return

===> From Distribution: LWP::Simple:ver<0.103>:auth<Cosimo Streppone>:api<>
bin/lwp-download.pl => /home/jmerelo/.rakudobrew/moar-2018.06/install/share/perl6/site/resources/059BD7DBF74D1598B0ACDB48574CC351A3AD16BC
like image 41
jjmerelo Avatar answered Mar 11 '23 13:03

jjmerelo