USING: accessors combinators.cleave combinators.short-circuit concurrency.combinators destructors fry io io.directories io.encodings io.encodings.utf8 io.launcher io.monitors io.pathnames io.pipes io.ports kernel locals math namespaces sequences splitting strings threads ui ui.gadgets ui.gadgets.buttons ui.gadgets.editors ui.gadgets.labels ui.gadgets.packs ui.gadgets.tracks ; IN: git-tool ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! : head** ( seq obj -- seq/f ) dup number? [ head ] [ dupd find drop head ] if ; : tail** ( seq obj -- seq/f ) dup number? [ tail ] [ dupd find drop [ tail ] [ drop f ] if* ] if ; ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! :: ( DESC -- process stream stream ) [ [let | STDOUT-PIPE [ (pipe) |dispose ] STDERR-PIPE [ (pipe) |dispose ] | [let | PROCESS [ DESC >process ] | PROCESS [ STDOUT-PIPE out>> or ] change-stdout [ STDERR-PIPE out>> or ] change-stderr run-detached STDOUT-PIPE out>> dispose STDERR-PIPE out>> dispose STDOUT-PIPE in>> utf8 STDERR-PIPE in>> utf8 ] ] ] with-destructors ; ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! : run-process/result ( desc -- process ) { [ contents [ string-lines ] [ f ] if* ] [ contents [ string-lines ] [ f ] if* ] } parallel-spread [ >>stdout ] [ >>stderr ] bi* dup wait-for-process >>status ; ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! process popup windows ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! : popup-window ( title contents -- ) dup string? [ ] [ "\n" join ] if tuck set-editor-string swap open-window ; : popup-process-window ( process -- ) [ stdout>> [ "output" swap popup-window ] when* ] [ stderr>> [ "error" swap popup-window ] when* ] [ [ stdout>> ] [ stderr>> ] bi or not [ "Process" "NO OUTPUT" popup-window ] when ] tri ; : popup-if-error ( process -- ) { [ status>> 0 = not ] [ popup-process-window t ] } 1&& drop ; ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! :: git-process ( REPO DESC -- process ) REPO [ DESC run-process/result ] with-directory ; ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! : git-status-section ( lines section -- lines/f ) '[ _ = ] tail** [ [ "#\t" head? ] tail** [ "#\t" head? not ] head** [ 2 tail ] map ] [ f ] if* ; ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! : colon ( -- ch ) CHAR: : ; : space ( -- ch ) 32 ; : git-status-line-file ( line -- file ) { [ colon = ] 1 [ space = not ] } [ tail** ] each ; ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! TUPLE: repository to-commit-new to-commit-modified to-commit-deleted modified deleted untracked ; ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! : check-empty ( seq -- seq/f ) dup empty? [ drop f ] when ; ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! :: refresh-git-status ( STATUS -- STATUS ) [let | LINES [ STATUS repository>> { "git" "status" } git-process stdout>> ] | STATUS LINES "# Changes to be committed:" git-status-section [ "new file:" head? ] filter [ git-status-line-file ] map check-empty >>to-commit-new LINES "# Changes to be committed:" git-status-section [ "modified:" head? ] filter [ git-status-line-file ] map check-empty >>to-commit-modified LINES "# Changes to be committed:" git-status-section [ "deleted:" head? ] filter [ git-status-line-file ] map check-empty >>to-commit-deleted LINES "# Changed but not updated:" git-status-section [ "modified:" head? ] filter [ git-status-line-file ] map check-empty >>modified LINES "# Changed but not updated:" git-status-section [ "deleted:" head? ] filter [ git-status-line-file ] map check-empty >>deleted LINES "# Untracked files:" git-status-section >>untracked ] ; ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! :: git-status ( REPO -- ) new REPO >>repository refresh-git-status ; ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! :: factor-git-status ( -- ) "resource:" git-status ; ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! git-tool ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! : to-commit ( -- seq ) { to-commit-new>> to-commit-modified>> to-commit-deleted>> } 1arr concat ; ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! :: refresh-status-pile ( STATUS PILE -- ) STATUS refresh-git-status drop PILE clear-gadget PILE ! Commit section [wlet | add-commit-path-button [| TEXT PATH | { 1 0 } TEXT