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

{\scriptsize Revision: \footnotesize \$Id: app-cvs.ltx-inc,v 1.16 2010/06/24 13:21:41 joverbey Exp $ $}

As of June, 2011, the current stable release of Photran is 7.0.
This appendix describes how to check out the current development code,
which will become the \textit{next} release in June, 2012.

\textbf{IMPORTANT:} These instructions will change in the near future as
the June, 2012 release will be based on Eclipse 4.2, and both CDT and PTP
are moving from CVS to Git.

\textbf{Before you begin\dots}

\vspace{-1em}

\begin{enumerate}
\item You will need to be running \textbf{Eclipse 3.7 (Indigo)} on a Java 5 or later JVM.
      You should install \textit{Eclipse Classic 3.7} (also called the \textit{Eclipse SDK),}
      which includes the Eclipse Platform,
      Java development tools, and Plug-in Development Environment.  (Since Photran is a
      set of Eclipse plug-ins, you need a version of Eclipse that includes the Plug-in
      Development Environment.)
\item \textit{(Optional)} We also recommend that you install the following Eclipse plug-ins:
      \begin{enumerate}
      \item \href{http://subclipse.tigris.org/}{\textbf{Subclipse}} --
            provides Subversion support
      \item \href{http://findbugs.sourceforge.net/}{\textbf{FindBugs}} --
            a static analysis tool for Java
      \item \href{http://www.eclemma.org/}{\textbf{EclEmma}} --
            a Java code coverage tool
      \item \href{http://metrics.sourceforge.net/}{\textbf{Metrics}} --
            provides code metrics for Java code
      %\item \href{http://www.eclipse.org/photran/download.php}{\textbf{Photran}} --
      %      even though you're developing Photran, it is helpful to have Photran \textit{installed}
      %      in your development environment.  This will allow you to use Photran to write Fortran
      %      code for unit tests, etc.
      \end{enumerate}
\end{enumerate}

\newcounter{running_counter}
\textbf{Part~I.  Check out the CDT sources from CVS HEAD}

\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\_6\_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\_6\_0''
	%	     \item  Then expand ``org.eclipse.cdt cdt\_6\_0''
		     \item  Then expand ``org.eclipse.cdt''
		     \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{running_counter}{\value{enumi}}
\end{enumerate}

\vspace{1em}
\textbf{Part~II.  Check out the Photran sources from CVS}
\begin{enumerate}
	\setcounter{enumi}{\value{running_counter}}
	\item Under ``:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,''
	    expand HEAD, then expand
	    org.eclipse.ptp, then expand
	    photran
	\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{running_counter}{\value{enumi}}
\end{enumerate}
The sources should all compile (albeit with lots of warnings).