Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

unparam does not skip autogenerated files #799

Closed
tamalsaha opened this issue Oct 8, 2019 · 11 comments · Fixed by #1161
Closed

unparam does not skip autogenerated files #799

tamalsaha opened this issue Oct 8, 2019 · 11 comments · Fixed by #1161
Labels
bug Something isn't working false positive An error is reported when one does not exist
Projects

Comments

@tamalsaha
Copy link

Thank you for creating the issue!

Please include the following information:

  1. Version of golangci-lint: golangci-lint --version (or git commit if you don't use binary distribution)
    github.com/golangci/golangci-lint/cmd/golangci-lint@13e3a1a37556421d5dbad97bba07d7ff9a218931

  2. Config file: cat .golangci.yml
    There is no such file

  3. Go environment: go version && go env
    Go 1.12

  4. Verbose output of running: golangci-lint run -v
    https://github.com/kubedb/apimachinery/pull/453/checks#step:3:50

@tpounds tpounds added false positive An error is reported when one does not exist feedback required Requires additional feedback labels Oct 8, 2019
@tpounds
Copy link
Contributor

tpounds commented Oct 8, 2019

@tamalsaha Thanks for the report! I don't think there is an easy way to have golangci-lint infer which files were generated versus regular source when it has a standard .go extension and only indicates it was generated via comments. Is there any reason you can't add the generated files to a list of files to skip?

@tamalsaha
Copy link
Author

I could add these generated files to a --skip-files. Could golanglint add an option to ignore build tags? These files are generated by tools in the Kubernetes project. They add a tag like below:

// +build !ignore_autogenerated

If I could pass a flag like --skip-tags=ignore_autogenerated that would be easier.

@jirfag
Copy link
Member

jirfag commented Oct 8, 2019

@tpounds see the autogenerated filter
golangci-lint already parses comments and detects auto-generated files by them.

There are such comments:

// Code generated by openapi-gen. DO NOT EDIT.

// This file was autogenerated by openapi-gen. Do not edit it manually!

@jirfag
Copy link
Member

jirfag commented Oct 8, 2019

@tamalsaha

  1. I strongly recommend using binary releases in CI
  2. I have no access to build log, please, attach it here

@tpounds
Copy link
Contributor

tpounds commented Oct 8, 2019

@jirfag Thanks for the info! If that's the case then these files should be ignored right?

@jirfag
Copy link
Member

jirfag commented Oct 8, 2019

@tpounds yep, they should be ignored

@tamalsaha
Copy link
Author

Please see the logs.

GitHub repo: https://github.com/kubedb/apimachinery

$ pwd
/home/tamal/go/src/kubedb.dev/apimachinery

$ golangci-lint version
golangci-lint has version v1.19.2-0.20191002180103-13e3a1a37556 built from (unknown, mod sum: "h1:NJKwD+7k5ESPuXtImgNWcFeYwTUAJPijPv0FxHpFsEs=") on (unknown)


$ golangci-lint run -v --enable goconst,gofmt,goimports,unparam --skip-dirs-use-default --deadline=10m
INFO [config_reader] Config search paths: [./ /home/tamal/go/src/kubedb.dev/apimachinery /home/tamal/go/src/kubedb.dev /home/tamal/go/src /home/tamal/go /home/tamal /home /] 
INFO [lintersdb] Active 14 linters: [deadcode errcheck goconst gofmt goimports gosimple govet ineffassign staticcheck structcheck typecheck unparam unused varcheck] 
INFO [loader] Go packages loading at mode 575 (files|imports|types_sizes|compiled_files|deps|exports_file|name) took 1.289502105s 
INFO [runner/filename_unadjuster] Pre-built 0 adjustments in 44.695434ms 
INFO [runner/max_from_linter] 363/413 issues from linter unparam were hidden, use --max-issues-per-linter 
INFO [runner] Issues before processing: 438, after processing: 51 
INFO [runner] Processors filtering stat (out/in): diff: 414/414, max_from_linter: 51/414, source_code: 51/51, path_shortener: 51/51, cgo: 438/438, skip_files: 438/438, skip_dirs: 438/438, autogenerated_exclude: 438/438, exclude: 438/438, exclude-rules: 438/438, nolint: 416/438, max_per_file_from_linter: 414/414, path_prettifier: 438/438, max_same_issues: 414/414, identifier_marker: 438/438, uniq_by_line: 414/416, filename_unadjuster: 438/438 
INFO [runner] processing took 102.584198ms with stages: nolint: 76.422147ms, exclude: 21.469035ms, identifier_marker: 1.852402ms, source_code: 895.629µs, path_prettifier: 714.483µs, skip_dirs: 307.494µs, autogenerated_exclude: 211.909µs, max_same_issues: 178.878µs, uniq_by_line: 154.801µs, max_from_linter: 120.707µs, max_per_file_from_linter: 86.052µs, cgo: 81.824µs, filename_unadjuster: 69.15µs, path_shortener: 18.062µs, diff: 704ns, exclude-rules: 487ns, skip_files: 434ns 
INFO [runner] linters took 24.710922647s with stages: goanalysis_metalinter: 21.006303139s, unused: 3.60192343s 
client/clientset/versioned/fake/register.go:34:5: var `parameterCodec` is unused (unused)
var parameterCodec = runtime.NewParameterCodec(scheme)
    ^
apis/config/v1alpha1/openapi_generated.go:361:44: `schema_go_encoding_json_types_IntHash` - `ref` is unused (unparam)
func schema_go_encoding_json_types_IntHash(ref common.ReferenceCallback) common.OpenAPIDefinition {
                                           ^
apis/config/v1alpha1/openapi_generated.go:1434:64: `schema_k8sio_api_apps_v1_RollingUpdateStatefulSetStrategy` - `ref` is unused (unparam)
func schema_k8sio_api_apps_v1_RollingUpdateStatefulSetStrategy(ref common.ReferenceCallback) common.OpenAPIDefinition {
                                                               ^
apis/config/v1alpha1/openapi_generated.go:1791:64: `schema_k8sio_api_core_v1_AWSElasticBlockStoreVolumeSource` - `ref` is unused (unparam)
func schema_k8sio_api_core_v1_AWSElasticBlockStoreVolumeSource(ref common.ReferenceCallback) common.OpenAPIDefinition {
                                                               ^
apis/config/v1alpha1/openapi_generated.go:1866:46: `schema_k8sio_api_core_v1_AttachedVolume` - `ref` is unused (unparam)
func schema_k8sio_api_core_v1_AttachedVolume(ref common.ReferenceCallback) common.OpenAPIDefinition {
                                             ^
apis/config/v1alpha1/openapi_generated.go:1922:53: `schema_k8sio_api_core_v1_AzureDiskVolumeSource` - `ref` is unused (unparam)
func schema_k8sio_api_core_v1_AzureDiskVolumeSource(ref common.ReferenceCallback) common.OpenAPIDefinition {
                                                    ^
apis/config/v1alpha1/openapi_generated.go:1978:63: `schema_k8sio_api_core_v1_AzureFilePersistentVolumeSource` - `ref` is unused (unparam)
func schema_k8sio_api_core_v1_AzureFilePersistentVolumeSource(ref common.ReferenceCallback) common.OpenAPIDefinition {
                                                              ^
apis/config/v1alpha1/openapi_generated.go:2020:53: `schema_k8sio_api_core_v1_AzureFileVolumeSource` - `ref` is unused (unparam)
func schema_k8sio_api_core_v1_AzureFileVolumeSource(ref common.ReferenceCallback) common.OpenAPIDefinition {
                                                    ^
apis/config/v1alpha1/openapi_generated.go:2232:44: `schema_k8sio_api_core_v1_Capabilities` - `ref` is unused (unparam)
func schema_k8sio_api_core_v1_Capabilities(ref common.ReferenceCallback) common.OpenAPIDefinition {
                                           ^
apis/config/v1alpha1/openapi_generated.go:2487:46: `schema_k8sio_api_core_v1_ClientIPConfig` - `ref` is unused (unparam)
func schema_k8sio_api_core_v1_ClientIPConfig(ref common.ReferenceCallback) common.OpenAPIDefinition {
                                             ^
apis/config/v1alpha1/openapi_generated.go:2507:50: `schema_k8sio_api_core_v1_ComponentCondition` - `ref` is unused (unparam)
func schema_k8sio_api_core_v1_ComponentCondition(ref common.ReferenceCallback) common.OpenAPIDefinition {
                                                 ^
apis/config/v1alpha1/openapi_generated.go:2717:50: `schema_k8sio_api_core_v1_ConfigMapEnvSource` - `ref` is unused (unparam)
func schema_k8sio_api_core_v1_ConfigMapEnvSource(ref common.ReferenceCallback) common.OpenAPIDefinition {
                                                 ^
apis/config/v1alpha1/openapi_generated.go:2744:52: `schema_k8sio_api_core_v1_ConfigMapKeySelector` - `ref` is unused (unparam)
func schema_k8sio_api_core_v1_ConfigMapKeySelector(ref common.ReferenceCallback) common.OpenAPIDefinition {
                                                   ^
apis/config/v1alpha1/openapi_generated.go:2828:57: `schema_k8sio_api_core_v1_ConfigMapNodeConfigSource` - `ref` is unused (unparam)
func schema_k8sio_api_core_v1_ConfigMapNodeConfigSource(ref common.ReferenceCallback) common.OpenAPIDefinition {
                                                        ^
apis/config/v1alpha1/openapi_generated.go:3199:46: `schema_k8sio_api_core_v1_ContainerImage` - `ref` is unused (unparam)
func schema_k8sio_api_core_v1_ContainerImage(ref common.ReferenceCallback) common.OpenAPIDefinition {
                                             ^
apis/config/v1alpha1/openapi_generated.go:3234:45: `schema_k8sio_api_core_v1_ContainerPort` - `ref` is unused (unparam)
func schema_k8sio_api_core_v1_ContainerPort(ref common.ReferenceCallback) common.OpenAPIDefinition {
                                            ^
apis/config/v1alpha1/openapi_generated.go:3400:53: `schema_k8sio_api_core_v1_ContainerStateWaiting` - `ref` is unused (unparam)
func schema_k8sio_api_core_v1_ContainerStateWaiting(ref common.ReferenceCallback) common.OpenAPIDefinition {
                                                    ^
apis/config/v1alpha1/openapi_generated.go:3497:46: `schema_k8sio_api_core_v1_DaemonEndpoint` - `ref` is unused (unparam)
func schema_k8sio_api_core_v1_DaemonEndpoint(ref common.ReferenceCallback) common.OpenAPIDefinition {
                                             ^
apis/config/v1alpha1/openapi_generated.go:3694:44: `schema_k8sio_api_core_v1_EndpointPort` - `ref` is unused (unparam)
func schema_k8sio_api_core_v1_EndpointPort(ref common.ReferenceCallback) common.OpenAPIDefinition {
                                           ^
apis/config/v1alpha1/openapi_generated.go:4200:43: `schema_k8sio_api_core_v1_EventSource` - `ref` is unused (unparam)
func schema_k8sio_api_core_v1_EventSource(ref common.ReferenceCallback) common.OpenAPIDefinition {
                                          ^
apis/config/v1alpha1/openapi_generated.go:4227:42: `schema_k8sio_api_core_v1_ExecAction` - `ref` is unused (unparam)
func schema_k8sio_api_core_v1_ExecAction(ref common.ReferenceCallback) common.OpenAPIDefinition {
                                         ^
apis/config/v1alpha1/openapi_generated.go:4254:46: `schema_k8sio_api_core_v1_FCVolumeSource` - `ref` is unused (unparam)
func schema_k8sio_api_core_v1_FCVolumeSource(ref common.ReferenceCallback) common.OpenAPIDefinition {
                                             ^
apis/config/v1alpha1/openapi_generated.go:4432:51: `schema_k8sio_api_core_v1_FlockerVolumeSource` - `ref` is unused (unparam)
func schema_k8sio_api_core_v1_FlockerVolumeSource(ref common.ReferenceCallback) common.OpenAPIDefinition {
                                                  ^
apis/config/v1alpha1/openapi_generated.go:4459:61: `schema_k8sio_api_core_v1_GCEPersistentDiskVolumeSource` - `ref` is unused (unparam)
func schema_k8sio_api_core_v1_GCEPersistentDiskVolumeSource(ref common.ReferenceCallback) common.OpenAPIDefinition {
                                                            ^
apis/config/v1alpha1/openapi_generated.go:4501:51: `schema_k8sio_api_core_v1_GitRepoVolumeSource` - `ref` is unused (unparam)
func schema_k8sio_api_core_v1_GitRepoVolumeSource(ref common.ReferenceCallback) common.OpenAPIDefinition {
                                                  ^
apis/config/v1alpha1/openapi_generated.go:4536:63: `schema_k8sio_api_core_v1_GlusterfsPersistentVolumeSource` - `ref` is unused (unparam)
func schema_k8sio_api_core_v1_GlusterfsPersistentVolumeSource(ref common.ReferenceCallback) common.OpenAPIDefinition {
                                                              ^
apis/config/v1alpha1/openapi_generated.go:4578:53: `schema_k8sio_api_core_v1_GlusterfsVolumeSource` - `ref` is unused (unparam)
func schema_k8sio_api_core_v1_GlusterfsVolumeSource(ref common.ReferenceCallback) common.OpenAPIDefinition {
                                                    ^
apis/config/v1alpha1/openapi_generated.go:4669:42: `schema_k8sio_api_core_v1_HTTPHeader` - `ref` is unused (unparam)
func schema_k8sio_api_core_v1_HTTPHeader(ref common.ReferenceCallback) common.OpenAPIDefinition {
                                         ^
apis/config/v1alpha1/openapi_generated.go:4730:41: `schema_k8sio_api_core_v1_HostAlias` - `ref` is unused (unparam)
func schema_k8sio_api_core_v1_HostAlias(ref common.ReferenceCallback) common.OpenAPIDefinition {
                                        ^
apis/config/v1alpha1/openapi_generated.go:4764:52: `schema_k8sio_api_core_v1_HostPathVolumeSource` - `ref` is unused (unparam)
func schema_k8sio_api_core_v1_HostPathVolumeSource(ref common.ReferenceCallback) common.OpenAPIDefinition {
                                                   ^
apis/config/v1alpha1/openapi_generated.go:4990:41: `schema_k8sio_api_core_v1_KeyToPath` - `ref` is unused (unparam)
func schema_k8sio_api_core_v1_KeyToPath(ref common.ReferenceCallback) common.OpenAPIDefinition {
                                        ^
apis/config/v1alpha1/openapi_generated.go:5312:51: `schema_k8sio_api_core_v1_LoadBalancerIngress` - `ref` is unused (unparam)
func schema_k8sio_api_core_v1_LoadBalancerIngress(ref common.ReferenceCallback) common.OpenAPIDefinition {
                                                  ^
apis/config/v1alpha1/openapi_generated.go:5367:52: `schema_k8sio_api_core_v1_LocalObjectReference` - `ref` is unused (unparam)
func schema_k8sio_api_core_v1_LocalObjectReference(ref common.ReferenceCallback) common.OpenAPIDefinition {
                                                   ^
apis/config/v1alpha1/openapi_generated.go:5387:49: `schema_k8sio_api_core_v1_LocalVolumeSource` - `ref` is unused (unparam)
func schema_k8sio_api_core_v1_LocalVolumeSource(ref common.ReferenceCallback) common.OpenAPIDefinition {
                                                ^
apis/config/v1alpha1/openapi_generated.go:5415:47: `schema_k8sio_api_core_v1_NFSVolumeSource` - `ref` is unused (unparam)
func schema_k8sio_api_core_v1_NFSVolumeSource(ref common.ReferenceCallback) common.OpenAPIDefinition {
                                              ^
apis/config/v1alpha1/openapi_generated.go:5546:45: `schema_k8sio_api_core_v1_NamespaceSpec` - `ref` is unused (unparam)
func schema_k8sio_api_core_v1_NamespaceSpec(ref common.ReferenceCallback) common.OpenAPIDefinition {
                                            ^
apis/config/v1alpha1/openapi_generated.go:5573:47: `schema_k8sio_api_core_v1_NamespaceStatus` - `ref` is unused (unparam)
func schema_k8sio_api_core_v1_NamespaceStatus(ref common.ReferenceCallback) common.OpenAPIDefinition {
                                              ^
apis/config/v1alpha1/openapi_generated.go:5640:43: `schema_k8sio_api_core_v1_NodeAddress` - `ref` is unused (unparam)
func schema_k8sio_api_core_v1_NodeAddress(ref common.ReferenceCallback) common.OpenAPIDefinition {
                                          ^
apis/config/v1alpha1/openapi_generated.go:5889:48: `schema_k8sio_api_core_v1_NodeProxyOptions` - `ref` is unused (unparam)
func schema_k8sio_api_core_v1_NodeProxyOptions(ref common.ReferenceCallback) common.OpenAPIDefinition {
                                               ^
apis/config/v1alpha1/openapi_generated.go:5982:55: `schema_k8sio_api_core_v1_NodeSelectorRequirement` - `ref` is unused (unparam)
func schema_k8sio_api_core_v1_NodeSelectorRequirement(ref common.ReferenceCallback) common.OpenAPIDefinition {
                                                      ^
apis/config/v1alpha1/openapi_generated.go:6273:46: `schema_k8sio_api_core_v1_NodeSystemInfo` - `ref` is unused (unparam)
func schema_k8sio_api_core_v1_NodeSystemInfo(ref common.ReferenceCallback) common.OpenAPIDefinition {
                                             ^
apis/config/v1alpha1/openapi_generated.go:6357:51: `schema_k8sio_api_core_v1_ObjectFieldSelector` - `ref` is unused (unparam)
func schema_k8sio_api_core_v1_ObjectFieldSelector(ref common.ReferenceCallback) common.OpenAPIDefinition {
                                                  ^
apis/config/v1alpha1/openapi_generated.go:6385:47: `schema_k8sio_api_core_v1_ObjectReference` - `ref` is unused (unparam)
func schema_k8sio_api_core_v1_ObjectReference(ref common.ReferenceCallback) common.OpenAPIDefinition {
                                              ^
apis/config/v1alpha1/openapi_generated.go:6781:65: `schema_k8sio_api_core_v1_PersistentVolumeClaimVolumeSource` - `ref` is unused (unparam)
func schema_k8sio_api_core_v1_PersistentVolumeClaimVolumeSource(ref common.ReferenceCallback) common.OpenAPIDefinition {
                                                                ^
apis/config/v1alpha1/openapi_generated.go:7227:54: `schema_k8sio_api_core_v1_PersistentVolumeStatus` - `ref` is unused (unparam)
func schema_k8sio_api_core_v1_PersistentVolumeStatus(ref common.ReferenceCallback) common.OpenAPIDefinition {
                                                     ^
apis/config/v1alpha1/openapi_generated.go:7261:64: `schema_k8sio_api_core_v1_PhotonPersistentDiskVolumeSource` - `ref` is unused (unparam)
func schema_k8sio_api_core_v1_PhotonPersistentDiskVolumeSource(ref common.ReferenceCallback) common.OpenAPIDefinition {
                                                               ^
apis/config/v1alpha1/openapi_generated.go:7461:48: `schema_k8sio_api_core_v1_PodAttachOptions` - `ref` is unused (unparam)
func schema_k8sio_api_core_v1_PodAttachOptions(ref common.ReferenceCallback) common.OpenAPIDefinition {
                                               ^
apis/config/v1alpha1/openapi_generated.go:7635:50: `schema_k8sio_api_core_v1_PodDNSConfigOption` - `ref` is unused (unparam)
func schema_k8sio_api_core_v1_PodDNSConfigOption(ref common.ReferenceCallback) common.OpenAPIDefinition {
                                                 ^
apis/config/v1alpha1/openapi_generated.go:7661:46: `schema_k8sio_api_core_v1_PodExecOptions` - `ref` is unused (unparam)
func schema_k8sio_api_core_v1_PodExecOptions(ref common.ReferenceCallback) common.OpenAPIDefinition {
                                             ^
apis/config/v1alpha1/openapi_generated.go:7871:53: `schema_k8sio_api_core_v1_PodPortForwardOptions` - `ref` is unused (unparam)
func schema_k8sio_api_core_v1_PodPortForwardOptions(ref common.ReferenceCallback) common.OpenAPIDefinition {
                                                    ^
apis/config/v1alpha1/openapi_generated.go:7912:47: `schema_k8sio_api_core_v1_PodProxyOptions` - `ref` is unused (unparam)
func schema_k8sio_api_core_v1_PodProxyOptions(ref common.ReferenceCallback) common.OpenAPIDefinition {
                                              ^
INFO File cache stats: 2 entries of total size 712.8KiB 
INFO Memory: 187 samples, avg is 952.8MB, max is 1155.9MB 
INFO Execution took 26.05545856s     

@tpounds tpounds added bug Something isn't working and removed feedback required Requires additional feedback labels Oct 8, 2019
@jirfag
Copy link
Member

jirfag commented Oct 8, 2019

thank you, we need to debug it

@Lacklub
Copy link

Lacklub commented Mar 30, 2020

I'm having the same issue. It looks like the bug is in https://github.com/golangci/golangci-lint/blob/master/pkg/result/processors/autogenerated_exclude.go

Func getDoc, around line 133, the scanner.scan for loop exits when it encounters a line that isn't a 1) "//" style comment, 2) an empty line, or 3) a package declaration. This means that in my case and in @tamalsaha's case, the block comment at the beginning of the file causes it to stop scanning, so it never reaches the DO NOT EDIT comment.

theckman pushed a commit to theckman/golangci-lint that referenced this issue May 3, 2020
$ git cherry --abbrev -v 0af0999fabfb ee9bf5809ead
+ abd8436 all: enable Go modules on CI (golangci#753)
+ 3c9d0fb checkers: recognize //line and //nolint in commentFormatting (golangci#756)
+ 0b517d7 checkers: extend deprecatedComment patterns (golangci#757)
+ 09100f6 checkers: use astcast package instead of coerce.go (golangci#758)
+ 2e9e97f checker: simplify boolExprSimplify (golangci#759)
+ 575701e make: add go-consistent to CI checks list (golangci#761)
+ b55f431 checkers: fix unlambda handling of builtins (golangci#763)
+ 5a7dee3 checker: handle lambdas properly in boolExprSimplify (golangci#765)
+ 5ce3939 checkers: teach boolExprSimplify a few new tricks (golangci#766)
+ 04d160f checkers: add new patterns to boolExprSimplify (golangci#768)
+ 09582e2 make: collect coverprofile separately from goveralls (golangci#769)
+ d8d0ee4 checkers: recognize NOTE pattern in deprecatedComment (golangci#770)
+ 12f0f85 Update copyright notice to 2019 (golangci#771)
+ f54bdb6 checkers: add stringXbytes checker
+ 170d65c checkers: followup for golangci#773 (golangci#774)
+ 84e9e83 checkers: make stringXbytes more linear (golangci#775)
+ a800815 checkers: add Depreacted typo pattern (golangci#776)
+ 6751be9 checkers: add hexLiterals (golangci#772)
+ ac61906 checkers: add typeAssertChain checker (golangci#782)
+ d19dbf1 checkers: add codegenComment checker (golangci#783)
+ d82b576 checkers: proper pkg/obj check for flagName (golangci#786)
+ dfcf754 ci: enable integration tests (golangci#787)
+ 5dafc45 checkers: fix equalFold false positive (golangci#788)
+ ed5e8e7 checkers: refactor and fix hexLiteral checker (golangci#789)
+ e704e07 checkers: add argOrder checker (golangci#790)
+ 34c1dc8 checkers: add Split handling to argOrder checker (golangci#791)
+ cbe095d checkers: add math.Max and math.Min to dupArg (golangci#792)
+ c986ee5 checkers: add checkers info fields test (golangci#794)
+ 66e5832 cmd/makedocs: use lintpack, fix build (golangci#793)
+ 6bce9d0 cmd/makedocs: add enabled/disabled by default info (golangci#795)
+ 4adbf9a checkers: simplify flagName (golangci#799)
+ 07de34a checkers: add octalLiteral checker (golangci#798)
+ 765907a cmd/makedocs: add checker param docs (golangci#796)
+ ee9bf58 cmd/makedocs: fix headers formatting (golangci#803)
@ldez
Copy link
Member

ldez commented Dec 21, 2020

Fixed by #1161

@ldez ldez closed this as completed Dec 21, 2020
Zero Bug automation moved this from High priority to Closed Dec 21, 2020
@ldez ldez linked a pull request Dec 21, 2020 that will close this issue
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working false positive An error is reported when one does not exist
Projects
No open projects
Zero Bug
  
Closed
Development

Successfully merging a pull request may close this issue.

5 participants