mirror of
https://github.com/ivabus/pantry
synced 2025-06-08 08:20:32 +03:00
read args from stdin or argv
This commit is contained in:
parent
43b8edbc0f
commit
2541306eff
6 changed files with 73 additions and 20 deletions
|
@ -18,10 +18,11 @@ args:
|
||||||
|
|
||||||
import { Installation } from "types"
|
import { Installation } from "types"
|
||||||
import { useCellar, usePrefix, useFlags, useCache } from "hooks"
|
import { useCellar, usePrefix, useFlags, useCache } from "hooks"
|
||||||
import { run, pkg as pkgutils } from "utils"
|
import { run } from "utils"
|
||||||
import { crypto } from "deno/crypto/mod.ts"
|
import { crypto } from "deno/crypto/mod.ts"
|
||||||
import { encode } from "deno/encoding/hex.ts"
|
import { encode } from "deno/encoding/hex.ts"
|
||||||
import { set_output } from "./utils/gha.ts"
|
import { set_output } from "./utils/gha.ts"
|
||||||
|
import * as ARGV from "./utils/args.ts"
|
||||||
import Path from "path"
|
import Path from "path"
|
||||||
|
|
||||||
const cellar = useCellar()
|
const cellar = useCellar()
|
||||||
|
@ -36,7 +37,7 @@ if (import.meta.main) {
|
||||||
const checksums: string[] = []
|
const checksums: string[] = []
|
||||||
const bottles: Path[] = []
|
const bottles: Path[] = []
|
||||||
|
|
||||||
for (const pkg of Deno.args.map(pkgutils.parse)) {
|
for await (const pkg of ARGV.pkgs()) {
|
||||||
console.log({ bottling: pkg })
|
console.log({ bottling: pkg })
|
||||||
|
|
||||||
const installation = await cellar.resolve(pkg)
|
const installation = await cellar.resolve(pkg)
|
||||||
|
|
|
@ -13,16 +13,17 @@ args:
|
||||||
---*/
|
---*/
|
||||||
|
|
||||||
import { usePantry } from "hooks"
|
import { usePantry } from "hooks"
|
||||||
import { Installation, Package } from "types"
|
import { Installation } from "types"
|
||||||
import { pkg as pkgutils } from "utils"
|
import { pkg as pkgutils } from "utils"
|
||||||
import { useFlags, usePrefix } from "hooks"
|
import { useFlags, usePrefix } from "hooks"
|
||||||
import { set_output } from "./utils/gha.ts"
|
import { set_output } from "./utils/gha.ts"
|
||||||
import build from "./build/build.ts"
|
import build from "./build/build.ts"
|
||||||
|
import * as ARGV from "./utils/args.ts"
|
||||||
|
|
||||||
useFlags()
|
useFlags()
|
||||||
|
|
||||||
const pantry = usePantry()
|
const pantry = usePantry()
|
||||||
const dry = Deno.args.map(pkgutils.parse)
|
const dry = await ARGV.toArray(ARGV.pkgs())
|
||||||
const gha = !!Deno.env.get("GITHUB_ACTIONS")
|
const gha = !!Deno.env.get("GITHUB_ACTIONS")
|
||||||
const group_it = gha && dry.length > 1
|
const group_it = gha && dry.length > 1
|
||||||
const rv: Installation[] = []
|
const rv: Installation[] = []
|
||||||
|
|
|
@ -9,8 +9,8 @@ args:
|
||||||
- --import-map={{ srcroot }}/import-map.json
|
- --import-map={{ srcroot }}/import-map.json
|
||||||
---*/
|
---*/
|
||||||
|
|
||||||
import { pkg as pkgutils } from "utils"
|
|
||||||
import { useCellar, useFlags } from "hooks"
|
import { useCellar, useFlags } from "hooks"
|
||||||
|
import * as ARGV from "./utils/args.ts"
|
||||||
|
|
||||||
useFlags()
|
useFlags()
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@ const cellar = useCellar()
|
||||||
const desired_filter = !!Deno.env.get("INVERT")
|
const desired_filter = !!Deno.env.get("INVERT")
|
||||||
|
|
||||||
const rv: string[] = []
|
const rv: string[] = []
|
||||||
for (const pkg of Deno.args.map(pkgutils.parse)) {
|
for await (const pkg of ARGV.pkgs()) {
|
||||||
const isInstalled = !!await cellar.has(pkg)
|
const isInstalled = !!await cellar.has(pkg)
|
||||||
if (isInstalled == desired_filter) {
|
if (isInstalled == desired_filter) {
|
||||||
rv.push(pkg.project)
|
rv.push(pkg.project)
|
||||||
|
|
|
@ -20,14 +20,12 @@ import { pkg } from "utils"
|
||||||
import { usePantry, useFlags } from "hooks"
|
import { usePantry, useFlags } from "hooks"
|
||||||
import { hydrate } from "prefab"
|
import { hydrate } from "prefab"
|
||||||
import { PackageRequirement } from "types"
|
import { PackageRequirement } from "types"
|
||||||
|
import * as ARGV from "./utils/args.ts"
|
||||||
|
|
||||||
const flags = useFlags()
|
const flags = useFlags()
|
||||||
const pantry = usePantry()
|
const pantry = usePantry()
|
||||||
|
|
||||||
const dry = Deno.args.map(project => {
|
const dry = await ARGV.toArray(ARGV.pkgs())
|
||||||
const match = project.match(/projects\/(.*)\/package.yml/)
|
|
||||||
return match ? match[1] : project
|
|
||||||
}).map(pkg.parse)
|
|
||||||
|
|
||||||
const wet = await hydrate(dry, async (pkg, dry) => {
|
const wet = await hydrate(dry, async (pkg, dry) => {
|
||||||
const deps = await pantry.getDeps(pkg)
|
const deps = await pantry.getDeps(pkg)
|
||||||
|
|
|
@ -13,24 +13,18 @@ args:
|
||||||
---*/
|
---*/
|
||||||
|
|
||||||
import { Installation, Package, PackageRequirement } from "types"
|
import { Installation, Package, PackageRequirement } from "types"
|
||||||
import { usePantry, useCellar, useFlags } from "hooks"
|
import { usePantry, useFlags } from "hooks"
|
||||||
import useShellEnv, { expand } from "hooks/useShellEnv.ts"
|
import useShellEnv, { expand } from "hooks/useShellEnv.ts"
|
||||||
import { run, undent, pkg as pkgutils } from "utils"
|
import { run, undent, pkg as pkgutils } from "utils"
|
||||||
import { resolve, install, hydrate, link } from "prefab"
|
import { resolve, install, hydrate, link } from "prefab"
|
||||||
import Path from "path"
|
import Path from "path"
|
||||||
|
import * as ARGV from "./utils/args.ts"
|
||||||
|
|
||||||
const { debug } = useFlags()
|
const { debug } = useFlags()
|
||||||
const cellar = useCellar()
|
|
||||||
const pantry = usePantry()
|
const pantry = usePantry()
|
||||||
|
|
||||||
for (const project of Deno.args) {
|
for await (const pkg of ARGV.installs()) {
|
||||||
const pkg = await (async () => {
|
|
||||||
const match = project.match(/projects\/(.+)\/package.yml/)
|
|
||||||
const parsable = match ? match[1] : project
|
|
||||||
const pkg = pkgutils.parse(parsable)
|
|
||||||
return await cellar.resolve(pkg)
|
|
||||||
})()
|
|
||||||
|
|
||||||
await test(pkg)
|
await test(pkg)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
59
scripts/utils/args.ts
Normal file
59
scripts/utils/args.ts
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
import { Installation, Package, PackageRequirement } from "types"
|
||||||
|
import { useCellar } from "hooks"
|
||||||
|
import { parse } from "utils/pkg.ts"
|
||||||
|
|
||||||
|
/// processes Deno.args unless STDIN is not a TTY and has input
|
||||||
|
export async function *args(): AsyncGenerator<string> {
|
||||||
|
if (Deno.isatty(Deno.stdin.rid)) {
|
||||||
|
for (const arg of Deno.args) {
|
||||||
|
yield arg
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
let yielded_something = false
|
||||||
|
const buf = new Uint8Array(10)
|
||||||
|
const decode = (() => { const d = new TextDecoder(); return d.decode.bind(d) })()
|
||||||
|
let n: number | null
|
||||||
|
let txt = ''
|
||||||
|
const rx = /\s*(.*?)\s+/
|
||||||
|
while ((n = await Deno.stdin.read(buf)) !== null) {
|
||||||
|
txt += decode(buf.subarray(0, n))
|
||||||
|
while (true) {
|
||||||
|
const match = txt.match(rx)
|
||||||
|
if (!match) break
|
||||||
|
yield match[1]
|
||||||
|
txt = txt.slice(match[0].length)
|
||||||
|
yielded_something = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (txt) {
|
||||||
|
yield txt
|
||||||
|
} else if (!yielded_something) {
|
||||||
|
for (const arg of Deno.args) {
|
||||||
|
yield arg
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function *pkgs(): AsyncGenerator<Package | PackageRequirement> {
|
||||||
|
for await (const arg of args()) {
|
||||||
|
const match = arg.match(/projects\/(.*)\/package.yml/)
|
||||||
|
const project = match ? match[1] : arg
|
||||||
|
yield parse(project)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function *installs(): AsyncGenerator<Installation> {
|
||||||
|
const cellar = useCellar()
|
||||||
|
for await (const pkg of pkgs()) {
|
||||||
|
yield await cellar.resolve(pkg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function toArray<T>(input: AsyncGenerator<T>) {
|
||||||
|
const rv: T[] = []
|
||||||
|
for await (const i of input) {
|
||||||
|
rv.push(i)
|
||||||
|
}
|
||||||
|
return rv
|
||||||
|
}
|
Loading…
Reference in a new issue