chiark / gitweb /
Merge branch 'update-vagrantfile' into 'master'
[fdroidserver.git] / docs / fdroid.texi
index 771b5d9f7080296689fb152426008a16cb56db9b..c57689c7e0903f62f485347dd34b40aa8857895f 100644 (file)
@@ -1,6 +1,7 @@
 \input texinfo   @c -*-texinfo-*-
 @c %**start of header
 @setfilename fdroid.info
+@documentencoding UTF-8
 @settitle F-Droid Server Manual
 @c %**end of header
 
@@ -11,7 +12,9 @@ Copyright @copyright{} 2010, 2011, 2012, 2013 Ciaran Gultnieks
 
 Copyright @copyright{} 2011 Henrik Tunedal, Michael Haas, John Sullivan
 
-Copyright @copyright{} 2013 David Black, Daniel Martí
+Copyright @copyright{} 2013 David Black
+
+Copyright @copyright{} 2013, 2014 Daniel Martí
 
 @quotation
 Permission is granted to copy, distribute and/or modify this document
@@ -80,11 +83,11 @@ GNU/Linux
 @item
 Python 2.x
 @item
-The Android SDK Tools and Build-tools. 
-Note that F-Droid does not assume that you have the Android SDK in your 
-@code{PATH}: these directories will be specified in your repository 
-configuration. Recent revisions of the SDK have @code{aapt} located in 
-android-sdk/build-tools/ and it may be necessary to make a symlink to it in 
+The Android SDK Tools and Build-tools.
+Note that F-Droid does not assume that you have the Android SDK in your
+@code{PATH}: these directories will be specified in your repository
+configuration. Recent revisions of the SDK have @code{aapt} located in
+android-sdk/build-tools/ and it may be necessary to make a symlink to it in
 android-sdk/platform-tools/
 @end itemize
 
@@ -93,34 +96,11 @@ all, of the following:
 
 @itemize @bullet
 @item
-All SDK platforms requested by the apps you want to build
-(The Android SDK is made available by Google under a proprietary license but
-within that, the SDK platforms, support library and some other components are 
-under the Apache license and source code is provided. 
-Google APIs, used for building apps using Google Maps, are free to the extent 
-that the library comes pre-installed on the device.
-Google Play Services, Google Admob and others are proprietary and shouldn't be
-included in the main F-Droid repository.)
-@item
-A version of the Android NDK
-@item
-Ant
-@item
-Ant Contrib Tasks (Debian package ant-contrib)
-@item
-Maven (Debian package maven)
-@item
-JavaCC (Debian package javacc)
-@item
 JDK (Debian package openjdk-6-jdk): openjdk-6 is recommended though openjdk-7
 should work too
 @item
 VCS clients: svn, git, git-svn, hg, bzr
 @item
-Miscellaneous packages listed in 
-buildserver/cookbooks/fdroidbuild-general/recipes/default.rb
-of the F-Droid server repository
-@item
 A keystore for holding release keys. (Safe, secure and well backed up!)
 @end itemize
 
@@ -133,13 +113,41 @@ VirtualBox (debian package virtualbox)
 @item
 Ruby (debian packages ruby and rubygems)
 @item
-Vagrant (gem install vagrant)
+Vagrant (unpackaged, tested on v1.4.3)
 @item
 Paramiko (debian package python-paramiko)
 @item
 Imaging (debian package python-imaging)
+@item
+Magic (debian package python-magic)
 @end itemize
 
+On the other hand, if you want to build the apps directly on your system
+without the 'Build Server' system, you may need:
+
+@itemize @bullet
+@item
+All SDK platforms requested by the apps you want to build
+(The Android SDK is made available by Google under a proprietary license but
+within that, the SDK platforms, support library and some other components are
+under the Apache license and source code is provided.
+Google APIs, used for building apps using Google Maps, are free to the extent
+that the library comes pre-installed on the device.
+Google Play Services, Google Admob and others are proprietary and shouldn't be
+included in the main F-Droid repository.)
+@item
+A version of the Android NDK
+@item
+Ant with Contrib Tasks (Debian packages ant and ant-contrib)
+@item
+Maven (Debian package maven)
+@item
+JavaCC (Debian package javacc)
+@item
+Miscellaneous packages listed in
+buildserver/cookbooks/fdroidbuild-general/recipes/default.rb
+of the F-Droid server repository
+@end itemize
 
 @node Setup
 @chapter Setup
@@ -151,7 +159,7 @@ certainly want to work from a git clone of the tools at this stage. To
 get started:
 
 @example
-git clone git://gitorious.org/f-droid/fdroidserver.git
+git clone https://gitlab.com/fdroid/fdroidserver.git
 @end example
 
 You now have lots of stuff in the fdroidserver directory, but the most
@@ -168,14 +176,14 @@ repository management tasks. You can either create a brand new one, or
 grab a copy of the data used by the main F-Droid repository:
 
 @example
-git clone git://gitorious.org/f-droid/fdroiddata.git
+git clone https://gitlab.com/fdroid/fdroiddata.git
 @end example
 
 Regardless of the intended usage of the tools, you will always need to set
 up some basic configuration details. This is done by creating a file called
 @code{config.py} in the data directory. You should do this by copying the
-example file (@code{config.sample.py}) from the fdroidserver project to your
-data directory and then editing according to the instructions within.
+example file (@code{./examples/config.py}) from the fdroidserver project to
+your data directory and then editing according to the instructions within.
 
 Once configured in this way, all the functionality of the tools is accessed
 by running the @code{fdroid} command. Run it on its own to get a list of the
@@ -203,7 +211,7 @@ Set up the server tools, as described in Setup.
 @item
 Make a directory for your repository. This is the directory from which you
 will do all the work with your repository. Create a config file there, called
-@code{config.py}, by copying the @code{config.sample.py} from the server
+@code{config.py}, by copying @code{./examples/config.py} from the server
 project and editing it.
 @item
 Within that, make a directory called @code{repo} and put APK files in it.
@@ -237,7 +245,7 @@ particular application is named @code{package.id.txt} where package.id is the
 unique identifier for that package.
 
 See the Metadata chapter for details of what goes in the metadata file. All
-fields are relevant for binary APKs, EXCEPT for 'Build Version' entries, which
+fields are relevant for binary APKs, EXCEPT for @code{Build:} entries, which
 should be omitted.
 
 
@@ -282,7 +290,7 @@ except now you need to:
 
 @enumerate
 @item
-Include Build Version entries in the metadata files.
+Include Build entries in the metadata files.
 @item
 Run @code{fdroid build} to build any applications that are not already built.
 @item
@@ -304,12 +312,12 @@ To build a single version of a single application, you could run the
 following:
 
 @example
-./fdroid build --package=org.fdroid.fdroid --vercode 16
+./fdroid build org.fdroid.fdroid:16
 @end example
 
 This attempts to build version code 16 (which is version 0.25) of the F-Droid
-client. Many of the tools recognise this @code{--package} parameter, allowing
-their activity to be limited to just a single package.
+client. Many of the tools recognise arguments as packages, allowing their
+activity to be limited to just a limited set of packages.
 
 If the build above was successful, two files will have been placed in the
 @code{unsigned} directory:
@@ -341,32 +349,31 @@ A similar effect could by achieved by simply deleting the output files from
 @code{unsigned} after the build, but with the risk of forgetting to do so!
 
 Along similar lines (and only in conjunction with @code{--test}, you can use
-@code{--force} to force a build of a Disabled application, where normally it 
-would be completely ignored. Similarly a version that was found to contain 
-ELFs or known non-free libraries can be forced to build. See also — 
-scanignore= in the Build Version section.
+@code{--force} to force a build of a Disabled application, where normally it
+would be completely ignored. Similarly a version that was found to contain
+ELFs or known non-free libraries can be forced to build. See also —
+@code{scanignore=} and @code{scandelete=} in the @code{Build:} section.
 
-If the build was unsuccessful, you can find out why by looking at the output 
-in the logs/ directory. If that isn't illuminating, try building the app the 
+If the build was unsuccessful, you can find out why by looking at the output
+in the logs/ directory. If that isn't illuminating, try building the app the
 regular way, step by step: android update project, ndk-build, ant debug.
 
-Note that source code repositories often contain prebuilt libraries. If the 
-app is being considered for the main F-Droid repository, it is important that 
-all such prebuilts are built either via the metadata or by a reputable third 
+Note that source code repositories often contain prebuilt libraries. If the
+app is being considered for the main F-Droid repository, it is important that
+all such prebuilts are built either via the metadata or by a reputable third
 party.
 
 
 @section Direct Installation
 
-You can also build and install directly to a connected device or emulator using
-the @code{--install} switch. If you do this without using @code{--package} and
-@code{--vercode} then all versions of all packages will be installed (with each
-individual version overwriting the previous!). In most cases, this will not be
-what you want to do, so execution will stop straight away. However, you can
-override this if you're sure that's what you want, by using @code{--all}.
-Note that currently, no sanity checks are performed with this mode, so that if 
-the version is incorrect or that if the package name is different, you won't 
-be informed.
+You can also build and install directly to a connected device or emulator
+using the @code{fdroid install} command. If you do this without passing
+packages as arguments then all the latest built and signed version available
+of each package will be installed . In most cases, this will not be what you
+want to do, so execution will stop straight away. However, you can override
+this if you're sure that's what you want, by using @code{--all}.  Note that
+currently, no sanity checks are performed with this mode, so if the files in
+the signed output directory were modified, you won't be notified.
 
 
 @node Importing Applications
@@ -453,25 +460,32 @@ fdroid rewritemetadata
 The following sections describe the fields recognised within the file.
 
 @menu
-* Category::
+* Categories::
 * License::
-* Name::
 * Auto Name::
+* Name::
+* Provides::
 * Web Site::
 * Source Code::
 * Issue Tracker::
 * Donate::
 * FlattrID::
 * Bitcoin::
+* Litecoin::
 * Summary::
 * Description::
+* Maintainer Notes::
 * Repo Type::
 * Repo::
-* Build Version::
+* Build::
 * AntiFeatures::
 * Disabled::
 * Requires Root::
+* Archive Policy::
 * Update Check Mode::
+* Update Check Ignore::
+* Vercode Operation::
+* Update Check Name::
 * Update Check Data::
 * Auto Update Mode::
 * Current Version::
@@ -479,29 +493,31 @@ The following sections describe the fields recognised within the file.
 * No Source Since::
 @end menu
 
-@node Category
-@section Category
+@node Categories
+@section Categories
 
-A single category for the application to be placed in. There is no fixed list
-of categories - both the client and the web site will automatically show any
-categories that exist in any applications. However, if your metadata is
-intended for the main F-Droid repository, you should use one of the existing
-categories (look at the site/client), or discuss the proposal to add
+Any number of categories for the application to be placed in. There is no
+fixed list of categories - both the client and the web site will automatically
+show any categories that exist in any applications. However, if your metadata
+is intended for the main F-Droid repository, you should use one of the
+existing categories (look at the site/client), or discuss the proposal to add
 a new one.
 
-Additional categories can be specified, by using ';' as a separator. In this
-case the first is the primary category, and the only one that will be seen by
-clients that only understand one.
+Categories must be separated by a single comma character, ','. For backwards
+compatibility, F-Droid will use the first category given as <category> element
+for older clients to at least see one category.
+
+This is converted to (@code{<categories>}) in the public index file.
 
 @node License
 @section License
 
 @cindex license
 
-The overall license for the application, or in certain cases, for the 
-source code only. 
+The overall license for the application, or in certain cases, for the
+source code only.
 
-Common values: 
+Common values:
 
 @itemize @bullet
 
@@ -523,8 +539,8 @@ GNU GPL version 3 or later
 
 @item
 @samp{GPL}
-An unspecified GPL version. Use this only as a last resort or if there is 
-some confusion over compatiblity of component licenses: particularly the use of 
+An unspecified GPL version. Use this only as a last resort or if there is
+some confusion over compatiblity of component licenses: particularly the use of
 Apache libraries with GPLv2 source code.
 
 @item
@@ -549,34 +565,51 @@ BSD license - the new, or modified, version.
 
 @end itemize
 
+This is converted to (@code{<license>}) in the public index file.
+
 @node Auto Name
 @section Auto Name
 
 @cindex Auto Name
 
-The name of the application as can best be retrieved from the source code. 
-This is done so that the commitupdates script can put a familiar name in 
-the commit description. It is generated automatically when 
-@code{fdroid checkupdates} is run.
+The name of the application as can best be retrieved from the source code.
+This is done so that the commitupdates script can put a familiar name in the
+description of commits created when a new update of the application is
+found. The Auto Name entry is generated automatically when @code{fdroid
+checkupdates} is run.
 
 @node Name
 @section Name
 
 @cindex Name
 
-The name of the application. Normally, this field should not be present since 
-the application's correct name is retrieved from the APK file. However, in a 
-situation where an APK contains a bad or missing application name, it can be 
-overridden using this. Note that this only overrides the name in the list of 
+The name of the application. Normally, this field should not be present since
+the application's correct name is retrieved from the APK file. However, in a
+situation where an APK contains a bad or missing application name, it can be
+overridden using this. Note that this only overrides the name in the list of
 apps presented in the client; it doesn't changed the name or application label
 in the source code.
 
+@node Provides
+@section Provides
+
+@cindex Provides
+
+Comma-separated list of application IDs that this app provides. In other
+words, if the user has any of these apps installed, F-Droid will show this app
+as installed instead. It will also appear if the user clicks on urls linking
+to the other app IDs. Useful when an app switches package name, or when you
+want an app to act as multiple apps.
+
 @node Web Site
 @section Web Site
 
 @cindex Web Site
 
-The URL for the application's web site.
+The URL for the application's web site. If there is no relevant web site, this
+can be omitted (or left blank).
+
+This is converted to (@code{<web>}) in the public index file.
 
 @node Source Code
 @section Source Code
@@ -587,6 +620,8 @@ The URL to view or obtain the application's source code. This should be
 something human-friendly. Machine-readable source-code is covered in the
 'Repo' field.
 
+This is converted to (@code{<source>}) in the public index file.
+
 @node Issue Tracker
 @section Issue Tracker
 
@@ -595,6 +630,8 @@ something human-friendly. Machine-readable source-code is covered in the
 The URL for the application's issue tracker. Optional, since not all
 applications have one.
 
+This is converted to (@code{<tracker>}) in the public index file.
+
 @node Donate
 @section Donate
 
@@ -610,6 +647,8 @@ or the PayPal link format changed, things could go wrong. It is always
 best to use a link that the developer explicitly makes public, rather than
 something that is auto-generated 'button code'.
 
+This is converted to (@code{<donate>}) in the public index file.
+
 @node FlattrID
 @section FlattrID
 
@@ -619,6 +658,8 @@ The project's Flattr (http://flattr.com) ID, if it has one. This should be
 a numeric ID, such that (for example) https://flattr.com/thing/xxxx leads
 directly to the page to donate to the project.
 
+This is converted to (@code{<flattr>}) in the public index file.
+
 @node Bitcoin
 @section Bitcoin
 
@@ -626,22 +667,31 @@ directly to the page to donate to the project.
 
 A bitcoin address for donating to the project.
 
+This is converted to (@code{<bitcoin>}) in the public index file.
+
+@node Litecoin
+@section Litecoin
+
+@cindex Litecoin
+
+A litecoin address for donating to the project.
+
 @node Summary
 @section Summary
 
 @cindex Summary
 
-A brief summary of what the application is. Since the summary is only allowed 
-one line on the list of the F-Droid client, keeping it to within 32 characters 
-will ensure it fits even on the smallest screens.
+A brief summary of what the application is. Since the summary is only allowed
+one line on the list of the F-Droid client, keeping it to within 50 characters
+will ensure it fits most screens.
 
 @node Description
 @section Description
 
 @cindex Description
 
-A full description of the application, relevant to the latest version. 
-This can span multiple lines (which should be kept to a maximum of 80 
+A full description of the application, relevant to the latest version.
+This can span multiple lines (which should be kept to a maximum of 80
 characters), and is terminated by a line containing a single '.'.
 
 Basic MediaWiki-style formatting can be used. Leaving a blank line starts a
@@ -654,17 +704,33 @@ browser or the wiki. The link text will be the apps name.
 
 Links to web addresses can be done using @code{[http://example.com Text]}.
 
+For both of the above link formats, the entire link (from opening to closing
+square bracket) must be on the same line.
+
 Bulletted lists are done by simply starting each item with a @code{*} on
 a new line, and numbered lists are the same but using @code{#}. There is
 currently no support for nesting lists - you can have one level only.
 
-It can be helpful to note information pertaining to updating from an 
-earlier version; whether the app contains any prebuilts built by the 
-upstream developers or whether non-free elements were removed; whether the 
-app is in rapid development or whether the latest version lags behind the 
-current version; whether the app supports multiple architectures or whether 
+It can be helpful to note information pertaining to updating from an
+earlier version; whether the app contains any prebuilts built by the
+upstream developers or whether non-free elements were removed; whether the
+app is in rapid development or whether the latest version lags behind the
+current version; whether the app supports multiple architectures or whether
 there is a maximum SDK specified (such info not being recorded in the index).
 
+This is converted to (@code{<desc>}) in the public index file.
+
+@node Maintainer Notes
+@section Maintainer Notes
+
+@cindex Maintainer Notes
+
+This is a multi-line field using the same rules and syntax as the description.
+It's used to record notes for F-Droid maintainers to assist in maintaining and
+updating the application in the repository.
+
+This information is also published to the wiki.
+
 @node Repo Type
 @section Repo Type
 
@@ -710,34 +776,29 @@ http://svn.code.sf.net/p/project/code/svn;trunk=trunk;tags=tags;branches=branche
 
 For a Subversion repo that requires authentication, you can precede the repo
 URL with username:password@ and those parameters will be passed as @option{--username}
-and @option{--password} to the SVN checkout command. (This works only for
-plain svn and not for git-svn - one of the very few cases where using svn is
-advisable).
+and @option{--password} to the SVN checkout command. (This now works for both
+svn and git-svn)
 
+If the Repo Type is @code{srclib}, then you must specify the name of the
+according srclib .txt file. For example if @code{scrlibs/FooBar.txt} exist
+and you want to use this srclib, then you have to set Repo to
+@code{FooBar}.
 
-@node Build Version
-@section Build Version
+@node Build
+@section Build
 
-@cindex Build Version
+@cindex Build
 
 Any number of these fields can be present, each specifying a version to
 automatically build from source. The value is a comma-separated list.
 For example:
 
-@samp{Build Version:0.12,3,651696a49be2cd7db5ce6a2fa8185e31f9a20035}
+@samp{Build:1.2,12}
 
-The above specifies to build version 0.12, which has a version code of 3.
-The third parameter specifies the tag, commit or revision number from
-which to build it in the source repository.
-
-If the commit version starts with a !, that version is not built. Instead,
-everything after the ! is used as a reason why it can't be built. The
-purpose of this feature is to allow non-buildable releases (e.g. the source
-is not published) to be flagged, so the scripts don't generate repeated
-messages about them. (And also to record the information for review later).
-If an apk has already been built, ! causes it to be deleted once 
-@code{fdroid update} is run; this is the procedure if ever a version has to 
-be replaced.
+The above specifies to build version 1.2, which has a version code of 12.
+The @code{commit=} parameter specifies the tag, commit or revision number from
+which to build it in the source repository. It is the only mandatory flag,
+which in this case could for example be @code{commit=v1.2}.
 
 In addition to the three, always required, parameters described above,
 further parameters can be added (in name=value format) to apply further
@@ -745,13 +806,26 @@ configuration to the build. These are (roughly in order of application):
 
 @table @code
 
+@item disable=<message>
+Disables this build, giving a reason why. (For backwards compatibility, this
+can also be achieved by starting the commit ID with '!')
+
+The purpose of this feature is to allow non-buildable releases (e.g. the source
+is not published) to be flagged, so the scripts don't generate repeated
+messages about them. (And also to record the information for review later).
+If an apk has already been built, disabling causes it to be deleted once
+@code{fdroid update} is run; this is the procedure if ever a version has to
+be replaced.
+
 @item subdir=<path>
 Specifies to build from a subdirectory of the checked out source code.
 Normally this directory is changed to before building,
 
 @item submodules=yes
-Use if the project (git only) has submodules - causes git submodule
-init and update to be executed after the source is cloned.
+Use if the project (git only) has submodules - causes @code{git submodule
+update --init --recursive} to be executed after the source is cloned.
+Submodules are reset and cleaned like the main app repository itself before
+each build.
 
 @item init=xxxx
 As for 'prebuild', but runs on the source code BEFORE any other processing
@@ -768,39 +842,28 @@ is sdk-location. Typically, if you get a message along the lines of:
 try enabling this option.
 
 @item target=<target>
-Specifies a particular SDK target for compilation, overriding the 
-project.properties of the app and possibly sub-projects. Note that this does 
-not change the target SDK in the AndroidManifest.xml — the level of features 
-that can be included in the build. This is likely to cause the whole build.xml 
-to be rewritten, which is fine if it's a 'standard' android file or doesn't 
-already exist, but not a good idea if it's heavily customised. If you get an 
-error about invalid target, first try @code{init=rm -rf bin/}; otherwise this 
-parameter should do the trick.
-
-Please note that gradle builds should be using compilesdk=.
-
-@item compilesdk=<level>
-Practically accomplishes the same that target= does when used in ant and maven
-projects. compilesdk= is used rather than target= so as to not cause any more
-confusion. It only takes effect on gradle builds in the build.gradle file,
-thus using it in any other case is not wise.
-
-@item update=xxx
-By default, 'android update project' is used to generate or update the
-build.xml file. Specifying update=no bypasses that.
-
-Specifiying update=force forces rebuilding of the build.xml file at the
-same time - this is frequently needed with r14 of the Android platform
-tools. Be aware of any customisations in build.xml when using
-update=force.
-
-Otherwise, value can be a semicolon-separated list of directories in
-which to run 'android update project' relative to the main
-application directory (which may include '@code{subdir}' parameter).
-Default value is '@code{.}', and passing non-default value may be
-useful for multi-component projects. Note that @code{--subprojects}
-switch is automatically passed to 'android update project', so using
-explicit list may be needed only for peculiar source layouts.
+Specifies a particular SDK target for compilation, overriding the value
+defined in the code by upstream.  This has different effects depending on what
+build system used — this flag currently affects Ant, Maven and Gradle projects
+only. Note that this does not change the target SDK in the
+AndroidManifest.xml, which determines the level of features that can be
+included in the build.
+
+In the case of an Ant project, it modifies project.properties of the app and
+possibly sub-projects. This is likely to cause the whole build.xml to be
+rewritten, which is fine if it's a 'standard' android file or doesn't already
+exist, but not a good idea if it's heavily customised.
+
+@item update=<auto/dirs>
+By default, 'android update' is used in Ant builds to generate or update the
+project and all its referenced projects. Specifying update=no bypasses that.
+Note that this is useless in builds that don't use Ant.
+
+Default value is '@code{auto}', which recursively uses the paths in
+project.properties to find all the subprojects to update.
+
+Otherwise, the value can be a comma-separated list of directories in which to
+run 'android update' relative to the application directory.
 
 @item encoding=xxxx
 Adds a java.encoding property to local.properties with the given
@@ -814,142 +877,144 @@ If specified, the package version in AndroidManifest.xml is replaced
 with the version name for the build as specified in the metadata.
 
 This is useful for cases when upstream repo failed to update it for
-specific tag; to build an arbitrary revision; to make it apparent that 
-the version differs significantly from upstream; or to make it apparent 
+specific tag; to build an arbitrary revision; to make it apparent that
+the version differs significantly from upstream; or to make it apparent
 which architecture or platform the apk is designed to run on.
 
 @item forcevercode=yes
 If specified, the package version code in the AndroidManifest.xml is
 replaced with the version code for the build. See also forceversion.
 
-@item rm=<relpath>
-Specifies the relative path of a file to delete before the build is
-done. The path is relative to the base of the build directory - i.e.
-the root of the directory structure checked out from the source
-respository - not necessarily the directory that contains
+@item rm=<path1>[,<path2>,...]
+Specifies the relative paths of files or directories to delete before
+the build is done. The paths are relative to the base of the build
+directory - i.e. the root of the directory structure checked out from
+the source respository - not necessarily the directory that contains
 AndroidManifest.xml.
 
-Multiple files can be specified by separating they with ';'.
-
-@item fixtrans=yes
-Modifies any instances of string resources that use multiple
-formatting arguments, but don't use positional notation. For example,
-"Hello %s, %d" becomes "Hello %1$s, %2$d". Newer versions of the
-Android platform tools enforce this sensible standard. If you get
-error messages relating to that, you need to enable this.
-
-@item fixapos=yes
-Like fixtrans, but deals with an even older issue relating to
-'unescaped apostrophes' in translation strings.
+Multiple files/directories can be specified by separating them with ','.
+Directories will be recursively deleted.
 
-@item extlibs=a;b;c
-Specifies a list of external libraries (jar files) from the
+@item extlibs=<lib1>[,<lib2>,...]
+Comma-separated list of external libraries (jar files) from the
 @code{build/extlib} library, which will be placed in the @code{libs} directory
-of the project. Separate items with semicolons.
-
-@item srclibs=a@@r;b@@r1;
-Specifies a list of source libraries or Android projects. Separate items with 
-semicolons, and each item is of the form name@@rev where name is the predefined 
-source library name and rev is the revision or tag in source control to use. 
-
-Each srclib has a metadata file under srclibs/ in the repository directory, 
-and the source code is stored in build/srclib/. 
-Repo Type: and Repo: are specified in the same way as for apps; Subdir: can be 
-a comma separated list, for when directories are renamed by upstream; Update 
-Project: updates the projects in the working directory and one level down; 
-Prepare: can be used for any kind of preparation: in particular if you need to 
-update the project with a particular target. You can then also use $$name$$ in 
-the init/prebuild/build command to substitute the relative path to the library 
+of the project.
+
+@item srclibs=[n:]a@@r,[n:]b@@r1,...
+Comma-separated list of source libraries or Android projects. Each item is of
+the form name@@rev where name is the predefined source library name and rev is
+the revision or tag to use in the respective source control.
+
+For Ant projects, you can optionally append a number with a colon at the
+beginning of a srclib item to automatically place it in project.properties as
+a library under the specified number. For example, if you specify
+@code{1:somelib@@1.0}, f-droid will automatically do the equivalent of the
+legacy practice @code{prebuild=echo "android.library.reference.1=$$somelib$$"
+>> project.properties}.
+
+Each srclib has a metadata file under srclibs/ in the repository directory,
+and the source code is stored in build/srclib/.
+Repo Type: and Repo: are specified in the same way as for apps; Subdir: can be
+a comma separated list, for when directories are renamed by upstream; Update
+Project: updates the projects in the working directory and one level down;
+Prepare: can be used for any kind of preparation: in particular if you need to
+update the project with a particular target. You can then also use $$name$$ in
+the init/prebuild/build command to substitute the relative path to the library
 directory, but it could need tweaking if you've changed into another directory.
 
 @item patch=x
-Apply patch(es). 'x' names one (or more - comma-seperated)
-files within a directory below the metadata, with the same
-name as the metadata file but without the extension. Each of
-these patches is applied to the code in turn.
+Apply patch(es). 'x' names one (or more - comma-seperated) files within a
+directory below the metadata, with the same name as the metadata file but
+without the extension. Each of these patches is applied to the code in turn.
 
 @item prebuild=xxxx
-Specifies a shell command (or commands - chain with &&) to run before
-the build takes place. Backslash can be used as an escape character to
-insert literal commas, or as the last character on a line to join that
-line with the next. It has no special meaning in other contexts; in
-particular, literal backslashes should not be escaped.
+Specifies a shell command (or commands - chain with &&) to run before the
+build takes place. Backslash can be used as an escape character to insert
+literal commas, or as the last character on a line to join that line with the
+next. It has no special meaning in other contexts; in particular, literal
+backslashes should not be escaped.
 
 The command runs using bash.
 
-Note that nothing should be build during this prebuild phase - scanning
-of the code and building of the source tarball, for example, take place
-after this. For custom actions that actually build things, use 'build'
+Note that nothing should be built during this prebuild phase - scanning of the
+code and building of the source tarball, for example, take place after this.
+For custom actions that actually build things or produce binaries, use 'build'
 instead.
 
 You can use $$name$$ to substitute the path to a referenced srclib - see
 the @code{srclib} directory for details of this.
 
 You can use $$SDK$$, $$NDK$$ and $$MVN3$$ to substitute the paths to the
-android SDK and NDK directories, and maven 3 executable respectively e.g. 
+android SDK and NDK directories, and Maven 3 executable respectively e.g.
 for when you need to run @code{android update project} explicitly.
 
-@item initfun=yes
-Enables a selection of mad hacks to make com.funambol.android build.
-Probably not useful for any other application.
-
-@item scanignore=path1;path2;...
-Enables one or more files/paths to be exlcuded from the scan process.
+@item scanignore=<path1>[,<path2>,...]
+Enables one or more files/paths to be excluded from the scan process.
 This should only be used where there is a very good reason, and
 probably accompanied by a comment explaining why it is necessary.
 
-When scanning, files whose relative paths start with any of the paths
-given here are ignored.
+When scanning the source tree for problems, matching files whose relative
+paths start with any of the paths given here are ignored.
+
+@item scandelete=<path1>[,<path2>,...]
+Similar to scanignore=, but instead of ignoring files under the given paths,
+it tells f-droid to delete the matching files directly.
 
 @item build=xxxx
 As for 'prebuild', but runs during the actual build phase (but before the
-main ant/maven build). Use this only for actions that do actual building.
+main Ant/Maven build). Use this only for actions that do actual building.
 Any prepartion of the source code should be done using 'init' or 'prebuild'.
 
+Any building that takes place before build= will be ignored, as either Ant,
+mvn or gradle will be executed to clean the build environment right before
+build= (or the final build) is run.
+
 You can use $$SDK$$, $$NDK$$ and $$MVN3$$ to substitute the paths to the
-android SDK and NDK directories, and maven 3 executable respectively.
+android SDK and NDK directories, and Maven 3 executable respectively.
 
 @item buildjni=[yes|no|<dir list>]
 Enables building of native code via the ndk-build script before doing
-the main ant build. The value may be a list of directories relative
+the main Ant build. The value may be a list of directories relative
 to the main application directory in which to run ndk-build, or 'yes'
 which corresponds to '.' . Using explicit list may be useful to build
 multi-component projects.
 
 The build and scan processes will complain (refuse to build) if this
 parameter is not defined, but there is a @code{jni} directory present.
-If the native code is being built by other means, you can specify
-@code{no} here to avoid that. However, if the native code is actually
-not required, remove the directory instead (using @code{prebuild} for
-example).
-
-@item maven=yes
-Build with maven instead of ant
-
-@item gradle=<flavour>[@@<dir>]
-Build with gradle instead of ant, specifying what flavour to assemble.
-If <flavour> is 'yes', 'main' or empty, no flavour will be used. Note
-that this will not work on projects with flavours, since it will build
-all flavours and there will be no 'main' build.
-If @@<dir> is attached to <flavour>, then the gradle tasks will be run in that
-directory. This might be necessary if gradle needs to be run in the parent
-directory, in which case one would use 'gradle=<flavour>@..'.
-
-@item preassemble=<task1> <task2>
-Space-separated list of gradle tasks to be run before the assemble task
-in a gradle project build.
-
-@item bindir=<path>
-Normally the build output (apk) is expected to be in the bin
-subdirectory below the ant build files. If the project is configured
-to put it elsewhere, that can be specified here, relative to the base
-of the checked out repo. Not yet implemented for gradle.
-
-@item antcommand=xxx
-Specify an alternate ant command (target) instead of the default
+If the native code is being built by other means like a Gradle task, you
+can specify @code{no} here to avoid that. However, if the native code is
+actually not required or used, remove the directory instead (using
+@code{rm=jni} for example). Using @code{buildjni=no} when the jni code
+isn't used nor built will result in an error saying that native
+libraries were expected in the resulting package.
+
+@item gradle=<flavour1>[,<flavour2>,...]
+Build with Gradle instead of Ant, specifying what flavours to use. Flavours
+are case sensitive since the path to the output apk is as well.
+
+If only one flavour is given and it is 'yes' or 'main', no flavour will be
+used. Note that for projects with flavours, you must specify at least one
+valid flavour since 'yes' or 'main' will build all of them separately.
+
+@item maven=yes[@@<dir>]
+Build with Maven instead of Ant. An extra @@<dir> tells f-droid to run Maven
+inside that relative subdirectory. Sometimes it is needed to use @@.. so that
+builds happen correctly.
+
+@item preassemble=<task1>[,<task2>,...]
+List of Gradle tasks to be run before the assemble task in a Gradle project
+build.
+
+@item antcommands=<target1>[,<target2>,...]
+Specify an alternate set of Ant commands (target) instead of the default
 'release'. It can't be given any flags, such as the path to a build.xml.
 
-@item novcheck=yes 
+@item output=path/to/output.apk
+To be used when app is built with a tool other than the ones natively
+supported, like GNU Make. The given path will be where the build= set of
+commands should produce the final unsigned release apk.
+
+@item novcheck=yes
 Don't check that the version name and code in the resulting apk are
 correct by looking at the build output - assume the metadata is
 correct. This takes away a useful level of sanity checking, and should
@@ -967,9 +1032,9 @@ Another example, using extra parameters:
 @cindex AntiFeatures
 
 This is optional - if present, it contains a comma-separated list of any of
-the following values, describing an anti-feature the application has. 
-Even though such apps won't be displayed unless a settings box is ticked, 
-it is a good idea to mention the reasons for the anti-feature(s) in the 
+the following values, describing an anti-feature the application has.
+Even though such apps won't be displayed unless a settings box is ticked,
+it is a good idea to mention the reasons for the anti-feature(s) in the
 description:
 
 @itemize @bullet
@@ -979,18 +1044,18 @@ description:
 
 @item
 @samp{Tracking} - the application tracks and reports your activity to
-somewhere without your consent. It's commonly used for when developers 
-obtain crash logs without the user's consent, or when an app is useless 
+somewhere without your consent. It's commonly used for when developers
+obtain crash logs without the user's consent, or when an app is useless
 without some kind of authentication.
 
 @item
-@samp{NonFreeNet} - the application relies on computational services that 
-are impossible to replace or that the replacement cannot be connected to 
+@samp{NonFreeNet} - the application relies on computational services that
+are impossible to replace or that the replacement cannot be connected to
 without major changes to the app.
 
 @item
-@samp{NonFreeAdd} - the application promotes non-Free add-ons, such that the 
-app is effectively an advert for other non-free software and such software is 
+@samp{NonFreeAdd} - the application promotes non-Free add-ons, such that the
+app is effectively an advert for other non-free software and such software is
 not clearly labelled as such.
 
 @item
@@ -1008,9 +1073,9 @@ include it.
 If this field is present, the application does not get put into the public
 index. This allows metadata to be retained while an application is temporarily
 disabled from being published. The value should be a description of why the
-application is disabled. No apks or source code archives are deleted: to purge 
-an apk see the Build Version section or delete manually for developer builds. 
-The field is therefore used when an app has outlived it's usefulness, because 
+application is disabled. No apks or source code archives are deleted: to purge
+an apk see the Build Version section or delete manually for developer builds.
+The field is therefore used when an app has outlived it's usefulness, because
 the source tarball is retained.
 
 @node Requires Root
@@ -1020,10 +1085,23 @@ the source tarball is retained.
 
 Set this optional field to "Yes" if the application requires root
 privileges to be usable. This lets the client filter it out if the
-user so desires. Whether root is required or not, it is good to give 
-a paragraph in the description to the conditions on which root may be 
+user so desires. Whether root is required or not, it is good to give
+a paragraph in the description to the conditions on which root may be
 asked for and the reason for it.
 
+@node Archive Policy
+@section Archive Policy
+
+@cindex Archive Policy
+
+This determines the policy for moving old versions of an app to the archive
+repo, if one is configured. The configuration sets a default maximum number
+of versions kept in the main repo, after which older ones are moved to the
+archive. This app-specific policy setting can override that.
+
+Currently the only supported format is "n versions", where n is the number
+of versions to keep.
+
 @node Update Check Mode
 @section Update Check Mode
 
@@ -1038,60 +1116,113 @@ Valid modes are:
 @itemize
 @item
 @code{None} - No checking is done because there's no appropriate automated way
-of doing so. Updates should be checked for manually. Use this, for example, 
-when deploying betas or patched versions; when builds are done in a directory 
-different to where the AndroidManifest.xml is; if the developers use the 
-gradle build system and store version info in a separate file; if the 
-developers make a new branch for each release and don't make tags; or if you've 
+of doing so. Updates should be checked for manually. Use this, for example,
+when deploying betas or patched versions; when builds are done in a directory
+different to where the AndroidManifest.xml is; if the developers use the
+Gradle build system and store version info in a separate file; if the
+developers make a new branch for each release and don't make tags; or if you've
 changed the package name or version code logic.
 @item
-@code{Static} - No checking is doneeither development has ceased or new versions
-are not desired. This method is also used when there is no other checking method 
+@code{Static} - No checking is done - either development has ceased or new versions
+are not desired. This method is also used when there is no other checking method
 available and the upstream developer keeps us posted on new versions.
 @item
-@code{RepoManifest} - At the most recent commit, the AndroidManifest.xml file 
+@code{RepoManifest} - At the most recent commit, the AndroidManifest.xml file
 is looked for in the directory where it was found in the the most recent build.
-The appropriateness of this method depends on the development process used by 
-the application's developers. You should not specify this method unless you're 
-sure it's appropriate. For example, some developers bump the version when 
+The appropriateness of this method depends on the development process used by
+the application's developers. You should not specify this method unless you're
+sure it's appropriate. For example, some developers bump the version when
 commencing development instead of when publishing.
-It will return an error if the AndroidManifest.xml has moved to a different 
-directory or if the package name has changed. 
-The current version that it gives may not be accurate, since not all 
-versions are fit to be published. Therefore, before building, it is often 
-necessary to check if the current version has been published somewhere by the 
-upstream developers, either by checking for apks that they distribute or for 
-tags in the source code repository. 
-
-It currently works for every repository type to different extents, except 
-the srclib repo type. For git, git-svn and hg repo types, you may use 
-"RepoManifest/yourbranch" as UCM so that "yourbranch" would be the branch used 
-in place of the default one.  The default values are "master" for git, 
-"default" for hg and none for git-svn (it stays in the same branch). 
-On the other hand, branch support hasn't been implemented yet in bzr and svn, 
+It will return an error if the AndroidManifest.xml has moved to a different
+directory or if the package name has changed.
+The current version that it gives may not be accurate, since not all
+versions are fit to be published. Therefore, before building, it is often
+necessary to check if the current version has been published somewhere by the
+upstream developers, either by checking for apks that they distribute or for
+tags in the source code repository.
+
+It currently works for every repository type to different extents, except
+the srclib repo type. For git, git-svn and hg repo types, you may use
+"RepoManifest/yourbranch" as UCM so that "yourbranch" would be the branch used
+in place of the default one.  The default values are "master" for git,
+"default" for hg and none for git-svn (it stays in the same branch).
+On the other hand, branch support hasn't been implemented yet in bzr and svn,
 but RepoManifest may still be used without it.
 @item
+@code{RepoTrunk} - For svn and git-svn repositories, especially those who
+don't have a bundled AndroidManifest.xml file, the Tags and RepoManifest
+checks will not work, since there is no version information to obtain. But,
+for those apps who automate their build process with the commit ref that HEAD
+points to, RepoTrunk will set the Current Version and Current Version Code to
+that number.
+@item
 @code{Tags} - The AndroidManifest.xml file in all tagged revisions in the
 source repository is checked, looking for the highest version code. The
 appropriateness of this method depends on the development process used by the
 application's developers. You should not specify this method unless you're sure
-it's appropriate. It shouldn't be used if the developers like to tag betas or 
-are known to forget to tag releases. Like RepoManifest, it will not return the 
+it's appropriate. It shouldn't be used if the developers like to tag betas or
+are known to forget to tag releases. Like RepoManifest, it will not return the
 correct value if the directory containing the AndroidManifest.xml has moved.
-Despite these caveats, it is the often the favourite update check mode. 
+Despite these caveats, it is the often the favourite update check mode.
+
+It currently only works for git, hg, bzr and git-svn repositories. In the case
+of the latter, the repo URL must contain the path to the trunk and tags or
+else no tags will be found.
+
+Optionally append a regex pattern at the end - separated with a space - to
+only check the tags matching said pattern. Useful when apps tag non-release
+versions such as X.X-alpha, so you can filter them out with something like
+@code{.*[0-9]$} which requires tag names to end with a digit.
+@item
+@code{HTTP} - HTTP requests are used to determine the current version code and
+version name. This is controlled by the @code{Update Check Data} field, which
+is of the form @code{urlcode|excode|urlver|exver}.
+
+Firstly, if @code{urlcode} is non-empty, the document from that URL is
+retrieved, and matched against the regular expression @code{excode}, with the
+first group becoming the version code.
+
+Secondly, if @code{urlver} is non-empty, the document from that URL is
+retrieved, and matched against the regular expression @code{exver}, with the
+first group becoming the version name. The @code{urlver} field can be set to
+simply '.' which says to use the same document returned for the version code
+again, rather than retrieving a different one.
+@end itemize
 
-It currently only works for git, hg and git-svn repositories. In the case of
-the latter, the repo URL must encode the path to the trunk and tags or else no
-tags will be found.
-@item
-@code{HTTP} - An HTTP request is performed, and the resulting document is
-scanned for two regular expressions, the first specifying the version name
-and the second the version code. The expression for the version name can be
-blank, but the version code must always be correct.
+@node Vercode Operation
+@section Vercode Operation
 
-The @code{Update Check Data} field is used to provide the url and the two
-regular expressions, in the form @code{url|ex1|ex2}.
-@end itemize
+@cindex Vercode Operation
+
+Operation to be applied to the vercode obtained by the defined @code{Update
+Check Mode}. @code{%c} will be replaced by the actual vercode, and the whole
+string will be passed to python's @code{eval} function.
+
+Especially useful with apps that we want to compile for different ABIs, but
+whose vercodes don't always have trailing zeros. For example, with
+@code{Vercode Operation} set at something like @code{%c*10 + 4}, we will be
+able to track updates and build up to four different versions of every
+upstream version.
+
+@node Update Check Ignore
+@section Update Check Ignore
+
+@cindex Update Check Ignore
+
+When checking for updates (via @code{Update Check Mode}) this can be used to
+specify a regex which, if matched against the version name, causes that version
+to be ignored. For example, 'beta' could be specified to ignore version names
+that include that text.
+
+@node Update Check Name
+@section Update Check Name
+
+@cindex Update Check Name
+
+When checking for updates (via @code{Update Check Mode}) this can be used to
+specify the package name to search for. Useful when apps have a static package
+name but change it programmatically in some app flavors, by e.g. appending
+".open" or ".free" at the end of the package name.
 
 @node Update Check Data
 @section Update Check Data
@@ -1105,8 +1236,8 @@ Used in conjunction with @code{Update Check Mode} for certain modes.
 
 @cindex Auto Update Mode
 
-This determines the method using for auto-generating new builds when new 
-releases are available - in other words, adding a new Build Version line to the 
+This determines the method using for auto-generating new builds when new
+releases are available - in other words, adding a new Build Version line to the
 metadata.
 This happens in conjunction with the 'Update Check Mode' functionality - i.e.
 when an update is detected by that, it is also processed by this.
@@ -1138,14 +1269,16 @@ above, you would specify that as "Version +-fdroid %v" - "-fdroid" is the suffix
 
 The name of the version that is current. There may be newer versions of the
 application than this (e.g. betas), and there will almost certainly be older
-ones. This should be the one that is recommended for general use. 
-In the event that there is no source code for the current version, or that 
-non-free libraries are being used, this would ideally be the latest 
-version that is still free, though it may still be expedient to 
+ones. This should be the one that is recommended for general use.
+In the event that there is no source code for the current version, or that
+non-free libraries are being used, this would ideally be the latest
+version that is still free, though it may still be expedient to
 retain the automatic update check — see No Source Since.
 
 This field is normally automatically updated - see Update Check Mode.
 
+This is converted to (@code{<marketversion>}) in the public index file.
+
 @node Current Version Code
 @section Current Version Code
 
@@ -1158,13 +1291,15 @@ which version should be recommended.
 
 This field is normally automatically updated - see Update Check Mode.
 
+This is converted to (@code{<marketvercode>}) in the public index file.
+
 @node No Source Since
 @section No Source Since
 
 @cindex No Source Since
 
 In case we are missing the source code for the Current Version reported by
-Upstream, or that non-free elements have been introduced, this defines the 
+Upstream, or that non-free elements have been introduced, this defines the
 first version that began to miss source code.
 Apps that are missing source code for just one or a few versions, but provide
 source code for newer ones are not to be considered here - this field is
@@ -1228,7 +1363,7 @@ of things that an attacker could do in such a situation:
 
 @enumerate
 @item
-Use custom ant build steps to execute virtually anything as the user doing
+Use custom Ant build steps to execute virtually anything as the user doing
 the build.
 @item
 Access the keystore.
@@ -1259,7 +1394,7 @@ applications.
 @section Setting up a build server
 
 In addition to the basic setup previously described, you will also need
-a Vagrant-compatible Ubuntu Raring base box called 'raring32' (or raring64
+a Vagrant-compatible Debian Testing base box called 'testing32' (or testing64
 for a 64-bit VM, if you want it to be much slower, and require more disk
 space).
 
@@ -1270,9 +1405,9 @@ for example, having subversion v1.6 on the host and v1.7 on the guest
 would fail.
 
 Unless you're very trusting. you should create one of these for yourself
-from verified standard Ubuntu installation media. However, you could skip
-over the next few paragraphs (and sacrifice some security) by downloading 
-@url{https://f-droid.org/raring32.box} or @url{https://f-droid.org/raring64.box}.
+from verified standard Debian installation media. However, you could skip
+over the next few paragraphs (and sacrifice some security) by downloading
+@url{https://f-droid.org/testing32.box}.
 
 Documentation for creating a base box can be found at
 @url{http://docs.vagrantup.com/v1/docs/base_boxes.html}.
@@ -1296,18 +1431,16 @@ boot, you need to set @code{GRUB_RECORDFAIL_TIMEOUT} to a value other than
 -1 in @code{/etc/grub/default} and then run @code{update-grub}.
 @end enumerate
 
-You may also want to edit @code{buildserver/Vagrantfile} - in particular
-there is a path for retrieving the base box if it doesn't exist, and an
-apt proxy definition, both of which may need customising for your
-environment.
 
 With this base box available, you should then create @code{makebs.config.py},
-using @code{makebs.config.sample.py} as a reference - look at the settings and
+using @code{./examples/makebs.config.py} as a reference - look at the settings and
 documentation there to decide if any need changing to suit your environment.
+There is a path for retrieving the base box if it doesn't exist, and an apt
+proxy definition, both of which may need customising for your environment.
 You can then go to the @code{fdroidserver} directory and run this:
 
 @example
-./makebuildserver.py
+./makebuildserver
 @end example
 
 This will take a long time, and use a lot of bandwidth - most of it spent
@@ -1325,9 +1458,9 @@ can supply a pre-populated cache directory which includes not only these
 downloads, but also .tar.gz files for all the relevant additions. If the
 provisioning scripts detect these, they will be used in preference to
 running the android tools. For example, if you have
-@code{buildserver/addons/cache/platforms/android-15.tar.gz} that will be
-used when installing the android-15 platform, instead of re-downloading it
-using @code{android update sdk --no-ui -t android-15}.
+@code{buildserver/addons/cache/platforms/android-19.tar.gz} that will be
+used when installing the android-19 platform, instead of re-downloading it
+using @code{android update sdk --no-ui -t android-19}.
 
 Once it's complete you'll have a new base box called 'buildserver' which is
 what's used for the actual builds. You can then build packages as normal,