Ar, cant be bothered to fix it too much :)
cut&pasted below.

Watch the line breaks input by email.

Script 1 does the updates
No error protection/recovery (hasnt thrown any errors anyway!) - I
suspended the system it was running on last night (forgot about it! - it
continued again fine when resumed without a problem :)
I got carried away chomp'ing, could be better done.
Change paths to suit your system
This was proof of concept - now I know it works, 
I want to use LWN instead of curl, 
thread it for 6 or so concurrent threads
add error protection

script2 generates a symlinked directory based on an original which is
left unchanged.  Can take a few hours to run, but it was dealing with 3
plus gbytes of files and could be better optimised. Once generated, sync
to the FR using rsync over wlan



BillK

On Tue, 2009-01-20 at 09:16 +0200, Risto H. Kurppa wrote:
> On Tue, Jan 20, 2009 at 1:20 AM, William Kenworthy <[email protected]> wrote:
...
> 
> Could you please share your perl script to update the maps on the
> desktop, that's exactly what I'd like after I noticed how long it will
> take. On desktop people usually have more online time, more power and
> better connection than on Freerunner.
> ...
> 
___________________________________________
Script 1
#!/usr/bin/perl -w

use strict;
use File::Basename;
use File::Copy;

my $MD5SUM="/usr/bin/md5sum -b ";
my $tiles="http://tile.openstreetmap.org/";;
my $OSM="/home/wdk/Maps/OSM/";
my $curl='/usr/bin/curl -I ';
my $find='/usr/bin/find /home/wdk/Maps/OSM -name \*.png';

print "Finding files\n";
my @ALLfiles=`$find`;

my $tmp = $#ALLfiles; print "$tmp\n"; # number of files found

foreach my $LOCfile (@ALLfiles) {
        chomp($LOCfile);
        my $md5sum  =`$MD5SUM $LOCfile`; $md5sum=~s/ .*$//; chomp($md5sum); # 
clean
        print "$LOCfile :: $md5sum\n";
        my $OSMfile = $LOCfile; $OSMfile=~s!$OSM!$tiles!; # swap paths from 
local to http
        my $OSMmd5sum = `$curl $OSMfile \| grep ETag \| cut \-d \"\\"\" \-f 2`; 
chomp($OSMmd5sum);
        print "$OSMfile :: $OSMmd5sum\n";
        if ($md5sum ne $OSMmd5sum) {
                print "$md5sum != $OSMmd5sum\n";
                print `wget $OSMfile` . "\n";
                my $basename = basename $LOCfile;
                print move($basename, $LOCfile);
        }
        print "\n\n";
}

print "Files: $tmp\n";

___________________________________________

Script2
#!/usr/bin/perl -w

# symlinks identical OSM png files in a directory structure
# 1. load all png files into an array
# 2. load all directories into an array
# 3. use 2 to create a parralel tree
# 4. One file in 1. at a time:
#       4.1 create an MD5 hash for the file
#       4.2 check hash store of md5sums for an identical hash
#               4.2.1 if a match, create a symlink in the new tree
#               4.2.2 if *NOT* a match, copy file and add to hash store


use strict;
use File::Path;
use File::Copy;

my $MD5SUM='/usr/bin/md5sum -b';
my @ALLfiles=`find /home/wdk/Maps/OSM/ -name \*.png`;
my @ALLdirs=`find /home/wdk/Maps/OSM/ -type d`;
my %Ufiles;

&DirStruc; ## create tree

foreach my $item (@ALLfiles) {
        chomp(my $TmpHash = `$MD5SUM $item`);
        $TmpHash =~ s/ .*$//; # md5sum returns the md5hash AND the file name
        
        ## if file exists in the hash make a symlink in the new tree to its 
master
        ## else add to hash and copy file to new tree
        if (exists $Ufiles{$TmpHash}) {
                # extract value
                my $LinkTo = $Ufiles{$TmpHash};
                &MakeLink($LinkTo, $item);
        } else {
                &AddHash($TmpHash, $item);
        }
}

print "\n\nNumber of png files: " . ($#ALLfiles + 1) . "\n";

my $tmp=keys %Ufiles;print "Number of unique files: " . $tmp . "\n";



sub DirStruc {
        foreach my $dir (@ALLdirs) {
                $dir =~ s/OSM/OSM-new/;
                chomp($dir);
                eval { mkpath($dir) }; if ($@) { print "Couldn't create $dir: 
$@"; }
        }
}

sub MakeLink {
        my @tmp = @_;
        chomp(@tmp);
        $tmp[1] =~ s/OSM/OSM-new/;
        eval { symlink($tmp[0], $tmp[1]) }; if ($@) { print "Couldn't create 
symlink: $@"; }
        print "x";
}

sub AddHash {
        my @tmp = @_;
        chomp($tmp[1]);
        $tmp[2] = $tmp[1];
        $tmp[2] =~ s/OSM/OSM-new/;
        eval { copy($tmp[1], $tmp[2]) or die "File $tmp[1] cannot be copied to 
$tmp[2]." };
        $Ufiles{$tmp[0]}=$tmp[2]; ## add to hash as new file
        print ".";
}







_______________________________________________
Openmoko community mailing list
[email protected]
http://lists.openmoko.org/mailman/listinfo/community

Reply via email to