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