summaryrefslogtreecommitdiff
path: root/save.pl~
diff options
context:
space:
mode:
Diffstat (limited to 'save.pl~')
-rw-r--r--save.pl~82
1 files changed, 82 insertions, 0 deletions
diff --git a/save.pl~ b/save.pl~
new file mode 100644
index 0000000..1a720c4
--- /dev/null
+++ b/save.pl~
@@ -0,0 +1,82 @@
+:- consult(pce_file_search_path).
+:- consult(library(pce)).
+:- consult(library(process)).
+
+main :-
+ pce_main_loop(main).
+
+main(_Argv) :-
+ init.
+
+init :-
+ shell("git add .", Status),
+ added(Status).
+
+added(1) :-
+ send(@display, report, error,
+ 'Files could not be added to index.
+Ensure Git is in PATH.').
+
+added(0) :-
+ %send(@pce, load_defaults, 'Defaults'),
+ new(D, dialog('Save')),
+
+ % File browser.
+ new(C, chain),
+ status(C),
+ send(new(B, browser), right, D),
+ send(B, members(C)),
+
+ % Input fields.
+ send(D, append, text('Commit message (optional):',
+ left,
+ bold)),
+ send(D, append, new(E, editor)),
+ send(D, append, button(save,
+ and(message(@prolog, save, E, C),
+ message(D, destroy)))),
+ send(D, append, button(cancel,
+ and(message(@prolog, reset),
+ message(D, destroy)))),
+ send(D, open).
+
+reset :-
+ shell("git reset").
+
+status(C) :-
+ setup_call_cleanup(
+ process_create(path(git), ['status', '--porcelain'],
+ [stdout(pipe(Out))]),
+ read_to_chain(Out, C),
+ close(Out)).
+
+read_to_chain(S, C) :-
+ read_line_to_codes(S, Cs),
+ ( Cs == end_of_file
+ -> true
+ ; atom_codes(A, Cs),
+ send(C, append, A),
+ read_to_chain(S, C)
+ ).
+
+save(Editor, Chain) :-
+ get(Editor?text_buffer, contents, S),
+ send(S, strip),
+ get(S, value, Msg),
+ ( Msg == ''
+ -> chain_atom(Chain, A),
+ commit(A)
+ ; commit(Msg)
+ ).
+
+chain_atom(C, A) :-
+ chain_atom_x(C, '', A).
+
+chain_atom_x(C, A0, A) :-
+ ( get(C, delete_head, A1),
+ atom_concat(A0, A1, A2),
+ atom_concat(A2, '
+', A3),
+ chain_atom_x(C, A3, A)
+ ; A = A0
+ ).