ROS Index Design
ROS Index was developed to address the limitations of the ROS Wiki. The biggest issue plaguing the Wiki is the lack of synchronization between documentation and changing interfaces. Originally, a wiki system suited the ROS community well, since most ROS code was contained in centralized SVN repositories. In order to contribute documentation, a user could do so on the wiki, without needing access to the code. Since ROS was first released, however, most code has migrated to distributed version control systems which make it much easier for users to contribute back via pull or merge requests. ROS Index focuses on presenting documentation which is coupled to version-controlled code and on making this documentation aggregated in one place.
Contents
Index Organization
ROS Index organizes ROS source code in two ways:
- By repository
- By package
Repository Organization
Each repository identifier corresponds to a set of repository instances
.
Repository instances are different versions
of a repository with the same name but different URIs. This enables ROS Index
to index forks of known repositories. Within each instance, branches and tags
correspond to different ROS distributions. So versions of repositories can be
organized hierarchically like so:
- repository identifier (i.e.
geometry
) - repository instance (i.e.
github-ros-geometry
) - ROS distribution (branch/tag, i.e.
kinetic
)
This gives rise to urls like:
index.ros.org/r/<<REPOSITORY>>/<<INSTANCE>>/#<<DISTRO>>
So for the geometry
repository, the default instance would be resolved by:
index.ros.org/r/geometry
In this case, this would be equivalent to:
index.ros.org/r/geometry/github-ros-geometry
This link would resolve to the repository corresponding to the URI given in the latest rosdistro index. Then the user could switch between distros of that repository with the distro selector buttons.
Note that the repository for a repository identifier can change between distributions. In this case, it is expected that older versions of the sources are tagged in the latest version of the repository.
Package Organization
Often, however, users are interested in looking up ROS code by package name. In this case, it’s more subtle. Between ROS distributions, a package can migrate from one repository to another. As such, a hierarchical organization like that used for repositories doesn’t fit as well. It could have the effect of obscuring versions of code for a newer or older distribution because it changed repositories.
Most importantly, people want to see the documentation for official packages. As such, it makes sense that when browsing packages, the default instances for a distribution are organized like so:
- package name (i.e.
tf
) - repository instance (i.e.
github-ros-geometry
) - ROS distribution (branch/tag) (i.e.
melodic
)
This gives rise to urls like:
index.ros.org/p/<<PACKAGE>>/<<INSTANCE>>/#<<DISTRO>>
So for the tf
package, the default instance would be resolved by:
index.ros.org/p/tf
In this case, this would be equivalent to:
index.ros.org/p/tf/github-ros-geometry
When viewing the tab for a given ROS distribution, the user can see additional metadata about the package, as well as in which repository that package is located.
Finding Sources
Official Index
The ROS Index site generator reads rosdistro
files like the ones
here to get lists of released
and unreleased ROS repositories. For all repositories with source links, it
adds them to a known repositories index.
Files are read from two places in rosdistro
:
rosdistro/<<DISTRO>>/distribution.yaml
rosdistro/doc/<<DISTRO>>/*.rosinstall
ROS packages are uniquely located in rosdistro
by a distribution (kinetic,
melodic, bouncy) and a repository identifier. In a given distribution, package
names are unique.
Forks
Unfortunately, the rosdistro standard, as defined in REP-141, does not accomodate the indexing of forks. Until the standard is extended to do so, ROS Index will support the indexing of this additional information.
Forks are described in the YAML-formatted markdown files in the _repos
directory which correspond to the repository names in rosdistro. Each
repository fork should be given an identifying name for easy reference on the
rosindex website.
instances:
- uri: 'https://github.com/jbohren/conman.git'
type: git
default: true
purpose: 'original'
distros:
hydro: { default: true, version: 'master' }
- uri: 'https://github.com/RCPRG-ros-pkg/conman.git'
type: git
purpose: 'experimentation'
distros:
hydro: { version: 'master' }
Scraping Process
After creating an index of version control repositories containing ROS code,
all of these repositories are cloned to the local system. Only Git, Mercurial,
and SVN repositories are supported. For SVN repositories, the git-svn
module
is used to manage the local checkout.
Checking out all known (and available) ROS code uses several gigabytes of disk space. These clones of remote repositories persist, and are simply updated the next time the index is built.
Each of these repositories is then scraped for information relevant to documentation and analysis. See the following section for details on what information is collected.
The information collected is then written to disk as a Ruby marshalled data structure which can be re-loaded to rapidly experiment with data presentation. For details on controlling which parts of the build process are run, see Development.
Information Collected by ROS Index
Repository Information
- Repository URI
- Release status
- Last commit date
Package Information
- All information contained in the package manifest as described by REP-127 and REP-140.
- Last commit date
Package Contents
- ROS Launch files
- ROS Message files
- ROS Service files
ROS Index Metadata
See ROS Index Metadata for more details.