IsSpecificPath checks whether the input path is a specified string
If it is, the function returns a string array that parsed from the input path
A specified string means we can get a specific string array after parsing it
"library/hello-world" is a specified string as it only matches "library/hello-world"
"library/**" isn't a specified string as it can match all string that starts with "library/"
"library/{test,busybox}" is a specified string as it only matches "library/hello-world" and "library/busybox"
IsSpecificPathComponent checks whether the input path component is a specified string
If it is, the function returns a string array that parsed from the input component
A specified string means we can get a specific string array after parsing it
"library" is a specified string as it only matches "library"
"library*" isn't a specified string as it can match all string that starts with "library"
"{library, test}" is a specified string as it only matches "library" and "test"
Note: the function doesn't support the component that contains more than one "{"
such as "a{b{c,d}e}f"
ParseRepository parses the "repository" provided into two parts: namespace and the rest
the string before the last "/" is the namespace part
c -> [,c]
b/c -> [b,c]
a/b/c -> [a/b,c]