//Licensed 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
//
//http://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.
= Guide to Retirement
Apache Incubator PMC
2002-10-16
:jbake-type: guide
:jbake-status: published
:idprefix:
:toc:
:imagesdir: ../images/

The intent of this document is to help Mentors and other
community members understand retirement, both as a
concept and a process.

== What is Retirement?

A retired podling is one which has been closed down on the
initiative of the PPMC or the IPMC for various reasons.  It is
no longer developed at the Apache Incubator and does not have
any other duties.

It's important to view this process as being the retirement of
the podling community, not the code. It should not be implied
that the code is not for use - just that it has no community.
So long as the Incubator's copyright requirements are
fulfilled by the podling prior to retirement, its source code
will continue to be made available through version control.

Retiring a podling is analogous to moving a top-level Apache
project to the link:http://attic.apache.org[Attic],
but podlings receive a lower level of ongoing support -- for
example, podling websites are deleted outright rather than
munged to indicate retired status.

== Deciding to retire

In the vast majority of cases, a podling decides to retire on
its own and that decision is later formally ratified by the
Incubator PMC; very rarely, the IPMC may act unilaterally.
(This is deliberate mimicry of Board oversight of TLPs --
the language and role titles change but in general the Board
and the IMPC merely implement the wishes of the community.)

Before the IPMC gets involved, a public discussion and
community vote SHOULD be held on the podling's dev list.  This
ensures that all podling stakeholders are properly informed and
have the opportunity to participate in the decision.

The final decision to retire the podling takes the form of a
vote by the IPMC on general@incubator. The vote should be by LAZY consensus.

== Steps to retirement

Once the IPMC vote to retire the podling has closed, a Mentor or other volunteer needs to perform the following steps.

- Update #content/podlings.xml#:
** Update podling status to "retired".
** Add an "enddate" attribute set to the date that the IPMC vote concluded.
** Remove the "reporting" element.
** Add the "resolution" element. (Follow the example of other recently retired podlings.)
- Update the podling's status page with a prominent message indicating when the podling retired: &lt;p&gt;&lt;span class="retired"&gt;The ${podling} podling retired on XXXX-XX-XX&lt;/span&gt;&lt;/p&gt;.
- Has the copyright checkbox of the podling's incubation
status page been checked off? If not, try to resolve it.
If it cannot be resolved, the podling's source code must
be removed from version control.
- It may be that the podling is moving or returning development elsewhere. If so, then modify the resolution attributes appropriately.
- Delete the podling's dist dir, so that its releases will no
longer be mirrored:
#svn remove https://dist.apache.org/repos/dist/release/incubator/${podling}#
Any incubating releases will still be available via
link:http://archive.apache.org/dist/incubator[archive.apache.org/dist/incubator].
- Create a file RETIRED.txt at the top-level of each podling
source repository.  This should contain something like the following:
** This podling has been retired, please see: http://incubator.apache.org/projects/index.html##{podling-name}
- If the podling has a DOAP referenced in the link:https://svn.apache.org/repos/asf/comdev/projects.apache.org/data/projects.xml[projects.xml] file used for generating link:http://projects.apache.org[projects.apache.org], remove the entry.
- Open a "task" INFRA JIRA ticket entitled "Retire the ${podling} Incubator podling".  Open sub-tickets using "Create Sub-Task" as applicable:
** Close ${podling} mailing lists
** Make ${podling} version control read-only
** Move ${podling} JIRA to "retired" and set read-only
** Make ${podling} wiki read-only
** Turn off ${podling} automatic builds
** Update ${podling} Incubator SVN
*** Add entries to asf-mailer.conf and send mail to cvs at incubator.apache.org
*** Remove entries from asf-authorization - this makes the directory rw to the Incubator PMC.
- After Infra modifies the website SVN permissions, disable
the podling website by installing an `.htaccess` like this
----
RedirectMatch Permanent ^(/.*)?$ http://incubator.apache.org/projects/{podling}.html
----
file at the root of the podling website dir which consists
of only a redirect to the podling status page.
- When all steps towards retirement are done, announce completeness on general@incubator.
- Indicate that the podling is closed down in the next board report.

The user accounts of the projects committers do not need
to be removed.
