snapcraft: init at 8.2.0

This commit is contained in:
Jon Seager 2024-04-18 12:36:54 +01:00
parent a9c1e0b990
commit fe0775e297
No known key found for this signature in database
5 changed files with 278 additions and 0 deletions

View file

@ -0,0 +1,13 @@
diff --git a/snapcraft_legacy/internal/build_providers/_lxd/_lxd.py b/snapcraft_legacy/internal/build_providers/_lxd/_lxd.py
index 5fa4f898..41264ebb 100644
--- a/snapcraft_legacy/internal/build_providers/_lxd/_lxd.py
+++ b/snapcraft_legacy/internal/build_providers/_lxd/_lxd.py
@@ -142,7 +142,7 @@ class LXD(Provider):
build_provider_flags=build_provider_flags,
)
# This endpoint is hardcoded everywhere lxc/lxd-pkg-snap#33
- lxd_socket_path = "/var/snap/lxd/common/lxd/unix.socket"
+ lxd_socket_path = "/var/lib/lxd/unix.socket"
endpoint = "http+unix://{}".format(urllib.parse.quote(lxd_socket_path, safe=""))
try:
self._lxd_client: pylxd.Client = pylxd.Client(endpoint=endpoint)

View file

@ -0,0 +1,21 @@
diff --git a/snapcraft/utils.py b/snapcraft/utils.py
index 511effe2..4af5a029 100644
--- a/snapcraft/utils.py
+++ b/snapcraft/utils.py
@@ -15,6 +15,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""Utilities for snapcraft."""
+
import multiprocessing
import os
import pathlib
@@ -91,7 +92,7 @@ def get_os_platform(
release = platform.release()
machine = platform.machine()
- if system == "Linux":
+ if system == "Linux" and "NixOS" not in platform.version():
try:
with filepath.open("rt", encoding="utf-8") as release_file:
lines = release_file.readlines()

View file

@ -0,0 +1,188 @@
{
fetchFromGitHub,
git,
glibc,
lib,
makeWrapper,
nix-update-script,
python3Packages,
squashfsTools,
stdenv,
}:
python3Packages.buildPythonApplication rec {
pname = "snapcraft";
version = "8.2.0";
pyproject = true;
# Somewhere deep in the dependency tree is 'versioningit', which depends
# on pydantic 2. Snapcraft will soon migrate to pydantic 2, and disabling
# this doesn't seem to affect the functionality of the application.
catchConflicts = false;
src = fetchFromGitHub {
owner = "canonical";
repo = "snapcraft";
rev = "refs/tags/${version}";
hash = "sha256-uRapRL+492FOju83o3OBsYK52hwOOG6b4EbdMVpAlBs=";
};
patches = [
# Snapcraft is only officially distributed as a snap, as is LXD. The socket
# path for LXD must be adjusted so that it's at the correct location for LXD
# on NixOS. This patch will likely never be accepted upstream.
./lxd-socket-path.patch
# In certain places, Snapcraft expects an /etc/os-release file to determine
# host info which doesn't exist in our test environment. This is a
# relatively naive patch which helps the test suite pass - without it *many*
# of the tests fail. This patch will likely never be accepted upstream.
./os-platform.patch
# Snapcraft will try to inject itself as a snap *from the host system* into
# the build system. This patch short-circuits that logic and ensures that
# Snapcraft is installed on the build system from the snap store - because
# there is no snapd on NixOS hosts that can be used for the injection. This
# patch will likely never be accepted upstream.
./set-channel-for-nix.patch
# Certain paths (for extensions, schemas) are packaged in the snap by the
# upstream, so the paths are well-known, except here where Snapcraft is
# *not* in a snap, so this patch changes those paths to point to the correct
# place in the Nix store. This patch will likely never be accepted upstream.
./snapcraft-data-dirs.patch
];
postPatch = ''
substituteInPlace setup.py \
--replace-fail 'version=determine_version()' 'version="${version}"' \
--replace-fail 'gnupg' 'python-gnupg'
substituteInPlace requirements.txt \
--replace-fail 'gnupg==2.3.1' 'python-gnupg'
substituteInPlace snapcraft/__init__.py \
--replace-fail '__version__ = _get_version()' '__version__ = "${version}"'
substituteInPlace snapcraft_legacy/__init__.py \
--replace-fail '__version__ = _get_version()' '__version__ = "${version}"'
substituteInPlace snapcraft/elf/elf_utils.py \
--replace-fail 'arch_linker_path = Path(arch_config.dynamic_linker)' \
'return str(Path("${glibc}/lib/ld-linux-x86-64.so.2"))'
'';
buildInputs = [ makeWrapper ];
propagatedBuildInputs = with python3Packages; [
attrs
catkin-pkg
click
craft-application
craft-archives
craft-cli
craft-grammar
craft-parts
craft-providers
craft-store
debian
docutils
jsonschema
launchpadlib
lazr-restfulclient
lxml
macaroonbakery
mypy-extensions
progressbar
pyelftools
pygit2
pylxd
python-apt
python-gnupg
raven
requests-toolbelt
simplejson
snap-helpers
tabulate
tinydb
];
nativeBuildInputs = with python3Packages; [
pythonRelaxDepsHook
setuptools
];
pythonRelaxDeps = [
"docutils"
"jsonschema"
"pygit2"
"urllib3"
];
postInstall = ''
wrapProgram $out/bin/snapcraft --prefix PATH : ${squashfsTools}/bin
'';
nativeCheckInputs = with python3Packages; [
pytest-check
pytest-cov
pytest-mock
pytest-subprocess
pytestCheckHook
responses
] ++ [
git
squashfsTools
];
preCheck = ''
mkdir -p check-phase
export HOME="$(pwd)/check-phase"
'';
pytestFlagsArray = [ "tests/unit" ];
disabledTests = [
"test_bin_echo"
"test_classic_linter_filter"
"test_classic_linter"
"test_complex_snap_yaml"
"test_get_base_configuration_snap_channel"
"test_get_base_configuration_snap_instance_name_default"
"test_get_base_configuration_snap_instance_name_not_running_as_snap"
"test_get_extensions_data_dir"
"test_get_os_platform_alternative_formats"
"test_get_os_platform_linux"
"test_get_os_platform_windows"
"test_lifecycle_pack_components_with_output"
"test_lifecycle_pack_components"
"test_lifecycle_write_component_metadata"
"test_parse_info_integrated"
"test_patch_elf"
"test_remote_builder_init"
"test_setup_assets_remote_icon"
"test_snap_command_fallback"
"test_validate_architectures_supported"
"test_validate_architectures_unsupported"
] ++ lib.optionals stdenv.isAarch64 [
"test_load_project"
];
disabledTestPaths = [
"tests/unit/commands/test_remote.py"
"tests/unit/elf"
"tests/unit/linters/test_classic_linter.py"
"tests/unit/linters/test_library_linter.py"
"tests/unit/parts/test_parts.py"
"tests/unit/services"
];
passthru.updateScript = nix-update-script { };
meta = {
mainProgram = "snapcraft";
description = "Build and publish Snap packages";
homepage = "https://github.com/canonical/snapcraft";
changelog = "https://github.com/canonical/snapcraft/releases/tag/${version}";
license = lib.licenses.gpl3Only;
maintainers = with lib.maintainers; [ jnsgruk ];
platforms = lib.platforms.linux;
};
}

View file

@ -0,0 +1,30 @@
diff --git a/snapcraft/providers.py b/snapcraft/providers.py
index a999537a..dcd290a7 100644
--- a/snapcraft/providers.py
+++ b/snapcraft/providers.py
@@ -21,6 +21,7 @@ import sys
from pathlib import Path
from textwrap import dedent
from typing import Dict, Optional
+import platform
from craft_cli import emit
from craft_providers import Provider, ProviderError, bases, executor
@@ -178,14 +179,14 @@ def get_base_configuration(
# injecting a snap on a non-linux system is not supported, so default to
# install snapcraft from the store's stable channel
snap_channel = get_managed_environment_snap_channel()
- if sys.platform != "linux" and not snap_channel:
+ if snap_channel is None and (sys.platform != "linux" or "NixOS" in platform.version()):
emit.progress(
- "Using snapcraft from snap store channel 'latest/stable' in instance "
+ "Using snapcraft from snap store channel 'latest/beta' in instance "
"because snap injection is only supported on Linux hosts.",
permanent=True,
)
snap_name = "snapcraft"
- snap_channel = "stable"
+ snap_channel = "beta"
elif is_snapcraft_running_from_snap():
# Use SNAP_INSTANCE_NAME for snapcraft's snap name, as it may not be
# 'snapcraft' if the '--name' parameter was used to install snapcraft.

View file

@ -0,0 +1,26 @@
diff --git a/snapcraft_legacy/internal/common.py b/snapcraft_legacy/internal/common.py
index 6017b405..aacd99a5 100644
--- a/snapcraft_legacy/internal/common.py
+++ b/snapcraft_legacy/internal/common.py
@@ -34,14 +34,17 @@ from snaphelpers import SnapConfigOptions, SnapCtlError
from snapcraft_legacy.internal import errors
+# Get the path to the Nix store entry for Snapcraft at runtime
+drv = os.path.realpath(__file__).split("/")[3]
+
SNAPCRAFT_FILES = ["parts", "stage", "prime"]
-_DEFAULT_PLUGINDIR = os.path.join(sys.prefix, "share", "snapcraft", "plugins")
+_DEFAULT_PLUGINDIR = os.path.join(os.sep, "nix", "store", drv, "share", "snapcraft", "plugins")
_plugindir = _DEFAULT_PLUGINDIR
-_DEFAULT_SCHEMADIR = os.path.join(sys.prefix, "share", "snapcraft", "schema")
+_DEFAULT_SCHEMADIR = os.path.join(os.sep, "nix", "store", drv, "share", "snapcraft", "schema")
_schemadir = _DEFAULT_SCHEMADIR
-_DEFAULT_EXTENSIONSDIR = os.path.join(sys.prefix, "share", "snapcraft", "extensions")
+_DEFAULT_EXTENSIONSDIR = os.path.join(os.sep, "nix", "store", drv, "share", "snapcraft", "extensions")
_extensionsdir = _DEFAULT_EXTENSIONSDIR
-_DEFAULT_KEYRINGSDIR = os.path.join(sys.prefix, "share", "snapcraft", "keyrings")
+_DEFAULT_KEYRINGSDIR = os.path.join(os.sep, "nix", "store", drv, "share", "snapcraft", "keyrings")
_keyringsdir = _DEFAULT_KEYRINGSDIR
_DOCKERENV_FILE = "/.dockerenv"