summaryrefslogtreecommitdiff
path: root/install
blob: 1fdde2dc76d7a15b23443cdf1ced1301653e53b5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#!/usr/bin/env perl

use strict;
use warnings;

use Getopt::Std qw(getopts);

my %opts;
getopts("dm:", \%opts) or usage();

my $mode = $opts{m};

if ($opts{d}) {
    shell("mkdir -p @ARGV");
    exit;
}

if (@ARGV < 2) {
    usage();
}

my $dst = pop;

my @src = @ARGV;

my $target_dir;

if (@src > 1 || $dst =~ m{/$}) {
    $target_dir = $dst;

} elsif (-d $dst) {
    $target_dir = $dst;

} elsif ($dst =~ m{(.+)/}) {
    $target_dir = $1;

} else {
    $target_dir = '.';
}

if (!-d $target_dir) {
    shell("mkdir -p $target_dir");
}

if (-f $dst) {
    shell("rm $dst");

} else {
    for my $f (@src) {
        if (-f $f) {
            (my $name = $f) =~ s{.*/}{}g;
            my $target = "$target_dir/$name";
            if (-f $target) {
                shell("rm $target");
            }
        }
    }
}

shell("cp @src $dst");

if (-f $dst) {
    if (defined $mode) {
        chmod oct($mode), $dst or
            die "failed to change mode of $dst to $mode.\n";
    }

    exit;
}

for my $src (@src) {
    my $name;

    if ($src =~ m{/([^/]+)$}) {
        $name = $1;

    } else {
        $name = $src;
    }

    if (defined $mode) {
        my $target = "$target_dir/$name";
        chmod oct($mode), $target or
            die "failed to change mode of $target to $mode.\n";
    }
}

sub usage {
    die "Usage: install [-d] [-m <attrs>] <src>... <dst>\n";
}

sub shell {
    my $cmd = shift;
    #warn $cmd;
    system($cmd) == 0 or
        die "failed to run command $cmd\n";
}
# dummy commit