Admin/isa-migrate
author haftmann
Mon, 13 Jun 2005 14:35:05 +0200
changeset 16382 4fc8d8c99e9e
parent 16311 d35f37a24e24
child 16404 5f263e81e366
permissions -rw-r--r--
experimental
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
16310
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
     1
#!/usr/bin/env perl
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
     2
#
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
     3
# $Id$
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
     4
# Author: Florian Haftmann, TUM
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
     5
#
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
     6
# A generic framework script for simple theory file migrations
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
     7
# (under developement)
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
     8
#
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
     9
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
    10
use strict;
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
    11
use File::Find;
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
    12
use File::Basename;
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
    13
use File::Copy;
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
    14
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
    15
# configuration
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
    16
my @suffices = ('\.thy');
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
    17
my $backupext = '.bak';
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
    18
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
    19
# migrator lookup hash
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
    20
my %migrators = (
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
    21
    id => sub {
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
    22
        my ($file, @content) = @_;
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
    23
    },
16311
d35f37a24e24 started migration framwork script
haftmann
parents: 16310
diff changeset
    24
    thyheader => sub {
16310
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
    25
        my ($file, @content) = @_;
16311
d35f37a24e24 started migration framwork script
haftmann
parents: 16310
diff changeset
    26
        $_ = join("", @content);
16382
4fc8d8c99e9e experimental
haftmann
parents: 16311
diff changeset
    27
        if (m!^theory!cgoms) {
4fc8d8c99e9e experimental
haftmann
parents: 16311
diff changeset
    28
            my $prelude = $';
4fc8d8c99e9e experimental
haftmann
parents: 16311
diff changeset
    29
            my $thyheader = "theory";
4fc8d8c99e9e experimental
haftmann
parents: 16311
diff changeset
    30
            $thyheader .= skip_wscomment();
4fc8d8c99e9e experimental
haftmann
parents: 16311
diff changeset
    31
            if (m!\G(\S+)!cgoms) {
4fc8d8c99e9e experimental
haftmann
parents: 16311
diff changeset
    32
                $thyheader .= $1;
4fc8d8c99e9e experimental
haftmann
parents: 16311
diff changeset
    33
                $thyheader .= skip_wscomment();
4fc8d8c99e9e experimental
haftmann
parents: 16311
diff changeset
    34
                print "--->\n>>>$thyheader<<<\n<---\n";
4fc8d8c99e9e experimental
haftmann
parents: 16311
diff changeset
    35
                if (m!\G(?:imports|=)!cgoms) {
4fc8d8c99e9e experimental
haftmann
parents: 16311
diff changeset
    36
                    $thyheader .= "imports";
4fc8d8c99e9e experimental
haftmann
parents: 16311
diff changeset
    37
                    $thyheader .= skip_wscomment() || " ";
4fc8d8c99e9e experimental
haftmann
parents: 16311
diff changeset
    38
                    print "--->\n>>>$thyheader<<<\n<---\n";
4fc8d8c99e9e experimental
haftmann
parents: 16311
diff changeset
    39
                    while () {
4fc8d8c99e9e experimental
haftmann
parents: 16311
diff changeset
    40
                        my $str = read_plainstring();
4fc8d8c99e9e experimental
haftmann
parents: 16311
diff changeset
    41
                        print "--->\n>>>$str<<<\n<---\n";
4fc8d8c99e9e experimental
haftmann
parents: 16311
diff changeset
    42
                        if (! $str) {
4fc8d8c99e9e experimental
haftmann
parents: 16311
diff changeset
    43
                            last;
4fc8d8c99e9e experimental
haftmann
parents: 16311
diff changeset
    44
                        }
4fc8d8c99e9e experimental
haftmann
parents: 16311
diff changeset
    45
                        $thyheader .= $str;
4fc8d8c99e9e experimental
haftmann
parents: 16311
diff changeset
    46
                        $thyheader .= skip_wscomment();
4fc8d8c99e9e experimental
haftmann
parents: 16311
diff changeset
    47
                    }
4fc8d8c99e9e experimental
haftmann
parents: 16311
diff changeset
    48
                    #~ print "--->\n>>>$thyheader<<<\n<---\n";
4fc8d8c99e9e experimental
haftmann
parents: 16311
diff changeset
    49
                }
4fc8d8c99e9e experimental
haftmann
parents: 16311
diff changeset
    50
                if (m!\G(?:files|uses)!cgoms) {
4fc8d8c99e9e experimental
haftmann
parents: 16311
diff changeset
    51
                    $thyheader .= "uses";
4fc8d8c99e9e experimental
haftmann
parents: 16311
diff changeset
    52
                    $thyheader .= skip_wscomment();
4fc8d8c99e9e experimental
haftmann
parents: 16311
diff changeset
    53
                    while () {
4fc8d8c99e9e experimental
haftmann
parents: 16311
diff changeset
    54
                        my $str = read_plainstring();
4fc8d8c99e9e experimental
haftmann
parents: 16311
diff changeset
    55
                        if (! $str) {
4fc8d8c99e9e experimental
haftmann
parents: 16311
diff changeset
    56
                            last;
4fc8d8c99e9e experimental
haftmann
parents: 16311
diff changeset
    57
                        }
4fc8d8c99e9e experimental
haftmann
parents: 16311
diff changeset
    58
                        $thyheader .= $str;
4fc8d8c99e9e experimental
haftmann
parents: 16311
diff changeset
    59
                        $thyheader .= skip_wscomment();
4fc8d8c99e9e experimental
haftmann
parents: 16311
diff changeset
    60
                    }
4fc8d8c99e9e experimental
haftmann
parents: 16311
diff changeset
    61
                }
4fc8d8c99e9e experimental
haftmann
parents: 16311
diff changeset
    62
                if (m!\G(?:begin|:)!cgoms) {
4fc8d8c99e9e experimental
haftmann
parents: 16311
diff changeset
    63
                    my $postlude = $';
4fc8d8c99e9e experimental
haftmann
parents: 16311
diff changeset
    64
                    $thyheader .=  "begin";
4fc8d8c99e9e experimental
haftmann
parents: 16311
diff changeset
    65
                    # do replacement here
4fc8d8c99e9e experimental
haftmann
parents: 16311
diff changeset
    66
                    print "$file:\n$thyheader\n\n";
4fc8d8c99e9e experimental
haftmann
parents: 16311
diff changeset
    67
                }
4fc8d8c99e9e experimental
haftmann
parents: 16311
diff changeset
    68
            }
16311
d35f37a24e24 started migration framwork script
haftmann
parents: 16310
diff changeset
    69
        }
16310
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
    70
    }
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
    71
);
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
    72
16311
d35f37a24e24 started migration framwork script
haftmann
parents: 16310
diff changeset
    73
# utility functions
d35f37a24e24 started migration framwork script
haftmann
parents: 16310
diff changeset
    74
sub skip_wscomment {
d35f37a24e24 started migration framwork script
haftmann
parents: 16310
diff changeset
    75
    my $commentlevel = 0;
d35f37a24e24 started migration framwork script
haftmann
parents: 16310
diff changeset
    76
    my @skipped = ();
d35f37a24e24 started migration framwork script
haftmann
parents: 16310
diff changeset
    77
    while () {
d35f37a24e24 started migration framwork script
haftmann
parents: 16310
diff changeset
    78
        if (m!\G\{\*!cgoms) {
d35f37a24e24 started migration framwork script
haftmann
parents: 16310
diff changeset
    79
            push(@skipped, $&);
d35f37a24e24 started migration framwork script
haftmann
parents: 16310
diff changeset
    80
            $commentlevel++;
d35f37a24e24 started migration framwork script
haftmann
parents: 16310
diff changeset
    81
        } elsif ($commentlevel > 0) {
d35f37a24e24 started migration framwork script
haftmann
parents: 16310
diff changeset
    82
            if (m!\G\*\}!cgoms) {
d35f37a24e24 started migration framwork script
haftmann
parents: 16310
diff changeset
    83
                push(@skipped, $&);
d35f37a24e24 started migration framwork script
haftmann
parents: 16310
diff changeset
    84
                $commentlevel--;
d35f37a24e24 started migration framwork script
haftmann
parents: 16310
diff changeset
    85
            } elsif (m!\G(?:
d35f37a24e24 started migration framwork script
haftmann
parents: 16310
diff changeset
    86
                        [^{*]|\*[^{}]|\{[^*]
d35f37a24e24 started migration framwork script
haftmann
parents: 16310
diff changeset
    87
                       )*!cgomsx) {
d35f37a24e24 started migration framwork script
haftmann
parents: 16310
diff changeset
    88
                push(@skipped, $&);
d35f37a24e24 started migration framwork script
haftmann
parents: 16310
diff changeset
    89
            } else {
d35f37a24e24 started migration framwork script
haftmann
parents: 16310
diff changeset
    90
                die ("probably incorrectly nested comment");
d35f37a24e24 started migration framwork script
haftmann
parents: 16310
diff changeset
    91
            }
d35f37a24e24 started migration framwork script
haftmann
parents: 16310
diff changeset
    92
        } elsif (m!\G\s+!cgoms) {
d35f37a24e24 started migration framwork script
haftmann
parents: 16310
diff changeset
    93
            push(@skipped, $&);
d35f37a24e24 started migration framwork script
haftmann
parents: 16310
diff changeset
    94
        } else {
d35f37a24e24 started migration framwork script
haftmann
parents: 16310
diff changeset
    95
            return join('', @skipped);
d35f37a24e24 started migration framwork script
haftmann
parents: 16310
diff changeset
    96
        }
d35f37a24e24 started migration framwork script
haftmann
parents: 16310
diff changeset
    97
    }
d35f37a24e24 started migration framwork script
haftmann
parents: 16310
diff changeset
    98
}
d35f37a24e24 started migration framwork script
haftmann
parents: 16310
diff changeset
    99
16382
4fc8d8c99e9e experimental
haftmann
parents: 16311
diff changeset
   100
sub read_plainstring {
4fc8d8c99e9e experimental
haftmann
parents: 16311
diff changeset
   101
    m!\G("[^"]+"|[^"\s]+)!cgoms or return "";
4fc8d8c99e9e experimental
haftmann
parents: 16311
diff changeset
   102
    return $&;
4fc8d8c99e9e experimental
haftmann
parents: 16311
diff changeset
   103
}
4fc8d8c99e9e experimental
haftmann
parents: 16311
diff changeset
   104
16310
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
   105
# process dir tree
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
   106
sub process_tree {
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
   107
    my ($root, $migrator, $backupext) = @_;
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
   108
    find(sub { process($File::Find::name, $migrator, $backupext) }, $root);
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
   109
}
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
   110
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
   111
# process single file
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
   112
sub process {
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
   113
    my ($file, $migrator, $backupext) = @_;
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
   114
    my ($basename, $dirname, $ext) = fileparse($file, @suffices);
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
   115
    #~ print "$file\n";
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
   116
    if ($ext) {
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
   117
        open ISTREAM, $file or die("error opening $file");
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
   118
        my @content = <ISTREAM>;
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
   119
        close ISTREAM;
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
   120
        if ($backupext) {
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
   121
            copy($file, "$file$backupext");
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
   122
        }
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
   123
        print "Migrating $file...\n";
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
   124
        &$migrator($file, @content);
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
   125
    }
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
   126
}
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
   127
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
   128
# first argument: migrator name
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
   129
my $migrator = $migrators{shift @ARGV};
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
   130
$migrator or die ("invalid migrator name");
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
   131
# other arguments: files or trees
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
   132
foreach my $fileloc (@ARGV) {
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
   133
    -e $fileloc or die ("no file $fileloc");
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
   134
}
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
   135
foreach my $fileloc (@ARGV) {
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
   136
    if (-d $fileloc) {
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
   137
        process_tree($fileloc, $migrator, $backupext);
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
   138
    } else {
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
   139
        process($fileloc, $migrator, $backupext);
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
   140
    }
2115e519e456 added basics for generic migration tool
haftmann
parents:
diff changeset
   141
}