Compare commits
4 Commits
Author | SHA1 | Date | |
---|---|---|---|
269a9b9125 | |||
76bf676c2c | |||
284a4159d1 | |||
e4a756baf5 |
12
build.xml
12
build.xml
@ -4,4 +4,16 @@
|
||||
<property file="project.properties"/>
|
||||
<import file="jdb-build-1.10.xml"/>
|
||||
|
||||
<target name="package" depends="build">
|
||||
<property name="package.dir" value="${build.dir}/${name}-${version}"/>
|
||||
<mkdir dir="${package.dir}/lib"/>
|
||||
<copy file="${build.dir}/${name}-${version}.${build.number}.jar"
|
||||
tofile="${package.dir}/${name}-${version}.jar"/>
|
||||
<copy todir="${package.dir}/lib">
|
||||
<fileset dir="${build.dir}/lib/runtime/jar"/>
|
||||
</copy>
|
||||
<zip basedir="${build.dir}" includes="${name}-${version}/"
|
||||
destfile="${build.dir}/${name}-${version}.zip"/>
|
||||
|
||||
</target>
|
||||
</project>
|
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
lib/compile/jar/jdb-util-2.0.jar
Normal file
BIN
lib/compile/jar/jdb-util-2.0.jar
Normal file
Binary file not shown.
Binary file not shown.
BIN
lib/compile/jar/timestamper-lib-1.3.jar
Normal file
BIN
lib/compile/jar/timestamper-lib-1.3.jar
Normal file
Binary file not shown.
BIN
lib/runtime/jar/commons-beanutils-1.8.0.jar
Normal file
BIN
lib/runtime/jar/commons-beanutils-1.8.0.jar
Normal file
Binary file not shown.
BIN
lib/runtime/jar/commons-codec-1.4.jar
Normal file
BIN
lib/runtime/jar/commons-codec-1.4.jar
Normal file
Binary file not shown.
BIN
lib/runtime/jar/commons-collections-3.2.1.jar
Normal file
BIN
lib/runtime/jar/commons-collections-3.2.1.jar
Normal file
Binary file not shown.
BIN
lib/runtime/jar/commons-lang-2.4.jar
Normal file
BIN
lib/runtime/jar/commons-lang-2.4.jar
Normal file
Binary file not shown.
BIN
lib/runtime/jar/ezmorph-1.0.6.jar
Normal file
BIN
lib/runtime/jar/ezmorph-1.0.6.jar
Normal file
Binary file not shown.
BIN
lib/runtime/jar/http-builder-0.5.1.jar
Normal file
BIN
lib/runtime/jar/http-builder-0.5.1.jar
Normal file
Binary file not shown.
BIN
lib/runtime/jar/httpclient-4.1.1.jar
Normal file
BIN
lib/runtime/jar/httpclient-4.1.1.jar
Normal file
Binary file not shown.
BIN
lib/runtime/jar/httpclient-cache-4.1.1.jar
Normal file
BIN
lib/runtime/jar/httpclient-cache-4.1.1.jar
Normal file
Binary file not shown.
BIN
lib/runtime/jar/httpcore-4.1.jar
Normal file
BIN
lib/runtime/jar/httpcore-4.1.jar
Normal file
Binary file not shown.
BIN
lib/runtime/jar/httpmime-4.1.1.jar
Normal file
BIN
lib/runtime/jar/httpmime-4.1.1.jar
Normal file
Binary file not shown.
Binary file not shown.
BIN
lib/runtime/jar/jcl-over-slf4j-1.6.1.jar
Normal file
BIN
lib/runtime/jar/jcl-over-slf4j-1.6.1.jar
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
lib/runtime/jar/jdb-util-2.0.jar
Normal file
BIN
lib/runtime/jar/jdb-util-2.0.jar
Normal file
Binary file not shown.
BIN
lib/runtime/jar/json-lib-2.3-jdk15.jar
Normal file
BIN
lib/runtime/jar/json-lib-2.3-jdk15.jar
Normal file
Binary file not shown.
BIN
lib/runtime/jar/nekohtml-1.9.9.jar
Normal file
BIN
lib/runtime/jar/nekohtml-1.9.9.jar
Normal file
Binary file not shown.
Binary file not shown.
BIN
lib/runtime/jar/timestamper-lib-1.3.jar
Normal file
BIN
lib/runtime/jar/timestamper-lib-1.3.jar
Normal file
Binary file not shown.
BIN
lib/runtime/jar/xercesImpl-2.8.1.jar
Normal file
BIN
lib/runtime/jar/xercesImpl-2.8.1.jar
Normal file
Binary file not shown.
BIN
lib/runtime/jar/xml-apis-1.3.04.jar
Normal file
BIN
lib/runtime/jar/xml-apis-1.3.04.jar
Normal file
Binary file not shown.
BIN
lib/runtime/jar/xml-resolver-1.2.jar
Normal file
BIN
lib/runtime/jar/xml-resolver-1.2.jar
Normal file
Binary file not shown.
@ -1,5 +1,5 @@
|
||||
#Thu, 08 Aug 2013 19:52:35 -0500
|
||||
#Fri, 13 Sep 2013 08:55:20 -0500
|
||||
lib.local=true
|
||||
name=timestamper-cli
|
||||
version=0.1
|
||||
build.number=29
|
||||
version=0.5
|
||||
build.number=0
|
||||
|
@ -1,5 +1,6 @@
|
||||
package com.jdblabs.timestamper.cli
|
||||
|
||||
import com.jdbernard.io.NonBlockingInputStreamReader
|
||||
import com.jdbernard.util.SmartConfig
|
||||
import com.jdbernard.util.LightOptionParser
|
||||
import com.jdblabs.timestamper.core.Timeline
|
||||
@ -22,12 +23,14 @@ public class TimeStamperCLI {
|
||||
protected TimelineProperties timelineProperties
|
||||
protected Timeline timeline
|
||||
|
||||
public static final String VERSION = "0.1"
|
||||
public static final String VERSION = "0.5"
|
||||
|
||||
protected static def cli = [
|
||||
'v': [longOpt: 'version'],
|
||||
'h': [longOpt: 'help'],
|
||||
'v': [longOpt: 'version'],
|
||||
'd': [longOpt: 'working-directory', arguments: 1],
|
||||
't': [longOpt: 'timeline-config', arguments: 1] ]
|
||||
't': [longOpt: 'timeline-config', arguments: 1],
|
||||
'tty': [longOpt: 'tty', arguments: 1]]
|
||||
|
||||
public static void main(String[] args) {
|
||||
|
||||
@ -40,17 +43,22 @@ public class TimeStamperCLI {
|
||||
|
||||
doMain(nailgunInst, context.args, context.in, context.out, context.err) }
|
||||
|
||||
protected static doMain(TimeStamperCLI inst, String[] args,
|
||||
protected static void doMain(TimeStamperCLI inst, String[] args,
|
||||
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)
|
||||
|
||||
File workingDir = new File(opts.d ?: '.')
|
||||
String ttyDevice = opts.tty ?: '/dev/tty'
|
||||
|
||||
if (opts.v) {
|
||||
println "TimeStamperCLI v${VERSION}"
|
||||
return }
|
||||
|
||||
if (opts.t) {
|
||||
File propFile = new File(workingDir, opts.t)
|
||||
inst.showTimeline(propFile, sin, out, err) }
|
||||
inst.showTimeline(propFile, sin, out, err, ttyDevice) }
|
||||
else if (inst.timeline == null) {
|
||||
// Look for .timestamperrc user config file
|
||||
File cfgFile = new File(
|
||||
@ -60,13 +68,13 @@ public class TimeStamperCLI {
|
||||
cfgFile.canonicalPath
|
||||
else {
|
||||
def cfg = new SmartConfig(cfgFile)
|
||||
inst.showTimeline(new File(cfg.lastUsed), sin, out, err) } }
|
||||
else { inst.showTimeline(sin, out, err) } }
|
||||
inst.showTimeline(new File(cfg.lastUsed), sin, out, err, ttyDevice) } }
|
||||
else { inst.showTimeline(sin, out, err, ttyDevice) } }
|
||||
|
||||
public TimeStamperCLI() { }
|
||||
|
||||
public void showTimeline(File timelinePropertiesFile,
|
||||
def sin, def out, def err) {
|
||||
def sin, def out, def err, String ttyDevice) {
|
||||
if (!timelinePropertiesFile.exists() ||
|
||||
!timelinePropertiesFile.isFile()) {
|
||||
|
||||
@ -78,93 +86,182 @@ public class TimeStamperCLI {
|
||||
this.timelineProperties = new TimelineProperties(timelinePropertiesFile)
|
||||
this.timeline = timelineProperties.timeline
|
||||
|
||||
showTimeline(sin, out, err) }
|
||||
showTimeline(sin, out, err, ttyDevice) }
|
||||
|
||||
public void showTimeline(final def sin, def out, def err) {
|
||||
public void showTimeline(final def sin, def out, def err, String ttyDevice) {
|
||||
|
||||
//out.println ""
|
||||
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
|
||||
|
||||
def blockingReadLine = {
|
||||
String line = null;
|
||||
while (line == null && readerThread.isAlive()) {
|
||||
line = reader.readLine()
|
||||
|
||||
Thread.sleep(200) }
|
||||
|
||||
return line }
|
||||
|
||||
def readNotes = {
|
||||
out.println(ansi().fg(YELLOW).
|
||||
a("Notes (end with EOF or a blank line):").reset())
|
||||
|
||||
String notes = ""
|
||||
String line = null
|
||||
line = reader.readLine()
|
||||
line = blockingReadLine()
|
||||
|
||||
while(line != "" && line != "EOF" && line != null) {
|
||||
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
|
||||
|
||||
while (running) {
|
||||
printPrompt()
|
||||
while (running && readerThread.isAlive()) {
|
||||
|
||||
out.println formatMarker(currentMarker)
|
||||
out.print(ansi().fg(YELLOW).a("> ").reset())
|
||||
out.flush();
|
||||
|
||||
// Handle user input
|
||||
// Handle user input
|
||||
line = reader.readLine()
|
||||
|
||||
switch (line) {
|
||||
if (line != null) {
|
||||
out.flush();
|
||||
switch (line) {
|
||||
case ~/quit|exit|\u0004/:
|
||||
running = false;
|
||||
break
|
||||
|
||||
case null:
|
||||
case ~/quit|exit|\u0004/:
|
||||
running = false;
|
||||
break
|
||||
case ~/n|new/:
|
||||
|
||||
case ~/r|refresh|^$/:
|
||||
out.print(ansi().eraseLine().cursorUp(2).eraseLine())
|
||||
break
|
||||
// Read mark
|
||||
out.println(ansi().fg(YELLOW).a("New timestamp mark:").reset())
|
||||
String mark = blockingReadLine()
|
||||
|
||||
case ~/n|new/:
|
||||
// Read notes
|
||||
String notes = readNotes();
|
||||
|
||||
// Read mark
|
||||
out.println(ansi().fg(YELLOW).a("New timestamp:").reset())
|
||||
String mark = reader.readLine()
|
||||
// Create marker
|
||||
currentMarker = new TimelineMarker(new Date(), mark, notes)
|
||||
timeline.addMarker(currentMarker)
|
||||
if (timelineProperties.persistOnUpdate)
|
||||
timelineProperties.save()
|
||||
break
|
||||
|
||||
// Read notes
|
||||
String notes = readNotes();
|
||||
case ~/h|help/:
|
||||
out.println(ansi().fg(RED).
|
||||
a("Not yet implemented.").reset());
|
||||
break
|
||||
|
||||
// Create marker
|
||||
currentMarker = new TimelineMarker(new Date(), mark, notes)
|
||||
timeline.addMarker(currentMarker)
|
||||
if (timelineProperties.persistOnUpdate)
|
||||
case ~/l|list|history/:
|
||||
out.println(ansi().fg(RED).
|
||||
a("Not yet implemented.").reset());
|
||||
break
|
||||
|
||||
case ~/s|save/:
|
||||
timelineProperties.save()
|
||||
break
|
||||
break
|
||||
|
||||
case ~/h|help/:
|
||||
out.println(ansi().eraseLine().
|
||||
fg(RED).a("Not yet implemented."));
|
||||
break
|
||||
case ~/reload/:
|
||||
timeline = timelineProperties.reloadTimeline()
|
||||
currentMarker = timeline.getLastMarker(new Date())
|
||||
break
|
||||
|
||||
case ~/l|list|history/:
|
||||
out.println(ansi().eraseLine().
|
||||
fg(RED).a("Not yet implemented."));
|
||||
break
|
||||
case ~/e|ed|edit/:
|
||||
reader.pause()
|
||||
out.println(ansi().fg(YELLOW).
|
||||
a("Press ENTER to launch an editor for the current marker..."))
|
||||
out.flush()
|
||||
blockingReadLine()
|
||||
currentMarker = edit(currentMarker, ttyDevice)
|
||||
reader.resume()
|
||||
break
|
||||
|
||||
case ~/s|save/:
|
||||
timelineProperties.save()
|
||||
break
|
||||
case ~/d|del|delete/:
|
||||
timeline.removeMarker(currentMarker)
|
||||
currentMarker = timeline.getLastMarker(new Date())
|
||||
break
|
||||
|
||||
default:
|
||||
String notes = readNotes()
|
||||
currentMarker = new TimelineMarker(new Date(), line, notes)
|
||||
timeline.addMarker(currentMarker)
|
||||
if (timelineProperties.persistOnUpdate)
|
||||
timelineProperties.save()
|
||||
break
|
||||
default:
|
||||
String notes = readNotes()
|
||||
currentMarker = new TimelineMarker(new Date(), line, notes)
|
||||
timeline.addMarker(currentMarker)
|
||||
if (timelineProperties.persistOnUpdate)
|
||||
timelineProperties.save()
|
||||
break
|
||||
}
|
||||
printPrompt()
|
||||
} else {
|
||||
out.print(ansi().saveCursorPosition().cursorUpLine().eraseLine().toString() +
|
||||
formatMarker(currentMarker) +
|
||||
ansi().cursorDown(1).restorCursorPosition().toString())
|
||||
out.flush();
|
||||
|
||||
Thread.sleep(200)
|
||||
}
|
||||
}
|
||||
|
||||
this.timelineProperties.syncTargets.each { it.shutdown() }
|
||||
|
||||
if (readerThread.isAlive()) {
|
||||
readerThread.interrupt();
|
||||
readerThread.join(500);
|
||||
if (readerThread.isAlive()) readerThread.stop(); }
|
||||
|
||||
out.println ""
|
||||
}
|
||||
|
||||
protected TimelineMarker edit(TimelineMarker tm, String ttyDevice) {
|
||||
File temp = File.createTempFile('timestamp-mark-', '.txt')
|
||||
temp.withPrintWriter { fout ->
|
||||
fout.println("""\
|
||||
# Edit the time, mark, and notes below. Any lines starting with '#' will be
|
||||
# ignored. When done, save the file and close the editor.""")
|
||||
fout.println(Timeline.longFormat.format(tm.timestamp))
|
||||
fout.println(tm.mark)
|
||||
fout.println("""\
|
||||
# Everything from the line below to the end of the file will be considered
|
||||
# notes for this timeline mark.""")
|
||||
fout.println(tm.notes) }
|
||||
|
||||
['sh', '-c', "\$EDITOR ${temp.canonicalPath} <${ttyDevice} >${ttyDevice}"].execute().waitFor()
|
||||
|
||||
Thread.sleep(200)
|
||||
|
||||
String newTimeStr
|
||||
String newMark
|
||||
String newNotes = ""
|
||||
|
||||
temp.eachLine { line ->
|
||||
if (line =~ /^\s*#/) return
|
||||
|
||||
if (!newTimeStr) newTimeStr = line
|
||||
else if (!newMark) newMark = line
|
||||
else newNotes += line + EOL }
|
||||
|
||||
Date newTime
|
||||
try { newTime = Timeline.longFormat.parse(newTimeStr) }
|
||||
catch(Exception e) {
|
||||
out.println(ansi().fg(RED).a("Invalid timestamp format. The " +
|
||||
"previous timestamp value will be retained."))
|
||||
newTime = currentMark.timestamp }
|
||||
|
||||
timeline.removeMarker(tm)
|
||||
def newMarker = new TimelineMarker(newTime, newMark, newNotes)
|
||||
timeline.addMarker(newMarker)
|
||||
if (timelineProperties.persistOnUpdate)
|
||||
timelineProperties.save()
|
||||
|
||||
return newMarker
|
||||
|
||||
}
|
||||
|
||||
protected static String formatMarker(TimelineMarker tm) {
|
||||
|
Reference in New Issue
Block a user