Unverified Commit 30d8af5d authored by Jon Seager's avatar Jon Seager Committed by GitHub
Browse files

Merge pull request #305035 from jnsgruk/snapcraft

parents f3624a0b fe0775e2
Loading
Loading
Loading
Loading
+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)
+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()
+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;
  };
}
+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.
+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