| # Copyright (c) 2020, 2021 The Linux Foundation | 
 | # | 
 | # SPDX-License-Identifier: Apache-2.0 | 
 |  | 
 | import re | 
 |  | 
 |  | 
 | def getSPDXIDSafeCharacter(c): | 
 |     """ | 
 |     Converts a character to an SPDX-ID-safe character. | 
 |  | 
 |     Arguments: | 
 |         - c: character to test | 
 |     Returns: c if it is SPDX-ID-safe (letter, number, '-' or '.'); | 
 |              '-' otherwise | 
 |     """ | 
 |     if c.isalpha() or c.isdigit() or c == "-" or c == ".": | 
 |         return c | 
 |     return "-" | 
 |  | 
 |  | 
 | def convertToSPDXIDSafe(s): | 
 |     """ | 
 |     Converts a filename or other string to only SPDX-ID-safe characters. | 
 |     Note that a separate check (such as in getUniqueID, below) will need | 
 |     to be used to confirm that this is still a unique identifier, after | 
 |     conversion. | 
 |  | 
 |     Arguments: | 
 |         - s: string to be converted. | 
 |     Returns: string with all non-safe characters replaced with dashes. | 
 |     """ | 
 |     return "".join([getSPDXIDSafeCharacter(c) for c in s]) | 
 |  | 
 |  | 
 | def getUniqueFileID(filenameOnly, timesSeen): | 
 |     """ | 
 |     Find an SPDX ID that is unique among others seen so far. | 
 |  | 
 |     Arguments: | 
 |         - filenameOnly: filename only (directories omitted) seeking ID. | 
 |         - timesSeen: dict of all filename-only to number of times seen. | 
 |     Returns: unique SPDX ID; updates timesSeen to include it. | 
 |     """ | 
 |  | 
 |     converted = convertToSPDXIDSafe(filenameOnly) | 
 |     spdxID = f"SPDXRef-File-{converted}" | 
 |  | 
 |     # determine whether spdxID is unique so far, or not | 
 |     filenameTimesSeen = timesSeen.get(converted, 0) + 1 | 
 |     if filenameTimesSeen > 1: | 
 |         # we'll append the # of times seen to the end | 
 |         spdxID += f"-{filenameTimesSeen}" | 
 |     else: | 
 |         # first time seeing this filename | 
 |         # edge case: if the filename itself ends in "-{number}", then we | 
 |         # need to add a "-1" to it, so that we don't end up overlapping | 
 |         # with an appended number from a similarly-named file. | 
 |         p = re.compile(r"-\d+$") | 
 |         if p.search(converted): | 
 |             spdxID += "-1" | 
 |  | 
 |     timesSeen[converted] = filenameTimesSeen | 
 |     return spdxID |