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
|
#!/usr/bin/env perl
use strict;
use warnings;
use Term::ANSIColor;
my $base = $ENV{HOME};
my ($type, $src, $dst);
my $quiet = 0;
unless (-f ".links") {
exit 0;
}
if (defined($ARGV[0]) and $ARGV[0] eq '-q') {
$quiet = 1;
}
open(LINKS, '<.links') or die($!);
while(<LINKS>) {
chomp;
($type, $src, $dst) = split(/ +/);
if ($type eq 'soft') {
check_symlink($src, $dst);
} elsif ($type eq 'hard') {
check_hardlink($src, $dst);
}
}
close(LINKS);
sub check_symlink {
my $src = shift;
my $dst = shift;
#if (not -e "$base/$dst") {
# print_format('no dst!!', $src, $dst, 'red bold');
#}
if (not -l "$base/$src" and not -e "$base/$src") {
symlink($dst, "$base/$src");
print_format('created', $src, $dst, 'cyan');
}
elsif (readlink("$base/$src") eq $dst) {
print_format('ok', $src, $dst, 'green') unless ($quiet);
}
elsif (readlink("$base/$src") eq "$base/$dst") {
print_format('absolute', $src, $dst, 'yellow') unless ($quiet);
}
elsif (not -l "$base/$src" and -e "$base/$src") {
print colored ("$base/$src: File exists but is not a symlink. Not updating.\n", 'bold red');
}
elsif (-l "$base/$src") {
unlink("$base/$src");
symlink($dst, "$base/$src");
print_format('fixed', $src, $dst, 'cyan');
}
}
sub check_hardlink {
my $src = shift;
my $dst = shift;
if (not -e "$base/$dst") {
print_format('no dst!!', $src, $dst, 'red bold');
}
elsif (not -f "$base/$src") {
link("$base/$dst", "$base/$src") or warn($!);
print_format('created', $src, $dst, 'cyan');
}
elsif ((stat("$base/$src"))[1] != (stat("$base/$dst"))[1]) {
unlink("$base/$src");
link("$base/$dst", "$base/$src") or warn($!);
print_format('updated', $src, $dst, 'cyan');
}
elsif ((stat("$base/$src"))[1] == (stat("$base/$dst"))[1]) {
print_format('ok', $src, $dst, 'green') unless ($quiet);
}
}
sub print_format {
my ($message, $src, $dst, $color) = @_;
$message .= ' 'x(9-length($message));
$src .= ' 'x(15-length($src));
$dst .= ' 'x(15-length($dst));
if (defined($color)) {
print colored ($message, $color);
} else {
print $message;
}
print "$src -> $dst\n";
}
|