mirror of
https://github.com/cupcakearmy/autorestic.git
synced 2025-01-03 05:46:24 +00:00
fix check for executable
This commit is contained in:
parent
7128983581
commit
3498e6da7b
71
src/utils.ts
71
src/utils.ts
@ -9,8 +9,6 @@ import { Duration, Humanizer } from 'uhrwerk'
|
||||
import { CONFIG_FILE, LocationFromPrefixes } from './config'
|
||||
import { Location } from './types'
|
||||
|
||||
|
||||
|
||||
export const exec = (command: string, args: string[], { env, ...rest }: SpawnSyncOptions = {}) => {
|
||||
const { stdout, stderr, status } = spawnSync(command, args, {
|
||||
...rest,
|
||||
@ -37,39 +35,30 @@ export const checkIfResticIsAvailable = () =>
|
||||
checkIfCommandIsAvailable(
|
||||
'restic',
|
||||
'restic is not installed'.red +
|
||||
'\nEither run ' + 'autorestic install'.green +
|
||||
'\nOr go to https://restic.readthedocs.io/en/latest/020_installation.html#stable-releases',
|
||||
'\nEither run ' +
|
||||
'autorestic install'.green +
|
||||
'\nOr go to https://restic.readthedocs.io/en/latest/020_installation.html#stable-releases'
|
||||
)
|
||||
|
||||
export const checkIfCommandIsAvailable = (cmd: string, errorMsg?: string) => {
|
||||
if (spawnSync(cmd, { shell: true }).error)
|
||||
throw new Error(errorMsg ? errorMsg : `"${cmd}" is not installed`.red)
|
||||
const error = spawnSync(cmd, { shell: true }).stderr
|
||||
if (error.length) throw new Error(errorMsg ? errorMsg : `"${cmd}" is not installed`.red)
|
||||
}
|
||||
|
||||
export const makeObjectKeysLowercase = (object: Object): any =>
|
||||
Object.fromEntries(
|
||||
Object.entries(object).map(([key, value]) => [key.toLowerCase(), value]),
|
||||
)
|
||||
|
||||
Object.fromEntries(Object.entries(object).map(([key, value]) => [key.toLowerCase(), value]))
|
||||
|
||||
export function rand(length = 32): string {
|
||||
return randomBytes(length / 2).toString('hex')
|
||||
}
|
||||
|
||||
|
||||
export const filterObject = <T>(
|
||||
obj: { [key: string]: T },
|
||||
filter: (item: [string, T]) => boolean,
|
||||
): { [key: string]: T } =>
|
||||
export const filterObject = <T>(obj: { [key: string]: T }, filter: (item: [string, T]) => boolean): { [key: string]: T } =>
|
||||
Object.fromEntries(Object.entries(obj).filter(filter))
|
||||
|
||||
export const filterObjectByKey = <T>(
|
||||
obj: { [key: string]: T },
|
||||
keys: string[],
|
||||
) => filterObject(obj, ([key]) => keys.includes(key))
|
||||
export const filterObjectByKey = <T>(obj: { [key: string]: T }, keys: string[]) => filterObject(obj, ([key]) => keys.includes(key))
|
||||
|
||||
export const downloadFile = async (url: string, to: string) =>
|
||||
new Promise<void>(async res => {
|
||||
new Promise<void>(async (res) => {
|
||||
const { data: file } = await axios({
|
||||
method: 'get',
|
||||
url: url,
|
||||
@ -86,22 +75,16 @@ export const downloadFile = async (url: string, to: string) =>
|
||||
// Delete file if already exists. Needed if the binary wants to replace itself.
|
||||
// Unix does not allow to overwrite a file that is being executed, but you can remove it and save other one at its place
|
||||
unlinkSync(to)
|
||||
} catch {
|
||||
}
|
||||
} catch {}
|
||||
renameSync(tmp, to)
|
||||
res()
|
||||
})
|
||||
})
|
||||
|
||||
// Check if is an absolute path, otherwise get the path relative to the config file
|
||||
export const pathRelativeToConfigFile = (path: string): string => isAbsolute(path)
|
||||
? path
|
||||
: resolve(dirname(CONFIG_FILE), path)
|
||||
export const pathRelativeToConfigFile = (path: string): string => (isAbsolute(path) ? path : resolve(dirname(CONFIG_FILE), path))
|
||||
|
||||
export const resolveTildePath = (path: string): string | null =>
|
||||
(path.length === 0 || path[0] !== '~')
|
||||
? null
|
||||
: join(homedir(), path.slice(1))
|
||||
export const resolveTildePath = (path: string): string | null => (path.length === 0 || path[0] !== '~' ? null : join(homedir(), path.slice(1)))
|
||||
|
||||
export const getFlagsFromLocation = (location: Location, command?: string): string[] => {
|
||||
if (!location.options) return []
|
||||
@ -123,7 +106,7 @@ export const getFlagsFromLocation = (location: Location, command?: string): stri
|
||||
return flags
|
||||
}
|
||||
|
||||
export const makeArrayIfIsNot = <T>(maybeArray: T | T[]): T[] => Array.isArray(maybeArray) ? maybeArray : [maybeArray]
|
||||
export const makeArrayIfIsNot = <T>(maybeArray: T | T[]): T[] => (Array.isArray(maybeArray) ? maybeArray : [maybeArray])
|
||||
|
||||
export const fill = (length: number, filler = ' '): string => new Array(length).fill(filler).join('')
|
||||
|
||||
@ -132,41 +115,34 @@ export const capitalize = (string: string): string => string.charAt(0).toUpperCa
|
||||
export const treeToString = (obj: Object, highlight = [] as string[]): string => {
|
||||
let cleaned = JSON.stringify(obj, null, 2)
|
||||
.replace(/[{}"\[\],]/g, '')
|
||||
.replace(/^ {2}/mg, '')
|
||||
.replace(/^ {2}/gm, '')
|
||||
.replace(/\n\s*\n/g, '\n')
|
||||
.trim()
|
||||
|
||||
for (const word of highlight)
|
||||
cleaned = cleaned.replace(word, capitalize(word).green)
|
||||
for (const word of highlight) cleaned = cleaned.replace(word, capitalize(word).green)
|
||||
|
||||
return cleaned
|
||||
}
|
||||
|
||||
|
||||
export class MeasureDuration {
|
||||
private static Humanizer: Humanizer = [
|
||||
[d => d.hours() > 0, d => `${d.hours()}h ${d.minutes()}min`],
|
||||
[d => d.minutes() > 0, d => `${d.minutes()}min ${d.seconds()}s`],
|
||||
[d => d.seconds() > 0, d => `${d.seconds()}s`],
|
||||
[() => true, d => `${d.milliseconds()}ms`],
|
||||
[(d) => d.hours() > 0, (d) => `${d.hours()}h ${d.minutes()}min`],
|
||||
[(d) => d.minutes() > 0, (d) => `${d.minutes()}min ${d.seconds()}s`],
|
||||
[(d) => d.seconds() > 0, (d) => `${d.seconds()}s`],
|
||||
[() => true, (d) => `${d.milliseconds()}ms`],
|
||||
]
|
||||
|
||||
private start = Date.now()
|
||||
|
||||
|
||||
finished(human?: false): number
|
||||
finished(human?: true): string
|
||||
finished(human?: boolean): number | string {
|
||||
const delta = Date.now() - this.start
|
||||
|
||||
return human
|
||||
? new Duration(delta, 'ms').humanize(MeasureDuration.Humanizer)
|
||||
: delta
|
||||
return human ? new Duration(delta, 'ms').humanize(MeasureDuration.Humanizer) : delta
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
export const decodeLocationFromPrefix = (from: string): [LocationFromPrefixes, string] => {
|
||||
const firstDelimiter = from.indexOf(':')
|
||||
if (firstDelimiter === -1) return [LocationFromPrefixes.Filesystem, from]
|
||||
@ -189,9 +165,6 @@ export const hash = (plain: string): string => createHash('sha1').update(plain).
|
||||
export const getPathFromVolume = (volume: string) => pathRelativeToConfigFile(hash(volume))
|
||||
|
||||
export const checkIfDockerVolumeExistsOrFail = (volume: string) => {
|
||||
const cmd = exec('docker', [
|
||||
'volume', 'inspect', volume,
|
||||
])
|
||||
if (cmd.err.length > 0)
|
||||
throw new Error('Volume not found')
|
||||
const cmd = exec('docker', ['volume', 'inspect', volume])
|
||||
if (cmd.err.length > 0) throw new Error('Volume not found')
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user