////
   Licensed to the Apache Software Foundation (ASF) under one
   or more contributor license agreements.  See the NOTICE file
   distributed with this work for additional information
   regarding copyright ownership.  The ASF licenses this file
   to you under the Apache License, Version 2.0 (the
   "License"); you may not use this file except in compliance
   with the License.  You may obtain a copy of the License at

     https://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing,
   software distributed under the License is distributed on an
   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
   KIND, either express or implied.  See the License for the
   specific language governing permissions and limitations
   under the License.
////

*Tag:* info *Parent:* link:../ivyfile{outfilesuffix}[ivy-module]

Gives identification and basic information about the module this Ivy file describes.

(*__since 1.4__*) This tag supports link:../concept{outfilesuffix}#extra[extra attributes].

== Attributes

[options="header",cols="15%,50%,35%"]
|=======
|Attribute|Description|Required
|organisation|the name of the organisation that is the owner of this module.|Yes
|module|the name of the module described by this Ivy file.|Yes
|branch|the branch of this module. (*__since 1.4__*)|No, defaults to the default branch setting, or nothing if no default branch is configured
|revision|the revision of this module.|Yes in repository Ivy files, no in Ivy files to resolve
|status|the status of this module. See link:../reference{outfilesuffix}[terminology] section for details|No, default to `integration`
|publication|the date of publication of this module. It should be given in this format: `yyyyMMddHHmmss`|No, but it's a good practice to set it with delivered Ivy files
|=======

== Child elements

[options="header",cols="20%,60%,20%"]
|=======
|Element|Description|Cardinality
|link:../ivyfile/extends{outfilesuffix}[extends]|identifies a parent Ivy file from which this descriptor inherits content|0..n
|link:../ivyfile/license{outfilesuffix}[license]|contains information about the licenses of the described module|0..n
|link:../ivyfile/ivyauthor{outfilesuffix}[ivyauthor]|describes who has contributed to write the Ivy file|0..n
|link:../ivyfile/repository{outfilesuffix}[repository]|describes in which public repositories this module can be found|0..n
|link:../ivyfile/description{outfilesuffix}[description]|describes how to use the module|0..1
|=======

After the description, you can also place your own tags in your own namespace. This allow to provide some custom information about the module.
