diff --git a/action.yml b/action.yml index ee0b1d7..50fdf2e 100644 --- a/action.yml +++ b/action.yml @@ -126,6 +126,7 @@ runs: env: VOCIFERATE_BIN: ${{ steps.resolve-binary.outputs.binary_path }} USE_BINARY: ${{ steps.resolve-binary.outputs.use_binary }} + VOCIFERATE_REPOSITORY_URL: ${{ vars.VOCIFERATE_REPOSITORY_URL }} run: | set -euo pipefail diff --git a/internal/vociferate/vociferate.go b/internal/vociferate/vociferate.go index 80ab7e4..05f4725 100644 --- a/internal/vociferate/vociferate.go +++ b/internal/vociferate/vociferate.go @@ -337,10 +337,13 @@ func readLatestChangelogVersion(rootDir, changelogPath string) (string, bool, er func deriveRepositoryURL(rootDir string) (string, bool) { override := strings.TrimSpace(os.Getenv("VOCIFERATE_REPOSITORY_URL")) if override != "" { - if normalized, ok := normalizeRepoURL(override); ok { - return normalized, true + repositoryPath, ok := deriveRepositoryPath(rootDir) + if !ok { + return "", false } - return strings.TrimSuffix(override, "/"), true + + baseURL := strings.TrimSuffix(strings.TrimSpace(override), "/") + return baseURL + "/" + repositoryPath, true } serverURL := strings.TrimSpace(os.Getenv("GITHUB_SERVER_URL")) @@ -368,6 +371,38 @@ func deriveRepositoryURL(rootDir string) (string, bool) { return repoURL, true } +func deriveRepositoryPath(rootDir string) (string, bool) { + repository := strings.TrimSpace(os.Getenv("GITHUB_REPOSITORY")) + if repository != "" { + return strings.TrimPrefix(repository, "/"), true + } + + gitConfigPath := filepath.Join(rootDir, ".git", "config") + contents, err := os.ReadFile(gitConfigPath) + if err != nil { + return "", false + } + + remoteURL, ok := originRemoteURLFromGitConfig(string(contents)) + if !ok { + return "", false + } + + repoURL, ok := normalizeRepoURL(remoteURL) + if !ok { + return "", false + } + + parsedURL := strings.TrimPrefix(repoURL, "https://") + parsedURL = strings.TrimPrefix(parsedURL, "http://") + slash := strings.Index(parsedURL, "/") + if slash == -1 || slash == len(parsedURL)-1 { + return "", false + } + + return parsedURL[slash+1:], true +} + func originRemoteURLFromGitConfig(config string) (string, bool) { inOrigin := false for _, line := range strings.Split(config, "\n") { @@ -403,7 +438,8 @@ func normalizeRepoURL(remoteURL string) (string, bool) { } if strings.HasPrefix(remoteURL, "http://") || strings.HasPrefix(remoteURL, "https://") { - return strings.TrimSuffix(remoteURL, ".git"), true + normalized := strings.TrimSuffix(strings.TrimSuffix(remoteURL, "/"), ".git") + return normalized, true } if strings.HasPrefix(remoteURL, "ssh://") { diff --git a/prepare/action.yml b/prepare/action.yml index 2362f2b..974a2e1 100644 --- a/prepare/action.yml +++ b/prepare/action.yml @@ -142,6 +142,7 @@ runs: VOCIFERATE_BIN: ${{ steps.resolve-binary.outputs.binary_path }} USE_BINARY: ${{ steps.resolve-binary.outputs.use_binary }} INPUT_VERSION: ${{ inputs.version }} + VOCIFERATE_REPOSITORY_URL: ${{ vars.VOCIFERATE_REPOSITORY_URL }} run: | set -euo pipefail