--- /dev/null
+<?php
+/*
+ * Copyright (C) 2003-2004 Polytechnique.org
+ * http://opensource.polytechnique.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+/** This class handles Diogenes spool operations.
+ */
+class Diogenes_VCS_Spool {
+ /** The barrel we are running on */
+ var $alias;
+ /** Absolute directory location for the barrel's spool. */
+ var $datadir;
+
+ /** The last command that was executed. */
+ var $cmd_call;
+
+ /** The output of the last command that was executed. */
+ var $cmd_output;
+
+ /** The return value of the last command. */
+ var $cmd_return;
+
+ /** The caller. It needs to define the 3 following methods :
+ *
+ * @see info, kill, log
+ */
+ var $caller;
+
+ /** The constructor.
+ *
+ * @param caller the caller
+ * @param alias the alias to work on
+ */
+ function Diogenes_VCS_Spool(&$caller,$alias) {
+ global $globals;
+ $this->datadir = "{$globals->spoolroot}/$alias";
+ $this->caller =& $caller;
+ $this->alias = $alias;
+ }
+
+
+ /** Execute a shell command and store information about it.
+ *
+ * @param $cmd the command to execute
+ */
+ function cmdExec($cmd)
+ {
+ $this->cmd_call = $cmd;
+ unset($this->cmd_output);
+ unset($this->cmd_return);
+
+ exec($cmd, $this->cmd_output, $this->cmd_return);
+
+ return $this->cmd_return;
+ }
+
+
+ /** Return information about the last command that was executed.
+ */
+ function cmdStatus()
+ {
+ $out =
+ "-- [ command information ] -- \n".
+ "command : {$this->cmd_call}\n".
+ "return value : {$this->cmd_return}\n".
+ "-- [ command output ] --\n".
+ implode("\n", $this->cmd_output)."\n".
+ "--";
+ return $out;
+ }
+
+
+ /** Report an information.
+ *
+ * @param msg
+ */
+ function info($msg) {
+ $this->caller->info($msg);
+ }
+
+
+ /** Die with a given error message.
+ *
+ * @param msg
+ */
+ function kill($msg) {
+ $this->caller->kill($msg);
+ }
+
+
+ /** Record an action to the log.
+ *
+ * @param action
+ * @param data
+ */
+ function log($action,$data) {
+ $this->caller->log($action, $data);
+ }
+
+
+ /** Check that a path is valid.
+ *
+ * @param parent parent directory
+ * @param entry the item
+ * @param fatal should we consider a failure to be fatal?
+ */
+ function checkPath($parent,$entry,$fatal = true) {
+ $ret = preg_match("/^([a-zA-Z0-9\-_]+[\.,\/]?)*$/",$parent)
+ && preg_match("/^([a-zA-Z0-9\-_]+[\., ]?)*$/",$entry);
+
+ if (!$ret && $fatal)
+ $this->kill("malformed path ('$parent','$entry')");
+
+ return $ret;
+ }
+
+
+ /** Add missing tags to a Diogenes page to make it a proper HTML file
+ *
+ * @param html
+ * @see importHtmlString
+ */
+ function exportHtmlString($html)
+ {
+ // if we have the body open & close tags, return raw file
+ if (preg_match("/<body(\s[^>]*|)>(.*)<\/body>/si",$html))
+ return $html;
+
+ return "<html>\n<head><title>Diogenes page</title></head>\n<body>$html</body>\n</html>\n";
+ }
+
+
+ /** Makes a Diogenes page from a proper HTML file, that is return everything
+ * inside the "body" tags.
+ *
+ * @param html
+ * @see exportHtmlString
+ */
+ function importHtmlString($html)
+ {
+ // If available, run tidy to clean sources
+ if (function_exists('tidy_repair_string')) {
+ $tidy_config = array('drop-empty-paras' => true,
+ 'drop-proprietary-attributes' => true,
+ 'hide-comments' => true,
+ 'logical-emphasis' => true,
+ 'output-xhtml' => true,
+ 'replace-color' => true,
+ 'join-classes' => true,
+ 'join-style' => true,
+ 'clean' => true,
+ 'show-body-only' => true,
+ 'alt-text' => '[ inserted by TIDY ]',
+ 'break-before-br' => true,
+ 'indent' => true,
+ 'vertical-space' => true,
+ 'wrap' => 120);
+ if (function_exists('tidy_setopt')) { // Tidy 1.0
+ foreach ($tidy_config as $field=>$value) {
+ tidy_setopt($field, $value);
+ }
+ $html = tidy_repair_string($html);
+ } else { // Tidy 2.0
+ $html = tidy_repair_string($html, $tidy_config);
+ }
+ }
+
+ // if we cannot find the body open & close tags, return raw file
+ if (!preg_match("/<body(\s[^>]*|)>(.*)<\/body>/si",$html,$matches))
+ return $html;
+
+ return $matches[2];
+ }
+
+
+ /** Return the path of a spool "item" (file or directory).
+ *
+ * @param parent parent directory (optional)
+ * @param entry the item
+ */
+ function spoolPath($parent="",$entry="") {
+ $this->checkPath($parent,$entry);
+ return $this->datadir.($parent ? "/$parent": "") . ($entry ? "/$entry" : "");
+ }
+
+}
+
+?>