% Getting the Photran Sources from CVS
\vspace{-0.5in}

{\scriptsize Revision: \footnotesize \$Id: app-cvs-maint.ltx-inc,v 1.2 2010/04/28 18:12:52 joverbey Exp $ $}

As of June, 2011, the current stable release of Photran is 7.0.
This appendix describes how to check out the code for the
Photran 7 maintenance branch, which will be released as
Photran 7.0.1, 7.0.2, etc.  This branch contains only bug fixes,
not new features.

\emph{BEFORE YOU BEGIN: Make sure you are running \textbf{Eclipse 3.7} (Indigo)
and a \textbf{Java 5} or later JVM. We recommend the
\href{http://www.eclipse.org/downloads/packages/eclipse-rcpplug-developers/ganymeder}{Eclipse for RCP/Plug-in Developers Package}.}

\newcounter{maint_running_counter}
\textbf{Part~I.  Check out the CDT 8.0 branch from CVS}

\begin{enumerate}
	\item  In Eclipse, switch to the CVS Repository Exploring perspective.
	\item  Right-click the CVS Repositories view; choose New, Repository Location
	\item  In the dialog box, enter the following information, then click Finish. \\
	\begin{tabular}{ll}
	        Host name:       & dev.eclipse.org \\
	        Repository path: & /cvsroot/tools \\
	        Username:        & anonymous \\
	        Password:        & (no password) \\
	        Connection type: & pserver \\
	\end{tabular}
	\item  In the CVS Repositories view
	       \begin{itemize}
	       \item  Expand ``:pserver:anonymous@dev.eclipse.org:/cvsroot/tools''
	       \item  Then expand ``HEAD''
	       \end{itemize}
	\item  Right-click on ``org.eclipse.cdt''
	\item  Select ``Configure Branches and Versions\ldots''
	\item  Under ``Browse files for tags'', expand ``all'', then expand
	       ``org.eclipse.cdt'', then click on the .project file
	\item  Under ``New tags found in the selected files'', click on the Deselect
	       All button, then check cdt\_8\_0 in the list above it
  \item	 Click Add Checked Tags
	\item	 Click OK
	\item  Now, in the CVS Repositories view
				 \begin{itemize}
				 \item  Expand ``:pserver:anonymous@dev.eclipse.org:/cvsroot/tools''
		     \item  Then expand ``Branches''
				 \item  Then expand ``cdt\_8\_0''
		     \item  Then expand ``org.eclipse.cdt cdt\_8\_0''
		     \item  Then expand ``all''
			  \end{itemize}
	\item  Click on the first entry under ``all''
	       (it should be org.eclipse.cdt), then shift-click on the last entry
	       under ``all'' (it should be org.eclipse.cdt.ui.tests).
	       All of the intervening plug-ins should now be selected.
	       Right-click on any of the selected plug-ins, and select
	       Check Out from the pop-up menu.
	       (Check out will take several minutes.)
	\item  You now have the CDT source code.  Make sure it compiles successfully
	       (lots of warnings, but no errors).
	\setcounter{maint_running_counter}{\value{enumi}}
\end{enumerate}

\vspace{1em}
\textbf{Part~II.  Check out the Photran 7.0 branch from CVS}
\begin{enumerate}
    \setcounter{enumi}{\value{maint_running_counter}}
    \item Under ``:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,''
        expand HEAD
        %, then expand
        %org.eclipse.ptp, then expand
        %photran
    \item  Right-click on ``org.eclipse.ptp''
    \item  Select ``Configure Branches and Versions\ldots''
    \item  Under ``Browse files for tags'', expand ``photran'', then expand
           ``org.eclipse.photran.core'', then click on the .project file
    \item  Under ``New tags found in the selected files'', click on the Deselect
           All button, then check ptp\_5\_0 in the list above it
  \item  Click Add Checked Tags
    \item    Click OK
    \item  Now, in the CVS Repositories view
                 \begin{itemize}
                 \item  Expand ``:pserver:anonymous@dev.eclipse.org:/cvsroot/tools''
             \item  Then expand ``Branches''
                 \item  Then expand ``ptp\_5\_0''
             \item  Then expand ``org.eclipse.ptp ptp\_5\_0''
             \item  Then expand ``photran''
              \end{itemize}
    \item  Click on the first entry under ``photran''
           (it should be org.eclipse.photran-dev-docs), then shift-click on the last entry
           under ``photran'' (it should be org.eclipse.rephraserengine.ui.vpg).
           All of the intervening plug-ins should now be selected.
           Right-click on any of the selected plug-ins, and select
           Check Out from the pop-up menu.
           (Check out will take several minutes.)
    \item \textit{(Optional)} You may also wish to switch back to the Java perspective and\dots
      \begin{enumerate}
      \item Close or delete the org.eclipse.photran.cmdline project.  This project contains code
            demonstrating how to use Photran's parser outside of Eclipse; most developers won't
            need to do this, and since it contains many classes copied from the ``real'' Photran
            projects, it can be confusing having it in your workspace.
      \item Delete the following projects (they are used for release engineering, so most developers
            will never need to modify them):
            \begin{itemize}
            \item org.eclipse.photran-feature
            \item org.eclipse.photran.intel-feature
            \item org.eclipse.photran.master
            \item org.eclipse.photran.releng
            \item org.eclipse.photran.vpg-feature
            \item org.eclipse.photran.xlf-feature
            \item org.eclipse.rephraserengine-feature
            \end{itemize}
      \end{enumerate}
    \setcounter{maint_running_counter}{\value{enumi}}
\end{enumerate}
The sources should all compile (albeit with lots of warnings).