extra: Add cli.git and github.sync.

cli.git is a command-line git wrapper.
github.sync is a way to sync an organization to local disk.
modern-harvey2
Doug Coleman 2017-08-03 18:43:41 -05:00
parent b92a3e109d
commit 21e42a5d3b
3 changed files with 71 additions and 0 deletions

View File

@ -0,0 +1 @@
Doug Coleman

37
extra/cli/git/git.factor Normal file
View File

@ -0,0 +1,37 @@
! Copyright (C) 2017 Doug Coleman.
! See http://factorcode.org/license.txt for BSD license.
USING: arrays concurrency.combinators concurrency.semaphores fry
io.directories io.files.info io.launcher io.pathnames kernel
math namespaces sequences splitting system-info ;
IN: cli.git
SYMBOL: cli-git-num-parallel
cli-git-num-parallel [ cpus 2 * ] initialize
: git-clone-as ( ssh-url path -- process )
[ { "git" "clone" } ] 2dip 2array append run-process ;
: git-clone ( ssh-url -- process )
[ { "git" "clone" } ] dip suffix run-process ;
: git-pull ( path -- process )
[ { "git" "pull" } run-process ] with-directory ;
: git-repository? ( directory -- ? )
".git" append-path current-directory get prepend-path
?file-info dup [ directory? ] when ;
: repository-url>name ( string -- string' )
file-name ".git" ?tail drop ;
: update-repository ( url -- process )
dup repository-url>name git-repository?
[ repository-url>name git-pull ] [ git-clone ] if ;
: sync-repositories ( directory urls -- )
'[
_ cli-git-num-parallel get <semaphore> '[
_ [ update-repository ] with-semaphore
] parallel-each
] with-ensure-directory ;

View File

@ -0,0 +1,33 @@
! Copyright (C) 2017 Doug Coleman.
! See http://factorcode.org/license.txt for BSD license.
USING: assocs cli.git concurrency.combinators
concurrency.semaphores formatting fry http.client io
io.directories json.reader kernel locals math namespaces
sequences ;
IN: github
SYMBOL: github-username
SYMBOL: github-token
:: get-organization-repositories-with-credentials ( organization username token -- seq )
0 [ dup ] [
1 + dup
[ username token organization ] dip
"https://%s:%s@api.github.com/orgs/%s/repos?per_page=100&page=%d" sprintf http-get nip json>
dup empty? [ 2drop f f ] [ ] if
] produce nip concat ;
: get-organization-repositories ( organization -- seq )
github-username get
github-token get
get-organization-repositories-with-credentials ;
: sync-organization-with-credentials ( directory organization username token -- )
get-organization-repositories-with-credentials
[ "ssh_url" of ] map sync-repositories ;
: sync-organization ( directory organization -- )
github-username get
github-token get
sync-organization-with-credentials ;