diff options
| author | typebrook <typebrook@gmail.com> | 2020-01-22 15:42:58 +0800 |
|---|---|---|
| committer | typebrook <typebrook@gmail.com> | 2020-01-22 15:42:58 +0800 |
| commit | b7ce476f3eb425754427445901ff813925fffdd8 (patch) | |
| tree | 5a93b74ebce50d517ed756aafe4e3803cbf278d8 | |
| parent | 42a220d70b28141e0ba39f86a3b1d236d2545849 (diff) | |
update
| -rwxr-xr-x | gist | 96 |
1 files changed, 73 insertions, 23 deletions
| @@ -14,7 +14,7 @@ | |||
| 14 | # gist (update | u) [star | s] | 14 | # gist (update | u) [star | s] |
| 15 | # | 15 | # |
| 16 | # * list your gists with format: [number] [url] [file_num] [comment_num] [short description] | 16 | # * list your gists with format: [number] [url] [file_num] [comment_num] [short description] |
| 17 | # gist | 17 | # gist [star | s] |
| 18 | # | 18 | # |
| 19 | # * clone gist repos which are not in local | 19 | # * clone gist repos which are not in local |
| 20 | # * pull master branch if a local repo is behind its remote | 20 | # * pull master branch if a local repo is behind its remote |
| @@ -48,31 +48,52 @@ | |||
| 48 | # * show this help message | 48 | # * show this help message |
| 49 | # gist (help | h) | 49 | # gist (help | h) |
| 50 | 50 | ||
| 51 | # define your environmemnts here | 51 | # TODO pipe syntax fix |
| 52 | # TODO support auth prompt, remove personal info here | ||
| 53 | # TODO error handling, unit test | 52 | # TODO error handling, unit test |
| 54 | # TODO parallel branch works with json parsing on python | 53 | # TODO parallel branch works with json parsing on python |
| 55 | # TODO parallel branch works with wget and other stuff | 54 | # TODO parallel branch works with wget and other stuff |
| 56 | # completion | 55 | # TODO completion |
| 57 | #------------------- | 56 | |
| 58 | github_api_token=$(cat $SETTING_DIR/tokens/github) | 57 | # Validate settings. |
| 59 | user=typebrook | 58 | config=~/.config/gistrc |
| 60 | folder=~/git/gist | 59 | [ "$TRACE" ] && set -x |
| 61 | #------------------- | 60 | |
| 61 | # TODO error handling while password is not true | ||
| 62 | _auth() { | ||
| 63 | data="{\"scopes\":[\"gist\"], \"note\": \"gist-$(date -u +'%Y-%m-%dT%H:%M:%SZ')\"}" | ||
| 64 | read -p "Github username: " user | ||
| 65 | read -sp "Github password: " password | ||
| 66 | mkdir -p ~/.config && umask 0077 && echo user=$user > $config | ||
| 67 | |||
| 68 | curl https://api.github.com/authorizations \ | ||
| 69 | --user "$user:$password" \ | ||
| 70 | --data "$data" > /dev/null | ||
| 71 | |||
| 72 | read -p "2-factor code: " OTP | ||
| 73 | curl https://api.github.com/authorizations \ | ||
| 74 | --user "$user:$password" -H "X-GitHub-OTP: $OTP" \ | ||
| 75 | --data "$data" |\ | ||
| 76 | sed '1 s/[^{]//g' | jq -r .token |\ | ||
| 77 | sed 's/^/token=/' >> $config | ||
| 78 | } | ||
| 79 | |||
| 80 | while ! source $config; do | ||
| 81 | _auth | ||
| 82 | done | ||
| 62 | 83 | ||
| 63 | github_api=https://api.github.com | 84 | github_api=https://api.github.com |
| 64 | auth_header="Authorization: token $github_api_token" | 85 | auth_header="Authorization: token $token" |
| 86 | |||
| 87 | [[ -z "$folder" ]] && folder=~/git/gist | ||
| 65 | mkdir -p $folder | 88 | mkdir -p $folder |
| 66 | index=$folder/index | 89 | index=$folder/index |
| 67 | starred=$folder/starred | 90 | starred=$folder/starred |
| 68 | 91 | ||
| 69 | # Validate settings. | ||
| 70 | [ "$TRACE" ] && set -x | ||
| 71 | |||
| 72 | # Show the list of gist, but not updated time | 92 | # Show the list of gist, but not updated time |
| 93 | # TODO a way to show files | ||
| 73 | # TODO show git status outdated | 94 | # TODO show git status outdated |
| 74 | _show_list() { | 95 | _show_list() { |
| 75 | if [[ ! -e $1 ]]; then | 96 | if [[ ! -e "$1" ]]; then |
| 76 | echo No local file found for last update | 97 | echo No local file found for last update |
| 77 | echo Please run command: | 98 | echo Please run command: |
| 78 | echo " gist update" | 99 | echo " gist update" |
| @@ -106,7 +127,7 @@ _update() { | |||
| 106 | curl -s -H "$auth_header" $github_api/$route |\ | 127 | curl -s -H "$auth_header" $github_api/$route |\ |
| 107 | _parse_response | nl -s' ' | sed -E "s/^ */$mark/" > $list_file && \ | 128 | _parse_response | nl -s' ' | sed -E "s/^ */$mark/" > $list_file && \ |
| 108 | _show_list $list_file | 129 | _show_list $list_file |
| 109 | (_sync_repos $1 > /dev/null 2>&1 &) | 130 | if [[ $auto_sync != "false" ]]; then (_sync_repos $1 > /dev/null 2>&1 &); fi |
| 110 | } | 131 | } |
| 111 | 132 | ||
| 112 | # TODO check if a user create a very first gist | 133 | # TODO check if a user create a very first gist |
| @@ -144,7 +165,7 @@ _sync_repos() { | |||
| 144 | 165 | ||
| 145 | _gist_id() { | 166 | _gist_id() { |
| 146 | GIST_ID=$(cat $index $starred | sed -n "/^$1 / p" | cut -d' ' -f2 | sed -E 's#.*/##') | 167 | GIST_ID=$(cat $index $starred | sed -n "/^$1 / p" | cut -d' ' -f2 | sed -E 's#.*/##') |
| 147 | if [[ -z $GIST_ID ]]; then | 168 | if [[ -z "$GIST_ID" ]]; then |
| 148 | echo -e "Not a valid index: \e[31m$1\e[0m" | 169 | echo -e "Not a valid index: \e[31m$1\e[0m" |
| 149 | echo Use the index number in the first column instead: | 170 | echo Use the index number in the first column instead: |
| 150 | echo | 171 | echo |
| @@ -153,7 +174,7 @@ _gist_id() { | |||
| 153 | fi | 174 | fi |
| 154 | } | 175 | } |
| 155 | 176 | ||
| 156 | # FIXME error handling | 177 | # FIXME error handling, if repo not cloned yet |
| 157 | _goto_gist() { | 178 | _goto_gist() { |
| 158 | _gist_id $1 | 179 | _gist_id $1 |
| 159 | echo This gist is at $folder/$GIST_ID | 180 | echo This gist is at $folder/$GIST_ID |
| @@ -192,7 +213,7 @@ _show_detail() { | |||
| 192 | } | 213 | } |
| 193 | 214 | ||
| 194 | _set_gist() { | 215 | _set_gist() { |
| 195 | while [[ "$1" =~ ^- && ! "$1" == "--" ]]; do case $1 in | 216 | while [[ "$1" =~ ^- && "$1" != "--" ]]; do case $1 in |
| 196 | -d | --desc) | 217 | -d | --desc) |
| 197 | description="$2" | 218 | description="$2" |
| 198 | shift; shift;; | 219 | shift; shift;; |
| @@ -202,7 +223,7 @@ _set_gist() { | |||
| 202 | esac | 223 | esac |
| 203 | done | 224 | done |
| 204 | if [[ "$1" == '--' ]]; then shift; fi | 225 | if [[ "$1" == '--' ]]; then shift; fi |
| 205 | files=$@ | 226 | files="$@" && echo $files | xargs ls > /dev/null || exit 1 |
| 206 | } | 227 | } |
| 207 | 228 | ||
| 208 | _new_file() { | 229 | _new_file() { |
| @@ -216,11 +237,11 @@ _new_file() { | |||
| 216 | } | 237 | } |
| 217 | 238 | ||
| 218 | # create a new gist with files | 239 | # create a new gist with files |
| 219 | # FIXME error handling if gist is not created | 240 | # FIXME error handling if gist is not created, file doesn't exist |
| 220 | _create_gist() { | 241 | _create_gist() { |
| 221 | _set_gist "$@" | 242 | _set_gist "$@" |
| 222 | [[ -z $files ]] && files=$(_new_file $filename) | 243 | [[ -z "$files" ]] && files=$(_new_file $filename) |
| 223 | [[ -z $description ]] && echo -n 'Type description: ' && read description | 244 | [[ -z "$description" ]] && echo -n 'Type description: ' && read description |
| 224 | 245 | ||
| 225 | for file in $files; do | 246 | for file in $files; do |
| 226 | FILE=$(basename $file) | 247 | FILE=$(basename $file) |
| @@ -254,6 +275,31 @@ _help_message() { | |||
| 254 | sed -E -n ' /^$/ q; 8,$ s/^#//p' $0 | 275 | sed -E -n ' /^$/ q; 8,$ s/^#//p' $0 |
| 255 | } | 276 | } |
| 256 | 277 | ||
| 278 | _cases() { | ||
| 279 | if [[ $1 == 'token' ]]; then | ||
| 280 | [[ ${#2} -eq 40 ]] && echo token=$2 ||\ | ||
| 281 | echo Invalid token format, it is not 40 chars '\n' > /dev/tty | ||
| 282 | elif [[ $1 == 'auto_sync' ]]; then | ||
| 283 | [[ $2 == 'false' ]] && echo $1=$2 ||\ | ||
| 284 | echo $1=true | ||
| 285 | elif [[ $1 == 'folder' ]]; then | ||
| 286 | [[ -n "$2" ]] && echo $1=$2 ||\ | ||
| 287 | echo $1=~/gist | ||
| 288 | elif [[ $1 == 'user' ]]; then | ||
| 289 | echo $1=$2 | ||
| 290 | fi | ||
| 291 | } | ||
| 292 | |||
| 293 | # TODO consider the case that $2 is empty -> remove original setting | ||
| 294 | _configure() { | ||
| 295 | [[ -z "$@" ]] && (vim $config) && exit 0 | ||
| 296 | target=$(_cases "$@") | ||
| 297 | |||
| 298 | [[ "$target" =~ [^=]$ ]] && sed -i "/^$1=/ d" $config && echo $target >> $config | ||
| 299 | cat $config | ||
| 300 | } | ||
| 301 | |||
| 302 | |||
| 257 | case "$1" in | 303 | case "$1" in |
| 258 | "") | 304 | "") |
| 259 | _show_list $index ;; | 305 | _show_list $index ;; |
| @@ -269,12 +315,16 @@ case "$1" in | |||
| 269 | sync | S) | 315 | sync | S) |
| 270 | _sync_repos ;; | 316 | _sync_repos ;; |
| 271 | detail | d) | 317 | detail | d) |
| 272 | _show_detail "$2" ;; | 318 | shift |
| 319 | _show_detail "$@" ;; | ||
| 273 | delete | D) | 320 | delete | D) |
| 274 | shift | 321 | shift |
| 275 | _delete_gist "$@" ;; | 322 | _delete_gist "$@" ;; |
| 276 | clean | C) | 323 | clean | C) |
| 277 | _clean_repos ;; | 324 | _clean_repos ;; |
| 325 | config | c) | ||
| 326 | shift | ||
| 327 | _configure "$@" ;; | ||
| 278 | help | h) | 328 | help | h) |
| 279 | _help_message ;; | 329 | _help_message ;; |
| 280 | *) | 330 | *) |