Upstream nixpkgs removed a lot of aliases this time, so we needed to do the following transformations. It's a real shame that aliases only really become discoverable easily when they are removed. * runCommandNoCC -> runCommand * gmailieer -> lieer We also need to work around the fact that home-manager hasn't catched on to this rename. * mysql -> mariadb * pkgconfig -> pkg-config This also affects our Nix fork which needs to be bumped. * prometheus_client -> prometheus-client * rxvt_unicode -> rxvt-unicode-unwrapped * nix-review -> nixpkgs-review * oauth2_proxy -> oauth2-proxy Additionally, some Go-related builders decided to drop support for passing the sha256 hash in directly, so we need to use the generic hash arguments. Change-Id: I84aaa225ef18962937f8616a9ff064822f0d5dc3 Reviewed-on: https://cl.tvl.fyi/c/depot/+/6792 Autosubmit: sterni <sternenseemann@systemli.org> Tested-by: BuildkiteCI Reviewed-by: grfn <grfn@gws.fyi> Reviewed-by: flokli <flokli@flokli.de> Reviewed-by: tazjin <tazjin@tvl.su> Reviewed-by: wpcarro <wpcarro@gmail.com>
		
			
				
	
	
		
			74 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			74 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
# Build a “sparse” version of a given directory, only including contained files
 | 
						|
# and directories if they are listed in a supplied list:
 | 
						|
#
 | 
						|
# # A very minimal depot
 | 
						|
# sparseTree ./depot [
 | 
						|
#   ./default.nix
 | 
						|
#   ./depot/nix/readTree/default.nix
 | 
						|
#   ./third_party/nixpkgs
 | 
						|
#   ./third_party/overlays
 | 
						|
# ]
 | 
						|
{ pkgs, lib, ... }:
 | 
						|
 | 
						|
# root path to use as a reference point
 | 
						|
root:
 | 
						|
# list of paths below `root` that should be
 | 
						|
# included in the resulting directory
 | 
						|
#
 | 
						|
# If path, need to refer to the actual file / directory to be included.
 | 
						|
# If a string, it is treated as a string relative to the root.
 | 
						|
paths:
 | 
						|
 | 
						|
let
 | 
						|
  rootLength = builtins.stringLength (toString root);
 | 
						|
 | 
						|
  # Count slashes in a path.
 | 
						|
  #
 | 
						|
  # Type: path -> int
 | 
						|
  depth = path: lib.pipe path [
 | 
						|
    toString
 | 
						|
    (builtins.split "/")
 | 
						|
    (builtins.filter builtins.isList)
 | 
						|
    builtins.length
 | 
						|
  ];
 | 
						|
 | 
						|
  # (Parent) directories will be created from deepest to shallowest
 | 
						|
  # which should mean no conflicts are caused unless both a child
 | 
						|
  # and its parent directory are in the list of paths.
 | 
						|
  # TODO(sterni): improve error messages in such cases
 | 
						|
  fromDeepest = lib.sort (a: b: depth a < depth b) paths;
 | 
						|
 | 
						|
  # Create a set which contains the source path to copy / symlink and
 | 
						|
  # it's destination, so the path below the destination root including
 | 
						|
  # a leading slash. Additionally some sanity checking is done.
 | 
						|
  makeSymlink = path:
 | 
						|
    let
 | 
						|
      withLeading = p: if builtins.substring 0 1 p == "/" then p else "/" + p;
 | 
						|
      fullPath =
 | 
						|
        /**/
 | 
						|
        if builtins.isPath path then path
 | 
						|
        else if builtins.isString path then (root + withLeading path)
 | 
						|
        else builtins.throw "Unsupported path type ${builtins.typeOf path}";
 | 
						|
      strPath = toString fullPath;
 | 
						|
      contextPath = "${fullPath}";
 | 
						|
      belowRoot = builtins.substring rootLength (-1) strPath;
 | 
						|
      prefix = builtins.substring 0 rootLength strPath;
 | 
						|
    in
 | 
						|
    assert toString root == prefix; {
 | 
						|
      src = contextPath;
 | 
						|
      dst = belowRoot;
 | 
						|
    };
 | 
						|
 | 
						|
  symlinks = builtins.map makeSymlink fromDeepest;
 | 
						|
in
 | 
						|
 | 
						|
# TODO(sterni): teach readTree to also read symlinked directories,
 | 
						|
  # so we ln -sT instead of cp -aT.
 | 
						|
pkgs.runCommand "sparse-${builtins.baseNameOf root}" { } (
 | 
						|
  lib.concatMapStrings
 | 
						|
    ({ src, dst }: ''
 | 
						|
      mkdir -p "$(dirname "$out${dst}")"
 | 
						|
      cp -aT --reflink=auto "${src}" "$out${dst}"
 | 
						|
    '')
 | 
						|
    symlinks
 | 
						|
)
 |