<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta name="GENERATOR" content="Mozilla/4.51 [en] (X11; I; Linux 2.2.5-15 i686) [Netscape]">
<TITLE>SAFARI: CONCEPTION, BIRTH, AND FUTURE DEVELOPMENT OF AN OPEN SOURCE CODE BROWSING SYSTEM</TITLE>
</head>
<body BGCOLOR="#FFFFFF">
yapc Proceedings (June 1999)
<br>
<p><b>SAFARI: CONCEPTION, BIRTH, AND FUTURE DEVELOPMENT OF AN OPEN SOURCE CODE BROWSING SYSTEM</b>
<p>R. B. SLAYMAKER, Jr.
<br>
<p><font size=-1> Safari is a web based application
that provides access to hierarchically organized files (programs, images,
documents, or other media) stored in file systems, databases or archiving
systems such as revision control and software configuration management systems.
Multiple versions of any file can be browsed using meta information such
as revision number, revision labels, project membership, change
set numbers, or other methods natural to the structure of the storage system.
Relative links between documents link to the correct revisions of the
target documents as determined by the meta information.
<BR> Safari also provides a standard (GNU Make based) framework
for integrating analysis and processing tools and making their output easily
available within the context of the hierarchy the source files are stored
(and thus presented) in.
<br> Safari was conceived as a tool
for publishing automatically extracted documentation for an in-house system,
using a 3rd party documentation extraction tool (Cocoon). The original
(0.0) version is a monolithic perl script that grew from the original design
goals to include source code browsing, syntax highlighting, navigation
of back revisions, a second documentation extractor (pod2html) and activation
of #include files to be links to the appropriate file.
<br> Several key design decisions
in the 0.0 version were validated in practice, others invalidated. When
the burden of maintaining and extending the monolithic script grew too
large, Safari was rewritten and is now headed for a 1.0 version. The 0.5
version is being released under an open source license in conjunction with
this paper, and a demonstration web site is being made available for the
conference.
<br> This paper outlines the past
and near future life cycle of Safari: the design decisions, the current
state, and future directions are all discussed.</font>
<h2><A NAME="Introduction"></A>1. Introduction</h2>
<P>Source code browsing systems allow a developers and
other interested parties to explore and research bodies of source code.
To varying extents, they provide analytical information about the
code base, such as indexes of identifiers,
meta information such as change logs, labels, file dates and sizes.
A few are complete web based SCM (Software Configuration Management) or
RCS (Revision Control System) interfaces.
<P>There are many existing systems that provide these features.
<A HREF="http://lxr.linux.no/">The Linux Cross Reference project</A>
[<A HREF="#1">1</A>] provides browsing and indexing of identifiers
for source code and is used by several high profile open source
projects and by in-house developers working on proprietary
code.
<P>The <A HREF="http://www.perforce.com/perforce/webkeeper.html">Perforce Webkeeper</A>
[<A HREF="#2">2</A>] provides for simple retrieval of files from a perforce
source code repository.
<P>The <A HREF="http://public.perforce.com/cgi-bin/p4db/dtb.cgi?FSPC=public/perforce/utils/p4db">p4db Depot Browser</A>
[<A HREF="#3">3</A>] provides another front end for browsing files held in a perforce browsing system.
<P><A HREF="http://www.mks.com/">Mortice Kern Systems, Inc.</A>
provides a web based interface for the <A HREF="http://www.mks.com/solution/si/">Source Integrity Pro</A>
[<A HREF="#4">4</A>] software configuration management system. In addition to
these, there are probably hundreds of similar open source, closed source,
and hand-rolled systems in existence.
<P>[[If you know of any such systems that are distributed
free (in either sense), please let me know. Safari's an equal opportunity
borrower. Several of the p4db scripts have already been borrowed (with
much gratitude).]]
<P>Safari became a source code
browser as a means to a different end: we needed to extract source code
documentation (using an existing open source tool)
and publish it on an intranet. Source code browsing was originally
intended to provided a natural
navigational interface for this system, but rapidly became the most
used feature.
As with many open source projects, it
grew out of a need to scratch a fairly small itch and is growing
to be a very general tool.
<P>The current rewrite of Safari is intended
to allow incorporation of many different tools and to
be able to interface to a wide variety of file storage and archival systems.
<H2><A NAME="Conception"></A>2. Conception</H2>
<P>Safari was originally written starting in 1997 to automatically
extract and publish documentation from comments in
C++ source code kept in a closed source SCM system. The extraction
tool in use is
<A HREF="http://www.stratasys.com/software/cocoon/">Cocoon</A>
[<A HREF="#5">5</A>]. The SCM is
<A HREF="http://www.mks.com/solution/si/">MKS' Source Integrity</A> [<A HREF="#6">6</A>].
The fact that both of these were pre-existing sytems meant that
Safari was initially conceived as cgi-bin to glue together
chains of external tools (SI -> Cocoon -> HTTP output).
<P>Over time, feeping creaturism added:
<UL>
<LI>File-, project-, label- and revision-based browsing of source code,
<LI>Automatic mark-up of filenames in #include statements
to be links to the referred-to files,
<LI>Syntax highlighting and colorizing of C++ and (in a limited fashion) perl
source code,
<LI>On-the-fly documentation extraction using Cocoon and pod2html (a
utility distributed with perl),
<LI>Change log description browsing on a per-file basis, and
<LI>Simple searching for text or regular expressions within a file.
</UL>
<P>As Safari was extended, it grew beyond it's original mission
as a documentation extraction
tool and became a tool for researching, reviewing, and discussing
code. It turns out that reading code is often easier in a browser than
when using typical development environments of SCMs, file system browsers,
documentation extractors, HTML browsers, editors, and the like.
<P>The reasons a system such as Safari is more usable than
traditional development environments are:
<OL>
<LI>There's no need to check out the files. Safari extracts files
on-the-fly.
<LI>Source code can be marked up to include links to other code.
Things that can be activated in this manner include:
<OL TYPE="a">
<LI>References to other files / modules.
<LI>Identifiers can link back to the definitions, or forward
to a cross reference of their uses.
<LI>URLs in comments or code
<LI>Links can be added to point to external documentation
of design and implementation.
</OL>
<LI>Documentation extractors and code analysis tools can be made
almost effortless. For instance, Cocoon is complicated enough that
only one or two developers at this site ever mastered it (not me). No
other developer managed to get it up and running and use it for
any length of time.
<LI>Links to line numbers
(a feature borrowed from the Linux Cross Reference tools [<A HREF="#1">1</A>])
can be emailed to others. If link longevity is
required, a search query that leads to a line of code can be emailed
or stored, so edits that change line numbers don't cause link rot
nearly as easily.
</OL>
All of this
facilitates code reviews, documentation and research: it promotes
those things that make open source so succesful today: communications and
information.
<P>With Safari, checking a file in <i>is</i> publishing it. Checking
in is also
publishing any documentation
to be extracted from it. This turned out to be a very powerful mechanism.
We found ourselves storing design documentation in the project. This
allowed the design documentation to be automatically associated with the
files that it referred to revision by revision, release by release.
<P>In short, we found ourselves using Safari daily as an core
technology for software development. It's not the most used or
most important system, but it provides significant value to the
developers.
We extended it several times to incorporate
new features, bloating the original script beyond the point of the
maintainer's
sanity (which may explain a few things about this paper). Eventually it became clear that there was an ecological niche in
the broader internet community that a generalized, open source, modular
Safari-like system could fill, even given the number of other similar
systems available.
<H2><A HREF="#Gestation"></A>3. Gestation</H2>
<P>In the spring of 1998, I began to rewrite Safari in a more modular fashion
while
attempting to preserve the aspects that made Safari useful.
Another goal was to allow for for easy integration of existing tools without
requiring extensive programming knowledge. Perl's very good for controlling
external programs, but there are many people with little or no Perl
expertise out there.
<P>Here's the general structure of a Safari instance:
<IMG SRC="yapc1999-dataflow.gif" ALT="Safari Dataflow Diagram">
<P>A fully functional Safari system is built with a web server,
a cgi-bin (or preferably mod_perl) script <tt>cgimake</tt>, a make program,
preferably GNU Make or Make.pm, a script to convert source materials into
HTTP documents, and any external programs needed
to fetch files and meta data from the data store and
process it in to web-ready form. These tools are the key element of
Safari: they are your existing tools, not special purpose
Safari tools.
<P>Several key factors that made the original single-script version of
safari useful:
<OL>
<LI>Coherent, simple user interface,
<LI>Coherent, simple URL 'API' design, and
<LI>Emphasis on minimal administration and real-time updating.
</OL>
<P>Adding the goals of modularity and extensibility have rounded out
Safari and made it a general purpose tool, with possible applications
beyond source code browsing.
<H3><A NAME="UI"></A>3.1 User Interface Metaphors</H3>
<P>The key user interface decision that made Safari usable was basing the
navigation on the hierarchical file structure present in the source code
archives. This structure is already known by existing developers, and
basing Safari's navigation system on it also provides a tool for learning
and exploration by those who need to become familiar with it. Documentation
and other analytical tools should be reachable by browsing to a file or
directory, then following a link to the desired output.
<P>The disadvantage of this approach is that popular web browsers
make mediocre hierarchy browsers. Javascript, Java, and custom browsers
all provide possible avenues of approach for more friendly user interfaces.
Safari takes a lowest common denominator approach with low graphics
intensity to make it more generally usable. The emphasis is on features,
not flash (for now). That being said, a very nice tree oriented GUI would be
a fantastic addition.
<P>Alternate browsing structures can easily be provided by adding reports
or pages to Safari. These pages can be built automatically by an indexing
tool (pod2html does this, for example), or manually. An example of the
manual technique is a web page that describes each main active project
and provides links to 'interesting' places in it. Interesting places might
be the project root, design documents (standalone and automatically extracted),
output of analysis tools, key routines, structure definitions, or
files within the project, and external resources such as mailing lists,
news groups, or other web sites.
<P>A search engine or permuted index generator can provide master 'random
access' to the file tree. This is one of the most important features that
Safari lacks support for at this time, and is the feature that the
Linux Cross Reference Project was built for.
<H3><A NAME="URL"></A>3.2 URL Design</H3>
<P>The URL serves as the basic API that ties the user, the browser, and
the Safari scripts together. Users often type them in manually instead
of browsing to a location, so the URL should be easy to construct manually.
In effect, it's a low-level alternate user interface. Browsers base
relative link calculations on URLs, so placing contextual
information
to the left of the destination document's path (as opposed to putting it
in a '?' query specification) allows relative links between
documents to lead to sensible destinations.
And simple, consistent URL design makes scripting the back end much
easier.
<P>The URL design must support the hierarchical structure
of the underlying archival system, must incorporate a revision identifier
and also specification of which analysis or extraction tool's output
is being browsed. The typical Safari URL looks like:
<PRE>
http://a.b.com/checkers/_head/pretty/code/inc/checkers.h
| | | | |
+----------------------+-----+------+------------------+
| Project identity | Rev |Filter| File spec |
</PRE>
where:
<DL>
<DT>Project Identity
<DD>This is the root URL which determines what project Safari
is concerned with. In this case, the web server is configured to
map '/checkers/' to the Safari system.
<DT>Rev
<DD>The revision specifier comes next. This is usually a label
or change number, but can be a raw revision number in some cases.
The reason that it is not usually a raw revision number is that
it's rare that revision 123 of one file corresponds to revision
123 of another file. Using change set numbers or labels that
mark a release to specify revisions means that all filenames
specified to the right of the revision field refer to a
coherent, consistent set of files.
<DT>Filter
<DD>The filter specified the lens through which the file is to
be viewed. This may be a pretty-printer, a word/line counter,
a documentation extractor, a lint-like tool, etc.
<DT>File Spec
<DD>This indicates which file in the namespace of the project,
revision, and filter is being accessed.
</DL>
<P>Safari uses the query string portion of the URL (the part after
a '?') to provide transient information. This transient information
is information that should not affect the revision or current
filter settings, and thus should not
affect the document's position
in the overall heirarchy.
<P>Here are some examples of Safari URLs. Sample pages generated by these
are included in the appendix.
<DL>
<DD>
<PRE>
<A HREF="#depots">http://localhost/safaridev/perforce/_head/Default/</A>
Leads to a list of files in the top level of Perforce Inc.'s public
source code archive.
<A HREF="#Default">http://localhost/safaridev/perforce/<B>_head</B>/Default/public/index.html</A>
Displays the head revision of the index.html extracted from that archive.
<A HREF="#pretty">http://localhost/safaridev/perforce/_head/<B>pretty</B>/public/index.html</A>
Displays the same page as syntax highlighted source code
<A HREF="#wc">http://localhost/safaridev/perforce/_head/pretty/public/index.html<B>?filter=wc</B></A>
Displays the output of the '<tt>wc</tt>' command when run on index.html
<A HREF="#filelog">http://localhost/safaridev/perforce/_head/pretty/public/index.html<B>?rev=_head&filter=filelog</B></A>
Displays the complete history of the file index.html.
<A HREF="#c6">http://www.slaysys.com/safaridev/perforce/<B>@6</B>/Default/public/index.html</A>
Diplays the versins of index.html associated with change set number 6.
</PRE>
</DD>
</DL>
<P>In essence, each combination of project and revision label or change
number specifies a consistent set of files that correspond to each other.
The filter determines how the source file should be processed before
viewing, and the file spec leads to the file itself.
<P>Some filters generate different namespaces than the underlying
archive structure. This makes linking into and out of that filter
a little tricky, but relative links between files within a filter's namespace
work fine.
<P>It's important to note that links between documents (both hard coded
and those automatically marked up by Safari) should be relative links, for
two reasons:
<UL>
<LI>Relative links will work in multiple filters and revisions
<LI>A user should be able to take a copy of the files and browse
them using a file: URL or other scheme.
</UL>
<P>This is not always possible given the fact that third party tools
are not always prepared to generate relative links. Workarounds do
exist for some cases.
<H3><A NAME="Admin"></A>3.3 Administration and upkeep</H3>
<P>A key element in the adoption of Safari was minimal administration.
Safari was born out of a need to publish sets of extracted source code
documentation on the web, combined with the extreme distaste several
of us had for manually generating and publishing docsets.
<P>Safari makes extensive use of file time stamps and meta information
from the underlying storage system to determine when to check out a new
file or (re)generate output derived from the source files.
This can be done on a timed basis (to avoid having to evaluate
things every HTTP request), or it can be done on every HTTP request.
<P>In the original script, I found myself using and debugging a lot
of dependency rules. This inspired the use of GNU Make as the tool
to tie the cgi-bin (or mod_perl) script to the underlying tools.
<P>GNU Make provides several important features for Safari:
<OL>
<LI>a standard, well known, documented language for declaring the processes
needed to generate target files,
<LI>a program that evaluates this definition file and uses filesystem
meta information to decide what to remake,
<LI>the ability to incorporate existing tools in to Safari without
massive hacking efforts. <tt>gcc -c -Wall</tt> (ie lint) and <tt>wc</tt>
are implemented in the demonstration server as examples, but others
are available.
</OL>
<P>GNU Make also poses a few challenges:
<OL>
<LI>There's no way to force a complete regeneration of output from the
source file in the event that a bug or transient condition causes
invalid output. This is especially important for Safari implementors,
but it's also a handy fly swatter for end users occasionally.
<LI>There's not an easy way to tell GNU Make to keep intermediate files
around while not ignoring errors (ie .SECONDARY's feature set is not
full enough for Safari). To work around this, Safari uses .PRECIOUS
and the scripts and Makefile shell commands that implement the
underside of Safari delete their output files in the event of an error.
<LI>There's no natural way to use Make to check to see if a new
revision exists in a modern client-server RCS / SCM.
<LI>GNU Make's functional programming API is very weak, and it can
be tricky to implement content-based decision making in a Makefile.
<LI>Make doesn't give a flock, so access sharing must be implemented
at a more global level that would be necessary if make could do it.
</OL>
<P>Improvements that address
the first two of these are now on the TODO list for the GNU Make developers.
Workarounds exist for all of these, but improvements should be made that
remove them.
<H3><A NAME="Design"></A>3.4 Miscellaneous Design Issues</H3>
<P>A few other key notes about the design and implementation:
<OL>
<LI>Safari is completely implemented in perl and GNU Make (although
the binaries necessary to connect to various RCSs are used).
<LI>A perl module implementing GNU Make with some powerful perlish
extensions has been developed and will be adapted to Safari use as
needed. This will run more slowly than GNU Make, but may make up
for that by reducing the forking required to do a build.
<LI>An enhanced version of the standard Unix <tt>file</tt> command
has been developed as a module File::Type. It reports mime types
and is more accurate at guessing source code languages.
</OL>
<H2><A NAME="Birth"></A>4. Birth</H3>
<P>Safari's first open source release (0.50) has been developed to coincide
with yapc (Yet Another Perl Conference) in June of 1999. The 0.50 release
has a full basic feature set, with a lot of room to grow. A demonstration
site URL should be available shortly before and for a while after the
conference.
<P>Safari's source is all browse-able on the web in the perforce
public depot and will be distributed via CPAN in tarball form.
<P>Mailing lists exist for Safari announcements and developer discussions.
More details are available on the Safari web site. Please join and
contribute.
<H2><A NAME="Growth"></a>5. Growth Plan</H3>
<P>Safari has a lot of room to grow. It is designed to be an open-ended
project. Areas of significant development are:
<UL>
<LI>Indexing. Since many source code archives contain a milieu of programming
and non-programming languages, indexing is quite a challenge. It should
be a very interesting project.
<LI>Given good indexing, automatic activation of important words in
displayed documents provides an extremely useful mechanism that makes
Safari much more useful than most editors as a code browser.
<LI>A library of back ends to different RCSs and SCMs needs to be
built. Perforce and the local filesystem are the only back ends currently
implemented. Back ends to PVCS, CVS and MKS SI are in development by
myself and others.
<LI>A library of contributed scripts and Makefiles will be collected
and published to promote cross-pollination.
<LI>Partial parsing of source languages will greatly facilitate better
indexing and syntax highlighting. This parsing can provide the
context for each indexed word or phrase, like
whether it's a variable, macro, function, typename, or comment. This can
allow for finer grained searches and for better syntax highlighting and
automatic link generation when marking up source files.
<LI>Alternate user interfaces, like a tree view control. Safari's
intentionally lowest-common-denominator HTML GUI needs to remain,
but that should not limit it's growth.
<LI>It shouldn't be very far from a browser to a simple check-in/checkout
locking and merging interface, especially given the work on WebDAV.
<LI>Allowing a mechanism for sticky-notes to be created and attached to
source code would make Safari an incredibly powerful code review tool.
</UL>
<P><B>Please join and contribute!!</B>
<H2><A NAME="Samples"></A>Appendix A. Sample Pages</H2>
<P>Several example pages are given in the order you would browse them
in.
<HR>
<A NAME="depots"></A><TABLE BORDER="1"><TR><TH>Location:
http://localhost/safaridev/perforce/_head/Default/
</TH></TR>
<TR><TD>The list of depots available at public.perforce.com:1666</TD></TR>
</TABLE>
<TABLE WIDTH="100%" BORDER="0" CELLPADDING="10" CELLSPACING="0">
<TR>
<TD BGCOLOR="#B0E0FF" ALIGN="CENTER" COLSPAN="2"><FONT SIZE="+3">perforce/</FONT> (Default filter)</TD>
</TR>
<TR>
<TD BGCOLOR="#B0E0FF" VALIGN="TOP">
<FONT SIZE="-1"><B>PROJECT</B></FONT><BR> <A HREF="">top</A><BR> up<BR> <A HREF="../../_head/changes/index.html">changes</A><BR> <A HREF="../../_head/labels/index.html">labels</A><BR> <A HREF="?force=yes&">rebuild</A><BR><BR>
<BR>
</TD>
<TD WIDTH="99%" VALIGN="TOP" ALIGN="LEFT">
<TABLE CELLPADDING="5" CELLSPACING="0" BORDER="0">
<TR ALIGN="LEFT"><TH ALIGN="RIGHT"><BR></TH><TH ALIGN="LEFT">Depot</TH><TH ALIGN="LEFT">Description</TH></TR>
<TR><TD ALIGN="RIGHT">1</TD><TD ALIGN="LEFT"><A HREF="guest/">guest/</A></TD><TD ALIGN="LEFT">Depot for guest users. </TD></TR>
<TR><TD ALIGN="RIGHT">2</TD><TD ALIGN="LEFT"><A HREF="public/">public/</A></TD><TD ALIGN="LEFT">Perforce's open source depot. </TD></TR>
</TABLE>
</TD>
<TR BGCOLOR="#B0E0FF">
<TD ALIGN="CENTER" COLSPAN="2">This page generated by Safari at Wed Jun 16 15:08:39 1999</TD>
</TR>
</TABLE>
<HR>
<A NAME="public"></A><TABLE BORDER="1"><TR><TH>Location:
http://localhost/safaridev/perforce/_head/Default/public/
</TH></TR>
<TR><TD>The list of depots files available in the public depot ( //public/* ) at public.perforce.com:1666, and their<BR>
revision levels and last change number, as of the head revision.</TD></TR>
</TABLE>
<TABLE WIDTH="100%" BORDER="0" CELLPADDING="10" CELLSPACING="0">
<TR>
<TD BGCOLOR="#B0E0FF" ALIGN="CENTER" COLSPAN="2"><FONT SIZE="+3">perforce/public/</FONT> (Default filter)</TD>
</TR>
<TR>
<TD BGCOLOR="#B0E0FF" VALIGN="TOP">
<FONT SIZE="-1"><B>PROJECT</B></FONT><BR> <A HREF="../">top</A><BR> <A HREF="../">up</A><BR> <A HREF="../../../_head/changes/index.html">changes</A><BR> <A HREF="../../../_head/labels/index.html">labels</A><BR> <A HREF="?force=yes&">rebuild</A><BR><BR>
<BR>
</TD>
<TD WIDTH="99%" VALIGN="TOP" ALIGN="LEFT">
<TABLE CELLPADDING="5" CELLSPACING="0" BORDER="0">
<TR ALIGN="LEFT"><TH ALIGN="RIGHT"><BR></TH><TH ALIGN="LEFT">File</TH><TH ALIGN="RIGHT">Rev</TH><TH ALIGN="LEFT">Description</TH><TH ALIGN="RIGHT">Change</TH><TH ALIGN="LEFT">Type</TH></TR>
<TR><TD ALIGN="RIGHT">1</TD><TD ALIGN="LEFT"><A HREF="index.html">index.html</A></TD><TD ALIGN="RIGHT"><A HREF="index.html?filter=filelog">#17</A></TD><TD ALIGN="LEFT">edit</TD><TD ALIGN="RIGHT"><A HREF="../../../_head/changes/114.html">114</A></TD><TD ALIGN="LEFT">ktext</TD></TR>
<TR><TD ALIGN="RIGHT">2</TD><TD ALIGN="LEFT"><A HREF="jam/">jam/</A></TD><TD ALIGN="RIGHT"><A HREF="jam/?filter=filelog">#2</A></TD><TD ALIGN="LEFT">integrate</TD><TD ALIGN="RIGHT"><A HREF="../../../_head/changes/76.html">76</A></TD><TD ALIGN="LEFT">xtext</TD></TR>
<TR><TD ALIGN="RIGHT">3</TD><TD ALIGN="LEFT"><A HREF="perforce/">perforce/</A></TD><TD ALIGN="RIGHT"><A HREF="perforce/?filter=filelog">#2</A></TD><TD ALIGN="LEFT">edit</TD><TD ALIGN="RIGHT"><A HREF="../../../_head/changes/98.html">98</A></TD><TD ALIGN="LEFT">ktext</TD></TR>
<TR><TD ALIGN="RIGHT">4</TD><TD ALIGN="LEFT"><A HREF="tutorial.html">tutorial.html</A></TD><TD ALIGN="RIGHT"><A HREF="tutorial.html?filter=filelog">#9</A></TD><TD ALIGN="LEFT">edit</TD><TD ALIGN="RIGHT"><A HREF="../../../_head/changes/147.html">147</A></TD><TD ALIGN="LEFT">ktext</TD></TR>
</TABLE>
</TD>
<TR BGCOLOR="#B0E0FF">
<TD ALIGN="CENTER" COLSPAN="2">This page generated by Safari at Wed Jun 16 15:42:46 1999</TD>
</TR>
</TABLE>
<HR>
<A NAME="Default"></A><TABLE BORDER="1"><TR><TH>Location:
http://localhost/safaridev/perforce/_head/Default/public/index.html
</TH></TR>
<TR><TD>The head revision of //public/index.html from public.perforce.com:1666</TD></TR>
</TABLE>
<TABLE WIDTH="100%" BORDER="0" CELLPADDING="10" CELLSPACING="0">
<TR>
<TD BGCOLOR="#B0E0FF" ALIGN="CENTER" COLSPAN="2"><FONT SIZE="+3">perforce/public/index.html</FONT> (HTML filter)</TD>
</TR>
<TR>
<TD BGCOLOR="#B0E0FF" VALIGN="TOP">
<FONT SIZE="-1"><B>PROJECT</B></FONT><BR> <A HREF="../">top</A><BR> <A HREF="">up</A><BR> <A HREF="../../../_head/changes/index.html">changes</A><BR> <A HREF="../../../_head/labels/index.html">labels</A><BR> <A HREF="index.html?force=yes&">rebuild</A><BR><BR>
<FONT SIZE="-1"><B>FILTERS</B></FONT><BR> <A HREF="../../Default/public/index.html">Default</A><BR> <A HREF="../../POD/public/index.html">POD</A><BR> <A HREF="../../pretty/public/index.html">pretty</A><BR> <A HREF="../../plain/public/index.html">plain</A><BR> <A HREF="../../HTML/public/index.html">HTML</A><BR><BR>
<FONT SIZE="-1"><B>TOOLS</B></FONT><BR> <A HREF="index.html?filter=gcclint">gcclint</A><BR> <A HREF="index.html?filter=wc">wc</A><BR> <A HREF="index.html?rev=_head&filter=filelog">filelog</A><BR><BR>
</TD>
<TD WIDTH="99%" VALIGN="TOP" ALIGN="LEFT">
<CENTER>
<P>
<A NAME="toc"></A>
<A HREF="http://www.perforce.com">
<IMG SRC="http://www.perforce.com/images/logo.gif" alt="Perforce" border=0></A>
<H1>
Welcome to the Perforce Public Depot
</H1>
<P>
<TABLE BORDER=0><TR><TD>
<B>
<UL>
<LI><A HREF="#aboutPerforce">About Perforce and the Public Depot
</A>
<LI><A HREF="#roadmap">The Depot Road Map
</A>
<LI><A HREF="#howtobrowse">How to Browse the Depot
</A>
<LI><A HREF="#howtocontrib">How to Contribute to the Depot
</A>
</UL>
</UL>
</TABLE>
</CENTER>
<br>
<br>
<br>
<!------------------------------------------------------------------>
<P>
<TABLE CELLSPACING=0 BORDER=0 WIDTH=100%><TR><TD BGCOLOR=FFCC66>
<A NAME="aboutPerforce"></A>
<H2>About Perforce and the Public Depot
</H2>
<TD WIDTH=5% BGCOLOR=FFCC66 ALIGN=RIGHT><FONT SIZE="-2"><A HREF="#toc">
Back to<BR>Table of<BR>Contents</A></TD></TR>
</TABLE>
<P ALIGN="CENTER"><B> [...lots of good information snipped for brevity...] </B>
<!------------------------------------------------------------------>
<P>
<TABLE CELLSPACING=0 BORDER=0 WIDTH=100%>
<TR>
<TD WIDTH=15% BGCOLOR=FFCC66 ALIGN=LEFT VALIGN=CENTER>
<FONT SIZE="-2">
Copyright ©<br>
1998, 1999<br>
<a href="http://www.perforce.com">Perforce Software</a><br>
</FONT>
</TD>
<TD WIDTH=70% BGCOLOR=FFCC66 ALIGN=CENTER>
<FONT SIZE="-2">
You're browsing a file stored as<br>
<code>$Id: //public/index.html#17 $</code><br>
in the
<A HREF=http://public.perforce.com/public/index.html>Perforce Public Depot</A>.
</FONT>
</TD>
<TD WIDTH=15% BGCOLOR=FFCC66 ALIGN=RIGHT>
<FONT SIZE="-2"><A HREF="#toc">
Back to<BR>Table of<BR>Contents</A></TD></TR>
</FONT>
</TD>
</TR>
</TABLE>
<!------------------------------------------------------------------>
</TD>
<TR BGCOLOR="#B0E0FF">
<TD ALIGN="CENTER" COLSPAN="2">This page generated by Safari at Fri Jun 18 02:24:59 1999</TD>
</TR>
</TABLE>
<HR>
<A NAME="pretty"></A><TABLE BORDER="1"><TR><TH>Location:
http://localhost/safaridev/perforce/_head/pretty/public/index.html
</TH></TR>
<TR><TD>The syntax highlighted source code for the head revision of //public/index.html from<BR> public.perforce.com:1666</TD></TR>
</TABLE>
<TABLE WIDTH="100%" BORDER="0" CELLPADDING="10" CELLSPACING="0">
<TR>
<TD BGCOLOR="#B0E0FF" ALIGN="CENTER" COLSPAN="2"><FONT SIZE="+3">perforce/public/index.html</FONT> (pretty filter)</TD>
</TR>
<TR>
<TD BGCOLOR="#B0E0FF" VALIGN="TOP">
<FONT SIZE="-1"><B>PROJECT</B></FONT><BR> <A HREF="../">top</A><BR> <A HREF="">up</A><BR> <A HREF="../../../_head/changes/index.html">changes</A><BR> <A HREF="../../../_head/labels/index.html">labels</A><BR> <A HREF="index.html?force=yes&">rebuild</A><BR><BR>
<FONT SIZE="-1"><B>FILTERS</B></FONT><BR> <A HREF="../../Default/public/index.html">Default</A><BR> <A HREF="../../POD/public/index.html">POD</A><BR> <A HREF="../../pretty/public/index.html">pretty</A><BR> <A HREF="../../plain/public/index.html">plain</A><BR> <A HREF="../../HTML/public/index.html">HTML</A><BR><BR>
<FONT SIZE="-1"><B>TOOLS</B></FONT><BR> <A HREF="index.html?filter=gcclint">gcclint</A><BR> <A HREF="index.html?filter=wc">wc</A><BR> <A HREF="index.html?rev=_head&filter=filelog">filelog</A><BR><BR>
</TD>
<TD WIDTH="99%" VALIGN="TOP" ALIGN="LEFT">
<pre>
<a name="line1" href="#line1"> 1</a> <font color="#993333"><font color="#0000aa"><strong><</strong></font><font color="#0000ff">H</font><font color="#0000ff">T</font><font color="#0000ff">M</font><font color="#0000ff">L</font><font color="#0000aa"><strong>></strong></font></font>
<a name="line2" href="#line2"> 2</a>
<a name="line3" href="#line3"> 3</a> <font color="#993333"><font color="#0000aa"><strong><</strong></font><font color="#0000ff">H</font><font color="#0000ff">E</font><font color="#0000ff">A</font><font color="#0000ff">D</font><font color="#0000aa"><strong>></strong></font></font>
<a name="line4" href="#line4"> 4</a>
<a name="line5" href="#line5"> 5</a> <font color="#993333"><font color="#0000aa"><strong><</strong></font><font color="#0000ff">T</font><font color="#0000ff">I</font><font color="#0000ff">T</font><font color="#0000ff">L</font><font color="#0000ff">E</font><font color="#0000aa"><strong>></strong></font></font>
<a name="line6" href="#line6"> 6</a> Perforce Public Depot
<a name="line7" href="#line7"> 7</a> <font color="#993333"><font color="#0000aa"><strong><</strong></font><font color="#0000ff">/</font><font color="#0000ff">T</font><font color="#0000ff">I</font><font color="#0000ff">T</font><font color="#0000ff">L</font><font color="#0000ff">E</font><font color="#0000aa"><strong>></strong></font></font>
<a name="line8" href="#line8"> 8</a>
<a name="line9" href="#line9"> 9</a> <font color="#993333"><font color="#0000aa"><strong><</strong></font><font color="#0000ff">/</font><font color="#0000ff">H</font><font color="#0000ff">E</font><font color="#0000ff">A</font><font color="#0000ff">D</font><font color="#0000aa"><strong>></strong></font></font>
<a name="line10" href="#line10"> 10</a>
<a name="line11" href="#line11"> 11</a> <font color="#993333"><font color="#0000aa"><strong><</strong></font><font color="#0000ff">B</font><font color="#0000ff">O</font><font color="#0000ff">D</font><font color="#0000ff">Y</font><font color="#0000ff"> </font><font color="#0000ff">B</font><font color="#0000ff">G</font><font color="#0000ff">C</font><font color="#0000ff">O</font><font color="#0000ff">L</font><font color="#0000ff">O</font><font color="#0000ff">R</font><font color="#0000ff">=</font><font color="#008000">"#FFFFFF"</font><font color="#0000aa"><strong>></strong></font></font>
<a name="line12" href="#line12"> 12</a> <font color="#993333"><font color="#0000aa"><strong><</strong></font><font color="#0000ff">C</font><font color="#0000ff">E</font><font color="#0000ff">N</font><font color="#0000ff">T</font><font color="#0000ff">E</font><font color="#0000ff">R</font><font color="#0000aa"><strong>></strong></font></font>
<a name="line13" href="#line13"> 13</a> <font color="#993333"><font color="#0000aa"><strong><</strong></font><font color="#0000ff">P</font><font color="#0000aa"><strong>></strong></font></font>
<a name="line14" href="#line14"> 14</a> <font color="#993333"><font color="#0000aa"><strong><</strong></font><font color="#0000ff">A</font><font color="#0000ff"> </font><font color="#0000ff">N</font><font color="#0000ff">A</font><font color="#0000ff">M</font><font color="#0000ff">E</font><font color="#0000ff">=</font><font color="#008000">"toc"</font><font color="#0000aa"><strong>></strong></font></font><font color="#993333"><font color="#0000aa"><strong><</strong></font><font color="#0000ff">/</font><font color="#0000ff">A</font><font color="#0000aa"><strong>></strong></font></font>
<a name="line15" href="#line15"> 15</a> <font color="#993333"><font color="#0000aa"><strong><</strong></font><font color="#0000ff">A</font><font color="#0000ff"> </font><font color="#0000ff">H</font><font color="#0000ff">R</font><font color="#0000ff">E</font><font color="#0000ff">F</font><font color="#0000ff">=</font><font color="#008000">"http://www.perforce.com"</font><font color="#0000aa"><strong>></strong></font></font>
<a name="line16" href="#line16"> 16</a> <font color="#993333"><font color="#0000aa"><strong><</strong></font><font color="#0000ff">I</font><font color="#0000ff">M</font><font color="#0000ff">G</font><font color="#0000ff"> </font><font color="#0000ff">S</font><font color="#0000ff">R</font><font color="#0000ff">C</font><font color="#0000ff">=</font><font color="#008000">"http://www.perforce.com/images/logo.gif"</font><font color="#0000ff"> </font><font color="#0000ff">a</font><font color="#0000ff">l</font><font color="#0000ff">t</font><font color="#0000ff">=</font><font color="#008000">"Perforce"</font><font color="#0000ff"> </font><font color="#0000ff">b</font><font color="#0000ff">o</font><font color="#0000ff">r</font><font color="#0000ff">d</font><font color="#0000ff">e</font><font color="#0000ff">r</font><font color="#0000ff">=</font><font color="#0000ff">0</font><font color="#0000aa"><strong>></strong></font></font><font color="#993333"><font color="#0000aa"><strong><</strong></font><font color="#0000ff">/</font><font color="#0000ff">A</font><font color="#0000aa"><strong>></strong></font></font>
<a name="line17" href="#line17"> 17</a> <font color="#993333"><font color="#0000aa"><strong><</strong></font><font color="#0000ff">H</font><font color="#0000ff">1</font><font color="#0000aa"><strong>></strong></font></font>
<a name="line18" href="#line18"> 18</a> Welcome to the Perforce Public Depot
<a name="line19" href="#line19"> 19</a> <font color="#993333"><font color="#0000aa"><strong><</strong></font><font color="#0000ff">/</font><font color="#0000ff">H</font><font color="#0000ff">1</font><font color="#0000aa"><strong>></strong></font></font>
<a name="line20" href="#line20"> 20</a> <font color="#993333"><font color="#0000aa"><strong><</strong></font><font color="#0000ff">P</font><font color="#0000aa"><strong>></strong></font></font>
<B> [...more lines, snipped for brevity...] </B>
</pre>
</TD>
<TR BGCOLOR="#B0E0FF">
<TD ALIGN="CENTER" COLSPAN="2">This page generated by Safari at Fri Jun 18 02:25:38 1999</TD>
</TR>
</TABLE>
<HR>
<A NAME="wc"></A><TABLE BORDER="1"><TR><TH>Location:
http://localhost/safaridev/perforce/_head/pretty/public/index.html?filter=wc
</TH></TR>
<TR><TD>Output of the '<TT>wc</TT>' command applied to the
file //public/index.html</TD></TR>
</TABLE>
<TABLE WIDTH="100%" BORDER="0" CELLPADDING="10" CELLSPACING="0">
<TR>
<TD BGCOLOR="#B0E0FF" ALIGN="CENTER" COLSPAN="2"><FONT SIZE="+3">perforce/public/index.html</FONT> (wc filter)</TD>
</TR>
<TR>
<TD BGCOLOR="#B0E0FF" VALIGN="TOP">
<FONT SIZE="-1"><B>PROJECT</B></FONT><BR> <A HREF="../">top</A><BR> <A HREF="">up</A><BR> <A HREF="../../../_head/changes/index.html">changes</A><BR> <A HREF="../../../_head/labels/index.html">labels</A><BR> <A HREF="index.html?force=yes&filter=wc">rebuild</A><BR><BR>
<FONT SIZE="-1"><B>FILTERS</B></FONT><BR> <A HREF="../../Default/public/index.html">Default</A><BR> <A HREF="../../POD/public/index.html">POD</A><BR> <A HREF="../../pretty/public/index.html">pretty</A><BR> <A HREF="../../plain/public/index.html">plain</A><BR> <A HREF="../../HTML/public/index.html">HTML</A><BR><BR>
<FONT SIZE="-1"><B>TOOLS</B></FONT><BR> <A HREF="index.html?filter=gcclint">gcclint</A><BR> wc<BR> <A HREF="index.html?rev=_head&filter=filelog">filelog</A><BR><BR>
</TD>
<TD WIDTH="99%" VALIGN="TOP" ALIGN="LEFT">
<PRE>453 lines, 1257 words, 12271 bytes in _head/public/index.html
</PRE>
</TD>
<TR BGCOLOR="#B0E0FF">
<TD ALIGN="CENTER" COLSPAN="2">This page generated by Safari at Fri Jun 18 02:27:13 1999</TD>
</TR>
</TABLE>
<HR>
<A NAME="filelog"></A><TABLE BORDER="1"><TR><TH>Location:
http://localhost/safaridev/perforce/_head/pretty/public/index.html?rev=_head&filter=filelog
</TH></TR>
<TR><TD>The complete revision history of the file //public/index.html</TD></TR>
</TABLE>
<TABLE WIDTH="100%" BORDER="0" CELLPADDING="10" CELLSPACING="0">
<TR>
<TD BGCOLOR="#B0E0FF" ALIGN="CENTER" COLSPAN="2"><FONT SIZE="+3">perforce/public/index.html</FONT> (filelog filter)</TD>
</TR>
<TR>
<TD BGCOLOR="#B0E0FF" VALIGN="TOP">
<FONT SIZE="-1"><B>PROJECT</B></FONT><BR> <A HREF="../">top</A><BR> <A HREF="">up</A><BR> <A HREF="../../../_head/changes/index.html">changes</A><BR> <A HREF="../../../_head/labels/index.html">labels</A><BR> <A HREF="index.html?force=yes&rev=_head&filter=filelog">rebuild</A><BR><BR>
<FONT SIZE="-1"><B>FILTERS</B></FONT><BR> <A HREF="../../Default/public/index.html">Default</A><BR> <A HREF="../../POD/public/index.html">POD</A><BR> <A HREF="../../pretty/public/index.html">pretty</A><BR> <A HREF="../../plain/public/index.html">plain</A><BR> <A HREF="../../HTML/public/index.html">HTML</A><BR><BR>
<FONT SIZE="-1"><B>TOOLS</B></FONT><BR> <A HREF="index.html?filter=gcclint">gcclint</A><BR> <A HREF="index.html?filter=wc">wc</A><BR> <A HREF="index.html?rev=_head&filter=filelog">filelog</A><BR><BR>
</TD>
<TD WIDTH="99%" VALIGN="TOP" ALIGN="LEFT">
<UL>
<TABLE>
<TR ALIGN="LEFT"><TH>Rev</TH><TH>Act.</TH><TH>Date</TH><TH>User</TH><TH>Change</TH><TH>Desc</TH><TH>Labels</TH><TH>Opened_by</TH><TH></TR>
</TH><TR><TD VALIGN="TOP"><A HREF="../../../_17/pretty/public/index.html">17</A></TD><TD VALIGN="TOP">edit</TD><TD VALIGN="TOP">1999/03/22</TD><TD VALIGN="TOP">laura_wingerd</TD><TD VALIGN="TOP"><A HREF="../../../_head/changes/114.html">114</A></TD><TD VALIGN="TOP"><tt>Fix typos in links. </tt></TD><TD VALIGN="TOP"><b></b></TD><TD VALIGN="TOP"></TD><TD VALIGN="TOP"></TR>
</TD><TR><TD VALIGN="TOP"><A HREF="../../../_16/pretty/public/index.html">16</A></TD><TD VALIGN="TOP">edit</TD><TD VALIGN="TOP">1999/03/15</TD><TD VALIGN="TOP">laura_wingerd</TD><TD VALIGN="TOP"><A HREF="../../../_head/changes/94.html">94</A></TD><TD VALIGN="TOP"><tt>Re-org "triggers" directory -- </tt></TD><TD VALIGN="TOP"><b></b></TD><TD VALIGN="TOP"></TD><TD VALIGN="TOP"></TR>
</TD><TR><TD VALIGN="TOP"><A HREF="../../../_15/pretty/public/index.html">15</A></TD><TD VALIGN="TOP">edit</TD><TD VALIGN="TOP">1999/01/05</TD><TD VALIGN="TOP">laura_wingerd</TD><TD VALIGN="TOP"><A HREF="../../../_head/changes/52.html">52</A></TD><TD VALIGN="TOP"><tt>Minor web page format changes. </tt></TD><TD VALIGN="TOP"><b></b></TD><TD VALIGN="TOP"></TD><TD VALIGN="TOP"></TR>
</TD><TR><TD VALIGN="TOP"><A HREF="../../../_14/pretty/public/index.html">14</A></TD><TD VALIGN="TOP">edit</TD><TD VALIGN="TOP">1999/01/05</TD><TD VALIGN="TOP">laura_wingerd</TD><TD VALIGN="TOP"><A HREF="../../../_head/changes/51.html">51</A></TD><TD VALIGN="TOP"><tt>Update copyright year. </tt></TD><TD VALIGN="TOP"><b></b></TD><TD VALIGN="TOP"></TD><TD VALIGN="TOP"></TR>
</TD><TR><TD VALIGN="TOP"><A HREF="../../../_13/pretty/public/index.html">13</A></TD><TD VALIGN="TOP">edit</TD><TD VALIGN="TOP">1999/01/05</TD><TD VALIGN="TOP">laura_wingerd</TD><TD VALIGN="TOP"><A HREF="../../../_head/changes/50.html">50</A></TD><TD VALIGN="TOP"><tt>Minor PD doc changes. </tt></TD><TD VALIGN="TOP"><b></b></TD><TD VALIGN="TOP"></TD><TD VALIGN="TOP"></TR>
</TD><TR><TD VALIGN="TOP"><A HREF="../../../_12/pretty/public/index.html">12</A></TD><TD VALIGN="TOP">edit</TD><TD VALIGN="TOP">1998/12/24</TD><TD VALIGN="TOP">perforce</TD><TD VALIGN="TOP"><A HREF="../../../_head/changes/46.html">46</A></TD><TD VALIGN="TOP"><tt>Add WebKeeper source. </tt></TD><TD VALIGN="TOP"><b></b></TD><TD VALIGN="TOP"></TD><TD VALIGN="TOP"></TR>
</TD><TR><TD VALIGN="TOP"><A HREF="../../../_11/pretty/public/index.html">11</A></TD><TD VALIGN="TOP">edit</TD><TD VALIGN="TOP">1998/12/03</TD><TD VALIGN="TOP">laura_wingerd</TD><TD VALIGN="TOP"><A HREF="../../../_head/changes/42.html">42</A></TD><TD VALIGN="TOP"><tt>Fix links in index pages, add o</tt></TD><TD VALIGN="TOP"><b></b></TD><TD VALIGN="TOP"></TD><TD VALIGN="TOP"></TR>
</TD><TR><TD VALIGN="TOP"><A HREF="../../../_10/pretty/public/index.html">10</A></TD><TD VALIGN="TOP">edit</TD><TD VALIGN="TOP">1998/11/05</TD><TD VALIGN="TOP">perforce</TD><TD VALIGN="TOP"><A HREF="../../../_head/changes/28.html">28</A></TD><TD VALIGN="TOP"><tt>Reword intro, fix typos, fix na</tt></TD><TD VALIGN="TOP"><b></b></TD><TD VALIGN="TOP"></TD><TD VALIGN="TOP"></TR>
</TD><TR><TD VALIGN="TOP"><A HREF="../../../_9/pretty/public/index.html">9</A></TD><TD VALIGN="TOP">edit</TD><TD VALIGN="TOP">1998/10/26</TD><TD VALIGN="TOP">perforce</TD><TD VALIGN="TOP"><A HREF="../../../_head/changes/26.html">26</A></TD><TD VALIGN="TOP"><tt>Fleshed out "how to contribute"</tt></TD><TD VALIGN="TOP"><b></b></TD><TD VALIGN="TOP"></TD><TD VALIGN="TOP"></TR>
</TD><TR><TD VALIGN="TOP"><A HREF="../../../_8/pretty/public/index.html">8</A></TD><TD VALIGN="TOP">edit</TD><TD VALIGN="TOP">1998/10/22</TD><TD VALIGN="TOP">perforce</TD><TD VALIGN="TOP"><A HREF="../../../_head/changes/22.html">22</A></TD><TD VALIGN="TOP"><tt>Added "About the depot" section</tt></TD><TD VALIGN="TOP"><b></b></TD><TD VALIGN="TOP"></TD><TD VALIGN="TOP"></TR>
</TD><TR><TD VALIGN="TOP"><A HREF="../../../_7/pretty/public/index.html">7</A></TD><TD VALIGN="TOP">edit</TD><TD VALIGN="TOP">1998/10/09</TD><TD VALIGN="TOP">perforce</TD><TD VALIGN="TOP"><A HREF="../../../_head/changes/19.html">19</A></TD><TD VALIGN="TOP"><tt>Fix browser links, add lost tra</tt></TD><TD VALIGN="TOP"><b></b></TD><TD VALIGN="TOP"></TD><TD VALIGN="TOP"></TR>
</TD><TR><TD VALIGN="TOP"><A HREF="../../../_6/pretty/public/index.html">6</A></TD><TD VALIGN="TOP">edit</TD><TD VALIGN="TOP">1998/10/09</TD><TD VALIGN="TOP">perforce</TD><TD VALIGN="TOP"><A HREF="../../../_head/changes/15.html">15</A></TD><TD VALIGN="TOP"><tt>Added browser links to index. </tt></TD><TD VALIGN="TOP"><b></b></TD><TD VALIGN="TOP"></TD><TD VALIGN="TOP"></TR>
</TD><TR><TD VALIGN="TOP"><A HREF="../../../_5/pretty/public/index.html">5</A></TD><TD VALIGN="TOP">edit</TD><TD VALIGN="TOP">1998/10/05</TD><TD VALIGN="TOP">perforce</TD><TD VALIGN="TOP"><A HREF="../../../_head/changes/10.html">10</A></TD><TD VALIGN="TOP"><tt>Added "How to Browse". </tt></TD><TD VALIGN="TOP"><b></b></TD><TD VALIGN="TOP"></TD><TD VALIGN="TOP"></TR>
</TD><TR><TD VALIGN="TOP"><A HREF="../../../_4/pretty/public/index.html">4</A></TD><TD VALIGN="TOP">edit</TD><TD VALIGN="TOP">1998/10/02</TD><TD VALIGN="TOP">perforce</TD><TD VALIGN="TOP"><A HREF="../../../_head/changes/9.html">9</A></TD><TD VALIGN="TOP"><tt>Add road map & nicer formatting</tt></TD><TD VALIGN="TOP"><b></b></TD><TD VALIGN="TOP"></TD><TD VALIGN="TOP"></TR>
</TD><TR><TD VALIGN="TOP"><A HREF="../../../_3/pretty/public/index.html">3</A></TD><TD VALIGN="TOP">edit</TD><TD VALIGN="TOP">1998/10/02</TD><TD VALIGN="TOP">perforce</TD><TD VALIGN="TOP"><A HREF="../../../_head/changes/8.html">8</A></TD><TD VALIGN="TOP"><tt>Change to ktext. </tt></TD><TD VALIGN="TOP"><b></b></TD><TD VALIGN="TOP"></TD><TD VALIGN="TOP"></TR>
</TD><TR><TD VALIGN="TOP"><A HREF="../../../_2/pretty/public/index.html">2</A></TD><TD VALIGN="TOP">edit</TD><TD VALIGN="TOP">1998/10/02</TD><TD VALIGN="TOP">perforce</TD><TD VALIGN="TOP"><A HREF="../../../_head/changes/7.html">7</A></TD><TD VALIGN="TOP"><tt>Test links in index page. </tt></TD><TD VALIGN="TOP"><b></b></TD><TD VALIGN="TOP"></TD><TD VALIGN="TOP"></TR>
</TD><TR><TD VALIGN="TOP"><A HREF="../../../_1/pretty/public/index.html">1</A></TD><TD VALIGN="TOP">add</TD><TD VALIGN="TOP">1998/10/02</TD><TD VALIGN="TOP">perforce</TD><TD VALIGN="TOP"><A HREF="../../../_head/changes/6.html">6</A></TD><TD VALIGN="TOP"><tt>Open source depot index. </tt></TD><TD VALIGN="TOP"><b></b></TD><TD VALIGN="TOP"></TD><TD VALIGN="TOP"></TR>
</TD></TABLE>
</TD>
<TR BGCOLOR="#B0E0FF">
<TD ALIGN="CENTER" COLSPAN="2">This page generated by Safari at Fri Jun 18 02:27:54 1999</TD>
</TR>
</TABLE>
<HR>
<A NAME="c6"></A><TABLE BORDER="1"><TR><TH>Location:
http://www.slaysys.com/safaridev/perforce/@6/Default/public/index.html
</TH></TR>
<TR><TD>The file index.html as of change number 6.</TD></TR>
</TABLE>
<TABLE WIDTH="100%" BORDER="0" CELLPADDING="10" CELLSPACING="0">
<TR>
<TD BGCOLOR="#B0E0FF" ALIGN="CENTER" COLSPAN="2"><FONT SIZE="+3">perforce/public/index.html</FONT> (HTML filter)</TD>
</TR>
<TR>
<TD BGCOLOR="#B0E0FF" VALIGN="TOP">
<FONT SIZE="-1"><B>PROJECT</B></FONT><BR> <A HREF="../">top</A><BR> <A HREF="">up</A><BR> <A HREF="../../../_head/changes/index.html">changes</A><BR> <A HREF="../../../_head/labels/index.html">labels</A><BR> <A HREF="index.html?force=yes&">rebuild</A><BR><BR>
<FONT SIZE="-1"><B>FILTERS</B></FONT><BR> <A HREF="../../Default/public/index.html">Default</A><BR> <A HREF="../../POD/public/index.html">POD</A><BR> <A HREF="../../pretty/public/index.html">pretty</A><BR> <A HREF="../../plain/public/index.html">plain</A><BR> <A HREF="../../HTML/public/index.html">HTML</A><BR><BR>
<FONT SIZE="-1"><B>TOOLS</B></FONT><BR> <A HREF="index.html?filter=gcclint">gcclint</A><BR> <A HREF="index.html?filter=wc">wc</A><BR> <A HREF="index.html?rev=_head&filter=filelog">filelog</A><BR><BR>
</TD>
<TD WIDTH="99%" VALIGN="TOP" ALIGN="LEFT">
<h3>Testing...</h3>
This is a test.
<p>
This should be the Perforce
<a href=../index.html>home page</a>.
</TD>
<TR BGCOLOR="#B0E0FF">
<TD ALIGN="CENTER" COLSPAN="2">This page generated by Safari at Fri Jun 18 04:59:03 1999</TD>
</TR>
</TABLE>
<h2><A NAME="References"></A>References</h2>
<P><A NAME="1">[1]</A> The Linux Cross Reference System
( <A HREF="http://lxr.linux.no/">http://lxr.linux.no/</A> ).
<P><A NAME="2">[2]</A> The Perforce WebKeeper
( <A HREF="http://www.perforce.com/perforce/webkeeper.html">http://www.perforce.com/perforce/webkeeper.html</A> ).
<P><A NAME="3">[3]</A> The p4db Perforce Depot Browser
( <A HREF="http://public.perforce.com/cgi-bin/p4db/dtb.cgi?FSPC=public/perforce/utils/p4db">http://public.perforce.com/cgi-bin/p4db/dtb.cgi?FSPC=public/perforce/utils/p4db</A> ).
<P><A NAME="4">[4]</A> Mortice Kern Systems' Source Integrity Pro Software Configuration Management System
( <A HREF="http://www.mks.com/solution/si/pro/">http://www.mks.com/solution/si/pro/</A> ).
<P><A NAME="5">[5]</A> The Cocoon Utilities, Version 3.2, Jeffrey Kotula
( <A HREF="http://www.stratasys.com/software/cocoon/">http://www.stratasys.com/software/cocoon/</A> ).
<P><A NAME="6">[6]</A> Mortice Kern Systems' Source Integrity
( <A HREF="http://www.mks.com/solution/si/">http://www.mks.com/solution/si/</A> ).
</body>
</html>