From 8a00961524ba5bf2a65eaab1ccc496cf02471280 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?John=20Ankarstr=C3=B6m?= <john@ankarstrom.se>
Date: Tue, 29 Jun 2021 18:39:30 +0200
Subject: Add 're!' utility

---
 re! | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 48 insertions(+)
 create mode 100755 re!

(limited to 're!')

diff --git a/re! b/re!
new file mode 100755
index 0000000..1314ae9
--- /dev/null
+++ b/re!
@@ -0,0 +1,48 @@
+#!/usr/bin/env perl
+
+# re! -- rewrite shebangs
+
+use strict;
+
+my $test = 0;
+sub usage { die "usage: $0 [-n] file ...\n" }
+
+if (@ARGV and $ARGV[0] eq '-n') {
+	$test = 1;
+	shift @ARGV;
+}
+usage if not @ARGV;
+
+for my $file (@ARGV) {
+	open my $o, '<', $file or die "could not open $file: $!\n";
+
+	# parse shebang
+	my $shebang = <$o>;
+	$shebang =~ /^#!/ or die "no shebang: $file\n";
+	$shebang =~ /^#!\s*(\S+)\s*(.*)/;
+	my ($old, $args) = ($1, $2);
+
+	# validate path
+	next if -x $old;
+
+	# get new path
+	(my $basename = $old) =~ s,.*/,,;
+	chomp(my $new = `which $basename`);
+	$new or die "could not find $basename\n";
+	next if $old eq $new;
+
+	# print results if test
+	if ($test) {
+		print "$file: $old -> $new\n";
+		next;
+	}
+
+	# write new shebang
+	open my $n, '>', "$file.tmp" or die "could not open $file.tmp: $!\n";
+	print $n "#!$new $args\n";
+	print $n $_ while <$o>;
+
+	close for ($o, $n);
+	system('mv', "$file.tmp", $file) == 0
+		or die "could not overwrite $file\n";
+}
-- 
cgit v1.2.3