Subversion-Projekte lars-tiefland.php_share

Revision

Details | Letzte Änderung | Log anzeigen | RSS feed

Revision Autor Zeilennr. Zeile
1 lars 1
<?php
2
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
3
 
4
/**
5
 * Evaluates to true if a for the files for which a newer version
6
 * can be found in a specified archive
7
 * Comparison is by default made on dates of the files, or position
8
 * in the archive (if two files have the same date or the date of a
9
 * file is not specified).
10
 *
11
 * PHP versions 4 and 5
12
 *
13
 * This library is free software; you can redistribute it and/or
14
 * modify it under the terms of the GNU Lesser General Public
15
 * License as published by the Free Software Foundation; either
16
 * version 2.1 of the License, or (at your option) any later version.
17
 *
18
 * This library is distributed in the hope that it will be useful,
19
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21
 * Lesser General Public License for more details.
22
 *
23
 * You should have received a copy of the GNU Lesser General Public
24
 * License along with this library; if not, write to the Free Software
25
 * Foundation, Inc., 59 Temple Place, Suite 330,Boston,MA 02111-1307 USA
26
 *
27
 * @category   File Formats
28
 * @package    File_Archive
29
 * @author     Vincent Lascaux <vincentlascaux@php.net>
30
 * @copyright  1997-2005 The PHP Group
31
 * @license    http://www.gnu.org/copyleft/lesser.html  LGPL
32
 * @version    CVS: $Id: Duplicate.php,v 1.1 2005/05/30 17:18:11 vincentlascaux Exp $
33
 * @link       http://pear.php.net/package/File_Archive
34
 */
35
 
36
require_once "File/Archive/Predicate.php";
37
 
38
/**
39
 * Evaluates to true if a for the files for which a newer version
40
 * can be found in a specified archive
41
 * Comparison is by default made on dates of the files, or position
42
 * in the archive (if two files have the same date or the date of a
43
 * file is not specified).
44
 */
45
class File_Archive_Predicate_Duplicate extends File_Archive_Predicate
46
{
47
    /**
48
     * @var array Key is the filename, value is an array of date (index 0) and
49
     *      position in the archive (index) 1 of the newest entry with this filename
50
     */
51
    var $newest = array();
52
 
53
    /**
54
     * @var int The current position of the file in the source
55
     */
56
    var $pos = 0;
57
 
58
    /**
59
     * @param File_Archive_Reader $source The source will be inspected to find
60
     *        the date of old files
61
     *        The predicate should then be used on the same source to remove the
62
     *        old duplicate files
63
     */
64
    function File_Archive_Predicate_Duplicate(&$source)
65
    {
66
        //Ensure we are at the begining of the file
67
        $source->close();
68
        $pos = 0;
69
        while ($source->next()) {
70
            $filename = $source->getFilename();
71
            $stat = $source->getStat();
72
            $value = isset($this->newest[$filename]) ? $this->newest[$filename] : null;
73
 
74
            if ($value === null ||
75
                $this->compare($stat[9], $value[0]) >= 0
76
               ) {
77
                $this->newest[$filename] = array($stat[9], $pos);
78
            }
79
            $pos++;
80
        }
81
    }
82
 
83
    /**
84
     * Compare the dates of two files. null is considered infinitely old
85
     *
86
     * @return int < 0 if $a can be considered older than $b
87
     *             = 0 if $a and $b can be considered same age
88
     *             > 0 if $a can be considered newer than $b
89
     */
90
    function compare($a, $b) {
91
        return ($a === null ? -1 : $a) - ($b === null ? -1 : $b);
92
    }
93
 
94
    /**
95
     * @see File_Archive_Predicate::isTrue()
96
     */
97
    function isTrue(&$source)
98
    {
99
        $filename = $source->getFilename();
100
        $stat = $source->getStat();
101
        $value = isset($this->newest[$filename]) ? $this->newest[$filename] : null;
102
        if ($value === null) {
103
            $delete = false;
104
        } else {
105
            $comp = $this->compare($stat[9], $value[0]);
106
 
107
            $delete = $comp < 0 ||
108
                  ($comp == 0 && $this->pos != $value[1]);
109
 
110
        }
111
        $this->pos++;
112
        return $delete;
113
    }
114
}
115
 
116
?>