diff --git a/pkg/tests/apis/openapi_snapshots/provisioning.grafana.app-v0alpha1.json b/pkg/tests/apis/openapi_snapshots/provisioning.grafana.app-v0alpha1.json index 7e305e99568..d74ca23d0be 100644 --- a/pkg/tests/apis/openapi_snapshots/provisioning.grafana.app-v0alpha1.json +++ b/pkg/tests/apis/openapi_snapshots/provisioning.grafana.app-v0alpha1.json @@ -2644,6 +2644,10 @@ "description": "Whether we should show dashboard previews for pull requests. By default, this is false (i.e. we will not create previews).", "type": "boolean" }, + "path": { + "description": "Path is the subdirectory for the Grafana data. If specified, Grafana will ignore anything that is outside this directory in the repository. This is usually something like `grafana/`. Trailing and leading slash are not required. They are always added when needed. The path is relative to the root of the repository, regardless of the leading slash.\n\nWhen specifying something like `grafana-`, we will not look for `grafana-*`; we will only look for files under the directory `/grafana-/`. That means `/grafana-example.json` would not be found.", + "type": "string" + }, "token": { "description": "Token for accessing the repository. If set, it will be encrypted into encryptedToken, then set to an empty string again.", "type": "string" diff --git a/public/app/api/clients/provisioning/endpoints.gen.ts b/public/app/api/clients/provisioning/endpoints.gen.ts index c614724dbe2..8f22200d13f 100644 --- a/public/app/api/clients/provisioning/endpoints.gen.ts +++ b/public/app/api/clients/provisioning/endpoints.gen.ts @@ -857,6 +857,10 @@ export type GitHubRepositoryConfig = { encryptedToken?: string; /** Whether we should show dashboard previews for pull requests. By default, this is false (i.e. we will not create previews). */ generateDashboardPreviews?: boolean; + /** Path is the subdirectory for the Grafana data. If specified, Grafana will ignore anything that is outside this directory in the repository. This is usually something like `grafana/`. Trailing and leading slash are not required. They are always added when needed. The path is relative to the root of the repository, regardless of the leading slash. + + When specifying something like `grafana-`, we will not look for `grafana-*`; we will only look for files under the directory `/grafana-/`. That means `/grafana-example.json` would not be found. */ + path?: string; /** Token for accessing the repository. If set, it will be encrypted into encryptedToken, then set to an empty string again. */ token?: string; /** The repository URL (e.g. `https://github.com/example/test`). */ diff --git a/public/app/features/provisioning/dashboardLoader.ts b/public/app/features/provisioning/dashboardLoader.ts index b75c691067b..68bf3c11246 100644 --- a/public/app/features/provisioning/dashboardLoader.ts +++ b/public/app/features/provisioning/dashboardLoader.ts @@ -1,7 +1,7 @@ import { getBackendSrv } from '@grafana/runtime'; +import { BASE_URL } from 'app/api/clients/provisioning/baseAPI'; import { DashboardDTO } from 'app/types'; -import { BASE_URL } from '../../api/clients/provisioning/baseAPI'; import { AnnoKeyManagerIdentity, AnnoKeyManagerKind, AnnoKeySourcePath } from '../apiserver/types'; /** diff --git a/public/app/features/provisioning/hooks/useCreateOrUpdateRepository.ts b/public/app/features/provisioning/hooks/useCreateOrUpdateRepository.ts index b25f53003c3..16ffb82d5ca 100644 --- a/public/app/features/provisioning/hooks/useCreateOrUpdateRepository.ts +++ b/public/app/features/provisioning/hooks/useCreateOrUpdateRepository.ts @@ -4,7 +4,7 @@ import { RepositorySpec, useCreateRepositoryMutation, useReplaceRepositoryMutation, -} from '../../../api/clients/provisioning'; +} from 'app/api/clients/provisioning'; export function useCreateOrUpdateRepository(name?: string) { const [create, createRequest] = useCreateRepositoryMutation(); diff --git a/public/app/features/provisioning/hooks/useCreateOrUpdateRepositoryFile.ts b/public/app/features/provisioning/hooks/useCreateOrUpdateRepositoryFile.ts index b7cc98380d3..4d26b1bdb5f 100644 --- a/public/app/features/provisioning/hooks/useCreateOrUpdateRepositoryFile.ts +++ b/public/app/features/provisioning/hooks/useCreateOrUpdateRepositoryFile.ts @@ -4,7 +4,7 @@ import { ReplaceRepositoryFilesWithPathApiArg, useCreateRepositoryFilesWithPathMutation, useReplaceRepositoryFilesWithPathMutation, -} from '../../../api/clients/provisioning'; +} from 'app/api/clients/provisioning'; export function useCreateOrUpdateRepositoryFile(name?: string) { const [create, createRequest] = useCreateRepositoryFilesWithPathMutation(); diff --git a/public/app/features/provisioning/hooks/useIsProvisionedInstance.ts b/public/app/features/provisioning/hooks/useIsProvisionedInstance.ts index 3de98a2c935..5526ee759b5 100644 --- a/public/app/features/provisioning/hooks/useIsProvisionedInstance.ts +++ b/public/app/features/provisioning/hooks/useIsProvisionedInstance.ts @@ -1,6 +1,7 @@ import { skipToken } from '@reduxjs/toolkit/query'; -import { RepositoryViewList, useGetFrontendSettingsQuery } from '../../../api/clients/provisioning'; +import { RepositoryViewList, useGetFrontendSettingsQuery } from 'app/api/clients/provisioning'; + import { checkSyncSettings } from '../utils/checkSyncSettings'; export function useIsProvisionedInstance(settings?: RepositoryViewList) { diff --git a/public/app/features/provisioning/hooks/useIsProvisionedNG.ts b/public/app/features/provisioning/hooks/useIsProvisionedNG.ts index cacd1be26d3..9b5ee9737f9 100644 --- a/public/app/features/provisioning/hooks/useIsProvisionedNG.ts +++ b/public/app/features/provisioning/hooks/useIsProvisionedNG.ts @@ -1,6 +1,6 @@ +import { useGetFrontendSettingsQuery } from 'app/api/clients/provisioning'; import { useUrlParams } from 'app/core/navigation/hooks'; -import { useGetFrontendSettingsQuery } from '../../../api/clients/provisioning'; import { DashboardScene } from '../../dashboard-scene/scene/DashboardScene'; import { useGetResourceRepository } from './useGetResourceRepository'; diff --git a/public/app/features/provisioning/hooks/useRepositoryJobs.ts b/public/app/features/provisioning/hooks/useRepositoryJobs.ts index affdfc6a87d..1afeeccc29a 100644 --- a/public/app/features/provisioning/hooks/useRepositoryJobs.ts +++ b/public/app/features/provisioning/hooks/useRepositoryJobs.ts @@ -1,6 +1,6 @@ import { skipToken } from '@reduxjs/toolkit/query/react'; -import { Job, useListJobQuery } from '../../../api/clients/provisioning'; +import { Job, useListJobQuery } from 'app/api/clients/provisioning'; interface RepositoryJobsArgs { name?: string; diff --git a/public/app/features/provisioning/hooks/useRepositoryList.ts b/public/app/features/provisioning/hooks/useRepositoryList.ts index e4622c2f2bb..cd191c392f4 100644 --- a/public/app/features/provisioning/hooks/useRepositoryList.ts +++ b/public/app/features/provisioning/hooks/useRepositoryList.ts @@ -1,6 +1,6 @@ import { skipToken } from '@reduxjs/toolkit/query'; -import { ListRepositoryApiArg, Repository, useListRepositoryQuery } from '../../../api/clients/provisioning'; +import { ListRepositoryApiArg, Repository, useListRepositoryQuery } from 'app/api/clients/provisioning'; // Sort repositories alphabetically by title export function useRepositoryList( diff --git a/public/app/features/provisioning/utils/checkSyncSettings.ts b/public/app/features/provisioning/utils/checkSyncSettings.ts index 40f07afd6ea..f7b4fe7b5f1 100644 --- a/public/app/features/provisioning/utils/checkSyncSettings.ts +++ b/public/app/features/provisioning/utils/checkSyncSettings.ts @@ -1,4 +1,4 @@ -import { RepositoryViewList } from '../../../api/clients/provisioning'; +import { RepositoryViewList } from 'app/api/clients/provisioning'; export function checkSyncSettings(settings?: RepositoryViewList): [boolean, boolean] { if (!settings?.items?.length) { diff --git a/public/app/features/provisioning/utils/data.ts b/public/app/features/provisioning/utils/data.ts index 13e4910df9e..35aed2955a8 100644 --- a/public/app/features/provisioning/utils/data.ts +++ b/public/app/features/provisioning/utils/data.ts @@ -1,4 +1,5 @@ -import { RepositorySpec } from '../../../api/clients/provisioning'; +import { RepositorySpec } from 'app/api/clients/provisioning'; + import { RepositoryFormData } from '../types'; export const dataToSpec = (data: RepositoryFormData): RepositorySpec => { diff --git a/public/app/features/provisioning/utils/git.ts b/public/app/features/provisioning/utils/git.ts index c6e8ebb4f62..c52087a4ca1 100644 --- a/public/app/features/provisioning/utils/git.ts +++ b/public/app/features/provisioning/utils/git.ts @@ -1,3 +1,5 @@ +import { RepositorySpec } from 'app/api/clients/provisioning'; + /** * Validates a Git branch name according to the following rules: * 1. The branch name cannot start with `/`, end with `/`, `.`, or whitespace. @@ -12,3 +14,13 @@ export function validateBranchName(branchName?: string) { return branchName && branchNameRegex.test(branchName!); } + +export const getRepoHref = (github?: RepositorySpec['github']) => { + if (!github?.url) { + return undefined; + } + if (!github.branch) { + return github.url; + } + return `${github.url}/tree/${github.branch}`; +};