summaryrefslogtreecommitdiffhomepage
path: root/scripts/gist
blob: cde4ec79b76b15b4350b1bcd63bd3a4bb5b6b87a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#!/bin/bash

# define your environmemnts here
github_api_token=$(cat $SETTING_DIR/tokens/github)
user=typebrook
folder=~/git/gist

github_api=https://api.github.com
auth_header="Authorization: token $github_api_token"
mkdir -p $folder
index=$folder/index

# get the list of gists
_update() {
    curl -s -H "$auth_header" $github_api/users/$user/gists |\
    tee keep |\
    jq '.[] | "\( .html_url ) \(.files | keys | length) \(.comments) \( .description )"' |\
    tr -d '"' | tac | nl |\
    while read line_num link file_num comment_num description; do
        echo $line_num $link $file_num $comment_num $(echo $description | cut -c -70)
    done | tee $index
}

# clone repos which are not in the local
# TODO pull if repo is outdated
_sync_repos() {
    comm -13 <(find $folder -maxdepth 1 -type d | sed '1d; s#.*/##' | sort) \
             <(cat $index | cut -d' ' -f2 | sed 's#.*/##' | sort) |\
    xargs -I{} git clone git@github.com:{}.git $folder/{}
}

_goto_gist() {
    gist_num=$(wc -l $index | cut -d' ' -f1)
    if [[ ! "$1" =~ [0-9]+ ]] || (( $1 > $gist_num )); then
        echo Not a valid gist number: $1
        echo Use the number in the first column instead:
        echo
        cat $index
        return 0
    fi

    GIST_ID=$(cat $index | sed -n "$1"p | cut -d' ' -f2 | sed -r 's#.*/##')
    echo This gist is at $folder/$GIST_ID
    cd $folder/$GIST_ID && tig --all 2> /dev/null
}

_delete_gist() {
    GIST_ID=$(cat $index | sed -n "$1"p | cut -d' ' -f2 | sed -r 's#.*/##')
    curl -X DELETE -s -H "$auth_header" $github_api/gists/$GIST_ID && \
    _update
}

# remove repos which are not in user gists anymore
_clean_repos() {
    comm -23 <(find $folder -maxdepth 1 -type d | sed '1d; s#.*/##' | sort) \
             <(cat $index | cut -d' ' -f2 | sed 's#.*/##' | sort) |\
    xargs -I{} rm -rf $folder/{}
}

_show_detail() {
    GIST_ID=$(cat $index | sed -n "$1"p | cut -d' ' -f2 | sed -r 's#.*/##')
    curl -s -H "$auth_header" $github_api/gists/$GIST_ID |\
    jq '{site: .html_url, API: .url, created_at: .created_at, updated_at: .updated_at, files: (.files | keys)}'

    curl -s -H "$auth_header" $github_api/gists/$GIST_ID/comments |\
    jq '.[] | {user: .user.login, created_at: .created_at, updated_at: .updated_at, body: .body}'
}

# create a new gist with a file and description
# TODO support folder of files
_create_gist() {
    FILE=$(basename $1)

    jq --arg FILE "$FILE" --arg DESC "$2" '. as $content | {
        public: true, 
        files: {
            ($FILE): {content: $content}
        },
        description: ($DESC)
    }' -R -s $1 |\
    curl -s -H "$auth_header" --data @- $github_api/gists > /dev/null && \
    _update
}

# update description of a gist
_edit_gist() {
    GIST_ID=$(cat $index | sed -n "$1"p | cut -d' ' -f2 | sed -r 's#.*/##')

    jq -n --arg DESC "$2" '{ description: ($DESC) }' |\
    curl -X PATCH -H "$auth_header" --data @- $github_api/gists/$GIST_ID > /dev/null && \
    _update
}

case "$1" in
  "")
    cat $index
    ;;
  create | c)
    _create_gist "$2" "$3"
    ;;
  edit | e)
    _edit_gist "$2" "$3"
    ;;
  update | u)
    _update
    ;;
  sync | s)
    _sync_repos
    ;;
  detail | d)
    _show_detail "$2"
    ;;
  delete | D)
    _delete_gist "$2"
    ;;
  clean | C)
    _clean_repos
    ;;
  *)
    _goto_gist "$1"
    ;;
esac