From 7204d908760258b347ab85f453266f1e07d93254 Mon Sep 17 00:00:00 2001
From: Thomas Boettcher <boettcher@rz.rwth-aachen.de>
Date: Mon, 14 Apr 2025 12:14:53 +0200
Subject: [PATCH] adding makelinks

---
 makelinks.py | 109 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 109 insertions(+)
 create mode 100755 makelinks.py

diff --git a/makelinks.py b/makelinks.py
new file mode 100755
index 0000000..5ab6ed9
--- /dev/null
+++ b/makelinks.py
@@ -0,0 +1,109 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# by Thomas Böttcher
+#  boettcher@itc.rwth-aachen.de
+
+version="v0.2014.09"
+
+import os
+import sys
+import socket
+import re
+from optparse import OptionParser
+
+
+def readoptions():
+	parser = OptionParser(usage="usage: %prog [options]", version="%%prog %s" % version)
+	parser.add_option("-i", "--install", action="store_true", dest="work", default=False)
+	opts, args = parser.parse_args()
+	if len(args) > 0:
+		parser.print_help()
+		print
+		sys.exit(1)
+	return opts
+
+
+def filenamefilter(dirname):
+	# filter unlinkable files
+	# separate dirs and files
+	dirlist = os.listdir(dirname)
+	l = [f for f in dirlist if f not in [".git", ".gitignore", os.path.basename(__file__)]]
+	hostbased = [f.group(1) for f in map(lambda x: re.match("^(.+)--.+$", x), l) if f]
+	if hostbased:
+		regex = "^(%s)(--.+)?$" % "|".join(hostbased)
+		l = [f for f in l if not re.match(regex, f) or re.search("--%s$" % socket.gethostname(), f)]
+	d = [d for d in l if os.path.isdir(os.path.join(dirname, d))]
+	f = [f for f in l if os.path.isfile(os.path.join(dirname, f))]
+	return (d,f)
+
+
+def symlink(opts, src, dst):
+	linkname = os.path.join(dst, os.path.split(src)[1])
+	
+	# cut hostname if exists
+	newlinkname = re.match("^(.*)--%s$" % socket.gethostname(), linkname)
+	if newlinkname: linkname = newlinkname.group(1)
+	
+	# check and change path
+	if not os.path.exists(dst):
+		if opts.work: os.makedirs(dst)
+		pass
+	try:
+		os.chdir(dst)
+	except:
+		print "*** could not change dir to: %s" % dst
+		return
+	
+	# check for existing file, dir or link
+	if os.path.islink(linkname):
+		if os.readlink(linkname) == src:
+			print "link ok: %s" % linkname
+			return
+		if opts.work: 
+			try:
+				os.unlink(linkname)
+				print "unlinked: %s" % linkname
+			except:
+				print "*** could not unlink %s" % linkname
+				return
+		else:
+			print "will renew link: %s" % linkname
+			return
+
+	if os.path.exists(linkname):
+		if opts.work: 
+			try:
+				os.rename(linkname, linkname + ".old")
+				print "moved: %s -> %s" % (linkname, linkname + ".old")
+			except:
+				print "*** could not rename: %s" % linkname
+				return
+		else:
+			print "will rename file/dir: %s" % linkname
+	
+	if opts.work: 
+		try:
+			os.symlink(src, linkname)
+			print "%s -> %s" % (linkname, src)
+		except:
+			print "*** could not symlink: %s -> %s" % (linkname, src)
+			return
+	else:
+		print "will symlink: %s -> %s" % (linkname, src)
+	
+
+
+def walk(opts, src, dst):
+	dirs, files = filenamefilter(src)
+	if ".makedirlink" in files:
+		symlink(opts, src, os.path.split(dst)[0])
+		return
+	for d in dirs:
+		walk(opts, os.path.join(src, d), os.path.join(dst, d))
+	for f in files:
+		symlink(opts, os.path.join(src, f), dst)
+	
+
+
+walk(readoptions(), os.path.dirname(os.path.realpath(__file__)), "/")
-- 
GitLab