diff options
Diffstat (limited to 'vendor/sabre/vobject/bin/mergeduplicates.php')
-rw-r--r-- | vendor/sabre/vobject/bin/mergeduplicates.php | 100 |
1 files changed, 62 insertions, 38 deletions
diff --git a/vendor/sabre/vobject/bin/mergeduplicates.php b/vendor/sabre/vobject/bin/mergeduplicates.php index e6cde73dd..076524d36 100644 --- a/vendor/sabre/vobject/bin/mergeduplicates.php +++ b/vendor/sabre/vobject/bin/mergeduplicates.php @@ -6,8 +6,8 @@ namespace Sabre\VObject; // This sucks.. we have to try to find the composer autoloader. But chances // are, we can't find it this way. So we'll do our bestest $paths = [ - __DIR__.'/../vendor/autoload.php', // In case vobject is cloned directly - __DIR__.'/../../../autoload.php', // In case vobject is a composer dependency. + __DIR__ . '/../vendor/autoload.php', // In case vobject is cloned directly + __DIR__ . '/../../../autoload.php', // In case vobject is a composer dependency. ]; foreach ($paths as $path) { @@ -22,12 +22,14 @@ if (!class_exists('Sabre\\VObject\\Version')) { die(1); } -echo 'sabre/vobject ', Version::VERSION, " duplicate contact merge tool\n"; +echo "sabre/vobject ", Version::VERSION, " duplicate contact merge tool\n"; if ($argc < 3) { + echo "\n"; - echo 'Usage: ', $argv[0], " input.vcf output.vcf [debug.log]\n"; + echo "Usage: ", $argv[0], " input.vcf output.vcf [debug.log]\n"; die(1); + } $input = fopen($argv[1], 'r'); @@ -40,72 +42,83 @@ $splitter = new Splitter\VCard($input); // but not in others, we don't consider them for the sake of finding // differences. $ignoredProperties = [ - 'PRODID', - 'VERSION', - 'REV', - 'UID', - 'X-ABLABEL', + "PRODID", + "VERSION", + "REV", + "UID", + "X-ABLABEL", ]; + $collectedNames = []; $stats = [ - 'Total vcards' => 0, - 'No FN property' => 0, - 'Ignored duplicates' => 0, - 'Merged values' => 0, - 'Error' => 0, - 'Unique cards' => 0, - 'Total written' => 0, + "Total vcards" => 0, + "No FN property" => 0, + "Ignored duplicates" => 0, + "Merged values" => 0, + "Error" => 0, + "Unique cards" => 0, + "Total written" => 0, ]; -function writeStats() -{ +function writeStats() { + global $stats; foreach ($stats as $name => $value) { - echo str_pad($name, 23, ' ', STR_PAD_RIGHT), str_pad($value, 6, ' ', STR_PAD_LEFT), "\n"; + echo str_pad($name, 23, " ", STR_PAD_RIGHT), str_pad($value, 6, " ", STR_PAD_LEFT), "\n"; } // Moving cursor back a few lines. - echo "\033[".count($stats).'A'; + echo "\033[" . count($stats) . "A"; + } -function write($vcard) -{ +function write($vcard) { + global $stats, $output; - ++$stats['Total written']; - fwrite($output, $vcard->serialize()."\n"); + $stats["Total written"]++; + fwrite($output, $vcard->serialize() . "\n"); + } while ($vcard = $splitter->getNext()) { - ++$stats['Total vcards']; + + $stats["Total vcards"]++; writeStats(); - $fn = isset($vcard->FN) ? (string) $vcard->FN : null; + $fn = isset($vcard->FN) ? (string)$vcard->FN : null; if (empty($fn)) { + // Immediately write this vcard, we don't compare it. - ++$stats['No FN property']; - ++$stats['Unique cards']; + $stats["No FN property"]++; + $stats['Unique cards']++; write($vcard); $vcard->destroy(); continue; + } if (!isset($collectedNames[$fn])) { + $collectedNames[$fn] = $vcard; - ++$stats['Unique cards']; + $stats['Unique cards']++; continue; + } else { + // Starting comparison for all properties. We only check if properties // in the current vcard exactly appear in the earlier vcard as well. foreach ($vcard->children() as $newProp) { + if (in_array($newProp->name, $ignoredProperties)) { // We don't care about properties such as UID and REV. continue; } $ok = false; foreach ($collectedNames[$fn]->select($newProp->name) as $compareProp) { + if ($compareProp->serialize() === $newProp->serialize()) { $ok = true; break; @@ -113,11 +126,14 @@ while ($vcard = $splitter->getNext()) { } if (!$ok) { - if ('EMAIL' === $newProp->name || 'TEL' === $newProp->name) { + + if ($newProp->name === 'EMAIL' || $newProp->name === 'TEL') { + // We're going to make another attempt to find this // property, this time just by value. If we find it, we // consider it a success. foreach ($collectedNames[$fn]->select($newProp->name) as $compareProp) { + if ($compareProp->getValue() === $newProp->getValue()) { $ok = true; break; @@ -125,36 +141,44 @@ while ($vcard = $splitter->getNext()) { } if (!$ok) { + // Merging the new value in the old vcard. $collectedNames[$fn]->add(clone $newProp); $ok = true; - ++$stats['Merged values']; + $stats['Merged values']++; + } + } + } if (!$ok) { - // echo $newProp->serialize() . " does not appear in earlier vcard!\n"; - ++$stats['Error']; - if ($debug) { - fwrite($debug, "Missing '".$newProp->name."' property in duplicate. Earlier vcard:\n".$collectedNames[$fn]->serialize()."\n\nLater:\n".$vcard->serialize()."\n\n"); - } + // echo $newProp->serialize() . " does not appear in earlier vcard!\n"; + $stats['Error']++; + if ($debug) fwrite($debug, "Missing '" . $newProp->name . "' property in duplicate. Earlier vcard:\n" . $collectedNames[$fn]->serialize() . "\n\nLater:\n" . $vcard->serialize() . "\n\n"); + $vcard->destroy(); continue 2; } + } + } $vcard->destroy(); - ++$stats['Ignored duplicates']; + $stats['Ignored duplicates']++; + } foreach ($collectedNames as $vcard) { + // Overwriting any old PRODID - $vcard->PRODID = '-//Sabre//Sabre VObject '.Version::VERSION.'//EN'; + $vcard->PRODID = '-//Sabre//Sabre VObject ' . Version::VERSION . '//EN'; write($vcard); writeStats(); + } echo str_repeat("\n", count($stats)), "\nDone.\n"; |