# version-matchers

Tag: version-matchers

[since 1.4]

Defines a list of version matchers.

The child tag used for the version matcher must be equal to a name of a report outputter type (added with the `typedef` tag).

A version matcher is used to evaluate if a dependency version constraint matches a dependency version.

## Attributes

Attribute | Description | Required
--- | --- | ---
usedefaults | when set to true, includes the built-in version matchers (Latest, Sub Revision, and Version Ranger Matcher). Exact Revision Matcher is always included | No, defaults to false

## Child elements

Element | Description | Cardinality
--- | --- | ---
any version matcher | adds a version matcher to the list of available ones | 0..n

## Built-in Version Matchers

### Exact Revision Matcher

A matcher that matches a dependency revision id to the module revision id using simple string equality.

### Sub Revision Matcher

A matcher that matches all revisions starting with a specific prefix. The syntax is: `[prefix]+`

Revision | Matches
--- | ---
1.0.+ | all revisions starting with '1.0.', like 1.0.1, 1.0.5, 1.0.a
1.1+ | all revisions starting with '1.1', like 1.1, 1.1.5, but also 1.10, 1.11

### Latest (Status) Matcher

A matcher that matches versions based on their status. The predefined statuses in Ivy are `release`, `milestone` and `integration`. It’s possible to define your own statuses, see statuses for more details.

Revision | Matches
--- | ---
latest.integration | all versions
latest.milestone | all modules having at least 'milestone' as status
latest.release | all modules having at least 'release' as status
latest.[any status] | all modules having at least the specified status

### Version Range Matcher

Range types are exhaustively listed by example in the table below.

Revision | Matches
--- | ---
[1.0,2.0] | all versions greater or equal to 1.0 and lower or equal to 2.0
[1.0,2.0[ | all versions greater or equal to 1.0 and lower than 2.0
]1.0,2.0] | all versions greater than 1.0 and lower or equal to 2.0
]1.0,2.0[ | all versions greater than 1.0 and lower than 2.0
[1.0,) | all versions greater or equal to 1.0
]1.0,) | all versions greater than 1.0
(,2.0] | all versions lower or equal to 2.0
(,2.0[ | all versions lower than 2.0

### Version Pattern Matcher

The version pattern matcher allows for more flexibility in pattern matching at the cost of adding a matcher declaration in Ivy settings. A simple example is given below.

#### Settings.xml

    <pattern-vm>
      <match revision="foo" pattern="${major}\.${minor}\.\d+" args="major, minor" matcher="regexp"/>
    </pattern-vm>

#### Ivy.xml

    <dependency org="acme" name="tool" rev="foo(1, 3)"/>

The version pattern matcher may contain more than one match element. The matcher will attempt to match a dependency revision against each match in sequence, checking the revision tag (e.g. foo(..)) and then the pattern. Matcher types may be one of "regexp", "exact", "glob", or "exactOrRegexp". Glob pattern matching requires Apache ORO 2.0.8 or higher to be on the classpath.

### Maven timestamped snapshot version matcher

[since 2.5]

Maven has the notion of timestamped snapshots, which essentially are snapshot versions of a particular Maven artifact, but have a specific timestamp associated with them so that the snapshot revision (which by nature are changing over time), can be traced back to the exact artifacts. Maven allows other artifacts to depend on such timestamped snapshots.

Ivy too allows such timestamped dependencies to be part of the module’s dependencies. For such dependencies to be properly parsed and resolved, a `maven-tsnap-vm` version matcher needs to be configured in the Ivy settings and ibiblio resolver must be one of the resolvers that are used for dependency resolution.

Note | Maven has a specific syntax for timestamped snapshot versions and only such versions are understood by Ivy.

Configuring the `maven-tsnap-vm` can be done as follows in the Ivy settings file:

    <ivysettings>
        <version-matchers ...>
            <maven-tsnap-vm/>
        </version-matchers>
        ...

An example timestamped snapshot dependency in an Ivy module would look like:

    <ivy-module version="2.4">
        <info organisation="org.apache.ivy"
              module="maven-snapshot-deps-test"
              revision="1.2.3"/>
        <dependencies>

            <dependency org="org.apache.ivy.maven-snapshot-test" name="foo-bar" rev="5.6.7-20170911.130943-1"/>
        </dependencies>
    </ivy-module>

Notice the `5.6.7-20170911.130943-1` revision on the `foo-bar` dependency - that represents a timestamped snapshot. For this Ivy module to be resolved correctly, the Ivy settings file should be both backed by the `maven-tsnap-vm` version matcher and a `m2compatible` `ibiblio` resolver, so the settings file would typically look like:

    <ivysettings>
        <settings defaultResolver="m2"/>
        <caches defaultCacheDir="${user.home}/.ivy/cache/"/>
        <version-matchers usedefaults="true">
            <maven-tsnap-vm/>
        </version-matchers>

        <resolvers>
            <ibiblio name="m2" m2compatible="true" useMavenMetadata="true" root="file://${user.home}/.m2"/>
        </resolvers>

    </ivysettings>