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

= DevFaqAccessSourcesUsingMercurial
:jbake-type: wiki
:jbake-tags: wiki, devfaq, needsreview
:jbake-status: published
:keywords: Apache NetBeans wiki DevFaqAccessSourcesUsingMercurial
:description: Apache NetBeans wiki DevFaqAccessSourcesUsingMercurial
:toc: left
:toc-title:
:syntax: true

=== How do I get access to NetBeans sources using Mercurial (hg)?

First, make sure you have link:http://www.selenic.com/mercurial/[Mercurial] installed on your machine, along with its requirements such as Python.

Then, from the command line, you run

[source,java]
----

hg clone http://hg.netbeans.org/main/
cd main
----

to get the full Platform and IDE sources.  If you also want the `contrib/` modules:

[source,java]
----

hg clone http://hg.netbeans.org/main/contrib/
----

To build, simply run `ant`.
The build will appear in `nbbuild/netbeans/`.

link:HgHowTos.asciidoc[More info about using Mercurial with NetBeans sources...]

=== Apache Migration Information

The content in this page was kindly donated by Oracle Corp. to the
Apache Software Foundation.

This page was exported from link:http://wiki.netbeans.org/DevFaqAccessSourcesUsingMercurial[http://wiki.netbeans.org/DevFaqAccessSourcesUsingMercurial] , 
that was last modified by NetBeans user Jglick 
on 2009-11-12T22:37:30Z.


*NOTE:* This document was automatically converted to the AsciiDoc format on 2018-02-07, and needs to be reviewed.
