= ({
modifier="nowrap"
{...getTdProps({ columnKey: "version" })}
>
- {appDependency.dependency.version}
+
{/* = ({
>
);
};
+
+const DependencyVersionColumn = ({
+ appDependency: {
+ dependency: {
+ provider,
+ name,
+ version,
+ rule: sha, // TODO: rename to 'sha' with https://github.com/konveyor/tackle2-hub/issues/557
+ },
+ },
+}: {
+ appDependency: AnalysisAppDependency;
+}) => {
+ const isJavaDependency = name && version && sha && provider === "";
+
+ const mavenCentralLink = isJavaDependency
+ ? `https://search.maven.org/search?q=1:${extractFirstSha(sha)}`
+ : undefined;
+
+ return (
+
+ {mavenCentralLink ? (
+ {version}
+ ) : (
+ {version}
+ )}
+
+ );
+};
diff --git a/client/src/app/utils/utils.test.ts b/client/src/app/utils/utils.test.ts
index 92efa040b9..016eab1841 100644
--- a/client/src/app/utils/utils.test.ts
+++ b/client/src/app/utils/utils.test.ts
@@ -7,6 +7,7 @@ import {
gitUrlRegex,
standardURLRegex,
formatPath,
+ extractFirstSha,
} from "./utils";
import { Paths } from "@app/Paths";
@@ -157,6 +158,7 @@ describe("utils", () => {
expect(standardURLRegex.test(url)).toBe(true);
});
});
+
describe("formatPath function", () => {
it("should replace path parameters with values", () => {
const path = Paths.applicationsImportsDetails;
@@ -174,3 +176,46 @@ describe("formatPath function", () => {
expect(result).toBe("/applications/assessment/:assessmentId");
});
});
+
+describe("SHA extraction", () => {
+ it("empty string is undefined", () => {
+ const first = extractFirstSha("");
+ expect(first).toBeUndefined();
+ });
+
+ it("no SHA is undefined", () => {
+ const first = extractFirstSha(
+ "The quick brown fox jumps over the lazy dog."
+ );
+ expect(first).toBeUndefined();
+ });
+
+ it("a SHA is found", () => {
+ const tests = [
+ "83cd2cd674a217ade95a4bb83a8a14f351f48bd0",
+ " 83cd2cd674a217ade95a4bb83a8a14f351f48bd0 ",
+ "83cd2cd674a217ade95a4bb83a8a14f351f48bd0 The quick brown fox jumps over the lazy dog.",
+ "The quick brown fox jumps over the lazy dog. 83cd2cd674a217ade95a4bb83a8a14f351f48bd0",
+ "The quick brown fox 83cd2cd674a217ade95a4bb83a8a14f351f48bd0 jumps over the lazy dog.",
+ ];
+
+ for (const test of tests) {
+ const first = extractFirstSha(test);
+ expect(first).toBe("83cd2cd674a217ade95a4bb83a8a14f351f48bd0");
+ }
+ });
+
+ it("multiple SHAs are in the string, only the first is returned", () => {
+ const first = extractFirstSha(
+ "83cd2cd674a217ade95a4bb83a8a14f351f48bd0 9c04cd6372077e9b11f70ca111c9807dc7137e4b"
+ );
+ expect(first).toBe("83cd2cd674a217ade95a4bb83a8a14f351f48bd0");
+ });
+
+ it("multiple SHAs are in the string, only the first is returned even if it is shorter", () => {
+ const first = extractFirstSha(
+ "9c04cd6372077e9b11f70ca111c9807dc7137e4b 83cd2cd674a217ade95a4bb83a8a14f351f48bd0 b47cc0f104b62d4c7c30bcd68fd8e67613e287dc4ad8c310ef10cbadea9c4380"
+ );
+ expect(first).toBe("9c04cd6372077e9b11f70ca111c9807dc7137e4b");
+ });
+});
diff --git a/client/src/app/utils/utils.ts b/client/src/app/utils/utils.ts
index ce1b98e0d1..e736820f2b 100644
--- a/client/src/app/utils/utils.ts
+++ b/client/src/app/utils/utils.ts
@@ -151,3 +151,21 @@ export const formatPath = (path: Paths, data: any) => {
return url;
};
+
+/**
+ * Regular expression to match a SHA hash in a string. Different versions of the SHA
+ * hash have different lengths. Check in descending length order so the longest SHA
+ * string can be captured.
+ */
+const SHA_REGEX =
+ /([a-f0-9]{128}|[a-f0-9]{96}|[a-f0-9]{64}|[a-f0-9]{56}|[a-f0-9]{40})/g;
+
+/**
+ * In any given string, find the first thing that looks like a sha hash and return it.
+ * If nothing looks like a sha hash, return undefined.
+ */
+export const extractFirstSha = (str: string): string | undefined => {
+ const match = str.match(SHA_REGEX);
+ console.log("match:", match);
+ return match && match[0] ? match[0] : undefined;
+};
|