- Use jline in bsh script for command history support.

This commit is contained in:
Ville Skyttä 2010-11-25 22:44:33 +02:00
parent 39d249054a
commit 30e46ba822
2 changed files with 10 additions and 160 deletions

View File

@ -1,151 +0,0 @@
--- BeanShell/src/bsh/Interpreter.java~ 2003-09-03 19:56:58.000000000 -0400
+++ BeanShell/src/bsh/Interpreter.java 2004-01-25 09:59:41.730059108 -0500
@@ -38,6 +38,13 @@
import java.lang.reflect.Method;
import java.lang.reflect.InvocationTargetException;
+import bsh.util.BshCompleter;
+import bsh.util.NameCompletionTable;
+import bsh.classpath.ClassManagerImpl;
+import org.gnu.readline.Readline;
+import org.gnu.readline.ReadlineLibrary;
+import org.gnu.readline.ReadlineReader;
+
/**
The BeanShell script interpreter.
@@ -394,10 +401,59 @@
else
src = System.in;
- Reader in = new CommandLineReader( new InputStreamReader(src));
- Interpreter interpreter =
- new Interpreter( in, System.out, System.err, true );
- interpreter.run();
+ Reader in = null;
+ boolean usingReadline = false;
+ String backingLib = System.getProperty("bsh.console.readlinelib");
+ if (backingLib != null) {
+ try {
+ File history = new File(System.getProperty("user.home") +
+ File.separator + ".bsh_history");
+ if (!history.exists()) {
+ try {
+ history.createNewFile();
+ } catch(IOException ioe) {
+ debug("Unable to create history " + history.getAbsolutePath());
+ }
+ }
+ ReadlineLibrary lib = ReadlineLibrary.byName(backingLib);
+ // should I wrap CommandLineReader around it?
+ if (history.canWrite() && history.canRead()) {
+ in = new ReadlineReader("bsh % ", history,lib);
+ } else {
+ in = new ReadlineReader("bsh % ",lib);
+ debug("Unable to read/write history " + history.getAbsolutePath());
+ }
+ } catch (IOException ioe) {
+ System.err.println("Unable to invoke ReadlineReader " +
+ "due to: " + ioe);
+ }
+ }
+ if (in == null)
+ in = new CommandLineReader( new InputStreamReader(src));
+ else
+ usingReadline = true;
+ Interpreter interpreter =
+ new Interpreter( in, System.out, System.err, true );
+ if (usingReadline) {
+ NameCompletionTable nct = new NameCompletionTable();
+ nct.add(interpreter.getNameSpace());
+
+ /** ClassManager does a lot of chatting to the stdout,
+ * so this has been commented out for the time being
+ **/
+
+// try {
+// BshClassManager bcm = BshClassManager.getClassManager();
+// if (bcm != null) {
+// nct.add(((ClassManagerImpl)bcm).getClassPath());
+// }
+// } catch(ClassPathException cpe) {
+// debug("classpath exception in name compl:" + cpe);
+// }
+
+ Readline.setCompleter(new BshCompleter(nct));
+ }
+ interpreter.run();
}
}
@@ -445,7 +501,7 @@
System.err.flush();
Thread.yield(); // this helps a little
- if ( interactive )
+ if ( interactive && !(in instanceof ReadlineReader))
print( getBshPrompt() );
eof = Line();
@@ -548,10 +604,17 @@
}
}
- if ( interactive && exitOnEOF )
- System.exit(0);
+ if ( interactive && exitOnEOF ) {
+ /* should be done for all streams in general, but this
+ * ensures that the history for readline is flushed */
+ try {
+ in.close();
+ } catch (IOException ioe) {
+ }
+
+ System.exit(0);
}
-
+ }
// begin source and eval
/**
--- /dev/null 2003-10-19 02:52:03.000000000 -0400
+++ BeanShell/src/bsh/util/BshCompleter.java 2004-01-25 10:14:10.184458217 -0500
@@ -0,0 +1,38 @@
+package bsh.util;
+
+import org.gnu.readline.ReadlineCompleter;
+
+/**
+ * An adapter for org.gnu.readline's ReadlineCompleter interface to map to
+ * BeanShell's NameCompleter interface.
+ *
+ * @see org.gnu.readline.ReadlineReader
+ * @version $Revision: 1.1 $
+ * @author Shane Celis <shane@terraspring.com>
+ **/
+public class BshCompleter implements ReadlineCompleter {
+
+ private NameCompletion completer;
+
+ /**
+ * Constructs a <code>ReadlineCompleter</code> out of a
+ * <code>NameCompleter</code> object.
+ **/
+ public BshCompleter(NameCompletion completer) {
+ this.completer = completer;
+ }
+
+ /**
+ * Returns String of completion if unambiguous, otherwise null
+ **/
+ public String completer(String text, int state) {
+ // Not sure what state is used for in ReadlineCompleter
+ String[] completions = completer.completeName(text);
+ if (completions.length == 1 && state == 0) {
+ return completions[0];
+ } else {
+ return null; // ambiguous result
+ }
+ }
+
+}

View File

@ -102,6 +102,7 @@ Demonstrations and samples for %{name}.
Summary: %{name} utilities
Group: Development/Tools
Requires: %{name} = %{epoch}:%{version}-%{release}
Requires: jline
Provides: %{name}-desktop = %{epoch}:%{version}-%{release}
Obsoletes: %{name}-desktop < 0:1.3.0-17
# So that yum will pull this in on base package upgrades from < 0:1.3.0-17
@ -221,6 +222,11 @@ install -m 644 dist/bshservlet-wbsh.war $RPM_BUILD_ROOT%{_datadir}/%{name}/webap
install -d $RPM_BUILD_ROOT%{_bindir}
function bsh_script() {
local jars=%{name}.jar runclass=
if [ $2 = jline.ConsoleRunner ] ; then
jars="$jars jline.jar"
runclass=bsh.Interpreter
fi
cat > $RPM_BUILD_ROOT%{_bindir}/$1 << EOF
#!/bin/sh
#
@ -246,13 +252,7 @@ if [ -n "\$BSH_DEBUG" ]; then
BASE_FLAGS=-Ddebug=true
fi
BASE_JARS="%{name}.jar"
#if [ -f /usr/lib/libJavaReadline.so ]; then
# BASE_FLAGS="$BASE_FLAGS -Djava.library.path=/usr/lib"
# BASE_FLAGS="\$BASE_FLAGS -Dbsh.console.readlinelib=GnuReadline"
# BASE_JARS="\$BASE_JARS libreadline-java.jar"
#fi
BASE_JARS="$jars"
# Set parameters
set_jvm
@ -261,11 +261,11 @@ set_flags \$BASE_FLAGS
set_options \$BASE_OPTIONS
# Let's start
run "\$@"
run $runclass "\$@"
EOF
}
bsh_script bsh bsh.Interpreter
bsh_script bsh jline.ConsoleRunner
bsh_script bsh-desktop bsh.Console
cat > $RPM_BUILD_ROOT%{_bindir}/%{name}doc << EOF
@ -329,6 +329,7 @@ gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || :
* Thu Nov 25 2010 Ville Skyttä <ville.skytta@iki.fi> - 0:1.3.0-17
- Rename -desktop to -utils, move shell scripts and menu entry to it (#417491).
- Bring icon cache scriptlets up to date with current guidelines.
- Use jline in bsh script for command history support.
* Thu Nov 25 2010 Stanislav Ochotnicky <sochotnicky@redhat.com> - 0:1.3.0-16
- Fix pom filenames (Resolves rhbz#655791)