forked from qt-creator/qt-creator
Tests: Allow removal of objects on the fly
Add another option to allow deletion of unused objects on the fly. This option should be used with care. It is recommended to run without -d (or --delete) beforehand and check the results. Anyhow, when deletion is wanted it processes as usual, renames the original objects.map to objects.map~ and recreates the objects.map without the objects that could be deleted. Change-Id: I3898e8b9998e33461140bf4c75887a32d106f22c Reviewed-by: Robert Loehning <robert.loehning@qt.io>
This commit is contained in:
@@ -38,11 +38,13 @@ lastToken = [None, None]
|
||||
stopTokens = ('OP', 'NAME', 'NUMBER', 'ENDMARKER')
|
||||
|
||||
def parseCommandLine():
|
||||
global directory, onlyRemovable, sharedFolders
|
||||
global directory, onlyRemovable, sharedFolders, deleteObjects
|
||||
parser = OptionParser("\n%prog [OPTIONS] [DIRECTORY]")
|
||||
parser.add_option("-o", "--only-removable", dest="onlyRemovable",
|
||||
action="store_true", default=False,
|
||||
help="list removable objects only")
|
||||
parser.add_option("-d", "--delete", dest="delete",
|
||||
action="store_true", default=False)
|
||||
parser.add_option("-s", dest="sharedFolders",
|
||||
action="store", type="string", default="",
|
||||
help="comma-separated list of shared folders")
|
||||
@@ -56,6 +58,7 @@ def parseCommandLine():
|
||||
parser.print_help()
|
||||
sys.exit(1)
|
||||
onlyRemovable = options.onlyRemovable
|
||||
deleteObjects = options.delete
|
||||
sharedFolders = map(os.path.abspath, options.sharedFolders.split(','))
|
||||
|
||||
def collectObjects():
|
||||
@@ -153,15 +156,53 @@ def printResult():
|
||||
print
|
||||
return None
|
||||
|
||||
def main():
|
||||
def deleteRemovable():
|
||||
global useCounts, objMap
|
||||
|
||||
deletable = filter(lambda x: useCounts[x] == 0, useCounts)
|
||||
if len(deletable) == 0:
|
||||
print("Nothing to delete - leaving objects.map untouched")
|
||||
return
|
||||
|
||||
data = ''
|
||||
with open(objMap, "r") as objMapFile:
|
||||
data = objMapFile.read()
|
||||
|
||||
objMapBackup = objMap + '~'
|
||||
if os.path.exists(objMapBackup):
|
||||
os.unlink(objMapBackup)
|
||||
os.rename(objMap, objMapBackup)
|
||||
|
||||
count = 0
|
||||
with open(objMap, "w") as objMapFile:
|
||||
for line in data.splitlines():
|
||||
try:
|
||||
obj = line.split('\t')[0]
|
||||
if obj in deletable:
|
||||
count += 1
|
||||
continue
|
||||
objMapFile.write(line + '\n')
|
||||
except:
|
||||
print("Something's wrong in line '%s'" % line)
|
||||
|
||||
print("Deleted %d items, old objects.map has been moved to objects.map~" % count)
|
||||
return count > 0
|
||||
|
||||
def main():
|
||||
global useCounts, objMap, deleteObjects
|
||||
objMap = checkDirectory(directory)
|
||||
useCounts = dict.fromkeys(collectObjects(), 0)
|
||||
findUsages()
|
||||
atLeastOneRemovable = printResult()
|
||||
deletedAtLeastOne = deleteObjects and deleteRemovable()
|
||||
|
||||
mssg = None
|
||||
if atLeastOneRemovable:
|
||||
print "\nAfter removing the listed objects you should re-run this tool"
|
||||
print "to find objects that might have been used only by these objects.\n"
|
||||
mssg = "\nAfter removing the listed objects you should re-run this tool\n"
|
||||
if deletedAtLeastOne:
|
||||
mssg = "\nYou should re-run this tool\n"
|
||||
if mssg:
|
||||
print(mssg + "to find objects that might have been referenced only by removed objects.\n")
|
||||
return 0
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
Reference in New Issue
Block a user