--- /dev/null
+<IfModule mod_rewrite.c>
+ RewriteEngine On
+ RewriteRule ^([a-z]+).php/(.*)$ $1.php?f=$2 [QSA,L]
+ RewriteCond %{REQUEST_FILENAME} !-d
+ RewriteCond %{REQUEST_FILENAME} !-f
+ RewriteRule ^(.*)$ browse.php?f=$1 [QSA]
+</IfModule>
--- /dev/null
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+\f
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+\f
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+\f
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+\f
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
--- /dev/null
+What is Chora?
+==============
+
+:Contact: chora@lists.horde.org
+
+.. contents:: Contents
+.. section-numbering::
+
+Chora is a web interface to viewing files, revisions, diffs, etc. from a CVS
+repository, written in PHP and utilizing the `Horde Application Framework`_.
+
+This software is OSI Certified Open Source Software. OSI Certified is a
+certification mark of the `Open Source Initiative`_.
+
+.. _`Horde Application Framework`: http://www.horde.org/horde/
+.. _`Open Source Initiative`: http://www.opensource.org/
+
+
+Obtaining Chora
+---------------
+
+Further information on Chora and the latest version can be obtained at
+
+ http://www.horde.org/chora/
+
+
+Documentation
+-------------
+
+The following documentation is available in the Chora distribution:
+
+:README_: This file
+:COPYING_: Copyright and license information
+:`docs/BUGS`_: Known bugs
+:`docs/CHANGES`_: Changes by release
+:`docs/CREDITS`_: Project developers
+:`docs/INSTALL`_: Installation instructions and notes
+:`docs/TODO`_: Development TODO list
+
+
+Installation
+------------
+
+Instructions for installing Chora can be found in the file INSTALL_ in the
+``docs/`` directory of the Chora distribution.
+
+
+Assistance
+----------
+
+If you encounter problems with Chora, help is available!
+
+The Horde Frequently Asked Questions List (FAQ), available on the Web at
+
+ http://www.horde.org/faq/
+
+The Horde Project runs a number of mailing lists, for individual applications
+and for issues relating to the project as a whole. Information, archives, and
+subscription information can be found at
+
+ http://www.horde.org/mail/
+
+Lastly, Horde developers, contributors and users also make occasional
+appearances on IRC, on the channel #horde on the freenode Network
+(irc.freenode.net).
+
+
+Licensing
+---------
+
+For licensing and copyright information, please see the file COPYING_ in the
+Chora distribution.
+
+Thanks,
+
+The Chora team
+
+
+.. _README: ?f=README.html
+.. _COPYING: http://www.horde.org/licenses/gpl.php
+.. _docs/BUGS: ?f=BUGS.html
+.. _docs/CHANGES: ?f=CHANGES.html
+.. _docs/CREDITS: ?f=CREDITS.html
+.. _INSTALL:
+.. _docs/INSTALL: ?f=INSTALL.html
+.. _docs/TODO: ?f=TODO.html
--- /dev/null
+<?php
+/**
+ * Copyright 2000-2008 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (GPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
+ *
+ * @author Anil Madhavapeddy <avsm@horde.org>
+ * @package Chora
+ */
+
+require_once dirname(__FILE__) . '/lib/base.php';
+require_once 'Horde/Text/Filter.php';
+
+/* Spawn the file object. */
+$fl = $VC->getFileObject($where, $cache);
+Chora::checkError($fl);
+
+/* Retrieve the desired revision from the GET variable. */
+$rev = Util::getFormData('rev', '1.1');
+if (!$VC->isValidRevision($rev)) {
+ Chora::fatal(sprintf(_("Revision %s not found"), $rev), '404 Not Found');
+}
+
+$ann = &$VC->getAnnotateObject($fl);
+Chora::checkError($lines = $ann->doAnnotate($rev));
+
+$title = sprintf(_("Source Annotation of %s (revision %s)"), Text::htmlAllSpaces($where), $rev);
+$extraLink = sprintf('<a href="%s">%s</a> | <a href="%s">%s</a>',
+ Chora::url('co', $where, array('r' => $rev)), _("View"),
+ Chora::url('co', $where, array('r' => $rev, 'p' => 1)), _("Download"));
+require CHORA_TEMPLATES . '/common-header.inc';
+require CHORA_TEMPLATES . '/menu.inc';
+require CHORA_TEMPLATES . '/headerbar.inc';
+require CHORA_TEMPLATES . '/annotate/header.inc';
+
+$author = '';
+$style = 0;
+
+/* Map of revisions for finding the previous revision to a change. */
+$revMap = $fl->revs;
+sort($revMap);
+$rrevMap = array_flip($revMap);
+
+/* Keep track of any revision we encounter in the following loop. */
+$revList = array();
+
+/* Use this counter so that we can give each tooltip object a unique
+ * id attribute (which we use to set the tooltip text later). */
+$i = 0;
+foreach ($lines as $line) {
+ $lineno = $line['lineno'];
+ $prevAuthor = $author;
+ $author = Chora::showAuthorName($line['author']);
+ if ($prevAuthor != $author) {
+ $style = (++$style % 2);
+ }
+ $rev = $line['rev'];
+ $prev = isset($revMap[$rrevMap[$rev] - 1]) ? $revMap[$rrevMap[$rev] - 1] : null;
+ if (!isset($revList[$rev])) {
+ $revList[$rev] = $fl->logs[$rev];
+ }
+ if (!is_null($prev) && !isset($revList[$prev])) {
+ $revList[$prev] = $fl->logs[$prev];
+ }
+ $line = Text::htmlAllSpaces($line['line']);
+ include CHORA_TEMPLATES . '/annotate/line.inc';
+ ++$i;
+}
+
+require CHORA_TEMPLATES . '/annotate/footer.inc';
+require $registry->get('templates', 'horde') . '/common-footer.inc';
--- /dev/null
+<?php
+/**
+ * Copyright 1999-2008 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (GPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
+ *
+ * @author Anil Madhavapeddy <anil@recoil.org>
+ * @author Chuck Hagenbuch <chuck@horde.org>
+ * @package Chora
+ */
+
+require_once dirname(__FILE__) . '/lib/base.php';
+
+if (!$atdir && !$VC->isFile($fullname)) {
+ Chora::fatal(sprintf(_("$s: no such file or directory"), $where), '404 Not Found');
+}
+
+if ($atdir) {
+ Chora::checkError($dir = $VC->queryDir($where));
+
+ $atticFlags = (bool)$acts['sa'];
+ Chora::checkError($dir->browseDir($cache, true, $atticFlags));
+ $dir->applySort($acts['sbt'], $acts['ord']);
+ Chora::checkError($dirList = &$dir->queryDirList());
+ Chora::checkError($fileList = $dir->queryFileList($atticFlags));
+
+ /* Decide what title to display. */
+ if ($where == '') {
+ $title = $conf['options']['introTitle'];
+ } else {
+ $title = sprintf(_("Source Directory of /%s"), $where);
+ }
+
+ $extraLink = '';
+ if (is_a($VC, 'VC_cvs')) {
+ $extraLink = Horde::widget(Chora::url(
+ '', $where . '/', array('sa' => ($acts['sa'] ? 0 : 1))),
+ $acts['sa'] ? _("Hide Deleted Files") : _("Show Deleted Files"),
+ 'widget', '', '',
+ $acts['sa'] ? _("Hide _Deleted Files") : _("Show _Deleted Files")
+ );
+ }
+
+ $umap = array(
+ 'age' => Horde_VC::SORT_AGE,
+ 'rev' => Horde_VC::SORT_REV,
+ 'name' => Horde_VC::SORT_NAME,
+ 'author' => Horde_VC::SORT_AUTHOR
+ );
+
+ foreach (array('age', 'rev', 'name', 'author') as $u) {
+ $arg = array('sbt' => $umap[$u]);
+ if ($acts['sbt'] == $umap[$u]) {
+ $arg['ord'] = !$acts['ord'];
+ }
+ $url[$u] = Chora::url('', $where . '/', $arg);
+ }
+
+ /* Print out the directory header. */
+ $printAllCols = count($fileList);
+
+ Horde::addScriptFile('prototype.js', 'horde', true);
+ Horde::addScriptFile('tables.js', 'horde', true);
+ require CHORA_TEMPLATES . '/common-header.inc';
+ require CHORA_TEMPLATES . '/menu.inc';
+ require CHORA_TEMPLATES . '/headerbar.inc';
+ require CHORA_TEMPLATES . '/directory/header.inc';
+
+ /* Unless we're at the top, display the 'back' bar. */
+ if ($where != '') {
+ $url = Chora::url('', preg_replace('|[^/]+$|', '', $where));
+ require CHORA_TEMPLATES . '/directory/back.inc';
+ }
+
+ /* Display all the directories first. */
+ if ($dirList) {
+ echo '<tbody>';
+ foreach ($dirList as $currentDir) {
+ if ($conf['hide_restricted'] && Chora::isRestricted($currentDir)) {
+ continue;
+ }
+ $url = Chora::url('', "$where/$currentDir/");
+ $currDir = Text::htmlAllSpaces($currentDir);
+ require CHORA_TEMPLATES . '/directory/dir.inc';
+ }
+ echo '</tbody>';
+ }
+
+ /* Display all of the files in this directory */
+ if ($fileList) {
+ echo '<tbody>';
+ foreach ($fileList as $currFile) {
+ if ($conf['hide_restricted'] &&
+ Chora::isRestricted($currFile->queryName())) {
+ continue;
+ }
+ $lg = $currFile->queryLastLog();
+ if (is_a($lg, 'PEAR_Error')) {
+ continue;
+ }
+ $realname = $currFile->queryName();
+ $mimeType = Horde_Mime_Magic::filenameToMIME($realname);
+
+ $icon = Horde_Mime_Viewer::getIcon($mimeType);
+
+ $author = Chora::showAuthorName($lg->queryAuthor());
+ $head = $currFile->queryHead();
+ $date = $lg->queryDate();
+ $log = $lg->queryLog();
+ $attic = $currFile->isDeleted();
+ $fileName = $where . ($attic ? '/' . 'Attic' : '') . '/' . $realname;
+ $name = Text::htmlAllSpaces($realname);
+ $url = Chora::url('', $fileName);
+ $readableDate = Chora::readableTime($date);
+ if ($log) {
+ $shortLog = str_replace("\n", ' ',
+ trim(substr($log, 0, $conf['options']['shortLogLength'] - 1)));
+ if (strlen($log) > 80) {
+ $shortLog .= '...';
+ }
+ }
+ require CHORA_TEMPLATES . '/directory/file.inc';
+ }
+ echo '</tbody>';
+ }
+
+ echo '</table>';
+ require $registry->get('templates', 'horde') . '/common-footer.inc';
+ exit;
+}
+
+/* Showing a file. */
+$fl = $VC->getFileObject($where, $cache);
+Chora::checkError($fl);
+$title = sprintf(_("Revisions for %s"), $where);
+$onb = Util::getFormData('onb', 0);
+if ($VC->isValidRevision($onb)) {
+ $onb_len = strlen($onb);
+ $onb_base = Horde_VC_Revision::strip($onb, 1);
+ $onb_parents = array();
+ while (substr_count($onb_base, '.')) {
+ $onb_parents[$onb_base] = true;
+ $onb_base = Horde_VC_Revision::strip($onb_base, 1);
+ }
+} else {
+ $onb = null;
+}
+
+$extraLink = Chora::getFileViews();
+$first = end($fl->logs);
+$diffValueLeft = $first->queryRevision();
+$diffValueRight = $fl->queryRevision();
+
+$sel = '';
+foreach ($fl->symrev as $sm => $rv) {
+ $sel .= '<option value="' . $rv . '">' . $sm . '</option>';
+}
+
+$selAllBranches = '';
+foreach ($fl->branches as $num => $sym) {
+ $selAllBranches .= '<option value="' . $num . '"' . ($num == $onb ? ' selected="selected"' : '') . '>' . $sym . '</option>';
+}
+
+Horde::addScriptFile('prototype.js', 'horde', true);
+Horde::addScriptFile('tables.js', 'horde', true);
+Horde::addScriptFile('QuickFinder.js', 'horde', true);
+Horde::addScriptFile('revlog.js', 'chora', true);
+require CHORA_TEMPLATES . '/common-header.inc';
+require CHORA_TEMPLATES . '/menu.inc';
+require CHORA_TEMPLATES . '/headerbar.inc';
+require CHORA_TEMPLATES . '/log/header.inc';
+
+$i = 0;
+foreach ($fl->logs as $lg) {
+ $rev = $lg->queryRevision();
+ list($branchName, $branchRev) = Chora::getBranch($fl, $rev);
+
+ /* Are we tracking a branch? */
+ if ($onb) {
+ /* If we are on the branch itself, let it through */
+ if (substr($rev, 0, $onb_len) != $onb) {
+ /* If the revision is on one of the parent branches, and
+ * is before the branch was made, let it through. */
+ if ((!isset($onb_parents[$branchRev]) && substr_count($rev, '.') > 1) ||
+ Horde_VC_Revision::cmp($rev, $onb) > 0) {
+ continue;
+ }
+ }
+ }
+
+ $textUrl = Chora::url('co', $where, array('r' => $rev));
+ $commitDate = Chora::formatDate($lg->queryDate());
+ $readableDate = Chora::readableTime($lg->queryDate(), true);
+
+ $author = Chora::showAuthorName($lg->queryAuthor(), true);
+ $tags = Chora::getTags($lg, $where);
+
+ if ($prevRevision = $fl->queryPreviousRevision($lg->queryRevision())) {
+ $diffUrl = Chora::url('diff', $where, array('r1' => $prevRevision, 'r2' => $rev));
+ } else {
+ $diffUrl = '';
+ }
+
+ $logMessage = Chora::formatLogMessage($lg->queryLog());
+
+ require CHORA_TEMPLATES . '/log/rev.inc';
+
+ if ($i++ > 100 && !Util::getFormData('all')) {
+ break;
+ }
+}
+require CHORA_TEMPLATES . '/log/footer.inc';
+require $registry->get('templates', 'horde') . '/common-footer.inc';
--- /dev/null
+<?php
+/**
+ * Copyright 2000-2008 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (GPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
+ *
+ * @author Anil Madhavapeddy <avsm@horde.org>
+ * @package Chora
+ */
+
+require_once dirname(__FILE__) . '/lib/base.php';
+
+/* If we know we're at a directory, just go to browse.php. */
+if ($atdir) {
+ require CHORA_BASE . '/browse.php';
+ exit;
+}
+
+/* Should we pretty-print this output or not? */
+$plain = Util::getFormData('p', 0);
+
+/* Create the VC_File object and populate it. */
+$file = $VC->getFileObject($where, $cache);
+Chora::checkError($file);
+
+/* Get the revision number. */
+$r = Util::getFormData('r');
+
+/* If no revision is specified, default to HEAD. If a revision is
+ * specified, it's safe to cache for a long time. */
+if (is_null($r)) {
+ $r = $file->queryRevision();
+ header('Cache-Control: max-age=60, must-revalidate');
+} else {
+ header('Cache-Control: max-age=2419200');
+}
+
+/* Is this a valid revision being requested? */
+if (!$VC->isValidRevision($r)) {
+ Chora::fatal(sprintf(_("Revision Not Found: %s is not a valid revision"), $r), '400 Bad Request');
+}
+
+/* Retrieve the actual checkout. */
+$checkOut = $VC->getCheckout($file, $r);
+
+/* Get the MIME type of the file, or at least our best guess at it. */
+$mime_type = Horde_Mime_Magic::filenameToMIME($fullname);
+if ($mime_type == 'application/octet-stream') {
+ $mime_type = 'text/plain';
+}
+
+/* Check error status, and either show error page, or the checkout
+ * contents */
+Chora::checkError($checkOut);
+
+if (!$plain) {
+ /* Pretty-print the checked out copy */
+ $pretty = Chora::pretty($mime_type, $checkOut);
+
+ /* Get this revision's attributes in printable form. */
+ $log = $file->logs[$r];
+
+ $title = sprintf(_("%s Revision %s (%s ago)"),
+ basename($fullname),
+ $r,
+ Chora::readableTime($log->date, true));
+ $extraLink = sprintf('<a href="%s">%s</a> | <a href="%s">%s</a>',
+ Chora::url('annotate', $where, array('rev' => $r)), _("Annotate"),
+ Chora::url('co', $where, array('r' => $r, 'p' => 1)), _("Download"));
+
+ $tags = Chora::getTags($log, $where);
+ list($branchName,) = Chora::getBranch($file, $r);
+
+ $log_print = Chora::formatLogMessage($log->queryLog());
+ $author = Chora::showAuthorName($log->queryAuthor(), true);
+
+ Horde::addScriptFile('prototype.js', 'horde', true);
+ Horde::addScriptFile('stripe.js', 'horde', true);
+ require CHORA_TEMPLATES . '/common-header.inc';
+ require CHORA_TEMPLATES . '/menu.inc';
+ require CHORA_TEMPLATES . '/headerbar.inc';
+ require CHORA_TEMPLATES . '/checkout/checkout.inc';
+ require $registry->get('templates', 'horde') . '/common-footer.inc';
+ exit;
+}
+
+/* Download the file. */
+
+// Get data.
+$content = '';
+while ($line = fgets($checkOut)) {
+ $content .= $line;
+}
+@fclose($checkOut);
+
+// Get name.
+$filename = $file->queryName();
+if ($browser->getBrowser() == 'opera') {
+ $filename = strtr($filename, ' ', '_');
+}
+
+// Send headers.
+$browser->downloadHeaders($filename, $mime_type, false, strlen($content));
+
+// Send data.
+echo $content;
--- /dev/null
+Deny from all
--- /dev/null
+<?xml version="1.0"?>
+<configuration>
+
+ <configtab name="paths" desc="Paths and Locations">
+ <configsection name="paths">
+ <configheader>Paths and Locations</configheader>
+ <configdescription>Location of RCS and other binaries you must have
+ installed as part of CVS, or optional tools for expanding CVS functionality</configdescription>
+ <configstring name="ci" desc="ci">/usr/bin/ci</configstring>
+ <configstring name="co" desc="co">/usr/bin/co</configstring>
+ <configstring name="rcs" desc="rcs">/usr/bin/rcs</configstring>
+ <configstring name="rcsdiff" desc="rcsdiff">/usr/bin/rcsdiff</configstring>
+ <configstring name="rlog" desc="rlog">/usr/bin/rlog</configstring>
+ <configstring name="cvs" desc="cvs">/usr/bin/cvs</configstring>
+ <configstring name="cvsps" required="false" desc="If you have cvsps
+ installed, we can generate patchset information. You need at least version
+ 2.0b6 of cvsps. Path to the cvsps executable, e.g. /usr/local/bin/cvsps"/>
+ <configstring name="cvsps_home" desc="Directory where the .cvsps cache
+ files can be created - it must be writeable by the
+ webserver.">/tmp</configstring>
+ <configstring name="cvsgraph" required="false" desc="If you have CvsGraph
+ installed, we can generate repository graphs. Path to the cvsgraph
+ executable, e.g. /usr/bin/cvsgraph"/>
+ <configphp name="cvsgraph_conf" desc="CvsGraph configuration
+ file">dirname(__FILE__) . '/cvsgraph.conf'</configphp>
+
+ <configdescription>Paths for use with Subversion</configdescription>
+ <configstring name="svn" desc="svn">/usr/bin/svn</configstring>
+ <configstring name="diff" desc="diff">/usr/bin/diff</configstring>
+ <configstring name="svn_home" required="false" desc="Home directory for
+ execution of svn binary (specified via --config-dir to svn). This directory
+ must at least be readable to the webserver, otherwise svn will not work.
+ If you leave this empty, the system's temporary directory will be used.">
+ </configstring>
+
+ <configdescription>Paths for use with Git</configdescription>
+ <configstring name="git" desc="git">/usr/bin/git</configstring>
+ </configsection>
+ </configtab>
+
+ <configtab name="tickets" desc="Interaction with other systems">
+ <configsection name="tickets">
+ <configheader>Interaction with other systems</configheader>
+ <configstring name="regexp" required="false" desc="You can define a regular
+ expression, or an array of regexps, which if matched, will link a string to
+ a ticket-tracking/bug-tracking system. The replacement is the second
+ argument to preg_replace(), so you can backreference anything you match in
+ the matching regexp. Example: <code class="nowrap">'|bug:?
+ #?(\d+)|i'</code>"/>
+ <configstring name="replacement" required="false" desc="Replacement
+ string. Example: <code class="nowrap">'&lt;a
+ href="http://bugs.example.com/show_bug.cgi?id=\1"&gt;\0&lt;/a&gt;'</code>"/>
+ </configsection>
+ </configtab>
+
+ <configtab name="options" desc="Look And Feel Configuration">
+ <configsection name="options">
+ <configheader>Look And Feel Configuration</configheader>
+ <configstring name="adminName" desc="The name displayed in the page footer.
+ This is generally the name of the repository
+ administrator.">Webmaster</configstring>
+ <configstring name="adminEmail" desc="The email address displayed in the
+ page footer.">root@example.com</configstring>
+ <configinteger name="shortLogLength" desc="In the directory view, a short
+ summary of the last logentry is shown. The value here determines how many
+ characters of this to show before truncating it, and appending '...' to
+ indicate there is more to show.">75</configinteger>
+ <configenum name="defaultsort" desc="In the directory view, set a default
+ sort order.">Horde_VC::SORT_NAME
+ <values>
+ <value desc="no sort">Horde_VC::SORT_NONE</value>
+ <value desc="sort by age">Horde_VC::SORT_AGE</value>
+ <value desc="sort by filename">Horde_VC::SORT_NAME</value>
+ <value desc="sort by revision number">Horde_VC::SORT_REV</value>
+ <value desc="sort by author name">Horde_VC::SORT_AUTHOR</value>
+ </values>
+ </configenum>
+ <configenum name="urls" desc="Does your web server support
+ mod_rewrite? If so, we can generate "pretty" URLs. If
+ not, pathnames will be propagated using a GET variable instead.">get
+ <values>
+ <value desc="GET (will always work)">get</value>
+ <value desc="mod_rewrite (pretty, shorter URLs)">rewrite</value>
+ </values>
+ </configenum>
+ </configsection>
+
+ <configlist name="restrictions" required="false" desc="If you wish to protect
+ a file pattern on a global basis (i.e. across all sourceroots defined in
+ sourceroots.php) list the perl-style regex file patterns in this array. For
+ example: <code class="nowrap">'^/?CVSROOT'</code>"/>
+
+ <configboolean name="hide_restricted" desc="If you wish to hide restricted
+ files from listings as well as protect their contents, check this option, and
+ restricted files will not be displayed in directory
+ lists.">true</configboolean>
+
+ <configenum name="filename_linkto" desc="When clicking on a file name in the browse view, should we show the revision log, or display the most recent revision? The opposite action will be available when clicking on the revision number.">revlog
+ <values>
+ <value desc="Revision Log">revlog</value>
+ <value desc="Most recent version">checkout</value>
+ </values>
+ </configenum>
+ </configtab>
+
+ <configtab name="menu" desc="Menu Settings">
+ <configsection name="menu">
+ <configheader>Menu Settings</configheader>
+ <configmultienum name="apps" desc="Select any applications that should be
+ linked in Chora's menu">
+ <values>
+ <configspecial name="list-horde-apps" />
+ </values>
+ </configmultienum>
+ </configsection>
+ </configtab>
+</configuration>
--- /dev/null
+# CvsGraph configuration
+#
+# - Empty lines and whitespace are ignored.
+#
+# - Comments start with '#' and everything until
+# end of line is ignored.
+#
+# - Strings are C-style strings in which characters
+# may be escaped with '\' and written in octal
+# and hex escapes. Note that '\' must be escaped
+# if it is to be entered as a character.
+#
+# - Some strings are expanded with printf like
+# conversions which start with '%'. Not all
+# are applicable at all times, in which case they
+# will expand to noting.
+# %c = cvsroot (with trailing '/')
+# %C = cvsroot (*without* trailing '/')
+# %m = module (with trailing '/')
+# %M = module (*without* trailing '/')
+# %f = filename without path
+# %F = filename without path and with ",v" stripped
+# %p = path part of filename (with trailing '/')
+# %r = number of revisions
+# %b = number of branches
+# %% = '%'
+# %R = the revision number (e.g. '1.2.4.4')
+# %P = previous revision number
+# %B = the branch number (e.g. '1.2.4')
+# %d = date of revision
+# %a = author of revision
+# %s = state of revision
+# %t = current tag of branch or revision
+# %0..%9 = command-line argument -0 .. -9
+#
+# - Numbers may be entered as octal, decimal or
+# hex as in 0117, 79 and 0x4f respectively.
+#
+# - Fonts are numbered 0..4 (defined as in libgd)
+# 0 = tiny
+# 1 = small
+# 2 = medium (bold)
+# 3 = large
+# 4 = giant
+#
+# - Colors are a string like html-type colors in
+# the form "#rrggbb" with parts written in hex
+# rr = red (00..ff)
+# gg = green (00-ff)
+# bb = blue (00-ff)
+#
+# - There are several reserved words besides of the
+# feature-keywords. These additional reserved words
+# expand to numerical values:
+# * false = 0
+# * true = 1
+# * left = 0
+# * center = 1
+# * right = 2
+# * gif = 0
+# * png = 1
+# * jpeg = 2
+# * tiny = 0
+# * small = 1
+# * medium = 2
+# * large = 3
+# * giant = 4
+
+# cvsroot <string>
+# The *absolute* base directory where the
+# CSV/RCS repository can be found
+# cvsmodule <string>
+#
+cvsroot = "";
+cvsmodule = "";
+
+# color_bg <color>
+# The background color of the image
+color_bg = "#ffffff";
+
+# date_format <string>
+# The strftime(3) format string for date and time
+date_format = "%d-%b-%Y %H:%M:%S";
+
+box_shadow = true;
+
+tag_font = medium;
+tag_color = "#333399";
+
+rev_font = giant;
+rev_color = "#000000";
+rev_bgcolor = "#e9e9e9";
+rev_separator = 1;
+rev_minline = 15;
+rev_maxline = 30;
+rev_lspace = 5;
+rev_rspace = 5;
+rev_tspace = 3;
+rev_bspace = 3;
+rev_text = "%d\n%a, %s"; # or "%d" for just the date
+rev_text_font = tiny;
+rev_text_color = "#000000";
+
+# branch_font <number>
+# The font of the number and tags
+# branch_color <color>
+# All branch element's color
+# branch_[lrtb]space <number>
+# Interior spacing (margin)
+# branch_margin <number>
+# Exterior spacing
+# branch_connect <number>
+# Length of the vertical connector
+branch_font = giant;
+branch_color = "#333399";
+branch_bgcolor = "#ffffff";
+branch_lspace = 5;
+branch_rspace = 5;
+branch_tspace = 3;
+branch_bspace = 3;
+branch_margin = 15;
+branch_connect = 8;
+
+# title <string>
+# The title string is expanded (see above for details)
+# title_[xy] <number>
+# Postion of title
+# title_font <number>
+# The font
+# title_align <number>
+# 0 = left
+# 1 = center
+# 2 = right
+# title_color <color>
+title = "%p%F\nRevisions: %r, Branches: %b";
+title_x = 10;
+title_y = 5;
+title_font = small;
+title_align = left;
+title_color = "#000000";
+
+# Margins of the image
+# Note: the title is outside the margin
+margin_top = 35;
+margin_bottom = 10;
+margin_left = 10;
+margin_right = 10;
+
+# Image format(s)
+# image_type <number|{gif,jpeg,png}>
+# gif (0) = Create gif image
+# png (1) = Create png image
+# jpeg (2) = Create jpeg image
+# Image types are available if they can be found in
+# the gd library. Newer versions of gd do not have
+# gif anymore. CvsGraph will automatically generate
+# png images instead.
+# image_quality <number>
+# The quality of a jpeg image (1..100)
+image_type = png;
+image_quality = 75;
+
+# HTML ImageMap generation
+# map_name <string>
+# The name= attribute in <map name="mapname">...</map>
+# map_branch_href <string>
+# map_branch_alt <string>
+# map_rev_href <string>
+# map_rev_alt <string>
+# map_diff_href <string>
+# map_diff_alt <string>
+# These are the href= and alt= attributes in the <area>
+# tags of html. The strings are expanded (see above).
+
+# Use the following setting for Chora
+# %0 = Argument Seperator
+# %1 = CVS Url
+# %2 = Diff Url
+# %3 = Checkout Url
+map_name = "graphMap";
+map_branch_href = "href=\"%1%0onb=%R\"";
+map_diff_href = "href=\"%2%0r1=%P%0r2=%R\"";
+map_rev_href = "href=\"%3%0r=%R\"";
+
+map_branch_alt = "alt=\"%t (%B)\"";
+map_rev_alt = "alt=\"%t (%R)\"";
+map_diff_alt = "alt=\"%P <-> %R\"";
--- /dev/null
+<p>This is a web interface to the CVS tree. You can browse the file hierarchy
+by picking directories. If you pick a file, you will see the revision history
+for that file. Selecting a revision number will download that revision of the
+file. There is a link at each revision to display diffs between that revision
+and the previous one, and a form at the bottom of the page that allows you to
+display diffs between arbitrary revisions.</p>
--- /dev/null
+<?php
+/**
+ * Decide which output drivers you want to activate for the Chora application.
+ *
+ * The avilable drivers are:
+ * -------------------------
+ * NO CHORA SPECIFIC DRIVERS
+ */
+$mime_drivers_map['chora']['registered'] = array();
+
+/**
+ * If you want to specifically override any MIME type to be handled by
+ * a specific driver, then enter it here. Normally, this is safe to
+ * leave, but it's useful when multiple drivers handle the same MIME
+ * type, and you want to specify exactly which one should handle it.
+ */
+$mime_drivers_map['chora']['overrides'] = array();
+
+/**
+ * Driver specific settings. See horde/config/mime_drivers.php for
+ * the format.
+ */
+$mime_drivers['horde']['enscript']['handles'][] = 'text/html';
--- /dev/null
+<?php
+/**
+ * See horde/config/prefs.php for documentation on the structure of this file.
+ */
+
+$prefGroups['logintasks'] = array(
+ 'column' => _("Other Options"),
+ 'label' => _("Login Tasks"),
+ 'desc' => _("Customize tasks to run upon logging in to Chora."),
+ 'members' => array('remember_last_file')
+);
+
+// last browse file/directory
+$_prefs['last_file'] = array(
+ 'value' => 0,
+ 'locked' => false,
+ 'shared' => false,
+ 'type' => 'implicit'
+);
+
+// last sourceroot used
+$_prefs['last_sourceroot'] = array(
+ 'value' => 0,
+ 'locked' => false,
+ 'shared' => false,
+ 'type' => 'implicit'
+);
+
+// show the last login time of user
+$_prefs['remember_last_file'] = array(
+ 'value' => 1,
+ 'locked' => false,
+ 'shared' => false,
+ 'type' => 'checkbox',
+ 'desc' => _("Use last viewed file or directory at login time")
+);
--- /dev/null
+<?php
+/**
+ * This file contains all the configuration information for the
+ * various CVS repositories that you wish to display. You should have
+ * a minimum of one entry here! The following fields are allowed in
+ * the description, and those with a [M] are Mandatory, and should not
+ * be left out.
+ *
+ * 'name' [M] : Short name for the repository.
+ *
+ * 'location' [M] : Location on the filesystem of the repository.
+ *
+ * 'title' [M] : Long title for the repository.
+ *
+ * 'type' [M] : Indicates software used, either 'cvs' or 'svn'.
+ *
+ * 'default' : To make that repository the default one to show.
+ *
+ * 'intro' : File which contains some introductory text to show
+ * on the front page of this repository. This file is
+ * located in the config/ directory.
+ *
+ * 'cvsusers' : A list of all committers with real names and email
+ * addresses, that normally sits in the CVSROOT/cvsusers
+ * file. If it is found, then more useful information
+ * will be shown.
+ *
+ * 'restrictions' : Array of perl-style regular expressions for those files
+ * whose contents should be protected and not displayed.
+ *
+ * 'username' : Username to use for the repository (only for Subversion
+ * repositories that require authentication).
+ *
+ * 'password' : Password to use for the repository (only for Subversion
+ * repositories that require authentication).
+ */
+
+$sourceroots['localcvs'] = array(
+ 'name' => 'CVS',
+ 'location' => '/home/cvs/root',
+ 'title' => 'CVS Repository',
+ 'cvsusers' => 'CVSROOT/cvsusers',
+ 'type' => 'cvs',
+);
+
+$sourceroots['subversion'] = array(
+ 'name' => 'Subversion',
+ 'location' => 'http://svn.collab.net/repos/svn',
+ 'title' => 'A Compelling Replacement for CVS',
+ 'type' => 'svn'
+);
+
+$sourceroots['localsvn'] = array(
+ 'name' => 'MySVNProj',
+ 'location' => 'file:///svndata/subvn',
+ 'title' => 'Main Subversion Repos',
+ 'type' => 'svn',
+);
+
+$sourceroots['git'] = array(
+ 'name' => 'Git',
+ 'location' => '/path/to/git/repo
+ 'title' => 'Git repository',
+ 'type' => 'git',
+);
--- /dev/null
+<?php
+/**
+ * Wrapper for CVSGraph.
+ *
+ * Copyright 1999-2008 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (GPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
+ *
+ * @author Anil Madhavapeddy <anil@recoil.org>
+ * @author Chuck Hagenbuch <chuck@horde.org>
+ * @package Chora
+ */
+
+require_once dirname(__FILE__) . '/lib/base.php';
+
+// Exit if cvsgraph isn't active or it's not supported.
+if (empty($conf['paths']['cvsgraph']) || is_a($VC, 'VC_svn')) {
+ header('Location: ' . Chora::url('', $where));
+ exit;
+}
+
+if (!is_file($fullname . ',v')) {
+ Chora::fatal(sprintf(_("%s: no such file or directory"), $where), '404 Not Found');
+}
+
+$root = escapeShellCmd($VC->sourceroot());
+$file = escapeShellCmd($where . ',v');
+
+if (Util::getFormData('show_image')) {
+ // Pipe out the actual image.
+ $args = array('c' => $conf['paths']['cvsgraph_conf'],
+ 'r' => $root);
+
+ // Build up the argument string.
+ $argstr = '';
+ if (!strncasecmp(PHP_OS, 'WIN', 3)) {
+ foreach ($args as $key => $val) {
+ $argstr .= "-$key \"$val\" ";
+ }
+ } else {
+ foreach ($args as $key => $val) {
+ $argstr .= "-$key '$val' ";
+ }
+ }
+
+ header('Content-Type: image/png');
+ passthru($conf['paths']['cvsgraph'] . ' ' . $argstr . ' ' . $file);
+} else {
+ // Display the wrapper page for the image.
+ $title = sprintf(_("Graph for %s"), Text::htmlAllSpaces($where));
+ $extraLink = Chora::getFileViews();
+
+ require CHORA_TEMPLATES . '/common-header.inc';
+ require CHORA_TEMPLATES . '/menu.inc';
+ require CHORA_TEMPLATES . '/headerbar.inc';
+
+ $imgUrl = Chora::url('cvsgraph', $where, array('show_image' => 1));
+
+ $args = array('c' => $conf['paths']['cvsgraph_conf'],
+ 'M' => 'graphMap',
+ 'r' => $root,
+ '0' => '&',
+ '1' => Chora::url('', $where, array('dummy' => 'true')),
+ '2' => Chora::url('diff', $where, array('dummy' =>'true')),
+ '3' => Chora::url('co', $where, array('dummy' => 'true')),
+ );
+
+ // Build up the argument string.
+ $argstr = '';
+ if (!strncasecmp(PHP_OS, 'WIN', 3)) {
+ foreach ($args as $key => $val) {
+ $argstr .= "-$key \"$val\" ";
+ }
+ } else {
+ foreach ($args as $key => $val) {
+ $argstr .= "-$key '$val' ";
+ }
+ }
+
+ // Generate the imagemap.
+ $map = shell_exec($conf['paths']['cvsgraph'] . ' ' . $argstr . ' -i ' . $file);
+
+ require CHORA_TEMPLATES . '/cvsgraph/cvsgraph.inc';
+ require $registry->get('templates', 'horde') . '/common-footer.inc';
+}
--- /dev/null
+<?php
+/**
+ * Copyright 2000-2008 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (GPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
+ *
+ * @author Anil Madhavapeddy <avsm@horde.org>
+ * @package Chora
+ */
+
+require_once dirname(__FILE__) . '/lib/base.php';
+
+/* Spawn the repository and file objects */
+$fl = $VC->getFileObject($where, $cache);
+Chora::checkError($fl);
+
+/* Initialise the form variables correctly. */
+$r1 = Util::getFormData('r1');
+$r2 = Util::getFormData('r2');
+
+/* If we are in a SVN repository (or another VC system that doesn't
+ * always use consecutive revision numbers from change-to-change
+ * per-file) and we compare against an older version that does not
+ * exist, then we search for the newest version older than the given
+ * old version. */
+if (!isset($fl->logs[$r1]) && isset($fl->logs[$r2]) && $r1 < $r2) {
+ $rn = 0;
+ foreach (array_keys($fl->logs) as $r) {
+ if ($r > $rn && $r < $r1) {
+ $rn = $r;
+ }
+ }
+ if ($rn) {
+ $r1 = $rn;
+ }
+}
+
+/* Ensure that we have valid revision numbers. */
+if (!$VC->isValidRevision($r1) || !$VC->isValidRevision($r2)) {
+ Chora::fatal(_("Malformed Query"), '500 Internal Server Error');
+}
+
+/* If no type has been specified, then default to human readable. */
+$type = Util::getFormData('t', 'colored');
+if (Util::getFormData('ty') == 'u') {
+ $type = 'unified';
+}
+
+/* Unless otherwise specified, show whitespace differences and 3 lines
+ * of context. */
+$ws = Util::getFormData('ws', 1);
+$num = (int)Util::getFormData('num', 3);
+
+/* Cache the output of the diff for a week - it can be longer, since
+ * it should never change. */
+header('Cache-Control: max-age=604800');
+
+/* All is ok, proceed with the diff. Always make sure there is a newline at
+ * the end of the file - patch requires it. */
+if ($type != 'colored') {
+ header('Content-Type: text/plain');
+ echo implode("\n", $VC->getDiff($fl, $r1, $r2, $type, $num, $ws)) . "\n";
+ exit;
+}
+
+/* Human-Readable diff. */
+$title = sprintf(_("Diff for %s between version %s and %s"),
+ Text::htmlallspaces($where), $r1, $r2);
+
+/* Format log entries. */
+$log = &$fl->logs;
+$log_messages = array();
+$range = $VC->getRevisionRange($fl, $r1, $r2);
+foreach ($range as $val) {
+ list($branchname, $branchrev) = Chora::getBranch($fl, $val);
+ if (isset($log[$val])) {
+ $clog = &$log[$val];
+ $log_messages[] = array(
+ 'rev' => $val,
+ 'msg' => Chora::formatLogMessage($clog->queryLog()),
+ 'author' => Chora::showAuthorName($clog->queryAuthor(), true),
+ 'branchRev' => $branchrev,
+ 'branchName' => $branchname,
+ 'date' => Chora::formatDate($clog->queryDate()),
+ 'tags' => Chora::getTags($clog, $where),
+ );
+ }
+}
+
+/* Get list of diff types. */
+$diff_types = array_flip($VC->availableDiffTypes());
+
+Horde::addScriptFile('prototype.js', 'horde', true);
+Horde::addScriptFile('stripe.js', 'horde', true);
+require CHORA_TEMPLATES . '/common-header.inc';
+require CHORA_TEMPLATES . '/menu.inc';
+require CHORA_TEMPLATES . '/headerbar.inc';
+require CHORA_TEMPLATES . '/diff/hr/header.inc';
+
+$mime_type = Horde_Mime_Magic::filenameToMIME($fullname);
+if (substr($mime_type, 0, 6) == 'image/') {
+ /* Check for images. */
+ $url1 = Chora::url('co', $where, array('r' => $r1, 'p' => 1));
+ $url2 = Chora::url('co', $where, array('r' => $r2, 'p' => 1));
+
+ echo "<tr><td><img src=\"$url1\" alt=\"" . htmlspecialchars($r1) . '" /></td>' .
+ "<td><img src=\"$url2\" alt=\"" . htmlspecialchars($r2) . '" /></td></tr>';
+} else {
+ /* Retrieve the tree of changes. */
+ $lns = VC_Diff::humanReadable($VC->getDiff($fl, $r1, $r2, 'unified', $num, $ws));
+ if (!$lns) {
+ /* Is the diff empty? */
+ require CHORA_TEMPLATES . '/diff/hr/nochange.inc';
+ } else {
+ /* Iterate through every header block of changes. */
+ foreach ($lns as $header) {
+ $lefthead = $header['oldline'];
+ $righthead = $header['newline'];
+ require CHORA_TEMPLATES . '/diff/hr/row.inc';
+
+ /* Each header block consists of a number of changes
+ * (add, remove, change). */
+ $curContext = '';
+ foreach ($header['contents'] as $change) {
+ if (!empty($curContext) && $change['type'] != 'empty') {
+ $line = $curContext;
+ $curContext = '';
+ require CHORA_TEMPLATES . '/diff/hr/empty.inc';
+ }
+
+ switch ($change['type']) {
+ case 'add':
+ $line = '';
+ foreach ($change['lines'] as $l) {
+ $line .= htmlspecialchars($l) . '<br />';
+ }
+ require CHORA_TEMPLATES . '/diff/hr/add.inc';
+ break;
+
+ case 'remove':
+ $line = '';
+ foreach ($change['lines'] as $l) {
+ $line .= htmlspecialchars($l) . '<br />';
+ }
+ require CHORA_TEMPLATES . '/diff/hr/remove.inc';
+ break;
+
+ case 'empty':
+ $curContext .= htmlspecialchars($change['line']) . '<br />';
+ break;
+
+ case 'change':
+ /* Pop the old/new stacks one by one, until both are
+ * empty. */
+ $oldsize = count($change['old']);
+ $newsize = count($change['new']);
+ $left = $right = '';
+ for ($row = 0, $rowMax = max($oldsize, $newsize); $row < $rowMax; ++$row) {
+ $left .= isset($change['old'][$row]) ? htmlspecialchars($change['old'][$row]) : '';
+ $left .= '<br />';
+ $right .= isset($change['new'][$row]) ? htmlspecialchars($change['new'][$row]) : '';
+ $right .= '<br />';
+ }
+ require CHORA_TEMPLATES . '/diff/hr/change.inc';
+ break;
+ }
+ }
+
+ if (!empty($curContext)) {
+ $line = $curContext;
+ $curContext = '';
+ require CHORA_TEMPLATES . '/diff/hr/empty.inc';
+ }
+ }
+ }
+}
+
+require CHORA_TEMPLATES . '/diff/hr/footer.inc';
+require $registry->get('templates', 'horde') . '/common-footer.inc';
--- /dev/null
+--------
+v2.1-cvs
+--------
+
+[jan] Add Italian translation (Fabio Pedretti <fabio.pedretti@ing.unibs.it>).
+[cjh] Allow configuring which views the file name and latest revision number
+ link to (jon@spriggs.org.uk, Request #6690).
+[mms] Add log entries to diff screen (Request #6193).
+[cjh] Apply fix for http://dev.rubyonrails.org/ticket/11473 to prototype.js
+ (Request #6590).
+[cjh] With Horde 3.2+, a username and password can be supplied for
+ authenticating to Subversion repositories (duck@obala.net,
+ Request #5958).
+[cjh] Use a dropdown list to show alternate code repositories
+ (greg_swift@aotx.uscourts.gov, Request #5600).
+[cjh] Add the ability to walk backwards to the next oldest revision when
+ diffing on a VC system where the revision numbers of a single file
+ are not always consecutive (helly@php.net, Request #5350).
+[jan] Add configuration to specify temporary directory for SVN (requires Horde
+ 3.2, meyer@mesw.de, Request #5051).
+[cjh] Include a link to the previous revision in annotation views
+ (Request #197).
+[cjh] Make the revision log searchable and sortable.
+[cjh] Only show the 100 latest revisions by default (Bug #2584).
+[cjh] Show commit logs when hovering on the revision number in the
+ annotate view (robzilla@siklos.ca, Bug #3076).
+[cjh] Simplify codepaths by supporting only GET or mod_rewrite URLs.
+[jan] Add permissions per repository (ben@alkaloid.net, Request #3186).
+[cjh] Add support for dynamic re-sorting of file lists.
+[mas] Change any output of <b> and <i> tags to <strong> and <em> for better
+ accessibility support.
+
+
+----------
+v2.0.3-cvs
+----------
+
+
+
+------
+v2.0.2
+------
+
+[jan] Add Danish translation (Brian Truelsen <horde+i18n@briantruelsen.dk>).
+[cjh] Sort patchsets in reverse order to match commit logs (Bug #2778).
+
+
+------
+v2.0.1
+------
+
+[jan] Add Russian translation (Illya Belov <belov@iop.irkps.ru>).
+[jan] Add shortcut icon (favicon.ico).
+[cjh] Use strpos() for Content-Type checks to avoid problems matching due to
+ the charset being included (Bug #1273).
+
+
+----
+v2.0
+----
+
+[jan] Add Slovak translation (Ivan Noris <vix@vazka.sk>).
+
+
+--------
+v2.0-RC3
+--------
+
+[jan] Updated installation instructions.
+
+
+--------
+v2.0-RC2
+--------
+
+[cjh] Fix links back to the original (default) repository.
+
+
+--------
+v2.0-RC1
+--------
+
+[cjh] Remove unecessary dependency on PEAR.php.
+
+
+---------
+v2.0-BETA
+---------
+
+[cjh] Close a potential hole in diffs that would allow malicious input.
+[cjh] We now support mod_rewrite style URLs in addition to GET and PATH_INFO.
+[jan] Add access keys.
+
+
+----------
+v2.0-ALPHA
+----------
+
+[cjh] CVSLib and SVNLib are no longer part of Chora; they are part of the
+ new Horde VC:: package.
+[cjh] Subversion repositories can now be specified as URLs, meaning non-local
+ repositories should work transparently
+ ("Jay Freeman (saurik)" <saurik@saurik.com>).
+[cjh] Chora isn't just CVS now. Initial commit of Subversion support
+ ("Jay Freeman (saurik)" <saurik@saurik.com>).
+[jan] Line numbers in the annotate view are linked now. Example:
+ http://cvs.example.com/annotate.php/module/file.txt?rev=1.10#42
+[cjh] Add admin-defined regular expression/replacement patterns for linking
+ to bug-tracking or other systems.
+[cjh] Add support for cvsgraph - generates graphical representations of
+ file histories with links to each revision and diffs between
+ adjacent revisions.
+[cjh] Add support for cvsps - viewing of changes as whole commits,
+ instead of discrete changes to files.
+[cjh] Finally get most setup code into functions in the Chora:: class.
+[avsm] Add in a basic statistics graph for a single RCS file.
+[cjh] Moved the text MIME_Viewer to Horde, since it doesn't provide anything
+ local to Chora. Remove related settings from mime_drivers.php.dist.
+[cjh] Use Horde::compressOutput() for output compression.
+[jon] Adapt to the new Horde::img() syntax.
+[cjh] Use $registry->get() for all Registry information.
+
+
+------
+v1.2.3
+------
+
+[jan] Close XSS when setting the parent frame's page title by javascript (cjh).
+[jan] Fix wrong escaped slashes when creating diffs on Windows systems
+ (mike001@giga.net.tw>).
+
+
+------
+v1.2.2
+------
+
+[cjh] Close a potential hole in diffs that would allow malicious input.
+[jan] Fix annotating on systems that allow whitespace in user names (Gordon
+ P. Hemsley <gphemsley@users.sourceforge.net>).
+
+
+------
+v1.2.1
+------
+
+[jan] Fix sorting by date on systems that allow whitespace in user names
+ (Gordon P. Hemsley <gphemsley@users.sourceforge.net>).
+
+
+----------
+v1.2.1-RC1
+----------
+
+[jan] Add Simplified Chinese translation (liaobin <liaobin@jite.net>).
+[jan] Add Romanian translation (Eugen Hoanca <eugenh@urban-grafx.ro>,
+ Marius Dragulescu <mariusd@urban-grafx.ro>).
+[jan] Add Traditional Chinese translation (Lin Zhemin <ljm@ljm.idv.tw>).
+
+
+----
+v1.2
+----
+
+[jan] Add Finnish translation (Tero Matinlassi <tero.matinlassi@edu.vantaa.fi>).
+[cjh] Add an option to hide restricted files (John Morrissey <jwm@horde.net>).
+[cjh] Close several small XSS vulnerabilities
+ (Mitja Kolsek <mitja.kolsek@acros.si>).
+[jan] Several speedup optimizations (ilia@prohost.org).
+[jan] Have a prettier error page using the Notification class (avsm).
+[jan] Don't store bad filenames and CVSROOTs in the user preferences (avsm).
+[jan] More flexible date parsing from <cholland@lucent.com> (avsm).
+[jan] Fix annotation parsing with recent versions of CVS (avsm).
+[jon] Lots more, and smarter, caching - should help speed (cjh).
+[jan] Add routine to display images side-by-side in a more or less human
+ readable fashion (ejr).
+[jan] Display the author and commit date as part of the checkout header (jon).
+[jan] Add Chora::toHTML().
+[jan] Add menu system and prefs file as per other horde apps, add help file (ejr).
+[jan] Replace <?= with <?php echo to remove the short_open_tags requirement (cjh).
+[jan] Show links to view, annotate and download files in the annotate and view
+ pages.
+[jan] Show line numbers in the annotate view.
+[jan] Fix double-login bug (cjh).
+[jan] Fix file listing bug (Ahmed <ashihab@alcahest.com>).
+[jan] Use 'rb' with filesystem calls in case of windows.
+
+
+----
+v1.0
+----
+
+[cjh] Add preference for remembering the last cvsroot and last file
+ visited (Mathieu CLABAUT <mathieu.clabaut@free.fr>).
+[cjh] Fix GMT date issues.
+[jon] Closed some cross-site scripting vulnerabilities (shh@thathost.com).
+[cjh] Switch output compression to ob_gzhandler().
+[cjh] Use CHORA_TEMPLATES constant for all template paths.
+[cjh] Use $registry->get() for all Registry information.
+[max] Add support to not display restricted files.
+[cjh] Close a potential problem with register_globals On and $js_onLoad.
+[avsm] Avoid a cross-site scripting vulnerability.
+[jan] Add Polish translation (Piotr Roszatycki <Piotr_Roszatycki@netia.net.pl>).
+[jan] Add Norwegian Bookmal translation (Oystein Steimler <oystein@rexta.net>).
+[avsm] Add .htaccess files to deny access to data directories.
+[jan] Add Brazilian Portugues translation (Antonio Dias <accdias@sst.com.br>).
+[jan] Add Swedish translation (Andreas Dahlén <andreas@dahlen.ws>).
+
+
+----------
+v0.6.5-dev
+----------
+
+[avsm] Diff selection from the log view.
+ (Mathieu Arnold <mat@mat.cc>)
+[avsm] Improve cvsusers parsing for varied email addresses.
+[avsm] Use the Horde Cache in the file log view to speed
+ things up.
+
+
+----------
+v0.6.2-dev
+----------
+
+[avsm] Fold the global url() function into Chora::url().
+[avsm] Move lots of global functions into the Chora class.
+[avsm] New 'use_path_info' option to toggle PATH_INFO use.
+[avsm] New URL syntax that sends the path via a GET var.
+[avsm] No longer depend on having PATH_INFO available.
+[cjh] Add Czech translation (pchytil@asp.ogi.edu).
+[avsm] Increase speed by making CVSLib use references.
+[avsm] Add a Vary header to indicate language negotiation.
+[avsm] Replace Chora::img() with Horde::img().
+[avsm] Colour-code blocks of changes in the annotate view.
+[cjh] Default to the HEAD revision in co.php (Cynic <cynic@mail.cz>).
+[avsm] Complete i8nl support by using the Horde framework.
+[avsm] Add Cache-Control headers for diff/checkout output.
+[avsm] Begin internationalising Chora using gettext wrappers.
+[avsm] Show the log message in checkouts and human-readable diffs.
+[avsm] XHTML fixes (remote repeated border attributes)
+[avsm] Replace $conf['paths'] with the $registry equivalents.
+[avsm] Remove the global graphic() function and use Chora::img()
+[avsm] Convert to the new MIME_Viewer API which allows Chora to
+ have a local MIME driver for text/plain. Currently, it
+ does URL syntax-highlighting.
+
+
+----------
+v0.4-dev
+----------
+
+[avsm] Cache the checkout of a file for a month.
+[avsm] Rename checkout.php to co.php for shorter URLs.
+[avsm] Fix the branch code up significantly, and show in the log view.
+[avsm] Log view UI tweaks, and allow downloading as well as viewing.
+[avsm] Support multiple branchpoints in CVSLib, and rearrange a
+ function from CVSLib_Log to CVSLib_Rev.
+[avsm] Get rid of config/mime.php in favour of the Horde MIME stuff.
+[avsm] Use the Horde MIME_Viewer icon support.
+[avsm] Add a getExtension() utility function to CVSLib_File.
+[avsm] Fix directory sorting when deleted files are displayed.
+[avsm] Work better with register_globals = off now.
+[avsm] Output compression option, using PEAR's HTTP_Compress.
+[avsm] Use the MIME_Viewer framework to pretty-print files.
+[avsm] Move template files into their own sub-directories.
+[cjh] Start using the Horde framework and complying more with
+ CODING_STANDARDS.
+[cjh] A number of fixes for files and directories with spaces in their
+ names (Mathieu Arnold <mat@mat.cc>).
+[cjh] Add long unified diff option (Mathieu Arnold
+ <mat@mat.cc>).
+[cjh] Add default sort direction configuration option (Mathieu Arnold
+ <mat@mat.cc>).
+[cjh] Fix bug with Chora in the webroot (http://cvs.example.com/).
+[avsm] Overhaul CVSLib_Checkout interface to be in line with
+ the rest of the CVSLib_* API (and much simpler).
+
+
+----------
+v0.2-dev
+----------
+
+[avsm] No longer depend on having Apache icons in /icons.
+[avsm] Switch over diff logic to the new CVSLib_Diff API.
+[avsm] Start to comply with Horde standards,and add lib/Chora.php.
+[avsm] Start the human-readable API change in CVSLib_Diff.
+[cjh] Capitalize classes according to standards.
+[avsm] CVS Annotate support, to view which authors modified
+ which sections of a file.
+[avsm] Added queryModulePath() to CVSLib_file.
+
+
+----------
+v0.1-dev
+----------
+
+[avsm] Multiple repository support, in the form of cvsroots.php.
+[avsm] New config variable $conf['paths']['cvsusers'] to control
+ the location of the cvsusers file if it isnt in CVSROOT.
+[avsm] Add support for parsing the cvsusers file if present.
+[avsm] Add a CHANGES and a GOALS file with the new version.
--- /dev/null
+========================
+ Chora Development Team
+========================
+
+Based on an perl script written by Bill Fenner <fenner@parc.xerox.com>, and
+Human-Readable diff code by H. Zeller <zeller@think.de>
+
+Charles Hagenbuch <chuck@horde.org> then did the initial port from perl to
+PHP.
+
+Anil Madhavapeddy <anil@recoil.org> cleaned it up, added template support,
+figured it needed a rewrite. And thus came along the CVSLib library and the
+current incarnation of the viewer.
+
+Inspiration for the annotation portions came from examining Bill Fenner's
+original cvsweb script again, and looking at the 'cvs server' implementation.
+
+Initial Subversion support was written by "Jay Freeman (saurik)"
+<saurik@saurik.com>.
+
+
+Localization
+============
+
+===================== ======================================================
+Brazilian Portuguese Antonio Dias <accdias@sst.com.br>
+ garnier@hmg.click21.com.br
+Chinese (Simplified) Liaobin <liaobin@jite.net>
+Chinese (Traditional) Lin Zhemin <ljm@ljm.idv.tw>
+Czech Pavel Chytil <paja@asp.ogi.edu>
+Danish Brian Truelsen <horde+i18n@briantruelsen.dk>
+Dutch Jan Kuipers <jrkuipers@lauwerscollege.nl>
+Finnish Tero Matinlassi <tero.matinlassi@edu.vantaa.fi>
+ Leena Heino <leena.heino@uta.fi>
+French Mathieu Arnold <mat@absolight.net>
+German Jan Schneider <jan@horde.org>
+Italian Fabio Pedretti <fabio.pedretti@ing.unibs.it>
+Norwegian Bokmaal Oystein Steimler <oystein@rexta.net>
+Polish Piotr Roszatycki <Piotr_Roszatycki@netia.net.pl>
+Romanian Eugen Hoanca <eugenh@urban-grafx.ro>
+ Marius Dragulescu <mariusd@urban-grafx.ro>
+Russian Illya Belov <belov@iop.irkps.ru>
+Slovak Ivan Noris <vix@vazka.sk>
+Spanish Julian Jares <jjares@techie.com>
+ Manuel Perez Ayala <mperaya@alcazaba.unex.es>
+Swedish Andreas Dahlén <andreas@dahlen.ws>
+===================== ======================================================
--- /dev/null
+==================
+ Installing Chora
+==================
+
+:Contact: chora@lists.horde.org
+
+.. contents:: Contents
+.. section-numbering::
+
+
+This document contains instructions for installing the Chora Repository Viewer
+on your system.
+
+For information on the capabilities and features of Chora, see the file
+README_ in the top-level directory of the Chora distribution.
+
+
+Obtaining Chora
+===============
+
+Chora can be obtained from the Horde website and FTP server, at
+
+ http://www.horde.org/chora/
+
+ ftp://ftp.horde.org/pub/chora/
+
+Bleeding-edge development versions of Chora are available via CVS; see the
+file `docs/HACKING`_ in the Horde distribution for information on accessing
+the Horde CVS repository.
+
+
+Prerequisites
+=============
+
+To function properly, Chora requires the following:
+
+1. A working Horde installation.
+
+ Chora runs within the `Horde Application Framework`_, a set of common tools
+ for Web applications written in PHP. You must install Horde before
+ installing Chora.
+
+ .. _`Horde Application Framework`: http://www.horde.org/horde/
+
+ The Horde Framework can be obtained from the Horde website and FTP server,
+ at
+
+ http://www.horde.org/horde/
+
+ ftp://ftp.horde.org/pub/horde/
+
+ Many of Chora's prerequisites are also Horde prerequisites. Be sure to
+ have completed all of the steps in the INSTALL_ file for the Horde
+ Framework before installing Chora.
+
+2. SVN, CVS or RCS repositories to view.
+
+ Chora can display any number of local CVS and RCS repositories, as well as
+ local and remote SVN repositories. Chora does **not** work on CVS
+ **checkouts**. The user under which the web server is running needs read
+ access to the repositories.
+
+3. SVN, CVS and RCS binaries.
+
+ Depending on which kind of repositories you want to use, you need SVN
+ (http://subversion.tigris.org/) and RCS/CVS (http://www.cvshome.org/)
+ binaries.
+
+
+Installing Chora
+================
+
+Chora is written in PHP, and must be installed in a web-accessible directory.
+The precise location of this directory will differ from system to system.
+Conventionally, Chora is installed directly underneath Horde in the
+webserver's document tree.
+
+Since Chora is written in PHP, there is no compilation necessary; simply
+expand the distribution where you want it to reside and rename the root
+directory of the distribution to whatever you wish to appear in the URL. For
+example, with the Apache webserver's default document root of
+``/usr/local/apache/htdocs``, you would type::
+
+ cd /usr/local/apache/htdocs/horde
+ tar zxvf /path/to/chora-x.y.z.tar.gz
+ mv chora-x.y.z chora
+
+and would then find Chora at the URL::
+
+ http://your-server/horde/chora/
+
+
+Configuring Chora
+=================
+
+1. Configuring Horde for Chora
+
+ a. Register the application
+
+ In ``horde/config/registry.php``, find the ``applications['chora']``
+ stanza. The default settings here should be okay, but you can change
+ them if desired. If you have changed the location of Chora relative to
+ Horde, either in the URL, in the filesystem or both, you must update the
+ ``fileroot`` and ``webroot`` settings to their correct values.
+
+2. Configuring Chora
+
+ To configure Chora, change to the ``config/`` directory of the installed
+ distribution, and make copies of all of the configuration ``dist`` files
+ without the ``dist`` suffix::
+
+ cd config/
+ for foo in *.dist; do cp $foo `basename $foo .dist`; done
+
+ Documentation on the format of those files can be found in each file. With
+ the exception of the ``conf.*`` (see below) and ``sourceroots.php`` files,
+ the other files in ``config/`` need only be modified if you wish to
+ customize Chora's appearance or behavior, as the defaults will be correct
+ for most sites.
+
+ You must be sure to list your repository names and configuration
+ information in ``sourceroots.php``.
+
+ You must login to Horde as a Horde Administrator to finish the
+ configuration of Chora. Use the Horde ``Administration`` menu item to get
+ to the administration page, and then click on the ``Configuration`` icon to
+ get the configuration page. Select ``Version Control`` from the selection
+ list of applications. Fill in or change any configuration values as
+ needed. When done click on ``Generate Version Control Configuration`` to
+ generate the ``conf.php`` file. If your web server doesn't have write
+ permissions to the Chora configuration directory or file, it will not be
+ able to write the file. In this case, go back to ``Configuration`` and
+ choose one of the other methods to create the configuration file
+ ``chora/config/conf.php``.
+
+ Note for international users: Chora uses GNU gettext to provide local
+ translations of text displayed by applications; the translations are found
+ in the po/ directory. If a translation is not yet available for your
+ locale (and you wish to create one), see the ``horde/po/README`` file, or
+ if you're having trouble using a provided translation, please see the
+ `horde/docs/TRANSLATIONS`_ file for instructions.
+
+4. Testing Chora
+
+ Go to the Chora URL, and test out all the functionality to ensure it is
+ working.
+
+ If you run into a problem with annotationsin CVS repositories, it is
+ because some versions of CVS insist on having the ``CVSROOT/history`` file
+ as world-writable. Either make this file world-writable, or simply delete
+ it (you don't need to have it for CVS to work).
+
+
+Obtaining Support
+=================
+
+If you encounter problems with Chora, help is available!
+
+The Horde Frequently Asked Questions List (FAQ), available on the Web at
+
+ http://www.horde.org/faq/
+
+The Horde Project runs a number of mailing lists, for individual applications
+and for issues relating to the project as a whole. Information, archives, and
+subscription information can be found at
+
+ http://www.horde.org/mail/
+
+Lastly, Horde developers, contributors and users may also be found on IRC,
+on the channel #horde on the Freenode Network (irc.freenode.net).
+
+Please keep in mind that Chora is free software written by volunteers. For
+information on reasonable support expectations, please read
+
+ http://www.horde.org/support.php
+
+Thanks for using Chora!
+
+The Horde team
+
+
+.. _README: ?f=README.html
+.. _`docs/HACKING`: ../../horde/docs/?f=HACKING.html
+.. _INSTALL:
+.. _`horde/docs/INSTALL`: ../../horde/docs/?f=INSTALL.html
+.. _`horde/docs/TRANSLATIONS`: ../../horde/docs/?f=TRANSLATIONS.html
--- /dev/null
+<?php
+/**
+ * Release focus. Possible values:
+ * 0 - N/A
+ * 1 - Initial freshmeat announcement
+ * 2 - Documentation
+ * 3 - Code cleanup
+ * 4 - Minor feature enhancements
+ * 5 - Major feature enhancements
+ * 6 - Minor bugfixes
+ * 7 - Major bugfixes
+ * 8 - Minor security fixes
+ * 9 - Major security fixes
+ */
+$this->notes['fm']['focus'] = 5;
+
+/* Mailing list release notes. */
+$this->notes['ml']['changes'] = <<<ML
+The Horde Team is pleased to announce the final release of the Chora
+Repository Viewer version H3 (2.0).
+
+Chora is built upon the Horde Application Framework and provides a read-only
+browser interface to any number of version control repositories. Advanced
+features include a visual branch view of the repository's history,
+pretty-printed output, annotation, patchsets and basic statistics.
+
+The major changes compared to the Chora 1.x versions are:
+ * Subversion support
+ * Patchset information
+ * Cvsgraph integration
+ * Simple commit statistics
+ * Access keys.
+ * mod_rewrite support for prettier URLs.
+ML;
+
+/* Freshmeat release notes. */
+$this->notes['fm']['changes'] = <<<FM
+Subversion support and patchset information have been added.
+Cvsgraph has been integrated for grahpical tree views.
+Simple commit statistics have been added.
+Access keys have been added.
+mod_rewrite support has been added for prettier URLs.
+FM;
+
+$this->notes['name'] = 'Chora';
+$this->notes['fm']['project'] = 'chora';
+$this->notes['fm']['branch'] = 'Horde 3';
--- /dev/null
+=============================
+ Chora Development TODO List
+=============================
+
+:Contact: chora@lists.horde.org
+
+- Other utility support (lint support for C files, pod2html for perl, PHPDoc
+ for PHP).
+
+- Provide compressed versions of files/directories on a given tag, for
+ downloading.
+
+- Provide a database and caching backend for advanced searching.
+
+- Generate per-directory and per-repository visual branch views, instead of
+ only per-file.
+
+- CVS search: http://cvssearch.sourceforge.net/
+
+- Stats: http://sourceforge.net/projects/statcvs/
+
+- Feature ideas: http://www.cenqua.com/fisheye/features.html
--- /dev/null
+<?php
+/**
+ * Copyright 2000-2008 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (GPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
+ *
+ * @author Anil Madhavapeddy <avsm@horde.org>
+ * @package Chora
+ */
+
+require_once dirname(__FILE__) . '/lib/base.php';
+
+/* Exit if it's not supported. */
+if (is_a($VC, 'VC_svn')) {
+ header('Location: ' . Chora::url('browse', $where));
+ exit;
+}
+
+/* Spawn the file object. */
+$fl = $VC->getFileObject($where, $cache);
+Chora::checkError($fl);
+
+/* $trunk contains an array of trunk revisions. */
+$trunk = array();
+
+/* $branches is a hash with the branch revision as the key, and value
+ * being an array of revs on that branch. */
+$branches = array();
+
+/* Populate $col with a list of all the branch points. */
+foreach ($fl->branches as $rev => $sym) {
+ $branches[$rev] = array();
+}
+
+/* For every revision, figure out if it is a trunk revision, or
+ * instead associated with a branch. If trunk, add it to the $trunk
+ * array. Otherwise, add it to an array in $branches[$branch]. */
+foreach ($fl->logs as $log) {
+ $rev = $log->queryRevision();
+ $baseRev = VC_Revision::strip($rev, 1);
+ $branchFound = false;
+ foreach ($fl->branches as $branch => $name) {
+ if ($branch == $baseRev) {
+ array_unshift($branches[$branch], $rev);
+ $branchFound = true;
+ }
+ }
+ /* If its not a branch, then add it to the trunk. */
+ /* TODO: this silently drops vendor branches atm! - avsm. */
+ if (!$branchFound && VC_Revision::sizeof($rev) == 2) {
+ array_unshift($trunk, $rev);
+ }
+}
+
+foreach ($branches as $col => $rows) {
+ /* If this branch has no actual commits on it, then it's a stub
+ * branch, and we can remove it for this view. */
+ if (!sizeof($rows)) {
+ unset($branches[$col]);
+ }
+}
+
+$colset = array('#ccdeff', '#ecf', '#fec', '#efc', '#cfd', '#dcdba0');
+$colStack = array();
+$branchColours = array();
+foreach ($branches as $brrev => $brcont) {
+ if (!count($colStack)) {
+ $colStack = $colset;
+ }
+ $branchColours[$brrev] = array_shift($colset);
+}
+
+/**
+ * This takes a row and a column, and recursively iterates through any
+ * sub-revisions or branches from the value that was already in the
+ * grid at the co-ordinates that it was called with.
+ *
+ * Calling this function on every revision of the trunk is enough to
+ * render out the whole tree.
+ */
+function populateGrid($row, $col)
+{
+ global $grid, $branches;
+
+ /* Figure out the starting revision this function uses. */
+ $rev = $grid[$row][$col];
+
+ /* For every branch that is known, try to see if it forks here. */
+ $brkeys = array_keys($branches);
+
+ /* NOTE: do not optimise to use foreach () or each() here, as that
+ * really screws up the $branches pointer array due to the
+ * recursion, and parallel branches fail - avsm. */
+ for ($a = 0, $aMax = count($brkeys); $a < $aMax; ++$a) {
+ $brrev = $brkeys[$a];
+ $brcont = $branches[$brrev];
+ /* Check to see if current point matches a branch point. */
+ if (!strcmp($rev, VC_Revision::strip($brrev, 1))) {
+ /* If it does, figure out how many rows we have to add. */
+ $numRows = sizeof($brcont);
+ /* Check rows in columns to the right, until one is
+ * free. */
+ $insCol = $col + 1;
+ while (true) {
+ /* Look in the current column for a set value. */
+ $inc = false;
+ for ($i = $row; $i <= ($row + $numRows); ++$i) {
+ if (isset($grid[$i][$insCol])) {
+ $inc = true;
+ }
+ }
+ /* If a set value was found, shift to the right and
+ * try again. Otherwise, break out of the loop. */
+ if ($inc) {
+ if (!isset($grid[$row][$insCol])) {
+ $grid[$row][$insCol] = ':' . $brcont[0];
+ }
+ ++$insCol;
+ } else {
+ break;
+ }
+ }
+
+ /* Put a fork marker in the top of the branch. */
+ $grid[$row][$insCol] = $brrev;
+
+ /* Populate the grid with the branch values at this
+ * point. */
+ for ($i = 0; $i < $numRows; ++$i) {
+ $grid[1 + $i + $row][$insCol] = $brcont[$i];
+ }
+ /* For each value just set, check for sub-branches, - but
+ * in reverse (VERY IMPORTANT!). */
+ for ($i = $numRows - 1; $i >= 0 ; --$i) {
+ populateGrid(1+$i+$row, $insCol);
+ }
+ }
+ }
+}
+
+/* Start row at the bottom trunk revision. Since branches always go
+ * down, there can never be one above 1.1, and so this is a safe
+ * location to start. We will then work our way up, recursively
+ * populating the grid with branch revisions. */
+for ($row = sizeof($trunk) - 1; $row >= 0; $row--) {
+ $grid[$row][0] = $trunk[$row];
+ populateGrid($row, 0);
+}
+
+/* Sort the grid array into row order, and determine the maximum
+ * column size that we need to render out in HTML. */
+ksort($grid);
+$maxCol = 0;
+foreach ($grid as $cols) {
+ krsort($cols);
+ list($val) = each($cols);
+ $maxCol = max($val, $maxCol);
+}
+
+$title = sprintf(_("Source Branching View for %s"), Text::htmlallspaces($where));
+$extraLink = Chora::getFileViews();
+
+require CHORA_TEMPLATES . '/common-header.inc';
+require CHORA_TEMPLATES . '/menu.inc';
+require CHORA_TEMPLATES . '/headerbar.inc';
+require CHORA_TEMPLATES . '/history/header.inc';
+
+foreach ($grid as $row) {
+ echo '<tr>';
+
+ /* Start traversing the grid of rows and columns. */
+ for ($i = 0; $i <= $maxCol; ++$i) {
+
+ /* If this column has nothing in it, require a blank cell. */
+ if (!isset($row[$i])) {
+ $bg = '';
+ require CHORA_TEMPLATES . '/history/blank.inc';
+ continue;
+ }
+
+ /* Otherwise, this cell has content; determine what it is. */
+ $rev = $row[$i];
+
+ if ($VC->isValidRevision($rev) && (VC_Revision::sizeof($rev) % 2)) {
+ /* This is a branch point, so put the info out. */
+ $bg = isset($branchColours[$rev]) ? $branchColours[$rev] : '#e9e9e9';
+ $symname = $fl->branches[$rev];
+ require CHORA_TEMPLATES . '/history/branch_cell.inc';
+
+ } elseif (preg_match('|^:|', $rev)) {
+ /* This is a continuation cell, so render it with the
+ * branch colour. */
+ $bgbr = VC_Revision::strip(preg_replace('|^\:|', '', $rev), 1);
+ $bg = isset($branchColours[$bgbr]) ? $branchColours[$bgbr] : '#e9e9e9';
+ require CHORA_TEMPLATES . '/history/blank.inc';
+
+ } elseif ($VC->isValidRevision($rev)) {
+ /* This cell contains a revision, so render it. */
+ $bgbr = VC_Revision::strip($rev, 1);
+ $bg = isset($branchColours[$bgbr]) ? $branchColours[$bgbr] : '#e9e9e9';
+ $log = $fl->logs[$rev];
+ $author = Chora::showAuthorName($log->queryAuthor());
+ $date = strftime('%e %b %Y', $log->queryDate());
+ $lines = $log->queryChangedLines();
+ require CHORA_TEMPLATES . '/history/rev.inc';
+
+ } else {
+ /* Exhausted other possibilities, just show a blank cell. */
+ require CHORA_TEMPLATES . '/history/blank.inc';
+ }
+ }
+
+ echo '</tr>';
+}
+
+require CHORA_TEMPLATES . '/history/footer.inc';
+require $registry->get('templates', 'horde') . '/common-footer.inc';
--- /dev/null
+<?php
+/**
+ * Copyright 1999-2008 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (GPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
+ *
+ * @author Anil Madhavapeddy <avsm@horde.org>
+ * @package Chora
+ */
+
+define('CHORA_BASE', dirname(__FILE__));
+$chora_configured = (is_readable(CHORA_BASE . '/config/conf.php') &&
+ is_readable(CHORA_BASE . '/config/sourceroots.php') &&
+ is_readable(CHORA_BASE . '/config/mime_drivers.php') &&
+ is_readable(CHORA_BASE . '/config/prefs.php'));
+
+if (!$chora_configured) {
+ /* Chora isn't configured. */
+ require CHORA_BASE . '/../lib/Test.php';
+ Horde_Test::configFilesMissing('Chora', CHORA_BASE,
+ array('conf.php', 'prefs.php', 'mime_drivers.php'),
+ array('sourceroots.php' => 'This file defines all of the source repositories that you wish Chora to display.'));
+}
+
+require CHORA_BASE . '/browse.php';
--- /dev/null
+var revlog_selected=null;var isMSIE=false;function revlog_highlight(){var a=$("revlog_body");$A(a.getElementsByTagName("TR")).each(function(b){if(isMSIE){Event.observe(b,"mouseover",(function(){Element.addClassName(this,"hover")}).bind(b));Event.observe(b,"mouseout",(function(){Element.removeClassName(this,"hover")}).bind(b))}Event.observe(b,"click",revlog_toggle.bindAsEventListener(b))})}function revlog_toggle(b){var a=Event.element(b);while(a!=this){if(a.tagName.toUpperCase()=="A"&&a.getAttribute("href")){return}a=a.parentNode}if(revlog_selected!=null){Element.removeClassName(revlog_selected,"selected");if(revlog_selected==this){revlog_selected=null;Element.removeClassName("revlog_body","selection");return}}revlog_selected=this;Element.addClassName(this,"selected");Element.addClassName("revlog_body","selection")}function revlog_sdiff(a){a.href=a.href.replace(/r1=([\d\.]+)/,"r1="+revlog_selected.id.substring(3))}Event.observe(window,"load",revlog_highlight);
\ No newline at end of file
--- /dev/null
+/**
+ * Revision log javascript.
+ */
+
+var revlog_selected = null;
+var isMSIE = /*@cc_on!@*/false;
+
+function revlog_highlight()
+{
+ var revlog_body = $('revlog_body');
+
+ $A(revlog_body.getElementsByTagName('TR')).each(function(tr) {
+ if (isMSIE) {
+ Event.observe(tr, 'mouseover', (function() { Element.addClassName(this, 'hover'); }).bind(tr));
+ Event.observe(tr, 'mouseout', (function() { Element.removeClassName(this, 'hover'); }).bind(tr));
+ }
+ Event.observe(tr, 'click', revlog_toggle.bindAsEventListener(tr));
+ });
+}
+
+function revlog_toggle(e)
+{
+ // Ignore clicks on links.
+ var elt = Event.element(e);
+ while (elt != this) {
+ if (elt.tagName.toUpperCase() == 'A' && elt.getAttribute('href')) {
+ return;
+ }
+ elt = elt.parentNode;
+ }
+
+ if (revlog_selected != null) {
+ Element.removeClassName(revlog_selected, 'selected');
+ if (revlog_selected == this) {
+ revlog_selected = null;
+ Element.removeClassName('revlog_body', 'selection');
+ return;
+ }
+ }
+
+ revlog_selected = this;
+ Element.addClassName(this, 'selected');
+ Element.addClassName('revlog_body', 'selection');
+}
+
+function revlog_sdiff(link)
+{
+ link.href = link.href.replace(/r1=([\d\.]+)/, 'r1=' + revlog_selected.id.substring(3));
+}
+
+Event.observe(window, 'load', revlog_highlight);
--- /dev/null
+Deny from all
--- /dev/null
+<?php
+
+$block_name = _("Menu List");
+$block_type = 'tree';
+
+class Horde_Block_chora_tree_menu extends Horde_Block {
+
+ var $_app = 'chora';
+
+ function _buildTree(&$tree, $indent = 0, $parent = null)
+ {
+ global $perms, $sourceroots;
+
+ define('CHORA_ERROR_HANDLER', true);
+ require_once dirname(__FILE__) . '/../base.php';
+
+ $arr = array();
+ asort($sourceroots);
+ foreach ($sourceroots as $key => $val) {
+ if ((!$perms->exists('chora:sourceroots:' . $key) ||
+ $perms->hasPermission('chora:sourceroots:' . $key,
+ Auth::getAuth(),
+ PERMS_READ | PERMS_SHOW))) {
+ $tree->addNode($parent . $key,
+ $parent,
+ $val['name'],
+ $indent + 1,
+ false,
+ array('icon' => 'folder.png',
+ 'icondir' => $registry->getImageDir('horde') . '/tree',
+ 'url' => Chora::url('', '', array('rt' => $key))));
+ }
+ }
+
+ }
+
+}
--- /dev/null
+<?php
+/**
+ * Chora Base Class.
+ *
+ * @author Anil Madhavapeddy <avsm@horde.org>
+ * @package Chora
+ */
+class Chora {
+
+ /**
+ * Return a text description of how long its been since the file
+ * has been last modified.
+ *
+ * @param integer $date Number of seconds since epoch we wish to display.
+ * @param boolean $long If true, display a more verbose date.
+ *
+ * @return string The human-readable date.
+ */
+ function readableTime($date, $long = false)
+ {
+ static $time, $desc, $breaks;
+
+ /* Initialize popular variables. */
+ if (is_null($time)) {
+ $time = time();
+ $desc = array(1 => array(_("second"), _("seconds")),
+ 60 => array(_("minute"), _("minutes")),
+ 3600 => array(_("hour"), _("hours")),
+ 86400 => array(_("day"), _("days")),
+ 604800 => array(_("week"), _("weeks")),
+ 2628000 => array(_("month"), _("months")),
+ 31536000 => array(_("year"), _("years")));
+ $breaks = array_keys($desc);
+ }
+
+ $i = count($breaks);
+ $secs = $time - $date;
+
+ if ($secs < 2) {
+ return _("very little time");
+ }
+
+ while (--$i && $i && $breaks[$i] * 2 > $secs);
+
+ $break = $breaks[$i];
+
+ $val = (int)($secs / $break);
+ $retval = $val . ' ' . ($val > 1 ? $desc[$break][1] : $desc[$break][0]);
+ if ($long && $i > 0) {
+ $rest = $secs % $break;
+ $break = $breaks[--$i];
+ $rest = (int)($rest / $break);
+ if ($rest > 0) {
+ $resttime = $rest . ' ' . ($rest > 1 ? $desc[$break][1] : $desc[$break][0]);
+ $retval .= ', ' . $resttime;
+ }
+ }
+
+ return $retval;
+ }
+
+ /**
+ * Initialize global variables and objects.
+ */
+ function initialize()
+ {
+ global $acts, $defaultActs, $conf, $where, $atdir,
+ $fullname, $prefs, $sourceroot, $scriptName;
+
+ $sourceroots = Chora::sourceroots();
+ /**
+ * Variables we wish to propagate across web pages
+ * sbt = Sort By Type (name, age, author, etc)
+ * ha = Hide Attic Files
+ * ord = Sort order
+ *
+ * Obviously, defaults go into $defaultActs :)
+ * TODO: defaults of 1 will not get propagated correctly - avsm
+ * XXX: Rewrite this propagation code, since it sucks - avsm
+ */
+ $defaultActs = array('sbt' => constant($conf['options']['defaultsort']),
+ 'sa' => 0,
+ 'ord' => Horde_VC::SORT_ASCENDING,
+ 'ws' => 1);
+
+ /* Use the last sourceroot used as the default value if the user
+ * has that preference. */
+ $remember_last_file = $prefs->getValue('remember_last_file');
+ if ($remember_last_file) {
+ $last_file = $prefs->getValue('last_file') ? $prefs->getValue('last_file') : null;
+ $last_sourceroot = $prefs->getValue('last_sourceroot') ? $prefs->getValue('last_sourceroot') : null;
+ }
+
+ if ($remember_last_file && !empty($last_sourceroot) &&
+ is_array(@$sourceroots[$last_sourceroot])) {
+ $defaultActs['rt'] = $last_sourceroot;
+ } else {
+ foreach ($sourceroots as $key => $val) {
+ if (isset($val['default']) || !isset($defaultActs['rt'])) {
+ $defaultActs['rt'] = $key;
+ }
+ }
+ }
+
+ /* See if any have been passed as GET variables, and if so,
+ * assign them into the acts array. */
+ $acts = array();
+ foreach ($defaultActs as $key => $default) {
+ $acts[$key] = Util::getFormData($key, $default);
+ }
+
+ if (!isset($sourceroots[$acts['rt']])) {
+ Chora::fatal(_("Malformed URL"), '400 Bad Request');
+ }
+
+ $sourcerootopts = $sourceroots[$acts['rt']];
+ $sourceroot = $acts['rt'];
+
+ $conf['paths']['temp'] = Horde::getTempDir();
+ $GLOBALS['VC'] = Horde_VC::factory($sourcerootopts['type'],
+ array('sourceroot' => $sourcerootopts['location'],
+ 'paths' => $conf['paths'],
+ 'username' => isset($sourcerootopts['username']) ? $sourcerootopts['username'] : '',
+ 'password' => isset($sourcerootopts['password']) ? $sourcerootopts['password'] : ''));
+ if (is_a($GLOBALS['VC'], 'PEAR_Error')) {
+ Chora::fatal($GLOBALS['VC']->getMessage());
+ }
+
+ $conf['paths']['sourceroot'] = $sourcerootopts['location'];
+ $conf['paths']['cvsusers'] = $sourcerootopts['location'] . '/' . (isset($sourcerootopts['cvsusers']) ? $sourcerootopts['cvsusers'] : '');
+ $conf['paths']['introText'] = CHORA_BASE . '/config/' . (isset($sourcerootopts['intro']) ? $sourcerootopts['intro'] : '');
+ $conf['options']['introTitle'] = isset($sourcerootopts['title']) ? $sourcerootopts['title'] : '';
+ $conf['options']['sourceRootName'] = $sourcerootopts['name'];
+
+ $where = Util::getFormData('f', '');
+ if ($where == '') {
+ $where = '/';
+ }
+
+ /* Location relative to the sourceroot. */
+ $where = preg_replace('|^/|', '', $where);
+ $where = preg_replace('|\.\.|', '', $where);
+
+ /* Location of this script (e.g. /chora/browse.php). */
+ $scriptName = preg_replace('|^/?|', '/', $_SERVER['PHP_SELF']);
+ $scriptName = preg_replace('|/$|', '', $scriptName);
+
+ /* Store last file/repository viewed, and set 'where' to
+ * last_file if necessary. */
+ if ($remember_last_file) {
+ if (!isset($_SESSION['chora']['login'])) {
+ $_SESSION['chora']['login'] = 0;
+ }
+
+ /* We store last_sourceroot and last_file only when we have
+ * already displayed at least one page. */
+ if (!empty($_SESSION['chora']['login'])) {
+ $prefs->setValue('last_sourceroot', $acts['rt']);
+ $prefs->setValue('last_file', $where);
+ } else {
+ /* We are displaying the first page. */
+ if ($last_file && !$where) {
+ $where = $last_file;
+ }
+ $_SESSION['chora']['login'] = 1;
+ }
+ }
+
+ $fullname = $sourcerootopts['location'] . (substr($sourcerootopts['location'], -1) == '/' ? '' : '/') . $where;
+
+ if ($sourcerootopts['type'] == 'cvs') {
+ $fullname = preg_replace('|/$|', '', $fullname);
+ $atdir = @is_dir($fullname);
+ } else {
+ $atdir = !$where || (substr($where, -1) == '/');
+ }
+ $where = preg_replace('|/$|', '', $where);
+
+ if ($sourcerootopts['type'] == 'cvs' && !@is_dir($sourcerootopts['location'])) {
+ Chora::fatal(_("Sourceroot not found. This could be a misconfiguration by the server administrator, or the server could be having temporary problems. Please try again later."), '500 Internal Server Error');
+ }
+
+ if (Chora::isRestricted($where)) {
+ Chora::fatal(sprintf(_("%s: Forbidden by server configuration"), $where), '403 Forbidden');
+ }
+ }
+
+ function whereMenu()
+ {
+ global $where, $atdir;
+
+ $bar = '';
+ $wherePath = '';
+
+ $dirs = explode('/', $where);
+ $last = count($dirs) - 1;
+ $i = 0;
+ foreach ($dirs as $dir) {
+ if (!$atdir && $i++ == $last) {
+ $wherePath .= "/$dir";
+ } else {
+ $wherePath .= "/$dir/";
+ }
+ $wherePath = str_replace('//', '/', $wherePath);
+ if (!empty($dir) && ($dir != 'Attic')) {
+ $bar .= '/ <a href="' . Chora::url('', $wherePath) . '">'. Text::htmlallspaces($dir) . '</a> ';
+ }
+ }
+ return $bar;
+ }
+
+ /**
+ * Output an error page.
+ *
+ * @param string $message The verbose error message to be displayed.
+ * @param string $responseCode The HTTP error number (and optional text), for sending 404s or other codes if appropriate..
+ */
+ public static function fatal($message, $responseCode = null)
+ {
+ if (defined('CHORA_ERROR_HANDLER') && constant('CHORA_ERROR_HANDLER')) {
+ return;
+ }
+
+ global $registry, $conf, $notification, $browser, $prefs;
+
+ /* Don't store the bad file in the user's preferences. */
+ $prefs->setValue('last_file', '');
+
+ if ($responseCode) {
+ header('HTTP/1.0 ' . $responseCode);
+ }
+
+ $notification->push($message, 'horde.error');
+ require CHORA_TEMPLATES . '/common-header.inc';
+ require CHORA_TEMPLATES . '/menu.inc';
+ require $registry->get('templates', 'horde') . '/common-footer.inc';
+ exit;
+ }
+
+ /**
+ * Given a return object from a Horde_VC:: call, make sure
+ * that it's not a PEAR_Error object.
+ *
+ * @param mixed $e Return object from a Horde_VC:: call.
+ */
+ function checkError($e)
+ {
+ if (is_a($e, 'PEAR_Error')) {
+ Chora::fatal($e->getMessage());
+ }
+ }
+
+ /**
+ * Convert a commit-name into whatever the user wants.
+ *
+ * @param string $name Account name.
+ *
+ * @return string The transformed name.
+ */
+ function showAuthorName($name, $fullname = false)
+ {
+ static $users = null;
+ if ($users === null) {
+ $users = $GLOBALS['VC']->getUsers($GLOBALS['conf']['paths']['cvsusers']);
+ }
+
+ if (is_array($users) && isset($users[$name])) {
+ return '<a href="mailto:' . htmlspecialchars($users[$name]['mail']) . '">' .
+ htmlspecialchars($fullname ? $users[$name]['name'] : $name) .
+ '</a>' . ($fullname ? ' <em>' . htmlspecialchars($name) . '</em>' : '');
+ }
+ return htmlspecialchars($name);
+ }
+
+ /**
+ * Generate a URL that links into Chora.
+ *
+ * @param string $script Name of the Chora script to link into
+ * @param string $uri The path being browsed.
+ * @param array $args Key/value pair of any GET parameters to append
+ * @param string $anchor Anchor entity name
+ *
+ * @return string The URL, with session information if necessary.
+ */
+ function url($script = '', $uri = '', $args = array(), $anchor = '')
+ {
+ global $conf, $acts, $defaultActs;
+
+ $differing = array();
+ foreach ($acts as $key => $val) {
+ if ($val != $defaultActs[$key]) {
+ $differing[$key] = $val;
+ }
+ }
+
+ $arglist = array_merge($differing, $args);
+ $script = $script ? $script . '.php' : 'browse.php';
+
+ if ($conf['options']['urls'] == 'rewrite') {
+ if ($script == 'browse.php') {
+ $script = $uri;
+ if (substr($script, 0, 1) == '/') {
+ $script = substr($script, 1);
+ }
+ } else {
+ $script .= '/' . $uri;
+ }
+ } else {
+ $arglist['f'] = $uri;
+ }
+
+ $url = Util::addParameter(Horde::applicationUrl($script), $arglist);
+ if (!empty($anchor)) {
+ $url .= "#$anchor";
+ }
+
+ return $url;
+ }
+
+ /**
+ * Generates hidden form fields with all required parameters.
+ *
+ * @param array $args Key/value pair of any POST parameters to append
+ *
+ * @return string The form fields, with session information if necessary.
+ */
+ function formInputs($args = array())
+ {
+ global $conf, $acts, $defaultActs;
+
+ $differing = array();
+ foreach ($acts as $key => $val) {
+ if ($val != $defaultActs[$key]) {
+ $differing[$key] = $val;
+ }
+ }
+
+ $arglist = array_merge($differing, $args);
+
+ $fields = Util::formInput();
+ foreach ($arglist as $key => $val) {
+ $fields .= '<input type="hidden" name="' . htmlspecialchars($key)
+ . '" value="' . htmlspecialchars($val) . '" />';
+ }
+
+ return $fields;
+ }
+
+ /**
+ * Returns the entries of $sourceroots that the current user has access to.
+ *
+ * @return array The sourceroots that the current user has access to.
+ */
+ function sourceroots()
+ {
+ global $perms, $sourceroot, $sourceroots;
+
+ $arr = array();
+ foreach ($sourceroots as $key => $val) {
+ if (!$perms->exists('chora:sourceroots:' . $key) ||
+ $perms->hasPermission('chora:sourceroots:' . $key,
+ Auth::getAuth(),
+ PERMS_READ | PERMS_SHOW)) {
+ $arr[$key] = $val;
+ }
+ }
+
+ return $arr;
+ }
+
+ /**
+ * Generate a list of repositories available from this
+ * installation of Chora.
+ *
+ * @return string XHTML code representing links to the repositories.
+ */
+ function repositories()
+ {
+ $sourceroots = Chora::sourceroots();
+ $num_repositories = count($sourceroots);
+ if ($num_repositories == 1) {
+ return '';
+ }
+
+ $arr = array();
+ foreach ($sourceroots as $key => $val) {
+ if ($GLOBALS['sourceroot'] != $key) {
+ $arr[] = '<option value="' .
+ Chora::url('', '', array('rt' => $key)) .
+ '">' . $val['name'] . '</option>';
+ }
+ }
+
+ return
+ '<form action="#" id="repository-picker">'
+ . '<select onchange="location.href=this[this.selectedIndex].value">'
+ . '<option value="">' . _("Change repositories:") . '</option>'
+ . implode(' , ', $arr) . '</select></form>';
+ }
+
+ /**
+ * Pretty-print the checked out copy, using the
+ * Horde::Mime::Viewer package.
+ *
+ * @param string $mime_type File extension of the checked out file
+ * @param resource fp File pointer to the head of the checked out copy
+ * @return object The MIME_Viewer object which can be rendered or
+ * false on failure
+ */
+ function &pretty($mime_type, $fp)
+ {
+ $lns = '';
+ while ($ln = fread($fp, 8192)) {
+ $lns .= $ln;
+ }
+
+ $mime = &new MIME_Part($mime_type, $lns);
+ $viewer = &MIME_Viewer::factory($mime);
+ return $viewer;
+ }
+
+ /**
+ * Check if the given item is restricted from being shown.
+ * @return boolean whether or not the item is allowed to be displayed
+ **/
+ function isRestricted($item)
+ {
+ global $conf, $perms, $sourceroots, $sourceroot;
+ static $restricted;
+
+ // First check if the current user has access to this repository.
+ if ($perms->exists('chora:sourceroots:' . $sourceroot) &&
+ !$perms->hasPermission('chora:sourceroots:' . $sourceroot,
+ Auth::getAuth(),
+ PERMS_READ | PERMS_SHOW)) {
+ return true;
+ }
+
+ if (!isset($restricted)) {
+ $restricted = array();
+ if (isset($conf['restrictions']) && is_array($conf['restrictions'])) {
+ $restricted = $conf['restrictions'];
+ }
+
+ foreach ($sourceroots as $key => $val) {
+ if ($sourceroot == $key) {
+ if (isset($val['restrictions']) && is_array($val['restrictions'])) {
+ $restricted = array_merge($restricted, $val['restrictions']);
+ break;
+ }
+ }
+ }
+ }
+
+ if (!empty($restricted) && is_array($restricted) && count($restricted)) {
+ for ($i = 0; $i < count($restricted); $i++) {
+ if (preg_match('|' . str_replace('|', '\|', $restricted[$i]) . '|', $item)) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Build Chora's list of menu items.
+ */
+ function getMenu($returnType = 'object')
+ {
+ require_once 'Horde/Menu.php';
+
+ $menu = &new Menu();
+ $menu->add(Chora::url(), _("_Browse"), 'chora.png');
+
+ if ($returnType == 'object') {
+ return $menu;
+ } else {
+ return $menu->render();
+ }
+ }
+
+ /**
+ */
+ function getFileViews()
+ {
+ global $where;
+
+ $views = array();
+ $current = str_replace('.php', '', basename($_SERVER['PHP_SELF']));
+
+ $views[] = $current == 'browse'
+ ? '<em class="widget">' . _("Logs") . '</em>'
+ : Horde::widget(Chora::url('', $where), _("Logs"), 'widget', '',
+ '', _("_Logs"));
+ // Subversion supports patchsets natively.
+ if (!empty($GLOBALS['conf']['paths']['cvsps']) ||
+ is_a($GLOBALS['VC'], 'VC_svn')) {
+ $views[] = $current == 'patchsets'
+ ? '<em class="widget">' . _("Patchsets") . '</em>'
+ : Horde::widget(Chora::url('patchsets', $where), _("Patchsets"),
+ 'widget', '', '', _("_Patchsets"));
+ }
+ if (!is_a($GLOBALS['VC'], 'VC_svn')) {
+ if (empty($GLOBALS['conf']['paths']['cvsgraph'])) {
+ $views[] = $current == 'history'
+ ? '<em class="widget">' . _("Branches") . '</em>'
+ : Horde::widget(Chora::url('history', $where), _("Branches"),
+ 'widget', '', '', _("_Branches"));
+ } else {
+ $views[] = $current == 'cvsgraph'
+ ? '<em class="widget">' . _("Branches") . '</em>'
+ : Horde::widget(Chora::url('cvsgraph', $where), _("Branches"),
+ 'widget', '', '', _("_Branches"));
+ }
+ }
+ $views[] = $current == 'stats'
+ ? '<em class="widget">' . _("Statistics") . '</em>'
+ : Horde::widget(Chora::url('stats', $where), _("Statistics"),
+ 'widget', '', '', _("_Statistics"));
+
+ return _("View:") . ' ' . implode(' | ', $views);
+ }
+
+ /**
+ */
+ function formatLogMessage($log)
+ {
+ global $conf;
+
+ require_once 'Horde/Text/Filter.php';
+
+ $log = Text_Filter::filter($log, 'text2html', array('parselevel' => TEXT_HTML_MICRO, 'charset' => NLS::getCharset(), 'class' => ''));
+
+ if (!empty($conf['tickets']['regexp']) && !empty($conf['tickets']['replacement'])) {
+ $log = preg_replace($conf['tickets']['regexp'], $conf['tickets']['replacement'], $log);
+ }
+
+ return $log;
+ }
+
+ /**
+ * Return a list of tags for a given log entry.
+ *
+ * @param Horde_VC_Log $lg The Horde_VC_Log object.
+ * @param string $where The filename.
+ *
+ * @return array An array of linked tags.
+ */
+ function getTags($lg, $where)
+ {
+ $tags = array();
+ foreach ($lg->querySymbolicBranches() as $symb => $bra) {
+ $tags[] = '<a href="' . Chora::url('', $where, array('onb' => $bra)) . '">'. htmlspecialchars($symb) . '</a>';
+ }
+ if ($lg->tags) {
+ foreach ($lg->tags as $tag) {
+ $tags[] = htmlspecialchars($tag);
+ }
+ }
+ return $tags;
+ }
+
+ /**
+ * Return branch information for a given revision.
+ *
+ * @param Horde_VC_File $fl The Horde_VC_File object.
+ * @param string $rev The filename.
+ *
+ * @return array An 2-member array - branch name and branch revision.
+ */
+ function getBranch($fl, $rev)
+ {
+ $branchName = '';
+ $branchRev = Horde_VC_Revision::strip($rev, 1);
+ if (isset($fl->branches[$rev])) {
+ $branchName = $fl->branches[$rev];
+ } elseif (isset($fl->branches[$branchRev])) {
+ $branchName = $fl->branches[$branchRev];
+ }
+ return array($branchName, $branchRev);
+ }
+
+ /**
+ * Return formatted date information.
+ *
+ * @param integer $date Number of seconds since epoch we wish to display.
+ *
+ * @return string The date formatted pursuant to Horde prefs.
+ */
+ function formatDate($date)
+ {
+ static $format;
+
+ if (!isset($format)) {
+ $format = $GLOBALS['prefs']->getValue('date_format') .
+ ($GLOBALS['prefs']->getValue('twenty_four')
+ ? ' %H:%M'
+ : ' %I:%M %p');
+ }
+
+ return strftime($format, $date);
+ }
+
+}
--- /dev/null
+<?php
+/**
+ * Chora external API interface.
+ *
+ * This file defines Chora's external API interface. Other applications can
+ * interact with Chora through this API.
+ *
+ * @package Chora
+ */
+@define('CHORA_BASE', dirname(__FILE__) . "/..");
+
+$_services['perms'] = array(
+ 'args' => array(),
+ 'type' => '{urn:horde}stringArray'
+);
+
+function _chora_perms()
+{
+ static $perms = array();
+ if (!empty($perms)) {
+ return $perms;
+ }
+
+ @define('CHORA_BASE', dirname(__FILE__) . '/..');
+ require_once CHORA_BASE . '/config/sourceroots.php';
+
+ $perms['tree']['chora']['sourceroots'] = false;
+ $perms['title']['chora:sourceroots'] = _("Repositories");
+
+ // Run through every source repository
+ foreach ($sourceroots as $sourceroot => $srconfig) {
+ $perms['tree']['chora']['sourceroots'][$sourceroot] = false;
+ $perms['title']['chora:sourceroots:' . $sourceroot] = $srconfig['name'];
+ }
+
+ return $perms;
+}
+
--- /dev/null
+<?php
+/**
+ * Chora base inclusion file.
+ *
+ * This file brings in all of the dependencies that every Chora script
+ * will need, and sets up objects that all scripts use.
+ */
+
+// Check for a prior definition of HORDE_BASE (perhaps by an
+// auto_prepend_file definition for site customization).
+if (!defined('HORDE_BASE')) {
+ define('HORDE_BASE', dirname(__FILE__) . '/../..');
+}
+
+// Find the base file path of Chora.
+if (!defined('CHORA_BASE')) {
+ define('CHORA_BASE', dirname(__FILE__) . '/..');
+}
+
+// Load the Horde Framework core, and set up inclusion paths.
+require_once HORDE_BASE . '/lib/core.php';
+require_once 'Horde/Autoloader.php';
+
+// Registry
+$registry = &Registry::singleton();
+if (is_a(($pushed = $registry->pushApp('chora', !defined('AUTH_HANDLER'))), 'PEAR_Error')) {
+ if ($pushed->getCode() == 'permission_denied') {
+ Horde::authenticationFailureRedirect();
+ }
+ Horde::fatal($pushed, __FILE__, __LINE__, false);
+}
+$conf = &$GLOBALS['conf'];
+define('CHORA_TEMPLATES', $registry->get('templates'));
+
+// Notification system.
+$notification = &Notification::singleton();
+$notification->attach('status');
+
+// Cache.
+$cache = &Horde_Cache::singleton($conf['cache']['driver'], Horde::getDriverConfig('cache', $conf['cache']['driver']));
+
+// Horde base libraries.
+require_once 'Horde/Text.php';
+require_once 'Horde/Help.php';
+
+// Chora libraries and config.
+if (is_callable(array('Horde', 'loadConfiguration'))) {
+ $sourceroots = Horde::loadConfiguration('sourceroots.php', 'sourceroots');
+} else {
+ require_once CHORA_BASE . '/config/sourceroots.php';
+}
+require_once CHORA_BASE . '/lib/Chora.php';
+
+// Initialize objects, path, etc.
+Chora::initialize();
+
+// Start compression, if requested.
+Horde::compressOutput();
--- /dev/null
+<?php define('CHORA_VERSION', 'H4 (3.0-git)') ?>
--- /dev/null
+Deny from all
--- /dev/null
+<?xml version="1.0" encoding="iso-8859-1"?>
+<help>
+
+ <entry id="Overview" md5="6c904e7e17dea0fc75802e2c1a534b03" state="uptodate">
+ <title>Chora Überblick</title>
+ <para>
+ Bei Chora handelt es sich um ein Werkzeug zum Betrachten von
+ Repositories, die durch Systeme zur Versionskontrolle verwaltet
+ werden. Es stellt verschiedene Ansichten für Verzeichnisübersichten, die
+ Log-Geschichte, Unterschiede zwischen Versionen, grafische
+ Branchdarstellungen und kommentierte Dateien zur Verfügung.
+ </para>
+ </entry>
+
+ <entry id="chora-button" md5="23ab7e475dc04b66c91b98f6b0f1d743" state="uptodate">
+ <title>Menü: Liste</title>
+ <para>
+ Mit dem Liste-Symbol gelangen Sie zur Hauptansicht
+ (Verzeichnisübersicht) des Standard-Repositories zurück.
+ </para>
+ </entry>
+
+ <entry id="options-button" md5="51f095602bb3e62703e72e7fe7fef996" state="uptodate">
+ <title>Menü: Einstellungen</title>
+ <para>
+ Über das Einstellungen-Symbol gelangt man zu den persönlichen
+ Einstellungen, die festlegen, wie sich Chora verhält.
+ </para>
+ </entry>
+
+ <entry id="help-button" md5="11b68a5e1f6cb8f5c2a885c2d65db322" state="uptodate">
+ <title>Menü: Hilfe</title>
+ <para>
+ Das Hilfe-Symbol öffnet diese Hilfe.
+ </para>
+ </entry>
+
+ <entry id="view-checkout" md5="b1f7c7b2eadf56b5266912badebb6bab" state="uptodate">
+ <title>Checkout-Ansicht</title>
+ <para>
+ Die Checkout-Ansicht zeigt den Inhalt einer Datei in einer bestimmten
+ Version und den Logeintrag dieser Version.
+ </para>
+ </entry>
+
+ <entry id="view-annotate" md5="68239aff5736e5b667a52525a1c35866" state="uptodate">
+ <title>Kommentierte Ansicht</title>
+ <para>
+ Die Kommentierte Ansicht zeigt den Inhalt einer Datei zusammen mit den
+ Namen der Autoren, die für die einzelnen Abschnitte verantwortlich sind.
+ </para>
+ </entry>
+
+ <entry id="view-branch" md5="ddaf69ea0dc10b924e8c5905558b2484" state="uptodate">
+ <title>Branch-Ansicht</title>
+ <para>
+ Die Branch-Ansicht zeigt die Versionsgeschichte einer Datei als
+ Baumstruktur der vorhanden Branches. So kann man leicht erkennen, wo
+ Branches in dem Versionsbaum angelegt wurden.
+ </para>
+ </entry>
+
+ <entry id="view-log" md5="3655e86abff5febed002d80ea29f4f87" state="uptodate">
+ <title>Log-Ansicht</title>
+ <para>
+ Die Log-Ansicht zeigt die Geschichte einer Datei, indem alle
+ Log-Einträge aufgelistet werden, wie sie beim Einchecken der Versionen
+ angegeben wurden.
+ </para>
+ </entry>
+
+ <entry id="view-diff" md5="ff743f7a85bf7f0b7e9374d19f40a4fe" state="uptodate">
+ <title>Ansicht der Unterschiede</title>
+ <para>
+ Die Ansicht der Unterschiede zeigt die Unterschiede zwischen zwei
+ Versionen einer Datei an. So lässt sich leicht erkennen, wie eine Datei
+ verändert wurde. Es stehen verschiedene Anzeigeformate zur Verfügung.
+ </para>
+ </entry>
+
+ <entry id="show-deleted-files" md5="96c17a1efe41cd0e1de5c4f37d1e68f2" state="uptodate">
+ <title>Gelöschte Dateien anzeigen/verstecken</title>
+ <para>
+ Sie können auswählen, ob gelöschte Dateien (aus dem Attic) in der
+ Verzeichnisansicht angezeigt oder versteckt werden sollen. Wenn Sie sich
+ gelöschte Dateien anzeigen lassen, werden die entsprechenden Zeilen in
+ einer anderen Darstellung und mit einem <i>Papierkorb</i>-Symbol
+ angezeigt.
+ </para>
+ <para>
+ Standardmäßig werden gelöschte Dateien nicht angezeigt.
+ </para>
+ </entry>
+
+</help>
--- /dev/null
+<?xml version="1.0"?>
+<help>
+
+ <entry id="Overview">
+ <title>Chora Overview</title>
+ <para>
+ Chora is a tool for viewing code repositories that are managed using
+ source control systems. It provides a directory (file) view, a log
+ history view, difference views between versions, a visual branch view,
+ and an annotated view.
+ </para>
+ </entry>
+
+ <entry id="chora-button">
+ <title>Menu Buttons: Browse</title>
+ <para>
+ The Browse button takes you back to the main Chora files view for the
+ default repository.
+ </para>
+ </entry>
+
+ <entry id="options-button">
+ <title>Menu Buttons: Options</title>
+ <para>
+ The Options button lets you set some personal preferences to control the
+ way Chora behaves.
+ </para>
+ </entry>
+
+ <entry id="help-button">
+ <title>Menu Buttons: Help</title>
+ <para>
+ The Help button brings up this help display.
+ </para>
+ </entry>
+
+ <entry id="view-checkout">
+ <title>Checkout View</title>
+ <para>
+ The Checkout View shows a file contents at a revision point, along with
+ the log entry for that revision.
+ </para>
+ </entry>
+
+ <entry id="view-annotate">
+ <title>Annotate View</title>
+ <para>
+ The Annotated View shows a file annotated with which authors are
+ responsible for which portions of a file's contents (and is hence often
+ called the "blame" view).
+ </para>
+ </entry>
+
+ <entry id="view-branch">
+ <title>Branch View</title>
+ <para>
+ The Branch View shows a file's version history, layed out by
+ branches. This allows you to visually see where branch points were
+ created in the tree.
+ </para>
+ </entry>
+
+ <entry id="view-log">
+ <title>Log View</title>
+ <para>
+ The Log View shows a file's history via the checkin log messages. This
+ allows you to see a history of changes from the point of view log
+ messages entered at checkin time.
+ </para>
+ </entry>
+
+ <entry id="view-diff">
+ <title>Differences View</title>
+ <para>
+ The Differences View shows the differences between two different
+ revisions of a file. This allows you to easily see how a file has
+ changed. You can view the differences in various formats, including
+ among others a color coded side by side listing of the two revisions, or
+ in terms of ed editor commands.
+ </para>
+ </entry>
+
+ <entry id="show-deleted-files">
+ <title>Show/Hide Deleted Files</title>
+ <para>
+ You can choose to either view deleted files (from the Attic) or to not
+ show (hide) deleted files in the file view. If you choose to show
+ deleted files, they will show up dimmed and with a <i>trash can</i>
+ icon.
+ </para>
+ <para>
+ The default is not to show deleted files.
+ </para>
+ </entry>
+
+</help>
--- /dev/null
+<?xml version="1.0"?>
+<help>
+ <entry id="Overview">
+ <title>Introducción a Chora</title>
+ <para>Chora es una herramienta para examinar depósitos de código gestionados mediante sistemas de control de código. Ofrece vista de directorio (archivos), historial del registro, diferencias entre versiones, vista ramificada gráfica y vista de anotaciones.</para>
+ </entry>
+
+ <entry id="chora-button">
+ <title>Botones del menú: Examinar</title>
+ <para>El botón Examinar le devuelve a la visualización principal de archivos de Chora del depósito por omisión.</para>
+ </entry>
+
+ <entry id="options-button">
+ <title>Botones del menú: Opciones</title>
+ <para>El botón Opciones le permite configurar varias preferencias personales para controlar el comportamiento de Chora.</para>
+ </entry>
+
+ <entry id="help-button">
+ <title>Botones del menú: Ayuda</title>
+ <para>El botón Ayuda le muestra esta pantalla de ayuda.</para>
+ </entry>
+
+ <entry id="view-checkout">
+ <title>Vista de inspección</title>
+ <para>La vista de inspección muestra el contenido de un archivo en un punto de revisión, junto con las entradas de registro de dicha revisión.</para>
+ </entry>
+
+ <entry id="view-annotate">
+ <title>Vista anotada</title>
+ <para>La vista anotada muestra un archivo con las anotaciones de qué autores son responsables de qué partes del contenido del archivo (y por lo tanto se le conoce a menudo como la vista de la "culpa")</para>
+ </entry>
+
+ <entry id="view-branch">
+ <title>Vista ramificada</title>
+ <para>La vista ramificada muestra la historia de versiones de un archivo, distribuida en ramas. Ésto permite comprobar, de forma visual, dónde se crearon los puntos de ramificación del árbol.</para>
+ </entry>
+
+ <entry id="view-log">
+ <title>Vista de registro</title>
+ <para>La vista de registro muestra la historia de un archivo mediante los mensajes de registro de comprobación. Ésto permite ver una historia de los cambios desde el punto de vista de los mensajes de registro que se introdujeron en el momento de la revisión.</para>
+ </entry>
+
+ <entry id="view-diff">
+ <title>Vista de diferencias</title>
+ <para>La vista de diferencias muestra las diferencias entre dos revisiones distintas de un archivo. Ésto le permite ver fácilmente los cambios de un archivo. Puede ver las diferencias en varios formatos, incluyendo entre otros un listado coloreado conjunto de las dos revisiones, o un listado de diferencias mediante comandos del editor ed.</para>
+ </entry>
+
+ <entry id="show-deleted-files">
+ <title>Mostrar/Ocultar archivos eliminados</title>
+ <para>Puede optar por ver los archivos eliminados (desde Attic) o por no mostrarlos (ocultarlos) en la vista de archivos. Si prefiere mostrarlos, se verán atenuados y con un icono de <i>papelera</i>.</para>
+ <para>La opción por omisión es no mostrarlos.</para>
+ </entry>
+</help>
--- /dev/null
+<?xml version="1.0"?>
+<help>
+ <entry id="Overview" md5="6c904e7e17dea0fc75802e2c1a534b03" state="uptodate">
+ <title>Chora yleiskuva</title>
+ <para>
+ Chora on ohjelma selata lähdekoodinhallintaan kuuluvia koodivarastoja. Käytettävissä on mm. näkymät hakemistoille (tiedostot), lokihistoria, kahden version erot, versiopuuhun ja muistiinpanot.
+ </para>
+ </entry>
+ <entry id="chora-button" md5="23ab7e475dc04b66c91b98f6b0f1d743" state="uptodate">
+ <title>Valikkopainikkeet: Selaa</title>
+ <para>
+ Selaa painike palauttaa sinut takaisin Chora oletusvaraston tiedostojen päänäkymään.
+ </para>
+ </entry>
+ <entry id="options-button" md5="51f095602bb3e62703e72e7fe7fef996" state="uptodate">
+ <title>Valikkopainikkeet: Asetukset</title>
+ <para>
+ Napauttamalla Asetukset painiketta pääset muuttamaan asetuksiasi.
+ </para>
+ </entry>
+ <entry id="help-button" md5="11b68a5e1f6cb8f5c2a885c2d65db322" state="uptodate">
+ <title>Valikkopainikkeet: Ohje</title>
+ <para>
+ Ohje painikkeesta tulee näkyville ohjenäkymä.
+ </para>
+ </entry>
+ <entry id="view-checkout" md5="b1f7c7b2eadf56b5266912badebb6bab" state="uptodate">
+ <title>Checkout View</title>
+ <para>
+ Checkout View näyttää tiedoston sisällön revisiopisteessä ja revisioon liittyvän lokitiedon.
+ </para>
+ </entry>
+ <entry id="view-annotate" md5="68239aff5736e5b667a52525a1c35866" state="uptodate">
+ <title>Selitysmerkintänäkymä</title>
+ <para>
+ Selitysmerkintänäkymä näyttää sinulle tiedoston varustettuna selitysmerkinnöillä, joista selviää mm. kuka on vastuussa mistäkin osasta tiedostoa. Tätä kutsutaan usein myös "syylliset" näkymäksi.
+ </para>
+ </entry>
+ <entry id="view-branch" md5="ddaf69ea0dc10b924e8c5905558b2484" state="uptodate">
+ <title>Haarautumisnäkymä</title>
+ <para>
+ Haarautumisnäkymä näyttää tiedoston versiohistorian, siten että siitä näkyy haarautumispisteet. Tämä auttaa sinua selvittämään mitä haarautumispisteitä puuhun on tehty.
+ </para>
+ </entry>
+ <entry id="view-log" md5="3655e86abff5febed002d80ea29f4f87" state="uptodate">
+ <title>Log View</title>
+ <para>
+ Lokitietonäkymä näyttää tiedston historian ja checkin lokitiedot. Tämä auttaa sinua hahmottamaan tiedoston historiaa kun voit nähdä checkin vaiheessa annetut lokitieto merkkinnät.
+ </para>
+ </entry>
+ <entry id="view-diff" md5="ff743f7a85bf7f0b7e9374d19f40a4fe" state="uptodate">
+ <title>Eronäkymä</title>
+ <para>
+ Eronäkymässä näkyy tiedoston kahden eri revision väliset erot. Tämä auttaa sinua hahmottamaan mitkä kohdat tiedostossa ovat muuttuneet. Voit tarkastella eroavaisuuksia eri muodoissa mm. eri revisiot värikoodattuna vierekkäin tai siten että eroavaisuuden on merkkitty ed-editorin komentoina.
+ </para>
+ </entry>
+ <entry id="show-deleted-files" md5="96c17a1efe41cd0e1de5c4f37d1e68f2" state="uptodate">
+ <title>Näytä/Piilota poistetut tiedostot</title>
+ <para>
+ Voit valita näytetäänkö poistetut tiedostot (Ullakolta/Attic) vai piilotetaanko poistetut tiedostot. Jos valitset asetuksen että poistetut tiedostot näytetään, niin ne näkyvät himmennettynä ja niiden vieressä on <i>roskakori</i> -ikoni.
+ </para>
+ <para>
+ Oletus on että poistetut tiedostot ovat piilotettuna.
+ </para>
+ </entry>
+</help>
--- /dev/null
+<?php
+/**
+ * Copyright 1999-2008 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (GPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
+ *
+ * @author Anil Madhavapeddy <anil@recoil.org>
+ * @author Chuck Hagenbuch <chuck@horde.org>
+ * @package Chora
+ */
+
+require_once dirname(__FILE__) . '/lib/base.php';
+
+// Exit if cvsps isn't active or it's not a subversion repository.
+if (empty($conf['paths']['cvsps']) && !is_a($VC, 'VC_svn')) {
+ header('Location: ' . Chora::url('', $where));
+ exit;
+}
+
+if (@is_dir($fullname)) {
+ Chora::fatal(_("No patchsets for directories yet."), '501 Not Implemented');
+}
+
+if (!$VC->isFile($fullname)) {
+ Chora::fatal(sprintf(_("%s: no such file or directory"), $where), '404 Not Found');
+}
+
+$ps = $VC->getPatchsetObject($where, $cache);
+Chora::checkError($ps);
+
+$title = sprintf(_("Patchsets for %s"), $where);
+$extraLink = Chora::getFileViews();
+
+Horde::addScriptFile('prototype.js', 'horde', true);
+Horde::addScriptFile('tables.js', 'horde', true);
+Horde::addScriptFile('QuickFinder.js', 'horde', true);
+require CHORA_TEMPLATES . '/common-header.inc';
+require CHORA_TEMPLATES . '/menu.inc';
+require CHORA_TEMPLATES . '/headerbar.inc';
+require CHORA_TEMPLATES . '/patchsets/header.inc';
+
+$patchsets = $ps->_patchsets;
+krsort($patchsets);
+foreach ($patchsets as $id => $patchset) {
+ $commitDate = Chora::formatTime($patchset['date']);
+ $readableDate = Chora::readableTime($patchset['date'], true);
+ $author = Chora::showAuthorName($patchset['author'], true);
+ if (is_a($VC, 'VC_svn')) {
+ // The diff should be from the top of the source tree so as to
+ // get all files.
+ $topDir = substr($where, 0, strpos($where, '/', 1));
+
+ // Subversion supports patchset diffs natively.
+ $patchset_link = Horde::link(Chora::url('diff', $topDir, array('r1' => $id - 1, 'r2' => $id, 't' => 'unified'))) .
+ $id . '</a>';
+ } else {
+ // Not supported in any other VC systems yet.
+ $patchset_link = $id;
+ }
+
+ $files = array();
+ $dir = dirname($where);
+ foreach ($patchset['members'] as $member) {
+ $file = array();
+ $mywhere = is_a($VC, 'VC_svn') ? $member['file'] : $dir . '/' . $member['file'];
+ $file['file'] = Horde::link(Chora::url('patchsets', $mywhere)) . htmlspecialchars($member['file']) . '</a>';
+ if ($member['from'] == 'INITIAL') {
+ $file['from'] = '<ins>' . _("New File") . '</ins>';
+ $file['diff'] = '';
+ } else {
+ $file['from'] = Horde::link(Chora::url('co', $mywhere, array('r' => $member['from']))) . htmlspecialchars($member['from']) . '</a>';
+ $file['diff'] = Horde::link(Chora::url('diff', $mywhere, array('r1' => $member['from'], 'r2' => $member['to'], 't' => 'unified'))) . ' ' . Horde::img('diff.png', _("Diff")) . '</a>';
+ }
+ if (substr($member['to'], -6) == '(DEAD)') {
+ $file['to'] = '<del>' . _("Deleted") . '</del>';
+ $file['diff'] = '';
+ } else {
+ $file['to'] = Horde::link(Chora::url('co', $mywhere, array('r' => $member['to']))) . htmlspecialchars($member['to']) . '</a>';
+ }
+
+ $files[] = $file;
+ }
+
+ $logMessage = Chora::formatLogMessage($patchset['log']);
+ require CHORA_TEMPLATES . '/patchsets/ps.inc';
+}
+
+require CHORA_TEMPLATES . '/patchsets/footer.inc';
+require $registry->get('templates', 'horde') . '/common-footer.inc';
--- /dev/null
+Deny from all
--- /dev/null
+see horde/po/README
\ No newline at end of file
--- /dev/null
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR Horde Project
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: dev@lists.horde.org\n"
+"POT-Creation-Date: 2008-09-18 11:24+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: templates/annotate/header.inc:4
+msgid "#"
+msgstr ""
+
+#: templates/log/header.inc:17
+#, php-format
+msgid ""
+"%1$s shows diffs to the previous revision. If you select a revision by "
+"clicking its row, %1$s will show the differences to the selected row."
+msgstr ""
+
+#: co.php:84
+#, php-format
+msgid "%s Revision %s (%s ago)"
+msgstr ""
+
+#: templates/annotate/footer.inc:22
+#, php-format
+msgid "%s ago"
+msgstr ""
+
+#: templates/diff/hr/header.inc:25
+msgid "Added"
+msgstr ""
+
+#: templates/log/header.inc:31
+msgid "All Branches"
+msgstr ""
+
+#: co.php:89
+msgid "Annotate"
+msgstr ""
+
+#: templates/directory/header.inc:12 templates/patchsets/header.inc:15
+#: templates/stats/stats.inc:4 templates/annotate/header.inc:5
+#: templates/log/header.inc:49
+msgid "Author"
+msgstr ""
+
+#: templates/checkout/checkout.inc:4 templates/diff/hr/header.inc:35
+msgid "Author:"
+msgstr ""
+
+#: templates/directory/back.inc:4
+msgid "Back"
+msgstr ""
+
+#: templates/checkout/checkout.inc:5 templates/diff/hr/header.inc:37
+msgid "Branch:"
+msgstr ""
+
+#: lib/Chora.php:502 lib/Chora.php:503 lib/Chora.php:507 lib/Chora.php:508
+msgid "Branches"
+msgstr ""
+
+#: templates/history/branch_cell.inc:2
+msgid "Branching to"
+msgstr ""
+
+#: lib/Chora.php:392
+msgid "Change repositories:"
+msgstr ""
+
+#: templates/history/rev.inc:7
+#, php-format
+msgid "Changed: %s"
+msgstr ""
+
+#: templates/checkout/checkout.inc:12
+msgid "Checkout"
+msgstr ""
+
+#: templates/cvsgraph/cvsgraph.inc:5
+msgid ""
+"Click on the links in between revisions to get a diff between those "
+"revisions."
+msgstr ""
+
+#: templates/cvsgraph/cvsgraph.inc:4
+msgid "Click on the revisions and branches to display the file."
+msgstr ""
+
+#: templates/diff/hr/header.inc:13
+msgid "Column"
+msgstr ""
+
+#: templates/stats/stats.inc:5
+msgid "Commits"
+msgstr ""
+
+#: templates/diff/hr/header.inc:12
+msgid "Context"
+msgstr ""
+
+#: config/prefs.php.dist:11
+msgid "Customize tasks to run upon logging in to Chora."
+msgstr ""
+
+#: templates/directory/header.inc:15
+msgid "Da_te"
+msgstr ""
+
+#: templates/directory/header.inc:15 templates/patchsets/header.inc:14
+#: templates/log/header.inc:48
+msgid "Date"
+msgstr ""
+
+#: templates/diff/hr/header.inc:36
+msgid "Date:"
+msgstr ""
+
+#: patchsets.php:79
+msgid "Deleted"
+msgstr ""
+
+#: templates/directory/file.inc:5 templates/directory/file.inc:28
+msgid "Deleted File"
+msgstr ""
+
+#: patchsets.php:76 templates/log/header.inc:16
+msgid "Diff"
+msgstr ""
+
+#: diff.php:71
+#, php-format
+msgid "Diff for %s between version %s and %s"
+msgstr ""
+
+#: templates/directory/dir.inc:4 templates/directory/dir.inc:6
+msgid "Directory"
+msgstr ""
+
+#: annotate.php:33 co.php:90
+msgid "Download"
+msgstr ""
+
+#: templates/diff/hr/header.inc:9
+msgid "Download diff as: "
+msgstr ""
+
+#: templates/checkout/checkout.inc:23
+#, php-format
+msgid "Download revision %s"
+msgstr ""
+
+#: templates/diff/hr/header.inc:14
+msgid "Ed Script"
+msgstr ""
+
+#: templates/error_page.inc:4
+msgid "Error"
+msgstr ""
+
+#: templates/error_page.inc:7
+msgid "Error Encountered"
+msgstr ""
+
+#: templates/directory/file.inc:7 templates/directory/file.inc:30
+#: templates/directory/header.inc:6
+msgid "File"
+msgstr ""
+
+#: templates/patchsets/header.inc:16
+msgid "Files"
+msgstr ""
+
+#: templates/diff/hr/header.inc:16
+msgid "Get Diff"
+msgstr ""
+
+#: cvsgraph.php:51
+#, php-format
+msgid "Graph for %s"
+msgstr ""
+
+#: browse.php:42
+msgid "Hide Deleted Files"
+msgstr ""
+
+#: browse.php:44
+msgid "Hide _Deleted Files"
+msgstr ""
+
+#: templates/directory/header.inc:17
+msgid "Last Log"
+msgstr ""
+
+#: templates/annotate/header.inc:8
+msgid "Line"
+msgstr ""
+
+#: templates/diff/hr/row.inc:3 templates/diff/hr/row.inc:6
+#, php-format
+msgid "Line %s"
+msgstr ""
+
+#: templates/headerbar.inc:5
+msgid "Location:"
+msgstr ""
+
+#: templates/checkout/checkout.inc:1 templates/patchsets/header.inc:17
+#: templates/diff/hr/header.inc:30 templates/log/header.inc:50
+msgid "Log Message"
+msgstr ""
+
+#: config/prefs.php.dist:10
+msgid "Login Tasks"
+msgstr ""
+
+#: lib/Chora.php:488 lib/Chora.php:489
+msgid "Logs"
+msgstr ""
+
+#: diff.php:44
+msgid "Malformed Query"
+msgstr ""
+
+#: lib/Block/tree_menu.php:3
+msgid "Menu List"
+msgstr ""
+
+#: templates/diff/hr/header.inc:26
+msgid "Modified"
+msgstr ""
+
+#: patchsets.php:72
+msgid "New File"
+msgstr ""
+
+#: templates/diff/hr/nochange.inc:3
+msgid "No Visible Changes"
+msgstr ""
+
+#: templates/log/footer.inc:8
+#, php-format
+msgid ""
+"Only showing the 100 latest revisions. %sShow all revisions?</a> (may take a "
+"while)."
+msgstr ""
+
+#: config/prefs.php.dist:9
+msgid "Other Options"
+msgstr ""
+
+#: templates/directory/back.inc:4
+msgid "Parent Directory"
+msgstr ""
+
+#: templates/patchsets/header.inc:13
+msgid "Patchset"
+msgstr ""
+
+#: lib/Chora.php:495 lib/Chora.php:496
+msgid "Patchsets"
+msgstr ""
+
+#: patchsets.php:35
+#, php-format
+msgid "Patchsets for %s"
+msgstr ""
+
+#: templates/error_page.inc:13
+msgid "Please contact"
+msgstr ""
+
+#: templates/annotate/header.inc:7
+msgid "Prev"
+msgstr ""
+
+#: templates/diff/hr/header.inc:27
+msgid "Removed"
+msgstr ""
+
+#: lib/api.php:30
+msgid "Repositories"
+msgstr ""
+
+#: templates/directory/header.inc:9 templates/annotate/header.inc:6
+msgid "Rev"
+msgstr ""
+
+#: templates/log/header.inc:47
+msgid "Revision"
+msgstr ""
+
+#: browse.php:157
+#, php-format
+msgid "Revisions for %s"
+msgstr ""
+
+#: templates/patchsets/header.inc:4
+msgid "Search Patchsets:"
+msgstr ""
+
+#: templates/log/header.inc:4
+msgid "Search Revisions:"
+msgstr ""
+
+#: templates/log/header.inc:29
+msgid "Show Branch:"
+msgstr ""
+
+#: browse.php:42
+msgid "Show Deleted Files"
+msgstr ""
+
+#: templates/log/header.inc:18
+msgid "Show Differences"
+msgstr ""
+
+#: browse.php:44
+msgid "Show _Deleted Files"
+msgstr ""
+
+#: templates/log/rev.inc:4
+msgid "Show changes to the previous revision"
+msgstr ""
+
+#: templates/log/rev.inc:6
+msgid "Show changes to the selected revision"
+msgstr ""
+
+#: templates/log/header.inc:13
+#, php-format
+msgid "Show diffs between %s and %s"
+msgstr ""
+
+#: annotate.php:30
+#, php-format
+msgid "Source Annotation of %s (revision %s)"
+msgstr ""
+
+#: history.php:163
+#, php-format
+msgid "Source Branching View for %s"
+msgstr ""
+
+#: browse.php:35
+#, php-format
+msgid "Source Directory of /%s"
+msgstr ""
+
+#: lib/Chora.php:179
+msgid ""
+"SourceRoot not found! This could be a misconfiguration by the server "
+"administrator, or the server could be having temporary problems. Please try "
+"again later."
+msgstr ""
+
+#: lib/Chora.php:513 lib/Chora.php:514
+msgid "Statistics"
+msgstr ""
+
+#: stats.php:27
+#, php-format
+msgid "Statistics for %s"
+msgstr ""
+
+#: templates/patchsets/ps.inc:22 templates/log/rev.inc:14
+msgid "Tags"
+msgstr ""
+
+#: templates/checkout/checkout.inc:6 templates/diff/hr/header.inc:38
+msgid "Tags:"
+msgstr ""
+
+#: templates/headerbar.inc:9
+msgid "Tracking Branch"
+msgstr ""
+
+#: templates/diff/hr/header.inc:11
+msgid "Unified"
+msgstr ""
+
+#: templates/diff/hr/header.inc:24
+msgid "Unmodified"
+msgstr ""
+
+#: config/prefs.php.dist:37
+msgid "Use last viewed file or directory at login time"
+msgstr ""
+
+#: templates/diff/hr/header.inc:48 templates/diff/hr/header.inc:49
+#, php-format
+msgid "Version %s"
+msgstr ""
+
+#: annotate.php:32 templates/log/header.inc:34
+msgid "View"
+msgstr ""
+
+#: lib/Chora.php:517
+msgid "View:"
+msgstr ""
+
+#: templates/directory/header.inc:12
+msgid "_Author"
+msgstr ""
+
+#: lib/Chora.php:504 lib/Chora.php:509
+msgid "_Branches"
+msgstr ""
+
+#: lib/Chora.php:469
+msgid "_Browse"
+msgstr ""
+
+#: templates/directory/header.inc:6
+msgid "_File"
+msgstr ""
+
+#: lib/Chora.php:490
+msgid "_Logs"
+msgstr ""
+
+#: lib/Chora.php:497
+msgid "_Patchsets"
+msgstr ""
+
+#: templates/directory/header.inc:9
+msgid "_Rev"
+msgstr ""
+
+#: lib/Chora.php:515
+msgid "_Statistics"
+msgstr ""
+
+#: templates/history/rev.inc:3
+#, php-format
+msgid "by %s"
+msgstr ""
+
+#: lib/Chora.php:31
+msgid "day"
+msgstr ""
+
+#: lib/Chora.php:31
+msgid "days"
+msgstr ""
+
+#: templates/error_page.inc:14
+msgid "for further information."
+msgstr ""
+
+#: lib/Chora.php:30
+msgid "hour"
+msgstr ""
+
+#: lib/Chora.php:30
+msgid "hours"
+msgstr ""
+
+#: lib/Chora.php:29
+msgid "minute"
+msgstr ""
+
+#: lib/Chora.php:29
+msgid "minutes"
+msgstr ""
+
+#: lib/Chora.php:33
+msgid "month"
+msgstr ""
+
+#: lib/Chora.php:33
+msgid "months"
+msgstr ""
+
+#: templates/history/branch_cell.inc:6
+#, php-format
+msgid "revision %s"
+msgstr ""
+
+#: lib/Chora.php:28
+msgid "second"
+msgstr ""
+
+#: lib/Chora.php:28
+msgid "seconds"
+msgstr ""
+
+#: lib/Chora.php:42
+msgid "very little time"
+msgstr ""
+
+#: lib/Chora.php:32
+msgid "week"
+msgstr ""
+
+#: lib/Chora.php:32
+msgid "weeks"
+msgstr ""
+
+#: lib/Chora.php:34
+msgid "year"
+msgstr ""
+
+#: lib/Chora.php:34
+msgid "years"
+msgstr ""
--- /dev/null
+# Chora Czech Translation.
+# Copyright (C) 2004 Horde Project
+# This file is distributed under the same license as the Horde package.
+# Pavel Chytil <pavel@chytil.tk>, 2004.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Chora 2.0-cvs\n"
+"Report-Msgid-Bugs-To: dev@lists.horde.org\n"
+"POT-Creation-Date: 2004-11-25 09:19-0800\n"
+"PO-Revision-Date: 2004-11-21 14:56-0800\n"
+"Last-Translator: Pavel Chytil <pavel@chytil.tk>\n"
+"Language-Team: Czech <dev@lists.horde.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-2\n"
+"Content-Transfer-Encoding: 8-bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%"
+"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: templates/annotate/header.inc:4
+msgid "#"
+msgstr "èíslo"
+
+#: templates/patchsets/ps.inc:12 templates/log/rev.inc:24
+#, php-format
+msgid "%s ago"
+msgstr "pøed %s"
+
+#: templates/diff/hr/footer.inc:19
+#, php-format
+msgid "Added in v.%s"
+msgstr "Pøidáno v.%s"
+
+#: templates/log/request.inc:57
+msgid "All Branches"
+msgstr "V¹echny vìtve"
+
+#: co.php:68 templates/log/rev.inc:8
+msgid "Annotate"
+msgstr "Komentovat"
+
+#: templates/stats/stats.inc:3 templates/directory/header.inc:18
+#: templates/annotate/header.inc:5
+msgid "Author"
+msgstr "Autor"
+
+#: templates/directory/back.inc:4
+msgid "Back"
+msgstr "Zpìt"
+
+#: templates/log/rev.inc:29 templates/checkout/checkout.inc:27
+msgid "Branch Point for:"
+msgstr "Vìtvící bod pro:"
+
+#: templates/patchsets/ps.inc:14 templates/log/rev.inc:26
+#: templates/checkout/checkout.inc:11
+msgid "Branch:"
+msgstr "Vìtev"
+
+#: lib/Chora.php:467
+msgid "Branches"
+msgstr "Vìtve"
+
+#: templates/history/branch_cell.inc:2
+msgid "Branching to"
+msgstr "Vìtvící se do"
+
+#: templates/log/rev.inc:35 templates/checkout/checkout.inc:35
+#, php-format
+msgid "Changed since <b>%s</b>"
+msgstr "Zmìny od <b>%s</b>"
+
+#: templates/history/rev.inc:8
+#, php-format
+msgid "Changed: %s"
+msgstr "Zmìnìn: %s"
+
+#: co.php:66
+#, php-format
+msgid "Checkout of %s (revision %s)"
+msgstr "Obdr¾ení %s (revize %s)"
+
+#: templates/cvsgraph/cvsgraph.inc:11
+msgid ""
+"Click on the links in between revisions to get a diff between those "
+"revisions."
+msgstr "Pro obdr¾ení diff, kliknìte na linky mezi po¾adovanýma revizema."
+
+#: templates/cvsgraph/cvsgraph.inc:10
+msgid "Click on the revisions and branches to display the file."
+msgstr "Pro zobrazení souboru, kliknìte na revize a vìtve."
+
+#: templates/log/rev.inc:40 templates/log/rev.inc:49
+msgid "Colored"
+msgstr "Zabarvení"
+
+#: templates/patchsets/ps.inc:17 templates/checkout/checkout.inc:19
+msgid "Commit Tags:"
+msgstr "Ukládající Znaèky:"
+
+#: templates/stats/stats.inc:4
+msgid "Commits"
+msgstr "Ulo¾ené zmìny"
+
+#: templates/log/request.inc:28
+msgid "Context"
+msgstr "Kontext"
+
+#: config/prefs.php.dist:11
+msgid "Customize tasks to run upon logging in to Chora."
+msgstr "Upravit úkoly, které se mají provést pøi pøihlá¹ení se do Chory."
+
+#: templates/directory/header.inc:23
+msgid "Da_te"
+msgstr "Da_tum"
+
+#: templates/directory/header.inc:23
+msgid "Date"
+msgstr "Datum"
+
+#: patchsets.php:66
+msgid "Deleted"
+msgstr "Smazáno"
+
+#: templates/directory/file.inc:6 templates/directory/file.inc:18
+msgid "Deleted File"
+msgstr "Smazané Soubory"
+
+#: templates/log/rev.inc:13
+msgid "Deselect"
+msgstr "Zru¹it Výbìr"
+
+#: patchsets.php:63
+msgid "Diff"
+msgstr "Diff"
+
+#: patchsets.php:46
+msgid "Diff All Files"
+msgstr "Diff V¹ech Souborù"
+
+#: diff.php:69
+#, php-format
+msgid "Diff for %s between version %s and %s"
+msgstr "Diff pro %s mezi verzemi %s a %s"
+
+#: templates/log/rev.inc:48
+#, php-format
+msgid "Diffs to <b>%s</b>"
+msgstr "Diff k <b>%s</b>"
+
+#: templates/log/rev.inc:39
+#, php-format
+msgid "Diffs to version %s"
+msgstr "Diffs do verze %s"
+
+#: templates/directory/dir.inc:5 templates/directory/dir.inc:7
+msgid "Directory"
+msgstr "Adresáø"
+
+#: annotate.php:30 co.php:69 templates/log/rev.inc:10
+msgid "Download"
+msgstr "Download"
+
+#: templates/log/request.inc:30
+msgid "Ed Script"
+msgstr "Uprav Skript"
+
+#: templates/error_page.inc:4
+msgid "Error"
+msgstr "Chyba"
+
+#: templates/error_page.inc:7
+msgid "Error Encountered"
+msgstr "Vyskytla se Chyba"
+
+#: templates/directory/file.inc:8 templates/directory/file.inc:20
+#: templates/directory/header.inc:8
+msgid "File"
+msgstr "Soubor"
+
+#: templates/patchsets/ps.inc:21
+msgid "Files Changed:"
+msgstr "Zmìnìné Soubory:"
+
+#: templates/log/request.inc:44
+msgid "Get Diffs"
+msgstr "Dostat Diffs"
+
+#: lib/Chora.php:470
+msgid "Graph"
+msgstr "Graf"
+
+#: cvsgraph.php:48
+#, php-format
+msgid "Graph for %s"
+msgstr "Graf pro %s"
+
+#: browse.php:40
+msgid "Hide Deleted Files"
+msgstr "Skrýt Smazané Soubory"
+
+#: browse.php:40
+msgid "Hide _Deleted Files"
+msgstr "Skrýt _Smazané Soubory"
+
+#: templates/log/request.inc:26
+msgid "Human Readable"
+msgstr "Èitelné Èlovìku"
+
+#: templates/directory/header.inc:25
+msgid "Last Log"
+msgstr "Poslední Záznam"
+
+#: templates/diff/hr/header.inc:5
+#, php-format
+msgid "Last Log Message for rev %s:"
+msgstr "Poslední Zaznamenaná Zpráva pro rev %s:"
+
+#: templates/diff/hr/footer.inc:5
+msgid "Legend:"
+msgstr "Legenda:"
+
+#: templates/annotate/header.inc:7
+msgid "Line"
+msgstr "Øádek"
+
+#: templates/diff/hr/row.inc:3 templates/diff/hr/row.inc:7
+#, php-format
+msgid "Line %s"
+msgstr "Øádek %s"
+
+#: templates/headerbar.inc:11
+msgid "Location:"
+msgstr "Místo:"
+
+#: templates/checkout/checkout.inc:42
+msgid "Log:"
+msgstr "Záznam:"
+
+#: config/prefs.php.dist:10
+msgid "Login Tasks"
+msgstr "Úkony Provádìné pøi Pøihlá¹ení"
+
+#: lib/Chora.php:461
+msgid "Logs"
+msgstr "Záznamy"
+
+#: templates/log/rev.inc:41 templates/log/rev.inc:50
+msgid "Long"
+msgstr "Dlouhý"
+
+#: diff.php:61
+msgid "Malformed Query"
+msgstr "©pantì Formulovaný Dotaz"
+
+#: patchsets.php:59
+msgid "New File"
+msgstr "Nový Soubor"
+
+#: templates/diff/hr/nochange.inc:6
+msgid "No Viewable Change"
+msgstr "®ádné Viditelné Zmìny"
+
+#: templates/log/rev.inc:42 templates/log/rev.inc:51
+msgid "NoWhitespaceChanges"
+msgstr "®ádné Zmìny Mezer èi Prázdných Øádkù"
+
+#: config/prefs.php.dist:9
+msgid "Other Options"
+msgstr "Dal¹í Mo¾nosti"
+
+#: lib/Chora.php:369
+msgid "Other Repositories"
+msgstr "Dal¹í zdroje CVS"
+
+#: templates/directory/back.inc:4
+msgid "Parent Directory"
+msgstr "Adresáø Pùvodu"
+
+#: templates/patchsets/ps.inc:6
+#, php-format
+msgid "PatchSet %s</span> by %s"
+msgstr "PatchSet %s</span> provedl(a) %s"
+
+#: lib/Chora.php:464
+msgid "Patchsets"
+msgstr "Patchsets"
+
+#: patchsets.php:27
+#, php-format
+msgid "Patchsets for %s"
+msgstr "Patchsets pro %s"
+
+#: templates/error_page.inc:13
+msgid "Please contact"
+msgstr "Prosím kontaktujte"
+
+#: templates/diff/hr/footer.inc:11
+#, php-format
+msgid "Removed in v.%s"
+msgstr "Odstranit v v.%s"
+
+#: templates/log/request.inc:14
+msgid "Retrieve diffs between:"
+msgstr "Obdr¾et diffs mezi:"
+
+#: templates/directory/header.inc:13 templates/annotate/header.inc:6
+msgid "Rev"
+msgstr "Rev"
+
+#: co.php:73
+#, php-format
+msgid "Revision %s for file %s not found."
+msgstr "Nebyla nalezena revize %s pro soubor %s."
+
+#: templates/checkout/checkout.inc:4
+#, php-format
+msgid "Revision <b>%s</b>, <i>%s</i> (%s ago) by %s"
+msgstr "Revize <b>%s</b>, <i>%s</i> (pøed %s) provedl(a) %s"
+
+#: templates/log/rev.inc:15
+msgid "Select for Diff"
+msgstr "Vybráno pro Diff"
+
+#: browse.php:42
+msgid "Show Deleted Files"
+msgstr "Zobrazit Smazané Soubory"
+
+#: browse.php:42
+msgid "Show _Deleted Files"
+msgstr "Zobrazit _Smazané Soubory"
+
+#: templates/log/request.inc:29
+msgid "Side-by-Side"
+msgstr "Vedle Sebe"
+
+#: templates/directory/header.inc:7 templates/directory/header.inc:12
+#: templates/directory/header.inc:17 templates/directory/header.inc:22
+msgid "Sort Order"
+msgstr "Poøadí Uspoøádání"
+
+#: annotate.php:27
+#, php-format
+msgid "Source Annotation of %s for version %s"
+msgstr "Zdrojový Komentáø k %s pro verze %s"
+
+#: history.php:160
+#, php-format
+msgid "Source Branching View for %s"
+msgstr "Zdrojové Zobrazení Vìtvení pro %s"
+
+#: browse.php:32
+#, php-format
+msgid "Source Directory of /%s"
+msgstr "Zdrojový Adresáø pro /%s"
+
+#: browse.php:126
+#, php-format
+msgid "Source Log for %s"
+msgstr "Zdrojový Záznam pro %s"
+
+#: lib/Chora.php:183
+msgid ""
+"SourceRoot not found! This could be a misconfiguration by the server "
+"administrator, or the server could be having temporary problems. Please try "
+"again later."
+msgstr ""
+"Koøenový adresáø zdroje nebyl nalezen! Toto mù¾e být zpùsobeno ¹patnou "
+"konfigurací nebo server není dostupný. Prosím zkuste to pozdìji."
+
+#: lib/Chora.php:472
+msgid "Statistics"
+msgstr "Statistiky"
+
+#: stats.php:27
+#, php-format
+msgid "Statistics for %s"
+msgstr "Statistiky pro %s"
+
+#: templates/log/rev.inc:32
+msgid "Tags:"
+msgstr "Znaèky:"
+
+#: templates/log/request.inc:5
+msgid ""
+"This form allows you to request diffs between any two revisions of a file. "
+"You may select a symbolic revision name using the selection box or you may "
+"type in a numeric name using the type-in text box."
+msgstr ""
+"Tato forma Vám umo¾ní vypsaní diffs mezi dvìma revizemi souboru. Symbolické "
+"revizní jméno mù¾e být zvoleno z výbìrového menu nebo zadáním numerického "
+"jména v textovém rámeèku."
+
+#: templates/headerbar.inc:16
+msgid "Tracking Branch"
+msgstr "Sledování Vìtve"
+
+#: templates/log/request.inc:23
+msgid "Type:"
+msgstr "Typ:"
+
+#: templates/log/request.inc:27
+msgid "Unified"
+msgstr "Sjednocený"
+
+#: templates/log/request.inc:18 templates/log/request.inc:38
+msgid "Use Text Field"
+msgstr "Pou¾ít Textových Polí"
+
+#: config/prefs.php.dist:37
+msgid "Use last viewed file or directory at login time"
+msgstr "Pou¾ít poslední prohlídnutý soubor nebo adresáø pøi pøihlá¹ení"
+
+#: annotate.php:29 templates/log/rev.inc:9
+msgid "View"
+msgstr "Zobrazit"
+
+#: templates/log/request.inc:60
+msgid "View Branch"
+msgstr "Zobrazit Vìtev"
+
+#: templates/log/request.inc:54
+msgid "View revisions on:"
+msgstr "Zobrazit revize z:"
+
+#: lib/Chora.php:474
+msgid "View:"
+msgstr "Zobrazit:"
+
+#: templates/directory/header.inc:18
+msgid "_Author"
+msgstr "_Autor"
+
+#: lib/Chora.php:467
+msgid "_Branches"
+msgstr "_Vìtve"
+
+#: lib/Chora.php:441
+msgid "_Browse"
+msgstr "_Prohlí¾et"
+
+#: templates/directory/header.inc:8
+msgid "_File"
+msgstr "_Soubor"
+
+#: lib/Chora.php:470
+msgid "_Graph"
+msgstr "_Graf"
+
+#: lib/Chora.php:461
+msgid "_Logs"
+msgstr "_Záznamy"
+
+#: lib/Chora.php:464
+msgid "_Patchsets"
+msgstr "_Patchsets"
+
+#: templates/directory/header.inc:13
+msgid "_Rev"
+msgstr "_Rev"
+
+#: lib/Chora.php:472
+msgid "_Statistics"
+msgstr "_Statistiky"
+
+#: templates/log/request.inc:35
+msgid "and:"
+msgstr "a:"
+
+#: templates/log/rev.inc:5 templates/history/rev.inc:4
+#, php-format
+msgid "by %s"
+msgstr "podle %s"
+
+#: templates/diff/hr/footer.inc:15
+msgid "changed lines"
+msgstr "zmìnìné øádky"
+
+#: lib/Chora.php:32
+msgid "day"
+msgstr "den"
+
+#: lib/Chora.php:32
+msgid "days"
+msgstr "dnù"
+
+#: templates/error_page.inc:14
+msgid "for further information."
+msgstr "pro dal¹í informace."
+
+#: lib/Chora.php:31
+msgid "hour"
+msgstr "hodina"
+
+#: lib/Chora.php:31
+msgid "hours"
+msgstr "hodin"
+
+#: lib/Chora.php:30
+msgid "minute"
+msgstr "minuta"
+
+#: lib/Chora.php:30
+msgid "minutes"
+msgstr "minuty"
+
+#: lib/Chora.php:34
+msgid "month"
+msgstr "mìsíc"
+
+#: lib/Chora.php:34
+msgid "months"
+msgstr "mìsícù"
+
+#: templates/history/branch_cell.inc:6
+#, php-format
+msgid "revision %s"
+msgstr "revize %s"
+
+#: lib/Chora.php:29
+msgid "second"
+msgstr "sekunda"
+
+#: lib/Chora.php:29
+msgid "seconds"
+msgstr "sekundy"
+
+#: templates/diff/hr/header.inc:13 templates/diff/hr/header.inc:14
+#, php-format
+msgid "version %s"
+msgstr "verze %s"
+
+#: lib/Chora.php:43
+msgid "very little time"
+msgstr "pøed chvílí"
+
+#: lib/Chora.php:33
+msgid "week"
+msgstr "týden"
+
+#: lib/Chora.php:33
+msgid "weeks"
+msgstr "týdny"
+
+#: lib/Chora.php:35
+msgid "year"
+msgstr "rok"
+
+#: lib/Chora.php:35
+msgid "years"
+msgstr "rokù"
--- /dev/null
+# Danish translations for Chora package
+# Danske oversættelser for pakke Chora.
+# Copyright (C) 2006 Horde Project
+# This file is distributed under the same license as the Chora package.
+# Brian Truelsen <horde+i18n@briantruelsen.dk>, 2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Chora H3 (2.1-cvs)\n"
+"Report-Msgid-Bugs-To: dev@lists.horde.org\n"
+"POT-Creation-Date: 2006-03-05 18:16+0100\n"
+"PO-Revision-Date: 2006-03-11 15:39+0100\n"
+"Last-Translator: Brian Truelsen <horde+i18n@briantruelsen.dk>\n"
+"Language-Team: i18n@lists.horde.org\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: templates/annotate/header.inc:3
+msgid "#"
+msgstr "#"
+
+#: templates/patchsets/ps.inc:12 templates/log/rev.inc:26
+#: templates/annotate/footer.inc:22
+#, php-format
+msgid "%s ago"
+msgstr "%s siden"
+
+#: templates/diff/hr/footer.inc:19
+#, php-format
+msgid "Added in v.%s"
+msgstr "Tilføjet i v.%s"
+
+#: templates/log/request.inc:57
+msgid "All Branches"
+msgstr "Alle forgreninger"
+
+#: co.php:72 templates/log/rev.inc:8
+msgid "Annotate"
+msgstr "Annotér"
+
+#: templates/stats/stats.inc:3 templates/directory/header.inc:12
+#: templates/annotate/header.inc:4
+msgid "Author"
+msgstr "Forfatter"
+
+#: templates/directory/back.inc:3
+msgid "Back"
+msgstr "Tilbage"
+
+#: templates/log/rev.inc:31 templates/checkout/checkout.inc:27
+msgid "Branch Point for:"
+msgstr "Forgreningspunkt for:"
+
+#: templates/patchsets/ps.inc:14 templates/log/rev.inc:28
+#: templates/checkout/checkout.inc:11
+msgid "Branch:"
+msgstr "Forgrening:"
+
+#: lib/Chora.php:455
+msgid "Branches"
+msgstr "Forgreninger"
+
+#: templates/history/branch_cell.inc:2
+msgid "Branching to"
+msgstr "Forgrén til"
+
+#: templates/log/rev.inc:37 templates/checkout/checkout.inc:35
+#, php-format
+msgid "Changed since <strong>%s</strong>"
+msgstr "Ændret siden <strong>%s</strong>"
+
+#: templates/history/rev.inc:8
+#, php-format
+msgid "Changed: %s"
+msgstr "Ændret: %s"
+
+#: co.php:70
+#, php-format
+msgid "Checkout of %s (revision %s)"
+msgstr "Checkout af %s (revision %s)"
+
+#: templates/cvsgraph/cvsgraph.inc:11
+msgid ""
+"Click on the links in between revisions to get a diff between those "
+"revisions."
+msgstr ""
+"Klik på henvisningen mellem revisioner for at få en diff mellem disse "
+"revisioner."
+
+#: templates/cvsgraph/cvsgraph.inc:10
+msgid "Click on the revisions and branches to display the file."
+msgstr "Klik på revisionerne og forgreningerne for at vise filen."
+
+#: templates/log/rev.inc:42 templates/log/rev.inc:50
+msgid "Colored"
+msgstr "Farvet"
+
+#: templates/patchsets/ps.inc:17 templates/checkout/checkout.inc:19
+msgid "Commit Tags:"
+msgstr "Fastlæggelsesmærke:"
+
+#: templates/stats/stats.inc:4
+msgid "Commits"
+msgstr "Fastlæggelser"
+
+#: templates/log/request.inc:28
+msgid "Context"
+msgstr "Sammenhæng"
+
+#: config/prefs.php.dist:11
+msgid "Customize tasks to run upon logging in to Chora."
+msgstr "Tilpas opgaver, der bliver udført, når du logger ind i Chora."
+
+#: templates/directory/header.inc:15
+msgid "Da_te"
+msgstr "Dato"
+
+#: templates/directory/header.inc:15
+msgid "Date"
+msgstr "Dato"
+
+#: patchsets.php:73
+msgid "Deleted"
+msgstr "Slettet"
+
+#: templates/directory/file.inc:5 templates/directory/file.inc:17
+msgid "Deleted File"
+msgstr "Slettet fil"
+
+#: templates/log/rev.inc:13
+msgid "Deselect"
+msgstr "Fravælg"
+
+#: patchsets.php:70
+msgid "Diff"
+msgstr "Diff"
+
+#: patchsets.php:53
+msgid "Diff All Files"
+msgstr "Diff alle filer"
+
+#: diff.php:69
+#, php-format
+msgid "Diff for %s between version %s and %s"
+msgstr "Diff for %s mellem version %s og %s"
+
+#: templates/log/rev.inc:49
+#, php-format
+msgid "Diffs to <strong>%s</strong>"
+msgstr "Diff'er til <strong>%s</strong>"
+
+#: templates/log/rev.inc:41
+#, php-format
+msgid "Diffs to version %s"
+msgstr "Diff til version %s"
+
+#: templates/directory/dir.inc:4 templates/directory/dir.inc:6
+msgid "Directory"
+msgstr "Katalog"
+
+#: annotate.php:31 co.php:73 templates/log/rev.inc:10
+msgid "Download"
+msgstr "Hent"
+
+#: templates/log/request.inc:30
+msgid "Ed Script"
+msgstr "Ed-skript"
+
+#: templates/error_page.inc:4
+msgid "Error"
+msgstr "Fejl"
+
+#: templates/error_page.inc:7
+msgid "Error Encountered"
+msgstr "Fejl optrådt"
+
+#: templates/directory/file.inc:7 templates/directory/file.inc:19
+#: templates/directory/header.inc:6
+msgid "File"
+msgstr "Fil"
+
+#: templates/patchsets/ps.inc:21
+msgid "Files Changed:"
+msgstr "Filer ændret:"
+
+#: templates/log/request.inc:44
+msgid "Get Diffs"
+msgstr "Hent diff'er"
+
+#: lib/Chora.php:458
+msgid "Graph"
+msgstr "Graf"
+
+#: cvsgraph.php:48
+#, php-format
+msgid "Graph for %s"
+msgstr "Graf for %s"
+
+#: browse.php:40
+msgid "Hide Deleted Files"
+msgstr "Skjul slettede filer"
+
+#: browse.php:40
+msgid "Hide _Deleted Files"
+msgstr "Skjul slettede filer"
+
+#: templates/log/request.inc:26
+msgid "Human Readable"
+msgstr "Læsbart"
+
+#: templates/directory/header.inc:17
+msgid "Last Log"
+msgstr "Sidste logfil"
+
+#: templates/diff/hr/header.inc:5
+#, php-format
+msgid "Last Log Message for rev %s:"
+msgstr "Sidste log-besked for rev %s:"
+
+#: templates/diff/hr/footer.inc:5
+msgid "Legend:"
+msgstr "Forklaring:"
+
+#: templates/annotate/header.inc:6
+msgid "Line"
+msgstr "Linie"
+
+#: templates/diff/hr/row.inc:3 templates/diff/hr/row.inc:7
+#, php-format
+msgid "Line %s"
+msgstr "Linie %s"
+
+#: templates/headerbar.inc:11
+msgid "Location:"
+msgstr "Sted:"
+
+#: templates/checkout/checkout.inc:42
+msgid "Log:"
+msgstr "Log:"
+
+#: config/prefs.php.dist:10
+msgid "Login Tasks"
+msgstr "Login-opgaver"
+
+#: lib/Chora.php:449
+msgid "Logs"
+msgstr "Logfiler"
+
+#: templates/log/rev.inc:43 templates/log/rev.inc:51
+msgid "Long"
+msgstr "Lang"
+
+#: diff.php:61
+msgid "Malformed Query"
+msgstr "Forkert udformet søgning"
+
+#: patchsets.php:66
+msgid "New File"
+msgstr "Ny fil"
+
+#: templates/diff/hr/nochange.inc:6
+msgid "No Viewable Change"
+msgstr "Ingen synlig ændring"
+
+#: templates/log/rev.inc:44 templates/log/rev.inc:52
+msgid "NoWhitespaceChanges"
+msgstr "NoWhitespaceChanges"
+
+#: config/prefs.php.dist:9
+msgid "Other Options"
+msgstr "Andre indstillinger"
+
+#: lib/Chora.php:354
+msgid "Other Repositories"
+msgstr "Andre arkiver"
+
+#: templates/directory/back.inc:3
+msgid "Parent Directory"
+msgstr "Forældre-katalog"
+
+#: templates/patchsets/ps.inc:6
+#, php-format
+msgid "PatchSet %s</span> by %s"
+msgstr "Lappegrej %s</span> af %s"
+
+#: lib/Chora.php:452
+msgid "Patchsets"
+msgstr "Lappegrejer"
+
+#: patchsets.php:32
+#, php-format
+msgid "Patchsets for %s"
+msgstr "Lappegrejer for %s"
+
+#: templates/error_page.inc:13
+msgid "Please contact"
+msgstr "Kontakt"
+
+#: templates/diff/hr/footer.inc:11
+#, php-format
+msgid "Removed in v.%s"
+msgstr "Slette i v.%s"
+
+#: lib/api.php:30
+msgid "Repositories"
+msgstr "Arkiver"
+
+#: templates/log/request.inc:14
+msgid "Retrieve diffs between:"
+msgstr "Fremskaf diff'er mellem:"
+
+#: templates/directory/header.inc:9 templates/annotate/header.inc:5
+msgid "Rev"
+msgstr "Rev"
+
+#: co.php:77
+#, php-format
+msgid "Revision %s for file %s not found."
+msgstr "Revision %s for fil %s ikke fundet."
+
+#: templates/checkout/checkout.inc:4
+#, php-format
+msgid "Revision <strong>%s</strong>, <em>%s</em> (%s ago) by %s"
+msgstr "Revision <strong>%s</strong>, <em>%s</em> (%s siden) af %s"
+
+#: templates/log/rev.inc:15
+msgid "Select for Diff"
+msgstr "Vælg for Diff"
+
+#: browse.php:42
+msgid "Show Deleted Files"
+msgstr "Vis slettede filer"
+
+#: browse.php:42
+msgid "Show _Deleted Files"
+msgstr "Vis slettede filer"
+
+#: templates/log/request.inc:29
+msgid "Side-by-Side"
+msgstr "Side-om-side"
+
+#: annotate.php:28
+#, php-format
+msgid "Source Annotation of %s for version %s"
+msgstr "Kilde-annotering af %s for version %s"
+
+#: history.php:160
+#, php-format
+msgid "Source Branching View for %s"
+msgstr "Kildeforgreningsvisning for %s"
+
+#: browse.php:32
+#, php-format
+msgid "Source Directory of /%s"
+msgstr "Kildekatalog af /%s"
+
+#: browse.php:125
+#, php-format
+msgid "Source Log for %s"
+msgstr "Kildelog af %s"
+
+#: lib/Chora.php:175
+msgid ""
+"SourceRoot not found! This could be a misconfiguration by the server "
+"administrator, or the server could be having temporary problems. Please try "
+"again later."
+msgstr ""
+"Kilderod ikke fundet! Dette kan være en fejlkonfiguration af "
+"serveradministratoren, eller serveren kan være ude for midlertidige "
+"problemer. Prøv igen senere."
+
+#: lib/Chora.php:460
+msgid "Statistics"
+msgstr "Statistikker"
+
+#: stats.php:27
+#, php-format
+msgid "Statistics for %s"
+msgstr "Statistikker for %s"
+
+#: templates/log/rev.inc:34
+msgid "Tags:"
+msgstr "Mærker:"
+
+#: templates/log/request.inc:5
+msgid ""
+"This form allows you to request diffs between any two revisions of a file. "
+"You may select a symbolic revision name using the selection box or you may "
+"type in a numeric name using the type-in text box."
+msgstr ""
+"Dette skema tillader dig at anmode om diff'er mellem vilkårlige, to "
+"revisioner af en fil. Du kan vælge et symbolsk revisionsnavn ved brug af "
+"valg-kasserne eller du kan indtaste et numerisk navn ved brug af tekst-"
+"indtastningsfeltet."
+
+#: templates/headerbar.inc:16
+msgid "Tracking Branch"
+msgstr "Spore gren"
+
+#: templates/log/request.inc:23
+msgid "Type:"
+msgstr "Type:"
+
+#: templates/log/request.inc:27
+msgid "Unified"
+msgstr "Sammensmeltet"
+
+#: templates/log/request.inc:18 templates/log/request.inc:38
+msgid "Use Text Field"
+msgstr "Brug tekst-felt"
+
+#: config/prefs.php.dist:37
+msgid "Use last viewed file or directory at login time"
+msgstr "Brug sidst sete fil eller katalog ved logind."
+
+#: annotate.php:30 templates/log/rev.inc:9
+msgid "View"
+msgstr "Se"
+
+#: templates/log/request.inc:60
+msgid "View Branch"
+msgstr "Se gren"
+
+#: templates/log/request.inc:54
+msgid "View revisions on:"
+msgstr "Se revisioner på:"
+
+#: lib/Chora.php:462
+msgid "View:"
+msgstr "Se:"
+
+#: templates/directory/header.inc:12
+msgid "_Author"
+msgstr "Forfatter"
+
+#: lib/Chora.php:455
+msgid "_Branches"
+msgstr "Foregreninger"
+
+#: lib/Chora.php:433
+msgid "_Browse"
+msgstr "Skim"
+
+#: templates/directory/header.inc:6
+msgid "_File"
+msgstr "Fil"
+
+#: lib/Chora.php:458
+msgid "_Graph"
+msgstr "Graf"
+
+#: lib/Chora.php:449
+msgid "_Logs"
+msgstr "Logninger"
+
+#: lib/Chora.php:452
+msgid "_Patchsets"
+msgstr "Lappesæt"
+
+#: templates/directory/header.inc:9
+msgid "_Rev"
+msgstr "Rev"
+
+#: lib/Chora.php:460
+msgid "_Statistics"
+msgstr "Statistikker"
+
+#: templates/log/request.inc:35
+msgid "and:"
+msgstr "og:"
+
+#: templates/log/rev.inc:5 templates/history/rev.inc:4
+#, php-format
+msgid "by %s"
+msgstr "af %s"
+
+#: templates/diff/hr/footer.inc:15
+msgid "changed lines"
+msgstr "ændrede linier"
+
+#: lib/Chora.php:31
+msgid "day"
+msgstr "dag"
+
+#: lib/Chora.php:31
+msgid "days"
+msgstr "dage"
+
+#: templates/error_page.inc:14
+msgid "for further information."
+msgstr "for yderligere oplysninger."
+
+#: lib/Chora.php:30
+msgid "hour"
+msgstr "time"
+
+#: lib/Chora.php:30
+msgid "hours"
+msgstr "timer"
+
+#: lib/Chora.php:29
+msgid "minute"
+msgstr "minut"
+
+#: lib/Chora.php:29
+msgid "minutes"
+msgstr "minutter"
+
+#: lib/Chora.php:33
+msgid "month"
+msgstr "måned"
+
+#: lib/Chora.php:33
+msgid "months"
+msgstr "måneder"
+
+#: templates/history/branch_cell.inc:6
+#, php-format
+msgid "revision %s"
+msgstr "revision %s"
+
+#: lib/Chora.php:28
+msgid "second"
+msgstr "sekund"
+
+#: lib/Chora.php:28
+msgid "seconds"
+msgstr "sekunder"
+
+#: templates/diff/hr/header.inc:13 templates/diff/hr/header.inc:14
+#, php-format
+msgid "version %s"
+msgstr "version %s"
+
+#: lib/Chora.php:42
+msgid "very little time"
+msgstr "meget lidt tid"
+
+#: lib/Chora.php:32
+msgid "week"
+msgstr "uge"
+
+#: lib/Chora.php:32
+msgid "weeks"
+msgstr "uger"
+
+#: lib/Chora.php:34
+msgid "year"
+msgstr "år"
+
+#: lib/Chora.php:34
+msgid "years"
+msgstr "år"
--- /dev/null
+# German translation for Chora.
+# Copyright (C) 2001-2008 Horde Project
+# This file is distributed under the same license as the Chora package.
+# Jan Schneider <jan@horde.org>, 2001-2008.
+msgid ""
+msgstr ""
+"Project-Id-Version: Chora 3.0-cvs\n"
+"Report-Msgid-Bugs-To: dev@lists.horde.org\n"
+"POT-Creation-Date: 2008-09-18 11:24+0200\n"
+"PO-Revision-Date: 2008-04-01 15:05+0200\n"
+"Last-Translator: Jan Schneider <jan@horde.org>\n"
+"Language-Team: German <dev@lists.horde.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=iso-8859-1\n"
+"Content-Transfer-Encoding: 8-bit\n"
+
+#: templates/annotate/header.inc:4
+msgid "#"
+msgstr "Nr."
+
+#: templates/log/header.inc:17
+#, php-format
+msgid ""
+"%1$s shows diffs to the previous revision. If you select a revision by "
+"clicking its row, %1$s will show the differences to the selected row."
+msgstr ""
+"%1$s zeigt die Unterschiede zur vorigen Version an. Wenn Sie eine Version "
+"durch Klicken auf deren Zeile ausgewählt haben, zeigt %1$s die Unterschiede "
+"zu der ausgewählten Version an."
+
+#: co.php:84
+#, php-format
+msgid "%s Revision %s (%s ago)"
+msgstr "%s Version %s (vor %s)"
+
+#: templates/annotate/footer.inc:22
+#, php-format
+msgid "%s ago"
+msgstr "vor %s"
+
+#: templates/diff/hr/header.inc:25
+msgid "Added"
+msgstr "Hinzugefügt"
+
+#: templates/log/header.inc:31
+msgid "All Branches"
+msgstr "Alle Branches"
+
+#: co.php:89
+msgid "Annotate"
+msgstr "Kommentiert"
+
+#: templates/directory/header.inc:12 templates/patchsets/header.inc:15
+#: templates/stats/stats.inc:4 templates/annotate/header.inc:5
+#: templates/log/header.inc:49
+msgid "Author"
+msgstr "Autor"
+
+#: templates/checkout/checkout.inc:4 templates/diff/hr/header.inc:35
+msgid "Author:"
+msgstr "Autor:"
+
+#: templates/directory/back.inc:4
+msgid "Back"
+msgstr "Zurück"
+
+#: templates/checkout/checkout.inc:5 templates/diff/hr/header.inc:37
+msgid "Branch:"
+msgstr "Branch:"
+
+#: lib/Chora.php:502 lib/Chora.php:503 lib/Chora.php:507 lib/Chora.php:508
+msgid "Branches"
+msgstr "Branches"
+
+#: templates/history/branch_cell.inc:2
+msgid "Branching to"
+msgstr "Branching nach"
+
+#: lib/Chora.php:392
+msgid "Change repositories:"
+msgstr "Repository ändern:"
+
+#: templates/history/rev.inc:7
+#, php-format
+msgid "Changed: %s"
+msgstr "Geändert: %s"
+
+#: templates/checkout/checkout.inc:12
+msgid "Checkout"
+msgstr "Checkout"
+
+#: templates/cvsgraph/cvsgraph.inc:5
+msgid ""
+"Click on the links in between revisions to get a diff between those "
+"revisions."
+msgstr ""
+"Klicken Sie auf die Links zwischen den Versionen, um den Unterschied "
+"zwischen diesen Versionen anzuzeigen."
+
+#: templates/cvsgraph/cvsgraph.inc:4
+msgid "Click on the revisions and branches to display the file."
+msgstr "Klicken Sie auf die Versionen oder Branches, um die Datei anzuzeigen."
+
+#: templates/diff/hr/header.inc:13
+msgid "Column"
+msgstr "Spalte"
+
+#: templates/stats/stats.inc:5
+msgid "Commits"
+msgstr "Commits"
+
+#: templates/diff/hr/header.inc:12
+msgid "Context"
+msgstr "Context"
+
+#: config/prefs.php.dist:11
+msgid "Customize tasks to run upon logging in to Chora."
+msgstr ""
+"Legen Sie fest, was nach der Anmeldung bei Chora durchgeführt werden soll."
+
+#: templates/directory/header.inc:15
+msgid "Da_te"
+msgstr "Da_tum"
+
+#: templates/directory/header.inc:15 templates/patchsets/header.inc:14
+#: templates/log/header.inc:48
+msgid "Date"
+msgstr "Datum"
+
+#: templates/diff/hr/header.inc:36
+msgid "Date:"
+msgstr "Datum:"
+
+#: patchsets.php:79
+msgid "Deleted"
+msgstr "Gelöscht"
+
+#: templates/directory/file.inc:5 templates/directory/file.inc:28
+msgid "Deleted File"
+msgstr "Gelöschte Dateien"
+
+#: patchsets.php:76 templates/log/header.inc:16
+msgid "Diff"
+msgstr "Unterschiede"
+
+#: diff.php:71
+#, php-format
+msgid "Diff for %s between version %s and %s"
+msgstr "Unterschied von %s zwischen den Versionen %s und %s"
+
+#: templates/directory/dir.inc:4 templates/directory/dir.inc:6
+msgid "Directory"
+msgstr "Verzeichnis"
+
+#: annotate.php:33 co.php:90
+msgid "Download"
+msgstr "Herunterladen"
+
+#: templates/diff/hr/header.inc:9
+msgid "Download diff as: "
+msgstr "Unterschiede herunterladen als: "
+
+#: templates/checkout/checkout.inc:23
+#, php-format
+msgid "Download revision %s"
+msgstr "Version %s herunterladen"
+
+#: templates/diff/hr/header.inc:14
+msgid "Ed Script"
+msgstr "Ed Script"
+
+#: templates/error_page.inc:4
+msgid "Error"
+msgstr "Fehler"
+
+#: templates/error_page.inc:7
+msgid "Error Encountered"
+msgstr "Ein Fehler ist aufgetreten"
+
+#: templates/directory/file.inc:7 templates/directory/file.inc:30
+#: templates/directory/header.inc:6
+msgid "File"
+msgstr "Datei"
+
+#: templates/patchsets/header.inc:16
+msgid "Files"
+msgstr "Dateien"
+
+#: templates/diff/hr/header.inc:16
+msgid "Get Diff"
+msgstr "Unterschiede herunterladen"
+
+#: cvsgraph.php:51
+#, php-format
+msgid "Graph for %s"
+msgstr "Grafik für %s"
+
+#: browse.php:42
+msgid "Hide Deleted Files"
+msgstr "Gelöschte Dateien verstecken"
+
+#: browse.php:44
+msgid "Hide _Deleted Files"
+msgstr "_Gelöschte Dateien verstecken"
+
+#: templates/directory/header.inc:17
+msgid "Last Log"
+msgstr "Letzter Eintrag"
+
+#: templates/annotate/header.inc:8
+msgid "Line"
+msgstr "Zeile"
+
+#: templates/diff/hr/row.inc:3 templates/diff/hr/row.inc:6
+#, php-format
+msgid "Line %s"
+msgstr "Zeile %s"
+
+#: templates/headerbar.inc:5
+msgid "Location:"
+msgstr "Position:"
+
+#: templates/checkout/checkout.inc:1 templates/patchsets/header.inc:17
+#: templates/diff/hr/header.inc:30 templates/log/header.inc:50
+msgid "Log Message"
+msgstr "Änderungseintrag"
+
+#: config/prefs.php.dist:10
+msgid "Login Tasks"
+msgstr "Anmeldeaufgaben"
+
+#: lib/Chora.php:488 lib/Chora.php:489
+msgid "Logs"
+msgstr "Logs"
+
+#: diff.php:44
+msgid "Malformed Query"
+msgstr "Ungültige Abfrage"
+
+#: lib/Block/tree_menu.php:3
+msgid "Menu List"
+msgstr "Menüliste"
+
+#: templates/diff/hr/header.inc:26
+msgid "Modified"
+msgstr "Geändert"
+
+#: patchsets.php:72
+msgid "New File"
+msgstr "Neue Datei"
+
+#: templates/diff/hr/nochange.inc:3
+msgid "No Visible Changes"
+msgstr "Keine sichtbaren Änderungen"
+
+#: templates/log/footer.inc:8
+#, php-format
+msgid ""
+"Only showing the 100 latest revisions. %sShow all revisions?</a> (may take a "
+"while)."
+msgstr ""
+"Nur die letzten 100 Versionen werden angezeigt. %sAlle Versionen anzeigen?</"
+"a> (kann eine Weile dauern)."
+
+#: config/prefs.php.dist:9
+msgid "Other Options"
+msgstr "Andere Einstellungen"
+
+#: templates/directory/back.inc:4
+msgid "Parent Directory"
+msgstr "Verzeichnis hoch"
+
+#: templates/patchsets/header.inc:13
+msgid "Patchset"
+msgstr "Patchsatz"
+
+#: lib/Chora.php:495 lib/Chora.php:496
+msgid "Patchsets"
+msgstr "Patchsätze"
+
+#: patchsets.php:35
+#, php-format
+msgid "Patchsets for %s"
+msgstr "Patchsätze für %s"
+
+#: templates/error_page.inc:13
+msgid "Please contact"
+msgstr "Bitte kontaktieren Sie"
+
+#: templates/annotate/header.inc:7
+msgid "Prev"
+msgstr "Zurück"
+
+#: templates/diff/hr/header.inc:27
+msgid "Removed"
+msgstr "Entfernt"
+
+#: lib/api.php:30
+msgid "Repositories"
+msgstr "Repositories"
+
+#: templates/directory/header.inc:9 templates/annotate/header.inc:6
+msgid "Rev"
+msgstr "Rev"
+
+#: templates/log/header.inc:47
+msgid "Revision"
+msgstr "Version"
+
+#: browse.php:157
+#, php-format
+msgid "Revisions for %s"
+msgstr "Versionen für %s"
+
+#: templates/patchsets/header.inc:4
+msgid "Search Patchsets:"
+msgstr "Patchsätze suchen:"
+
+#: templates/log/header.inc:4
+msgid "Search Revisions:"
+msgstr "Versionen suchen:"
+
+#: templates/log/header.inc:29
+msgid "Show Branch:"
+msgstr "Branch anzeigen:"
+
+#: browse.php:42
+msgid "Show Deleted Files"
+msgstr "Gelöschte Dateien anzeigen"
+
+#: templates/log/header.inc:18
+msgid "Show Differences"
+msgstr "Unterschiede anzeigen"
+
+#: browse.php:44
+msgid "Show _Deleted Files"
+msgstr "_Gelöschte Dateien anzeigen"
+
+#: templates/log/rev.inc:4
+msgid "Show changes to the previous revision"
+msgstr "Änderungen zur vorigen Version anzeigen"
+
+#: templates/log/rev.inc:6
+msgid "Show changes to the selected revision"
+msgstr "Änderungen zur ausgewählten Version anzeigen"
+
+#: templates/log/header.inc:13
+#, php-format
+msgid "Show diffs between %s and %s"
+msgstr "Unterschiede zwischen %s und %s anzeigen"
+
+#: annotate.php:30
+#, php-format
+msgid "Source Annotation of %s (revision %s)"
+msgstr "Quell-Kommentar von %s (Version %s)"
+
+#: history.php:163
+#, php-format
+msgid "Source Branching View for %s"
+msgstr "Branch Ansicht für %s"
+
+#: browse.php:35
+#, php-format
+msgid "Source Directory of /%s"
+msgstr "Verzeichnis von /%s"
+
+#: lib/Chora.php:179
+msgid ""
+"SourceRoot not found! This could be a misconfiguration by the server "
+"administrator, or the server could be having temporary problems. Please try "
+"again later."
+msgstr ""
+"SourceRoot nicht gefunden! Gründe könnten eine fehlerhafte Konfiguration "
+"durch den Administrator oder vorübergehende Probleme mit dem Server sein. "
+"Bitte versuchen Sie es später noch einmal."
+
+#: lib/Chora.php:513 lib/Chora.php:514
+msgid "Statistics"
+msgstr "Statistiken"
+
+#: stats.php:27
+#, php-format
+msgid "Statistics for %s"
+msgstr "Statistik für %s"
+
+#: templates/patchsets/ps.inc:22 templates/log/rev.inc:14
+msgid "Tags"
+msgstr "Tags"
+
+#: templates/checkout/checkout.inc:6 templates/diff/hr/header.inc:38
+msgid "Tags:"
+msgstr "Tags:"
+
+#: templates/headerbar.inc:9
+msgid "Tracking Branch"
+msgstr "Angezeigter Branch:"
+
+#: templates/diff/hr/header.inc:11
+msgid "Unified"
+msgstr "Unified"
+
+#: templates/diff/hr/header.inc:24
+msgid "Unmodified"
+msgstr "Keine Änderung"
+
+#: config/prefs.php.dist:37
+msgid "Use last viewed file or directory at login time"
+msgstr ""
+"Zuletzt geöffnete Datei oder Verzeichnis nach der Anmeldung wieder verwenden"
+
+#: templates/diff/hr/header.inc:48 templates/diff/hr/header.inc:49
+#, php-format
+msgid "Version %s"
+msgstr "Version %s"
+
+#: annotate.php:32 templates/log/header.inc:34
+msgid "View"
+msgstr "Anzeigen"
+
+#: lib/Chora.php:517
+msgid "View:"
+msgstr "Anzeigen:"
+
+#: templates/directory/header.inc:12
+msgid "_Author"
+msgstr "_Autor"
+
+#: lib/Chora.php:504 lib/Chora.php:509
+msgid "_Branches"
+msgstr "_Branches"
+
+#: lib/Chora.php:469
+msgid "_Browse"
+msgstr "_Liste"
+
+#: templates/directory/header.inc:6
+msgid "_File"
+msgstr "_Datei"
+
+#: lib/Chora.php:490
+msgid "_Logs"
+msgstr "_Logs"
+
+#: lib/Chora.php:497
+msgid "_Patchsets"
+msgstr "_Patchsätze"
+
+#: templates/directory/header.inc:9
+msgid "_Rev"
+msgstr "_Rev"
+
+#: lib/Chora.php:515
+msgid "_Statistics"
+msgstr "_Statistiken"
+
+#: templates/history/rev.inc:3
+#, php-format
+msgid "by %s"
+msgstr "von %s"
+
+#: lib/Chora.php:31
+msgid "day"
+msgstr "Tag"
+
+#: lib/Chora.php:31
+msgid "days"
+msgstr "Tage"
+
+#: templates/error_page.inc:14
+msgid "for further information."
+msgstr "für weitere Informationen."
+
+#: lib/Chora.php:30
+msgid "hour"
+msgstr "Stunde"
+
+#: lib/Chora.php:30
+msgid "hours"
+msgstr "Stunden"
+
+#: lib/Chora.php:29
+msgid "minute"
+msgstr "Minute"
+
+#: lib/Chora.php:29
+msgid "minutes"
+msgstr "Minuten"
+
+#: lib/Chora.php:33
+msgid "month"
+msgstr "Monat"
+
+#: lib/Chora.php:33
+msgid "months"
+msgstr "Monaten"
+
+#: templates/history/branch_cell.inc:6
+#, php-format
+msgid "revision %s"
+msgstr "Version %s"
+
+#: lib/Chora.php:28
+msgid "second"
+msgstr "Sekunde"
+
+#: lib/Chora.php:28
+msgid "seconds"
+msgstr "Sekunden"
+
+#: lib/Chora.php:42
+msgid "very little time"
+msgstr "sehr kurze Zeit"
+
+#: lib/Chora.php:32
+msgid "week"
+msgstr "Woche"
+
+#: lib/Chora.php:32
+msgid "weeks"
+msgstr "Wochen"
+
+#: lib/Chora.php:34
+msgid "year"
+msgstr "Jahr"
+
+#: lib/Chora.php:34
+msgid "years"
+msgstr "Jahre"
--- /dev/null
+# Spanish translations for chora package
+# Traducciones al español para el paquete chora.
+# Copyright (C) 2008 Horde Project
+# This file is distributed under the same license as the chora package.
+# Automatically generated, 2008.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Chora 2.1-cvs\n"
+"Report-Msgid-Bugs-To: dev@lists.horde.org\n"
+"POT-Creation-Date: 2008-03-18 08:46+0100\n"
+"PO-Revision-Date: 2008-03-18 08:46+0100\n"
+"Last-Translator: Manuel P. Ayala <mayala@unex.es>\n"
+"Language-Team: i18n@lists.horde.org\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: templates/annotate/header.inc:4
+msgid "#"
+msgstr "#"
+
+#: templates/log/header.inc:17
+#, php-format
+msgid ""
+"%1$s shows diffs to the previous revision. If you select a revision by "
+"clicking its row, %1$s will show the differences to the selected row."
+msgstr ""
+"%1$s muestra las diferencias con la revisión anterior. Si selecciona una "
+"revisión pulsando su fila, %1$s mostrará las diferencias de la fila "
+"seleccionada."
+
+#: co.php:84
+#, php-format
+msgid "%s Revision %s (%s ago)"
+msgstr "%s Revisión %s (hace %s)"
+
+#: templates/annotate/footer.inc:22
+#, php-format
+msgid "%s ago"
+msgstr "hace %s"
+
+#: templates/diff/hr/header.inc:25
+msgid "Added"
+msgstr "Añadido"
+
+#: templates/log/header.inc:31
+msgid "All Branches"
+msgstr "Todas las ramas"
+
+#: co.php:89
+msgid "Annotate"
+msgstr "Anotaciones"
+
+#: templates/log/header.inc:60 templates/patchsets/header.inc:15
+#: templates/directory/header.inc:12 templates/stats/stats.inc:4
+#: templates/annotate/header.inc:5
+msgid "Author"
+msgstr "Autor"
+
+#: templates/checkout/checkout.inc:4
+msgid "Author:"
+msgstr "Autor:"
+
+#: templates/directory/back.inc:4
+msgid "Back"
+msgstr "Atrás"
+
+#: templates/checkout/checkout.inc:5
+msgid "Branch:"
+msgstr "Rama:"
+
+#: lib/Chora.php:494 lib/Chora.php:495 lib/Chora.php:499 lib/Chora.php:500
+msgid "Branches"
+msgstr "Ramas"
+
+#: templates/history/branch_cell.inc:2
+msgid "Branching to"
+msgstr "Ramificando a"
+
+#: lib/Chora.php:384
+msgid "Change repositories:"
+msgstr "Cambiar depósitos:"
+
+#: templates/history/rev.inc:7
+#, php-format
+msgid "Changed: %s"
+msgstr "Cambiado: %s"
+
+#: templates/checkout/checkout.inc:12
+msgid "Checkout"
+msgstr "Inspeccionar"
+
+#: templates/cvsgraph/cvsgraph.inc:5
+msgid ""
+"Click on the links in between revisions to get a diff between those "
+"revisions."
+msgstr ""
+"Haga click sobre los vínculos entre las revisiones para obtener las "
+"diferencias entre dichas revisiones."
+
+#: templates/cvsgraph/cvsgraph.inc:4
+msgid "Click on the revisions and branches to display the file."
+msgstr "Haga click sobre las revisiones y ramas para mostrar el archivo."
+
+#: templates/diff/hr/header.inc:13
+msgid "Column"
+msgstr "Columna"
+
+#: templates/stats/stats.inc:5
+msgid "Commits"
+msgstr "Actualizaciones"
+
+#: templates/diff/hr/header.inc:12
+msgid "Context"
+msgstr "Contexto"
+
+#: config/.bak/prefs.php.dist:11
+msgid "Customize tasks to run upon logging in to Chora."
+msgstr "Personalice las tareas a ejecutar al iniciar sesión en Chora."
+
+#: templates/directory/header.inc:15
+msgid "Da_te"
+msgstr "_Fecha"
+
+#: templates/log/header.inc:59 templates/patchsets/header.inc:14
+#: templates/directory/header.inc:15
+msgid "Date"
+msgstr "Fecha"
+
+#: patchsets.php:86
+msgid "Deleted"
+msgstr "Eliminado"
+
+#: templates/directory/file.inc:5 templates/directory/file.inc:17
+msgid "Deleted File"
+msgstr "Archivo eliminado"
+
+#: patchsets.php:83 templates/log/header.inc:16
+msgid "Diff"
+msgstr "Diferencias"
+
+#: diff.php:70
+#, php-format
+msgid "Diff for %s between version %s and %s"
+msgstr "Diferencias de %s entre la versión %s y la %s"
+
+#: templates/directory/dir.inc:4 templates/directory/dir.inc:6
+msgid "Directory"
+msgstr "Directorio"
+
+#: annotate.php:33 co.php:90
+msgid "Download"
+msgstr "Descargar"
+
+#: templates/diff/hr/header.inc:9
+msgid "Download diff as: "
+msgstr "Descargar diff como: "
+
+#: templates/checkout/checkout.inc:23
+#, php-format
+msgid "Download revision %s"
+msgstr "Descargar revisión %s"
+
+# ¿Dónde está?
+#: templates/diff/hr/header.inc:14
+msgid "Ed Script"
+msgstr "Script Ed"
+
+#: templates/error_page.inc:4
+msgid "Error"
+msgstr "Error"
+
+#: templates/error_page.inc:7
+msgid "Error Encountered"
+msgstr "Se ha encontrado un error"
+
+#: templates/directory/file.inc:7 templates/directory/file.inc:19
+#: templates/directory/header.inc:6
+msgid "File"
+msgstr "Archivo"
+
+#: templates/patchsets/header.inc:16
+msgid "Files"
+msgstr "Archivos"
+
+#: templates/diff/hr/header.inc:16
+msgid "Get Diff"
+msgstr "Obtener diferencias"
+
+#: cvsgraph.php:51
+#, php-format
+msgid "Graph for %s"
+msgstr "Gráfico de %s"
+
+#: browse.php:58
+msgid "Hide Deleted Files"
+msgstr "Ocultar archivos eliminados"
+
+#: browse.php:58
+msgid "Hide _Deleted Files"
+msgstr "_Ocultar archivos eliminados"
+
+#: templates/directory/header.inc:17
+msgid "Last Log"
+msgstr "Último registro"
+
+#: templates/annotate/header.inc:8
+msgid "Line"
+msgstr "Línea"
+
+#: templates/diff/hr/row.inc:3 templates/diff/hr/row.inc:6
+#, php-format
+msgid "Line %s"
+msgstr "Línea %s"
+
+#: templates/headerbar.inc:5
+msgid "Location:"
+msgstr "Ubicación:"
+
+#: templates/log/header.inc:61 templates/patchsets/header.inc:17
+#: templates/checkout/checkout.inc:1
+msgid "Log Message"
+msgstr "Mensaje de registro"
+
+#: config/.bak/prefs.php.dist:10
+msgid "Login Tasks"
+msgstr "Tareas de inicio de sesión"
+
+#: lib/Chora.php:480 lib/Chora.php:481
+msgid "Logs"
+msgstr "Registros"
+
+#: diff.php:44
+msgid "Malformed Query"
+msgstr "Consulta malformada"
+
+#: lib/Block/tree_menu.php:3
+msgid "Menu List"
+msgstr "Lista del menú"
+
+#: templates/diff/hr/header.inc:26
+msgid "Modified"
+msgstr "Modificado"
+
+#: patchsets.php:79
+msgid "New File"
+msgstr "Nuevo archivo"
+
+#: templates/diff/hr/nochange.inc:3
+msgid "No Visible Changes"
+msgstr "Sin cambios visibles"
+
+#: templates/log/header.inc:47
+#, php-format
+msgid ""
+"Only showing the 100 latest revisions. %sShow all revisions?</a> (may take a "
+"while)."
+msgstr ""
+"Sólo se muestran las 100 últimas revisiones. %s¿Mostrar todas las revisiones?"
+"</a> (puede llevar un rato)."
+
+#: config/.bak/prefs.php.dist:9
+msgid "Other Options"
+msgstr "Otras opciones"
+
+#: templates/directory/back.inc:4
+msgid "Parent Directory"
+msgstr "Directorio anterior"
+
+#: templates/patchsets/header.inc:13
+msgid "Patchset"
+msgstr "Parche"
+
+#: lib/Chora.php:487 lib/Chora.php:488
+msgid "Patchsets"
+msgstr "Parches"
+
+#: patchsets.php:35
+#, php-format
+msgid "Patchsets for %s"
+msgstr "Parches de %s"
+
+#: templates/error_page.inc:13
+msgid "Please contact"
+msgstr "Póngase en contacto con"
+
+#: templates/annotate/header.inc:7
+msgid "Prev"
+msgstr "Ant"
+
+#: templates/diff/hr/header.inc:27
+msgid "Removed"
+msgstr "Eliminado"
+
+#: lib/api.php:30
+msgid "Repositories"
+msgstr "Depósitos"
+
+#: templates/directory/header.inc:9 templates/annotate/header.inc:6
+msgid "Rev"
+msgstr "Rev"
+
+#: templates/log/header.inc:58
+msgid "Revision"
+msgstr "Revisión"
+
+#: browse.php:154
+#, php-format
+msgid "Revisions for %s"
+msgstr "Revisión de %s"
+
+#: templates/patchsets/header.inc:4
+msgid "Search Patchsets:"
+msgstr "Buscar parches:"
+
+#: templates/log/header.inc:4
+msgid "Search Revisions:"
+msgstr "Buscar revisiones:"
+
+#: templates/log/header.inc:29
+msgid "Show Branch:"
+msgstr "Mostrar rama:"
+
+#: browse.php:60
+msgid "Show Deleted Files"
+msgstr "Mostrar archivos eliminados"
+
+#: templates/log/header.inc:18
+msgid "Show Differences"
+msgstr "Mostrar diferencias"
+
+#: browse.php:60
+msgid "Show _Deleted Files"
+msgstr "_Mostrar archivos eliminados"
+
+#: templates/log/rev.inc:4
+msgid "Show changes to the previous revision"
+msgstr "Mostrar cambios desde la revisión anterior"
+
+#: templates/log/rev.inc:6
+msgid "Show changes to the selected revision"
+msgstr "Mostrar cambios con respecto a la revisión seleccionada"
+
+#: templates/log/header.inc:13
+#, php-format
+msgid "Show diffs between %s and %s"
+msgstr "Mostrar diferencias entre %s y %s"
+
+#: annotate.php:30
+#, php-format
+msgid "Source Annotation of %s (revision %s)"
+msgstr "Anotación origen de %s (revisión %s)"
+
+#: history.php:163
+#, php-format
+msgid "Source Branching View for %s"
+msgstr "Vista ramificada origen de %s"
+
+#: browse.php:52
+#, php-format
+msgid "Source Directory of /%s"
+msgstr "Directorio origen de /%s"
+
+#: lib/Chora.php:179
+msgid ""
+"SourceRoot not found! This could be a misconfiguration by the server "
+"administrator, or the server could be having temporary problems. Please try "
+"again later."
+msgstr ""
+"¡No se encontró el directorio origen! Puede tratarse de una desconfiguración "
+"del administrador del servidor, o que el servidor tenga problemas "
+"temporales. Vuelva a probar más tarde."
+
+#: lib/Chora.php:505 lib/Chora.php:506
+msgid "Statistics"
+msgstr "Estadísticas"
+
+#: stats.php:27
+#, php-format
+msgid "Statistics for %s"
+msgstr "Estadísticas de %s"
+
+#: templates/log/rev.inc:14 templates/patchsets/ps.inc:22
+msgid "Tags"
+msgstr "Etiquetas"
+
+#: templates/checkout/checkout.inc:6
+msgid "Tags:"
+msgstr "Etiquetas:"
+
+#: templates/headerbar.inc:9
+msgid "Tracking Branch"
+msgstr "Rama de seguimiento"
+
+#: templates/diff/hr/header.inc:11
+msgid "Unified"
+msgstr "Unificado"
+
+#: templates/diff/hr/header.inc:24
+msgid "Unmodified"
+msgstr "Sin cambios"
+
+#: config/.bak/prefs.php.dist:37
+msgid "Use last viewed file or directory at login time"
+msgstr "Usar último archivo o directorio visto al iniciar sesión"
+
+#: templates/diff/hr/header.inc:31 templates/diff/hr/header.inc:32
+#, php-format
+msgid "Version %s"
+msgstr "Versión %s"
+
+#: annotate.php:32 templates/log/header.inc:34
+msgid "View"
+msgstr "Ver"
+
+#: lib/Chora.php:509
+msgid "View:"
+msgstr "Ver:"
+
+#: templates/directory/header.inc:12
+msgid "_Author"
+msgstr "A_utor"
+
+#: lib/Chora.php:496 lib/Chora.php:501
+msgid "_Branches"
+msgstr "_Ramas"
+
+#: lib/Chora.php:461
+msgid "_Browse"
+msgstr "_Examinar"
+
+#: templates/directory/header.inc:6
+msgid "_File"
+msgstr "_Archivo"
+
+#: lib/Chora.php:482
+msgid "_Logs"
+msgstr "_Registros"
+
+#: lib/Chora.php:489
+msgid "_Patchsets"
+msgstr "_Parches"
+
+#: templates/directory/header.inc:9
+msgid "_Rev"
+msgstr "_Rev"
+
+#: lib/Chora.php:507
+msgid "_Statistics"
+msgstr "_Estadísticas"
+
+#: templates/history/rev.inc:3
+#, php-format
+msgid "by %s"
+msgstr "por %s"
+
+#: lib/Chora.php:31
+msgid "day"
+msgstr "día"
+
+#: lib/Chora.php:31
+msgid "days"
+msgstr "días"
+
+#: templates/error_page.inc:14
+msgid "for further information."
+msgstr "para más información."
+
+#: lib/Chora.php:30
+msgid "hour"
+msgstr "hora"
+
+#: lib/Chora.php:30
+msgid "hours"
+msgstr "horas"
+
+#: lib/Chora.php:29
+msgid "minute"
+msgstr "minuto"
+
+#: lib/Chora.php:29
+msgid "minutes"
+msgstr "minutos"
+
+#: lib/Chora.php:33
+msgid "month"
+msgstr "mes"
+
+#: lib/Chora.php:33
+msgid "months"
+msgstr "meses"
+
+#: templates/history/branch_cell.inc:6
+#, php-format
+msgid "revision %s"
+msgstr "revisión %s"
+
+#: lib/Chora.php:28
+msgid "second"
+msgstr "segundo"
+
+#: lib/Chora.php:28
+msgid "seconds"
+msgstr "segundos"
+
+#: lib/Chora.php:42
+msgid "very little time"
+msgstr "muy poco tiempo"
+
+#: lib/Chora.php:32
+msgid "week"
+msgstr "semana"
+
+#: lib/Chora.php:32
+msgid "weeks"
+msgstr "semanas"
+
+#: lib/Chora.php:34
+msgid "year"
+msgstr "año"
+
+#: lib/Chora.php:34
+msgid "years"
+msgstr "años"
--- /dev/null
+# Finnish translation for Chora.
+# Copyright (C)
+# Tero Matinlassi <terom@iki.fi>, 2002.
+# Leena Heino <liinu@uta.fi>, 2002-2008.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Chora 2.1-cvs\n"
+"Report-Msgid-Bugs-To: dev@lists.horde.org\n"
+"POT-Creation-Date: 2008-05-17 16:38+0300\n"
+"PO-Revision-Date: 2008-02-19 12:59+0200\n"
+"Last-Translator: Leena Heino <liinu@uta.fi>\n"
+"Language-Team: Finnish <i18n@lists.horde.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=iso-8859-1\n"
+"Content-Transfer-Encoding: 8-bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: templates/annotate/header.inc:4
+msgid "#"
+msgstr "Nro"
+
+#: templates/log/header.inc:17
+#, php-format
+msgid ""
+"%1$s shows diffs to the previous revision. If you select a revision by "
+"clicking its row, %1$s will show the differences to the selected row."
+msgstr ""
+"%1$s näyttää muutokset edelliseen revisioon nähden. Jos haluat valita muun "
+"revision, napsauttamalla haluamaasi riviä, niin %1$s näyttää muutokset "
+"valitun rivin välillä."
+
+#: co.php:84
+#, php-format
+msgid "%s Revision %s (%s ago)"
+msgstr "%s Revisio %s (%s sitten)"
+
+#: templates/annotate/footer.inc:22
+#, php-format
+msgid "%s ago"
+msgstr "%s sitten"
+
+#: templates/diff/hr/header.inc:25
+msgid "Added"
+msgstr "Lisätty"
+
+#: templates/log/header.inc:31
+msgid "All Branches"
+msgstr "Kaikki haarat"
+
+#: co.php:89
+msgid "Annotate"
+msgstr "Selitysmerkintä"
+
+#: templates/stats/stats.inc:4 templates/patchsets/header.inc:15
+#: templates/log/header.inc:49 templates/directory/header.inc:12
+#: templates/annotate/header.inc:5
+msgid "Author"
+msgstr "Tekijä"
+
+#: templates/checkout/checkout.inc:4
+msgid "Author:"
+msgstr "Tekijä:"
+
+#: templates/directory/back.inc:4
+msgid "Back"
+msgstr "Takaisin"
+
+#: templates/checkout/checkout.inc:5
+msgid "Branch:"
+msgstr "Haara:"
+
+#: lib/Chora.php:494 lib/Chora.php:495 lib/Chora.php:499 lib/Chora.php:500
+msgid "Branches"
+msgstr "Haarat"
+
+#: templates/history/branch_cell.inc:2
+msgid "Branching to"
+msgstr "Haarautumispiste:"
+
+#: lib/Chora.php:384
+msgid "Change repositories:"
+msgstr "Vaihda varastoa:"
+
+#: templates/history/rev.inc:7
+#, php-format
+msgid "Changed: %s"
+msgstr "Muutettu: %s"
+
+#: templates/checkout/checkout.inc:12
+msgid "Checkout"
+msgstr "Tuo"
+
+#: templates/cvsgraph/cvsgraph.inc:5
+msgid ""
+"Click on the links in between revisions to get a diff between those "
+"revisions."
+msgstr ""
+"Napsauta linkkia revisioiden välillä saadaksesi eroavaisuudet näiden kahden "
+"revision välillä."
+
+#: templates/cvsgraph/cvsgraph.inc:4
+msgid "Click on the revisions and branches to display the file."
+msgstr "Napsauta revisiota tai haaraa nähdäksesi tiedoston."
+
+#: templates/diff/hr/header.inc:13
+msgid "Column"
+msgstr "Sarake"
+
+#: templates/stats/stats.inc:5
+msgid "Commits"
+msgstr "Kommitoinnit"
+
+#: templates/diff/hr/header.inc:12
+msgid "Context"
+msgstr "Konteksti"
+
+#: config/prefs.php.dist:11
+msgid "Customize tasks to run upon logging in to Chora."
+msgstr "Aseta Choraan sisäänkirjautumisen yhteydessä tehtävät asiat."
+
+#: templates/directory/header.inc:15
+msgid "Da_te"
+msgstr "Päi_väys"
+
+#: templates/patchsets/header.inc:14 templates/log/header.inc:48
+#: templates/directory/header.inc:15
+msgid "Date"
+msgstr "Päiväys"
+
+#: patchsets.php:86
+msgid "Deleted"
+msgstr "Poistettu"
+
+#: templates/directory/file.inc:5 templates/directory/file.inc:17
+msgid "Deleted File"
+msgstr "Poistettu tiedosto"
+
+#: patchsets.php:83 templates/log/header.inc:16
+msgid "Diff"
+msgstr "Muutokset"
+
+#: diff.php:70
+#, php-format
+msgid "Diff for %s between version %s and %s"
+msgstr "Muutokset %s:ssä versioiden %s ja %s välillä"
+
+#: templates/directory/dir.inc:4 templates/directory/dir.inc:6
+msgid "Directory"
+msgstr "Hakemisto"
+
+#: annotate.php:33 co.php:90
+msgid "Download"
+msgstr "Tallenna"
+
+#: templates/diff/hr/header.inc:9
+msgid "Download diff as: "
+msgstr "Tallenna diff nimellä:"
+
+#: templates/checkout/checkout.inc:23
+#, php-format
+msgid "Download revision %s"
+msgstr "Lataa revisio %s"
+
+#: templates/diff/hr/header.inc:14
+msgid "Ed Script"
+msgstr "Ed-skripti"
+
+#: templates/error_page.inc:4
+msgid "Error"
+msgstr "Virhe"
+
+#: templates/error_page.inc:7
+msgid "Error Encountered"
+msgstr "Tapahtui virhe"
+
+#: templates/directory/file.inc:7 templates/directory/file.inc:19
+#: templates/directory/header.inc:6
+msgid "File"
+msgstr "Tiedosto"
+
+#: templates/patchsets/header.inc:16
+msgid "Files"
+msgstr "Tiedostot"
+
+#: templates/diff/hr/header.inc:16
+msgid "Get Diff"
+msgstr "Hae muutokset"
+
+#: cvsgraph.php:51
+#, php-format
+msgid "Graph for %s"
+msgstr "Graafi %s:lle"
+
+#: browse.php:58
+msgid "Hide Deleted Files"
+msgstr "Piilota poistetut tiedostot"
+
+#: browse.php:58
+msgid "Hide _Deleted Files"
+msgstr "Piilota _poistetut tiedostot"
+
+#: templates/directory/header.inc:17
+msgid "Last Log"
+msgstr "Viimeisin lokiviesti"
+
+#: templates/annotate/header.inc:8
+msgid "Line"
+msgstr "Rivi"
+
+#: templates/diff/hr/row.inc:3 templates/diff/hr/row.inc:6
+#, php-format
+msgid "Line %s"
+msgstr "Rivi %s"
+
+#: templates/headerbar.inc:5
+msgid "Location:"
+msgstr "Paikka:"
+
+#: templates/patchsets/header.inc:17 templates/log/header.inc:50
+#: templates/checkout/checkout.inc:1
+msgid "Log Message"
+msgstr "Kirjausviesti"
+
+#: config/prefs.php.dist:10
+msgid "Login Tasks"
+msgstr "Tehtävät sisäänkirjautumisessa"
+
+#: lib/Chora.php:480 lib/Chora.php:481
+msgid "Logs"
+msgstr "Lokit"
+
+#: diff.php:44
+msgid "Malformed Query"
+msgstr "Epäkelpo kysely"
+
+#: lib/Block/tree_menu.php:3
+msgid "Menu List"
+msgstr "Valikkolista"
+
+#: templates/diff/hr/header.inc:26
+msgid "Modified"
+msgstr "Muokattu"
+
+#: patchsets.php:79
+msgid "New File"
+msgstr "Uusi tiedosto"
+
+#: templates/diff/hr/nochange.inc:3
+msgid "No Visible Changes"
+msgstr "Ei näkyviä muutoksia"
+
+#: templates/log/footer.inc:8
+#, php-format
+msgid ""
+"Only showing the 100 latest revisions. %sShow all revisions?</a> (may take a "
+"while)."
+msgstr ""
+"Näytä vain viimeiset 100 revisiota. %sNäytä kaikki revisiot?</a> (Tämä voi "
+"kestää kauan)."
+
+#: config/prefs.php.dist:9
+msgid "Other Options"
+msgstr "Muut asetukset"
+
+#: templates/directory/back.inc:4
+msgid "Parent Directory"
+msgstr "Edellinen hakemisto"
+
+#: templates/patchsets/header.inc:13
+msgid "Patchset"
+msgstr "Paikkajoukko"
+
+#: lib/Chora.php:487 lib/Chora.php:488
+msgid "Patchsets"
+msgstr "Paikkajoukkot"
+
+#: patchsets.php:35
+#, php-format
+msgid "Patchsets for %s"
+msgstr "Paikkajoukko %s:lle"
+
+#: templates/error_page.inc:13
+msgid "Please contact"
+msgstr "Ota yhteys"
+
+#: templates/annotate/header.inc:7
+msgid "Prev"
+msgstr "Edel"
+
+#: templates/diff/hr/header.inc:27
+msgid "Removed"
+msgstr "Poistettu"
+
+#: lib/api.php:30
+msgid "Repositories"
+msgstr "Varastot"
+
+#: templates/directory/header.inc:9 templates/annotate/header.inc:6
+msgid "Rev"
+msgstr "Rev."
+
+#: templates/log/header.inc:47
+msgid "Revision"
+msgstr "Revisio"
+
+#: browse.php:154
+#, php-format
+msgid "Revisions for %s"
+msgstr "Revisiot %s:lle"
+
+#: templates/patchsets/header.inc:4
+msgid "Search Patchsets:"
+msgstr "Hae paaikkajoukkosta:"
+
+#: templates/log/header.inc:4
+msgid "Search Revisions:"
+msgstr "Hae revisioista:"
+
+#: templates/log/header.inc:29
+msgid "Show Branch:"
+msgstr "Näytä Haara:"
+
+#: browse.php:60
+msgid "Show Deleted Files"
+msgstr "Näytä poistetut tiedostot"
+
+#: templates/log/header.inc:18
+msgid "Show Differences"
+msgstr "Näyt eroavaisuudet"
+
+#: browse.php:60
+msgid "Show _Deleted Files"
+msgstr "Näytä _poistetut tiedostot"
+
+#: templates/log/rev.inc:4
+msgid "Show changes to the previous revision"
+msgstr "Näytä muutokset edelliseen revisioon nähden"
+
+#: templates/log/rev.inc:6
+msgid "Show changes to the selected revision"
+msgstr "Näytä muutokset valittujen revisioiden välillä"
+
+#: templates/log/header.inc:13
+#, php-format
+msgid "Show diffs between %s and %s"
+msgstr "Näytä muutokset versioiden %s ja %s välillä"
+
+#: annotate.php:30
+#, php-format
+msgid "Source Annotation of %s (revision %s)"
+msgstr "Lähdekoodin selitysmerkinnät %s (revisio %s)"
+
+#: history.php:163
+#, php-format
+msgid "Source Branching View for %s"
+msgstr "Näkymä lähdekoodin haarautumiseen %s:lle"
+
+#: browse.php:52
+#, php-format
+msgid "Source Directory of /%s"
+msgstr "Lähdehakemisto /%s"
+
+#: lib/Chora.php:179
+msgid ""
+"SourceRoot not found! This could be a misconfiguration by the server "
+"administrator, or the server could be having temporary problems. Please try "
+"again later."
+msgstr ""
+"Lähdekoodin juurihakemistoa ei löytynyt! Tämä voi olla väärä asetus "
+"palvelimen asetuksissa, tai palvelimella on väliaikainen virhetilanne. Yritä "
+"uudestaan myöhemmin."
+
+#: lib/Chora.php:505 lib/Chora.php:506
+msgid "Statistics"
+msgstr "Tilastot"
+
+#: stats.php:27
+#, php-format
+msgid "Statistics for %s"
+msgstr "Tilastot %s:lle"
+
+#: templates/patchsets/ps.inc:22 templates/log/rev.inc:14
+msgid "Tags"
+msgstr "Tagit"
+
+#: templates/checkout/checkout.inc:6
+msgid "Tags:"
+msgstr "Tagit:"
+
+#: templates/headerbar.inc:9
+msgid "Tracking Branch"
+msgstr "Seurattava haara"
+
+#: templates/diff/hr/header.inc:11
+msgid "Unified"
+msgstr "Yhdistetty"
+
+#: templates/diff/hr/header.inc:24
+msgid "Unmodified"
+msgstr "Muokkaamaton"
+
+#: config/prefs.php.dist:37
+msgid "Use last viewed file or directory at login time"
+msgstr "Käytä viimeksi katsottua tiedostoa tai hakemistoa sisäänkirjautuessa"
+
+#: templates/diff/hr/header.inc:31 templates/diff/hr/header.inc:32
+#, php-format
+msgid "Version %s"
+msgstr "Versio %s"
+
+#: annotate.php:32 templates/log/header.inc:34
+msgid "View"
+msgstr "Näytä"
+
+#: lib/Chora.php:509
+msgid "View:"
+msgstr "Näytä:"
+
+#: templates/directory/header.inc:12
+msgid "_Author"
+msgstr "_Tekijä"
+
+#: lib/Chora.php:496 lib/Chora.php:501
+msgid "_Branches"
+msgstr "_Haarat"
+
+#: lib/Chora.php:461
+msgid "_Browse"
+msgstr "_Selaa"
+
+#: templates/directory/header.inc:6
+msgid "_File"
+msgstr "_Tiedosto"
+
+#: lib/Chora.php:482
+msgid "_Logs"
+msgstr "_Lokitiedot"
+
+#: lib/Chora.php:489
+msgid "_Patchsets"
+msgstr "_Korjausjoukot"
+
+#: templates/directory/header.inc:9
+msgid "_Rev"
+msgstr "_Rev"
+
+#: lib/Chora.php:507
+msgid "_Statistics"
+msgstr "T_ilastot"
+
+#: templates/history/rev.inc:3
+#, php-format
+msgid "by %s"
+msgstr "%s"
+
+#: lib/Chora.php:31
+msgid "day"
+msgstr "päivä"
+
+#: lib/Chora.php:31
+msgid "days"
+msgstr "päivää"
+
+#: templates/error_page.inc:14
+msgid "for further information."
+msgstr "saadaksesi lisätietoja."
+
+#: lib/Chora.php:30
+msgid "hour"
+msgstr "tunti"
+
+#: lib/Chora.php:30
+msgid "hours"
+msgstr "tuntia"
+
+#: lib/Chora.php:29
+msgid "minute"
+msgstr "minuutti"
+
+#: lib/Chora.php:29
+msgid "minutes"
+msgstr "minuuttia"
+
+#: lib/Chora.php:33
+msgid "month"
+msgstr "kuukausi"
+
+#: lib/Chora.php:33
+msgid "months"
+msgstr "kuukautta"
+
+#: templates/history/branch_cell.inc:6
+#, php-format
+msgid "revision %s"
+msgstr "revisio %s"
+
+#: lib/Chora.php:28
+msgid "second"
+msgstr "sekunti"
+
+#: lib/Chora.php:28
+msgid "seconds"
+msgstr "sekuntia"
+
+#: lib/Chora.php:42
+msgid "very little time"
+msgstr "hyvin vähän aikaa"
+
+#: lib/Chora.php:32
+msgid "week"
+msgstr "viikko"
+
+#: lib/Chora.php:32
+msgid "weeks"
+msgstr "viikkoa"
+
+#: lib/Chora.php:34
+msgid "year"
+msgstr "vuosi"
+
+#: lib/Chora.php:34
+msgid "years"
+msgstr "vuotta"
--- /dev/null
+# French translation for Chora
+# Copyright (C) 2001 Free Software Foundation, Inc.
+# Mathieu Arnold <mat@absolight.net>, 2001
+# Copyright (C) 2002, 2007 Thierry Thomas.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Chora 2.1-cvs\n"
+"Report-Msgid-Bugs-To: dev@lists.horde.org\n"
+"POT-Creation-Date: 2007-02-21 23:55+0100\n"
+"PO-Revision-Date: 2007-02-21 21:14+0100\n"
+"Last-Translator: Thierry Thomas <thierry@pompo.net>\n"
+"Language-Team: French <i18n@lists.horde.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#: templates/annotate/header.inc:4
+msgid "#"
+msgstr "N°"
+
+#: templates/log/header.inc:16
+#, php-format
+msgid ""
+"%1$s shows diffs to the previous revision. If you select a revision by "
+"clicking its row, %1$s will show the differences to the selected row."
+msgstr ""
+"%1$s montre les différences avec la version précédente. If vous sélectionnez "
+"une révision en cliquant sur sa ligne, %1$s montrera le delta avec la "
+"version sélectionnée."
+
+#: co.php:82
+#, php-format
+msgid "%s Revision %s (%s ago)"
+msgstr "%s Révision %s (il y a %s)"
+
+#: templates/annotate/footer.inc:22
+#, php-format
+msgid "%s ago"
+msgstr "il y a %s"
+
+#: templates/diff/hr/header.inc:24
+msgid "Added"
+msgstr "Ajouté"
+
+#: templates/log/header.inc:28
+msgid "All Branches"
+msgstr "Toutes les branches"
+
+#: co.php:87
+msgid "Annotate"
+msgstr "Annoter"
+
+#: templates/stats/stats.inc:4 templates/patchsets/header.inc:15
+#: templates/log/header.inc:57 templates/directory/header.inc:12
+#: templates/annotate/header.inc:5
+msgid "Author"
+msgstr "Auteur"
+
+#: templates/checkout/checkout.inc:4
+msgid "Author:"
+msgstr "Auteur :"
+
+#: templates/directory/back.inc:4
+msgid "Back"
+msgstr "Retour"
+
+#: templates/checkout/checkout.inc:5
+msgid "Branch:"
+msgstr "Branche :"
+
+#: lib/Chora.php:449
+msgid "Branches"
+msgstr "Branches"
+
+#: templates/history/branch_cell.inc:2
+msgid "Branching to"
+msgstr "Embranchement pour"
+
+#: templates/history/rev.inc:7
+#, php-format
+msgid "Changed: %s"
+msgstr "Modifications : %s"
+
+#: templates/checkout/checkout.inc:12
+msgid "Checkout"
+msgstr "Récupérer"
+
+#: templates/cvsgraph/cvsgraph.inc:5
+msgid ""
+"Click on the links in between revisions to get a diff between those "
+"revisions."
+msgstr ""
+"Cliquer sur les liens entre les révisions pour obtenir le delta entre ces "
+"révisions."
+
+#: templates/cvsgraph/cvsgraph.inc:4
+msgid "Click on the revisions and branches to display the file."
+msgstr "Cliquer sur les révisions et les branches pour afficher le fichier."
+
+#: templates/diff/hr/header.inc:12
+msgid "Column"
+msgstr "Colonne"
+
+#: templates/stats/stats.inc:5
+msgid "Commits"
+msgstr "Validations"
+
+#: templates/diff/hr/header.inc:11
+msgid "Context"
+msgstr "Contexte"
+
+#: config/prefs.php.dist:11
+msgid "Customize tasks to run upon logging in to Chora."
+msgstr "Paramétrer les tâches à exécuter lors de la connexion à Chora."
+
+#: templates/directory/header.inc:15
+msgid "Da_te"
+msgstr "Da_te"
+
+#: templates/patchsets/header.inc:14 templates/log/header.inc:56
+#: templates/directory/header.inc:15
+msgid "Date"
+msgstr "Date"
+
+#: patchsets.php:83
+msgid "Deleted"
+msgstr "Supprimé"
+
+#: templates/directory/file.inc:5 templates/directory/file.inc:17
+msgid "Deleted File"
+msgstr "Fichier supprimé"
+
+#: patchsets.php:80 templates/log/header.inc:15
+msgid "Diff"
+msgstr "Delta"
+
+#: diff.php:51
+#, php-format
+msgid "Diff for %s between version %s and %s"
+msgstr "Delta de %s entre les versions %s et %s"
+
+#: templates/directory/dir.inc:4 templates/directory/dir.inc:6
+msgid "Directory"
+msgstr "Répertoire"
+
+#: annotate.php:31 co.php:88
+msgid "Download"
+msgstr "Télécharger"
+
+#: templates/diff/hr/header.inc:8
+msgid "Download diff as: "
+msgstr "Télécharger le delta en tant que : "
+
+#: templates/checkout/checkout.inc:23
+#, php-format
+msgid "Download revision %s"
+msgstr "Télécharger la révision %s"
+
+#: templates/diff/hr/header.inc:13
+msgid "Ed Script"
+msgstr "Script Ed"
+
+#: templates/error_page.inc:4
+msgid "Error"
+msgstr "Erreur"
+
+#: templates/error_page.inc:7
+msgid "Error Encountered"
+msgstr "Une erreur est survenue"
+
+#: templates/directory/file.inc:7 templates/directory/file.inc:19
+#: templates/directory/header.inc:6
+msgid "File"
+msgstr "Fichier"
+
+#: templates/patchsets/header.inc:16
+msgid "Files"
+msgstr "Fichiers"
+
+#: templates/diff/hr/header.inc:15
+msgid "Get Diff"
+msgstr "Récupérer le delta"
+
+#: lib/Chora.php:452
+msgid "Graph"
+msgstr "Graphe"
+
+#: cvsgraph.php:48
+#, php-format
+msgid "Graph for %s"
+msgstr "Graphe de %s"
+
+#: browse.php:55
+msgid "Hide Deleted Files"
+msgstr "Cacher les fichiers supprimés"
+
+#: browse.php:55
+msgid "Hide _Deleted Files"
+msgstr "Cacher les fichiers _supprimés"
+
+#: templates/directory/header.inc:17
+msgid "Last Log"
+msgstr "Dernier journal"
+
+#: templates/annotate/header.inc:8
+msgid "Line"
+msgstr "Ligne"
+
+#: templates/diff/hr/row.inc:3 templates/diff/hr/row.inc:6
+#, php-format
+msgid "Line %s"
+msgstr "Ligne %s"
+
+#: templates/headerbar.inc:5
+msgid "Location:"
+msgstr "Emplacement :"
+
+#: templates/patchsets/header.inc:17 templates/log/header.inc:58
+#: templates/checkout/checkout.inc:1
+msgid "Log Message"
+msgstr "Message du journal"
+
+#: config/prefs.php.dist:10
+msgid "Login Tasks"
+msgstr "Tâches à la connexion"
+
+#: lib/Chora.php:443
+msgid "Logs"
+msgstr "Journaux"
+
+#: diff.php:25
+msgid "Malformed Query"
+msgstr "Requête mal formée"
+
+#: lib/Block/tree_menu.php:3
+msgid "Menu List"
+msgstr "Menu"
+
+#: templates/diff/hr/header.inc:25
+msgid "Modified"
+msgstr "Modifié"
+
+#: patchsets.php:76
+msgid "New File"
+msgstr "Nouveau fichier"
+
+#: templates/diff/hr/nochange.inc:3
+msgid "No Visible Changes"
+msgstr "Aucun changement visible"
+
+#: templates/log/header.inc:44
+#, php-format
+msgid ""
+"Only showing the 100 latest revisions. %sShow all revisions?</a> (may take a "
+"while)."
+msgstr ""
+"Seules les 100 dernières révisions sont présentées. %sMontrer toutes les "
+"révisions ?</a> (peu prendre un certain temps)."
+
+#: config/prefs.php.dist:9
+msgid "Other Options"
+msgstr "Autres options"
+
+#: lib/Chora.php:346
+msgid "Other Repositories"
+msgstr "Autres dépôts"
+
+#: templates/directory/back.inc:4
+msgid "Parent Directory"
+msgstr "Répertoire parent"
+
+#: templates/patchsets/header.inc:13
+msgid "Patchset"
+msgstr "Jeu de patches"
+
+#: lib/Chora.php:446
+msgid "Patchsets"
+msgstr "Jeux de patches"
+
+#: patchsets.php:32
+#, php-format
+msgid "Patchsets for %s"
+msgstr "Jeux de patches pour %s"
+
+#: templates/error_page.inc:13
+msgid "Please contact"
+msgstr "Veuillez contacter"
+
+#: templates/annotate/header.inc:7
+msgid "Prev"
+msgstr "Préc"
+
+#: templates/diff/hr/header.inc:26
+msgid "Removed"
+msgstr "Retiré"
+
+#: lib/api.php:30
+msgid "Repositories"
+msgstr "Dépôts"
+
+#: templates/directory/header.inc:9 templates/annotate/header.inc:6
+msgid "Rev"
+msgstr "Rév"
+
+#: templates/log/header.inc:55
+msgid "Revision"
+msgstr "Révision"
+
+#: browse.php:150
+#, php-format
+msgid "Revisions for %s"
+msgstr "Révision pour %s"
+
+#: templates/patchsets/header.inc:4
+msgid "Search Patchsets:"
+msgstr "Rechercher des jeux de patches :"
+
+#: templates/log/header.inc:4
+msgid "Search Revisions:"
+msgstr "Rechercher des révisions :"
+
+#: templates/log/header.inc:26
+msgid "Show Branch:"
+msgstr "Montrer la branche :"
+
+#: browse.php:57
+msgid "Show Deleted Files"
+msgstr "Afficher les fichiers supprimés"
+
+#: templates/log/header.inc:17
+msgid "Show Differences"
+msgstr "Montrer les différences"
+
+#: browse.php:57
+msgid "Show _Deleted Files"
+msgstr "Afficher les fichiers _supprimés"
+
+#: templates/log/rev.inc:4
+msgid "Show changes to the previous revision"
+msgstr "Montrer les changements par rapport à la révision précédente"
+
+#: templates/log/rev.inc:6
+msgid "Show changes to the selected revision"
+msgstr "Montrer les changements par rapport à la révision sélectionnée"
+
+#: templates/log/header.inc:12
+#, php-format
+msgid "Show diffs between %s and %s"
+msgstr "Montrer les deltas entre %s et %s"
+
+#: annotate.php:28
+#, php-format
+msgid "Source Annotation of %s (revision %s)"
+msgstr "Annotation de %s (révision %s)"
+
+#: history.php:161
+#, php-format
+msgid "Source Branching View for %s"
+msgstr "Vue par branches pour %s"
+
+#: browse.php:49
+#, php-format
+msgid "Source Directory of /%s"
+msgstr "Répertoire source de /%s"
+
+#: lib/Chora.php:176
+msgid ""
+"SourceRoot not found! This could be a misconfiguration by the server "
+"administrator, or the server could be having temporary problems. Please try "
+"again later."
+msgstr ""
+"Racine non trouvée ! Ça peut être dû à une mauvaise configuration du "
+"serveur, ou à un problème temporaire. Veuillez réessayer plus tard."
+
+#: lib/Chora.php:454
+msgid "Statistics"
+msgstr "Statistiques"
+
+#: stats.php:25
+#, php-format
+msgid "Statistics for %s"
+msgstr "Statistiques de %s"
+
+#: templates/patchsets/ps.inc:22 templates/log/rev.inc:14
+msgid "Tags"
+msgstr "Tags"
+
+#: templates/checkout/checkout.inc:6
+msgid "Tags:"
+msgstr "Tags :"
+
+#: templates/headerbar.inc:9
+msgid "Tracking Branch"
+msgstr "Branche suivie"
+
+#: templates/diff/hr/header.inc:10
+msgid "Unified"
+msgstr "Unifié"
+
+#: templates/diff/hr/header.inc:23
+msgid "Unmodified"
+msgstr "Inchangé"
+
+#: config/prefs.php.dist:37
+msgid "Use last viewed file or directory at login time"
+msgstr "Revenir au dernier endroit visité lors de la connexion"
+
+#: templates/diff/hr/header.inc:30 templates/diff/hr/header.inc:31
+#, php-format
+msgid "Version %s"
+msgstr "Version %s"
+
+#: annotate.php:30 templates/log/header.inc:31
+msgid "View"
+msgstr "Voir"
+
+#: lib/Chora.php:456
+msgid "View:"
+msgstr "Voir :"
+
+#: templates/directory/header.inc:12
+msgid "_Author"
+msgstr "_Auteur"
+
+#: lib/Chora.php:449
+msgid "_Branches"
+msgstr "_Branches"
+
+#: lib/Chora.php:425
+msgid "_Browse"
+msgstr "_Lister"
+
+#: templates/directory/header.inc:6
+msgid "_File"
+msgstr "_Fichier"
+
+#: lib/Chora.php:452
+msgid "_Graph"
+msgstr "_Graphe"
+
+#: lib/Chora.php:443
+msgid "_Logs"
+msgstr "_Journaux"
+
+#: lib/Chora.php:446
+msgid "_Patchsets"
+msgstr "Jeux de _patches"
+
+#: templates/directory/header.inc:9
+msgid "_Rev"
+msgstr "_Rév"
+
+#: lib/Chora.php:454
+msgid "_Statistics"
+msgstr "_Statistiques"
+
+#: templates/history/rev.inc:3
+#, php-format
+msgid "by %s"
+msgstr "par %s"
+
+#: lib/Chora.php:31
+msgid "day"
+msgstr "jour"
+
+#: lib/Chora.php:31
+msgid "days"
+msgstr "jours"
+
+#: templates/error_page.inc:14
+msgid "for further information."
+msgstr "pour de plus amples informations."
+
+#: lib/Chora.php:30
+msgid "hour"
+msgstr "heure"
+
+#: lib/Chora.php:30
+msgid "hours"
+msgstr "heures"
+
+#: lib/Chora.php:29
+msgid "minute"
+msgstr "minute"
+
+#: lib/Chora.php:29
+msgid "minutes"
+msgstr "minutes"
+
+#: lib/Chora.php:33
+msgid "month"
+msgstr "mois"
+
+#: lib/Chora.php:33
+msgid "months"
+msgstr "mois"
+
+#: templates/history/branch_cell.inc:6
+#, php-format
+msgid "revision %s"
+msgstr "révision %s"
+
+#: lib/Chora.php:28
+msgid "second"
+msgstr "seconde"
+
+#: lib/Chora.php:28
+msgid "seconds"
+msgstr "secondes"
+
+#: lib/Chora.php:42
+msgid "very little time"
+msgstr "très peu de temps"
+
+#: lib/Chora.php:32
+msgid "week"
+msgstr "semaine"
+
+#: lib/Chora.php:32
+msgid "weeks"
+msgstr "semaines"
+
+#: lib/Chora.php:34
+msgid "year"
+msgstr "année"
+
+#: lib/Chora.php:34
+msgid "years"
+msgstr "années"
--- /dev/null
+# Italian translations for chora package.
+# Copyright (C) 2008 Horde Project
+# This file is distributed under the same license as the chora package.
+# Fabio Pedretti <fabio.pedretti@ing.unibs.it>, 2008.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: chora v2.1-cvs\n"
+"Report-Msgid-Bugs-To: dev@lists.horde.org\n"
+"POT-Creation-Date: 2008-09-05 18:12+0200\n"
+"PO-Revision-Date: 2008-09-05 19:15+0200\n"
+"Last-Translator: Fabio Pedretti <fabio.pedretti@ing.unibs.it>\n"
+"Language-Team: i18n@lists.horde.org\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: templates/annotate/header.inc:4
+msgid "#"
+msgstr "#"
+
+#: templates/log/header.inc:17
+#, php-format
+msgid ""
+"%1$s shows diffs to the previous revision. If you select a revision by "
+"clicking its row, %1$s will show the differences to the selected row."
+msgstr ""
+"%1$s mostra le differenze con la revisione precedente. Se scegi una "
+"revisione cliccando la sua riga, %1$s ti mostrerà le differenze con la riga "
+"selezionata."
+
+#: co.php:84
+#, php-format
+msgid "%s Revision %s (%s ago)"
+msgstr "%s revisione %s (%s prima)"
+
+#: templates/annotate/footer.inc:22
+#, php-format
+msgid "%s ago"
+msgstr "%s prima"
+
+#: templates/diff/hr/header.inc:25
+msgid "Added"
+msgstr "Aggiunto"
+
+#: templates/log/header.inc:31
+msgid "All Branches"
+msgstr "Tutti i rami"
+
+#: co.php:89
+msgid "Annotate"
+msgstr "Annotato"
+
+#: templates/stats/stats.inc:4 templates/patchsets/header.inc:15
+#: templates/log/header.inc:49 templates/directory/header.inc:12
+#: templates/annotate/header.inc:5
+msgid "Author"
+msgstr "Autore"
+
+#: templates/diff/hr/header.inc:35 templates/checkout/checkout.inc:4
+msgid "Author:"
+msgstr "Autore:"
+
+#: templates/directory/back.inc:4
+msgid "Back"
+msgstr "Indietro"
+
+#: templates/diff/hr/header.inc:37 templates/checkout/checkout.inc:5
+msgid "Branch:"
+msgstr "Ramo:"
+
+#: lib/Chora.php:498 lib/Chora.php:499 lib/Chora.php:503 lib/Chora.php:504
+msgid "Branches"
+msgstr "Rami"
+
+#: templates/history/branch_cell.inc:2
+msgid "Branching to"
+msgstr "Ramificato da"
+
+#: lib/Chora.php:388
+msgid "Change repositories:"
+msgstr "Cambia deposito:"
+
+#: templates/history/rev.inc:7
+#, php-format
+msgid "Changed: %s"
+msgstr "Cambiato: %s"
+
+#: templates/checkout/checkout.inc:12
+msgid "Checkout"
+msgstr "Controllo"
+
+#: templates/cvsgraph/cvsgraph.inc:5
+msgid ""
+"Click on the links in between revisions to get a diff between those "
+"revisions."
+msgstr ""
+"Clicca sul collegamento tra le revisioni per ottenere una la differenza tra "
+"loro."
+
+#: templates/cvsgraph/cvsgraph.inc:4
+msgid "Click on the revisions and branches to display the file."
+msgstr "Clicca sulle revisioni e ramifica per vedere il file."
+
+#: templates/diff/hr/header.inc:13
+msgid "Column"
+msgstr "Colonna"
+
+#: templates/stats/stats.inc:5
+msgid "Commits"
+msgstr "Assegnare"
+
+#: templates/diff/hr/header.inc:12
+msgid "Context"
+msgstr "Contesto"
+
+#: config/prefs.php.dist:11
+msgid "Customize tasks to run upon logging in to Chora."
+msgstr "Personalizza le operazioni da eseguire quando entri in Chora."
+
+#: templates/directory/header.inc:15
+msgid "Da_te"
+msgstr "Da_ta"
+
+#: templates/patchsets/header.inc:14 templates/log/header.inc:48
+#: templates/directory/header.inc:15
+msgid "Date"
+msgstr "Data"
+
+#: templates/diff/hr/header.inc:36
+msgid "Date:"
+msgstr "Data:"
+
+#: patchsets.php:79
+msgid "Deleted"
+msgstr "Eliminato"
+
+#: templates/directory/file.inc:5 templates/directory/file.inc:28
+msgid "Deleted File"
+msgstr "File eliminato"
+
+#: patchsets.php:76 templates/log/header.inc:16
+msgid "Diff"
+msgstr "Differenza"
+
+#: diff.php:71
+#, php-format
+msgid "Diff for %s between version %s and %s"
+msgstr "Differenza per %s tra le versioni %s e %s"
+
+#: templates/directory/dir.inc:4 templates/directory/dir.inc:6
+msgid "Directory"
+msgstr "Directory"
+
+#: annotate.php:33 co.php:90
+msgid "Download"
+msgstr "Scarica"
+
+#: templates/diff/hr/header.inc:9
+msgid "Download diff as: "
+msgstr "Scarica differenza come: "
+
+#: templates/checkout/checkout.inc:23
+#, php-format
+msgid "Download revision %s"
+msgstr "Scarica revisione %s"
+
+#: templates/diff/hr/header.inc:14
+msgid "Ed Script"
+msgstr "Ed Script"
+
+#: templates/error_page.inc:4
+msgid "Error"
+msgstr "Errore"
+
+#: templates/error_page.inc:7
+msgid "Error Encountered"
+msgstr "Si è verificato un errore"
+
+#: templates/directory/file.inc:7 templates/directory/file.inc:30
+#: templates/directory/header.inc:6
+msgid "File"
+msgstr "File"
+
+#: templates/patchsets/header.inc:16
+msgid "Files"
+msgstr "File"
+
+#: templates/diff/hr/header.inc:16
+msgid "Get Diff"
+msgstr "Ottieni differenze"
+
+#: cvsgraph.php:51
+#, php-format
+msgid "Graph for %s"
+msgstr "Grafico di %s"
+
+#: browse.php:42
+msgid "Hide Deleted Files"
+msgstr "Nascondi File eliminati"
+
+#: browse.php:44
+msgid "Hide _Deleted Files"
+msgstr "_Nascondi File Eliminati"
+
+#: templates/directory/header.inc:17
+msgid "Last Log"
+msgstr "Ultima autenticazione"
+
+#: templates/annotate/header.inc:8
+msgid "Line"
+msgstr "Riga"
+
+#: templates/diff/hr/row.inc:3 templates/diff/hr/row.inc:6
+#, php-format
+msgid "Line %s"
+msgstr "Riga %s"
+
+#: templates/headerbar.inc:5
+msgid "Location:"
+msgstr "Luogo:"
+
+#: templates/patchsets/header.inc:17 templates/log/header.inc:50
+#: templates/diff/hr/header.inc:30 templates/checkout/checkout.inc:1
+msgid "Log Message"
+msgstr "Messaggio utente"
+
+#: config/prefs.php.dist:10
+msgid "Login Tasks"
+msgstr "Operazioni di autenticazione"
+
+#: lib/Chora.php:484 lib/Chora.php:485
+msgid "Logs"
+msgstr "Utenti"
+
+#: diff.php:44
+msgid "Malformed Query"
+msgstr "Richiesta malformulata"
+
+#: lib/Block/tree_menu.php:3
+msgid "Menu List"
+msgstr "Menu Lista"
+
+#: templates/diff/hr/header.inc:26
+msgid "Modified"
+msgstr "Modificato"
+
+#: patchsets.php:72
+msgid "New File"
+msgstr "Nuovo File"
+
+#: templates/diff/hr/nochange.inc:3
+msgid "No Visible Changes"
+msgstr "Nessun cambiamento visibile"
+
+#: templates/log/footer.inc:8
+#, php-format
+msgid ""
+"Only showing the 100 latest revisions. %sShow all revisions?</a> (may take a "
+"while)."
+msgstr ""
+"Mostra solo le 100 ultime revisioni. %smostra tutte le revisioni?</a> "
+"(potrebbe prendere un while)."
+
+#: config/prefs.php.dist:9
+msgid "Other Options"
+msgstr "Altre Opzioni"
+
+#: templates/directory/back.inc:4
+msgid "Parent Directory"
+msgstr "Directory Principale"
+
+#: templates/patchsets/header.inc:13
+msgid "Patchset"
+msgstr "Patchset"
+
+#: lib/Chora.php:491 lib/Chora.php:492
+msgid "Patchsets"
+msgstr "Patchset"
+
+#: patchsets.php:35
+#, php-format
+msgid "Patchsets for %s"
+msgstr "Patchset per %s"
+
+#: templates/error_page.inc:13
+msgid "Please contact"
+msgstr "Contatta"
+
+#: templates/annotate/header.inc:7
+msgid "Prev"
+msgstr "Precedente"
+
+#: templates/diff/hr/header.inc:27
+msgid "Removed"
+msgstr "Eliminato"
+
+#: lib/api.php:30
+msgid "Repositories"
+msgstr "Deposita"
+
+#: templates/directory/header.inc:9 templates/annotate/header.inc:6
+msgid "Rev"
+msgstr "Rivedi"
+
+#: templates/log/header.inc:47
+msgid "Revision"
+msgstr "Revisione"
+
+#: browse.php:157
+#, php-format
+msgid "Revisions for %s"
+msgstr "Revisioni per %s"
+
+#: templates/patchsets/header.inc:4
+msgid "Search Patchsets:"
+msgstr "Ricerca Patchset:"
+
+#: templates/log/header.inc:4
+msgid "Search Revisions:"
+msgstr "Ricerca revisioni:"
+
+#: templates/log/header.inc:29
+msgid "Show Branch:"
+msgstr "Mostra ramo:"
+
+#: browse.php:42
+msgid "Show Deleted Files"
+msgstr "Mostra File Eliminati"
+
+#: templates/log/header.inc:18
+msgid "Show Differences"
+msgstr "Mostra differenze"
+
+#: browse.php:44
+msgid "Show _Deleted Files"
+msgstr "_Mostra File Eliminati"
+
+#: templates/log/rev.inc:4
+msgid "Show changes to the previous revision"
+msgstr "Mostra cambiamenti alla revisione precedente"
+
+#: templates/log/rev.inc:6
+msgid "Show changes to the selected revision"
+msgstr "Mostra cambiamenti alla revisione selezionata"
+
+#: templates/log/header.inc:13
+#, php-format
+msgid "Show diffs between %s and %s"
+msgstr "Mostra differenze tra %s e %s"
+
+#: annotate.php:30
+#, php-format
+msgid "Source Annotation of %s (revision %s)"
+msgstr "Sorgente annotazione di %s (revisione %s)"
+
+#: history.php:163
+#, php-format
+msgid "Source Branching View for %s"
+msgstr "Ramo sorgente visto per %s"
+
+#: browse.php:35
+#, php-format
+msgid "Source Directory of /%s"
+msgstr "Directory sorgente di /%s"
+
+#: lib/Chora.php:179
+msgid ""
+"SourceRoot not found! This could be a misconfiguration by the server "
+"administrator, or the server could be having temporary problems. Please try "
+"again later."
+msgstr ""
+"Sorgente radice non trovata! Questo potrebbe essere causato da un errata "
+"configurazione dell'amministratore del server, oppure il server potrebbe "
+"avere dei problemi temporanei. Riprovare più tardi."
+
+#: lib/Chora.php:509 lib/Chora.php:510
+msgid "Statistics"
+msgstr "Statistiche"
+
+#: stats.php:27
+#, php-format
+msgid "Statistics for %s"
+msgstr "Statistiche per %s"
+
+#: templates/patchsets/ps.inc:22 templates/log/rev.inc:14
+msgid "Tags"
+msgstr "Tag"
+
+#: templates/diff/hr/header.inc:38 templates/checkout/checkout.inc:6
+msgid "Tags:"
+msgstr "Tag:"
+
+#: templates/headerbar.inc:9
+msgid "Tracking Branch"
+msgstr "Traccia ramificazioni"
+
+#: templates/diff/hr/header.inc:11
+msgid "Unified"
+msgstr "Unificato"
+
+#: templates/diff/hr/header.inc:24
+msgid "Unmodified"
+msgstr "Non modificato"
+
+#: config/prefs.php.dist:37
+msgid "Use last viewed file or directory at login time"
+msgstr "Usa l'ultimo file visto o la directory che si aveva all'autenticazione"
+
+#: templates/diff/hr/header.inc:48 templates/diff/hr/header.inc:49
+#, php-format
+msgid "Version %s"
+msgstr "Versione %s"
+
+#: annotate.php:32 templates/log/header.inc:34
+msgid "View"
+msgstr "Visualizza"
+
+#: lib/Chora.php:513
+msgid "View:"
+msgstr "Visualizza:"
+
+#: templates/directory/header.inc:12
+msgid "_Author"
+msgstr "_Autore"
+
+#: lib/Chora.php:500 lib/Chora.php:505
+msgid "_Branches"
+msgstr "_Ramificazioni"
+
+#: lib/Chora.php:465
+msgid "_Browse"
+msgstr "_Mostra"
+
+#: templates/directory/header.inc:6
+msgid "_File"
+msgstr "_File"
+
+#: lib/Chora.php:486
+msgid "_Logs"
+msgstr "_Logs"
+
+#: lib/Chora.php:493
+msgid "_Patchsets"
+msgstr "_Patchsets"
+
+#: templates/directory/header.inc:9
+msgid "_Rev"
+msgstr "_Rivedi"
+
+#: lib/Chora.php:511
+msgid "_Statistics"
+msgstr "_Statistiche"
+
+#: templates/history/rev.inc:3
+#, php-format
+msgid "by %s"
+msgstr "da %s"
+
+#: lib/Chora.php:31
+msgid "day"
+msgstr "giorno"
+
+#: lib/Chora.php:31
+msgid "days"
+msgstr "giorni"
+
+#: templates/error_page.inc:14
+msgid "for further information."
+msgstr "per ulteriori informazioni"
+
+#: lib/Chora.php:30
+msgid "hour"
+msgstr "ora"
+
+#: lib/Chora.php:30
+msgid "hours"
+msgstr "ore"
+
+#: lib/Chora.php:29
+msgid "minute"
+msgstr "minuto"
+
+#: lib/Chora.php:29
+msgid "minutes"
+msgstr "minuti"
+
+#: lib/Chora.php:33
+msgid "month"
+msgstr "mese"
+
+#: lib/Chora.php:33
+msgid "months"
+msgstr "mesi"
+
+#: templates/history/branch_cell.inc:6
+#, php-format
+msgid "revision %s"
+msgstr "revisione %s"
+
+#: lib/Chora.php:28
+msgid "second"
+msgstr "secondo"
+
+#: lib/Chora.php:28
+msgid "seconds"
+msgstr "secondi"
+
+#: lib/Chora.php:42
+msgid "very little time"
+msgstr "poco tempo"
+
+#: lib/Chora.php:32
+msgid "week"
+msgstr "settimana"
+
+#: lib/Chora.php:32
+msgid "weeks"
+msgstr "settimane"
+
+#: lib/Chora.php:34
+msgid "year"
+msgstr "anno"
+
+#: lib/Chora.php:34
+msgid "years"
+msgstr "anni"
--- /dev/null
+# Norwegian Chora Translation.
+# Copyright (C) 2001 Oystein Steimler.
+# Oystein Steimler <oystein@rexta.net>, 2001.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Chora 2.0-cvs\n"
+"POT-Creation-Date: 2001-12-28 19:16+0100\n"
+"PO-Revision-Date: 2001-12-28 18:07+0100\n"
+"Last-Translator: Oystein Steimler <oystein@rexta.net>\n"
+"Language-Team: Norwegian (Bokmal) <oystein@rexta.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=iso-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+msgid ""
+" This form allows you to request diffs between any two revisions of a file. "
+"You may select a symbolic revision name using the selection box or you may "
+"type in a numeric name using the type-in text box."
+msgstr ""
+"I dette skjemaet kan du be om differ mellom to revisjoner av en fil. Du kan "
+"velge et symbolsk revisjonsnavn ved å bruke valgboksen, eller du kan "
+"skrive inn et numerisk navn ved å fylle ut tekstboksen."
+
+#, c-format
+msgid "%s ago"
+msgstr "%s siden"
+
+#, c-format
+msgid "Added in v.%s"
+msgstr "Lagt til v.%s"
+
+msgid "All Branches"
+msgstr "Alle greiner"
+
+msgid "Annotate"
+msgstr "Annoter"
+
+msgid "Author"
+msgstr "Forfatter"
+
+msgid "Back"
+msgstr "Tilbake"
+
+msgid "Branch Point for:"
+msgstr "Forgreiningspunkt for:"
+
+msgid "Branch:"
+msgstr "Grein:"
+
+msgid "Branching to"
+msgstr "Forgreiner til"
+
+#, c-format
+msgid "CVS Annotation of %s for version %s"
+msgstr "CVS annotasjon av %s for versjon %s"
+
+#, c-format
+msgid "CVS Branching View for %s"
+msgstr "CVS Forgreiningsvisning for %s"
+
+#, c-format
+msgid "CVS Checkout of %s (revision %s)"
+msgstr "CVSutsjekking av %s (revisjon %s)"
+
+#, c-format
+msgid "CVS Directory of /%s"
+msgstr "CVSmappe for /%s"
+
+#, c-format
+msgid "CVS Log for %s"
+msgstr "CVSlogg for %s"
+
+msgid "CVS Tags:"
+msgstr "CVSmerker:"
+
+#, c-format
+msgid "Changed since <b>%s</b>"
+msgstr "Forandret siden <b>%s</b>"
+
+#, c-format
+msgid "Changed: %s"
+msgstr "Forandret: %s"
+
+msgid "Chora Homepage"
+msgstr "Chora hjemmeside"
+
+msgid "Chora is not properly configured"
+msgstr "Chora er ikke satt opp ordentlig"
+
+msgid "Context"
+msgstr "Kontekst"
+
+msgid "Couldn't perform checkout of the requested file"
+msgstr "Kunne ikke uføre utsjekking på de forespurte filene"
+
+msgid "Date"
+msgstr "Dato"
+
+msgid "Deleted File"
+msgstr "Slettet fil"
+
+#, c-format
+msgid "Diff for %s between version %s and %s"
+msgstr "Diff for %s mellom versjon %s og %s"
+
+#, c-format
+msgid "Diffs ignoring whitespace to version %s"
+msgstr "Differ (uten å bry seg om blanke) til versjon %s"
+
+#, c-format
+msgid "Diffs to selected version %s"
+msgstr "Differ til valgt versjon %s"
+
+#, c-format
+msgid "Diffs to version %s"
+msgstr "Differ til versjon %s"
+
+msgid "Directory"
+msgstr "Mappe"
+
+msgid "Download"
+msgstr "Last ned"
+
+msgid "Ed Script"
+msgstr "Ed Script"
+
+msgid "Error Encountered"
+msgstr "Det oppstod en feil"
+
+msgid "Error"
+msgstr "Feil"
+
+msgid "File"
+msgstr "Fil"
+
+msgid "Get Diffs"
+msgstr "Hent differ"
+
+msgid "Hide Deleted Files"
+msgstr "Skjul slettede filer"
+
+msgid "Human Readable"
+msgstr "Menneskelesbart"
+
+msgid "Invalid revision number"
+msgstr "Ugyldig revisjonsnummer"
+
+#, c-format
+msgid "Last Log Message for rev %s:"
+msgstr "Siste loggmelding for rev %s:"
+
+msgid "Last Log Message:"
+msgstr "Siste loggmelding:"
+
+msgid "Last Log"
+msgstr "Siste logg"
+
+#, c-format
+msgid "Line %s"
+msgstr "Linje %s"
+
+msgid "Line"
+msgstr "Linje"
+
+msgid "Location:"
+msgstr "Plassering"
+
+msgid "No Viewable Change"
+msgstr "Ingen synlige endringer"
+
+msgid "Other Repositories"
+msgstr "Andre Repositories"
+
+msgid "Please contact"
+msgstr "Vennligst ta kontakt med"
+
+msgid "Previous Directory"
+msgstr "Forrige mappe"
+
+#, c-format
+msgid "Removed in v.%s"
+msgstr "Fjernet i v.%s"
+
+msgid "Retrieve diffs between:"
+msgstr "Hent differ mellom:"
+
+msgid "Rev"
+msgstr "Rev"
+
+msgid "Select for Diff"
+msgstr "Velg for diff"
+
+msgid "Show Deleted Files"
+msgstr "Vis slettede filer"
+
+msgid "Side-by-Side"
+msgstr "Side-om-side"
+
+msgid "Some of Chora's configuration files are missing:"
+msgstr "Noen av Choras konfigurasjonsfiler mangler:"
+
+msgid "Sort Order"
+msgstr "Sorteringsrekkefølge"
+
+msgid "Switch to Branch View"
+msgstr "Bytt til greinvisning"
+
+msgid "Switch to Log View"
+msgstr "Bytt til loggvisning"
+
+msgid ""
+"This file controls the stylesheet that is used to set colors and fonts in "
+"addition to or overriding Horde defaults."
+msgstr ""
+"Denne filen kontrollerer stilarkene som bestemmer farger og skrifttyper. "
+"Filen overstyrer standard Horde instillinger."
+
+msgid ""
+"This file defines all of the cvs repositories that you wish Chora to display."
+msgstr "Denne filen definerer alle CVSrepositories du vil at Chora skal vise."
+
+msgid "This file defines any special MIME-type handling for Chora."
+msgstr "Denne filen definerer spesiell MIMEhåndtering for Chora."
+
+msgid ""
+"This is the main Chora configuration file. It contains paths and options for "
+"all Chora scripts."
+msgstr ""
+"Dette er hovedkonfigurasjonsfilen for Chora. Den inneholder stier og valg "
+"for alle Choraskriptene."
+
+msgid "Tracking Branch"
+msgstr "Følg grein"
+
+msgid "Type:"
+msgstr "Type:"
+
+msgid "Unified"
+msgstr "Enhetlig"
+
+msgid "Unselect"
+msgstr "Velg bort"
+
+msgid "Use Text Field"
+msgstr "Bruk tekstfelt"
+
+msgid "View Branch"
+msgstr "Vis grein"
+
+msgid "View revisions on:"
+msgstr "Vis revisjoner av:"
+
+msgid "View"
+msgstr "Vis"
+
+msgid "and:"
+msgstr "og: "
+
+#, c-format
+msgid "by %s"
+msgstr "etter %s"
+
+msgid "changed lines"
+msgstr "endrede linjer"
+
+msgid "day"
+msgstr "dag"
+
+msgid "days"
+msgstr "dager"
+
+msgid "for further information."
+msgstr "for nærmere informasjon."
+
+msgid "hour"
+msgstr "time"
+
+msgid "hours"
+msgstr "timer"
+
+msgid "long"
+msgstr "lang"
+
+msgid "minute"
+msgstr "minutt"
+
+msgid "minutes"
+msgstr "minutter"
+
+msgid "month"
+msgstr "måned"
+
+msgid "months"
+msgstr "måneder"
+
+#, c-format
+msgid "revision %s"
+msgstr "revisjon %s"
+
+msgid "second"
+msgstr "sekund"
+
+msgid "seconds"
+msgstr "sekunder"
+
+msgid "unified"
+msgstr "enhetlig"
+
+#, c-format
+msgid "version %s"
+msgstr "versjon %s"
+
+msgid "very little time"
+msgstr "veldig lite tid"
+
+msgid "week"
+msgstr "uke"
+
+msgid "weeks"
+msgstr "uker"
+
+msgid "year"
+msgstr "år"
+
+msgid "years"
+msgstr "år"
--- /dev/null
+# Chora Dutch translation.
+# Copyright (C) 2001 Jan Kuipers.
+# Jan Kuipers <jrkuipers@lauwerscollege.nl>, 2001.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Chora 2.0-cvs\n"
+"Report-Msgid-Bugs-To: dev@lists.horde.org\n"
+"POT-Creation-Date: 2004-11-27 20:36+0100\n"
+"PO-Revision-Date: 2004-11-27 21:39+0100\n"
+"Last-Translator: Jan Kuipers <jrkuipers@lauwerscollege.nl>\n"
+"Language-Team: Dutch <i18n@lists.horde.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: templates/annotate/header.inc:4
+msgid "#"
+msgstr "#"
+
+#: templates/patchsets/ps.inc:12 templates/log/rev.inc:24
+#, php-format
+msgid "%s ago"
+msgstr "%s geleden"
+
+#: templates/diff/hr/footer.inc:19
+#, php-format
+msgid "Added in v.%s"
+msgstr "Toegevoegd in v.%s"
+
+#: templates/log/request.inc:57
+msgid "All Branches"
+msgstr "Alle vertakkingen"
+
+#: co.php:68 templates/log/rev.inc:8
+msgid "Annotate"
+msgstr "Annoteren"
+
+#: templates/stats/stats.inc:3 templates/directory/header.inc:18
+#: templates/annotate/header.inc:5
+msgid "Author"
+msgstr "Auteur"
+
+#: templates/directory/back.inc:4
+msgid "Back"
+msgstr "Terug"
+
+#: templates/log/rev.inc:29 templates/checkout/checkout.inc:27
+msgid "Branch Point for:"
+msgstr "Vertakkingspunt voor:"
+
+#: templates/patchsets/ps.inc:14 templates/log/rev.inc:26
+#: templates/checkout/checkout.inc:11
+msgid "Branch:"
+msgstr "Vertakking:"
+
+#: lib/Chora.php:467
+msgid "Branches"
+msgstr "Vertakkingen"
+
+#: templates/history/branch_cell.inc:2
+msgid "Branching to"
+msgstr "Vertakt naar:"
+
+#: templates/log/rev.inc:35 templates/checkout/checkout.inc:35
+#, php-format
+msgid "Changed since <b>%s</b>"
+msgstr "Gewijzigd sinds <b>%s</b>"
+
+#: templates/history/rev.inc:8
+#, php-format
+msgid "Changed: %s"
+msgstr "Gewijzigd: %s"
+
+#: co.php:66
+#, php-format
+msgid "Checkout of %s (revision %s)"
+msgstr "Controle van %s (revisie %s)"
+
+#: templates/cvsgraph/cvsgraph.inc:11
+msgid ""
+"Click on the links in between revisions to get a diff between those "
+"revisions."
+msgstr ""
+"Klik op de links tussen revisies om een verschil tussen deze revisies te "
+"verkrijgen."
+
+#: templates/cvsgraph/cvsgraph.inc:10
+msgid "Click on the revisions and branches to display the file."
+msgstr "Klik op de revisies en vertakkingen om een bestand weer te geven."
+
+#: templates/log/rev.inc:40 templates/log/rev.inc:49
+msgid "Colored"
+msgstr "Gekleurd"
+
+#: templates/patchsets/ps.inc:17 templates/checkout/checkout.inc:19
+msgid "Commit Tags:"
+msgstr "Commit Tags:"
+
+#: templates/stats/stats.inc:4
+msgid "Commits"
+msgstr "Commits"
+
+#: templates/log/request.inc:28
+msgid "Context"
+msgstr "Samenhang"
+
+#: config/prefs.php.dist:11
+msgid "Customize tasks to run upon logging in to Chora."
+msgstr ""
+"Aanpassen van taken welke uitgevoerd worden tijdens aanmelding bij Chora."
+
+#: templates/directory/header.inc:23
+msgid "Da_te"
+msgstr "Da_tum"
+
+#: templates/directory/header.inc:23
+msgid "Date"
+msgstr "Datum"
+
+#: patchsets.php:66
+msgid "Deleted"
+msgstr "Verwijderd"
+
+#: templates/directory/file.inc:6 templates/directory/file.inc:18
+msgid "Deleted File"
+msgstr "Bestand verwijderd"
+
+#: templates/log/rev.inc:13
+msgid "Deselect"
+msgstr "Deselecteren"
+
+#: patchsets.php:63
+msgid "Diff"
+msgstr "Verschil"
+
+#: patchsets.php:46
+msgid "Diff All Files"
+msgstr "Verschillen van alle bestanden"
+
+#: diff.php:69
+#, php-format
+msgid "Diff for %s between version %s and %s"
+msgstr "Verschil in %s tussen versie %s en %s"
+
+#: templates/log/rev.inc:48
+#, php-format
+msgid "Diffs to <b>%s</b>"
+msgstr "Verschillen in <b>%s</b>"
+
+#: templates/log/rev.inc:39
+#, php-format
+msgid "Diffs to version %s"
+msgstr "Verschillen in versie %s"
+
+#: templates/directory/dir.inc:5 templates/directory/dir.inc:7
+msgid "Directory"
+msgstr "Directory"
+
+#: annotate.php:30 co.php:69 templates/log/rev.inc:10
+msgid "Download"
+msgstr "Downloaden"
+
+#: templates/log/request.inc:30
+msgid "Ed Script"
+msgstr "Ed Script"
+
+#: templates/error_page.inc:4
+msgid "Error"
+msgstr "Fout"
+
+#: templates/error_page.inc:7
+msgid "Error Encountered"
+msgstr "Er heeft zich een fout voorgedaan"
+
+#: templates/directory/file.inc:8 templates/directory/file.inc:20
+#: templates/directory/header.inc:8
+msgid "File"
+msgstr "Bestand"
+
+#: templates/patchsets/ps.inc:21
+msgid "Files Changed:"
+msgstr "Bestanden gewijzigd:"
+
+#: templates/log/request.inc:44
+msgid "Get Diffs"
+msgstr "Haal verschillen"
+
+#: lib/Chora.php:470
+msgid "Graph"
+msgstr "Grafiek"
+
+#: cvsgraph.php:48
+#, php-format
+msgid "Graph for %s"
+msgstr "Grafiek van %s"
+
+#: browse.php:40
+msgid "Hide Deleted Files"
+msgstr "Verberg verwijderde bestanden"
+
+#: browse.php:40
+msgid "Hide _Deleted Files"
+msgstr "Verberg _verwijderde bestanden"
+
+#: templates/log/request.inc:26
+msgid "Human Readable"
+msgstr "\"Human Readable\""
+
+#: templates/directory/header.inc:25
+msgid "Last Log"
+msgstr "Laatste log"
+
+#: templates/diff/hr/header.inc:5
+#, php-format
+msgid "Last Log Message for rev %s:"
+msgstr "Laatste logbericht voor rev %s:"
+
+#: templates/diff/hr/footer.inc:5
+msgid "Legend:"
+msgstr "Legenda:"
+
+#: templates/annotate/header.inc:7
+msgid "Line"
+msgstr "Regel"
+
+#: templates/diff/hr/row.inc:3 templates/diff/hr/row.inc:7
+#, php-format
+msgid "Line %s"
+msgstr "Regel %s"
+
+#: templates/headerbar.inc:11
+msgid "Location:"
+msgstr "Locatie:"
+
+#: templates/checkout/checkout.inc:42
+msgid "Log:"
+msgstr "Log:"
+
+#: config/prefs.php.dist:10
+msgid "Login Tasks"
+msgstr "Aanmeldtaken"
+
+#: lib/Chora.php:461
+msgid "Logs"
+msgstr "Logs"
+
+#: templates/log/rev.inc:41 templates/log/rev.inc:50
+msgid "Long"
+msgstr "Lang"
+
+#: diff.php:61
+msgid "Malformed Query"
+msgstr "Misvormde query"
+
+#: patchsets.php:59
+msgid "New File"
+msgstr "Nieuw bestand"
+
+#: templates/diff/hr/nochange.inc:6
+msgid "No Viewable Change"
+msgstr "Geen weer te geven wijziging"
+
+#: templates/log/rev.inc:42 templates/log/rev.inc:51
+msgid "NoWhitespaceChanges"
+msgstr "Geen witruimtewijzigingen"
+
+#: config/prefs.php.dist:9
+msgid "Other Options"
+msgstr "Andere opties"
+
+#: lib/Chora.php:369
+msgid "Other Repositories"
+msgstr "Andere depots"
+
+#: templates/directory/back.inc:4
+msgid "Parent Directory"
+msgstr "Voorgaande directory"
+
+#: templates/patchsets/ps.inc:6
+#, php-format
+msgid "PatchSet %s</span> by %s"
+msgstr "Patchset %s</span> door %s"
+
+#: lib/Chora.php:464
+msgid "Patchsets"
+msgstr "Patchsets"
+
+#: patchsets.php:27
+#, php-format
+msgid "Patchsets for %s"
+msgstr "Patchsets voor %s"
+
+#: templates/error_page.inc:13
+msgid "Please contact"
+msgstr "Neem contact op, a.u.b."
+
+#: templates/diff/hr/footer.inc:11
+#, php-format
+msgid "Removed in v.%s"
+msgstr "Verwijderd in v.%s"
+
+#: templates/log/request.inc:14
+msgid "Retrieve diffs between:"
+msgstr "Haal verschillen op tussen:"
+
+#: templates/directory/header.inc:13 templates/annotate/header.inc:6
+msgid "Rev"
+msgstr "Revisie"
+
+#: co.php:73
+#, php-format
+msgid "Revision %s for file %s not found."
+msgstr "Revisie %s van bestand %s niet gevonden."
+
+#: templates/checkout/checkout.inc:4
+#, php-format
+msgid "Revision <b>%s</b>, <i>%s</i> (%s ago) by %s"
+msgstr "Revisie <b>%s</b>, <i>%s</i> (%s geleden) door %s"
+
+#: templates/log/rev.inc:15
+msgid "Select for Diff"
+msgstr "Selecteer voor ophalen van verschillen"
+
+#: browse.php:42
+msgid "Show Deleted Files"
+msgstr "Toon verwijderde bestanden"
+
+#: browse.php:42
+msgid "Show _Deleted Files"
+msgstr "Toon ver_wijderde bestanden"
+
+#: templates/log/request.inc:29
+msgid "Side-by-Side"
+msgstr "Zij aan zij"
+
+#: templates/directory/header.inc:7 templates/directory/header.inc:12
+#: templates/directory/header.inc:17 templates/directory/header.inc:22
+msgid "Sort Order"
+msgstr "Sorteervolgorde"
+
+#: annotate.php:27
+#, php-format
+msgid "Source Annotation of %s for version %s"
+msgstr "Bron annotatie van %s voor versie %s"
+
+#: history.php:160
+#, php-format
+msgid "Source Branching View for %s"
+msgstr "Bron vertakkingsweergave voor %s"
+
+#: browse.php:32
+#, php-format
+msgid "Source Directory of /%s"
+msgstr "Bron directory van /%s"
+
+#: browse.php:126
+#, php-format
+msgid "Source Log for %s"
+msgstr "Bron log voor %s"
+
+#: lib/Chora.php:183
+msgid ""
+"SourceRoot not found! This could be a misconfiguration by the server "
+"administrator, or the server could be having temporary problems. Please try "
+"again later."
+msgstr ""
+"BronRoot niet gevonden! Dit kan een misconfiguratie van de serverbeheerder "
+"zijn, of de server kan tijdelijke problemen hebben. Probeer later opnieuw, a."
+"u.b."
+
+#: lib/Chora.php:472
+msgid "Statistics"
+msgstr "Statistieken"
+
+#: stats.php:27
+#, php-format
+msgid "Statistics for %s"
+msgstr "Statistieken voor %s"
+
+#: templates/log/rev.inc:32
+msgid "Tags:"
+msgstr "Tags:"
+
+#: templates/log/request.inc:5
+msgid ""
+"This form allows you to request diffs between any two revisions of a file. "
+"You may select a symbolic revision name using the selection box or you may "
+"type in a numeric name using the type-in text box."
+msgstr ""
+"Met dit formulier kunt u de verschillen tussen twee revisies van een bestand "
+"opvragen. U kunt een symbolische revisienaam selecteren m.b.v. de "
+"selectiebox of u kunt een numerieke naam invoeren in de tekstbox."
+
+#: templates/headerbar.inc:16
+msgid "Tracking Branch"
+msgstr "Vertakking volgen"
+
+#: templates/log/request.inc:23
+msgid "Type:"
+msgstr "Type:"
+
+#: templates/log/request.inc:27
+msgid "Unified"
+msgstr "\"Unified\""
+
+#: templates/log/request.inc:18 templates/log/request.inc:38
+msgid "Use Text Field"
+msgstr "Gebruik tekstveld"
+
+#: config/prefs.php.dist:37
+msgid "Use last viewed file or directory at login time"
+msgstr "Gebruik het laatst weergegeven bestand of directory bij aanmelding"
+
+#: annotate.php:29 templates/log/rev.inc:9
+msgid "View"
+msgstr "Bekijken"
+
+#: templates/log/request.inc:60
+msgid "View Branch"
+msgstr "Vertakking weergeven"
+
+#: templates/log/request.inc:54
+msgid "View revisions on:"
+msgstr "Revisies weergeven van:"
+
+#: lib/Chora.php:474
+msgid "View:"
+msgstr "Weergeven:"
+
+#: templates/directory/header.inc:18
+msgid "_Author"
+msgstr "_Auteur"
+
+#: lib/Chora.php:467
+msgid "_Branches"
+msgstr "Verta_kkingen"
+
+#: lib/Chora.php:441
+msgid "_Browse"
+msgstr "_Bladeren"
+
+#: templates/directory/header.inc:8
+msgid "_File"
+msgstr "Be_stand"
+
+#: lib/Chora.php:470
+msgid "_Graph"
+msgstr "_Grafiek"
+
+#: lib/Chora.php:461
+msgid "_Logs"
+msgstr "_Logs"
+
+#: lib/Chora.php:464
+msgid "_Patchsets"
+msgstr "_Patchsets"
+
+#: templates/directory/header.inc:13
+msgid "_Rev"
+msgstr "_Revisie"
+
+#: lib/Chora.php:472
+msgid "_Statistics"
+msgstr "Stat_istieken"
+
+#: templates/log/request.inc:35
+msgid "and:"
+msgstr "en:"
+
+#: templates/log/rev.inc:5 templates/history/rev.inc:4
+#, php-format
+msgid "by %s"
+msgstr "door %s"
+
+#: templates/diff/hr/footer.inc:15
+msgid "changed lines"
+msgstr "gewijzigde regels"
+
+#: lib/Chora.php:32
+msgid "day"
+msgstr "dag"
+
+#: lib/Chora.php:32
+msgid "days"
+msgstr "dagen"
+
+#: templates/error_page.inc:14
+msgid "for further information."
+msgstr "voor verdere informatie."
+
+#: lib/Chora.php:31
+msgid "hour"
+msgstr "uur"
+
+#: lib/Chora.php:31
+msgid "hours"
+msgstr "uren"
+
+#: lib/Chora.php:30
+msgid "minute"
+msgstr "minuut"
+
+#: lib/Chora.php:30
+msgid "minutes"
+msgstr "minuten"
+
+#: lib/Chora.php:34
+msgid "month"
+msgstr "maand"
+
+#: lib/Chora.php:34
+msgid "months"
+msgstr "maanden"
+
+#: templates/history/branch_cell.inc:6
+#, php-format
+msgid "revision %s"
+msgstr "revisie %s"
+
+#: lib/Chora.php:29
+msgid "second"
+msgstr "seconde"
+
+#: lib/Chora.php:29
+msgid "seconds"
+msgstr "seconden"
+
+#: templates/diff/hr/header.inc:13 templates/diff/hr/header.inc:14
+#, php-format
+msgid "version %s"
+msgstr "versie %s"
+
+#: lib/Chora.php:43
+msgid "very little time"
+msgstr "erg kort"
+
+#: lib/Chora.php:33
+msgid "week"
+msgstr "week"
+
+#: lib/Chora.php:33
+msgid "weeks"
+msgstr "weken"
+
+#: lib/Chora.php:35
+msgid "year"
+msgstr "jaar"
+
+#: lib/Chora.php:35
+msgid "years"
+msgstr "jaren"
--- /dev/null
+# Chora Polish translation.
+# Copyright (C) 2001 Piotr Roszatycki <dexter@debian.org>
+# Piotr Roszatycki <dexter@debian.org>, 2001.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Chora 1.0\n"
+"POT-Creation-Date: 2001-12-30 14:53+0100\n"
+"PO-Revision-Date: 2001-12-30 14:15+0100\n"
+"Last-Translator: Piotr Roszatycki <dexter@debian.org>\n"
+"Language-Team: Polish <dev@horde.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=iso-8859-2\n"
+"Content-Transfer-Encoding: 8-bit\n"
+
+msgid ""
+" This form allows you to request diffs between any two revisions of a file. "
+"You may select a symbolic revision name using the selection box or you may "
+"type in a numeric name using the type-in text box."
+msgstr ""
+" Ten formularz pozwala na utworzenie pliku zmian pomiêdzy dowolnymi wersjami "
+"tego pliku. Mo¿esz okre¶liæ symboliczne oznaczenie wersji poprzez wybranie "
+"oznaczenia z listy. Mo¿esz te¿ okre¶liæ numerycznie wersjê poprzez wpisanie "
+"oznaczenia w pole tekstowe."
+
+#, c-format
+msgid "%s ago"
+msgstr "%s temu"
+
+#, c-format
+msgid "Added in v.%s"
+msgstr "Dodane w v.%s"
+
+msgid "All Branches"
+msgstr "Wszystkie odga³êzienia"
+
+msgid "Annotate"
+msgstr "Adnotacja"
+
+msgid "Author"
+msgstr "Autor"
+
+msgid "Back"
+msgstr "Cofnij"
+
+msgid "Branch Point for:"
+msgstr "Punkt odga³êzienia dla:"
+
+msgid "Branch:"
+msgstr "Odga³êzienie:"
+
+msgid "Branching to"
+msgstr "Odga³êzienie do"
+
+#, c-format
+msgid "CVS Annotation of %s for version %s"
+msgstr "Adnotacja CVS dla %s dla wersji %s"
+
+#, c-format
+msgid "CVS Branching View for %s"
+msgstr "Widok odga³êzieñ CVS dla %s"
+
+#, c-format
+msgid "CVS Checkout of %s (revision %s)"
+msgstr "Aktualizacja CVS dla %s (wersja %s)"
+
+#, c-format
+msgid "CVS Directory of /%s"
+msgstr "Katalog CVS dla /%s"
+
+#, c-format
+msgid "CVS Log for %s"
+msgstr "Historia CVS dla %s"
+
+msgid "CVS Tags:"
+msgstr "Oznaczenia CVS:"
+
+#, c-format
+msgid "Changed since <b>%s</b>"
+msgstr "Zmiana od <b>%s</b>"
+
+#, c-format
+msgid "Changed: %s"
+msgstr "Zmiana: %s"
+
+msgid "Chora Homepage"
+msgstr "Strona domowa Chora"
+
+msgid "Chora is not properly configured"
+msgstr "Chora nie jest w pe³ni skonfigurowana."
+
+msgid "Context"
+msgstr "Kontekst"
+
+msgid "Couldn't perform checkout of the requested file"
+msgstr "Nie mo¿na aktualizowaæ wybranego pliku"
+
+msgid "Date"
+msgstr "Data"
+
+msgid "Deleted File"
+msgstr "Usuniête pliki"
+
+#, c-format
+msgid "Diff for %s between version %s and %s"
+msgstr "Plik ró¿nicy dla %s pomiêdzy wersjami %s i %s"
+
+#, c-format
+msgid "Diffs ignoring whitespace to version %s"
+msgstr "Plik ró¿nicy z pominiêciem spacji dla wersji %s"
+
+#, c-format
+msgid "Diffs to selected version %s"
+msgstr "Plik ró¿nicy dla wybranej wersji %s"
+
+#, c-format
+msgid "Diffs to version %s"
+msgstr "Plik ró¿nicy dla wersji %s"
+
+msgid "Directory"
+msgstr "Ksi±¿ka adresowa"
+
+msgid "Download"
+msgstr "Pobierz"
+
+msgid "Ed Script"
+msgstr "Edytuj skrypt"
+
+msgid "Error Encountered"
+msgstr "Wyst±pi³ b³±d"
+
+msgid "Error"
+msgstr "B³±d"
+
+msgid "File"
+msgstr "Plik"
+
+msgid "Get Diffs"
+msgstr "Pobierz plik ró¿nicy"
+
+msgid "Hide Deleted Files"
+msgstr "Ukryj usuniête pliki"
+
+msgid "Human Readable"
+msgstr "Czytelne dla cz³owieka"
+
+msgid "Invalid revision number"
+msgstr "B³êdny numer wersji"
+
+#, c-format
+msgid "Last Log Message for rev %s:"
+msgstr "Ostatni wpis w historii dla wersji %s:"
+
+msgid "Last Log Message:"
+msgstr "Ostatni wpis w historii:"
+
+msgid "Last Log"
+msgstr "Ostatni wpis"
+
+#, c-format
+msgid "Line %s"
+msgstr "Linia %s"
+
+msgid "Line"
+msgstr "Linia"
+
+msgid "Location:"
+msgstr "Lokacja:"
+
+msgid "No Viewable Change"
+msgstr "Brak widocznych zmian"
+
+msgid "Other Repositories"
+msgstr "Pozosta³e repozytoria"
+
+msgid "Please contact"
+msgstr "Proszê skontaktowaæ siê"
+
+msgid "Previous Directory"
+msgstr "Poprzedni katalog"
+
+#, c-format
+msgid "Removed in v.%s"
+msgstr "Usuniête w v.%s"
+
+msgid "Retrieve diffs between:"
+msgstr "Pobierz plik zmian pomiêdzy:"
+
+msgid "Rev"
+msgstr "Wer"
+
+msgid "Select for Diff"
+msgstr "Wybierz folder"
+
+msgid "Show Deleted Files"
+msgstr "Poka¿ usuniête pliki"
+
+msgid "Side-by-Side"
+msgstr "Obok siebie"
+
+msgid "Some of Chora's configuration files are missing:"
+msgstr "Brakuje kilku plików konfiguracyjnych Chora:"
+
+msgid "Sort Order"
+msgstr "Porz±dek sortowania"
+
+msgid "Switch to Branch View"
+msgstr "Prze³±cz na widok odga³êzieñ"
+
+msgid "Switch to Log View"
+msgstr "Prze³±cz na widok historii"
+
+msgid ""
+"This file controls the stylesheet that is used to set colors and fonts in "
+"addition to or overriding Horde defaults."
+msgstr "W tym pliku okre¶lone s± style u¿ywane do ustawienia kolorów i fontów."
+
+msgid ""
+"This file defines all of the cvs repositories that you wish Chora to display."
+msgstr ""
+"W tym pliku okre¶lone s± repozytoria CVS, które pokazywane s± przez Chora."
+
+msgid "This file defines any special MIME-type handling for Chora."
+msgstr ""
+"W tym pliku okre¶lone s± skojarzenia typów MIME obs³ugiwane przez Chora."
+
+msgid ""
+"This is the main Chora configuration file. It contains paths and options for "
+"all Chora scripts."
+msgstr ""
+"To jest g³ówny plik konfiguracyjny Chora. Zawiera on ¶cie¿ki i opcje "
+"skryptów Chora."
+
+msgid "Tracking Branch"
+msgstr "¦ledzenie ga³êzi"
+
+msgid "Type:"
+msgstr "Format:"
+
+msgid "Unified"
+msgstr "Ujednolicony"
+
+msgid "Unselect"
+msgstr "Odznacz"
+
+msgid "Use Text Field"
+msgstr "U¿yj pola tekstowego"
+
+msgid "View Branch"
+msgstr "Widok odga³êzieñ"
+
+msgid "View revisions on:"
+msgstr "Widok wersji dla:"
+
+msgid "View"
+msgstr "Widok"
+
+msgid "and:"
+msgstr "i:"
+
+#, c-format
+msgid "by %s"
+msgstr "od %s"
+
+msgid "changed lines"
+msgstr "zmienione linie"
+
+msgid "day"
+msgstr "dzieñ"
+
+msgid "days"
+msgstr "dni"
+
+msgid "for further information."
+msgstr "w celu dalszych informacji."
+
+msgid "hour"
+msgstr "godzina"
+
+msgid "hours"
+msgstr "godzin"
+
+msgid "long"
+msgstr "d³ugi"
+
+msgid "minute"
+msgstr "minuta"
+
+msgid "minutes"
+msgstr "minut"
+
+msgid "month"
+msgstr "miesi±c"
+
+msgid "months"
+msgstr "miesiêcy"
+
+#, c-format
+msgid "revision %s"
+msgstr "wersja %s"
+
+msgid "second"
+msgstr "sekunda"
+
+msgid "seconds"
+msgstr "sekund"
+
+msgid "unified"
+msgstr "ujednolicony"
+
+#, c-format
+msgid "version %s"
+msgstr "wersja %s"
+
+msgid "very little time"
+msgstr "bardzo krótki czas"
+
+msgid "week"
+msgstr "tydzieñ"
+
+msgid "weeks"
+msgstr "tygodni"
+
+msgid "year"
+msgstr "rok"
+
+msgid "years"
+msgstr "lat"
--- /dev/null
+# Brazilian Portuguese translation of Chora
+# Antonio Dias <accdias@sst.com.br>, 2001.
+# garnier@hmg.click21.com.br, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: Chora 2.0\n"
+"Report-Msgid-Bugs-To: dev@lists.horde.org\n"
+"POT-Creation-Date: 2006-01-12 12:08-0200\n"
+"PO-Revision-Date: 2007-01-10 01:14+0100\n"
+"Last-Translator: garnier@hmg.click21.com.br\n"
+"Language-Team: Brazilian Portuguese <dev@lists.horde.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=iso-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: templates/annotate/header.inc:4
+msgid "#"
+msgstr "#"
+
+#: templates/patchsets/ps.inc:12 templates/log/rev.inc:26
+#, php-format
+msgid "%s ago"
+msgstr "%s atrás"
+
+#: templates/diff/hr/footer.inc:19
+#, php-format
+msgid "Added in v.%s"
+msgstr "Adicionado na v.%s"
+
+#: templates/log/request.inc:57
+msgid "All Branches"
+msgstr "Todos os Ramos"
+
+#: co.php:72 templates/log/rev.inc:8
+msgid "Annotate"
+msgstr "Anotar"
+
+#: templates/directory/header.inc:18 templates/stats/stats.inc:3
+#: templates/annotate/header.inc:5
+msgid "Author"
+msgstr "Autor"
+
+#: templates/directory/back.inc:4
+msgid "Back"
+msgstr "Voltar"
+
+#: templates/checkout/checkout.inc:27 templates/log/rev.inc:31
+msgid "Branch Point for:"
+msgstr "Ponto de Ramificação para:"
+
+#: templates/checkout/checkout.inc:11 templates/patchsets/ps.inc:14
+#: templates/log/rev.inc:28
+msgid "Branch:"
+msgstr "Ramo:"
+
+#: lib/Chora.php:465
+msgid "Branches"
+msgstr "Ramos"
+
+#: templates/history/branch_cell.inc:2
+msgid "Branching to"
+msgstr "Ramificando para"
+
+#: templates/checkout/checkout.inc:35
+#, php-format
+msgid "Changed since <b>%s</b>"
+msgstr "Modificado desde <b>%s</b>"
+
+#: templates/log/rev.inc:37
+#, php-format
+msgid "Changed since <strong>%s</strong>"
+msgstr "Modificado desde <strong>%s</strong>"
+
+#: templates/history/rev.inc:8
+#, php-format
+msgid "Changed: %s"
+msgstr "Modificado: %s"
+
+#: co.php:70
+#, php-format
+msgid "Checkout of %s (revision %s)"
+msgstr "Retirada CVS de %s (revisão %s)"
+
+#: templates/cvsgraph/cvsgraph.inc:11
+msgid ""
+"Click on the links in between revisions to get a diff between those "
+"revisions."
+msgstr "Clique nos links entre revisões para obter diferenças entre elas."
+
+#: templates/cvsgraph/cvsgraph.inc:10
+msgid "Click on the revisions and branches to display the file."
+msgstr "Clique nas revisões e ramos para exibir o arquivo."
+
+#: templates/log/rev.inc:42 templates/log/rev.inc:50
+msgid "Colored"
+msgstr "Colorido"
+
+#: templates/checkout/checkout.inc:19 templates/patchsets/ps.inc:17
+msgid "Commit Tags:"
+msgstr "Atualizar Etiquetas:"
+
+#: templates/stats/stats.inc:4
+msgid "Commits"
+msgstr "Atualizações"
+
+#: templates/log/request.inc:28
+msgid "Context"
+msgstr "Contexto"
+
+#: config/prefs.php.dist:11
+msgid "Customize tasks to run upon logging in to Chora."
+msgstr "Customiza tarefas a serem executadas ao se conectar ao Chora."
+
+#: templates/directory/header.inc:23
+msgid "Da_te"
+msgstr "Da_ta"
+
+#: templates/directory/header.inc:23
+msgid "Date"
+msgstr "Data"
+
+#: patchsets.php:66
+msgid "Deleted"
+msgstr "Excluída"
+
+#: templates/directory/file.inc:5 templates/directory/file.inc:17
+msgid "Deleted File"
+msgstr "Arquivo Excluído"
+
+#: templates/log/rev.inc:13
+msgid "Deselect"
+msgstr "Desmarcar"
+
+#: patchsets.php:63
+msgid "Diff"
+msgstr "Obter Diferenças"
+
+#: patchsets.php:46
+msgid "Diff All Files"
+msgstr "Obter Diferenças em Todos os Arquivos"
+
+#: diff.php:69
+#, php-format
+msgid "Diff for %s between version %s and %s"
+msgstr "Diferença para %s entre as versões %s e %s"
+
+#: templates/log/rev.inc:49
+#, php-format
+msgid "Diffs to <strong>%s</strong>"
+msgstr "Diferenças para <strong>%s</strong>"
+
+#: templates/log/rev.inc:41
+#, php-format
+msgid "Diffs to version %s"
+msgstr "Diferenças para a versão %s"
+
+#: templates/directory/dir.inc:5 templates/directory/dir.inc:7
+msgid "Directory"
+msgstr "Diretório"
+
+#: annotate.php:30 co.php:73 templates/log/rev.inc:10
+msgid "Download"
+msgstr "Download"
+
+#: templates/log/request.inc:30
+msgid "Ed Script"
+msgstr "Ed Script"
+
+#: templates/error_page.inc:4
+msgid "Error"
+msgstr "Erro"
+
+#: templates/error_page.inc:7
+msgid "Error Encountered"
+msgstr "Ocorreu um Erro"
+
+#: templates/directory/file.inc:7 templates/directory/file.inc:19
+#: templates/directory/header.inc:8
+msgid "File"
+msgstr "Arquivo"
+
+#: templates/patchsets/ps.inc:21
+msgid "Files Changed:"
+msgstr "Arquivos Modificados:"
+
+#: templates/log/request.inc:44
+msgid "Get Diffs"
+msgstr "Obter Diferenças"
+
+#: lib/Chora.php:468
+msgid "Graph"
+msgstr "Gráfico"
+
+#: cvsgraph.php:48
+#, php-format
+msgid "Graph for %s"
+msgstr "Gráfico de %s"
+
+#: browse.php:40
+msgid "Hide Deleted Files"
+msgstr "Esconder Arquivos Excluídos"
+
+#: browse.php:40
+msgid "Hide _Deleted Files"
+msgstr "Esconder _Arquivos Excluídos"
+
+#: templates/log/request.inc:26
+msgid "Human Readable"
+msgstr "Formato Legível"
+
+#: templates/directory/header.inc:25
+msgid "Last Log"
+msgstr "Último Registro"
+
+#: templates/diff/hr/header.inc:5
+#, php-format
+msgid "Last Log Message for rev %s:"
+msgstr "Último mensagem registrada para a rev %s:"
+
+#: templates/diff/hr/footer.inc:5
+msgid "Legend:"
+msgstr "Legenda:"
+
+#: templates/annotate/header.inc:7
+msgid "Line"
+msgstr "Linha"
+
+#: templates/diff/hr/row.inc:3 templates/diff/hr/row.inc:7
+#, php-format
+msgid "Line %s"
+msgstr "Linha %s"
+
+#: templates/headerbar.inc:11
+msgid "Location:"
+msgstr "Localização:"
+
+#: templates/checkout/checkout.inc:42
+msgid "Log:"
+msgstr "Registro:"
+
+#: config/prefs.php.dist:10
+msgid "Login Tasks"
+msgstr "Tarefas de Conexão"
+
+#: lib/Chora.php:459
+msgid "Logs"
+msgstr "Registros"
+
+#: templates/log/rev.inc:43 templates/log/rev.inc:51
+msgid "Long"
+msgstr "Longo"
+
+#: diff.php:61
+msgid "Malformed Query"
+msgstr "Consulta Mal Formada"
+
+#: patchsets.php:59
+msgid "New File"
+msgstr "Novo Arquivo"
+
+#: templates/diff/hr/nochange.inc:6
+msgid "No Viewable Change"
+msgstr "Não Há Modificação Visível"
+
+#: templates/log/rev.inc:44 templates/log/rev.inc:52
+msgid "NoWhitespaceChanges"
+msgstr "SemEspaçosEmBranco"
+
+#: config/prefs.php.dist:9
+msgid "Other Options"
+msgstr "Outras Opções"
+
+#: lib/Chora.php:368
+msgid "Other Repositories"
+msgstr "Outros Repositórios"
+
+#: templates/directory/back.inc:4
+msgid "Parent Directory"
+msgstr "Diretório Pai"
+
+#: templates/patchsets/ps.inc:6
+#, php-format
+msgid "PatchSet %s</span> by %s"
+msgstr "PatchSet %s</span> por %s"
+
+#: lib/Chora.php:462
+msgid "Patchsets"
+msgstr "Patchsets"
+
+#: patchsets.php:27
+#, php-format
+msgid "Patchsets for %s"
+msgstr "Patchsets para %s"
+
+#: templates/error_page.inc:13
+msgid "Please contact"
+msgstr "Por favor, contate"
+
+#: templates/diff/hr/footer.inc:11
+#, php-format
+msgid "Removed in v.%s"
+msgstr "Removido na v.%s"
+
+#: templates/log/request.inc:14
+msgid "Retrieve diffs between:"
+msgstr "Receber diferenças entre:"
+
+#: templates/directory/header.inc:13 templates/annotate/header.inc:6
+msgid "Rev"
+msgstr "Rev"
+
+#: co.php:77
+#, php-format
+msgid "Revision %s for file %s not found."
+msgstr "Revisão %s para o arquivo %s não foi encontrada."
+
+#: templates/checkout/checkout.inc:4
+#, php-format
+msgid "Revision <b>%s</b>, <i>%s</i> (%s ago) by %s"
+msgstr "Revisão <b>%s</b>, <i>%s</i> (%s atrás) por %s"
+
+#: templates/log/rev.inc:15
+msgid "Select for Diff"
+msgstr "Selecione para Diferenças"
+
+#: browse.php:42
+msgid "Show Deleted Files"
+msgstr "Mostrar Arquivos Excluídos"
+
+#: browse.php:42
+msgid "Show _Deleted Files"
+msgstr "Mostrar _Arquivos Excluídos"
+
+#: templates/log/request.inc:29
+msgid "Side-by-Side"
+msgstr "Lado-a-Lado"
+
+#: templates/directory/header.inc:7 templates/directory/header.inc:12
+#: templates/directory/header.inc:17 templates/directory/header.inc:22
+msgid "Sort Order"
+msgstr "Ordenar por"
+
+#: annotate.php:27
+#, php-format
+msgid "Source Annotation of %s for version %s"
+msgstr "Anotação CVS de %s para a versão %s"
+
+#: history.php:160
+#, php-format
+msgid "Source Branching View for %s"
+msgstr "Visualização da Ramificação CVS para %s"
+
+#: browse.php:32
+#, php-format
+msgid "Source Directory of /%s"
+msgstr "Diretório CVS de /%s"
+
+#: browse.php:126
+#, php-format
+msgid "Source Log for %s"
+msgstr "Registro CVS para %s"
+
+#: lib/Chora.php:182
+msgid ""
+"SourceRoot not found! This could be a misconfiguration by the server "
+"administrator, or the server could be having temporary problems. Please try "
+"again later."
+msgstr ""
+"SourceRoot não encontrado! Isto pode ser um erro de configuração no "
+"servidor, ou o servidor pode estar com algum problema temporário. Por favor, "
+"tente novamente mais tarde."
+
+#: lib/Chora.php:470
+msgid "Statistics"
+msgstr "Estatísticas"
+
+#: stats.php:27
+#, php-format
+msgid "Statistics for %s"
+msgstr "Estatísticas para %s"
+
+#: templates/log/rev.inc:34
+msgid "Tags:"
+msgstr "Etiquetas CVS:"
+
+#: templates/log/request.inc:5
+msgid ""
+"This form allows you to request diffs between any two revisions of a file. "
+"You may select a symbolic revision name using the selection box or you may "
+"type in a numeric name using the type-in text box."
+msgstr ""
+" Este formulário permite solicitar diferenças entre duas revisões de um "
+"arquivo. Você pode selecionar uma revisão simbólica utilizando a caixa de "
+"seleção ou então você pode digitar um valor numérico no campo de texto."
+
+#: templates/headerbar.inc:16
+msgid "Tracking Branch"
+msgstr "Rastreando Ramificação"
+
+#: templates/log/request.inc:23
+msgid "Type:"
+msgstr "Tipo:"
+
+#: templates/log/request.inc:27
+msgid "Unified"
+msgstr "Unificado"
+
+#: templates/log/request.inc:18 templates/log/request.inc:38
+msgid "Use Text Field"
+msgstr "Utilize o Campo de Texto"
+
+#: config/prefs.php.dist:37
+msgid "Use last viewed file or directory at login time"
+msgstr "Usar o último arquivo ou diretório visualizado ao conectar"
+
+#: annotate.php:29 templates/log/rev.inc:9
+msgid "View"
+msgstr "Visualizar"
+
+#: templates/log/request.inc:60
+msgid "View Branch"
+msgstr "Visualizar Ramificação"
+
+#: templates/log/request.inc:54
+msgid "View revisions on:"
+msgstr "Visualizar revisões em:"
+
+#: lib/Chora.php:472
+msgid "View:"
+msgstr "Visualizar"
+
+#: templates/directory/header.inc:18
+msgid "_Author"
+msgstr "_Autor"
+
+#: lib/Chora.php:465
+msgid "_Branches"
+msgstr "_Ramos"
+
+#: lib/Chora.php:439
+msgid "_Browse"
+msgstr "_Exibir"
+
+#: templates/directory/header.inc:8
+msgid "_File"
+msgstr "_Arquivo"
+
+#: lib/Chora.php:468
+msgid "_Graph"
+msgstr "_Gráfico"
+
+#: lib/Chora.php:459
+msgid "_Logs"
+msgstr "_Registros"
+
+#: lib/Chora.php:462
+msgid "_Patchsets"
+msgstr "_Patchsets"
+
+#: templates/directory/header.inc:13
+msgid "_Rev"
+msgstr "_Rev"
+
+#: lib/Chora.php:470
+msgid "_Statistics"
+msgstr "_Estatísticas"
+
+#: templates/log/request.inc:35
+msgid "and:"
+msgstr "e:"
+
+#: templates/history/rev.inc:4 templates/log/rev.inc:5
+#, php-format
+msgid "by %s"
+msgstr "por %s"
+
+#: templates/diff/hr/footer.inc:15
+msgid "changed lines"
+msgstr "linhas modificadas"
+
+#: lib/Chora.php:31
+msgid "day"
+msgstr "dia"
+
+#: lib/Chora.php:31
+msgid "days"
+msgstr "dias"
+
+#: templates/error_page.inc:14
+msgid "for further information."
+msgstr "para maiores informações."
+
+#: lib/Chora.php:30
+msgid "hour"
+msgstr "hora"
+
+#: lib/Chora.php:30
+msgid "hours"
+msgstr "horas"
+
+#: lib/Chora.php:29
+msgid "minute"
+msgstr "minuto"
+
+#: lib/Chora.php:29
+msgid "minutes"
+msgstr "minutos"
+
+#: lib/Chora.php:33
+msgid "month"
+msgstr "mês"
+
+#: lib/Chora.php:33
+msgid "months"
+msgstr "meses"
+
+#: templates/history/branch_cell.inc:6
+#, php-format
+msgid "revision %s"
+msgstr "revisão %s"
+
+#: lib/Chora.php:28
+msgid "second"
+msgstr "segundo"
+
+#: lib/Chora.php:28
+msgid "seconds"
+msgstr "segundos"
+
+#: templates/diff/hr/header.inc:13 templates/diff/hr/header.inc:14
+#, php-format
+msgid "version %s"
+msgstr "versão %s"
+
+#: lib/Chora.php:42
+msgid "very little time"
+msgstr "tempo muito pequeno"
+
+#: lib/Chora.php:32
+msgid "week"
+msgstr "semana"
+
+#: lib/Chora.php:32
+msgid "weeks"
+msgstr "semanas"
+
+#: lib/Chora.php:34
+msgid "year"
+msgstr "ano"
+
+#: lib/Chora.php:34
+msgid "years"
+msgstr "anos"
--- /dev/null
+# CHORA ROMANIAN TRANSLATION
+# Copyright (C) 2003 Horde Project
+# Eugen Hoanca <eugenh@urban-grafx.ro>, 2003.
+# Marius Dragulescu <mariusd@urban-grafx.ro>, 2003.
+#
+
+msgid ""
+msgstr ""
+"Project-Id-Version: Chora 1.2\n"
+"POT-Creation-Date: 2003-02-24 14:30+0200\n"
+"PO-Revision-Date: 2003-01-03 12:00+0200\n"
+"Last-Translator: Eugen Hoanca <eugenh@urban-grafx.ro>\n"
+"Language-Team: Romanian <i18n@lists.horde.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: templates/log/request.inc:5
+msgid ""
+" This form allows you to request diffs between any two revisions of a file. "
+"You may select a symbolic revision name using the selection box or you may "
+"type in a numeric name using the type-in text box."
+msgstr ""
+"Acest formular permite cererea de diferente intre doua revizii a unui fisier."
+"Puteti selecta un nume simbolic de revizie utilizand casuta de selectie sau "
+"scrieti o valoare numerica in casuta de text."
+
+#: templates/annotate/header.inc:4
+msgid "#"
+msgstr "#"
+
+#: templates/log/rev.inc:14
+#, php-format
+msgid "%s ago"
+msgstr "acum %s"
+
+#: templates/diff/hr/footer.inc:19
+#, php-format
+msgid "Added in v.%s"
+msgstr "Adaugat in v.%s"
+
+#: templates/log/request.inc:57
+msgid "All Branches"
+msgstr "Toate ramurile"
+
+#: prefs.php:77
+msgid "An illegal value was specified."
+msgstr "Valoare incorecta specificata."
+
+#: co.php:65 templates/log/rev.inc:8
+msgid "Annotate"
+msgstr "Adnotare"
+
+#: templates/annotate/header.inc:5 templates/directory/header.inc:17
+msgid "Author"
+msgstr "Autor"
+
+#: templates/directory/back.inc:4
+msgid "Back"
+msgstr "Inapoi"
+
+#: templates/log/rev.inc:23
+msgid "Branch Point for:"
+msgstr "Ramura pentru:"
+
+#: templates/log/rev.inc:16
+msgid "Branch:"
+msgstr "Ramura:"
+
+#: templates/history/branch_cell.inc:2
+msgid "Branching to"
+msgstr "Ramura catre"
+
+#: annotate.php:26
+#, php-format
+msgid "CVS Annotation of %s for version %s"
+msgstr "Adnotarea CVS a %s pentru versiunea %s"
+
+#: history.php:153
+#, php-format
+msgid "CVS Branching View for %s"
+msgstr "Vizualizare ramura CVS pentru %s"
+
+#: co.php:63
+#, php-format
+msgid "CVS Checkout of %s (revision %s)"
+msgstr "Verificare CVS a %s (revizie %s)"
+
+#: cvs.php:35
+#, php-format
+msgid "CVS Directory of /%s"
+msgstr "Director CVS al %s"
+
+#: cvs.php:123
+#, php-format
+msgid "CVS Log for %s"
+msgstr "Log CVS pentru %s"
+
+#: templates/log/rev.inc:19
+msgid "CVS Tags:"
+msgstr "Etichete CVS:"
+
+#: templates/log/rev.inc:27
+#, php-format
+msgid "Changed since <b>%s</b>"
+msgstr "Schimbat din <b>%s><b>"
+
+#: templates/history/rev.inc:8
+#, php-format
+msgid "Changed: %s"
+msgstr "Schimbat: %s"
+
+#: templates/headerbar.inc:11
+msgid "Chora Homepage"
+msgstr "Pagina Chora"
+
+#: templates/index/notconfigured.inc:4
+msgid "Chora is not properly configured"
+msgstr "Chora nu este configurat corect"
+
+#: templates/log/request.inc:28
+msgid "Context"
+msgstr "Context"
+
+#: lib/CVSLib/Checkout.php:43
+msgid "Couldn't perform checkout of the requested file"
+msgstr "Nu se poate verifica fisierul dorit"
+
+#: config/prefs.php.dist:7
+msgid "Customize tasks to run upon logging in to Chora."
+msgstr "Personalizare actiuni la intrarea in Chora."
+
+#: templates/directory/header.inc:21
+msgid "Date"
+msgstr "Data"
+
+#: templates/directory/file.inc:6 templates/directory/file.inc:18
+msgid "Deleted File"
+msgstr "Fisier sters"
+
+#: diff.php:66
+#, php-format
+msgid "Diff for %s between version %s and %s"
+msgstr "Diferenta pentru %s intre versiunile %s si %s"
+
+#: templates/log/rev.inc:42
+#, php-format
+msgid "Diffs ignoring whitespace to version %s"
+msgstr "Diferentele ignorand spatiile spre versiunea %s"
+
+#: templates/log/rev.inc:48
+#, php-format
+msgid "Diffs to selected version %s"
+msgstr "Diferentele spre versiunea %s"
+
+#: templates/log/rev.inc:38
+#, php-format
+msgid "Diffs to version %s"
+msgstr "Diferentele la versiunea %s"
+
+#: templates/directory/dir.inc:5 templates/directory/dir.inc:7
+msgid "Directory"
+msgstr "Director"
+
+#: annotate.php:29 co.php:66 templates/log/rev.inc:10
+msgid "Download"
+msgstr "Download"
+
+#: templates/log/request.inc:30
+msgid "Ed Script"
+msgstr "Script editare"
+
+#: status.php:19 templates/error_page.inc:4
+msgid "Error"
+msgstr "Eroare"
+
+#: templates/error_page.inc:7
+msgid "Error Encountered"
+msgstr "Eroare produsa"
+
+#: lib/CVSLib/File.php:218
+msgid "Failed to spawn rlog to retrieve file log information"
+msgstr "Imposibil de recuperat informatiile despre fisierul de log"
+
+#: templates/directory/file.inc:8 templates/directory/file.inc:20
+#: templates/directory/header.inc:9
+msgid "File"
+msgstr "Fisier"
+
+#: templates/log/request.inc:44
+msgid "Get Diffs"
+msgstr "Ia Diferente"
+
+#: templates/menu/menu.inc:26
+msgid "Help"
+msgstr "Ajutor"
+
+#: cvs.php:39
+msgid "Hide Deleted Files"
+msgstr "Ascunde fisiere sterse"
+
+#: templates/log/request.inc:26
+msgid "Human Readable"
+msgstr "Normal citibil"
+
+#: lib/CVSLib/Checkout.php:30
+msgid "Invalid revision number"
+msgstr "Numar de revizie invalid"
+
+#: templates/directory/header.inc:23
+msgid "Last Log"
+msgstr "Ultimul log"
+
+#: templates/diff/hr/header.inc:5
+#, php-format
+msgid "Last Log Message for rev %s:"
+msgstr "Ultimul mesaj de log pentru rev %s:"
+
+#: templates/diff/hr/footer.inc:5
+msgid "Legend:"
+msgstr "Legenda:"
+
+#: templates/annotate/header.inc:7
+msgid "Line"
+msgstr "Linie"
+
+#: templates/diff/hr/row.inc:3 templates/diff/hr/row.inc:7
+#, php-format
+msgid "Line %s"
+msgstr "Linia %s"
+
+#: templates/headerbar.inc:26
+msgid "Location:"
+msgstr "Locatie:"
+
+#: config/prefs.php.dist:6
+msgid "Login Tasks"
+msgstr "Actiuni la intrare"
+
+#: status.php:32
+msgid "Message"
+msgstr "Mesaj"
+
+#: templates/diff/hr/nochange.inc:6
+msgid "No Viewable Change"
+msgstr "Nici o schimbare vizibila"
+
+#: lib/CVSLib/File.php:124 lib/CVSLib/File.php:147
+msgid "No revisions"
+msgstr "Nici o revizie"
+
+#: templates/menu/menu.inc:13
+msgid "Options"
+msgstr "Optiuni"
+
+#: config/prefs.php.dist:5
+msgid "Other Options"
+msgstr "Alte optiuni"
+
+#: lib/Chora.php:349
+msgid "Other Repositories"
+msgstr "Alte repozitorii"
+
+#: templates/directory/back.inc:4
+msgid "Parent Directory"
+msgstr "Director parinte"
+
+#: templates/error_page.inc:13
+msgid "Please contact"
+msgstr "Contact"
+
+#: templates/menu/menu.inc:18
+msgid "Problem?"
+msgstr "Problema?"
+
+#: templates/diff/hr/footer.inc:11
+#, php-format
+msgid "Removed in v.%s"
+msgstr "Eliminat in v.%s"
+
+#: templates/log/request.inc:14
+msgid "Retrieve diffs between:"
+msgstr "Aducere diferente intre:"
+
+#: templates/annotate/header.inc:6 templates/directory/header.inc:13
+msgid "Rev"
+msgstr "Rev"
+
+#: templates/log/rev.inc:33
+msgid "Select for Diff"
+msgstr "Selectare pentru diferente"
+
+#: cvs.php:41
+msgid "Show Deleted Files"
+msgstr "Arata fisiere sterse"
+
+#: templates/log/request.inc:29
+msgid "Side-by-Side"
+msgstr "Alaturat"
+
+#: templates/index/notconfigured.inc:13
+msgid "Some of Chora's configuration files are missing:"
+msgstr "Anumite fisiere de configurare Chora lipsesc:"
+
+#: templates/directory/header.inc:8 templates/directory/header.inc:12
+#: templates/directory/header.inc:16 templates/directory/header.inc:20
+msgid "Sort Order"
+msgstr "Ordine sortare"
+
+#: status.php:23
+msgid "Success"
+msgstr "Succes"
+
+#: cvs.php:131
+msgid "Switch to Branch View"
+msgstr "Schimba in vizualizare ramura"
+
+#: history.php:155
+msgid "Switch to Log View"
+msgstr "Schimba in vizualizare log"
+
+#: templates/index/notconfigured.inc:46
+msgid ""
+"This file controls the default preferences for Chora, and also controls "
+"which preferences users can alter."
+msgstr ""
+"Acest fisier controleaza preferintele implicite precum si alte preferinte"
+"pentru Chora."
+
+#: templates/index/notconfigured.inc:39
+msgid ""
+"This file controls the stylesheet that is used to set colors and fonts in "
+"addition to or overriding Horde defaults."
+msgstr ""
+"Acest fisier determina schema pentru culori si fonturi ce vor inlocui setarile "
+"implicite furnizate de Horde."
+
+#: templates/index/notconfigured.inc:25
+msgid ""
+"This file defines all of the cvs repositories that you wish Chora to display."
+msgstr ""
+"Acest fisier defineste toate repozitoriile cvs pe care Chora le va afisa."
+
+#: templates/index/notconfigured.inc:32
+msgid "This file defines any special MIME-type handling for Chora."
+msgstr "Acest fisier defineste tipurile MIME pentru Chora."
+
+#: templates/index/notconfigured.inc:18
+msgid ""
+"This is the main Chora configuration file. It contains paths and options for "
+"all Chora scripts."
+msgstr ""
+"Acesta e fisierul principal de configurare Chora. Contine caile si optiunile "
+"pentru scripturile Chora."
+
+#: prefs.php:86
+msgid "This number must be at least one."
+msgstr "Numarul trebuie sa fie minim 1."
+
+#: prefs.php:84
+msgid "This value must be a number."
+msgstr "Valoarea trebuie sa fie numerica."
+
+#: templates/headerbar.inc:32
+msgid "Tracking Branch"
+msgstr "Ramura de cautare"
+
+#: templates/log/request.inc:23
+msgid "Type:"
+msgstr "Tip:"
+
+#: templates/log/request.inc:27
+msgid "Unified"
+msgstr "Unificat"
+
+#: templates/log/rev.inc:31
+msgid "Unselect"
+msgstr "Deselectat"
+
+#: templates/log/request.inc:18 templates/log/request.inc:38
+msgid "Use Text Field"
+msgstr "Utilzare camp text"
+
+#: config/prefs.php.dist:33
+msgid "Use last viewed file or directory at login time"
+msgstr "Utilizare ultima vizualizare de fisier sau director la intrare"
+
+#: prefs.php:133
+msgid "User Options"
+msgstr "Optiuni utilizator"
+
+#: annotate.php:28 templates/log/rev.inc:9
+msgid "View"
+msgstr "Vizualizare"
+
+#: templates/log/request.inc:60
+msgid "View Branch"
+msgstr "Vizualizeaza Ramura"
+
+#: templates/log/request.inc:54
+msgid "View revisions on:"
+msgstr "Vizualizeaza revizii pe:"
+
+#: status.php:27
+msgid "Warning"
+msgstr "Avertisment"
+
+#: prefs.php:118
+msgid "Your options have been updated."
+msgstr "Optiunile au fost salvate."
+
+#: templates/log/request.inc:35
+msgid "and:"
+msgstr "si:"
+
+#: templates/log/rev.inc:6 templates/history/rev.inc:4
+#, php-format
+msgid "by %s"
+msgstr "de catre %s"
+
+#: templates/diff/hr/footer.inc:15
+msgid "changed lines"
+msgstr "linii schimbate"
+
+#: lib/CVSLib/File.php:292
+msgid "day"
+msgstr "zi"
+
+#: lib/CVSLib/File.php:292
+msgid "days"
+msgstr "zile"
+
+#: templates/error_page.inc:14
+msgid "for further information."
+msgstr "pentru informatii suplimentare."
+
+#: lib/CVSLib/File.php:291
+msgid "hour"
+msgstr "ora"
+
+#: lib/CVSLib/File.php:291
+msgid "hours"
+msgstr "ore"
+
+#: templates/log/rev.inc:39 templates/log/rev.inc:43 templates/log/rev.inc:49
+msgid "long"
+msgstr "lung"
+
+#: lib/CVSLib/File.php:290
+msgid "minute"
+msgstr "minut"
+
+#: lib/CVSLib/File.php:290
+msgid "minutes"
+msgstr "minute"
+
+#: lib/CVSLib/File.php:294
+msgid "month"
+msgstr "luna"
+
+#: lib/CVSLib/File.php:294
+msgid "months"
+msgstr "luni"
+
+#: templates/history/branch_cell.inc:6
+#, php-format
+msgid "revision %s"
+msgstr "revizia %s"
+
+#: lib/CVSLib/File.php:289
+msgid "second"
+msgstr "secunda"
+
+#: lib/CVSLib/File.php:289
+msgid "seconds"
+msgstr "secunde"
+
+#: templates/log/rev.inc:40 templates/log/rev.inc:44 templates/log/rev.inc:50
+msgid "unified"
+msgstr "unificat"
+
+#: templates/diff/hr/header.inc:13 templates/diff/hr/header.inc:14
+#, php-format
+msgid "version %s"
+msgstr "versiune %s"
+
+#: lib/CVSLib/File.php:303
+msgid "very little time"
+msgstr "foarte putin timp"
+
+#: lib/CVSLib/File.php:293
+msgid "week"
+msgstr "saptamana"
+
+#: lib/CVSLib/File.php:293
+msgid "weeks"
+msgstr "saptamani"
+
+#: lib/CVSLib/File.php:295
+msgid "year"
+msgstr "an"
+
+#: lib/CVSLib/File.php:295
+msgid "years"
+msgstr "ani"
--- /dev/null
+# Chora Russian translation.
+# Copyright (C) 2005 Jan Schneider.
+# Illya Belov <belov@iop.irkps.ru>, 2005.
+msgid ""
+msgstr ""
+"Project-Id-Version: Chora 2.1-cvs\n"
+"Report-Msgid-Bugs-To: dev@lists.horde.org\n"
+"POT-Creation-Date: 2005-07-27 02:04+0200\n"
+"PO-Revision-Date: 2005-07-27 02:40+0200\n"
+"Last-Translator: Illya Belov <jan@horde.org>\n"
+"Language-Team: i18n@lists.horde.org\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CP1251\n"
+"Content-Transfer-Encoding: 8-bit\n"
+
+#: templates/annotate/header.inc:4
+msgid "#"
+msgstr "¹"
+
+#: templates/patchsets/ps.inc:12 templates/log/rev.inc:26
+#, php-format
+msgid "%s ago"
+msgstr "vor %s"
+
+#: templates/diff/hr/footer.inc:19
+#, php-format
+msgid "Added in v.%s"
+msgstr "Äîáàâëåíî â v.%s"
+
+#: templates/log/request.inc:57
+msgid "All Branches"
+msgstr "Âñå âåòâè"
+
+#: co.php:72 templates/log/rev.inc:8
+msgid "Annotate"
+msgstr "Àííîòèðîâàòü"
+
+#: templates/directory/header.inc:16 templates/stats/stats.inc:3
+#: templates/annotate/header.inc:5
+msgid "Author"
+msgstr "Àâòîð"
+
+#: templates/directory/back.inc:4
+msgid "Back"
+msgstr "Íàçàä"
+
+#: templates/checkout/checkout.inc:27 templates/log/rev.inc:31
+msgid "Branch Point for:"
+msgstr "Òî÷êà âåòâè äëÿ:"
+
+#: templates/checkout/checkout.inc:11 templates/patchsets/ps.inc:14
+#: templates/log/rev.inc:28
+msgid "Branch:"
+msgstr "Âåòâü:"
+
+#: lib/Chora.php:464
+msgid "Branches"
+msgstr "Âåòâè"
+
+#: templates/history/branch_cell.inc:2
+msgid "Branching to"
+msgstr "Branching nach"
+
+#: templates/checkout/checkout.inc:35 templates/log/rev.inc:37
+#, php-format
+msgid "Changed since <strong>%s</strong>"
+msgstr "Èçìåíåíî <strong>%s</strong>"
+
+#: templates/history/rev.inc:8
+#, php-format
+msgid "Changed: %s"
+msgstr "Èçìåíåíî: %s"
+
+#: co.php:70
+#, php-format
+msgid "Checkout of %s (revision %s)"
+msgstr "Ïðîñìîòð %s (ðåâèçèÿ %s)"
+
+#: templates/cvsgraph/cvsgraph.inc:11
+msgid ""
+"Click on the links in between revisions to get a diff between those "
+"revisions."
+msgstr "Íàæìèòå íà ññûëêó ìåæäó ðåâèçèÿìè äëÿ ïðîñìîòðà ðàçëè÷èé."
+
+#: templates/cvsgraph/cvsgraph.inc:10
+msgid "Click on the revisions and branches to display the file."
+msgstr "Íàæìèòå íà ðåâèçèè è âåòâè äëÿ îòîáðàæåíèÿ ôàéëà"
+
+#: templates/log/rev.inc:42 templates/log/rev.inc:50
+msgid "Colored"
+msgstr "Öâåò"
+
+#: templates/checkout/checkout.inc:19 templates/patchsets/ps.inc:17
+msgid "Commit Tags:"
+msgstr "Commit Tags:"
+
+#: templates/stats/stats.inc:4
+msgid "Commits"
+msgstr "Èçìåíåíèé"
+
+#: templates/log/request.inc:28
+msgid "Context"
+msgstr "Context"
+
+#: config/prefs.php.dist:11
+msgid "Customize tasks to run upon logging in to Chora."
+msgstr "Íàñòðîéêà çàäà÷ äëÿ çàïóñêà logging â Chora."
+
+#: templates/directory/header.inc:21
+msgid "Da_te"
+msgstr "Äàòà"
+
+#: templates/directory/header.inc:21
+msgid "Date"
+msgstr "Äàòà"
+
+#: patchsets.php:66
+msgid "Deleted"
+msgstr "Óäàëåííûå"
+
+#: templates/directory/file.inc:5 templates/directory/file.inc:17
+msgid "Deleted File"
+msgstr "Óäàëåííûå ôàéëû"
+
+#: templates/log/rev.inc:13
+msgid "Deselect"
+msgstr "Îòìåíèòü âûáîð"
+
+#: patchsets.php:63
+msgid "Diff"
+msgstr "Ðàçëè÷èÿ"
+
+#: patchsets.php:46
+msgid "Diff All Files"
+msgstr "Ðàçëè÷èÿ äëÿ âñåõ ôàéëîâ"
+
+#: diff.php:69
+#, php-format
+msgid "Diff for %s between version %s and %s"
+msgstr "Ðàçëè÷èÿ äëÿ %s ìåæäó âåðñèÿìè %s è %s"
+
+#: templates/log/rev.inc:49
+#, php-format
+msgid "Diffs to <strong>%s</strong>"
+msgstr "Ðàçëè÷èÿ äëÿ <strong>%s</strong>"
+
+#: templates/log/rev.inc:41
+#, php-format
+msgid "Diffs to version %s"
+msgstr "Ðàçëè÷èÿ ñ âåðñèåé %s"
+
+#: templates/directory/dir.inc:5 templates/directory/dir.inc:7
+msgid "Directory"
+msgstr "Êàòàëîã"
+
+#: annotate.php:30 co.php:73 templates/log/rev.inc:10
+msgid "Download"
+msgstr "Ñêà÷àòü"
+
+#: templates/log/request.inc:30
+msgid "Ed Script"
+msgstr "Ed Script"
+
+#: templates/error_page.inc:4
+msgid "Error"
+msgstr "Îøèáêà"
+
+#: templates/error_page.inc:7
+msgid "Error Encountered"
+msgstr "Îøèáêè âñòðå÷àþòñÿ"
+
+#: templates/directory/file.inc:7 templates/directory/file.inc:19
+#: templates/directory/header.inc:6
+msgid "File"
+msgstr "Ôàéë"
+
+#: templates/patchsets/ps.inc:21
+msgid "Files Changed:"
+msgstr "Èçìåíåííûå ôàéëû:"
+
+#: templates/log/request.inc:44
+msgid "Get Diffs"
+msgstr "Ïðîñìîòð ðàçëè÷èé"
+
+#: lib/Chora.php:467
+msgid "Graph"
+msgstr "Ãðàôèê"
+
+#: cvsgraph.php:48
+#, php-format
+msgid "Graph for %s"
+msgstr "Ãðàôèê äëÿ %s"
+
+#: browse.php:40
+msgid "Hide Deleted Files"
+msgstr "Ñêðûòü Óäàëåííûå Ôàéëû"
+
+#: browse.php:40
+msgid "Hide _Deleted Files"
+msgstr "Ñêðûòü óäàëåííûå ôàéëû"
+
+#: templates/log/request.inc:26
+msgid "Human Readable"
+msgstr "Human Readable"
+
+#: templates/directory/header.inc:23
+msgid "Last Log"
+msgstr "Ïîñëåäíåå ñîîáùåíèå"
+
+#: templates/diff/hr/header.inc:5
+#, php-format
+msgid "Last Log Message for rev %s:"
+msgstr "Ïîñëåäíåå ñîîáùåíèå äëÿ ðåâèçèè %s:"
+
+#: templates/diff/hr/footer.inc:5
+msgid "Legend:"
+msgstr "Ëåãåíäà:"
+
+#: templates/annotate/header.inc:7
+msgid "Line"
+msgstr "Ëèíèÿ"
+
+#: templates/diff/hr/row.inc:3 templates/diff/hr/row.inc:7
+#, php-format
+msgid "Line %s"
+msgstr "Ëèíèÿ %s"
+
+#: templates/headerbar.inc:11
+msgid "Location:"
+msgstr "Ðàñïîëîæåíèå:"
+
+#: templates/checkout/checkout.inc:42
+msgid "Log:"
+msgstr "Log:"
+
+#: config/prefs.php.dist:10
+msgid "Login Tasks"
+msgstr "Çàäà÷è ïðè âõîäå:"
+
+#: lib/Chora.php:458
+msgid "Logs"
+msgstr "Èñòîðèÿ"
+
+#: templates/log/rev.inc:43 templates/log/rev.inc:51
+msgid "Long"
+msgstr "Äëèííûé"
+
+#: diff.php:61
+msgid "Malformed Query"
+msgstr "Áåçôîðìåííûé çàïðîñ"
+
+#: patchsets.php:59
+msgid "New File"
+msgstr "Íîâûé ôàéë"
+
+#: templates/diff/hr/nochange.inc:6
+msgid "No Viewable Change"
+msgstr "Íåò Âèäèìûõ Èçìåíåíèé"
+
+#: templates/log/rev.inc:44 templates/log/rev.inc:52
+msgid "NoWhitespaceChanges"
+msgstr "NoWhitespaceChanges"
+
+#: config/prefs.php.dist:9
+msgid "Other Options"
+msgstr "Äðóãèå íàñòðîéêè"
+
+#: lib/Chora.php:368
+msgid "Other Repositories"
+msgstr "Äðóãèå ðåïîçèòîðèè"
+
+#: templates/directory/back.inc:4
+msgid "Parent Directory"
+msgstr "Óðîâåíü âûøå"
+
+#: templates/patchsets/ps.inc:6
+#, php-format
+msgid "PatchSet %s</span> by %s"
+msgstr "PatcSet %s</span> îò %s"
+
+#: lib/Chora.php:461
+msgid "Patchsets"
+msgstr "Patchsets"
+
+#: patchsets.php:27
+#, php-format
+msgid "Patchsets for %s"
+msgstr "Patchsets äëÿ %s"
+
+#: templates/error_page.inc:13
+msgid "Please contact"
+msgstr "Ïîæàëóéñòà, ñîîáùèòå"
+
+#: templates/diff/hr/footer.inc:11
+#, php-format
+msgid "Removed in v.%s"
+msgstr "Óäàëåíî â v.%s"
+
+#: templates/log/request.inc:14
+msgid "Retrieve diffs between:"
+msgstr "Íàéäåííûå ðàçëè÷èÿ ìåæäó:"
+
+#: templates/directory/header.inc:11 templates/annotate/header.inc:6
+msgid "Rev"
+msgstr "Ðåâ."
+
+#: co.php:77
+#, php-format
+msgid "Revision %s for file %s not found."
+msgstr "Ðåâèçèÿ %s äëÿ ôàéëà %s íå íàéäåíà."
+
+#: templates/checkout/checkout.inc:4
+#, php-format
+msgid "Revision <strong>%s</strong>, <em>%s</em> (%s ago) by %s"
+msgstr "Ðåâèçèÿ <strong>%s</strong>, <em>%s</em> (%s) îò %s"
+
+#: templates/log/rev.inc:15
+msgid "Select for Diff"
+msgstr "Âûáðàòü äëÿ ðàçëè÷èé"
+
+#: browse.php:42
+msgid "Show Deleted Files"
+msgstr "Ïîêàçàòü óäàëåííûå ôàéëû"
+
+#: browse.php:42
+msgid "Show _Deleted Files"
+msgstr "Ïîêàçàòü óäàëåííûå ôàéëû"
+
+#: templates/log/request.inc:29
+msgid "Side-by-Side"
+msgstr "Ñòðîêà-ê-ñòðîêå"
+
+#: templates/directory/header.inc:5 templates/directory/header.inc:10
+#: templates/directory/header.inc:15 templates/directory/header.inc:20
+msgid "Sort Order"
+msgstr "Ñîðòèðîâêà"
+
+#: annotate.php:27
+#, php-format
+msgid "Source Annotation of %s for version %s"
+msgstr "Àííîòàöèÿ %s äëÿ âåðñèè %s"
+
+#: history.php:160
+#, php-format
+msgid "Source Branching View for %s"
+msgstr "Ïðîñìîòð Èñòîðèè Èçìåíåíèé äëÿ %s"
+
+#: browse.php:32
+#, php-format
+msgid "Source Directory of /%s"
+msgstr "Ïðîñìîòð Äèðåêòîðèè /%s"
+
+#: browse.php:126
+#, php-format
+msgid "Source Log for %s"
+msgstr "Ïðîñìîòð ëîãà äëÿ ôàéëà %s"
+
+#: lib/Chora.php:182
+msgid ""
+"SourceRoot not found! This could be a misconfiguration by the server "
+"administrator, or the server could be having temporary problems. Please try "
+"again later."
+msgstr ""
+"SourceRoot íå íàéäåíà! Âîçìîæíî ýòî íàñòðîéêà ñåðâåðà èëè íà ñåðâåðå "
+"âðåìåííûå ïðîáëåìû. Ïîæàëóéñòà, çàéäèòå ïîçæå."
+
+#: lib/Chora.php:469
+msgid "Statistics"
+msgstr "Ñòàòèñòèêà"
+
+#: stats.php:27
+#, php-format
+msgid "Statistics for %s"
+msgstr "Ñòàòèñòèêà äëÿ %s"
+
+#: templates/log/rev.inc:34
+msgid "Tags:"
+msgstr "Tags:"
+
+#: templates/log/request.inc:5
+msgid ""
+"This form allows you to request diffs between any two revisions of a file. "
+"You may select a symbolic revision name using the selection box or you may "
+"type in a numeric name using the type-in text box."
+msgstr ""
+"Ýòî ôîðìà ïîçâîëÿåò çàïðîñèòü ðàçíèöó ìåæäó äâóìÿ ðåâèçèÿìè ôàéëà. Âû ìîæåòå "
+"âûáðàò ñèìâîëüíîå èìÿ ðåâèçèè èñïîëüçóÿ âûïîäÿþùèé ñïèñîê èëè ââåñòè íîìåð "
+"ðåâèèçèè â ñîîòâåòñâóþùåì ïîëå "
+
+#: templates/headerbar.inc:16
+msgid "Tracking Branch"
+msgstr "Tracking Branch"
+
+#: templates/log/request.inc:23
+msgid "Type:"
+msgstr "Òèï:"
+
+#: templates/log/request.inc:27
+msgid "Unified"
+msgstr "Óíèôèöèðîâàííûé"
+
+#: templates/log/request.inc:18 templates/log/request.inc:38
+msgid "Use Text Field"
+msgstr "Èñïîëüçîâàòü òåêñòîâîå ïîëå:"
+
+#: config/prefs.php.dist:37
+msgid "Use last viewed file or directory at login time"
+msgstr "Èñïîëüçîâàòü ïîñëåäíèé ïðîñìàòðèâàåìûé ôàéë èëè êàòàëîã ïðè âõîäå"
+
+#: annotate.php:29 templates/log/rev.inc:9
+msgid "View"
+msgstr "Ïðîñìîòð"
+
+#: templates/log/request.inc:60
+msgid "View Branch"
+msgstr "Ïðîñìîòð âåòâè"
+
+#: templates/log/request.inc:54
+msgid "View revisions on:"
+msgstr "Ïðîñìîòð ðèâèçèé íà:"
+
+#: lib/Chora.php:471
+msgid "View:"
+msgstr "Ïðîñìîòð:"
+
+#: templates/directory/header.inc:16
+msgid "_Author"
+msgstr "Àâòîð"
+
+#: lib/Chora.php:464
+msgid "_Branches"
+msgstr "Âåòâè"
+
+#: lib/Chora.php:438
+msgid "_Browse"
+msgstr "Ïðîñìîòð"
+
+#: templates/directory/header.inc:6
+msgid "_File"
+msgstr "Ôàéë"
+
+#: lib/Chora.php:467
+msgid "_Graph"
+msgstr "Ãðàôèê"
+
+#: lib/Chora.php:458
+msgid "_Logs"
+msgstr "_Logs"
+
+#: lib/Chora.php:461
+msgid "_Patchsets"
+msgstr "_Patchsets"
+
+#: templates/directory/header.inc:11
+msgid "_Rev"
+msgstr "Ðåâ."
+
+#: lib/Chora.php:469
+msgid "_Statistics"
+msgstr "Ñòàòèñòèêà"
+
+#: templates/log/request.inc:35
+msgid "and:"
+msgstr "è:"
+
+#: templates/history/rev.inc:4 templates/log/rev.inc:5
+#, php-format
+msgid "by %s"
+msgstr "îò %s"
+
+#: templates/diff/hr/footer.inc:15
+msgid "changed lines"
+msgstr "èçìåíåííûå ëèíèè"
+
+#: lib/Chora.php:31
+msgid "day"
+msgstr "äåíü"
+
+#: lib/Chora.php:31
+msgid "days"
+msgstr "äíè"
+
+#: templates/error_page.inc:14
+msgid "for further information."
+msgstr "äëÿ äàëüíåéøå èíôîðìàöèè."
+
+#: lib/Chora.php:30
+msgid "hour"
+msgstr "÷àñ"
+
+#: lib/Chora.php:30
+msgid "hours"
+msgstr "÷àñîâ"
+
+#: lib/Chora.php:29
+msgid "minute"
+msgstr "ìèíóòà"
+
+#: lib/Chora.php:29
+msgid "minutes"
+msgstr "ìèíóò"
+
+#: lib/Chora.php:33
+msgid "month"
+msgstr "ìåñÿö"
+
+#: lib/Chora.php:33
+msgid "months"
+msgstr "ìåñÿöà(îâ)"
+
+#: templates/history/branch_cell.inc:6
+#, php-format
+msgid "revision %s"
+msgstr "ðåâèçèÿ %s"
+
+#: lib/Chora.php:28
+msgid "second"
+msgstr "ñåêóíäà"
+
+#: lib/Chora.php:28
+msgid "seconds"
+msgstr "ñåêóíä"
+
+#: templates/diff/hr/header.inc:13 templates/diff/hr/header.inc:14
+#, php-format
+msgid "version %s"
+msgstr "âåðñèÿ %s"
+
+#: lib/Chora.php:42
+msgid "very little time"
+msgstr "î÷åíü ìàëåíüêîå âðåìÿ"
+
+#: lib/Chora.php:32
+msgid "week"
+msgstr "íåäåëÿ"
+
+#: lib/Chora.php:32
+msgid "weeks"
+msgstr "íåäåëü"
+
+#: lib/Chora.php:34
+msgid "year"
+msgstr "ãîä"
+
+#: lib/Chora.php:34
+msgid "years"
+msgstr "ëåò"
--- /dev/null
+# Slovak translations for horde package
+# Slovenské preklady pre balík horde.
+# Copyright (C) 2004 Horde Project
+# (C) 2004 Ivan Noris <vix@vazka.sk>
+# This file is distributed under the same license as the horde package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Chora 2.0\n"
+"Report-Msgid-Bugs-To: dev@lists.horde.org\n"
+"POT-Creation-Date: 2004-12-11 19:53+0100\n"
+"PO-Revision-Date: 2004-12-11 19:53+0100\n"
+"Last-Translator: Ivan Noris <vix@vazka.sk>\n"
+"Language-Team: Slovak <vix@vazka.sk>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-2\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+
+#: templates/annotate/header.inc:4
+msgid "#"
+msgstr "È."
+
+#: templates/patchsets/ps.inc:12 templates/log/rev.inc:24
+#, php-format
+msgid "%s ago"
+msgstr "pred %s"
+
+#: templates/diff/hr/footer.inc:19
+#, php-format
+msgid "Added in v.%s"
+msgstr "Pridané vo v.%s"
+
+#: templates/log/request.inc:57
+msgid "All Branches"
+msgstr "V¹etky vetvy"
+
+#: co.php:68 templates/log/rev.inc:8
+msgid "Annotate"
+msgstr "Komentova»"
+
+#: templates/directory/header.inc:18 templates/stats/stats.inc:3
+#: templates/annotate/header.inc:5
+msgid "Author"
+msgstr "Autor"
+
+#: templates/directory/back.inc:4
+msgid "Back"
+msgstr "Naspä»"
+
+#: templates/checkout/checkout.inc:27 templates/log/rev.inc:29
+msgid "Branch Point for:"
+msgstr "Vetviaci bod pre:"
+
+#: templates/checkout/checkout.inc:11 templates/patchsets/ps.inc:14
+#: templates/log/rev.inc:26
+msgid "Branch:"
+msgstr "Vetva:"
+
+#: lib/Chora.php:467
+msgid "Branches"
+msgstr "Vetvy"
+
+#: templates/history/branch_cell.inc:2
+msgid "Branching to"
+msgstr "Vetviaci sa do"
+
+#: templates/checkout/checkout.inc:35 templates/log/rev.inc:35
+#, php-format
+msgid "Changed since <b>%s</b>"
+msgstr "Zmenené od <b>%s</b>"
+
+#: templates/history/rev.inc:8
+#, php-format
+msgid "Changed: %s"
+msgstr "Zmenené: %s"
+
+#: co.php:66
+#, php-format
+msgid "Checkout of %s (revision %s)"
+msgstr "Výber %s (revízia %s)"
+
+#: templates/cvsgraph/cvsgraph.inc:11
+msgid ""
+"Click on the links in between revisions to get a diff between those "
+"revisions."
+msgstr "Kliknite na linky medzi revíziami pre zobrazenie rozdielov medzi nimi."
+
+#: templates/cvsgraph/cvsgraph.inc:10
+msgid "Click on the revisions and branches to display the file."
+msgstr "Kliknite na revízie a vetvy pre zobrazenie súboru."
+
+#: templates/log/rev.inc:40 templates/log/rev.inc:49
+msgid "Colored"
+msgstr "Farebné"
+
+#: templates/checkout/checkout.inc:19 templates/patchsets/ps.inc:17
+msgid "Commit Tags:"
+msgstr "Vlo¾ené so znaèkami:"
+
+#: templates/stats/stats.inc:4
+msgid "Commits"
+msgstr "Vlo¾enia do CVS"
+
+#: templates/log/request.inc:28
+msgid "Context"
+msgstr "Kontext"
+
+#: config/prefs.php.dist:11
+msgid "Customize tasks to run upon logging in to Chora."
+msgstr ""
+"Prispôsobenie úloh, ktoré sa spú¹»ajú pri prihlásení do aplikácie Chora."
+
+#: templates/directory/header.inc:23
+msgid "Da_te"
+msgstr "Dá_tum"
+
+#: templates/directory/header.inc:23
+msgid "Date"
+msgstr "Dátum"
+
+#: patchsets.php:66
+msgid "Deleted"
+msgstr "Vymazané"
+
+#: templates/directory/file.inc:6 templates/directory/file.inc:18
+msgid "Deleted File"
+msgstr "Vymazaný súbor"
+
+#: templates/log/rev.inc:13
+msgid "Deselect"
+msgstr "Zru¹i» oznaèenie"
+
+#: patchsets.php:63
+msgid "Diff"
+msgstr "Rozdiely"
+
+#: patchsets.php:46
+msgid "Diff All Files"
+msgstr "Rozdiely medzi v¹etkými súbormi"
+
+#: diff.php:69
+#, php-format
+msgid "Diff for %s between version %s and %s"
+msgstr "Rozdiely pre %s medzi verziami %s a %s"
+
+#: templates/log/rev.inc:48
+#, php-format
+msgid "Diffs to <b>%s</b>"
+msgstr "Rozdiely voèi <b>%s</b>"
+
+#: templates/log/rev.inc:39
+#, php-format
+msgid "Diffs to version %s"
+msgstr "Rozdiely voèi verzii %s"
+
+#: templates/directory/dir.inc:5 templates/directory/dir.inc:7
+msgid "Directory"
+msgstr "Adresár"
+
+#: annotate.php:30 co.php:69 templates/log/rev.inc:10
+msgid "Download"
+msgstr "Stiahnu»"
+
+#: templates/log/request.inc:30
+msgid "Ed Script"
+msgstr "Ed skript"
+
+#: templates/error_page.inc:4
+msgid "Error"
+msgstr "Chyba"
+
+#: templates/error_page.inc:7
+msgid "Error Encountered"
+msgstr "Nastala chyba"
+
+#: templates/directory/file.inc:8 templates/directory/file.inc:20
+#: templates/directory/header.inc:8
+msgid "File"
+msgstr "Súbor"
+
+#: templates/patchsets/ps.inc:21
+msgid "Files Changed:"
+msgstr "Zmenené súbory:"
+
+#: templates/log/request.inc:44
+msgid "Get Diffs"
+msgstr "Získa» rozdiely"
+
+#: lib/Chora.php:470
+msgid "Graph"
+msgstr "Graf"
+
+#: cvsgraph.php:48
+#, php-format
+msgid "Graph for %s"
+msgstr "Graf pre %s"
+
+#: browse.php:40
+msgid "Hide Deleted Files"
+msgstr "Skry» vymazané súbory"
+
+#: browse.php:40
+msgid "Hide _Deleted Files"
+msgstr "Skry» _vymazané súbory"
+
+#: templates/log/request.inc:26
+msgid "Human Readable"
+msgstr "Èitateµné pre èloveka"
+
+#: templates/directory/header.inc:25
+msgid "Last Log"
+msgstr "Posledný záznam"
+
+#: templates/diff/hr/header.inc:5
+#, php-format
+msgid "Last Log Message for rev %s:"
+msgstr "Posledný záznam pre revíziu %s:"
+
+#: templates/diff/hr/footer.inc:5
+msgid "Legend:"
+msgstr "Legenda:"
+
+#: templates/annotate/header.inc:7
+msgid "Line"
+msgstr "Riadok"
+
+#: templates/diff/hr/row.inc:3 templates/diff/hr/row.inc:7
+#, php-format
+msgid "Line %s"
+msgstr "Riadok %s"
+
+#: templates/headerbar.inc:11
+msgid "Location:"
+msgstr "Umiestnenie"
+
+#: templates/checkout/checkout.inc:42
+msgid "Log:"
+msgstr "Záznam:"
+
+#: config/prefs.php.dist:10
+msgid "Login Tasks"
+msgstr "Úlohy pri prihlásení"
+
+#: lib/Chora.php:461
+msgid "Logs"
+msgstr "Záznamy"
+
+#: templates/log/rev.inc:41 templates/log/rev.inc:50
+msgid "Long"
+msgstr "Podrobnosti"
+
+#: diff.php:61
+msgid "Malformed Query"
+msgstr "Chybná po¾iadavka"
+
+#: patchsets.php:59
+msgid "New File"
+msgstr "Nový súbor"
+
+#: templates/diff/hr/nochange.inc:6
+msgid "No Viewable Change"
+msgstr "®iadne zobraziteµné zmeny"
+
+#: templates/log/rev.inc:42 templates/log/rev.inc:51
+msgid "NoWhitespaceChanges"
+msgstr "®iadne zmeny medzier alebo oddeµovacích znakov"
+
+#: config/prefs.php.dist:9
+msgid "Other Options"
+msgstr "Iné nastavenia"
+
+#: lib/Chora.php:369
+msgid "Other Repositories"
+msgstr "Iné úlo¾iská"
+
+#: templates/directory/back.inc:4
+msgid "Parent Directory"
+msgstr "Rodièovský adresár"
+
+#: templates/patchsets/ps.inc:6
+#, php-format
+msgid "PatchSet %s</span> by %s"
+msgstr "PatchSet %s</span> vytvoril(a) %s"
+
+#: lib/Chora.php:464
+msgid "Patchsets"
+msgstr "Patchsets"
+
+#: patchsets.php:27
+#, php-format
+msgid "Patchsets for %s"
+msgstr "Patchsets pre %s"
+
+#: templates/error_page.inc:13
+msgid "Please contact"
+msgstr "Prosím kontaktujte"
+
+#: templates/diff/hr/footer.inc:11
+#, php-format
+msgid "Removed in v.%s"
+msgstr "Odstránené vo verzii %s"
+
+#: templates/log/request.inc:14
+msgid "Retrieve diffs between:"
+msgstr "Získa» rozdiely medzi:"
+
+#: templates/directory/header.inc:13 templates/annotate/header.inc:6
+msgid "Rev"
+msgstr "Rev"
+
+#: co.php:73
+#, php-format
+msgid "Revision %s for file %s not found."
+msgstr "Revízia %s pre súbor %s nebola nájdená."
+
+#: templates/checkout/checkout.inc:4
+#, php-format
+msgid "Revision <b>%s</b>, <i>%s</i> (%s ago) by %s"
+msgstr "Revízia <b>%s</b>, <i>%s</i> (pred %s) vytvorená %s"
+
+#: templates/log/rev.inc:15
+msgid "Select for Diff"
+msgstr "Vyberte pre zobrazenie rozdielov"
+
+#: browse.php:42
+msgid "Show Deleted Files"
+msgstr "Ukáza» vymazané súbory"
+
+#: browse.php:42
+msgid "Show _Deleted Files"
+msgstr "Ukáza» _vymazané súbory"
+
+#: templates/log/request.inc:29
+msgid "Side-by-Side"
+msgstr "Vedµa seba"
+
+#: templates/directory/header.inc:7 templates/directory/header.inc:12
+#: templates/directory/header.inc:17 templates/directory/header.inc:22
+msgid "Sort Order"
+msgstr "Poradie triedenia"
+
+#: annotate.php:27
+#, php-format
+msgid "Source Annotation of %s for version %s"
+msgstr "Komentár k zdroju %s pre verziu %s"
+
+#: history.php:160
+#, php-format
+msgid "Source Branching View for %s"
+msgstr ""
+
+#: browse.php:32
+#, php-format
+msgid "Source Directory of /%s"
+msgstr "Zdrojový adresár /%s"
+
+#: browse.php:126
+#, php-format
+msgid "Source Log for %s"
+msgstr "Zdrojový záznam pre %s"
+
+#: lib/Chora.php:183
+msgid ""
+"SourceRoot not found! This could be a misconfiguration by the server "
+"administrator, or the server could be having temporary problems. Please try "
+"again later."
+msgstr ""
+"SourceRoot nebol nájdený! Toto mô¾e by» spôsobené nesprávnou konfiguráciou, "
+"alebo má server doèasné problémy. Prosím, skúste to znovu neskôr."
+
+#: lib/Chora.php:472
+msgid "Statistics"
+msgstr "©tatistiky"
+
+#: stats.php:27
+#, php-format
+msgid "Statistics for %s"
+msgstr "©tatistiky pre %s"
+
+#: templates/log/rev.inc:32
+msgid "Tags:"
+msgstr "Znaèky:"
+
+#: templates/log/request.inc:5
+msgid ""
+"This form allows you to request diffs between any two revisions of a file. "
+"You may select a symbolic revision name using the selection box or you may "
+"type in a numeric name using the type-in text box."
+msgstr ""
+"Tento formulár Vám umo¾ní zobrazi» rozdiely medzi µubovoµnými dvomi "
+"revíziami súboru. Mô¾ete si vybra» symbolické meno revízie pomocou "
+"výberového políèka, alebo mô¾ete zada» èíslo pomocou textového poµa."
+
+#: templates/headerbar.inc:16
+msgid "Tracking Branch"
+msgstr ""
+
+#: templates/log/request.inc:23
+msgid "Type:"
+msgstr "Typ:"
+
+#: templates/log/request.inc:27
+msgid "Unified"
+msgstr "Unifikované"
+
+#: templates/log/request.inc:18 templates/log/request.inc:38
+msgid "Use Text Field"
+msgstr "Pou¾i» textové pole"
+
+#: config/prefs.php.dist:37
+msgid "Use last viewed file or directory at login time"
+msgstr "Pou¾i» pri prihlásení posledný zobrazený súbor alebo adresár"
+
+#: annotate.php:29 templates/log/rev.inc:9
+msgid "View"
+msgstr "Zobrazi»"
+
+#: templates/log/request.inc:60
+msgid "View Branch"
+msgstr "Zobrazi» vetvu"
+
+#: templates/log/request.inc:54
+msgid "View revisions on:"
+msgstr "Zobrazi» revízie pre:"
+
+#: lib/Chora.php:474
+msgid "View:"
+msgstr "Zobrazi»:"
+
+#: templates/directory/header.inc:18
+msgid "_Author"
+msgstr "_Autor"
+
+#: lib/Chora.php:467
+msgid "_Branches"
+msgstr "_Vetvy"
+
+#: lib/Chora.php:441
+msgid "_Browse"
+msgstr "_Prezera»"
+
+#: templates/directory/header.inc:8
+msgid "_File"
+msgstr "_Súbor"
+
+#: lib/Chora.php:470
+msgid "_Graph"
+msgstr "_Graf"
+
+#: lib/Chora.php:461
+msgid "_Logs"
+msgstr "_Záznamy"
+
+#: lib/Chora.php:464
+msgid "_Patchsets"
+msgstr "_Patchsets"
+
+#: templates/directory/header.inc:13
+msgid "_Rev"
+msgstr "_Rev"
+
+#: lib/Chora.php:472
+msgid "_Statistics"
+msgstr "©tati_stiky"
+
+#: templates/log/request.inc:35
+msgid "and:"
+msgstr "a:"
+
+#: templates/history/rev.inc:4 templates/log/rev.inc:5
+#, php-format
+msgid "by %s"
+msgstr "vytvorená %s"
+
+#: templates/diff/hr/footer.inc:15
+msgid "changed lines"
+msgstr "zmenené riadky"
+
+#: lib/Chora.php:32
+msgid "day"
+msgstr "deò"
+
+#: lib/Chora.php:32
+msgid "days"
+msgstr "dni"
+
+#: templates/error_page.inc:14
+msgid "for further information."
+msgstr "pre ïal¹ie informácie."
+
+#: lib/Chora.php:31
+msgid "hour"
+msgstr "hodina"
+
+#: lib/Chora.php:31
+msgid "hours"
+msgstr "hodín"
+
+#: lib/Chora.php:30
+msgid "minute"
+msgstr "minúta"
+
+#: lib/Chora.php:30
+msgid "minutes"
+msgstr "minút"
+
+#: lib/Chora.php:34
+msgid "month"
+msgstr "mesiac"
+
+#: lib/Chora.php:34
+msgid "months"
+msgstr "mesiacov"
+
+#: templates/history/branch_cell.inc:6
+#, php-format
+msgid "revision %s"
+msgstr "revízia %s"
+
+#: lib/Chora.php:29
+msgid "second"
+msgstr "sekunda"
+
+#: lib/Chora.php:29
+msgid "seconds"
+msgstr "sekúnd"
+
+#: templates/diff/hr/header.inc:13 templates/diff/hr/header.inc:14
+#, php-format
+msgid "version %s"
+msgstr "verzia %s"
+
+#: lib/Chora.php:43
+msgid "very little time"
+msgstr "veµmi krátky èas"
+
+#: lib/Chora.php:33
+msgid "week"
+msgstr "tý¾deò"
+
+#: lib/Chora.php:33
+msgid "weeks"
+msgstr "tý¾dòov"
+
+#: lib/Chora.php:35
+msgid "year"
+msgstr "rok"
+
+#: lib/Chora.php:35
+msgid "years"
+msgstr "rokov"
--- /dev/null
+# Chora Swedish translation
+# Copyright (C) 2002-2005 Andreas Dahlén.
+# Andreas Dahlén <andreas@dahlen.ws>, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Chora 2.0-cvs\n"
+"Report-Msgid-Bugs-To: dev@lists.horde.org\n"
+"POT-Creation-Date: 2005-06-14 22:08+0200\n"
+"PO-Revision-Date: 2005-06-16 13:32+0100\n"
+"Last-Translator: Andreas Dahlén <andreas@dahlen.ws>\n"
+"Language-Team: Swedish <dev@lists.horde.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=iso-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: templates/annotate/header.inc:4
+msgid "#"
+msgstr "#"
+
+#: templates/log/rev.inc:24 templates/patchsets/ps.inc:12
+#, php-format
+msgid "%s ago"
+msgstr "för %s sedan"
+
+#: templates/diff/hr/footer.inc:19
+#, php-format
+msgid "Added in v.%s"
+msgstr "Tillagd i v.%s"
+
+#: templates/log/request.inc:57
+msgid "All Branches"
+msgstr "Alla grenar"
+
+#: co.php:72 templates/log/rev.inc:8
+msgid "Annotate"
+msgstr "Kommentera"
+
+#: templates/directory/header.inc:16 templates/stats/stats.inc:3
+#: templates/annotate/header.inc:5
+msgid "Author"
+msgstr "Författare"
+
+#: templates/directory/back.inc:4
+msgid "Back"
+msgstr "Tillbaka"
+
+#: templates/log/rev.inc:29 templates/checkout/checkout.inc:27
+msgid "Branch Point for:"
+msgstr "Grenpunkt för:"
+
+#: templates/log/rev.inc:26 templates/checkout/checkout.inc:11
+#: templates/patchsets/ps.inc:14
+msgid "Branch:"
+msgstr "Gren:"
+
+#: lib/Chora.php:466
+msgid "Branches"
+msgstr "Grenar"
+
+#: templates/history/branch_cell.inc:2
+msgid "Branching to"
+msgstr "Förgrenar till"
+
+#: templates/log/rev.inc:35 templates/checkout/checkout.inc:35
+#, php-format
+msgid "Changed since <strong>%s</strong>"
+msgstr "Ädrad sedan <strong>%s</strong>"
+
+#: templates/history/rev.inc:8
+#, php-format
+msgid "Changed: %s"
+msgstr "Ändrad: %s"
+
+#: co.php:70
+#, php-format
+msgid "Checkout of %s (revision %s)"
+msgstr "Utcheckning av %s (revision %s)"
+
+#: templates/cvsgraph/cvsgraph.inc:11
+msgid ""
+"Click on the links in between revisions to get a diff between those "
+"revisions."
+msgstr ""
+"Klicka på länken mellan revisioner för att få skillnaden mellan de "
+"revisionerna."
+
+#: templates/cvsgraph/cvsgraph.inc:10
+msgid "Click on the revisions and branches to display the file."
+msgstr "Klicka på revisionen och gren för att visa filen."
+
+#: templates/log/rev.inc:40 templates/log/rev.inc:49
+msgid "Colored"
+msgstr "Färgad"
+
+#: templates/checkout/checkout.inc:19 templates/patchsets/ps.inc:17
+msgid "Commit Tags:"
+msgstr "Insättningsmärken:"
+
+#: templates/stats/stats.inc:4
+msgid "Commits"
+msgstr "Insättningar"
+
+#: templates/log/request.inc:28
+msgid "Context"
+msgstr "Kontext"
+
+#: config/prefs.php.dist:11
+msgid "Customize tasks to run upon logging in to Chora."
+msgstr "Skräddarsy aktiviteter som körs vid inloggning till Chora."
+
+#: templates/directory/header.inc:21
+msgid "Da_te"
+msgstr "Da_tum"
+
+#: templates/directory/header.inc:21
+msgid "Date"
+msgstr "Datum"
+
+#: patchsets.php:66
+msgid "Deleted"
+msgstr "Raderad"
+
+#: templates/directory/file.inc:5 templates/directory/file.inc:17
+msgid "Deleted File"
+msgstr "Raderar fil"
+
+#: templates/log/rev.inc:13
+msgid "Deselect"
+msgstr "Avmarkera"
+
+#: patchsets.php:63
+msgid "Diff"
+msgstr "Jämför"
+
+#: patchsets.php:46
+msgid "Diff All Files"
+msgstr "Jämför alla filer"
+
+#: diff.php:69
+#, php-format
+msgid "Diff for %s between version %s and %s"
+msgstr "Skillnader för %s mellan version %s och %s"
+
+#: templates/log/rev.inc:48
+#, php-format
+msgid "Diffs to <strong>%s</strong>"
+msgstr "Skillnader till <strong>%s</strong>"
+
+#: templates/log/rev.inc:39
+#, php-format
+msgid "Diffs to version %s"
+msgstr "Skillnad mot version %s"
+
+#: templates/directory/dir.inc:5 templates/directory/dir.inc:7
+msgid "Directory"
+msgstr "Katalog"
+
+#: annotate.php:30 co.php:73 templates/log/rev.inc:10
+msgid "Download"
+msgstr "Hämta"
+
+#: templates/log/request.inc:30
+msgid "Ed Script"
+msgstr "Editera script"
+
+#: templates/error_page.inc:4
+msgid "Error"
+msgstr "Fel"
+
+#: templates/error_page.inc:7
+msgid "Error Encountered"
+msgstr "Fel uppstod"
+
+#: templates/directory/file.inc:7 templates/directory/file.inc:19
+#: templates/directory/header.inc:6
+msgid "File"
+msgstr "Fil"
+
+#: templates/patchsets/ps.inc:21
+msgid "Files Changed:"
+msgstr "Ändrade filer:"
+
+#: templates/log/request.inc:44
+msgid "Get Diffs"
+msgstr "Hämta skillnader"
+
+#: lib/Chora.php:469
+msgid "Graph"
+msgstr "Graf"
+
+#: cvsgraph.php:48
+#, php-format
+msgid "Graph for %s"
+msgstr "Graf för %s"
+
+#: browse.php:40
+msgid "Hide Deleted Files"
+msgstr "Göm raderade filer"
+
+#: browse.php:40
+msgid "Hide _Deleted Files"
+msgstr "Göm _raderade filer"
+
+#: templates/log/request.inc:26
+msgid "Human Readable"
+msgstr "Läsbar för människor"
+
+#: templates/directory/header.inc:23
+msgid "Last Log"
+msgstr "Senaste loggmeddelande"
+
+#: templates/diff/hr/header.inc:5
+#, php-format
+msgid "Last Log Message for rev %s:"
+msgstr "Senaste loggmeddelande för revision %s:"
+
+#: templates/diff/hr/footer.inc:5
+msgid "Legend:"
+msgstr "Förklaring:"
+
+#: templates/annotate/header.inc:7
+msgid "Line"
+msgstr "Rad"
+
+#: templates/diff/hr/row.inc:3 templates/diff/hr/row.inc:7
+#, php-format
+msgid "Line %s"
+msgstr "Rad %s"
+
+#: templates/headerbar.inc:11
+msgid "Location:"
+msgstr "Plats:"
+
+#: templates/checkout/checkout.inc:42
+msgid "Log:"
+msgstr "Logg:"
+
+#: config/prefs.php.dist:10
+msgid "Login Tasks"
+msgstr "Loginaktiviteter"
+
+#: lib/Chora.php:460
+msgid "Logs"
+msgstr "Loggar"
+
+#: templates/log/rev.inc:41 templates/log/rev.inc:50
+msgid "Long"
+msgstr "Lång"
+
+#: diff.php:61
+msgid "Malformed Query"
+msgstr "Felaktig fråga"
+
+#: patchsets.php:59
+msgid "New File"
+msgstr "Ny fil"
+
+#: templates/diff/hr/nochange.inc:6
+msgid "No Viewable Change"
+msgstr "Inga synbara skillnader"
+
+#: templates/log/rev.inc:42 templates/log/rev.inc:51
+msgid "NoWhitespaceChanges"
+msgstr "Inga whitespace skillnader"
+
+#: config/prefs.php.dist:9
+msgid "Other Options"
+msgstr "Andra inställningar"
+
+#: lib/Chora.php:368
+msgid "Other Repositories"
+msgstr "Andra förvaringsplatser"
+
+#: templates/directory/back.inc:4
+msgid "Parent Directory"
+msgstr "Ovanstående mapp"
+
+#: templates/patchsets/ps.inc:6
+#, php-format
+msgid "PatchSet %s</span> by %s"
+msgstr "Patchset %s</span> av %s"
+
+#: lib/Chora.php:463
+msgid "Patchsets"
+msgstr "Patchsets"
+
+#: patchsets.php:27
+#, php-format
+msgid "Patchsets for %s"
+msgstr "Patchset för %s"
+
+#: templates/error_page.inc:13
+msgid "Please contact"
+msgstr "Var god kontakta"
+
+#: templates/diff/hr/footer.inc:11
+#, php-format
+msgid "Removed in v.%s"
+msgstr "Borttagen i v.%s"
+
+#: templates/log/request.inc:14
+msgid "Retrieve diffs between:"
+msgstr "Hämta skillnader mellan:"
+
+#: templates/directory/header.inc:11 templates/annotate/header.inc:6
+msgid "Rev"
+msgstr "Rev"
+
+#: co.php:77
+#, php-format
+msgid "Revision %s for file %s not found."
+msgstr "Revision %s för fil %s saknas."
+
+#: templates/checkout/checkout.inc:4
+#, php-format
+msgid "Revision <strong>%s</strong>, <em>%s</em> (%s ago) by %s"
+msgstr "Revision <strong>%s</strong>, <em>%s</em> (sedan %s) av %s"
+
+#: templates/log/rev.inc:15
+msgid "Select for Diff"
+msgstr "Välj för skillnader"
+
+#: browse.php:42
+msgid "Show Deleted Files"
+msgstr "Visa raderade filer"
+
+#: browse.php:42
+msgid "Show _Deleted Files"
+msgstr "Visa _raderade filer"
+
+#: templates/log/request.inc:29
+msgid "Side-by-Side"
+msgstr "Sida vid sida"
+
+#: templates/directory/header.inc:5 templates/directory/header.inc:10
+#: templates/directory/header.inc:15 templates/directory/header.inc:20
+msgid "Sort Order"
+msgstr "Sorteringsordning"
+
+#: annotate.php:27
+#, php-format
+msgid "Source Annotation of %s for version %s"
+msgstr "Källkommentar av %s för version %s"
+
+#: history.php:160
+#, php-format
+msgid "Source Branching View for %s"
+msgstr "Källgrenvy för %s"
+
+#: browse.php:32
+#, php-format
+msgid "Source Directory of /%s"
+msgstr "Källmapp för /%s"
+
+#: browse.php:126
+#, php-format
+msgid "Source Log for %s"
+msgstr "Källogg för %s"
+
+#: lib/Chora.php:182
+msgid ""
+"SourceRoot not found! This could be a misconfiguration by the server "
+"administrator, or the server could be having temporary problems. Please try "
+"again later."
+msgstr ""
+"SourceRoot saknas! Det kan bero på felaktig konfiguration av "
+"serveradministratören eller ett temporärt fel. Var god fösök igen senare."
+
+#: lib/Chora.php:471
+msgid "Statistics"
+msgstr "Statistik"
+
+#: stats.php:27
+#, php-format
+msgid "Statistics for %s"
+msgstr "Statistik för %s"
+
+#: templates/log/rev.inc:32
+msgid "Tags:"
+msgstr "Märken:"
+
+#: templates/log/request.inc:5
+msgid ""
+"This form allows you to request diffs between any two revisions of a file. "
+"You may select a symbolic revision name using the selection box or you may "
+"type in a numeric name using the type-in text box."
+msgstr ""
+" Det här formuläret låter dig ta fram skillnader mellan två revisioner av en "
+"fil. Du kan välja ett symboliskt revisionsnamn mha listan eller ange ett "
+"numeriskt namn via textfältet."
+
+#: templates/headerbar.inc:16
+msgid "Tracking Branch"
+msgstr "Spårar gren"
+
+#: templates/log/request.inc:23
+msgid "Type:"
+msgstr "Typ:"
+
+#: templates/log/request.inc:27
+msgid "Unified"
+msgstr "Enad"
+
+#: templates/log/request.inc:18 templates/log/request.inc:38
+msgid "Use Text Field"
+msgstr "Anväänd textfält"
+
+#: config/prefs.php.dist:37
+msgid "Use last viewed file or directory at login time"
+msgstr "Använd senast visad fil eller mapp vid inloggning"
+
+#: annotate.php:29 templates/log/rev.inc:9
+msgid "View"
+msgstr "Visa"
+
+#: templates/log/request.inc:60
+msgid "View Branch"
+msgstr "Visa gren"
+
+#: templates/log/request.inc:54
+msgid "View revisions on:"
+msgstr "Visa revisioner för:"
+
+#: lib/Chora.php:473
+msgid "View:"
+msgstr "Visa:"
+
+#: templates/directory/header.inc:16
+msgid "_Author"
+msgstr "_Författare"
+
+#: lib/Chora.php:466
+msgid "_Branches"
+msgstr "_Grenar"
+
+#: lib/Chora.php:440
+msgid "_Browse"
+msgstr "_Lista"
+
+#: templates/directory/header.inc:6
+msgid "_File"
+msgstr "_Fil"
+
+#: lib/Chora.php:469
+msgid "_Graph"
+msgstr "_Graf"
+
+#: lib/Chora.php:460
+msgid "_Logs"
+msgstr "_Loggar"
+
+#: lib/Chora.php:463
+msgid "_Patchsets"
+msgstr "_Patchsets"
+
+#: templates/directory/header.inc:11
+msgid "_Rev"
+msgstr "_Rev"
+
+#: lib/Chora.php:471
+msgid "_Statistics"
+msgstr "_Statistik"
+
+#: templates/log/request.inc:35
+msgid "and:"
+msgstr "och:"
+
+#: templates/log/rev.inc:5 templates/history/rev.inc:4
+#, php-format
+msgid "by %s"
+msgstr "vid %s"
+
+#: templates/diff/hr/footer.inc:15
+msgid "changed lines"
+msgstr "ändrade rader"
+
+#: lib/Chora.php:31
+msgid "day"
+msgstr "dag"
+
+#: lib/Chora.php:31
+msgid "days"
+msgstr "dagar"
+
+#: templates/error_page.inc:14
+msgid "for further information."
+msgstr "för ytterligare information."
+
+#: lib/Chora.php:30
+msgid "hour"
+msgstr "timme"
+
+#: lib/Chora.php:30
+msgid "hours"
+msgstr "timmar"
+
+#: lib/Chora.php:29
+msgid "minute"
+msgstr "minut"
+
+#: lib/Chora.php:29
+msgid "minutes"
+msgstr "minuter"
+
+#: lib/Chora.php:33
+msgid "month"
+msgstr "månad"
+
+#: lib/Chora.php:33
+msgid "months"
+msgstr "månader"
+
+#: templates/history/branch_cell.inc:6
+#, php-format
+msgid "revision %s"
+msgstr "revision %s"
+
+#: lib/Chora.php:28
+msgid "second"
+msgstr "sekund"
+
+#: lib/Chora.php:28
+msgid "seconds"
+msgstr "sekunder"
+
+#: templates/diff/hr/header.inc:13 templates/diff/hr/header.inc:14
+#, php-format
+msgid "version %s"
+msgstr "version %s"
+
+#: lib/Chora.php:42
+msgid "very little time"
+msgstr "väldigt lite tid"
+
+#: lib/Chora.php:32
+msgid "week"
+msgstr "vecka"
+
+#: lib/Chora.php:32
+msgid "weeks"
+msgstr "veckor"
+
+#: lib/Chora.php:34
+msgid "year"
+msgstr "år"
+
+#: lib/Chora.php:34
+msgid "years"
+msgstr "år"
--- /dev/null
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR Horde Project
+# This file is distributed under the same license as the PACKAGE package.
+# liaobin <liaobin@jite.net>, 2004.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: chora\n"
+"Report-Msgid-Bugs-To: dev@lists.horde.org\n"
+"POT-Creation-Date: 2004-02-14 13:49+0100\n"
+"PO-Revision-Date: 2003-09-24 20:30+0800\n"
+"Last-Translator: liaobin <liaobin@jite.net>\n"
+"Language-Team: zh_CN <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=gb2312\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: templates/annotate/header.inc:4
+msgid "#"
+msgstr "#"
+
+#: templates/patchsets/ps.inc:12 templates/log/rev.inc:24
+#, php-format
+msgid "%s ago"
+msgstr "%s ÒÔǰ"
+
+#: templates/diff/hr/footer.inc:19
+#, php-format
+msgid "Added in v.%s"
+msgstr "ÒÑÌí¼ÓÔÚv.%s"
+
+#: templates/log/request.inc:57
+msgid "All Branches"
+msgstr "ËùÓзÖÖ§"
+
+#: co.php:60 templates/log/rev.inc:8
+msgid "Annotate"
+msgstr "×¢ÊÍ"
+
+#: templates/directory/header.inc:18 templates/stats/stats.inc:3
+#: templates/annotate/header.inc:5
+msgid "Author"
+msgstr "×÷Õß"
+
+#: templates/directory/back.inc:4
+msgid "Back"
+msgstr "·µ»Ø"
+
+#: templates/checkout/checkout.inc:27 templates/log/rev.inc:29
+msgid "Branch Point for:"
+msgstr "·ÖÖ§µã: "
+
+#: templates/checkout/checkout.inc:11 templates/patchsets/ps.inc:14
+#: templates/log/rev.inc:26
+msgid "Branch:"
+msgstr "·ÖÖ§£º"
+
+#: lib/Chora.php:395
+msgid "Branches"
+msgstr "ËùÓзÖÖ§"
+
+#: templates/history/branch_cell.inc:2
+msgid "Branching to"
+msgstr "·ÖÖ§µ½"
+
+#: cvsgraph.php:48
+#, php-format
+msgid "CVS Graph for %s"
+msgstr "%s µÄCVSͼ"
+
+#: templates/checkout/checkout.inc:19 templates/patchsets/ps.inc:17
+msgid "CVS Tags:"
+msgstr "CVS ±êÇ©£º"
+
+#: templates/checkout/checkout.inc:35 templates/log/rev.inc:35
+#, php-format
+msgid "Changed since <b>%s</b>"
+msgstr "×Ô<b>%s</b>µÄ±ä¸ü"
+
+#: templates/history/rev.inc:8
+#, php-format
+msgid "Changed: %s"
+msgstr "Òѱä¸ü£º%s"
+
+#: co.php:58
+#, php-format
+msgid "Checkout of %s (revision %s)"
+msgstr "%s µÄCVSÈ¡³ö(°æ±¾ %s)"
+
+#: templates/cvsgraph/cvsgraph.inc:11
+msgid ""
+"Click on the links in between revisions to get a diff between those "
+"revisions."
+msgstr "µã»÷°æ±¾Ö®¼äµÄ²é¿´»ñÈ¡°æ±¾¼äµÄ²»Í¬¡£"
+
+#: templates/cvsgraph/cvsgraph.inc:10
+msgid "Click on the revisions and branches to display the file."
+msgstr "µã»÷ÌØ¶¨°æ±¾ºÍ·ÖÖ§ÏÔʾÎļþ¡£"
+
+#: templates/log/rev.inc:40 templates/log/rev.inc:49
+msgid "Colored"
+msgstr "ʹÓÃÑÕÉ«±ê¼Ç"
+
+#: templates/stats/stats.inc:4
+msgid "Commits"
+msgstr "Ìá½»"
+
+#: templates/log/request.inc:28
+msgid "Context"
+msgstr "ÉÏÏÂÎÄ"
+
+#: config/prefs.php.dist:11
+msgid "Customize tasks to run upon logging in to Chora."
+msgstr "¿Í»§»¯ÈÎÎñÒÔ±ãÔڵǼµ½choraºóÔËÐС£"
+
+#: templates/directory/header.inc:23
+msgid "Date"
+msgstr "ÈÕÆÚ"
+
+#: patchsets.php:65
+msgid "Deleted"
+msgstr "ÒÑɾ³ý"
+
+#: templates/directory/file.inc:6 templates/directory/file.inc:18
+msgid "Deleted File"
+msgstr "ÒÑɾ³ýÎļþ"
+
+#: templates/log/rev.inc:13
+msgid "Deselect"
+msgstr "È¡ÏûÑ¡Ôñ"
+
+#: patchsets.php:62
+msgid "Diff"
+msgstr "°æ±¾±È½Ï"
+
+#: patchsets.php:45
+msgid "Diff All Files"
+msgstr "±È½ÏËùÓÐÎļþ"
+
+#: diff.php:68
+#, php-format
+msgid "Diff for %s between version %s and %s"
+msgstr "¶Ô %s ÔÚ°æ±¾ %s ºÍ %s ¼ä±È½Ï"
+
+#: templates/log/rev.inc:48
+#, php-format
+msgid "Diffs to <b>%s</b>"
+msgstr "ͬ<b>%s</b>±È½Ï"
+
+#: templates/log/rev.inc:39
+#, php-format
+msgid "Diffs to version %s"
+msgstr "ͬ°æ±¾ %s µÄ±È½Ï"
+
+#: templates/directory/dir.inc:5 templates/directory/dir.inc:7
+msgid "Directory"
+msgstr "Ŀ¼"
+
+#: annotate.php:29 co.php:61 templates/log/rev.inc:10
+msgid "Download"
+msgstr "ÏÂÔØ"
+
+#: templates/log/request.inc:30
+msgid "Ed Script"
+msgstr "±à¼½Å±¾"
+
+#: templates/error_page.inc:4
+msgid "Error"
+msgstr "´íÎó"
+
+#: templates/error_page.inc:7
+msgid "Error Encountered"
+msgstr "Óöµ½Ò»¸ö´íÎó"
+
+#: templates/directory/file.inc:8 templates/directory/file.inc:20
+#: templates/directory/header.inc:8
+msgid "File"
+msgstr "Îļþ"
+
+#: templates/patchsets/ps.inc:21
+msgid "Files Changed:"
+msgstr "Òѱä¸üµÄÎļþ£º"
+
+#: templates/log/request.inc:44
+msgid "Get Diffs"
+msgstr "»ñÈ¡²»Í¬"
+
+#: lib/Chora.php:398
+msgid "Graph"
+msgstr "°æ±¾Í¼"
+
+#: templates/menu/menu.inc:21
+msgid "Help"
+msgstr "°ïÖú"
+
+#: cvs.php:40
+msgid "Hide Deleted Files"
+msgstr "Òþ²ØÉ¾³ýµÄÎļþ"
+
+#: templates/log/request.inc:26
+msgid "Human Readable"
+msgstr "ÈË¿ÉÔĶÁ"
+
+#: templates/directory/header.inc:25
+msgid "Last Log"
+msgstr "×îºóÈÕÖ¾"
+
+#: templates/diff/hr/header.inc:5
+#, php-format
+msgid "Last Log Message for rev %s:"
+msgstr "°æ±¾ %s µÄ×îºóÈÕÖ¾ÐÅÏ¢£º"
+
+#: templates/diff/hr/footer.inc:5
+msgid "Legend:"
+msgstr "ͼÀý£º"
+
+#: templates/annotate/header.inc:7
+msgid "Line"
+msgstr "ÐÐ"
+
+#: templates/diff/hr/row.inc:3 templates/diff/hr/row.inc:7
+#, php-format
+msgid "Line %s"
+msgstr "ÐÐ %s"
+
+#: templates/headerbar.inc:12
+msgid "Location:"
+msgstr "λÖãº"
+
+#: templates/checkout/checkout.inc:42
+msgid "Log:"
+msgstr "ÈÕÖ¾£º"
+
+#: config/prefs.php.dist:10
+msgid "Login Tasks"
+msgstr "µÇ¼ÈÎÎñ"
+
+#: lib/Chora.php:389
+msgid "Logs"
+msgstr "ÈÕÖ¾"
+
+#: templates/log/rev.inc:41 templates/log/rev.inc:50
+msgid "Long"
+msgstr "³¤¸ñʽ"
+
+#: diff.php:60
+msgid "Malformed Query"
+msgstr "²»ÍêÕûµÄ²éѯ"
+
+#: patchsets.php:58
+msgid "New File"
+msgstr "ÎļþÎļþ"
+
+#: templates/diff/hr/nochange.inc:6
+msgid "No Viewable Change"
+msgstr "ûÓпÉÒԲ鿴µÄ¸ü¸Ä"
+
+#: templates/log/rev.inc:42 templates/log/rev.inc:51
+msgid "NoWhitespaceChanges"
+msgstr "ûÓпոñµÄ¸ü¸Ä"
+
+#: templates/menu/menu.inc:13
+msgid "Options"
+msgstr "Ñ¡Ïî"
+
+#: config/prefs.php.dist:9
+msgid "Other Options"
+msgstr "ÆäËûÑ¡Ïî"
+
+#: lib/Chora.php:304
+msgid "Other Repositories"
+msgstr "ÆäËû²Ö¿â"
+
+#: templates/directory/back.inc:4
+msgid "Parent Directory"
+msgstr "Éϼ¶Ä¿Â¼"
+
+#: templates/patchsets/ps.inc:6
+#, php-format
+msgid "PatchSet %s</span> by %s"
+msgstr "²¹¶¡%s</span>ÓÉ%s²úÉú"
+
+#: lib/Chora.php:392
+msgid "Patchsets"
+msgstr "²¹¶¡"
+
+#: patchsets.php:26
+#, php-format
+msgid "Patchsets for %s"
+msgstr "%sµÄ²¹¶¡"
+
+#: templates/error_page.inc:13
+msgid "Please contact"
+msgstr "ÇëÁªÏµ"
+
+#: templates/diff/hr/footer.inc:11
+#, php-format
+msgid "Removed in v.%s"
+msgstr "ɾ³ýÔÚ v.%s"
+
+#: templates/log/request.inc:14
+msgid "Retrieve diffs between:"
+msgstr "ÔÚ°æ±¾Ö®¼ä»Ö¸´²î±ð£º"
+
+#: templates/directory/header.inc:13 templates/annotate/header.inc:6
+msgid "Rev"
+msgstr "°æ±¾"
+
+#: co.php:65
+#, php-format
+msgid "Revision %s for file %s not found."
+msgstr "°æ±¾%s(Îļþ%s)ûÓÐÕÒµ½¡£"
+
+#: templates/checkout/checkout.inc:4
+#, php-format
+msgid "Revision <b>%s</b>, <i>%s</i> (%s ago) by %s"
+msgstr "°æ±¾ <b>%s</b>, <i>%s</i> (%s ÒÔǰ) ±» %s ²úÉú"
+
+#: templates/log/rev.inc:15
+msgid "Select for Diff"
+msgstr "Ñ¡Ôñºó²ì¿´¸ü¸Ä"
+
+#: cvs.php:42
+msgid "Show Deleted Files"
+msgstr "ÏÔʾÒѾɾ³ýµÄÎļþ"
+
+#: templates/log/request.inc:29
+msgid "Side-by-Side"
+msgstr "²¢¼çÏÔʾ"
+
+#: templates/directory/header.inc:7 templates/directory/header.inc:12
+#: templates/directory/header.inc:17 templates/directory/header.inc:22
+msgid "Sort Order"
+msgstr "ÅÅÐò˳Ðò"
+
+#: annotate.php:26
+#, php-format
+msgid "Source Annotation of %s for version %s"
+msgstr "%s µÄ×¢ÊÍ(°æ±¾ %s)"
+
+#: history.php:159
+#, php-format
+msgid "Source Branching View for %s"
+msgstr "%s µÄ°æ±¾·Ö֧ͼ"
+
+#: cvs.php:32
+#, php-format
+msgid "Source Directory of /%s"
+msgstr "/%s µÄĿ¼"
+
+#: cvs.php:125
+#, php-format
+msgid "Source Log for %s"
+msgstr "%s µÄÈÕÖ¾"
+
+#: lib/Chora.php:125
+msgid ""
+"SourceRoot not found! This could be a misconfiguration by the server "
+"administrator, or the server could be having temporary problems. Please try "
+"again later."
+msgstr ""
+"Ô´¸ùĿ¼ûÓÐÕÒµ½£¡Õâ¿ÉÄÜÊÇ·þÎñÆ÷¹ÜÀíÔ±µÄ´íÎóÅäÖûò·þÎñÆ÷ÁãʱÎÊÌâÔì³ÉµÄ¡£ÇëÉÔ"
+"ºòÔÙÊÔ¡£"
+
+#: lib/Chora.php:400
+msgid "Statistics"
+msgstr "ͳ¼Æ"
+
+#: stats.php:26
+#, php-format
+msgid "Statistics for %s"
+msgstr "Ϊ%sͳ¼Æ"
+
+#: templates/log/rev.inc:32
+msgid "Tags:"
+msgstr "±êÇ©£º"
+
+#: templates/log/request.inc:5
+msgid ""
+"This form allows you to request diffs between any two revisions of a file. "
+"You may select a symbolic revision name using the selection box or you may "
+"type in a numeric name using the type-in text box."
+msgstr ""
+"Õâ¸ö±í¸ñÔÊÐíÄú²éѯһ¸öÎļþµÄ²»Í¬°æ±¾Ö®¼äµÄ²îÒì¡£Äú¿ÉÒÔʹÓÃÑ¡Ôñ¿òÑ¡ÔñÒ»¸ö°æ±¾"
+"Ãû³Æ»òÄú¿ÉÒÔÔÚÎı¾¿òÖÐÊäÈëÒ»¸ö°æ±¾ºÅ¡£"
+
+#: templates/headerbar.inc:17
+msgid "Tracking Branch"
+msgstr "¸ú×Ù·ÖÖ§"
+
+#: templates/log/request.inc:23
+msgid "Type:"
+msgstr "ÀàÐÍ£º"
+
+#: templates/log/request.inc:27
+msgid "Unified"
+msgstr "ͳһµÄ"
+
+#: templates/log/request.inc:18 templates/log/request.inc:38
+msgid "Use Text Field"
+msgstr "ʹÓÃÎı¾Óò"
+
+#: config/prefs.php.dist:37
+msgid "Use last viewed file or directory at login time"
+msgstr "ÔڵǼºóʹÓÃ×îºó²é¿´µÄÎļþ»òĿ¼"
+
+#: prefs.php:24
+msgid "User Options"
+msgstr "Óû§Ñ¡Ïî"
+
+#: annotate.php:28 templates/log/rev.inc:9
+msgid "View"
+msgstr "²ì¿´"
+
+#: templates/log/request.inc:60
+msgid "View Branch"
+msgstr "²ì¿´·ÖÖ§"
+
+#: templates/log/request.inc:54
+msgid "View revisions on:"
+msgstr "²ì¿´°æ±¾ÔÚ£º"
+
+#: lib/Chora.php:402
+msgid "View:"
+msgstr "²ì¿´:"
+
+#: templates/log/request.inc:35
+msgid "and:"
+msgstr "ºÍ£º"
+
+#: templates/history/rev.inc:4 templates/log/rev.inc:5
+#, php-format
+msgid "by %s"
+msgstr "ÓÉ %s"
+
+#: templates/diff/hr/footer.inc:15
+msgid "changed lines"
+msgstr "¸ü¸ÄµÄÐÐÊý"
+
+#: templates/error_page.inc:14
+msgid "for further information."
+msgstr "ΪδÀ´ÐÅÏ¢¡£"
+
+#: templates/history/branch_cell.inc:6
+#, php-format
+msgid "revision %s"
+msgstr "°æ±¾ %s"
+
+#: templates/diff/hr/header.inc:13 templates/diff/hr/header.inc:14
+#, php-format
+msgid "version %s"
+msgstr "°æ±¾ %s"
--- /dev/null
+# Chora Chinese Translation
+# Copyright (C) 2003. Lin Zhemin.
+# This file is distributed under the same license as the PACKAGE package.
+# Lin Zhemin <ljm@ljm.idv.tw> 2003
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Chora 1.2\n"
+"POT-Creation-Date: 2003-01-03 14:30+0100\n"
+"PO-Revision-Date: 2003-01-24 11:25+0100\n"
+"Last-Translator: Lin Zhemin <ljm@ljm.idv.tw>\n"
+"Language-Team: Greenworld Chinese <ljm@sunup.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=Big5\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: templates/log/request.inc:5
+msgid ""
+" This form allows you to request diffs between any two revisions of a file. "
+"You may select a symbolic revision name using the selection box or you may "
+"type in a numeric name using the type-in text box."
+msgstr ""
+"§A¥i¥H¦b¥»ªí³æ¿ï¾Ü¥ô·N¨âÓª©¥»¡A²£¥Í¥¦Ìªº diff ÀÉ. ½Ð¦b¿ï³æ¤¤¿ï¾Ü symbolic "
+"ª©¥»©Î¦b¤å¦r®Ø¸Ì¿é¤Jª©¥»¼Æ¦r. "
+
+#: templates/annotate/header.inc:4
+msgid "#"
+msgstr "#"
+
+#: templates/log/rev.inc:14
+#, php-format
+msgid "%s ago"
+msgstr "%s ¥H«e"
+
+#: templates/diff/hr/footer.inc:19
+#, php-format
+msgid "Added in v.%s"
+msgstr "¦b v.%s ·s¼W"
+
+#: templates/log/request.inc:57
+msgid "All Branches"
+msgstr "¨CÓ¤ÀªK"
+
+#: prefs.php:77
+msgid "An illegal value was specified."
+msgstr "§A«ü©w¤F¿ù»~ªºÈ."
+
+#: co.php:65 templates/log/rev.inc:8
+msgid "Annotate"
+msgstr "¥[µù"
+
+#: templates/annotate/header.inc:5 templates/directory/header.inc:17
+msgid "Author"
+msgstr "§@ªÌ"
+
+#: templates/directory/back.inc:4
+msgid "Back"
+msgstr ""
+
+#: templates/log/rev.inc:23
+msgid "Branch Point for:"
+msgstr ""
+
+#: templates/log/rev.inc:16
+msgid "Branch:"
+msgstr "¤ÀªK:"
+
+#: templates/history/branch_cell.inc:2
+msgid "Branching to"
+msgstr ""
+
+#: annotate.php:26
+#, php-format
+msgid "CVS Annotation of %s for version %s"
+msgstr "CVS µù¸Ñ - %s v.%s"
+
+#: history.php:153
+#, php-format
+msgid "CVS Branching View for %s"
+msgstr "CVS ¤ÀªK°O¿ý - %s"
+
+#: co.php:63
+#, php-format
+msgid "CVS Checkout of %s (revision %s)"
+msgstr "¬d¬Ý CVS ÀÉ - %s (%s ª©)"
+
+#: cvs.php:35
+#, php-format
+msgid "CVS Directory of /%s"
+msgstr "CVS ¥Ø¿ý /%s"
+
+#: cvs.php:123
+#, php-format
+msgid "CVS Log for %s"
+msgstr "CVS °O¿ý - %s"
+
+#: templates/log/rev.inc:19
+msgid "CVS Tags:"
+msgstr "CVS ¼Ð°O:"
+
+#: templates/log/rev.inc:27
+#, php-format
+msgid "Changed since <b>%s</b>"
+msgstr "¬Û¹ï©ó <b>v.%s</b> §ó°Ê¤F"
+
+#: templates/history/rev.inc:8
+#, php-format
+msgid "Changed: %s"
+msgstr "§ó°Ê¦æ¼Æ %s"
+
+#: templates/headerbar.inc:11
+msgid "Chora Homepage"
+msgstr "Chora º¶"
+
+#: templates/index/notconfigured.inc:4
+msgid "Chora is not properly configured"
+msgstr "Chora ¨S¦³³]©w¦n"
+
+#: templates/log/request.inc:28
+msgid "Context"
+msgstr "¥]¬A¤W¤U¼Æ¦æ"
+
+#: lib/CVSLib/Checkout.php:43
+msgid "Couldn't perform checkout of the requested file"
+msgstr "¤£¯à checkout ÀÉ®×"
+
+#: config/prefs.php.dist:7
+msgid "Customize tasks to run upon logging in to Chora."
+msgstr "µn¤J Chora «án°õ¦æªº¤u§@"
+
+#: templates/directory/header.inc:21
+msgid "Date"
+msgstr "®É¶¡"
+
+#: templates/directory/file.inc:6 templates/directory/file.inc:18
+msgid "Deleted File"
+msgstr "Àɮפw§R°£"
+
+#: diff.php:66
+#, php-format
+msgid "Diff for %s between version %s and %s"
+msgstr "Diff ÀÉ - %s v.%s ©M v.%s ªº®t²§"
+
+#: templates/log/rev.inc:42
+#, php-format
+msgid "Diffs ignoring whitespace to version %s"
+msgstr "¹ï v.%s ªº diff(©¿²¤ªÅ¥Õ)"
+
+#: templates/log/rev.inc:48
+#, php-format
+msgid "Diffs to selected version %s"
+msgstr "¹ï©Ò¿ïªº v.%s ªº diff"
+
+#: templates/log/rev.inc:38
+#, php-format
+msgid "Diffs to version %s"
+msgstr "¹ï v.%s ªº diff"
+
+#: templates/directory/dir.inc:5 templates/directory/dir.inc:7
+msgid "Directory"
+msgstr "¥Ø¿ý"
+
+#: annotate.php:29 co.php:66 templates/log/rev.inc:10
+msgid "Download"
+msgstr "¤U¸ü"
+
+#: templates/log/request.inc:30
+msgid "Ed Script"
+msgstr "Ed ¸}¥»"
+
+#: status.php:19 templates/error_page.inc:4
+msgid "Error"
+msgstr "¿ù»~"
+
+#: templates/error_page.inc:7
+msgid "Error Encountered"
+msgstr "¹J¨ì¤F¿ù»~"
+
+#: lib/CVSLib/File.php:218
+msgid "Failed to spawn rlog to retrieve file log information"
+msgstr "µLªk°õ¦æ rlog ¨ú¦^ÀÉ®×°O¿ý"
+
+#: templates/directory/file.inc:8 templates/directory/file.inc:20
+#: templates/directory/header.inc:9
+msgid "File"
+msgstr "ÀÉ®×"
+
+#: templates/log/request.inc:44
+msgid "Get Diffs"
+msgstr "¨ú¦^ diff ÀÉ"
+
+#: templates/menu/menu.inc:26
+msgid "Help"
+msgstr "¨D§U"
+
+#: cvs.php:39
+msgid "Hide Deleted Files"
+msgstr "ÁôÂçR°£ªºÀÉ®×"
+
+#: templates/log/request.inc:26
+msgid "Human Readable"
+msgstr "¤H¬Ý±oÀ´ªº®æ¦¡"
+
+#: lib/CVSLib/Checkout.php:30
+msgid "Invalid revision number"
+msgstr "ª©¥»¸¹½X¤£¹ï"
+
+#: templates/directory/header.inc:23
+msgid "Last Log"
+msgstr "³Ì«á¤@¦¸°O¿ý"
+
+#: templates/diff/hr/header.inc:5
+#, php-format
+msgid "Last Log Message for rev %s:"
+msgstr "v.%s ªº³Ì«á«H®§:"
+
+#: templates/diff/hr/footer.inc:5
+msgid "Legend:"
+msgstr "¹Ï¨Ò:"
+
+#: templates/annotate/header.inc:7
+msgid "Line"
+msgstr "¦æ"
+
+#: templates/diff/hr/row.inc:3 templates/diff/hr/row.inc:7
+#, php-format
+msgid "Line %s"
+msgstr "²Ä %s ¦æ"
+
+#: templates/headerbar.inc:26
+msgid "Location:"
+msgstr "¦ì¸m:"
+
+#: config/prefs.php.dist:6
+msgid "Login Tasks"
+msgstr "µn¤J¤u§@"
+
+#: status.php:32
+msgid "Message"
+msgstr "«H®§"
+
+#: templates/diff/hr/nochange.inc:6
+msgid "No Viewable Change"
+msgstr "¨S¦³¥iÂsÄýªº§ó°Ê"
+
+#: lib/CVSLib/File.php:124 lib/CVSLib/File.php:147
+msgid "No revisions"
+msgstr "¨S¦³ª©¥»"
+
+#: templates/menu/menu.inc:13
+msgid "Options"
+msgstr "¿ï¶µ"
+
+#: config/prefs.php.dist:5
+msgid "Other Options"
+msgstr "¨ä¥L¿ï¶µ"
+
+#: lib/Chora.php:349
+msgid "Other Repositories"
+msgstr "¨ä¥L¥Ø¿ý"
+
+#: templates/directory/back.inc:4
+msgid "Parent Directory"
+msgstr "¤W¼h¥Ø¿ý"
+
+#: templates/error_page.inc:13
+msgid "Please contact"
+msgstr "½Ð³sµ¸"
+
+#: templates/menu/menu.inc:18
+msgid "Problem?"
+msgstr "¦³°ÝÃD¶Ü?"
+
+#: templates/diff/hr/footer.inc:11
+#, php-format
+msgid "Removed in v.%s"
+msgstr "±q v.%s §R°£"
+
+#: templates/log/request.inc:14
+msgid "Retrieve diffs between:"
+msgstr "²£¥Í³oª©:"
+
+#: templates/annotate/header.inc:6 templates/directory/header.inc:13
+msgid "Rev"
+msgstr "ª©¥»"
+
+#: templates/log/rev.inc:33
+msgid "Select for Diff"
+msgstr "¿ï¾Ü°µdiffÀÉ"
+
+#: cvs.php:41
+msgid "Show Deleted Files"
+msgstr "Åã¥Ü§R°£ªºÀÉ®×"
+
+#: templates/log/request.inc:29
+msgid "Side-by-Side"
+msgstr "¨âÃä¤À¦C"
+
+#: templates/index/notconfigured.inc:13
+msgid "Some of Chora's configuration files are missing:"
+msgstr "³o¨Ç Chora ³]©wÀɤ£¨£¤F:"
+
+#: templates/directory/header.inc:8 templates/directory/header.inc:12
+#: templates/directory/header.inc:16 templates/directory/header.inc:20
+msgid "Sort Order"
+msgstr "±Æ§Ç"
+
+#: status.php:23
+msgid "Success"
+msgstr "¦n¤F"
+
+#: cvs.php:131
+msgid "Switch to Branch View"
+msgstr "¤Á¨ì¤ÀªK°O¿ý"
+
+#: history.php:155
+msgid "Switch to Log View"
+msgstr "¤Á¨ìª©¥»°O¿ý"
+
+#: templates/index/notconfigured.inc:46
+msgid ""
+"This file controls the default preferences for Chora, and also controls "
+"which preferences users can alter."
+msgstr ""
+
+#: templates/index/notconfigured.inc:39
+msgid ""
+"This file controls the stylesheet that is used to set colors and fonts in "
+"addition to or overriding Horde defaults."
+msgstr ""
+
+#: templates/index/notconfigured.inc:25
+msgid ""
+"This file defines all of the cvs repositories that you wish Chora to display."
+msgstr ""
+
+#: templates/index/notconfigured.inc:32
+msgid "This file defines any special MIME-type handling for Chora."
+msgstr ""
+
+#: templates/index/notconfigured.inc:18
+msgid ""
+"This is the main Chora configuration file. It contains paths and options for "
+"all Chora scripts."
+msgstr ""
+
+#: prefs.php:86
+msgid "This number must be at least one."
+msgstr "³oӼƦrn¤j©óµ¥©ó 1."
+
+#: prefs.php:84
+msgid "This value must be a number."
+msgstr "½Ð¶ñ¤J¼Æ¦r."
+
+#: templates/headerbar.inc:32
+msgid "Tracking Branch"
+msgstr ""
+
+#: templates/log/request.inc:23
+msgid "Type:"
+msgstr "®æ¦¡:"
+
+#: templates/log/request.inc:27
+msgid "Unified"
+msgstr "²Î¤@®æ¦¡"
+
+#: templates/log/rev.inc:31
+msgid "Unselect"
+msgstr "¨ú®ø¿ï¾Ü"
+
+#: templates/log/request.inc:18 templates/log/request.inc:38
+msgid "Use Text Field"
+msgstr "½Ð¿ï¾Ü©Î¦b¥kÃä¿é¤J"
+
+#: config/prefs.php.dist:33
+msgid "Use last viewed file or directory at login time"
+msgstr "µn¤J®Éª½±µÂsÄý¤W¦¸¬Ý¹LªºÀɮשΥؿý"
+
+#: prefs.php:133
+msgid "User Options"
+msgstr "¿ï¶µ"
+
+#: annotate.php:28 templates/log/rev.inc:9
+msgid "View"
+msgstr "¬d¬Ý"
+
+#: templates/log/request.inc:60
+msgid "View Branch"
+msgstr "ÂsÄý¤ÀªK°O¿ý"
+
+#: templates/log/request.inc:54
+msgid "View revisions on:"
+msgstr "ÂsÄýª©¥»°O¿ý:"
+
+#: status.php:27
+msgid "Warning"
+msgstr "ĵ§i"
+
+#: prefs.php:118
+msgid "Your options have been updated."
+msgstr "¿ï¶µ§ó·s¦n¤F."
+
+#: templates/log/request.inc:35
+msgid "and:"
+msgstr "©M³oª©ªº diff ÀÉ:"
+
+#: templates/log/rev.inc:6 templates/history/rev.inc:4
+#, php-format
+msgid "by %s"
+msgstr "§@ªÌ %s"
+
+#: templates/diff/hr/footer.inc:15
+msgid "changed lines"
+msgstr "§ó°Ê"
+
+#: lib/CVSLib/File.php:292
+msgid "day"
+msgstr "¤Ñ"
+
+#: lib/CVSLib/File.php:292
+msgid "days"
+msgstr "¤Ñ"
+
+#: templates/error_page.inc:14
+msgid "for further information."
+msgstr "¥HÀò±o¶i¤@¨Bªº«H®§."
+
+#: lib/CVSLib/File.php:291
+msgid "hour"
+msgstr "¤p®É"
+
+#: lib/CVSLib/File.php:291
+msgid "hours"
+msgstr "¤p®É"
+
+#: templates/log/rev.inc:39 templates/log/rev.inc:43 templates/log/rev.inc:49
+msgid "long"
+msgstr "ªø®æ¦¡"
+
+#: lib/CVSLib/File.php:290
+msgid "minute"
+msgstr "¤À"
+
+#: lib/CVSLib/File.php:290
+msgid "minutes"
+msgstr "¤À"
+
+#: lib/CVSLib/File.php:294
+msgid "month"
+msgstr "Ó¤ë"
+
+#: lib/CVSLib/File.php:294
+msgid "months"
+msgstr "Ó¤ë"
+
+#: templates/history/branch_cell.inc:6
+#, php-format
+msgid "revision %s"
+msgstr "ª©¥» %s"
+
+#: lib/CVSLib/File.php:289
+msgid "second"
+msgstr "’"
+
+#: lib/CVSLib/File.php:289
+msgid "seconds"
+msgstr "’"
+
+#: templates/log/rev.inc:40 templates/log/rev.inc:44 templates/log/rev.inc:50
+msgid "unified"
+msgstr "²Î¤@®æ¦¡"
+
+#: templates/diff/hr/header.inc:13 templates/diff/hr/header.inc:14
+#, php-format
+msgid "version %s"
+msgstr "%s ª©"
+
+#: lib/CVSLib/File.php:303
+msgid "very little time"
+msgstr "¤£¤["
+
+#: lib/CVSLib/File.php:293
+msgid "week"
+msgstr "¶g"
+
+#: lib/CVSLib/File.php:293
+msgid "weeks"
+msgstr "¶g"
+
+#: lib/CVSLib/File.php:295
+msgid "year"
+msgstr "¦~"
+
+#: lib/CVSLib/File.php:295
+msgid "years"
+msgstr "¦~"
--- /dev/null
+<?php
+/**
+ * Copyright 2000-2008 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (GPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
+ *
+ * @author Anil Madhavapeddy <avsm@horde.org>
+ * @package Chora
+ */
+
+require_once dirname(__FILE__) . '/lib/base.php';
+
+$fl = &$VC->getFileObject($where, $cache);
+Chora::checkError($fl);
+
+$extraLink = Chora::getFileViews();
+
+$author_stats = array();
+foreach ($fl->logs as $lg) {
+ @$author_stats[$lg->queryAuthor()]++;
+}
+arsort($author_stats);
+
+$title = sprintf(_("Statistics for %s"), Text::htmlallspaces($where));
+Horde::addScriptFile('prototype.js', 'horde', true);
+Horde::addScriptFile('tables.js', 'horde', true);
+require CHORA_TEMPLATES . '/common-header.inc';
+require CHORA_TEMPLATES . '/menu.inc';
+require CHORA_TEMPLATES . '/headerbar.inc';
+require CHORA_TEMPLATES . '/stats/stats.inc';
+require $registry->get('templates', 'horde') . '/common-footer.inc';
--- /dev/null
+Deny from all
--- /dev/null
+</tbody>
+</table>
+<script type="text/javascript">
+//<![CDATA[
+function setRevisionLogTitles()
+{
+ var revisionLogMap = [];
+ <?php
+ foreach ($revList as $lg) {
+ // The code below attempts to account for the following:
+ // 1) log text with line breaks.
+ // 2) log text with inline HTML.
+ $logmsg = Text_Filter::filter($lg->log, 'text2html', array('parselevel' => TEXT_HTML_NOHTML, 'charset' => NLS::getCharset(), 'class' => ''));
+
+ // The above function converts newlines to HTML, and we don't
+ // want to escape those. Since the entire text is enclosed in
+ // single-quotes in JavaScipt, it should suffice to simply
+ // escape those. Everything else is already escaped.
+ $logmsg = str_replace('</', '<\/',
+ '<strong>' . $lg->rev . '</strong> ' .
+ '<' . Chora::showAuthorName($lg->queryAuthor(), true) . '> ' .
+ '<strong>' . sprintf(_("%s ago"), Chora::readableTime($lg->date, true)) . '</strong>' .
+ '<br />' .
+ str_replace(array("'", "\n"), array(''', '\n'), $logmsg));
+ echo "revisionLogMap['" . $lg->rev . "'] = '$logmsg';\n";
+ }
+ ?>
+
+ var links = document.getElementsByTagName('A');
+ for (var i = 0; i < links.length; ++i) {
+ var rx = RegExp('^p?rev_([0-9.]+)_\\d+$').exec(links[i].id);
+ if (!rx) {
+ continue;
+ }
+ links[i].setAttribute('title', revisionLogMap[rx[1]]);
+ }
+
+ ToolTips.attachBehavior();
+}
+addEvent(window, 'load', setRevisionLogTitles);
+//]]>
+</script>
--- /dev/null
+<table width="100%" cellspacing="0" class="annotate">
+<thead>
+ <tr>
+ <th class="rightAlign"><?php echo _("#") ?></th>
+ <th><?php echo _("Author") ?></th>
+ <th><?php echo _("Rev") ?></th>
+ <th><?php echo _("Prev") ?></th>
+ <th><?php echo _("Line") ?></th>
+ </tr>
+</thead>
+<tbody>
--- /dev/null
+ <tr id="l<?php echo $lineno ?>">
+ <td class="rightAlign"><?php echo $lineno ?></td>
+ <td class="author"><?php echo $author ?></td>
+ <td class="rev"><a id="rev_<?php echo $rev . '_' . $i ?>" href="<?php echo Chora::url('co', $where, array('r' => $rev)) ?>"><?php echo $rev ?></a></td>
+ <td class="rev"><?php if ($prev): ?><a id="prev_<?php echo $prev . '_' . $i ?>" href="<?php echo Chora::url('annotate', $where, array('rev' => $prev)) . '#l' . $lineno ?>"><?php echo $prev ?></a><?php else: ?> <?php endif; ?></td>
+ <td class="item<?php echo $style ?>"><tt><?php echo (trim($line) != '') ? $line : ' ' ?></tt></td>
+ </tr>
--- /dev/null
+<h3 class="revision_log"><?php echo _("Log Message") ?></h3>
+<div class="revision_log">
+ <ul class="revision striped">
+ <?php if ($author): ?><li><?php echo _("Author:") ?> <?php echo $author ?></li><?php endif; ?>
+ <?php if ($branchName): ?><li><?php echo _("Branch:") ?> <strong><a href="<?php echo Chora::url('', $where, array('onb' => $branchRev)) ?>"><?php echo $branchName ?></a></strong></li><?php endif; ?>
+ <?php if ($tags): ?><li class="tags"><?php echo _("Tags:") ?> <?php echo implode(', ', $tags) ?></li><?php endif; ?>
+ </ul>
+ <?php echo $log_print ?>
+ <div class="clear"></div>
+</div>
+
+<h3 class="checkout"><?php echo _("Checkout") ?></h3>
+<div class="checkout">
+<?php
+$type = $pretty->getType();
+if (strpos($type, 'text/plain') !== false) {
+ echo '<div class="fixed">' . Text_Filter::filter($pretty->render(), 'text2html', array('parselevel' => TEXT_HTML_MICRO)) . '</div>';
+} elseif (strpos($type, 'image/') !== false) {
+ echo Horde::img(Util::addParameter(Horde::selfUrl(true), 'p', 1), '', '', '');
+} elseif ($pretty->canDisplayInline()) {
+ echo $pretty->render();
+} else {
+ echo Horde::link(Util::addParameter(Horde::selfUrl(true), 'p', 1)) . Horde::img('download.png', '', '', $registry->getImageDir('horde')) . ' ' . sprintf(_("Download revision %s"), $r) . '</a>';
+}
+?>
+</div>
--- /dev/null
+<?php
+if (isset($language)) {
+ header('Content-type: text/html; charset=' . NLS::getCharset());
+ header('Vary: Accept-Language');
+}
+echo !empty($language) ? '<html lang="' . strtr($language, '_', '-') . '">' : '<html><head>';
+
+$page_title = $registry->get('name');
+if (!empty($title)) $page_title .= ' :: ' . $title;
+if (!empty($refresh_time) && ($refresh_time > 0) && !empty($refresh_url)) {
+ echo "<meta http-equiv=\"refresh\" content=\"$refresh_time;url=$refresh_url\">\n";
+}
+
+Horde::includeScriptFiles();
+
+?>
+<title><?php echo htmlspecialchars($page_title) ?></title>
+<link href="<?php echo $GLOBALS['registry']->getImageDir() ?>/favicon.ico" rel="SHORTCUT ICON" />
+<?php echo Horde::stylesheetLink('chora') ?>
+</head>
+
+<body<?php if ($bc = Util::nonInputVar('bodyClass')) echo ' class="' . $bc . '"' ?><?php if ($bi = Util::nonInputVar('bodyId')) echo ' id="' . $bi . '"'; ?>>
--- /dev/null
+<table class="options" cellspacing="0">
+ <tr>
+ <td>
+ <?php echo _("Click on the revisions and branches to display the file.") ?><br />
+ <?php echo _("Click on the links in between revisions to get a diff between those revisions.") ?>
+ </td>
+ </tr>
+</table>
+
+<p class="history">
+ <img usemap="#graphMap" alt="<?php echo htmlspecialchars($title) ?>" src="<?php echo $imgUrl ?>" />
+</p>
+<?php echo $map ?>
--- /dev/null
+<tr>
+ <td class="added_empty"> </td>
+ <td class="added"><pre><?php echo strlen($line) ? $line : ' ' ?></pre></td>
+</tr>
--- /dev/null
+<tr>
+<?php if (!empty($left)): ?>
+ <td class="modified">
+ <pre><?php echo $left ?></pre>
+ </td>
+<?php elseif ($row < $oldsize): ?>
+ <td class="modified"> </td>
+<?php else: ?>
+ <td class="unmodified"> </td>
+<?php endif; ?>
+<?php if (!empty($right)): ?>
+ <td class="modified">
+ <pre><?php echo $right ?></pre>
+ </td>
+<?php elseif ($row < $newsize): ?>
+ <td class="modified"> </td>
+<?php else: ?>
+ <td class="unmodified"> </td>
+<?php endif; ?>
+</tr>
--- /dev/null
+<tr class="unmodified">
+ <td><pre><?php echo strlen($line) ? $line : ' ' ?></pre></td>
+ <td><pre><?php echo strlen($line) ? $line : ' ' ?></pre></td>
+</tr>
+
--- /dev/null
+</tbody>
+</table>
--- /dev/null
+<table class="options" cellspacing="0">
+ <tr>
+ <td>
+ <form method="get" action="diff.php">
+ <?php echo Chora::formInputs() ?>
+ <input type="hidden" name="f" value="<?php echo htmlspecialchars(Util::getFormData('f')) ?>" />
+ <input type="hidden" name="r1" value="<?php echo htmlspecialchars(Util::getFormData('r1')) ?>" />
+ <input type="hidden" name="r2" value="<?php echo htmlspecialchars(Util::getFormData('r2')) ?>" />
+ <?php echo _("Download diff as: ") ?>
+ <select name="t" onchange="this.form.submit()">
+<?php if (isset($diff_types['unified'])): ?>
+ <option value="unified"><?php echo _("Unified") ?></option>
+<?php endif; ?>
+<?php if (isset($diff_types['context'])): ?>
+ <option value="context"><?php echo _("Context") ?></option>
+<?php endif; ?>
+<?php if (isset($diff_types['column'])): ?>
+ <option value="column"><?php echo _("Column") ?></option>
+<?php endif; ?>
+<?php if (isset($diff_types['ed'])): ?>
+ <option value="ed"><?php echo _("Ed Script") ?></option>
+<?php endif; ?>
+ </select>
+ <input class="button" type="submit" value="<?php echo _("Get Diff") ?>" /><br />
+ </form>
+ </td>
+ </tr>
+</table>
+<table cellspacing="0" class="hrdiff">
+<caption>
+ <?php $blank = $registry->getImageDir('horde') . '/blank.gif' ?>
+ <img class="unmodified" src="<?php echo $blank ?>" alt="<?php echo _("Unmodified") ?>" /> <?php echo _("Unmodified") ?>
+ <img class="added" src="<?php echo $blank ?>" alt="<?php echo _("Added") ?>" /> <?php echo _("Added") ?>
+ <img class="modified" src="<?php echo $blank ?>" alt="<?php echo _("Modified") ?>" /> <?php echo _("Modified") ?>
+ <img class="removed" src="<?php echo $blank ?>" alt="<?php echo _("Removed") ?>" /> <?php echo _("Removed") ?>
+</caption>
+<?php if (!empty($log_messages)): ?>
+<h3 class="revision_log"><?php echo _("Log Message") ?></h3>
+<div class="revision_log">
+<?php foreach ($log_messages as $val): ?>
+ <div class="difflog">
+ <ul class="revision striped">
+ <?php if (!empty($val['author'])): ?><li><?php echo _("Author:") ?> <?php echo $val['author'] ?></li><?php endif; ?>
+ <?php if (!empty($val['date'])): ?><li><?php echo _("Date:") ?> <?php echo $val['date'] ?></li><?php endif; ?>
+ <?php if (!empty($val['branchName'])): ?><li><?php echo _("Branch:") ?> <strong><a href="<?php echo Chora::url('', $where, array('onb' => $val['branchRev'])) ?>"><?php echo $val['branchName'] ?></a></strong></li><?php endif; ?>
+ <?php if (!empty($val['tags'])): ?><li class="tags"><?php echo _("Tags:") ?> <?php echo implode(', ', $val['tags']) ?></li><?php endif; ?>
+ </ul>
+ <a href="<?php echo Chora::url('co', $where, array('r' => $val['rev'])) ?>"><?php echo $val['rev'] ?></a>: <?php echo $val['msg'] ?>
+ <div class="diffclear"></div>
+ </div>
+<?php endforeach; ?>
+</div>
+<?php endif; ?>
+<thead>
+<tr>
+ <th><a href="<?php echo Chora::url('co', $where, array('r' => $r1)) ?>"><?php printf(_("Version %s"), $r1) ?></a></th>
+ <th><a href="<?php echo Chora::url('co', $where, array('r' => $r2)) ?>"><?php printf(_("Version %s"), $r2) ?></a></th>
+</tr>
+</thead>
+<tbody>
--- /dev/null
+<tr>
+ <th>
+ <?php echo _("No Visible Changes") ?>
+ </th>
+</tr>
--- /dev/null
+<tr>
+ <td class="removed"><pre><?php echo strlen($line) ? $line : ' ' ?></pre></td>
+ <td class="removed_empty"> </td>
+</tr>
--- /dev/null
+<tr>
+ <th>
+ <?php printf(_("Line %s"), $lefthead) ?>
+ </th>
+ <th>
+ <?php printf(_("Line %s"), $righthead) ?>
+ </th>
+</tr>
--- /dev/null
+<tbody>
+ <tr>
+ <td>
+ <?php echo Horde::img('back.png', _("Back"), 'width="16" height="16"') ?> <a href="<?php echo $url ?>"><?php echo _("Parent Directory") ?></a>
+ </td>
+ <td> </td>
+ <td> </td>
+ <td> </td>
+ <td> </td>
+ </tr>
+</tbody>
--- /dev/null
+ <tr>
+ <td>
+<?php if (!Chora::isRestricted("$where/$currentDir")): ?>
+ <?php echo Horde::img('folder.png', _("Directory"), 'width="16" height="16"') ?> <a href="<?php echo $url ?>"><?php echo $currDir ?>/</a>
+<?php else: ?>
+ <?php echo Horde::img('folder.png', _("Directory"), 'width="16" height="16"') ?> <?php echo $currDir ?>/
+<?php endif; ?>
+ </td>
+ <td> </td>
+ <td> </td>
+ <td> </td>
+ <td> </td>
+ </tr>
--- /dev/null
+ <tr<?php if ($attic) echo ' class="attic"' ?>>
+<?php if (!Chora::isRestricted($fileName)): ?>
+ <td>
+<?php if ($attic): ?>
+ <?php echo Horde::img('deleted.png', _("Deleted File"), 'width="16" height="16"') ?>
+<?php else: ?>
+ <img src="<?php echo $icon ?>" width="16" height="16" alt="<?php echo _("File") ?>" />
+<?php endif; ?>
+<?php if ($conf['filename_linkto'] == 'revlog'): ?>
+ <a href="<?php echo $url ?>">
+<?php else: ?>
+ <a href="<?php echo Chora::url('co', $fileName, array('r' => $head)) ?>">
+<?php endif; ?>
+<?php echo $name ?></a>
+ </td>
+ <td>
+ <strong>
+<?php if ($conf['filename_linkto'] == 'revlog'): ?>
+ <a href="<?php echo Chora::url('co', $fileName, array('r' => $head)) ?>">
+<?php else: ?>
+ <a href="<?php echo $url ?>">
+<?php endif; ?>
+<?php echo $head ?></a></strong>
+ </td>
+<?php else: ?>
+ <td>
+<?php if ($attic): ?>
+ <?php echo Horde::img('deleted.png', _("Deleted File"), 'width="16" height="16"') ?>
+<?php else: ?>
+ <img src="<?php echo $icon ?>" width="16" height="16" alt="<?php echo _("File") ?>" />
+<?php endif; ?>
+ <?php echo $name ?>
+ </td>
+ <td><strong><?php echo $head ?></strong></td>
+<?php endif; ?>
+ <td><?php echo $author ?></td>
+ <td sortval="<?php echo (int)$date ?>">
+ <em><?php echo $readableDate ?></em>
+ </td>
+ <td><?php if (!empty($log)) echo htmlspecialchars($shortLog) ?></td>
+ </tr>
--- /dev/null
+<?php $sortdirclass = $acts['sbt'] ? 'sortdown' : 'sortup' ?>
+<table id="browse" cellspacing="0" class="browse sortable striped nowrap">
+<thead>
+ <tr>
+ <th id="s<?php echo Horde_VC::SORT_NAME ?>"<?php if ($acts['sbt'] == Horde_VC::SORT_NAME) echo ' class="' . $sortdirclass . '"' ?>>
+ <?php echo Horde::widget($url['name'], _("File"), 'sortlink', '', '', _("_File")) ?>
+ </th>
+ <th id="s<?php echo Horde_VC::SORT_REV ?>"<?php if ($acts['sbt'] == Horde_VC::SORT_REV) echo ' class="' . $sortdirclass . '"' ?>>
+ <?php echo Horde::widget($url['rev'], _("Rev"), 'sortlink', '', '', _("_Rev")) ?>
+ </th>
+ <th id="s<?php echo Horde_VC::SORT_AUTHOR ?>"<?php if ($acts['sbt'] == Horde_VC::SORT_AUTHOR) echo ' class="' . $sortdirclass . '"' ?>>
+ <?php echo Horde::widget($url['author'], _("Author"), 'sortlink', '', '', _("_Author")) ?>
+ </th>
+ <th id="s<?php echo Horde_VC::SORT_AGE ?>"<?php if ($acts['sbt'] == Horde_VC::SORT_AGE) echo ' class="' . $sortdirclass . '"' ?>>
+ <?php echo Horde::widget($url['age'], _("Date"), 'sortlink', '', '', _("Da_te")) ?>
+ </th>
+ <th class="nosort"><?php echo _("Last Log") ?></th>
+ </tr>
+</thead>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd">
+<html>
+<head>
+<title><?php echo _("Error") ?> <?php echo $errcode ?></title>
+</head>
+<body>
+<h2><?php echo _("Error Encountered") ?> - <?php echo $errcode ?></h2>
+<p />
+<strong><?php echo $errmsg ?></strong>
+<p />
+<hr />
+<small><em>
+<?php echo _("Please contact") ?> <a href="mailto:<?php echo $GLOBALS['conf']['options']['adminEmail'] ?>">
+<?php echo $conf['options']['adminName'] ?></a> <?php echo _("for further information.") ?>
+</em></small>
+</body>
+</html>
--- /dev/null
+<h1 class="header"><?php echo htmlspecialchars($title) ?></h1>
+<table cellspacing="0" class="headerbar" id="headerbar">
+ <tr>
+ <td>
+ <?php echo _("Location:") ?>
+ <strong>[ <a href="<?php echo Chora::url('') ?>"><?php echo $conf['options']['sourceRootName'] ?></a> ]
+ <?php echo Chora::whereMenu() ?></strong>
+ <?php if (isset($fl) && isset($onb) && isset($fl->branches[$onb])): ?>
+ <em>(<?php echo _("Tracking Branch") ?> <strong><?php echo $fl->branches[$onb] ?></strong>)</em>
+ <?php endif; ?>
+ </td>
+<?php if (!empty($extraLink)): ?>
+ <td class="rightAlign"><?php echo $extraLink ?></td>
+<?php endif; ?>
+ </tr>
+
+<?php if (!$where && @is_file($conf['paths']['introText'])): ?>
+ <tr>
+ <td class="text" colspan="2"><?php @readfile($conf['paths']['introText']) ?></td>
+ </tr>
+<?php endif; ?>
+
+</table>
--- /dev/null
+<td<?php echo $bg ? " style=\"background:$bg\"":'' ?>> </td>
\ No newline at end of file
--- /dev/null
+<td style="background:<?php echo $bg ?>; text-align:center">
+<?php echo _("Branching to") ?>:<br />
+<a href="<?php echo Chora::url('', $where, array('onb' => $rev)); ?>">
+ <?php echo $symname ?></a>
+<br />
+<em>(<?php printf(_("revision %s"), $rev) ?>)</em>
+</td>
--- /dev/null
+<table cellspacing="5" class="history">
--- /dev/null
+<td id="rev<?php echo $rev ?>" style="background:<?php echo $bg ?>">
+ <a href="<?php echo Chora::url('', $where, array('r'=>$rev), "rev$rev") ?>">
+ <?php echo $rev ?></a> <?php printf(_("by %s"), $author) ?>
+ <br />
+ <em><?php echo $date ?></em>
+<?php if (!empty($lines)): ?>
+ <br /><?php printf(_("Changed: %s"), $lines) ?>
+<?php endif ?>
+</td>
--- /dev/null
+</tbody>
+</table>
+
+<?php if (count($fl->logs) > 100 && !Util::getFormData('all')): ?>
+<table class="options" cellspacing="0">
+ <tr>
+ <td>
+ <?php printf(_("Only showing the 100 latest revisions. %sShow all revisions?</a> (may take a while)."),
+ Horde::link(Util::addParameter(Horde::selfUrl(true), 'all', 1))) ?>
+ </td>
+ </tr>
+</table>
+<?php endif ?>
--- /dev/null
+<table class="options" cellspacing="0">
+ <tr>
+ <td>
+ <?php echo _("Search Revisions:") ?>
+ <input type="text" for="revlog_body" size="20" />
+ </td>
+
+ <td class="spacer"></td>
+ <td>
+ <form method="get" action="diff.php">
+ <?php echo Chora::formInputs() ?>
+ <input type="hidden" name="f" value="<?php echo htmlspecialchars(Util::getFormData('f')) ?>" />
+ <?php printf(_("Show diffs between %s and %s"),
+ '<input type="text" size="6" name="r1" value="' . $diffValueLeft . '" />',
+ '<input type="text" size="6" name="r2" value="' . $diffValueRight . '" />') ?>
+ <input class="button" type="submit" value="<?php echo _("Diff") ?>" /><br />
+ <em><?php printf(_("%1\$s shows diffs to the previous revision. If you select a revision by clicking its row, %1\$s will show the differences to the selected row."),
+ Horde::img('diff.png', _("Show Differences"))) ?></em>
+ </form>
+ </td>
+
+ <td class="spacer"></td>
+
+<?php if (!empty($selAllBranches)): ?>
+ <td>
+ <form method="get" action="browse.php">
+ <?php echo Chora::formInputs() ?>
+ <input type="hidden" name="f" value="<?php echo htmlspecialchars(Util::getFormData('f')) ?>" />
+ <?php echo _("Show Branch:") ?>
+ <select name="onb" onchange="this.form.submit()">
+ <option value="0"<?php if (!isset($onb) || !$onb) echo ' selected="selected"' ?>><?php echo _("All Branches") ?></option>
+ <?php echo $selAllBranches ?>
+ </select>
+ <noscript><input class="button" type="submit" value="<?php echo _("View") ?>" /></noscript>
+ </form>
+ </td>
+<?php else: ?>
+ <td> </td>
+<?php endif; ?>
+ </tr>
+</table>
+
+<table class="revlog striped sortable" id="revlog" cellspacing="0">
+<thead>
+ <tr class="item leftAlign">
+ <th class="nosort"> </th>
+ <th><?php echo _("Revision") ?></th>
+ <th class="sortup"><?php echo _("Date") ?></th>
+ <th><?php echo _("Author") ?></th>
+ <th class="nosort"><?php echo _("Log Message") ?></th>
+ </tr>
+</thead>
+<tbody id="revlog_body">
--- /dev/null
+<tr id="rev<?php echo $rev ?>">
+ <td>
+ <?php if ($diffUrl): ?>
+ <a href="<?php echo $diffUrl ?>" class="pdiff" title="<?php echo _("Show changes to the previous revision") ?>"><?php echo Horde::img('diff.png') ?></a>
+ <?php endif ?>
+ <a href="<?php echo Chora::url('diff', $where, array('r1' => 0, 'r2' => $rev)) ?>" class="sdiff" title="<?php echo _("Show changes to the selected revision") ?>" onclick="revlog_sdiff(this);"><?php echo Horde::img('diff.png') ?></a>
+ </td>
+ <td><a href="<?php echo $textUrl ?>"><?php echo $rev . '</a>'; if ($branchName) echo ' <span class="branch">' . Horde::link(Chora::url('', $where, array('onb' => $branchRev))) . htmlspecialchars($branchName) . '</a></span>'; if (!empty($lg->lines)) echo ' <small>(' . sprintf('%s lines', $lg->lines) . ')</small>'; ?></td>
+ <td class="ago" sortval="<?php echo (int)$lg->date ?>"><a title="<?php echo $readableDate ?>"><?php echo $commitDate ?></a></td>
+ <td class="author"><?php echo $author ?></td>
+ <td class="log">
+<?php
+echo '<p class="message">' . $logMessage . '</p>';
+if ($tags) echo '<p class="tags">' . _("Tags") . ': ' . implode(', ', $tags) . '</p>';
+?>
+ </td>
+</tr>
--- /dev/null
+<div id="menu">
+ <div class="rightFloat">
+ <?php echo Chora::repositories() ?>
+ </div>
+ <?php echo Chora::getMenu('string') ?>
+</div>
+<?php $GLOBALS['notification']->notify(array('listeners' => 'status')) ?>
--- /dev/null
+</tbody>
+</table>
--- /dev/null
+<table class="options" cellspacing="0">
+ <tr>
+ <td>
+ <?php echo _("Search Patchsets:") ?>
+ <input type="text" for="patchsets_body" size="20" />
+ </td>
+ </tr>
+</table>
+
+<table class="revlog striped sortable" id="patchsets" cellspacing="0">
+<thead>
+ <tr class="item leftAlign">
+ <th><?php echo _("Patchset") ?></th>
+ <th class="sortup"><?php echo _("Date") ?></th>
+ <th><?php echo _("Author") ?></th>
+ <th class="nosort"><?php echo _("Files") ?></th>
+ <th class="nosort"><?php echo _("Log Message") ?></th>
+ </tr>
+</thead>
+<tbody id="patchsets_body">
--- /dev/null
+<tr id="ps<?php echo $id ?>">
+ <td class="pset"><?php echo $patchset_link ?></td>
+ <td class="ago" sortval="<?php echo (int)$patchset['date'] ?>"><a title="<?php echo $readableDate ?>"><?php echo $commitDate ?></a></td>
+ <td class="author"><?php echo $author ?></td>
+ <td class="files">
+ <ul>
+ <?php foreach ($files as $file): ?>
+ <li><?php echo $file['file'] . ': ' . $file['from'] . ' -> ' . $file['to'] . ' ' . $file['diff'] ?>
+ <?php endforeach; ?>
+ </ul>
+ </td>
+ <td class="log">
+<?php
+echo '<p class="message">' . $logMessage . '</p>';
+$tags = array();
+if (isset($patchset['branch'])) {
+ $tags[] = htmlspecialchars($patchset['branch']);
+}
+if (isset($patchset['tag'])) {
+ $tags[] = htmlspecialchars($patchset['tag']);
+}
+if ($tags) echo '<p class="tags">' . _("Tags") . ': ' . implode(', ', $tags) . '</p>';
+?>
+ </td>
+</tr>
--- /dev/null
+<table class="stats striped" cellspacing="0">
+<thead>
+ <tr>
+ <th class="rightAlign"><?php echo _("Author") ?></th>
+ <th><?php echo _("Commits") ?></th>
+ </tr>
+</thead>
+<tbody>
+<?php
+
+$most = max($author_stats);
+$factor = $most / 400;
+foreach ($author_stats as $author => $commits): $width = (int)($commits / $factor); ?>
+ <tr>
+ <td class="rightAlign"><?php echo $author ?> </td>
+ <td><?php echo Horde::img('pixel.php?c=bbcbff', '', 'style="border:1px solid #000;" width="' . $width . '" height="10"', $registry->get('webroot', 'horde') . '/services/images') . ' (' . $commits . ')</td>' ?>
+ </tr>
+<?php endforeach ?>
+</tbody>
+</table>
--- /dev/null
+<?php
+/**
+ * Copyright 2006-2008 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (GPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
+ *
+ * @author Michael Slusarz <slusarz@horde.org>
+ */
+
+/* Include Horde's core.php file. */
+include_once '../lib/core.php';
+
+/* We should have loaded the String class, from the Horde_Util
+ package, in core.php. If String:: isn't defined, then we're not
+ finding some critical libraries. */
+if (!class_exists('String')) {
+ echo '<br /><h2 style="color:red">The Horde_Util package was not found. If PHP\'s error_reporting setting is high enough and display_errors is on, there should be error messages printed above that may help you in debugging the problem. If you are simply missing these files, then you need to get the <a href="http://cvs.horde.org/cvs.php/framework">framework</a> module from <a href="http://www.horde.org/source/">Horde CVS</a>, and install the packages in it with the install-packages.php script.</h2>';
+ exit;
+}
+
+/* Initialize the Horde_Test:: class. */
+if (!is_readable('../lib/Test.php')) {
+ echo 'ERROR: You must install Horde before running this script.';
+ exit;
+}
+require_once '../lib/Test.php';
+$horde_test = new Horde_Test;
+
+/* Chora version. */
+$module = 'Chora';
+require_once './lib/version.php';
+$module_version = CHORA_VERSION;
+
+/* Chora configuration files. */
+$file_list = array(
+ 'config/conf.php' => 'The file <code>./config/conf.php</code> appears to be missing. You probably just forgot to generate it using the Horde config system - see docs/INSTALL for details. While you do that, take a look at the settings and make sure they are appropriate for your site.',
+ 'config/mime_drivers.php' => 'The file <code>./config/mime_drivers.php</code> appears to be missing. You probably just forgot to copy <code>./config/mime_drivers.php.dist</code> over. While you do that, take a look at the settings and make sure they are appropriate for your site.',
+ 'config/prefs.php' => 'The file <code>./config/prefs.php</code> appears to be missing. You probably just forgot to copy <code>./config/prefs.php.dist</code> over. While you do that, take a look at the settings and make sure they are appropriate for your site.',
+ 'config/sourceroots.php' => 'The file <code>./config/sourceroots.php</code> appears to be missing. You probably just forgot to copy <code>./config/sourceroots.php.dist</code> over. While you do that, take a look at the settings and make sure they are appropriate for your site.'
+);
+
+require TEST_TEMPLATES . 'header.inc';
+require TEST_TEMPLATES . 'version.inc';
+
+/* PHP module capabilities. */
+$module_list = array();
+
+/* Display versions of other Horde applications. */
+$app_list = array(
+ 'horde' => array(
+ 'error' => 'Chora requires Horde 3.0 or greater to operate.',
+ 'version' => '3.0'
+ ),
+);
+
+?>
+<h1>Other Horde Applications</h1>
+<ul>
+ <?php echo $horde_test->requiredAppCheck($app_list) ?>
+</ul>
+<?php
+
+/* Display PHP Version information. */
+$php_info = $horde_test->getPhpVersionInformation();
+require TEST_TEMPLATES . 'php_version.inc';
+
+/* PEAR */
+$pear_list = array();
+
+/* Get the status output now. */
+$module_output = $horde_test->phpModuleCheck($module_list);
+
+?>
+
+<h1>Chora Configuration Files</h1>
+<ul>
+ <?php echo $horde_test->requiredFileCheck($file_list) ?>
+</ul>
+
+<h1>PEAR Modules</h1>
+<ul>
+ <?php echo $horde_test->PEARModuleCheck($pear_list) ?>
+</ul>
+
+<?php
+require TEST_TEMPLATES . 'footer.inc';
--- /dev/null
+/* Normally we use burnt orange for the select background. But here, since we
+ * use burnt orange for the text color, if we use burnt orange for the
+ * background you can't see the text! So we make it a darker blue to stand
+ * out against the light blue colors. */
+
+.selected {
+ background-color: #bbcbff;
+}
--- /dev/null
+table.options, table.revlog, table.headerbar, table.browse, table.stats, table.annotate {
+ width: 100%;
+ margin-left: 0;
+}
+table.options td {
+ font-size: 100%;
+}
+table.revlog th, table.browse th, table.stats th, table.annotate th {
+ background: #cfc;
+}
+table.headerbar {
+ background: #cfc;
+ border: none;
+ padding-left: 5px;
+ padding-right: 5px;
+ -moz-border-radius: 8px;
+ -webkit-border-radius: 8px;
+}
+table.headerbar tr {
+ background: transparent;
+}
+table.headerbar td {
+ border: none;
+}
+table.headerbar td.text {
+ border-bottom: 5px solid #cfc;
+}
+
+div.revision_log, h3.revision_log, h3.checkout, #revlog tr.hover, #revlog tr:hover, div.checkout, table.hrdiff, table.history, p.history {
+ margin-left: 0;
+ margin-right: 0;
+ border-color: #cfc;
+}
+h3.revision_log, h3.checkout {
+ background: #cfc;
+ color: #063;
+ font-size: 100%;
+ padding-left: 5px;
+ padding-right: 5px;
+ -moz-border-radius-topright: 8px;
+ -moz-border-radius-topleft: 8px;
+ -webkit-border-top-right-radius: 8px;
+ -webkit-border-top-left-radius: 8px;
+}
--- /dev/null
+/* Menu bottom margin, added for BC. */
+#menu {
+ margin-bottom: 8px;
+}
+
+/* Image alignment, added for BC. */
+img {
+ vertical-align: middle;
+}
+
+/* Table CSS, added for BC. */
+th {
+ color: #333;
+ border-bottom: 1px solid #999;
+}
+
+/* Sort arrow styles, added for BC. */
+.sortup {
+ background: #bbcbff url("graphics/za.png") center left no-repeat;
+ padding-left: 10px;
+}
+.sortdown {
+ background: #bbcbff url("graphics/az.png") center left no-repeat;
+ padding-left: 10px;
+}
+
+.QuickFinderNoMatch {
+ display: none;
+}
+
+form#repository-picker {
+ display: inline;
+}
+
+/* Options boxes. */
+table.options {
+ width: 99%;
+ margin: 0 0 8px 5px;
+}
+table.options td {
+ font-size: 80%;
+ width: 33%;
+ border: 1px solid #ccc;
+ padding: 2px;
+ background: #e9e9e9;
+ vertical-align: top;
+}
+table.options td.spacer {
+ width: 10px;
+ background: none;
+ border: none;
+}
+table.options em {
+ display: block;
+ margin-top: 4px;
+}
+
+/* Tables. */
+table.revlog, table.headerbar, table.browse, table.stats {
+ width: 99%;
+ margin: 0 0 8px 5px;
+ border-top: 1px solid #ddd;
+ border-left: 1px solid #ddd;
+}
+table.headerbar {
+ border-right: 1px solid #ddd;
+}
+table.revlog th, table.browse th, table.stats th, table.annotate th {
+ padding: 3px;
+ background: #e9e9e9;
+ border-right: 1px solid #ccc;
+ text-align: left;
+}
+table.stats th.rightAlign {
+ text-align: right;
+}
+table.revlog td, table.headerbar td, table.browse td, table.stats td {
+ padding: 3px;
+ border-right: 1px solid #ddd;
+ border-bottom: 1px solid #ddd;
+}
+table.headerbar tr {
+ background: #e9e9e9;
+}
+table.headerbar td {
+ border-right: none;
+}
+table.revlog th.sortup, table.headerbar th.sortup, table.browse th.sortup {
+ background: #bbcbff url("graphics/za.png") center left no-repeat;
+ padding-left: 10px;
+}
+table.revlog th.sortdown, table.headerbar th.sortdown, table.browse th.sortdown {
+ background: #bbcbff url("graphics/az.png") center left no-repeat;
+ padding-left: 10px;
+}
+
+/* History View. */
+table.history, p.history {
+ margin: 0 0 8px 5px;
+ border: 1px solid #ddd;
+}
+table.history a {
+ font-weight: bold;
+ font-size: 120%;
+}
+
+/* Individual revision information. */
+div.revision_log {
+ margin: 2px 5px 8px 5px;
+ border: 1px solid #ddd;
+ padding: 3px;
+}
+ul.revision {
+ padding: 2px;
+ float: right;
+ width: 50%;
+ list-style: none;
+}
+ul.revision li.tags {
+ font-style: italic;
+}
+
+/* Labels. */
+h3.revision_log, h3.checkout {
+ background: #e9e9e9;
+ display: inline;
+ font-weight: bold;
+ margin: 0 0 0 5px;
+ font-size: 90%;
+ padding: 2px;
+ border: 1px solid #ddd;
+}
+
+/* Revision logs. */
+#revlog tr.hover, #revlog tr:hover {
+ cursor: pointer;
+ background: #bbcbff;
+}
+.revlog tr.selected *, .revlog tr.selected td.ago a {
+ background: #ffc;
+}
+.revlog td {
+ vertical-align: top;
+}
+.revlog td.log {
+ width: 60%;
+}
+.revlog td.ago a {
+ color: #000;
+ text-decoration: none;
+}
+.revlog .branchpoint {
+ margin-bottom: 4px;
+}
+.revlog .branch {
+ font-style: italic;
+}
+.revlog .message {
+ margin-bottom: 0;
+}
+.revlog .tags {
+ font-style: italic;
+ margin-top: 4px;
+ margin-bottom: 0;
+}
+.revlog .sdiff {
+ display: none;
+}
+.revlog .selection .sdiff {
+ display: inline;
+}
+.revlog .selection .selected .sdiff {
+ display: none;
+}
+.revlog .selection .pdiff {
+ display: none;
+}
+.revlog .selection .selected .pdiff {
+ display: inline;
+}
+
+/* Patchset logs. */
+#patchsets ul {
+ list-style: none;
+}
+#patchsets td.pset {
+ width: 1%;
+}
+#patchsets td.files, #patchsets td.log {
+ width: 35%;
+}
+
+/* Checkout. */
+div.checkout {
+ padding: 3px;
+ margin: 2px 5px 8px 5px;
+ border: 1px solid #ddd;
+}
+
+.attic {
+ background: #edd;
+ font-style: italic;
+}
+
+/* Annotate styles. */
+table.annotate {
+ width: 99%;
+ margin: 0 0 8px 5px;
+ border-top: 1px solid #ddd;
+ border-left: 1px solid #ddd;
+ border-bottom: 1px solid #ddd;
+}
+table.annotate th.rightAlign {
+ text-align: right;
+}
+table.annotate td {
+ border-right: 1px solid #ddd;
+}
+table.annotate .author {
+ background: #eef;
+}
+table.annotate .rev {
+ background: #fee;
+}
+
+/* Diff styles. */
+table.hrdiff {
+ width: 99%;
+ margin: 0 0 8px 5px;
+}
+table.hrdiff th {
+ text-align: left;
+ width: 50%;
+}
+table.hrdiff thead th {
+ font-weight: bold;
+ font-size: 110%;
+ padding: 2px;
+}
+table.hrdiff tbody th {
+ padding: 2em 1px 1px 1px;
+ font-size: 80%;
+}
+table.hrdiff .unmodified {
+ background: #fff;
+}
+table.hrdiff .added {
+ background: #9f9;
+}
+table.hrdiff .added_empty {
+ background: #cfc;
+}
+table.hrdiff .modified {
+ background: #fd9;
+}
+table.hrdiff .removed {
+ background: #f99;
+}
+table.hrdiff .removed_empty {
+ background: #fcc;
+}
+table.hrdiff caption {
+ caption-side: top;
+ text-align: left;
+ margin: 0 0 8px 5px;
+ font-size: 90%;
+ font-weight: bold;
+ padding: 5px;
+}
+table.hrdiff caption img {
+ height: 10px;
+ width: 10px;
+ border: 1px solid #000;
+ margin-left: 0.5em;
+ vertical-align: baseline;
+}
+
+div.difflog {
+ padding: 2px;
+ margin: 5px;
+ border: 1px solid #ddd;
+}
+div.diffclear {
+ clear: both;
+}
--- /dev/null
+div.revision_log, div.checkout {
+ background: #fff;
+}
--- /dev/null
+<?php
+
+require_once dirname(__FILE__) . '/VC/Exception.php';
+
+/* Need to define this outside of class since constants in class can not be
+ * assigned from a function return. */
+define('VC_WINDOWS', !strncasecmp(PHP_OS, 'WIN', 3));
+
+/**
+ * Version Control generalized library.
+ *
+ * Copyright 2008 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @package Horde_VC
+ */
+class Horde_VC
+{
+ /* Sorting options */
+ const SORT_NONE = 0; // don't sort
+ const SORT_AGE = 1; // sort by age
+ const SORT_NAME = 2; // sort by filename
+ const SORT_REV = 3; // sort by revision number
+ const SORT_AUTHOR = 4; // sort by author name
+
+ const SORT_ASCENDING = 0; // ascending order
+ const SORT_DESCENDING = 1; // descending order
+
+ /**
+ * The source root of the repository.
+ *
+ * @var string
+ */
+ protected $_sourceroot;
+
+ /**
+ * Hash with the locations of all necessary binaries.
+ *
+ * @var array
+ */
+ protected $_paths = array();
+
+ /**
+ * Hash caching the parsed users file.
+ *
+ * @var array
+ */
+ protected $_users;
+
+ /**
+ * The current driver.
+ *
+ * @var string
+ */
+ protected $_driver;
+
+ /**
+ * Attempts to return a concrete Horde_VC instance based on $driver.
+ *
+ * @param mixed $driver The type of concrete Horde_VC subclass to return.
+ * The code is dynamically included.
+ * @param array $params A hash containing any additional configuration
+ * or parameters a subclass might need.
+ *
+ * @return Horde_VC The newly created concrete instance, or PEAR_Error on
+ * failure.
+ */
+ static public function factory($driver, $params = array())
+ {
+ $class = 'Horde_VC_' . $driver;
+ if (class_exists($class)) {
+ return new $class($params);
+ }
+
+ return PEAR::raiseError($class . ' not found.');
+ }
+
+ /**
+ * Attempts to return a reference to a concrete Horde_VC instance based
+ * on $driver. It will only create a new instance if no Horde_VC
+ * instance with the same parameters currently exists.
+ *
+ * This should be used if multiple types of file backends (and,
+ * thus, multiple Horde_VC instances) are required.
+ *
+ * This method must be invoked as: $var = &Horde_VC::singleton()
+ *
+ * @param mixed $driver The type of concrete Horde_VC subclass to return.
+ * The code is dynamically included.
+ * @param array $params A hash containing any additional configuration
+ * or parameters a subclass might need.
+ *
+ * @return Horde_VC The concrete reference, or PEAR_Error on failure.
+ */
+ static public function &singleton($driver, $params = array())
+ {
+ static $instances = array();
+
+ $signature = serialize(array($driver, $params));
+ if (!isset($instances[$signature])) {
+ $instances[$signature] = &Horde_VC::factory($driver, $params);
+ }
+
+ return $instances[$signature];
+ }
+
+ /**
+ * Constructor.
+ */
+ public function __construct()
+ {
+ $pos = strpos(get_class($this), '_');
+ $this->_driver = substr(get_class($this), $pos + 1);
+ }
+
+ /**
+ * Return the source root for this repository, with no trailing /
+ *
+ * @return string Source root for this repository.
+ */
+ public function sourceroot()
+ {
+ return $this->_sourceroot;
+ }
+
+ /**
+ * Validation function to ensure that a revision number is of the right
+ * form.
+ *
+ * @param mixed $rev The purported revision number.
+ *
+ * @return boolean True if it is a revision number.
+ */
+ public function isValidRevision($rev)
+ {
+ return true;
+ }
+
+ /**
+ * TODO
+ */
+ public function isFile($where)
+ {
+ return true;
+ }
+
+ /**
+ * Throw an exception if the revision number isn't valid.
+ *
+ * @param mixed $rev The revision number
+ *
+ * @return void
+ * @throws Horde_VC_Exception
+ */
+ public function assertValidRevision($rev)
+ {
+ if (!$this->isValidRevision($rev)) {
+ throw new Horde_VC_Exception('Invalid revision number');
+ }
+ }
+
+ /**
+ * Create a range of revisions between two revision numbers.
+ *
+ * @param Horde_VC_File $file The desired file.
+ * @param string $r1 The initial revision.
+ * @param string $r2 The ending revision.
+ *
+ * @return array The revision range, or empty if there is no straight
+ * line path between the revisions.
+ */
+ public function getRevisionRange($file, $r1, $r2)
+ {
+ $class = 'Horde_VC_Diff_' . $this->_driver;
+ $vc_diff = new $class();
+ return $vc_diff->getRevisionRange($this, $file, $r1, $r2);
+ }
+
+ /**
+ * Returns the location of the specified binary.
+ *
+ * @param string $binary An external program name.
+ *
+ * @return boolean|string The location of the external program or false if
+ * it wasn't specified.
+ */
+ public function getPath($binary)
+ {
+ if (isset($this->_paths[$binary])) {
+ return $this->_paths[$binary];
+ }
+
+ return false;
+ }
+
+ /**
+ * Parse the users file, if present in the source root, and return
+ * a hash containing the requisite information, keyed on the
+ * username, and with the 'desc', 'name', and 'mail' values inside.
+ *
+ * @return boolean|array False if the file is not present, otherwise
+ * $this->_users populated with the data
+ */
+ public function getUsers($usersfile)
+ {
+ /* Check that we haven't already parsed users. */
+ if (isset($this->_users) && is_array($this->_users)) {
+ return $this->_users;
+ }
+
+ if (!@is_file($usersfile) || !($fl = @fopen($usersfile, VC_WINDOWS ? 'rb' : 'r'))) {
+ return false;
+ }
+
+ $this->_users = array();
+
+ /* Discard the first line, since it'll be the header info. */
+ fgets($fl, 4096);
+
+ /* Parse the rest of the lines into a hash, keyed on
+ * username. */
+ while ($line = fgets($fl, 4096)) {
+ if (preg_match('/^\s*$/', $line)) {
+ continue;
+ }
+ if (!preg_match('/^(\w+)\s+(.+)\s+([\w\.\-\_]+@[\w\.\-\_]+)\s+(.*)$/', $line, $regs)) {
+ continue;
+ }
+
+ $this->_users[$regs[1]]['name'] = trim($regs[2]);
+ $this->_users[$regs[1]]['mail'] = trim($regs[3]);
+ $this->_users[$regs[1]]['desc'] = trim($regs[4]);
+ }
+
+ return $this->_users;
+ }
+
+ public function queryDir($where)
+ {
+ $class = 'Horde_VC_Directory_' . $this->_driver;
+ return new $class($this, $where);
+ }
+
+ public function getCheckout($file, $rev)
+ {
+ $class = 'Horde_VC_Checkout_' . $this->_driver;
+ $vc_co = new $class();
+ return $vc_co->get($this, $file->queryFullPath(), $rev);
+ }
+
+ public function getDiff($file, $rev1, $rev2, $type = 'unified', $num = 3,
+ $ws = true)
+ {
+ $class = 'Horde_VC_Diff_' . $this->_driver;
+ $vc_diff = new $class();
+ return $vc_diff->get($this, $file, $rev1, $rev2, $type, $num, $ws);
+ }
+
+ public function availableDiffTypes()
+ {
+ $class = 'Horde_VC_Diff_' . $this->_driver;
+ $vc_diff = new $class();
+ return $vc_diff->availableDiffTypes();
+ }
+
+ public function getFileObject($filename, $cache = null, $quicklog = false)
+ {
+ $class = 'Horde_VC_File_' . $this->_driver;
+ $vc_file = new $class($this, $filename, $cache, $quicklog);
+ return $vc_file->getFileObject();
+ }
+
+ public function getAnnotateObject($filename)
+ {
+ $class = 'Horde_VC_Annotate_' . $this->_driver;
+ return new $class($this, $filename);
+ }
+
+ public function getPatchsetObject($filename, $cache = null)
+ {
+ $class = 'Horde_VC_Patchset_' . $this->_driver;
+ $vc_patchset = new $class();
+ return $vc_patchset->getPatchsetObject($this, $filename, $cache);
+ }
+
+ public function getRevisionObject()
+ {
+ $class = 'Horde_VC_Revision_' . $this->_driver;
+ return new $class();
+ }
+}
+
+/**
+ * Horde_VC annotate class.
+ *
+ * @package Horde_VC
+ */
+abstract class Horde_VC_Annotate
+{
+ protected $_file;
+ protected $_rep;
+
+ /**
+ * Constructor
+ *
+ * TODO
+ */
+ public function __construct($rep, $file)
+ {
+ $this->_rep = $rep;
+ $this->_file = $file;
+ }
+
+ /**
+ * TODO
+ */
+ abstract public function doAnnotate($rev);
+}
+
+/**
+ * @package Horde_VC
+ */
+abstract class Horde_VC_Checkout
+{
+ /**
+ * Function which returns a file pointing to the head of the requested
+ * revision of an SVN file.
+ *
+ * @param Horde_VC $rep A repository object
+ * @param string $fullname Fully qualified pathname of the desired file
+ * to checkout
+ * @param string $rev Revision number to check out
+ *
+ * @return resource|object Either a PEAR_Error object, or a stream
+ * pointer to the head of the checkout.
+ */
+ abstract function get($rep, $fullname, $rev);
+}
+
+/**
+ * @package Horde_VC
+ */
+class Horde_VC_Diff
+{
+ /**
+ * The available diff types.
+ *
+ * @var array
+ */
+ protected $_diffTypes = array('column', 'context', 'ed', 'unified');
+
+ /**
+ * Obtain a tree containing information about the changes between
+ * two revisions.
+ *
+ * @param array $raw An array of lines of the raw unified diff,
+ * normally obtained through Horde_VC_Diff::get().
+ *
+ * @return array @TODO
+ */
+ public function humanReadable($raw)
+ {
+ $ret = array();
+
+ /* Hold the left and right columns of lines for change
+ * blocks. */
+ $cols = array(array(), array());
+ $state = 'empty';
+
+ /* Iterate through every line of the diff. */
+ foreach ($raw as $line) {
+ /* Look for a header which indicates the start of a diff
+ * chunk. */
+ if (preg_match('/^@@ \-([0-9]+).*\+([0-9]+).*@@(.*)/', $line, $regs)) {
+ /* Push any previous header information to the return
+ * stack. */
+ if (isset($data)) {
+ $ret[] = $data;
+ }
+ $data = array('type' => 'header', 'oldline' => $regs[1],
+ 'newline' => $regs[2], 'contents'> array());
+ $data['function'] = isset($regs[3]) ? $regs[3] : '';
+ $state = 'dump';
+ } elseif ($state != 'empty') {
+ /* We are in a chunk, so split out the action (+/-)
+ * and the line. */
+ preg_match('/^([\+\- ])(.*)/', $line, $regs);
+ if (count($regs) > 2) {
+ $action = $regs[1];
+ $content = $regs[2];
+ } else {
+ $action = ' ';
+ $content = '';
+ }
+
+ if ($action == '+') {
+ /* This is just an addition line. */
+ if ($state == 'dump' || $state == 'add') {
+ /* Start adding to the addition stack. */
+ $cols[0][] = $content;
+ $state = 'add';
+ } else {
+ /* This is inside a change block, so start
+ * accumulating lines. */
+ $state = 'change';
+ $cols[1][] = $content;
+ }
+ } elseif ($action == '-') {
+ /* This is a removal line. */
+ $state = 'remove';
+ $cols[0][] = $content;
+ } else {
+ /* An empty block with no action. */
+ switch ($state) {
+ case 'add':
+ $data['contents'][] = array('type' => 'add', 'lines' => $cols[0]);
+ break;
+
+ case 'remove':
+ /* We have some removal lines pending in our
+ * stack, so flush them. */
+ $data['contents'][] = array('type' => 'remove', 'lines' => $cols[0]);
+ break;
+
+ case 'change':
+ /* We have both remove and addition lines, so
+ * this is a change block. */
+ $data['contents'][] = array('type' => 'change', 'old' => $cols[0], 'new' => $cols[1]);
+ break;
+ }
+ $cols = array(array(), array());
+ $data['contents'][] = array('type' => 'empty', 'line' => $content);
+ $state = 'dump';
+ }
+ }
+ }
+
+ /* Just flush any remaining entries in the columns stack. */
+ switch ($state) {
+ case 'add':
+ $data['contents'][] = array('type' => 'add', 'lines' => $cols[0]);
+ break;
+
+ case 'remove':
+ /* We have some removal lines pending in our stack, so
+ * flush them. */
+ $data['contents'][] = array('type' => 'remove', 'lines' => $cols[0]);
+ break;
+
+ case 'change':
+ /* We have both remove and addition lines, so this is a
+ * change block. */
+ $data['contents'][] = array('type' => 'change', 'old' => $cols[0], 'new' => $cols[1]);
+ break;
+ }
+
+ if (isset($data)) {
+ $ret[] = $data;
+ }
+
+ return $ret;
+ }
+
+ /**
+ * Create a range of revisions between two revision numbers.
+ *
+ * @param Horde_VC $rep A repository object.
+ * @param Horde_VC_File $file The desired file.
+ * @param string $r1 The initial revision.
+ * @param string $r2 The ending revision.
+ *
+ * @return array The revision range, or empty if there is no straight
+ * line path between the revisions.
+ */
+ public function getRevisionRange($rep, $file, $r1, $r2)
+ {
+ $rev_ob = $rep->getRevisionObject();
+
+ if ($rev_ob->cmp($r1, $r2) == 1) {
+ $curr = $rev_ob->prev($r1);
+ $stop = $rev_ob->prev($r2);
+ $flip = true;
+ } else {
+ $curr = $r2;
+ $stop = $r1;
+ $flip = false;
+ }
+
+ $ret_array = array();
+
+ do {
+ $ret_array[] = $curr;
+ $curr = $rev_ob->prev($curr);
+ if ($curr == $stop) {
+ return ($flip) ? array_reverse($ret_array) : $ret_array;
+ }
+ } while ($rev_ob->cmp($curr, $stop) != -1);
+
+ return array();
+ }
+
+ /**
+ * Return the list of available diff types.
+ *
+ * @return array The list of available diff types for use with get().
+ */
+ public function availableDiffTypes()
+ {
+ return $this->_diffTypes;
+ }
+}
+
+/**
+ * @package Horde_VC
+ */
+abstract class Horde_VC_Directory
+{
+ protected $_rep;
+ protected $_dirName;
+ protected $_files;
+ protected $_atticFiles;
+ protected $_mergedFiles;
+ protected $_dirs;
+ protected $_parent;
+ protected $_moduleName;
+
+ /**
+ * Create a Directory object to store information about the files in a
+ * single directory in the repository
+ *
+ * @param Horde_VC $rp The Repository object this directory
+ * is part of.
+ * @param string $dn Path to the directory.
+ * @param Horde_VC_Directory $pn The parent Directory object to this one.
+ */
+ public function __construct($rep, $dn, $pn = '')
+ {
+ $this->_rep = $rep;
+ $this->_parent = $pn;
+ $this->_moduleName = $dn;
+ $this->_dirName = "/$dn";
+ $this->_dirs = $this->_files = array();
+ }
+
+ /**
+ * Return fully qualified pathname to this directory with no
+ * trailing /.
+ *
+ * @return Pathname of this directory
+ */
+ public function queryDir()
+ {
+ return $this->_dirName;
+ }
+
+ /**
+ * TODO
+ */
+ public function &queryDirList()
+ {
+ reset($this->_dirs);
+ return $this->_dirs;
+ }
+
+ /**
+ * TODO
+ */
+ public function &queryFileList($showattic = false)
+ {
+ return ($showattic && isset($this->_mergedFiles))
+ ? $this->_mergedFiles
+ : $this->_files;
+ }
+
+ /**
+ * TODO
+ */
+ abstract public function browseDir($cache = null, $quicklog = true,
+ $showattic = false);
+
+ /**
+ * Sort the contents of the directory in a given fashion and
+ * order.
+ *
+ * @param integer $how Of the form SORT_* where * can be:
+ * NONE, NAME, AGE, REV for sorting by name, age or
+ * revision.
+ * @param integer $dir Of the form SORT_* where * can be:
+ * ASCENDING, DESCENDING for the order of the sort.
+ */
+ public function applySort($how = Horde_VC::SORT_NONE,
+ $dir = Horde_VC::SORT_ASCENDING)
+ {
+ // Always sort directories by name.
+ natcasesort($this->_dirs);
+
+ $this->_doFileSort($this->_files, $how);
+
+ if (isset($this->_atticFiles)) {
+ $this->_doFileSort($this->_atticFiles, $how);
+ }
+
+ if (isset($this->_mergedFiles)) {
+ $this->_doFileSort($this->_mergedFiles, $how);
+ }
+
+ if ($dir == Horde_VC::SORT_DESCENDING) {
+ $this->_dirs = array_reverse($this->_dirs);
+ $this->_files = array_reverse($this->_files);
+ if (isset($this->_mergedFiles)) {
+ $this->_mergedFiles = array_reverse($this->_mergedFiles);
+ }
+ }
+ }
+
+ /**
+ * TODO
+ */
+ protected function _doFileSort(&$fileList, $how = Horde_VC::SORT_NONE)
+ {
+ switch ($how) {
+ case Horde_VC::SORT_AGE:
+ usort($fileList, array($this, 'fileAgeSort'));
+ break;
+
+ case Horde_VC::SORT_NAME:
+ usort($fileList, array($this, 'fileNameSort'));
+ break;
+
+ case Horde_VC::SORT_AUTHOR:
+ usort($fileList, array($this, 'fileAuthorSort'));
+ break;
+
+ case Horde_VC::SORT_REV:
+ $this->_revob = $this->_rep->getRevisionObject();
+ usort($fileList, array($this, 'fileRevSort'));
+ break;
+
+ case Horde_VC::SORT_NONE:
+ default:
+ break;
+ }
+ }
+ /**
+ * Sort function for ascending age.
+ */
+ public function fileAgeSort($a, $b)
+ {
+ $aa = $a->queryLastLog();
+ $bb = $b->queryLastLog();
+ return ($aa->queryDate() == $bb->queryDate())
+ ? 0
+ : (($aa->queryDate() < $bb->queryDate()) ? 1 : -1);
+ }
+
+ /**
+ * Sort function by author name.
+ */
+ public function fileAuthorSort($a, $b)
+ {
+ $aa = $a->queryLastLog();
+ $bb = $b->queryLastLog();
+ return ($aa->queryAuthor() == $bb->queryAuthor())
+ ? 0
+ : (($aa->queryAuthor() > $bb->queryAuthor()) ? 1 : -1);
+ }
+
+ /**
+ * Sort function for ascending filename.
+ */
+ public function fileNameSort($a, $b)
+ {
+ return strcasecmp($a->name, $b->name);
+ }
+
+ /**
+ * Sort function for ascending revision.
+ */
+ public function fileRevSort($a, $b)
+ {
+ return $this->_revob->cmp($a->queryHead(), $b->queryHead());
+ }
+
+}
+
+/**
+ * @package Horde_VC
+ */
+class Horde_VC_File
+{
+ public $rep;
+ public $dir;
+ public $name;
+ public $logs;
+ public $revs;
+ public $head;
+ public $quicklog;
+ public $symrev;
+ public $revsym;
+ public $branches;
+ public $revob;
+
+ /**
+ * TODO
+ */
+ public function setRepository($rep)
+ {
+ $this->rep = $rep;
+ }
+
+ /**
+ * Has the file been deleted?
+ *
+ * @return boolean Is this file deleted?
+ */
+ public function isDeleted()
+ {
+ return false;
+ }
+
+ /**
+ * Returns the name of the current file as in the repository
+ *
+ * @return string Filename (without the path)
+ */
+ public function queryRepositoryName()
+ {
+ return $this->name;
+ }
+
+ /**
+ * Return the last revision of the current file on the HEAD branch
+ *
+ * @return Last revision of the current file
+ */
+ public function queryRevision()
+ {
+ if (!isset($this->revs[0])) {
+ return PEAR::raiseError('No revisions');
+ }
+ return $this->revs[0];
+ }
+
+ public function queryPreviousRevision($rev)
+ {
+ $last = false;
+ foreach ($this->revs as $entry) {
+ if ($last) {
+ return $entry;
+ }
+ if ($entry == $rev) {
+ $last = true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Return the HEAD (most recent) revision number for this file.
+ *
+ * @return HEAD revision number
+ */
+ public function queryHead()
+ {
+ return $this->queryRevision();
+ }
+
+ /**
+ * Return the last Horde_VC_Log object in the file.
+ *
+ * @return Horde_VC_Log of the last entry in the file
+ */
+ public function queryLastLog()
+ {
+ if (!isset($this->revs[0]) || !isset($this->logs[$this->revs[0]])) {
+ return PEAR::raiseError('No revisions');
+ }
+ return $this->logs[$this->revs[0]];
+ }
+
+ /**
+ * Sort the list of Horde_VC_Log objects that this file contains.
+ *
+ * @param integer $how Horde_VC::SORT_REV (sort by revision),
+ * Horde_VC::SORT_NAME (sort by author name), or
+ * Horde_VC::SORT_AGE (sort by commit date).
+ */
+ public function applySort($how = Horde_VC::SORT_REV)
+ {
+ switch ($how) {
+ case Horde_VC::SORT_NAME:
+ $func = 'Name';
+ break;
+
+ case Horde_VC::SORT_AGE:
+ $func = 'Age';
+ break;
+
+ case Horde_VC::SORT_REV:
+ default:
+ $this->revob = $this->rep->getRevisionObject();
+ $func = 'Revision';
+ break;
+ }
+
+ uasort($this->logs, array($this, 'sortBy' . $func));
+ return true;
+ }
+
+ /**
+ * The sortBy*() functions are internally used by applySort.
+ */
+ public function sortByRevision($a, $b)
+ {
+ return $this->revob->cmp($b->rev, $a->rev);
+ }
+
+ public function sortByAge($a, $b)
+ {
+ return $b->date - $a->date;
+ }
+
+ public function sortByName($a, $b)
+ {
+ return strcmp($a->author, $b->author);
+ }
+
+ /**
+ * Return the fully qualified filename of this object.
+ *
+ * @return Fully qualified filename of this object
+ */
+ public function queryFullPath()
+ {
+ return $this->rep->sourceroot() . '/' . $this->queryModulePath();
+ }
+
+ /**
+ * Return the name of this file relative to its sourceroot.
+ *
+ * @return string Pathname relative to the sourceroot.
+ */
+ public function queryModulePath()
+ {
+ return $this->dir . '/' . $this->name;
+ }
+
+}
+
+/**
+ * Horde_VC patchset class.
+ *
+ * @package Horde_VC
+ */
+class Horde_VC_Patchset
+{
+ protected $_rep;
+ protected $_patchsets = array();
+
+ public function setRepository($rep)
+ {
+ $this->_rep = $rep;
+ }
+}
+
+/**
+ * Horde_VC revisions class.
+ *
+ * Copyright Anil Madhavapeddy, <anil@recoil.org>
+ *
+ * @author Anil Madhavapeddy <anil@recoil.org>
+ * @package Hored_VC
+ */
+abstract class Horde_VC_Revision
+{
+ /**
+ * Given a revision number, remove a given number of portions from
+ * it. For example, if we remove 2 portions of 1.2.3.4, we are
+ * left with 1.2.
+ *
+ * @param string $val Input revision
+ * @param integer $amount Number of portions to strip
+ *
+ * @return string Stripped revision number
+ */
+ abstract public function strip($val, $amount = 1);
+
+ /**
+ * The size of a revision number is the number of portions it has.
+ * For example, 1,2.3.4 is of size 4.
+ *
+ * @param string $val Revision number to determine size of
+ *
+ * @return integer Size of revision number
+ */
+ abstract public function sizeof($val);
+
+ /**
+ * Given two revision numbers, this figures out which one is
+ * greater than the other by stepping along the decimal points
+ * until a difference is found, at which point a sign comparison
+ * of the two is returned.
+ *
+ * @param string $rev1 Period delimited revision number
+ * @param string $rev2 Second period delimited revision number
+ *
+ * @return integer 1 if the first is greater, -1 if the second if greater,
+ * and 0 if they are equal
+ */
+ abstract public function cmp($rev1, $rev2);
+
+ /**
+ * Return the logical revision before this one. Normally, this
+ * will be the revision minus one, but in the case of a new
+ * branch, we strip off the last two decimal places to return the
+ * original branch point.
+ *
+ * @param string $rev Revision number to decrement.
+ *
+ * @return string|boolean Revision number, or false if none could be
+ * determined.
+ */
+ abstract public function prev($rev);
+}
--- /dev/null
+<?php
+class Horde_VC_Exception extends Exception {}
--- /dev/null
+<?php
+
+require_once dirname(__FILE__) . '/rcs.php';
+
+/**
+ * Horde_VC_cvs implementation.
+ *
+ * Copyright 2000-2008 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author Anil Madhavapeddy <anil@recoil.org>
+ * @package Horde_VC
+ */
+class Horde_VC_cvs extends Horde_VC_rcs
+{
+ /**
+ * Constructor.
+ *
+ * @param array $params Any parameter the class expects.
+ * Current parameters:
+ * <pre>
+ * 'sourceroot': The source root for this repository
+ * 'paths': Hash with the locations of all necessary binaries: 'rcsdiff',
+ * 'rlog', 'cvsps', 'cvsps_home' and the temp path: 'temp'
+ * </pre>
+ */
+ public function __construct($params)
+ {
+ $this->_sourceroot = $params['sourceroot'];
+ $this->_paths = $params['paths'];
+ parent::__construct();
+ }
+
+ /**
+ * Returns the temporary file path.
+ *
+ * @return string Temporary file path.
+ */
+ public function getTempPath()
+ {
+ return $this->_paths['temp'];
+ }
+
+ /**
+ * TODO
+ */
+ public function isFile($where)
+ {
+ return @is_file($where . ',v') ||
+ @is_file(dirname($where) . '/Attic/' . basename($where) . ',v');
+ }
+
+ /**
+ * TODO
+ */
+ public function getFileObject($filename, $cache = null, $quicklog = false)
+ {
+ if (substr($filename, 0, 1) != '/') {
+ $filename = '/' . $filename;
+ }
+ return parent::getFileObject($this->sourceroot() . $filename, $cache, $quicklog);
+ }
+
+ /**
+ * TODO
+ */
+ public function getAnnotateObject($filename)
+ {
+ return new Horde_VC_Annotate_cvs($this, $filename);
+ }
+
+ /**
+ * TODO
+ */
+ public function getPatchsetObject($filename, $cache = null)
+ {
+ return parent::getPatchsetObject($this->sourceroot() . '/' . $filename, $cache);
+ }
+
+ /**
+ * Validation function to ensure that a revision number is of the right
+ * form.
+ *
+ * @param mixed $rev The purported revision number.
+ *
+ * @return boolean True if it is a revision number.
+ */
+ public function isValidRevision($rev)
+ {
+ return $rev && preg_match('/^[\d\.]+$/', $rev);
+ }
+}
+
+/**
+ * Horde_VC_cvs annotate class.
+ *
+ * Anil Madhavapeddy, <anil@recoil.org>
+ *
+ * @author Anil Madhavapeddy <anil@recoil.org>
+ * @package Horde_VC
+ */
+class Horde_VC_Annotate_cvs extends Horde_VC_Annotate
+{
+ /**
+ * Temporary filename.
+ *
+ * @var string
+ */
+ protected $_tmpfile;
+
+ /**
+ * Constructor.
+ *
+ * TODO
+ */
+ public function __construct($rep, $file)
+ {
+ $this->_tmpfile = Util::getTempFile('vc', true, $rep->getTempPath());
+ parent::__construct($rep, $file);
+ }
+
+ /**
+ * TODO
+ */
+ public function doAnnotate($rev)
+ {
+ if (is_a($this->_file, 'PEAR_Error') ||
+ is_a($this->_rep, 'PEAR_Error') ||
+ !$this->_rep->isValidRevision($rev)) {
+ return false;
+ }
+
+ $where = $this->_file->queryModulePath();
+ $sourceroot = $this->_rep->sourceroot();
+
+ $pipe = popen($this->_rep->getPath('cvs') . ' -n server > ' . $this->_tmpfile, VC_WINDOWS ? 'wb' : 'w');
+
+ $out = array(
+ "Root $sourceroot",
+ 'Valid-responses ok error Valid-requests Checked-in Updated Merged Removed M E',
+ 'UseUnchanged',
+ 'Argument -r',
+ "Argument $rev",
+ "Argument $where"
+ );
+
+ $dirs = explode('/', dirname($where));
+ while (count($dirs)) {
+ $out[] = 'Directory ' . implode('/', $dirs);
+ $out[] = "$sourceroot/" . implode('/', $dirs);
+ array_pop($dirs);
+ }
+
+ $out[] = 'Directory .';
+ $out[] = $sourceroot;
+ $out[] = 'annotate';
+
+ foreach ($out as $line) {
+ fwrite($pipe, "$line\n");
+ }
+ pclose($pipe);
+
+ if (!($fl = fopen($this->_tmpfile, VC_WINDOWS ? 'rb' : 'r'))) {
+ return false;
+ }
+
+ $lines = array();
+ $line = fgets($fl, 4096);
+
+ // Windows versions of cvs always return $where with forwards slashes.
+ if (VC_WINDOWS) {
+ $where = str_replace(DIRECTORY_SEPARATOR, '/', $where);
+ }
+
+ while ($line && !preg_match("|^E\s+Annotations for $where|", $line)) {
+ $line = fgets($fl, 4096);
+ }
+
+ if (!$line) {
+ return PEAR::raiseError('Unable to annotate; server said: ' . $line);
+ }
+
+ $lineno = 1;
+ while ($line = fgets($fl, 4096)) {
+ if (preg_match('/^M\s+([\d\.]+)\s+\((.+)\s+(\d+-\w+-\d+)\):.(.*)$/', $line, $regs)) {
+ $lines[] = array(
+ 'rev' => $regs[1],
+ 'author' => trim($regs[2]),
+ 'date' => $regs[3],
+ 'line' => $regs[4],
+ 'lineno' => $lineno++
+ );
+ }
+ }
+
+ fclose($fl);
+ return $lines;
+ }
+
+}
+
+/**
+ * Horde_VC_cvs checkout class.
+ *
+ * Anil Madhavapeddy, <anil@recoil.org>
+ *
+ * @author Anil Madhavapeddy <anil@recoil.org>
+ * @package Horde_VC
+ */
+class Horde_VC_Checkout_cvs extends Horde_VC_Checkout
+{
+ /**
+ * Static function which returns a file pointing to the head of the
+ * requested revision of an RCS file.
+ *
+ * @param Horde_VC_cvs $rep A repository object
+ * @param string $fullname Fully qualified pathname of the desired file
+ * to checkout
+ * @param string $rev Revision number to check out
+ *
+ * @return resource|object Either a PEAR_Error object, or a stream
+ * pointer to the head of the checkout
+ */
+ public function get($rep, $fullname, $rev)
+ {
+ if (!$rep->isValidRevision($rev)) {
+ return PEAR::raiseError('Invalid revision number');
+ }
+
+ if (VC_WINDOWS) {
+ $mode = 'rb';
+ $q_name = '"' . escapeshellcmd(str_replace('\\', '/', $fullname)) . '"';
+ } else {
+ $mode = 'r';
+ $q_name = escapeshellarg($fullname);
+ }
+
+ if (!($RCS = popen($rep->getPath('co') . " -p$rev $q_name 2>&1", $mode))) {
+ return PEAR::raiseError('Couldn\'t perform checkout of the requested file');
+ }
+
+ /* First line from co should be of the form :
+ * /path/to/filename,v --> standard out
+ * and we check that this is the case and error otherwise
+ */
+
+ $co = fgets($RCS, 1024);
+ if (!preg_match('/^([\S ]+),v\s+-->\s+st(andar)?d ?out(put)?\s*$/', $co, $regs) || $regs[1].',v' != $fullname) {
+ return PEAR::raiseError('Unexpected output from checkout: ' . $co);
+ }
+
+ /* Next line from co is of the form:
+ * revision 1.2.3
+ * TODO: compare this to $rev for consistency, atm we just
+ * discard the value to move input pointer along - avsm
+ */
+ $co = fgets($RCS, 1024);
+
+ return $RCS;
+ }
+
+}
+
+/**
+ * Horde_VC_cvs diff class.
+ *
+ * Copyright Anil Madhavapeddy, <anil@recoil.org>
+ *
+ * @author Anil Madhavapeddy <anil@recoil.org>
+ * @package Horde_VC
+ */
+class Horde_VC_Diff_cvs extends Horde_VC_Diff
+{
+ /**
+ * Obtain the differences between two revisions of a file.
+ *
+ * @param Horde_VC $rep A repository object.
+ * @param Horde_VC_File $file The desired file.
+ * @param string $rev1 Original revision number to compare from.
+ * @param string $rev2 New revision number to compare against.
+ * @param string $type The type of diff (e.g. 'unified').
+ * @param integer $num Number of lines to be used in context and
+ * unified diffs.
+ * @param boolean $ws Show whitespace in the diff?
+ *
+ * @return string|boolean False on failure, or a string containing the
+ * diff on success.
+ */
+ public function get($rep, $file, $rev1, $rev2, $type = 'context',
+ $num = 3, $ws = true)
+ {
+ /* Make sure that the file parameter is valid. */
+ if (is_a($file, 'PEAR_Error')) {
+ return false;
+ }
+
+ /* Check that the revision numbers are valid. */
+ $rev1 = $rep->isValidRevision($rev1) ? $rev1 : '1.1';
+ $rev2 = $rep->isValidRevision($rev1) ? $rev2 : '1.1';
+
+ $fullName = $file->queryFullPath();
+ $diff = array();
+ $options = '-kk ';
+ if (!$ws) {
+ $opts = ' -bB ';
+ $options .= $opts;
+ } else {
+ $opts = '';
+ }
+
+ switch ($type) {
+ case 'context':
+ $options = $opts . '-p --context=' . (int)$num;
+ break;
+
+ case 'unified':
+ $options = $opts . '-p --unified=' . (int)$num;
+ break;
+
+ case 'column':
+ $options = $opts . '--side-by-side --width=120';
+ break;
+
+ case 'ed':
+ $options = $opts . '-e';
+ break;
+ }
+
+ // Windows versions of cvs always return $where with forwards slashes.
+ if (VC_WINDOWS) {
+ $fullName = str_replace(DIRECTORY_SEPARATOR, '/', $fullName);
+ }
+
+ // TODO: add options for $hr options - however these may not be
+ // compatible with some diffs.
+ $command = $rep->getPath('rcsdiff') . " $options -r$rev1 -r$rev2 \"" . escapeshellcmd($fullName) . '" 2>&1';
+ if (VC_WINDOWS) {
+ $command .= ' < "' . __FILE__ . '"';
+ }
+
+ exec($command, $diff, $retval);
+ return ($retval > 0) ? $diff : array();
+ }
+
+}
+
+/**
+ * Horde_VC_cvs directory class.
+ *
+ * Copyright Anil Madhavapeddy, <anil@recoil.org>
+ *
+ * @author Anil Madhavapeddy <anil@recoil.org>
+ * @package Horde_VC
+ */
+class Horde_VC_Directory_cvs extends Horde_VC_Directory
+{
+ /**
+ * Creates a CVS Directory object to store information
+ * about the files in a single directory in the repository.
+ *
+ * @param Horde_VC $rep A repository object
+ * @param string $dn Path to the directory.
+ * @param Horde_VC_Directory $pn The parent Directory object to this one.
+ */
+ public function __construct($rep, $dn, $pn = '')
+ {
+ parent::__construct($rep, $dn, $pn);
+ $this->_dirName = $rep->sourceroot() . "/$dn";
+ }
+
+ /**
+ * Tell the object to open and browse its current directory, and
+ * retrieve a list of all the objects in there. It then populates
+ * the file/directory stack and makes it available for retrieval.
+ *
+ * @return boolean|object PEAR_Error object on an error, true on success.
+ */
+ public function browseDir($cache = null, $quicklog = true,
+ $showattic = false)
+ {
+ /* Make sure we are trying to list a directory */
+ if (!@is_dir($this->_dirName)) {
+ return PEAR::raiseError('Unable to find directory ' . $this->_dirName);
+ }
+
+ /* Open the directory for reading its contents */
+ if (!($DIR = @opendir($this->_dirName))) {
+ return PEAR::raiseError(empty($php_errormsg) ? 'Permission denied' : $php_errormsg);
+ }
+
+ /* Create two arrays - one of all the files, and the other of
+ * all the directories. */
+ while (($name = readdir($DIR)) !== false) {
+ if (($name == '.') || ($name == '..')) {
+ continue;
+ }
+
+ $path = $this->_dirName . '/' . $name;
+ if (@is_dir($path)) {
+ /* Skip Attic directory. */
+ if ($name != 'Attic') {
+ $this->_dirs[] = $name;
+ }
+ } elseif (@is_file($path) && (substr($name, -2) == ',v')) {
+ /* Spawn a new file object to represent this file. */
+ $fl = $this->_rep->getFileObject(substr($path, strlen($this->_rep->sourceroot()), -2), $cache, $quicklog);
+ if (is_a($fl, 'PEAR_Error')) {
+ return $fl;
+ } else {
+ $this->_files[] = $fl;
+ }
+ }
+ }
+
+ /* Close the filehandle; we've now got a list of dirs and files. */
+ closedir($DIR);
+
+ /* If we want to merge the attic, add it in here. */
+ if ($showattic) {
+ $atticDir = new Horde_VC_Directory_cvs($this->_rep, $this->_moduleName . '/Attic', $this);
+ if (!is_a($atticDir->browseDir($cache, $quicklog), 'PEAR_Error')) {
+ $this->_atticFiles = $atticDir->queryFileList();
+ $this->_mergedFiles = array_merge($this->_files, $this->_atticFiles);
+ }
+ }
+
+ return true;
+ }
+
+}
+
+/**
+ * Horde_VC_cvs file class.
+ *
+ * Copyright Anil Madhavapeddy, <anil@recoil.org>
+ *
+ * @author Anil Madhavapeddy <anil@recoil.org>
+ * @package Horde_VC
+ */
+class Horde_VC_File_cvs extends Horde_VC_File
+{
+ /**
+ * Create a repository file object, and give it information about
+ * what its parent directory and repository objects are.
+ *
+ * @param string $fl Full path to this file.
+ */
+ public function __construct($rep, $fl, $cache = null, $quicklog = false)
+ {
+ $fl .= ',v';
+ $this->rep = $rep;
+ $this->name = basename($fl);
+ $this->dir = dirname($fl);
+ $this->filename = $fl;
+ $this->cache = $cache;
+ $this->quicklog = $quicklog;
+ $this->logs = $this->revs = $this->branches = array();
+ }
+
+ function &getFileObject()
+ {
+ /* Assume file is in the Attic if it doesn't exist. */
+ $filename = $this->filename;
+ if (!@is_file($filename . ',v')) {
+ $filename = dirname($filename) . '/Attic/' . basename($filename);
+ }
+
+ /* The version of the cached data. Increment this whenever the
+ * internal storage format changes, such that we must
+ * invalidate prior cached data. */
+ $cacheVersion = 2;
+ $cacheId = $this->rep->sourceroot() . '_n' . $filename . '_f' . (int)$this->quicklog . '_v' . $cacheVersion;
+
+ $ctime = time() - filemtime($filename . ',v');
+ if ($this->cache &&
+ $this->cache->exists($cacheId, $ctime)) {
+ $fileOb = unserialize($this->cache->get($cacheId, $ctime));
+ $fileOb->setRepository($this->rep);
+ } else {
+ $fileOb = new Horde_VC_File_cvs($this->rep, $filename, $this->cache, $this->quicklog);
+ $fileOb->setRepository($this->rep);
+ if (is_a(($result = $fileOb->getBrowseInfo()), 'PEAR_Error')) {
+ return $result;
+ }
+ $fileOb->applySort(Horde_VC::SORT_AGE);
+
+ if ($this->cache) {
+ $this->cache->set($cacheId, serialize($fileOb));
+ }
+ }
+
+ return $fileOb;
+ }
+
+ /**
+ * If this file is present in an Attic directory, this indicates it.
+ *
+ * @return boolean True if file is in the Attic, and false otherwise
+ */
+ function isDeleted()
+ {
+ return substr($this->dir, -5) == 'Attic';
+ }
+
+ /**
+ * Returns name of the current file without the repository
+ * extensions (usually ,v)
+ *
+ * @return string Filename without repository extension
+ */
+ function queryName()
+ {
+ return preg_replace('/,v$/', '', $this->name);
+ }
+
+
+ function queryPreviousRevision($rev)
+ {
+ $ob = $this->rep->getRevisionObject();
+ return $ob->prev($rev);
+ }
+
+ /**
+ * Return the HEAD (most recent) revision number for this file.
+ *
+ * @return string HEAD revision number
+ */
+ function queryHead()
+ {
+ return $this->head;
+ }
+
+ /**
+ * Populate the object with information about the revisions logs and dates
+ * of the file.
+ *
+ * @return boolean|object PEAR_Error object on error, or true on success
+ */
+ function getBrowseInfo()
+ {
+ /* Check that we are actually in the filesystem. */
+ $file = $this->queryFullPath();
+ if (!is_file($file)) {
+ return PEAR::raiseError('File Not Found: ' . $file);
+ }
+
+ /* Call the RCS rlog command to retrieve the file
+ * information. */
+ $flag = $this->quicklog ? ' -r ' : ' ';
+ $q_file = VC_WINDOWS ? '"' . escapeshellcmd($file) . '"' : escapeshellarg($file);
+
+ $cmd = $this->rep->getPath('rlog') . $flag . $q_file;
+ exec($cmd, $return_array, $retval);
+
+ if ($retval) {
+ return PEAR::raiseError('Failed to spawn rlog to retrieve file log information for ' . $file);
+ }
+
+ $accum = array();
+ $symrev = array();
+ $revsym = array();
+ $state = 'init';
+ foreach ($return_array as $line) {
+ switch ($state) {
+ case 'init':
+ if (!strncmp('head: ', $line, 6)) {
+ $this->head = substr($line, 6);
+ } elseif (!strncmp('branch:', $line, 7)) {
+ $state = 'rev';
+ }
+ break;
+
+ case 'rev':
+ if (!strncmp('----------', $line, 10)) {
+ $state = 'info';
+ $this->symrev = $symrev;
+ $this->revsym = $revsym;
+ } elseif (preg_match("/^\s+([^:]+):\s+([\d\.]+)/", $line, $regs)) {
+ // Check to see if this is a branch
+ if (preg_match('/^(\d+(\.\d+)+)\.0\.(\d+)$/', $regs[2])) {
+ $branchRev = $this->toBranch($regs[2]);
+ if (!isset($this->branches[$branchRev])) {
+ $this->branches[$branchRev] = $regs[1];
+ }
+ } else {
+ $symrev[$regs[1]] = $regs[2];
+ if (empty($revsym[$regs[2]])) {
+ $revsym[$regs[2]] = array();
+ }
+ $revsym[$regs[2]][] = $regs[1];
+ }
+ }
+ break;
+
+ case 'info':
+ if (strncmp('==============================', $line, 30) &&
+ strcmp('----------------------------', $line)) {
+ $accum[] = $line;
+ } elseif (count($accum)) {
+ // spawn a new Horde_VC_log object and add it to the logs
+ // hash
+ $log = new Horde_VC_Log_cvs($this);
+ $err = $log->processLog($accum);
+ // TODO: error checks - avsm
+ $this->logs[$log->queryRevision()] = $log;
+ $this->revs[] = $log->queryRevision();
+ $accum = array();
+ }
+ break;
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * Return the fully qualified filename of this object.
+ *
+ * @return Fully qualified filename of this object
+ */
+ function queryFullPath()
+ {
+ return $this->dir . '/' . $this->name;
+ }
+
+ /**
+ * Return the name of this file relative to its sourceroot.
+ *
+ * @return string Pathname relative to the sourceroot.
+ */
+ function queryModulePath()
+ {
+ return preg_replace('|^'. $this->rep->sourceroot() . '/?(.*),v$|', '\1', $this->queryFullPath());
+ }
+
+ /**
+ * Given a revision number of the form x.y.0.z, this remaps it
+ * into the appropriate branch number, which is x.y.z
+ *
+ * @param string $rev Even-digit revision number of a branch
+ *
+ * @return string Odd-digit Branch number
+ */
+ function toBranch($rev)
+ {
+ /* Check if we have a valid revision number */
+ $rev_ob = $this->rep->getRevisionObject();
+ if (!$rev_ob->valid($rev)) {
+ return false;
+ }
+
+ if (($end = strrpos($rev, '.')) === false) {
+ return false;
+ }
+
+ $rev[$end] = 0;
+ if (($end2 = strrpos($rev, '.')) === false) {
+ return substr($rev, ++$end);
+ }
+
+ return substr_replace($rev, '.', $end2, ($end - $end2 + 1));
+ }
+
+}
+
+/**
+ * Horde_VC_cvs log class.
+ *
+ * @author Anil Madhavapeddy <anil@recoil.org>
+ * @package Horde_VC
+ */
+class Horde_VC_Log_cvs {
+
+ var $rep;
+ var $file;
+ var $tags;
+ var $rev;
+ var $date;
+ var $log;
+ var $author;
+ var $state;
+ var $lines;
+ var $branches;
+
+ /**
+ *
+ */
+ public function __construct($fl)
+ {
+ $this->file = $fl;
+ $this->branches = array();
+ }
+
+ function processLog($raw)
+ {
+ /* Initialise a simple state machine to parse the output of rlog */
+ $state = 'init';
+ while (!empty($raw) && $state != 'done') {
+ switch ($state) {
+ /* Found filename, now looking for the revision number */
+ case 'init':
+ $line = array_shift($raw);
+ if (preg_match("/revision (.+)$/", $line, $parts)) {
+ $this->rev = $parts[1];
+ $state = 'date';
+ }
+ break;
+
+ /* Found revision and filename, now looking for date */
+ case 'date':
+ $line = array_shift($raw);
+ if (preg_match("|^date:\s+(\d+)[-/](\d+)[-/](\d+)\s+(\d+):(\d+):(\d+).*?;\s+author:\s+(.+);\s+state:\s+(\S+);(\s+lines:\s+([0-9\s+-]+))?|", $line, $parts)) {
+ $this->date = gmmktime($parts[4], $parts[5], $parts[6], $parts[2], $parts[3], $parts[1]);
+ $this->author = $parts[7];
+ $this->state = $parts[8];
+ $this->lines = isset($parts[10]) ? $parts[10] : '';
+ $state = 'branches';
+ }
+ break;
+
+ /* Look for a branch point here - format is 'branches:
+ * x.y.z; a.b.c;' */
+ case 'branches':
+ /* If we find a branch tag, process and pop it,
+ otherwise leave input stream untouched */
+ if (!empty($raw) && preg_match("/^branches:\s+(.*)/", $raw[0], $br)) {
+ /* Get the list of branches from the string, and
+ * push valid revisions into the branches array */
+ $brs = preg_split('/;\s*/', $br[1]);
+ foreach ($brs as $brpoint) {
+ //@TODO
+ //if (Horde_VC_Revision::valid($brpoint)) {
+ $this->branches[] = $brpoint;
+ //}
+ }
+ array_shift($raw);
+ }
+
+ $state = 'done';
+ break;
+ }
+ }
+
+ /* Assume the rest of the lines are the log message */
+ $this->log = implode("\n", $raw);
+ $this->tags = isset($this->file->revsym[$this->rev]) ?
+ $this->file->revsym[$this->rev] :
+ array();
+ }
+
+ function queryDate()
+ {
+ return $this->date;
+ }
+
+ function queryRevision()
+ {
+ return $this->rev;
+ }
+
+ function queryAuthor()
+ {
+ return $this->author;
+ }
+
+ function queryLog()
+ {
+ return $this->log;
+ }
+
+ function queryChangedLines()
+ {
+ return isset($this->lines) ? ($this->lines) : '';
+ }
+
+ /**
+ * Given a branch revision number, this function remaps it
+ * accordingly, and performs a lookup on the file object to
+ * return the symbolic name(s) of that branch in the tree.
+ *
+ * @return array Hash of symbolic names => branch numbers
+ */
+ function querySymbolicBranches()
+ {
+ $symBranches = array();
+ foreach ($this->branches as $branch) {
+ $parts = explode('.', $branch);
+ $last = array_pop($parts);
+ $parts[] = '0';
+ $parts[] = $last;
+ $rev = implode('.', $parts);
+ if (isset($this->file->branches[$branch])) {
+ $symBranches[$this->file->branches[$branch]] = $branch;
+ }
+ }
+ return $symBranches;
+ }
+
+}
+
+/**
+ * Horde_VC_cvs Patchset class.
+ *
+ * Copyright Anil Madhavapeddy, <anil@recoil.org>
+ *
+ * @author Anil Madhavapeddy <anil@recoil.org>
+ * @package Horde_VC
+ */
+class Horde_VC_Patchset_cvs extends Horde_VC_Patchset {
+
+ var $_dir;
+ var $_name;
+
+ /**
+ * Create a patchset object.
+ *
+ * @param string $file The filename to get patchsets for.
+ */
+ public function __construct($file)
+ {
+ $this->_name = basename($file);
+ $this->_dir = dirname($file);
+ }
+
+ function &getPatchsetObject($rep, $filename, $cache = null)
+ {
+ /* The version of the cached data. Increment this whenever the
+ * internal storage format changes, such that we must
+ * invalidate prior cached data. */
+ $cacheVersion = 1;
+ $cacheId = $rep->sourceroot() . '_n' . $filename . '_f_v' . $cacheVersion;
+
+ $ctime = time() - filemtime($filename . ',v');
+ if ($cache &&
+ $cache->exists($cacheId, $ctime)) {
+ $psOb = unserialize($cache->get($cacheId, $ctime));
+ $psOb->setRepository($rep);
+ } else {
+ $psOb = new Horde_VC_Patchset_cvs($filename);
+ $psOb->setRepository($rep);
+ if (is_a(($result = $psOb->getPatchsets()), 'PEAR_Error')) {
+ return $result;
+ }
+
+ if ($cache) {
+ $cache->set($cacheId, serialize($psOb));
+ }
+ }
+
+ return $psOb;
+ }
+
+ /**
+ * Populate the object with information about the patchsets that
+ * this file is involved in.
+ *
+ * @return boolean|object PEAR_Error object on error, or true on success.
+ */
+ function getPatchsets()
+ {
+ /* Check that we are actually in the filesystem. */
+ if (!is_file($this->getFullPath() . ',v')) {
+ return PEAR::raiseError('File Not Found');
+ }
+
+ /* Call cvsps to retrieve all patchsets for this file. */
+ $q_root = $this->_rep->sourceroot();
+ $q_root = VC_WINDOWS ? '"' . escapeshellcmd($q_root) . '"' : escapeshellarg($q_root);
+
+ $cvsps_home = $this->_rep->getPath('cvsps_home');
+ $HOME = !empty($cvsps_home) ?
+ 'HOME=' . $cvsps_home . ' ' :
+ '';
+
+ $cmd = $HOME . $this->_rep->getPath('cvsps') . ' -u --cvs-direct --root ' . $q_root . ' -f ' . escapeshellarg($this->_name) . ' ' . escapeshellarg($this->_dir);
+ exec($cmd, $return_array, $retval);
+ if ($retval) {
+ return PEAR::raiseError('Failed to spawn cvsps to retrieve patchset information');
+ }
+
+ $this->_patchsets = array();
+ $state = 'begin';
+ foreach ($return_array as $line) {
+ $line = trim($line);
+ if ($line == '---------------------') {
+ $state = 'begin';
+ continue;
+ }
+
+ switch ($state) {
+ case 'begin':
+ $id = str_replace('PatchSet ', '', $line);
+ $this->_patchsets[$id] = array();
+ $state = 'info';
+ break;
+
+ case 'info':
+ $info = explode(':', $line, 2);
+ switch ($info[0]) {
+ case 'Date':
+ if (preg_match('|(\d{4})/(\d{2})/(\d{2}) (\d{2}):(\d{2}):(\d{2})|', $info[1], $date)) {
+ $this->_patchsets[$id]['date'] = gmmktime($date[4], $date[5], $date[6], $date[2], $date[3], $date[1]);
+ }
+ break;
+
+ case 'Author':
+ $this->_patchsets[$id]['author'] = trim($info[1]);
+ break;
+
+ case 'Branch':
+ if (trim($info[1]) != 'HEAD') {
+ $this->_patchsets[$id]['branch'] = trim($info[1]);
+ }
+ break;
+
+ case 'Tag':
+ if (trim($info[1]) != '(none)') {
+ $this->_patchsets[$id]['tag'] = trim($info[1]);
+ }
+ break;
+
+ case 'Log':
+ $state = 'log';
+ $this->_patchsets[$id]['log'] = '';
+ break;
+ }
+ break;
+
+ case 'log':
+ if ($line == 'Members:') {
+ $state = 'members';
+ $this->_patchsets[$id]['log'] = trim($this->_patchsets[$id]['log']);
+ $this->_patchsets[$id]['members'] = array();
+ } else {
+ $this->_patchsets[$id]['log'] .= $line . "\n";
+ }
+ break;
+
+ case 'members':
+ if (!empty($line)) {
+ $parts = explode(':', $line);
+ $revs = explode('->', $parts[1]);
+ $this->_patchsets[$id]['members'][] = array('file' => $parts[0],
+ 'from' => $revs[0],
+ 'to' => $revs[1]);
+ }
+ break;
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * Return the fully qualified filename of this object.
+ *
+ * @return string Fully qualified filename of this object
+ */
+ function getFullPath()
+ {
+ return $this->_dir . '/' . $this->_name;
+ }
+
+}
+
+class Horde_VC_Revision_cvs extends Horde_VC_Revision_rcs {}
--- /dev/null
+<?php
+/**
+ * Horde_VC_git implementation.
+ *
+ * Copyright 2008 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author Chuck Hagenbuch <chuck@horde.org>
+ * @author Michael Slusarz <slusarz@horde.org>
+ * @package Horde_VC
+ */
+class Horde_VC_git extends Horde_VC
+{
+ /**
+ * Constructor.
+ *
+ * @param array $params Any parameter the class expects.
+ * Current parameters:
+ * 'sourceroot': The source root for this
+ * repository
+ * 'paths': Hash with the locations of all
+ * necessary binaries: 'git'
+ */
+ public function __construct($params)
+ {
+ $this->_sourceroot = escapeshellcmd($params['sourceroot']);
+ $this->_paths = $params['paths'];
+ parent::__construct();
+ }
+
+ /**
+ * Validation function to ensure that a revision number is of the right
+ * form.
+ *
+ * @param mixed $rev The purported revision number.
+ *
+ * @return boolean True if it is a revision number.
+ */
+ public function isValidRevision($rev)
+ {
+ return preg_match('/^[a-f0-9]+$/i', $rev);
+ }
+
+ public function getCommand()
+ {
+ return $this->getPath('git') . ' --git-dir=' . $this->_sourceroot;
+ }
+
+}
+
+/**
+ * Horde_VC_git annotate class.
+ *
+ * Chuck Hagenbuch <chuck@horde.org>
+ *
+ * @author Chuck Hagenbuch <chuck@horde.org>
+ * @package Horde_VC
+ */
+class Horde_VC_Annotate_git extends Horde_VC_Annotate
+{
+ public function __construct($rep, $file)
+ {
+ if (is_a($file, 'PEAR_Error')) {
+ throw new Horde_VC_Exception($file->getMessage());
+ }
+ parent::__construct($rep, $file);
+ }
+
+ /**
+ * TODO
+ */
+ public function doAnnotate($rev)
+ {
+ $this->_rep->assertValidRevision($rev);
+
+ $command = $this->_rep->getCommand() . ' blame -p ' . $rev . ' -- ' . escapeshellarg($this->_file->queryModulePath()) . ' 2>&1';
+ $pipe = popen($command, 'r');
+ if (!$pipe) {
+ return PEAR::raiseError('Failed to execute git annotate: ' . $command);
+ }
+
+ $curr_rev = null;
+ $db = $lines = array();
+ $lines_group = $line_num = 0;
+
+ while (!feof($pipe)) {
+ $line = rtrim(fgets($pipe, 4096));
+ if (!$line) {
+ continue;
+ }
+
+ if ($line[0] == "\t") {
+ $lines[] = array(
+ 'author' => $db[$curr_rev]['author'] . ' ' . $db[$curr_rev]['author-mail'],
+ 'date' => $db[$curr_rev]['author-time'],
+ 'line' => substr($line, 1),
+ 'lineno' => $line_num++,
+ 'rev' => $curr_rev
+ );
+ --$lines_group;
+ } elseif ($line != 'boundary') {
+ if ($lines_group) {
+ list($prefix, $linedata) = explode(' ', $line, 2);
+ switch ($prefix) {
+ case 'author':
+ case 'author-mail':
+ case 'author-time':
+ //case 'author-tz':
+ $db[$curr_rev][$prefix] = trim($linedata);
+ break;
+ }
+ } else {
+ list($curr_rev, , $line_num, $lines_group) = explode(' ', $line);
+ }
+ }
+ }
+
+ pclose($pipe);
+ return $lines;
+ }
+
+}
+
+/**
+ * Horde_VC_git checkout class.
+ *
+ * Chuck Hagenbuch <chuck@horde.org>
+ *
+ * @author Chuck Hagenbuch <chuck@horde.org>
+ * @package Horde_VC
+ */
+class Horde_VC_Checkout_git extends Horde_VC_Checkout
+{
+ /**
+ * Function which returns a file pointing to the head of the requested
+ * revision of an SVN file.
+ *
+ * @param Horde_VC $rep A repository object
+ * @param string $fullname Fully qualified pathname of the desired file
+ * to checkout
+ * @param string $rev Revision number to check out
+ *
+ * @return resource|object Either a PEAR_Error object, or a stream
+ * pointer to the head of the checkout.
+ */
+ function get($rep, $file, $rev)
+ {
+ $rep->assertValidRevision($rev);
+
+ return ($pipe = popen($rep->getCommand() . ' cat-file blob ' . $file->getHashForRevision($rev) . ' 2>&1', VC_WINDOWS ? 'rb' : 'r'))
+ ? $pipe
+ : PEAR::raiseError('Couldn\'t perform checkout of the requested file');
+ }
+
+}
+
+/**
+ * Horde_VC_git diff class.
+ *
+ * Copyright Chuck Hagenbuch <chuck@horde.org>
+ *
+ * @author Chuck Hagenbuch <chuck@horde.org>
+ * @package Horde_VC
+ */
+class Horde_VC_Diff_git extends Horde_VC_Diff
+{
+ /**
+ * The available diff types.
+ *
+ * @var array
+ */
+ protected $_diffTypes = array('unified');
+
+ /**
+ * Obtain the differences between two revisions of a file.
+ *
+ * @param Horde_VC $rep A repository object.
+ * @param Horde_VC_File $file The desired file.
+ * @param string $rev1 Original revision number to compare from.
+ * @param string $rev2 New revision number to compare against.
+ * @param string $type The type of diff (e.g. 'unified').
+ * @param integer $num Number of lines to be used in context and
+ * unified diffs.
+ * @param boolean $ws Show whitespace in the diff?
+ *
+ * @return string|boolean False on failure, or a string containing the
+ * diff on success.
+ */
+ public function get($rep, $file, $rev1, $rev2, $type = 'context',
+ $num = 3, $ws = true)
+ {
+ /* Make sure that the file parameter is valid */
+ if (is_a($file, 'PEAR_Error')) {
+ return false;
+ }
+
+ /* Check that the revision numbers are valid */
+ $rev1 = $rep->isValidRevision($rev1) ? $rev1 : 0;
+ $rev2 = $rep->isValidRevision($rev1) ? $rev2 : 0;
+
+ $diff = array();
+ $options = '';
+ if (!$ws) {
+ $options .= ' -b -w ';
+ }
+
+ switch ($type) {
+ case 'unified':
+ $options .= '--unified=' . (int)$num;
+ break;
+ }
+
+ // TODO: add options for $hr options - however these may not
+ // be compatible with some diffs.
+ $command = $rep->getCommand() . " diff -M -C $options --no-color $rev1..$rev2 -- \"" . $file->queryModulePath() . '" 2>&1';
+
+ exec($command, $diff, $retval);
+ return $diff;
+ }
+
+ /**
+ * Create a range of revisions between two revision numbers.
+ *
+ * @param Horde_VC $rep A repository object.
+ * @param Horde_VC_File $file The desired file.
+ * @param string $r1 The initial revision.
+ * @param string $r2 The ending revision.
+ *
+ * @return array The revision range, or empty if there is no straight
+ * line path between the revisions.
+ */
+ public function getRevisionRange($rep, $file, $r1, $r2)
+ {
+ $cmd = $rep->getCommand() . ' rev-list ' . $r1 . '..' . $r2;
+ $pipe = popen($cmd, 'r');
+ if (!is_resource($pipe)) {
+ throw new Horde_VC_Exception('Unable to run ' . $cmd . ': ' . error_get_last());
+ }
+
+ $revs = array();
+
+ while (!feof($pipe)) {
+ if ($rev = trim(fgets($pipe, 4096))) {
+ $revs[] = $rev;
+ }
+ }
+
+ $revs[] = $r1;
+ pclose($pipe);
+
+ return $revs;
+ }
+}
+
+/**
+ * Horde_VC_git directory class.
+ *
+ * Copyright Chuck Hagenbuch <chuck@horde.org>
+ *
+ * @author Chuck Hagenbuch <chuck@horde.org>
+ * @package Horde_VC
+ */
+class Horde_VC_Directory_git extends Horde_VC_Directory
+{
+ /**
+ * Tell the object to open and browse its current directory, and
+ * retrieve a list of all the objects in there. It then populates
+ * the file/directory stack and makes it available for retrieval.
+ *
+ * @return PEAR_Error object on an error, 1 on success.
+ */
+ public function browseDir($cache = null, $quicklog = true,
+ $showattic = false)
+ {
+ //@TODO For now, we're browsing HEAD
+ $head = trim(shell_exec($this->_rep->getCommand() . ' rev-parse --verify HEAD'));
+ //@TODO can use this to see if we have a valid cache of the tree at this revision
+
+ $dir = $this->queryDir();
+ if (substr($dir, 0, 1) == '/') {
+ $dir = substr($dir, 1);
+ }
+ if (strlen($dir) && substr($dir, -1) != '/') {
+ $dir .= '/';
+ }
+
+ $cmd = $this->_rep->getCommand() . ' ls-tree --full-name ' . $head . ' ' . escapeshellarg($dir) . ' 2>&1';
+
+ $dir = popen($cmd, 'r');
+ if (!$dir) {
+ return PEAR::raiseError('Failed to execute git ls-tree: ' . $cmd);
+ }
+
+ // Create two arrays - one of all the files, and the other of
+ // all the dirs.
+ while (!feof($dir)) {
+ $line = chop(fgets($dir, 1024));
+ if (!strlen($line)) {
+ continue;
+ }
+
+ list( ,$type, , $file) = preg_split('/\s+/', $line, -1, PREG_SPLIT_NO_EMPTY);
+ if ($type == 'tree') {
+ $this->_dirs[] = basename($file);
+ } else {
+ $this->_files[] = $this->_rep->getFileObject($file, $cache, $quicklog);
+ }
+ }
+
+ pclose($dir);
+ }
+
+}
+
+/**
+ * Horde_VC_git file class.
+ *
+ * Copyright Chuck Hagenbuch <chuck@horde.org>
+ *
+ * @author Chuck Hagenbuch <chuck@horde.org>
+ * @package Horde_VC
+ */
+class Horde_VC_File_git extends Horde_VC_File
+{
+ /**
+ * Create a repository file object, and give it information about
+ * what its parent directory and repository objects are.
+ *
+ * @param string $fl Full path to this file.
+ */
+ public function __construct($rep, $fl, $cache = null, $quicklog = false)
+ {
+ // FIXME:
+ $rep->cache = $cache;
+
+ $this->rep = $rep;
+ $this->fullname = $fl;
+ $this->name = basename($fl);
+ $this->dir = dirname($fl);
+ $this->quicklog = $quicklog;
+ $this->cache = $cache;
+
+ $this->logs = $this->revs = $this->revsym = $this->symrev = $this->branches = array();
+ }
+
+ public function getFileObject()
+ {
+ $this->getBrowseInfo();
+ return $this;
+ }
+
+ /**
+ * Get the hash name for this file at a specific revision.
+ *
+ * @param string $rev
+ *
+ * @return string Commit hash
+ */
+ public function getHashForRevision($rev)
+ {
+ return $this->logs[$rev]->getHashForPath($this->fullname);
+ }
+
+ /**
+ * Returns name of the current file without the repository
+ * extensions (usually ,v)
+ *
+ * @return Filename without repository extension
+ */
+ function queryName()
+ {
+ return $this->name;
+ }
+
+ /**
+ * Populate the object with information about the revisions logs
+ * and dates of the file.
+ *
+ * @return mixed True on success, PEAR_Error on error.
+ */
+ function getBrowseInfo()
+ {
+ // Get the list of revisions that touch this path
+ $Q = VC_WINDOWS ? '"' : "'";
+ $cmd = $this->rep->getCommand() . ' rev-list HEAD -- ' . $Q . str_replace($Q, '\\' . $Q, $this->fullname) . $Q . ' 2>&1';
+ $revisions = shell_exec($cmd);
+ if (substr($revisions, 5) == 'fatal') {
+ throw new Horde_VC_Exception($revisions);
+ }
+
+ if (!strlen($revisions)) {
+ throw new Horde_VC_Exception('No revisions found');
+ }
+
+ $this->revs = explode("\n", trim($revisions));
+ foreach ($this->revs as $rev) {
+ $this->logs[$rev] = Horde_VC_Log_git::factory($this->rep, $this, $rev);
+ if ($this->quicklog) {
+ break;
+ }
+ }
+ }
+
+}
+
+/**
+ * Horde_VC_git log class.
+ *
+ * Chuck Hagenbuch <chuck@horde.org>
+ *
+ * @author Chuck Hagenbuch <chuck@horde.org>
+ * @package Horde_VC
+ */
+class Horde_VC_Log_git {
+
+ var $rep;
+ var $err;
+ var $file;
+ var $files = array();
+ var $tags;
+ var $rev;
+ var $date;
+ var $log;
+ var $author;
+ var $state;
+ var $lines;
+ var $branches;
+
+ public static function factory($rep, $file, $rev)
+ {
+ /* The version of the cached data. Increment this whenever the
+ * internal storage format changes, such that we must
+ * invalidate prior cached data. */
+ $cacheVersion = 1;
+ $cacheId = $rep->sourceroot() . '_r' . $rev . '_v' . $cacheVersion;
+
+ if (0/*@TODO no caching during dev*/ && $rep->cache &&
+ // Individual revisions can be cached forever
+ $rep->cache->exists($cacheId, 0)) {
+ $logOb = unserialize($rep->cache->get($cacheId, 0));
+ $logOb->setRepository($rep);
+ } else {
+ $logOb = new Horde_VC_Log_git($rep, $file, $rev);
+
+ if ($rep->cache) {
+ $rep->cache->set($cacheId, serialize($logOb));
+ }
+ }
+
+ return $logOb;
+ }
+
+ /**
+ * Constructor.
+ */
+ public function __construct($rep, $fl, $rev)
+ {
+ $this->rep = $rep;
+ $this->file = $fl;
+ $this->rev = $rev;
+ $this->branches = array();
+
+ $cmd = $this->rep->getCommand() . ' whatchanged --no-color --pretty=fuller --no-abbrev -n 1 ' . $this->rev;
+ $pipe = popen($cmd, 'r');
+ if (!is_resource($pipe)) {
+ throw new Horde_VC_Exception('Unable to run ' . $cmd . ': ' . error_get_last());
+ }
+
+ $commit = trim(array_pop(explode(' ', fgets($pipe))));
+ if ($commit != $rev) {
+ throw new Horde_VC_Exception('Expected ' . $rev . ', got ' . $commit);
+ }
+
+ $properties = array();
+ $line = trim(fgets($pipe));
+ while ($line != '') {
+ list($key, $value) = explode(':', $line, 2);
+ $properties[trim($key)] = trim($value);
+ $line = trim(fgets($pipe));
+ }
+
+ $this->author = $properties['Author'];
+ $this->date = strtotime($properties['AuthorDate']);
+ //@TODO use Committer, CommitterDate, and Merge properties
+
+ $log = '';
+ $line = fgets($pipe);
+ while (substr($line, 0, 1) != ':') {
+ $log .= $line;
+ $line = fgets($pipe);
+ }
+ $this->log = trim($log);
+ //@TODO internal line formatting
+
+ // Build list of files in this revision. The format of these lines is
+ // documented in the git diff-tree documentation:
+ // http://www.kernel.org/pub/software/scm/git/docs/git-diff-tree.html
+ while ($line) {
+ preg_match('/:(\d+) (\d+) (\w+) (\w+) (.+)\t(.+)(\t(.+))?/', $line, $matches);
+ $this->files[$matches[6]] = array(
+ 'srcMode' => $matches[1],
+ 'dstMode' => $matches[2],
+ 'srcSha1' => $matches[3],
+ 'dstSha1' => $matches[4],
+ 'status' => $matches[5],
+ 'srcPath' => $matches[6],
+ 'dstPath' => isset($matches[7]) ? $matches[7] : '',
+ );
+
+ $line = fgets($pipe);
+ }
+ }
+
+ function setRepository($rep)
+ {
+ $this->rep = $rep;
+ }
+
+ public function getHashForPath($path)
+ {
+ //@TODO not confident yet abotu the choice of dstSha1 vs. srcSha1
+ return $this->files[$path]['dstSha1'];
+ }
+
+ function queryDate()
+ {
+ return $this->date;
+ }
+
+ function queryRevision()
+ {
+ return $this->rev;
+ }
+
+ function queryAuthor()
+ {
+ return $this->author;
+ }
+
+ function queryLog()
+ {
+ return $this->log;
+ }
+
+ function queryChangedLines()
+ {
+ return isset($this->lines) ? ($this->lines) : '';
+ }
+
+ /**
+ * Given a branch revision number, this function remaps it
+ * accordingly, and performs a lookup on the file object to
+ * return the symbolic name(s) of that branch in the tree.
+ *
+ * @return hash of symbolic names => branch numbers
+ */
+ function querySymbolicBranches()
+ {
+ $symBranches = array();
+ return $symBranches;
+ }
+
+}
+
+/**
+ * Horde_VC_git Patchset class.
+ *
+ * Copyright Chuck Hagenbuch <chuck@horde.org>
+ *
+ * @author Chuck Hagenbuch <chuck@horde.org>
+ * @package Horde_VC
+ */
+class Horde_VC_Patchset_git extends Horde_VC_Patchset {
+
+ var $_file;
+
+ /**
+ * Create a patchset object.
+ *
+ * @param string $file The filename to get patchsets for.
+ */
+ public function __construct($file)
+ {
+ $this->_file = $file;
+ }
+
+ function &getPatchsetObject($rep, $filename, $cache = null)
+ {
+ /* The version of the cached data. Increment this whenever the
+ * internal storage format changes, such that we must
+ * invalidate prior cached data. */
+ $cacheVersion = 1;
+ $cacheId = $rep->sourceroot() . '_n' . $filename . '_f_v' . $cacheVersion;
+
+ if ($cache &&
+ // ?
+ $cache->exists($cacheId, 3600)) {
+ $psOb = unserialize($cache->get($cacheId, 3600));
+ $psOb->setRepository($rep);
+ } else {
+ $psOb = new Horde_VC_Patchset_git($filename);
+ $psOb->setRepository($rep);
+ if (is_a(($result = $psOb->getPatchsets()), 'PEAR_Error')) {
+ return $result;
+ }
+
+ if ($cache) {
+ $cache->set($cacheId, serialize($psOb));
+ }
+ }
+
+ return $psOb;
+ }
+
+ /**
+ * Populate the object with information about the patchsets that
+ * this file is involved in.
+ *
+ * @return mixed PEAR_Error object on error, or true on success.
+ */
+ function getPatchsets()
+ {
+ $fileOb = new Horde_VC_File_git($this->_rep, $this->_file);
+ if (is_a(($result = $fileOb->getBrowseInfo()), 'PEAR_Error')) {
+ return $result;
+ }
+
+ $this->_patchsets = array();
+ foreach ($fileOb->logs as $rev => $log) {
+ $this->_patchsets[$rev] = array();
+ $this->_patchsets[$rev]['date'] = $log->queryDate();
+ $this->_patchsets[$rev]['author'] = $log->queryAuthor();
+ $this->_patchsets[$rev]['branch'] = '';
+ $this->_patchsets[$rev]['tag'] = '';
+ $this->_patchsets[$rev]['log'] = $log->queryLog();
+ $this->_patchsets[$rev]['members'] = array();
+ foreach ($log->files as $file) {
+ $action = substr($file, 0, 1);
+ $file = preg_replace('/.*?\s(.*?)(\s|$).*/', '\\1', $file);
+ $to = $rev;
+ if ($action == 'A') {
+ $from = 'INITIAL';
+ } elseif ($action == 'D') {
+ $from = $to;
+ $to = '(DEAD)';
+ } else {
+ // This technically isn't the previous revision,
+ // but it works for diffing purposes.
+ $from = $to - 1;
+ }
+
+ $this->_patchsets[$rev]['members'][] = array('file' => $file,
+ 'from' => $from,
+ 'to' => $to);
+ }
+ }
+
+ return true;
+ }
+
+}
+
+class Horde_VC_Revision_git extends Horde_VC_Revision {}
--- /dev/null
+<?php
+/**
+ * Horde_VC_rcs implementation.
+ *
+ * Copyright 2004-2007 Jeff Schwentner <jeffrey.schwentner@lmco.com>
+ *
+ * @author Jeff Schwentner <jeffrey.schwentner@lmco.com>
+ * @author Chuck Hagenbuch <chuck@horde.org>
+ * @package Horde_VC
+ */
+class Horde_VC_rcs extends Horde_VC
+{
+ /**
+ * Checks an RCS file in with a specified change log.
+ *
+ * @param string $filepath Location of file to check in.
+ * @param string $message Log of changes since last version.
+ * @param string $user The user name to use for the check in.
+ * @param boolean $newBinary Does the change involve binary data?
+ *
+ * @return string|object The new revision number on success, or a
+ * PEAR_Error object on failure.
+ */
+ public function ci($filepath, $message, $user = null, $newBinary = false)
+ {
+ if ($user) {
+ putenv('LOGNAME=' . $user);
+ } else {
+ putenv('LOGNAME=guest');
+ }
+
+ $Q = VC_WINDOWS ? '"' : "'" ;
+
+ $ci_cmd = $this->getPath('ci') . ' ' . $Q . $filepath . $Q.' 2>&1';
+ $rcs_cmd = $this->getPath('rcs') . ' -i -kb ' . $Q . $filepath . $Q.' 2>&1';
+ $output = '';
+
+ $message_lines = explode("\n", $message);
+
+ $pipe_def = array(0 => array("pipe", 'r'),
+ 1 => array("pipe", 'w'));
+
+ if ($newBinary) {
+ $process = proc_open($rcs_cmd, $pipe_def, $pipes);
+ } else {
+ $process = proc_open($ci_cmd, $pipe_def, $pipes);
+ }
+
+ if (is_resource($process)) {
+ foreach ($message_lines as $line) {
+ if ($line == '.\n') {
+ $line = '. \n';
+ }
+ fwrite($pipes[0], $line);
+ }
+
+ fwrite($pipes[0], "\n.\n");
+ fclose($pipes[0]);
+
+ while (!feof($pipes[1])) {
+ $output .= fread($pipes[1], 8192);
+ }
+ fclose($pipes[1]);
+ proc_close($process);
+ } else {
+ return PEAR::raiseError('Failed to open pipe in ci()');
+ }
+
+ if ($newBinary) {
+ exec($ci_cmd . ' 2>&1', $return_array, $retval);
+
+ if ($retval) {
+ return PEAR::raiseError("Unable to spawn ci on $filepath from ci()");
+ } else {
+ foreach ($return_array as $line) {
+ $output .= $line;
+ }
+ }
+ }
+
+ $rev_start = strpos($output, 'new revision: ');
+
+ // If no new revision, see if this is an initial checkin.
+ if ($rev_start === false) {
+ $rev_start = strpos($output, 'initial revision: ');
+ $rev_end = strpos($output, ' ', $rev_start);
+ } else {
+ $rev_end = strpos($output, ';', $rev_start);
+ }
+
+ if ($rev_start !== false && $rev_end !== false) {
+ $rev_start += 14;
+ return substr($output, $rev_start, $rev_end - $rev_start);
+ } else {
+ unlock($filepath);
+ $temp_pos = strpos($output, 'file is unchanged');
+ if ($temp_pos !== false) {
+ return PEAR::raiseError('Check-in Failure: ' . basename($filepath) . ' has not been modified');
+ } else {
+ return PEAR::raiseError("Failed to checkin $filepath, $ci_cmd, $output");
+ }
+ }
+ }
+
+ /**
+ * Checks the locks on a CVS/RCS file.
+ *
+ * @param string $filepath Location of file.
+ * @param string &$locked_by Returns the username holding the lock.
+ *
+ * @return boolean|object True on success, or a PEAR_Error on failure.
+ */
+ public function isLocked($filepath, &$locked_by)
+ {
+ $rlog_cmd = $this->getPath('rlog');
+ $rlog_flag = ' -L ';
+
+ $Q = VC_WINDOWS ? '"' : "'";
+
+ $cmd = $rlog_cmd . $rlog_flag . $Q . $filepath . $Q;
+
+ exec($cmd.' 2>&1', $return_array, $retval);
+
+ if ($retval) {
+ return PEAR::raiseError("Unable to spawn rlog on $filepath from isLocked()");
+ } else {
+ $output = '';
+
+ foreach ($return_array as $line) {
+ $output .= $line;
+ }
+
+ $start_name = strpos($output, 'locked by: ');
+ $end_name = strpos($output, ';', $start_name);
+
+ if ($start_name !== false && $end_name !== false) {
+ $start_name += 11;
+ $locked_by = substr($output, $start_name, $end_name - $start_name);
+ return true;
+ } elseif (strlen($output) == 0) {
+ return false;
+ } else {
+ return PEAR::raiseError('Failure running rlog in isLocked()');
+ }
+ }
+ }
+
+ /**
+ * Locks a CVS/RCS file.
+ *
+ * @param string $filepath Location of file.
+ * @param string $user User name to lock the file with
+ *
+ * @return boolean|object True on success, or a PEAR_Error on failure.
+ */
+ public function lock($filepath, $user = null)
+ {
+ // Get username for RCS tag.
+ if ($user) {
+ putenv('LOGNAME=' . $user);
+ } else {
+ putenv('LOGNAME=guest');
+ }
+
+ $rcs_cmd = $this->getPath('rcs');
+ $rcs_flag = ' -l ';
+
+ $Q = VC_WINDOWS ? '"' : "'" ;
+ $cmd = $rcs_cmd . $rcs_flag . $Q . $filepath . $Q;
+ exec($cmd.' 2>&1', $return_array, $retval);
+
+ if ($retval) {
+ return PEAR::raiseError('Failed to spawn rcs ("' . $cmd . '") on "' . $filepath . '" (returned ' . $retval . ')');
+ } else {
+ $output = '';
+ foreach ($return_array as $line) {
+ $output .= $line;
+ }
+
+ $locked_pos = strpos($output, 'locked');
+ if ($locked_pos !== false) {
+ return true;
+ } else {
+ return PEAR::raiseError('Failed to lock "' . $filepath . '" (Ran "' . $cmd . '", got return code ' . $retval . ', output: ' . $output . ')');
+ }
+ }
+ }
+
+ /**
+ * Unlocks a CVS/RCS file.
+ *
+ * @param string $filepath Location of file.
+ * @param string $user User name to unlock the file with
+ *
+ * @return boolean|object True on success, or a PEAR_Error on failure.
+ */
+ public function unlock($filepath, $user = null)
+ {
+ // Get username for RCS tag.
+ if ($user) {
+ putenv('LOGNAME=' . $user);
+ } else {
+ putenv('LOGNAME=guest');
+ }
+
+ $rcs_cmd = $this->getPath('rcs');
+ $rcs_flag = ' -u ';
+
+ $Q = VC_WINDOWS ? '"' : "'" ;
+ $cmd = $rcs_cmd . $rcs_flag . $Q . $filepath . $Q;
+ exec($cmd . ' 2>&1', $return_array, $retval);
+
+ if ($retval) {
+ return PEAR::raiseError('Failed to spawn rcs ("' . $cmd . '") on "' . $filepath . '" (returned ' . $retval . ')');
+ } else {
+ $output = '';
+
+ foreach ($return_array as $line) {
+ $output .= $line;
+ }
+
+ $unlocked_pos = strpos($output, 'unlocked');
+
+ if ($unlocked_pos !== false) {
+ return true;
+ } else {
+ // Already unlocked.
+ return true;
+ }
+ }
+ }
+
+}
+
+class Horde_VC_Revision_rcs extends Horde_VC_Revision
+{
+ /**
+ * Given a revision number, remove a given number of portions from
+ * it. For example, if we remove 2 portions of 1.2.3.4, we are
+ * left with 1.2.
+ *
+ * @param string $val Input revision
+ * @param integer $amount Number of portions to strip
+ *
+ * @return string Stripped revision number
+ */
+ public function strip($val, $amount = 1)
+ {
+ //@TODO This concept is broken beyond CVS
+ //if (!Horde_VC_Revision::valid($val)) {
+ // return false;
+ //}
+ $pos = 0;
+ while ($amount-- > 0 && ($pos = strrpos($val, '.')) !== false) {
+ $val = substr($val, 0, $pos);
+ }
+ return $pos !== false ? $val : false;
+ }
+
+ /**
+ * The size of a revision number is the number of portions it has.
+ * For example, 1,2.3.4 is of size 4.
+ *
+ * @param string $val Revision number to determine size of
+ *
+ * @return integer Size of revision number
+ */
+ public function sizeof($val)
+ {
+ //@TODO This concept is broken beyond CVS
+ //if (!Horde_VC_Revision::valid($val)) {
+ // return false;
+ //}
+
+ return (substr_count($val, '.') + 1);
+ }
+
+ /**
+ * Given two revision numbers, this figures out which one is
+ * greater than the other by stepping along the decimal points
+ * until a difference is found, at which point a sign comparison
+ * of the two is returned.
+ *
+ * @param string $rev1 Period delimited revision number
+ * @param string $rev2 Second period delimited revision number
+ *
+ * @return integer 1 if the first is greater, -1 if the second if greater,
+ * and 0 if they are equal
+ */
+ public function cmp($rev1, $rev2)
+ {
+ return version_compare($rev1, $rev2);
+ }
+
+ /**
+ * Return the logical revision before this one. Normally, this
+ * will be the revision minus one, but in the case of a new
+ * branch, we strip off the last two decimal places to return the
+ * original branch point.
+ *
+ * @param string $rev Revision number to decrement.
+ *
+ * @return string|boolean Revision number, or false if none could be
+ * determined.
+ */
+ public function prev($rev)
+ {
+ $last_dot = strrpos($rev, '.');
+ $val = substr($rev, ++$last_dot);
+
+ if (--$val > 0) {
+ return substr($rev, 0, $last_dot) . $val;
+ } else {
+ $last_dot--;
+ while (--$last_dot) {
+ if ($rev[$last_dot] == '.') {
+ return substr($rev, 0, $last_dot);
+ } elseif ($rev[$last_dot] == null) {
+ return false;
+ }
+ }
+ }
+ }
+}
--- /dev/null
+<?php
+
+require_once dirname(__FILE__) . '/rcs.php';
+
+/**
+ * Horde_VC_svn implementation.
+ *
+ * Copyright 2000-2008 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author Anil Madhavapeddy <anil@recoil.org>
+ * @package Horde_VC
+ */
+class Horde_VC_svn extends Horde_VC
+{
+ /**
+ * SVN username.
+ *
+ * @var string
+ */
+ protected $_username = '';
+
+ /**
+ * SVN password.
+ *
+ * @var string
+ */
+ protected $_password = '';
+
+ /**
+ * Constructor.
+ *
+ * @param array $params Any parameter the class expects.
+ * Current parameters:
+ * <pre>
+ * 'sourceroot': The source root for this repository
+ * 'paths': Hash with the locations of all necessary binaries: 'svn',
+ * 'diff'
+ * </pre>
+ */
+ public function __construct($params)
+ {
+ $this->_sourceroot = $params['sourceroot'];
+ $this->_paths = $params['paths'];
+
+ if (!empty($params['username'])) {
+ $this->_username = $params['username'];
+ }
+
+ if (!empty($params['password'])) {
+ $this->_password = $params['password'];
+ }
+ parent::_construct();
+ }
+
+ /**
+ * TODO
+ */
+ public function getCommand()
+ {
+ $svnPath = $this->getPath('svn');
+ $tempDir = isset($this->_paths['svn_home'])
+ ? $this->_paths['svn_home']
+ : Util::getTempDir();
+ $command = $svnPath . ' --non-interactive --config-dir ' . $tempDir;
+
+ if ($this->_username) {
+ $command .= ' --username ' . $this->_username;
+ }
+
+ if ($this->_password) {
+ $command .= ' --password ' . $this->_password;
+ }
+
+ return $command;
+ }
+
+ /**
+ * Validation function to ensure that a revision number is of the right
+ * form.
+ *
+ * @param mixed $rev The purported revision number.
+ *
+ * @return boolean True if it is a revision number.
+ */
+ public function isValidRevision($rev)
+ {
+ return is_numeric($rev);
+ }
+
+}
+
+/**
+ * Horde_VC_svn annotate class.
+ *
+ * Anil Madhavapeddy, <anil@recoil.org>
+ *
+ * @author Anil Madhavapeddy <anil@recoil.org>
+ * @package Horde_VC
+ */
+class Horde_VC_Annotate_svn extends Horde_VC_Annotate
+{
+ /**
+ * TODO
+ */
+ public function doAnnotate($rev)
+ {
+ if (is_a($this->_file, 'PEAR_Error') ||
+ !$this->_rep->isValidRevision($rev)) {
+ return false;
+ }
+
+ $command = $this->_rep->getCommand() . ' annotate -r 1:' . $rev . ' ' . escapeshellarg($this->_file->queryFullPath()) . ' 2>&1';
+ $pipe = popen($command, 'r');
+ if (!$pipe) {
+ return PEAR::raiseError('Failed to execute svn annotate: ' . $command);
+ }
+
+ $lines = array();
+ $lineno = 1;
+
+ while (!feof($pipe)) {
+ $line = fgets($pipe, 4096);
+ if (preg_match('/^\s+(\d+)\s+([\w\.]+)\s(.*)$/', $line, $regs)) {
+ $lines[] = array(
+ 'rev' => $regs[1],
+ 'author' => trim($regs[2]),
+ 'date' => '',
+ 'line' => $regs[3],
+ 'lineno' => $lineno++
+ );
+ }
+ }
+
+ pclose($pipe);
+ return $lines;
+ }
+
+}
+
+/**
+ * Horde_VC_svn checkout class.
+ *
+ * Anil Madhavapeddy, <anil@recoil.org>
+ *
+ * @author Anil Madhavapeddy <anil@recoil.org>
+ * @package Horde_VC
+ */
+class Horde_VC_Checkout_svn extends Horde_VC_Checkout
+{
+ /**
+ * Function which returns a file pointing to the head of the requested
+ * revision of a file.
+ *
+ * @param Horde_VC $rep A repository object
+ * @param string $fullname Fully qualified pathname of the desired file
+ * to checkout
+ * @param string $rev Revision number to check out
+ *
+ * @return resource|object Either a PEAR_Error object, or a stream
+ * pointer to the head of the checkout.
+ */
+ public function get($rep, $fullname, $rev)
+ {
+ if (!$rep->isValidRevision($rev)) {
+ return PEAR::raiseError('Invalid revision number');
+ }
+
+ return ($RCS = popen($rep->getCommand() . ' cat -r ' . $rev . ' ' . escapeshellarg($fullname) . ' 2>&1', VC_WINDOWS ? 'rb' : 'r'))
+ ? $RCS
+ : PEAR::raiseError('Couldn\'t perform checkout of the requested file');
+ }
+
+}
+
+/**
+ * Horde_VC_svn diff class.
+ *
+ * Copyright Anil Madhavapeddy, <anil@recoil.org>
+ *
+ * @author Anil Madhavapeddy <anil@recoil.org>
+ * @package Horde_VC
+ */
+class Horde_VC_Diff_svn extends Horde_VC_Diff
+{
+ /**
+ * Obtain the differences between two revisions of a file.
+ *
+ * @param Horde_VC $rep A repository object.
+ * @param Horde_VC_File $file The desired file.
+ * @param string $rev1 Original revision number to compare from.
+ * @param string $rev2 New revision number to compare against.
+ * @param string $type The type of diff (e.g. 'unified').
+ * @param integer $num Number of lines to be used in context and
+ * unified diffs.
+ * @param boolean $ws Show whitespace in the diff?
+ *
+ * @return string|boolean False on failure, or a string containing the
+ * diff on success.
+ */
+ public function get($rep, $file, $rev1, $rev2, $type = 'context',
+ $num = 3, $ws = true)
+ {
+ /* Make sure that the file parameter is valid */
+ if (is_a($file, 'PEAR_Error')) {
+ return false;
+ }
+
+ /* Check that the revision numbers are valid */
+ $rev1 = $rep->isValidRevision($rev1) ? $rev1 : 0;
+ $rev2 = $rep->isValidRevision($rev1) ? $rev2 : 0;
+
+ $fullName = $file->queryFullPath();
+ $diff = array();
+ $options = '';
+ if (!$ws) {
+ $options .= ' -bB ';
+ }
+
+ switch ($type) {
+ case 'context':
+ $options .= '--context=' . (int)$num;
+ break;
+
+ case 'unified':
+ $options .= '-p --unified=' . (int)$num;
+ break;
+
+ case 'column':
+ $options .= '--side-by-side --width=120';
+ break;
+
+ case 'ed':
+ $options .= '-e';
+ break;
+ }
+
+ // TODO: add options for $hr options - however these may not
+ // be compatible with some diffs.
+ $command = $rep->getCommand() . " diff --diff-cmd " . $rep->getPath('diff') . " -r $rev1:$rev2 -x " . escapeshellarg($options) . ' ' . escapeshellarg($file->queryFullPath()) . ' 2>&1';
+
+ exec($command, $diff, $retval);
+ return $diff;
+ }
+
+}
+
+/**
+ * Horde_VC_svn directory class.
+ *
+ * Copyright Anil Madhavapeddy, <anil@recoil.org>
+ *
+ * @author Anil Madhavapeddy <anil@recoil.org>
+ * @package Horde_VC
+ */
+class Horde_VC_Directory_svn extends Horde_VC_Directory
+{
+ /**
+ * Tell the object to open and browse its current directory, and
+ * retrieve a list of all the objects in there. It then populates
+ * the file/directory stack and makes it available for retrieval.
+ *
+ * @return PEAR_Error object on an error, 1 on success.
+ */
+ public function browseDir($cache = null, $quicklog = true,
+ $showattic = false)
+ {
+ $cmd = $this->_rep->getCommand() . ' ls ' . escapeshellarg($this->_rep->sourceroot() . $this->queryDir()) . ' 2>&1';
+
+ $dir = popen($cmd, 'r');
+ if (!$dir) {
+ return PEAR::raiseError('Failed to execute svn ls: ' . $cmd);
+ }
+
+ /* Create two arrays - one of all the files, and the other of
+ * all the dirs. */
+ $errors = array();
+ while (!feof($dir)) {
+ $line = chop(fgets($dir, 1024));
+ if (!strlen($line)) {
+ continue;
+ }
+
+ if (substr($line, 0, 4) == 'svn:') {
+ $errors[] = $line;
+ } elseif (substr($line, -1) == '/') {
+ $this->_dirs[] = substr($line, 0, -1);
+ } else {
+ $fl = $this->_rep->getFileObject($this->queryDir() . "/$line", $cache, $quicklog);
+ if (is_a($fl, 'PEAR_Error')) {
+ return $fl;
+ } else {
+ $this->_files[] = $fl;
+ }
+ }
+ }
+
+ pclose($dir);
+
+ return $errors
+ ? PEAR::raiseError(implode("\n", $errors))
+ : true;
+ }
+
+}
+
+/**
+ * Horde_VC_svn file class.
+ *
+ * Copyright Anil Madhavapeddy, <anil@recoil.org>
+ *
+ * @author Anil Madhavapeddy <anil@recoil.org>
+ * @package Horde_VC
+ */
+class Horde_VC_File_svn extends Horde_VC_File {
+
+ /**
+ * Create a repository file object, and give it information about
+ * what its parent directory and repository objects are.
+ *
+ * @param string $fl Full path to this file.
+ */
+ public function __construct($rep, $fl, $cache = null, $quicklog = false)
+ {
+ $this->rep = $rep;
+ $this->name = basename($fl);
+ $this->dir = dirname($fl);
+ $this->filename = $fl;
+ $this->quicklog = $quicklog;
+ $this->cache = $cache;
+ $this->logs = $this->revs = $this->revsym = $this->symrev = $this->branches = array();
+ }
+
+ function &getFileObject()
+ {
+ /* The version of the cached data. Increment this whenever the
+ * internal storage format changes, such that we must
+ * invalidate prior cached data. */
+ $cacheVersion = 2;
+ $cacheId = $rep->sourceroot() . '_n' . $this->filename . '_f' . (int)$this->quicklog . '_v' . $cacheVersion;
+
+ if ($this->cache &&
+ // The file is cached for one hour no matter what, because
+ // there is no way to determine with Subversion the time
+ // the file last changed.
+ $this->cache->exists($cacheId, 3600)) {
+ $fileOb = unserialize($this->cache->get($cacheId, 3600));
+ $fileOb->setRepository($rep);
+ } else {
+ $fileOb = new Horde_VC_File_svn($rep, $this->filename, $this->cache, $this->quicklog);
+ $fileOb->setRepository($rep);
+ if (is_a(($result = $fileOb->getBrowseInfo()), 'PEAR_Error')) {
+ return $result;
+ }
+ $fileOb->applySort(Horde_VC::SORT_AGE);
+
+ if ($this->cache) {
+ $this->cache->set($cacheId, serialize($fileOb));
+ }
+ }
+
+ return $fileOb;
+ }
+
+ /**
+ * Returns name of the current file without the repository
+ * extensions (usually ,v)
+ *
+ * @return Filename without repository extension
+ */
+ function queryName()
+ {
+ return preg_replace('/,v$/', '', $this->name);
+ }
+
+ /**
+ * Populate the object with information about the revisions logs
+ * and dates of the file.
+ *
+ * @return mixed boolean True on success,
+ * PEAR_Error On error.
+ */
+ function getBrowseInfo()
+ {
+ /* This doesn't work; need to find another way to simply
+ * request the most recent revision:
+ *
+ * $flag = $this->quicklog ? '-r HEAD ' : ''; */
+ $flag = '';
+ $Q = VC_WINDOWS ? '"' : "'";
+ $cmd = $this->rep->getCommand() . ' log -v ' . $flag . $Q . str_replace($Q, '\\' . $Q, $this->queryFullPath()) . $Q . ' 2>&1';
+ $pipe = popen($cmd, 'r');
+ if (!$pipe) {
+ return PEAR::raiseError('Failed to execute svn log: ' . $cmd);
+ }
+
+ $header = fgets($pipe);
+ if (!strspn($header, '-')) {
+ return PEAR::raiseError('Error executing svn log: ' . $header);
+ }
+
+ while (!feof($pipe)) {
+ $log = new Horde_VC_Log_svn($this->rep, $this);
+ $err = $log->processLog($pipe);
+ if ($err) {
+ $rev = $log->queryRevision();
+ $this->logs[$rev] = $log;
+ $this->revs[] = $rev;
+ }
+
+ if ($this->quicklog) {
+ break;
+ }
+ }
+
+ pclose($pipe);
+ return true;
+ }
+
+}
+
+/**
+ * Horde_VC_svn log class.
+ *
+ * Anil Madhavapeddy, <anil@recoil.org>
+ *
+ * @author Anil Madhavapeddy <anil@recoil.org>
+ * @package Horde_VC
+ */
+class Horde_VC_Log_svn {
+
+ var $rep;
+ var $err;
+ var $file;
+ var $files;
+ var $tags;
+ var $rev;
+ var $date;
+ var $log;
+ var $author;
+ var $state;
+ var $lines;
+ var $branches;
+
+ /**
+ * Constructor.
+ */
+ public function __construct($rep, $fl)
+ {
+ $this->rep = $rep;
+ $this->file = $fl;
+ $this->branches = array();
+ }
+
+ function processLog($pipe)
+ {
+ $line = fgets($pipe);
+
+ if (feof($pipe)) {
+ return false;
+ }
+
+ if (preg_match('/^r([0-9]*) \| (.*?) \| (.*) \(.*\) \| ([0-9]*) lines?$/', $line, $matches)) {
+ $this->rev = $matches[1];
+ $this->author = $matches[2];
+ $this->date = strtotime($matches[3]);
+ $size = $matches[4];
+ } else {
+ $this->err = $line;
+ return false;
+ }
+
+ fgets($pipe);
+
+ $this->files = array();
+ while (($line = trim(fgets($pipe))) != '') {
+ $this->files[] = $line;
+ }
+
+ for ($i = 0; $i != $size; ++$i) {
+ $this->log = $this->log . chop(fgets($pipe)) . "\n";
+ }
+
+ $this->log = chop($this->log);
+ fgets($pipe);
+
+ return true;
+ }
+
+ function queryDate()
+ {
+ return $this->date;
+ }
+
+ function queryRevision()
+ {
+ return $this->rev;
+ }
+
+ function queryAuthor()
+ {
+ return $this->author;
+ }
+
+ function queryLog()
+ {
+ return $this->log;
+ }
+
+ function queryChangedLines()
+ {
+ return isset($this->lines) ? ($this->lines) : '';
+ }
+
+ /**
+ * Given a branch revision number, this function remaps it
+ * accordingly, and performs a lookup on the file object to
+ * return the symbolic name(s) of that branch in the tree.
+ *
+ * @return hash of symbolic names => branch numbers
+ */
+ function querySymbolicBranches()
+ {
+ $symBranches = array();
+ foreach ($this->branches as $branch) {
+ $parts = explode('.', $branch);
+ $last = array_pop($parts);
+ $parts[] = '0';
+ $parts[] = $last;
+ $rev = implode('.', $parts);
+ if (isset($this->file->branches[$branch])) {
+ $symBranches[$this->file->branches[$branch]] = $branch;
+ }
+ }
+ return $symBranches;
+ }
+
+}
+
+/**
+ * Horde_VC_svn Patchset class.
+ *
+ * Copyright Anil Madhavapeddy, <anil@recoil.org>
+ *
+ * @author Anil Madhavapeddy <anil@recoil.org>
+ * @package Horde_VC
+ */
+class Horde_VC_Patchset_svn extends Horde_VC_Patchset {
+
+ var $_file;
+
+ /**
+ * Create a patchset object.
+ *
+ * @param string $file The filename to get patchsets for.
+ */
+ public function __construct($file)
+ {
+ $this->_file = $file;
+ }
+
+ function &getPatchsetObject($rep, $filename, $cache = null)
+ {
+ /* The version of the cached data. Increment this whenever the
+ * internal storage format changes, such that we must
+ * invalidate prior cached data. */
+ $cacheVersion = 1;
+ $cacheId = $rep->sourceroot() . '_n' . $filename . '_f_v' . $cacheVersion;
+
+ if ($cache &&
+ // The file is cached for one hour no matter what, because
+ // there is no way to determine with svn the time the file
+ // last changed.
+ $cache->exists($cacheId, 3600)) {
+ $psOb = unserialize($cache->get($cacheId, 3600));
+ $psOb->setRepository($rep);
+ } else {
+ $psOb = new Horde_VC_Patchset_svn($filename);
+ $psOb->setRepository($rep);
+ if (is_a(($result = $psOb->getPatchsets()), 'PEAR_Error')) {
+ return $result;
+ }
+
+ if ($cache) {
+ $cache->set($cacheId, serialize($psOb));
+ }
+ }
+
+ return $psOb;
+ }
+
+ /**
+ * Populate the object with information about the patchsets that
+ * this file is involved in.
+ *
+ * @return mixed PEAR_Error object on error, or true on success.
+ */
+ function getPatchsets()
+ {
+ $fileOb = new Horde_VC_File_svn($this->_rep, $this->_file);
+ if (is_a(($result = $fileOb->getBrowseInfo()), 'PEAR_Error')) {
+ return $result;
+ }
+
+ $this->_patchsets = array();
+ foreach ($fileOb->logs as $rev => $log) {
+ $this->_patchsets[$rev] = array();
+ $this->_patchsets[$rev]['date'] = $log->queryDate();
+ $this->_patchsets[$rev]['author'] = $log->queryAuthor();
+ $this->_patchsets[$rev]['branch'] = '';
+ $this->_patchsets[$rev]['tag'] = '';
+ $this->_patchsets[$rev]['log'] = $log->queryLog();
+ $this->_patchsets[$rev]['members'] = array();
+ foreach ($log->files as $file) {
+ $action = substr($file, 0, 1);
+ $file = preg_replace('/.*?\s(.*?)(\s|$).*/', '\\1', $file);
+ $to = $rev;
+ if ($action == 'A') {
+ $from = 'INITIAL';
+ } elseif ($action == 'D') {
+ $from = $to;
+ $to = '(DEAD)';
+ } else {
+ // This technically isn't the previous revision,
+ // but it works for diffing purposes.
+ $from = $to - 1;
+ }
+
+ $this->_patchsets[$rev]['members'][] = array('file' => $file,
+ 'from' => $from,
+ 'to' => $to);
+ }
+ }
+
+ return true;
+ }
+
+}
+
+class Horde_VC_Revision_svn extends Horde_VC_Revision_rcs {}
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<package packagerversion="1.4.9" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0
+http://pear.php.net/dtd/tasks-1.0.xsd
+http://pear.php.net/dtd/package-2.0
+http://pear.php.net/dtd/package-2.0.xsd">
+ <name>Horde_VC</name>
+ <channel>pear.horde.org</channel>
+ <summary>Version Control API</summary>
+ <description>The Horde_VC package provides a generalized API to multiple
+ version control systems.
+ </description>
+ <lead>
+ <name>Chuck Hagenbuch</name>
+ <user>chuck</user>
+ <email>chuck@horde.org</email>
+ <active>yes</active>
+ </lead>
+ <lead>
+ <name>Jan Schneider</name>
+ <user>jan</user>
+ <email>jan@horde.org</email>
+ <active>yes</active>
+ </lead>
+ <lead>
+ <name>Michael Slusarz</name>
+ <user>slusarz</user>
+ <email>slusarz@horde.org</email>
+ <active>yes</active>
+ </lead>
+ <date>2008-12-20</date>
+ <version>
+ <release>0.1.0</release>
+ <api>0.1.0</api>
+ </version>
+ <stability>
+ <release>beta</release>
+ <api>beta</api>
+ </stability>
+ <license uri="http://www.gnu.org/copyleft/lesser.html">LGPL</license>
+ <notes>* Initial Horde 4 package.</notes>
+ <contents>
+ <dir name="/">
+ <dir name="lib">
+ <dir name="Horde">
+ <dir name="VC">
+ <file name="cvs.php" role="php" />
+ <file name="Exception.php" role="php" />
+ <file name="git.php" role="php" />
+ <file name="rcs.php" role="php" />
+ <file name="svn.php" role="php" />
+ </dir> <!-- /lib/Horde/VC -->
+ <file name="VC.php" role="php" />
+ </dir> <!-- /lib/Horde -->
+ </dir> <!-- /lib -->
+ </dir> <!-- / -->
+ </contents>
+ <dependencies>
+ <required>
+ <php>
+ <min>5.2.0</min>
+ </php>
+ <pearinstaller>
+ <min>1.5.0</min>
+ </pearinstaller>
+ <package>
+ <name>Util</name>
+ <channel>pear.horde.org</channel>
+ </package>
+ <extension>
+ <name>pcre</name>
+ </extension>
+ </required>
+ <optional>
+ <package>
+ <name>Horde_Cache</name>
+ <channel>pear.horde.org</channel>
+ </package>
+ </optional>
+ </dependencies>
+ <phprelease>
+ <filelist>
+ <install name="lib/Horde/VC/cvs.php" as="Horde/VC/cvs.php" />
+ <install name="lib/Horde/VC/Exception.php" as="Horde/VC/Exception.php" />
+ <install name="lib/Horde/VC/git.php" as="Horde/VC/git.php" />
+ <install name="lib/Horde/VC/rcs.php" as="Horde/VC/rcs.php" />
+ <install name="lib/Horde/VC/svn.php" as="Horde/VC/svn.php" />
+ <install name="lib/Horde/VC.php" as="Horde/VC.php" />
+ </filelist>
+ </phprelease>
+ <changelog>
+ <release>
+ <version>
+ <release>0.0.4</release>
+ <api>0.0.4</api>
+ </version>
+ <stability>
+ <release>beta</release>
+ <api>beta</api>
+ </stability>
+ <date>2006-05-08</date>
+ <license uri="http://www.gnu.org/copyleft/lesser.html">LGPL</license>
+ <notes>* Converted to package.xml 2.0 for pear.horde.org
+* Fix subversion diffs on files with spaces (helly@php.net, Bug #5244)
+* Pass username and password to the SVN client if set (duck@obala.net, Request #5958)
+ </notes>
+ </release>
+ <release>
+ <version>
+ <release>0.0.3</release>
+ <api>0.0.3</api>
+ </version>
+ <stability>
+ <release>beta</release>
+ <api>beta</api>
+ </stability>
+ <date>2004-01-01</date>
+ <license uri="http://www.gnu.org/copyleft/lesser.html">LGPL</license>
+ <notes>- Fix caching of Patchset objects.
+- Add a VC_Patchset parent class for common Patchset functionality.
+ </notes>
+ </release>
+ </changelog>
+</package>