//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.
= Podling Source Control
Apache Incubator PMC
2002-10-16
:jbake-type: guide
:jbake-status: published
:idprefix:
:toc:
:imagesdir: ../images/

== Set up a Podling Source Repository

The most important responsibility for mentors is to set up the
podling source repository. Podlings can choose between Subversion and
Git for source control.  For Git, podlings may use repositories hosted at Apache, or within GitHub in the Apache organization.

=== Set up a Git Repository

Request a new git repository via link:https://selfserve.apache.org/[selfserve.apache.org].
This service will initialize a new repository, set up github mirrors and enable integrations for that repository.

Historically, the Foundation's policy
is to grant access to git repositories broadly to the incubator group,
not narrowly podling-by-podling. So, once the repository
exists, incubator group members gain access without further work. Once
the podling graduates, a dedicated ldap group will be created to manage
access and only those members will have access.

=== Set up an SVN Repository

If the podling chooses SVN, you must create the
repository and give read/write access to the repository
to all the committers for the podling. This involves requesting
new committer accounts and granting access to mentors and existing
Apache committers.

Setting up a podling subversion repository has two steps: Creating the SVN space
and configuring the authorization (in both SVN and Git).

Create the workspace in SVN. This requires commit access to the
incubator SVN repository. Each podling has its own subdirectory
of the incubator SVN repository. To create the podling subdirectory,
the mentor executes the SVN command to create a remote directory: `svn mkdir https://svn.apache.org/repos/asf/incubator/{podling}`.

Raise an INFRA Jira ticket to get the SVN auth file updated.

This is a convenient time to add link:#Authorize+Committers[authorization] for committers
who have accounts.

link:#who-auth-karma[Authorization] karma is restricted. If no Mentor
has this karma, post an email to IPMC private list requesting it.

== Authorize Committers

The process to add committers to the podling depends on whether
the new committer is already an Apache committer and whether
the new committer is in the list of original committers:

- The committer is in the list of original committers in the
podling proposal to the incubator and is not already an Apache
committer:
** Ask developers to send their ICLAs to `secretary@apache.org` according to
link:http://apache.org/licenses/#submitting[standard procedure].
Note that you must sign ICLA forms, either by hand or by digital signature.
** Developers should choose an Apache ID that is not already listed
link:http://people.apache.org/committer-index.html[here].
** Developers should enter their preferred Apache ID on the ICLA
and enter the podling name in the "notify" field of the ICLA.
- If the committer is in the list of original committers in the
podling proposal to the incubator and is already an Apache committer, only
link:#who-auth-karma[incubator authorization] is required.
- The committer was voted by the PPMC and approved by the incubator PMC:

Perform one of the above procedures depending on whether the
committer is already an Apache committer on another project.

== Incubator Access Authorization

Special karma is required to authorize incubator access for committers.
This karma is limited to:

- IPMC Members
- Secretary
- Infrastructure

IPMC Members should use link:https://whimsy.apache.org/roster/committee/incubator[Whimsy's Roster Tool] to add existing commiters.
