Compare commits
20 Commits
ae689d46b1
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| d20cba3e15 | |||
| 27f887b044 | |||
| c70a31b633 | |||
| 80434f1cfa | |||
| 658e35a145 | |||
| 06a4d1b923 | |||
| fe220c231a | |||
| e633da1e7c | |||
| 7823cfb683 | |||
| 0a385259a5 | |||
| cf77532254 | |||
| 7e2a813682 | |||
| 9bd29dcdd2 | |||
| 173c7261b3 | |||
| ee3ea63383 | |||
| d41ea98da0 | |||
| 77a4fdcc16 | |||
| 8810309515 | |||
| b6b18b2b94 | |||
| 2286452f5b |
@@ -2,4 +2,5 @@
|
|||||||
collections_path = collections
|
collections_path = collections
|
||||||
library = library
|
library = library
|
||||||
roles_path = roles
|
roles_path = roles
|
||||||
stdout_callback = yaml
|
callback_result_format = yaml
|
||||||
|
inject_facts_as_vars = True
|
||||||
|
|||||||
121
library/tuck.py
Normal file
121
library/tuck.py
Normal file
@@ -0,0 +1,121 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
import os
|
||||||
|
import subprocess
|
||||||
|
from os import environ
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
import requests
|
||||||
|
from ansible.module_utils.basic import AnsibleModule
|
||||||
|
|
||||||
|
DOCUMENTATION = """
|
||||||
|
module: tuck
|
||||||
|
author:
|
||||||
|
- Kenneth Benzie (Benie)
|
||||||
|
short_description: Ansible kmodule for the tuck tool
|
||||||
|
options:
|
||||||
|
name:
|
||||||
|
description:
|
||||||
|
- GitHub project name of the package to manage
|
||||||
|
type: str
|
||||||
|
state:
|
||||||
|
description:
|
||||||
|
- Desired state of the package
|
||||||
|
type: str
|
||||||
|
choices:
|
||||||
|
- "latest"
|
||||||
|
- "absent"
|
||||||
|
"""
|
||||||
|
|
||||||
|
EXAMPLES = """
|
||||||
|
- name: install package
|
||||||
|
tuck:
|
||||||
|
name: kbenzie/tuck
|
||||||
|
state: present
|
||||||
|
|
||||||
|
- name: uninstall package
|
||||||
|
tuck:
|
||||||
|
name: kbenzie/tuck
|
||||||
|
state: absent
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
def installed(tuck) -> list[str]:
|
||||||
|
result = subprocess.run(
|
||||||
|
[tuck, "list", "--quiet"],
|
||||||
|
capture_output=True,
|
||||||
|
check=True,
|
||||||
|
)
|
||||||
|
return result.stdout.decode("utf-8").split("\n")
|
||||||
|
|
||||||
|
|
||||||
|
def present(tuck: Path, package: str) -> dict:
|
||||||
|
if package in installed(tuck):
|
||||||
|
return dict(changed=False)
|
||||||
|
return latest(tuck, package)
|
||||||
|
|
||||||
|
|
||||||
|
def latest(tuck: Path, package: str) -> dict:
|
||||||
|
result = subprocess.run(
|
||||||
|
[tuck, "install", package],
|
||||||
|
capture_output=True,
|
||||||
|
check=True,
|
||||||
|
)
|
||||||
|
return dict(changed=True, stdout=result.stdout)
|
||||||
|
|
||||||
|
|
||||||
|
def absent(tuck: Path, package: str) -> dict:
|
||||||
|
if package not in installed(tuck):
|
||||||
|
return dict(changed=False)
|
||||||
|
result = subprocess.run(
|
||||||
|
[tuck, "remove", package],
|
||||||
|
capture_output=True,
|
||||||
|
check=True,
|
||||||
|
)
|
||||||
|
return dict(changed=True, stdout=result.stdout)
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
module = AnsibleModule(
|
||||||
|
argument_spec=dict(
|
||||||
|
name=dict(type="str"),
|
||||||
|
state=dict(
|
||||||
|
type="str",
|
||||||
|
choices=[
|
||||||
|
"absent",
|
||||||
|
"latest",
|
||||||
|
"present",
|
||||||
|
],
|
||||||
|
default="present",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
supports_check_mode=False,
|
||||||
|
)
|
||||||
|
|
||||||
|
tuck = Path(environ["HOME"]) / ".local" / "bin" / "tuck"
|
||||||
|
try:
|
||||||
|
if not (tuck.is_file() and os.access(tuck, os.X_OK)):
|
||||||
|
response = requests.get("https://kbenzie.github.io/tuck/get.sh")
|
||||||
|
response.raise_for_status()
|
||||||
|
subprocess.run(
|
||||||
|
["/bin/sh"],
|
||||||
|
input=response.text.encode("utf-8"),
|
||||||
|
check=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
module.exit_json(
|
||||||
|
**{
|
||||||
|
"absent": absent,
|
||||||
|
"present": present,
|
||||||
|
"latest": latest,
|
||||||
|
}[module.params["state"]](tuck, module.params["name"])
|
||||||
|
)
|
||||||
|
|
||||||
|
except requests.RequestException as error:
|
||||||
|
module.fail_json(f"failed to install tuck: {error}")
|
||||||
|
except subprocess.CalledProcessError as error:
|
||||||
|
module.fail_json(f"failed to install tuck: {error.stderr}")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
@@ -93,7 +93,7 @@ function Get-GitRemoteHeadBranch {
|
|||||||
$result = Run-Command -command $command -working_directory $dest
|
$result = Run-Command -command $command -working_directory $dest
|
||||||
if ($result.rc -ne 0) {
|
if ($result.rc -ne 0) {
|
||||||
$module.FailJson("Could not determine the default HEAD branch of remote: $remote" ` +
|
$module.FailJson("Could not determine the default HEAD branch of remote: $remote" ` +
|
||||||
"$result.stdout $result.stderr")
|
$result.stderr)
|
||||||
}
|
}
|
||||||
return $result.stdout.Trim().Replace("$remote/", '')
|
return $result.stdout.Trim().Replace("$remote/", '')
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,3 +13,5 @@
|
|||||||
when: "'GNOME' in ansible_env.XDG_CURRENT_DESKTOP"
|
when: "'GNOME' in ansible_env.XDG_CURRENT_DESKTOP"
|
||||||
- role: xremap
|
- role: xremap
|
||||||
when: "'GNOME' in ansible_env.XDG_CURRENT_DESKTOP"
|
when: "'GNOME' in ansible_env.XDG_CURRENT_DESKTOP"
|
||||||
|
- role: fedora-workstation
|
||||||
|
when: ansible_os_family == 'RedHat' and ansible_distribution == 'Fedora'
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
- vars/environment.yaml
|
- vars/environment.yaml
|
||||||
roles:
|
roles:
|
||||||
- role: gdb
|
- role: gdb
|
||||||
|
- role: nvtop
|
||||||
- role: podman
|
- role: podman
|
||||||
- role: system-info
|
- role: system-info
|
||||||
when: disable_systemd is not defined
|
when: disable_systemd is not defined
|
||||||
|
|||||||
@@ -30,6 +30,7 @@
|
|||||||
- role: ripgrep
|
- role: ripgrep
|
||||||
- role: tidy
|
- role: tidy
|
||||||
- role: tree
|
- role: tree
|
||||||
|
- role: typst
|
||||||
- role: watch
|
- role: watch
|
||||||
- role: wget
|
- role: wget
|
||||||
- role: yq
|
- role: yq
|
||||||
|
|||||||
@@ -20,6 +20,7 @@
|
|||||||
- role: jq
|
- role: jq
|
||||||
- role: ripgrep
|
- role: ripgrep
|
||||||
- role: tree
|
- role: tree
|
||||||
|
- role: typst
|
||||||
- role: yq
|
- role: yq
|
||||||
|
|
||||||
- role: llvm
|
- role: llvm
|
||||||
|
|||||||
12
playbooks/macOS-work.yaml
Normal file
12
playbooks/macOS-work.yaml
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
---
|
||||||
|
- import_playbook: UnixCLI.yaml
|
||||||
|
- hosts: localhost
|
||||||
|
vars_files:
|
||||||
|
- vars/environment.yaml
|
||||||
|
roles:
|
||||||
|
- role: system-info
|
||||||
|
- role: fonts
|
||||||
|
- role: iterm
|
||||||
|
- role: kitty
|
||||||
|
- role: neovide
|
||||||
|
- role: macos
|
||||||
@@ -16,7 +16,7 @@
|
|||||||
- role: iterm
|
- role: iterm
|
||||||
- role: kitty
|
- role: kitty
|
||||||
- role: neovide
|
- role: neovide
|
||||||
- role: magnet
|
- role: rectangle
|
||||||
- role: windows-app
|
- role: windows-app
|
||||||
- role: viscosity
|
- role: viscosity
|
||||||
|
|
||||||
|
|||||||
@@ -18,51 +18,27 @@
|
|||||||
icon: '{{app_exe}},0'
|
icon: '{{app_exe}},0'
|
||||||
|
|
||||||
# CLI
|
# CLI
|
||||||
|
- name: install scoop cli package
|
||||||
|
community.windows.win_scoop:
|
||||||
|
state: present
|
||||||
|
name: 1password-cli
|
||||||
|
|
||||||
- set_fact:
|
- set_fact:
|
||||||
cli_dir: '{{ansible_env.LOCALAPPDATA}}\1Password\cli'
|
cli_dir: '{{ansible_env.LOCALAPPDATA}}\1Password\cli'
|
||||||
cli_zip: '{{ansible_env.TEMP}}/op_windows_amd64.zip'
|
|
||||||
- set_fact:
|
|
||||||
cli_exe: '{{cli_dir}}\op.exe'
|
|
||||||
|
|
||||||
- name: check if op already installed
|
- name: create cli directory
|
||||||
win_stat:
|
win_file:
|
||||||
path: '{{cli_exe}}'
|
state: directory
|
||||||
register: cli_stat
|
path: '{{cli_dir}}'
|
||||||
|
|
||||||
- name: get installed op version
|
- name: remove old op executable
|
||||||
when: cli_stat.stat.exists == True
|
win_file:
|
||||||
win_command: '{{cli_exe}} --version'
|
state: absent
|
||||||
register: cli_version
|
path: '{{cli_dir}}\op.exe'
|
||||||
changed_when: false
|
|
||||||
|
|
||||||
- when: cli_stat.stat.exists == True
|
- name: remove old op install directory from user PATH
|
||||||
set_fact:
|
|
||||||
cli_installed_version: '{{cli_version.stdout.strip()}}'
|
|
||||||
|
|
||||||
- name: get list of op releases
|
|
||||||
win_uri:
|
|
||||||
url: https://raw.githubusercontent.com/kbenzie/op-release-scraper/main/op-releases.json
|
|
||||||
return_content: true
|
|
||||||
register: releases
|
|
||||||
|
|
||||||
- set_fact:
|
|
||||||
latest: '{{releases.json[0]}}'
|
|
||||||
|
|
||||||
- name: download latest op zip archive
|
|
||||||
when: cli_installed_version is not defined or cli_installed_version != latest.version
|
|
||||||
win_get_url:
|
|
||||||
url: '{{latest.downloads.Windows.amd64}}'
|
|
||||||
dest: '{{cli_zip}}'
|
|
||||||
environment: '{{proxy_environment}}'
|
|
||||||
|
|
||||||
- name: unzip op zip archive
|
|
||||||
when: cli_installed_version is not defined or cli_installed_version != latest.version
|
|
||||||
win_unzip:
|
|
||||||
src: '{{cli_zip}}'
|
|
||||||
dest: '{{cli_dir}}'
|
|
||||||
|
|
||||||
- name: add op install directory to user PATH
|
|
||||||
win_path:
|
win_path:
|
||||||
|
state: absent
|
||||||
scope: user
|
scope: user
|
||||||
name: Path
|
name: Path
|
||||||
elements: '{{cli_dir}}'
|
elements: '{{cli_dir}}'
|
||||||
@@ -70,7 +46,7 @@
|
|||||||
- name: get op powershell completion script
|
- name: get op powershell completion script
|
||||||
win_command:
|
win_command:
|
||||||
argv:
|
argv:
|
||||||
- '{{ansible_env.LOCALAPPDATA}}/1Password/cli/op.exe'
|
- '{{ansible_env.LOCALAPPDATA}}\Scoop\shims\op.exe'
|
||||||
- completion
|
- completion
|
||||||
- powershell
|
- powershell
|
||||||
register: powershell_completion_script
|
register: powershell_completion_script
|
||||||
|
|||||||
16
roles/fedora-workstation/tasks/main.yaml
Normal file
16
roles/fedora-workstation/tasks/main.yaml
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
---
|
||||||
|
- assert:
|
||||||
|
that: ansible_os_family == 'RedHat' and ansible_distribution == 'Fedora'
|
||||||
|
|
||||||
|
- name: install non-free gstreamer plugins
|
||||||
|
become: true
|
||||||
|
dnf:
|
||||||
|
state: latest
|
||||||
|
allowerasing: true
|
||||||
|
name:
|
||||||
|
- ffmpeg
|
||||||
|
- gstreamer1-plugins-bad-free
|
||||||
|
- gstreamer1-plugins-bad-freeworld
|
||||||
|
- gstreamer1-plugins-base
|
||||||
|
- gstreamer1-plugins-good
|
||||||
|
- gstreamer1-plugins-ugly
|
||||||
14
roles/gemini-cli/tasks/main.yaml
Normal file
14
roles/gemini-cli/tasks/main.yaml
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
---
|
||||||
|
- name: install homebrew package
|
||||||
|
when: ansible_os_family == 'Darwin'
|
||||||
|
homebrew:
|
||||||
|
state: latest
|
||||||
|
name: gemini-cli
|
||||||
|
|
||||||
|
- name: install npm package
|
||||||
|
when: ansible_os_family != 'Darwin'
|
||||||
|
become: true
|
||||||
|
community.general.npm:
|
||||||
|
name: '@google/gemini-cli'
|
||||||
|
state: latest
|
||||||
|
global: true
|
||||||
@@ -33,6 +33,8 @@
|
|||||||
key: switch-input-source-backward
|
key: switch-input-source-backward
|
||||||
value: '@as []'
|
value: '@as []'
|
||||||
|
|
||||||
|
# TODO: window full screen toggle keybinding
|
||||||
|
|
||||||
# NOTE: Use this command to see default keybindings
|
# NOTE: Use this command to see default keybindings
|
||||||
# gsettings list-recursively | grep -i -E 'media-keys|keybindings'
|
# gsettings list-recursively | grep -i -E 'media-keys|keybindings'
|
||||||
# NOTE: Use this command to inspect the current state of the custom keybindings
|
# NOTE: Use this command to inspect the current state of the custom keybindings
|
||||||
|
|||||||
29
roles/hammerspoon/tasks/main.yaml
Normal file
29
roles/hammerspoon/tasks/main.yaml
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
---
|
||||||
|
- set_fact:
|
||||||
|
config_dir: '{{ansible_env.HOME}}/.hammerspoon'
|
||||||
|
|
||||||
|
- name: create config directory
|
||||||
|
file:
|
||||||
|
state: directory
|
||||||
|
path: '{{config_dir}}'
|
||||||
|
|
||||||
|
- name: install config file
|
||||||
|
template:
|
||||||
|
src: init.lua
|
||||||
|
dest: '{{config_dir}}/init.lua'
|
||||||
|
|
||||||
|
- name: install homebrew package
|
||||||
|
homebrew:
|
||||||
|
state: latest
|
||||||
|
name: hammerspoon
|
||||||
|
|
||||||
|
- name: create spoons directory
|
||||||
|
file:
|
||||||
|
state: directory
|
||||||
|
path: '{{config_dir}}/Spoons'
|
||||||
|
|
||||||
|
- name: install SpoonInstall Spoon
|
||||||
|
unarchive:
|
||||||
|
src: https://github.com/Hammerspoon/Spoons/raw/master/Spoons/SpoonInstall.spoon.zip
|
||||||
|
dest: '{{config_dir}}/Spoons'
|
||||||
|
remote_src: yes
|
||||||
20
roles/hammerspoon/templates/init.lua
Normal file
20
roles/hammerspoon/templates/init.lua
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
require('hs.ipc')
|
||||||
|
|
||||||
|
hs.loadSpoon("SpoonInstall")
|
||||||
|
spoon.SpoonInstall:andUse("EmmyLua")
|
||||||
|
|
||||||
|
hs.hotkey.bind({'alt', 'cmd'}, 'B', function()
|
||||||
|
hs.application.launchOrFocus('Firefox')
|
||||||
|
end)
|
||||||
|
|
||||||
|
hs.hotkey.bind({'alt', 'cmd'}, 'T', function()
|
||||||
|
hs.application.launchOrFocus('kitty')
|
||||||
|
end)
|
||||||
|
|
||||||
|
hs.hotkey.bind({'alt', 'cmd'}, 'F', function()
|
||||||
|
hs.application.launchOrFocus('Ferdium')
|
||||||
|
end)
|
||||||
|
|
||||||
|
pcall(function()
|
||||||
|
require('local')
|
||||||
|
end)
|
||||||
@@ -7,3 +7,5 @@
|
|||||||
domain: com.apple.desktopservices
|
domain: com.apple.desktopservices
|
||||||
key: DSDontWriteNetworkStores
|
key: DSDontWriteNetworkStores
|
||||||
value: 'true'
|
value: 'true'
|
||||||
|
|
||||||
|
# TODO: ^Space Keyboard Shortcut for switching Input Sources
|
||||||
|
|||||||
@@ -26,4 +26,4 @@
|
|||||||
state: link
|
state: link
|
||||||
src: '~/.local/src/node/node-{{latest.json[0].version}}-linux-x64/bin/{{item}}'
|
src: '~/.local/src/node/node-{{latest.json[0].version}}-linux-x64/bin/{{item}}'
|
||||||
dest: '~/.local/bin/{{item}}'
|
dest: '~/.local/bin/{{item}}'
|
||||||
with_items: [corepack, node, npm, npx]
|
with_items: [node, npm, npx]
|
||||||
|
|||||||
40
roles/nvtop/tasks/install-appimage.yaml
Normal file
40
roles/nvtop/tasks/install-appimage.yaml
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
---
|
||||||
|
- name: get latest github release
|
||||||
|
uri:
|
||||||
|
url: https://api.github.com/repos/Syllo/nvtop/releases/latest
|
||||||
|
headers: '{{github_auth_headers}}'
|
||||||
|
register: latest
|
||||||
|
|
||||||
|
- set_fact:
|
||||||
|
asset_query: '[?contains(name, `x86_64.AppImage`)] | [0]'
|
||||||
|
assets: '{{latest.json.assets}}'
|
||||||
|
latest_version: '{{latest.json.tag_name}}'
|
||||||
|
nvtop_exe: '/usr/local/bin/nvtop'
|
||||||
|
|
||||||
|
- name: check if already installed
|
||||||
|
stat:
|
||||||
|
path: '{{nvtop_exe}}'
|
||||||
|
register: nvtop_stat
|
||||||
|
|
||||||
|
- name: get installed version
|
||||||
|
when: nvtop_stat.stat.exists == True
|
||||||
|
command: '{{nvtop_exe}} --version'
|
||||||
|
register: nvtop_version_output
|
||||||
|
changed_when: false
|
||||||
|
|
||||||
|
- when: nvtop_stat.stat.exists == True
|
||||||
|
set_fact:
|
||||||
|
installed_version:
|
||||||
|
'{{nvtop_version_output.stdout.strip() | regex_replace("^.*(\d+\.\d+\.\d+).*$", "\1")}}'
|
||||||
|
|
||||||
|
- set_fact:
|
||||||
|
asset: '{{assets | to_json | from_json | json_query(asset_query)}}'
|
||||||
|
|
||||||
|
- name: download executable
|
||||||
|
when: installed_version is not defined or installed_version != latest_version
|
||||||
|
become: true
|
||||||
|
get_url:
|
||||||
|
url: '{{asset.browser_download_url}}'
|
||||||
|
dest: '{{nvtop_exe}}'
|
||||||
|
mode: +x
|
||||||
|
environment: '{{proxy_environment}}'
|
||||||
10
roles/nvtop/tasks/main.yaml
Normal file
10
roles/nvtop/tasks/main.yaml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
---
|
||||||
|
- name: install dnf package
|
||||||
|
when: ansible_os_family == 'RedHat'
|
||||||
|
become: true
|
||||||
|
dnf:
|
||||||
|
state: latest
|
||||||
|
name: nvtop
|
||||||
|
|
||||||
|
- when: ansible_os_family != 'RedHat'
|
||||||
|
include_tasks: install-appimage.yaml
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
- assert:
|
- assert:
|
||||||
that: ansible_os_family == 'Darwin'
|
that: ansible_os_family == 'Darwin'
|
||||||
|
|
||||||
- name: install app store package
|
- name: install homebrew package
|
||||||
mas:
|
homebrew_cask:
|
||||||
id: 441258766
|
name: rectangle
|
||||||
state: latest
|
state: latest
|
||||||
@@ -1,14 +1,34 @@
|
|||||||
---
|
---
|
||||||
|
- name: install gawk package
|
||||||
|
homebrew:
|
||||||
|
name: gawk
|
||||||
|
state: latest
|
||||||
|
|
||||||
|
- name: install iSMC package
|
||||||
|
tuck:
|
||||||
|
name: dkorunic/iSMC
|
||||||
|
state: latest
|
||||||
|
|
||||||
- name: get list of running launchd services
|
- name: get list of running launchd services
|
||||||
command: launchctl list
|
command: launchctl list
|
||||||
register: launchd_running_services
|
register: launchd_running_services
|
||||||
changed_when: false
|
changed_when: false
|
||||||
|
|
||||||
|
- set_fact:
|
||||||
|
system_info_plist_dir: '{{ansible_env.HOME}}/Library/LaunchAgents'
|
||||||
|
|
||||||
|
- name: create plist directory
|
||||||
|
file:
|
||||||
|
state: directory
|
||||||
|
path: '{{system_info_plist_dir}}'
|
||||||
|
|
||||||
- name: determine if system-info is currently running
|
- name: determine if system-info is currently running
|
||||||
set_fact:
|
set_fact:
|
||||||
system_info_debug: true
|
system_info_debug: true
|
||||||
system_info_plist_path: '{{ansible_env.HOME}}/Library/LaunchAgents/system-info.plist'
|
system_info_plist_path:
|
||||||
system_info_running: "{{'system-info' in launchd_running_services.stdout}}"
|
'{{system_info_plist_dir}}/system-info.plist'
|
||||||
|
system_info_running:
|
||||||
|
"{{'system-info' in launchd_running_services.stdout}}"
|
||||||
|
|
||||||
- name: install system-info launchd plist
|
- name: install system-info launchd plist
|
||||||
template:
|
template:
|
||||||
|
|||||||
76
roles/typst/tasks/Linux.yaml
Normal file
76
roles/typst/tasks/Linux.yaml
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
---
|
||||||
|
- name: get latest github release
|
||||||
|
uri:
|
||||||
|
url: https://api.github.com/repos/typst/typst/releases/latest
|
||||||
|
headers: '{{github_auth_headers}}'
|
||||||
|
register: latest
|
||||||
|
|
||||||
|
- set_fact:
|
||||||
|
asset_name: >-
|
||||||
|
{{
|
||||||
|
{
|
||||||
|
'amd64': 'typst-x86_64-unknown-linux-musl',
|
||||||
|
'x86_64': 'typst-x86_64-unknown-linux-musl',
|
||||||
|
'arm64': 'typst-aarch64-unknown-linux-musl',
|
||||||
|
}[ansible_architecture]
|
||||||
|
}}
|
||||||
|
|
||||||
|
- set_fact:
|
||||||
|
asset_query: '[?contains(name, `{{asset_name}}.tar.xz`)] | [0]'
|
||||||
|
assets: '{{latest.json.assets}}'
|
||||||
|
asset_archive: '{{asset_name}}.tar.xz'
|
||||||
|
latest_version: '{{latest.json.tag_name}}'
|
||||||
|
exe: '{{ansible_env.HOME}}/.local/bin/typst'
|
||||||
|
|
||||||
|
- name: check if already installed
|
||||||
|
stat:
|
||||||
|
path: '{{exe}}'
|
||||||
|
register: stat_exe
|
||||||
|
|
||||||
|
- name: get installed version
|
||||||
|
when: stat_exe.stat.exists == True
|
||||||
|
command: '{{exe}} --version'
|
||||||
|
register: version_output
|
||||||
|
changed_when: false
|
||||||
|
|
||||||
|
- when: stat_exe.stat.exists == True
|
||||||
|
set_fact:
|
||||||
|
installed_version:
|
||||||
|
'v{{version_output.stdout.strip() | regex_replace("^.*(\d+\.\d+\.\d+).*$", "\1")}}'
|
||||||
|
|
||||||
|
- set_fact:
|
||||||
|
asset: '{{assets | to_json | from_json | json_query(asset_query)}}'
|
||||||
|
|
||||||
|
- name: download archive
|
||||||
|
when: installed_version is not defined or installed_version != latest_version
|
||||||
|
get_url:
|
||||||
|
url: '{{asset.browser_download_url}}'
|
||||||
|
dest: '/tmp/{{asset_archive}}'
|
||||||
|
environment: '{{proxy_environment}}'
|
||||||
|
|
||||||
|
- name: extract archive
|
||||||
|
when: installed_version is not defined or installed_version != latest_version
|
||||||
|
unarchive:
|
||||||
|
src: '/tmp/{{asset_archive}}'
|
||||||
|
dest: '/tmp'
|
||||||
|
|
||||||
|
- name: remove archive
|
||||||
|
when: installed_version is not defined or installed_version != latest_version
|
||||||
|
file:
|
||||||
|
state: absent
|
||||||
|
path: '/tmp/{{asset_archive}}'
|
||||||
|
|
||||||
|
- name: copy executable
|
||||||
|
when: installed_version is not defined or installed_version != latest_version
|
||||||
|
copy:
|
||||||
|
src: '/tmp/{{asset_name}}/typst'
|
||||||
|
dest: '{{exe}}'
|
||||||
|
mode: +x
|
||||||
|
|
||||||
|
- name: remove extraced archive
|
||||||
|
when: installed_version is not defined or installed_version != latest_version
|
||||||
|
file:
|
||||||
|
state: absent
|
||||||
|
path: '/tmp/{{asset_archive}}'
|
||||||
|
|
||||||
|
# TODO: install zsh completions
|
||||||
15
roles/typst/tasks/main.yaml
Normal file
15
roles/typst/tasks/main.yaml
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
---
|
||||||
|
- name: install homebrew package
|
||||||
|
when: ansible_os_family == 'Darwin'
|
||||||
|
homebrew:
|
||||||
|
state: latest
|
||||||
|
name: typst
|
||||||
|
|
||||||
|
- name: install scoop package
|
||||||
|
when: ansible_os_family == 'Windows'
|
||||||
|
community.windows.win_scoop:
|
||||||
|
state: present
|
||||||
|
name: typst
|
||||||
|
|
||||||
|
- when: ansible_os_family != 'Darwin' and ansible_os_family != 'Windows'
|
||||||
|
include_tasks: Linux.yaml
|
||||||
Reference in New Issue
Block a user