99 lines
1.5 KiB
C
Executable File
99 lines
1.5 KiB
C
Executable File
#!/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";
|
|
}
|
|
|