Moved back to realtime update model.
* Using patched version of Jansi. * Raw ANSI controls always sent to play well with Nailgun.
This commit is contained in:
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+3
-3
@@ -1,5 +1,5 @@
|
|||||||
#Thu, 08 Aug 2013 19:52:35 -0500
|
#Thu, 08 Aug 2013 23:12:38 -0500
|
||||||
lib.local=true
|
lib.local=true
|
||||||
name=timestamper-cli
|
name=timestamper-cli
|
||||||
version=0.1
|
version=0.2
|
||||||
build.number=29
|
build.number=13
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.jdblabs.timestamper.cli
|
package com.jdblabs.timestamper.cli
|
||||||
|
|
||||||
|
import com.jdbernard.io.NonBlockingInputStreamReader
|
||||||
import com.jdbernard.util.SmartConfig
|
import com.jdbernard.util.SmartConfig
|
||||||
import com.jdbernard.util.LightOptionParser
|
import com.jdbernard.util.LightOptionParser
|
||||||
import com.jdblabs.timestamper.core.Timeline
|
import com.jdblabs.timestamper.core.Timeline
|
||||||
@@ -43,7 +44,7 @@ public class TimeStamperCLI {
|
|||||||
protected static doMain(TimeStamperCLI inst, String[] args,
|
protected static doMain(TimeStamperCLI inst, String[] args,
|
||||||
def sin, def out, def err) {
|
def sin, def out, def err) {
|
||||||
|
|
||||||
out = new PrintStream(AnsiConsole.wrapOutputStream(out))
|
//out = new PrintStream(AnsiConsole.wrapOutputStream(out))
|
||||||
def opts = LightOptionParser.parseOptions(cli, args as List)
|
def opts = LightOptionParser.parseOptions(cli, args as List)
|
||||||
|
|
||||||
File workingDir = new File(opts.d ?: '.')
|
File workingDir = new File(opts.d ?: '.')
|
||||||
@@ -84,87 +85,110 @@ public class TimeStamperCLI {
|
|||||||
|
|
||||||
//out.println ""
|
//out.println ""
|
||||||
def currentMarker = timeline.getLastMarker(new Date())
|
def currentMarker = timeline.getLastMarker(new Date())
|
||||||
Reader reader = new InputStreamReader(sin)
|
def reader = new NonBlockingInputStreamReader(sin)
|
||||||
|
Thread readerThread = new Thread(reader)
|
||||||
|
readerThread.start()
|
||||||
|
|
||||||
boolean running = true
|
boolean running = true
|
||||||
|
|
||||||
|
def blockingReadLine = {
|
||||||
|
String line = null;
|
||||||
|
while (line == null && readerThread.isAlive()) {
|
||||||
|
line = reader.readLine()
|
||||||
|
|
||||||
|
Thread.sleep(200) }
|
||||||
|
|
||||||
|
return line }
|
||||||
|
|
||||||
def readNotes = {
|
def readNotes = {
|
||||||
out.println(ansi().fg(YELLOW).
|
out.println(ansi().fg(YELLOW).
|
||||||
a("Notes (end with EOF or a blank line):").reset())
|
a("Notes (end with EOF or a blank line):").reset())
|
||||||
|
out.flush();
|
||||||
|
|
||||||
String notes = ""
|
String notes = ""
|
||||||
String line = null
|
String line = null
|
||||||
line = reader.readLine()
|
line = blockingReadLine()
|
||||||
|
|
||||||
while(line != "" && line != "EOF" && line != null) {
|
while(line != "" && line != "EOF" && line != null) {
|
||||||
notes += line + EOL
|
notes += line + EOL
|
||||||
line = reader.readLine() }
|
line = blockingReadLine() }
|
||||||
|
|
||||||
return notes
|
return notes }
|
||||||
}
|
|
||||||
|
def printPrompt = {
|
||||||
|
out.print(formatMarker(currentMarker) + EOL +
|
||||||
|
ansi().fg(YELLOW).a("> ").reset())
|
||||||
|
out.flush() }
|
||||||
|
|
||||||
String line = null
|
String line = null
|
||||||
|
|
||||||
while (running) {
|
printPrompt()
|
||||||
|
while (running && readerThread.isAlive()) {
|
||||||
|
|
||||||
out.println formatMarker(currentMarker)
|
// Handle user input
|
||||||
out.print(ansi().fg(YELLOW).a("> ").reset())
|
|
||||||
out.flush();
|
|
||||||
|
|
||||||
// Handle user input
|
|
||||||
line = reader.readLine()
|
line = reader.readLine()
|
||||||
|
if (line != null) {
|
||||||
switch (line) {
|
out.flush();
|
||||||
|
switch (line) {
|
||||||
|
case ~/quit|exit|\u0004/:
|
||||||
|
running = false;
|
||||||
|
break
|
||||||
|
|
||||||
case null:
|
case ~/n|new/:
|
||||||
case ~/quit|exit|\u0004/:
|
|
||||||
running = false;
|
|
||||||
break
|
|
||||||
|
|
||||||
case ~/r|refresh|^$/:
|
// Read mark
|
||||||
out.print(ansi().eraseLine().cursorUp(2).eraseLine())
|
out.println(ansi().fg(YELLOW).a("New timestamp:").reset())
|
||||||
break
|
String mark = blockingReadLine()
|
||||||
|
|
||||||
case ~/n|new/:
|
// Read notes
|
||||||
|
String notes = readNotes();
|
||||||
|
|
||||||
// Read mark
|
// Create marker
|
||||||
out.println(ansi().fg(YELLOW).a("New timestamp:").reset())
|
currentMarker = new TimelineMarker(new Date(), mark, notes)
|
||||||
String mark = reader.readLine()
|
timeline.addMarker(currentMarker)
|
||||||
|
if (timelineProperties.persistOnUpdate)
|
||||||
|
timelineProperties.save()
|
||||||
|
break
|
||||||
|
|
||||||
// Read notes
|
case ~/h|help/:
|
||||||
String notes = readNotes();
|
out.println(ansi().fg(RED).
|
||||||
|
a("Not yet implemented.").reset());
|
||||||
|
break
|
||||||
|
|
||||||
// Create marker
|
case ~/l|list|history/:
|
||||||
currentMarker = new TimelineMarker(new Date(), mark, notes)
|
out.println(ansi().fg(RED).
|
||||||
timeline.addMarker(currentMarker)
|
a("Not yet implemented.").reset());
|
||||||
if (timelineProperties.persistOnUpdate)
|
break
|
||||||
|
|
||||||
|
case ~/s|save/:
|
||||||
timelineProperties.save()
|
timelineProperties.save()
|
||||||
break
|
break
|
||||||
|
|
||||||
case ~/h|help/:
|
default:
|
||||||
out.println(ansi().eraseLine().
|
String notes = readNotes()
|
||||||
fg(RED).a("Not yet implemented."));
|
currentMarker = new TimelineMarker(new Date(), line, notes)
|
||||||
break
|
timeline.addMarker(currentMarker)
|
||||||
|
if (timelineProperties.persistOnUpdate)
|
||||||
case ~/l|list|history/:
|
timelineProperties.save()
|
||||||
out.println(ansi().eraseLine().
|
break
|
||||||
fg(RED).a("Not yet implemented."));
|
}
|
||||||
break
|
printPrompt()
|
||||||
|
} else {
|
||||||
case ~/s|save/:
|
out.print(ansi().saveCursorPosition().cursorUpLine().eraseLine().toString() +
|
||||||
timelineProperties.save()
|
formatMarker(currentMarker) +
|
||||||
break
|
ansi().cursorDown(1).restorCursorPosition().toString())
|
||||||
|
out.flush();
|
||||||
default:
|
|
||||||
String notes = readNotes()
|
Thread.sleep(200)
|
||||||
currentMarker = new TimelineMarker(new Date(), line, notes)
|
|
||||||
timeline.addMarker(currentMarker)
|
|
||||||
if (timelineProperties.persistOnUpdate)
|
|
||||||
timelineProperties.save()
|
|
||||||
break
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (readerThread.isAlive()) {
|
||||||
|
readerThread.interrupt();
|
||||||
|
readerThread.join(500);
|
||||||
|
if (readerThread.isAlive()) readerThread.stop(); }
|
||||||
|
|
||||||
|
out.println ""
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static String formatMarker(TimelineMarker tm) {
|
protected static String formatMarker(TimelineMarker tm) {
|
||||||
|
|||||||
Reference in New Issue
Block a user