Beispiel #1
0
def migrate(command_relevants):
    """Move a file not managed with dotlink to the dotlink directory"""

    dotlink_dir = get_dotlink_dir()

    # Path of file to be moved to dotlink directory
    src = to_specific_path(command_relevants["<src>"])

    # Will create error if dotlink_dir/dest does not exist by default
    dest = os.path.join(dotlink_dir, command_relevants["<dest>"] or os.path.basename(src))

    # Docopt like options passed to link command
    options = {
            "<target>": dest,
            "<link_name>": src,
            "-s": command_relevants["-s"]
        }

    with open(os.path.join(dotlink_dir, "dotlinks.json"), "r") as f:
        dotlinks = json.load(f)

    # If file is already a link under a target
    if to_generic_home_path(src) in map(lambda x: x["link_name"], dotlinks.values()):
        print("dotlink: File", src, "already linked with dotlink, cannot migrate")
        sys.exit()
    elif os.path.exists(src):
        shutil.move(src, dest)
        link(options)
    else:
        print("dotlink:" + src + ": No such file or directory")
        sys.exit()
Beispiel #2
0
def rmlink(command_relevants):
    """Remove the link of a file in the dotlink directory"""

    link_name = to_specific_path(command_relevants["<link_name>"])
    dotlink_dir = get_dotlink_dir()

    with open(os.path.join(dotlink_dir, "dotlinks.json"), "r") as f:
        dotlinks = json.load(f)
        new_dotlinks = dotlinks.copy()

    # Only remove the dotlink in dotlinks.json and the link file if possible, otherwise just remove the record
    if to_generic_home_path(link_name) in map(lambda x: x["link_name"], dotlinks.values()):
        if os.path.exists(link_name):
            try:
                os.remove(link_name)
            except OSError as e:
                print("dotlink:", e)
                print("dotlink: Proceeding to remove link in dotlinks.json")
        else:
            print("dotlink:", link_name, ": No such file or directory" 
                  "\nOnly removing link records in", os.path.join(dotlink_dir, "dotlinks.json"))

        for x in dotlinks.items():
            if x[1]["link_name"] == to_generic_home_path(link_name):
                new_dotlinks.pop(x[0], None)

        with open(os.path.join(dotlink_dir, "dotlinks.json"), "w") as f:
            json.dump(new_dotlinks, f)
    else:
        print("dotlink: Unable to remove link: Link not found in", 
              os.path.join(dotlink_dir, "dotlinks.json"), "under any targets")
Beispiel #3
0
def get_dotlink_dir():
    dotlinkrc = get_dotlinkrc()

    if not os.path.exists(dotlinkrc):
        print("dotlink: Cannot find dotfiles directory because $HOME/.dotlinkrc does not exist")
        sys.exit()

    with open(dotlinkrc, "r") as f:
        r = re.compile(r"^dotlink_dir(\s)?=(\s)?(?P<dir>.+)")

        for line in f:
            if r.match(line):
               dotlink_dir = to_specific_path(r.match(line).group("dir"))
    return dotlink_dir
Beispiel #4
0
def link(command_relevants):
    """Link a file in the dotlink directory to a location on the filesystem""" 

    # File in dotlink dir
    target = command_relevants["<target>"]

    # File to link to
    link_name = to_specific_path(command_relevants["<link_name>"])

    symbolic = command_relevants["-s"] 

    dotlink_dir = get_dotlink_dir()
    target_path = os.path.join(dotlink_dir, target)

    with open(os.path.join(dotlink_dir, "dotlinks.json"), "r") as f:
        dotlinks = json.load(f) 

    # Set target path relative to dotlink dir (probably the basename) in dotlink dir
    dotlinks[os.path.relpath(target_path, start=dotlink_dir)] = {
            "link_name": to_generic_home_path(link_name), 
            "symbolic": symbolic
        }

    # Will not symlink if path does not exist (does not conform to ln commmand)
    if symbolic:
        if not os.path.exists(target_path):
            print("dotlink:", target_path, ": No such file or directory")
            print("dotlink: Cannot symlink to a file that does not exist")
            sys.exit()

        try:
            os.symlink(os.path.expandvars(target_path), link_name)
        except OSError as e:
            print("dotlink:", e)
            print("dotlink: Symlink not created")
        else:
            with open(os.path.join(dotlink_dir, "dotlinks.json"), "w") as f:
                json.dump(dotlinks, f)
    else:
        try:
            os.link(os.path.expandvars(target_path), link_name)
        except OSError as e:
            print("dotlink:", e)
            print("dotlink: Link not created")
        else:
            with open(os.path.join(dotlink_dir, "dotlinks.json"), "w") as f:
                json.dump(dotlinks, f)
Beispiel #5
0
def init(command_relevants):
    """Initialize a dotlink directory"""
    
    # Location of dotlink directory
    path = to_specific_path(command_relevants["<path>"] or ".")
    
    # Location of dotlinks.json
    json_path = os.path.join(path, "dotlinks.json")
    
    # Location of .dotlinkrc
    dotlinkrc = os.path.join(os.environ["HOME"], ".dotlinkrc")

    # If directory exists, nothing happens to it
    os.makedirs(path, exist_ok=True)

    # Don't want to overwrite file if it already has links
    if not os.path.exists(json_path):
        with open(json_path, "w") as f:
            json.dump({}, f)
    
    # Identify location of dotlink dir
    # Will have to change once more can be added to dotlinkrc
    with open(dotlinkrc, "w") as f:
        f.write("dotlink_dir = " + to_generic_home_path(path))