<!--
     File : svnsetup.php
     Author : Diego Madruga Sandin (dmadruga)
     Date :	2008-03-14
     Description : This is the svn configuration page for the MTJ project. 
-->
<?php  																														require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/app.class.php");	require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/nav.class.php"); 	require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/menu.class.php"); 	$App 	= new App();	$Nav	= new Nav();	$Menu 	= new Menu();		include($App->getProjectCommon());    # All on the same line to unclutter the user's desktop'
	#
	# Begin: page-specific settings.  Change these. 
	$pageTitle 		= "DSDP&nbsp; - &nbsp;Mobile Tools for Java &nbsp; (MTJ) &nbsp; Repository";
	$pageKeywords	= "DSDP, MTJ, SVN, repository";
	$pageAuthor		= "Diego Madruga Sandin";
	
    /* Required eclipse basic classes */
    require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/app.class.php");	
    /* Functions and modules related to Navbar objects */
    require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/nav.class.php"); 	
    /* Functions and modules related to the page top eclipse menu */
    require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/menu.class.php"); 	

    
    $App 	= new App();
    /* Left Navbar */	
    $Nav	= new Nav();	
    /*  Page top eclipse menu */
    $Menu 	= new Menu();

    /* Find the _projectCommon.php file and include it */
    include($App->getProjectCommon());
    
    /* Begin: page-specific settings. */ 
	$html = <<<EOHTML

	<div id="midcolumn">
		<h1>$pageTitle</h1>
        <h2>Team Project Set</h2>
        <p>The easiest way to setup a development environment is to import the team project sets that are available below.
        Simply download the file and select a <b>File->Import->Team->Team Project Set</b>.
        Two files are available: one for DSDP MTJ Committer and another to external contributors. The main difference between them
        is that the commiter's one access the repository via a secure connection which requires a valid SVN/CVS login. The other file
        can only be used to checkout the source code, change the code and generate patches that are attached to the bugzilla</p>
        <ul>
            <li>
                <a href="http://www.eclipse.org/dsdp/mtj/development/mtj_anonymous.psf">
                Contributor Access 
                </a>
            </li>         
            <li>
                <a href="http://www.eclipse.org/dsdp/mtj/development/mtj_sshproxy.psf">
                Committer Access 
                </a>
            </li>         
        </ul>
        <p>Once the psf file is imported all projects will be added to your workspace.
        for some additional information about how to use Team Project Sets, please refer to
        <a href="http://help.eclipse.org/help32/index.jsp?topic=/org.eclipse.platform.doc.user/tasks/tasks-cvs-project-set.htm">
        Eclipse Help 
        </a>
        </p> 
		
		<h2>Web access</h2>
		<p>Our repositories can also be accessed over the internet 
		through the viewsvn interface:</p>
        <ul>
            <li>
                <a href="http://dev.eclipse.org/viewsvn/index.cgi/?root=DSDP_MTJ">
                org.eclipse.mtj
                </a>
            </li>		  
        </ul>

		<h2>Direct manual access to MTJ Repositories</h2>
		<p>
    		If you want to manually browse MTJ repositories in the
    		Eclipse SVN Repository Explorer or a similar SVN browser, here is
    		how to access them:
		</p>
		<ul>
    		<li>Configuration <br>
    		    &nbsp;&nbsp;&nbsp;&nbsp;<b>host:</b> dev.eclipse.org <br>
        		&nbsp;&nbsp;&nbsp;&nbsp;<b>repository:</b> /svnroot/dsdp/org.eclipse.mtj<br>
        		&nbsp;&nbsp;&nbsp;&nbsp;<b>method:</b> svn+ssh or https<br>
    		</li>
		</ul>
		

		<h2>Background information on SVN and Eclipse</h2>
		<ul>
		  <li>See <a href="http://wiki.eclipse.org/index.php/SVN_Howto">
			Using Eclipse with SVN</a> for instructions on how to use
			Eclipse with SVN.</li>
		</ul>
		<p/>
	</div>

EOHTML;

	# Generate the web page
	$App->generatePage($theme, $Menu, $Nav, $pageAuthor, $pageKeywords, $pageTitle, $html);
?>
