Loading pkgs/by-name/sn/snapcraft/lxd-socket-path.patch 0 → 100644 +13 −0 Original line number Diff line number Diff line 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) pkgs/by-name/sn/snapcraft/os-platform.patch 0 → 100644 +21 −0 Original line number Diff line number Diff line 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() pkgs/by-name/sn/snapcraft/package.nix 0 → 100644 +188 −0 Original line number Diff line number Diff line { 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; }; } pkgs/by-name/sn/snapcraft/set-channel-for-nix.patch 0 → 100644 +30 −0 Original line number Diff line number Diff line 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. pkgs/by-name/sn/snapcraft/snapcraft-data-dirs.patch 0 → 100644 +26 −0 Original line number Diff line number Diff line 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" Loading
pkgs/by-name/sn/snapcraft/lxd-socket-path.patch 0 → 100644 +13 −0 Original line number Diff line number Diff line 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)
pkgs/by-name/sn/snapcraft/os-platform.patch 0 → 100644 +21 −0 Original line number Diff line number Diff line 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()
pkgs/by-name/sn/snapcraft/package.nix 0 → 100644 +188 −0 Original line number Diff line number Diff line { 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; }; }
pkgs/by-name/sn/snapcraft/set-channel-for-nix.patch 0 → 100644 +30 −0 Original line number Diff line number Diff line 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.
pkgs/by-name/sn/snapcraft/snapcraft-data-dirs.patch 0 → 100644 +26 −0 Original line number Diff line number Diff line 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"