aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rwxr-xr-xgist34
1 files changed, 16 insertions, 18 deletions
diff --git a/gist b/gist
index 9efc991..9ed2a2c 100755
--- a/gist
+++ b/gist
@@ -52,8 +52,7 @@ CONFIG=~/.config/gist.conf; mkdir -p ~/.config
52INDEX_FORMAT=('index' 'url' 'blob_code' 'file_num' 'comment_num' 'author' 'created_at' 'updated_at' 'description') 52INDEX_FORMAT=('index' 'url' 'blob_code' 'file_num' 'comment_num' 'author' 'created_at' 'updated_at' 'description')
53TAG_CHAR='-_[:alnum:]' 53TAG_CHAR='-_[:alnum:]'
54 54
55[[ -z $hint ]] && hint=true # default to show hint with list of gist 55hint=${hint:=true} # default to show hint with list of gist
56[[ -z $confirm ]] && confirm=true # default to confirm when deleting gists
57auto_sync=true # automatically clone the gist repo 56auto_sync=true # automatically clone the gist repo
58protocol=https 57protocol=https
59 58
@@ -232,7 +231,7 @@ _validate_config(){
232_apply_config() { 231_apply_config() {
233 _validate_config "$@" || return 1 232 _validate_config "$@" || return 1
234 233
235 [[ -z $folder || ! -w $(dirname $folder) ]] && folder=~/gist 234 [[ -z $folder || ! -w $(dirname "$folder") ]] && folder=~/gist
236 mkdir -p $folder 235 mkdir -p $folder
237 INDEX=$folder/index; [[ -e $INDEX ]] || touch $INDEX 236 INDEX=$folder/index; [[ -e $INDEX ]] || touch $INDEX
238} 237}
@@ -251,19 +250,20 @@ _check_repo_status() {
251 echo "\e[32m[Not cloned yet]\e[0m"; 250 echo "\e[32m[Not cloned yet]\e[0m";
252 fi 251 fi
253 else 252 else
254 cd "$1" 253 cd "$1" || exit 1
255 if [[ -n $(git status --short) || $(git branch | sed -n '/\* / s///p') != 'master' ]] &>/dev/null; then 254 if [[ -n $(git status --short) || $(git branch | sed -n '/\* / s///p') != 'master' ]] &>/dev/null; then
256 echo "\e[36m[working]\e[0m" 255 echo "\e[36m[working]\e[0m"
257 else 256 else
258 [[ $(_blob_code "$1") != "$2" ]] 2>/dev/null && local status="\e[31m[outdated]\e[0m" 257 [[ $(_blob_code "$1") != "$2" ]] 2>/dev/null && local status="\e[31m[outdated]\e[0m"
259 [[ -n $(git cherry) ]] 2>/dev/null && local status="\e[31m[ahead]\e[0m" 258 [[ -n $(git cherry) ]] 2>/dev/null && local status="\e[31m[ahead]\e[0m"
260 echo $status 259 echo "$status"
261 fi 260 fi
262 fi 261 fi
263} 262}
264 263
265# Display the list of gist, show username for starred gist 264# Display the list of gist, show username for starred gist
266# If hint=true, print hint to tty. If mark=<pattern>, filter index with regex 265# If hint=true, print hint to tty. If mark=<pattern>, filter index with regex
266# If tag=true, print tags instead or url
267# TODO color private/starred mark 267# TODO color private/starred mark
268_show_list() { 268_show_list() {
269 if [[ -n $1 ]]; then 269 if [[ -n $1 ]]; then
@@ -276,20 +276,19 @@ _show_list() {
276 local input=$INDEX 276 local input=$INDEX
277 fi 277 fi
278 278
279 local prefix=$mark; [[ -z $prefix ]] && prefix=[^s] 279 sed -Ene "/^${mark:-[^s]}/ p" $input \
280 sed -Ene "/^$prefix/ p" $input \
281 | while read -r "${INDEX_FORMAT[@]}"; do 280 | while read -r "${INDEX_FORMAT[@]}"; do
282 local repo; repo=$folder/${url##*/} 281 local repo; repo=$folder/${url##*/}
283 local extra; extra=$(_check_repo_status "$repo" "$blob_code") 282 local extra; extra=$(_check_repo_status "$repo" "$blob_code")
284 [[ -z $extra ]] && extra="$file_num $comment_num" 283 [[ -z $extra ]] && extra="$file_num $comment_num"
285 [[ $index =~ ^s ]] && extra=$(printf "%-12s" $author)${extra} 284 [[ $index =~ ^s ]] && extra=$(printf "%-12s" $author)${extra}
286 hashtags=$(_hashtags "$description") 285 local hashtags=$(_hashtags "$description")
287 description=$(sed -E -e 's/\[(.+)\]/\\e[33m[\1]\\e[0m/' <<<"$description" | sed "s/ $hashtags$//") 286 local description=$(sed -E -e 's/^\[(.+)\]/\\e[33m[\1]\\e[0m/' <<<"$description" | sed "s/ $hashtags$//")
288 [[ $tag == 'true' ]] && url="$hashtags" && local width=45 287 [[ $tag == 'true' ]] && url="$hashtags" && local width=45
289 288
290 raw_output="$(printf "% 3s" "$index") $(printf "%-${width:-56}s" "$url") $extra $description" 289 raw_output="$(printf "% 3s" "$index") $(printf "%-${width:-56}s" "$url") $extra $description"
291 decorator=$(( $(grep -o '\\e\[0m' <<<"$raw_output" | wc -l) *9 )) 290 decorator=$(( $(grep -o '\\e\[0m' <<<"$raw_output" | wc -l) *9 ))
292 echo -e "$raw_output" | cut -c -$(( $(tput cols) +$decorator )) 291 echo -e "$raw_output" | cut -c -$(( $(tput cols) +decorator ))
293 done 292 done
294 293
295 [[ $hint == 'true' ]] && echo -e '\nrun "gist fetch" to update gists or "gist help" for more details' > /dev/tty \ 294 [[ $hint == 'true' ]] && echo -e '\nrun "gist fetch" to update gists or "gist help" for more details' > /dev/tty \
@@ -304,14 +303,14 @@ _grep_content() {
304 if grep --color=always -iq "$1" <<<"$description"; then 303 if grep --color=always -iq "$1" <<<"$description"; then
305 hint=false mark="$index " _show_list | grep --color=always -Ei "$1" 304 hint=false mark="$index " _show_list | grep --color=always -Ei "$1"
306 else 305 else
307 local repo=$folder/$(echo $url | sed -E -e 's#.*/##') 306 local repo=$folder/${url##*/}
308 [[ -d $repo ]] && cd $repo || continue 307 [[ -d $repo ]] && cd $repo || continue
309 local file=$(ls $repo | grep --color=always -Ei "$1") 308 local file=$(ls $repo | grep --color=always -Ei "$1")
310 local content=$(grep --color=always -EHi "$1" * | head -1) 309 local content=$(grep --color=always -EHi "$1" * | head -1)
311 310
312 [[ -n $file && file="$file\n" || -n $content ]] \ 311 [[ -n $file && file="$file\n" || -n $content ]] \
313 && hint=false mark="$index " _show_list \ 312 && hint=false mark="$index " _show_list \
314 && echo -e "$file$content\n" | sed -e 's/^/ /' 313 && echo -e " $file$content\n"
315 fi 314 fi
316 done < $INDEX 315 done < $INDEX
317} 316}
@@ -341,7 +340,7 @@ _parse_response() {
341 local blob_code; blob_code=$(echo "$file_url_array" | tr ',' '\n' | sed -E -e 's#.*raw/(.*)/.*#\1#' | sort | cut -c -7 | paste -s -d '-' -) 340 local blob_code; blob_code=$(echo "$file_url_array" | tr ',' '\n' | sed -E -e 's#.*raw/(.*)/.*#\1#' | sort | cut -c -7 | paste -s -d '-' -)
342 local prefix=$mark; [[ $public == 'False' ]] && prefix=p 341 local prefix=$mark; [[ $public == 'False' ]] && prefix=p
343 [[ -n $1 ]] && local index=${1}; index=${prefix}${index} 342 [[ -n $1 ]] && local index=${1}; index=${prefix}${index}
344 eval echo $(sed -Ee 's/([^ ]+)/$\1/g' <<<"${INDEX_FORMAT[@]}") 343 eval echo ${INDEX_FORMAT[@]/#/$}
345 done 344 done
346} 345}
347 346
@@ -361,8 +360,7 @@ _fetch_gists() {
361 result=$(http_method GET $GITHUB_API/$route?per_page=100 | mark=$mark _parse_response) 360 result=$(http_method GET $GITHUB_API/$route?per_page=100 | mark=$mark _parse_response)
362 [[ -z $result ]] && echo 'Not a single valid gist' && return 0 361 [[ -z $result ]] && echo 'Not a single valid gist' && return 0
363 362
364 local prefix=$mark; [[ -z $prefix ]] && prefix=[^s] 363 sed -i'' -Ee "/^${mark:-[^s]}/ d" $INDEX && echo "$result" >> $INDEX
365 sed -i'' -Ee "/^$prefix/ d" $INDEX && echo "$result" >> $INDEX
366 mark=$mark _show_list 364 mark=$mark _show_list
367 365
368 [[ $auto_sync == 'true' ]] && (_sync_repos "$1" &> /dev/null &) 366 [[ $auto_sync == 'true' ]] && (_sync_repos "$1" &> /dev/null &)
@@ -373,7 +371,7 @@ _fetch_gists() {
373# TODO pagnation for more than 100 gists 371# TODO pagnation for more than 100 gists
374_query_user() { 372_query_user() {
375 local route="users/$1/gists" 373 local route="users/$1/gists"
376 result=$(http_method GET $GITHUB_API/$route?per_page=100 | _parse_response) 374 result="$(http_method GET $GITHUB_API/$route?per_page=100 | _parse_response)"
377 [[ -z $result ]] && echo "Failed to query $1's gists" && return 1 375 [[ -z $result ]] && echo "Failed to query $1's gists" && return 1
378 376
379 echo "$result" \ 377 echo "$result" \
@@ -662,8 +660,8 @@ _tag_gist() {
662 _show_detail $1 | sed 3,6d && echo 660 _show_detail $1 | sed 3,6d && echo
663 local desc="$(_get_desc $1)" 661 local desc="$(_get_desc $1)"
664 local hashtags=$(_hashtags "$desc") 662 local hashtags=$(_hashtags "$desc")
665 read -e -p 'Edit tags: ' -i "$(tr -d '#' <<<"$hashtags")" -r new_tags < /dev/tty 663 read -e -p 'Edit tags: ' -i "${hashtags//'#'/}" -r -a new_tags < /dev/tty
666 local new_hashtags=$(sed -Ee 's/^/#/; s/ / #/g' <<<"$new_tags") 664 local new_hashtags="${new_tags[@]/#/#}"
667 local new_desc=$(sed "s/$hashtags$//; s/ *$/ /" <<<"$desc")${new_hashtags} 665 local new_desc=$(sed "s/$hashtags$//; s/ *$/ /" <<<"$desc")${new_hashtags}
668 (_edit_gist $1 "$new_desc" &>/dev/null &) 666 (_edit_gist $1 "$new_desc" &>/dev/null &)
669 # if user want to filter gists with given tags 667 # if user want to filter gists with given tags