Permalink
Browse files

Added support for native git protocol, updater improved, help updated

  • Loading branch information...
1 parent 01a3708 commit 2cf2dd441c15f9b7f2d743f449e6679d79ba9d57 @fugazza committed Dec 10, 2011
View
BIN dist/SerendipityTranslator.jar
Binary file not shown.
View
BIN dist/lib/jsch-0.1.45.jar
Binary file not shown.
View
BIN dist/lib/org.eclipse.jgit-1.1.0.201109151100-r.jar
Binary file not shown.
View
64 src/ajgl/utils/ajglTools.java
@@ -5,15 +5,13 @@
package ajgl.utils;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
+import java.io.*;
import java.net.URL;
+import java.util.Enumeration;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
import javax.swing.JOptionPane;
import serendipitytranslator.mainWindow.PluginDownloader;
@@ -75,12 +73,12 @@ public static void download (URL url, File f, Long date) throws IOException {
* @param versionFile URL to internet text file holding newest version string
* @param version actual Version string to compare with internet version. If these two differs, it is supposed that newer version exist on internet.
* @param applicationFile URL internet address of newest application jar archive.
- * @param targetFile File where to save downloaded application.
+ * @param runFile File which shall be run to restart the application.
* @param appName The name of application for purposes of showing messages.
* @return false if no new version is available, true if update finished successfully
* @throws IOException If anything goes bad.
*/
- public static boolean updater (URL versionFile, String version, URL applicationFile, File targetFile, String appName) throws IOException {
+ public static boolean updater (URL versionFile, String version, URL applicationFile, File runFile, String appName) throws IOException {
String versionString = "";
int bytesRead = 0;
byte buffer[] = new byte[1024];
@@ -100,16 +98,48 @@ public static boolean updater (URL versionFile, String version, URL applicationF
int result = JOptionPane.showConfirmDialog(null, "Newest version of "+appName+" is available. Your version: " + version + ". Newest version: "+versionString+"\r\nUpgrade to new version?","Update to new version",JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE);
if (result == JOptionPane.OK_OPTION) {
- ajglTools.download(applicationFile, targetFile, 0l);
-
- /* is it a jar file? */
- if ( targetFile.getName().endsWith(".jar") ) {
- String javaBin = System.getProperty("java.home") + "/bin/java";
- String toExec[] = new String[] { javaBin, "-jar", targetFile.getPath() };
- try{
- Process p = Runtime.getRuntime().exec( toExec );
- } catch(Exception e) {
- e.printStackTrace();
+ int lastSlash = applicationFile.getPath().lastIndexOf("/");
+ String remoteFileName = applicationFile.getPath().substring(lastSlash);
+ File localFile = new File(remoteFileName);
+
+ ajglTools.download(applicationFile, localFile, 0l);
+
+ /* unpack zipped files */
+ if (localFile.getName().endsWith(".zip")) {
+ ZipFile zip = new ZipFile(localFile,ZipFile.OPEN_READ | ZipFile.OPEN_DELETE);
+ ZipEntry entry;
+ File unzippedFile;
+ for (Enumeration<? extends ZipEntry> e = zip.entries(); e.hasMoreElements();) {
+ entry = e.nextElement();
+ unzippedFile = new File(entry.getName());
+ System.out.println(unzippedFile.getPath() + "; directory = "+entry.isDirectory());
+ if (entry.isDirectory()) {
+ unzippedFile.mkdir();
+ } else {
+ is = zip.getInputStream(entry);
+ FileOutputStream fos = new FileOutputStream(unzippedFile);
+ while ((bytesRead = is.read(buffer)) != -1) {
+ fos.write(buffer, 0, bytesRead);
+ }
+ fos.close();
+ is.close();
+ }
+ }
+ zip.close();
+ }
+
+ /* do we have to run jar file? */
+ if ( runFile.getName().endsWith(".jar") ) {
+ if (runFile.exists()) {
+ String javaBin = System.getProperty("java.home") + "/bin/java";
+ String toExec[] = new String[] { javaBin, "-jar", runFile.getPath() };
+ try{
+ Process p = Runtime.getRuntime().exec( toExec );
+ } catch(Exception e) {
+ e.printStackTrace();
+ }
+ } else {
+ JOptionPane.showMessageDialog(null, "The runnable file '"+runFile.getName()+"' necessary to restart the application was not found.\r\nVisit http://vlada.ajgl.cz/archives/170-Serendipity-Translator.html and download newest version of software manually.\r\nThe application will be shut down now.", "Error during update", JOptionPane.ERROR_MESSAGE);
}
System.exit(0);
View
2 src/serendipitytranslator/mainWindow/MainFrame.form
@@ -34,7 +34,7 @@
<Component id="downloadstatusLabel" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0">
- <Component id="downloadProgressBar" pref="23" max="32767" attributes="1"/>
+ <Component id="downloadProgressBar" max="32767" attributes="1"/>
<Component id="downloadCancelButton" alignment="0" max="32767" attributes="1"/>
</Group>
<EmptySpace min="-2" pref="25" max="-2" attributes="0"/>
View
21 src/serendipitytranslator/mainWindow/MainFrame.java
@@ -47,7 +47,7 @@
SettingsDialog settingsDialog = new SettingsDialog(this, true);
private HashMap<String,String> messageDatabase = null;
String language;
- private String version = "1.9";
+ private String version = "2.0";
PluginDownloader pluginDownloader;
/** Creates new form MainFrame */
@@ -98,7 +98,6 @@ public boolean include(Entry<? extends PluginTableModel, ? extends Integer> entr
});
pluginTable.setRowSorter(sorter);
- updateLanguage();
translateFrame.addPropertyChangeListener(new PropertyChangeListener() {
@@ -117,12 +116,14 @@ public void propertyChange(PropertyChangeEvent evt) {
});
try {
- ajglTools.updater(new URL(settingsDialog.getUpdateURL() + "/version.txt"), version, new URL(settingsDialog.getUpdateURL() + "/SerendipityTranslator.jar"), new File("SerendipityTranslator.jar"), "SerendipityTranslator");
+ updateApplication();
} catch (MalformedURLException ex) {
Logger.getLogger(MainFrame.class.getName()).log(Level.INFO, ex.getMessage());
} catch (IOException ex) {
Logger.getLogger(MainFrame.class.getName()).log(Level.INFO, ex.getMessage());
}
+
+ updateLanguage();
}
/** This method is called from within the constructor to
@@ -1130,11 +1131,7 @@ private void updateMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GE
// download file with latest version number from internet
try {
boolean result;
- result = ajglTools.updater(new URL(settingsDialog.getUpdateURL()+"/version.txt"),
- version,
- new URL(settingsDialog.getUpdateURL()+"/SerendipityTranslator.jar"),
- new File("SerendipityTranslator.jar"),
- "SerendipityTranslator");
+ result = updateApplication();
if (!result) {
JOptionPane.showMessageDialog(null, "You have newest version of SerendipityTranslator.","Update to new version",JOptionPane.INFORMATION_MESSAGE);
}
@@ -1159,6 +1156,14 @@ private void formWindowActivated(java.awt.event.WindowEvent evt) {//GEN-FIRST:ev
}
}//GEN-LAST:event_formWindowActivated
+ private boolean updateApplication() throws MalformedURLException, IOException {
+ return ajglTools.updater(new URL(settingsDialog.getUpdateURL()+"/version.txt"),
+ version,
+ new URL(settingsDialog.getUpdateURL()+"/SerendipityTranslator.zip"),
+ new File("SerendipityTranslator.jar"),
+ "SerendipityTranslator");
+ }
+
private void generateStats() {
statLangLabel.setText(language);
View
35 src/serendipitytranslator/mainWindow/Plugin.java
@@ -226,22 +226,22 @@ public void compareFiles() {
//JOptionPane.showMessageDialog(null, "before doc status");
// --------------- set status for documentation files ------------------
- File enDocFile = new File(repository.getRepositoryFolderName()+"/"+folderInRepository+ "/" + getDocFileNameEn());
- File csDocFile = new File(repository.getRepositoryFolderName()+"/"+folderInRepository+ "/" + getDocFileNameLoc());
+ SerendipityFileInfo enDocFile = getFileInfo(folderInRepository,getDocFileNameEn());
+ SerendipityFileInfo csDocFile = getFileInfo(folderInRepository,getDocFileNameLoc());
File csDocFileLocal = new File(LangFile.getTranslatedDirName(name)+ "/" + getDocFileNameLoc());
- if (!enDocFile.exists()) {
+ if (enDocFile == null) { // english documentation file does not exist
setDocumentationStatus(DocumentationStatus.problem);
- } else if (csDocFile.exists()) {
- if (csDocFile.lastModified() > enDocFile.lastModified()) {
+ } else if (csDocFile != null) { // documentation in local language exists
+ if (csDocFile.getFileDate() > enDocFile.getFileDate()) {
setDocumentationStatus(DocumentationStatus.translated);
- } else if (csDocFileLocal.exists() && (csDocFileLocal.lastModified() > enDocFile.lastModified())) {
+ } else if (csDocFileLocal.exists() && (csDocFileLocal.lastModified() > enDocFile.getFileDate())) {
setDocumentationStatus(DocumentationStatus.local);
} else {
setDocumentationStatus(DocumentationStatus.partial);
}
- } else if (csDocFileLocal.exists()) {
- if (csDocFileLocal.lastModified() > enDocFile.lastModified()) {
+ } else if (csDocFileLocal.exists()) { // documentation in local languge exist only in translated direcotry
+ if (csDocFileLocal.lastModified() > enDocFile.getFileDate()) {
setDocumentationStatus(DocumentationStatus.local);
} else {
setDocumentationStatus(DocumentationStatus.partial);
@@ -272,6 +272,16 @@ public void compareFiles() {
propertyChange.firePropertyChange("plugin_files_compared", null, this);
}
+ private SerendipityFileInfo getFileInfo(String folder, String filename) {
+ SerendipityFileInfo info = null;
+ for (SerendipityFileInfo i: repository.getFileList(folder)) {
+ if (i.getFilename().equals(filename)) {
+ return i;
+ }
+ }
+ return info;
+ }
+
public int compare(Object plugin1, Object plugin2) {
if ((plugin1 instanceof Plugin) && (plugin2 instanceof Plugin)) {
return ((Plugin) plugin1).getName().compareToIgnoreCase(((Plugin) plugin2).getName());
@@ -306,16 +316,15 @@ private String getDocFileNameEn() {
String readmeFile = null;
long newest = 0;
String filename;
- for (SerendipityFileInfo fileName: repository.getFileList(folderInRepository)) {
- filename = fileName.getFilename();
+ for (SerendipityFileInfo file: repository.getFileList(folderInRepository)) {
+ filename = file.getFilename();
//System.out.println(name + ": " + filename);
if (filename.equals("documentation_en.html")) {
return "documentation_en.html";
} else if (isDocReadme(filename)) {
- File enDocFile = new File(getFolder() + "/" + filename);
- if (enDocFile.lastModified() > newest) {
+ if (file.getFileDate() > newest) {
readmeFile = filename;
- newest = enDocFile.lastModified();
+ newest = file.getFileDate();
}
}
}
View
69 src/serendipitytranslator/mainWindow/PluginList.java
@@ -51,32 +51,10 @@ public void addPropertyChangeListener(PropertyChangeListener listener) {
propertyChange.addPropertyChangeListener(listener);
}
- private static SimpleFileRepository selectRepository(String repoType) {
- SimpleFileRepository workingRepository;
- if (repoType.equals("svn")) {
- workingRepository = new SvnHTMLRepository();
- } else if (repoType.equals("git")) {
- workingRepository = new GitHTMLRepository();
- } else if (repoType.equals("folder")) {
- workingRepository = new SimpleFileRepository();
- } else {
- workingRepository = new CvsHTMLRepository();
- }
- return workingRepository;
- }
-
public void loadFromWeb() {
- SimpleFileRepository coreRepository = selectRepository(settings.getCoreType());
- coreRepository.setRepositoryFolderName(settings.getCoreLocalFolder());
- coreRepository.setHasInternalPlugins(true);
-
- SimpleFileRepository pluginsRepository = selectRepository(settings.getExternPluginsType());
- pluginsRepository.setRepositoryFolderName(settings.getExternPluginsLocalFolder());
- pluginsRepository.setHasInternalPlugins(false);
-
- SimpleFileRepository themesRepository = selectRepository(settings.getExternThemesType());
- themesRepository.setRepositoryFolderName(settings.getExternThemesLocalFolder());
- themesRepository.setHasInternalPlugins(false);
+ SimpleFileRepository coreRepository = settings.getCoreRepository();
+ SimpleFileRepository pluginsRepository = settings.getPluginsRepository();
+ SimpleFileRepository themesRepository = settings.getThemesRepository();
boolean downloadsRequired = coreRepository.isUpdatable() || pluginsRepository.isUpdatable() || themesRepository.isUpdatable();
boolean internetAvailable = ajglTools.checkInternetConnection();
@@ -96,12 +74,9 @@ public void loadFromWeb() {
//System.out.println("Internals will be loaded.");
boolean coreRepAvailable = true;
- if (coreRepository instanceof AbstractHTMLRepository) {
- if (ajglTools.checkInternetConnection(settings.getCoreUrl())) {
- ((AbstractHTMLRepository) coreRepository).setRemoteURL(settings.getCoreUrl());
- } else {
- coreRepAvailable = false;
- }
+ if (coreRepository instanceof AbstractHTMLRepository
+ && !((AbstractHTMLRepository) coreRepository).isAvailable()) {
+ coreRepAvailable = false;
}
if (coreRepAvailable) {
coreRepository.loadListOfPlugins(this, "plugins", language, true);
@@ -112,12 +87,9 @@ public void loadFromWeb() {
//System.out.println("External plugins be loaded.");
boolean pluginRepAvailable = true;
- if (pluginsRepository instanceof AbstractHTMLRepository) {
- if (ajglTools.checkInternetConnection(settings.getExternPluginsUrl())) {
- ((AbstractHTMLRepository) pluginsRepository).setRemoteURL(settings.getExternPluginsUrl());
- } else {
- pluginRepAvailable = false;
- }
+ if (pluginsRepository instanceof AbstractHTMLRepository
+ && !((AbstractHTMLRepository) pluginsRepository).isAvailable()) {
+ pluginRepAvailable = false;
}
if (pluginRepAvailable) {
pluginsRepository.loadListOfPlugins(this, "", language, false);
@@ -270,26 +242,9 @@ public void saveToLocalDb() {
}
public static PluginList loadFromLocalDb(String language) {
- SimpleFileRepository coreRepository = selectRepository(settings.getCoreType());
- coreRepository.setRepositoryFolderName(settings.getCoreLocalFolder());
- coreRepository.setHasInternalPlugins(true);
- if (coreRepository instanceof AbstractHTMLRepository) {
- ((AbstractHTMLRepository) coreRepository).setRemoteURL(settings.getCoreUrl());
- }
-
- SimpleFileRepository pluginsRepository = selectRepository(settings.getExternPluginsType());
- pluginsRepository.setRepositoryFolderName(settings.getExternPluginsLocalFolder());
- pluginsRepository.setHasInternalPlugins(false);
- if (pluginsRepository instanceof AbstractHTMLRepository) {
- ((AbstractHTMLRepository) pluginsRepository).setRemoteURL(settings.getExternPluginsUrl());
- }
-
- SimpleFileRepository themesRepository = selectRepository(settings.getExternThemesType());
- themesRepository.setRepositoryFolderName(settings.getExternThemesLocalFolder());
- themesRepository.setHasInternalPlugins(false);
- if (themesRepository instanceof AbstractHTMLRepository) {
- ((AbstractHTMLRepository) themesRepository).setRemoteURL(settings.getExternThemesUrl());
- }
+ SimpleFileRepository coreRepository = settings.getCoreRepository();
+ SimpleFileRepository pluginsRepository = settings.getPluginsRepository();
+ SimpleFileRepository themesRepository = settings.getThemesRepository();
PluginList plugins = new PluginList(language);
try {
View
64 src/serendipitytranslator/manual/help.html
@@ -1,30 +1,38 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html>
+<?xml version="1.0" encoding="windows-1250"?>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" >
<head>
- <meta http-equiv="content-type" content="text/html; charset=windows-1250">
- <meta name="generator" content="PSPad editor, www.pspad.com">
- <title></title>
+ <meta http-equiv="content-type" content="text/html; charset=windows-1250" />
+ <title>Serendipity Translator - Help</title>
</head>
<body>
<h2>Users' guide</h2>
<h3>Settings (shortcut key "S")</h3>
-<img width="404" height="180" style="border: 0px; padding-left: 5px; padding-right: 5px;" src="settings_dialog.png" alt="" />
+<img width="498" height="533" style="border: 0px; padding-left: 5px; padding-right: 5px;" src="settings_dialog.png" alt="" />
<p>
First it is recomended to set up the programm. Click on "Settings" (shortcut key "s"). Set the <b>language</b> you want to translate to. Set also the <b>name and e-mail of translator</b>. It will be used only to be included in translated files, to let know further translators who did the translations before.
+</p>
<p>
<b>do not show plugins without translate file</b> - some plugins, especially templates, have no language files, no messages to translate. In the list of plugins, they are only for your information. Checking this option will hide them in the list.
+</p>
<p>
<b>WWW address with application</b> - Here you can specify our own server (folder) that holds newest version of application.
+</p>
+<p>
+ <b>Serendipity core</b>, <b>Additional plugins</b>, <b>Additional themes</b> - Here you can set the access method (<b>Repository type</b>) and addres of remote repository (<b>URL</b>), from which the lang files are downloaded, and where to store them on your computer (<b>Local folder</b>). Default settings work well, in first it is not necessary to change it. If you observe difficulties, eg. downloading seem to be slow, you can try to change it. But you shoud read <a href="#protocols">paragraph about protocols</a> first.
+</p>
<h3>Main window</h3>
<h4>"Update plugin list" button (shortcut key "U")</h4>
After clicking, the application will connect to the internet repository (the same as Spartacus uses), download the list of plugins and will try to know, which plugin includes translated language files. In this moment the application does not know the content of language files. It only knows, that some translated file exists. To prospect language files it is necessary to download them by clicking on following button.
<h4>"Download files" button (shortcut key "D")</h4>
<p>The program will download language files - english files and also the files in selected local language (see Settings) and will compare them by content. Downloading can be lengthy, therefore there is progress bar that informs you about the downloading progress.
+</p>
<p>
<img width="540" height="90" style="border: 0px; padding-left: 5px; padding-right: 5px;" src="download_progress.png" alt="" />
+</p>
<p>In version 1.6 was added feature, that downloads only changed files. Downloading is now a bit faster. Also you can now stop the downloading by bancel button. Since mentioned version, documentation files (documentation_xx.html, readmes, ChangeLogs) are also downloaded to enable you to translate also this documentation. See section <a href="#documentation">Documentation translations</a>.
</p>
@@ -58,12 +66,13 @@
<p>
"Status" column compares downloaded file (from "plugins" directory) with english one.
+</p>
<p>
"Translate status" column compares translated file (from "plugins_translated" directory) with english one.
-<p>
+</p>
- <ol>
- These situations are possible.
+These situations are possible.
+<ol>
<li>If one plugin has "Status" partial or no, and "translate status" is ok, then we have already translated the file, but it wasn't uploaded to the internet repository. It is time to publish it on serendipity forum.</li>
<li>"Status" is ok, "Translate status" is no - it means that the plugin is well translated, but we didn't do the translation. There is no need to translate it any more.</li>
<li>"Status" is partial or no and "Translate status" is partial. It means that we have alredy translated the file, but that we didn't finish the job. It needs to finish the translation and to publish the result on serendipity forum.</li>
@@ -86,13 +95,15 @@
<h3>Translation window</h3>
<p>
In the upper part of translation window, there are three fields - the name of edited message, the message in english and the message in local language.
+</p>
<p>
Local language messages can be edited in the table with messages and also in the field with local message.
+</p>
<p>
In the status bar, there is "original" x "modified" message. It signalises if the file has been changed or not. If the status is "modified", it is possible to save the file. The file will be stored in "plugins_translated" directory.
-<p>
-<ul>
+</p>
The translation table rows can be of 4 colors:
+<ul>
<li>red - the message is not translated in local language</li>
<li>green - the message exists in local language, but it is the same as in the english language file. It is highly probable, that the translator who translated the file before you, did the copy of messages, but did not translate all of them.</li>
<li>yellow - the message exists in local language, but not in english. It is possible that it was removed in newer version of plugin. If we want to remove it from the translated file, we will delete it. Blank messages are not written in the language file during saving.</li>
@@ -116,29 +127,45 @@
The documentation files in utf-8 encoding are created after clicking on <a href="#export_to_zip">"export translated files to zip file"</a> in "translations" menu.
</p>
+<a name="protocols"></a>
+<h3>Protocols - access to internet repositories</h3>
+<p>
+ ATTENTION! URL address of internet repository is bound with type of repository - eg. github.com has its git html web page, sourceforge.net offers its web frontend for cvs. Serendipity Translator does not check this dependencies, so you can make it not working, when you set it wrong, eg. when you write github.com in URL field and select cvs repository.
+</p>
+<p>
+ ATTENTION! Default settings for downloading Serendipity Core files is not perfect. In November 2011 the core was moved from berlios.de (which was stopped) to github.com. Unfortunately the html frontend of github is difficult to parse, so now the files are not downloaded from the most recent commit. Additionally the information about last modified date is displayed through javascript, which Serendipity Translator cannot pass. It causes, that all files are always downloaded (more net traffic and more time), and that documentation cannot display properly its status (translated, not translated). Much better is to set the "git native". See below.
+</p>
+Protocol types:
+<ul>
+ <li><b>HTML protocols - svn, cvs, git html</b> - It's easy, these protocols connect to www interface of repository (the same way you can watch them in your internet browser), read its content, parse it and gets the information about plugins and files. These protocols download all files changed from last download. Than the app works with downloaded files.</li>
+ <li><b>folder</b> - Ignores the remote URL settings. Just reads the files from local directory. Does not download anything. It is necessary to update the files outside Serendipity Translator. The date is red form the file's last modified date. It is reason, why next scenario does not work well: to set externally git or cvs file, update it externally and access it through Serendipity Translator "folder" protocol. Because the files updated through git (cvs) do not have the date equivalent to the date of last commit, when they were modified.</li>
+ <li><b>git native</b> - benefits from versioning system git. Currently it ignores the remote URL settings and it cannot set up local repository, nor connect it to remote repository (eg. github). You must do it manually outside of Serendipity Translator. Then you can point Serendipity Translator to local folder with repository, then the app is able to update automatically local repository from remote repository. Serendipity Translator gets the file date not from last-modified property, but from the date of last commit in git, when the file was modified.</li>
+</ul>
+
<h2>How the program works internally</h2>
-<ul>
<h3>Filling in messages already set elsewhere</h3>
+<ul>
<li>In some plugins, especially templates there are some messages that are repeated (copied) from other plugins (mostly templates) frequently. The application stores all messages into its internal database during each comparison. And then if it finds untranslated message whose key is already in database, it fills in the translated message. This supports also the coherency of translation. There is less chance to translate logically the same messages differently.</li>
</ul>
-<ul>
<h3>Directories it creates</h3>
+<ul>
<li>plugins - directory with downloaded language files. These files change only after clicking the "Download files" button and downloading the up to date files. It contains the same language files that are available in online plugins repository.</li>
<li>plugins_translated - There is the result of your translation effort. The publishing of translated files is not automatic. It is up to you to publish them, mainly on serendipity forum (<a href="http://board.s9y.org">board.s9y.org</a>). The plugins are sorted in subdirectories in groups, that are important for serendipity developpers.</li>
</ul>
-<ul><h3>Language file format</h3>
+<h3>Language file format</h3>
+<ul>
<li>header - it is automatically generated, it contains the information about translation version, translator name (it is taken from Settings dialogue) and date of translation</li>
<li>The file that is created from the scratch, the first version of the translation, has the messages sorted in the same order as in the english file.</li>
<li>The file, that was already translated, it means when we make only the update of the file, has the same ordering of messages as the original file. The parts that are not changed, have the same format in both files. New messages are appended at the end of the file. The program tries to preserve the format of messages. It means mainly the caracters between the message name and its content in @define function. So when the main part of language file has the format "@define('BLABLAH',[tab]'blahblah message');" also the new messages will have ",[tab]" in the right place. Also the padding to some position is supported, e.g. if 'blahblah message' starts mostly on column 50, the new messages will start also on column 50.
</li>
</ul>
-<ul>
<a name="export_to_zip"></a>
<h3>Export to zip file</h3>
+<ul>
<li>Only plugins that are completely translated are exported into zip file. It means that "Translated status" equals to "ok", and plugin is not translated yet, it means when "Status" is not "ok" or if messages in translated file are not the same as messages in downloaded file.</li>
<li>Only files of current language are exported.</li>
<li>Documentation files of current language are exported only if documentation status equals "local".</li>
@@ -181,8 +208,11 @@
Saving of downloaded files with original timestamp - this avoids false marking of documentation files as not translated.<br />
Added automatic conversion of documentation files into UTF-8 version.</li>
-<li><b>1.10</b><br />(dosud nevydáno) Oprava adresy, na kterou se pøipojuje pøi kontrole spojení na berlios.de.<br />
-Pøidáno stahování souborù "todo", "copy*", "author(s)" jako dokumentace.
+<li><b>2.0</b> - 2011/12/10<br />
+Added - now also files "todo", "copy*", "author(s)" are downloaded as documentation.<br />
+Added - The "Settings" dialogue was extended. Now it is possible to set the internet repository, from which language files will be downloaded.<br />
+Added - support of git.<br />
+Added - function to update the application. A library is used to access the git, so now the application has more than one file. It is necessarry to download all files in one zip file and then to unpack it.
</li>
</ul>
</body>
View
261 src/serendipitytranslator/manual/help_cs.html
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="windows-1250"?>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="cs" >
+ <head>
+ <meta http-equiv="content-type" content="text/html; charset=windows-1250" />
+ <title>Serendipity Translator - nápověda</title>
+ </head>
+ <body>
+<h2>Download</h2>
+<p>
+Spustitelný program - <a href="http://vlada.ajgl.cz/serendipity_translator/SerendipityTranslator.jar">SerendipityTranslator.jar</a>
+</p>
+<p>
+Zdrojový kód - <a href="http://vlada.ajgl.cz/serendipity_translator/SerendipityTranslator.zip">SerendipityTranslator.zip</a>
+</p>
+
+<h2>Instalace</h2>
+<ol>
+<li>Ujistěte se, že máte nainstalovaný Java runtime environment ve verzi 6 nebo vyšší. Pokud nemáte, stáhnete z <a href="http://www.java.com/en/download/manual.jsp?locale=en" title="www.java.com">www.java.com</a>.</li>
+
+<li>Stáhnete spustitelný soubor <a href="http://vlada.ajgl.cz/serendipity_translator/SerendipityTranslator.jar">SerendipityTranslator.jar</a> do libovolného adresáře.</li>
+
+<li>Poklepáním na soubor spustíte.</li>
+</ol>
+
+<h2>Návod k použití</h2>
+<h3>Nastavení (klávesová zkratka "S")</h3>
+<!-- s9ymdb:1490 --><img width="498" height="533" style="border: 0px; padding-left: 5px; padding-right: 5px;" src="/uploads/settings_dialog.png" alt="" />
+
+<p>
+Po spuštění je třeba program nastavit. Kliknutím na menu "Settings" (nebo klávesová zkratka "s"). Zadejte <b>jazyk</b>, do kterého chcete překládat z předvybraného seznamu. A také <b>jméno překladatele a jeho emailovou adresu</b>. Na tu se nic nebude posílat, jde pouze o řádku, která bude uložena v přeložených souborech, aby případní další překladatelé věděli, kdo před nimi soubor překládal.
+</p>
+<p>
+<b>do not show plugins without translate file</b> - některé pluginy, zvláště šablony vzhledu, prostě nemají žádné jazykové konstanty, které by se daly přeložit. V seznamu pluginů pak jsou čistě pro informaci. Zaškrtnutím této volby je skryjete, seznam se tak zkrátí a zpřehlední.
+</p>
+<p>
+<b>WWW address with application</b> - Zde můžete zadat vlastní server, ze kterého se budou stahovat aktualizace programu.
+</p>
+<p>
+ <b>Serendipity core</b>, <b>Additional plugins</b>, <b>Additional themes</b> - Zde můžete zadat, pomocí jaké metody (<b>Repository type</b>), z jakého umístění na internetu (<b>URL</b>) se mají aktualizovat jazykové soubory a kam na lokální disk se mají ukládat (<b>Local folder</b>). Výchozí nastavení není třeba měnit, funguje. Pokud se vám zdá stahování pomalé, můžete zkusit toto nastavení změnit. Přečtěte si předtím ale <a href="#protocols">odstavec o přístupových protokolech</a>.
+</p>
+
+<h3>Hlavní okno</h3>
+<h4>Tlačítko "Update plugin list" (klávesová zkratka "U")</h4>
+Po klinutí se program připojí k webovému úložišti s pluginy (Spartacus), stáhne jejich seznam a z informací o pluginech zjistí, který plugin obsahuje či neobsahuje překlad v nastaveném jazyce. V tomto okamžiku program nezná obsah přeložených souborů, ty je třeba stáhnout kliknutím na následující tlačítko. Program v tuto chvíli pouze ví, že soubor s překladem existuje, ale neví, co obsahuje.
+
+<h4>Tlačítko "Download files" (klávesová zkratka "D")</h4>
+Program stáhne soubory překladů - jednak anglické a pak ve vybraném lokálním jazyku (viz. nastavení) a porovná je z hlediska obsahu. Výsledky porovnání viz. odstvec "Tabulka s pluginy". Stahování může být zdlouhavé, proto o průběhu stahování uživatele informuje ukazatel vývoje stahování.
+<!-- s9ymdb:1491 --><img width="540" height="90" style="border: 0px; padding-left: 5px; padding-right: 5px;" src="/uploads/download_progress.png" alt="" />
+<p>Od verze 1.6 program stahuje pouze od minula změněné soubory, takže je stahování trochu rychlejsí. Stahování je navíc možno přerušit stisknutím tlačítka "Cancel". Od zmíněné verze jsou stahovány také soubory dokumentace (documentation_xx.html, readme, ChangeLog). O sledování překladů dokumentace více viz sekce <a href="#documentation">Překlad dokumentace</a>.
+</p>
+
+<h4>Tlačítko "Compare files by content" (klávesová zkratka "C")</h4>
+Pokud z nějakého důvodu nejsou soubory porovnány a tabulka s pluginy ukazuje něco jiného než současný stav (např. po ručním překladu <a href="#documentation">souborů dokumentace</a>), lze program přinutit k opětovnému prohledání jazykových souborů (které jsou uloženy na disku, nic se nestahuje) a jejich porovnání.
+
+<h4>Tabulka s pluginy</h4>
+<ul>
+<li>dvojklik na řádek s pluginem, případně vybrat řádku a "enter" - otevře překládací okno</li>
+
+<li>sloupec "Type":
+ <ol>
+ <li>system - systémový soubor, soubor s hlavními jazykovými zprávami pro serendipity</li>
+ <li>event - jazykový soubor pro plugin události</li>
+ <li>sidebar - jazykový soubor pro postranní plugin</li>
+ <li>template - jazykový soubor pro šablonu vzhledu</li>
+ </ol>
+</li>
+
+<li>sloupec "Internal" - zaškrtnuté pluginy jsou součástí základního balíčku Serendipity, ostatní jsou dostupné z webu nebo pomocí Spartacuse</li>
+
+<li>sloupec "en" a sloupec "loc" - počet zpráv (řádků) v anglickém (lokálním, českém) jazykovém souboru. Tady si můžete vybrat, jestli chcete překládat dlouhé nebo krátké soubory (jsou rychle přeložené). Taky lze podle toho posoudit, jak moc, jak dalece jsou přeloženy částečně přeložené soubory, kolik toho v nich zbývá dopřeložit.</li>
+
+<li>sloupec "Status" a "Translate status":
+ <ol>
+ <li><!-- s9ymdb:1493 --><img width="12" height="12" style="border: 0px; padding-left: 5px; padding-right: 5px;" src="/uploads/ok.png" alt="" /> ok - všechny zprávy (řádky) z anglického souboru jsou přítomny i v lokálním (českém), tedy soubor je úplně přeložen. Neboli číslo v sloupci "en" se shoduje s číslem ve sloupci "loc"</li>
+ <li><!-- s9ymdb:1492 --><img width="12" height="12" style="border: 0px; padding-left: 5px; padding-right: 5px;" src="/uploads/no.png" alt="" /> no - jazykový soubor v lokální verzi vůbec neexistuje, je možno ho přeložit</li>
+ <li><!-- s9ymdb:1494 --><img width="12" height="12" style="border: 0px; padding-left: 5px; padding-right: 5px;" src="/uploads/partial.png" alt="" /> částečně - některé zprávy z anglického souboru jsou přítomny i v lokálním (českém). Neboli číslo v sloupci "en" se neshoduje s číslem ve sloupci "loc". Některé zprávy je třeba dopřeložit.</li>
+ <li><!-- s9ymdb:1495 --><img width="12" height="12" style="border: 0px; padding-left: 5px; padding-right: 5px;" src="/uploads/problem.png" alt="" /> problem - plugin vůbec nemá anglický soubor s jazykovými konstantami, nic tedy ani nelze překládat.</li>
+ </ol>
+
+<p>
+Sloupec "Status" porovnává stažený český soubor s anglickým.
+</p>
+<p>
+Sloupec "Translate status" porovnává již přeložený soubor s anglickým.
+</p>
+
+ Může nastat několik situací.
+ <ol>
+ <li>Pokud u toho samého pluginu je "Status" částečný nebo no, ale "translate status" je ok, znamená to, že jsme soubor již přeložili, ale zatím ho pomocí fóra neposkytli komunitě serendipity, tedy není přístupný na webu, je pouze v našem počítači.</li>
+ <li>"Status" je ok, "Translate status" je no - to znamená, že plugin je úspěšně přeložen, my jsme ho nepřekládali. A ani ho nemusíme překládat.</li>
+ <li>"Status" je částečně nebo no a "Translate status" je částečně. To znamená, že jsme již soubor částečně přeložili, ale nedokončili. Je tedy třeba dokončit překlad a nahrát ho na forum serendipity.</li>
+ </ol>
+
+</li>
+<li>Sloupec "Documentation":
+ Zobrazuje jednu z následujících hodnot týkajících se stavu překladu dokumentace:
+ <ol>
+ <li><!-- s9ymdb:1493 --><img width="12" height="12" style="border: 0px; padding-left: 5px; padding-right: 5px;" src="/uploads/ok.png" alt="" />ok - Český soubor dokumentace existuje (byl stažen ze serveru) a je mladší než anglická dokumentace, tedy je dost dobrý předpoklad, že je překlad kompletní a aktuální.</li>
+ <li><!-- s9ymdb:1496 --><img width="12" height="12" style="border: 0px; padding-left: 5px; padding-right: 5px;" src="/uploads/local.png" alt="" />local - Česká dokumentace neexistuje na serveru, ale mezi přeloženými soubory je a soubor je mladší než anglická dokumentace. Znamená to tedy, že jste dokumentaci už přeložili, jen jste ji ještě nenahráli na server, nezveřejněli světu.</li>
+ <li><!-- s9ymdb:1492 --><img width="12" height="12" style="border: 0px; padding-left: 5px; padding-right: 5px;" src="/uploads/no.png" alt="" />no - Anglická dokumentace existuje, ale česká nikoliv. Je čas přeložit ji:-) </li>
+ <li><!-- s9ymdb:1494 --><img width="12" height="12" style="border: 0px; padding-left: 5px; padding-right: 5px;" src="/uploads/partial.png" alt="" />partial, částečně - Česká dokumentace existuje na serveru nebo na lokálním počítači, ale anglická dokumentace je mladší. Znamená to, že anglická dokumentace byla aktualizována, ale tyto změny ještě nejsou promítnuty v české dokumentaci. </li>
+ <li><!-- s9ymdb:1495 --><img width="12" height="12" style="border: 0px; padding-left: 5px; padding-right: 5px;" src="/uploads/problem.png" alt="" />problem - Plugin nemá žádnou dokumentaci, není tedy co překládat. </li>
+</ol></li>
+</ul>
+
+<h4>Překládací okno</h4>
+<p>
+V horní části překládacího okna jsou tři pole - název editované zprávy, její znění v angličtině a třetí je znění v češtině.
+</p>
+<p>
+Zprávy jde editovat jak v tabulce, tak ve velkém poli s českým zněním zprávy.
+</p>
+<p>
+Ve status řádku se zobrazuje "original" x "modified" podle toho, zda-li bylo v překladu něco změněno nebo ne. Pokud je status "modified", je možné soubor uložit. Takto uložený soubor se nachází v adresáři "plugins_translated".
+</p>
+Řádky tabulky mohou mít celkem 4 barvy:
+<ul>
+<li>červená - zpráva není přeložená do lokálního jazyka (češtiny)</li>
+<li>zelená - zpráva existuje v lokálním jazyce, ale je totožná s anglickou. Je tedy velmi pravděpodobné, že překladatel před námi pouze zkopíroval anglické zprávy do českého souboru a zapomněl je přeložit.</li>
+<li>žlutá - zpráva existuje v loklním jazyce, ale není v angličtině. Nejspíš byla v nové verzi odstraněna z anglického souboru. Pokud ji chceme odstranit i z českého, smažeme její znění. Prázdné zprávy se při ukládání nezapisují do souboru.</li>
+<li>bílá - zpráva existuje jak v anlgickém, tak v českém souboru, jsou různé, tedy úspěšně přeložené. Úplně přeložené soubory by měly obsahovat většinu bílých a případně zelené řádky (pokud se překlad zprávy shoduje s anglickým zněním).</li>
+</ul>
+
+<a name="documentation"></a><h3>Překládání dokumentace</h3>
+<p>
+Soubory s anglickou dokumentací jsou rozmístěny v různě nazvaných souborech. Anglická dokumentace by sice měla být v souboru "documentation_en.html", ale u spousty pluginů existuje pouze readme (navíc různě pojmenované jako "readme, readme.txt, pluginReadme.txt, credits.txt" nebo ChangeLog). Všechny tyto soubory jsou stahovány ze serveru a je s nimi zacházeno jako s dokumentací.
+</p>
+<p>
+Protože se formát souborů s dokumentací navzájem liší, není v programu žádný nástroj na její překlad. Ten musíte zvládnout sami pomocí vnějšího textového editoru.
+</p>
+<p>
+Pokud chcete využívat výhod sledování stavu překladu dokumentace a jejího automatického zabalování do zip archivu, měli byste uložit přeložené soubory do podadresáře pluginu v adresáři "plugins_translated" a ukládat ji striktně pod jménem souboru "documentation_xx.html", kde "xx" nahraďte zkratkou jazyka.
+</p>
+<p>
+Od verze programu 1.9 už jsou automaticky vytvářeny soubory dokumentace v kódování utf-8 ze souborů s národním kódováním, pokud soubor utf-8 ještě neexistuje. Nicméně tato funkce má jistá omezení. Soubory v kódování utf-8 mohou být mírně odlišné od souborů v národním kódování. V souborech html je jiná hlavička meta, která obsahuje informaci o kódování použitém v dokumentu. Také odkazy na lokální soubory musí obsahovat navíc předponu "../", aby ukazovaly na správné soubory, nejčastěji obrázky, a aby se tyto nemusely kopírovat do nového adresáře v podadresáři UTF-8. Všechny vyjmenované změny program umí automaticky. Co se týče odkazů, tak ty, které začínají "http://" nebo "mailto:" zůstávají netknuty. Všechny další odlišnosti utf-8 souborů ale musí zajistit překladatel ručně.
+</p>
+<p>
+Soubory jsou do kódování utf-8 převedeny po kliknutí na export, tj. <a href="#export_to_zip">"export translated files to zip file"</a> v menu "translations".
+</p>
+
+<a name="protocols"></a>
+<h3>Protokoly - přístup k internetovým úložištím</h3>
+<p>
+ POZOR! URL adresa internetového úložiště je logicky pevně svázána s typem úložiště - např. github.com poskytuje html rozhraní pro git, sourceforge.net html rozhraní pro cvs. Serendipity Translator tuto závislost nijak nehlídá, takže pokud to nastavíte špatně (například zadáte adresu github.com a k tomu vyberete cvs úložiště), tak vám to nebude fungovat.
+</p>
+<p>
+ POZOR! Výchozí nastavení pro jádro (Serendipity Core) není úplně ideální. V listopadu 2011 došlo k přesunu jádra serendipity ze serveru berlios.de, který ukončil činnost, na github.com. Bohužel html rozhraní githubu, ze kterého Serendipity Translator získává informace o tom, které soubory má stahovat, se obtížněji parsuje, takže je v současnosti přednastavený odkaz na ne úplně poslední commit. Navíc datum poslední změny je přístupné pouze přes javascript, který Serendipity Translator taktéž neumí projít. V důsledku toho se z githubu vždy stahují všechny soubory (větší provoz po síti a déle to trvá) a u dokumentace nefunguje indikace stavu, tj. jestli je nebo není přeložená, protože k tomu je potřeba znát datum poslední změny souboru. V současnosti dobře funguje, pokud nastavíte "git native". Viz níže.
+</p>
+Typy protokolů:
+<ul>
+ <li><b>HTML protokoly - svn, cvs, git html</b> - U těch je to jednoduché - ty se připojí k zadané www adrese, prohlédnou si její obsah, jako to můžete udělat sami v internetovém prohlížeči, vyzobají z něj informace o pluginech a souborech a stáhnou ze serverů na lokální disk soubory změněné od posledního stahování. S lokálními soubory pak dále pracují při překladech.</li>
+ <li><b>folder</b> - Ignoruje nastavení URL adresy pro vzdálený počítač. Prostě jen čte soubory ze zadaného adresáře na lokálním disku. Nic nestahuje, soubory je třeba aktualizovat mimo SerendipityTranslator. Informace o poslední změně souboru se bere z jeho data. Tedy nefunguje příliš dobře varianta, že sami založíte cvs nebo git adresář a ukážete na něj v Serendipity Tranlsatoru pomocí protokolu "folder", protože soubory aktualizované pomocí cvs nebo gitu nemají datum poslední změny shodné s datem posledního commitu, kdy byl soubor měněn.</li>
+ <li><b>git native</b> - využívá vymoženosti verzovacího protokolu git. V současnosti ignoruje zadanou URL adresu a neumí založit lokální git úložiště, ani ho neumí napojit na vzdálené úložiště např. na githubu. To musíte udělat sami, ručně. Jakmile je úložiště založeno a v nastavení Serendipity Translatoru nastavíte lokální adresář na adresář s gitem, Serendipity Translator si už umí úložiště automaticky aktualizovat a vytahat z něj potřebné informace jako datum poslední změny. Datum poslední změny se v tomto případě nebere z data souboru, ale z data posledního commitu, kdy byl soubor změněn.</li>
+</ul>
+
+<h2>Jak program vnitřně funguje</h2>
+
+<h3>Doplňování jinde již přeložených zpráv</h3>
+<ul>
+<li>V některých pluginech (většinou v šablonách vzhledu) se často opakují některé zprávy. Je to hlavně případ šablon vzhledu, které jejich autoři často vytvářejí kopírováním z jiné šablony, a ponechávají jim přitom původní jazykový soubor nebo ho jen minimálně mění. SerendipityTranslator si při každém porovnání souborů uloží do interní databáze seznam překládaných zpráv, a pokud někdy v budoucnu najde zprávu, která není přeložená, ale jejíž klíč již existuje v databázi, doplní přeloženou zprávu z databáze. Tato funkce podporuje koherenci překladu. Je méně pravděpodobné, že v různých pluginech přeložíte různě zprávu, která by měla být logicky stejná.</li>
+</ul>
+
+<h3>Adresáře, které program vytváří</h3>
+<ul>
+<li>plugins - adresář se staženými soubory. Tyto soubory se mění pouze po klinutí na tlačítko "Download files", nikdy jindy. Obsahují stejné jazykové soubory, které jsou k dispozici v internetovém skladišti.</li>
+<li>plugins_translated - Tady je výsledek Vašich překladů. Zde uložené soubory je nutné k jejich uveřejnění nahrát na diskuzní fórum serenedipity (<a href="http://board.s9y.org">board.s9y.org</a>). Přeložené pluginy jsou tříděny do podadresářů podle různých skupin, které jsou správci serendipity různě spravovány. </li>
+</ul>
+
+<h3>Formát ukládaných souborů</h3>
+<ul>
+<li>hlavička - je standardně generována, obsahuje informace o verzi překladu, jméno překladatele (nastaví se v dialogu nastavení) a datum překladu</li>
+<li>Soubor, který se tvoří z čisté vody načisto, má jazykové konstanty řazené stejně jako anglická předloha</li>
+<li>Soubor, který již má předchůdce, tedy pokud upravujeme existující překlad, má stejné řazení a formátování jako již existující soubor. Části, které se nemění, jsou v obou souborech totožné. Nově přeložené zprávy jsou přidány na konec souboru. Snaha je o zachování stejného formátu (zvláště zarovnání, znaky mezi definicí klíče a textem ve funkci @define).</li>
+</ul>
+
+<a name="export_to_zip"></a>
+<h3>Export do zip archivu</h3>
+<ul>
+<li>Do zip archivu jsou exportovány pouze nové úplně přeložené překlady. To znamená, že "Translated status" musí být "ok" (zelená fajfka) a zároveň "Status" nesmí být "ok" a když je, tak obsah jednotlivých zpráv nesmí být u původního i nově přeloženého souboru totožný.</li>
+<li>Exportovány jsou pouze soubory aktuálního jazyku.</li>
+<li>Soubory dokumentace jsou exportovány pouze pro aktuální jazyk a pokud mají status "local".</li>
+<li>Jsou exportovány jak soubory v místním kódování, tak v UTF-8.</li>
+<li>Export probíhá do jediného zip archivu, ve kterém jsou překlady členěny podle kategorií - internal x external, plugins x templates.</li>
+</ul>
+
+<h2>Řešení problémů</h2>
+<ul>
+<li>Program vytváří soubor "error.log" s chybovými hláškami.</li>
+<li>V případě, že aplikace nefunguje tak, jak je očekáváno, odešlete prosím soubor "error.log" autorovi.</li>
+</ul>
+
+<h2>Licence</h2>
+<p>
+Tento program poskytuji světu pod BSD licencí, jejíž text následuje:
+</p>
+<hr />
+
+Copyright © 2009, Vladimír Ajgl. Všechna práva vyhrazena.
+<p>
+Redistribuce a použití zdrojových i binárních forem díla, v původním i upravovaném tvaru, jsou povoleny za následujících podmínek:
+</p>
+<ul>
+<li>Šířený zdrojový kód musí obsahovat výše uvedenou informaci o copyrightu, tento seznam podmínek a níže uvedené zřeknutí se odpovědnosti.</li>
+
+<li>Šířený binární tvar musí nést výše uvedenou informaci o copyrightu, tento seznam podmínek a níže uvedené zřeknutí se odpovědnosti ve své dokumentaci a/nebo dalších poskytovaných materiálech.</li>
+
+<li>Ani jméno vlastníka práv, ani jména přispěvatelů nemohou být použita při podpoře nebo právních aktech souvisejících s produkty odvozenými z tohoto software bez výslovného písemného povolení.</li>
+</ul>
+<p>
+TENTO SOFTWARE JE POSKYTOVÁN DRŽITELEM LICENCE A JEHO PŘISPĚVATELI „JAK STOJÍ A LEŽÍ“ A JAKÉKOLIV VÝSLOVNÉ NEBO PŘEDPOKLÁDANÉ ZÁRUKY VČETNĚ, ALE NEJEN, PŘEDPOKLÁDANÝCH OBCHODNÍCH ZÁRUK A ZÁRUKY VHODNOSTI PRO JAKÝKOLIV ÚČEL JSOU POPŘENY. DRŽITEL, ANI PŘISPĚVATELÉ NEBUDOU V ŽÁDNÉM PŘÍPADĚ ODPOVĚDNI ZA JAKÉKOLIV PŘÍMÉ, NEPŘÍMÉ, NÁHODNÉ, ZVLÁŠTNÍ, PŘÍKLADNÉ NEBO VYPLÝVAJÍCÍ ŠKODY (VČETNĚ, ALE NEJEN, ŠKOD VZNIKLÝCH NARUŠENÍM DODÁVEK ZBOŽÍ NEBO SLUŽEB; ZTRÁTOU POUŽITELNOSTI, DAT NEBO ZISKŮ; NEBO PŘERUŠENÍM OBCHODNÍ ČINNOSTI) JAKKOLIV ZPŮSOBENÉ NA ZÁKLADĚ JAKÉKOLIV TEORIE O ZODPOVĚDNOSTI, AŤ UŽ PLYNOUCÍ Z JINÉHO SMLUVNÍHO VZTAHU, URČITÉ ZODPOVĚDNOSTI NEBO PŘEČINU (VČETNĚ NEDBALOSTI) NA JAKÉMKOLIV ZPŮSOBU POUŽITÍ TOHOTO SOFTWARE, I V PŘÍPADĚ, ŽE DRŽITEL PRÁV BYL UPOZORNĚN NA MOŽNOST TAKOVÝCH ŠKOD.
+</p>
+
+<h2>Historie verzí</h2>
+<ul>
+
+<li><b>1.0</b><br />Prerelease verze - otestování základní funkčnosti (stahování seznmu pluginů, editace překladů)</li>
+
+<li><b>1.1</b><br />Přidané údajů o překladech (počet zpráv v překládaném souboru), grafické vylepšení (odlišení překládaných zpráv - podle toho, jestli jsou/nejsou přeložená, zpráva v angličtině je totožná s přeloženou zprávou atp.)</li>
+
+<li><b>1.2</b><br />Úprava uživatelského rozhraní (lišta s menu, nastavení programu ve vlastním dialogu, dialog "o programu", dialog s nápovědou), úprava formátování přeloženého souboru (např. zjišťování formátu již uložených řádků)</li>
+
+<li><b>1.3</b><br />Zjišťování seznamu pluginů z webového rozhraní svn/cvs skladiště pluginů a šablon vzhledů. Export přeložených pluginů do zip archivu. Statistiky.</li>
+
+<li><b>1.4</b><br />Porovnání již stažených souborů při aktualizaci seznamu pluginů. Výpis chybových hlášek do souboru.</li>
+
+<li><b>1.5</b><br />Odstranění problému s (ne)stahováním souborů v některých případech. Přidání automatického doplňování překladu opakujících se zpráv.</li>
+
+<li><b>1.6</b><br />Přidáno sledování stavu dokumentace.<br />
+Přidána funkce automatického zjišťování nových verzí programu a automatické aktualizace.<br />
+Nově stahovány pouze měněné soubory -> rychlejší stahování.
+<br />Přidána možnost přerušení stahování pluginů.</li>
+
+<li><b>1.7</b><br />
+Opravena chyba v (ne)stahování souborů s dokumentací.<br />
+Dialog postupu stahování - ukládání jeho pozice a rozměrů + další vylepšení vzhledu.
+</li>
+
+<li><b>1.8</b><br />
+Přidána kontrola dostupnosti cvs/svn serverů. Při jejich nedostupnosti se zobrazí chybová hláška.
+</li>
+
+<li><b>1.9</b> - 10.7.2011<br />
+Oprava - nyní se stahují i soubory, které jsou staré pouze několik sekund.<br />
+Oprava exportu souborů, které mají stejný obsah, ale liší se ve znacích ukončení řádků (\n - unixový styl nebo \r\n - styl windows). Nyní jsou považovány za identické.<br />
+Ukládání stažených souborů s origiálním časovým razítkem. To eliminuje falešné označování dokumentace jako nepřeložené.<br />
+Přidána automatická konverze souborů dokumentace do kódování utf-8.</li>
+
+<li><b>2.0</b> - 10.12.2011<br />
+Přidáno stahování souborů "todo", "copy*", "author(s)" jako dokumentace.<br />
+Rozšířen dialog "nastavení". Nyní je možné nastavit, ze kterého internetového úložiště se mají stahovat zdrojové soubory.<br />
+Přidána podpora Gitu.<br />
+Přepracována funkce na aktualizaci softwaru - pro git se používá knihovna, takže se program rozrostl na více souborů, které je třeba stahovat v zip souboru a následně rozbalit.
+</li>
+
+</ul>
+
+<h2>Autor</h2>
+Vladimír Ajgl, 2009-2011 (c)
+ </body>
+</html>
View
BIN src/serendipitytranslator/manual/settings_dialog.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
View
4 src/serendipitytranslator/repositories/AbstractHTMLRepository.java
@@ -26,6 +26,10 @@
private String remoteUrl;
protected HashMap<String, ArrayList<SerendipityFileInfo>> filelists = new HashMap<String, ArrayList<SerendipityFileInfo>>();
+ public boolean isAvailable() {
+ return ajglTools.checkInternetConnection(getRemoteURL());
+ }
+
private String getRemoteRepositoryFolder (String folderPath, boolean checkout) {
String folder = getRemoteURL() + "/" + folderPath;
if (checkout) {
View
175 src/serendipitytranslator/repositories/GitProtocolRepository.java
@@ -0,0 +1,175 @@
+/*
+ * To change this template, choose Tools | Templates and open the template in
+ * the editor.
+ */
+package serendipitytranslator.repositories;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import java.util.regex.Pattern;
+import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.api.PullCommand;
+import org.eclipse.jgit.api.PullResult;
+import org.eclipse.jgit.api.errors.*;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.FileMode;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.storage.file.FileRepositoryBuilder;
+import org.eclipse.jgit.treewalk.TreeWalk;
+import serendipitytranslator.mainWindow.SerendipityFileInfo;
+
+/**
+ *
+ * @author Vláďa
+ */
+public class GitProtocolRepository extends AbstractUpdatableRepository {
+
+ private boolean repoUpdated = false;
+
+ protected HashMap<String, ArrayList<SerendipityFileInfo>> filelists = new HashMap<String, ArrayList<SerendipityFileInfo>>();
+
+ @Override
+ public void updateFiles(String folderPath, String language) {
+ //throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void setRemoteURL(String remoteURL) {
+
+ }
+
+ @Override
+ public String getRemoteURL() {
+ return "";
+ }
+
+ @Override
+ public void updateFileList(String folderPath) {
+ try {
+ ArrayList<SerendipityFileInfo> filelist = new ArrayList<SerendipityFileInfo>();
+
+ FileRepositoryBuilder builder = new FileRepositoryBuilder();
+ Repository repository = builder.setGitDir(new File(getRepositoryFolderName()+"/.git"))
+ .readEnvironment() // scan environment GIT_* variables
+ .findGitDir() // scan up the file system tree
+ .build();
+
+ // update repository if not updated yet
+ if (!repoUpdated) {
+ Git git = new Git(repository);
+ PullCommand pull = git.pull();
+ pull.setTimeout(10);
+ PullResult pr = pull.call();
+ System.out.println(pr.getFetchedFrom());
+ System.out.println(pr.toString());
+ repoUpdated = true;
+ }
+
+ ObjectId headId = repository.resolve(Constants.HEAD);
+ RevWalk walk = new RevWalk(repository);
+ walk.markStart(walk.parseCommit(headId));
+ TreeWalk tree = new TreeWalk(repository);
+
+ // go through all commits, collect their dates and add all trees to walker
+ Iterator<RevCommit> it = walk.iterator();
+ int i = 0;
+ boolean missing;
+ int firstMissing;
+ int j = 0;
+ int size = 10000;
+ long[] commitDates = new long[size];
+ while (it.hasNext() && (i++ < size)) {
+ RevCommit lastCommit = it.next();
+ commitDates[i-1] = lastCommit.getCommitTime()*1000l;
+ tree.addTree(lastCommit.getTree());
+ }
+ if (i<size) {
+ size = i;
+ }
+ //System.out.println("Number of trees (commits): "+tree.getTreeCount());
+
+ // find the folder
+ Pattern p = Pattern.compile("/");
+ for(String folder: p.split(folderPath)) {
+ while (tree.next() && !tree.getNameString().equals(folder)) {
+ //System.out.println("folder = "+folder+"; treeitem = "+tree.getPathString());
+ }
+ if (tree.getNameString().equals(folder)) {
+ tree.enterSubtree();
+ }
+ }
+
+ // go through required tree and find dates of last commit for each file
+ tree.setPostOrderTraversal(true);
+ while (tree.next() && !tree.isPostChildren()) {
+ firstMissing = 0;
+ missing = false;
+ for (i = 1; i < size ; i++) {
+ j = i-1;
+ missing = (tree.getFileMode(i) == FileMode.MISSING);
+ if (missing && firstMissing == 0) {
+ firstMissing = i;
+ }
+ if (firstMissing != 0 && !missing) {
+ firstMissing = 0;
+ }
+ if (!tree.idEqual(0, i) && !missing) {
+ break;
+ }
+ }
+ //System.out.println("i = " + i+ "; tree = " + tree.getPathString() + "; " +tree.isPostChildren()+ "; " +tree.isPostOrderTraversal()+ "; " +tree.isSubtree());
+ if (i==size && missing) {
+ j = firstMissing-1;
+ //System.out.println(tree.getNameString() + " only initial commit");
+ }
+ if (i==size && !missing) {
+ j = size-1;
+ //System.out.println(tree.getNameString() + " set on first commit and then never changed");
+ }
+
+ //System.out.println(tree.getNameString() + " - "+ j +" - " + tree.idEqual(0, j) + "; "+tree.getObjectId(0)+ "; "+tree.getObjectId(j) + "; "+tree.getFileMode(j));
+ filelist.add(new SerendipityFileInfo(tree.getNameString(),commitDates[j]));
+ //lastCommit.getCommitTime()*1000l
+ }
+
+ filelists.put(folderPath, filelist);
+ repository.close();
+ } catch (WrongRepositoryStateException ex) {
+ Logger.getLogger(GitProtocolRepository.class.getName()).log(Level.SEVERE, null, ex);
+ } catch (InvalidConfigurationException ex) {
+ Logger.getLogger(GitProtocolRepository.class.getName()).log(Level.SEVERE, null, ex);
+ } catch (DetachedHeadException ex) {
+ Logger.getLogger(GitProtocolRepository.class.getName()).log(Level.SEVERE, null, ex);
+ } catch (InvalidRemoteException ex) {
+ Logger.getLogger(GitProtocolRepository.class.getName()).log(Level.SEVERE, null, ex);
+ } catch (CanceledException ex) {
+ Logger.getLogger(GitProtocolRepository.class.getName()).log(Level.SEVERE, null, ex);
+ } catch (RefNotFoundException ex) {
+ Logger.getLogger(GitProtocolRepository.class.getName()).log(Level.SEVERE, null, ex);
+ } catch (JGitInternalException ex) {
+ Logger.getLogger(GitProtocolRepository.class.getName()).log(Level.SEVERE, null, ex);
+ } catch (IOException ex) {
+ Logger.getLogger(GitProtocolRepository.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ }
+
+ @Override
+ public ArrayList<SerendipityFileInfo> getFileList(String folderPath) {
+ ArrayList<SerendipityFileInfo> filelist = filelists.get(folderPath);
+ if (filelist == null) {
+ updateFileList(folderPath);
+ filelist = filelists.get(folderPath);
+ }
+ return (filelist != null) ? filelist : new ArrayList<SerendipityFileInfo>();
+ }
+
+
+}
View
33 src/serendipitytranslator/settings/SettingsDialog.form
@@ -241,11 +241,12 @@
<Component class="javax.swing.JComboBox" name="externPluginsComboBox">
<Properties>
<Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
- <StringArray count="4">
+ <StringArray count="5">
<StringItem index="0" value="svn"/>
<StringItem index="1" value="cvs"/>
- <StringItem index="2" value="git"/>
- <StringItem index="3" value="folder"/>
+ <StringItem index="2" value="git html"/>
+ <StringItem index="3" value="git native"/>
+ <StringItem index="4" value="folder"/>
</StringArray>
</Property>
<Property name="selectedIndex" type="int" value="1"/>
@@ -260,9 +261,6 @@
<Properties>
<Property name="text" type="java.lang.String" value="http://php-blog.cvs.sourceforge.net/viewvc/php-blog/additional_plugins"/>
</Properties>
- <Events>
- <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="externPluginsTextFieldActionPerformed"/>
- </Events>
</Component>
<Component class="javax.swing.JLabel" name="jLabel11">
<Properties>
@@ -273,9 +271,6 @@
<Properties>
<Property name="text" type="java.lang.String" value="plugins/additional_plugins"/>
</Properties>
- <Events>
- <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="pluginsFolderTextFieldActionPerformed"/>
- </Events>
</Component>
<Component class="javax.swing.JButton" name="pluginsBrowseButton">
<Properties>
@@ -354,11 +349,12 @@
<Component class="javax.swing.JComboBox" name="coreTypeComboBox">
<Properties>
<Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
- <StringArray count="4">
+ <StringArray count="5">
<StringItem index="0" value="svn"/>
<StringItem index="1" value="cvs"/>
- <StringItem index="2" value="git"/>
- <StringItem index="3" value="folder"/>
+ <StringItem index="2" value="git html"/>
+ <StringItem index="3" value="git native"/>
+ <StringItem index="4" value="folder"/>
</StringArray>
</Property>
<Property name="selectedIndex" type="int" value="2"/>
@@ -461,11 +457,12 @@
<Component class="javax.swing.JComboBox" name="externThemesComboBox">
<Properties>
<Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
- <StringArray count="4">
+ <StringArray count="5">
<StringItem index="0" value="svn"/>
<StringItem index="1" value="cvs"/>
- <StringItem index="2" value="git"/>
- <StringItem index="3" value="folder"/>
+ <StringItem index="2" value="git html"/>
+ <StringItem index="3" value="git native"/>
+ <StringItem index="4" value="folder"/>
</StringArray>
</Property>
<Property name="selectedIndex" type="int" value="1"/>
@@ -480,9 +477,6 @@
<Properties>
<Property name="text" type="java.lang.String" value="http://php-blog.cvs.sourceforge.net/viewvc/php-blog/additional_themes"/>
</Properties>
- <Events>
- <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="externThemesTextFieldActionPerformed"/>
- </Events>
</Component>
<Component class="javax.swing.JLabel" name="jLabel12">
<Properties>
@@ -493,9 +487,6 @@
<Properties>
<Property name="text" type="java.lang.String" value="plugins/additional_themes"/>
</Properties>
- <Events>
- <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="themesFolderTextFieldActionPerformed"/>
- </Events>
</Component>
<Component class="javax.swing.JButton" name="themesBrowseButton">
<Properties>
View
106 src/serendipitytranslator/settings/SettingsDialog.java
@@ -15,29 +15,25 @@
import java.awt.Point;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileReader;
-import java.io.FileWriter;
-import java.io.IOException;
+import java.io.*;
import java.util.StringTokenizer;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import serendipitytranslator.mainWindow.MainFrame;
+import serendipitytranslator.repositories.*;
/**
*
* @author Vláďa
*/
public class SettingsDialog extends javax.swing.JDialog {
- Point mainWindowPosition = new Point();
- Dimension mainWindowSize = new Dimension();
- Point downloadDialogPosition = new Point();
- Dimension downloadDialogSize = new Dimension();
+ Point mainWindowPosition = new Point(0,0);
+ Dimension mainWindowSize = new Dimension(473,326);
+ Point downloadDialogPosition = new Point(0,326);
+ Dimension downloadDialogSize = new Dimension(451,79);
PropertyChangeSupport propertyChange;
@@ -134,26 +130,16 @@ public void actionPerformed(java.awt.event.ActionEvent evt) {
jLabel4.setText("Repository type:");
- externPluginsComboBox.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "svn", "cvs", "git", "folder" }));
+ externPluginsComboBox.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "svn", "cvs", "git html", "git native", "folder" }));
externPluginsComboBox.setSelectedIndex(1);
jLabel5.setText("URL with plugins:");
externPluginsTextField.setText("http://php-blog.cvs.sourceforge.net/viewvc/php-blog/additional_plugins");
- externPluginsTextField.addActionListener(new java.awt.event.ActionListener() {
- public void actionPerformed(java.awt.event.ActionEvent evt) {
- externPluginsTextFieldActionPerformed(evt);
- }
- });
jLabel11.setText("Local folder:");
pluginsFolderTextField.setText("plugins/additional_plugins");
- pluginsFolderTextField.addActionListener(new java.awt.event.ActionListener() {
- public void actionPerformed(java.awt.event.ActionEvent evt) {
- pluginsFolderTextFieldActionPerformed(evt);
- }
- });
pluginsBrowseButton.setText("browse...");
pluginsBrowseButton.addActionListener(new java.awt.event.ActionListener() {
@@ -205,7 +191,7 @@ public void actionPerformed(java.awt.event.ActionEvent evt) {
jLabel6.setText("Repository type:");
- coreTypeComboBox.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "svn", "cvs", "git", "folder" }));
+ coreTypeComboBox.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "svn", "cvs", "git html", "git native", "folder" }));
coreTypeComboBox.setSelectedIndex(2);
jLabel7.setText("URL - S9y core root:");
@@ -266,26 +252,16 @@ public void actionPerformed(java.awt.event.ActionEvent evt) {
jLabel8.setText("Repository type:");
- externThemesComboBox.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "svn", "cvs", "git", "folder" }));
+ externThemesComboBox.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "svn", "cvs", "git html", "git native", "folder" }));
externThemesComboBox.setSelectedIndex(1);
jLabel10.setText("URL with themes:");
externThemesTextField.setText("http://php-blog.cvs.sourceforge.net/viewvc/php-blog/additional_themes");
- externThemesTextField.addActionListener(new java.awt.event.ActionListener() {
- public void actionPerformed(java.awt.event.ActionEvent evt) {
- externThemesTextFieldActionPerformed(evt);
- }
- });
jLabel12.setText("Local folder:");
themesFolderTextField.setText("plugins/additional_themes");
- themesFolderTextField.addActionListener(new java.awt.event.ActionListener() {
- public void actionPerformed(java.awt.event.ActionEvent evt) {
- themesFolderTextFieldActionPerformed(evt);
- }
- });
themesBrowseButton.setText("browse...");
themesBrowseButton.addActionListener(new java.awt.event.ActionListener() {
@@ -407,22 +383,6 @@ private void closeSettingsButtonActionPerformed(java.awt.event.ActionEvent evt)
this.setVisible(false);
}//GEN-LAST:event_closeSettingsButtonActionPerformed
- private void externPluginsTextFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_externPluginsTextFieldActionPerformed
- // TODO add your handling code here:
- }//GEN-LAST:event_externPluginsTextFieldActionPerformed
-
- private void externThemesTextFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_externThemesTextFieldActionPerformed
- // TODO add your handling code here:
- }//GEN-LAST:event_externThemesTextFieldActionPerformed
-
- private void pluginsFolderTextFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_pluginsFolderTextFieldActionPerformed
- // TODO add your handling code here:
- }//GEN-LAST:event_pluginsFolderTextFieldActionPerformed
-
- private void themesFolderTextFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_themesFolderTextFieldActionPerformed
- // TODO add your handling code here:
- }//GEN-LAST:event_themesFolderTextFieldActionPerformed
-
private void coreBrowseButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_coreBrowseButtonActionPerformed
jFileChooser1.setSelectedFile(new File(coreFolderTextField.getText()));
if (jFileChooser1.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
@@ -460,7 +420,7 @@ public String getUpdateURL() {
return updateURLTextField.getText();
}
- public File getSettingsFile() {
+ private File getSettingsFile() {
return new File("translatorSettings.ini");
}
@@ -645,6 +605,52 @@ public String getExternThemesLocalFolder() {
return themesFolderTextField.getText();
}
+ private static SimpleFileRepository selectRepository(String repoType) {
+ SimpleFileRepository workingRepository;
+ if (repoType.equals("svn")) {
+ workingRepository = new SvnHTMLRepository();
+ } else if (repoType.equals("git html")) {
+ workingRepository = new GitHTMLRepository();
+ } else if (repoType.equals("git native")) {
+ workingRepository = new GitProtocolRepository();
+ } else if (repoType.equals("folder")) {
+ workingRepository = new SimpleFileRepository();
+ } else {
+ workingRepository = new CvsHTMLRepository();
+ }
+ return workingRepository;
+ }
+
+ public SimpleFileRepository getCoreRepository() {
+ SimpleFileRepository repository = selectRepository(coreTypeComboBox.getSelectedItem().toString());
+ repository.setRepositoryFolderName(getCoreLocalFolder());
+ repository.setHasInternalPlugins(true);
+ if (repository instanceof AbstractHTMLRepository) {
+ ((AbstractHTMLRepository) repository).setRemoteURL(getCoreUrl());
+ }
+ return repository;
+ }
+
+ public SimpleFileRepository getPluginsRepository() {
+ SimpleFileRepository repository = selectRepository(externPluginsComboBox.getSelectedItem().toString());
+ repository.setRepositoryFolderName(getExternPluginsLocalFolder());
+ repository.setHasInternalPlugins(false);
+ if (repository instanceof AbstractHTMLRepository) {
+ ((AbstractHTMLRepository) repository).setRemoteURL(getExternPluginsUrl());
+ }
+ return repository;
+ }
+
+ public SimpleFileRepository getThemesRepository() {
+ SimpleFileRepository repository = selectRepository(externThemesComboBox.getSelectedItem().toString());
+ repository.setRepositoryFolderName(getExternThemesLocalFolder());
+ repository.setHasInternalPlugins(false);
+ if (repository instanceof AbstractHTMLRepository) {
+ ((AbstractHTMLRepository) repository).setRemoteURL(getExternThemesUrl());
+ }
+ return repository;
+ }
+
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton closeSettingsButton;
private javax.swing.JButton coreBrowseButton;
View
143 test/serendipityTranslatorTests/JGitTest.java
@@ -4,19 +4,12 @@
*/
package serendipityTranslatorTests;
-import java.io.File;
-import java.io.IOException;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import org.eclipse.jgit.api.Git;
-import org.eclipse.jgit.api.PullCommand;
-import org.eclipse.jgit.api.PullResult;
-import org.eclipse.jgit.api.errors.*;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.lib.TextProgressMonitor;
-import org.eclipse.jgit.storage.file.FileRepositoryBuilder;
-import static org.junit.Assert.assertTrue;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
import org.junit.*;
+import serendipitytranslator.mainWindow.SerendipityFileInfo;
+import serendipitytranslator.repositories.GitProtocolRepository;
/**
*
@@ -43,6 +36,7 @@ public void setUp() {
public void tearDown() {
}
+ /*
@Test
public void jGitTest1() {
try {
@@ -79,4 +73,129 @@ public void jGitTest1() {
Logger.getLogger(JGitTest.class.getName()).log(Level.SEVERE, null, ex);
}
}
+ */
+ /*
+ @Test
+ public void jGitTest2() {
+ try {
+ FileRepositoryBuilder builder = new FileRepositoryBuilder();
+ Repository repository = builder.setGitDir(new File("c:/Cvs/php-blog/Serendipity/.git"))
+ .readEnvironment() // scan environment GIT_* variables
+ .findGitDir() // scan up the file system tree
+ .build();
+ ObjectId revId = repository.resolve(Constants.HEAD);
+ //DirCache cache = new DirCache(directory, FS.DETECTED);
+ TreeWalk treeWalk = new TreeWalk(repository);
+
+ treeWalk.addTree(new RevWalk(repository).parseTree(revId));
+ //treeWalk.addTree(new DirCacheIterator(cache));
+
+ while (treeWalk.next())
+ {
+ System.out.println("---------------------------");
+ System.out.append("name: ").println(treeWalk.getNameString());
+ System.out.append("path: ").println(treeWalk.getPathString());
+
+ ObjectLoader loader = repository.open(treeWalk.getObjectId(0));
+
+ System.out.append("directory: ").println(loader.getType()
+ == Constants.OBJ_TREE);
+ System.out.append("size: ").println(loader.getSize());
+ // ???
+ System.out.append("last modified: ").println("???");
+ System.out.append("message: ").println("???");
+
+ }
+ } catch (IOException ex) {
+ Logger.getLogger(JGitTest.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ }
+ */
+ /*
+ @Test
+ public void jGitTest3() {
+ try {
+ FileRepositoryBuilder builder = new FileRepositoryBuilder();
+ Repository repository = builder.setGitDir(new File("c:/Cvs/php-blog/Serendipity/.git"))
+ .readEnvironment() // scan environment GIT_* variables
+ .findGitDir() // scan up the file system tree
+ .build();
+ ObjectId headId = repository.resolve(Constants.HEAD);
+ Git git = new Git(repository);
+ LogCommand log = git.log();
+ log.addPath("lang/serendipity_lang_cs.inc.php");
+ //ObjectId fileId = repository.resolve("refs/heads/master/lang/serendipity_lang_cs.inc.php");
+ System.out.println(headId);
+ //log.addRange(headId, headId);
+ RevWalk commits = (RevWalk) log.call();
+ int i = 0;
+ for (RevCommit c: commits) {
+ SimpleDateFormat date = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss");
+ Date d = new Date(c.getCommitTime()*1000l);
+
+ System.out.println(date.format(d) + ": " +c.getShortMessage());
+ if (i++ >=10) {
+ break;
+ }
+ }
+
+
+ } catch (NoHeadException ex) {
+ Logger.getLogger(JGitTest.class.getName()).log(Level.SEVERE, null, ex);
+ } catch (JGitInternalException ex) {
+ Logger.getLogger(JGitTest.class.getName()).log(Level.SEVERE, null, ex);
+ } catch (IOException ex) {
+ Logger.getLogger(JGitTest.class.getName()).log(Level.SEVERE, null, ex);
+ }
+
+ }
+
+ @Test
+ public void jGitTest4() {
+ try {
+ FileRepositoryBuilder builder = new FileRepositoryBuilder();
+ Repository repository = builder.setGitDir(new File("c:/Cvs/php-blog/Serendipity/.git"))
+ .readEnvironment() // scan environment GIT_* variables
+ .findGitDir() // scan up the file system tree
+ .build();
+ ObjectId headId = repository.resolve(Constants.HEAD);
+ RevWalk walk = new RevWalk(repository);
+ walk.markStart(walk.parseCommit(headId));
+ walk.setTreeFilter(AndTreeFilter.create(
+ PathFilter.create("lang/serendipity_lang_cs.inc.php"),
+ TreeFilter.ANY_DIFF));
+ Iterator<RevCommit> it = walk.iterator();
+ System.out.println("has next = " + it.hasNext());
+ if (it.hasNext()) {
+ RevCommit lastCommit = it.next();
+ SimpleDateFormat date = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss");
+ Date d = new Date(lastCommit.getCommitTime()*1000l);
+ System.out.println(date.format(d) + ": " +lastCommit.getShortMessage());
+ }
+
+ } catch (JGitInternalException ex) {
+ Logger.getLogger(JGitTest.class.getName()).log(Level.SEVERE, null, ex);
+ } catch (IOException ex) {
+ Logger.getLogger(JGitTest.class.getName()).log(Level.SEVERE, null, ex);
+ }
+
+ }
+ */
+
+ @Test
+ public void jGitTest5() {
+ GitProtocolRepository gitRepo = new GitProtocolRepository();
+
+ gitRepo.setRepositoryFolderName("C:/Cvs/php-blog/Serendipity");
+ String localFolder = "plugins/serendipity_event_karma";
+ gitRepo.updateFileList(localFolder);
+ SimpleDateFormat date = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss");
+ Date d;
+
+ ArrayList<SerendipityFileInfo> filelist = gitRepo.getFileList(localFolder);
+ for (SerendipityFileInfo info: filelist) {
+ d = new Date(info.getFileDate());
+ System.out.println(info.getFilename() + ": " + date.format(d));
+ }
+ }
}

0 comments on commit 2cf2dd4

Please sign in to comment.