Compare commits
No commits in common. "96a11d9975a5b518f88ec0a5f0ee342a0afe81a0" and "5123cb93a989e2ef12c757e60fd5f6dd20c213bb" have entirely different histories.
96a11d9975
...
5123cb93a9
22
config/automatrop/roles/access/tasks/main.yml
Normal file
22
config/automatrop/roles/access/tasks/main.yml
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
- name: Set variables
|
||||||
|
set_fact:
|
||||||
|
manjaro: "{{ ansible_lsb.id == 'Manjaro' or ansible_lsb.id == 'Manjaro-ARM' }}"
|
||||||
|
|
||||||
|
- name: Enable passwordless sudo access to wheel group (Others)
|
||||||
|
lineinfile:
|
||||||
|
path: /etc/sudoers
|
||||||
|
line: "%wheel ALL=(ALL) NOPASSWD: ALL"
|
||||||
|
regexp: "^#? *%wheel ALL=\\(ALL\\) NOPASSWD: ALL$"
|
||||||
|
become: yes
|
||||||
|
when: not manjaro
|
||||||
|
|
||||||
|
- name: Enable passwordless sudo access to wheel group (Manjaro)
|
||||||
|
copy:
|
||||||
|
content: "%wheel ALL=(ALL) NOPASSWD: ALL"
|
||||||
|
dest: /etc/sudoers.d/11-wheel-nopasswd
|
||||||
|
mode: "u=rwx,g=rx,o="
|
||||||
|
when: manjaro
|
||||||
|
become: yes
|
||||||
|
# /etc/sudoers.d/10-installer is the same thing,
|
||||||
|
# but **with** a password, and it's overwritten
|
||||||
|
# with each upgrade of manjaro-system, hence this.
|
|
@ -1,4 +1,200 @@
|
||||||
|
|
||||||
|
# TODO Install python if not done
|
||||||
|
# Or maybe not, it requires a lot of automation for something that can be done
|
||||||
|
# very quickly manually and is usually already installed
|
||||||
|
|
||||||
|
- name: Install python-apt dependency for Termux
|
||||||
|
block:
|
||||||
|
# TODO Check if the correct version
|
||||||
|
- name: Check for DistUtilsExtra (Termux)
|
||||||
|
command: python -c 'import DistUtilsExtra'
|
||||||
|
changed_when: False
|
||||||
|
rescue:
|
||||||
|
- name: Create temporarty folder for DistUtilsExtra (Termux)
|
||||||
|
tempfile:
|
||||||
|
state: directory
|
||||||
|
suffix: python-distutils-extra
|
||||||
|
# path: /data/data/com.termux/files/usr/tmp/
|
||||||
|
register: pde_tempdir
|
||||||
|
|
||||||
|
- name: Download DistUtilsExtra (Termux)
|
||||||
|
get_url:
|
||||||
|
url: "https://launchpad.net/python-distutils-extra/trunk/{{ version }}/+download/python-distutils-extra-{{ version }}.tar.gz"
|
||||||
|
dest: "{{ pde_tempdir.path }}/python-distutils-extra.tar.gz"
|
||||||
|
|
||||||
|
- name: Extract DistUtilsExtra (Termux)
|
||||||
|
unarchive:
|
||||||
|
src: "{{ pde_tempdir.path }}/python-distutils-extra.tar.gz"
|
||||||
|
remote_src: yes
|
||||||
|
dest: "{{ pde_tempdir.path }}"
|
||||||
|
|
||||||
|
- name: Install DistUtilsExtra (Termux)
|
||||||
|
command:
|
||||||
|
cmd: python3 setup.py install
|
||||||
|
chdir: "{{ pde_tempdir.path }}/python-distutils-extra-{{ version }}"
|
||||||
|
when: termux
|
||||||
|
vars:
|
||||||
|
version: 2.39
|
||||||
|
|
||||||
|
- name: Install python-apt (Termux)
|
||||||
|
pip:
|
||||||
|
name: python-apt
|
||||||
|
when: termux
|
||||||
|
|
||||||
|
# Collecting python-apt
|
||||||
|
# Using cached python-apt-0.7.8.tar.bz2 (49 kB)
|
||||||
|
# ERROR: Command errored out with exit status 1:
|
||||||
|
# command: /data/data/com.termux/files/usr/bin/python3 -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/data/data/com.termux/files/usr/tmp/pip-install-dsga__i7/python-apt/setup.py'"'"'; __file__='"'"'/data/data/com.termux/files/usr/tmp/pip-install-dsga__i7/python-apt/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base /data/data/com.termux/files/usr/tmp/pip-pip-egg-info-ptpprl0m
|
||||||
|
# cwd: /data/data/com.termux/files/usr/tmp/pip-install-dsga__i7/python-apt/
|
||||||
|
# Complete output (5 lines):
|
||||||
|
# Traceback (most recent call last):
|
||||||
|
# File "<string>", line 1, in <module>
|
||||||
|
# File "/data/data/com.termux/files/usr/tmp/pip-install-dsga__i7/python-apt/setup.py", line 11, in <module>
|
||||||
|
# string.split(parse_makefile("python/makefile")["APT_PKG_SRC"]))
|
||||||
|
# AttributeError: module 'string' has no attribute 'split'
|
||||||
|
# ----------------------------------------
|
||||||
|
# ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.
|
||||||
|
# WARNING: You are using pip version 20.2.3; however, version 20.3.3 is available.
|
||||||
|
# You should consider upgrading via the '/data/data/com.termux/files/usr/bin/python3 -m pip install --upgrade pip' command.
|
||||||
|
|
||||||
|
# Arch configuration
|
||||||
|
|
||||||
|
# TODO Patch sudo-fake so it allows using -u so `become` works
|
||||||
|
|
||||||
|
- name: Enable multilib repo
|
||||||
|
lineinfile:
|
||||||
|
path: /etc/pacman.conf
|
||||||
|
regexp: '^#?\s*\[multilib\]$'
|
||||||
|
line: '[multilib]'
|
||||||
|
become: yes
|
||||||
|
when: arch_based and ansible_architecture == "x86_64"
|
||||||
|
notify: udpate pacman cache
|
||||||
|
|
||||||
|
- name: Configure multilib repo
|
||||||
|
lineinfile:
|
||||||
|
path: /etc/pacman.conf
|
||||||
|
regexp: '^#?\s*Include\s*=\s*/etc/pacman.d/mirrorlist'
|
||||||
|
line: 'Include = /etc/pacman.d/mirrorlist'
|
||||||
|
insertafter: '^\[multilib\]$'
|
||||||
|
become: yes
|
||||||
|
when: arch_based and ansible_architecture == "x86_64"
|
||||||
|
notify: udpate pacman cache
|
||||||
|
|
||||||
|
- name: Update cache if needed
|
||||||
|
meta: flush_handlers
|
||||||
|
|
||||||
|
- name: Install ccache
|
||||||
|
pacman:
|
||||||
|
name: ccache
|
||||||
|
state: present
|
||||||
|
extra_args: "--asdeps"
|
||||||
|
become: yes
|
||||||
|
when: arch_based
|
||||||
|
|
||||||
|
- name: Enable makepkg color
|
||||||
|
replace:
|
||||||
|
path: /etc/makepkg.conf
|
||||||
|
regexp: '^BUILDENV=(.+)!color(.+)$'
|
||||||
|
replace: 'BUILDENV=\1color\2'
|
||||||
|
become: yes
|
||||||
|
when: arch_based
|
||||||
|
|
||||||
|
- name: Enable makepkg ccache
|
||||||
|
replace:
|
||||||
|
path: /etc/makepkg.conf
|
||||||
|
regexp: '^BUILDENV=(.+)!ccache(.+)$'
|
||||||
|
replace: 'BUILDENV=\1ccache\2'
|
||||||
|
become: yes
|
||||||
|
when: arch_based
|
||||||
|
|
||||||
|
- name: Remove -mtune from makepkg CFLAGS
|
||||||
|
replace:
|
||||||
|
path: /etc/makepkg.conf
|
||||||
|
regexp: '^#? *CFLAGS=(.+)-mtune=\S+\s(.*)$'
|
||||||
|
replace: "CFLAGS=\\1\\2"
|
||||||
|
become: yes
|
||||||
|
when: arch_based
|
||||||
|
|
||||||
|
- name: Change -march to native from makepkg CFLAGS
|
||||||
|
replace:
|
||||||
|
path: /etc/makepkg.conf
|
||||||
|
regexp: '^#? *CFLAGS=(.+)-march=\S+(\s)(.*)$'
|
||||||
|
replace: "CFLAGS=\\1-march=native\\2\\3"
|
||||||
|
become: yes
|
||||||
|
when: arch_based
|
||||||
|
|
||||||
|
- name: Set makepkg MAKEFLAGS
|
||||||
|
replace:
|
||||||
|
path: /etc/makepkg.conf
|
||||||
|
regexp: '^#? *MAKEFLAGS=(.+)-j[0-9]+(.+)$'
|
||||||
|
replace: "MAKEFLAGS=\\1-j{{ j }}\\2"
|
||||||
|
become: yes
|
||||||
|
vars:
|
||||||
|
j: "{{ [ansible_processor_nproc - 1, 1] | max | int }}"
|
||||||
|
when: arch_based
|
||||||
|
|
||||||
|
- name: Enable pacman ParallelDownloads
|
||||||
|
lineinfile:
|
||||||
|
path: /etc/pacman.conf
|
||||||
|
regexp: '^#?ParallelDownloads'
|
||||||
|
line: 'ParallelDownloads = 5'
|
||||||
|
insertafter: '^\[options\]$'
|
||||||
|
become: yes
|
||||||
|
when: arch_based
|
||||||
|
|
||||||
|
- name: Enable pacman colors
|
||||||
|
lineinfile:
|
||||||
|
path: /etc/pacman.conf
|
||||||
|
regexp: '^#?Color'
|
||||||
|
line: 'Color'
|
||||||
|
insertafter: '^\[options\]$'
|
||||||
|
become: yes
|
||||||
|
when: arch_based
|
||||||
|
|
||||||
|
- name: Enable pacman pac-man
|
||||||
|
lineinfile:
|
||||||
|
path: /etc/pacman.conf
|
||||||
|
regexp: '^#?ILoveCandy'
|
||||||
|
line: 'ILoveCandy'
|
||||||
|
insertafter: '^#?Color'
|
||||||
|
become: yes
|
||||||
|
when: arch_based
|
||||||
|
|
||||||
|
|
||||||
|
# Install alternative package managers
|
||||||
|
- name: List packages from base-devel
|
||||||
|
command: pacman -Sqg base-devel
|
||||||
|
register: base_devel_packages
|
||||||
|
changed_when: no
|
||||||
|
check_mode: no
|
||||||
|
|
||||||
|
- name: Install dependencies for AUR helpers
|
||||||
|
pacman:
|
||||||
|
name: "{{ (base_devel_packages.stdout | split('\n') | reject('eq', 'sudo')) + ['fakeroot'] }}"
|
||||||
|
become: yes
|
||||||
|
when: arch_based
|
||||||
|
# Do not install sudo because maybe sudo-fake is installed (otherwise it conflicts)
|
||||||
|
# It should already be installed already anyway
|
||||||
|
|
||||||
|
- name: Install AUR package manager (Arch)
|
||||||
|
aur:
|
||||||
|
name: yay-bin
|
||||||
|
when: arch
|
||||||
|
|
||||||
|
- name: Install AUR package manager (Manjaro)
|
||||||
|
pacman:
|
||||||
|
name: yay
|
||||||
|
become: yes
|
||||||
|
when: manjaro
|
||||||
|
# Not sure if regular Manjaro has yay in its community packages,
|
||||||
|
# but Manjaro-ARM sure does
|
||||||
|
|
||||||
|
- name: Create cache folder
|
||||||
|
file:
|
||||||
|
state: directory
|
||||||
|
mode: "u=rwx,g=rx,o=rx"
|
||||||
|
path: "{{ ansible_user_dir }}/.cache/automatrop"
|
||||||
|
|
||||||
- name: Generate list of packages for package manager
|
- name: Generate list of packages for package manager
|
||||||
set_fact:
|
set_fact:
|
||||||
packages: "{{ query('template', 'package_manager.j2')[0].split('\n')[:-1]|sort|unique }}"
|
packages: "{{ query('template', 'package_manager.j2')[0].split('\n')[:-1]|sort|unique }}"
|
||||||
|
|
|
@ -1,5 +1,15 @@
|
||||||
{# Macros #}
|
{# Macros #}
|
||||||
|
{% if debian_based %}
|
||||||
|
{% set python_prefix = 'python3' %}
|
||||||
|
{% set lib_suffix = '-common' %}
|
||||||
|
{% else %}
|
||||||
|
{% set python_prefix = 'python' %}
|
||||||
|
{% set lib_suffix = '' %}
|
||||||
|
{% endif %}
|
||||||
{# Include essential snippets #}
|
{# Include essential snippets #}
|
||||||
|
{% include 'snippets/pm_dotfiles_dependencies.j2' %}
|
||||||
|
{% include 'snippets/pm_shell.j2' %}
|
||||||
|
{% include 'snippets/pm_terminal_essentials.j2' %}
|
||||||
{% include 'snippets/pm_remote.j2' %}
|
{% include 'snippets/pm_remote.j2' %}
|
||||||
{% include 'snippets/pm_disk_cleanup.j2' %}
|
{% include 'snippets/pm_disk_cleanup.j2' %}
|
||||||
{% include 'snippets/pm_local_monitoring.j2' %}
|
{% include 'snippets/pm_local_monitoring.j2' %}
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
{#
|
||||||
|
Stuff that is required for scripts/programs of dotfiles to work properly
|
||||||
|
#}
|
||||||
|
coreutils
|
||||||
|
bash
|
||||||
|
grep
|
||||||
|
sed
|
||||||
|
tar
|
||||||
|
openssl
|
||||||
|
git
|
||||||
|
wget
|
||||||
|
curl
|
||||||
|
{% if not termux %}
|
||||||
|
{{ python_prefix }}-pip
|
||||||
|
{# Termux already has pip via Python #}
|
||||||
|
{% endif %}
|
||||||
|
ansible
|
||||||
|
{# Uncompressors #}
|
||||||
|
unzip
|
||||||
|
unrar
|
||||||
|
p7zip
|
||||||
|
{{ python_prefix }}-pystache
|
||||||
|
{# EOF #}
|
|
@ -0,0 +1,24 @@
|
||||||
|
moreutils
|
||||||
|
man
|
||||||
|
visidata
|
||||||
|
{% if can_chown or not arch_based %}
|
||||||
|
insect
|
||||||
|
{% endif %}
|
||||||
|
translate-shell
|
||||||
|
gnupg
|
||||||
|
{# Editor #}
|
||||||
|
{% if termux %}
|
||||||
|
nvim
|
||||||
|
{% else %}
|
||||||
|
neovim
|
||||||
|
{% endif %}
|
||||||
|
{% if not termux %}
|
||||||
|
{{ python_prefix }}-neovim
|
||||||
|
{% endif %}
|
||||||
|
{# Downloaders #}
|
||||||
|
wget
|
||||||
|
{# Uncompressors #}
|
||||||
|
unzip
|
||||||
|
unrar
|
||||||
|
p7zip
|
||||||
|
{# EOF #}
|
|
@ -1,5 +1,4 @@
|
||||||
#/usr/bin/env sh
|
#/usr/bin/env sh
|
||||||
export NIXPKGS_ALLOW_UNFREE=1
|
|
||||||
nix-build '<nixpkgs/nixos>' -A vm \
|
nix-build '<nixpkgs/nixos>' -A vm \
|
||||||
-I nixpkgs=channel:nixos-23.05 \
|
-I nixpkgs=channel:nixos-23.05 \
|
||||||
-I nixos-config=./configuration.nix
|
-I nixos-config=./configuration.nix
|
||||||
|
|
|
@ -1,9 +1,53 @@
|
||||||
{ config, pkgs, ... }:
|
{ config, pkgs, ... }:
|
||||||
let
|
{
|
||||||
recursiveMerge = import ./recursiveMerge.nix;
|
boot.loader.grub.enable = true;
|
||||||
getModule = name: import (./modules + "/${name}.nix") { inherit config pkgs; };
|
boot.loader.efi.canTouchEfiVariables = true;
|
||||||
in
|
|
||||||
recursiveMerge [
|
networking.hostName = "nixos";
|
||||||
(getModule "common")
|
networking.wireless.enable = true; # Enable wireless support via wpa_supplicant
|
||||||
(getModule "x11")
|
|
||||||
]
|
time.timeZone = "Europe/Amsterdam";
|
||||||
|
|
||||||
|
# TODO qwerty-fr for console
|
||||||
|
|
||||||
|
# Enable the X11 windowing system
|
||||||
|
services.xserver.enable = true;
|
||||||
|
|
||||||
|
# TODO qwerty-fr for X11
|
||||||
|
|
||||||
|
# Enable CUPS to print documents
|
||||||
|
services.printing.enable = true;
|
||||||
|
|
||||||
|
# Enable sound
|
||||||
|
sound.enable = true;
|
||||||
|
hardware.pulseaudio.enable = true;
|
||||||
|
|
||||||
|
# services.xserver.displayManager.gdm.enable = true;
|
||||||
|
services.xserver.windowManager.i3.enable = true;
|
||||||
|
|
||||||
|
# Users
|
||||||
|
users.users.geoffrey = {
|
||||||
|
isNormalUser = true;
|
||||||
|
extraGroups = [ "wheel" ]; # Enable ‘sudo’ for the user.
|
||||||
|
packages = with pkgs; [
|
||||||
|
firefox
|
||||||
|
tree
|
||||||
|
lolcat
|
||||||
|
];
|
||||||
|
initialPassword = "cartable";
|
||||||
|
};
|
||||||
|
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
neovim
|
||||||
|
wget
|
||||||
|
];
|
||||||
|
|
||||||
|
# Enable the OpenSSH daemon
|
||||||
|
services.openssh.enable = true;
|
||||||
|
|
||||||
|
# TEST
|
||||||
|
system.copySystemConfiguration = true;
|
||||||
|
|
||||||
|
# Use defaults from
|
||||||
|
system.stateVersion = "23.05";
|
||||||
|
}
|
||||||
|
|
|
@ -1,112 +0,0 @@
|
||||||
{ pkgs, ... }:
|
|
||||||
{
|
|
||||||
boot.loader.grub.enable = true;
|
|
||||||
boot.loader.efi.canTouchEfiVariables = true;
|
|
||||||
|
|
||||||
networking.hostName = "nixos";
|
|
||||||
networking.wireless.enable = true; # Enable wireless support via wpa_supplicant
|
|
||||||
|
|
||||||
time.timeZone = "Europe/Amsterdam";
|
|
||||||
|
|
||||||
# TODO qwerty-fr for console
|
|
||||||
|
|
||||||
# Enable CUPS to print documents
|
|
||||||
services.printing.enable = true;
|
|
||||||
|
|
||||||
# Enable passwordless sudo
|
|
||||||
security.sudo.extraRules = [{
|
|
||||||
groups = [ "wheel" ];
|
|
||||||
commands = [{
|
|
||||||
command = "ALL";
|
|
||||||
options = [ "NOPASSWD" ];
|
|
||||||
}];
|
|
||||||
}];
|
|
||||||
|
|
||||||
# Users
|
|
||||||
users.users.geoffrey = {
|
|
||||||
isNormalUser = true;
|
|
||||||
extraGroups = [ "wheel" ]; # Enable ‘sudo’ for the user.
|
|
||||||
packages = with pkgs; [
|
|
||||||
# dotfiles dependencies
|
|
||||||
coreutils
|
|
||||||
bash
|
|
||||||
gnugrep
|
|
||||||
gnused
|
|
||||||
gnutar
|
|
||||||
openssl
|
|
||||||
git
|
|
||||||
wget
|
|
||||||
curl
|
|
||||||
python3Packages.pip
|
|
||||||
ansible # TODO Reevaluate
|
|
||||||
|
|
||||||
# shell
|
|
||||||
zsh-completions
|
|
||||||
nix-zsh-completions
|
|
||||||
zsh-history-substring-search
|
|
||||||
antigen # TODO Reevaluate
|
|
||||||
powerline-go
|
|
||||||
|
|
||||||
# terminal essentials
|
|
||||||
moreutils
|
|
||||||
man
|
|
||||||
visidata
|
|
||||||
nodePackages.insect
|
|
||||||
translate-shell
|
|
||||||
unzip
|
|
||||||
unrar
|
|
||||||
p7zip
|
|
||||||
|
|
||||||
# remote
|
|
||||||
openssh
|
|
||||||
rsync
|
|
||||||
|
|
||||||
# DEBUG
|
|
||||||
tree
|
|
||||||
lolcat
|
|
||||||
|
|
||||||
];
|
|
||||||
initialPassword = "cartable"; # DEBUG
|
|
||||||
openssh.authorizedKeys.keys = [
|
|
||||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPE41gxrO8oZ5n3saapSwZDViOQphm6RzqgsBUyA88pU geoffrey@frogeye.fr"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
environment.systemPackages = with pkgs; [ neovim wget ];
|
|
||||||
|
|
||||||
# Enable compilation cache
|
|
||||||
programs = {
|
|
||||||
ccache.enable = true;
|
|
||||||
# TODO Not enough, see https://nixos.wiki/wiki/CCache.
|
|
||||||
# Might want to see if it's worth using on NixOS
|
|
||||||
gnupg.agent.enable = true;
|
|
||||||
|
|
||||||
# TODO Below should be user config
|
|
||||||
|
|
||||||
zsh = {
|
|
||||||
enable = true;
|
|
||||||
autosuggestions.enable = true;
|
|
||||||
enableCompletion = true;
|
|
||||||
syntaxHighlighting.enable = true;
|
|
||||||
};
|
|
||||||
neovim = {
|
|
||||||
enable = true;
|
|
||||||
defaultEditor = true;
|
|
||||||
vimAlias = true;
|
|
||||||
viAlias = true;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
services = {
|
|
||||||
# Enable the OpenSSH daemon
|
|
||||||
openssh.enable = true;
|
|
||||||
getty.autologinUser = "geoffrey"; # DEBUG
|
|
||||||
};
|
|
||||||
|
|
||||||
# TEST
|
|
||||||
system.copySystemConfiguration = true;
|
|
||||||
|
|
||||||
# Use defaults from
|
|
||||||
system.stateVersion = "23.05";
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,22 +0,0 @@
|
||||||
{ pkgs, ... }:
|
|
||||||
{
|
|
||||||
# Enable the X11 windowing system
|
|
||||||
services.xserver.enable = true;
|
|
||||||
|
|
||||||
# FIXME qwerty-fr for X11
|
|
||||||
|
|
||||||
# Enable sound
|
|
||||||
sound.enable = true;
|
|
||||||
hardware.pulseaudio.enable = true;
|
|
||||||
|
|
||||||
services.xserver.displayManager.startx.enable = true;
|
|
||||||
services.xserver.windowManager.i3.enable = true;
|
|
||||||
|
|
||||||
users.users.geoffrey. packages = with pkgs; [
|
|
||||||
# remote
|
|
||||||
tigervnc
|
|
||||||
|
|
||||||
# remote
|
|
||||||
firefox
|
|
||||||
];
|
|
||||||
}
|
|
|
@ -1,23 +0,0 @@
|
||||||
let
|
|
||||||
|
|
||||||
pkgs = import <nixpkgs> { };
|
|
||||||
# Somehow, if fed the pkgs from a nix-build, it creates an infinite recursion, hence the search path
|
|
||||||
lib = pkgs.lib;
|
|
||||||
|
|
||||||
recursiveMerge = with lib; attrList:
|
|
||||||
let f = attrPath:
|
|
||||||
zipAttrsWith (n: values:
|
|
||||||
if tail values == [ ]
|
|
||||||
then head values
|
|
||||||
else if all isList values
|
|
||||||
then unique (concatLists values)
|
|
||||||
else if all isAttrs values
|
|
||||||
then f (attrPath ++ [ n ]) values
|
|
||||||
else last values
|
|
||||||
);
|
|
||||||
in f [ ] attrList;
|
|
||||||
|
|
||||||
|
|
||||||
in
|
|
||||||
|
|
||||||
recursiveMerge
|
|
Loading…
Reference in a new issue