#!/usr/bin/env python
# Copyright 1999-2021 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

import errno
import sys
from os import path as osp

if osp.isfile(
    osp.join(osp.dirname(osp.dirname(osp.realpath(__file__))), ".portage_not_installed")
):
    sys.path.insert(
        0, osp.join(osp.dirname(osp.dirname(osp.realpath(__file__))), "lib")
    )
import portage

portage._internal_caller = True

if not sys.argv[1:] or "--help" in sys.argv or "-h" in sys.argv:
    print()
    print("You must specify directories with hardlink-locks to clean.")
    print("You may optionally specify --force, which will remove all")
    print("of the locks, even if we can't establish if they are in use.")
    print("Please attempt cleaning without force first.")
    print()
    print("%s %s/.locks" % (sys.argv[0], portage.settings["DISTDIR"]))
    print("%s --force %s/.locks" % (sys.argv[0], portage.settings["DISTDIR"]))
    print()
    sys.exit(1)

force = False
if "--force" in sys.argv[1:]:
    force = True

for x in sys.argv[1:]:
    if x == "--force":
        continue
    try:
        for y in portage.locks.hardlock_cleanup(x, remove_all_locks=force):
            print(y)
        print()

    except OSError as e:
        if e.errno in (errno.ENOENT, errno.ENOTDIR):
            print("!!! %s is not a directory or does not exist" % x)
        else:
            raise
        sys.exit(e.errno)
