#!/usr/bin/python -O
# Copyright 1999-2006 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Id$

from __future__ import print_function

import sys, errno
try:
	import portage
except ImportError:
	from os import path as osp
	sys.path.insert(0, osp.join(osp.dirname(osp.dirname(osp.realpath(__file__))), "pym"))
	import portage

from portage import os

if not sys.argv[1:] or "--help" in sys.argv or "-h" in sys.argv:
	import portage
	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)
