Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
2a0ecaa
node: use .gitattributes to ignore some generated file diffs
refi64 Apr 24, 2022
7be211a
node: Split source file into a full Python package
refi64 Apr 24, 2022
ef424a7
node: Enable --xdg-layout by default
refi64 Apr 24, 2022
500b1ae
node: Update quick start demos
refi64 Apr 24, 2022
d0a6f6b
node: Convert to a "proper" Poetry project
refi64 Apr 29, 2022
ea0ab4e
node: Format files with blue
refi64 Apr 29, 2022
cb90fb4
node: Reorganize imports with isort
refi64 Apr 29, 2022
f9cfc81
node: Enforce type checking w/ mypy
refi64 Apr 29, 2022
7c66947
node: "Formally" bump Python requirement to 3.7
refi64 Apr 29, 2022
439569b
node: Fix some inaccurate option type annotations
refi64 May 2, 2022
22078df
node: Add initial unit / integration tests
refi64 May 2, 2022
1197521
node: Fix tests not writing out manifests fully
refi64 Jun 10, 2022
13cf9be
node: Add some tests directly for Yarn
refi64 Jun 10, 2022
17e22ea
node: Fix yarn when only git deps are present
refi64 Jun 10, 2022
7b18500
node: Fix yarn with lockfiles that quote their keys
refi64 Jun 10, 2022
be22317
node: Add tests for parsing base64 integrity values
refi64 Jun 10, 2022
7fc0cf2
node: Get registry integrity matching lockfile
gasinvein Jun 16, 2022
547e2f2
node: Clean up some strange / unneeded code
refi64 Jun 16, 2022
2495f18
node: Add some useful shell scripts for playing with digests
refi64 Jun 16, 2022
c6e9494
node: Run tests for multiple Node versions
refi64 Jun 16, 2022
022df7f
node: Fix parsing git dependencies with a 'package@' prefix
refi64 Jun 16, 2022
9e5500c
node: SemVer fixes and add tests
refi64 Jun 16, 2022
bd714b9
node: Remove urllib requests support
refi64 Jun 16, 2022
65d50e7
node: Limit parallelism to avoid opening too many files
refi64 Jun 16, 2022
568e998
node: Update arguments in README
refi64 Jun 16, 2022
a4f445b
node: Add a Poe script to run the unit tests
refi64 Jun 22, 2022
338e09d
node: Add some contributing guidelines
refi64 Jun 22, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
node: Get registry integrity matching lockfile
Re-committed by refi64 w/ some minor fixes, notes:

Original commit at
#287, I made some
changes to match npm's behavior a bit more closely. Context:

> Hahaha, so after hitting this locally, I've come to believe this
> actually changed in the npm registry, and dists that formerly returned
> the sha1 they were uploaded with now return a newly computed sha512. I
> think the previous behavior I followed was also changed in npm/pacote
> at some point too.
  • Loading branch information
gasinvein authored and refi64 committed Jun 22, 2022
commit 7fc0cf2ecf7f20974d79d08a3d51fab1954bd826
6 changes: 1 addition & 5 deletions node/flatpak_node_generator/package.py
Original file line number Diff line number Diff line change
Expand Up @@ -84,18 +84,14 @@ async def retrieve_integrity(self) -> Integrity:
return metadata.integrity


class UnresolvedRegistrySource:
pass


class GitSource(NamedTuple):
original: str
url: str
commit: str
from_: Optional[str]


PackageSource = Union[ResolvedSource, UnresolvedRegistrySource, GitSource]
PackageSource = Union[ResolvedSource, GitSource]


class Package(NamedTuple):
Expand Down
41 changes: 25 additions & 16 deletions node/flatpak_node_generator/providers/npm.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,7 @@

from ..integrity import Integrity
from ..manifest import ManifestGenerator
from ..package import (
GitSource,
Package,
PackageSource,
ResolvedSource,
UnresolvedRegistrySource,
)
from ..package import GitSource, Package, PackageSource, ResolvedSource
from ..requests import Requests
from ..url_metadata import RemoteUrlMetadata
from . import LockfileProvider, ModuleProvider, ProviderFactory, RCFileProvider
Expand Down Expand Up @@ -62,9 +56,8 @@ def process_dependencies(
git_source = self.parse_git_source(version, info['from'])
source = git_source
else:
# NOTE: npm ignores the resolved field and just uses the provided
# registry instead. We follow the same behavior here.
source = UnresolvedRegistrySource()
integrity = Integrity.parse(info['integrity'])
source = ResolvedSource(resolved=info['resolved'], integrity=integrity)

yield Package(name=name, version=version, source=source, lockfile=lockfile)

Expand Down Expand Up @@ -174,6 +167,8 @@ def add_index_entry(self, url: str, metadata: RemoteUrlMetadata) -> None:
self.index_entries[index_path] = index

async def resolve_source(self, package: Package) -> ResolvedSource:
assert isinstance(package.source, ResolvedSource)

# These results are going to be the same each time.
if package.name not in self.registry_packages:
cache_future = asyncio.get_event_loop().create_future()
Expand Down Expand Up @@ -210,23 +205,37 @@ async def resolve_source(self, package: Package) -> ResolvedSource:

index.used_versions.add(package.version)

integrity: Integrity
registry_integrity: Integrity
if 'integrity' in dist:
integrity = Integrity.parse(dist['integrity'])
registry_integrity = Integrity.parse(dist['integrity'])
elif 'shasum' in dist:
integrity = Integrity.from_sha1(dist['shasum'])
registry_integrity = Integrity.from_sha1(dist['shasum'])
else:
assert False, f'{package.name}@{package.version} has no integrity in dist'

if package.source.integrity:
# Follow npm in only checking for a matching integrity if the algorithms are
# the same:
# https://github.com/npm/pacote/blob/e48370d441b8d8eef3080e5d47c8ab6a8cc2aca0/lib/registry.js#L143
if (
package.source.integrity.algorithm == registry_integrity.algorithm
and package.source.integrity.digest != registry_integrity.digest
):
raise ValueError(
f"{package.name}@{package.version} integrity doesn't match registry integrity"
)

integrity = package.source.integrity
else:
integrity = registry_integrity

return ResolvedSource(resolved=dist['tarball'], integrity=integrity)

async def generate_package(self, package: Package) -> None:
self.all_lockfiles.add(package.lockfile)
source = package.source

assert not isinstance(source, ResolvedSource)

if isinstance(source, UnresolvedRegistrySource):
if isinstance(source, ResolvedSource):
source = await self.resolve_source(package)
assert source.resolved is not None
assert source.integrity is not None
Expand Down