This document is copyright (C) 2004 by the various Scmbug contributors who wrote it. It is licensed under the GNU Free Documentation License.
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and with no Back-Cover Texts. A copy of the license is included in Appendix B.
Scmbug is free software, licensed under the GNU General Public License.
This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
No liability for the contents of this document can be accepted. Follow the instructions herein at your own risk.
The excellent Bugzilla Guide served as an example in preparation of this document. Content and structural document elements were reused from this guide. The LDP Author Guide also served as a good example.
Development of this system benefited from invaluable insight on SCM and bug-tracking issues, along with feedback, from John C. Quillan, Mark S. Reibert, Dave Swegen, the Bugzilla developers, and the Subversion developers.
This document uses the following conventions:
| Descriptions | Appearance | ||
|---|---|---|---|
| Warning |
| ||
| Hint |
| ||
| Note |
| ||
| Information requiring special attention |
| ||
| File or directory name | filename | ||
| Command to be typed | command | ||
| Application name | application | ||
| Normal user's prompt under bash shell | bash$ | ||
| Root user's prompt under bash shell | bash# | ||
| Environment variables | VARIABLE
| ||
| Term found in the glossary | cvs2cl | ||
| Code example |
|
This documentation is maintained in DocBook 4.2 SGML format.
Scmbug is a system that integrates software configuration management with bug-tracking. It is implemented in Perl and has been successfully deployed on UNIX-like and Windows systems. It is pronounced Scum-bag.
Those who do not use a software configuration management (SCM) system do not maintain a history of modifications performed to their software. When bugs creep in their software, they do not have adequate information on how changes to source code came about.
SCM systems, or even simple source code version control systems, make sure that a record of all changes and enhancements to the software is maintained. They provide a method of creating, storing, and labeling software changes.
Those who do not use a bug-tracking system tend to rely on shared lists, email, spreadsheets and/or Post-It notes to monitor the status of defects. This procedure is usually error-prone and tends to cause those bugs judged least significant by developers to be dropped or ignored.
Integrated defect-tracking systems make sure that nothing gets swept under the carpet; they provide a method of creating, storing, arranging and processing defect reports and enhancement requests.
SCM systems maintain software changes. Bug-tracking systems maintain lists of software enhancements and defects. By examining a log of software changes, it is uncertain why the changes occurred. By examining a log of defect reports, it is uncertain what changed in software in response to the defects.
Integration of SCM with bug-tracking ties the reason why a feature/defect was developed/fixed with what software changes occurred in the SCM system to accomplish this.
The goals of Scmbug are:
Provide synchronous verification checks of SCM actions against the bug-tracking system.
Provide a flexible architecture that can be deployed across the public Internet with reasonable security. Permit integrating repositories hosted by multiple SCM systems in separate networks, against a single, publicly accessible bug-tracking system, for use with multiple mobile developers.
Define an SCM to bug-tracking integration interface and mechanism that will permit integration of any SCM system with any bug-tracking system.
Encourage developers of other SCM to bug-tracking integration efforts to solve the integration problem once and for all.
Integrate most popular free SCM or source code version control systems, such as CVS, Subversion, and Arch.
Integrate most popular free bug-tracking systems, such as Bugzilla and Mantis.
Scmbug is developed as a client/server solution. As shown in Figure 3-1, it consists of a set of SCM system hooks that capture standard SCM events, a generic mechanism of handling these events on the machine hosting an SCM repository, a server daemon onto which integration requests corresponding to these events are transported, a generic mechanism of handling these requests, and functionality that can process these requests per bug-tracking system.
When various SCM events occur, such as committing software changes or labeling a repository, they are captured using hooks installed by Scmbug. Before the event's activity is allowed to proceed, various verification checks are performed as described in Section 4.2. These checks are synchronous; when an error is detected, the event's activity is stopped.
Scmbug is not original work. Most of the integration features separating it from related systems were first conceived and implemented by John C. Quillan for CVS and Bugzilla. The distinguishing features of his work are the synchronous nature of the verification checks, and a VDD Generator tool similar to the one described in Section 7.2. His work was never publicly released. Scmbug attempts to continue a redesigned, clean-room implementation of that work, supporting a wider variety of SCM and bug-tracking systems.
Other systems that integrate SCM with bug-tracking are described below. Along with Quillan's work, these solutions are unsuitable for certain development environments.
SCM systems can integrate their actions with Bugzilla using the Bugzilla email gateway. Hook scripts installed in an SCM system can email the results of the system's actions to an email account configured to parse the email and process it accordingly. An example of such a configuration is available from Steve McIntyre's web page.
This approach is not synchronous. For example, if a user accidentally commits against the wrong bug number, or a bug against which he is not the owner, the SCM system will proceed with the commit action regardless, without giving the user the option to correct his actions. Additionally, if the email gateway is not active, the developer will not be immediately aware that integration failed.
Tony Garnock-Jones' CVSZilla integrates SCM events produced by CVS with Bugzilla. It also extends CVS to give rudimentary support to "change-sets", or "transactions".
CVSZilla does not support integration of events produced by any SCM system in a generic way. It modifies the Bugzilla schema and does not work with future versions of Bugzilla. Finally, it assumes that the TCP port used by MySQL is accessible from the machine hosting the CVS repository.
The last assumption does not always hold true, especially when a bug-tracking system is used to track development of mobile developers (laptop users), needing the flexibility to work both locally and remotely, on multiple projects, across different organizational units. Experience has shown that this is a common scenario in organizations with limited hardware, software, or labor resources, such as an academic environment.
For example, imagine integrating CVS actions from a repository hosted on a personal laptop with a Bugzilla instance that needs to be publicly accessible from the Internet. This same bug-tracking system is used for collaboration with other mobile developers of a different organization on a joint project hosted on a third machine. Integration over the public Internet is not possible without opening the MySQL database port Bugzilla uses. Opening this port is unnecessarily insecure, exposing access to other applications hosted on the same database system. The Scmbug daemon exposes the minimum required integration interface between an SCM system and a bug-tracking system.
Commercial products concentrate only on integrating a particular SCM system with a particular bug-tracking system, in a proprietary way. They do not attempt to define a public SCM to bug-tracking integration interface, and solve the integration problem once and for all.
Scmbug is an effort for defining an SCM to bug-tracking integration interface and mechanism that will permit integration of any SCM system with any bug-tracking system.
For every SCM event, multiple corresponding integration actions may be issued from the glue to the daemon. The list of possible integration actions is:
activity_verify: An activity_commit integration action will soon follow, and data collected from the corresponding SCM event must be verified first.
activity_commit: A software change has already been committed in the SCM system, and this event must be integrated with bug-tracking. This action usually follows an activity_verify integration action.
activity_tag: A software labeling operation is issued in the SCM system, and this event must be integrated with bug-tracking.
activity_get_vdd: A VDD will be produced by the VDD Generator.
When various SCM events occur, verification checks are performed before the SCM event is allowed to proceed. Some checks are performed by the glue on the client side, the machine the SCM repository resides. Other checks are performed on the server side, the machine hosting the Scmbug daemon.
SCM events will be integrated with bug-tracking only if the integration glue is enabled. This can be controlled in the glue configuration file using the enabled variable, as shown in Figure 4-1.
SCM tools may work considerably different between separate versions. For example, CVS changed during the 1.12.x series the format of command-line arguments supplied to integration hooks. Appropriate support is needed to handle their idiosynchracies. The SCM tool's version is detected at runtime, and interaction with the tool is handled accordingly.
One of the problems with some SCM systems is that they may unset the PATH variable (e.g. Subversion in 1.2.x). The list of paths to the tool's binaries must be supplied in the glue configuration file using the binary_paths variable, as shown in Figure 4-2. It is verified at runtime that each binary needed by an SCM tool is present in only one path from the list supplied, to avoid accidentally invoking the wrong version of the tool due to an incomplete installation of the SCM tool.
The log message supplied to the SCM system when committing a software change is verified to match a log template expected by Scmbug. Two regular expressions describe how the bug id and log comment will be identified. These are defined as part of the log_template policy variable as shown in Figure 4-3, through the variables bugid_regex and log_regex.
A way to split a list of multiple bug ids into separate ids is also described with a regular expression through the variable bugid_split_regex. This is needed in order to permit special characters to preceed a bug number. For example, instead of separating bug ids using a whitespace or comma, one may want to also prefix a bug id with a '#'. Bug-trackers may then autolinkify in their comments a bug id that is prefixed by a '#' (e.g. Bugzilla). An example log message accepted by these expressions is shown in Figure 4-4.
Figure 4-3. Regular expressions describing the bug id, the split of bug ids and the log message.
log_template => {
# The bugid_regex is a regular expression that must set
# the unnamed variable $1 to the bug number, or list of
# bug numbers. It is checked for a match as: m/$regex/s
bugid_regex => 'bug\s*(.*?):',
# The bugid_split_regex is a regular expression describing
# how a list of bug ids will be split in individual bug
# numbers. It is split as: /$regex/
bugid_split_regex => ',\s?#|\s?#|,|\s+',
# The log_regex is a regular expression that must set the
# unnamed variable $1 to the log comment. It is checked
# for a match as: m/$regex/s
log_regex => 'bug.*?:\s*(.*)'
},
This template can be customized when the Scmbug codebase is configured, prior to installation. The arguments --with-template-bugid-regex=<regular_expression>, --with-template-bugid-split-regex=<regular_expression>, and --with-template-log-regex=<regular_expression> can be passed to configure, shown in Figure 8-2.
The log message supplied to the SCM system when committing a software change is verified to include only distinct bug ids.
It is verified that the log message supplied to the SCM system system meets a configurable minimum log message size limit. This behavior is defined in the glue configuration file using the minimum_log_message_size policy variable, as shown in Figure 4-5.
It is verified that the names used in labeling operations, such as creation of tags or branches, match a configurable label naming convention. This behavior is defined in the glue configuration file using the label_name policy variable, as shown in Figure 4-6.
Figure 4-6. Label naming convention policy.
# Format of label names (tag or branch names) defined as
# regular expressions.
label_name => {
enabled => 1,
names => [
# Convention for official releases.
# For example:
# SCMBUG_RELEASE_0-2-7
'^.+?_RELEASE_[0-9]+-[0-9]+-[0-9]+$',
# Convention for development builds.
# For example:
# SCMBUG_BUILD_28_added_a_policies_mechanism
'^.+?_BUILD_[0-9]+_.+$',
# Convention for branches.
# For example:
# b_experimenting_with_policies_on_glue_side
'^b_.+$',
# Convention for private developer tags. Uses
# the developer's initials (either 2 or 3).
# For example:
# p_kpm_prior_to_bug353_stabilization_fixes
'^p_[a-zA-Z][a-zA-Z]?[a-zA-Z]_.+$'
]
}
The log message supplied to the SCM system when committing a software change may be required to include at least one bug id. This is determined using the presence_of_bug_ids policy variable, as shown in Figure 4-7.
Figure 4-7. Presence of bug ids policy.
#
# Presence of bug ids. There are 3 options:
#
# - 'required'. A bug id must be specified during each
# activity. Activities without a bug id will not be permitted.
#
# - 'optional'. If a bug id is supplied, the activity will be
# integrated. If not the activity will be permitted to go
# through in the SCM system, but without bug-tracking
# integration.
#
# - 'none'. Never integrate activities regardless. This is
# different than flagging the glue inactive. The remaining
# policies are still enforced were applicable.
# (e.g. policy minimum_log_message_size).
#
# This policy is ALWAYS enabled
presence_of_bug_ids => {
value => 'required'
},
All integration requests must include the SCM username of the user issuing an integration request. This username must be mapped to the username of the user in the bug-tracking system. Bug-tracking systems that do not support SCM usernames are accomodated through a username mapping list defined in the daemon configuration file using the userlist variable. Three mapping mechanisms are available:
LDAP. An LDAP directory is accessed to map the SCM username, as one LDAP attribute, into the bug-tracking username defined by another LDAP attribute. This is configured using the mapping_ldap variable, as shown in Figure 4-8.
Figure 4-8. SCM to bug-tracking username mapping based on mapping_ldap.
# This is a mapping based on LDAP. ldap_scm_username_attribute
# defines the LDAP attribute that will be used to match the
# SCM username. The SCM username will be mapped into the
# bug-tracking username defined by
# ldap_bugtracking_username_attribute.
mapping_ldap => {
enabled => 0,
ldap_server => '127.0.0.1',
ldap_port => '389',
# A binddn (e.g. cn=default) that has access to read all
# attributes
ldap_binddn => 'replace_with_binddn',
# The password of the binddn that has access to read all
# attributes
ldap_binddn_password => 'replace_with_binddn_password',
# The BaseDN in which to search for the
# ldap_scm_username_attribute (e.g. "ou=People,o=Company")
ldap_basedn => 'replace_with_basedn',
# The name of the attribute containing the user's SCM
# username
ldap_scm_username_attribute => 'uid',
# The name of the attribute containing the user's
# bug-tracking username
ldap_bugtracking_username_attribute => 'mail',
# LDAP filter to AND with the ldap_scm_username_attribute
# for filtering the list of valid SCM users.
ldap_filter => ''
},
List of regular expressions. A list of regular expressions describe how the SCM username will be matched and how it will be transformed into a bug-tracking username using the mapping_regexes variable, as shown in Figure 4-9.
Figure 4-9. SCM to bug-tracking username mapping based on mapping_regexes.
# This is a mapping based on regular expressions. The first
# expression defines how the SCM username will be matched. The
# second defines how it will be transformed, and uses the
# unnamed variable $1 that was described by the first
# expression. The mapping is checked for a match as:
# m/$first_regex/
# and is applied as: s/$first_regex/$second_regex/
mapping_regexes => {
enabled => 0,
values => {
# This is an example of mapping a Windows Domain user
# from 'DOMAIN\user' to 'user@EMAIL_DOMAIN.com'
'^DOMAIN\\\\(\w+)$' => '$1\@EMAIL_DOMAIN.com',
# This is an example of mapping a UNIX user from
# 'example_user' to 'example_user@exampledomain.com'
'^(\w+)$' => '$1\@exampledomain.com'
}
},
Direct. A direct one-to-one mapping of an SCM username to a bug-tracking username using the mapping_values variable, as shown in Figure 4-10.
Figure 4-10. SCM to bug-tracking username mapping based on mapping_values.
# This is a one-to-one mapping of SCM usernames to bugtracking
# usernames. Mappings in this list override mappings from
# mapping_regexes.
mapping_values => {
enabled => 0,
values => {
'DOMAIN\\example_user' => 'example_user@DOMAIN.com',
'example_user2' => 'example_user2@exampledomain.com'
}
},
If the SCM username already matches the bug-tracking username, these mappings can be disabled. If any of these mappings are enabled, they are executed in the order presented here. Mappings based on mapping_ldap are appiled first. Mappings based on mapping_regexes are applied second and can override a mapping based on mapping_ldap. Mappings based on mapping_values are applied last and can override all other mappings.
An activity_verify integration request must refer to bug ids filed against the SCM system's associated product name in the bug-tracking system. The product name can be defined in the glue configuration file in two ways:
Manually specified. All SCM activity in the repository will be integrated against a single product name in the bug-tracker. This requires setting the valid_product_name policy's type to manual and providing a product name in value, as shown in Figure 4-11.
Automatically detected. Some organizations may follow a development model that permits multiple products to be hosted under the same SCM repository. For example, multiple product names in the bug-tracking system may correspond to multiple branches in the SCM system. Scmbug can autodetect the appropriate product name by consulting a list of directory prefixes under which any SCM activity is accounted against a product name with the first subdirectory's name.
Figure 4-12 shows a configuration example that can autodetect from the repository structure of Figure 4-13 the list of product names in Figure 4-14. When a file from one of the directories shown in Figure 4-13 is commited, the appropriate product name shown in Figure 4-14 will be autodetected.
Figure 4-12. Automatically detected product name.
valid_product_name => {
enabled => 1,
type => 'auto',
value => 'prefix1/of/directory/in/repository/,prefix2/of/directory/in/repository/'
},
Figure 4-13. Repository structure with product names that can be automatically detected.
prefix1/of/directory/in/repository/product_base/branches prefix1/of/directory/in/repository/product_base/tags prefix1/of/directory/in/repository/product_base/trunk prefix2/of/directory/in/repository/productA_3-1/branches prefix2/of/directory/in/repository/productA_3-1/tags prefix2/of/directory/in/repository/productA_3-1/trunk prefix2/of/directory/in/repository/productB
Figure 4-14. Automatically detected product names from Figure 4-13.
product_base productA_3-1 productB
Another example where multiple products may be required would be a contracting company maintaining all their contracts in the same SCM repository but using separate product names in the bug-tracking tool.
![]() | We must note that, from an SCM perspective, hosting multiple products that share a common codebase in the same SCM system may not be the ideal way to go. Organizations that follow this development model may want to consider developing their common codebase in it's own SCM repository, as a separate product. They can then import the common code as a vendor branch in multiple SCM repositories, each corresponding to a single product name they wish to publicly release. More information on vendor branches can be found in the CVS and Subversion manuals. |
![]() | Automatically detected product names are not supported for CVS. |
It is verified that the SCM user issuing an activity_verify integration request is the owner of the bug against which subsequent integration requests will be issued. This behavior is optional and can be configured in the glue configuration file using the valid_bug_owner policy variable, as shown in Figure 4-15.
It is verified that the bug against which an activity_verify integration request is issued must is in an open, active state in the bug-tracking system. Thes behavior is optional and can be configured in the glue configuration file using the open_bug_state policy variable, as shown in Figure 4-16.
An email can be send when an activity is accepted. This is defined in the glue configuration file using the mail_on_success policy variable, as shown in Figure 4-17.
Figure 4-17. Mail on success policy.
# Send an email after a successful activity (both committing
# and labeling).
mail_on_success => {
enabled => 1,
# Sending email when a tag is moved or deleted in CVS can
# be annoying, since multiple emails are sent per
# directory(but not when a tag is added). mail_on_label
# can disable that behavior.
mail_on_label => 1,
values => {
To => 'replace_with_commit_mailing_list_email@exampledomain.com',
# Must be a valid email address
From => 'Scmbug <replace_with_mailing_list_owner_email@exampledomain.com>',
# Defaults to localhost if left empty
Smtp => 'replace_with_mail_server.domain.com'
},
# List of users that can be notified regardless.
mail_scm_user => 1,
mail_bug_owner => 1,
mail_bug_reporter => 1,
mail_bug_monitors => 1,
# When labeling, the product owners can also be notified.
mail_product_owners => 1
}
When a software change occurs in the SCM system, a log message may be used to describe the change. Using an activity_commit integration request, this log message is inserted in the bug-tracking system against the specified bug id. The log message is complemented by the list of files affected by the changeset, as shown in Figure 4-18
Figure 4-18. Example of Integrated Log Message.
Added a glossary, and a document conventions section, just like the Bugzilla Guide uses. Began linking names of systems/tools to the glossary, and using a url to their webpage there. This will unclutter the pdf version of the document from url links inlined with content. Affected files: --------------- 1.7 --> 1.8 system/doc/manual/about.sgml 1.7 --> 1.8 system/doc/manual/bugtracking-backends.sgml NONE --> 1.1 system/doc/manual/conventions.sgml NONE --> 1.1 system/doc/manual/glossary.sgml 1.12 --> 1.13 system/doc/manual/manual.sgml.in 1.8 --> 1.9 system/doc/manual/scm-frontends.sgml 1.9 --> 1.10 system/doc/manual/tools.sgml
When a tag or branch operation is issued in the SCM system, a name is used to describe this software labeling operation. Using an activity_tag integration request, this label is inserted in the list of possible versions of the product in the bug-tracking system.
CVS is the Concurrent Versions System, the dominant open-source network-transparent version control system.
Scmbug supports verification checks, integration of log messages with the bug-tracking system, and integration of labeling operations for CVS. Various deficiencies of CVS introduce complications in integration. It is recommended that users of CVS upgrade to Subversion.
CVS does not require users to enter a log comment when directories are added in a repository. Scmbug does not overcome this limitation, even though it is possible to do so.
Another limitation of CVS is that it does not provide an integration hook on 'cvs admin -o'.
The verification hook of CVS 1.11.x does not provide the list of files that will be modified. As a result, the Valid product name policy cannot be set to auto for CVS 1.11.x. This policy will be implemented in the future for CVS 1.12.x and, if possible, for CVSNT.
A major drawback of CVS is it's lack of atomic transactions. As a side-effect, when the same log message is used to commit files in two separate directories, two integration actions occur using the same log message. Duplicate log messages are then entered in the bug-tracking system. An example of this can be observed in bug 353, in comments 2 and 3 . It is possible to introduce logic in the Scmbug daemon that can solve this problem.
A common limitation of other systems integrating CVS with bug-tracking resulted from the inadequate mechanism CVS 1.11.x uses to provide the list of affected files in a commit trigger. For each file, the old version, new version, and the filename, all separated by commas, can be passed as command-line arguments to an integration trigger script. When the filenames, or the directory in which the files reside, contain either commas or whitespaces, a processing script using a single regular expression to parse these arguments will get confused. Some systems addressed this by requiring source modifications to the CVS binary, and distributed patches for it. Scmbug addresses this issue by employing a stateful parser. Using this parser, the probability of files and directories with whitespaces or commas contained in their names to confuse the integration glue is marginal. For example, the filename shown in Figure 5-1 is accepted.
Figure 5-1. A complex filename accepted by the CVS glue.
a file with spaces,NONEs, commas, digits,1.1,2.numbers close to dots.1.2,NONe.txt
Scmbug has been verified to work against the following releases of CVS:
1.11.21
1.12.13
CVSNT 2.5.03 Build 2260
Subversion is a compelling replacement for CVS.
Scmbug supports verification checks, integration of log messages with the bug-tracking system, and integration of labeling operations for Subversion.
Subversion is not yet capable of using a predefined log template when the user's editor is opened to enter a log comment. As a result, the log template expected by Scmbug must be entered by the user.
Scmbug has been verified to work against the following releases of Subversion:
1.0.6
1.1.3
1.2.3
1.3.0
Additional SCM frontends can be supported by Scmbug. Developers and system integrators of the following SCM systems are strongly encouraged to contribute an SCM integration frontend:
Developing a frontend requires:
Committing to support this frontend in future releases of Scmbug.
Creating a new frontend module named src/lib/product/Glue/FrontendName.pm.in. The CVS frontend src/lib/product/Glue/CVS.pm.in serves as a good example.
Updating src/lib/product/Glue/Glue.pm.in:check_configuration accordingly.
Updating the configuration management files configure.in and Makefile.in to autogenerate, and autocleanup the new frontend.
Updating the install-tools rule of Makefile.in to install the new frontend from source.
Creating a new directory named src/glue/templates/frontendname that includes template hook/trigger scripts. The CVS trigger scripts in src/glue/templates/cvs serve as a good example.
Updating the Glue Installer src/scripts/install_glue.pl.in and its manpage doc/manpages/install_glue.sgml.1.in to support the new frontend.
Updating the VDD Generator src/scripts/vdd_generator.pl.in and its manpage doc/manpages/vdd_generator.sgml.1.in to support the new frontend.
Updating the documentation in doc/manual/content to reflect support for the new frontend.
Bugzilla is an enterprise-class piece of software that tracks millions of bugs and issues for hundreds of organizations around the world.
Bugzilla does not provide a public interface for SCM integration. Nevertheless, the Scmbug daemon attempts to reuse functionality already available in the Perl-based Bugzilla libraries. As a result, the source code used to host a Bugzilla instance must be locally accessible by the daemon. The installation_directory variable is used to define the location of the Bugzilla source installation as shown in Figure 6-1.
Figure 6-1. Bug-tracker installation directory for Bugzilla.
# Used for Bugzilla and RequestTracker. # # Path to the directory of the bugtracker sources providing an # API that the daemon can use installation_directory => '/usr/share/bugzilla/lib'
Additionally, the installed_locally variable is used to flag whether Bugzilla is installed locally on the same machine the daemon is running as shown in Figure 6-2. This is required to flush Bugzilla's version cache when SCM tags are added or deleted, and immediately reflect tag manipulation to Bugzilla's user interface.
Figure 6-2. Bug-tracker installed locally variable.
# Used only for Bugzilla. # # Flags whether the live bugtracker instance is installed # locally on the same machine the daemon is running installed_locally => 1,
![]() | For example, it is possible to install Bugzilla in machine A, and install a duplicate Bugzilla source in machine B where Scmbug is installed. In this scenario installation_directory would be set to Bugzilla's source code path on machine B, but the variable installed_locally would be set to 0. |
The Bugzilla developers are planning to provide a formal SCM integration interface in future releases.
As of version 2.22.0, Bugzilla does not yet support a mapping of the SCM username to a Bugzilla username. An SCM to bug-tracking username mapping is accomodated by the integration daemon using the userlist variable, as described in Section 4.2.8.
Bugzilla currently lacks a per-bug comment id. This makes it very difficult to accurately report the comment ids in a VDD for Bugzilla. Currently, the VDD comment ids are prefixed with the string "inaccurate_".
Scmbug has been verified to work against the following releases of Bugzilla:
2.14.2
2.16.5
2.18rc2
2.19.2
2.20.0
2.22.0
Mantis is a web based PHP/MySQL-based bugtracking system.
Mantis does not provide a public interface for SCM integration. However, the Scmbug daemon includes a native Perl-based bug-tracking backend for integration with Mantis. Configuration of the variables installation_directory(Figure 6-1) and installed_locally(Figure 6-2) is not required.
Mantis supports installation with multiple database backends. The daemon configuration variable database_vendor defines the selected database backend, as shown in Figure 6-3.
Figure 6-3. Database vendor variable.
# Valid values are the ones accepted by the Perl DBI. # # For Bugzilla, this value is ignored # # For Mantis, *some* valid values (there are others) are: # - 'mysql' # - 'Pg' database_vendor => 'mysql',
The Mantis developers are planning to provide a formal SCM integration interface in future releases.
As of version 0.19.0, Mantis does not yet support a mapping of the SCM username to a Mantis username. An SCM to bug-tracking username mapping is accomodated by the integration daemon using the userlist variable, as described in Section 4.2.8.
Scmbug has been verified to work against the following releases of Mantis:
0.19.0
1.0.0rc3
Request Tracker is a web based request tracking system written in object-oriented Perl.
Request Tracker provides a public interface for SCM integration. The Scmbug daemon reuses functionality already available in the Perl-based Request Tracker libraries. As a result, the library code used to host a Request Tracker instance must be locally accessible by the daemon. The installation_directory variable is used to define the location of the Request Tracker installation as shown in Figure 6-4.
Figure 6-4. Bug-tracker installation directory for Request Tracker.
# Used for Bugzilla and RequestTracker. # # Path to the directory of the bugtracker sources providing an # API that the daemon can use installation_directory => '/usr/share/request-tracker3.4/lib'
This backend integration with Request Tracker assumes the product names in the glue.conf match the queue names set in the Request Tracker.
The activity_tag integration action is not yet supported.
As of version 3.4.5, Request Tracker does not yet support a mapping of the SCM username to a Request Tracker username. An SCM to bug-tracking username mapping is accomodated by the integration daemon using the userlist variable, as described in Section 4.2.8.
Scmbug has been verified to work against the following releases of Request Tracker:
3.4.5
Additional bug-tracking backends can be supported by Scmbug. Developers and system integrators of the following bug-tracking systems are strongly encouraged to contribute a bug-tracking integration backend:
Developing a backend requires:
Committing to support this backend in future releases of Scmbug.
Creating a new backend module named src/lib/product/Daemon/BackendName.pm.in. The Bugzilla backend src/lib/product/Daemon/Bugzilla.pm.in serves as a good example.
Updating src/lib/product/Daemon/Daemon.pm.in:read_configuration accordingly.
Updating the configuration management files configure.in and Makefile.in to autogenerate, and autocleanup the new backend.
Updating the install-server rule of Makefile.in to install the new backend from source.
Updating the documentation in doc/manual/content to reflect support for the new backend.
The command scmbug_install_glue is used to install the integration glue in an SCM repository. Existing hooks used in the SCM system are not overwritten.
The --binary-paths configuration option should be set to a list of paths that include all binaries needed by the integration tools and the SCM system. This includes the tools diff, xsltproc, docbook2pdf, docbook2html and the SCM system's binaries. The --bug configuration option should be set to the id of a bug in the bug-tracker against which the integration glue installation will be documented.
An example installing the glue in a Subversion repository under UNIX is shown in Figure 7-1.
Figure 7-1. Glue Installation in a Subversion repository under UNIX.
$ scmbug_install_glue --scm=Subversion --product=TestProduct \
--repository=/tmp/testrepository --bug=770 --binary-paths=/bin,/usr/bin \
--daemon=127.0.0.1
This is the installation script of the Scmbug glue.
The glue will be installed in repository: /tmp/testrepository.
This is a repository for the Subversion SCM tool.
The product name in the bug tracking system is TestProduct.
The integration glue will be committed against bug 770.
The IP address of the Scmbug integration daemon to contact is 127.0.0.1.
The binary paths used are: /bin,/usr/bin
-------------
Press Enter to continue or Ctrl-C to cancel
Glue processing has been prepared in /tmp/Scmbug.30670
Installing part1
Check everything there before I commit or hit Ctrl-C to exit
Glue processing has been prepared in /tmp/Scmbug.30670
Installing part2
Check everything there before I commit or hit Ctrl-C to exit
![]() | Under Windows, the paths supplied to the installer should have directories separated with a forward (/) slash. Figure 7-2 shows an example running the installer under Windows. |
Integration glue can be installed in both local and remote CVS repositories.
After installation, the file <CVS_REPOSITORY_PATH>/CVSROOT/etc/scmbug/glue.conf holds the configuration of the glue.
![]() | CVSNT uses the two variables Name and Root when configuring a repository, instead of only the CVSROOT variable. When hooks execute, CVSNT sets CVSROOT to be equal to Name. By default, CVSNT sets Name omitting the drive letter. The hooks will not execute if Name is not set to the full path of the repository since $CVSROOT will be referring to a path that does not exist. An example invalid Name/Root configuration is shown in Figure 7-3. An example valid Name/Root configuration is shown in Figure 7-4. Setting Name to be equal to Root produces the warning shown in Figure 7-5. The compatibility problems seem to refer to some clients simply not parsing a CVSROOT with a drive letter in it. If your development environment includes UNIX clients, and problems do occur, one alternative is to let Name lack a drive letter and manually edit the hook files to include the full repository path. |
Subversion repositories do not support installation of the integration glue remotely. Local repository access is required.
After installation, the file <SVN_REPOSITORY_PATH>/hooks/etc/scmbug/glue.conf holds the configuration of the glue.
Subversion does not distinguish between commit activities and creation of tags or branches. It recommends that the user manually creates top-level directories named /trunk, /tags and /branches. When it's time to create a tag or branch, Subversion proposes following the convention of creating a copy of the main trunk using 'svn copy' in the /tags or /branches directories. As a result, the glue must manually detect if an activity_verify issued by Subversion also implies an activity_tag. To do so, it checks for addition of new subdirectories in the directories /tags or /branches. This behavior is defined in the glue configuration file using the label_directories variable, as shown in Figure 7-6.
Since SCM changes are integrated with bug-tracking, it is possible to produce a list of changes that occured for a particular version of a software at a level that's higher than source changes.
ChangeLog information derived strictly from the SCM system, such as a report produced using the cvs2cl tool for CVS or using 'svn log' in Subversion, is overly detailed. It describes software changesets at a lower level, which interests mostly developers. It is of little value to a user simply interested in a summary of added features. Moreover, when multiple changesets are committed in response to a defect, such a document becomes lengthy. It takes considerable time to follow the history of changes and decipher if, or how, a defect was corrected.
Instead, a VDD reports at a higher level a summary of the features/defects worked on and why, using information recorded in the bug-tracking system. It provides additional useful information such as resolution status, bug owner, severity, and priority. It also reports what changes occured at a lower level in the SCM system per bug, effectively superseding ChangeLog documents produced strictly from the SCM system. Without integration of SCM with bug-tracking, this level of detail in a release document would not be possible.
Given two SCM label names (tag or branch names), this tool
queries the SCM system for the dates the labels were applied. It
then queries the bug-tracking system to produce a report of the
bugs worked between that date range. A VDD can additionally
reflect decisions of the development team which are not
documented in the SCM logs, such as choosing to not add a
feature, resolving it as WONTFIX. It may also
display bugs that were added in the period between releases but
not worked yet, alerting users of newly discovered defects.
A VDD can be generated using the command scmbug_vdd_generator. An example producing this document is shown in Figure 7-7.
Figure 7-7. Generating a Version Description Document.
$ scmbug_vdd_generator --scm=Subversion --product=TestProduct \
--repository=/tmp/testrepository --from=SCMBUG_RELEASE_0-8-1 \
--to=SCMBUG_RELEASE_0-8-2
The output of this tool is a collection of files. An XML file is produced that contains the result of the VDD query. This file is also transformed using XSLT into a Docbook 4.2 SGML file. Finally, this SGML file is processed using Docbook tools to produce PDF and HTML output.
Scmbug is available for UNIX and Windows systems. It is expected to work with Perl version 5.6.1 or later and has been confirmed to work with Perl version 5.8.4. Dependencies on additional programs are described in Section 8.2.
The project's webpage contains the most up to date information on the project, including the latest release and manual. A users mailing list is available for subscription, or simply for sending email. The project's bug-tracking system contains the latest TODO list. Source code access to developers is available using anonymous CVS as shown in Figure 8-1 or through ViewCVS.
Under UNIX, Scmbug is available in the form of Debian and RPM packages. The provided packages are:
scmbug-common: common libraries.
scmbug-doc: documentation.
scmbug-tools: tools that can install the integration glue in an SCM repository and enhance the experience of integrating SCM with bug-tracking.
scmbug-server: the integration daemon.
Under Windows, the entire Scmbug system is available in the form of a single .zip file. It must be manually installed in C:/Program Files/Scmbug. It requires ActiveState ActivePerl installed in C:/Perl/bin/perl, and a temporary directory called C:/Temp.
Source code distributions are also available. Figure 8-2 shows how the system can be configured and installed from source. It is possible to choose a different destination of the libraries and binaries of Scmbug both in UNIX and Windows systems at configuration time. If you are configuring from source code, running './configure --help' can provide more information.
Figure 8-2. Installation of the system from source.
bash$ ./configure
bash$ make
bash$ su
bash# make install-common
bash# make install-doc
bash# make install-tools
bash# make install-server
![]() | Installing all these packages will NOT automatically integrate an SCM repository with a bug-tracking system. It will only install the basic software needed to do so. A user must configure the Integration Daemon and start it as shown in Figure 8-3. Then, a user must run the Glue Installer to install the Scmbug integration in an SCM repository. |
![]() | When specifying paths in Windows, either in the glue installer, the glue configuration file, or the integration daemon, paths should have directories separated with a forward (/) slash. |
![]() | There are various dependencies on the packages provided. Both dependencies on other packages, and on Perl modules. If they are ignored, the Integration Daemon and the Integration Tools will detect the missing dependency and refuse to execute. |
Installation of documentation, including this manual, requires installing the package scmbug-doc.
Installation of the Integration Tools requires installing the packages scmbug-common and scmbug-tools. It also requires a diffing tool. For Windows, one such binary (diff.exe) is available in the GNU utilities for Win32.
Running the VDD Generator additionally requires installing the xsltproc, and docbook-utils packages. It is uncertain where one could get these packages for Windows. An xsltproc distribution for Windows seems to be available from Igor Zlatkovic's website, but we have yet to locate a docbook-utils package for Windows.
Installation of the daemon requires installing the packages scmbug-common and scmbug-server. Additionally, it requires installing the Perl modules Mail::Sendmail (for policy Mail on success) and XML::Simple (for an activity_get_vdd issued by the VDD Generator), as shown in Figure 8-4. If an SCM to bug-tracking username mapping is configured based on variable mapping_ldap, as described in Section 4.2.8, the Perl module Net::LDAP must also be installed.
Figure 8-4. Mail::Sendmail, XML::Simple installation.
Installation in UNIX systems:
bash$ su
bash# perl -MCPAN -e "install Mail::Sendmail"
bash# perl -MCPAN -e "install XML::Simple"
Installation in Windows systems:
C:\> ppm
PPM - Programmer's Package Manager version 3.1.
Copyright (c) 2001 ActiveState Corp. All Rights Reserved.
ActiveState is a devision of Sophos.
Entering interactive shell. Using Term::ReadLine::Stub as readline library.
Type 'help' to get started.
ppm> install Mail-Sendmail
ppm> install XML-Simple
The file /etc/scmbug/daemon.conf holds the configuration of the daemon.
Integration with multiple bug-tracking systems can be accomplished by starting multiple daemons listening at different ports.
For reasons explained in Section 6.1, the integration daemon requires local presence of the source code used to run a Bugzilla instance. It also requires access to the database used to store Bugzilla's data. It is recommended that the daemon is installed on the same machine Bugzilla runs, but this is not required. If the daemon is installed on the same machine Bugzilla runs, Scmbug will force the Bugzilla version cache (which is a local file) to be regenerated when activity_tag integration requests are processed.
Integration with Mantis requires access to the database used to store Mantis' data. At a minimum, it requires installing the DBI Perl module, as shown in Figure 8-5.
Figure 8-5. DBI installation.
Installation in UNIX systems:
bash$ su
bash# perl -MCPAN -e "install DBI"
Installation in Windows systems:
C:\> ppm
PPM - Programmer's Package Manager version 3.1.
Copyright (c) 2001 ActiveState Corp. All Rights Reserved.
ActiveState is a devision of Sophos.
Entering interactive shell. Using Term::ReadLine::Stub as readline library.
Type 'help' to get started.
ppm> install DBI
Figure 8-6. DBD::mysql installation.
Installation in UNIX systems:
bash$ su
bash# perl -MCPAN -e "install DBD::mysql"
Installation in Windows systems:
C:\> ppm
PPM - Programmer's Package Manager version 3.1.
Copyright (c) 2001 ActiveState Corp. All Rights Reserved.
ActiveState is a devision of Sophos.
Entering interactive shell. Using Term::ReadLine::Stub as readline library.
Type 'help' to get started.
ppm> install DBD-mysql
For reasons explained in Section 6.3, the integration daemon requires local presence of the source code used to run a RequestTracker instance. It has not yet been investigated if it also requires local access to the database used to store RequestTracker's data.
Upgrading to newer versions of Scmbug is possible. It first requires understanding the issues involved in running non-matching versions of the Glue and Daemon.
The communication protocol between the Glue and the Daemon is upgraded and is backwards-incompatible when the minor version number of Scmbug increases. For example, SCMBUG_RELEASE_0-1-x and SCMBUG_RELEASE_0-2-x are not compatible, but SCMBUG_RELEASE_0-2-1 and SCMBUG_RELEASE_0-2-8 are.
![]() | During SCM events activity, if the Glue detects an incompatible version of the Daemon, it will refuse to continue. |
![]() | Running incompatible versions of the Glue and Daemon can result in developers being locked out of an SCM repository. For example, when using CVS it could result in the integration failing to commit any changes, leading into a dead-end. This would prohibit disabling the Glue in its entirety, and require manually editing the repository locally using RCS commands. Certainly, an SCM repository can always be brought back to a working state by a competent administrator. |
Since version SCMBUG_RELEASE_0-3-3, the Glue Installer is able to safely upgrade the integration to newer versions. It first completely disables all SCM hooks installed by Scmbug, upgrades the Glue code, and then enables the hooks. During the last step, the Daemon does not need to be contacted, since the hooks are not yet active.
![]() | If you understand the implementation internals of Scmbug you will be able to determine whether a new feature is implemented in the Glue or the Daemon, and upgrade only the Glue or only the Daemon. One example where you might not want to upgrade both the Glue and Daemon is if you have a lot of SCM repositories and you need a new feature that has been implemented only on the Daemon. Upgrading only the daemon is a lot easier than first upgrading all repositories. Another example would be upgrading only the Glue of a single SCM repository if you need a new Scmbug feature only in that repository. |
![]() | If in doubt, upgrade everything. |
Upgrading to a newer version of Scmbug requires first upgrading the Glue and then the Daemon, by carrying out in order the following steps.
Upgrading Scmbug: Install newer versions of the packages scmbug-common, scmbug-doc, and scmbug-tools, as shown in Section 8.2.1.
![]() | If one of the SCM repositories that will be upgraded is hosted by Subversion, then these packages must also be installed on the machine hosting the Subversion repository. As explained in Section 7.1.2, local repository access will be required in the next step to upgrade the integration glue. |
Upgrading all SCM repositories: Run the Glue Installer once per SCM repository with respective arguments to upgrade to a newer version of the Glue, as described in Section 7.1.
![]() | The Glue Installer will display changes between the existing and updated glue configuration file in diff format. Manually merge-in any updates to the glue configuration file as needed. Failure to do so could result in the Glue failing to work. |
Upgrading the Integration Daemon: After all SCM repositories have been upgraded, upgrade the Integration Daemon by installing a newer version of the packages scmbug-common and scmbug-server, as shown in Section 8.2.4.
![]() | Ommiting to upgrade an SCM repository before upgrading the Daemon could result in developers being locked out of the repository. Should that happen, it's possible to downgrade to the previous version of the Daemon, upgrade the repository as described in Section 8.3.2.1, and upgrade the Daemon again. During this process, all other upgraded SCM repositories will be unable to accept activity, since the Glue will detect an incompatible Daemon and refuse to continue. |
Version 1.1, March 2000
Copyright (C) 2000 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
The purpose of this License is to make a manual, textbook, or other written document "free" in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or non-commercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others.
This License is a kind of "copyleft", which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software.
We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference.
This License applies to any manual or other work that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. The "Document", below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as "you".
A "Modified Version" of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language.
A "Secondary Section" is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document's overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (For example, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them.
The "Invariant Sections" are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License.
The "Cover Texts" are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License.
A "Transparent" copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, whose contents can be viewed and edited directly and straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup has been designed to thwart or discourage subsequent modification by readers is not Transparent. A copy that is not "Transparent" is called "Opaque".
Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML designed for human modification. Opaque formats include PostScript, PDF, proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML produced by some word processors for output purposes only.
The "Title Page" means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, "Title Page" means the text near the most prominent appearance of the work's title, preceding the beginning of the body of the text.
You may copy and distribute the Document in any medium, either commercially or non-commercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3.
You may also lend copies, under the same conditions stated above, and you may publicly display copies.
If you publish printed copies of the Document numbering more than 100, and the Document's license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects.
If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages.
If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a publicly-accessible computer-network location containing a complete Transparent copy of the Document, free of added material, which the general network-using public has access to download anonymously at no charge using public-standard network protocols. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public.
It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document.
You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version:
Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission.
List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has less than five).
State on the Title page the name of the publisher of the Modified Version, as the publisher.
Preserve all the copyright notices of the Document.
Add an appropriate copyright notice for your modifications adjacent to the other copyright notices.
Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below.
Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document's license notice.
Include an unaltered copy of this License.
Preserve the section entitled "History", and its title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section entitled "History" in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence.
Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the "History" section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission.
In any section entitled "Acknowledgments" or "Dedications", preserve the section's title, and preserve in the section all the substance and tone of each of the contributor acknowledgments and/or dedications given therein.
Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles.
Delete any section entitled "Endorsements". Such a section may not be included in the Modified Version.
Do not retitle any existing section as "Endorsements" or to conflict in title with any Invariant Section.
If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version's license notice. These titles must be distinct from any other section titles.
You may add a section entitled "Endorsements", provided it contains nothing but endorsements of your Modified Version by various parties--for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard.
You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one.
The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version.
You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice.
The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work.
In the combination, you must combine any sections entitled "History" in the various original documents, forming one section entitled "History"; likewise combine any sections entitled "Acknowledgments", and any sections entitled "Dedications". You must delete all sections entitled "Endorsements."
You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects.
You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document.
A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, does not as a whole count as a Modified Version of the Document, provided no compilation copyright is claimed for the compilation. Such a compilation is called an "aggregate", and this License does not apply to the other self-contained works thus compiled with the Document, on account of their being thus compiled, if they are not themselves derivative works of the Document.
If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one quarter of the entire aggregate, the Document's Cover Texts may be placed on covers that surround only the Document within the aggregate. Otherwise they must appear on covers around the whole aggregate.
Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License provided that you also include the original English version of this License. In case of a disagreement between the translation and the original English version of this License, the original English version will prevail.
You may not copy, modify, sublicense, or distribute the Document except as expressly provided for under this License. Any other attempt to copy, modify, sublicense or distribute the Document is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
The Free Software Foundation may publish new, revised versions of the GNU Free Documentation License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. See http://www.gnu.org/copyleft/.
Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License "or any later version" applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation.
To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page:
Copyright (c) YEAR YOUR NAME. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation; with the Invariant Sections being LIST THEIR TITLES, with the Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. A copy of the license is included in the section entitled "GNU Free Documentation License".
If you have no Invariant Sections, write "with no Invariant Sections" instead of saying which ones are invariant. If you have no Front-Cover Texts, write "no Front-Cover Texts" instead of "Front-Cover Texts being LIST"; lik