Compare commits

..

1 Commits

Author SHA1 Message Date
AJ ONeal
1750b92932 feat: add beyond-shell (for Workshops) 2023-03-07 11:26:15 +00:00
258 changed files with 2065 additions and 8659 deletions

View File

@@ -1,32 +0,0 @@
name: Node.js CI
on:
push:
branches: ['main']
pull_request:
jobs:
build:
name: "Fmt, Lint, & Test"
runs-on: ubuntu-latest
strategy:
matrix:
node-version:
- 20.x
- latest
steps:
- uses: actions/checkout@v3
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
- name: "Webi: Install 'shfmt' and 'shellcheck', and update PATH"
run: |
sh ./_scripts/install-ci-deps
echo "${HOME}/.local/bin" >> $GITHUB_PATH
echo "${HOME}/.local/opt/pwsh" >> $GITHUB_PATH
- run: shfmt --version
- run: shellcheck -V
- run: node --version
- run: npm run fmt
- run: npm ci
- run: npm run lint
- run: npm run test

View File

@@ -1 +0,0 @@
DELETEMEnode_modules/**/*

View File

@@ -1,4 +0,0 @@
node_modules
jsconfig.json
package.json
package-lock.json

View File

@@ -1,9 +1,6 @@
{ {
"bracketSpacing": true,
"printWidth": 80,
"proseWrap": "always",
"singleQuote": true,
"tabWidth": 2,
"trailingComma": "all", "trailingComma": "all",
"semi": true "tabWidth": 2,
"singleQuote": true,
"proseWrap": "always"
} }

6
.vimrc
View File

@@ -1,6 +0,0 @@
" Note: You must enable per-project .vimrc in your ~/.vimrc
" set secure
" set exrc
" PowerShell settings
let g:ale_powershell_psscriptanalyzer_exclusions = "PSAvoidUsingWriteHost,PSUseDeclaredVarsMoreThanAssignments"

View File

@@ -15,11 +15,11 @@ function getAllReleases(request, owner, repo, baseurl) {
if (!baseurl) { if (!baseurl) {
return Promise.reject('missing baseurl'); return Promise.reject('missing baseurl');
} }
return ghRelease(request, owner, repo, baseurl + '/api/v1').then( return ghRelease(request, owner, repo, baseurl + '/api/v1').then(function (
function (all) { all,
return all; ) {
}, return all;
); });
} }
module.exports = getAllReleases; module.exports = getAllReleases;

View File

@@ -15,45 +15,47 @@ $pkg_src_bin = "$Env:USERPROFILE\.local\opt\foobar-v$Env:WEBI_VERSION\bin"
$pkg_src_dir = "$Env:USERPROFILE\.local\opt\foobar-v$Env:WEBI_VERSION" $pkg_src_dir = "$Env:USERPROFILE\.local\opt\foobar-v$Env:WEBI_VERSION"
$pkg_src = "$pkg_src_cmd" $pkg_src = "$pkg_src_cmd"
New-Item "$Env:USERPROFILE\Downloads\webi" -ItemType Directory -Force | Out-Null New-Item "$Env:USERPROFILE\Downloads\webi" -ItemType Directory -Force | out-null
$pkg_download = "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE" $pkg_download = "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE"
# Fetch archive # Fetch archive
IF (!(Test-Path -Path "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE")) { IF (!(Test-Path -Path "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE"))
Write-Output "Downloading foobar from $Env:WEBI_PKG_URL to $pkg_download" {
echo "Downloading foobar from $Env:WEBI_PKG_URL to $pkg_download"
& curl.exe -A "$Env:WEBI_UA" -fsSL "$Env:WEBI_PKG_URL" -o "$pkg_download.part" & curl.exe -A "$Env:WEBI_UA" -fsSL "$Env:WEBI_PKG_URL" -o "$pkg_download.part"
& Move-Item "$pkg_download.part" "$pkg_download" & move "$pkg_download.part" "$pkg_download"
} }
IF (!(Test-Path -Path "$pkg_src_cmd")) { IF (!(Test-Path -Path "$pkg_src_cmd"))
Write-Output "Installing foobar" {
echo "Installing foobar"
# TODO: create package-specific temp directory # TODO: create package-specific temp directory
# Enter tmp # Enter tmp
Push-Location .local\tmp pushd .local\tmp
# Remove any leftover tmp cruft # Remove any leftover tmp cruft
Remove-Item -Path ".\foobar-v*" -Recurse -ErrorAction Ignore Remove-Item -Path ".\foobar-v*" -Recurse -ErrorAction Ignore
Remove-Item -Path ".\foo.exe" -Recurse -ErrorAction Ignore Remove-Item -Path ".\foo.exe" -Recurse -ErrorAction Ignore
# NOTE: DELETE THIS COMMENT IF NOT USED # NOTE: DELETE THIS COMMENT IF NOT USED
# Move single binary into root of temporary folder # Move single binary into root of temporary folder
#& move "$pkg_download" "foo.exe" #& move "$pkg_download" "foo.exe"
# Unpack archive file into this temporary directory # Unpack archive file into this temporary directory
# Windows BSD-tar handles zip. Imagine that. # Windows BSD-tar handles zip. Imagine that.
Write-Output "Unpacking $pkg_download" echo "Unpacking $pkg_download"
& tar xf "$pkg_download" & tar xf "$pkg_download"
# Settle unpacked archive into place # Settle unpacked archive into place
Write-Output "Install Location: $pkg_src_cmd" echo "Install Location: $pkg_src_cmd"
New-Item "$pkg_src_bin" -ItemType Directory -Force | Out-Null New-Item "$pkg_src_bin" -ItemType Directory -Force | out-null
Move-Item -Path ".\foobar-*\foo.exe" -Destination "$pkg_src_bin" Move-Item -Path ".\foobar-*\foo.exe" -Destination "$pkg_src_bin"
# Exit tmp # Exit tmp
Pop-Location popd
} }
Write-Output "Copying into '$pkg_dst_cmd' from '$pkg_src_cmd'" echo "Copying into '$pkg_dst_cmd' from '$pkg_src_cmd'"
Remove-Item -Path "$pkg_dst_cmd" -Recurse -ErrorAction Ignore | Out-Null Remove-Item -Path "$pkg_dst_cmd" -Recurse -ErrorAction Ignore | out-null
Copy-Item -Path "$pkg_src" -Destination "$pkg_dst" -Recurse Copy-Item -Path "$pkg_src" -Destination "$pkg_dst" -Recurse

View File

@@ -1,6 +1,9 @@
'use strict'; 'use strict';
var pkg = require('../package.json');
var spawn = require('child_process').spawn; var spawn = require('child_process').spawn;
var os = require('os');
var path = require('path');
function spawner(args) { function spawner(args) {
return new Promise(function (resolve, reject) { return new Promise(function (resolve, reject) {

View File

@@ -1,57 +0,0 @@
#!/usr/bin/env node
'use strict';
var Fs = require('node:fs/promises');
var Path = require('node:path');
async function copyScripts() {
var pkgDir = Path.join(__dirname, '..');
var scriptsDir = Path.join(pkgDir, '_scripts');
var gitFile = Path.join(pkgDir, '.git');
// if this is a submodule, '.git' will be a file with a
// path to the actual git module directory
var gitDir = await Fs.readFile(gitFile, 'utf8')
.catch(function (e) {
// console.error(e);
//return 'gitdir: ../.git/modules/installers';
return 'gitdir: ./.git';
})
.then(function (str) {
var parts = str.split(': ');
str = parts[1];
str = str.trim();
return Path.resolve(pkgDir, str);
});
var gitHooksDir = Path.join(gitDir, 'hooks');
var src = Path.join(scriptsDir, 'git-hooks-pre-commit.js');
var dst = Path.join(gitHooksDir, 'pre-commit');
console.info(`[git-hooks] Checking for pre-commit hooks...`);
var relSrc = Path.relative(pkgDir, src);
var relDst = Path.relative(pkgDir, dst);
await Fs.access(dst)
.then(function () {
console.info(`[git-hooks] Found ${relDst}`);
})
.catch(async function (e) {
// ignore e
await Fs.mkdir(gitHooksDir, { recursive: true });
await Fs.copyFile(src, dst);
await Fs.chmod(dst, 0o755);
console.info(`[git-hooks] Found template ${relSrc}`);
console.info(`[git-hooks] Initialized ${relDst}`);
});
}
copyScripts()
.then(function () {
process.exit(0);
})
.catch(function (e) {
console.error(e);
process.exit(1);
});

View File

@@ -1,7 +0,0 @@
#!/bin/sh
set -e
set -u
npm run fmt
npm run lint
npm run test

View File

@@ -1,12 +0,0 @@
#!/usr/bin/env node
'use strict';
var Process = require('child_process');
var procOpts = { stdio: 'inherit' };
var commands = ['npm run fmt', 'npm run lint', 'npm run test'];
for (let cmd of commands) {
console.info(`[pre-commit] exec: ${cmd}`);
Process.execSync(cmd, procOpts);
}

View File

@@ -1,15 +0,0 @@
#!/bin/sh
set -e
set -u
# Install 'shfmt 3.7.x'
curl -fsS https://webi.sh/shfmt@3.7 | sh
# Install 'shellcheck v0.9.x'
curl -fsS https://webi.sh/shellcheck@0.9 | sh
# Install 'pwsh (PowerShell Core) v7.x'
curl -fsS https://webi.sh/pwsh@7 | sh
# shellcheck disable=SC1090
. ~/.config/envman/PATH.env
pwsh -Command "Install-Module -Name PSScriptAnalyzer -Scope CurrentUser -AllowClobber"

View File

@@ -1,27 +0,0 @@
#!/bin/sh
set -e
set -u
echo "Formatting */*.ps1 ... "
for my_ps1 in */*.ps1; do
my_dir="$(
dirname "${my_ps1}"
)"
if test -L "${my_ps1}" ||
test -L "${my_dir}" ||
! test -f "${my_ps1}" ||
! test -d "${my_dir}"; then
printf ' SKIP %s (non-regular file or parent directory)\n' "${my_ps1}"
continue
fi
printf " %s" "${my_ps1}"
# -Settings ./Settings/CodeFormatting.psd1
my_new_file="$(
pwsh -Command "Invoke-Formatter -ScriptDefinition (Get-Content -Path '${my_ps1}' -Raw)"
)"
printf '%s\n' "${my_new_file}" > "${my_ps1}"
printf '\n'
done

View File

@@ -1,40 +0,0 @@
#!/usr/bin/env pwsh
$ErrorActionPreference = "Stop"
Write-Host "Formatting */*.ps1 ... "
$my_cwd = Get-Location
$my_dirs = Get-ChildItem -Directory
$my_status = 0
foreach ($my_dir in $my_dirs) {
$my_files = Get-ChildItem -Path $my_dir.FullName -File -Filter *.ps1
foreach ($my_file in $my_files) {
$my_ps1 = [System.IO.Path]::GetRelativePath($my_cwd, $my_file.FullName)
$my_dir = [System.IO.Path]::GetDirectoryName($my_file.FullName)
if (-Not (Test-Path -PathType Leaf -Path $my_ps1) -or
-Not (Test-Path -PathType Container -Path $my_dir)) {
Write-Host (" SKIP {0} (non-regular file or parent directory)" -f $my_ps1)
continue
}
Write-Host (" {0}" -f $my_ps1)
$text = Get-Content -Path $my_ps1 -Raw
$my_new_file = Invoke-Formatter -ScriptDefinition $text
$my_new_file = $my_new_file.Trim()
# note: trailing newline is added back on write
$my_new_file | Set-Content -Path $my_ps1
$my_new_file = $my_new_file + "`n"
IF ($text -ne $my_new_file) {
$my_status = 1
}
}
}
exit $my_status

View File

@@ -1,36 +0,0 @@
#!/bin/sh
set -e
set -u
echo "Formatting */*.ps1 ..."
for my_ps1 in */*.ps1; do
my_dir="$(
dirname "${my_ps1}"
)"
if test -L "${my_ps1}" ||
test -L "${my_dir}" ||
! test -f "${my_ps1}" ||
! test -d "${my_dir}"; then
printf ' SKIP %s (non-regular file or parent directory)\n' "${my_ps1}"
continue
fi
printf " %s" "${my_ps1}"
# -Settings ./PSScriptAnalyzerSettings.psd1
pwsh -Command "Invoke-ScriptAnalyzer -Fix -ExcludeRule PSAvoidUsingWriteHost,PSUseDeclaredVarsMoreThanAssignment -Path '$my_ps1'"
#
# fmt MUST happen after lint due to Byte-Order Marker (BOM) issues
# See https://github.com/PowerShell/PSScriptAnalyzer/issues/1743
#
# -Settings ./Settings/CodeFormatting.psd1
my_new_file="$(
pwsh -Command "Invoke-Formatter -ScriptDefinition (Get-Content -Path '${my_ps1}' -Raw)"
)"
printf '%s\n' "${my_new_file}" > "${my_ps1}"
printf '\n'
done

View File

@@ -1,48 +0,0 @@
#!/usr/bin/env pwsh
$ErrorActionPreference = "Stop"
Write-Host "Linting */*.ps1 ... "
$my_cwd = Get-Location
$my_dirs = Get-ChildItem -Directory
$my_status = 0
foreach ($my_dir in $my_dirs) {
$my_files = Get-ChildItem -Path $my_dir.FullName -File -Filter *.ps1
foreach ($my_file in $my_files) {
$my_ps1 = [System.IO.Path]::GetRelativePath($my_cwd, $my_file.FullName)
$my_dir = [System.IO.Path]::GetDirectoryName($my_file.FullName)
if (-Not (Test-Path -PathType Leaf -Path $my_ps1) -or
-Not (Test-Path -PathType Container -Path $my_dir)) {
Write-Host (" SKIP {0} (non-regular file or parent directory)" -f $my_ps1)
continue
}
Write-Host (" {0}" -f $my_ps1)
$my_old_file = (Get-Content -Path $my_ps1 -Raw)
Invoke-ScriptAnalyzer -Fix -ExcludeRule PSAvoidUsingWriteHost, PSUseDeclaredVarsMoreThanAssignment -Path $my_ps1
#
# fmt MUST happen after lint due to Byte-Order Marker (BOM) issues
# See https://github.com/PowerShell/PSScriptAnalyzer/issues/1743
#
$my_fixed_file = (Get-Content -Path $my_ps1 -Raw)
$my_new_file = Invoke-Formatter -ScriptDefinition $my_fixed_file
$my_new_file = $my_new_file.Trim()
# note: trailing newline is added back on write
$my_new_file | Set-Content -Path $my_ps1
$my_new_file = $my_new_file + "`n"
IF ($my_old_file -ne $my_new_file) {
$my_status = 1
}
}
}
exit $my_status

View File

@@ -1,32 +0,0 @@
#!/usr/bin/env node
'use strict';
var Cmd = require('node:child_process');
var Os = require('node:os');
var procOpts = { stdio: 'inherit' };
var commands = ['shfmt --version', 'shellcheck --version'];
for (let cmd of commands) {
console.info(`[tooling-init] checking for '${cmd}':`);
try {
Cmd.execSync(cmd, procOpts);
} catch (e) {
// ignore e
printInstallHelp(cmd);
process.exit(1);
}
}
function printInstallHelp(cmd) {
console.error('');
console.error('ERROR');
console.error(` could not run '${cmd}'`);
console.error('POSSIBLE FIX');
if (/^win/i.test(Os.platform())) {
console.error(` curl.exe https://webi.ms/${cmd} | powershell`);
} else {
console.error(` curl -fsS https://webi.sh/${cmd} | sh`);
}
console.error('');
}

View File

@@ -1,7 +1,7 @@
#!/usr/bin/env pwsh #!/usr/bin/env pwsh
IF (!(Test-Path -Path "$Env:USERPROFILE\.vim\pack\plugins\start")) { IF (!(Test-Path -Path "$Env:USERPROFILE\.vim\pack\plugins\start")) {
New-Item -Path "$Env:USERPROFILE\.vim\pack\plugins\start" -ItemType Directory -Force | Out-Null New-Item -Path "$Env:USERPROFILE\.vim\pack\plugins\start" -ItemType Directory -Force | out-null
} }
Remove-Item -Path "$Env:USERPROFILE\.vim\pack\plugins\start\example" -Recurse -ErrorAction Ignore Remove-Item -Path "$Env:USERPROFILE\.vim\pack\plugins\start\example" -Recurse -ErrorAction Ignore
& git clone --depth=1 https://github.com/CHANGEME/example.git "$Env:USERPROFILE\.vim\pack\plugins\start\example" & git clone --depth=1 https://github.com/CHANGEME/example.git "$Env:USERPROFILE\.vim\pack\plugins\start\example"

View File

@@ -4,9 +4,9 @@
# <h1>Cheat Sheet at CHEATSHEET_URL</h1> # <h1>Cheat Sheet at CHEATSHEET_URL</h1>
# <meta http-equiv="refresh" content="3; URL='CHEATSHEET_URL'" /> # <meta http-equiv="refresh" content="3; URL='CHEATSHEET_URL'" />
############################################################ ############################################################
New-Item -Path "$Env:USERPROFILE\Downloads\webi" -ItemType Directory -Force | Out-Null New-Item -Path "$Env:USERPROFILE\Downloads\webi" -ItemType Directory -Force | out-null
New-Item -Path "$Env:USERPROFILE\.local\bin" -ItemType Directory -Force | Out-Null New-Item -Path "$Env:USERPROFILE\.local\bin" -ItemType Directory -Force | out-null
IF ($null -eq $Env:WEBI_HOST -or $Env:WEBI_HOST -eq "") { $Env:WEBI_HOST = "https://webinstall.dev" } IF ($Env:WEBI_HOST -eq $null -or $Env:WEBI_HOST -eq "") { $Env:WEBI_HOST = "https://webinstall.dev" }
curl.exe -s -A "windows" "$Env:WEBI_HOST/packages/_webi/webi-pwsh.ps1" -o "$Env:USERPROFILE\.local\bin\webi-pwsh.ps1" curl.exe -s -A "windows" "$Env:WEBI_HOST/packages/_webi/webi-pwsh.ps1" -o "$Env:USERPROFILE\.local\bin\webi-pwsh.ps1"
Set-ExecutionPolicy -Scope Process Bypass Set-ExecutionPolicy -Scope Process Bypass
& "$Env:USERPROFILE\.local\bin\webi-pwsh.ps1" "{{ exename }}" & "$Env:USERPROFILE\.local\bin\webi-pwsh.ps1" "{{ exename }}"

View File

@@ -15,12 +15,12 @@ __install_webi() {
export WEBI_HOST export WEBI_HOST
echo "" echo ""
printf "Thanks for using webi to install '\e[32m%s\e[0m' on '\e[33m%s/%s\e[0m'.\n" "${WEBI_PKG-}" "$(uname -s)/$(uname -r)" "$(uname -m)" printf "Thanks for using webi to install '\e[32m%s\e[0m' on '\e[31m%s/%s\e[0m'.\n" "${WEBI_PKG-}" "$(uname -s)/$(uname -r)" "$(uname -m)"
echo "Have a problem? Experience a bug? Please let us know:" echo "Have a problem? Experience a bug? Please let us know:"
printf " \e[2m\e[36mhttps://github.com/webinstall/webi-installers/issues\e[0m\n" echo " https://github.com/webinstall/webi-installers/issues"
echo "" echo ""
printf "\e[35mLovin'\e[0m it? Say thanks with a \e[1m\e[33mStar on GitHub\e[0m:\n" printf "\e[31mLovin'\e[0m it? Say thanks with a \e[34mStar on GitHub\e[0m:\n"
printf " \e[36mhttps://github.com/webinstall/webi-installers\e[0m\n" printf " \e[32mhttps://github.com/webinstall/webi-installers\e[0m\n"
echo "" echo ""
WEBI_WELCOME=true WEBI_WELCOME=true
@@ -92,40 +92,35 @@ __webi_main() {
export WEBI_WGET="\$(command -v wget)" export WEBI_WGET="\$(command -v wget)"
set -e set -e
my_libc=''
if ldd /bin/ls 2> /dev/null | grep -q 'musl' 2> /dev/null; then
my_libc=' musl-native'
fi
export WEBI_HOST="\${WEBI_HOST:-https://webinstall.dev}" export WEBI_HOST="\${WEBI_HOST:-https://webinstall.dev}"
export WEBI_UA="\$(uname -s)/\$(uname -r) \$(uname -m)/unknown\${my_libc}" export WEBI_UA="\$(uname -s)/\$(uname -r) \$(uname -m)/unknown"
webinstall() { webinstall() {
my_package="\${1:-}" my_package="\${1:-}"
if [ -z "\$my_package" ]; then if [ -z "\$my_package" ]; then
echo >&2 "Usage: webi <package>@<version> ..." >&2 echo "Usage: webi <package>@<version> ..."
echo >&2 "Example: webi node@lts rg" >&2 echo "Example: webi node@lts rg"
exit 1 exit 1
fi fi
export WEBI_BOOT="\$(mktemp -d -t "\$my_package-bootstrap.\$WEBI_TIMESTAMP.XXXXXXXX")" export WEBI_BOOT="\$(mktemp -d -t "\$my_package-bootstrap.\$WEBI_TIMESTAMP.XXXXXXXX")"
my_installer_url="\$WEBI_HOST/api/installers/\$my_package.sh?formats=\$my_ext" my_installer_url="\$WEBI_HOST/api/installers/\$my_package.sh?formats=\$my_ext"
set +e
if [ -n "\$WEBI_CURL" ]; then if [ -n "\$WEBI_CURL" ]; then
if ! curl -fsSL "\$my_installer_url" -H "User-Agent: curl \$WEBI_UA" \\ curl -fsSL "\$my_installer_url" -H "User-Agent: curl \$WEBI_UA" \\
-o "\$WEBI_BOOT/\$my_package-bootstrap.sh"; then -o "\$WEBI_BOOT/\$my_package-bootstrap.sh"
echo >&2 "error fetching '\$my_installer_url'"
exit 1
fi
else else
if ! wget -q "\$my_installer_url" --user-agent="wget \$WEBI_UA" \\ wget -q "\$my_installer_url" --user-agent="wget \$WEBI_UA" \\
-O "\$WEBI_BOOT/\$my_package-bootstrap.sh"; then -O "\$WEBI_BOOT/\$my_package-bootstrap.sh"
echo >&2 "error fetching '\$my_installer_url'"
exit 1
fi
fi fi
if ! [ \$? -eq 0 ]; then
>&2 echo "error fetching '\$my_installer_url'"
exit 1
fi
set -e
( (
cd "\$WEBI_BOOT" cd "\$WEBI_BOOT"
@@ -138,16 +133,16 @@ __webi_main() {
show_path_updates() { show_path_updates() {
if test -z "\${_WEBI_CHILD}"; then if ! [ -n "\${_WEBI_CHILD}" ]; then
if test -f "\$_webi_tmp/.PATH.env"; then if [ -f "\$_webi_tmp/.PATH.env" ]; then
my_paths=\$(sort -u < "\$_webi_tmp/.PATH.env") my_paths=\$(cat "\$_webi_tmp/.PATH.env" | sort -u)
if test -n "\$my_paths"; then if [ -n "\$my_paths" ]; then
printf 'PATH.env updated with:\\n' printf 'PATH.env updated with:\\n'
printf "%s\\n" "\$my_paths" printf "%s\\n" "\$my_paths"
printf '\\n' printf '\\n'
printf "\\e[1m\\e[35mTO FINISH\\e[0m: copy, paste & run the following command:\\n" printf "\\e[31mTO FINISH\\e[0m: copy, paste & run the following command:\\n"
printf "\\n" printf "\\n"
printf " \\e[1m\\e[32msource ~/.config/envman/PATH.env\\e[0m\\n" printf " \\e[34msource ~/.config/envman/PATH.env\\e[0m\\n"
printf " (newly opened terminal windows will update automatically)\\n" printf " (newly opened terminal windows will update automatically)\\n"
fi fi
rm -f "\$_webi_tmp/.PATH.env" rm -f "\$_webi_tmp/.PATH.env"
@@ -158,8 +153,8 @@ __webi_main() {
version() { version() {
my_version=v1.1.15 my_version=v1.1.15
printf "\\e[35mwebi\\e[32m %s\\e[0m Copyright 2020+ AJ ONeal\\n" "\${my_version}" printf "\\e[31mwebi\\e[32m %s\\e[0m Copyright 2020+ AJ ONeal\\n" "\${my_version}"
printf " \\e[36mhttps://webinstall.dev/webi\\e[0m\\n" printf " \\e[34mhttps://webinstall.dev/webi\\e[0m\\n"
} }
# show help if no params given or help flags are used # show help if no params given or help flags are used
@@ -204,7 +199,8 @@ __webi_main() {
exit 0 exit 0
fi fi
for pkgname in "\$@"; do for pkgname in "\$@"
do
webinstall "\$pkgname" webinstall "\$pkgname"
done done

View File

@@ -73,7 +73,6 @@ function normalize(all) {
}; };
all.releases.forEach(function (rel) { all.releases.forEach(function (rel) {
/* jshint maxcomplexity:25 */
rel.version = rel.version.replace(/^v/i, ''); rel.version = rel.version.replace(/^v/i, '');
if (!rel.name) { if (!rel.name) {
rel.name = rel.download.replace(/.*\//, ''); rel.name = rel.download.replace(/.*\//, '');
@@ -86,24 +85,21 @@ function normalize(all) {
} }
// Hacky-doo for musl // Hacky-doo for musl
// TODO some sort of glibc vs musl tag? // TODO some sort of glibc vs musl tag?
if (!rel._musl_native) { if (!rel._musl) {
if (!rel._musl) { if (/(\b|\.|_|-)(musl)(\b|\.|_|-)/.test(rel.download)) {
if (/(\b|\.|_|-)(musl)(\b|\.|_|-)/.test(rel.download)) { rel._musl = true;
rel._musl = true;
}
} }
} }
supported.oses[rel.os] = true; supported.oses[rel.os] = true;
if (!rel.arch) { if (!rel.arch) {
for (let arch of arches) { arches.some(function (regKey) {
let name = rel.name || rel.download; var arch = (rel.name || rel.download).match(archMap[regKey]) && regKey;
let isArch = name.match(archMap[arch]); if (arch) {
if (isArch) {
rel.arch = arch; rel.arch = arch;
break; return true;
} }
} });
} }
if (!rel.arch) { if (!rel.arch) {
if ('macos' === rel.os) { if ('macos' === rel.os) {

View File

@@ -47,14 +47,12 @@ async function serveInstaller(baseurl, ua, pkg, tag, ext, formats) {
// TODO maybe move package/version/lts/channel detection into getReleases // TODO maybe move package/version/lts/channel detection into getReleases
var myOs = uaDetect.os(ua); var myOs = uaDetect.os(ua);
var myArch = uaDetect.arch(ua); var myArch = uaDetect.arch(ua);
var myLibc = uaDetect.libc(ua);
let cfg = await packages.get(pkg); let cfg = await packages.get(pkg);
let rels = await getReleases({ let rels = await getReleases({
pkg: cfg.alias || pkg, pkg: cfg.alias || pkg,
ver, ver,
os: myOs, os: myOs,
arch: myArch, arch: myArch,
libc: myLibc,
lts, lts,
channel, channel,
formats, formats,

View File

@@ -1,13 +1,13 @@
#!/usr/bin/env pwsh #!/usr/bin/env pwsh
#350 check if windows user run as admin #350 check if windows user run as admin
function Confirm-IsElevated { function Confirm-IsElevated {
$id = [System.Security.Principal.WindowsIdentity]::GetCurrent() $id = [System.Security.Principal.WindowsIdentity]::GetCurrent()
$p = New-Object System.Security.Principal.WindowsPrincipal($id) $p = New-Object System.Security.Principal.WindowsPrincipal($id)
if ($p.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator)) if ($p.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator))
{ Write-Output $true } { Write-Output $true }
else else
{ Write-Output $false } { Write-Output $false }
} }
if (Confirm-IsElevated) if (Confirm-IsElevated)
@@ -32,90 +32,34 @@ $Env:WEBI_HOST = 'https://webinstall.dev'
#$Env:WEBI_PKG_FILE = "node-v12.16.2-win-x64.zip" #$Env:WEBI_PKG_FILE = "node-v12.16.2-win-x64.zip"
# Switch to userprofile # Switch to userprofile
Push-Location $Env:USERPROFILE pushd $Env:USERPROFILE
# Make paths # Make paths
New-Item -Path Downloads -ItemType Directory -Force | Out-Null New-Item -Path Downloads -ItemType Directory -Force | out-null
New-Item -Path .local\bin -ItemType Directory -Force | Out-Null New-Item -Path .local\bin -ItemType Directory -Force | out-null
New-Item -Path .local\opt -ItemType Directory -Force | Out-Null New-Item -Path .local\opt -ItemType Directory -Force | out-null
# {{ baseurl }} # {{ baseurl }}
# {{ version }} # {{ version }}
function webi_path_add($pathname) { function webi_add_path
# C:\Users\me => C:/Users/me {
$my_home = $Env:UserProfile Write-Host ''
$my_home = $my_home.replace('\\', '/') Write-Host '*****************************' -ForegroundColor red -BackgroundColor white
$my_home_re = [regex]::escape($my_home) Write-Host '* IMPORTANT - READ ME *' -ForegroundColor red -BackgroundColor white
Write-Host '*****************************' -ForegroundColor red -BackgroundColor white
# ~/bin => %USERPROFILE%/bin Write-Host ''
$pathname = $pathname.replace('~/', "$Env:UserProfile/") & "$Env:USERPROFILE\.local\bin\pathman.exe" add "$args[0]"
# Note: not all of these work as expected, so we use the unix-style, which is most consistent
# C:\Users\me\bin => %USERPROFILE%/bin #& "$Env:USERPROFILE\.local\bin\pathman.exe" add ~/.local/bin
$my_pathname = $pathname.replace('\\', '/') #& "$Env:USERPROFILE\.local\bin\pathman.exe" add "$Env:USERPROFILE\.local\bin"
$my_pathname = $my_pathname -ireplace $my_home_re, "%USERPROFILE%" #& "$Env:USERPROFILE\.local\bin\pathman.exe" add %USERPROFILE%\.local\bin
$all_user_paths = [Environment]::GetEnvironmentVariable("Path", "User")
$user_paths = $all_user_paths -Split (';')
$exists_in_path = $false
foreach ($user_path in $user_paths) {
# C:\Users\me\bin => %USERPROFILE%/bin
$my_user_path = $user_path.replace('\\', '/')
$my_user_path = $my_user_path -ireplace $my_home_re, "%USERPROFILE%"
if ($my_user_path -ieq $my_pathname) {
$exists_in_path = $true
}
}
if (-Not $exists_in_path) {
$all_user_paths = $pathname + ";" + $all_user_paths
[Environment]::SetEnvironmentVariable("Path", $all_user_paths, "User")
}
$session_paths = $Env:Path -Split (';')
$in_session_path = $false
foreach ($session_path in $session_paths) {
# C:\Users\me\bin => %USERPROFILE%/bin
$my_session_path = $session_path.replace('\\', '/')
$my_session_path = $my_session_path -ireplace $my_home_re, "%USERPROFILE%"
if ($my_session_path -ieq $my_pathname) {
$in_session_path = $true
}
}
if (-Not $in_session_path) {
$my_cmd = 'PATH ' + "$pathname" + ';%PATH%'
$my_pwsh = '$Env:Path = "' + "$pathname" + ';$Env:Path"'
Write-Host ''
Write-Host '**********************************' -ForegroundColor red -BackgroundColor white
Write-Host '* IMPORTANT -- READ ME *' -ForegroundColor red -BackgroundColor white
Write-Host '* (run the PATH command below) *' -ForegroundColor red -BackgroundColor white
Write-Host '**********************************' -ForegroundColor red -BackgroundColor white
Write-Host ''
Write-Output ""
Write-Output "Copy, paste, and run the appropriate command to update your PATH:"
Write-Output "(or close and reopen the terminal, or reboot)"
Write-Output ""
Write-Output "cmd.exe:"
Write-Output " $my_cmd"
Write-Output ""
Write-Output "PowerShell:"
Write-Output " $my_pwsh"
Write-Output ""
}
} }
#$has_local_bin = echo "$Env:PATH" | Select-String -Pattern '\.local.bin' # Run pathman to set up the folder
#if (!$has_local_bin) & "$Env:USERPROFILE\.local\bin\pathman.exe" add ~/.local/bin
#{
webi_path_add ~/.local/bin
#}
# {{ installer }} {{ installer }}
webi_path_add ~/.local/bin
# Done # Done
Pop-Location popd

View File

@@ -6,11 +6,6 @@ __bootstrap_webi() {
set -u set -u
#set -x #set -x
my_libc=''
if ldd /bin/ls 2> /dev/null | grep -q 'musl' 2> /dev/null; then
my_libc=' musl-native'
fi
#WEBI_PKG= #WEBI_PKG=
#PKG_NAME= #PKG_NAME=
# TODO should this be BASEURL instead? # TODO should this be BASEURL instead?
@@ -35,7 +30,7 @@ __bootstrap_webi() {
#PKG_OSES= #PKG_OSES=
#PKG_ARCHES= #PKG_ARCHES=
#PKG_FORMATS= #PKG_FORMATS=
WEBI_UA="$(uname -s)/$(uname -r) $(uname -m)/unknown${my_libc}" WEBI_UA="$(uname -s)/$(uname -r) $(uname -m)/unknown"
WEBI_PKG_DOWNLOAD="" WEBI_PKG_DOWNLOAD=""
WEBI_DOWNLOAD_DIR="${HOME}/Downloads" WEBI_DOWNLOAD_DIR="${HOME}/Downloads"
if command -v xdg-user-dir > /dev/null; then if command -v xdg-user-dir > /dev/null; then
@@ -165,7 +160,7 @@ __bootstrap_webi() {
webi_download() { webi_download() {
# determine the url to download # determine the url to download
if [ -n "${1-}" ]; then if [ -n "${1-}" ]; then
my_url="${1}" my_url="$1"
else else
if [ "error" = "$WEBI_CHANNEL" ]; then if [ "error" = "$WEBI_CHANNEL" ]; then
# TODO pass back requested OS / Arch / Version # TODO pass back requested OS / Arch / Version
@@ -173,11 +168,7 @@ __bootstrap_webi() {
echo >&2 " '$PKG_NAME' is available for '$PKG_OSES' on '$PKG_ARCHES' as one of '$PKG_FORMATS'" echo >&2 " '$PKG_NAME' is available for '$PKG_OSES' on '$PKG_ARCHES' as one of '$PKG_FORMATS'"
echo >&2 " (check that the package name and version are correct)" echo >&2 " (check that the package name and version are correct)"
echo >&2 "" echo >&2 ""
my_release_url="$( echo >&2 " Double check at $(echo "$WEBI_RELEASES" | sed 's:\?.*::')"
echo "$WEBI_RELEASES" |
sed 's:\?.*::'
)"
echo >&2 " Double check at ${my_release_url}"
echo >&2 "" echo >&2 ""
exit 1 exit 1
fi fi
@@ -186,17 +177,11 @@ __bootstrap_webi() {
# determine the location to download to # determine the location to download to
if [ -n "${2-}" ]; then if [ -n "${2-}" ]; then
my_dl="${2}" my_dl="$2"
else else
my_dl="${WEBI_PKG_PATH}/$WEBI_PKG_FILE" my_dl="${WEBI_PKG_PATH}/$WEBI_PKG_FILE"
fi fi
if [ -n "${3-}" ]; then
my_dl_name="${3}"
else
my_dl_name="${PKG_NAME}"
fi
WEBI_PKG_DOWNLOAD="${my_dl}" WEBI_PKG_DOWNLOAD="${my_dl}"
export WEBI_PKG_DOWNLOAD export WEBI_PKG_DOWNLOAD
@@ -205,7 +190,7 @@ __bootstrap_webi() {
return 0 return 0
fi fi
echo "Downloading ${my_dl_name} from" echo "Downloading $PKG_NAME from"
echo "$my_url" echo "$my_url"
# It's only 2020, we can't expect to have reliable CLI tools # It's only 2020, we can't expect to have reliable CLI tools
@@ -266,179 +251,25 @@ __bootstrap_webi() {
# use 'pathman' to update $HOME/.config/envman/PATH.env # use 'pathman' to update $HOME/.config/envman/PATH.env
webi_path_add() { webi_path_add() {
my_path="${1}" # make sure that we don't recursively install pathman with webi
my_path="$PATH"
export PATH="$HOME/.local/bin:$PATH"
fn_envman_init # install pathman if not already installed
if [ -z "$(command -v pathman)" ]; then
# \v was chosen as it is extremely unlikely for a filename "$HOME/.local/bin/webi" pathman > /dev/null
# \1 could be an even better choice, but needs more testing.
# (currently tested working on: linux & mac)
# "\0001" should also work
my_delim="$(
printf '\v'
)"
my_path_expanded="$(
echo "${my_path}" |
sed -e "s${my_delim}\$HOME${my_delim}$HOME${my_delim}g" \
-e "s${my_delim}\${HOME}${my_delim}$HOME${my_delim}g" \
-e "s${my_delim}^~/${my_delim}$HOME/${my_delim}g"
)"
# A gift for @adamcstephens.
# See https://github.com/webinstall/webi-installers/issues/322
case "${PATH}" in
# matches whether the first, a middle, the last, or the only PATH entry
"${my_path_expanded}":* | \
*:"${my_path_expanded}":* | \
*:"${my_path_expanded}" | \
"${my_path_expanded}")
if fn_is_defined_in_all_shells "${my_path}"; then
return 0
fi
;;
*) ;;
esac
my_path_export="$(
echo "${my_path}" |
sed -e "s${my_delim}${HOME}${my_delim}\$HOME${my_delim}g" \
-e "s${my_delim}\${HOME}${my_delim}\$HOME${my_delim}g" \
-e "s${my_delim}^~/${my_delim}\$HOME/${my_delim}g"
)"
my_export="export PATH=\"$my_path_export:\$PATH\""
if grep -q -F "${my_export}" ~/.config/envman/PATH.env; then
return 0
fi fi
echo "${my_export}" >> ~/.config/envman/PATH.env export PATH="$my_path"
# in case pathman was recently installed and the PATH not updated
mkdir -p "$_webi_tmp" mkdir -p "$_webi_tmp"
my_path_tilde="$( # 'true' to prevent "too few arguments" output
echo "${my_path}" | # when there are 0 lines of stdout
sed -e "s${my_delim}${HOME}${my_delim}~${my_delim}g" "$HOME/.local/bin/pathman" add "$1" |
)" grep "export" 2> /dev/null \
>> "$_webi_tmp/.PATH.env" ||
if ! test -f "$_webi_tmp/.PATH.env" || true
! grep -q -F "${my_path_tilde}" "$_webi_tmp/.PATH.env"; then
echo "${my_path_tilde}" >> "$_webi_tmp/.PATH.env"
fi
}
fn_envman_init() {
mkdir -p ~/.config/envman/
if ! test -e ~/.config/envman/PATH.env; then
touch ~/.config/envman/PATH.env
fi
if ! test -e ~/.config/envman/load.sh; then
# shellcheck disable=SC2016
{
echo '# Generated for envman. Do not edit.'
echo 'for x in ~/.config/envman/*.env; do'
echo ' my_basename="$(basename "${x}")"'
echo ' if [ "*.env" = "${my_basename}" ]; then'
echo ' continue'
echo ' fi'
echo ''
echo ' # shellcheck source=/dev/null'
echo ' . "${x}"'
echo 'done'
} > ~/.config/envman/load.sh
fi
if command -v sh > /dev/null; then
if test -e ~/.profile; then
if ! grep -q -F '/.config/envman/load.sh' ~/.profile; then
fn_echo_load_sh >> ~/.profile
fi
fi
fi
if command -v bash > /dev/null; then
if test -e ~/.bashrc; then
if ! grep -q -F '/.config/envman/load.sh' ~/.bashrc; then
fn_echo_load_sh >> ~/.bashrc
fi
fi
fi
if command -v zsh > /dev/null; then
if test -e ~/.zshrc; then
if ! grep -q -F '/.config/envman/load.sh' ~/.zshrc; then
fn_echo_load_sh >> ~/.zshrc
fi
fi
fi
if command -v fish > /dev/null; then
if test ! -e ~/.config/envman/load.fish; then
# shellcheck disable=SC2016
{
echo '# Generated for envman. Do not edit.'
echo 'for x in ~/.config/envman/*.env'
echo ' source "$x"'
echo 'end'
} > ~/.config/envman/load.fish
fi
mkdir -p ~/.config/fish
if test -e ~/.config/fish/config.fish; then
touch ~/.config/fish/config.fish
fi
if ! grep -q -F '/.config/envman/load.fish' ~/.config/fish/config.fish; then
fn_echo_load_fish >> ~/.config/fish/config.fish
fi
fi
}
fn_echo_load_fish() {
echo ''
echo '# Generated for envman. Do not edit.'
# shellcheck disable=SC2016
echo 'test -s "$HOME/.config/envman/load.fish"; and source "$HOME/.config/envman/load.fish"'
}
fn_echo_load_sh() {
echo ''
echo '# Generated for envman. Do not edit.'
# shellcheck disable=SC2016
echo '[ -s "$HOME/.config/envman/load.sh" ] && source "$HOME/.config/envman/load.sh"'
}
fn_is_defined_in_all_shells() {
my_path="${1}"
my_path_expanded="$(
echo "${my_path}" |
sed -e "s${my_delim}\$HOME|${my_delim}$HOME${my_delim}g" \
-e "s${my_delim}\${HOME}${my_delim}$HOME${my_delim}g" \
-e "s${my_delim}^~/${my_delim}$HOME/${my_delim}g"
)"
my_paths="$(
echo "${my_path_expanded}"
# $HOME/foo
echo "${my_path_expanded}" |
sed "s${my_delim}${HOME}${my_delim}\$HOME${my_delim}g"
# ${HOME}/foo
echo "${my_path_expanded}" |
sed "s${my_delim}${HOME}${my_delim}\${HOME}${my_delim}g"
echo "${my_path}"
)"
my_confs="$(
echo "${HOME}/.profile"
echo "${HOME}/.bashrc"
echo "${HOME}/.zshrc"
echo "${HOME}/.config/fish/config.fish"
)"
for my_conf in $my_confs; do
if test -e "${my_conf}"; then
if ! grep -q -F "${my_paths}" "${my_conf}"; then
return 1
fi
fi
done
} }
# group common pre-install tasks as default # group common pre-install tasks as default
@@ -508,12 +339,12 @@ __bootstrap_webi() {
if [ -z "${WEBI_WELCOME-}" ]; then if [ -z "${WEBI_WELCOME-}" ]; then
echo "" echo ""
printf "Thanks for using webi to install '\e[32m%s\e[0m' on '\e[33m%s/%s\e[0m'.\n" "${WEBI_PKG-}" "$(uname -s)" "$(uname -m)" printf "Thanks for using webi to install '\e[32m%s\e[0m' on '\e[31m%s/%s\e[0m'.\n" "${WEBI_PKG-}" "$(uname -s)" "$(uname -m)"
echo "Have a problem? Experience a bug? Please let us know:" echo "Have a problem? Experience a bug? Please let us know:"
printf " \e[2m\e[36mhttps://github.com/webinstall/webi-installers/issues\e[0m\n" echo " https://github.com/webinstall/webi-installers/issues"
echo "" echo ""
printf "\e[35mLovin'\e[0m it? Say thanks with a \e[1m\e[33mStar on GitHub\e[0m:\n" printf "\e[31mLovin'\e[0m it? Say thanks with a \e[34mStar on GitHub\e[0m:\n"
printf " \e[36mhttps://github.com/webinstall/webi-installers\e[0m\n" printf " \e[32mhttps://github.com/webinstall/webi-installers\e[0m\n"
echo "" echo ""
fi fi
@@ -601,16 +432,14 @@ __bootstrap_webi() {
if [ -z "${_WEBI_CHILD-}" ] && [ -f "$_webi_tmp/.PATH.env" ]; then if [ -z "${_WEBI_CHILD-}" ] && [ -f "$_webi_tmp/.PATH.env" ]; then
if [ -n "$(cat "$_webi_tmp/.PATH.env")" ]; then if [ -n "$(cat "$_webi_tmp/.PATH.env")" ]; then
printf 'PATH.env updated with:\n' printf 'PATH.env updated with:\n'
sort -u "$_webi_tmp/.PATH.env" | while read -r my_new_path; do sort -u "$_webi_tmp/.PATH.env"
echo " ${my_new_path}"
done
printf "\n" printf "\n"
rm -f "$_webi_tmp/.PATH.env" rm -f "$_webi_tmp/.PATH.env"
printf "\e[1m\e[35mTO FINISH\e[0m: copy, paste & run the following command:\n" printf "\e[31mTO FINISH\e[0m: copy, paste & run the following command:\n"
printf "\n" printf "\n"
printf " \e[1m\e[32msource ~/.config/envman/PATH.env\e[0m\n" printf " \e[34msource ~/.config/envman/PATH.env\e[0m\n"
printf " (newly opened terminal windows will update automatically)\n" printf " (newly opened terminal windows will update automatically)\n"
fi fi
fi fi

View File

@@ -2,8 +2,6 @@
var path = require('path'); var path = require('path');
var Releases = require('./releases.js'); var Releases = require('./releases.js');
var uaDetect = require('./ua-detect.js');
var cache = {}; var cache = {};
//var staleAge = 5 * 1000; //var staleAge = 5 * 1000;
//var expiredAge = 15 * 1000; //var expiredAge = 15 * 1000;
@@ -54,14 +52,6 @@ function createFormatsSorter(formats) {
return 1; return 1;
} }
// Hacky-doo for musl-native: prefer non-musl
if (a._musl_native && !b._musl_native) {
return 1;
}
if (!a._musl_native && b._musl_native) {
return -1;
}
// Hacky-doo for linux: prefer musl // Hacky-doo for linux: prefer musl
if (a._musl && !b._musl) { if (a._musl && !b._musl) {
return -1; return -1;
@@ -171,7 +161,7 @@ async function getCachedReleases(pkg) {
async function filterReleases( async function filterReleases(
all, all,
{ ver, os, arch, libc, lts, channel, formats, limit }, { ver, os, arch, lts, channel, formats, limit },
) { ) {
// When multiple formats are downloadable (i.e. .zip and .pkg) // When multiple formats are downloadable (i.e. .zip and .pkg)
// sort the most compatible format first // sort the most compatible format first
@@ -180,62 +170,27 @@ async function filterReleases(
var sortByVerExt = createFormatsSorter(rformats); var sortByVerExt = createFormatsSorter(rformats);
var reVer = new RegExp('^' + ver + '\\b'); var reVer = new RegExp('^' + ver + '\\b');
function selectMatches(rel) { var sortedRels = all.releases
if (os) { .filter(function (rel) {
if (rel.os !== os) { if (
(os && rel.os !== os) ||
// Hacky-doo for linux musl
(arch && rel.arch !== arch) ||
(lts && !rel.lts) ||
(channel && rel.channel !== channel) ||
// to match 'tar.gz' and 'tar.xz' with just 'tar'
(formats.length &&
!formats.some(function (ext) {
return rel.ext.match(ext);
})) ||
(ver && !rel.version.match(reVer))
) {
return false; return false;
} }
} return true;
})
if (arch) { .sort(sortByVerExt);
if (rel.arch !== arch) {
return false;
}
}
// Hacky-doo for linux musl
if (libc === uaDetect.MUSL_NATIVE) {
if (!rel._musl && !rel._musl_native) {
return false;
}
} else if (rel._musl_native) {
return false;
}
if (lts) {
if (!rel.lts) {
return false;
}
}
if (channel) {
if (rel.channel !== channel) {
return false;
}
}
// to match 'tar.gz' and 'tar.xz' with just 'tar'
function hasExt(ext) {
return rel.ext.match(ext);
}
if (formats.length) {
if (!formats.some(hasExt)) {
return false;
}
}
if (ver) {
if (!rel.version.match(reVer)) {
return false;
}
}
return true;
}
var sortedRels = all.releases.filter(selectMatches).sort(sortByVerExt);
//console.log(sortedRels.slice(0, 4)); //console.log(sortedRels.slice(0, 4));
return sortedRels.slice(0, limit || 1000); return sortedRels.slice(0, limit || 1000);
} }
@@ -245,7 +200,6 @@ module.exports = function getReleases({
ver, ver,
os, os,
arch, arch,
libc,
lts, lts,
channel, channel,
formats, formats,
@@ -259,7 +213,6 @@ module.exports = function getReleases({
ver, ver,
os, os,
arch, arch,
libc,
lts, lts,
channel, channel,
formats, formats,
@@ -276,28 +229,13 @@ module.exports = function getReleases({
}) })
.then(function (releases) { .then(function (releases) {
if (!releases.length) { if (!releases.length) {
// Apple Silicon M1 hacky-do workaround fix // Apple Silicon M1 hack-y do workaround fix
if ('macos' === os && 'arm64' === arch) { if ('macos' === os && 'arm64' === arch) {
return getReleases({ return getReleases({
pkg, pkg,
ver, ver,
os, os,
arch: 'amd64', arch: 'amd64',
libc,
lts,
channel,
formats,
limit,
});
}
// Windows ARM hacky-do workaround fix
if ('windows' === os && 'arm64' === arch) {
return getReleases({
pkg,
ver,
os,
arch: 'amd64',
libc,
lts, lts,
channel, channel,
formats, formats,
@@ -312,7 +250,6 @@ module.exports = function getReleases({
ver, ver,
os, os,
arch: 'arm64', arch: 'arm64',
libc,
lts, lts,
channel, channel,
formats, formats,
@@ -328,7 +265,6 @@ module.exports = function getReleases({
ver, ver,
os, os,
arch: 'armv7l', arch: 'armv7l',
libc,
lts, lts,
channel, channel,
formats, formats,
@@ -343,7 +279,6 @@ module.exports = function getReleases({
ver, ver,
os, os,
arch: 'armv6l', arch: 'armv6l',
libc,
lts, lts,
channel, channel,
formats, formats,
@@ -360,7 +295,6 @@ module.exports = function getReleases({
os: os || '-', os: os || '-',
arch: arch || '-', arch: arch || '-',
_musl: undefined, _musl: undefined,
_musl_native: undefined,
ext: 'err', ext: 'err',
download: 'https://example.com/doesntexist.ext', download: 'https://example.com/doesntexist.ext',
comment: comment:
@@ -388,7 +322,6 @@ if (require.main === module) {
os: 'macos', os: 'macos',
arch: 'amd64', arch: 'amd64',
lts: true, lts: true,
libc: '',
channel: 'stable', channel: 'stable',
formats: ['tar', 'exe', 'zip', 'xz', 'dmg', 'pkg'], formats: ['tar', 'exe', 'zip', 'xz', 'dmg', 'pkg'],
limit: 10, limit: 10,

View File

@@ -2,10 +2,6 @@
var uaDetect = module.exports; var uaDetect = module.exports;
const MUSL_NATIVE = 'musl-native';
uaDetect.MUSL_NATIVE = MUSL_NATIVE;
function getRequest(req) { function getRequest(req) {
var ua = req.headers['user-agent'] || ''; var ua = req.headers['user-agent'] || '';
var os = req.query.os; var os = req.query.os;
@@ -60,23 +56,16 @@ function getArch(ua) {
return '-'; return '-';
} }
// Quick hack for Apple Silicon M1 // quick hack for Apple Silicon M1
//
// Note: we now use `uname -srm` which does not have the native arch
// info included with `uname -v` and `uname -a`.
//
// Native: Darwin boomer.local 20.2.0 Darwin Kernel Version 20.2.0: Wed Dec 2 20:40:21 PST 2020; root:xnu-7195.60.75~1/RELEASE_ARM64_T8101 arm64 // Native: Darwin boomer.local 20.2.0 Darwin Kernel Version 20.2.0: Wed Dec 2 20:40:21 PST 2020; root:xnu-7195.60.75~1/RELEASE_ARM64_T8101 arm64
// Resetta: Darwin boomer.local 20.2.0 Darwin Kernel Version 20.2.0: Wed Dec 2 20:40:21 PST 2020; root:xnu-7195.60.75~1/RELEASE_ARM64_T8101 x86_64 // Resetta: Darwin boomer.local 20.2.0 Darwin Kernel Version 20.2.0: Wed Dec 2 20:40:21 PST 2020; root:xnu-7195.60.75~1/RELEASE_ARM64_T8101 x86_64
ua = ua.replace(/xnu-.*RELEASE_[^\s]*/, ''); ua = ua.replace(/xnu-.*RELEASE_[^\s]*/, '');
if (/aarch64|arm64|arm8|armv8/i.test(ua)) { if (/aarch64|arm64|arm8|armv8/i.test(ua)) {
return 'arm64'; return 'arm64';
} else if (/aarch|arm7|armv7/i.test(ua)) { } else if (/aarch|arm7|armv7/i.test(ua)) {
return 'armv7l'; return 'armv7l';
} else if (/arm6|armv6/i.test(ua)) { } else if (/arm6|armv6/i.test(ua)) {
return 'armv6l'; return 'armv6l';
} else if (/ppc64le/i.test(ua)) {
return 'ppc64le';
} else if (/ppc64/i.test(ua)) { } else if (/ppc64/i.test(ua)) {
return 'ppc64'; return 'ppc64';
} else if (/mips64/i.test(ua)) { } else if (/mips64/i.test(ua)) {
@@ -95,27 +84,6 @@ function getArch(ua) {
} }
} }
function getLibc(ua) {
if ('-' === ua) {
return '-';
}
// Use native 'libc' information, if provided
//
// Generally, we prefer 'musl' builds because they DO work on glibc systems (Ubuntu),
// but 'glibc' builds will NOT work on musl systems (Alpine / Docker).
//
// However, there are a few instances (ex: Node.js), where the 'musl' builds
// DO NOT work on glibc systems.
if (ua.match(MUSL_NATIVE)) {
return MUSL_NATIVE;
}
// TODO handle explicit invalid different
return '';
}
uaDetect.os = getOs; uaDetect.os = getOs;
uaDetect.arch = getArch; uaDetect.arch = getArch;
uaDetect.libc = getLibc;
uaDetect.request = getRequest; uaDetect.request = getRequest;

View File

@@ -1,4 +1,4 @@
#!/usr/bin/env pwsh #!/usr/bin/env pwsh
# this allows us to call ps1 files, which allows us to have spaces in filenames # this allows us to call ps1 files, which allows us to have spaces in filenames
# ('powershell "$Env:USERPROFILE\test.ps1" foo' will fail if it has a space in # ('powershell "$Env:USERPROFILE\test.ps1" foo' will fail if it has a space in
@@ -14,81 +14,95 @@ $ProgressPreference = 'SilentlyContinue'
# This is the canonical CPU arch when the process is emulated # This is the canonical CPU arch when the process is emulated
$my_arch = "$Env:PROCESSOR_ARCHITEW6432" $my_arch = "$Env:PROCESSOR_ARCHITEW6432"
IF ($my_arch -eq $null -or $my_arch -eq "") { IF ($my_arch -eq $null -or $my_arch -eq "") {
# This is the canonical CPU arch when the process is native # This is the canonical CPU arch when the process is native
$my_arch = "$Env:PROCESSOR_ARCHITECTURE" $my_arch = "$Env:PROCESSOR_ARCHITECTURE"
} }
IF ($my_arch -eq "AMD64") { # TODO API should know to prefer x86 for windows when arm binary is not available
# Because PowerShell isn't ARM yet.
# See https://oofhours.com/2020/02/04/powershell-on-windows-10-arm64/
$my_os_arch = wmic os get osarchitecture
# Using -clike because of the trailing newline
IF ($my_os_arch -clike "ARM 64*") {
$my_arch = "ARM64"
}
}
$Env:WEBI_UA = "Windows/10 $my_arch" $Env:WEBI_UA = "Windows/10 $my_arch"
$exename = $args[0] $exename = $args[0]
# Switch to userprofile # Switch to userprofile
Push-Location $Env:USERPROFILE pushd $Env:USERPROFILE
# Make paths if needed # Make paths if needed
New-Item -Path .local\bin -ItemType Directory -Force | Out-Null New-Item -Path .local\bin -ItemType Directory -Force | out-null
# TODO replace all xbin with opt\bin\ # TODO replace all xbin with opt\bin\
New-Item -Path .local\xbin -ItemType Directory -Force | Out-Null New-Item -Path .local\xbin -ItemType Directory -Force | out-null
# See note on Set-ExecutionPolicy above # See note on Set-ExecutionPolicy above
Set-Content -Path .local\bin\webi.bat -Value "@echo off`r`npushd %USERPROFILE%`r`npowershell -ExecutionPolicy Bypass .local\bin\webi-pwsh.ps1 %1`r`npopd" Set-Content -Path .local\bin\webi.bat -Value "@echo off`r`npushd %USERPROFILE%`r`npowershell -ExecutionPolicy Bypass .local\bin\webi-pwsh.ps1 %1`r`npopd"
# Backwards-compat bugfix: remove old webi-pwsh.ps1 location # Backwards-compat bugfix: remove old webi-pwsh.ps1 location
Remove-Item -Path .local\bin\webi.ps1 -Recurse -ErrorAction Ignore Remove-Item -Path .local\bin\webi.ps1 -Recurse -ErrorAction Ignore
if (!(Test-Path -Path .local\opt)) { if (!(Test-Path -Path .local\opt))
New-Item -Path .local\opt -ItemType Directory -Force | Out-Null {
New-Item -Path .local\opt -ItemType Directory -Force | out-null
} }
# TODO windows version of mktemp -d # TODO windows version of mktemp -d
if (!(Test-Path -Path .local\tmp)) { if (!(Test-Path -Path .local\tmp))
New-Item -Path .local\tmp -ItemType Directory -Force | Out-Null {
New-Item -Path .local\tmp -ItemType Directory -Force | out-null
} }
# TODO SetStrictMode # TODO SetStrictMode
# TODO Test-Path variable:global:Env:WEBI_HOST ??? # TODO Test-Path variable:global:Env:WEBI_HOST ???
IF ($null -eq $Env:WEBI_HOST -or $Env:WEBI_HOST -eq "") { IF($Env:WEBI_HOST -eq $null -or $Env:WEBI_HOST -eq "")
{
$Env:WEBI_HOST = "https://webinstall.dev" $Env:WEBI_HOST = "https://webinstall.dev"
} }
if (!(Test-Path -Path .local\bin\pathman.exe))
{
& curl.exe -fsSL -A "$Env:WEBI_UA" "$Env:WEBI_HOST/packages/pathman/install.ps1" -o .\.local\tmp\pathman-setup.ps1
powershell .\.local\tmp\pathman-setup.ps1
# TODO del .\.local\tmp\pathman-setup.bat
}
# Run pathman to set up the folder
# (using unix style path because... cmd vs powershell vs whatever)
$has_local_bin = echo "$Env:PATH" | Select-String -Pattern '\.local.bin'
if (!$has_local_bin)
{
Write-Host ''
Write-Host '**********************************' -ForegroundColor red -BackgroundColor white
Write-Host '* IMPORTANT -- READ ME *' -ForegroundColor red -BackgroundColor white
Write-Host '* (run the PATH command below) *' -ForegroundColor red -BackgroundColor white
Write-Host '**********************************' -ForegroundColor red -BackgroundColor white
Write-Host ''
& "$Env:USERPROFILE\.local\bin\pathman.exe" add ~/.local/bin
}
# {{ baseurl }} # {{ baseurl }}
# {{ version }} # {{ version }}
$my_version = 'v1.1.15' $my_version = 'v1.1.15'
## show help if no params given or help flags are used ## show help if no params given or help flags are used
if ($null -eq $exename -or $exename -eq "-h" -or $exename -eq "--help" -or $exename -eq "help" -or $exename -eq "/?") { if ($exename -eq $null -or $exename -eq "-h" -or $exename -eq "--help" -or $exename -eq "help" -or $exename -eq "/?") {
Write-Host "webi " -ForegroundColor Green -NoNewline; Write-Host "$my_version " -ForegroundColor Red -NoNewline; Write-Host "Copyright 2020+ AJ ONeal" Write-Host "webi " -ForegroundColor Green -NoNewline; Write-Host "$my_version " -ForegroundColor Red -NoNewline; Write-Host "Copyright 2020+ AJ ONeal"
Write-Host " https://webinstall.dev/webi" -ForegroundColor blue Write-Host " https://webinstall.dev/webi" -ForegroundColor blue
Write-Output "" echo ""
Write-Output "SUMMARY" echo "SUMMARY"
Write-Output " Webi is the best way to install the modern developer tools you love." echo " Webi is the best way to install the modern developer tools you love."
Write-Output " It's fast, easy-to-remember, and conflict free." echo " It's fast, easy-to-remember, and conflict free."
Write-Output "" echo ""
Write-Output "USAGE" echo "USAGE"
Write-Output " webi <thing1>[@version] [thing2] ..." echo " webi <thing1>[@version] [thing2] ..."
Write-Output "" echo ""
Write-Output "UNINSTALL" echo "UNINSTALL"
Write-Output " Almost everything that is installed with webi is scoped to" echo " Almost everything that is installed with webi is scoped to"
Write-Output " ~/.local/opt/<thing1>, so you can remove it like so:" echo " ~/.local/opt/<thing1>, so you can remove it like so:"
Write-Output "" echo ""
Write-Output " rmdir /s %USERPROFILE%\.local\opt\<thing1>" echo " rmdir /s %USERPROFILE%\.local\opt\<thing1>"
Write-Output " del %USERPROFILE%\.local\bin\<thing1>" echo " del %USERPROFILE%\.local\bin\<thing1>"
Write-Output "" echo ""
Write-Output " Some packages have special uninstall instructions, check" echo " Some packages have special uninstall instructions, check"
Write-Output " https://webinstall.dev/<thing1> to be sure." echo " https://webinstall.dev/<thing1> to be sure."
Write-Output "" echo ""
Write-Output "FAQ" echo "FAQ"
Write-Host " See " -NoNewline; Write-Host "https://webinstall.dev/faq" -ForegroundColor blue Write-Host " See " -NoNewline; Write-Host "https://webinstall.dev/faq" -ForegroundColor blue
Write-Output "" echo ""
Write-Output "ALWAYS REMEMBER" echo "ALWAYS REMEMBER"
Write-Output " Friends don't let friends use brew for simple, modern tools that don't need it." echo " Friends don't let friends use brew for simple, modern tools that don't need it."
exit 0 exit 0
} }
@@ -101,7 +115,7 @@ if ($exename -eq "-V" -or $exename -eq "--version" -or $exename -eq "version" -o
# Fetch <whatever>.ps1 # Fetch <whatever>.ps1
# TODO detect formats # TODO detect formats
$PKG_URL = "$Env:WEBI_HOST/api/installers/$exename.ps1?formats=zip,exe,tar" $PKG_URL = "$Env:WEBI_HOST/api/installers/$exename.ps1?formats=zip,exe,tar"
Write-Output "Downloading $PKG_URL" echo "Downloading $PKG_URL"
# Invoke-WebRequest -UserAgent "Windows amd64" "$PKG_URL" -OutFile ".\.local\tmp\$exename.install.ps1" # Invoke-WebRequest -UserAgent "Windows amd64" "$PKG_URL" -OutFile ".\.local\tmp\$exename.install.ps1"
& curl.exe -fsSL -A "$Env:WEBI_UA" "$PKG_URL" -o .\.local\tmp\$exename.install.ps1 & curl.exe -fsSL -A "$Env:WEBI_UA" "$PKG_URL" -o .\.local\tmp\$exename.install.ps1
@@ -109,4 +123,4 @@ Write-Output "Downloading $PKG_URL"
powershell .\.local\tmp\$exename.install.ps1 powershell .\.local\tmp\$exename.install.ps1
# Done # Done
Pop-Location popd

View File

@@ -10,7 +10,18 @@ pushd "%userprofile%" || goto :error
mkdir .local\opt || goto :error mkdir .local\opt || goto :error
) )
echo Downloading and installing %1 pushd .local\bin || goto :error
if NOT EXIST pathman.exe (
echo updating PATH management
powershell $ProgressPreference = 'SilentlyContinue'; Invoke-WebRequest https://webinstall.dev/packages/pathman/install.bat -OutFile pathman-setup.bat || goto :error
call .\pathman-setup.bat || goto :error
del pathman-setup.bat || goto :error
rem TODO there's rumor of a windows tool called 'pathman' that does the same thing?
)
popd || goto :error
.\.local\bin\pathman add ".local\bin" || goto :error
echo downloading and installing %1
powershell $ProgressPreference = 'SilentlyContinue'; Invoke-WebRequest https://webinstall.dev/packages/%1/install.ps1 -OutFile %1-webinstall.bat || goto :error powershell $ProgressPreference = 'SilentlyContinue'; Invoke-WebRequest https://webinstall.dev/packages/%1/install.ps1 -OutFile %1-webinstall.bat || goto :error
rem TODO only add if it's not in there already rem TODO only add if it's not in there already

View File

@@ -11,7 +11,6 @@ module.exports = function (request) {
'armv6l', 'armv6l',
'armv7l', 'armv7l',
'ppc64le', 'ppc64le',
'ppc64',
's390x', 's390x',
'x86', 'x86',
]; ];

View File

@@ -9,12 +9,9 @@ To update or switch versions, run `webi arc@stable` (or `@v3.5`, `@beta`, etc).
### Files ### Files
These are the files / directories that are created and/or modified with this
install:
```text ```text
~/.config/envman/PATH.env ~/.config/envman/PATH.env
~/.local/bin/arc ~/.local/opt/archiver/
``` ```
## Cheat Sheet ## Cheat Sheet

View File

@@ -15,39 +15,41 @@ $pkg_src_bin = "$Env:USERPROFILE\.local\opt\archiver-v$Env:WEBI_VERSION\bin"
$pkg_src_dir = "$Env:USERPROFILE\.local\opt\archiver-v$Env:WEBI_VERSION" $pkg_src_dir = "$Env:USERPROFILE\.local\opt\archiver-v$Env:WEBI_VERSION"
$pkg_src = "$pkg_src_cmd" $pkg_src = "$pkg_src_cmd"
New-Item "$Env:USERPROFILE\Downloads\webi" -ItemType Directory -Force | Out-Null New-Item "$Env:USERPROFILE\Downloads\webi" -ItemType Directory -Force | out-null
$pkg_download = "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE" $pkg_download = "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE"
# Fetch archive # Fetch archive
IF (!(Test-Path -Path "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE")) { IF (!(Test-Path -Path "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE"))
Write-Output "Downloading archiver from $Env:WEBI_PKG_URL to $pkg_download" {
echo "Downloading archiver from $Env:WEBI_PKG_URL to $pkg_download"
& curl.exe -A "$Env:WEBI_UA" -fsSL "$Env:WEBI_PKG_URL" -o "$pkg_download.part" & curl.exe -A "$Env:WEBI_UA" -fsSL "$Env:WEBI_PKG_URL" -o "$pkg_download.part"
& Move-Item "$pkg_download.part" "$pkg_download" & move "$pkg_download.part" "$pkg_download"
} }
IF (!(Test-Path -Path "$pkg_src_cmd")) { IF (!(Test-Path -Path "$pkg_src_cmd"))
Write-Output "Installing archiver" {
echo "Installing archiver"
# TODO: create package-specific temp directory # TODO: create package-specific temp directory
# Enter tmp # Enter tmp
Push-Location .local\tmp pushd .local\tmp
# Remove any leftover tmp cruft # Remove any leftover tmp cruft
Remove-Item -Path ".\arc-*" -Recurse -ErrorAction Ignore Remove-Item -Path ".\arc-*" -Recurse -ErrorAction Ignore
Remove-Item -Path ".\arc.exe" -Recurse -ErrorAction Ignore Remove-Item -Path ".\arc.exe" -Recurse -ErrorAction Ignore
# Move single binary into root of temporary folder # Move single binary into root of temporary folder
& Move-Item "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE" "arc.exe" & move "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE" "arc.exe"
# Settle unpacked archive into place # Settle unpacked archive into place
Write-Output "Install Location: $pkg_src_cmd" echo "Install Location: $pkg_src_cmd"
New-Item "$pkg_src_bin" -ItemType Directory -Force | Out-Null New-Item "$pkg_src_bin" -ItemType Directory -Force | out-null
Move-Item -Path "arc.exe" -Destination "$pkg_src_bin" Move-Item -Path "arc.exe" -Destination "$pkg_src_bin"
# Exit tmp # Exit tmp
Pop-Location popd
} }
Write-Output "Copying into '$pkg_dst_cmd' from '$pkg_src_cmd'" echo "Copying into '$pkg_dst_cmd' from '$pkg_src_cmd'"
Remove-Item -Path "$pkg_dst_cmd" -Recurse -ErrorAction Ignore | Out-Null Remove-Item -Path "$pkg_dst_cmd" -Recurse -ErrorAction Ignore | out-null
Copy-Item -Path "$pkg_src" -Destination "$pkg_dst" -Recurse Copy-Item -Path "$pkg_src" -Destination "$pkg_dst" -Recurse

View File

@@ -1,5 +1,5 @@
#!/bin/pwsh #!/bin/pwsh
Write-Output "'archiver@$Env:WEBI_TAG' is an alias for 'arc@$Env:WEBI_VERSION'" echo "'archiver@$Env:WEBI_TAG' is an alias for 'arc@$Env:WEBI_VERSION'"
IF ($null -eq $Env:WEBI_HOST -or $Env:WEBI_HOST -eq "") { $Env:WEBI_HOST = "https://webinstall.dev" } IF ($Env:WEBI_HOST -eq $null -or $Env:WEBI_HOST -eq "") { $Env:WEBI_HOST = "https://webinstall.dev" }
curl.exe -fsSL "$Env:WEBI_HOST/arc@$Env:WEBI_VERSION" | powershell curl.exe -fsSL "$Env:WEBI_HOST/arc@$Env:WEBI_VERSION" | powershell

View File

@@ -1,538 +0,0 @@
---
title: atomicparsley
homepage: https://github.com/wez/atomicparsley
tagline: |
AtomicParsley is a lightweight tool for reading, parsing and setting iTunes-style metadata.
---
To update or switch versions, run `webi atomicparsley@stable` (or `@v20221229`,
`@beta`, etc).
### Files
These are the files / directories that are created and/or modified with this
install:
```text
~/.config/envman/PATH.env
~/.local/bin/AtomicParsley
```
**Windows Users**
```text
\Windows\System32\vcruntime140.dll
```
This will also attempt to install the
[Microsoft Visual C++ Redistributable](/vcruntime) via `webi vcruntime`. If it
fails and you get the error _`vcruntime140.dll` was not found_, you'll need to
[install it manually](https://learn.microsoft.com/en-US/cpp/windows/latest-supported-vc-redist?view=msvc-170).
## Cheat Sheet
> `AtomicParsley` is an alternative to `ffmpeg` and `ffprobe` for viewing and
> changing metadata in MPEG-4 files with .3gp, .3g2, .mp4, .m4a, .m4b, .m4p,
> .m4r, and .m4v extensions. Because it's purpose-built for MP4 containers, it
> can do some things `ffmpeg` can't.
### How to Change Album Art
1. Save any existing cover art
```sh
AtomicParsley ./my-song.m4a --extractPixToPath ./ 'my-song'
```
2. Remove the artwork
```sh
AtomicParsley ./my-song.m4a --artwork REMOVE_ALL
```
3. **(macOS ONLY)** Add new artwork at the specified DPI (and other constraints)
```sh
export PIC_OPTIONS="DPI=72"
AtomicParsley ./my-podcast-audiobook.m4b --artwork ./my-season-1-cover.jpg
```
Only JPEG and PNG are supported. See `PIC_OPTIONS` down below for more options.
If you get an error, try exporting your file with a DPI to 72 (or up to 300 with
`PIC_OPTIONS` set) and a smaller resolution - perhaps 600x600 or 1500x1500 (what
old versions iTunes versions used).
### How to Remove Apple Account Info
```sh
AtomicParsley ./my-file.m4a \
--DeepScan \
--manualAtomRemove "moov.trak.mdia.minf.stbl.mp4a.pinf" \
--manualAtomRemove "moov.udta.meta.ilst.apID" \
--manualAtomRemove "moov.udta.meta.ilst.cnID" \
--manualAtomRemove "moov.udta.meta.ilst.purd" \
--manualAtomRemove "moov.udta.meta.ilst.sfID" \
--manualAtomRemove "moov.udta.meta.ilst.soal" \
--manualAtomRemove "moov.udta.meta.ilst.xid"
```
If you wanted to also remove information that indicates which Country or
Language the song was purchased in, or which album it was purchased from, there
are some additional IDs to consider:
| Metadata Tag | Description |
| ---------------------------------------- | -------------------------------------------- |
| moov.udta.meta.ilst.apID | Apple account email address |
| moov.udta.meta.ilst.ownr | Apple account username |
| moov.udta.meta.ilst.atID | Artist-track ID |
| moov.udta.meta.ilst.cnID | iTunes Catalog ID |
| moov.udta.meta.ilst.geID | Genre ID |
| moov.udta.meta.ilst.plID | Playlist ID (identifies album) |
| moov.udta.meta.ilst.sfID | iTunes store identifier (location/number) |
| moov.udta.meta.ilst.cprt | Copyright information |
| moov.udta.meta.ilst.flvr | Bitrate/video size related |
| moov.udta.meta.ilst.purd | Date purchased |
| moov.udta.meta.ilst.rtng | Explicit/Clean information |
| moov.udta.meta.ilst.soal | Album sort name |
| moov.udta.meta.ilst.stik | Media type information |
| moov.udta.meta.ilst.xid | Vendor xID |
| moov.udta.meta.ilst.----.name:[iTunMOVI] | Embedded plist contains filesize and flavor. |
| moov.trak.mdia.minf.stbl.stsd.mp4a.pinf | Purchase information related |
See <https://gist.github.com/riophae/f5694fd2952cb64982689b971ca6ec79>.
### Genre Lists
All values are **case sensitive**.
#### The "stik" List
These values are **case sensitive**:
0. `Home Video`
1. `Normal` (meaning music)
2. `Audiobook` (changes extension to .m4b)
3. `Whacked Bookmark`
4. `Music Video`
5. `Movie`
6. `Short Film`
7. `TV Show`
8. `Booklet`
#### Standard Music Genres
```txt
(1.) Blues
(2.) Classic Rock
(3.) Country
(4.) Dance
(5.) Disco
(6.) Funk
(7.) Grunge
(8.) Hip-Hop
(9.) Jazz
(10.) Metal
(11.) New Age
(12.) Oldies
(13.) Other
(14.) Pop
(15.) R&B
(16.) Rap
(17.) Reggae
(18.) Rock
(19.) Techno
(20.) Industrial
(21.) Alternative
(22.) Ska
(23.) Death Metal
(24.) Pranks
(25.) Soundtrack
(26.) Euro-Techno
(27.) Ambient
(28.) Trip-Hop
(29.) Vocal
(30.) Jazz+Funk
(31.) Fusion
(32.) Trance
(33.) Classical
(34.) Instrumental
(35.) Acid
(36.) House
(37.) Game
(38.) Sound Clip
(39.) Gospel
(40.) Noise
(41.) AlternRock
(42.) Bass
(43.) Soul
(44.) Punk
(45.) Space
(46.) Meditative
(47.) Instrumental Pop
(48.) Instrumental Rock
(49.) Ethnic
(50.) Gothic
(51.) Darkwave
(52.) Techno-Industrial
(53.) Electronic
(54.) Pop-Folk
(55.) Eurodance
(56.) Dream
(57.) Southern Rock
(58.) Comedy
(59.) Cult
(60.) Gangsta
(61.) Top 40
(62.) Christian Rap
(63.) Pop/Funk
(64.) Jungle
(65.) Native American
(66.) Cabaret
(67.) New Wave
(68.) Psychadelic
(69.) Rave
(70.) Showtunes
(71.) Trailer
(72.) Lo-Fi
(73.) Tribal
(74.) Acid Punk
(75.) Acid Jazz
(76.) Polka
(77.) Retro
(78.) Musical
(79.) Rock & Roll
(80.) Hard Rock
(81.) Folk
(82.) Folk/Rock
(83.) National Folk
(84.) Swing
(85.) Fast Fusion
(86.) Bebob
(87.) Latin
(88.) Revival
(89.) Celtic
(90.) Bluegrass
(91.) Avantgarde
(92.) Gothic Rock
(93.) Progressive Rock
(94.) Psychedelic Rock
(95.) Symphonic Rock
(96.) Slow Rock
(97.) Big Band
(98.) Chorus
(99.) Easy Listening
(100.) Acoustic
(101.) Humour
(102.) Speech
(103.) Chanson
(104.) Opera
(105.) Chamber Music
(106.) Sonata
(107.) Symphony
(108.) Booty Bass
(109.) Primus
(110.) Porn Groove
(111.) Satire
(112.) Slow Jam
(113.) Club
(114.) Tango
(115.) Samba
(116.) Folklore
(117.) Ballad
(118.) Power Ballad
(119.) Rhythmic Soul
(120.) Freestyle
(121.) Duet
(122.) Punk Rock
(123.) Drum Solo
(124.) A Capella
(125.) Euro-House
(126.) Dance Hall
```
#### iTunes Movie Genre IDs
```sh
AtomicParsley --genre-movie-id-list
```
```text
(4401) Action & Adventure
(4402) Anime
(4403) Classics
(4404) Comedy
(4405) Documentary
(4406) Drama
(4407) Foreign
(4408) Horror
(4409) Independent
(4410) Kids & Family
(4411) Musicals
(4412) Romance
(4413) Sci-Fi & Fantasy
(4414) Short Films
(4415) Special Interest
(4416) Thriller
(4417) Sports
(4418) Western
(4419) Urban
(4420) Holiday
(4421) Made for TV
(4422) Concert Films
(4423) Music Documentaries
(4424) Music Feature Films
(4425) Japanese Cinema
(4426) Jidaigeki
(4427) Tokusatsu
(4428) Korean Cinema
```
#### iTunes TV Genre IDs
```sh
AtomicParsley --genre-tv-id-list
```
```text
(4000) Comedy
(4001) Drama
(4002) Animation
(4003) Action & Adventure
(4004) Classic
(4005) Kids
(4005) Nonfiction
(4007) Reality TV
(4008) Sci-Fi & Fantasy
(4009) Sports
(4010) Teens
(4011) Latino TV
```
### Help
Note: Normally we don't include full help text, but since AtomicParsley has a
long history across various maintainers and repos, we feel it's appropriate to
do so in this case.
```text
AtomicParsley sets metadata into MPEG-4 files & derivatives supporting 3 tag
schemes: iTunes-style, 3GPP assets & ISO defined copyright notifications.
AtomicParsley quick help for setting iTunes-style metadata into MPEG-4 files.
General usage examples:
AtomicParsley /path/to.mp4 -T 1
AtomicParsley /path/to.mp4 -t +
AtomicParsley /path/to.mp4 --artist "Me" --artwork /path/to/art.jpg
Atomicparsley /path/to.mp4 --albumArtist "You" --podcastFlag true
Atomicparsley /path/to.mp4 --stik "TV Show" --advisory explicit
Getting information about the file & tags:
-T --test Test file for mpeg4-ishness & print atom tree
-t --textdata Prints tags embedded within the file
-E --extractPix Extracts pix to the same folder as the mpeg-4 file
Setting iTunes-style metadata tags
--artist (string) Set the artist tag
--title (string) Set the title tag
--album (string) Set the album tag
--genre (string) Genre tag (see --longhelp for more info)
--tracknum (num)[/tot] Track number (or track number/total tracks)
--disk (num)[/tot] Disk number (or disk number/total disks)
--comment (string) Set the comment tag
--year (num|UTC) Year tag (see --longhelp for "Release Date")
--lyrics (string) Set lyrics (not subject to 256 byte limit)
--lyricsFile (/path) Set lyrics to the content of a file
--composer (string) Set the composer tag
--copyright (string) Set the copyright tag
--grouping (string) Set the grouping tag
--artwork (/path) Set a piece of artwork (jpeg or png only)
--bpm (number) Set the tempo/bpm
--albumArtist (string) Set the album artist tag
--compilation (boolean) Set the compilation flag (true or false)
--hdvideo (number) Set the hdvideo flag to one of:
false or 0 for standard definition
true or 1 for 720p
2 for 1080p
--advisory (string*) Content advisory (*values: 'clean', 'explicit')
--stik (string*) Sets the iTunes "stik" atom (see --longhelp)
--description (string) Set the description tag
--longdesc (string) Set the long description tag
--storedesc (string) Set the store description tag
--TVNetwork (string) Set the TV Network name
--TVShowName (string) Set the TV Show name
--TVEpisode (string) Set the TV episode/production code
--TVSeasonNum (number) Set the TV Season number
--TVEpisodeNum (number) Set the TV Episode number
--podcastFlag (boolean) Set the podcast flag (true or false)
--category (string) Sets the podcast category
--keyword (string) Sets the podcast keyword
--podcastURL (URL) Set the podcast feed URL
--podcastGUID (URL) Set the episode's URL tag
--purchaseDate (UTC) Set time of purchase
--encodingTool (string) Set the name of the encoder
--encodedBy (string) Set the name of the Person/company who encoded the file
--apID (string) Set the Account Name
--cnID (number) Set the iTunes Catalog ID (see --longhelp)
--geID (number) Set the iTunes Genre ID (see --longhelp)
--xID (string) Set the vendor-supplied iTunes xID (see --longhelp)
--gapless (boolean) Set the gapless playback flag
--contentRating (string*) Set tv/mpaa rating (see -rDNS-help)
Deleting tags
Set the value to "": --artist "" --stik "" --bpm ""
To delete (all) artwork: --artwork REMOVE_ALL
manually removal: --manualAtomRemove "moov.udta.meta.ilst.ATOM"
More detailed iTunes help is available with AtomicParsley --longhelp
Setting reverse DNS forms for iTunes files: see --reverseDNS-help
Setting 3gp assets into 3GPP & derivative files: see --3gp-help
Setting copyright notices for all files: see --ISO-help
For file-level options & padding info: see --file-help
Setting custom private tag extensions: see --uuid-help
Setting ID3 tags onto mpeg-4 files: see --ID3-help
----------------------------------------------------------------------
AtomicParsley version: 20221229.172126.0 d813aa6e0304ed3ab6d92f1ae96cd52b586181ec (utf8)
Submit bug fixes to https://github.com/wez/atomicparsley
```
### `--longhelp`
```text
AtomicParsley help page for setting iTunes-style metadata into MPEG-4 files.
(3gp help available with AtomicParsley --3gp-help)
(ISO copyright help available with AtomicParsley --ISO-help)
(reverse DNS form help available with AtomicParsley --reverseDNS-help)
Usage: AtomicParsley [mp4FILE]... [OPTION]... [ARGUMENT]... [ [OPTION2]...[ARGUMENT2]...]
example: AtomicParsley /path/to.mp4 -e ~/Desktop/pix
example: AtomicParsley /path/to.mp4 --podcastURL "http://www.url.net" --tracknum 45/356
example: AtomicParsley /path/to.mp4 --copyright "℗ © 2006"
example: AtomicParsley /path/to.mp4 --year "2006-07-27T14:00:43Z" --purchaseDate timestamp
example: AtomicParsley /path/to.mp4 --sortOrder artist "Mighty Dub Cats, The
------------------------------------------------------------------------------------------------
Extract any pictures in user data "covr" atoms to separate files.
--extractPix , -E Extract to same folder (basename derived from file).
--extractPixToPath , -e (/path/basename) Extract to specific path (numbers added to basename).
example: --e ~/Desktop/SomeText
gives: SomeText_artwork_1.jpg SomeText_artwork_2.png
Note: extension comes from embedded image file format
------------------------------------------------------------------------------------------------
Tag setting options:
--artist , -a (str) Set the artist tag: "moov.udta.meta.ilst.©ART.data"
--title , -s (str) Set the title tag: "moov.udta.meta.ilst.©nam.data"
--album , -b (str) Set the album tag: "moov.udta.meta.ilst.©alb.data"
--genre , -g (str) Set the genre tag: "©gen" (custom) or "gnre" (standard).
see the standard list with "AtomicParsley --genre-list"
--tracknum , -k (num)[/tot] Set the track number (or track number & total tracks).
--disk , -d (num)[/tot] Set the disk number (or disk number & total disks).
--comment , -c (str) Set the comment tag: "moov.udta.meta.ilst.©cmt.data"
--year , -y (num|UTC) Set the year tag: "moov.udta.meta.ilst.©day.data"
set with UTC "2006-09-11T09:00:00Z" for Release Date
--lyrics , -l (str) Set the lyrics tag: "moov.udta.meta.ilst.©lyr.data"
--lyricsFile , (/path) Set the lyrics tag to the content of a file
--composer , -w (str) Set the composer tag: "moov.udta.meta.ilst.©wrt.data"
--copyright , -x (str) Set the copyright tag: "moov.udta.meta.ilst.cprt.data"
--grouping , -G (str) Set the grouping tag: "moov.udta.meta.ilst.©grp.data"
--artwork , -A (/path) Set a piece of artwork (jpeg or png) on "covr.data"
Note: multiple pieces are allowed with more --artwork args
--bpm , -B (num) Set the tempo/bpm tag: "moov.udta.meta.ilst.tmpo.data"
--albumArtist , -A (str) Set the album artist tag: "moov.udta.meta.ilst.aART.data"
--compilation , -C (bool) Sets the "cpil" atom (true or false to delete the atom)
--hdvideo , -V (bool) Sets the "hdvd" atom (true or false to delete the atom)
--advisory , -y (1of3) Sets the iTunes lyrics advisory ('remove', 'clean', 'explicit')
--stik , -S (1of7) Sets the iTunes "stik" atom (--stik "remove" to delete)
"Movie", "Normal", "TV Show" .... others:
see the full list with "AtomicParsley --stik-list"
or set in an integer value with --stik value=(num)
Note: --stik Audiobook will change file extension to '.m4b'
--description , -p (str) Sets the description on the "desc" atom
--Rating , (str) Sets the Rating on the "rate" atom
--longdesc , -j (str) Sets the long description on the "ldes" atom
--storedesc , (str) Sets the iTunes store description on the "sdes" atom
--TVNetwork , -n (str) Sets the TV Network name on the "tvnn" atom
--TVShowName , -H (str) Sets the TV Show name on the "tvsh" atom
--TVEpisode , -I (str) Sets the TV Episode on "tven":"209", but it is a string: "209 Part 1"
--TVSeasonNum , -U (num) Sets the TV Season number on the "tvsn" atom
--TVEpisodeNum , -N (num) Sets the TV Episode number on the "tves" atom
--podcastFlag , -f (bool) Sets the podcast flag (values are "true" or "false")
--category , -q (str) Sets the podcast category; typically a duplicate of its genre
--keyword , -K (str) Sets the podcast keyword; invisible to MacOSX Spotlight
--podcastURL , -L (URL) Set the podcast feed URL on the "purl" atom
--podcastGUID , -J (URL) Set the episode's URL tag on the "egid" atom
--purchaseDate , -D (UTC) Set Universal Coordinated Time of purchase on a "purd" atom
(use "timestamp" to set UTC to now; can be akin to id3v2 TDTG tag)
--encodingTool , (str) Set the name of the encoder on the "©too" atom
--encodedBy , (str) Set the name of the Person/company who encoded the file on the "©enc" atom
--apID , -Y (str) Set the name of the Account Name on the "apID" atom
--cnID , (num) Set iTunes Catalog ID, used for combining SD and HD encodes in iTunes on the "cnID" atom
To combine you must set "hdvd" atom on one file and must have same "stik" on both file
Must not use "stik" of value Home Video(0), use Movie(9)
iTunes Catalog numbers can be obtained by finding the item in the iTunes Store. Once item
is found in the iTunes Store right click on picture of item and select copy link. Paste this link
into a document or web browser to display the catalog number ID.
An example link for the video Street Kings is:
http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewMovie?id=278743714&s=143441
Here you can see the cnID is 278743714
Alternatively you can use iMDB numbers, however these will not match the iTunes catalog.
--geID , (num) Set iTunes Genre ID. This does not necessarily have to match genre.
See --genre-movie-id-list and --genre-tv-id-list
--xID , (str) Set iTunes vendor-supplied xID, used to allow iTunes LPs and iTunes Extras to interact
with other content in your iTunes Library
--gapless , (bool) Sets the gapless playback flag for a track in a gapless album
--sortOrder (type) (str) Sets the sort order string for that type of tag.
(available types are: "name", "artist", "albumartist",
"album", "composer", "show")
NOTE: Except for artwork, only 1 of each tag is allowed; artwork allows multiple pieces.
NOTE: Tags that carry text(str) have a limit of 255 utf8 characters;
however lyrics and long descriptions have no limit.
------------------------------------------------------------------------------------------------
To delete a single atom, set the tag to null (except artwork):
--artist "" --lyrics ""
--artwork REMOVE_ALL
--metaEnema , -P Douches away every atom under "moov.udta.meta.ilst"
--foobar2000Enema , -2 Eliminates foobar2000's non-compliant so-out-o-spec tagging scheme
--manualAtomRemove "some.atom.path" where some.atom.path can be:
keys to using manualAtomRemove:
ilst.ATOM.data or ilst.ATOM target an iTunes-style metadata tag
ATOM:lang=foo target an atom with this language setting; like 3gp assets
ATOM.----.name:[foo] target a reverseDNS metadata tag; like iTunNORM
Note: these atoms show up with 'AP -t' as: Atom "----" [foo]
'foo' is actually carried on the 'name' atom
ATOM[x] target an atom with an index other than 1; like trak[2]
ATOM.uuid=hex-hex-hex-hex targt a uuid atom with the uuid of hex string representation
examples:
moov.udta.meta.ilst.----.name:[iTunNORM] moov.trak[3].cprt:lang=urd
moov.trak[2].uuid=55534d54-21d2-4fce-bb88-695cfac9c740
------------------------------------------------------------------------------------------------
Environmental Variables (affecting picture placement) (macOS ONLY)
set PIC_OPTIONS in your shell to set these flags; preferences are separated by colons (:)
MaxDimensions=num (default: 0; unlimited); sets maximum pixel dimensions
DPI=num (default: 72); sets dpi
MaxKBytes=num (default: 0; unlimited); maximum kilobytes for file (jpeg only)
AddBothPix=bool (default: false); add original & converted pic (for archival purposes)
AllPixJPEG | AllPixPNG =bool (default: false); force conversion to a specific picture format
SquareUp (include to square images to largest dimension, allows an [ugly] 160x1200->1200x1200)
removeTempPix (include to delete temp pic files created when resizing images after tagging)
ForceHeight=num (must also specify width, below) force image pixel height
ForceWidth=num (must also specify height, above) force image pixel width
Examples: (bash-style)
export PIC_OPTIONS="MaxDimensions=400:DPI=72:MaxKBytes=100:AddBothPix=true:AllPixJPEG=true"
export PIC_OPTIONS="SquareUp:removeTempPix"
export PIC_OPTIONS="ForceHeight=999:ForceWidth=333:removeTempPix"
------------------------------------------------------------------------------------------------
```
```
```

View File

@@ -1,60 +0,0 @@
#!/usr/bin/env pwsh
#########################
# Install AtomicParsley #
#########################
# Every package should define these variables
$pkg_cmd_name = "AtomicParsley"
$pkg_dst_cmd = "$Env:USERPROFILE\.local\bin\AtomicParsley.exe"
$pkg_dst_bin = "$Env:USERPROFILE\.local\bin"
$pkg_dst = "$pkg_dst_cmd"
$pkg_src_cmd = "$Env:USERPROFILE\.local\opt\AtomicParsley-v$Env:WEBI_VERSION\bin\AtomicParsley.exe"
$pkg_src_bin = "$Env:USERPROFILE\.local\opt\AtomicParsley-v$Env:WEBI_VERSION\bin"
$pkg_src_dir = "$Env:USERPROFILE\.local\opt\AtomicParsley-v$Env:WEBI_VERSION"
$pkg_src = "$pkg_src_cmd"
New-Item "$Env:USERPROFILE\Downloads\webi" -ItemType Directory -Force | Out-Null
$pkg_download = "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE"
# Fetch archive
IF (!(Test-Path -Path "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE")) {
Write-Output "Checking for (or Installing) MSVC Runtime..."
& "$Env:USERPROFILE\.local\bin\webi-pwsh.ps1" vcruntime
Write-Output "Downloading AtomicParsley from $Env:WEBI_PKG_URL to $pkg_download"
& curl.exe -A "$Env:WEBI_UA" -fsSL "$Env:WEBI_PKG_URL" -o "$pkg_download.part"
& Move-Item "$pkg_download.part" "$pkg_download"
}
IF (!(Test-Path -Path "$pkg_src_cmd")) {
Write-Output "Installing AtomicParsley"
# TODO: create package-specific temp directory
# Enter tmp
Push-Location .local\tmp
# Remove any leftover tmp cruft
Remove-Item -Path ".\AtomicParsley-v*" -Recurse -ErrorAction Ignore
Remove-Item -Path ".\AtomicParsley.exe" -Recurse -ErrorAction Ignore
# Unpack archive file into this temporary directory
# Windows BSD-tar handles zip. Imagine that.
Write-Output "Unpacking $pkg_download"
& tar xf "$pkg_download"
# Settle unpacked archive into place
Write-Output "Install Location: $pkg_src_cmd"
New-Item "$pkg_src_bin" -ItemType Directory -Force | Out-Null
Move-Item -Path ".\AtomicParsley.exe" -Destination "$pkg_src_bin"
# Exit tmp
Pop-Location
}
Write-Output "Copying into '$pkg_dst_cmd' from '$pkg_src_cmd'"
Remove-Item -Path "$pkg_dst_cmd" -Recurse -ErrorAction Ignore | Out-Null
New-Item "$pkg_dst_bin" -ItemType Directory -Force | Out-Null
Copy-Item -Path "$pkg_src" -Destination "$pkg_dst" -Recurse

View File

@@ -1,41 +0,0 @@
#!/bin/sh
set -e
set -u
__init_atomicparsley() {
#########################
# Install AtomicParsley #
#########################
WEBI_SINGLE=true
# Every package should define these 6 variables
pkg_cmd_name="AtomicParsley"
pkg_dst_cmd="$HOME/.local/bin/AtomicParsley"
pkg_dst="$pkg_dst_cmd"
pkg_src_cmd="$HOME/.local/opt/AtomicParsley-v$WEBI_VERSION/bin/AtomicParsley"
pkg_src_dir="$HOME/.local/opt/AtomicParsley-v$WEBI_VERSION"
pkg_src="$pkg_src_cmd"
# pkg_install must be defined by every package
pkg_install() {
# ~/.local/opt/AtomicParsley-v20221229.172126.0/bin
mkdir -p "$(dirname "$pkg_src_cmd")"
# mv ./AtomicParsley ~/.local/opt/AtomicParsley-v20221229.172126.0/bin/AtomicParsley
mv ./"$pkg_cmd_name" "$pkg_src_cmd"
}
pkg_get_current_version() {
# 'AtomicParsley --version' has output in this format:
# AtomicParsley version: 20221229.172126.0 d813aa6e0304ed3ab6d92f1ae96cd52b586181ec (utf8)
# This trims it down to just the version number:
# 20221229.172126.0
AtomicParsley --version 2> /dev/null | head -n 1 | cut -d' ' -f3
}
}
__init_atomicparsley

View File

@@ -1,74 +0,0 @@
'use strict';
var github = require('../_common/github.js');
var owner = 'wez';
var repo = 'atomicparsley';
let targets = {
x86win: {
os: 'windows',
arch: 'x86',
},
x64win: {
os: 'windows',
arch: 'amd64',
},
x64mac: {
os: 'macos',
arch: 'amd64',
},
x64lin: {
os: 'linux',
arch: 'amd64',
},
x64musl: {
os: 'linux',
arch: 'amd64',
_musl_native: true,
},
};
module.exports = function (request) {
return github(request, owner, repo).then(function (all) {
for (let rel of all.releases) {
let windows32 = rel.name.includes('WindowsX86.');
if (windows32) {
Object.assign(rel, targets.x86win);
continue;
}
let windows64 = rel.name.includes('Windows.');
if (windows64) {
Object.assign(rel, targets.x64win);
continue;
}
let macos64 = rel.name.includes('MacOS');
if (macos64) {
Object.assign(rel, targets.x64mac);
continue;
}
let musl64 = rel.name.includes('Alpine');
if (musl64) {
Object.assign(rel, targets.x64musl);
continue;
}
let lin64 = rel.name.includes('Linux.');
if (lin64) {
Object.assign(rel, targets.x64lin);
continue;
}
}
return all;
});
};
if (module === require.main) {
module.exports(require('@root/request')).then(function (all) {
all = require('../_webi/normalize.js')(all);
console.info(JSON.stringify(all));
//console.info(JSON.stringify(all, null, 2));
});
}

View File

@@ -7,17 +7,6 @@ tagline: |
To update or switch versions, run `webi awless@stable` (or `@v2`, `@beta`, etc). To update or switch versions, run `webi awless@stable` (or `@v2`, `@beta`, etc).
### Files
These are the files / directories that are created and/or modified with this
install:
```text
~/.config/envman/PATH.env
~/.local/bin/awless
~/.aws/credentials
```
## Cheat Sheet ## Cheat Sheet
awless is modeled after popular command-line tools such as Git. Most commands awless is modeled after popular command-line tools such as Git. Most commands

View File

@@ -16,22 +16,22 @@ $pkg_src_bin = "$Env:USERPROFILE\.local\opt\awless-v$Env:WEBI_VERSION\bin"
$pkg_src_dir = "$Env:USERPROFILE\.local\opt\awless-v$Env:WEBI_VERSION" $pkg_src_dir = "$Env:USERPROFILE\.local\opt\awless-v$Env:WEBI_VERSION"
$pkg_src = "$pkg_src_cmd" $pkg_src = "$pkg_src_cmd"
New-Item "$Env:USERPROFILE\Downloads\webi" -ItemType Directory -Force | Out-Null New-Item "$Env:USERPROFILE\Downloads\webi" -ItemType Directory -Force | out-null
$pkg_download = "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE" $pkg_download = "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE"
# Fetch archive # Fetch archive
IF (!(Test-Path -Path "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE")) { IF (!(Test-Path -Path "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE")) {
Write-Output "Downloading awless from $Env:WEBI_PKG_URL to $pkg_download" echo "Downloading awless from $Env:WEBI_PKG_URL to $pkg_download"
& curl.exe -A "$Env:WEBI_UA" -fsSL "$Env:WEBI_PKG_URL" -o "$pkg_download.part" & curl.exe -A "$Env:WEBI_UA" -fsSL "$Env:WEBI_PKG_URL" -o "$pkg_download.part"
& Move-Item "$pkg_download.part" "$pkg_download" & move "$pkg_download.part" "$pkg_download"
} }
IF (!(Test-Path -Path "$pkg_src_cmd")) { IF (!(Test-Path -Path "$pkg_src_cmd")) {
Write-Output "Installing awless" echo "Installing awless"
# TODO: create package-specific temp directory # TODO: create package-specific temp directory
# Enter tmp # Enter tmp
Push-Location .local\tmp pushd .local\tmp
# Remove any leftover tmp cruft # Remove any leftover tmp cruft
Remove-Item -Path ".\awless-v*" -Recurse -ErrorAction Ignore Remove-Item -Path ".\awless-v*" -Recurse -ErrorAction Ignore
@@ -39,19 +39,19 @@ IF (!(Test-Path -Path "$pkg_src_cmd")) {
# Unpack archive file into this temporary directory # Unpack archive file into this temporary directory
# Windows BSD-tar handles zip. Imagine that. # Windows BSD-tar handles zip. Imagine that.
Write-Output "Unpacking $pkg_download" echo "Unpacking $pkg_download"
& tar xf "$pkg_download" & tar xf "$pkg_download"
# Settle unpacked archive into place # Settle unpacked archive into place
Write-Output "Install Location: $pkg_src_cmd" echo "Install Location: $pkg_src_cmd"
New-Item "$pkg_src_bin" -ItemType Directory -Force | Out-Null New-Item "$pkg_src_bin" -ItemType Directory -Force | out-null
Move-Item -Path ".\awless.exe" -Destination "$pkg_src_bin" Move-Item -Path ".\awless.exe" -Destination "$pkg_src_bin"
# Exit tmp # Exit tmp
Pop-Location popd
} }
Write-Output "Copying into '$pkg_dst_cmd' from '$pkg_src_cmd'" echo "Copying into '$pkg_dst_cmd' from '$pkg_src_cmd'"
Remove-Item -Path "$pkg_dst_cmd" -Recurse -ErrorAction Ignore | Out-Null Remove-Item -Path "$pkg_dst_cmd" -Recurse -ErrorAction Ignore | out-null
New-Item "$pkg_dst_bin" -ItemType Directory -Force | Out-Null New-Item "$pkg_dst_bin" -ItemType Directory -Force | out-null
Copy-Item -Path "$pkg_src" -Destination "$pkg_dst" -Recurse Copy-Item -Path "$pkg_src" -Destination "$pkg_dst" -Recurse

View File

@@ -9,31 +9,26 @@ To update or switch versions, run `webi bat@stable` (or `@v0.18`, `@beta`, etc).
### Files ### Files
These are the files / directories that are created and/or modified with this
install:
```text ```text
~/.config/envman/PATH.env ~/.config/envman/PATH.env
~/.config/bat/config ~/.config/bat/config
~/.local/opt/bat/ ~/.local/opt/bat/
``` ```
**Windows Users**
```text
\Windows\System32\vcruntime140.dll
```
This will also attempt to install the
[Microsoft Visual C++ Redistributable](/vcruntime) via `webi vcruntime`. If it
fails and you get the error _`vcruntime140.dll` was not found_, you'll need to
[install it manually](https://learn.microsoft.com/en-US/cpp/windows/latest-supported-vc-redist?view=msvc-170).
## Cheat Sheet ## Cheat Sheet
> `bat` is pretty much what `cat` would be if it were developed today's in the > `bat` is pretty much what `cat` would be if it were developed today's in the
> world of Markdown, git, etc. > world of Markdown, git, etc.
### How to run on Windows
On Windows you'll get an error like this:
> execution cannot proceed run because vcruntime140.dll was not found
You need to download and install the
[Microsoft Visual C++ Redistributable](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads)
### How to alias as `cat` ### How to alias as `cat`
Use [aliasman](/aliasman): Use [aliasman](/aliasman):

View File

@@ -3,45 +3,41 @@
$VERNAME = "$Env:PKG_NAME-v$Env:WEBI_VERSION.exe" $VERNAME = "$Env:PKG_NAME-v$Env:WEBI_VERSION.exe"
$EXENAME = "$Env:PKG_NAME.exe" $EXENAME = "$Env:PKG_NAME.exe"
# Fetch archive # Fetch archive
IF (!(Test-Path -Path "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE")) { IF (!(Test-Path -Path "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE"))
Write-Output "Downloading $Env:PKG_NAME from $Env:WEBI_PKG_URL to $Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE" {
echo "Downloading $Env:PKG_NAME from $Env:WEBI_PKG_URL to $Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE"
& curl.exe -A "$Env:WEBI_UA" -fsSL "$Env:WEBI_PKG_URL" -o "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE.part" & curl.exe -A "$Env:WEBI_UA" -fsSL "$Env:WEBI_PKG_URL" -o "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE.part"
& Move-Item "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE.part" "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE" & move "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE.part" "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE"
} }
# Fetch MSVC Runtime IF (!(Test-Path -Path "$Env:USERPROFILE\.local\xbin\$VERNAME"))
Write-Output "Checking for MSVC Runtime..." {
IF (-not (Test-Path "\Windows\System32\vcruntime140.dll")) { echo "Installing $Env:PKG_NAME"
& "$Env:USERPROFILE\.local\bin\webi-pwsh.ps1" vcruntime
}
IF (!(Test-Path -Path "$Env:USERPROFILE\.local\xbin\$VERNAME")) {
Write-Output "Installing $Env:PKG_NAME"
# TODO: temp directory # TODO: temp directory
# Enter tmp # Enter tmp
Push-Location .local\tmp pushd .local\tmp
# Remove any leftover tmp cruft # Remove any leftover tmp cruft
Remove-Item -Path "$Env:PKG_NAME-v*" -Recurse -ErrorAction Ignore Remove-Item -Path "$Env:PKG_NAME-v*" -Recurse -ErrorAction Ignore
# Unpack archive # Unpack archive
# Windows BSD-tar handles zip. Imagine that. # Windows BSD-tar handles zip. Imagine that.
Write-Output "Unpacking $Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE" echo "Unpacking $Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE"
& tar xf "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE" & tar xf "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE"
# Move single binary into root of temporary folder # Move single binary into root of temporary folder
& Move-Item "bat-*\$EXENAME" "$VERNAME" & move "bat-*\$EXENAME" "$VERNAME"
# Settle unpacked archive into place # Settle unpacked archive into place
Write-Output "New Name: $VERNAME" echo "New Name: $VERNAME"
Write-Output "New Location: $Env:USERPROFILE\.local\xbin\$VERNAME" echo "New Location: $Env:USERPROFILE\.local\xbin\$VERNAME"
Move-Item -Path "$VERNAME" -Destination "$Env:USERPROFILE\.local\xbin" Move-Item -Path "$VERNAME" -Destination "$Env:USERPROFILE\.local\xbin"
# Exit tmp # Exit tmp
Pop-Location popd
} }
Write-Output "Copying into '$Env:USERPROFILE\.local\bin\$EXENAME' from '$Env:USERPROFILE\.local\xbin\$VERNAME'" echo "Copying into '$Env:USERPROFILE\.local\bin\$EXENAME' from '$Env:USERPROFILE\.local\xbin\$VERNAME'"
Remove-Item -Path "$Env:USERPROFILE\.local\bin\$EXENAME" -Recurse -ErrorAction Ignore Remove-Item -Path "$Env:USERPROFILE\.local\bin\$EXENAME" -Recurse -ErrorAction Ignore
Copy-Item -Path "$Env:USERPROFILE\.local\xbin\$VERNAME" -Destination "$Env:USERPROFILE\.local\bin\$EXENAME" -Recurse Copy-Item -Path "$Env:USERPROFILE\.local\xbin\$VERNAME" -Destination "$Env:USERPROFILE\.local\bin\$EXENAME" -Recurse

View File

@@ -78,6 +78,3 @@ recommended.
- [iterm2](/iterm2) - [iterm2](/iterm2)
- [fish](/fish) - [fish](/fish)
- [NerdFont](/nerdfont) - [NerdFont](/nerdfont)
- git
- vim
- zip

View File

@@ -90,85 +90,22 @@ fn_node_install() { (
fi fi
); } ); }
fn_git_install() { (
if [ "Darwin" = "$(uname -s)" ]; then
needs_xcode="$(
/usr/bin/xcode-select -p > /dev/null 2> /dev/null || echo "true"
)"
if [ -n "${needs_xcode}" ]; then
echo ""
echo ""
printf "\e[31m[Error]\e[0m: Run this command to install XCode Command Line Tools first:\n"
echo ""
echo " xcode-select --install"
echo ""
echo "After the install, close this terminal, open a new one, and try again."
echo ""
exit 1
else
my_git="$(command -v git)"
echo "[Info] Found ${my_git}"
fi
return 0
fi
if ! command -v git > /dev/null; then
fn_apt_get git git
return 0
fi
my_git="$(command -v git)"
echo "[Info] Found ${my_git}"
); }
fn_apt_get() { (
my_cmd="${1:-}"
my_pkg="${2:-}"
printf "\e[31m[Warning]\e[0m \e[32m%s\e[0m not found\n" "${my_cmd}"
printf "\e[32m[Fixup]\e[0m install \e[34m%s\e[0m (may require password)\n" "${my_pkg}"
sleep 1
echo "sudo apt-get install ${my_pkg}"
# shellcheck disable=SC2030
export DEBIAN_FRONTEND=noninteractive
if ! sudo apt-get install -qq -y -o=Dpkg::Use-Pty=0 "${my_pkg}"; then
echo "failed to install ${my_cmd} on"
cat /etc/issue
fi
); }
fn_vim_install() { (
if command -v vim > /dev/null; then
my_vim="$(command -v vim)"
echo "[Info] Found ${my_vim}"
return 0
fi
fn_apt_get vim vim
); }
fn_zip_install() { (
if command -v zip > /dev/null; then
my_zip="$(command -v zip)"
echo "[Info] Found ${my_zip}"
return 0
fi
fn_apt_get zip zip
); }
fn_fish_install() { ( fn_fish_install() { (
if ! command -v fish > /dev/null; then if ! command -v fish > /dev/null; then
printf "\e[31m[Warning]\e[0m \e[32mfish\e[0m not found\n"
printf "\e[32m[Fixup]\e[0m install \e[34mfish\e[0m (may require password)\n"
sleep 1
if [ "Darwin" = "$(uname -s)" ]; then if [ "Darwin" = "$(uname -s)" ]; then
printf "\e[31m[Warning]\e[0m \e[32mfish\e[0m not found\n" "${webi_cmd}" fish
printf "\e[32m[Fixup]\e[0m install \e[34mfish\e[0m\n"
sleep 1
"${webi_cmd}" fish > /dev/null
else else
fn_apt_get fish fish echo sudo apt-get install fish
export DEBIAN_FRONTEND=noninteractive
if ! sudo apt-get install -qq -y -o=Dpkg::Use-Pty=0 fish; then
echo "failed to install fish on"
cat /etc/issue
fi
fi fi
fi fi
@@ -339,19 +276,12 @@ __install() {
{ {
printf "\e[32mwebi\e[0m at \e[32m%s\e[0m\n" '~'/.local/bin/webi printf "\e[32mwebi\e[0m at \e[32m%s\e[0m\n" '~'/.local/bin/webi
echo "" echo ""
echo "[Info] PATH updates in ~/.config/envman/PATH.env"
if [ "Darwin" = "$(uname -s)" ]; then if [ "Darwin" = "$(uname -s)" ]; then
if test -e /Applications/iTerm.app; then "${webi_cmd}" iterm2
echo "[Info] Found iTerm.app in /Applications/"
else
printf "\e[32m[Fixup]\e[0m Installing \e[32m%s\e[0m into \e[34m%s\e[0m\n" "iTerm.app" "/Applications/"
"${webi_cmd}" iterm2 > /dev/null
fi
fi fi
fn_git_install
fn_fish_install fn_fish_install
fn_zip_install
if test -e ~/.local/share/fonts/'Droid Sans Mono for Powerline Nerd Font Complete.otf'; then if test -e ~/.local/share/fonts/'Droid Sans Mono for Powerline Nerd Font Complete.otf'; then
echo "[Info] Found NerdFont in ~/.local/share/fonts" echo "[Info] Found NerdFont in ~/.local/share/fonts"
@@ -369,14 +299,13 @@ __install() {
fi fi
echo "" echo ""
echo "[Info] PATH updates in ~/.config/envman/PATH.env"
fn_path_bin fn_path_bin
fn_touch ~/.vimrc '~'/.vimrc
fn_touch ~/.config/envman/alias.env '~'/.config/envman/alias.env fn_touch ~/.config/envman/alias.env '~'/.config/envman/alias.env
fn_touch ~/.config/envman/PATH.env '~'/.config/envman/PATH.env
echo "" echo ""
fn_node_install fn_node_install
for my_cmd in aliasman bat curlie jq pathman ssh-pubkey; do for my_cmd in aliasman bat curlie jq pathman shfmt@3.5 shellcheck ssh-pubkey; do
fn_webi_bin "${my_cmd}" fn_webi_bin "${my_cmd}"
done done
@@ -388,8 +317,6 @@ __install() {
# vim config and plugins # vim config and plugins
echo "" echo ""
fn_vim_install
fn_touch ~/.vimrc '~'/.vimrc
for my_plugin in leader shell; do for my_plugin in leader shell; do
fn_webi_vimrc "${my_plugin}" fn_webi_vimrc "${my_plugin}"
done done
@@ -401,9 +328,6 @@ __install() {
for my_plugin in commentary lastplace shfmt prettier; do for my_plugin in commentary lastplace shfmt prettier; do
fn_webi_vim_plugin "${my_plugin}" fn_webi_vim_plugin "${my_plugin}"
done done
for my_cmd in shfmt@3.5 shellcheck; do
fn_webi_bin "${my_cmd}"
done
} | tee -a "${my_log}" } | tee -a "${my_log}"

View File

@@ -5,24 +5,13 @@ tagline: |
Brew: The Missing Package Manager for macOS (and Linux). Brew: The Missing Package Manager for macOS (and Linux).
--- ---
To update or switch versions, use brew's built-in upgrade management, or our ## Updating `brew`
handy update service script:
`brew` has its own built-in upgrade management.
```sh ```sh
brew update brew update
brew upgrade brew upgrade
brew-update-service-install # Webi helper script
```
### Files
These are the files / directories that are created and/or modified with this
install:
```text
~/.config/envman/PATH.env
~/.local/opt/brew/
~/.local/bin/brew-update-service-install
``` ```
## Cheat Sheet ## Cheat Sheet

View File

@@ -1,47 +0,0 @@
#!/bin/sh
set -e
set -u
main() { (
sed '1,/^#~\/.local\/bin\/brew-updater/d' "${0}" > ~/.local/bin/brew-update-hourly
chmod a+x ~/.local/bin/brew-update-hourly
env PATH="$PATH" serviceman add --user \
--name sh.brew.updater -- \
~/.local/bin/brew-update-hourly
); }
if main; then
exit 0
fi
#~/.local/bin/brew-updater
#!/bin/sh
#set -e
set -u
if test -e ~/.config/envman/PATH.env; then
# shellcheck disable=SC1090
. ~/.config/envman/PATH.env
fi
while true; do
my_start="$(date '+%s')"
my_date="$(date '+%F %T')"
echo "[$my_date] Updating brew..."
brew update
echo ''
my_end="$(date '+%s')"
my_elapsed="$((my_end - my_start))"
my_date="$(date '+%F %T')"
echo "[$my_date] Updated in ${my_elapsed}s."
echo "[$my_date] Cleaning up..."
brew cleanup
echo "[$my_date] Waiting 24 hours..."
my_wait="$((24 * 60 * 60))"
sleep "$my_wait"
done

View File

@@ -7,9 +7,9 @@ _install_brew() {
# Straight from https://brew.sh # Straight from https://brew.sh
#/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)" #/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
if test "Darwin" = "$(uname -s)"; then if [ "Darwin" = "$(uname -s)" ]; then
needs_xcode="$(/usr/bin/xcode-select -p > /dev/null 2> /dev/null || echo "true")" needs_xcode="$(/usr/bin/xcode-select -p > /dev/null 2> /dev/null || echo "true")"
if test -n "${needs_xcode}"; then if [ -n "${needs_xcode}" ]; then
echo "" echo ""
echo "" echo ""
echo "ERROR: Run this command to install XCode Command Line Tools first:" echo "ERROR: Run this command to install XCode Command Line Tools first:"
@@ -20,11 +20,11 @@ _install_brew() {
echo "" echo ""
fi fi
else else
if ! command -v gcc > /dev/null; then if [ -z "$(command -v gcc)" ]; then
echo >&2 "Warning: to install 'gcc' et al on Linux use the built-in package manager." echo >&2 "Warning: to install 'gcc' et al on Linux use the built-in package manager."
echo >&2 " For example, try: sudo apt install -y build-essential" echo >&2 " For example, try: sudo apt install -y build-essential"
fi fi
if ! command -v git > /dev/null; then if [ -z "$(command -v git)" ]; then
echo >&2 "Error: to install 'git' on Linux use the built-in package manager." echo >&2 "Error: to install 'git' on Linux use the built-in package manager."
echo >&2 " For example, try: sudo apt install -y git" echo >&2 " For example, try: sudo apt install -y git"
exit 1 exit 1
@@ -32,7 +32,7 @@ _install_brew() {
fi fi
# From Straight from https://brew.sh # From Straight from https://brew.sh
if ! test -d "$HOME/.local/opt/brew"; then if ! [ -d "$HOME/.local/opt/brew" ]; then
echo "Installing to '$HOME/.local/opt/brew'" echo "Installing to '$HOME/.local/opt/brew'"
echo "" echo ""
echo "If you prefer to have brew installed to '/usr/local' cancel now and do the following:" echo "If you prefer to have brew installed to '/usr/local' cancel now and do the following:"
@@ -44,13 +44,6 @@ _install_brew() {
git clone --depth=1 https://github.com/Homebrew/brew "$HOME/.local/opt/brew" git clone --depth=1 https://github.com/Homebrew/brew "$HOME/.local/opt/brew"
fi fi
rm -rf "$HOME/.local/bin/brew-update-service-install"
webi_download \
"$WEBI_HOST/packages/brew/brew-update-service-install" \
"$HOME/.local/bin/brew-update-service-install" \
brew-update-service-install
chmod a+x "$HOME/.local/bin/brew-update-service-install"
webi_path_add "$HOME/.local/opt/brew/bin" webi_path_add "$HOME/.local/opt/brew/bin"
export PATH="$HOME/.local/opt/brew/bin:$PATH" export PATH="$HOME/.local/opt/brew/bin:$PATH"
@@ -67,10 +60,6 @@ _install_brew() {
# shellcheck disable=2016 # shellcheck disable=2016
echo ' /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"' echo ' /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"'
echo "" echo ""
echo "To register 'brew update' as a hourly system service:"
echo " brew-update-service-install"
echo ""
} }
_install_brew _install_brew

View File

@@ -8,19 +8,6 @@ tagline: |
To update or switch versions, run `webi caddy@stable` (or `@v2.4`, `@beta`, To update or switch versions, run `webi caddy@stable` (or `@v2.4`, `@beta`,
etc). etc).
### Files
These are the files / directories that are created and/or modified with this
install:
```text
~/.config/envman/PATH.env
~/.local/bin/caddy
~/.config/caddy/autosave.json
~/.local/share/caddy/certificates/
<PROJECT-DIR>/Caddyfile
```
## Cheat Sheet ## Cheat Sheet
> Caddy makes it easy to use Let's Encrypt to handle HTTPS (TLS/SSL) and to > Caddy makes it easy to use Let's Encrypt to handle HTTPS (TLS/SSL) and to

View File

@@ -16,22 +16,22 @@ $pkg_src_bin = "$Env:USERPROFILE\.local\opt\caddy-v$Env:WEBI_VERSION\bin"
$pkg_src_dir = "$Env:USERPROFILE\.local\opt\caddy-v$Env:WEBI_VERSION" $pkg_src_dir = "$Env:USERPROFILE\.local\opt\caddy-v$Env:WEBI_VERSION"
$pkg_src = "$pkg_src_cmd" $pkg_src = "$pkg_src_cmd"
New-Item "$Env:USERPROFILE\Downloads\webi" -ItemType Directory -Force | Out-Null New-Item "$Env:USERPROFILE\Downloads\webi" -ItemType Directory -Force | out-null
$pkg_download = "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE" $pkg_download = "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE"
# Fetch archive # Fetch archive
IF (!(Test-Path -Path "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE")) { IF (!(Test-Path -Path "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE")) {
Write-Output "Downloading caddy from $Env:WEBI_PKG_URL to $pkg_download" echo "Downloading caddy from $Env:WEBI_PKG_URL to $pkg_download"
& curl.exe -A "$Env:WEBI_UA" -fsSL "$Env:WEBI_PKG_URL" -o "$pkg_download.part" & curl.exe -A "$Env:WEBI_UA" -fsSL "$Env:WEBI_PKG_URL" -o "$pkg_download.part"
& Move-Item "$pkg_download.part" "$pkg_download" & move "$pkg_download.part" "$pkg_download"
} }
IF (!(Test-Path -Path "$pkg_src_cmd")) { IF (!(Test-Path -Path "$pkg_src_cmd")) {
Write-Output "Installing caddy" echo "Installing caddy"
# TODO: create package-specific temp directory # TODO: create package-specific temp directory
# Enter tmp # Enter tmp
Push-Location .local\tmp pushd .local\tmp
# Remove any leftover tmp cruft # Remove any leftover tmp cruft
Remove-Item -Path ".\caddy-v*" -Recurse -ErrorAction Ignore Remove-Item -Path ".\caddy-v*" -Recurse -ErrorAction Ignore
@@ -39,19 +39,19 @@ IF (!(Test-Path -Path "$pkg_src_cmd")) {
# Unpack archive file into this temporary directory # Unpack archive file into this temporary directory
# Windows BSD-tar handles zip. Imagine that. # Windows BSD-tar handles zip. Imagine that.
Write-Output "Unpacking $pkg_download" echo "Unpacking $pkg_download"
& tar xf "$pkg_download" & tar xf "$pkg_download"
# Settle unpacked archive into place # Settle unpacked archive into place
Write-Output "Install Location: $pkg_src_cmd" echo "Install Location: $pkg_src_cmd"
New-Item "$pkg_src_bin" -ItemType Directory -Force | Out-Null New-Item "$pkg_src_bin" -ItemType Directory -Force | out-null
Move-Item -Path ".\caddy.exe" -Destination "$pkg_src_bin" Move-Item -Path ".\caddy.exe" -Destination "$pkg_src_bin"
# Exit tmp # Exit tmp
Pop-Location popd
} }
Write-Output "Copying into '$pkg_dst_cmd' from '$pkg_src_cmd'" echo "Copying into '$pkg_dst_cmd' from '$pkg_src_cmd'"
Remove-Item -Path "$pkg_dst_cmd" -Recurse -ErrorAction Ignore | Out-Null Remove-Item -Path "$pkg_dst_cmd" -Recurse -ErrorAction Ignore | out-null
New-Item "$pkg_dst_bin" -ItemType Directory -Force | Out-Null New-Item "$pkg_dst_bin" -ItemType Directory -Force | out-null
Copy-Item -Path "$pkg_src" -Destination "$pkg_dst" -Recurse Copy-Item -Path "$pkg_src" -Destination "$pkg_dst" -Recurse

View File

@@ -15,44 +15,46 @@ $pkg_src_bin = "$Env:USERPROFILE\.local\opt\chromedriver-v$Env:WEBI_VERSION\bin"
$pkg_src_dir = "$Env:USERPROFILE\.local\opt\chromedriver-v$Env:WEBI_VERSION" $pkg_src_dir = "$Env:USERPROFILE\.local\opt\chromedriver-v$Env:WEBI_VERSION"
$pkg_src = "$pkg_src_cmd" $pkg_src = "$pkg_src_cmd"
New-Item "$Env:USERPROFILE\Downloads\webi" -ItemType Directory -Force | Out-Null New-Item "$Env:USERPROFILE\Downloads\webi" -ItemType Directory -Force | out-null
$pkg_download = "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE" $pkg_download = "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE"
# Fetch archive # Fetch archive
IF (!(Test-Path -Path "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE")) { IF (!(Test-Path -Path "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE"))
Write-Output "Downloading chromedriver from $Env:WEBI_PKG_URL to $pkg_download" {
echo "Downloading chromedriver from $Env:WEBI_PKG_URL to $pkg_download"
& curl.exe -A "$Env:WEBI_UA" -fsSL "$Env:WEBI_PKG_URL" -o "$pkg_download.part" & curl.exe -A "$Env:WEBI_UA" -fsSL "$Env:WEBI_PKG_URL" -o "$pkg_download.part"
& Move-Item "$pkg_download.part" "$pkg_download" & move "$pkg_download.part" "$pkg_download"
} }
IF (!(Test-Path -Path "$pkg_src_cmd")) { IF (!(Test-Path -Path "$pkg_src_cmd"))
Write-Output "Installing chromedriver" {
echo "Installing chromedriver"
# TODO: create package-specific temp directory # TODO: create package-specific temp directory
# Enter tmp # Enter tmp
Push-Location .local\tmp pushd .local\tmp
# Remove any leftover tmp cruft # Remove any leftover tmp cruft
Remove-Item -Path ".\chromedriver.exe" -Recurse -ErrorAction Ignore Remove-Item -Path ".\chromedriver.exe" -Recurse -ErrorAction Ignore
# NOTE: DELETE THIS COMMENT IF NOT USED # NOTE: DELETE THIS COMMENT IF NOT USED
# Move single binary into root of temporary folder # Move single binary into root of temporary folder
#& move "$pkg_download" "chromedriver.exe" #& move "$pkg_download" "chromedriver.exe"
# Unpack archive file into this temporary directory # Unpack archive file into this temporary directory
# Windows BSD-tar handles zip. Imagine that. # Windows BSD-tar handles zip. Imagine that.
Write-Output "Unpacking $pkg_download" echo "Unpacking $pkg_download"
& tar xf "$pkg_download" & tar xf "$pkg_download"
# Settle unpacked archive into place # Settle unpacked archive into place
Write-Output "Install Location: $pkg_src_cmd" echo "Install Location: $pkg_src_cmd"
New-Item "$pkg_src_bin" -ItemType Directory -Force | Out-Null New-Item "$pkg_src_bin" -ItemType Directory -Force | out-null
Move-Item -Path ".\chromedriver-*\chromedriver.exe" -Destination "$pkg_src_bin" Move-Item -Path ".\chromedriver-*\chromedriver.exe" -Destination "$pkg_src_bin"
# Exit tmp # Exit tmp
Pop-Location popd
} }
Write-Output "Copying into '$pkg_dst_cmd' from '$pkg_src_cmd'" echo "Copying into '$pkg_dst_cmd' from '$pkg_src_cmd'"
Remove-Item -Path "$pkg_dst_cmd" -Recurse -ErrorAction Ignore | Out-Null Remove-Item -Path "$pkg_dst_cmd" -Recurse -ErrorAction Ignore | out-null
Copy-Item -Path "$pkg_src" -Destination "$pkg_dst" -Recurse Copy-Item -Path "$pkg_src" -Destination "$pkg_dst" -Recurse

View File

@@ -1,83 +0,0 @@
---
title: CMake
homepage: https://github.com/Kitware/CMake
tagline: |
CMake is a cross-platform, open-source build system generator
---
To update or switch versions, run `webi cmake@stable` (or `@v2`, `@beta`, etc).
### Files
These are the files / directories that are created and/or modified with this
install:
```text
~/.config/envman/PATH.env
~/.local/bin/cmake
~/.local/opt/cmake
```
## Cheat Sheet
> CMake is a cross-platform alternative to autoconf that works on Windows, Mac,
> and Linux
A project structure looks like this:
```text
my-project/
├── build/
├── CMakeLists.txt
├── hello-world*
└── hello-world.cpp
```
And can be built my running `cmake` from the `build` directory:
```sh
pushd ./build/
cmake ../
make
```
### How to create a Hello World with CMake
Lets create a hello world program in C++ and build it with CMake.
1. Create a project directory
```sh
mkdir ./my-project/
pushd ./my-project/
```
2. Create a Hello World C++ file named `hello-world.cpp` `hello-world.cpp`:
```cpp
#include <iostream>
int main(int argc, char** argv) {
std::cout << "Hello World!" << std::endl;
return 0;
}
```
3. Create a `CMakeLists.txt` to compile our code `CMakeLists.txt`:
```cmake
project{hello-world}
cmake_minimum_required(VERSION 3.10)
add_executable(hello-world hello-world.cpp)
```
4. Create a build directory and build the binary
```sh
mkdir ./build/
pushd ./build/
cmake ../
make
```
5. Test the built binary:
```sh
./hello-world
```

View File

@@ -1,54 +0,0 @@
#!/usr/bin/env pwsh
#################
# Install cmake #
#################
# Every package should define these variables
$pkg_cmd_name = "cmake"
$pkg_dst_cmd = "$Env:USERPROFILE\.local\opt\cmake\bin\cmake.exe"
$pkg_dst_dir = "$Env:USERPROFILE\.local\opt\cmake"
$pkg_dst = "$pkg_dst_cmd"
$pkg_src_cmd = "$Env:USERPROFILE\.local\opt\cmake-v$Env:WEBI_VERSION\bin\cmake.exe"
$pkg_src_bin = "$Env:USERPROFILE\.local\opt\cmake-v$Env:WEBI_VERSION\bin"
$pkg_src_dir = "$Env:USERPROFILE\.local\opt\cmake-v$Env:WEBI_VERSION"
$pkg_src = "$pkg_src_cmd"
New-Item "$Env:USERPROFILE\Downloads\webi" -ItemType Directory -Force | Out-Null
$pkg_download = "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE"
# Fetch archive
IF (!(Test-Path -Path "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE")) {
Write-Output "Downloading cmake from $Env:WEBI_PKG_URL to $pkg_download"
& curl.exe -A "$Env:WEBI_UA" -fsSL "$Env:WEBI_PKG_URL" -o "$pkg_download.part"
& Move-Item "$pkg_download.part" "$pkg_download"
}
IF (!(Test-Path -Path "$pkg_src_dir")) {
Write-Output "Installing cmake"
# TODO: create package-specific temp directory
# Enter tmp
Push-Location .local\tmp
# Remove any leftover tmp cruft
Remove-Item -Path ".\cmake*" -Recurse -ErrorAction Ignore
# Unpack archive file into this temporary directory
# Windows BSD-tar handles zip. Imagine that.
Write-Output "Unpacking $pkg_download"
& tar xf "$pkg_download"
# Settle unpacked archive into place
Write-Output "Install Location: $pkg_src_cmd"
Move-Item -Path ".\cmake*" -Destination "$pkg_src_dir"
# Exit tmp
Pop-Location
}
Write-Output "Copying into '$pkg_dst_cmd' from '$pkg_src_cmd'"
Remove-Item -Path "$pkg_dst_cmd" -Recurse -ErrorAction Ignore | Out-Null
Copy-Item -Path "$pkg_src" -Destination "$pkg_dst" -Recurse

View File

@@ -1,47 +0,0 @@
#!/bin/sh
# shellcheck disable=SC2034
# "'pkg_cmd_name' appears unused. Verify it or export it."
__init_cmake() {
set -e
set -u
##################
# Install cmake #
##################
# Every package should define these 6 variables
pkg_cmd_name="cmake"
pkg_dst_cmd="$HOME/.local/opt/cmake/bin/cmake"
pkg_dst_dir="$HOME/.local/opt/cmake"
pkg_dst="$pkg_dst_dir"
pkg_src_cmd="$HOME/.local/opt/cmake-v$WEBI_VERSION/bin/cmake"
pkg_src_dir="$HOME/.local/opt/cmake-v$WEBI_VERSION"
pkg_src="$pkg_src_dir"
# pkg_install must be defined by every package
pkg_install() {
# ~/.local/opt/cmake-v3.27.0/
mkdir -p "$(dirname "${pkg_src_dir}")"
# mv ./cmake-*/ ~/.local/opt/cmake-v3.27.0/
mv ./cmake-*/ "${pkg_src_dir}"
}
# pkg_get_current_version is recommended, but not required
pkg_get_current_version() {
# 'cmake --version' has output in this format:
# cmake 3.27.0 (rev abcdef0123)
# This trims it down to just the version number:
# 3.27.0
cmake --version 2> /dev/null |
head -n 1 |
cut -d ' ' -f 3
}
}
__init_cmake

View File

@@ -1,20 +0,0 @@
'use strict';
var github = require('../_common/github.js');
var owner = 'Kitware';
var repo = 'CMake';
module.exports = function (request) {
return github(request, owner, repo).then(function (all) {
return all;
});
};
if (module === require.main) {
module.exports(require('@root/request')).then(function (all) {
all = require('../_webi/normalize.js')(all);
// just select the first 5 for demonstration
all.releases = all.releases.slice(0, 5);
console.info(JSON.stringify(all, null, 2));
});
}

View File

@@ -8,17 +8,6 @@ tagline: |
To update or switch versions, run `webi comrak@stable` (or `@v0.11`, `@beta`, To update or switch versions, run `webi comrak@stable` (or `@v0.11`, `@beta`,
etc). etc).
### Files
These are the files / directories that are created and/or modified with this
install:
```text
~/.config/envman/PATH.env
~/.local/bin/comrak
~/.config/comrak/config
```
## Cheat Sheet ## Cheat Sheet
> Comrak supports the five extensions to CommonMark defined in the GitHub > Comrak supports the five extensions to CommonMark defined in the GitHub

View File

@@ -3,35 +3,37 @@
$VERNAME = "$Env:PKG_NAME-v$Env:WEBI_VERSION.exe" $VERNAME = "$Env:PKG_NAME-v$Env:WEBI_VERSION.exe"
$EXENAME = "$Env:PKG_NAME.exe" $EXENAME = "$Env:PKG_NAME.exe"
# Fetch archive # Fetch archive
IF (!(Test-Path -Path "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE")) { IF (!(Test-Path -Path "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE"))
Write-Output "Downloading $Env:PKG_NAME from $Env:WEBI_PKG_URL to $Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE" {
echo "Downloading $Env:PKG_NAME from $Env:WEBI_PKG_URL to $Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE"
& curl.exe -A "$Env:WEBI_UA" -fsSL "$Env:WEBI_PKG_URL" -o "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE.part" & curl.exe -A "$Env:WEBI_UA" -fsSL "$Env:WEBI_PKG_URL" -o "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE.part"
& Move-Item "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE.part" "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE" & move "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE.part" "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE"
} }
IF (!(Test-Path -Path "$Env:USERPROFILE\.local\opt\$Env:PKG_NAME-v$Env:WEBI_VERSION\bin\$VERNAME")) { IF (!(Test-Path -Path "$Env:USERPROFILE\.local\opt\$Env:PKG_NAME-v$Env:WEBI_VERSION\bin\$VERNAME"))
Write-Output "Installing $Env:PKG_NAME" {
echo "Installing $Env:PKG_NAME"
# TODO: temp directory # TODO: temp directory
# Enter tmp # Enter tmp
Push-Location .local\tmp pushd .local\tmp
# Remove any leftover tmp cruft # Remove any leftover tmp cruft
Remove-Item -Path "$Env:PKG_NAME-v*" -Recurse -ErrorAction Ignore Remove-Item -Path "$Env:PKG_NAME-v*" -Recurse -ErrorAction Ignore
# Move single binary into root of temporary folder # Move single binary into root of temporary folder
& Move-Item "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE" "$VERNAME" & move "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE" "$VERNAME"
# Settle unpacked archive into place # Settle unpacked archive into place
Write-Output "New Name: $VERNAME" echo "New Name: $VERNAME"
Write-Output "New Location: $Env:USERPROFILE\.local\opt\$Env:PKG_NAME-v$Env:WEBI_VERSION\bin\$VERNAME" echo "New Location: $Env:USERPROFILE\.local\opt\$Env:PKG_NAME-v$Env:WEBI_VERSION\bin\$VERNAME"
New-Item "$Env:USERPROFILE\.local\opt\$Env:PKG_NAME-v$Env:WEBI_VERSION\bin" -ItemType Directory -Force | Out-Null New-Item "$Env:USERPROFILE\.local\opt\$Env:PKG_NAME-v$Env:WEBI_VERSION\bin" -ItemType Directory -Force | out-null
Move-Item -Path "$VERNAME" -Destination "$Env:USERPROFILE\.local\opt\$Env:PKG_NAME-v$Env:WEBI_VERSION\bin" Move-Item -Path "$VERNAME" -Destination "$Env:USERPROFILE\.local\opt\$Env:PKG_NAME-v$Env:WEBI_VERSION\bin"
# Exit tmp # Exit tmp
Pop-Location popd
} }
Write-Output "Copying into '$Env:USERPROFILE\.local\bin\$EXENAME' from '$Env:USERPROFILE\.local\opt\$Env:PKG_NAME-v$Env:WEBI_VERSION\bin\$VERNAME'" echo "Copying into '$Env:USERPROFILE\.local\bin\$EXENAME' from '$Env:USERPROFILE\.local\opt\$Env:PKG_NAME-v$Env:WEBI_VERSION\bin\$VERNAME'"
Remove-Item -Path "$Env:USERPROFILE\.local\bin\$EXENAME" -Recurse -ErrorAction Ignore Remove-Item -Path "$Env:USERPROFILE\.local\bin\$EXENAME" -Recurse -ErrorAction Ignore
Copy-Item -Path "$Env:USERPROFILE\.local\opt\$Env:PKG_NAME-v$Env:WEBI_VERSION\bin\$VERNAME" -Destination "$Env:USERPROFILE\.local\bin\$EXENAME" -Recurse Copy-Item -Path "$Env:USERPROFILE\.local\opt\$Env:PKG_NAME-v$Env:WEBI_VERSION\bin\$VERNAME" -Destination "$Env:USERPROFILE\.local\bin\$EXENAME" -Recurse

View File

@@ -8,16 +8,6 @@ tagline: |
To update or switch versions, run `webi curlie@stable` (or `@v1.6`, `@beta`, To update or switch versions, run `webi curlie@stable` (or `@v1.6`, `@beta`,
etc). etc).
### Files
These are the files / directories that are created and/or modified with this
install:
```text
~/.config/envman/PATH.env
~/.local/bin/curlie
```
## Cheat Sheet ## Cheat Sheet
> If you like the interface of HTTPie but miss the features of curl, curlie is > If you like the interface of HTTPie but miss the features of curl, curlie is

View File

@@ -3,39 +3,41 @@
$VERNAME = "$Env:PKG_NAME-v$Env:WEBI_VERSION.exe" $VERNAME = "$Env:PKG_NAME-v$Env:WEBI_VERSION.exe"
$EXENAME = "$Env:PKG_NAME.exe" $EXENAME = "$Env:PKG_NAME.exe"
# Fetch archive # Fetch archive
IF (!(Test-Path -Path "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE")) { IF (!(Test-Path -Path "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE"))
Write-Output "Downloading $Env:PKG_NAME from $Env:WEBI_PKG_URL to $Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE" {
echo "Downloading $Env:PKG_NAME from $Env:WEBI_PKG_URL to $Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE"
& curl.exe -A "$Env:WEBI_UA" -fsSL "$Env:WEBI_PKG_URL" -o "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE.part" & curl.exe -A "$Env:WEBI_UA" -fsSL "$Env:WEBI_PKG_URL" -o "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE.part"
& Move-Item "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE.part" "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE" & move "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE.part" "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE"
} }
IF (!(Test-Path -Path "$Env:USERPROFILE\.local\xbin\$VERNAME")) { IF (!(Test-Path -Path "$Env:USERPROFILE\.local\xbin\$VERNAME"))
Write-Output "Installing $Env:PKG_NAME" {
echo "Installing $Env:PKG_NAME"
# TODO: temp directory # TODO: temp directory
# Enter tmp # Enter tmp
Push-Location .local\tmp pushd .local\tmp
# Remove any leftover tmp cruft # Remove any leftover tmp cruft
Remove-Item -Path "$Env:PKG_NAME-v*" -Recurse -ErrorAction Ignore Remove-Item -Path "$Env:PKG_NAME-v*" -Recurse -ErrorAction Ignore
# Unpack archive # Unpack archive
# Windows BSD-tar handles zip. Imagine that. # Windows BSD-tar handles zip. Imagine that.
Write-Output "Unpacking $Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE" echo "Unpacking $Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE"
& tar xf "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE" & tar xf "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE"
# Move single binary into root of temporary folder # Move single binary into root of temporary folder
& Move-Item "$EXENAME" "$VERNAME" & move "$EXENAME" "$VERNAME"
# Settle unpacked archive into place # Settle unpacked archive into place
Write-Output "New Name: $VERNAME" echo "New Name: $VERNAME"
Write-Output "New Location: $Env:USERPROFILE\.local\xbin\$VERNAME" echo "New Location: $Env:USERPROFILE\.local\xbin\$VERNAME"
Move-Item -Path "$VERNAME" -Destination "$Env:USERPROFILE\.local\xbin" Move-Item -Path "$VERNAME" -Destination "$Env:USERPROFILE\.local\xbin"
# Exit tmp # Exit tmp
Pop-Location popd
} }
Write-Output "Copying into '$Env:USERPROFILE\.local\bin\$EXENAME' from '$Env:USERPROFILE\.local\xbin\$VERNAME'" echo "Copying into '$Env:USERPROFILE\.local\bin\$EXENAME' from '$Env:USERPROFILE\.local\xbin\$VERNAME'"
Remove-Item -Path "$Env:USERPROFILE\.local\bin\$EXENAME" -Recurse -ErrorAction Ignore Remove-Item -Path "$Env:USERPROFILE\.local\bin\$EXENAME" -Recurse -ErrorAction Ignore
Copy-Item -Path "$Env:USERPROFILE\.local\xbin\$VERNAME" -Destination "$Env:USERPROFILE\.local\bin\$EXENAME" -Recurse Copy-Item -Path "$Env:USERPROFILE\.local\xbin\$VERNAME" -Destination "$Env:USERPROFILE\.local\bin\$EXENAME" -Recurse

View File

@@ -1,140 +0,0 @@
---
title: Dash Core Desktop Wallet
homepage: https://webinstall.dev/dashcore-utils/
tagline: |
Utilities for Dash Core (DASH / Digital Cash)
---
To update, run `webi dashcore-utils`.
### Files
These are the files / directories that are created and/or modified with this
install:
```txt
~/.config/envman/PATH.env
~/.local/opt/dashcore/
~/.local/bin/dash-qt-hd
~/.local/bin/dashd-hd
~/.local/bin/dashd-hd-service-install
```
[`dashcore`](../dashcore/) will also be installed if not present.
## Cheat Sheet
> Convenience scripts for running the Dash Daemon or the Dash Core Desktop
> Wallet.
- `dash-qt-hd`
- `dash-qt-testnet`
- `dashd-hd`
- `dashd-hd-service-install`
- `dashd-testnet`
- `dashd-testnet-service-install`
For historical reasons [`dashd`](../dashd/) (System Daemon) and
[`dash-qt`](../dashcore/) (Desktop Wallet) use _lossy_ keys (non-HD wallets) by
default, and the storage options options are not intuitive.
These scripts run them with safer options that are easier to configure for
server and desktop deployment, respectively.
### How to run the DASH System Daemon
1. Mount or otherwise designate a user-owned folder on a storage volume with
60g+ free space, such as
```sh
/mnt/slc1_vol_100g/dashcore/
```
2. Generally you'll want to install the Dash Daemon as a system service
```sh
dashd-hd-install-service /mnt/vol_slc1_100g/dashcore/
```
To accomplish the same manually you would:
1. Create `~/.dashcore/dash.conf` with
[reasonable defaults](../packages/dashcore-utils/dash.example.conf)
```ini
txindex=1
addressindex=1
timestampindex=1
spentindex=1
[main]
rpcuser=RPCUSER_MAIN
rpcpassword=RPCPASS_MAIN
# to run on multiple interfaces, use multiple config lines
# ex: bind=127.0.0.1:9999 and bind=10.0.0.100:9999)
bind=127.0.0.1:9999
rpcbind=127.0.0.1:9998
rpcconnect=127.0.0.1:9998
rpcallowip=127.0.0.1/16
# zmq* can only be bound to a single interface
# See https://github.com/dashpay/dash/issues/5461
zmqpubrawtx=tcp://127.0.0.1:28332
zmqpubrawtxlock=tcp://127.0.0.1:28332
zmqpubrawchainlock=tcp://127.0.0.1:28332
zmqpubhashchainlock=tcp://127.0.0.1:28332
[test]
# ...
[regtest]
# ...
```
Which is essentially the same as:
```sh
my_user="$(id -u -n)"
sudo mkdir /mnt/slc1_vol_100g/dashcore/
chown -R "$my_user" /mnt/slc1_vol_100g/dashcore/
mkdir -p ~/.dashcore/wallets/
mkdir -p /mnt/slc1_vol_100g/dashcore/_data
mkdir -p /mnt/slc1_vol_100g/dashcore/_caches
sudo env PATH="$PATH" serviceman add \
--system --user "$my_user" --path "$PATH" --name dashd --force -- \
dashd \
-usehd \
-conf="$HOME/.dashcore/dash.conf" \
-walletdir="$HOME/.dashcore/wallets/" \
-datadir=/mnt/slc1_vol_100g/dashcore/_data \
-blocksdir=/mnt/slc1_vol_100g/dashcore/_caches
```
See also:
- [The `dashd` Cheat Sheet](../dashd/).
### How to run the DASH Desktop Wallet
To open an existing (or create a new) Dash Desktop Wallet:
```sh
dash-qt-hd
```
Which is essentially the same as:
```sh
dash-qt \
-usehd \
-walletdir="$HOME/.config/dashcore/wallets/" \
-settings="$HOME/.config/dashcore/settings.json" \
-datadir="$HOME/.dashcore/_data/" \
-blocksdir="$HOME/.dashcore/_caches/"
```
Or pass `-testnet` to use with _TestNet_.
See also:
- [The `dash-qt` Cheat Sheet](../dashcore/).

View File

@@ -1,21 +0,0 @@
#!/bin/sh
set -e
set -u
# I don't have the gall to change the defaults (Webi values),
# but I would *strongly* recommend that you do!
#
# Instance-specific data should be separate from global caches:
#
# -settings="$HOME/.config/dashcore/settings.json" \
# -walletdir="$HOME/.config/dashcore/wallets/" \
# -datadir="$HOME/.dashcore/_data/" \
# -blocksdir="$HOME/.dashcore/_caches/" \
dash-qt \
-usehd \
-enablecoinjoin=1 \
-coinjoinautostart=1 \
-coinjoinrounds=16 \
-coinjoindenomsgoal=10 \
-coinjoindenomshardcap=25

View File

@@ -1,22 +0,0 @@
#!/bin/sh
set -e
set -u
# I don't have the gall to change the defaults (Webi values),
# but I would *strongly* recommend that you do!
#
# Instance-specific data should be separate from global caches:
#
# -settings="$HOME/.config/dashcore/settings.json" \
# -walletdir="$HOME/.config/dashcore/wallets/" \
# -datadir="$HOME/.dashcore/_data/" \
# -blocksdir="$HOME/.dashcore/_caches/" \
dash-qt \
-testnet \
-usehd \
-enablecoinjoin=1 \
-coinjoinautostart=1 \
-coinjoinrounds=16 \
-coinjoindenomsgoal=10 \
-coinjoindenomshardcap=25

View File

@@ -1,44 +0,0 @@
txindex=1
addressindex=1
timestampindex=1
spentindex=1
[main]
rpcuser=RPCUSER_MAIN
rpcpassword=RPCPASS_MAIN
# to run on multiple interfaces, use multiple config lines
# ex: bind=127.0.0.1:9999 and bind=10.0.0.100:9999)
bind=127.0.0.1:9999
rpcbind=127.0.0.1:9998
rpcconnect=127.0.0.1:9998
rpcallowip=127.0.0.1/16
# zmq* can only be bound to a single interface
# See https://github.com/dashpay/dash/issues/5461
zmqpubrawtx=tcp://127.0.0.1:28332
zmqpubrawtxlock=tcp://127.0.0.1:28332
zmqpubrawchainlock=tcp://127.0.0.1:28332
zmqpubhashchainlock=tcp://127.0.0.1:28332
[test]
rpcuser=RPCUSER_TEST
rpcpassword=RPCPASS_TEST
bind=127.0.0.1:19999
rpcbind=127.0.0.1:19998
rpcconnect=127.0.0.1:19998
rpcallowip=127.0.0.1/16
zmqpubrawtx=tcp://127.0.0.1:18009
zmqpubrawtxlock=tcp://127.0.0.1:18009
zmqpubrawchainlock=tcp://127.0.0.1:18009
zmqpubhashchainlock=tcp://127.0.0.1:18009
[regtest]
rpcuser=RPCUSER_REGTEST
rpcpassword=RPCPASS_REGTEST
bind=127.0.0.1:19899
rpcbind=127.0.0.1:19898
rpcconnect=127.0.0.1:19898
rpcallowip=127.0.0.1/16
zmqpubrawtx=tcp://127.0.0.1:18809
zmqpubrawtxlock=tcp://127.0.0.1:18809
zmqpubrawchainlock=tcp://127.0.0.1:18809
zmqpubhashchainlock=tcp://127.0.0.1:18809

View File

@@ -1,46 +0,0 @@
#!/bin/sh
set -e
set -u
# Unfortunately we can't know that datadir won't be used
# for other non-cache files, but we can at least protect
# the ones we're aware of.
my_netname="${1:-}"
if test -n "${my_netname}"; then
if test "${my_netname}" != mainnet &&
test "${my_netname}" != testnet &&
test "${my_netname}" != regnet &&
test "${my_netname}" != devnet; then
echo ""
echo "ERROR"
echo " '${my_netname}' is not one of 'testnet', 'regnet', 'devnet'"
echo ""
echo ""
fi
if test "${my_netname}" != mainnet; then
my_netname=''
fi
fi
my_net_arg=''
if test -n "${my_netname}"; then
my_net_arg="-${my_netname}"
fi
# shellcheck disable=2086
dashd \
-usehd \
${my_net_arg} \
-conf="$HOME/.dashcore/dash.conf" \
-settings="$HOME/.dashcore/settings.json" \
-walletdir="$HOME/.dashcore/wallets/" \
-datadir="$HOME/.dashcore/_data/" \
-blocksdir="$HOME/.dashcore/_data/"
# -enablecoinjoin=1 \
# -coinjoinautostart=1 \
# -coinjoinrounds=16 \
# -coinjoindenomsgoal=10 \
# -coinjoindenomshardcap=25

View File

@@ -1,176 +0,0 @@
#!/bin/sh
set -e
set -u
fn_usage() { (
echo >&2 ""
echo >&2 "USAGE"
echo >&2 " dashd-hd-service-install [datadir] ['testnet']"
echo >&2 ""
echo >&2 "EXAMPLE"
echo >&2 " dashd-hd-service-install /mnt/vol_slc1_100g/dashcore/"
echo >&2 ""
echo >&2 "NOTE"
echo >&2 " If a directory matching '/mnt/*/dashcore/' is found,"
echo >&2 " it will be used automatically."
echo >&2 ""
); }
fn_datadir_help() { (
my_vol="${1:-}"
my_user="$(
id -n -u
)"
my_group="$(
id -n -g
)"
echo >&2 ""
echo >&2 "ERROR"
echo >&2 " '${my_vol}' is not writable"
echo >&2 ""
echo >&2 "SOLUTION"
echo >&2 " 1. Mount a large (50gb+) volume"
echo >&2 ""
echo >&2 " sudo mkdir -p /mnt/EXAMPLE"
echo >&2 " sudo mount /dev/sdx1 /mnt/EXAMPLE"
echo >&2 ""
echo >&2 " 2. Create a 'dashcore' inside of it"
echo >&2 ""
echo >&2 " sudo mkdir -p '${my_vol}'"
echo >&2 ""
echo >&2 " 3. Make it writable to this user"
echo >&2 ""
echo >&2 " sudo chown -R '${my_user}':'${my_group}' '${my_vol}'"
echo >&2 ""
echo >&2 ""
); }
fn_srv_install() { (
my_vol="${1:-}"
my_netname="${2:-}"
my_name='dashd'
# both of these will get '/testnet3' suffixes with -testnet
my_datadir="${my_vol}/_data"
my_blocksdir="${my_vol}/_caches"
if test -n "${my_netname}"; then
if test "mainnet" = "${my_netname}"; then
my_netname=""
elif test "testnet" != "${my_netname}"; then
fn_usage
return 1
fi
fi
if ! test -d "${my_datadir}"; then
mkdir "${my_datadir}"
chmod 0700 "${my_datadir}"
fi
if ! test -d "${my_blocksdir}"; then
mkdir -p "${my_blocksdir}"
chmod 0700 "${my_blocksdir}"
fi
my_net_flag=''
if test -n "${my_netname}"; then
# ex: -testnet
my_net_flag="-${my_netname}"
# ex: dashd-testnet
my_name="dashd-${my_netname}"
fi
my_system_args=""
my_kernel="$(
uname -s
)"
if test "Darwin" != "${my_kernel}"; then
my_user="$(
id -u -n
)"
my_system_args="--system --username ${my_user}"
fi
# shellcheck disable=SC2016,SC1090
echo 'sudo env PATH="$PATH"' \
"serviceman add ${my_system_args} --path \"\$PATH\" --name \"${my_name}\" --force --" \
"dashd " \
"${my_net_flag}" \
-usehd \
'-conf="$HOME/.dashcore/dash.conf"' \
'-settings="$HOME/.dashcore/settings.json"' \
'-walletdir="$HOME/.dashcore/wallets/"' \
"-datadir=\"${my_datadir}\"" \
"-blocksdir=\"${my_blocksdir}\""
if ! command -v serviceman > /dev/null; then
echo ""
echo "Installing 'serviceman'..."
echo ""
{
curl -fsSL "${WEBI_HOST}/serviceman" | sh
} > /dev/null
# shellcheck disable=SC1090
. ~/.config/envman/PATH.env || true
fi
mkdir -p "$HOME/.dashcore/wallets/"
chmod 0700 "$HOME/.dashcore/wallets/"
mkdir -p "${my_datadir}"
chmod 0700 "${my_datadir}"
mkdir -p "${my_blocksdir}"
chmod 0700 "${my_blocksdir}"
cd "${my_vol}" || return 1
# leave options unquoted so they're interpreted separately
# shellcheck disable=SC2086
sudo env PATH="${PATH}" \
serviceman add ${my_system_args} --path "${PATH}" --name "${my_name}" --force -- \
dashd \
${my_net_flag} \
-usehd \
-conf="${HOME}/.dashcore/dash.conf" \
-settings="${HOME}/.dashcore/settings.json" \
-walletdir="${HOME}/.dashcore/wallets/" \
-datadir="${my_datadir}" \
-blocksdir="${my_blocksdir}"
); }
main() { (
my_vol="${1:-}"
my_netname="${2:-}"
if test -z "${my_vol}"; then
my_vol="$(
ls -d /mnt/*/dashcore/ 2> /dev/null || true
)"
fi
if test "help" = "${my_vol}" ||
test "--help" = "${my_vol}"; then
fn_usage
return 0
fi
if test -z "${my_vol}"; then
fn_usage
return 1
fi
if ! test -d "${my_vol}" ||
! test -w "${my_vol}"; then
fn_datadir_help "${my_vol}"
return 1
fi
fn_srv_install "${my_vol}" "${my_netname}"
); }
main "${@:-}"

View File

@@ -1,13 +0,0 @@
#!/bin/sh
set -e
set -u
# NOTE:
# The '-testnet' flag will always cause a './testnet3/' folder
# to be created under '-datadir' (it won't the 'datadir' directly)
#
# Example:
# dashd -testnet -datadir="$HOME/.dashcore/"
# will save to ~/.dashcore/testnet3/, NOT ~/.dashcore/
dashd-hd testnet

View File

@@ -1,5 +0,0 @@
#!/bin/sh
set -e
set -u
dashd-hd-service-install "${1:-}" "testnet"

View File

@@ -1,91 +0,0 @@
#!/bin/sh
set -e
set -u
__install_dashcore_utils() {
webi_download \
"$WEBI_HOST/packages/dashcore-utils/dash-qt-hd" \
"$HOME/.local/bin/dash-qt-hd"
chmod a+x "$HOME/.local/bin/dash-qt-hd"
webi_download \
"$WEBI_HOST/packages/dashcore-utils/dash-qt-testnet" \
"$HOME/.local/bin/dash-qt-testnet"
chmod a+x "$HOME/.local/bin/dash-qt-testnet"
webi_download \
"$WEBI_HOST/packages/dashcore-utils/dashd-hd" \
"$HOME/.local/bin/dashd-hd"
chmod a+x "$HOME/.local/bin/dashd-hd"
webi_download \
"$WEBI_HOST/packages/dashcore-utils/dashd-testnet" \
"$HOME/.local/bin/dashd-testnet"
chmod a+x "$HOME/.local/bin/dashd-testnet"
webi_download \
"$WEBI_HOST/packages/dashcore-utils/dashd-hd-service-install" \
"$HOME/.local/bin/dashd-hd-service-install"
chmod a+x "$HOME/.local/bin/dashd-hd-service-install"
webi_download \
"$WEBI_HOST/packages/dashcore-utils/dashd-testnet-service-install" \
"$HOME/.local/bin/dashd-testnet-service-install"
chmod a+x "$HOME/.local/bin/dashd-testnet-service-install"
if ! test -e "${HOME}/.dashcore"; then
mkdir -p "${HOME}/.dashcore"
chmod 0700 "${HOME}/.dashcore"
fi
if ! test -e "${HOME}/.dashcore/dash.conf"; then
touch "${HOME}/.dashcore/dash.conf"
chmod 0600 "${HOME}/.dashcore/dash.conf"
fi
webi_download \
"$WEBI_HOST/packages/dashcore-utils/dash.example.conf" \
"$HOME/.dashcore/dash.example.conf"
if ! grep -q rpcuser ~/.dashcore/dash.conf; then
cat ~/.dashcore/dash.example.conf >> ~/.dashcore/dash.conf
cmd_sed="sed -i -E"
my_bsd_sed=''
if ! sed -V 2>&1 | grep -q 'GNU'; then
cmd_sed="sed -i .dascore-utils-bak -E"
my_bsd_sed='true'
fi
my_user="$(
id -u -n
)"
my_main_pass="$(xxd -l16 -ps /dev/urandom)"
my_test_pass="$(xxd -l16 -ps /dev/urandom)"
my_regtest_pass="$(xxd -l16 -ps /dev/urandom)"
$cmd_sed "s/RPCUSER_MAIN/${my_user}/" ~/.dashcore/dash.conf
$cmd_sed "s/RPCPASS_MAIN/${my_main_pass}/" ~/.dashcore/dash.conf
$cmd_sed "s/RPCUSER_TEST/${my_user}-test/" ~/.dashcore/dash.conf
$cmd_sed "s/RPCPASS_TEST/${my_test_pass}/" ~/.dashcore/dash.conf
$cmd_sed "s/RPCUSER_REGTEST/${my_user}-regtest/" ~/.dashcore/dash.conf
$cmd_sed "s/RPCPASS_REGTEST/${my_regtest_pass}/" ~/.dashcore/dash.conf
if test -n "${my_bsd_sed}"; then
rm -f ~/.dashcore/dash.conf.dascore-utils-bak
fi
fi
export PATH="$HOME/.local/opt/dashcore/bin:$PATH"
if ! command -v dashd > /dev/null ||
! command -v dash-qt > /dev/null; then
"$HOME/.local/bin/webi" dashcore
fi
# Always try to correct the permissions due to
# https://github.com/dashpay/dash/issues/5420
chmod -R og-rwx "${HOME}/.dashcore/" || true
}
__install_dashcore_utils

View File

@@ -1,189 +0,0 @@
---
title: Dash Core Desktop Wallet
homepage: https://github.com/dashpay/dash
tagline: |
Dash Core is the Desktop Wallet for Digital Cash (DASH)
---
To update or switch versions, run `webi dashcore@stable` (or `@v19`, `@beta`,
etc).
### System Requirements
- 50GB Free Storage (100GB recommended)
- 4GB RAM (8GB recommended)
- 4 hours for initial sync
### Files
These are the files / directories that are created and/or modified with this
install:
```txt
~/.config/envman/PATH.env
~/.local/opt/dashcore/
# For convenience
~/.local/bin/dash-qt-hd
~/.local/bin/dash-qt-testnet
# Linux
~/.dashcore/settings.json
~/.dashcore/testnet3/
# macOS
~/Library/Application Support/DashCore/settings.json
~/Library/Application Support/DashCore/testnet3/
~/Library/Saved Application State/org.dash.Dash-Qt.savedState
~/Library/Preferences/org.dash.Dash-Qt.plist
```
[`dashcore-utils`](../dashcore-utils/) will also be installed if not present.
## Cheat Sheet
> _DASH_ (portmanteau of _Digital Cash_) is an international currency. _Dash
> Core_ is the original suite of tools for _Dash_, maintained by DCG.
The original tools include:
- `dash-qt` - a _Desktop Wallet_ for sending and receiving money
- [`dashd`](../dashd/) - the [_Full Node_](../dashd/) server daemon \
(for APIs, servers, and such)
- `dash-cli` - send RPC commands (same as the dash-qt command console)
- `dash-tx` - create and debug raw (hex) transactions
- `dash-wallet` - interact with wallet files offline
The webi installer also includes two convenience wrapper scripts:
- `dash-qt-hd`
- `dash-qt-testnet`
To open an existing (or create a new) Dash Desktop Wallet:
```sh
dash-qt \
-usehd \
-walletdir="$HOME/.config/dashcore/wallets/" \
-settings="$HOME/.config/dashcore/settings.json" \
-datadir="$HOME/.dashcore/_data/" \
-blocksdir="$HOME/.dashcore/_caches/"
```
Or pass `-testnet` to use with _TestNet_:
```sh
dash-qt \
-testnet \
-usehd \
-walletdir="$HOME/.config/dashcore/wallets/" \
-settings="$HOME/.config/dashcore/settings.json" \
-datadir="$HOME/.dashcore/_data/" \
-blocksdir="$HOME/.dashcore/_caches/"
```
### IMPORTANT: How to NOT Lose Money!
`dash-qt-hd` should be preferred to `dash-qt`.
For historical reasons, `dash-qt` uses **lossy keys** by default!
This is very dangerous - without a Wallet Phrase to recover HD Keys, file
corruption (or losing the device) can lead to losing money permanently.
To avoid this you may use `dash-qt-hd`, or create your wallet with `-usehd`
(optionally with `-mnemonic=<wallet phrase>` if you'd like to recover an
existing wallet), or `upgradetohd`.
### How to Convert from Lossy to HD
If you used `dash-qt` without `-usehd` and already created a wallet, you can fix
it from the command console, which can be found in _Window => Console_.
```text
# Usage
# upgradetohd [wallet phrase] [legacy salt] <wallet encryption phrase>
# Example
upgradetohd "" "" "correct horse battery staple"
# Example with the "zoomonic" and a legacy salt
upgradetohd "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo wrong" \
"TREZOR" "correct horse battery staple"
```
It's a good idea to back up your wallet before running the conversion.
For more detail see:
<https://docs.dash.org/en/stable/docs/user/wallets/dashcore/advanced.html>
### How to Separate Caches from Data
You can make your data much safer by separating it from the caches you may need
to delete by setting:
- `-walletdir=` your money!!
- `-settings=` desktop app settings!
- `-conf=` server settings
- `-datadir=` miscellaneous
- `-blocksdir=` generic caches
```sh
dash-qt \
-usehd \
-settings="$HOME/.config/dashcore/settings.json" \
-walletdir="$HOME/.config/dashcore/wallets/" \
-datadir="$HOME/.dashcore/_data/" \
-blocksdir="$HOME/.dashcore/_caches/" \
-enablecoinjoin=1 \
-coinjoinautostart=1 \
-coinjoinrounds=16 \
-coinjoindenomsgoal=10 \
-coinjoindenomshardcap=25
```
### How to Mix with CoinJoin
CoinJoin aids in preventing some bad actors and malicious observers being able
to easily reconstruct details about your transactions from the publicly
available data by creating many excess transactions. \
(be aware, however, that dedicated bad actors can use sophisticated software that
will reveal much of the same information over time)
`dash-qt` does not enable CoinJoin mixing by default.
`dash-qt-hd` does. It runs the following:
```sh
dash-qt \
-usehd \
-enablecoinjoin=1 \
-coinjoinautostart=1 \
-coinjoinrounds=16 \
-coinjoindenomsgoal=10 \
-coinjoindenomshardcap=25
```
The `coinjoindenomsgoal` and `coinjoindenomshardcap` prevent CoinJoin from
splitting coins down into hundreds of small, unusable coins.
### Other Tools
- [`dashphrase`](https://github.com/dashhive/dashphrase-cli) for generating
secure Wallet Phrases
- [`dashsight`](https://github.com/dashhive/dashphrase-cli) for inspecting
balances, transactions, etc via API (without downloading the indexes)
### More Documentation
All of the **command line flags and options** for the Dash Core Desktop Wallet
are documented between these two pages:
- https://docs.dash.org/projects/core/en/stable/docs/dashcore/wallet-arguments-and-commands-dash-qt.html
- https://docs.dash.org/projects/core/en/stable/docs/dashcore/wallet-arguments-and-commands-dashd.html
The **config files** `dash.conf` (mainly for _Full Nodes_) and `settings.json`
(mainly for Desktop Wallets) are documented at:
- <https://github.com/dashpay/dash/blob/master/contrib/debian/examples/dash.conf>
- <https://docs.dash.org/projects/core/en/stable/docs/dashcore/wallet-configuration-file.html>

View File

@@ -1,54 +0,0 @@
#!/usr/bin/env pwsh
####################
# Install dashcore #
####################
# Every package should define these variables
$pkg_cmd_name = "dash-qt"
$pkg_dst_cmd = "$Env:USERPROFILE\.local\opt\dashcore\bin\dash-qt.exe"
$pkg_dst_dir = "$Env:USERPROFILE\.local\opt\dashcore"
$pkg_dst = "$pkg_dst_cmd"
$pkg_src_cmd = "$Env:USERPROFILE\.local\opt\dashcore-v$Env:WEBI_VERSION\bin\dash-qt.exe"
$pkg_src_bin = "$Env:USERPROFILE\.local\opt\dashcore-v$Env:WEBI_VERSION\bin"
$pkg_src_dir = "$Env:USERPROFILE\.local\opt\dashcore-v$Env:WEBI_VERSION"
$pkg_src = "$pkg_src_cmd"
New-Item "$Env:USERPROFILE\Downloads\webi" -ItemType Directory -Force | Out-Null
$pkg_download = "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE"
# Fetch archive
IF (!(Test-Path -Path "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE")) {
Write-Output "Downloading dashcore from $Env:WEBI_PKG_URL to $pkg_download"
& curl.exe -A "$Env:WEBI_UA" -fsSL "$Env:WEBI_PKG_URL" -o "$pkg_download.part"
& Move-Item "$pkg_download.part" "$pkg_download"
}
IF (!(Test-Path -Path "$pkg_src_dir")) {
Write-Output "Installing dashcore"
# TODO: create package-specific temp directory
# Enter tmp
Push-Location .local\tmp
# Remove any leftover tmp cruft
Remove-Item -Path ".\dashcore*" -Recurse -ErrorAction Ignore
# Unpack archive file into this temporary directory
# Windows BSD-tar handles zip. Imagine that.
Write-Output "Unpacking $pkg_download"
& tar xf "$pkg_download"
# Settle unpacked archive into place
Write-Output "Install Location: $pkg_src_cmd"
Move-Item -Path ".\dashcore*" -Destination "$pkg_src_dir"
# Exit tmp
Pop-Location
}
Write-Output "Copying into '$pkg_dst_cmd' from '$pkg_src_cmd'"
Remove-Item -Path "$pkg_dst_cmd" -Recurse -ErrorAction Ignore | Out-Null
Copy-Item -Path "$pkg_src" -Destination "$pkg_dst" -Recurse

View File

@@ -1,81 +0,0 @@
#!/bin/sh
# shellcheck disable=SC2034
# "'pkg_cmd_name' appears unused. Verify it or export it."
__init_dashcore() {
set -e
set -u
####################
# Install dashcore #
####################
# Every package should define these 6 variables
pkg_cmd_name="dash-qt"
pkg_dst_cmd="$HOME/.local/opt/dashcore/bin/dash-qt"
pkg_dst_dir="$HOME/.local/opt/dashcore"
pkg_dst="$pkg_dst_dir"
pkg_src_cmd="$HOME/.local/opt/dashcore-v$WEBI_VERSION/bin/dash-qt"
pkg_src_dir="$HOME/.local/opt/dashcore-v$WEBI_VERSION"
pkg_src="$pkg_src_dir"
# pkg_install must be defined by every package
pkg_install() {
# mv ./dashcore-* ~/.local/opt/dashcore-v0.19.1
mv ./dashcore-* "${pkg_src_dir}"
if ! test -e "${HOME}/.dashcore"; then
mkdir -p "${HOME}/.dashcore"
chmod 0700 "${HOME}/.dashcore" || true
fi
# if ! test -e "${HOME}/.dashcore/dash.conf"; then
# my_main_pass="$(xxd -l16 -ps /dev/urandom)"
# my_test_pass="$(xxd -l16 -ps /dev/urandom)"
# {
# echo '[main]'
# echo "rpcuser=$(id -u -n)"
# echo "rpcpassword=${my_main_pass}"
# echo ''
# echo '[test]'
# echo "rpcuser=$(id -u -n)-test"
# echo "rpcpassword=${my_test_pass}"
# echo ''
# } >> "${HOME}/.dashcore/dash.conf"
# chmod 0600 "${HOME}/.dashcore/dash.conf" || true
# fi
# if ! test -e "${HOME}/.dashcore/settings.json"; then
# echo '{}' >> "${HOME}/.dashcore/settings.json"
# chmod 0600 "${HOME}/.dashcore/settings.json" || true
# fi
if ! test -e "$HOME/.local/bin/dash-qt-hd" ||
! test -e "$HOME/.local/bin/dash-qt-testnet"; then
"$HOME/.local/bin/webi" dashcore-utils
fi
# Always try to correct the permissions due to
# https://github.com/dashpay/dash/issues/5420
chmod -R og-rwx "${HOME}/.dashcore/" || true
}
# pkg_get_current_version is recommended, but not required
pkg_get_current_version() {
# 'dash-qt' doesn't have version info, so we use 'dashd'
# 'dashd --version' has output in this format:
# Dash Core Daemon version v19.1.0
# This trims it down to just the version number:
# 19.1.0
dashd --version 2> /dev/null |
head -n 1 |
cut -d ' ' -f 5 |
sed 's:^v::'
}
}
__init_dashcore

View File

@@ -1,28 +0,0 @@
'use strict';
var github = require('../_common/github.js');
var owner = 'dashpay';
var repo = 'dash';
module.exports = function (request) {
return github(request, owner, repo).then(function (all) {
all.releases = all.releases.filter(function (rel) {
return !rel.name.endsWith('.asc');
});
all.releases.forEach(function (rel) {
if (rel.name.includes('osx64')) {
rel.os = 'macos';
}
});
return all;
});
};
if (module === require.main) {
module.exports(require('@root/request')).then(function (all) {
all = require('../_webi/normalize.js')(all);
// just select the first 5 for demonstration
all.releases = all.releases.slice(0, 5);
console.info(JSON.stringify(all, null, 2));
});
}

View File

@@ -1,310 +0,0 @@
---
title: Dash Core Full Node Daemon
homepage: https://github.com/dashpay/dash
tagline: |
dashd is the Full Node service for Digital Cash (DASH)
---
To update or switch versions, run `webi dashd@stable` (or `@v0.19`, `@beta`,
etc).
### Recommended Hardware
- 100GB+ Block Storage
- 8GB RAM
- 4 vCPUs
- **30 hours** for initial indexing
### Files
These are the files / directories that are created and/or modified with this
install:
```txt
~/.config/envman/PATH.env
~/.dashcore/dash.conf
~/.dashcore/wallets/
~/.local/bin/bin/dashd-hd-service-install
~/.local/opt/dashcore/
/mnt/<BLK_VOL>/dashcore/
```
[`dashcore-utils`](../dashcore-utils/) will also be installed if not present.
## Cheat Sheet
> A DASH _Full Node_ syncs and indexes the DASH blockchain and can be used to
> broadcast transactions (sending money) and retrieve information about
> transactions, balances, etc. This "Dash Core" implementation is maintained by
> DCG.
To install as **a system service** with reasonable defaults, \
you can use these convenience scripts provided by Webi:
```sh
# USAGE
# dashd-hd-service-install [storage-volume] [testnet]
#
# EXAMPLE
dashd-hd-service-install
```
### QuickStart
0. Check that you have enough Storage and RAM
- mainnet: 100GB+ Storage, 8GB RAM
- testnet: 20GB+ Storage, 2GB RAM
1. Create a mount for your storage volume
```sh
sudo mkdir -p /mnt/100gb-vol/
sudo mount /dev/vda1 /mnt/100gb-vol/
```
2. Create a correctly permissioned `dashcore` directory
```sh
sudo mkdir -p /mnt/100g-vol/dashcore/
sudo chown -R "$(id -u -n):$(id -g -n)" /mnt/100gb-vol/dashcore/
```
3. Register `dashd` with the system launcher
```sh
dashd-hd-service-install
```
4. Wait **about 30 hours** for initial sync and indexing to complete
5. Test with the DashCore CLI
```sh
dash-cli getaddresstxids '{
"addresses": ["XchrTJFPGFiror4zjXQRR7XTSN25YtLYhC"],
"start": 0,
"end":1000000000
}'
```
### How to use DashCore CLI
After it completes the initial sync (about 4 hours), \
you can query address information:
```sh
# Balances
dash-cli getaddressbalance '{"addresses": ["XchrTJFPGFiror4zjXQRR7XTSN25YtLYhC"]}'
# UTXOs
dash-cli getaddressutxos '{"addresses": ["XpLVjhDd6vNJamtcJXcrpQYA1sE6fmxVDa"]}'
# TXes
dash-cli getaddresstxids '{
"addresses": ["XchrTJFPGFiror4zjXQRR7XTSN25YtLYhC"],
"start": 0,
"end":1000000000
}'
# Broadcast TX
dash-cli -testnet sendrawtransaction 01000000...0c0226b428a488ac00000000
```
### How to Run dashd Manually
To run **in the foreground**: \
(add `-testnet` to run on testnet)
```sh
dashd \
-usehd \
-conf="$HOME/.dashcore/dash.conf" \
-settings="$HOME/.dashcore/settings.json" \
-walletdir="$HOME/.dashcore/wallets/" \
-datadir="/mnt/100gb/dashcore/_data/" \
-blocksdir="/mnt/100gb/dashcore/_caches/" \
-addressindex=1 \
-timestampindex=1 \
-txindex=1 \
-spentindex=1
```
**Warning**: killing the process with ctrl+c before the first full sync may
corrupt the data and require starting over (see below)
### Server Requirements
150MB for Applications on OS Storage
For **mainnet**:
- 100GB Block Storage Volume \
- minimum of 40GB (blockchain) + 50GB (indexes) as of 2023
- plus 4-8GB per year
- 8GB RAM \
(min 4GB RAM + 4GB swap, otherwise it crashes during indexing)
- 4 vCPUs \
(min 2x 2.0GHz vCPUs, higher clock speed is better than more cors)
- 100 megabit network
- 28-30 hours to sync and index in ideal conditions
- minimum of 4 hours to sync
- approximately 28 hours to index regardless of sync time
For **testnet**:
- 20GB Block Storage Volume \
- min 4GB (blockchain) + 5 GB (indexes) as of 2022
- plus 0.5-1GB/year
- 2GB RAM
- 1 vCPU
- 4 hours to sync and index in ideal conditions
- 1 hour to sync
- about 4 hours to index regardless of sync time
### How to configure `dash.conf`
You can set options for `main`, `test`, and `regtest`.
If you intend to use the various RPCs you must enable indexes.
```ini
txindex=1
addressindex=1
timestampindex=1
spentindex=1
[main]
rpcuser=alice
rpcpassword=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
bind=127.0.0.1:9999
rpcbind=127.0.0.1:9998
rpcconnect=127.0.0.1:9998
rpcallowip=127.0.0.1/16
zmqpubrawtx=tcp://127.0.0.1:28332
zmqpubrawtxlock=tcp://127.0.0.1:28332
zmqpubrawchainlock=tcp://127.0.0.1:28332
zmqpubhashchainlock=tcp://127.0.0.1:28332
[test]
rpcuser=alice-test
rpcpassword=yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
bind=127.0.0.1:19999
rpcbind=127.0.0.1:19998
rpcconnect=127.0.0.1:19998
rpcallowip=127.0.0.1/16
zmqpubrawtx=tcp://127.0.0.1:18009
zmqpubrawtxlock=tcp://127.0.0.1:18009
zmqpubrawchainlock=tcp://127.0.0.1:18009
zmqpubhashchainlock=tcp://127.0.0.1:18009
```
See also:
- [dash: examples/dash.conf](https://github.com/dashpay/dash/blob/549e347b742cb4dc63807a292729e658218d7d0f/contrib/debian/examples/dash.conf#L2)
- [dashd: Indexing Options](https://docs.dash.org/projects/core/en/19.0.0/docs/dashcore/wallet-arguments-and-commands-dashd.html#indexing-options)
### How to Separate Caches from Data
You can make your data much safer by separating it from the caches you may need
to delete by setting:
- `-walletdir=` your money!!
- `-settings=` desktop app settings!
- `-conf=` server settings
- `-datadir=` generic caches
```sh
dashd \
-usehd \
-conf="$HOME/.config/dashcore/dash.conf" \
-walletdir="$HOME/.config/dashcore/wallets/" \
-datadir="/mnt/dashcore/dashcore/"
```
### How to Run as a System Service
You can use [`serviceman`](../serviceman/):
**Linux**
```sh
sudo env PATH="$PATH" \
serviceman add \
--system \
--username "$(id -n -u)" \
--path "$PATH" \
--name dashd \
--force \
-- \
dashd \
-usehd \
-conf="$HOME/.dashcore/dash.conf" \
-settings="$HOME/.dashcore/settings.json" \
-walletdir="$HOME/.dashcore/wallets/" \
-datadir="/mnt/100gb/dashcore/_data/" \
-blocksdir="/mnt/100gb/dashcore/_caches/"
```
**Mac**
```sh
serviceman add \
--path "$PATH" \
--name dashd \
--force \
-- \
dashd \
-usehd \
-conf="$HOME/.dashcore/dash.conf" \
-settings="$HOME/.dashcore/settings.json" \
-walletdir="$HOME/.dashcore/wallets/" \
-datadir="/Volumes/100gb/dashcore/_data/" \
-blocksdir="/Volumes/100gb/dashcore/_caches/"
```
**Windows**
(be sure modify variables appropriately for `cmd.exe` or `powershell`)
```sh
& serviceman add \
--name dashd \
--force \
-- \
dashd \
-usehd \
-conf="$Env:UserProfile/.dashcore/dash.conf" \
-settings="$Env:UserProfile/.dashcore/settings.json" \
-walletdir="$Env:UserProfile/.dashcore/wallets/" \
-datadir="D:/100gb/dashcore/_data/" \
-blocksdir="D:/100gb/dashcore/_caches/"
```
### How to Trim Excessive Storage
If the service **crashes** during the initial syncing and indexing (such as when
using less than 4GB RAM + 4GB Swap) it **will not resume** (typically).
Instead it will create duplicate new data, and not clean up the old data.
You may need to **delete /mnt/<BLK_VOL>/dashcore/** and start from scratch
(being careful not to delete any wallet information, if you have any).
Generally I wouldn't recommend storing money on a Full Node -since it's
primarily used for creating APIs for transactions and validations - but if you
do, please always make sure to use `-usehd` and print out your Wallet Phrase as
a failsafe.
### More Tools
In particular, you may find these useful:
- [`dashphrase`](https://github.com/dashhive/dashphrase-cli) for generating
secure Wallet Phrases
- [`dashsight`](https://github.com/dashhive/dashphrase-cli) for inspecting
balances, transactions, etc via API (without downloading the indexes)
### More Documentation
All of the **command line flags and options** for the Dash Core Desktop Wallet
are documented between these two pages:
- https://docs.dash.org/projects/core/en/stable/docs/dashcore/wallet-arguments-and-commands-dash-qt.html
- https://docs.dash.org/projects/core/en/stable/docs/dashcore/wallet-arguments-and-commands-dashd.html
The **config files** `dash.conf` (mainly for _Full Nodes_) and `settings.json`
(mainly for Desktop Wallets) are documented at:
- <https://github.com/dashpay/dash/blob/master/contrib/debian/examples/dash.conf>
- <https://docs.dash.org/projects/core/en/stable/docs/dashcore/wallet-configuration-file.html>

View File

@@ -1,54 +0,0 @@
#!/usr/bin/env pwsh
#################
# Install dashd #
#################
# Every package should define these variables
$pkg_cmd_name = "dashd"
$pkg_dst_cmd = "$Env:USERPROFILE\.local\opt\dashcore\bin\dashd.exe"
$pkg_dst_dir = "$Env:USERPROFILE\.local\opt\dashcore"
$pkg_dst = "$pkg_dst_cmd"
$pkg_src_cmd = "$Env:USERPROFILE\.local\opt\dashcore-v$Env:WEBI_VERSION\bin\dashd.exe"
$pkg_src_bin = "$Env:USERPROFILE\.local\opt\dashcore-v$Env:WEBI_VERSION\bin"
$pkg_src_dir = "$Env:USERPROFILE\.local\opt\dashcore-v$Env:WEBI_VERSION"
$pkg_src = "$pkg_src_cmd"
New-Item "$Env:USERPROFILE\Downloads\webi" -ItemType Directory -Force | Out-Null
$pkg_download = "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE"
# Fetch archive
IF (!(Test-Path -Path "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE")) {
Write-Output "Downloading dashd from $Env:WEBI_PKG_URL to $pkg_download"
& curl.exe -A "$Env:WEBI_UA" -fsSL "$Env:WEBI_PKG_URL" -o "$pkg_download.part"
& Move-Item "$pkg_download.part" "$pkg_download"
}
IF (!(Test-Path -Path "$pkg_src_dir")) {
Write-Output "Installing dashd"
# TODO: create package-specific temp directory
# Enter tmp
Push-Location .local\tmp
# Remove any leftover tmp cruft
Remove-Item -Path ".\dashcore*" -Recurse -ErrorAction Ignore
# Unpack archive file into this temporary directory
# Windows BSD-tar handles zip. Imagine that.
Write-Output "Unpacking $pkg_download"
& tar xf "$pkg_download"
# Settle unpacked archive into place
Write-Output "Install Location: $pkg_src_cmd"
Move-Item -Path ".\dashcore*" -Destination "$pkg_src_dir"
# Exit tmp
Pop-Location
}
Write-Output "Copying into '$pkg_dst_cmd' from '$pkg_src_cmd'"
Remove-Item -Path "$pkg_dst_cmd" -Recurse -ErrorAction Ignore | Out-Null
Copy-Item -Path "$pkg_src" -Destination "$pkg_dst" -Recurse

View File

@@ -1,74 +0,0 @@
#!/bin/sh
# shellcheck disable=SC2034,2317
# "'pkg_cmd_name' appears unused. Verify it or export it."
# "Command appears to be unreachable."
__init_dashd() {
set -e
set -u
#################
# Install dashd #
#################
# Every package should define these 6 variables
pkg_cmd_name="dashd"
pkg_dst_cmd="$HOME/.local/opt/dashcore/bin/dashd"
pkg_dst_dir="$HOME/.local/opt/dashcore"
pkg_dst="$pkg_dst_dir"
pkg_src_cmd="$HOME/.local/opt/dashcore-v$WEBI_VERSION/bin/dashd"
pkg_src_dir="$HOME/.local/opt/dashcore-v$WEBI_VERSION"
pkg_src="$pkg_src_dir"
# pkg_install must be defined by every package
pkg_install() {
# mv ./dashcore-* ~/.local/opt/dashcore-v0.19.1
mv ./dashcore-* "${pkg_src_dir}"
if ! test -e "${HOME}/.dashcore"; then
mkdir -p "${HOME}/.dashcore"
chmod 0700 "${HOME}/.dashcore"
fi
if ! test -e "$HOME/.local/bin/dashd-hd-service-install" ||
! test -e "$HOME/.local/bin/dashd-testnet-service-install"; then
"$HOME/.local/bin/webi" dashcore-utils
fi
# Always try to correct the permissions due to
# https://github.com/dashpay/dash/issues/5420
chmod -R og-rwx "${HOME}/.dashcore/" || true
}
pkg_done_message() {
echo "Installed 'dashd@v$WEBI_VERSION' to ~/.local/opt/dashcore/"
echo ""
echo "TO START THE DAEMON"
echo ""
echo " # mainnet"
echo " dashd-hd-service-install"
echo ""
echo ""
echo " # testnet"
echo " dashd-testnet-service-install"
echo ""
}
# pkg_get_current_version is recommended, but not required
pkg_get_current_version() {
# 'dashd --version' has output in this format:
# Dash Core Daemon version v19.1.0
# This trims it down to just the version number:
# 19.1.0
dashd --version 2> /dev/null |
head -n 1 |
cut -d ' ' -f 5 |
sed 's:^v::'
}
}
__init_dashd

View File

@@ -1,3 +0,0 @@
'use strict';
module.exports = require('../dashcore/releases.js');

View File

@@ -15,41 +15,43 @@ $pkg_src_bin = "$Env:USERPROFILE\.local\opt\dashmsg-v$Env:WEBI_VERSION\bin"
$pkg_src_dir = "$Env:USERPROFILE\.local\opt\dashmsg-v$Env:WEBI_VERSION" $pkg_src_dir = "$Env:USERPROFILE\.local\opt\dashmsg-v$Env:WEBI_VERSION"
$pkg_src = "$pkg_src_cmd" $pkg_src = "$pkg_src_cmd"
New-Item "$Env:USERPROFILE\Downloads\webi" -ItemType Directory -Force | Out-Null New-Item "$Env:USERPROFILE\Downloads\webi" -ItemType Directory -Force | out-null
$pkg_download = "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE" $pkg_download = "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE"
# Fetch archive # Fetch archive
IF (!(Test-Path -Path "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE")) { IF (!(Test-Path -Path "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE"))
Write-Output "Downloading dashmsg from $Env:WEBI_PKG_URL to $pkg_download" {
echo "Downloading dashmsg from $Env:WEBI_PKG_URL to $pkg_download"
& curl.exe -A "$Env:WEBI_UA" -fsSL "$Env:WEBI_PKG_URL" -o "$pkg_download.part" & curl.exe -A "$Env:WEBI_UA" -fsSL "$Env:WEBI_PKG_URL" -o "$pkg_download.part"
& Move-Item "$pkg_download.part" "$pkg_download" & move "$pkg_download.part" "$pkg_download"
} }
IF (!(Test-Path -Path "$pkg_src_cmd")) { IF (!(Test-Path -Path "$pkg_src_cmd"))
Write-Output "Installing dashmsg" {
echo "Installing dashmsg"
# TODO: create package-specific temp directory # TODO: create package-specific temp directory
# Enter tmp # Enter tmp
Push-Location .local\tmp pushd .local\tmp
# Remove any leftover tmp cruft # Remove any leftover tmp cruft
Remove-Item -Path ".\dashmsg-v*" -Recurse -ErrorAction Ignore Remove-Item -Path ".\dashmsg-v*" -Recurse -ErrorAction Ignore
Remove-Item -Path ".\dashmsg.exe" -Recurse -ErrorAction Ignore Remove-Item -Path ".\dashmsg.exe" -Recurse -ErrorAction Ignore
# Unpack archive file into this temporary directory # Unpack archive file into this temporary directory
# Windows BSD-tar handles zip. Imagine that. # Windows BSD-tar handles zip. Imagine that.
Write-Output "Unpacking $pkg_download" echo "Unpacking $pkg_download"
& tar xf "$pkg_download" & tar xf "$pkg_download"
# Settle unpacked archive into place # Settle unpacked archive into place
Write-Output "Install Location: $pkg_src_cmd" echo "Install Location: $pkg_src_cmd"
New-Item "$pkg_src_bin" -ItemType Directory -Force | Out-Null New-Item "$pkg_src_bin" -ItemType Directory -Force | out-null
Move-Item -Path ".\dashmsg.exe" -Destination "$pkg_src_bin" Move-Item -Path ".\dashmsg.exe" -Destination "$pkg_src_bin"
# Exit tmp # Exit tmp
Pop-Location popd
} }
Write-Output "Copying into '$pkg_dst_cmd' from '$pkg_src_cmd'" echo "Copying into '$pkg_dst_cmd' from '$pkg_src_cmd'"
Remove-Item -Path "$pkg_dst_cmd" -Recurse -ErrorAction Ignore | Out-Null Remove-Item -Path "$pkg_dst_cmd" -Recurse -ErrorAction Ignore | out-null
Copy-Item -Path "$pkg_src" -Destination "$pkg_dst" -Recurse Copy-Item -Path "$pkg_src" -Destination "$pkg_dst" -Recurse

View File

@@ -15,49 +15,51 @@ $pkg_src_bin = "$Env:USERPROFILE\.local\opt\delta-v$Env:WEBI_VERSION\bin"
$pkg_src_dir = "$Env:USERPROFILE\.local\opt\delta-v$Env:WEBI_VERSION" $pkg_src_dir = "$Env:USERPROFILE\.local\opt\delta-v$Env:WEBI_VERSION"
$pkg_src = "$pkg_src_cmd" $pkg_src = "$pkg_src_cmd"
New-Item "$Env:USERPROFILE\Downloads\webi" -ItemType Directory -Force | Out-Null New-Item "$Env:USERPROFILE\Downloads\webi" -ItemType Directory -Force | out-null
$pkg_download = "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE" $pkg_download = "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE"
# Fetch archive # Fetch archive
IF (!(Test-Path -Path "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE")) { IF (!(Test-Path -Path "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE"))
Write-Output "Downloading delta from $Env:WEBI_PKG_URL to $pkg_download" {
echo "Downloading delta from $Env:WEBI_PKG_URL to $pkg_download"
& curl.exe -A "$Env:WEBI_UA" -fsSL "$Env:WEBI_PKG_URL" -o "$pkg_download.part" & curl.exe -A "$Env:WEBI_UA" -fsSL "$Env:WEBI_PKG_URL" -o "$pkg_download.part"
& Move-Item "$pkg_download.part" "$pkg_download" & move "$pkg_download.part" "$pkg_download"
} }
IF (!(Test-Path -Path "$pkg_src_cmd")) { IF (!(Test-Path -Path "$pkg_src_cmd"))
Write-Output "Installing delta" {
echo "Installing delta"
# TODO: create package-specific temp directory # TODO: create package-specific temp directory
# Enter tmp # Enter tmp
Push-Location .local\tmp pushd .local\tmp
# Remove any leftover tmp cruft # Remove any leftover tmp cruft
Remove-Item -Path ".\delta-v*" -Recurse -ErrorAction Ignore Remove-Item -Path ".\delta-v*" -Recurse -ErrorAction Ignore
Remove-Item -Path ".\delta.exe" -Recurse -ErrorAction Ignore Remove-Item -Path ".\delta.exe" -Recurse -ErrorAction Ignore
# Unpack archive file into this temporary directory # Unpack archive file into this temporary directory
# Windows BSD-tar handles zip. Imagine that. # Windows BSD-tar handles zip. Imagine that.
Write-Output "Unpacking $pkg_download" echo "Unpacking $pkg_download"
& tar xf "$pkg_download" & tar xf "$pkg_download"
# Settle unpacked archive into place # Settle unpacked archive into place
Write-Output "Install Location: $pkg_src_cmd" echo "Install Location: $pkg_src_cmd"
New-Item "$pkg_src_bin" -ItemType Directory -Force | Out-Null New-Item "$pkg_src_bin" -ItemType Directory -Force | out-null
Move-Item -Path ".\delta-*\delta.exe" -Destination "$pkg_src_bin" Move-Item -Path ".\delta-*\delta.exe" -Destination "$pkg_src_bin"
# set delta to be the default differ # set delta to be the default differ
git config --global page.diff delta git config --global page.diff delta
git config --global page.show delta git config --global page.show delta
git config --global page.log delta git config --global page.log delta
git config --global page.blame delta git config --global page.blame delta
git config --global page.reflog delta git config --global page.reflog delta
git config --global interactive.diffFilter 'delta --color-only' git config --global interactive.diffFilter 'delta --color-only'
# Exit tmp # Exit tmp
Pop-Location popd
} }
Write-Output "Copying into '$pkg_dst_cmd' from '$pkg_src_cmd'" echo "Copying into '$pkg_dst_cmd' from '$pkg_src_cmd'"
Remove-Item -Path "$pkg_dst_cmd" -Recurse -ErrorAction Ignore | Out-Null Remove-Item -Path "$pkg_dst_cmd" -Recurse -ErrorAction Ignore | out-null
Copy-Item -Path "$pkg_src" -Destination "$pkg_dst" -Recurse Copy-Item -Path "$pkg_src" -Destination "$pkg_dst" -Recurse

View File

@@ -1,38 +1,43 @@
#!/usr/bin/env pwsh #!/usr/bin/env pwsh
# Fetch archive # Fetch archive
IF (!(Test-Path -Path "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE")) { IF (!(Test-Path -Path "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE"))
Write-Output "Downloading $Env:PKG_NAME from $Env:WEBI_PKG_URL to $Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE" {
echo "Downloading $Env:PKG_NAME from $Env:WEBI_PKG_URL to $Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE"
#Invoke-WebRequest https://nodejs.org/dist/v12.16.2/node-v12.16.2-win-x64.zip -OutFile node-v12.16.2-win-x64.zip #Invoke-WebRequest https://nodejs.org/dist/v12.16.2/node-v12.16.2-win-x64.zip -OutFile node-v12.16.2-win-x64.zip
& curl.exe -A "$Env:WEBI_UA" -fsSL "$Env:WEBI_PKG_URL" -o "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE.part" & curl.exe -A "$Env:WEBI_UA" -fsSL "$Env:WEBI_PKG_URL" -o "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE.part"
& Move-Item "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE.part" "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE" & move "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE.part" "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE"
} }
IF (!(Test-Path -Path "$Env:USERPROFILE\.local\opt\$Env:PKG_NAME-v$Env:WEBI_VERSION")) { IF (!(Test-Path -Path "$Env:USERPROFILE\.local\opt\$Env:PKG_NAME-v$Env:WEBI_VERSION"))
Write-Output "Installing $Env:PKG_NAME" {
echo "Installing $Env:PKG_NAME"
# TODO: temp directory # TODO: temp directory
# Enter opt # Enter opt
Push-Location .local\tmp pushd .local\tmp
# Remove any leftover tmp cruft # Remove any leftover tmp cruft
Remove-Item -Path "deno-v*" -Recurse -ErrorAction Ignore Remove-Item -Path "deno-v*" -Recurse -ErrorAction Ignore
# Unpack archive # Unpack archive
# Windows BSD-tar handles zip. Imagine that. # Windows BSD-tar handles zip. Imagine that.
Write-Output "Unpacking $Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE" echo "Unpacking $Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE"
& tar xf "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE" & tar xf "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE"
# Settle unpacked archive into place # Settle unpacked archive into place
Write-Output "New Name: $Env:PKG_NAME-v$Env:WEBI_VERSION" echo "New Name: $Env:PKG_NAME-v$Env:WEBI_VERSION"
Get-ChildItem "deno*" | Select-Object -f 1 | Rename-Item -NewName "$Env:PKG_NAME-v$Env:WEBI_VERSION.exe" Get-ChildItem "deno*" | Select -f 1 | Rename-Item -NewName "$Env:PKG_NAME-v$Env:WEBI_VERSION.exe"
Write-Output "New Location: $Env:USERPROFILE\.local\opt\$Env:PKG_NAME-v$Env:WEBI_VERSION.exe" echo "New Location: $Env:USERPROFILE\.local\opt\$Env:PKG_NAME-v$Env:WEBI_VERSION.exe"
Move-Item -Path "$Env:PKG_NAME-v$Env:WEBI_VERSION.exe" -Destination "$Env:USERPROFILE\.local\opt" Move-Item -Path "$Env:PKG_NAME-v$Env:WEBI_VERSION.exe" -Destination "$Env:USERPROFILE\.local\opt"
# Exit tmp # Exit tmp
Pop-Location popd
} }
Write-Output "Copying into '$Env:USERPROFILE\.local\bin\$Env:PKG_NAME.exe' from '$Env:USERPROFILE\.local\opt\$Env:PKG_NAME-v$Env:WEBI_VERSION.exe'" echo "Copying into '$Env:USERPROFILE\.local\bin\$Env:PKG_NAME.exe' from '$Env:USERPROFILE\.local\opt\$Env:PKG_NAME-v$Env:WEBI_VERSION.exe'"
Remove-Item -Path "$Env:USERPROFILE\.local\bin\$Env:PKG_NAME.exe" -Recurse -ErrorAction Ignore Remove-Item -Path "$Env:USERPROFILE\.local\bin\$Env:PKG_NAME.exe" -Recurse -ErrorAction Ignore
Copy-Item -Path "$Env:USERPROFILE\.local\opt\$Env:PKG_NAME-v$Env:WEBI_VERSION.exe" -Destination "$Env:USERPROFILE\.local\bin\$Env:PKG_NAME.exe" -Recurse Copy-Item -Path "$Env:USERPROFILE\.local\opt\$Env:PKG_NAME-v$Env:WEBI_VERSION.exe" -Destination "$Env:USERPROFILE\.local\bin\$Env:PKG_NAME.exe" -Recurse
# Add to path
& "$Env:USERPROFILE\.local\bin\pathman.exe" add ~/.local/bin

View File

@@ -5,32 +5,20 @@ tagline: |
dotenv-linter: ⚡️ Lightning-fast linter for .env files. Written in Rust 🦀 dotenv-linter: ⚡️ Lightning-fast linter for .env files. Written in Rust 🦀
--- ---
To update or switch versions, run `webi dotenv-linter@stable` (or `@v3.3`, ### Updating `dotenv-linter`
`@beta`, etc).
### Files `webi dotenv-linter@stable`
These are the files / directories that are created and/or modified with this Use the `@beta` tag for pre-releases.
install:
```text #### Windows
~/.config/envman/PATH.env
~/.local/bin/dotenv-linter
```
**Windows Users** On Windows you'll get an error like this:
```text > execution cannot proceed run because `vcruntime140.dll` was not found
\Windows\System32\vcruntime140.dll
```
This will also attempt to install the You need to download and install the
[Microsoft Visual C++ Redistributable](../vcruntime/) via `webi vcruntime`. If [Microsoft Visual C++ Redistributable](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads).
it fails and you get the error _`vcruntime140.dll` was not found_, you'll need
to [install it manually](msvc-learn).
[msvc-learn]:
https://learn.microsoft.com/en-US/cpp/windows/latest-supported-vc-redist?view=msvc-170
## Cheat Sheet ## Cheat Sheet
@@ -60,29 +48,14 @@ For the complete usage, see the official
### How to automatically fix errors ### How to automatically fix errors
Use the `fix` subcommand. Use the `--fix` flag.
```sh ```sh
dotenv-linter fix dotenv-linter --fix
``` ```
Backup files in the format of `.env_0000000000` will be created by default. \ Backup files in the format of `.env_0000000000` will be created by default. You
You can use `--no-backup` to skip this. can use `--no-backup` to skip this.
### How to compare keys between environements
Use the `compare` subcommand
```sh
dotenv-linter compare ./my-dev.env ./my-prod.env
```
```text
Comparing my-dev.env
Comparing my-prod.env
my-dev.env is missing keys: FOO_API_TOKEN
my-prod.env is missing keys: BAR_ID, BAR_SECRET
```
### How to toggle linter rules ### How to toggle linter rules
@@ -92,20 +65,18 @@ You can turn off certain linter checks with `--skip` options, for example:
dotenv-linter --skip QuoteCharacter --skip UnorderedKey dotenv-linter --skip QuoteCharacter --skip UnorderedKey
``` ```
You can see the full list of linter rules with `dotenv-linter list`: You can see the full list of linter rules with `dotenv-linter --show-checks`:
```text ```text
DuplicatedKey DuplicatedKey
EndingBlankLine EndingBlankLine
ExtraBlankLine ExtraBlankLine
IncorrectDelimiter IncorrectDelimiter
KeyWithoutValue
LeadingCharacter LeadingCharacter
KeyWithoutValue
LowercaseKey LowercaseKey
QuoteCharacter QuoteCharacter
SpaceCharacter SpaceCharacter
SubstitutionKey
TrailingWhitespace TrailingWhitespace
UnorderedKey UnorderedKey
ValueWithoutQuotes
``` ```

View File

@@ -15,47 +15,43 @@ $pkg_src_bin = "$Env:USERPROFILE\.local\opt\dotenv-linter-v$Env:WEBI_VERSION\bin
$pkg_src_dir = "$Env:USERPROFILE\.local\opt\dotenv-linter-v$Env:WEBI_VERSION" $pkg_src_dir = "$Env:USERPROFILE\.local\opt\dotenv-linter-v$Env:WEBI_VERSION"
$pkg_src = "$pkg_src_cmd" $pkg_src = "$pkg_src_cmd"
New-Item "$Env:USERPROFILE\Downloads\webi" -ItemType Directory -Force | Out-Null New-Item "$Env:USERPROFILE\Downloads\webi" -ItemType Directory -Force | out-null
$pkg_download = "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE" $pkg_download = "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE"
# Fetch MSVC Runtime
Write-Output "Checking for MSVC Runtime..."
IF (-not (Test-Path "\Windows\System32\vcruntime140.dll")) {
& "$Env:USERPROFILE\.local\bin\webi-pwsh.ps1" vcruntime
}
# Fetch archive # Fetch archive
IF (!(Test-Path -Path "$pkg_download")) { IF (!(Test-Path -Path "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE"))
Write-Output "Downloading dotenv-linter from $Env:WEBI_PKG_URL to $pkg_download" {
echo "Downloading dotenv-linter from $Env:WEBI_PKG_URL to $pkg_download"
& curl.exe -A "$Env:WEBI_UA" -fsSL "$Env:WEBI_PKG_URL" -o "$pkg_download.part" & curl.exe -A "$Env:WEBI_UA" -fsSL "$Env:WEBI_PKG_URL" -o "$pkg_download.part"
& Move-Item "$pkg_download.part" "$pkg_download" & move "$pkg_download.part" "$pkg_download"
} }
IF (!(Test-Path -Path "$pkg_src_cmd")) { IF (!(Test-Path -Path "$pkg_src_cmd"))
Write-Output "Installing dotenv-linter" {
echo "Installing dotenv-linter"
# TODO: create package-specific temp directory # TODO: create package-specific temp directory
# Enter tmp # Enter tmp
Push-Location .local\tmp pushd .local\tmp
# Remove any leftover tmp cruft # Remove any leftover tmp cruft
Remove-Item -Path ".\dotenv-linter-v*" -Recurse -ErrorAction Ignore Remove-Item -Path ".\dotenv-linter-v*" -Recurse -ErrorAction Ignore
Remove-Item -Path ".\dotenv-linter.exe" -Recurse -ErrorAction Ignore Remove-Item -Path ".\dotenv-linter.exe" -Recurse -ErrorAction Ignore
# Unpack archive file into this temporary directory # Unpack archive file into this temporary directory
# Windows BSD-tar handles zip. Imagine that. # Windows BSD-tar handles zip. Imagine that.
Write-Output "Unpacking $pkg_download" echo "Unpacking $pkg_download"
& tar xf "$pkg_download" & tar xf "$pkg_download"
# Settle unpacked archive into place # Settle unpacked archive into place
Write-Output "Install Location: $pkg_src_cmd" echo "Install Location: $pkg_src_cmd"
New-Item "$pkg_src_bin" -ItemType Directory -Force | Out-Null New-Item "$pkg_src_bin" -ItemType Directory -Force | out-null
Move-Item -Path ".\dotenv-linter.exe" -Destination "$pkg_src_bin" Move-Item -Path ".\dotenv-linter.exe" -Destination "$pkg_src_bin"
# Exit tmp # Exit tmp
Pop-Location popd
} }
Write-Output "Copying into '$pkg_dst_cmd' from '$pkg_src_cmd'" echo "Copying into '$pkg_dst_cmd' from '$pkg_src_cmd'"
Remove-Item -Path "$pkg_dst_cmd" -Recurse -ErrorAction Ignore | Out-Null Remove-Item -Path "$pkg_dst_cmd" -Recurse -ErrorAction Ignore | out-null
Copy-Item -Path "$pkg_src" -Destination "$pkg_dst" -Recurse Copy-Item -Path "$pkg_src" -Destination "$pkg_dst" -Recurse

View File

@@ -7,16 +7,6 @@ tagline: |
To update or switch versions, run `webi dotenv@stable`. To update or switch versions, run `webi dotenv@stable`.
### Files
These are the files / directories that are created and/or modified with this
install:
```text
~/.config/envman/PATH.env
~/.local/bin/dotenv
```
## Cheat Sheet ## Cheat Sheet
> dotenv makes it easy to run a command with a set of ENVs (environment > dotenv makes it easy to run a command with a set of ENVs (environment

View File

@@ -15,41 +15,43 @@ $pkg_src_bin = "$Env:USERPROFILE\.local\opt\dotenv-v$Env:WEBI_VERSION\bin"
$pkg_src_dir = "$Env:USERPROFILE\.local\opt\dotenv-v$Env:WEBI_VERSION" $pkg_src_dir = "$Env:USERPROFILE\.local\opt\dotenv-v$Env:WEBI_VERSION"
$pkg_src = "$pkg_src_cmd" $pkg_src = "$pkg_src_cmd"
New-Item "$Env:USERPROFILE\Downloads\webi" -ItemType Directory -Force | Out-Null New-Item "$Env:USERPROFILE\Downloads\webi" -ItemType Directory -Force | out-null
$pkg_download = "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE" $pkg_download = "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE"
# Fetch archive # Fetch archive
IF (!(Test-Path -Path "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE")) { IF (!(Test-Path -Path "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE"))
Write-Output "Downloading dotenv from $Env:WEBI_PKG_URL to $pkg_download" {
echo "Downloading dotenv from $Env:WEBI_PKG_URL to $pkg_download"
& curl.exe -A "$Env:WEBI_UA" -fsSL "$Env:WEBI_PKG_URL" -o "$pkg_download.part" & curl.exe -A "$Env:WEBI_UA" -fsSL "$Env:WEBI_PKG_URL" -o "$pkg_download.part"
& Move-Item "$pkg_download.part" "$pkg_download" & move "$pkg_download.part" "$pkg_download"
} }
IF (!(Test-Path -Path "$pkg_src_cmd")) { IF (!(Test-Path -Path "$pkg_src_cmd"))
Write-Output "Installing dotenv" {
echo "Installing dotenv"
# TODO: create package-specific temp directory # TODO: create package-specific temp directory
# Enter tmp # Enter tmp
Push-Location .local\tmp pushd .local\tmp
# Remove any leftover tmp cruft # Remove any leftover tmp cruft
Remove-Item -Path ".\dotenv-v*" -Recurse -ErrorAction Ignore Remove-Item -Path ".\dotenv-v*" -Recurse -ErrorAction Ignore
Remove-Item -Path ".\dotenv.exe" -Recurse -ErrorAction Ignore Remove-Item -Path ".\dotenv.exe" -Recurse -ErrorAction Ignore
# Unpack archive file into this temporary directory # Unpack archive file into this temporary directory
# Windows BSD-tar handles zip. Imagine that. # Windows BSD-tar handles zip. Imagine that.
Write-Output "Unpacking $pkg_download" echo "Unpacking $pkg_download"
& tar xf "$pkg_download" & tar xf "$pkg_download"
# Settle unpacked archive into place # Settle unpacked archive into place
Write-Output "Install Location: $pkg_src_cmd" echo "Install Location: $pkg_src_cmd"
New-Item "$pkg_src_bin" -ItemType Directory -Force | Out-Null New-Item "$pkg_src_bin" -ItemType Directory -Force | out-null
Move-Item -Path ".\dotenv.exe" -Destination "$pkg_src_bin" Move-Item -Path ".\dotenv.exe" -Destination "$pkg_src_bin"
# Exit tmp # Exit tmp
Pop-Location popd
} }
Write-Output "Copying into '$pkg_dst_cmd' from '$pkg_src_cmd'" echo "Copying into '$pkg_dst_cmd' from '$pkg_src_cmd'"
Remove-Item -Path "$pkg_dst_cmd" -Recurse -ErrorAction Ignore | Out-Null Remove-Item -Path "$pkg_dst_cmd" -Recurse -ErrorAction Ignore | out-null
Copy-Item -Path "$pkg_src" -Destination "$pkg_dst" -Recurse Copy-Item -Path "$pkg_src" -Destination "$pkg_dst" -Recurse

View File

@@ -11,7 +11,6 @@ module.exports = function (request) {
'armv6l', 'armv6l',
'armv7l', 'armv7l',
'ppc64le', 'ppc64le',
'ppc64',
's390x', 's390x',
'x86', 'x86',
]; ];

View File

@@ -7,17 +7,6 @@ tagline: |
To update or switch versions, run `webi fd@stable` (or `@v8.2`, `@beta`, etc). To update or switch versions, run `webi fd@stable` (or `@v8.2`, `@beta`, etc).
### Files
These are the files / directories that are created and/or modified with this
install:
```text
~/.config/envman/PATH.env
~/.config/fd/ignore
~/.local/bin/fd
```
## Cheat Sheet ## Cheat Sheet
![](https://github.com/sharkdp/fd/raw/master/doc/screencast.svg?sanitize=true) ![](https://github.com/sharkdp/fd/raw/master/doc/screencast.svg?sanitize=true)
@@ -60,5 +49,5 @@ fd -e md -e mkdn -e js -e mjs
For options see: For options see:
```sh ```sh
fd --help hexyl --help
``` ```

View File

@@ -3,39 +3,41 @@
$VERNAME = "$Env:PKG_NAME-v$Env:WEBI_VERSION.exe" $VERNAME = "$Env:PKG_NAME-v$Env:WEBI_VERSION.exe"
$EXENAME = "$Env:PKG_NAME.exe" $EXENAME = "$Env:PKG_NAME.exe"
# Fetch archive # Fetch archive
IF (!(Test-Path -Path "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE")) { IF (!(Test-Path -Path "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE"))
Write-Output "Downloading $Env:PKG_NAME from $Env:WEBI_PKG_URL to $Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE" {
echo "Downloading $Env:PKG_NAME from $Env:WEBI_PKG_URL to $Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE"
& curl.exe -A "$Env:WEBI_UA" -fsSL "$Env:WEBI_PKG_URL" -o "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE.part" & curl.exe -A "$Env:WEBI_UA" -fsSL "$Env:WEBI_PKG_URL" -o "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE.part"
& Move-Item "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE.part" "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE" & move "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE.part" "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE"
} }
IF (!(Test-Path -Path "$Env:USERPROFILE\.local\xbin\$VERNAME")) { IF (!(Test-Path -Path "$Env:USERPROFILE\.local\xbin\$VERNAME"))
Write-Output "Installing $Env:PKG_NAME" {
echo "Installing $Env:PKG_NAME"
# TODO: temp directory # TODO: temp directory
# Enter tmp # Enter tmp
Push-Location .local\tmp pushd .local\tmp
# Remove any leftover tmp cruft # Remove any leftover tmp cruft
Remove-Item -Path "$Env:PKG_NAME-v*" -Recurse -ErrorAction Ignore Remove-Item -Path "$Env:PKG_NAME-v*" -Recurse -ErrorAction Ignore
# Unpack archive # Unpack archive
# Windows BSD-tar handles zip. Imagine that. # Windows BSD-tar handles zip. Imagine that.
Write-Output "Unpacking $Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE" echo "Unpacking $Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE"
& tar xf "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE" & tar xf "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE"
# Move single binary into root of temporary folder # Move single binary into root of temporary folder
& Move-Item "$EXENAME" "$VERNAME" & move "$EXENAME" "$VERNAME"
# Settle unpacked archive into place # Settle unpacked archive into place
Write-Output "New Name: $VERNAME" echo "New Name: $VERNAME"
Write-Output "New Location: $Env:USERPROFILE\.local\xbin\$VERNAME" echo "New Location: $Env:USERPROFILE\.local\xbin\$VERNAME"
Move-Item -Path "$VERNAME" -Destination "$Env:USERPROFILE\.local\xbin" Move-Item -Path "$VERNAME" -Destination "$Env:USERPROFILE\.local\xbin"
# Exit tmp # Exit tmp
Pop-Location popd
} }
Write-Output "Copying into '$Env:USERPROFILE\.local\bin\$EXENAME' from '$Env:USERPROFILE\.local\xbin\$VERNAME'" echo "Copying into '$Env:USERPROFILE\.local\bin\$EXENAME' from '$Env:USERPROFILE\.local\xbin\$VERNAME'"
Remove-Item -Path "$Env:USERPROFILE\.local\bin\$EXENAME" -Recurse -ErrorAction Ignore Remove-Item -Path "$Env:USERPROFILE\.local\bin\$EXENAME" -Recurse -ErrorAction Ignore
Copy-Item -Path "$Env:USERPROFILE\.local\xbin\$VERNAME" -Destination "$Env:USERPROFILE\.local\bin\$EXENAME" -Recurse Copy-Item -Path "$Env:USERPROFILE\.local\xbin\$VERNAME" -Destination "$Env:USERPROFILE\.local\bin\$EXENAME" -Recurse

View File

@@ -8,16 +8,6 @@ tagline: |
To update or switch versions, run `webi ffmpeg@stable` (or `@v4.4`, `@beta`, To update or switch versions, run `webi ffmpeg@stable` (or `@v4.4`, `@beta`,
etc). etc).
### Files
These are the files / directories that are created and/or modified with this
install:
```text
~/.config/envman/PATH.env
~/.local/bin/ffmpeg
```
## Cheat Sheet ## Cheat Sheet
> FFmpeg is useful for converting between various audio, video, and image > FFmpeg is useful for converting between various audio, video, and image
@@ -29,16 +19,3 @@ that produce the most similar quality by default.
```sh ```sh
ffmpeg -i input.m4a output.mp3 ffmpeg -i input.m4a output.mp3
``` ```
Important information per https://johnvansickle.com/ffmpeg/release-readme.txt
> Notes: A limitation of statically linking `glibc` is the loss of DNS
> resolution. Installing `nscd` through your package manager will fix this.
_This is relevant if using ffmpeg to relay to an RTMP server via domain name._
```sh
# for example, this will not work without `nscd` installed.
ffmpeg -re -stream_loop -1 -i "FooBar.m4v" -c copy -f flv rtmp://stream.example.com/foo/bar
```

View File

@@ -15,35 +15,37 @@ $pkg_src_bin = "$Env:USERPROFILE\.local\opt\ffmpeg-v$Env:WEBI_VERSION\bin"
$pkg_src_dir = "$Env:USERPROFILE\.local\opt\ffmpeg-v$Env:WEBI_VERSION" $pkg_src_dir = "$Env:USERPROFILE\.local\opt\ffmpeg-v$Env:WEBI_VERSION"
$pkg_src = "$pkg_src_cmd" $pkg_src = "$pkg_src_cmd"
New-Item "$Env:USERPROFILE\Downloads\webi" -ItemType Directory -Force | Out-Null New-Item "$Env:USERPROFILE\Downloads\webi" -ItemType Directory -Force | out-null
$pkg_download = "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE" $pkg_download = "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE"
# Fetch archive # Fetch archive
IF (!(Test-Path -Path "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE")) { IF (!(Test-Path -Path "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE"))
Write-Output "Downloading ffmpeg from $Env:WEBI_PKG_URL to $pkg_download" {
echo "Downloading ffmpeg from $Env:WEBI_PKG_URL to $pkg_download"
& curl.exe -A "$Env:WEBI_UA" -fsSL "$Env:WEBI_PKG_URL" -o "$pkg_download.part" & curl.exe -A "$Env:WEBI_UA" -fsSL "$Env:WEBI_PKG_URL" -o "$pkg_download.part"
Move-Item -Path "$pkg_download.part" -Destination "$pkg_download" -Force Move-Item -Path "$pkg_download.part" -Destination "$pkg_download" -Force
} }
IF (!(Test-Path -Path "$pkg_src_cmd")) { IF (!(Test-Path -Path "$pkg_src_cmd"))
Write-Output "Installing ffmpeg" {
echo "Installing ffmpeg"
# TODO: create package-specific temp directory # TODO: create package-specific temp directory
# Enter tmp # Enter tmp
Push-Location .local\tmp pushd .local\tmp
# Remove any leftover tmp cruft # Remove any leftover tmp cruft
Remove-Item -Path ".\win32-*" -Recurse -ErrorAction Ignore Remove-Item -Path ".\win32-*" -Recurse -ErrorAction Ignore
# Settle unpacked archive into place # Settle unpacked archive into place
Write-Output "Install Location: $pkg_src_cmd" echo "Install Location: $pkg_src_cmd"
New-Item "$pkg_src_bin" -ItemType Directory -Force | Out-Null New-Item "$pkg_src_bin" -ItemType Directory -Force | out-null
Move-Item -Path "$pkg_download" -Destination "$pkg_src_cmd" -Force Move-Item -Path "$pkg_download" -Destination "$pkg_src_cmd" -Force
# Exit tmp # Exit tmp
Pop-Location popd
} }
Write-Output "Copying into '$pkg_dst_cmd' from '$pkg_src_cmd'" echo "Copying into '$pkg_dst_cmd' from '$pkg_src_cmd'"
Remove-Item -Path "$pkg_dst_cmd" -Recurse -ErrorAction Ignore | Out-Null Remove-Item -Path "$pkg_dst_cmd" -Recurse -ErrorAction Ignore | out-null
Copy-Item -Path "$pkg_src" -Destination "$pkg_dst" -Recurse Copy-Item -Path "$pkg_src" -Destination "$pkg_dst" -Recurse

View File

@@ -1,118 +0,0 @@
---
title: ffuf
homepage: https://github.com/ffuf/ffuf
tagline: |
Fuzz Faster U Fool: A fast web fuzzer written in Go.
---
To update or switch versions, run `webi ffuf@stable` (or `@v2`, `@beta`, etc).
### Files
These are the files / directories that are created and/or modified with this
install:
```text
~/.config/envman/PATH.env
~/.local/bin/ffuf
```
## Cheat Sheet
> `ffuf` is a powerful web fuzzer written in Go. With a range of functionalities
> and fast performance, it's a must-have tool for penetration testers and
> security researchers.
[![ffuf mascot](https://github.com/ffuf/ffuf/blob/v2.1.0/_img/ffuf_run_logo_600.png?raw=true)](https://github.com/ffuf/ffuf)
Rotate through wordlists to discover and report exposed URLs, domains, etc.
```sh
# fuff -w <list>[:VAR] -u 'https://<target>/<VAR>'
fuff -w ./fuzz-Bo0oM.txt -u 'https://ffuf.io.fi/FUZZ
```
```sh
fuff \
-w ./fuzz-Bo0oM.txt:'FUZZ_PATH' \
-w ./subdomains-top1million-5000.txt:'FUZZ_SUB' \
-u 'https://FUZZ_SUB.ffuf.io.fi/FUZZ_PATH'
```
### How to get ffuf wordlists
| Download | &emsp; Source | &emsp; Desc |
| ---------------------------------------- | -------------------------------------- | -------------------------- |
| [onelistforallmicro.txt][4allu] | &emsp; [OneListForAll][4all] | &emsp; Words, Paths, Files |
| [fuzz-Bo0oM.txt][boom] | &emsp; [SecLists/Fuzzing][fuzz] | &emsp; Words, Paths, Files |
| [subdomains-top1million-5000.txt][sub5k] | &emsp; [SecLists/.../DNS][dns] | &emsp; Common Subdomains |
| [burp-parameter-names.txt][params] | &emsp; [SecLists/.../Web-Content][web] | &emsp; HTTP Query Params |
| [urls-wordpress-3.3.1.txt][wp3] | &emsp; [SecLists/.../URLs][urls] | &emsp; WordPress v3 Paths |
<!-- Browse Categories -->
[4all]: https://github.com/six2dez/OneListForAll/
[dns]: https://github.com/danielmiessler/SecLists/blob/master/Discovery/DNS/
[fuzz]: https://github.com/danielmiessler/SecLists/blob/master/Fuzzing/
[web]:
https://github.com/danielmiessler/SecLists/blob/master/Discovery/Web-Content/
[seclist]: https://github.com/danielmiessler/SecLists/
[urls]:
https://github.com/danielmiessler/SecLists/blob/master/Discovery/Web-Content/URLs/
<!-- Download Lists -->
[4allu]:
https://raw.githubusercontent.com/six2dez/OneListForAll/main/onelistforallmicro.txt
[boom]:
https://raw.githubusercontent.com/danielmiessler/SecLists/master/Fuzzing/fuzz-Bo0oM.txt
[params]:
https://raw.githubusercontent.com/danielmiessler/SecLists/master/Discovery/Web-Content/burp-parameter-names.txt
[sub5k]:
https://raw.githubusercontent.com/danielmiessler/SecLists/master/Discovery/DNS/subdomains-top1million-5000.txt
[wp3]:
https://raw.githubusercontent.com/danielmiessler/SecLists/master/Discovery/Web-Content/URLs/urls-wordpress-3.3.1.txt
<br>
These were pulled from the resources mentioned in
[ffuf wiki: Wordlistt Resources](https://github.com/ffuf/ffuf/wiki#wordlist-resources):
- [six2dez/OneListForAll][4all]
- [danielmiessler/SecLists][seclist]
### How to Discover Exposed Content
For typical directory discovery:
```sh
ffuf -w ./onelistforallmicro.txt:'FUZZ' -u https://example.com/FUZZ
```
### How to check for Domain Fronting (VHost Discovery)
Assuming a default virtualhost response size:
```sh
ffuf \
-w ./subdomains-top1million-5000.txt:'SUB' \
-u https://example.com \
-H "Host: SUB.example.com" \
-fs 4242
```
### How to Fuzz GET Parameters
For fuzzing GET parameter names:
```sh
ffuf \
-w ./burp-parameter-names.txt:'KEY' \
-u https://example.com/script.php?KEY=test_value \
-fs 4242
```
### More Resources
See [ffuf wiki](https://github.com/ffuf/ffuf/wiki):
<https://github.com/ffuf/ffuf/wiki>.

View File

@@ -1,61 +0,0 @@
#!/usr/bin/env pwsh
##################
# Install ffuf #
##################
# Every package should define these variables
$pkg_cmd_name = "ffuf"
$pkg_dst_cmd = "$Env:USERPROFILE\.local\bin\ffuf.exe"
$pkg_dst_bin = "$Env:USERPROFILE\.local\bin\"
$pkg_dst = "$pkg_dst_cmd"
$pkg_src_cmd = "$Env:USERPROFILE\.local\opt\ffuf-v$Env:WEBI_VERSION\bin\ffuf.exe"
$pkg_src_bin = "$Env:USERPROFILE\.local\opt\ffuf-v$Env:WEBI_VERSION\bin"
$pkg_src_dir = "$Env:USERPROFILE\.local\opt\ffuf-v$Env:WEBI_VERSION"
$pkg_src = "$pkg_src_cmd"
New-Item "$Env:USERPROFILE\Downloads\webi" -ItemType Directory -Force | Out-Null
$pkg_download = "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE"
# Fetch archive
IF (-Not (Test-Path -Path "$pkg_download")) {
Write-Output "Downloading ffuf from $Env:WEBI_PKG_URL to $pkg_download"
& curl.exe -A "$Env:WEBI_UA" -fsSL "$Env:WEBI_PKG_URL" -o "$pkg_download.part"
& Move-Item "$pkg_download.part" "$pkg_download"
}
IF (-Not (Test-Path -Path "$pkg_src_cmd")) {
Write-Output "Installing ffuf"
# TODO: create package-specific temp directory
# Enter tmp
Push-Location .local\tmp
# Remove any leftover tmp cruft
Remove-Item -Path ".\ffuf-v*" -Recurse -ErrorAction Ignore
Remove-Item -Path ".\ffuf.exe" -Recurse -ErrorAction Ignore
# NOTE: DELETE THIS COMMENT IF NOT USED
# Move single binary into root of temporary folder
#& move "$pkg_download" "ffuf.exe"
# Unpack archive file into this temporary directory
# Windows BSD-tar handles zip. Imagine that.
Write-Output "Unpacking $pkg_download"
& tar xf "$pkg_download"
# Settle unpacked archive into place
Write-Output "Install Location: $pkg_src_cmd"
New-Item "$pkg_src_bin" -ItemType Directory -Force | Out-Null
Move-Item -Path ".\ffuf.exe" -Destination "$pkg_src_bin"
# Exit tmp
Pop-Location
}
Write-Output "Copying into '$pkg_dst_cmd' from '$pkg_src_cmd'"
Remove-Item -Path "$pkg_dst_cmd" -Recurse -ErrorAction Ignore | Out-Null
New-Item "$pkg_dst_bin" -ItemType Directory -Force | Out-Null
Copy-Item -Path "$pkg_src" -Destination "$pkg_dst" -Recurse

View File

@@ -1,46 +0,0 @@
#!/bin/sh
# shellcheck disable=SC2034
# "'pkg_cmd_name' appears unused. Verify it or export it."
__init_ffuf() {
set -e
set -u
################
# Install ffuf #
################
# Every package should define these 6 variables
pkg_cmd_name="ffuf"
pkg_dst_cmd="$HOME/.local/bin/ffuf"
pkg_dst="$pkg_dst_cmd"
pkg_src_cmd="$HOME/.local/opt/ffuf-v$WEBI_VERSION/bin/ffuf"
pkg_src_dir="$HOME/.local/opt/ffuf-v$WEBI_VERSION"
pkg_src="$pkg_src_cmd"
# pkg_install must be defined by every package
pkg_install() {
# ~/.local/opt/ffuf-v2.1.0/bin
mkdir -p "$(dirname "${pkg_src_cmd}")"
# mv ./ffuf-*/ffuf ~/.local/opt/ffuf-v2.1.0/bin/ffuf
mv ./ffuf "$pkg_src_cmd"
}
# pkg_get_current_version is recommended, but not required
pkg_get_current_version() {
# 'ffuf -V' has output in this format:
# ffuf version: 2.1.0
# This trims it down to just the version number:
# 2.1.0
ffuf -V 2> /dev/null |
head -n 1 |
cut -d' ' -f3
}
}
__init_ffuf

View File

@@ -1,20 +0,0 @@
'use strict';
var github = require('../_common/github.js');
var owner = 'ffuf';
var repo = 'ffuf';
module.exports = function (request) {
return github(request, owner, repo).then(function (all) {
return all;
});
};
if (module === require.main) {
module.exports(require('@root/request')).then(function (all) {
all = require('../_webi/normalize.js')(all);
// just select the first 5 for demonstration
all.releases = all.releases.slice(0, 5);
console.info(JSON.stringify(all, null, 2));
});
}

View File

@@ -8,17 +8,6 @@ tagline: |
To update or switch versions, run `webi flutter@stable` (or `@v2.2`, `@beta`, To update or switch versions, run `webi flutter@stable` (or `@v2.2`, `@beta`,
etc). etc).
### Files
These are the files / directories that are created and/or modified with this
install:
```text
~/.config/envman/PATH.env
~/.local/opt/flutter
<PROJECT-DIR>/pubspec.yaml
```
## Cheat Sheet ## Cheat Sheet
> Flutter is Googles UI toolkit for building beautiful, natively compiled > Flutter is Googles UI toolkit for building beautiful, natively compiled

View File

@@ -7,13 +7,6 @@ tagline: |
To update or switch versions, run `webi fzf@stable` (or `@v0.23`, `@beta`, etc). To update or switch versions, run `webi fzf@stable` (or `@v0.23`, `@beta`, etc).
### Files
```text
~/.config/envman/PATH.env
~/.local/bin/fzf
```
## Cheat Sheet ## Cheat Sheet
![](https://raw.githubusercontent.com/junegunn/i/master/fzf-preview.png) ![](https://raw.githubusercontent.com/junegunn/i/master/fzf-preview.png)

View File

@@ -3,39 +3,41 @@
$VERNAME = "$Env:PKG_NAME-v$Env:WEBI_VERSION.exe" $VERNAME = "$Env:PKG_NAME-v$Env:WEBI_VERSION.exe"
$EXENAME = "$Env:PKG_NAME.exe" $EXENAME = "$Env:PKG_NAME.exe"
# Fetch archive # Fetch archive
IF (!(Test-Path -Path "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE")) { IF (!(Test-Path -Path "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE"))
Write-Output "Downloading $Env:PKG_NAME from $Env:WEBI_PKG_URL to $Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE" {
echo "Downloading $Env:PKG_NAME from $Env:WEBI_PKG_URL to $Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE"
& curl.exe -A "$Env:WEBI_UA" -fsSL "$Env:WEBI_PKG_URL" -o "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE.part" & curl.exe -A "$Env:WEBI_UA" -fsSL "$Env:WEBI_PKG_URL" -o "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE.part"
& Move-Item "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE.part" "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE" & move "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE.part" "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE"
} }
IF (!(Test-Path -Path "$Env:USERPROFILE\.local\xbin\$VERNAME")) { IF (!(Test-Path -Path "$Env:USERPROFILE\.local\xbin\$VERNAME"))
Write-Output "Installing $Env:PKG_NAME" {
echo "Installing $Env:PKG_NAME"
# TODO: temp directory # TODO: temp directory
# Enter tmp # Enter tmp
Push-Location .local\tmp pushd .local\tmp
# Remove any leftover tmp cruft # Remove any leftover tmp cruft
Remove-Item -Path "$Env:PKG_NAME-v*" -Recurse -ErrorAction Ignore Remove-Item -Path "$Env:PKG_NAME-v*" -Recurse -ErrorAction Ignore
# Unpack archive # Unpack archive
# Windows BSD-tar handles zip. Imagine that. # Windows BSD-tar handles zip. Imagine that.
Write-Output "Unpacking $Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE" echo "Unpacking $Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE"
& tar xf "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE" & tar xf "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE"
# Move single binary into root of temporary folder # Move single binary into root of temporary folder
& Move-Item "$EXENAME" "$VERNAME" & move "$EXENAME" "$VERNAME"
# Settle unpacked archive into place # Settle unpacked archive into place
Write-Output "New Name: $VERNAME" echo "New Name: $VERNAME"
Write-Output "New Location: $Env:USERPROFILE\.local\xbin\$VERNAME" echo "New Location: $Env:USERPROFILE\.local\xbin\$VERNAME"
Move-Item -Path "$VERNAME" -Destination "$Env:USERPROFILE\.local\xbin" Move-Item -Path "$VERNAME" -Destination "$Env:USERPROFILE\.local\xbin"
# Exit tmp # Exit tmp
Pop-Location popd
} }
Write-Output "Copying into '$Env:USERPROFILE\.local\bin\$EXENAME' from '$Env:USERPROFILE\.local\xbin\$VERNAME'" echo "Copying into '$Env:USERPROFILE\.local\bin\$EXENAME' from '$Env:USERPROFILE\.local\xbin\$VERNAME'"
Remove-Item -Path "$Env:USERPROFILE\.local\bin\$EXENAME" -Recurse -ErrorAction Ignore Remove-Item -Path "$Env:USERPROFILE\.local\bin\$EXENAME" -Recurse -ErrorAction Ignore
Copy-Item -Path "$Env:USERPROFILE\.local\xbin\$VERNAME" -Destination "$Env:USERPROFILE\.local\bin\$EXENAME" -Recurse Copy-Item -Path "$Env:USERPROFILE\.local\xbin\$VERNAME" -Destination "$Env:USERPROFILE\.local\bin\$EXENAME" -Recurse

View File

@@ -15,45 +15,47 @@ $pkg_src_bin = "$Env:USERPROFILE\.local\opt\gh-v$Env:WEBI_VERSION\bin"
$pkg_src_dir = "$Env:USERPROFILE\.local\opt\gh-v$Env:WEBI_VERSION" $pkg_src_dir = "$Env:USERPROFILE\.local\opt\gh-v$Env:WEBI_VERSION"
$pkg_src = "$pkg_src_cmd" $pkg_src = "$pkg_src_cmd"
New-Item "$Env:USERPROFILE\Downloads\webi" -ItemType Directory -Force | Out-Null New-Item "$Env:USERPROFILE\Downloads\webi" -ItemType Directory -Force | out-null
$pkg_download = "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE" $pkg_download = "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE"
# Fetch archive # Fetch archive
IF (!(Test-Path -Path "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE")) { IF (!(Test-Path -Path "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE"))
Write-Output "Downloading gh from $Env:WEBI_PKG_URL to $pkg_download" {
echo "Downloading gh from $Env:WEBI_PKG_URL to $pkg_download"
& curl.exe -A "$Env:WEBI_UA" -fsSL "$Env:WEBI_PKG_URL" -o "$pkg_download.part" & curl.exe -A "$Env:WEBI_UA" -fsSL "$Env:WEBI_PKG_URL" -o "$pkg_download.part"
& Move-Item "$pkg_download.part" "$pkg_download" & move "$pkg_download.part" "$pkg_download"
} }
IF (!(Test-Path -Path "$pkg_src_cmd")) { IF (!(Test-Path -Path "$pkg_src_cmd"))
Write-Output "Installing gh" {
echo "Installing gh"
# TODO: create package-specific temp directory # TODO: create package-specific temp directory
# Enter tmp # Enter tmp
Push-Location .local\tmp pushd .local\tmp
# Remove any leftover tmp cruft # Remove any leftover tmp cruft
Remove-Item -Path ".\gh-v*" -Recurse -ErrorAction Ignore Remove-Item -Path ".\gh-v*" -Recurse -ErrorAction Ignore
Remove-Item -Path ".\gh.exe" -Recurse -ErrorAction Ignore Remove-Item -Path ".\gh.exe" -Recurse -ErrorAction Ignore
# NOTE: DELETE THIS COMMENT IF NOT USED # NOTE: DELETE THIS COMMENT IF NOT USED
# Move single binary into root of temporary folder # Move single binary into root of temporary folder
#& move "$pkg_download" "gh.exe" #& move "$pkg_download" "gh.exe"
# Unpack archive file into this temporary directory # Unpack archive file into this temporary directory
# Windows BSD-tar handles zip. Imagine that. # Windows BSD-tar handles zip. Imagine that.
Write-Output "Unpacking $pkg_download" echo "Unpacking $pkg_download"
& tar xf "$pkg_download" & tar xf "$pkg_download"
# Settle unpacked archive into place # Settle unpacked archive into place
Write-Output "Install Location: $pkg_src_cmd" echo "Install Location: $pkg_src_cmd"
New-Item "$pkg_src_bin" -ItemType Directory -Force | Out-Null New-Item "$pkg_src_bin" -ItemType Directory -Force | out-null
Move-Item -Path ".\bin\gh.exe" -Destination "$pkg_src_bin" Move-Item -Path ".\bin\gh.exe" -Destination "$pkg_src_bin"
# Exit tmp # Exit tmp
Pop-Location popd
} }
Write-Output "Copying into '$pkg_dst_cmd' from '$pkg_src_cmd'" echo "Copying into '$pkg_dst_cmd' from '$pkg_src_cmd'"
Remove-Item -Path "$pkg_dst_cmd" -Recurse -ErrorAction Ignore | Out-Null Remove-Item -Path "$pkg_dst_cmd" -Recurse -ErrorAction Ignore | out-null
Copy-Item -Path "$pkg_src" -Destination "$pkg_dst" -Recurse Copy-Item -Path "$pkg_src" -Destination "$pkg_dst" -Recurse

View File

@@ -1,5 +1,5 @@
#!/bin/pwsh #!/bin/pwsh
Write-Output "'git-gpg-init@$Env:WEBI_TAG' is an alias for 'git-config-gpg@$Env:WEBI_VERSION'" echo "'git-gpg-init@$Env:WEBI_TAG' is an alias for 'git-config-gpg@$Env:WEBI_VERSION'"
IF ($null -eq $Env:WEBI_HOST -or $Env:WEBI_HOST -eq "") { $Env:WEBI_HOST = "https://webinstall.dev" } IF ($Env:WEBI_HOST -eq $null -or $Env:WEBI_HOST -eq "") { $Env:WEBI_HOST = "https://webinstall.dev" }
curl.exe -fsSL "$Env:WEBI_HOST/git-config-gpg@$Env:WEBI_VERSION" | powershell curl.exe -fsSL "$Env:WEBI_HOST/git-config-gpg@$Env:WEBI_VERSION" | powershell

View File

@@ -1,7 +1,7 @@
#!/usr/bin/env pwsh #!/usr/bin/env pwsh
$pkg_cmd_name = "git" $pkg_cmd_name = "git"
New-Item "$Env:USERPROFILE\Downloads\webi" -ItemType Directory -Force | Out-Null New-Item "$Env:USERPROFILE\Downloads\webi" -ItemType Directory -Force | out-null
$pkg_download = "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE" $pkg_download = "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE"
$pkg_src = "$Env:USERPROFILE\.local\opt\$pkg_cmd_name-v$Env:WEBI_VERSION" $pkg_src = "$Env:USERPROFILE\.local\opt\$pkg_cmd_name-v$Env:WEBI_VERSION"
@@ -11,44 +11,48 @@ $pkg_dst_cmd = "$pkg_dst\cmd\$pkg_cmd_name"
$pkg_dst_bin = "$pkg_dst\cmd" $pkg_dst_bin = "$pkg_dst\cmd"
# Fetch archive # Fetch archive
IF (!(Test-Path -Path "$pkg_download")) { IF (!(Test-Path -Path "$pkg_download"))
Write-Output "Downloading $Env:PKG_NAME from $Env:WEBI_PKG_URL to $pkg_download" {
echo "Downloading $Env:PKG_NAME from $Env:WEBI_PKG_URL to $pkg_download"
& curl.exe -A "$Env:WEBI_UA" -fsSL "$Env:WEBI_PKG_URL" -o "$pkg_download.part" & curl.exe -A "$Env:WEBI_UA" -fsSL "$Env:WEBI_PKG_URL" -o "$pkg_download.part"
& Move-Item "$pkg_download.part" "$pkg_download" & move "$pkg_download.part" "$pkg_download"
} }
IF (!(Test-Path -Path "$pkg_src")) { IF (!(Test-Path -Path "$pkg_src"))
Write-Output "Installing $pkg_cmd_name" {
echo "Installing $pkg_cmd_name"
# TODO: temp directory # TODO: temp directory
# Enter opt # Enter opt
($none = Push-Location .local\tmp) | Out-Null ($none = pushd .local\tmp) | out-null
# Remove any leftover tmp cruft # Remove any leftover tmp cruft
Remove-Item -Path "$pkg_cmd_name*" -Recurse -ErrorAction Ignore Remove-Item -Path "$pkg_cmd_name*" -Recurse -ErrorAction Ignore
# Unpack archive # Unpack archive
# Windows BSD-tar handles zip. Imagine that. # Windows BSD-tar handles zip. Imagine that.
Write-Output "Unpacking $pkg_download" echo "Unpacking $pkg_download"
IF (!(Test-Path -Path "$pkg_cmd_name-v$Env:WEBI_VERSION")) { IF (!(Test-Path -Path "$pkg_cmd_name-v$Env:WEBI_VERSION")) {
New-Item -Path "$pkg_cmd_name-v$Env:WEBI_VERSION" -ItemType Directory -Force | Out-Null New-Item -Path "$pkg_cmd_name-v$Env:WEBI_VERSION" -ItemType Directory -Force | out-null
} }
($none = Push-Location "$pkg_cmd_name-v$Env:WEBI_VERSION") | Out-Null ($none = pushd "$pkg_cmd_name-v$Env:WEBI_VERSION") | out-null
& tar xf "$pkg_download" & tar xf "$pkg_download"
($none = Pop-Location) | Out-Null ($none = popd) | out-null
# Settle unpacked archive into place # Settle unpacked archive into place
Write-Output "New Name: $pkg_cmd_name-v$Env:WEBI_VERSION" echo "New Name: $pkg_cmd_name-v$Env:WEBI_VERSION"
Write-Output "New Location: $pkg_src" echo "New Location: $pkg_src"
Move-Item -Path "$pkg_cmd_name-v$Env:WEBI_VERSION" -Destination "$Env:USERPROFILE\.local\opt" Move-Item -Path "$pkg_cmd_name-v$Env:WEBI_VERSION" -Destination "$Env:USERPROFILE\.local\opt"
# Exit tmp # Exit tmp
$none = Pop-Location $none = popd
} }
Write-Output "Copying into '$pkg_dst' from '$pkg_src'" echo "Copying into '$pkg_dst' from '$pkg_src'"
Remove-Item -Path "$pkg_dst" -Recurse -ErrorAction Ignore Remove-Item -Path "$pkg_dst" -Recurse -ErrorAction Ignore
Copy-Item -Path "$pkg_src" -Destination "$pkg_dst" -Recurse Copy-Item -Path "$pkg_src" -Destination "$pkg_dst" -Recurse
# Add to path # Add to path
webi_path_add ~/.local/opt/git/cmd & "$Env:USERPROFILE\.local\bin\pathman.exe" add ~/.local/opt/git/cmd
#& "$Env:USERPROFILE\.local\bin\pathman.exe" add "$Env:USERPROFILE\.local\opt\git\cmd"
#& "$Env:USERPROFILE\.local\bin\pathman.exe" add %USERPROFILE%\.local\opt\git\cmd

View File

@@ -15,41 +15,43 @@ $pkg_src_bin = "$Env:USERPROFILE\.local\opt\gitdeploy-v$Env:WEBI_VERSION\bin"
$pkg_src_dir = "$Env:USERPROFILE\.local\opt\gitdeploy-v$Env:WEBI_VERSION" $pkg_src_dir = "$Env:USERPROFILE\.local\opt\gitdeploy-v$Env:WEBI_VERSION"
$pkg_src = "$pkg_src_cmd" $pkg_src = "$pkg_src_cmd"
New-Item "$Env:USERPROFILE\Downloads\webi" -ItemType Directory -Force | Out-Null New-Item "$Env:USERPROFILE\Downloads\webi" -ItemType Directory -Force | out-null
$pkg_download = "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE" $pkg_download = "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE"
# Fetch archive # Fetch archive
IF (!(Test-Path -Path "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE")) { IF (!(Test-Path -Path "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE"))
Write-Output "Downloading gitdeploy from $Env:WEBI_PKG_URL to $pkg_download" {
echo "Downloading gitdeploy from $Env:WEBI_PKG_URL to $pkg_download"
& curl.exe -A "$Env:WEBI_UA" -fsSL "$Env:WEBI_PKG_URL" -o "$pkg_download.part" & curl.exe -A "$Env:WEBI_UA" -fsSL "$Env:WEBI_PKG_URL" -o "$pkg_download.part"
& Move-Item "$pkg_download.part" "$pkg_download" & move "$pkg_download.part" "$pkg_download"
} }
IF (!(Test-Path -Path "$pkg_src_cmd")) { IF (!(Test-Path -Path "$pkg_src_cmd"))
Write-Output "Installing gitdeploy" {
echo "Installing gitdeploy"
# TODO: create package-specific temp directory # TODO: create package-specific temp directory
# Enter tmp # Enter tmp
Push-Location .local\tmp pushd .local\tmp
# Remove any leftover tmp cruft # Remove any leftover tmp cruft
Remove-Item -Path ".\gitdeploy-v*" -Recurse -ErrorAction Ignore Remove-Item -Path ".\gitdeploy-v*" -Recurse -ErrorAction Ignore
Remove-Item -Path ".\gitdeploy.exe" -Recurse -ErrorAction Ignore Remove-Item -Path ".\gitdeploy.exe" -Recurse -ErrorAction Ignore
# Unpack archive file into this temporary directory # Unpack archive file into this temporary directory
# Windows BSD-tar handles zip. Imagine that. # Windows BSD-tar handles zip. Imagine that.
Write-Output "Unpacking $pkg_download" echo "Unpacking $pkg_download"
& tar xf "$pkg_download" & tar xf "$pkg_download"
# Settle unpacked archive into place # Settle unpacked archive into place
Write-Output "Install Location: $pkg_src_cmd" echo "Install Location: $pkg_src_cmd"
New-Item "$pkg_src_bin" -ItemType Directory -Force | Out-Null New-Item "$pkg_src_bin" -ItemType Directory -Force | out-null
Move-Item -Path ".\gitdeploy.exe" -Destination "$pkg_src_bin" Move-Item -Path ".\gitdeploy.exe" -Destination "$pkg_src_bin"
# Exit tmp # Exit tmp
Pop-Location popd
} }
Write-Output "Copying into '$pkg_dst_cmd' from '$pkg_src_cmd'" echo "Copying into '$pkg_dst_cmd' from '$pkg_src_cmd'"
Remove-Item -Path "$pkg_dst_cmd" -Recurse -ErrorAction Ignore | Out-Null Remove-Item -Path "$pkg_dst_cmd" -Recurse -ErrorAction Ignore | out-null
Copy-Item -Path "$pkg_src" -Destination "$pkg_dst" -Recurse Copy-Item -Path "$pkg_src" -Destination "$pkg_dst" -Recurse

View File

@@ -15,39 +15,41 @@ $pkg_src_bin = "$Env:USERPROFILE\.local\opt\gitea-v$Env:WEBI_VERSION\bin"
$pkg_src_dir = "$Env:USERPROFILE\.local\opt\gitea-v$Env:WEBI_VERSION" $pkg_src_dir = "$Env:USERPROFILE\.local\opt\gitea-v$Env:WEBI_VERSION"
$pkg_src = "$pkg_src_cmd" $pkg_src = "$pkg_src_cmd"
New-Item "$Env:USERPROFILE\Downloads\webi" -ItemType Directory -Force | Out-Null New-Item "$Env:USERPROFILE\Downloads\webi" -ItemType Directory -Force | out-null
$pkg_download = "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE" $pkg_download = "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE"
# Fetch archive # Fetch archive
IF (!(Test-Path -Path "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE")) { IF (!(Test-Path -Path "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE"))
Write-Output "Downloading gitea from $Env:WEBI_PKG_URL to $pkg_download" {
echo "Downloading gitea from $Env:WEBI_PKG_URL to $pkg_download"
& curl.exe -A "$Env:WEBI_UA" -fsSL "$Env:WEBI_PKG_URL" -o "$pkg_download.part" & curl.exe -A "$Env:WEBI_UA" -fsSL "$Env:WEBI_PKG_URL" -o "$pkg_download.part"
& Move-Item "$pkg_download.part" "$pkg_download" & move "$pkg_download.part" "$pkg_download"
} }
IF (!(Test-Path -Path "$pkg_src_cmd")) { IF (!(Test-Path -Path "$pkg_src_cmd"))
Write-Output "Installing gitea" {
echo "Installing gitea"
# TODO: create package-specific temp directory # TODO: create package-specific temp directory
# Enter tmp # Enter tmp
Push-Location .local\tmp pushd .local\tmp
# Remove any leftover tmp cruft # Remove any leftover tmp cruft
Remove-Item -Path ".\gitea-*" -Recurse -ErrorAction Ignore Remove-Item -Path ".\gitea-*" -Recurse -ErrorAction Ignore
Remove-Item -Path ".\gitea.exe" -Recurse -ErrorAction Ignore Remove-Item -Path ".\gitea.exe" -Recurse -ErrorAction Ignore
# Move single binary into root of temporary folder # Move single binary into root of temporary folder
& Move-Item "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE" "gitea.exe" & move "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE" "gitea.exe"
# Settle unpacked archive into place # Settle unpacked archive into place
Write-Output "Install Location: $pkg_src_cmd" echo "Install Location: $pkg_src_cmd"
New-Item "$pkg_src_bin" -ItemType Directory -Force | Out-Null New-Item "$pkg_src_bin" -ItemType Directory -Force | out-null
Move-Item -Path "gitea.exe" -Destination "$pkg_src_bin" Move-Item -Path "gitea.exe" -Destination "$pkg_src_bin"
# Exit tmp # Exit tmp
Pop-Location popd
} }
Write-Output "Copying into '$pkg_dst_cmd' from '$pkg_src_cmd'" echo "Copying into '$pkg_dst_cmd' from '$pkg_src_cmd'"
Remove-Item -Path "$pkg_dst_cmd" -Recurse -ErrorAction Ignore | Out-Null Remove-Item -Path "$pkg_dst_cmd" -Recurse -ErrorAction Ignore | out-null
Copy-Item -Path "$pkg_src" -Destination "$pkg_dst" -Recurse Copy-Item -Path "$pkg_src" -Destination "$pkg_dst" -Recurse

View File

@@ -1,65 +1,5 @@
#!/usr/bin/env pwsh #!/bin/pwsh
if (!(Get-Command "go.exe" -ErrorAction SilentlyContinue)) { echo "'go@$Env:WEBI_TAG' is an alias for 'golang@$Env:WEBI_VERSION'"
& "$Env:USERPROFILE\.local\bin\webi-pwsh.ps1" go IF ($Env:WEBI_HOST -eq $null -or $Env:WEBI_HOST -eq "") { $Env:WEBI_HOST = "https://webinstall.dev" }
# because we need git.exe to be available to golang immediately curl.exe -fsSL "$Env:WEBI_HOST/golang@$Env:WEBI_VERSION" | powershell
$Env:PATH = "$Env:USERPROFILE\go\bin;$Env:USERPROFILE\.local\opt\go\bin;$Env:PATH"
}
# Special to go: re-run all go tooling builds
Write-Output "Building go language tools..."
Write-Output ""
Write-Output godoc
& go install golang.org/x/tools/cmd/godoc@latest
Write-Output ""
Write-Output gopls
& go install golang.org/x/tools/gopls@latest
Write-Output ""
Write-Output guru
& go install golang.org/x/tools/guru@latest
Write-Output ""
Write-Output golint
& go install golang.org/x/lint/golint@latest
#echo ""
#echo errcheck
#& go install github.com/kisielk/errcheck
#echo ""
#echo gotags
#& go install github.com/jstemmer/gotags
Write-Output ""
Write-Output goimports
& go install golang.org/x/tools/cmd/goimports@latest
Write-Output ""
Write-Output gomvpkg
& go install golang.org/x/tools/cmd/gomvpkg@latest
Write-Output ""
Write-Output gorename
& go install golang.org/x/tools/cmd/gorename
Write-Output ""
Write-Output gotype
& go install golang.org/x/tools/cmd/gotype
Write-Output ""
Write-Output stringer
& go install golang.org/x/tools/cmd/stringer
Write-Output ""
# literal %USERPROFILE% on purpose
Write-Output 'Installed go "x" tools to GOBIN=%USERPROFILE%/go/bin'
Write-Output ""
Write-Output "Suggestion: Also check out these great productivity multipliers:"
Write-Output ""
Write-Output " - vim-essentials (sensible defaults for vim)"
Write-Output " - vim-go (golang linting, etc)"
Write-Output ""

View File

@@ -3,8 +3,10 @@ set -e
set -u set -u
__run_go_essentials() { __run_go_essentials() {
if ! command -v go 2> /dev/null; then WEBI__GO_ESSENTIALS='true'
"$HOME/.local/bin/webi" "go@${WEBI_TAG}" export WEBI__GO_ESSENTIALS
if [ -z "${WEBI__GO_INSTALL-}" ]; then
"$HOME/.local/bin/webi" "golang@${WEBI_TAG}"
fi fi
export PATH="$HOME/.local/opt/go/bin:$PATH" export PATH="$HOME/.local/opt/go/bin:$PATH"
@@ -73,9 +75,6 @@ __run_go_essentials() {
go "${my_install}" golang.org/x/tools/cmd/stringer@latest > /dev/null #2>/dev/null go "${my_install}" golang.org/x/tools/cmd/stringer@latest > /dev/null #2>/dev/null
echo "" echo ""
# literal $HOME on purpose
# shellcheck disable=SC2016
echo 'Installed go "x" tools to GOBIN=$HOME/go/bin'
printf '\n' printf '\n'
printf 'Suggestion: Also check out these great productivity multipliers:\n' printf 'Suggestion: Also check out these great productivity multipliers:\n'

View File

@@ -1,89 +1,11 @@
--- ---
title: Go title: Go (golang alias)
homepage: https://golang.org homepage: https://webinstall.dev/golang
tagline: | tagline: |
Go makes it easy to build simple, reliable, and efficient software. Alias for https://webinstall.dev/golang
alias: golang
description: |
See https://webinstall.dev/golang
--- ---
To update or switch versions, run `webi go@stable` (or `@v1.21`, `@beta`, etc). Alias for https://webinstall.dev/golang
### Files
```text
~/.config/envman/PATH.env
~/.local/opt/go/
~/go/
```
## Cheat Sheet
> Go is designed, through and through, to make Software Engineering easy. It's
> fast, efficient, reliable, and something you can learn in a weekend.
>
> If you subscribe to
> [_The Zen of Python_](https://www.python.org/dev/peps/pep-0020/), you'll
> [love](https://go-proverbs.github.io/) >
> [Go](https://www.youtube.com/watch?v=PAAkCSZUG1c).
You may also want to install the Go IDE tooling:
[go-essentials](/go-essentials).
### Hello World
1. Make and enter your project directory
```sh
mkdir -p ./hello/cmd/hello
pushd ./hello/
```
2. Initialize your `go.mod` to your _git repository_ url:
```sh
go mod init github.com/example/hello
```
3. Create a `hello.go`
```sh
cat << EOF >> ./cmd/hello/hello.go
package main
import (
"fmt"
)
func main () {
fmt.Println("Hello, World!")
}
EOF
```
4. Format, build, and run your `./hello`
```sh
go fmt ./...
go build -o hello ./cmd/hello/
./hello
```
You should see your output:
```text
> Hello, World!
```
### How to run a Go program as a service
On Linux:
```sh
# Install serviceman (compatible with systemd)
webi serviceman
```
```sh
# go into your programs 'opt' directory
pushd ./hello/
# swap 'hello' and './hello' for the name of your project and binary
sudo env PATH="$PATH" \
serviceman add --system --username "$(whoami)" --name hello -- \
./hello
# Restart the logging service
sudo systemctl restart systemd-journald
```

Some files were not shown because too many files have changed in this diff Show More