From a1b265c318dbda4a213cec930785b81e4c0f7d2b Mon Sep 17 00:00:00 2001 From: elmot Date: Fri, 25 Sep 2015 16:40:44 +0300 Subject: Framework documentation IN Change-Id: I767477c1fc3745f9e1f58075fe30c9ac8da63581 --- documentation/addons/addons-cval.asciidoc | 131 +++++++++++++++ documentation/addons/addons-downloading.asciidoc | 61 +++++++ documentation/addons/addons-eclipse.asciidoc | 107 +++++++++++++ documentation/addons/addons-maven.asciidoc | 170 ++++++++++++++++++++ documentation/addons/addons-overview.asciidoc | 37 +++++ .../addons/addons-troubleshooting.asciidoc | 57 +++++++ documentation/addons/chapter-addons.asciidoc | 19 +++ documentation/addons/img/compile-widgetset-16.png | Bin 0 -> 795 bytes documentation/addons/img/cval-pro-licenses-3.png | Bin 0 -> 90927 bytes .../addons/img/cval-pro-licenses-code.png | Bin 0 -> 25668 bytes .../addons/img/directory-ivy-dependency.png | Bin 0 -> 28077 bytes documentation/addons/img/directory-maven-pom.png | Bin 0 -> 36482 bytes .../addons/img/widgetset-compiling-toolbar-hi.png | Bin 0 -> 17549 bytes .../addons/img/widgetset-compiling-toolbar-lo.png | Bin 0 -> 8550 bytes .../addons/img/widgetset-compiling-toolbar.png | Bin 0 -> 7429 bytes .../widgetset-compiling-toolbar.svg | 176 +++++++++++++++++++++ 16 files changed, 758 insertions(+) create mode 100644 documentation/addons/addons-cval.asciidoc create mode 100644 documentation/addons/addons-downloading.asciidoc create mode 100644 documentation/addons/addons-eclipse.asciidoc create mode 100644 documentation/addons/addons-maven.asciidoc create mode 100644 documentation/addons/addons-overview.asciidoc create mode 100644 documentation/addons/addons-troubleshooting.asciidoc create mode 100644 documentation/addons/chapter-addons.asciidoc create mode 100644 documentation/addons/img/compile-widgetset-16.png create mode 100644 documentation/addons/img/cval-pro-licenses-3.png create mode 100644 documentation/addons/img/cval-pro-licenses-code.png create mode 100644 documentation/addons/img/directory-ivy-dependency.png create mode 100644 documentation/addons/img/directory-maven-pom.png create mode 100644 documentation/addons/img/widgetset-compiling-toolbar-hi.png create mode 100644 documentation/addons/img/widgetset-compiling-toolbar-lo.png create mode 100644 documentation/addons/img/widgetset-compiling-toolbar.png create mode 100644 documentation/addons/original-drawings/widgetset-compiling-toolbar.svg (limited to 'documentation/addons') diff --git a/documentation/addons/addons-cval.asciidoc b/documentation/addons/addons-cval.asciidoc new file mode 100644 index 0000000000..8624bed70c --- /dev/null +++ b/documentation/addons/addons-cval.asciidoc @@ -0,0 +1,131 @@ +--- +title: Installing Commercial Vaadin Add-on Licence +order: 5 +layout: page +--- + +[[addons.cval]] += Installing Commercial Vaadin Add-on Licence + +The commercial Vaadin add-ons require installing a license key before using +them. The license keys are development licenses and checked during widget set +compilation, or in Vaadin TestBench when executing tests, so you do not need +them when deploying the application. + +[[addons.cval.obtaining]] +== Obtaining License Keys + +You can purchase add-ons or obtain a free trial key from the Vaadin website. You +need to register in the website to obtain a key. + +You can get license keys from +link:https://vaadin.com/pro/licenses[vaadin.com/pro/licenses], where you can +navigate by selecting in the Vaadin website "My Account > Licenses" or directly +[menuchoice]#Licenses# if you are a Pro Tools subscriber. + +[[figure.addons.cval.obtaining]] +.Obtaining CVAL License +image::img/cval-pro-licenses-3.png[] + +Click on a license key to obtain the purchased or trial key. + +[[figure.addons.cval.obtaining]] +.Obtaining CVAL License Key +image::img/cval-pro-licenses-code.png[] + + +[[addons.cval.installing]] +== Installing License Key in License File + +To install the license key in a development workstation, you can copy and paste +it verbatim to a file in your home directory. + +License for each product has a separate license file as follows: + +Vaadin Charts:: [filename]#.vaadin.charts.developer.license# +Vaadin Spreadsheet:: [filename]#.vaadin.spreadsheet.developer.license# +Vaadin TestBench:: [filename]#.vaadin.testbench.developer.license# +Vaadin TouchKit:: [filename]#.vaadin.touchkit.developer.license# + + +For example, in Linux and OS X: + +[subs="normal"] +---- +[prompt]#$# [command]#echo# "[replaceable]#L1cen5e-c0de#" > [parameter]#~/.vaadin.[replaceable]+++#+++<product>+++#+++.developer.license# +---- + +[[addons.cval.systemproperty]] +== Passing License Key as System Property + +You can also pass the key as a system property to the widget set compiler, +usually with a [literal]#++-D++# option. For example, on the command-line: + +[subs="normal"] +---- +[prompt]#$# [command]#java# -D[parameter]#vaadin.[replaceable]+++#+++<product>+++#+++.developer.license#=[replaceable]#L1cen5e-c0de# ... +---- +ifdef::web[] +See link:https://vaadin.com/directory/help/installing-cval-license[the CVAL +license key installation instructions] for more details. +endif::web[] + +[[addons.cval.systemproperty.environments]] +=== Passing License Key in Different Environments + +How you actually pass the parameter to the widget set compiler depends on the +development environment and the build system that you use to compile the widget +set. Below are listed a few typical environments: + +Eclipse IDE:: To install the license key for all projects, select "Window > Preferences" and +navigate to the "Java > Installed JREs" section. Select the JRE version that you +use for the application and click [guibutton]#Edit#. In the [guilabel]#Default +VM arguments#, give the [parameter]#-D# expression as shown above. + +Apache Ant:: If compiling the project with Apache Ant, you could set the key in the Ant +script as follows: + + ++ +[subs="normal"] +---- +<sysproperty key="vaadin.[replaceable]#<product>#.developer.license" + value="**L1cen5e-c0de**"/> +---- ++ +However, you should never store license keys in a source repository, so if the +Ant script is stored in a source repository, you should pass the license key to +Ant as a property that you then use in the script for the value argument of the +[literal]#++++# as follows: + + ++ +[subs="normal"] +---- +<sysproperty key="vaadin.[replaceable]#<product>#.developer.license" + value="**${vaadin.[replaceable]#<product>#.developer.license}**"/> +---- ++ +When invoking Ant from the command-line, you can pass the property with a +[parameter]#-D# parameter to Ant. + +Apache Maven:: If building the project with Apache Maven, you can pass the license key with a +[literal]#++-D++# parameter to Maven: + + ++ +[subs="normal"] +---- +[prompt]#$# [command]#mvn# -D[parameter]#vaadin.[replaceable]+++#+++<product>+++#+++.developer.license#=[replaceable]#L1cen5e-c0de# package +---- +Continuous Integration Systems:: In CIS systems, you can pass the license key to build runners as a system +property in the build configuration. However, this only passes it to a runner. +As described above, Ant does not pass it to sub-processes implicitly, so you +need to forward it explicitly as described earlier. + + + + + + + diff --git a/documentation/addons/addons-downloading.asciidoc b/documentation/addons/addons-downloading.asciidoc new file mode 100644 index 0000000000..6ccf440420 --- /dev/null +++ b/documentation/addons/addons-downloading.asciidoc @@ -0,0 +1,61 @@ +--- +title: Downloading Add-ons from Vaadin Directory +order: 2 +layout: page +--- + +[[addons.downloading]] += Downloading Add-ons from Vaadin Directory + +If you are not using Maven or a Maven-compatible dependency manager such as Ivy, +or want to manage for your libraries manually, you can download add-on packages +from the details page of an add-on in Vaadin Directory. + +. Select the version; some add-ons have several versions available. The latest is +shown by default, but you can choose another the version to download from the +dropdown menu in the header of the details page. + +. Click [guibutton]#Download Now# and save the JAR or Zip file on your computer. + +. If the add-on is packaged in a Zip package, unzip the package and follow any +instructions provided inside the package. Typically, you just need to copy a JAR +file to your web project under the [filename]#WEB-INF/lib# directory. + ++ +Note that some add-ons may require other libraries. You can resolve such +dependencies manually, but we recommend using a dependency manager such as Ivy +or Maven in your project. + +. Update and recompile your project. In Eclipse, select the project and press F5. + +. You may need to compile the client-side implementations of the add-on +components, that is, a __widget set__. This is the case for majority of add-ons, +except for pure server-side, theme, or data binding add-ons. Compiling the +widget set depends on the build environment. See <>, or +later in this chapter for instructions for compiling the widget set with Eclipse +and +Maven.+ +//// +See <xref linkend="addons.compiling"/> for +instructions. +//// + +. Update the project in your development web server and possibly restart the +server. + + +[[addons.downloading.ant]] +== Compiling Widget Sets with an Ant Script + +If you need to compile the widget set with an Ant script, you can find a script +template package at the link:http://vaadin.com/download/[Vaadin download page]. +You can copy the files in the package to your project and, once configured, use +it by running Ant in the directory. + +If you are using an IDE such as Eclipse, __always__ remember to refresh the +project to synchronize it with the filesystem after compiling the widget set +outside the IDE. + + + + diff --git a/documentation/addons/addons-eclipse.asciidoc b/documentation/addons/addons-eclipse.asciidoc new file mode 100644 index 0000000000..cd7508466d --- /dev/null +++ b/documentation/addons/addons-eclipse.asciidoc @@ -0,0 +1,107 @@ +--- +title: Installing Add-ons in Eclipse with Ivy +order: 3 +layout: page +--- + +[[addons.eclipse]] += Installing Add-ons in Eclipse with Ivy + +The Vaadin Plugin for Eclipse uses Apache Ivy to resolve dependencies. The +dependencies should be listed in the [filename]#ivy.xml# file in the project +root. The Vaadin Directory allows dowloading add-ons from a Maven repository, +which can be accessed also by Ivy. + +You can also use Ivy to resolve dependencies in an Ant script. + +. Open the add-on page in Vaadin Directory. + +. Select the version. The latest is shown by default, but you can choose another +the version from the dropdown menu in the header of the add-on details page. + +. Click the [guilabel]#Maven/Ivy# to display the Ivy dependency declaration, as +illustrated in Figure <>. If the add-on is +available with multiple licenses, you will be prompted to select a license for +the dependency. + ++ +[[figure.addons.eclipse.ivybutton]] +.Ivy Dependency Declaration +image::img/directory-ivy-dependency.png[] + +. Open the [filename]#ivysettings.xml# in your Eclipse project either in the XML +or Ivy Editor (either double-click the file or right-click it and select "Open +With > Ivy Editor"). + ++ +Check that the settings file has the [literal]#++++# entry given in the +Directory page. It should be, if the file was created by the Vaadin project +wizard in Eclipse. If not, copy it there. + + ++ +---- + + ... + + ... + +---- ++ +If you get Vaadin addons from another repository, such as the local repository +if you have compiled them yourself, you need to define a resolver for the +repository in the settings file. + +. Open the [filename]#ivy.xml# in your Eclipse project and copy the Ivy dependency +to inside the [literal]#++dependencies++# element. It should be as follows: + + ++ +[subs="normal"] +---- +<dependencies> + ... + <dependency org="**com.vaadin.addon**" + name="**vaadin-charts**" + rev="**1.0.0**"/> +</dependencies> +---- ++ +You can specify either a fixed version number or a dynamic revision tag, such as +[literal]#++latest.release++#. You can find more information about the +link:http://ant.apache.org/ivy/history/2.1.0/ivyfile/dependency.html[dependency +declarations] in Ivy documentation. + ++ +If the [filename]#ivy.xml# does not have a [literal]#++++# defined, you also need to have +[literal]#++conf="default->default"++# in the dependency to resolve transient +dependencies correctly. + ++ +IvyIDE immediately resolves the dependencies when you save the file. + +. Compile the add-on widget set +//// +, as described in <xref +linkend="addons.compiling.eclipse"/>. +//// +by clicking the [guilabel]#Compile Vaadin widgets# button in the toolbar. + ++ +[[figure.addons.eclipse.toolbar]] +.Compiling Widget Set in Eclipse +image::img/widgetset-compiling-toolbar-hi.png[] + + +If you experience problems with Ivy, first check all the dependency parameters. +IvyDE can sometimes cause unexpected problems. You can clear the Ivy dependency +cache by right-clicking the project and selecting "Ivy > Clean all caches". To +refresh Ivy configuration, select "Ivy > Refresh". To try resolving again Ivy, +select "Ivy > Resolve". + + + diff --git a/documentation/addons/addons-maven.asciidoc b/documentation/addons/addons-maven.asciidoc new file mode 100644 index 0000000000..9c5ca8c25c --- /dev/null +++ b/documentation/addons/addons-maven.asciidoc @@ -0,0 +1,170 @@ +--- +title: Using Add-ons in a Maven Project +order: 4 +layout: page +--- + +[[addons.maven]] += Using Add-ons in a Maven Project + +((("Maven", "using add-ons", id="term.addons.maven", range="startofrange"))) + + +To use add-ons in a Maven project, you simply have to add them as dependencies +in the project POM. Most add-ons include a widget set, which are compiled to the +project widget set. + +Creating, compiling, and packaging a Vaadin project with Maven was described in +<>. + +[[addons.maven.dependency]] +== Adding a Dependency + +Vaadin Directory provides a Maven repository for all the add-ons in the +Directory. + +. Open the add-on page in Vaadin Directory. + +. Select the version. The latest is shown by default, but you can choose another +the version from the dropdown menu in the header of the add-on details page. + +. Click the [guilabel]#Maven/Ivy# to display the Maven dependency declaration, as +illustrated in Figure <>. If the add-on is +available with multiple licenses, you will be prompted to select a license for +the dependency. + ++ +[[figure.addons.maven.pombutton]] +.Maven POM Definitions +image::img/directory-maven-pom.png[] + +. Copy the [literal]#++dependency++# declaration to the [filename]#pom.xml# file +in your project, under the [literal]#++dependencies++# element. + + ++ +[subs="normal"] +---- + ... + <dependencies> + ... + <dependency> + <groupId>**com.vaadin.addon**</groupId> + <artifactId>**vaadin-charts**</artifactId> + <version>**1.0.0**</version> + </dependency> + </dependencies> +---- ++ +You can use an exact version number, as is done in the example above, or +[literal]#++LATEST++# to always use the latest version of the add-on. + ++ +The POM excerpt given in Directory includes also a repository definition, but if +you have used the [literal]#++vaadin-archetype-application++# to create your +project, it already includes the definition. + +. Compile the widget set as described in the following section. + + + +[[addons.maven.compiling]] +== Compiling the Project Widget Set + +If you have used the [literal]#++vaadin-archetype-application++# to create the +project, the [filename]#pom.xml# includes all necessary declarations to compile +the widget set. The widget set compilation occurs in standard Maven build phase, +such as with [parameter]#package# or [parameter]#install# goal. + +[subs="normal"] +---- +[prompt]#$# [command]#mvn# [parameter]#package# +---- +Then, just deploy the WAR to your application server. + +[[addons.maven.compiling.recompiling]] +=== Recompiling the Widget Set + +The Vaadin plugin for Maven tries to avoid recompiling the widget set unless +necessary, which sometimes means that it is not compiled even when it should. +Running the [literal]#++clean++# goal usually helps, but causes a full +recompilation. You can compile the widget set manually by running the +[parameter]#vaadin:compile# goal. + +[subs="normal"] +---- +[prompt]#$# [command]#mvn# [parameter]#vaadin:compile# +---- +Note that this does not update the project widget set by searching new widget +sets from the class path. It must be updated if you add or remove add-ons, for +example. You can do that by running the [literal]#++vaadin:update-widgetset++# +goal in the project directory. + +[subs="normal"] +---- +[prompt]#$# [command]#mvn# [parameter]#vaadin:update-widgetset# +... +[INFO] auto discovered modules [your.company.gwt.ProjectNameWidgetSet] +[INFO] Updating widgetset your.company.gwt.ProjectNameWidgetSet +[ERROR] 27.10.2011 19:22:34 com.vaadin.terminal.gwt.widgetsetutils.ClassPathExplorer getAvailableWidgetSets +[ERROR] INFO: Widgetsets found from classpath: +... + +---- +Do not mind the "ERROR" labels, they are just an issue with the Vaadin Plugin +for Maven. + +After running the update, you need to run the [literal]#++vaadin:compile++# goal +to actually compile the widget set. + + + +[[addons.maven.widgetset]] +== Enabling Widget Set Compilation + +If you are not using a POM created with the proper Vaadin archetype, you may +need to enable widget set compilation manually. The simplest way to do that is +to copy the definitions from a POM created with the archetype. Specifically, you +need to copy the [literal]#++plugin++# definitions. You also need the Vaadin +dependencies. + +You need to create an empty widget set definition file, which the widget set +compilation will populate with widget sets found from the class path. Create a +[filename]#src/main/java/com/example/AppWidgetSet.gwt.xml# file (in the project +package) with an empty [literal]#++++# element as follows: + + +---- + + +---- + +[[addons.maven.widgetset.web]] +=== Enabling the Widget Set in the UI + +If you have previously used the default widget set in the project, you need to +enable the project widget set in the [filename]#web.xml# deployment descriptor. +Edit the [filename]#src/main/webapp/WEB-INF/web.xml# file and add or modify the +[literal]#++widgetset++# parameter for the servlet as follows. + +[subs="normal"] +---- +<servlet> + ... + <init-param> + <description>Widget Set to Use</description> + <param-name>widgetset</param-name> + <param-value>**com.example.AppWidgetSet**</param-value> + </init-param> +</servlet> +---- +The parameter is the class name of the widget set, that is, without the +[filename]#.gwt.xml# extension and with the Java dot notation for class names +that include the package name. + + + +(((range="endofrange", startref="term.addons.maven"))) + + diff --git a/documentation/addons/addons-overview.asciidoc b/documentation/addons/addons-overview.asciidoc new file mode 100644 index 0000000000..39d699fc08 --- /dev/null +++ b/documentation/addons/addons-overview.asciidoc @@ -0,0 +1,37 @@ +--- +title: Overview +order: 1 +layout: page +--- + +[[addons.overview]] += Overview + +In addition to the components, layouts, themes, and data sources built in into +the core Vaadin library, many others are available as add-ons. +link:http://vaadin.com/directory/[Vaadin Directory] provides a rich collection +of add-ons for Vaadin, and you may find others from independent sources. Add-ons +are also one way to share your own components between projects. + +Installation of add-ons from Vaadin Directory is simple, just adding an Ivy or +Maven dependency, or downloading the JAR package and and dropping it in the web +library folder of the project. Most add-ons include a widget set, which you need +to compile, but it's usually just a click of a button or a single command. + +After trying out an add-on, you can give some feedback to the author of the +add-on by rating the add-on with one to five stars and optionally leaving a +comment. Most add-ons also have a discussion forum thread for user feedback and +questions. + +Add-ons available from Vaadin Directory are distributed under different +licenses, of which some are commercial. While the add-ons can be downloaded +directly, you should note their license and other terms and conditions. Many are +offered under a dual licensing agreement so that they can be used in open source +projects for free, and many have a trial period for closed-source development. +Commercial Vaadin add-ons distributed under the CVAL license require installing +a license key as instructed in +<>. + + + diff --git a/documentation/addons/addons-troubleshooting.asciidoc b/documentation/addons/addons-troubleshooting.asciidoc new file mode 100644 index 0000000000..a899b3d26f --- /dev/null +++ b/documentation/addons/addons-troubleshooting.asciidoc @@ -0,0 +1,57 @@ +--- +title: Troubleshooting +order: 6 +layout: page +--- + +[[addons.troubleshooting]] += Troubleshooting + +If you experience problems with using add-ons, you can try the following: + +* Check the [filename]#.gwt.xml# descriptor file under the the project root +package. For example, if the project root package is +[filename]#com.example.myproject#, the widget set definition file is typically +at [filename]#com/example/project/AppWidgetset.gwt.xml#. The location is not +fixed and it can be elsewhere, as long as references to it match. See +<> for details on the contents of the client-side module +descriptor, which is used to define a widget set. + +* Check the [filename]#WEB-INF/web.xml# deployment descriptor and see that the +servlet for your UI has a widget set parameter, such as the following: + + ++ +---- + + UI widgetset + widgetset + com.example.project.AppWidgetSet + +---- ++ +Check that the widget set class corresponds with the [filename]#.gwt.xml# file +in the source tree. + +* See the [filename]#VAADIN/widgetsets# directory and check that the widget set +appears there. You can remove it and recompile the widget set to see that the +compilation works properly. + +* Use the [guilabel]#Net# tab in Firebug to check that the widget set (and theme) +is loaded properly. + +* Use the ?debug parameter for the application to open the debug window and check +if there is any version conflict between the widget set and the Vaadin library, +or the themes. See +<> for details. + +* Refresh and recompile the project. In Eclipse, select the project and press F5, +stop the server, clean the server temporary directories, and restart it. + +* Check the Error Log view in Eclipse (or in the IDE you use). + + + + diff --git a/documentation/addons/chapter-addons.asciidoc b/documentation/addons/chapter-addons.asciidoc new file mode 100644 index 0000000000..4319e43456 --- /dev/null +++ b/documentation/addons/chapter-addons.asciidoc @@ -0,0 +1,19 @@ +[[addons]] +== Using Vaadin Add-ons + +This chapter describes the installation of add-on components, themes, +containers, and other tools from the Vaadin Directory and the use of commercial +add-ons offered by Vaadin. + + +include::addons-overview.asciidoc[leveloffset=+2] + +include::addons-downloading.asciidoc[leveloffset=+2] + +include::addons-eclipse.asciidoc[leveloffset=+2] + +include::addons-maven.asciidoc[leveloffset=+2] + +include::addons-cval.asciidoc[leveloffset=+2] + +include::addons-troubleshooting.asciidoc[leveloffset=+2] diff --git a/documentation/addons/img/compile-widgetset-16.png b/documentation/addons/img/compile-widgetset-16.png new file mode 100644 index 0000000000..aeafb8bbaf Binary files /dev/null and b/documentation/addons/img/compile-widgetset-16.png differ diff --git a/documentation/addons/img/cval-pro-licenses-3.png b/documentation/addons/img/cval-pro-licenses-3.png new file mode 100644 index 0000000000..4306eb2bd2 Binary files /dev/null and b/documentation/addons/img/cval-pro-licenses-3.png differ diff --git a/documentation/addons/img/cval-pro-licenses-code.png b/documentation/addons/img/cval-pro-licenses-code.png new file mode 100644 index 0000000000..1f467e8b4f Binary files /dev/null and b/documentation/addons/img/cval-pro-licenses-code.png differ diff --git a/documentation/addons/img/directory-ivy-dependency.png b/documentation/addons/img/directory-ivy-dependency.png new file mode 100644 index 0000000000..3393699315 Binary files /dev/null and b/documentation/addons/img/directory-ivy-dependency.png differ diff --git a/documentation/addons/img/directory-maven-pom.png b/documentation/addons/img/directory-maven-pom.png new file mode 100644 index 0000000000..720d4b089c Binary files /dev/null and b/documentation/addons/img/directory-maven-pom.png differ diff --git a/documentation/addons/img/widgetset-compiling-toolbar-hi.png b/documentation/addons/img/widgetset-compiling-toolbar-hi.png new file mode 100644 index 0000000000..79e14ec60e Binary files /dev/null and b/documentation/addons/img/widgetset-compiling-toolbar-hi.png differ diff --git a/documentation/addons/img/widgetset-compiling-toolbar-lo.png b/documentation/addons/img/widgetset-compiling-toolbar-lo.png new file mode 100644 index 0000000000..70b3e9bfb4 Binary files /dev/null and b/documentation/addons/img/widgetset-compiling-toolbar-lo.png differ diff --git a/documentation/addons/img/widgetset-compiling-toolbar.png b/documentation/addons/img/widgetset-compiling-toolbar.png new file mode 100644 index 0000000000..853b2c457c Binary files /dev/null and b/documentation/addons/img/widgetset-compiling-toolbar.png differ diff --git a/documentation/addons/original-drawings/widgetset-compiling-toolbar.svg b/documentation/addons/original-drawings/widgetset-compiling-toolbar.svg new file mode 100644 index 0000000000..780d401457 --- /dev/null +++ b/documentation/addons/original-drawings/widgetset-compiling-toolbar.svg @@ -0,0 +1,176 @@ + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + -- cgit v1.2.3