Compare commits

..

9 Commits

Author SHA1 Message Date
3ea2e0cd8f v3.3.3
=====================================================================

--- Bug Fixes ----------------------------

- load static config files in all scwrypts contexts; not just groups
2023-08-18 12:40:14 -06:00
e0cbf58b3c v3.3.2
=====================================================================

--- Bug Fixes ----------------------------

- when using color, display properly in fzf
2023-08-11 08:39:30 -06:00
09c214f939 v3.3.1
=====================================================================

--- Bug Fixes ----------------------------

- fixed a bug with creating environment files for new scwrypts groups
2023-07-20 15:19:44 -06:00
e2c6007a65 v3.3.0
=====================================================================

--- Changes ------------------------------

- system/config/symlink )
   now copies the existing config from the current system if
   the "source" config does not exist (init from local)

- allowed implementation of group-custom scwrypt listing function
   GET_AVAILABLE_SCWRYPTS__<group-name>

--- Bug Fixes ----------------------------

- fixed a bug where custom runstring operators were ignored
2023-07-20 15:11:07 -06:00
620d07f1a8 v3.2.1
=====================================================================

 --- Bug Fixes ----------------------------

 - fixed bug with initializing virtual environments
2023-06-27 18:30:29 -06:00
4baacd9c32 v3.2.0
=====================================================================

--- Changes ------------------------------

- split up environment files per scwrypts group

- updated i3/launch-or-show to provide some new options

--- Bug Fixes ----------------------------

- utils/io commands like 'STATUS' no longer throw errors '%' characters

- fixed ERROR_CHECK function calls to CHECK_ERRORS
2023-06-27 16:35:30 -06:00
6c546ebb6f v3.1.0
=====================================================================

--- Changes ------------------------------

- improved capability of py/discord/post-message to include username
  flag, and defaults for each value in env config
2023-06-24 07:40:31 -06:00
9783119a7d v3.0.2
=====================================================================

--- Bug fixes ----------------------------

- interactive scripts work again

- color works on zx again
2023-06-22 17:58:55 -06:00
a94d6bc197 v3.0.1
=====================================================================

--- Bug fixes ----------------------------

- fixed variable reference in media-sync

- fixed bug with multi-line list environment variables sometimes gets
  appended to a previous variable line
2023-06-22 15:48:57 -06:00
19 changed files with 310 additions and 161 deletions

View File

@ -3,18 +3,22 @@ export AWS_ACCOUNT=
export AWS_PROFILE= export AWS_PROFILE=
export AWS_REGION= export AWS_REGION=
export AWS__EFS__LOCAL_MOUNT_POINT= export AWS__EFS__LOCAL_MOUNT_POINT=
export AWS__S3__MEDIA_BUCKET=
export AWS__S3__MEDIA_TARGETS=
export DIRECTUS__API_TOKEN= export DIRECTUS__API_TOKEN=
export DIRECTUS__BASE_URL= export DIRECTUS__BASE_URL=
export DISCORD__BOT_TOKEN= export DISCORD__BOT_TOKEN=
export DISCORD__CONTENT_FOOTER=
export DISCORD__CONTENT_HEADER=
export DISCORD__DEFAULT_AVATAR_URL= export DISCORD__DEFAULT_AVATAR_URL=
export DISCORD__DEFAULT_CHANNEL_ID= export DISCORD__DEFAULT_CHANNEL_ID=
export DISCORD__DEFAULT_USERNAME=
export DISCORD__DEFAULT_WEBHOOK=
export I3__BORDER_PIXEL_SIZE= export I3__BORDER_PIXEL_SIZE=
export I3__DMENU_FONT_SIZE= export I3__DMENU_FONT_SIZE=
export I3__GLOBAL_FONT_SIZE= export I3__GLOBAL_FONT_SIZE=
export I3__MODEL_CONFIG= export I3__MODEL_CONFIG=
export LINEAR__API_TOKEN= export LINEAR__API_TOKEN=
export MEDIA_SYNC__S3_BUCKET
export MEDIA_SYNC__TARGETS
export REDIS_AUTH= export REDIS_AUTH=
export REDIS_HOST= export REDIS_HOST=
export REDIS_PORT= export REDIS_PORT=

View File

@ -4,15 +4,16 @@ AWS_REGION |
AWS__EFS__LOCAL_MOUNT_POINT | fully-qualified path to mount the EFS drive AWS__EFS__LOCAL_MOUNT_POINT | fully-qualified path to mount the EFS drive
AWS__S3__MEDIA_BUCKET | s3 bucket name and filesystem targets for media backups
AWS__S3__MEDIA_TARGETS |
DIRECTUS__API_TOKEN | details for a directus instance DIRECTUS__API_TOKEN | details for a directus instance
DIRECTUS__BASE_URL | DIRECTUS__BASE_URL |
DISCORD__BOT_TOKEN | details for discord bot DISCORD__BOT_TOKEN | details for discord bot
DISCORD__CONTENT_HEADER |
DISCORD__CONTENT_FOOTER |
DISCORD__DEFAULT_AVATAR_URL | DISCORD__DEFAULT_AVATAR_URL |
DISCORD__DEFAULT_CHANNEL_ID | DISCORD__DEFAULT_CHANNEL_ID |
DISCORD__DEFAULT_USERNAME |
DISCORD__DEFAULT_WEBHOOK |
I3__BORDER_PIXEL_SIZE | custom i3 configuration settings I3__BORDER_PIXEL_SIZE | custom i3 configuration settings
I3__DMENU_FONT_SIZE | I3__DMENU_FONT_SIZE |
@ -21,6 +22,9 @@ I3__MODEL_CONFIG |
LINEAR__API_TOKEN | linear.app project management configuration LINEAR__API_TOKEN | linear.app project management configuration
MEDIA_SYNC__S3_BUCKET | s3 bucket name and filesystem targets for media backups
MEDIA_SYNC__TARGETS |
REDIS_AUTH | redis connection credentials REDIS_AUTH | redis connection credentials
REDIS_HOST | REDIS_HOST |
REDIS_PORT | REDIS_PORT |

View File

@ -13,19 +13,14 @@ if __name__ != '__main__':
##################################################################### #####################################################################
def main(args, stream): def main(args, stream):
if args.body is None: if args.content is None:
print(f'reading input from {stream.input.name}', file=stderr) print(f'reading input from {stream.input.name}', file=stderr)
args.body = ''.join(stream.readlines()).strip() args.content = ''.join(stream.readlines()).strip()
if len(args.body) == 0: if len(args.content) == 0:
args.body = 'PING' args.content = 'PING'
response = discord.send_message( response = discord.send_message(**vars(args))
content = args.body,
channel_id = args.channel_id,
webhook = args.webhook,
avatar_url = args.avatar_url,
)
stream.writeline(dumps({ stream.writeline(dumps({
**(response.json() if response.text != '' else {'message': 'OK'}), **(response.json() if response.text != '' else {'message': 'OK'}),
@ -38,23 +33,28 @@ execute(main,
description = 'post a message to the indicated discord channel', description = 'post a message to the indicated discord channel',
parse_args = [ parse_args = [
( ['-b', '--body'], { ( ['-b', '--body'], {
'dest' : 'body', 'dest' : 'content',
'help' : 'message body', 'help' : 'message body',
'required' : False, 'required' : False,
}), }),
( ['-c', '--channel-id'], { ( ['-c', '--channel-id'], {
'dest' : 'channel_id', 'dest' : 'channel_id',
'help' : 'target channel id', 'help' : 'override default target channel id',
'required' : False, 'required' : False,
}), }),
( ['-w', '--webhook'], { ( ['-w', '--webhook'], {
'dest' : 'webhook', 'dest' : 'webhook',
'help' : 'target webhook (takes precedence over -c)', 'help' : 'override default target webhook (takes precedence over -c)',
'required' : False, 'required' : False,
}), }),
( ['--avatar-url'], { ( ['--avatar-url'], {
'dest' : 'avatar_url', 'dest' : 'avatar_url',
'help' : 'replace default avatar_url', 'help' : 'override default avatar_url',
'required' : False,
}),
( ['--username'], {
'dest' : 'username',
'help' : 'override default username',
'required' : False, 'required' : False,
}), }),
] ]

View File

@ -1,9 +1,9 @@
from py.lib.scwrypts import getenv from py.lib.scwrypts import getenv
from py.lib.http.discord import request from py.lib.http.discord import request
def send_message(content, channel_id=None, webhook=None, avatar_url=None, **kwargs): def send_message(content, channel_id=None, webhook=None, username=None, avatar_url=None, **kwargs):
if channel_id is None: if username is None:
channel_id = getenv('DISCORD__DEFAULT_CHANNEL_ID', required=False) username = getenv('DISCORD__DEFAULT_USERNAME', required=False)
if avatar_url is None: if avatar_url is None:
avatar_url = getenv('DISCORD__DEFAULT_AVATAR_URL', required=False) avatar_url = getenv('DISCORD__DEFAULT_AVATAR_URL', required=False)
@ -12,11 +12,25 @@ def send_message(content, channel_id=None, webhook=None, avatar_url=None, **kwar
if webhook is not None: if webhook is not None:
endpoint = f'webhooks/{webhook}' endpoint = f'webhooks/{webhook}'
elif channel_id is not None: elif channel_id is not None:
endpoint = f'channels/{channel_id}/messages' endpoint = f'channels/{channel_id}/messages'
elif (webhook := getenv('DISCORD__DEFAULT_WEBHOOK', required=False)) is not None:
endpoint = f'webhooks/{webhook}'
elif (channel_id := getenv('DISCORD__DEFAULT_CHANNEL_ID', required=False)) is not None:
endpoint = f'channels/{channel_id}/messages'
else: else:
raise ValueError('must provide target channel_id or webhook') raise ValueError('must provide target channel_id or webhook')
if (header := getenv('DISCORD__CONTENT_HEADER', required=False)) is not None:
content = f'{header}{content}'
if (footer := getenv('DISCORD__CONTENT_FOOTER', required=False)) is not None:
content = f'{content}{footer}'
return request( return request(
method = 'POST', method = 'POST',
@ -25,7 +39,7 @@ def send_message(content, channel_id=None, webhook=None, avatar_url=None, **kwar
key: value key: value
for key, value in { for key, value in {
'content': content, 'content': content,
'username': 'wrobot', 'username': username,
'avatar_url': avatar_url, 'avatar_url': avatar_url,
**kwargs, **kwargs,
}.items() }.items()

21
run
View File

@ -211,12 +211,21 @@ __RUN() {
[[ $ENV_REQUIRED -eq 1 ]] && { [[ $ENV_REQUIRED -eq 1 ]] && {
[ ! $ENV_NAME ] && ENV_NAME=$(SCWRYPTS__SELECT_ENV) [ ! $ENV_NAME ] && ENV_NAME=$(SCWRYPTS__SELECT_ENV)
local ENV_FILE=$(SCWRYPTS__GET_ENV_FILE "$ENV_NAME") for GROUP in ${SCWRYPTS_GROUPS[@]}
source "$ENV_FILE" || FAIL 5 "missing or invalid environment '$ENV_NAME'" do
local ENV_FILE=$(SCWRYPTS__GET_ENV_FILE "$ENV_NAME" "$GROUP")
source "$ENV_FILE" || FAIL 5 "missing or invalid environment '$GROUP/$ENV_NAME'"
for f in $(eval 'echo $SCWRYPTS_STATIC_CONFIG__'$GROUP)
do
source "$f" || FAIL 5 "invalid static config '$f'"
done
done
export ENV_NAME export ENV_NAME
} }
########################################## ##########################################
[ ! $SUBSCWRYPT ] \ [ ! $SUBSCWRYPT ] \
@ -230,7 +239,7 @@ __RUN() {
########################################## ##########################################
local LOGFILE=$(__GET_LOGFILE $SCRIPT) local LOGFILE=$(__GET_LOGFILE)
local HEADER=$( local HEADER=$(
[ $SUBSCWRYPT ] && return 0 [ $SUBSCWRYPT ] && return 0
@ -303,11 +312,9 @@ __VALIDATE_UPSTREAM_TIMELINE() {
} }
__GET_LOGFILE() { __GET_LOGFILE() {
local SCRIPT="$1"
[ $SUBSCWRYPT ] \ [ $SUBSCWRYPT ] \
|| [[ $SCRIPT =~ scwrypts/logs ]] \ || [[ $SCWRYPT_NAME =~ scwrypts/logs ]] \
|| [[ $SCRIPT =~ interactive ]] \ || [[ $SCWRYPT_NAME =~ interactive ]] \
&& return 0 && return 0
echo "$SCWRYPTS_LOG_PATH/$(echo $GROUP/$TYPE/$NAME | sed 's/^\.\///; s/\//\%/g').log" echo "$SCWRYPTS_LOG_PATH/$(echo $GROUP/$TYPE/$NAME | sed 's/^\.\///; s/\//\%/g').log"

View File

@ -2,11 +2,6 @@ export SCWRYPTS_ROOT__scwrypts="$SCWRYPTS_ROOT"
export SCWRYPTS_LIBRARY_ROOT__scwrypts="$SCWRYPTS_ROOT/zsh/lib" export SCWRYPTS_LIBRARY_ROOT__scwrypts="$SCWRYPTS_ROOT/zsh/lib"
export SCWRYPTS_COLOR__scwrypts='\033[0;32m' export SCWRYPTS_COLOR__scwrypts='\033[0;32m'
export SCWRYPTS_ENV_PATH__scwrypts="$SCWRYPTS_CONFIG_PATH/scwrypts/env"
[ ! -d "$SCWRYPTS_ENV_PATH__scwrypts" ] && mkdir -p "$SCWRYPTS_ENV_PATH__scwrypts"
export SCWRYPTS_ENV_TEMPLATE__scwrypts="$SCWRYPTS_ROOT__scwrypts/.env.template"
export SCWRYPTS_ENV_TEMPLATE_DESCRIPTIONS__scwrypts="$SCWRYPTS_ROOT__scwrypts/.env.template.descriptions"
export SCWRYPTS_VIRTUALENV_PATH__scwrypts="$SCWRYPTS_DATA_PATH/virtualenv" export SCWRYPTS_VIRTUALENV_PATH__scwrypts="$SCWRYPTS_DATA_PATH/virtualenv"
[ ! -d "$SCWRYPTS_VIRTUALENV_PATH__scwrypts" ] && mkdir -p "$SCWRYPTS_VIRTUALENV_PATH__scwrypts" [ ! -d "$SCWRYPTS_VIRTUALENV_PATH__scwrypts" ] && mkdir -p "$SCWRYPTS_VIRTUALENV_PATH__scwrypts"

View File

@ -118,7 +118,16 @@ use() {
} }
GET_SCWRYPTS_LIBRARY_ROOT() { GET_SCWRYPTS_LIBRARY_ROOT() {
eval echo '$SCWRYPTS_LIBRARY_ROOT__'$SCWRYPTS_LIBRARY_GROUP local ROOT
ROOT=$(eval echo '$SCWRYPTS_LIBRARY_ROOT__'$SCWRYPTS_LIBRARY_GROUP)
[ $ROOT ] && echo $ROOT && return 0
[[ $(eval echo '$SCWRYPTS_TYPE__'$SCWRYPTS_LIBRARY_GROUP) =~ zsh ]] \
&& ROOT=$(eval echo '$SCWRYPTS_ROOT__'$SCWRYPTS_LIBRARY_GROUP/lib) \
|| ROOT=$(eval echo '$SCWRYPTS_ROOT__'$SCWRYPTS_LIBRARY_GROUP/zsh/lib) \
;
[ $ROOT ] && echo $ROOT && return 0
} }
IS_LOADED() { IS_LOADED() {

View File

@ -15,20 +15,47 @@ SCWRYPTS__SELECT_OR_CREATE_ENV() {
SCWRYPTS__GET_ENV_NAMES | FZF_TAIL 'select / create an environment' SCWRYPTS__GET_ENV_NAMES | FZF_TAIL 'select / create an environment'
} }
SCWRYPTS__GET_ENV_FILE() { SCWRYPTS__GET_ENV_FILES() {
local NAME="$1" local NAME="$1"
echo "$SCWRYPTS_ENV_PATH/$NAME" local FILENAMES=$(
for GROUP in ${SCWRYPTS_GROUPS[@]}
do
echo "$SCWRYPTS_ENV_PATH/$GROUP/$NAME"
done
)
echo $FILENAMES | grep 'environments/scwrypts/'
echo $FILENAMES | grep -v 'environments/scwrypts/' | sort
SCWRYPTS__GET_ENV_NAMES | grep -q $NAME \ SCWRYPTS__GET_ENV_NAMES | grep -q $NAME \
|| { ERROR "no environment '$NAME' exists"; return 1; } || { ERROR "no environment '$NAME' exists"; return 1; }
} }
SCWRYPTS__GET_ENV_FILE() {
local NAME="$1"
local GROUP="$2"
[ ! $GROUP ] && { ERROR 'must provide group'; return 1; }
echo "$SCWRYPTS_ENV_PATH/$GROUP/$NAME"
SCWRYPTS__GET_ENV_NAMES | grep -q $NAME \
|| { ERROR "no environment '$NAME' exists"; return 1; }
[ -f "$SCWRYPTS_ENV_PATH/$GROUP/$NAME" ] || {
mkdir -p "$SCWRYPTS_ENV_PATH/$GROUP"
touch "$SCWRYPTS_ENV_PATH/$GROUP/$NAME"
}
[ -f "$SCWRYPTS_ENV_PATH/$GROUP/$NAME" ] \
|| { ERROR "missing environment file for '$GROUP/$NAME'"; return 2; }
}
SCWRYPTS__GET_ENV_TEMPLATE_FILES() { SCWRYPTS__GET_ENV_TEMPLATE_FILES() {
local GROUP local GROUP
for GROUP in ${SCWRYPTS_GROUPS[@]} for GROUP in ${SCWRYPTS_GROUPS[@]}
do do
eval echo '$SCWRYPTS_ENV_TEMPLATE__'$GROUP eval echo '$SCWRYPTS_ROOT__'$GROUP/.config/env.template
done done
} }
@ -37,7 +64,7 @@ SCWRYPTS__GET_ENV_NAMES() {
ERROR 'environment initialization error' ERROR 'environment initialization error'
return 1 return 1
} }
ls "$SCWRYPTS_ENV_PATH" | sort -r ls "$SCWRYPTS_ENV_PATH/scwrypts" | sort -r
} }
SCWRYPTS__INIT_ENVIRONMENTS() { SCWRYPTS__INIT_ENVIRONMENTS() {
@ -49,7 +76,11 @@ SCWRYPTS__INIT_ENVIRONMENTS() {
local BASIC_ENV local BASIC_ENV
for BASIC_ENV in local dev prod for BASIC_ENV in local dev prod
do do
GENERATE_TEMPLATE > "$SCWRYPTS_ENV_PATH/$BASIC_ENV" for GROUP in ${SCWRYPTS_GROUPS[@]}
do
mkdir -p "$SCWRYPTS_ENV_PATH/$GROUP"
GENERATE_TEMPLATE > "$SCWRYPTS_ENV_PATH/$GROUP/$BASIC_ENV"
done
done done
} }
@ -58,30 +89,28 @@ SCWRYPTS__INIT_ENVIRONMENTS() {
_SED() { sed --follow-symlinks $@; } _SED() { sed --follow-symlinks $@; }
GENERATE_TEMPLATE() { GENERATE_TEMPLATE() {
echo "#!/bin/zsh" [ ! $GROUP ] && { ERROR 'must provide GROUP'; return 1; }
echo '#####################################################################' DIVIDER='#####################################################################'
echo "### scwrypts runtime configuration ##################################" HEADER='### scwrypts runtime configuration '
echo '#####################################################################' [[ GROUP =~ ^scwrypts$ ]] || HEADER="${HEADER}(group '$GROUP') "
local FILE GROUP CONTENT printf "#!/bin/zsh\n$DIVIDER\n$HEADER%s\n$DIVIDER\n" "${DIVIDER:${#$(echo "$HEADER")}}"
local VARIABLE DESCRIPTION
for GROUP in ${SCWRYPTS_GROUPS[@]}
do
FILE=$(eval echo '$SCWRYPTS_ENV_TEMPLATE__'$GROUP)
CONTENT=$(GET_VARIABLE_NAMES "$FILE" | sed 's/^/export /; s/$/=/') local FILE CONTENT
local VARIABLE DESCRIPTION
FILE=$(eval echo '$SCWRYPTS_ROOT__'$GROUP/.config/env.template)
while read DESCRIPTION_LINE CONTENT=$(GET_VARIABLE_NAMES "$FILE" | sed 's/^/export /; s/$/=/')
do
VARIABLE=$(echo $DESCRIPTION_LINE | sed 's/ \+| .*$//')
DESCRIPTION=$(echo $DESCRIPTION_LINE | sed 's/^.* | //')
[ ! $DESCRIPTION ] && continue
CONTENT=$(echo "$CONTENT" | sed "/^export $VARIABLE=/i #" | sed "/^export $VARIABLE=/i # $DESCRIPTION") while read DESCRIPTION_LINE
done < <(_SED -n '/^[^ ]\+ \+| /p' "$FILE.descriptions") do
VARIABLE=$(echo $DESCRIPTION_LINE | sed 's/ \+| .*$//')
DESCRIPTION=$(echo $DESCRIPTION_LINE | sed 's/^.* | //')
[ ! $DESCRIPTION ] && continue
echo "$CONTENT" | sed 's/^#$//' CONTENT=$(echo "$CONTENT" | sed "/^export $VARIABLE=/i #" | sed "/^export $VARIABLE=/i # $DESCRIPTION")
echo '\n#####################################################################' done < <(_SED -n '/^[^ ]\+ \+| /p' "$FILE.descriptions")
done
echo "$CONTENT" | sed 's/^#$//'
} }
GET_VARIABLE_NAMES() { GET_VARIABLE_NAMES() {
@ -91,4 +120,3 @@ GET_VARIABLE_NAMES() {
| grep -v '__[a-z]\+$' \ | grep -v '__[a-z]\+$' \
; ;
} }

View File

@ -16,14 +16,18 @@ SCWRYPTS__GET_AVAILABLE_SCWRYPTS() {
do do
GROUP_PATH=$(eval echo '$SCWRYPTS_ROOT__'$GROUP) GROUP_PATH=$(eval echo '$SCWRYPTS_ROOT__'$GROUP)
GROUP_COLOR=$(eval echo '$SCWRYPTS_COLOR__'$GROUP) GROUP_COLOR=$(eval echo '$SCWRYPTS_COLOR__'$GROUP)
{
cd "$GROUP_PATH" GROUP_TYPE=$(eval echo '$SCWRYPTS_TYPE__'$GROUP)
find . -mindepth 2 -type f -executable \ [ $GROUP_TYPE ] && MINDEPTH=1 && GROUP_TYPE="$GROUP_TYPE\\/" || MINDEPTH=2
| grep -v '\.git' \
| grep -v 'node_modules' \ command -v SCWRYPTS__LIST_AVAILABLE_SCWRYPTS__$GROUP >/dev/null 2>&1 \
| sed "s/^\\.\\///; s/\\.[^.]*$//" \ && LOOKUP=SCWRYPTS__LIST_AVAILABLE_SCWRYPTS__$GROUP \
| sed "s|\\([^/]*\\)/\(.*\)$|$(printf $__COLOR_RESET)\\2^$(printf $TYPE_COLOR)\\1^$(printf $GROUP_COLOR)$GROUP$(printf $__COLOR_RESET)|" \ || LOOKUP=SCWRYPTS__LIST_AVAILABLE_SCWRYPTS__scwrypts \
; ;
{
$LOOKUP \
| sed "s|\\([^/]*\\)/\(.*\)$|$(printf $__COLOR_RESET)\\2^$(printf $TYPE_COLOR)\\1^$(printf $GROUP_COLOR)$GROUP$(printf $__COLOR_RESET)|" \
} & } &
LOOKUP_PIDS+=($!) LOOKUP_PIDS+=($!)
done done
@ -42,54 +46,62 @@ SCWRYPTS__SEPARATE_SCWRYPT_SELECTION() {
done done
} }
SCWRYPTS__LIST_AVAILABLE_SCWRYPTS__scwrypts() {
# implementation should output lines of the following format:
# "${SCWRYPT_TYPE}/${SCWRYPT_NAME}"
cd "$GROUP_PATH"
find . -mindepth $MINDEPTH -type f -executable \
| grep -v '\.git' \
| grep -v 'node_modules' \
| sed "s/^\\.\\///; s/\\.[^.]*$//; s/^/$GROUP_TYPE/" \
;
}
SCWRYPTS__GET_RUNSTRING() { SCWRYPTS__GET_RUNSTRING() {
# accepts a selected line from SCWRYPTS__GET_AVAILABLE_SCWRYPTS local GROUP_PATH=$(eval echo '$SCWRYPTS_ROOT__'$SCWRYPT_GROUP)
local NAME="$1"
local TYPE="$2"
local GROUP="$3"
local GROUP_PATH=$(eval echo '$SCWRYPTS_ROOT__'$GROUP)
local RUNSTRING local RUNSTRING
[ $NAME ] && [ $TYPE ] && [ $GROUP ] || { [ $SCWRYPT_NAME ] && [ $SCWRYPT_TYPE ] && [ $SCWRYPT_GROUP ] || {
ERROR 'missing required information to get runstring' ERROR 'missing required information to get runstring'
return 1 return 1
} }
[ $ENV_REQUIRED ] && [[ $ENV_REQUIRED -eq 1 ]] && [ ! $ENV_NAME ] && { [ $ENV_REQUIRED ] && [[ $ENV_REQUIRED -eq 1 ]] && [ ! $ENV_NAME ] && {
ERROR 'missing required information to get runstring' ERROR 'missing required information to get runstring'
return 1 return 1
} }
typeset -f SCWRYPTS__GET_RUNSTRING__${GROUP}__${TYPE} >/dev/null 2>&1 && { [ ! $RUNSTRING ] && typeset -f SCWRYPTS__GET_RUNSTRING__${SCWRYPT_GROUP}__${SCWRYPT_TYPE} >/dev/null 2>&1 && {
RUNSTRING=$(SCWRYPTS__GET_RUNSTRING__${GROUP}__${TYPE}) RUNSTRING=$(SCWRYPTS__GET_RUNSTRING__${SCWRYPT_GROUP}__${SCWRYPT_TYPE})
[ ! $RUNSTRING ] && { [ ! $RUNSTRING ] && {
ERROR "SCWRYPTS__GET_RUNSTRING__${GROUP}__${TYPE} error" ERROR "SCWRYPTS__GET_RUNSTRING__${SCWRYPT_GROUP}__${SCWRYPT_TYPE} error"
return 2 return 2
} }
} }
typeset -f SCWRYPTS__GET_RUNSTRING__${TYPE} >/dev/null 2>&1 && { [ ! $RUNSTRING ] && typeset -f SCWRYPTS__GET_RUNSTRING__${SCWRYPT_TYPE} >/dev/null 2>&1 && {
RUNSTRING=$(SCWRYPTS__GET_RUNSTRING__${TYPE}) RUNSTRING=$(SCWRYPTS__GET_RUNSTRING__${SCWRYPT_TYPE})
[ ! $RUNSTRING ] && { [ ! $RUNSTRING ] && {
ERROR "SCWRYPTS__GET_RUNSTRING__${TYPE} error" ERROR "SCWRYPTS__GET_RUNSTRING__${SCWRYPT_TYPE} error"
return 3 return 3
} }
} }
[ ! $RUNSTRING ] && { [ ! $RUNSTRING ] && {
ERROR "type ${TYPE} (group ${GROUP}) has no supported runstring generator" ERROR "type ${SCWRYPT_TYPE} (group ${SCWRYPT_GROUP}) has no supported runstring generator"
return 4 return 4
} }
RUNSTRING="SCWRYPTS_ENV=$ENV_NAME; $RUNSTRING" RUNSTRING="SCWRYPTS_ENV=$ENV_NAME; $RUNSTRING"
RUNSTRING="source $SCWRYPTS_ROOT/zsh/lib/import.driver.zsh; $RUNSTRING" RUNSTRING="source $SCWRYPTS_ROOT/zsh/lib/import.driver.zsh; $RUNSTRING"
local _VIRTUALENV=$(eval echo '$SCWRYPTS_VIRTUALENV_PATH__'$GROUP'/$TYPE/bin/activate') local _VIRTUALENV=$(eval echo '$SCWRYPTS_VIRTUALENV_PATH__'$SCWRYPT_GROUP'/$SCWRYPT_TYPE/bin/activate')
[ -f $_VIRTUALENV ] && RUNSTRING="source $_VIRTUALENV; $RUNSTRING" [ -f $_VIRTUALENV ] && RUNSTRING="source $_VIRTUALENV; $RUNSTRING"
local G SCWRYPTSENV local G SCWRYPTSENV
for G in ${SCWRYPTS__GROUPS[@]} for G in ${SCWRYPTS__GROUPS[@]}
do do
SCWRYPTSENV=$(eval echo '$SCWRYPTS_ENV_PATH__'$GROUP'/$ENV_NAME') SCWRYPTSENV="$SCWRYPTS_ENV_PATH/$G/$ENV_NAME"
[ -f $SCWRYPTSENV ] && RUNSTRING="source $SCWRYPTSENV; $RUNSTRING" [ -f $SCWRYPTSENV ] && RUNSTRING="source $SCWRYPTSENV; $RUNSTRING"
done done
@ -99,7 +111,12 @@ SCWRYPTS__GET_RUNSTRING() {
SCWRYPTS__GET_RUNSTRING__zsh() { SCWRYPTS__GET_RUNSTRING__zsh() {
__CHECK_DEPENDENCY zsh || return 1 __CHECK_DEPENDENCY zsh || return 1
echo "source $GROUP_PATH/$TYPE/$NAME" [ $(eval echo '$SCWRYPTS_TYPE__'$SCWRYPT_GROUP) ] \
&& echo "source $GROUP_PATH/$SCWRYPT_NAME" \
|| echo "source $GROUP_PATH/$SCWRYPT_TYPE/$SCWRYPT_NAME" \
;
return 0
} }
SCWRYPTS__GET_RUNSTRING__py() { SCWRYPTS__GET_RUNSTRING__py() {
@ -110,11 +127,11 @@ SCWRYPTS__GET_RUNSTRING__py() {
WARNING 'compatibility may vary' WARNING 'compatibility may vary'
} }
echo "cd $GROUP_PATH; python -m $(echo $TYPE/$NAME | sed 's/\//./g; s/\.py$//; s/\.\.//')" echo "cd $GROUP_PATH; python -m $(echo $SCWRYPT_TYPE/$SCWRYPT_NAME | sed 's/\//./g; s/\.py$//; s/\.\.//')"
} }
SCWRYPTS__GET_RUNSTRING__zx() { SCWRYPTS__GET_RUNSTRING__zx() {
__CHECK_DEPENDENCY zx || return 1 __CHECK_DEPENDENCY zx || return 1
echo "FORCE_COLOR=3; cd $GROUP_PATH; ./$TYPE/$NAME.js" echo "export FORCE_COLOR=3; cd $GROUP_PATH; ./$SCWRYPT_TYPE/$SCWRYPT_NAME.js"
} }

View File

@ -37,7 +37,11 @@ UPDATE_VIRTUALENV() {
local VIRTUALENV_PATH=$(GET_VIRTUALENV_PATH $GROUP $TYPE) local VIRTUALENV_PATH=$(GET_VIRTUALENV_PATH $GROUP $TYPE)
[ ! -d $VIRTUALENV_PATH ] && CREATE_VIRTUALENV__${GROUP}__${TYPE} $VIRTUALENV_PATH [ ! -d $VIRTUALENV_PATH ] && {
which CREATE_VIRTUALENV__${GROUP}__${TYPE} >/dev/null 2>&1 \
&& CREATE_VIRTUALENV__${GROUP}__${TYPE} $VIRTUALENV_PATH \
|| return 0
}
STATUS "updating $TYPE virtual environment" STATUS "updating $TYPE virtual environment"
@ -49,7 +53,7 @@ UPDATE_VIRTUALENV() {
cd $SCWRYPTS_ROOT cd $SCWRYPTS_ROOT
local UPDATE_CODE=0 local UPDATE_CODE=0
case $TYPE in case $TYPE in
py ) cd py; pip install -r requirements.txt; UPDATE_CODE=$? ;; py ) cd py; pip install --no-cache-dir -r requirements.txt; UPDATE_CODE=$? ;;
zx ) cd zx; npm install ;; zx ) cd zx; npm install ;;
esac esac
UPDATE_CODE=$? UPDATE_CODE=$?
@ -83,7 +87,11 @@ DELETE_VIRTUALENV() {
GET_VIRTUALENV_PATH() { GET_VIRTUALENV_PATH() {
local GROUP="$1" local GROUP="$1"
local TYPE="$2" local TYPE="$2"
eval echo '$SCWRYPTS_VIRTUALENV_PATH__'$GROUP/$TYPE
local ENV_PATH="$(eval echo '$SCWRYPTS_VIRTUALENV_PATH__'$GROUP 2>/dev/null)"
[ ! $ENV_PATH ] && ENV_PATH="$SCWRYPTS_VIRTUALENV_PATH__scwrypts"
echo $ENV_PATH/$TYPE
} }
##################################################################### #####################################################################
@ -121,7 +129,7 @@ CREATE_VIRTUALENV__scwrypts__zx() {
nodeenv $VIRTUALENV_PATH --node=$SCWRYPTS_NODE_VERSION__scwrypts \ nodeenv $VIRTUALENV_PATH --node=$SCWRYPTS_NODE_VERSION__scwrypts \
&& SUCCESS 'node virtualenv created' \ && SUCCESS 'node virtualenv created' \
|| { || {
ERROR "unable to create '$VIRTUALENV_PATH' with '$SCWRYPTS__NODE_VERSION'" ERROR "unable to create '$VIRTUALENV_PATH' with '$SCWRYPTS_NODE_VERSION__scwrypts'"
return 2 return 2
} }
} }

View File

@ -16,7 +16,9 @@ PRINT() {
shift 1 shift 1
done done
local STYLED_MESSAGE="${COLOR}$({ MESSAGE="$(echo "$MESSAGE" | sed 's/%/%%/g')"
local STYLED_MESSAGE="$({
printf "${COLOR}" printf "${COLOR}"
while IFS='' read line while IFS='' read line
do do
@ -26,7 +28,9 @@ PRINT() {
PREFIX=$(echo $PREFIX | sed 's/./ /g') PREFIX=$(echo $PREFIX | sed 's/./ /g')
done <<< $MESSAGE done <<< $MESSAGE
})${__COLOR_RESET}${LAST_LINE_END}" })"
STYLED_MESSAGE="${COLOR}$(echo "$STYLED_MESSAGE" | sed 's/%/%%/g')${__COLOR_RESET}${LAST_LINE_END}"
[[ $STDERR -eq 1 ]] && printf $STYLED_MESSAGE >&2 [[ $STDERR -eq 1 ]] && printf $STYLED_MESSAGE >&2
[[ $STDOUT -eq 1 ]] && printf $STYLED_MESSAGE [[ $STDOUT -eq 1 ]] && printf $STYLED_MESSAGE
@ -124,7 +128,15 @@ FZF() {
exit 1 exit 1
} }
local SELECTION=$(fzf -i --height=30% --layout=reverse --prompt "$1 : " ${@:2}) local FZF_ARGS=()
FZF_ARGS+=(-i)
FZF_ARGS+=(--ansi)
FZF_ARGS+=(--bind=ctrl-c:cancel)
FZF_ARGS+=(--height=50%)
FZF_ARGS+=(--layout=reverse)
local SELECTION=$(fzf ${FZF_ARGS[@]} --layout=reverse --prompt "$1 : " ${@:2})
PROMPT "$1" PROMPT "$1"
echo $SELECTION >&2 echo $SELECTION >&2
echo $SELECTION echo $SELECTION

View File

@ -1,4 +1,4 @@
#!/bin/zsh #!/bin/zsh
DEPENDENCIES+=() DEPENDENCIES+=()
REQUIRED_ENV+=() REQUIRED_ENV+=()
@ -16,18 +16,23 @@ STATUS "selected '$TEMPLATE_ENV_NAME'"
PROMPT 'enter new environment name' PROMPT 'enter new environment name'
ENV_NAME=$(echo '' | FZF_HEAD 'new environment') ENV_NAME=$(echo '' | FZF_HEAD 'new environment')
[ ! $ENV_NAME ] && ABORT [ ! $ENV_NAME ] && ABORT
SCWRYPTS__GET_ENV_NAMES | grep -q $ENV_NAME && FAIL 1 "'$ENV_NAME' already exists"
TEMPLATE_ENV_FILE=$(SCWRYPTS__GET_ENV_FILE $TEMPLATE_ENV_NAME 2>/dev/null) for GROUP in ${SCWRYPTS_GROUPS[@]}
ENV_FILE=$(SCWRYPTS__GET_ENV_FILE $ENV_NAME) do
TEMPLATE_ENV_FILE=$(SCWRYPTS__GET_ENV_FILE $TEMPLATE_ENV_NAME $GROUP 2>/dev/null)
ENV_FILE=$(SCWRYPTS__GET_ENV_FILE $ENV_NAME $GROUP 2>/dev/null)
[ -f "$ENV_FILE" ] && FAIL 2 "'$ENV_NAME' already exists" STATUS "creating environment '$ENV_NAME'"
cat "$TEMPLATE_ENV_FILE" \
| sed 's/ # from.*//' \
> "$ENV_FILE" \
&& SUCCESS "created '$ENV_FILE'" \
|| FAIL 2 "something went wrong creating '$ENV_FILE'"
done
STATUS "creating environment '$ENV_NAME'" STATUS "synchronizing environments"
cat "$TEMPLATE_ENV_FILE" \ SCWRYPTS__RUN --name scwrypts/environment/synchronize --group scwrypts --type zsh -- --no-prompt \
| sed 's/ from.*//' \ && SUCCESS "finished copy environment '$TEMPLATE_ENV_NAME > $ENV_NAME'" \
> "$ENV_FILE" \ || FAIL 3 'error during synchronization of new environment (see above)' \
&& SCWRYPTS__RUN --name scwrypts/environment/synchronize --group scwrypts --type zsh -- --no-prompt \ ;
&& SUCCESS "created '$ENV_NAME'" \
|| FAIL 3 "something went wrong creating '$ENV_NAME'"
SUCCESS "finished copy environment '$TEMPLATE_ENV_NAME > $ENV_NAME'"

View File

@ -11,18 +11,26 @@ PROMPT 'choose an environment to delete'
ENV_NAME=$(SCWRYPTS__SELECT_ENV) ENV_NAME=$(SCWRYPTS__SELECT_ENV)
[ ! $ENV_NAME ] && ABORT [ ! $ENV_NAME ] && ABORT
ENV_FILE=$(SCWRYPTS__GET_ENV_FILE $ENV_NAME) ENV_FILES=($(SCWRYPTS__GET_ENV_FILES $ENV_NAME))
STATUS "preparing to remove '$ENV_NAME'" STATUS "preparing to remove '$ENV_NAME'"
WARNING " WARNING "
the '$ENV_NAME' environment will be removed the '$ENV_NAME' environment will be removed configured options
configured options and stored credentials will be lost forever and stored credentials will be lost forever:
$(echo $ENV_FILES | sed 's| /|\n - /|g; s/^/ - /')
" "
yN 'continue?' || ABORT yN 'continue?' || ABORT
STATUS "removing environment" STATUS "removing environment"
rm "$ENV_FILE" \ for ENV_FILE in ${ENV_FILES[@]}
&& SUCCESS "removed '$ENV_NAME'" \ do
|| FAIL 3 "unable to remove '$ENV_FILE'; is it protected?" rm "$ENV_FILE" \
&& SUCCESS "removed '$ENV_FILE'" \
|| ERROR "unable to remove '$ENV_FILE'; is it protected?" \
;
done
CHECK_ERRORS -n || FAIL 2 "some errors ocurred when cleaning up $ENV_NAME"

View File

@ -16,16 +16,27 @@ CHECK_ENVIRONMENT
} }
[ ! $ENV_NAME ] && ABORT [ ! $ENV_NAME ] && ABORT
ENV_FILE=$(SCWRYPTS__GET_ENV_FILE $ENV_NAME 2>/dev/null) ENV_FILES=($(SCWRYPTS__GET_ENV_FILES $ENV_NAME 2>/dev/null))
[ ! -f "$ENV_FILE" ] && { for ENV_FILE in ${ENV_FILES[@]}
STATUS "Creating '$ENV_NAME'..." \ do
&& touch "$ENV_FILE" \ [ ! -f "$ENV_FILE" ] && {
&& SCWRYPTS__RUN --name scwrypts/environment/synchronize --group scwrypts --type zsh -- --no-prompt \ STATUS "Creating '$ENV_FILE'..." \
&& SUCCESS "created '$ENV_NAME'" \ && mkdir -p "$(dirname "$ENV_FILE")" \
|| { ERROR "failed to create '$ENV_FILE'"; exit 1; } && touch "$ENV_FILE" \
} && ((CREATED+=1)) \
&& SUCCESS "created '$ENV_NAME'" \
|| { ERROR "failed to create '$ENV_FILE'"; exit 1; }
}
EDIT $ENV_FILE [ $CREATED ] && [[ $CREATED -gt 0 ]] && {
STATUS "detected new environment files; performing sync" \
&& SCWRYPTS__RUN --name scwrypts/environment/synchronize --group scwrypts --type zsh -- --no-prompt \
|| FAIL 1 "failure during sync for '$ENV_NAME'" \
}
;
done
EDIT $ENV_FILES
SCWRYPTS__RUN --name scwrypts/environment/synchronize --group scwrypts --type zsh -- --no-prompt \ SCWRYPTS__RUN --name scwrypts/environment/synchronize --group scwrypts --type zsh -- --no-prompt \
|| FAIL 4 'failed to run environment sync' \ || FAIL 4 'failed to run environment sync' \

View File

@ -1,8 +0,0 @@
#!/bin/zsh
DEPENDENCIES+=()
REQUIRED_ENV+=()
CHECK_ENVIRONMENT
#####################################################################
__CHECK_REQUIRED_ENV $@

View File

@ -49,39 +49,47 @@ SYNCHRONIZE() {
local ENVIRONMENTS ENVIRONMENT_FILES local ENVIRONMENTS ENVIRONMENT_FILES
local FILE NAME ENVIRONMENT_FILE local FILE NAME ENVIRONMENT_FILE
ENVIRONMENTS=($(SCWRYPTS__GET_ENV_NAMES | sort -r)) GROUP_PIDS=()
ENVIRONMENT_FILES=($( for GROUP in ${SCWRYPTS_GROUPS}
do
{
ENVIRONMENTS=($(SCWRYPTS__GET_ENV_NAMES | sort -r))
ENVIRONMENT_FILES=($(
for NAME in ${ENVIRONMENTS[@]}
do
SCWRYPTS__GET_ENV_FILE $NAME $GROUP
done
))
STATUS 'generating working environment files...'
for FILE in ${ENVIRONMENT_FILES[@]}
do
GENERATE_TEMP_ENVIRONMENT_FILE "$FILE"
done
STATUS 'cascading environment values to children...'
for NAME in ${ENVIRONMENTS[@]} for NAME in ${ENVIRONMENTS[@]}
do do
SCWRYPTS__GET_ENV_FILE $NAME CASCADE_ENVIRONMENT $NAME
done done
))
STATUS 'generating working environment files...' STATUS 'cleaning up working space...'
for FILE in ${ENVIRONMENT_FILES[@]} for FILE in ${ENVIRONMENT_FILES[@]}
do do
GENERATE_TEMP_ENVIRONMENT_FILE "$FILE" CLEANUP_ENVIRONMENT_FILE "$FILE"
done
SUCCESS 'finished sync!'
} &
GROUP_PIDS+=$!
done done
for P in ${GROUP_PIDS[@]}; do wait $P; done
STATUS 'cascading environment values to children...'
for NAME in ${ENVIRONMENTS[@]}
do
CASCADE_ENVIRONMENT $NAME
done
STATUS 'cleaning up working space...'
for FILE in ${ENVIRONMENT_FILES[@]}
do
CLEANUP_ENVIRONMENT_FILE "$FILE"
done
SUCCESS 'finished sync!'
} }
##################################################################### #####################################################################
CASCADE_ENVIRONMENT() { CASCADE_ENVIRONMENT() {
local PARENT_NAME="$1" local PARENT_NAME="$1"
local PARENT_FILE="$(SCWRYPTS__GET_ENV_FILE $PARENT_NAME).temp" local PARENT_FILE="$(SCWRYPTS__GET_ENV_FILE $PARENT_NAME $GROUP).temp"
local CHILD_NAMES=($(echo $ENVIRONMENTS | sed 's/ \+/\n/g' |grep "^$PARENT_NAME\\.")) local CHILD_NAMES=($(echo $ENVIRONMENTS | sed 's/ \+/\n/g' |grep "^$PARENT_NAME\\."))
[[ ${#CHILD_NAMES[@]} -eq 0 ]] && return 0 [[ ${#CHILD_NAMES[@]} -eq 0 ]] && return 0
@ -93,7 +101,7 @@ CASCADE_ENVIRONMENT() {
for CHILD_NAME in ${CHILD_NAMES[@]} for CHILD_NAME in ${CHILD_NAMES[@]}
do do
STATUS "propagating environment '$PARENT_NAME' to child '$CHILD_NAME'" STATUS "propagating environment '$PARENT_NAME' to child '$CHILD_NAME'"
CHILD_FILE="$(SCWRYPTS__GET_ENV_FILE $CHILD_NAME).temp" CHILD_FILE="$(SCWRYPTS__GET_ENV_FILE $CHILD_NAME $GROUP).temp"
CONTENT=$(cat "$CHILD_FILE") CONTENT=$(cat "$CHILD_FILE")
echo "$PARENT_VARIABLES" | ADD_LINES echo "$PARENT_VARIABLES" | ADD_LINES
echo "$CONTENT" > "$CHILD_FILE" echo "$CONTENT" > "$CHILD_FILE"
@ -119,7 +127,7 @@ ADD_LINES() {
do do
VARIABLE=$(echo $LINE | sed 's/=.*$//') VARIABLE=$(echo $LINE | sed 's/=.*$//')
echo $CONTENT | grep -qi "^$VARIABLE" || { echo $CONTENT | grep -qi "^$VARIABLE" || {
echo $LINE | grep -qi '__[a-z_]\+=' || { echo $LINE | grep -q '__[a-z_]\+=' || {
WARNING "skipping variable $(echo $LINE | sed 's/^export //; s/=.*//') WARNING "skipping variable $(echo $LINE | sed 's/^export //; s/=.*//')
(must be included in a template before it can be added)" (must be included in a template before it can be added)"
continue continue
@ -142,6 +150,7 @@ READ_POPULATED_VARIABLES() {
| awk '/^[^=]+$/{printf "%s_____",$0;next}7' \ | awk '/^[^=]+$/{printf "%s_____",$0;next}7' \
| sed 's/\(_____\)\(export\)/\1\n\2/; s/\(_____\)$/\1\n/' \ | sed 's/\(_____\)\(export\)/\1\n\2/; s/\(_____\)$/\1\n/' \
| sed 's/^.*_____.*$/_____&/' \ | sed 's/^.*_____.*$/_____&/' \
| sed 's/^_____export/export/' \
| sed -z 's/[\n | sed -z 's/[\n
] *_____/_____/g' \ ] *_____/_____/g' \
| grep -v '^$' \ | grep -v '^$' \

View File

@ -18,10 +18,18 @@ SETUP_SYMLINK() {
[ ! $2 ] && FAIL 1 'must provide SOURCE_CONFIG and TARGET_CONFIG' [ ! $2 ] && FAIL 1 'must provide SOURCE_CONFIG and TARGET_CONFIG'
local SOURCE_CONFIG="$1" local SOURCE_CONFIG="$1"
[ ! -f "$SOURCE_CONFIG" ] && [ ! -d "$SOURCE_CONFIG" ] && FAIL 2 "no such file or directory '$SOURCE_CONFIG'"
local TARGET_CONFIG="$HOME/.config/$2" local TARGET_CONFIG="$HOME/.config/$2"
[ ! -f "$SOURCE_CONFIG" ] && [ ! -d "$SOURCE_CONFIG" ] && [ -f "$TARGET_CONFIG" ] && {
INFO 'SOURCE_CONFIG is not tracked; copying from TARGET_CONFIG'
mkdir -p "$(dirname "$SOURCE_CONFIG")"
cp "$TARGET_CONFIG" "$SOURCE_CONFIG"
}
[ ! -f "$SOURCE_CONFIG" ] && [ ! -d "$SOURCE_CONFIG" ] && {
WARNING "no such file or directory '$SOURCE_CONFIG'"
return 0
}
[ ! -d $(dirname "$TARGET_CONFIG") ] && mkdir -p $(dirname "$TARGET_CONFIG") [ ! -d $(dirname "$TARGET_CONFIG") ] && mkdir -p $(dirname "$TARGET_CONFIG")
[[ $SAFE_SYMLINKS -eq 1 ]] \ [[ $SAFE_SYMLINKS -eq 1 ]] \

View File

@ -25,6 +25,9 @@ LAUNCH_OR_SHOW() {
-a, --always-launch invoke executable even if client-class exists -a, --always-launch invoke executable even if client-class exists
-n, --no-resize don't resize the window (ignores -sxy flags) -n, --no-resize don't resize the window (ignores -sxy flags)
-l, --no-center leave the window wherever it was last positioned
--has-statusbar-icon (default: false) use if program has a statusbar icon
-h, --help print this message and exit -h, --help print this message and exit
@ -47,6 +50,8 @@ LAUNCH_OR_SHOW() {
local ALWAYS_LAUNCH=0 local ALWAYS_LAUNCH=0
local RESIZE=1 local RESIZE=1
local MOVE=1
local MIN_ACTIVE=1
while [[ $# -gt 0 ]] while [[ $# -gt 0 ]]
do do
@ -58,6 +63,9 @@ LAUNCH_OR_SHOW() {
-a | --always-launch ) ALWAYS_LAUNCH=1 ;; -a | --always-launch ) ALWAYS_LAUNCH=1 ;;
-n | --no-resize ) RESIZE=0 ;; -n | --no-resize ) RESIZE=0 ;;
-l | --no-center ) MOVE=0 ;;
--has-statusbar-icon ) MIN_ACTIVE=2 ;;
-h | --help ) USAGE; exit 0 ;; -h | --help ) USAGE; exit 0 ;;
@ -78,7 +86,13 @@ LAUNCH_OR_SHOW() {
} }
} }
ERROR_CHECK CHECK_ERRORS
xrandr | grep primary | awk '{print $4;}' | grep -q '^[0-9]\+$' || {
xrandr --output $(xrandr | grep ' connected' | awk '{print $1;}' | head -n1) --primary
}
local CURRENTLY_ACTIVE=$(xdotool search --onlyvisible --classname $CLIENT_CLASS 2>/dev/null | wc -l)
local LAUNCH_APP=$ALWAYS_LAUNCH local LAUNCH_APP=$ALWAYS_LAUNCH
STATUS "looking for window process ids" STATUS "looking for window process ids"
@ -107,11 +121,15 @@ LAUNCH_OR_SHOW() {
&& STATUS 'resizing window' \ && STATUS 'resizing window' \
&& i3-msg "[class=$CLIENT_CLASS] resize set $WINDOW_SIZE" && i3-msg "[class=$CLIENT_CLASS] resize set $WINDOW_SIZE"
STATUS 'pulling window from scratchpad to foreground' [[ $CURRENTLY_ACTIVE -lt $MIN_ACTIVE ]] && {
i3-msg "[class=$CLIENT_CLASS] scratchpad show" STATUS 'pulling window from scratchpad to foreground'
i3-msg "[class=$CLIENT_CLASS] scratchpad show"
}
STATUS 'moving window to center of current screen' STATUS 'moving window to center of current screen'
i3-msg "[class=$CLIENT_CLASS] move position center" [[ $MOVE -eq 1 ]] && i3-msg "[class=$CLIENT_CLASS] move position center"
return 0
} }
##################################################################### #####################################################################

View File

@ -65,7 +65,7 @@ INSTALL() {
} }
} }
ERROR_CHECK CHECK_ERRORS
#################################################### ####################################################