Subversion Submitted to Become a Project at The Apache Software Foundation

Award-Winning Open Source Version Control and Software Configuration Management Tool to Benefit from Stewardship, Technology, and Community Synergies

OAKLAND, Calif., APACHECON US 2009, Nov. 4, 2009 — The CollabNet-sponsored Subversion project and The Apache Software Foundation (ASF) announced today that the award-winning Open Source project has formally submitted itself to the Apache Incubator in order to become part of the Foundation's efforts.

The incubation of Subversion is the first step to becoming an ASF Top-Level Project. The Subversion community will join more than 130 Open Source initiatives overseen by the ASF, and will benefit from the Foundation’s widely-emulated meritocratic process, stewardship, outreach, support, and community events.

The Subversion project and Apache Software Foundation have a long and intertwined history: many of the same people founded and continue to actively contribute to both organizations. The communities also work closely together, often utilizing capabilities of their respective products: all of the ASF's projects use Subversion for source code version control, and Subversion itself relies on many Apache projects such as Apache Portable Runtime (APR) and HTTP Web Server. For nearly a decade, the communities have benefited from open feedback channels, where requirements from the Subversion project have helped drive new features to various Apache projects, and vice versa.

"We are happy to welcome the Subversion development community to the Apache Incubator," said Justin Erenkrantz, President of The Apache Software Foundation. "Since its inception, the Subversion community has modeled itself using many of the Foundation's principles, including the Apache license, our voting structure, and building upon a diverse range of contributors. Through organizational, legal, financial, and infrastructure support, the ASF's proven framework will help the Subversion community to do what it does best: provide valuable software to millions of developers around the globe. It's a natural fit."

While Subversion is undergoing incubation at the ASF, CollabNet will continue to host the project at http://subversion.tigris.org. In addition, third party-certified binaries of the software configuration management system will continue to be available from CollabNet, as well as from other vendors, both during and after the incubation period.

"Becoming an Apache incubating project is a terrific move for our growing developer community," said Subversion Corporation President Hyrum Wright. "We are grateful to CollabNet for their long-standing support over the past ten years, and look forward to continuing to work together as we further expand Subversion as part of the ASF."

Many companies use Subversion, along with popular Apache projects such as Ant and Maven, as part of their overall application lifecycle management strategy. As the Subversion architecture complements so many Apache projects, it is fitting that the project be stewarded by the same organization and governed under the same processes.

"The Apache Tomcat / Subversion / Apache Maven stack has become the leading code and build management stack for the Java community," said Bill Portelli, chief executive officer, CollabNet.  "There is a natural synergy between the Subversion project and the ASF, and we anticipate expanded developer contributions and deeper integrations with other Apache projects, benefiting developers worldwide."

CollabNet is a Silver Sponsor of ApacheCon US 2009, being held November 2-6, 2009 in Oakland, CA.  For more information about Subversion, visit the CollabNet booth at the conference Expo Hall.

To download and experience Subversion, please visit http://subversion.tigris.org. Further information on the Apache Incubator is available at http://incubator.apache.org/. 

About The Apache Software Foundation (ASF)
Established in 1999, the all-volunteer Foundation oversees more than seventy leading Open Source projects, including Apache HTTP Server — the world's most popular Web server software.  Through The ASF's meritocratic process known as "The Apache Way," nearly 300 individual Members and 2,000 Committers successfully collaborate to develop freely available enterprise-grade software, benefiting millions of users worldwide: thousands of software solutions are distributed under the Apache License; and the community actively participates in ASF mailing lists, mentoring initiatives, and ApacheCon, the Foundation’s official user conference, trainings, and expo.  The ASF is funded by individual donations and corporate sponsors including Google, HP, Microsoft, Progress Software, SpringSource, and Yahoo! For more information, visit http://www.apache.org/.   

About CollabNet
CollabNet is the leader in application lifecycle management (ALM) platforms for distributed software development teams.  CollabNet TeamForge is the industry’s most open ALM platform, supporting every environment, methodology, and technology.  With an integrated suite of easy-to-use tools that share a centralized repository, it is the only ALM platform that enables a culture of collaboration, improving productivity 10-50% and reducing the cost of software development by up to 80%.  As the corporate sponsor of the open source Subversion project, the best version control and software configuration management (SCM) solution for distributed teams, collaborative development is in CollabNet’s DNA.  Millions of users at more than 800 organizations, including Applied Biosystems, Capgemini, Deutsche Bank, Oracle, Reuters, and the U.S. Department of Defense, have transformed the way they develop software with CollabNet.  For more information, visit
www.collab.net.

# # #

Media Contact:

Sally Khudairi
The Apache Software Foundation
+1 (617) 921 8656
<sk@apache.org>