////
     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

       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.
////
= How to become a committer
:jbake-type: page
:jbake-tags: community
:jbake-status: published
:keywords: Apache NetBeans Events
:description: Apache NetBeans Events
:toc: left
:toc-title:


The Committer, Member and PMC Member terms, in particular, have very specific meanings in the Apache Software Foundation
(see also link:https://www.apache.org/foundation/how-it-works.html[how the ASF works]), and need to be used appropriately to avoid confusion:

. Everyone who is listed link:https://wiki.apache.org/incubator/NetBeansProposal[at the Apache NetBeans Proposal] can become an Apache NetBeans committer and PMC member by submitting the required paperwork. 
For those in that list, the final step in becoming a committer is to send your iCLA (link:https://www.apache.org/licenses/icla.pdf[individual contributor license agreement (pdf)]) to Apache. 
Under "preferred Apache id(s)", please put an ID of your choice, which does not already exist (check link:http://people.apache.org/committer-index.html[here].
Please print out the iCLA, complete it and sign it, scan it, and then e-mail the PDF file to link:mailto:secretary@apache.org[secretary@apache.org]. 
Once you have sent in your iCLA, you will receive a notification and your Apache ID. You will then be ready to commit code to Apache NetBeans, once the code has been transferred from Oracle. 
NetBeans PMC members should also join link:mailto:private@netbeans.apache.org[private@netbeans.apache.org] (by sending a 
mail to link:mailto:private-subscribe@netbeans.apache.org[private-subscribe@netbeans.apache.org] which is the PMC's private list. 
Only things that really need to be private are discussed there, such as candidates for committership but not much more than that. 
As usual at the ASF, everything happens in the open unless really really required.

. Other community members can become Apache NetBeans committers (and maybe also PMC members) once the NetBeans PMC elects them to those roles, based on people's merit as usual in Apache projects - you don't ask for committership but add value to the project and expect the PMC to recognize that and vote you in, in due time. See the Process section below.

. Being a NetBeans committer or PMC member does *not* make you an Apache Software Foundation (ASF) Member - that's a different status that's granted by existing Members 
to people who show an interest in and add value to the Foundation as a whole, see link:https://www.apache.org/foundation/how-it-works.html#roles[https://www.apache.org/foundation/how-it-works.html#roles].

== For PMC members: Committer / PMC member election process

The process is similar to other Apache projects, such as link:https://github.com/apache/cordova-new-committer-and-pmc[Apache Cordova]:

. A PMC member starts a *[DISCUSS]* thread on the private@ list explaining why you want to elect someone, based on their merit, activity and involvement of a contributor.
. If there's no opposition, the PMC member starts a *[VOTE]* thread on the private@ mailing list to turn the contributor into a committer and/or a PMC member. Make sure to specify which role you want to elect the people for. (Example text etc to come.)
. After at least 72 hours, tally the vote with a *[VOTE][RESULT]* message. (Example text etc to come.)
. Send the *[NOTICE]* to PMC and wait 72 hours. (Example text etc to come.)
. Send invitation to the committer, to invite them to be a committer. Example invitations: link:https://cwiki.apache.org/confluence/display/FLEX/New+committer+or+PMC+member+invitation[from the FLEX project],
or link:http://apache-wicket.1842946.n4.nabble.com/Re-Invitation-to-become-Wicket-committer-Andrea-del-Bene-td4660253.html[Apache Wicket].
. An account needs to be created for the new committer, if they accept the invitation that was sent.
. Once created, the new user can then be added as a committer at link:https://whimsy.apache.org/roster/committee/netbeans#committers[whimsy.apache.org]
. Then add the PMC member at link:https://whimsy.apache.org/roster/committee/netbeans[whimsy.apache.org] and optionally announce on the dev list (Example text to come).

