summaryrefslogtreecommitdiff
path: root/bin/checklinks
blob: 2f03551c71fba38ded8f16a303a5f85d106e2381 (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
#!/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";
}