This is an automated email from the git hooks/post-receive script. pini pushed a commit to tag upstream/1.1.0_beta1 in repository sikuli.
commit 8ee92ff638d4846aa04de8a20e1eeda89907232f Author: Raimund Hocke <[email protected]> Date: Tue Feb 18 08:43:55 2014 +0100 more on IDE multi scripting language support --- .../src/main/java/org/sikuli/basics/Settings.java | 27 ++++++- IDE/src/main/java/org/sikuli/ide/EditorPane.java | 89 ++++++++++++---------- .../java/org/sikuli/ide/EditorViewFactory.java | 61 ++++++++++----- .../main/java/org/sikuli/ide/SikuliEditorKit.java | 8 +- IDE/src/main/java/org/sikuli/ide/SikuliIDE.java | 4 +- .../java/org/sikuli/ide/SikuliIDEPopUpMenu.java | 35 +++++---- .../org/sikuli/scriptrunner/JRubyScriptRunner.java | 2 +- .../sikuli/scriptrunner/JythonScriptRunner.java | 5 +- 8 files changed, 148 insertions(+), 83 deletions(-) diff --git a/Basics/src/main/java/org/sikuli/basics/Settings.java b/Basics/src/main/java/org/sikuli/basics/Settings.java index c188306..c4af0ea 100644 --- a/Basics/src/main/java/org/sikuli/basics/Settings.java +++ b/Basics/src/main/java/org/sikuli/basics/Settings.java @@ -10,6 +10,8 @@ import java.io.File; import java.net.InetAddress; import java.net.Proxy; import java.util.Date; +import java.util.HashMap; +import java.util.Map; import java.util.Properties; import java.util.prefs.Preferences; @@ -94,7 +96,19 @@ public class Settings { private static Preferences options = Preferences.userNodeForPackage(SikuliX.class); - static { + public static Map<String, String> EndingTypes = new HashMap<String, String>(); + public static Map<String, String> TypeEndings = new HashMap<String, String>(); + public static String CPYTHON = "text/python"; + public static String CRUBY = "text/ruby"; + public static String CPLAIN = "text/plain"; + public static String EPYTHON = "py"; + public static String ERUBY = "rb"; + public static String EPLAIN = "txt"; + public static String RPYTHON = "jython"; + public static String RRUBY = "jruby"; + public static String EDEFAULT = EPYTHON; + + static { Properties props = System.getProperties(); //for debugging if (System.getProperty("user.name") != null && !"".equals(System.getProperty("user.name"))) { @@ -116,6 +130,13 @@ public class Settings { SikuliVersionIDE = SikuliVersionDefaultIDE; SikuliVersionScript = SikuliVersionDefaultScript; } + + EndingTypes.put("py", CPYTHON ); + EndingTypes.put("rb", CRUBY); + EndingTypes.put("txt", CPLAIN); + for (String k : EndingTypes.keySet()) { + TypeEndings.put(EndingTypes.get(k), k); + } } public static final int ISWINDOWS = 0; @@ -129,6 +150,7 @@ public class Settings { public static final float FOREVER = Float.POSITIVE_INFINITY; public static final int JavaVersion = Integer.parseInt(java.lang.System.getProperty("java.version").substring(2, 3)); public static final String JREVersion = java.lang.System.getProperty("java.runtime.version"); + public static boolean ThrowException = true; // throw FindFailed exception public static float AutoWaitTimeout = 3f; // in seconds public static float WaitScanRate = 3f; // frames per second @@ -153,6 +175,9 @@ public class Settings { * true = start slow motion mode, false: stop it (default: false) show a visual for * SlowMotionDelay seconds (default: 2) */ + public static boolean TRUE = true; + public static boolean FALSE = false; + private static boolean ShowActions = false; public static boolean isShowActions() { diff --git a/IDE/src/main/java/org/sikuli/ide/EditorPane.java b/IDE/src/main/java/org/sikuli/ide/EditorPane.java index c454564..7fee103 100755 --- a/IDE/src/main/java/org/sikuli/ide/EditorPane.java +++ b/IDE/src/main/java/org/sikuli/ide/EditorPane.java @@ -60,30 +60,12 @@ public class EditorPane extends JTextPane implements KeyListener, CaretListener private int _caret_last_x = -1; private boolean _can_update_caret_last_x = true; private SikuliIDEPopUpMenu popMenuImage; - private SikuliIDE theIDE; - private static Map<String, SikuliEditorKit> editorKits = new HashMap<String, SikuliEditorKit>(); + private String sikuliContentType; //<editor-fold defaultstate="collapsed" desc="Initialization"> public EditorPane(SikuliIDE ide) { - theIDE = ide; pref = PreferencesUser.getInstance(); showThumbs = !pref.getPrefMorePlainText(); - initKeyMap(); - if (transferHandler == null) { - transferHandler = new MyTransferHandler(); - } - setTransferHandler(transferHandler); - _highlighter = new EditorCurrentLineHighlighter(this); - addCaretListener(_highlighter); - setFont(new Font(pref.getFontName(), Font.PLAIN, pref.getFontSize())); - setMargin(new Insets(3, 3, 3, 3)); - setBackground(Color.WHITE); - if (!Settings.isMac()) { - setSelectionColor(new Color(170, 200, 255)); - } - updateDocumentListeners(); - - initEditorPane(); } private void initEditorPane() { @@ -98,34 +80,57 @@ public class EditorPane extends JTextPane implements KeyListener, CaretListener public void initBeforeLoad(String scriptType) { //TODO ask for scripttype on new pane String scrType = null; + boolean paneIsEmpty = false; if (scriptType == null) { - scriptType = "py"; + scriptType = Settings.EDEFAULT; + paneIsEmpty = true; } - if ("py".equals(scriptType)) { - scrType = "text/python"; + if (Settings.EPYTHON.equals(scriptType)) { + scrType = Settings.CPYTHON; _indentationLogic = SikuliIDE.getIDESupport(scriptType).getIndentationLogic(); _indentationLogic.setTabWidth(pref.getTabWidth()); - } else if ("rb".equals(scriptType)) { - scrType = "text/ruby"; + } else if (Settings.ERUBY.equals(scriptType)) { + scrType = Settings.CRUBY; + _indentationLogic = null; } if (scrType != null) { - if (!editorKits.containsKey(scrType)) { - SikuliEditorKit ek = new SikuliEditorKit(this); - editorKits.put(scrType, ek); - setEditorKitForContentType(scrType, ek); - } - setEditorKit(editorKits.get(scrType)); + sikuliContentType = scrType; + SikuliEditorKit ek = new SikuliEditorKit(this); + setEditorKit(ek); setContentType(scrType); - } - pref.addPreferenceChangeListener(new PreferenceChangeListener() { - @Override - public void preferenceChange(PreferenceChangeEvent event) { - if (event.getKey().equals("TAB_WIDTH")) { - _indentationLogic.setTabWidth(Integer.parseInt(event.getNewValue())); - } + if (paneIsEmpty) { + this.setText(""); } - }); + pref.addPreferenceChangeListener(new PreferenceChangeListener() { + @Override + public void preferenceChange(PreferenceChangeEvent event) { + if (event.getKey().equals("TAB_WIDTH")) { + _indentationLogic.setTabWidth(Integer.parseInt(event.getNewValue())); + } + } + }); + } Debug.log(3, "InitTab: %s :--: %s", getContentType(), getEditorKit()); + initKeyMap(); + if (transferHandler == null) { + transferHandler = new MyTransferHandler(); + } + setTransferHandler(transferHandler); + _highlighter = new EditorCurrentLineHighlighter(this); + addCaretListener(_highlighter); + setFont(new Font(pref.getFontName(), Font.PLAIN, pref.getFontSize())); + setMargin(new Insets(3, 3, 3, 3)); + setBackground(Color.WHITE); + if (!Settings.isMac()) { + setSelectionColor(new Color(170, 200, 255)); + } + updateDocumentListeners(); + + initEditorPane(); + } + + public String getSikuliContentType() { + return sikuliContentType; } public SikuliIDEPopUpMenu getPopMenuImage() { @@ -287,8 +292,8 @@ public class EditorPane extends JTextPane implements KeyListener, CaretListener } ImagePath.remove(_srcBundlePath); setSrcBundle(bundlePath); - _editingFile = createSourceFile(bundlePath, ".py"); - Debug.log(2, "save to bundle: " + getSrcBundle()); + _editingFile = createSourceFile(bundlePath, "." + Settings.TypeEndings.get(sikuliContentType)); + Debug.log(3, "IDE: saveAsBundle: " + getSrcBundle()); writeSrcFile(); reparse(); } @@ -304,13 +309,15 @@ public class EditorPane extends JTextPane implements KeyListener, CaretListener } private void writeSrcFile() throws IOException { + Debug.log(3, "IDE: writeSrcFile: " + _editingFile.getName()); writeFile(_editingFile.getAbsolutePath()); if (PreferencesUser.getInstance().getAtSaveMakeHTML()) { convertSrcToHtml(getSrcBundle()); } else { (new File(_editingFile.getAbsolutePath().replaceFirst("py", "html"))).delete(); } - if (PreferencesUser.getInstance().getAtSaveCleanBundle()) { +//TODO bundle image clean in Java + if (Settings.CPYTHON.equals(getSikuliContentType()) && PreferencesUser.getInstance().getAtSaveCleanBundle()) { cleanBundle(getSrcBundle()); } setDirty(false); diff --git a/IDE/src/main/java/org/sikuli/ide/EditorViewFactory.java b/IDE/src/main/java/org/sikuli/ide/EditorViewFactory.java index 37724ff..63412a6 100755 --- a/IDE/src/main/java/org/sikuli/ide/EditorViewFactory.java +++ b/IDE/src/main/java/org/sikuli/ide/EditorViewFactory.java @@ -20,7 +20,7 @@ import org.sikuli.basics.Debug; public class EditorViewFactory implements ViewFactory { - private EditorPane pane; + private String sikuliContentType; @Override public View create(Element elem) { @@ -28,7 +28,7 @@ public class EditorViewFactory implements ViewFactory { Debug.log(6, "ViewCreate: " + kind); if (kind != null) { if (kind.equals(AbstractDocument.ContentElementName)) { - return new HighlightLabelView(elem); + return new SyntaxHighlightLabelView(elem, sikuliContentType); } else if (kind.equals(AbstractDocument.ParagraphElementName)) { return new LineBoxView(elem, View.X_AXIS); } else if (kind.equals(AbstractDocument.SectionElementName)) { @@ -43,8 +43,8 @@ public class EditorViewFactory implements ViewFactory { return new LabelView(elem); } - public void setPane(EditorPane p) { - pane = p; + public void setContentType(String ct) { + sikuliContentType = ct; } } @@ -127,16 +127,19 @@ class LineBoxView extends BoxView { //</editor-fold> //<editor-fold defaultstate="collapsed" desc="Highlight"> -class HighlightLabelView extends LabelView { +class SyntaxHighlightLabelView extends LabelView { static FontMetrics _fMetrics = null; static String tabStr = nSpaces(PreferencesUser.getInstance().getTabWidth()); private static Map<Pattern, Color> patternColors; + private static Map<Pattern, Color> patternColorsPython; + private static Map<Pattern, Color> patternColorsRuby; + private static Map<Pattern, Color> patternColorsSikuli; private static Font fontParenthesis; //<editor-fold defaultstate="collapsed" desc="keyword lists"> - private static String[] keywords = { + private static String[] keywordsPython = { "and", "del", "for", "is", "raise", "assert", "elif", "from", "lambda", "return", "break", "else", "global", "not", "try", @@ -144,10 +147,19 @@ class HighlightLabelView extends LabelView { "continue", "exec", "import", "pass", "yield", "def", "finally", "in", "print", "with" }; + private static String[] keywordsRuby = { + "return", "break", "else", "class", "if", "nil", "begin", "end", "rescue", + "next", "def", "puts", "java_import", "eval", "then", "alias", "and", + "case", "defined?", "do", "elsif", "ensure", "false", "for", "in", "module", + "not", "or", "redo", "retry", "self", "super", "true", "undef", "unless", + "until", "when", "while", "yield", "BEGIN", "END", "__ENCODING__", "__END__", + "__FILE__", "__LINE__" + }; private static String[] keywordsSikuliClass = { "Region", "Screen", "Match", "Pattern", - "Location", "VDict", "Env", "Key", "Button", "Finder", - "App", "KeyModifier", "Vision" + "Location", "Env", "Key", "Button", "Finder", + "App", "KeyModifier", "Mouse", "Image", "ImagePath", "ImageGroup", + "ImageFind", "ImageFinder" }; private static String[] keywordsSikuli = { "find", "wait", "findAll", "waitVanish", "exists", @@ -195,6 +207,8 @@ class HighlightLabelView extends LabelView { "NUM1", "NUM2", "NUM3", "NUM4", "NUM5", "NUM6", "NUM7", "NUM8", "NUM9", "SEPARATOR", "NUM_LOCK", "ADD", "MINUS", "MULTIPLY", "DIVIDE" }; + + private String sikuliContentType; //</editor-fold> static { @@ -212,30 +226,43 @@ class HighlightLabelView extends LabelView { // NOTE: the order is important! patternColors = new HashMap<Pattern, Color>(); + patternColorsPython = new HashMap<Pattern, Color>(); + patternColorsRuby = new HashMap<Pattern, Color>(); + patternColorsSikuli = new HashMap<Pattern, Color>(); patternColors.put(Pattern.compile("(#:.*$)"), new Color(220, 220, 220)); patternColors.put(Pattern.compile("(#.*$)"), new Color(138, 140, 193)); patternColors.put(Pattern.compile("(\"[^\"]*\"?)"), new Color(128, 0, 0)); patternColors.put(Pattern.compile("(\'[^\']*\'?)"), new Color(128, 0, 0)); patternColors.put(Pattern.compile("\\b([0-9]+)\\b"), new Color(128, 64, 0)); - for (int i = 0; i < keywords.length; i++) { patternColors.put(Pattern.compile( - "\\b(" + keywords[i] + ")\\b"), Color.blue); + for (int i = 0; i < keywordsPython.length; i++) { patternColorsPython.put(Pattern.compile( + "\\b(" + keywordsPython[i] + ")\\b"), Color.blue); + } + for (int i = 0; i < keywordsRuby.length; i++) { patternColorsRuby.put(Pattern.compile( + "\\b(" + keywordsRuby[i] + ")\\b"), Color.blue); } - for (int i = 0; i < keywordsSikuli.length; i++) { patternColors.put(Pattern.compile( + for (int i = 0; i < keywordsSikuli.length; i++) { patternColorsSikuli.put(Pattern.compile( "\\b(" + keywordsSikuli[i] + ")\\b"), new Color(63, 127, 127)); } - for (int i = 0; i < keywordsSikuliClass.length; i++) { patternColors.put(Pattern.compile( + for (int i = 0; i < keywordsSikuliClass.length; i++) { patternColorsSikuli.put(Pattern.compile( "\\b(" + keywordsSikuliClass[i] + ")\\b"), new Color(215, 41, 56)); } - for (int i = 0; i < constantsSikuli.length; i++) { patternColors.put(Pattern.compile( + for (int i = 0; i < constantsSikuli.length; i++) { patternColorsSikuli.put(Pattern.compile( "\\b(" + constantsSikuli[i] + ")\\b"), new Color(128, 64, 0)); } } - public HighlightLabelView(Element elm) { - super(elm); - } + public SyntaxHighlightLabelView(Element elm, String contentType) { + super(elm); + sikuliContentType = contentType; + if (Settings.CPYTHON.equals(sikuliContentType)) { + patternColors.putAll(patternColorsPython); + } else if (Settings.CRUBY.equals(sikuliContentType)) { + patternColors.putAll(patternColorsRuby); + } + patternColors.putAll(patternColorsSikuli); + } - private static String nSpaces(int n) { + private static String nSpaces(int n) { char[] s = new char[n]; Arrays.fill(s, ' '); return new String(s); diff --git a/IDE/src/main/java/org/sikuli/ide/SikuliEditorKit.java b/IDE/src/main/java/org/sikuli/ide/SikuliEditorKit.java index 6ded5e6..85e01a9 100755 --- a/IDE/src/main/java/org/sikuli/ide/SikuliEditorKit.java +++ b/IDE/src/main/java/org/sikuli/ide/SikuliEditorKit.java @@ -25,6 +25,7 @@ public class SikuliEditorKit extends StyledEditorKit { public SikuliEditorKit(EditorPane p) { _viewFactory = new EditorViewFactory(); pane = p; + ((EditorViewFactory) _viewFactory).setContentType(pane.getSikuliContentType()); } public static final String deIndentAction = "SKL.DeindentAction"; private static final TextAction[] defaultActions = { @@ -61,10 +62,6 @@ public class SikuliEditorKit extends StyledEditorKit { } public void actionPerformed(JTextComponent text) { - indentationLogic = ((EditorPane) text).getIndentationLogic(); - if (indentationLogic == null) { - return; - } boolean indentError = false; Document doc = text.getDocument(); Element map = doc.getDefaultRootElement(); @@ -516,8 +513,7 @@ public class SikuliEditorKit extends StyledEditorKit { @Override public String getContentType() { - //TODO other content type: ruby, DSL, ... - return "text/python"; + return pane.getSikuliContentType(); } @Override diff --git a/IDE/src/main/java/org/sikuli/ide/SikuliIDE.java b/IDE/src/main/java/org/sikuli/ide/SikuliIDE.java index 4fee9e7..c61300e 100755 --- a/IDE/src/main/java/org/sikuli/ide/SikuliIDE.java +++ b/IDE/src/main/java/org/sikuli/ide/SikuliIDE.java @@ -2010,6 +2010,8 @@ public class SikuliIDE extends JFrame { } protected void addScriptCode(IScriptRunner srunner) { + srunner.execBefore(null); + srunner.execBefore(new String[]{"Settings.setShowActions(Settings.FALSE)"}); } public void stopRunning() { @@ -2061,7 +2063,7 @@ public class SikuliIDE extends JFrame { @Override protected void addScriptCode(IScriptRunner srunner) { srunner.execBefore(null); - srunner.execBefore(new String[]{"setShowActions(True)"}); + srunner.execBefore(new String[]{"Settings.setShowActions(Settings.TRUE)"}); } } diff --git a/IDE/src/main/java/org/sikuli/ide/SikuliIDEPopUpMenu.java b/IDE/src/main/java/org/sikuli/ide/SikuliIDEPopUpMenu.java index ad513a9..9806d31 100644 --- a/IDE/src/main/java/org/sikuli/ide/SikuliIDEPopUpMenu.java +++ b/IDE/src/main/java/org/sikuli/ide/SikuliIDEPopUpMenu.java @@ -24,7 +24,7 @@ public class SikuliIDEPopUpMenu extends JPopupMenu { private EditorPane refEditorPane = null; public static final String POP_LINE = "POP_LINE"; private EditorLineNumberView refLineNumberView = null; - + private MouseEvent mouseTrigger; /** @@ -62,7 +62,7 @@ public class SikuliIDEPopUpMenu extends JPopupMenu { return; } } - + public void doShow(CloseableTabbedPane comp, MouseEvent me) { mouseTrigger = me; show(comp, me.getX(), me.getY()); @@ -98,7 +98,7 @@ public class SikuliIDEPopUpMenu extends JPopupMenu { SikuliIDE.FileAction insertNewTab = SikuliIDE.getInstance().getFileAction(tabIndex); insertNewTab.doInsert(null); } - + private JMenuItem createMenuItem(JMenuItem item, ActionListener listener) { item.addActionListener(listener); return item; @@ -107,7 +107,7 @@ public class SikuliIDEPopUpMenu extends JPopupMenu { private JMenuItem createMenuItem(String name, ActionListener listener) { return createMenuItem(new JMenuItem(name), listener); } - + private void setMenuText(int index, String text) { ((JMenuItem) getComponent(index)).setText(text); } @@ -157,6 +157,8 @@ public class SikuliIDEPopUpMenu extends JPopupMenu { private void popTabMenu() { try { + add(createMenuItem("Set Type", new PopTabAction(PopTabAction.SET_TYPE))); + addSeparator(); add(createMenuItem("Move Tab", new PopTabAction(PopTabAction.MOVE_TAB))); add(createMenuItem("Duplicate", new PopTabAction(PopTabAction.DUPLICATE))); add(createMenuItem("Open", new PopTabAction(PopTabAction.OPEN))); @@ -169,7 +171,7 @@ public class SikuliIDEPopUpMenu extends JPopupMenu { add(createMenuItem("Run Slowly", new PopTabAction(PopTabAction.RUN_SLOW))); addSeparator(); add(createMenuItem("Reset", new PopTabAction(PopTabAction.RESET))); - + } catch (NoSuchMethodException ex) { validMenu = false; } @@ -177,6 +179,7 @@ public class SikuliIDEPopUpMenu extends JPopupMenu { class PopTabAction extends MenuAction { + static final String SET_TYPE = "doSetType"; static final String MOVE_TAB = "doMoveTab"; static final String DUPLICATE = "doDuplicate"; static final String OPEN = "doOpen"; @@ -186,7 +189,7 @@ public class SikuliIDEPopUpMenu extends JPopupMenu { static final String RUN = "doRun"; static final String RUN_SLOW = "doRunSlow"; static final String RESET = "doReset"; - + public PopTabAction() { super(); } @@ -195,13 +198,17 @@ public class SikuliIDEPopUpMenu extends JPopupMenu { super(item); } + public void doSetType(ActionEvent ae) { + Debug.log(3, "doSetType: selected"); + } + public void doMoveTab(ActionEvent ae) throws NoSuchMethodException { log(lvl, "doMoveTab: entered"); if (getMenuText(0).contains("Insert")) { log(lvl, "doMoveTab: insert"); doLoad(refTab.getSelectedIndex()+1); - setMenuText(0, "Move Tab"); - setMenuText(3, "Open left"); + setMenuText(0, "Move Tab"); + setMenuText(3, "Open left"); return; } refTab.resetLastClosed(); @@ -217,7 +224,7 @@ public class SikuliIDEPopUpMenu extends JPopupMenu { log(lvl, "doDuplicate: entered"); fireIDEFileMenu("SAVE"); fireIDEFileMenu("SAVE_AS"); - setMenuText(3, "Insert left"); + setMenuText(3, "Insert left"); doOpenLeft(null); } @@ -226,26 +233,26 @@ public class SikuliIDEPopUpMenu extends JPopupMenu { fireInsertTabAndLoad(tabIndex); return success; } - + public void doOpen(ActionEvent ae) throws NoSuchMethodException { log(lvl, "doOpen: entered"); refTab.resetLastClosed(); doLoad(refTab.getSelectedIndex()+1); } - + public void doOpenLeft(ActionEvent ae) throws NoSuchMethodException { log(lvl, "doOpenLeft: entered"); if (getMenuText(3).contains("Insert")) { log(lvl, "doMoveTab: insert left"); doLoad(refTab.getSelectedIndex()); - setMenuText(0, "Move Tab"); - setMenuText(3, "Open left"); + setMenuText(0, "Move Tab"); + setMenuText(3, "Open left"); return; } refTab.resetLastClosed(); doLoad(refTab.getSelectedIndex()); } - + public void doSave(ActionEvent ae) throws NoSuchMethodException { log(lvl, "doSave: entered"); fireIDEFileMenu("SAVE"); diff --git a/JRuby/src/main/java/org/sikuli/scriptrunner/JRubyScriptRunner.java b/JRuby/src/main/java/org/sikuli/scriptrunner/JRubyScriptRunner.java index 3bf9633..3c791d5 100755 --- a/JRuby/src/main/java/org/sikuli/scriptrunner/JRubyScriptRunner.java +++ b/JRuby/src/main/java/org/sikuli/scriptrunner/JRubyScriptRunner.java @@ -157,7 +157,7 @@ public class JRubyScriptRunner implements IScriptRunner { @Override public String getName() { - return "jruby"; + return Settings.RRUBY; } @Override diff --git a/Jython/src/main/java/org/sikuli/scriptrunner/JythonScriptRunner.java b/Jython/src/main/java/org/sikuli/scriptrunner/JythonScriptRunner.java index 3251ca6..57b1303 100644 --- a/Jython/src/main/java/org/sikuli/scriptrunner/JythonScriptRunner.java +++ b/Jython/src/main/java/org/sikuli/scriptrunner/JythonScriptRunner.java @@ -429,7 +429,7 @@ public class JythonScriptRunner implements IScriptRunner { */ @Override public String getName() { - return "jython"; + return Settings.RPYTHON; } /** @@ -524,7 +524,8 @@ public class JythonScriptRunner implements IScriptRunner { /** * {@inheritDoc} */ - @Override + + @Override public void execBefore(String[] stmts) { if (stmts == null) { codeBefore = null; -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-java/sikuli.git _______________________________________________ pkg-java-commits mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-java-commits

