App-MechaCPAN

 view release on metacpan or  search on metacpan

lib/App/MechaCPAN/Install.pm  view on Meta::CPAN


    my ( $git_url, $commit ) = $src =~ git_extract_re;
    my ($descr) = $git_url =~ m{ ([^/]*) $}xms;

    my $dir  = humane_tmpdir($descr);
    my $fh   = humane_tmpfile($descr);
    my $file = $fh->filename;

    run( 'git', 'clone', '--bare', $git_url, $dir );
    run(
      $fh, 'git', 'archive', '--format=tar.gz', "--remote=$dir",
      $commit || 'master'
    );
    close $fh;
    return $fh;
  }

  # URL
  if ( $src =~ url_re )
  {
    $url = $src;
  }

  # PAUSE
  my $cpan_url = 'https://cpan.metacpan.org/authors/id';
  if ( $src =~ $pause_re )
  {
    my $author  = $1;
    my $package = $2;
    $url = join(
      '/',
      $cpan_url,
      substr( $author, 0, 1 ),
      substr( $author, 0, 2 ),
      $author,
      $package,
    );

    $target->{is_cpan} = 1;
  }

  # Module Name
  if ( !defined $url )
  {
    my $json_data = _search_metacpan( $src, $target->{constraint} );

    $url = $json_data->{download_url};

    $target->{is_cpan} = 1;
    $target->{version} = version->parse( $json_data->{version} );
    $target->{sha256}  = $json_data->{checksum_sha256};
  }

  if ( defined $url )
  {
    # if it's pause like, parse out the distibution's version name
    if ( $url =~ $full_pause_re )
    {
      my $package = $3;
      $target->{pathname}  = "$1/$2/$3";
      $target->{cpan_path} = "$1/$2";
      $target->{filename}  = $package;

      # If CHKSIGS is enabled, we always want to check CHECKSUMS. If we have
      # a sha256 from metacpan, CHECKSUMS will take precedence
      if ( !$target->{sha256} || $App::MechaCPAN::CHKSIGS )
      {
        my $chk_url = $url;
        $chk_url =~ s/$package$/CHECKSUMS/;
        $target->{checksums_url} = $chk_url;
      }

      $package =~ s/ (.*) [.] ( tar[.](gz|z|bz2) | zip | tgz) $/$1/xmsi;
      $target->{distvname} = $package;
    }

    my $src_tgz = fetch_file($url);

    if ( my $checksums_url = $target->{checksums_url} )
    {
      my $filename  = $target->{filename};
      my $checksums = get_cpan_checksums( $checksums_url, $filename );

      if ( defined $checksums )
      {
        my $cpan_path = $target->{cpan_path};
        my $entry     = $checksums->{$filename};

        croak "No CHECKSUMS entry for $filename"
          if !defined $entry;
        croak "Mismatch 'cpan_path': $entry->{cpan_path} ne $cpan_path"
          if $entry->{cpan_path} ne $cpan_path;
        croak "Mismatch 'size': $entry->{size} != -s $src_tgz"
          if $entry->{size} != -s $src_tgz;

        $target->{sha256} = $entry->{sha256};
      }
    }

    if ( $target->{sha256} )
    {
      $src_tgz = {
        src    => $src_tgz,
        sha256 => $target->{sha256},
      };
    }

    return $src_tgz;
  }

  croak "Cannot find $src\n";
}

sub _get_core_ver
{
  my $module = shift;
  my $ver    = $Module::CoreList::version{$]}{$module};
  undef $ver
    if defined $Module::CoreList::deprecated{$]}{$module};
  return $ver;
}

sub _get_mod_ver
{
  my $module = shift;
  return $]
    if $module eq 'perl';
  local $@;
  my $ver = eval {
    my $file = _installed_file_for_module($module);
    MM->parse_version($file);
  };

  $ver = _get_core_ver($module)
    if !defined $ver;

  return $ver;
}

sub _load_meta
{
  my $target = shift;
  my $cache  = shift;
  my $my     = shift;

  my $prefix = $my ? 'MYMETA' : 'META';

  my $meta;

  foreach my $file ( "$prefix.json", "$prefix.yml" )
  {
    $meta = eval { CPAN::Meta->load_file($file) };



( run in 2.990 seconds using v1.01-cache-2.11-cpan-7fcb06a456a )