From 48a63cc0926c59471650bcefb921881c6f5d7b07 Mon Sep 17 00:00:00 2001 From: Dave Gaeddert Date: Fri, 13 Dec 2019 09:26:04 -0600 Subject: [PATCH] Add tag_filter setting (#6) --- README.md | 16 ++++++++++++ remotes.go | 31 ++++++++++++++++++++--- test/filter/dependencies.json | 24 ++++++++++++++++++ test/filter/dependencies_capture.json | 24 ++++++++++++++++++ test/filter/deps_tests.yml | 29 +++++++++++++++++++++ test/filter/repo_current/file.txt | 2 ++ test/filter/repo_updated/file.txt | 2 ++ test/filter/repo_updated_capture/file.txt | 2 ++ 8 files changed, 127 insertions(+), 3 deletions(-) create mode 100644 test/filter/dependencies.json create mode 100644 test/filter/dependencies_capture.json create mode 100644 test/filter/deps_tests.yml create mode 100644 test/filter/repo_current/file.txt create mode 100644 test/filter/repo_updated/file.txt create mode 100644 test/filter/repo_updated_capture/file.txt diff --git a/README.md b/README.md index a83a1a2..4f27f7a 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,22 @@ dependencies: tag_prefix: raven-js@ # include semver pre-releases prereleases: true + + https://github.com/libevent/libevent.git: + replace_in_files: + - filename: file.txt + pattern: libevent (\S+) + # filter tags to those that match a specific pattern, and use the captured + # group as the version name (i.e. you'll get "2.1.10" instead of "release-2.1.10") + tag_filter: 'release-(\S+)-stable' + + https://github.com/libevent/libevent.git: + replace_in_files: + - filename: file.txt + pattern: libevent (\S+) + # filter tags to those that match a specific pattern, and use the + # full tag name as the version + tag_filter: 'release-\S+-stable' ``` ## Support diff --git a/remotes.go b/remotes.go index 4dc1045..322a161 100644 --- a/remotes.go +++ b/remotes.go @@ -20,6 +20,7 @@ type replaceInFile struct { Filename string `json:"filename"` Pattern string `json:"pattern"` TagPrefix string `json:"tag_prefix"` + TagFilter string `json:"tag_filter"` Semver *bool `json:"semver"` Prereleases bool `json:"prereleases"` Range string `json:"range"` @@ -58,20 +59,28 @@ func (rif *replaceInFile) writeFile(contents string) { } func (rif *replaceInFile) getLatestTag(tags []string) string { - if rif.TagPrefix != "" { + if rif.TagPrefix != "" && rif.TagFilter != "" { + panic("Cannot use tag_prefix and tag_filter together. Please choose one.") + } else if rif.TagPrefix != "" { fmt.Printf("Filtering to tags with prefix %s and removing it", rif.TagPrefix) tags = filterAndRemovePrefixes(tags, rif.TagPrefix) fmt.Printf("Remaining tags: %v\n", tags) + } else if rif.TagFilter != "" { + fmt.Printf("Filtering tags using %s", rif.TagFilter) + tags = filter(tags, rif.TagFilter) + fmt.Printf("Remaining tags: %v\n", tags) } // Enabled if not set if rif.Semver == nil || *rif.Semver { versions := stringsToVersions(tags, rif.Range, rif.Prereleases) - if len(versions) < 1 && rif.TagPrefix == "" { - // Try automatically removing "v" since it's so common + + // Try automatically removing "v" since it's so common + if len(versions) < 1 && rif.TagPrefix == "" && rif.TagFilter == "" { tags = filterAndRemovePrefixes(tags, "v") versions = stringsToVersions(tags, rif.Range, rif.Prereleases) } + tags = versionsToStrings(versions) } @@ -127,3 +136,19 @@ func filterAndRemovePrefixes(tags []string, prefix string) []string { } return filtered } + +func filter(tags []string, f string) []string { + regex := regexp.MustCompile(f) + filtered := []string{} + for _, s := range tags { + submatches := regex.FindStringSubmatch(s) + if len(submatches) == 1 { + // No group captured + filtered = append(filtered, submatches[0]) + } else if len(submatches) == 2 { + // Group captured + filtered = append(filtered, submatches[1]) + } + } + return filtered +} diff --git a/test/filter/dependencies.json b/test/filter/dependencies.json new file mode 100644 index 0000000..6b0b813 --- /dev/null +++ b/test/filter/dependencies.json @@ -0,0 +1,24 @@ +{ + "manifests": { + "": { + "current": { + "dependencies": { + "https://github.com/libevent/libevent.git": { + "constraint": "release-2.1.10-stable", + "source": "git", + "repo": "https://github.com/libevent/libevent.git" + } + } + }, + "updated": { + "dependencies": { + "https://github.com/libevent/libevent.git": { + "constraint": "release-2.1.8-stable", + "source": "git", + "repo": "https://github.com/libevent/libevent.git" + } + } + } + } + } +} diff --git a/test/filter/dependencies_capture.json b/test/filter/dependencies_capture.json new file mode 100644 index 0000000..7be4400 --- /dev/null +++ b/test/filter/dependencies_capture.json @@ -0,0 +1,24 @@ +{ + "manifests": { + "": { + "current": { + "dependencies": { + "https://github.com/libevent/libevent.git": { + "constraint": "2.1.10", + "source": "git", + "repo": "https://github.com/libevent/libevent.git" + } + } + }, + "updated": { + "dependencies": { + "https://github.com/libevent/libevent.git": { + "constraint": "2.1.11", + "source": "git", + "repo": "https://github.com/libevent/libevent.git" + } + } + } + } + } +} diff --git a/test/filter/deps_tests.yml b/test/filter/deps_tests.yml new file mode 100644 index 0000000..c5da6a0 --- /dev/null +++ b/test/filter/deps_tests.yml @@ -0,0 +1,29 @@ +tests: +- name: filter + repo: repo_current + diff: repo_updated + data: dependencies.json + user_config: + path: / + settings: + remotes: + https://github.com/libevent/libevent.git: + replace_in_files: + - filename: file.txt + pattern: libevent==(\S+) + semver: false # uncaptured example won't work with semver + tag_filter: 'release-\S+-stable' + +- name: filter + repo: repo_current + diff: repo_updated_capture + data: dependencies_capture.json + user_config: + path: / + settings: + remotes: + https://github.com/libevent/libevent.git: + replace_in_files: + - filename: file.txt + pattern: libevent-captured==(\S+) + tag_filter: 'release-(\S+)-stable' diff --git a/test/filter/repo_current/file.txt b/test/filter/repo_current/file.txt new file mode 100644 index 0000000..562b8b7 --- /dev/null +++ b/test/filter/repo_current/file.txt @@ -0,0 +1,2 @@ +libevent==release-2.1.10-stable +libevent-captured==2.1.10 diff --git a/test/filter/repo_updated/file.txt b/test/filter/repo_updated/file.txt new file mode 100644 index 0000000..cc06e2f --- /dev/null +++ b/test/filter/repo_updated/file.txt @@ -0,0 +1,2 @@ +libevent==release-2.1.8-stable +libevent-captured==2.1.10 diff --git a/test/filter/repo_updated_capture/file.txt b/test/filter/repo_updated_capture/file.txt new file mode 100644 index 0000000..223fa1d --- /dev/null +++ b/test/filter/repo_updated_capture/file.txt @@ -0,0 +1,2 @@ +libevent==release-2.1.10-stable +libevent-captured==2.1.11