diff --git a/.idea/aws.xml b/.idea/aws.xml index ec328d0bbf68db9e7322932181cc811412e3ca87..dd17d0458483d25ea79f5ea08d225de727b154ac 100644 --- a/.idea/aws.xml +++ b/.idea/aws.xml @@ -2,14 +2,16 @@ <project version="4"> <component name="accountSettings"> <option name="activeProfile" value="profile:default" /> - <option name="activeRegion" value="eu-west-1" /> + <option name="activeRegion" value="eu-central-1" /> <option name="recentlyUsedProfiles"> <list> <option value="profile:default" /> + <option value="profile:schukai" /> </list> </option> <option name="recentlyUsedRegions"> <list> + <option value="eu-central-1" /> <option value="eu-west-1" /> </list> </option> diff --git a/.idea/modules.xml b/.idea/modules.xml index d608247d5bcfb09c273c80aaa237ab5abfb77528..9d1cb3ae95d8901764f400e38e9eda746d5e1cba 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -7,6 +7,7 @@ <module fileurl="file://$PROJECT_DIR$/../../../schukai/manual/manual.iml" filepath="$PROJECT_DIR$/../../../schukai/manual/manual.iml" /> <module fileurl="file://$PROJECT_DIR$/requirements-manager.iml" filepath="$PROJECT_DIR$/requirements-manager.iml" /> <module fileurl="file://$PROJECT_DIR$/../../../customer-projects/administration/templates-for-requirements/templates-for-requirements.iml" filepath="$PROJECT_DIR$/../../../customer-projects/administration/templates-for-requirements/templates-for-requirements.iml" /> + <module fileurl="file://$PROJECT_DIR$/../version/version.iml" filepath="$PROJECT_DIR$/../version/version.iml" /> </modules> </component> </project> \ No newline at end of file diff --git a/.idea/runConfigurations/go_build_requirements_manager_and_run_requirement_report.xml b/.idea/runConfigurations/go_build_requirements_manager_and_run_requirement_report.xml deleted file mode 100644 index 0c93a80faa3fd57cd2802669069679b17ae88f9c..0000000000000000000000000000000000000000 --- a/.idea/runConfigurations/go_build_requirements_manager_and_run_requirement_report.xml +++ /dev/null @@ -1,13 +0,0 @@ -<component name="ProjectRunConfigurationManager"> - <configuration default="false" name="go build requirements-manager and run requirement report" type="GoApplicationRunConfiguration" factoryName="Go Application"> - <module name="requirements-manager" /> - <working_directory value="$PROJECT_DIR$/application/source" /> - <parameters value="requirements report --grouped-by Estimation -p $PROJECT_DIR$/development/examples/example1" /> - <kind value="DIRECTORY" /> - <package value="gitlab.schukai.com/oss/utilities/requirements-manager" /> - <directory value="$PROJECT_DIR$/application/source" /> - <filePath value="$PROJECT_DIR$/application/source/main.go" /> - <output_directory value="$PROJECT_DIR$/deployment/build" /> - <method v="2" /> - </configuration> -</component> \ No newline at end of file diff --git a/.idea/runConfigurations/go_build_requirements_manager_and_run_add_requirement.xml b/.idea/runConfigurations/reqman_add_requirement.xml similarity index 79% rename from .idea/runConfigurations/go_build_requirements_manager_and_run_add_requirement.xml rename to .idea/runConfigurations/reqman_add_requirement.xml index 8040ce9d3a61dfba151b89af68dc1ecdeedda8a9..479e3013295b46f6664c7813a454c2ef89aafcdb 100644 --- a/.idea/runConfigurations/go_build_requirements_manager_and_run_add_requirement.xml +++ b/.idea/runConfigurations/reqman_add_requirement.xml @@ -1,5 +1,5 @@ <component name="ProjectRunConfigurationManager"> - <configuration default="false" name="go build requirements-manager and run add requirement" type="GoApplicationRunConfiguration" factoryName="Go Application"> + <configuration default="false" name="reqman add requirement" type="GoApplicationRunConfiguration" factoryName="Go Application"> <module name="requirements-manager" /> <working_directory value="$PROJECT_DIR$/application/source" /> <parameters value="requirements add --id 144444 -p $PROJECT_DIR$/development/examples/example1" /> diff --git a/.idea/runConfigurations/go_build_requirements_manager_and_run_add_requirements.xml b/.idea/runConfigurations/reqman_add_requirements.xml similarity index 76% rename from .idea/runConfigurations/go_build_requirements_manager_and_run_add_requirements.xml rename to .idea/runConfigurations/reqman_add_requirements.xml index 45b66e9740882e5b539ce38586c7a1c4a292bc0f..5ffd64e745a3b4028c80e3978a17d5b6b01a1ccb 100644 --- a/.idea/runConfigurations/go_build_requirements_manager_and_run_add_requirements.xml +++ b/.idea/runConfigurations/reqman_add_requirements.xml @@ -1,5 +1,5 @@ <component name="ProjectRunConfigurationManager"> - <configuration default="false" name="go build requirements-manager and run add requirements" type="GoApplicationRunConfiguration" factoryName="Go Application"> + <configuration default="false" name="reqman add requirements" type="GoApplicationRunConfiguration" factoryName="Go Application"> <module name="requirements-manager" /> <working_directory value="$PROJECT_DIR$/application/source" /> <parameters value="requirements add -p $PROJECT_DIR$/development/examples/example1 --id=1425" /> diff --git a/.idea/runConfigurations/go_build_requirements_manager_and_run_create_meta.xml b/.idea/runConfigurations/reqman_create_meta.xml similarity index 80% rename from .idea/runConfigurations/go_build_requirements_manager_and_run_create_meta.xml rename to .idea/runConfigurations/reqman_create_meta.xml index f96d00619dbefa0645e643873b00caea009cc258..576095967432833e6218011aeaf742e5d2976e62 100644 --- a/.idea/runConfigurations/go_build_requirements_manager_and_run_create_meta.xml +++ b/.idea/runConfigurations/reqman_create_meta.xml @@ -1,5 +1,5 @@ <component name="ProjectRunConfigurationManager"> - <configuration default="false" name="go build requirements-manager and run create meta" type="GoApplicationRunConfiguration" factoryName="Go Application"> + <configuration default="false" name="reqman create meta" type="GoApplicationRunConfiguration" factoryName="Go Application"> <module name="requirements-manager" /> <working_directory value="$PROJECT_DIR$/application/source" /> <parameters value="meta print -c ID -c Title -c Created -c Version -c File -p $PROJECT_DIR$/development/examples/example1" /> diff --git a/.idea/runConfigurations/reqman_issues_gitlab_sync.xml b/.idea/runConfigurations/reqman_issues_gitlab_sync.xml new file mode 100644 index 0000000000000000000000000000000000000000..15cac09093d37ad3e60f7872b98fe90f30ed4512 --- /dev/null +++ b/.idea/runConfigurations/reqman_issues_gitlab_sync.xml @@ -0,0 +1,14 @@ +<component name="ProjectRunConfigurationManager"> + <configuration default="false" name="reqman issues gitlab-sync" type="GoApplicationRunConfiguration" factoryName="Go Application"> + <module name="requirements-manager" /> + <working_directory value="$PROJECT_DIR$/application/source" /> + <go_parameters value="-ldflags "-X main.version=1.0.15 -X main.build=20220616123315"" /> + <parameters value="tasks gitlab -p $PROJECT_DIR$/development/examples/example1" /> + <kind value="DIRECTORY" /> + <package value="gitlab.schukai.com/oss/utilities/requirements-manager" /> + <directory value="$PROJECT_DIR$/application/source" /> + <filePath value="$PROJECT_DIR$/application/source/main.go" /> + <output_directory value="$PROJECT_DIR$/deployment/build" /> + <method v="2" /> + </configuration> +</component> \ No newline at end of file diff --git a/.idea/runConfigurations/go_build_requirements_manager_and_run_print_changelog.xml b/.idea/runConfigurations/reqman_print_changelog.xml similarity index 76% rename from .idea/runConfigurations/go_build_requirements_manager_and_run_print_changelog.xml rename to .idea/runConfigurations/reqman_print_changelog.xml index b87056adcbd180fedb4f45d196553ccfaae5ed7f..e56520dcbe42ea71b1f2eedbd03f7953cc36a081 100644 --- a/.idea/runConfigurations/go_build_requirements_manager_and_run_print_changelog.xml +++ b/.idea/runConfigurations/reqman_print_changelog.xml @@ -1,5 +1,5 @@ <component name="ProjectRunConfigurationManager"> - <configuration default="false" name="go build requirements-manager and run print changelog" type="GoApplicationRunConfiguration" factoryName="Go Application"> + <configuration default="false" name="reqman print changelog" type="GoApplicationRunConfiguration" factoryName="Go Application"> <module name="requirements-manager" /> <working_directory value="$PROJECT_DIR$/application/source" /> <parameters value="privacy print --date-format 01.02.2006 -p $PROJECT_DIR$/development/examples/example1" /> diff --git a/.idea/runConfigurations/go_build_requirements_manager_and_run_print_overview.xml b/.idea/runConfigurations/reqman_print_overview.xml similarity index 80% rename from .idea/runConfigurations/go_build_requirements_manager_and_run_print_overview.xml rename to .idea/runConfigurations/reqman_print_overview.xml index 6457f3d23ca25dc6ed655a0d4544deef54ee1548..8e77184999f7a85661e6aebaf55e469f63b7087e 100644 --- a/.idea/runConfigurations/go_build_requirements_manager_and_run_print_overview.xml +++ b/.idea/runConfigurations/reqman_print_overview.xml @@ -1,5 +1,5 @@ <component name="ProjectRunConfigurationManager"> - <configuration default="false" name="go build requirements-manager and run print overview" type="GoApplicationRunConfiguration" factoryName="Go Application"> + <configuration default="false" name="reqman print overview" type="GoApplicationRunConfiguration" factoryName="Go Application"> <module name="requirements-manager" /> <working_directory value="$PROJECT_DIR$/application/source" /> <parameters value="overview print -c ID -c Title -c Version -p $PROJECT_DIR$/development/examples/example1 -o /tmp/overview.pdf -f pdf" /> diff --git a/.idea/runConfigurations/go_build_requirements_manager_and_run_print_overview_mey.xml b/.idea/runConfigurations/reqman_print_overview__mey_.xml similarity index 83% rename from .idea/runConfigurations/go_build_requirements_manager_and_run_print_overview_mey.xml rename to .idea/runConfigurations/reqman_print_overview__mey_.xml index d352f663f66e34c4623d36692730779743a0d328..cef3f6bf4dc0b34c96e0d7d09502f4e30cfa8323 100644 --- a/.idea/runConfigurations/go_build_requirements_manager_and_run_print_overview_mey.xml +++ b/.idea/runConfigurations/reqman_print_overview__mey_.xml @@ -1,5 +1,5 @@ <component name="ProjectRunConfigurationManager"> - <configuration default="false" name="go build requirements-manager and run print overview (mey)" type="GoApplicationRunConfiguration" factoryName="Go Application"> + <configuration default="false" name="reqman print overview (mey)" type="GoApplicationRunConfiguration" factoryName="Go Application"> <module name="requirements-manager" /> <working_directory value="$PROJECT_DIR$/application/source" /> <parameters value="overview print -c ID -c ID -c Title -p $PROJECT_DIR$/../../../customer-projects/mey/alvine/requirement/documents -t $PROJECT_DIR$/../../../customer-projects/mey/alvine/requirement/template/schukai.md -l $PROJECT_DIR$/../../../customer-projects/mey/alvine/requirement/template/schukai.latex -o /tmp/overview.pdf -f pdf" /> diff --git a/.idea/runConfigurations/go_build_requirements_manager_and_run_print_requirements.xml b/.idea/runConfigurations/reqman_print_requirements.xml similarity index 76% rename from .idea/runConfigurations/go_build_requirements_manager_and_run_print_requirements.xml rename to .idea/runConfigurations/reqman_print_requirements.xml index ab66d06d6695ca37cb871846e008379aa59ccf0f..0ba8d82709e430f144d0eff7fdc11f0d707d8664 100644 --- a/.idea/runConfigurations/go_build_requirements_manager_and_run_print_requirements.xml +++ b/.idea/runConfigurations/reqman_print_requirements.xml @@ -1,5 +1,5 @@ <component name="ProjectRunConfigurationManager"> - <configuration default="false" name="go build requirements-manager and run print requirements" type="GoApplicationRunConfiguration" factoryName="Go Application"> + <configuration default="false" name="reqman print requirements" type="GoApplicationRunConfiguration" factoryName="Go Application"> <module name="requirements-manager" /> <working_directory value="$PROJECT_DIR$/application/source" /> <parameters value="requirements print -p $PROJECT_DIR$/development/examples/example1 -c ID -c Title" /> diff --git a/.idea/runConfigurations/go_build_requirements_manager_and_run_print_todo.xml b/.idea/runConfigurations/reqman_print_todo.xml similarity index 79% rename from .idea/runConfigurations/go_build_requirements_manager_and_run_print_todo.xml rename to .idea/runConfigurations/reqman_print_todo.xml index a5896b9ce69b25239cc5163fa49a41c017758494..3cebee5aec535fe72cd37caf0078190bca3a3b64 100644 --- a/.idea/runConfigurations/go_build_requirements_manager_and_run_print_todo.xml +++ b/.idea/runConfigurations/reqman_print_todo.xml @@ -1,5 +1,5 @@ <component name="ProjectRunConfigurationManager"> - <configuration default="false" name="go build requirements-manager and run print todo" type="GoApplicationRunConfiguration" factoryName="Go Application"> + <configuration default="false" name="reqman print todo" type="GoApplicationRunConfiguration" factoryName="Go Application"> <module name="requirements-manager" /> <working_directory value="$PROJECT_DIR$/application/source" /> <parameters value="tasks print -p $PROJECT_DIR$/development/examples/example1" /> diff --git a/.idea/runConfigurations/reqman_requirement_report.xml b/.idea/runConfigurations/reqman_requirement_report.xml new file mode 100644 index 0000000000000000000000000000000000000000..e2bbccbc1f8e368e455bb688795ef80282300e09 --- /dev/null +++ b/.idea/runConfigurations/reqman_requirement_report.xml @@ -0,0 +1,13 @@ +<component name="ProjectRunConfigurationManager"> + <configuration default="false" name="reqman requirement report" type="GoApplicationRunConfiguration" factoryName="Go Application"> + <module name="requirements-manager" /> + <working_directory value="$PROJECT_DIR$/application/source" /> + <parameters value="requirements report --gitlab --grouped-by Estimation -p $PROJECT_DIR$/development/examples/example1/req1/1/test1.md" /> + <kind value="DIRECTORY" /> + <package value="gitlab.schukai.com/oss/utilities/requirements-manager" /> + <directory value="$PROJECT_DIR$/application/source" /> + <filePath value="$PROJECT_DIR$/application/source/main.go" /> + <output_directory value="$PROJECT_DIR$/deployment/build" /> + <method v="2" /> + </configuration> +</component> \ No newline at end of file diff --git a/.idea/runConfigurations/go_build_requirements_manager_and_run_version.xml b/.idea/runConfigurations/reqman_version.xml similarity index 70% rename from .idea/runConfigurations/go_build_requirements_manager_and_run_version.xml rename to .idea/runConfigurations/reqman_version.xml index 6082c3de7968fda89b2982347f63449a06c88738..6233500d822e10570ac96759dd405646ab3e0f68 100644 --- a/.idea/runConfigurations/go_build_requirements_manager_and_run_version.xml +++ b/.idea/runConfigurations/reqman_version.xml @@ -1,7 +1,8 @@ <component name="ProjectRunConfigurationManager"> - <configuration default="false" name="go build requirements-manager and run version" type="GoApplicationRunConfiguration" factoryName="Go Application"> + <configuration default="false" name="reqman version" type="GoApplicationRunConfiguration" factoryName="Go Application"> <module name="requirements-manager" /> <working_directory value="$PROJECT_DIR$/application/source" /> + <go_parameters value="-ldflags "-X main.version=1.0.15 -X main.build=20220616123315"" /> <parameters value="version" /> <kind value="DIRECTORY" /> <package value="gitlab.schukai.com/oss/utilities/requirements-manager" /> diff --git a/.idea/runConfigurations/go_build_requirements_manager_and_run_print_items.xml b/.idea/runConfigurations/reqmanprint_items.xml similarity index 79% rename from .idea/runConfigurations/go_build_requirements_manager_and_run_print_items.xml rename to .idea/runConfigurations/reqmanprint_items.xml index 41912c1d9f57f8a9043cacee561101219e4edd7b..b91cdaa557ab431e7ab5dfed756d649bc73c52e7 100644 --- a/.idea/runConfigurations/go_build_requirements_manager_and_run_print_items.xml +++ b/.idea/runConfigurations/reqmanprint_items.xml @@ -1,5 +1,5 @@ <component name="ProjectRunConfigurationManager"> - <configuration default="false" name="go build requirements-manager and run print items" type="GoApplicationRunConfiguration" factoryName="Go Application"> + <configuration default="false" name="reqmanprint items" type="GoApplicationRunConfiguration" factoryName="Go Application"> <module name="requirements-manager" /> <working_directory value="$PROJECT_DIR$/application/source" /> <parameters value="items print -p $PROJECT_DIR$/development/examples/example1" /> diff --git a/Makefile b/Makefile index 526a093afb4ebfc34f94103715277370a739bc4f..86e3845658cf486d1cfa3083ab3d938e8d39d1f7 100644 --- a/Makefile +++ b/Makefile @@ -6,191 +6,36 @@ ############################################################################################# ############################################################################################# -COPYRIGHT_TEXT := © schukai GmbH, Released under the AGPL 3.0 License. COMPONENTNAME := RequirementManager -COMPONENTSLUG := $(shell echo "$COMPONENTNAME" | tr '[:upper:]' '[:lower:]') ############################################################################################# ############################################################################################# ## -## more general block with standard definitions +## MORE GENERAL BLOCK WITH STANDARD DEFINITIONS ## ############################################################################################# ############################################################################################# # get Makefile directory name: http://stackoverflow.com/a/5982798/376773 THIS_MAKEFILE_PATH:=$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) -THIS_DIR:=$(shell cd $(dir $(THIS_MAKEFILE_PATH));pwd)/ -THIS_MAKEFILE:=$(THIS_DIR)$(THIS_MAKEFILE_PATH) - -# colors -BLACK := $(shell tput -Txterm setaf 0) -RED := $(shell tput -Txterm setaf 1) -GREEN := $(shell tput -Txterm setaf 2) -YELLOW := $(shell tput -Txterm setaf 3) -LIGHTPURPLE := $(shell tput -Txterm setaf 4) -PURPLE := $(shell tput -Txterm setaf 5) -BLUE := $(shell tput -Txterm setaf 6) -WHITE := $(shell tput -Txterm setaf 7) -RESET := $(shell tput -Txterm sgr0) - -INFO := $(GREEN) -COMMENT := $(YELLOW) - -# Output control and standard outputs -MARKER := $(BLUE)[+]$(RESET) -ERRORMARKER := $(RED)[-]$(RESET) -## Deactivate the quite mode by overwriting the value with space - -ifndef DEBUG - QUIET = @ -else - QUIET = -endif - -ifndef DONTOPENBROWSER - OPENBROWSER = false -else - OPENBROWSER = true -endif - -ECHO := @echo -ECHOMARKER := @echo "$(MARKER) $0" -ECHOERRORMARKER := @echo "$(ERRORMARKER) $0" - -# Use bash instead of sh -## Sets the shell used -SHELL = bash - -# path and binaries -AWK := awk -GO := go -CP := cp -CD := cd -KILL := /bin/kill -M4 := m4 -MV := mv -RM := rm -f -MKDIR := mkdir -p -SED := sed -FIND := find -SORT := sort -TOUCH := touch -WGET := wget -CHMOD := chmod -RSYNC := rsync -DOCKER := docker -NPX := npx -AWS := aws -XARGS := xargs -GREP := grep -NPM := npm -make := make -GIT := git -NPX := npx -NODE := node -LN := ln -s - -# Executable Programs the Installed be have to -EXECUTABLES = $(AWK) $(CP) $(KILL) $(M4) $(MV) rm mkdir $(SED) $(SORT) $(TOUCH) $(WGET) $(CHMOD) $(NPX) $(FIND) $(XARGS) $(GREP) $(NPM) $(GIT) $(NPX) $(NODE) $(GO) ln; -K := $(foreach exec,$(EXECUTABLES),\ - $(if $(shell which $(exec)),some string,$(error "Missing $(exec) in PATH; please install"))) - -check_defined = \ - $(strip $(foreach 1,$1, \ - $(call __check_defined,$1,$(strip $(value 2)),$3))) -__check_defined = \ - $(if $(value $1),, \ - $(ECHOERRORMARKER) $(if $2, $2, $1)) - -############################################################################################# -############################################################################################# -## -## DEFAULT-TARGETS -## -############################################################################################# -############################################################################################# - -# @see .PHONY https://www.gnu.org/software/make/manual/html_node/Phony-Targets.html#Phony-Targets - -.DEFAULT_GOAL := help - -.PHONY: print -print: - $(ECHO) "THIS_MAKEFILE: $(THIS_MAKEFILE)" - $(ECHO) "THIS_MAKEFILE_PATH: $(THIS_MAKEFILE_PATH)" - $(ECHO) "THIS_DIR: $(THIS_DIR)" - -# Add a comment to the public targets so that it appears -# in this help Use two # characters for a help comment -.PHONY: help -help: - @printf "${COMMENT}Usage:${RESET}\n" - @printf " make [target] [arg=\"val\"...]\n\n" - @printf "${COMMENT}Available targets:${RESET}\n" - @awk '/^[a-zA-Z\-\_0-9\.@]+:/ { \ - helpMessage = match(lastLine, /^## (.*)/); \ - if (helpMessage) { \ - helpCommand = substr($$1, 0, index($$1, ":")); \ - helpMessage = substr(lastLine, RSTART + 3, RLENGTH); \ - printf " ${INFO}%-22s${RESET} %s\n", helpCommand, helpMessage; \ - } \ - } \ - { lastLine = $$0 }' $(MAKEFILE_LIST) - @printf "\n${COMMENT}Available arguments:${RESET}\n\n" - @awk '/^(([a-zA-Z\-\_0-9\.@]+)\s=)/ { \ - helpMessage = match(lastLine, /^## (.*)/); \ - if (helpMessage) { \ - helpMessage = substr(lastLine, RSTART + 3, RLENGTH); \ - printf " ${INFO}%-22s${RESET} %s (Default: %s)\n", $$1, helpMessage, $$3; \ - } \ - } \ - { lastLine = $$0 }' $(MAKEFILE_LIST) - -.PHONY: variables -## Print all Variables -variables: - @$(foreach v, $(.VARIABLES), $(if $(filter file,$(origin $(v))), $(info $(INFO)$(v)$(RESET)=$($(v))$(RESET)))) - -check_defined = \ - $(strip $(foreach 1,$1, \ - $(call __check_defined,$1,$(strip $(value 2))))) -__check_defined = \ - $(if $(value $1),, \ - $(error Undefined $1$(if $2, ($2)))) - - - -############################################################################################# -############################################################################################# -## -## DIRECTORIES -## -############################################################################################# -############################################################################################# - -APPLICATION_PATH := $(THIS_DIR)application/ -RESOURCE_PATH := $(THIS_DIR)application/resource/ -SOURCE_PATH := $(THIS_DIR)application/source/ -WEB_PATH := $(THIS_DIR)application/web/ -DEPLOYMENT_PATH := $(THIS_DIR)deployment/ -VENDOR_PATH := $(THIS_DIR)deployment/vendor/ -DEVELOPMENT_PATH := $(THIS_DIR)development/ -SCRIPTS_PATH := $(THIS_DIR)development/scripts/ -DOCUMENTATION_PATH := $(THIS_DIR)documentation/ - -## Build path -BUILD_PATH = $(DEPLOYMENT_PATH)build/ +PROJECT_ROOT:=$(shell cd $(dir $(THIS_MAKEFILE_PATH));pwd)/ +THIS_MAKEFILE:=$(PROJECT_ROOT)$(THIS_MAKEFILE_PATH) - - -############################################################################################# -############################################################################################# -## -## DEPENDENCIES (JEKYLL, MINERVA, ...) -## -############################################################################################# -############################################################################################# +include $(PROJECT_ROOT)development/makefile/license-agpl3.mk +include $(PROJECT_ROOT)development/makefile/placeholder.mk +include $(PROJECT_ROOT)development/makefile/directories-default.mk +include $(PROJECT_ROOT)development/makefile/go.mk +include $(PROJECT_ROOT)development/makefile/color.mk +include $(PROJECT_ROOT)development/makefile/terminal.mk +include $(PROJECT_ROOT)development/makefile/output.mk +include $(PROJECT_ROOT)development/makefile/version.mk +include $(PROJECT_ROOT)development/makefile/target-help.mk +include $(PROJECT_ROOT)development/makefile/target-init.mk +include $(PROJECT_ROOT)development/makefile/target-deploy-tool.mk +include $(PROJECT_ROOT)development/makefile/target-build-go.mk +include $(PROJECT_ROOT)development/makefile/target-git.mk +include $(PROJECT_ROOT)development/makefile/terminal-check.mk + ############################################################################################# @@ -202,38 +47,6 @@ BUILD_PATH = $(DEPLOYMENT_PATH)build/ ############################################################################################# + -############################################################################################# -############################################################################################# -## -## PROJECT-TARGETS -## -############################################################################################# -############################################################################################# - -############################################################################################# -############################################################################################# -## -## PROJECT-TARGETS -## -############################################################################################# -############################################################################################# - -## Compiling for every OS and Platform -compile: - echo "Compiling for every OS and Platform" - - cd $(SOURCE_PATH); GOOS=linux GOARCH=arm $(GO) build -o $(BUILD_PATH)reqman-linux-arm; cd - - cd $(SOURCE_PATH); GOOS=linux GOARCH=amd64 $(GO) build -o $(BUILD_PATH)reqman-linux-amd64; cd - - cd $(SOURCE_PATH); GOOS=linux GOARCH=arm64 $(GO) build -o $(BUILD_PATH)reqman-linux-arm64; cd - - cd $(SOURCE_PATH); GOOS=linux GOARCH=386 $(GO) build -o $(BUILD_PATH)reqman-linux-386; cd - - cd $(SOURCE_PATH); GOOS=windows GOARCH=amd64 $(GO) build -o $(BUILD_PATH)reqman-windows; cd - - -## compile and deplay to aws -deploy: compile - find $(BUILD_PATH) -iname reqman-* -exec aws s3 cp {} s3://download.schukai.com/tools/reqman/ \; - -## overview-to-aws -overview-to-aws: - aws s3 cp $(WEB_PATH)/index.html s3://download.schukai.com/tools/reqman/ - \ No newline at end of file + diff --git a/application/source/commandline.go b/application/source/commandline.go index 45c82d0f5fc1d2302944579791a6aa194b794e5d..86ab5e46060814d454a96c1284c7526820691757 100644 --- a/application/source/commandline.go +++ b/application/source/commandline.go @@ -22,12 +22,25 @@ type commandLineOptions struct { } `command:"add"` Report struct { GroupedBy string `long:"grouped-by" required:"false" description:"grouped by"` + Gitlab bool `long:"gitlab" description:"get data from gitlab"` } `command:"report"` } `command:"requirements"` Tasks struct { Print struct { } `command:"print"` + Gitlab struct { + ProjectID string `long:"project-id" required:"false" description:"gitlab project id"` + Token string `long:"token" required:"false" description:"gitlab token"` + } `command:"gitlab"` } `command:"tasks"` + Issues struct { + Print struct { + } `command:"print"` + Gitlab struct { + ProjectID string `long:"project-id" required:"false" description:"gitlab project id"` + Token string `long:"token" required:"false" description:"gitlab token"` + } `command:"gitlab"` + } `command:"issues"` Items struct { Print struct { } `command:"print"` @@ -74,9 +87,10 @@ func executeCommand() { activeCommand := p.Command.Active - version = "development" - build = "1.1.1" - // + if activeCommand == nil { + return + } + switch activeCommand.Name { case "version": @@ -160,6 +174,18 @@ func executeCommand() { } } + case "issues": + subcommand := activeCommand.Active + switch subcommand.Name { + case "print": + err := printIssueTable(config) + if err != nil { + printErrorAndExit(2, err.Error()) + } + case "gitlab": + syncTasksWithGitlab(config) + } + case "items": subcommand := activeCommand.Active switch subcommand.Name { diff --git a/application/source/config.go b/application/source/config.go index 2ddd00d2f360bcec02542c8c683eeebfd7d6cba1..ca5d6a4b2e70745336bde1e2171a9ccde24d9021 100644 --- a/application/source/config.go +++ b/application/source/config.go @@ -29,6 +29,10 @@ type Configuration struct { DateFormat string `yaml:"DateFormat"` } `yaml:"Locale"` + GitLab struct { + Token string `yaml:"Token"` + } `yaml:"GitLab"` + Overview struct { Template struct { Markdown string `yaml:"Markdown"` diff --git a/application/source/defaults.go b/application/source/defaults.go index 02ae4cdd21ffac4348930539a3b189b69e881525..fb35a014df6f4fe96dc5d89c56b5e723322503b4 100644 --- a/application/source/defaults.go +++ b/application/source/defaults.go @@ -103,6 +103,11 @@ Source: null Created: %%CREATED%% Last Update: null +# The issues that are associated with this requirement +Issues: + - Title: null + URL: null + # the individual items as a list Items: - ID: null @@ -110,7 +115,7 @@ Items: # what is it, a image, font, legal information, access data, texts, decisions, etc. Type: null # does this belong to a group - Group: null + group: null Description: null Delivery until: null # when was the project items delivered and by whom? diff --git a/application/source/errors.go b/application/source/errors.go new file mode 100644 index 0000000000000000000000000000000000000000..4b6c55a4fe22786b54cd43c2d05f8b71efda10a7 --- /dev/null +++ b/application/source/errors.go @@ -0,0 +1,7 @@ +package main + +import "errors" + +var ( + noGitRepositoryError = errors.New("no git repository found") +) diff --git a/application/source/gitlab.go b/application/source/gitlab.go new file mode 100644 index 0000000000000000000000000000000000000000..afdbc1f99352f8fc7e4f18da212f52911a2370a1 --- /dev/null +++ b/application/source/gitlab.go @@ -0,0 +1,167 @@ +package main + +import ( + "net/url" + "path" + + "github.com/go-git/go-git/v5" + "github.com/xanzy/go-gitlab" +) + +type gitlabContext struct { + rootPath string + repos *git.Repository + apiUrl url.URL + + group string + name string + + token string + client *gitlab.Client + + project *gitlab.Project +} + +func getGitlabContext(config *Configuration) *gitlabContext { + + context := &gitlabContext{} + workingPath, err := getGitDirectory(config) + if err != nil { + printErrorAndExit(2, "Failed to get git directory", err.Error()) + } + + context.rootPath = workingPath + + repos, err := git.PlainOpen(workingPath) + if err != nil { + printErrorAndExit(2, "Failed to open repository", err.Error()) + } + + context.repos = repos + if err != nil { + printErrorAndExit(2, "Failed to get remotes", err.Error()) + } + + remotes, err := repos.Remotes() + if err != nil { + printErrorAndExit(2, "Failed to get remotes", err.Error()) + } + + remote := remotes[0] + if remote == nil { + printErrorAndExit(2, "Failed to get remote") + } + + urls := remote.Config().URLs + if len(urls) == 0 { + printErrorAndExit(2, "Failed to get remote url") + } + + u, err := url.Parse(urls[0]) + if err != nil { + printErrorAndExit(2, "Failed to parse remote url", err.Error()) + } + + context.apiUrl = *u + context.apiUrl.Path = "" //path.Join("api", "v4") + + p := u.Path + if p == "" { + printErrorAndExit(2, "Failed to get remote path") + } + + s := p[1 : len(p)-4] + context.name = path.Base(s) + context.group = path.Dir(s) + + options := gitlab.WithBaseURL(context.apiUrl.String()) + + context.token = config.GitLab.Token + c, err := gitlab.NewClient(config.GitLab.Token, options) + if err != nil { + printErrorAndExit(2, "Failed to create client", err.Error()) + } + + context.client = c + + return context +} + +func searchProject(context *gitlabContext) { + // + options := gitlab.ListProjectsOptions{ + Search: gitlab.String(context.group + "/" + context.name), + SearchNamespaces: gitlab.Bool(true), + } + + projects, response, err := context.client.Projects.ListProjects(&options) + + if response.StatusCode == 404 { + printErrorAndExit(2, "Project not found %s", err.Error()) + } + + if err != nil { + printErrorAndExit(2, "Failed to get projects %s", err.Error()) + } + + if response.StatusCode != 200 { + printErrorAndExit(2, "Failed to get projects %s", err.Error()) + } + + if len(projects) == 0 { + printErrorAndExit(2, "Project not found") + } + + context.project = projects[0] + +} + +func enrichIssuesWithGitlab(pageMap *map[string]requirement, config *Configuration) error { + + context := getGitlabContext(config) + searchProject(context) + + for _, requirement := range *pageMap { + for k, issue := range requirement.Issues { + + if issue.GitlabID == 0 { + continue + } + + i, err := loadIssuesFromGitlab(context, issue.GitlabID) + if err != nil { + return err + } + + // requirement is a copy of the original requirement + // this works because issue is a pointer + requirement.Issues[k].Gitlab = i + } + } + + return nil +} + +// +//func getProject(config *Configuration) *gitlab.Project { +// +// client := getGitlabClient(config) +// +// pattern := "test" +// +// options := gitlab.ListProjectsOptions{ +// Search: &pattern, +// } +// +// projects, _, err := client.Projects.ListProjects(&options) +// if err != nil { +// printErrorAndExit(2, "Failed to get projects", err.Error()) +// } +// +// //project, _, err := client.Projects.GetProject(config.GitlabProjectID, nil) +// //if err != nil { +// // printErrorAndExit(2, "Failed to get project", err.Error()) +// //} +// +// return projects[0] +//} diff --git a/application/source/go.mod b/application/source/go.mod index e7ce292178ddc68dd10ef94b91796aae9c8d3d5d..330611b39c3723298d9b5ed9080851ed5207faf5 100644 --- a/application/source/go.mod +++ b/application/source/go.mod @@ -3,19 +3,47 @@ module gitlab.schukai.com/oss/utilities/requirements-manager go 1.18 require ( - github.com/gookit/color v1.5.0 + github.com/gookit/color v1.5.1 github.com/jessevdk/go-flags v1.5.0 github.com/olekukonko/tablewriter v0.0.5 golang.org/x/text v0.3.7 - gopkg.in/yaml.v2 v2.2.8 - gopkg.in/yaml.v3 v3.0.0-20220512140231-539c8e751b99 + gopkg.in/yaml.v2 v2.4.0 + gopkg.in/yaml.v3 v3.0.1 ) require ( + github.com/Microsoft/go-winio v0.5.2 // indirect + github.com/ProtonMail/go-crypto v0.0.0-20220517143526-88bb52951d5b // indirect + github.com/acomagu/bufpipe v1.0.3 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/kr/pretty v0.1.0 // indirect - github.com/mattn/go-runewidth v0.0.9 // indirect + github.com/emirpasic/gods v1.18.1 // indirect + github.com/go-git/gcfg v1.5.0 // indirect + github.com/go-git/go-billy/v5 v5.3.1 // indirect + github.com/go-git/go-git/v5 v5.4.2 // indirect + github.com/golang/protobuf v1.5.2 // indirect + github.com/google/go-querystring v1.1.0 // indirect + github.com/hashicorp/go-cleanhttp v0.5.2 // indirect + github.com/hashicorp/go-retryablehttp v0.7.1 // indirect + github.com/imdario/mergo v0.3.13 // indirect + github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect + github.com/kevinburke/ssh_config v1.2.0 // indirect + github.com/kr/pretty v0.2.1 // indirect + github.com/mattn/go-runewidth v0.0.13 // indirect + github.com/mitchellh/go-homedir v1.1.0 // indirect + github.com/rivo/uniseg v0.2.0 // indirect + github.com/sergi/go-diff v1.2.0 // indirect + github.com/src-d/gcfg v1.4.0 // indirect + github.com/xanzy/go-gitlab v0.68.0 // indirect + github.com/xanzy/ssh-agent v0.3.1 // indirect github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 // indirect - golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886 // indirect - gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect + golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e // indirect + golang.org/x/net v0.0.0-20220615171555-694bf12d69de // indirect + golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb // indirect + golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c // indirect + golang.org/x/time v0.0.0-20220609170525-579cf78fd858 // indirect + google.golang.org/appengine v1.6.7 // indirect + google.golang.org/protobuf v1.28.0 // indirect + gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect + gopkg.in/src-d/go-billy.v4 v4.3.2 // indirect + gopkg.in/warnings.v0 v0.1.2 // indirect ) diff --git a/application/source/go.sum b/application/source/go.sum index 895c07886a4b18d1f53a328df7a3ca7769897a75..f0dafbc22c05b70a6b056b40bf24e2e047814711 100644 --- a/application/source/go.sum +++ b/application/source/go.sum @@ -1,39 +1,544 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= +github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.5.2 h1:a9IhgEQBCUEk6QCdml9CiJGhAws+YwffDHEMp1VMrpA= +github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= +github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7/go.mod h1:z4/9nQmJSSwwds7ejkxaJwO37dru3geImFUdJlaLzQo= +github.com/ProtonMail/go-crypto v0.0.0-20220517143526-88bb52951d5b h1:lcbBNuQhppsc7A5gjdHmdlqUqJfgGMylBdGyDs0j7G8= +github.com/ProtonMail/go-crypto v0.0.0-20220517143526-88bb52951d5b/go.mod h1:z4/9nQmJSSwwds7ejkxaJwO37dru3geImFUdJlaLzQo= +github.com/acomagu/bufpipe v1.0.3 h1:fxAGrHZTgQ9w5QqVItgzwj235/uYZYgbXitB+dLupOk= +github.com/acomagu/bufpipe v1.0.3/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4= +github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs= +github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= +github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= +github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= +github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= +github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= +github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4= +github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= +github.com/go-git/go-billy/v5 v5.2.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= +github.com/go-git/go-billy/v5 v5.3.1 h1:CPiOUAzKtMRvolEKw+bG1PLRpT7D3LIs3/3ey4Aiu34= +github.com/go-git/go-billy/v5 v5.3.1/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= +github.com/go-git/go-git v4.7.0+incompatible h1:+W9rgGY4DOKKdX2x6HxSR7HNeTxqiKrOvKnuittYVdA= +github.com/go-git/go-git v4.7.0+incompatible/go.mod h1:6+421e08gnZWn30y26Vchf7efgYLe4dl5OQbBSUXShE= +github.com/go-git/go-git-fixtures/v4 v4.2.1/go.mod h1:K8zd3kDUAykwTdDCr+I0per6Y6vMiRR/nnVTBtavnB0= +github.com/go-git/go-git/v5 v5.4.2 h1:BXyZu9t0VkbiHtqrsvdq39UDhGJTl1h55VW6CSC4aY4= +github.com/go-git/go-git/v5 v5.4.2/go.mod h1:gQ1kArt6d+n+BGd+/B/I74HwRTLhth2+zti4ihgckDc= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= +github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/gookit/color v1.5.0 h1:1Opow3+BWDwqor78DcJkJCIwnkviFi+rrOANki9BUFw= github.com/gookit/color v1.5.0/go.mod h1:43aQb+Zerm/BWh2GnrgOQm7ffz7tvQXEKV6BFMl7wAo= +github.com/gookit/color v1.5.1 h1:Vjg2VEcdHpwq+oY63s/ksHrgJYCTo0bwWvmmYWdE9fQ= +github.com/gookit/color v1.5.1/go.mod h1:wZFzea4X8qN6vHOSP2apMb4/+w/orMznEzYsIHPaqKM= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= +github.com/hashicorp/go-retryablehttp v0.7.1 h1:sUiuQAnLlbvmExtFQs72iFW/HXeUn8Z1aJLQ4LJJbTQ= +github.com/hashicorp/go-retryablehttp v0.7.1/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= +github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.5.0 h1:1jKYvbxEjfUl0fmqTCOfonvskHHXMjBySTLW4y9LFvc= github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd h1:Coekwdh0v2wtGp9Gmz1Ze3eVRAWJMLokvN3QjdzCHLY= +github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= +github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= +github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= +github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/matryer/is v1.2.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlWXA= github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= +github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= +github.com/pelletier/go-buffruneio v0.2.0/go.mod h1:JkE26KsDizTr40EUHkXVtNPvgGtbSNq5BcowyYOWdKo= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= +github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/src-d/gcfg v1.4.0 h1:xXbNR5AlLSA315x2UO+fTSSAXCDf+Ar38/6oyGbDKQ4= +github.com/src-d/gcfg v1.4.0/go.mod h1:p/UMsR43ujA89BJY9duynAwIpvqEujIH/jFlfL7jWoI= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.2 h1:4jaiDzPyXQvSd7D0EjG45355tLlV3VOECpq10pLC+8s= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= +github.com/xanzy/go-gitlab v0.68.0 h1:b2iMQHgZ1V+NyRqLRJVv6RFfr4xnd/AASeS/PETYL0Y= +github.com/xanzy/go-gitlab v0.68.0/go.mod h1:o4yExCtdaqlM8YGdDJWuZoBmfxBsmA9TPEjs9mx1UO4= +github.com/xanzy/ssh-agent v0.2.1 h1:TCbipTQL2JiiCprBWx9frJ2eJlCYT00NmctrHxVAr70= +github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4= +github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0= +github.com/xanzy/ssh-agent v0.3.1 h1:AmzO1SSWxw73zxFZPRwaMN1MohDw8UyHnmuxyceTEGo= +github.com/xanzy/ssh-agent v0.3.1/go.mod h1:QIE4lCeL7nkC25x+yA3LBIYfwCc1TFziCtG7cBAac6w= github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 h1:QldyIu/L63oPpyvQmHgvgickp1Yw510KJOqX7H24mg8= github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e h1:T8NU3HyQ8ClP4SEE+KbFlg6n0NhuTsN4MyznaarGsZM= +golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2 h1:NWy5+hlRbC7HK+PmcXVUmW1IMyFce7to56IUvhUFm7Y= +golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220615171555-694bf12d69de h1:ogOG2+P6LjO2j55AkRScrkB2BFpd+Z8TY2wcM0Z3MGo= +golang.org/x/net v0.0.0-20220615171555-694bf12d69de/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5 h1:OSnWWcOd/CtWQC2cYSBgbTSJv3ciqd8r54ySIW2y3RE= +golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb h1:8tDJ3aechhddbdPAxpycgXHJRMLpk/Ab+aa4OgdN5/g= +golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210502180810-71e4cd670f79/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886 h1:eJv7u3ksNXoLbGSKuv2s/SIO4tJVxc/A+MTpzxDgz/Q= golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c h1:aFV+BgZ4svzjfabn8ERpuB4JI4N6/rdy1iusx77G3oU= +golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20220411224347-583f2d630306 h1:+gHMid33q6pen7kv9xvT+JRinntgeXO2AeZVd0AWD3w= +golang.org/x/time v0.0.0-20220411224347-583f2d630306/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20220609170525-579cf78fd858 h1:Dpdu/EMxGMFgq0CeYMh4fazTD2vtlZRYE7wyynxJb9U= +golang.org/x/time v0.0.0-20220609170525-579cf78fd858/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190729092621-ff9f1409240a/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/src-d/go-billy.v4 v4.3.2 h1:0SQA1pRztfTFx2miS8sA97XvooFeNOmvUenF4o0EcVg= +gopkg.in/src-d/go-billy.v4 v4.3.2/go.mod h1:nDjArDMp+XMs1aFAESLRjfGSgfvoYN0hDfzEk0GjC98= +gopkg.in/src-d/go-git-fixtures.v3 v3.5.0/go.mod h1:dLBcvytrw/TYZsNTWCnkNF2DSIlzWYqTe3rJR56Ac7g= +gopkg.in/src-d/go-git.v4 v4.13.1 h1:SRtFyV8Kxc0UP7aCHcijOMQGPxHSmMOPrzulQWolkYE= +gopkg.in/src-d/go-git.v4 v4.13.1/go.mod h1:nx5NYcxdKxq5fpltdHnPa2Exj4Sx0EclMWZQbYDu2z8= +gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20220512140231-539c8e751b99 h1:dbuHpmKjkDzSOMKAWl10QNlgaZUd3V1q99xc81tt2Kc= gopkg.in/yaml.v3 v3.0.0-20220512140231-539c8e751b99/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/application/source/issues.go b/application/source/issues.go new file mode 100644 index 0000000000000000000000000000000000000000..36c58d7dd9f25b44535477bc77db0e8b5fd9e0a7 --- /dev/null +++ b/application/source/issues.go @@ -0,0 +1,172 @@ +package main + +import ( + "bytes" + "fmt" + "strings" + "time" + + "github.com/xanzy/go-gitlab" + + "github.com/olekukonko/tablewriter" +) + +type Issue struct { + GitlabID int `yaml:"Gitlab-ID"` + Gitlab *gitlab.Issue + //Title string `yaml:"Title"` + //URL string `yaml:"URL"` + //ID string `yaml:"ID"` + //Name string `yaml:"Name"` + //Type string `yaml:"Type"` + //Group string `yaml:"group"` + //Description string `yaml:"Description"` + //DeliveryUntil time.Time `yaml:"Delivery until"` + //ProvidedOn time.Time `yaml:"Provided on"` + //ProvidedBy string `yaml:"Provided by"` +} + +func loadIssuesFromGitlab(context *gitlabContext, issueID int) (*gitlab.Issue, error) { + + client := context.client + + issue, _, err := client.Issues.GetIssue(context.project.ID, issueID) // .ListProjectIssues(context.project.ID, &gitlab.ListProjectIssuesOptions{}) + if err != nil { + return nil, err + } + + return issue, nil + + //err, pageData := collectStructureFromFiles(config.Path) +} + +func buildIssueOverviewTable(config *Configuration, pageMap map[string]requirement, extended bool) (error, string, bool) { + + buf := new(bytes.Buffer) + has := false + + table := tablewriter.NewWriter(buf) + + header := []string{ + printer.Sprintf("ID"), + printer.Sprintf("Title"), + printer.Sprintf("State")} + + if extended == true { + + header = append(header, printer.Sprintf("Assignees")) + header = append(header, printer.Sprintf("Due date")) + header = append(header, printer.Sprintf("Labels")) + header = append(header, printer.Sprintf("Estimate")) + header = append(header, printer.Sprintf("Spent")) + } + + table.SetHeader(header) + + table.SetBorders(tablewriter.Border{Left: true, Top: false, Right: true, Bottom: false}) + table.SetCenterSeparator("|") + + var tableData [][]string + + for _, requirement := range pageMap { + for _, issue := range requirement.Issues { + + gitlab := issue.Gitlab + + var col []string + dueDate := "—" + id := printer.Sprintf("%d", issue.GitlabID) + + labels := "—" + estimate := "—" + spent := "—" + state := "—" + title := "—" + assignees := "—" + + if gitlab != nil { + if gitlab.DueDate != nil { + d := (time.Time)(*gitlab.DueDate) + dueDate = d.Format(config.Locale.DateFormat) + } + + labels = printer.Sprintf("%s", strings.Join(gitlab.Labels, ", ")) + estimate = printer.Sprintf("%s", gitlab.TimeStats.HumanTimeEstimate) + spent = printer.Sprintf("%s", gitlab.TimeStats.HumanTotalTimeSpent) + state = printer.Sprintf(gitlab.State) + title = printer.Sprintf("%s", gitlab.Title) + + a := []string{} + for _, assignee := range gitlab.Assignees { + a = append(a, assignee.Name) + } + + assignees = printer.Sprintf("%s", strings.Join(a, ", ")) + + } + + if extended { + col = []string{id, title, state, assignees, dueDate, labels, estimate, spent} + } else { + col = []string{id, title, state, labels} + } + + tableData = append(tableData, col) + has = true + + } + + } + + table.AppendBulk(tableData) // Add Bulk Data + table.SetHeaderAlignment(tablewriter.ALIGN_LEFT) + table.Render() + + return nil, buf.String(), has +} + +func printIssueTable(config *Configuration) error { + err, pageMap := collectStructureFromFiles(config.Path) + enrichIssuesWithGitlab(&pageMap, config) + if err != nil { + return err + } + + err, table, _ := buildIssueOverviewTable(config, pageMap, true) + fmt.Println(table) + + return nil +} + +func syncTasksWithGitlab(config *Configuration) error { + + err, pageData := collectStructureFromFiles(config.Path) + if err != nil { + return err + } + + issuesList := []Issue{} + + for _, pageData := range pageData { + for _, info := range pageData.Issues { + issuesList = append(issuesList, info) + } + } + + context := getGitlabContext(config) + searchProject(context) + + client := context.client + + issues, response, err := client.Issues.ListProjectIssues(context.project.ID, &gitlab.ListProjectIssuesOptions{}) + if err != nil { + printErrorAndExit(0, "Failed to get issues %s", err.Error()) + } + + for _, issue := range issues { + fmt.Println(issue.Title) + } + fmt.Println(response.StatusCode) + + return nil +} diff --git a/application/source/items.go b/application/source/items.go index 5213f22f33c9453676e4ec071eb3259e602f1131..567df8ff85aa153c689537282d0462c2dd6dca5d 100644 --- a/application/source/items.go +++ b/application/source/items.go @@ -12,7 +12,7 @@ type Item struct { ID string `yaml:"ID"` Name string `yaml:"Name"` Type string `yaml:"Type"` - Group string `yaml:"Group"` + Group string `yaml:"group"` Description string `yaml:"Description"` DeliveryUntil time.Time `yaml:"Delivery until"` ProvidedOn time.Time `yaml:"Provided on"` @@ -31,7 +31,7 @@ func buildItemOverviewTable(config *Configuration, pageMap map[string]requiremen if extended { header = []string{ printer.Sprintf("ID"), - printer.Sprintf("Group"), + printer.Sprintf("group"), printer.Sprintf("Name"), printer.Sprintf("Type"), printer.Sprintf("Description"), diff --git a/application/source/l10n.go b/application/source/l10n.go index f5265397cb046b4d0754c7c3375499990c6ee3f1..b7ad9c2d1aa825f4904a3cee3ff30bb4848a01e2 100644 --- a/application/source/l10n.go +++ b/application/source/l10n.go @@ -57,10 +57,10 @@ var l10nMap = []l10nKeyTranslation{ {"en", "file"}, }, }, { - "Group", + "group", []l10nLocaleTranslation{ {"de", "Gruppe"}, - {"en", "Group"}, + {"en", "group"}, }, }, { @@ -351,13 +351,82 @@ var l10nMap = []l10nKeyTranslation{ {"de", "nicht unterstützter Typ %s"}, {"en", "unsuported type %s"}, }, - }, { + }, + { "no value", []l10nLocaleTranslation{ {"de", "kein Wert"}, {"en", "no value"}, }, }, + { + "opened", + []l10nLocaleTranslation{ + {"de", "offen"}, + {"en", "opened"}, + }, + }, + + { + "closed", + []l10nLocaleTranslation{ + {"de", "geschlossen"}, + {"en", "closed"}, + }, + }, + + { + "State", + []l10nLocaleTranslation{ + {"de", "Status"}, + {"en", "State"}, + }, + }, + { + "Due date", + []l10nLocaleTranslation{ + {"de", "Fälligkeitsdatum"}, + {"en", "Due Date"}, + }, + }, + + { + "Labels", + []l10nLocaleTranslation{ + {"de", "Labels"}, + {"en", "Labels"}, + }, + }, + + { + "Estimate", + []l10nLocaleTranslation{ + {"de", "Planwert"}, + {"en", "Estimate"}, + }, + }, + + { + "Spent", + []l10nLocaleTranslation{ + {"de", "Aufwand"}, + {"en", "Spent"}, + }, + }, + + { + "Assignees", + []l10nLocaleTranslation{ + {"de", "Zuweisungen"}, + {"en", "Assignees"}, + }, + }, { + "Statistics", + []l10nLocaleTranslation{ + {"de", "Statistiken"}, + {"en", "Statistics"}, + }, + }, } func initL10n() { diff --git a/application/source/main.go b/application/source/main.go index 039971fa1eb0f8dbc1593dcf20017eb373fa3010..ff52d3b2edb959647fdf4b682d1dbe253e2edf1c 100644 --- a/application/source/main.go +++ b/application/source/main.go @@ -1,11 +1,9 @@ package main import ( - //"crypto/tls" "os" "golang.org/x/text/language" - "golang.org/x/text/message" ) @@ -48,7 +46,5 @@ func initEnvironment() { /** */ func main() { - executeCommand() - } diff --git a/application/source/requirements.go b/application/source/requirements.go index f0e09bfe383e91d7306fd12adf925037298f0df4..69f8217c0531c79874400798b26e6a4efadd2602 100644 --- a/application/source/requirements.go +++ b/application/source/requirements.go @@ -20,6 +20,7 @@ type requirement struct { File string Items []Item `yaml:"Items"` Privacy []Privacy `yaml:"Privacy"` + Issues []Issue `yaml:"Issues"` ID string `yaml:"ID"` References []string `yaml:"References"` @@ -161,7 +162,53 @@ func printRequirements(config *Configuration) error { return err } -func buildTimeReport(config *Configuration, arguments *commandLineOptions, pageMap map[string]requirement) (error, string, string, bool) { +func integrateGitlabTimeSpent(pageMap *map[string]requirement) { + + for k, requirement := range *pageMap { + + for _, i := range requirement.Issues { + if i.Gitlab == nil { + continue + } + + //d := time.Duration(i.Gitlab.TimeStats.TotalTimeSpent) * time.Second + //fmt.Println(fn, d) + //ref[fn].TimeSpent += d + requirement.TimeSpent = 99999999 + requirement.Status = "done" + + // fmt.Println(i.Gitlab.TimeStats.TotalTimeSpent) + } + + pageMap[k] = requirement + + //if &pd.Issues == nil || &pd.Issues. == nil { + // continue + //} + // + //for _, issue := range pd.Issues.Gitlab { + // if issue == nil { + // continue + // } + // pd.TimeSpent += *issue.TimeSpent + //} + + } + fmt.Println("integrateGitlabTimeSpent") + +} + +func buildTimeReport(config *Configuration, arguments *commandLineOptions, pageMap *map[string]requirement) (error, string, string, bool) { + + if arguments.Requirements.Report.Gitlab { + err := enrichIssuesWithGitlab(pageMap, config) + if err != nil { + return err, "", "", false + } + + integrateGitlabTimeSpent(pageMap) + + } groupedByKey := arguments.Requirements.Report.GroupedBy if groupedByKey == "" { @@ -171,7 +218,7 @@ func buildTimeReport(config *Configuration, arguments *commandLineOptions, pageM hasReport := false found := false - for _, p := range pageMap { + for _, p := range *pageMap { fields := reflect.VisibleFields(reflect.TypeOf(p)) for _, field := range fields { @@ -196,12 +243,12 @@ func buildTimeReport(config *Configuration, arguments *commandLineOptions, pageM return nil, t1, t2, hasReport } -func buildTable1(groupedByKey string, pageMap map[string]requirement) string { +func buildTable1(groupedByKey string, pageMap *map[string]requirement) string { estimated := map[string]float64{} timeSpent := map[string]float64{} - for _, d := range pageMap { + for _, d := range *pageMap { r := reflect.ValueOf(d) f := r.FieldByName(groupedByKey) @@ -281,12 +328,12 @@ type mathData struct { time timeStruct } -func buildTable2(pageMap map[string]requirement) string { +func buildTable2(pageMap *map[string]requirement) string { est := map[int]mathData{} // inti struct - for _, d := range pageMap { + for _, d := range *pageMap { k := d.Estimation m := mathData{} @@ -302,7 +349,7 @@ func buildTable2(pageMap map[string]requirement) string { } // calc sum - for _, d := range pageMap { + for _, d := range *pageMap { k := d.Estimation s := est[k] @@ -380,7 +427,10 @@ func printRequirementReport(config *Configuration, arguments *commandLineOptions return err } - err, table1, table2, _ := buildTimeReport(config, arguments, pageData) + err, table1, table2, _ := buildTimeReport(config, arguments, &pageData) + if err != nil { + return err + } report := "## " + printer.Sprintf("Auflistung") + "\n\n" report += table1 diff --git a/application/source/util.go b/application/source/util.go index 7bbfac902748e94b8cd06f3b8191bc82bf8b380d..2f109cdb214a4b09cffce79d02ad694be2dcf868 100644 --- a/application/source/util.go +++ b/application/source/util.go @@ -3,6 +3,8 @@ package main import ( "bytes" "errors" + "os" + "path/filepath" "strings" "text/template" @@ -129,3 +131,58 @@ func translateHeaders(columns []string) []string { return result } + +func getGitDirectory(config *Configuration) (string, error) { + + path := config.Path + + fileInfo, err := os.Stat(path) + if err != nil { + return "", err + } + + if !fileInfo.IsDir() { + path = filepath.Dir(path) + } + + return findGitDirectory(path) +} + +func findGitDirectory(path string) (string, error) { + + if path == "" { + return "", noGitRepositoryError + } + + if volume := filepath.VolumeName(path); volume != "" { + if volume == path { + return "", noGitRepositoryError + } + } else { + if path == "/" { + return "", noGitRepositoryError + } + } + + if !exists(filepath.Join(path, ".git")) { + return findGitDirectory(filepath.Dir(path)) + } + + return path, nil + +} + +func exists(path string) bool { + _, err := os.Stat(path) + if err == nil { + return true + } + + if os.IsNotExist(err) { + return false + } + + printErrorAndExit(0, err.Error()) + + return false +} diff --git a/development/examples/example1/1425.md b/development/examples/example1/1425.md new file mode 100644 index 0000000000000000000000000000000000000000..5a5c9b7fc955de7bb508b05f3230bd4ed90a8c1b --- /dev/null +++ b/development/examples/example1/1425.md @@ -0,0 +1,166 @@ + +--- +ID: 1425 +Title: null + +# Reference to other requirements +References: null + +# Display, Functional, Performance, Printing, Report, Testing or Validation +Type: null + +Alias: null + +Keywords: + - Requirement + +# First and last name of the authors as a list +Author: + - null + +# Proposed (The requirement has been requested by an authorized source.), +# In Progress (A business analyst is actively working on crafting the requirement.), +# Drafted (The initial version of the requirement has been written.), +# Approved (The requirement has been analyzed, its impact on the project has been estimated, and it has been allocated to the baseline for a specific release. ), +# Implemented (The code that implements the requirement has been designed, written, and unit tested. The requirement has been traced to the pertinent design and code elements. It’s now ready for review or other verification.), +# Verified (The requirement has satisfied its acceptance criteria, meaning that the correct functioning of the implemented requirement has been confirmed.), +# Deferred (An approved requirement is now planned for implementation in a later release.), +# Deleted (An approved requirement has been removed from the baseline.) or +# Rejected (The requirement was proposed but was never approved and is not planned for implementation in any upcoming release.) +Status: "Proposed" + +# Low, Medium, Hi +Complexity: null +# Low, Medium, Hi +Difficulty: null +# Nice to have, Low, Medium, Hi or Blocker +Priority: null +Version: 0.0.1 +Milestone: null + +# 0 (means that a task has already been completed), 1 (is a very small task), 2, 3, 5 (are rather smaller tasks), +# 8, 13, 20, 40, 100 +Estimation: + +# The time required for this requirement +# Valid time units are “ns”, “us” (or “µs”), “ms”, “s”, “m”, “h”. +Time Spent: + +# who is the source of the demand +Source: null +Created: 2022-06-18 +Last Update: null + +# The issues that are associated with this requirement +Issues: + - Title: null + URL: null + +# the individual items as a list +Items: + - ID: null + Name: null + # what is it, a image, font, legal information, access data, texts, decisions, etc. + Type: null + # does this belong to a group + group: null + Description: null + Delivery until: null + # when was the project items delivered and by whom? + Provided on: null + Provided by: null + +# https://gdpr-info.eu/art-30-gdpr/ +Privacy: + - ID: null + + # Purpose of the data processing, + # for example, shipping an order and handing it over to a shipping service provider. + Purposes: null + + # More detailed description of the reason and process of data processing. + Description: null + + # Who is responsible for data protection + Contact: null + + # But working with these categories might end up being a bad idea since doing so might + # mean packing different things into one. This leads to either oversimplifications or + # a lot of specifications within a category. It might be advisable to split some of them + # up or to add additional ones to make them fit your business reality. + # Examples: Employees, Suppliers, Customers, Job applicants, Consultants, Visitors, Prospects, Contractors, Trainees + Affected Groups: null + + # + Category: + + # Example: 5 years from the payment of the salary + Data Retention Period: null + + # On what legal basis is the data collected + # Special legal regulation outside the GDPR + # Consent of the data subject (Art. 6 para. 1 a) DSG-VO) use Consent field + # Collective agreement (e.g. company agreement, collective agreement) + # Establishment, performance or termination of an employment relationship (nationally regulated in the BDSG) + # Contract or initiation of a contract with the data subject (Art. 6 para. 1 b) DSG-VO.) + # Balancing of interests (Art. 6 para. 1 f) DSG-VO): Please name the overriding interests + Legal Basis: null + + # “Consent” of the data subject refers to any freely given specific, informed and unambiguous indication of his or + # her wishes in the form of a statement or other unambiguous affirmative act by which the data subject signifies + # his or her agreement to personal data relating to him or her being processed. + Consent: null + + # Where applicable, transfers of personal data to a third country or an international organisation, including + # the identification of that third country or international organisation and, in the case of transfers referred + # to in the second subparagraph of Article 49(1), the documentation of suitable safeguards; + Transfers: + + # Where possible, a general description of the technical and organisational + # security measures referred to in Article 32(1). + TOM: null + +... + +### {{ .Title }} - {{ .ID }} + +#### Subheading + +- [ ] task 1 +- [ ] task 2 + + +{{ if .Items }} +#### Items + +| ID | Name | Delivery until | Provided on | +|--------------------|--------------|----------------------:|-----------------------------------------:| +{{ range .Items + }}| {{ .ID }} | {{ .Name }} | {{ .DeliveryUntil.Format "02.Jan" }} | {{ .ProvidedOn.Format "02.Jan" }} | +{{ end }} + +{{ end }} + +{{ if .Privacy }} +#### Privacy + +{{ range .Privacy }} +{{ if .Purposes }}**{{ .Purposes }}** {{ end }}**({{ .ID }})** + +{{ if .Description }} {{ .Description }} +{{ end }} +| | | +|-----------------------|----------------------------| +| Category | {{ .Category }} | +| Data Retention Period | {{ .DataRetentionPeriod }} | +| Legal Basis | {{ .LegalBasis }} | +| Transfers | {{ .Transfers }} | +{{ end }} + +{{ end }} + + + + + + diff --git a/development/examples/example1/req1/1/.test1.md.swp b/development/examples/example1/req1/1/.test1.md.swp new file mode 100644 index 0000000000000000000000000000000000000000..fcb2c249530807b835475db75edcee1505ab2982 Binary files /dev/null and b/development/examples/example1/req1/1/.test1.md.swp differ diff --git a/development/examples/example1/req1/1/test1.md b/development/examples/example1/req1/1/test1.md index a0356a553994fca3d0b25eb508024952f042f833..a2b245feecf8fe1de12be44509c266cbc7d89f40 100644 --- a/development/examples/example1/req1/1/test1.md +++ b/development/examples/example1/req1/1/test1.md @@ -40,7 +40,7 @@ Milestone: null # 0 (means that a task has already been completed), 1 (is a very small task), 2, 3, 5 (are rather smaller tasks), # 8, 13, 20, 40, 100 -Estimation: 40 +Estimation: 13 # The time required for this requirement # Valid time units are “ns”, “us” (or “µs”), “ms”, “s”, “m”, “h”. @@ -51,6 +51,9 @@ Source: null Created: 2022-05-03 Last Update: null +Issues: + - Gitlab-ID: 1 + # the individual items as a list Items: - ID: null @@ -172,5 +175,5 @@ test test - +@todo das ist ein todo diff --git a/development/makefile/color.mk b/development/makefile/color.mk new file mode 100644 index 0000000000000000000000000000000000000000..2c3fe3d1ba24854f1c05865705b6d9235fb02589 --- /dev/null +++ b/development/makefile/color.mk @@ -0,0 +1,17 @@ +############################################################################################# +############################################################################################# +## +## COLORS +## +############################################################################################# +############################################################################################# + +BLACK := $(shell tput -Txterm setaf 0) +RED := $(shell tput -Txterm setaf 1) +GREEN := $(shell tput -Txterm setaf 2) +YELLOW := $(shell tput -Txterm setaf 3) +LIGHTPURPLE := $(shell tput -Txterm setaf 4) +PURPLE := $(shell tput -Txterm setaf 5) +BLUE := $(shell tput -Txterm setaf 6) +WHITE := $(shell tput -Txterm setaf 7) +RESET := $(shell tput -Txterm sgr0) \ No newline at end of file diff --git a/development/makefile/directories-default.mk b/development/makefile/directories-default.mk new file mode 100644 index 0000000000000000000000000000000000000000..5ea61d16ee0b0ad88446fb041a22d5d3adf6b1e2 --- /dev/null +++ b/development/makefile/directories-default.mk @@ -0,0 +1,32 @@ +############################################################################################# +############################################################################################# +## +## DIRECTORIES +## +############################################################################################# +############################################################################################# + +APPLICATION_PATH := $(PROJECT_ROOT)application/ +RESOURCE_PATH := $(PROJECT_ROOT)application/resource/ +SOURCE_PATH := $(PROJECT_ROOT)application/source/ +WEB_PATH := $(PROJECT_ROOT)application/web/ +DEPLOYMENT_PATH := $(PROJECT_ROOT)deployment/ +VENDOR_PATH := $(PROJECT_ROOT)deployment/vendor/ +DEVELOPMENT_PATH := $(PROJECT_ROOT)development/ +SCRIPTS_PATH := $(PROJECT_ROOT)development/scripts/ +DOCUMENTATION_PATH := $(PROJECT_ROOT)documentation/ + +## Build path +BUILD_PATH = $(DEPLOYMENT_PATH)build/ + +PROJECT_DIRECTORIES := $(PROJECT_DIRECTORIES) \ + $(APPLICATION_PATH) \ + $(RESOURCE_PATH) \ + $(SOURCE_PATH) \ + $(WEB_PATH) \ + $(DEPLOYMENT_PATH) \ + $(VENDOR_PATH) \ + $(DEVELOPMENT_PATH) \ + $(SCRIPTS_PATH) \ + $(DOCUMENTATION_PATH) + \ No newline at end of file diff --git a/development/makefile/go.mk b/development/makefile/go.mk new file mode 100644 index 0000000000000000000000000000000000000000..29955369f69ad15bb22c2cd1c77bdd127977aaf9 --- /dev/null +++ b/development/makefile/go.mk @@ -0,0 +1,12 @@ +############################################################################################# +############################################################################################# +## +## COMMANDS GO +## +############################################################################################# +############################################################################################# + +# path and binaries +GO := go + +EXECUTABLES = $(EXECUTABLES:-) $(GO); diff --git a/development/makefile/license-agpl3.mk b/development/makefile/license-agpl3.mk new file mode 100644 index 0000000000000000000000000000000000000000..ff461e24d8ab4c10f4269e5016826c9b076b763e --- /dev/null +++ b/development/makefile/license-agpl3.mk @@ -0,0 +1,10 @@ +############################################################################################# +############################################################################################# +## +## COLORS +## +############################################################################################# +############################################################################################# + +LICENSETEXT := AGPL 3.0 +COPYRIGHTTEXT := © schukai GmbH, Released under the $(LICENSETEXT) License. \ No newline at end of file diff --git a/development/makefile/output.mk b/development/makefile/output.mk new file mode 100644 index 0000000000000000000000000000000000000000..9aa5bb737e5b0a3fcb47ff40b40690f2c5cdc4be --- /dev/null +++ b/development/makefile/output.mk @@ -0,0 +1,54 @@ +############################################################################################# +############################################################################################# +## +## COLORS +## +############################################################################################# +############################################################################################# + +INFO := $(GREEN) +COMMENT := $(YELLOW) + +############################################################################################# +############################################################################################# +## +## OUTPUT CONTROL AND STANDARD OUTPUTS +## +############################################################################################# +############################################################################################# + +MARKER := $(BLUE)[+]$(RESET) +ERRORMARKER := $(RED)[-]$(RESET) + +############################################################################################# +############################################################################################# +## +## DEACTIVATE THE QUIET MODE BY OVERWRITING THE VALUE WITH SPACE +## +############################################################################################# +############################################################################################# + +ifndef DEBUG + QUIET = @ +else + QUIET = +endif + +ifndef DONTOPENBROWSER + OPENBROWSER = false +else + OPENBROWSER = true +endif + +############################################################################################# +############################################################################################# +## +## COMMANDS +## +############################################################################################# +############################################################################################# + +ECHO := @echo +ECHOMARKER := @echo "$(MARKER) $0" +ECHOERRORMARKER := @echo "$(ERRORMARKER) $0" + diff --git a/development/makefile/placeholder.mk b/development/makefile/placeholder.mk new file mode 100644 index 0000000000000000000000000000000000000000..d73fb40d7914fbdfb6c547ea8193307146f51483 --- /dev/null +++ b/development/makefile/placeholder.mk @@ -0,0 +1,9 @@ +############################################################################################# +############################################################################################# +## +## PLACEHOLDER +## +############################################################################################# +############################################################################################# + +COMPONENTSLUG := $(shell echo "$(COMPONENTNAME)" | tr '[:upper:]' '[:lower:]') \ No newline at end of file diff --git a/development/makefile/target-build-go.mk b/development/makefile/target-build-go.mk new file mode 100644 index 0000000000000000000000000000000000000000..605d1b61f7c39c6351cf90930c430a466f9bdc00 --- /dev/null +++ b/development/makefile/target-build-go.mk @@ -0,0 +1,22 @@ +############################################################################################# +############################################################################################# +## +## BUILD GO +## +############################################################################################# +############################################################################################# + +.PHONY: compile +## Compiling for every OS and Platform +compile: next-patch-version + $(QUIET) $(ECHO) "Compiling for every OS and Platform" + $(QUIET) $(ECHO) "Version: $(PROJECTVERSION)" + $(QUIET) $(ECHO) "Build: $(PROJECTBUILDDATE)" + + $(QUIET) cd $(SOURCE_PATH) ; \ + GO111MODULE=on GOOS=linux GOARCH=arm $(GO) build -ldflags "-X main.version=$(PROJECTVERSION) -X main.build=$(PROJECTBUILDDATE)" -o $(BUILD_PATH)$(COMPONENTSLUG)-linux-arm ; \ + GOOS=linux GOARCH=amd64 $(GO) build -ldflags "-X main.version=$(PROJECTVERSION) -X main.build=$(PROJECTBUILDDATE)" -o $(BUILD_PATH)$(COMPONENTSLUG)-linux-amd64 ; \ + GOOS=linux GOARCH=arm64 $(GO) build -ldflags "-X main.version=$(PROJECTVERSION) -X main.build=$(PROJECTBUILDDATE)" -o $(BUILD_PATH)$(COMPONENTSLUG)-linux-arm64 ; \ + GOOS=linux GOARCH=386 $(GO) build -ldflags "-X main.version=$(PROJECTVERSION) -X main.build=$(PROJECTBUILDDATE)" -o $(BUILD_PATH)$(COMPONENTSLUG)-linux-386 ; \ + GOOS=windows GOARCH=amd64 $(GO) build -ldflags "-X main.version=$(PROJECTVERSION) -X main.build=$(PROJECTBUILDDATE)" -o $(BUILD_PATH)$(COMPONENTSLUG)-windows ; \ + cd $(PROJECT_ROOT); diff --git a/development/makefile/target-deploy-tool.mk b/development/makefile/target-deploy-tool.mk new file mode 100644 index 0000000000000000000000000000000000000000..ea1a65e47639d6af38e01b8982fb7dc5a964b83a --- /dev/null +++ b/development/makefile/target-deploy-tool.mk @@ -0,0 +1,18 @@ +############################################################################################# +############################################################################################# +## +## DEPLOY TOOLS +## +############################################################################################# +############################################################################################# + +.PHONY: deploy +## compile and deplay to aws +deploy: compile + $(QUIET) AWS_PROFILE=schukai find $(BUILD_PATH) -iname $(COMPONENTSLUG)-* -exec aws s3 cp {} s3://download.schukai.com/tools/$(COMPONENTSLUG)/ \; + +.PHONY: overview-to-aws +## overview-to-aws +overview-to-aws: + $(QUIET) AWS_PROFILE=schukai aws s3 cp $(WEB_PATH)/index.html s3://download.schukai.com/tools/$(COMPONENTSLUG)/ + \ No newline at end of file diff --git a/development/makefile/target-git.mk b/development/makefile/target-git.mk new file mode 100644 index 0000000000000000000000000000000000000000..97f7d894569a83b3b21eeb0ced0ab5a31ba99210 --- /dev/null +++ b/development/makefile/target-git.mk @@ -0,0 +1,47 @@ +############################################################################################# +############################################################################################# +## +## GIT-TARGETS +## +############################################################################################# +############################################################################################# + +EXECUTABLES = $(EXECUTABLES:-) uuidgen + +## Current Branch-GIT_TAG +GIT_TAG := - + +## Git Commit GIT_MESSAGE for git-push +GIT_MESSAGE := current status + +.PHONY: git-branch +## create new branch (use GIT_TAG-Variable) +git-branch: + + $(QUIET) export BRANCH="b$(GIT_TAG)/$(shell uuidgen --random)" ; \ + $(GIT) checkout -b $${BRANCH} && \ + RESULT=$$($(GIT) push origin $$BRANCH 2>&1) && \ + RESULT2=$$($(GIT) branch --set-upstream-to=origin/$$BRANCH $$BRANCH) && \ + GITLABURL=$$(echo "$$RESULT" | tr '\n' '\#' | grep -o 'remote\:\s*https:\/\/gitlab\.schukai\.com[^ ]*' | cut -d " " -f2-9 | sed -e 's/^[ \t]*//') && \ + if $(OPENBROWSER) ; then google-chrome --profile-directory="Default" $$GITLABURL ; fi + +.PHONY: git-to-master +## git checkout master, fetch and merge +git-to-master: + $(GIT) checkout master && $(GIT) fetch -pP && $(GIT) merge + +.PHONY: git-push-to-server +## git push changes to server +git-push-to-server: + $(QUIET) $(GIT) add -A + $(QUIET) $(GIT) commit -m"$(GIT_MESSAGE)" + $(QUIET) $(GIT) push + +.PHONY: git-push +## git create branch and push changes to server +git-push: git-branch git-push-to-server + +.PHONY: git-GIT_TAG +## git create version GIT_TAG +git-GIT_TAG: + $(QUIET) $(GIT) GIT_TAG -a "$(COMPONENT_VERSION)" -m "release $(COMPONENT_VERSION)" diff --git a/development/makefile/target-help.mk b/development/makefile/target-help.mk new file mode 100644 index 0000000000000000000000000000000000000000..249d3fd574e9cfbc09d0b6a4f8af7eef0f6f5986 --- /dev/null +++ b/development/makefile/target-help.mk @@ -0,0 +1,45 @@ +############################################################################################# +############################################################################################# +## +## HELP-TARGETS +## +############################################################################################# +############################################################################################# + +# @see .PHONY https://www.gnu.org/software/make/manual/html_node/Phony-Targets.html#Phony-Targets +.DEFAULT_GOAL := help + +.PHONY: print +print: + $(ECHO) "THIS_MAKEFILE: $(THIS_MAKEFILE)" + $(ECHO) "THIS_MAKEFILE_PATH: $(THIS_MAKEFILE_PATH)" + $(ECHO) "PROJECT_ROOT: $(PROJECT_ROOT)" + +# Add a comment to the public targets so that it appears +# in this help Use two # characters for a help comment +.PHONY: help +help: + @printf "${COMMENT}Usage:${RESET}\n" + @printf " make [target] [arg=\"val\"...]\n\n" + @printf "${COMMENT}Available targets:${RESET}\n" + @awk '/^[a-zA-Z\-\\_0-9\.@]+:/ { \ + helpMessage = match(lastLine, /^## (.*)/); \ + if (helpMessage) { \ + helpCommand = substr($$1, 0, index($$1, ":")); \ + helpMessage = substr(lastLine, RSTART + 3, RLENGTH); \ + printf " ${INFO}%-22s${RESET} %s\n", helpCommand, helpMessage; \ + } \ + } \ + { lastLine = $$0 }' $(MAKEFILE_LIST) + @printf "\n${COMMENT}Available arguments:${RESET}\n\n" + @awk '/^(([a-zA-Z\-\\_0-9\.@]+)\s=)/ { \ + helpMessage = match(lastLine, /^## (.*)/); \ + if (helpMessage) { \ + helpMessage = substr(lastLine, RSTART + 3, RLENGTH); \ + printf " ${INFO}%-22s${RESET} %s (Default: %s)\n", $$1, helpMessage, $$3; \ + } \ + } \ + { lastLine = $$0 }' $(MAKEFILE_LIST) + + + diff --git a/development/makefile/target-init.mk b/development/makefile/target-init.mk new file mode 100644 index 0000000000000000000000000000000000000000..bee5adbabfd4716c78560d09a8894d5d8d7f3365 --- /dev/null +++ b/development/makefile/target-init.mk @@ -0,0 +1,18 @@ +############################################################################################# +############################################################################################# +## +## INIT-TARGETS +## +############################################################################################# +############################################################################################# + +## @see .PHONY https://www.gnu.org/software/make/manual/html_node/Phony-Targets.html#Phony-Targets +.PHONY: init + +## init project +init: + $(QUIET) $(ECHO) "This is the target init" + K := $(foreach path,$(PROJECT_DIRECTORIES),\ + $(shell mkir -p $(path))) + $(QUIET) $(TOUCH) $(RELEASE_FILE) + $(QUIET) $(ECHO) "Done" diff --git a/development/makefile/terminal-check.mk b/development/makefile/terminal-check.mk new file mode 100644 index 0000000000000000000000000000000000000000..5db23c80e0215eaa75e1e10afbf242060fc69327 --- /dev/null +++ b/development/makefile/terminal-check.mk @@ -0,0 +1,13 @@ +############################################################################################# +############################################################################################# +## +## TERMINAL CHECK +## +############################################################################################# +############################################################################################# + + + +# Executable Programs the Installed be have to +K := $(foreach exec,$(EXECUTABLES),\ + $(if $(shell which $(exec)),some string,$(error "Missing $(exec) in PATH; please install"))) \ No newline at end of file diff --git a/development/makefile/terminal.mk b/development/makefile/terminal.mk new file mode 100644 index 0000000000000000000000000000000000000000..f5d4bf0b3bb494ac8f4bd182ef731eb59d62cd57 --- /dev/null +++ b/development/makefile/terminal.mk @@ -0,0 +1,38 @@ +############################################################################################# +############################################################################################# +## +## COMMANDS +## +############################################################################################# +############################################################################################# + +# Use bash instead of sh +## Sets the shell used +SHELL = bash + +# path and binaries +AWK := awk +CP := cp +CD := cd +KILL := /bin/kill +MV := mv +RM := rm -f +MKDIR := mkdir -p +SED := sed +FIND := find +SORT := sort +TOUCH := touch +WGET := wget +CHMOD := chmod +RSYNC := rsync +XARGS := xargs +GREP := grep +MAKE := make +GIT := git +LN := ln -s +TOUCH := touch + +EXECUTABLES = $(EXECUTABLES:-) $(AWK) $(CP) $(KILL) $(MV) $(SED) $(FIND) $(SORT) $(TOUCH) $(WGET) $(CHMOD) $(RSYNC) $(XARGS) $(GREP) $(MAKE) $(GIT) + + + \ No newline at end of file diff --git a/development/makefile/version.mk b/development/makefile/version.mk new file mode 100644 index 0000000000000000000000000000000000000000..1810adbc21f075dfacefca4470c789c2814772dd --- /dev/null +++ b/development/makefile/version.mk @@ -0,0 +1,22 @@ +############################################################################################# +############################################################################################# +## +## VERSIONS +## +############################################################################################# +############################################################################################# + +VERSION_BIN := version +EXECUTABLES = $(EXECUTABLES:-) $(VERSION_BIN) + +RELEASEFILE := $(PROJECT_ROOT)release.json +PROJECTVERSION := $(shell cat $(RELEASEFILE) | jq -r .version) +PROJECTBUILDDATE := $(shell $(VERSION_BIN) date) + + +.PHONY: next-patch-version +## create next-patch-version +next-patch-version: + $(QUIET) $(ECHO) "Creating next version" + $(QUIET) $(VERSION_BIN) patch --path $(RELEASEFILE) --selector "version" + $(QUIET) $(eval PROJECTVERSION := $(shell cat $(RELEASEFILE) | jq -r .version)) diff --git a/release.json b/release.json new file mode 100644 index 0000000000000000000000000000000000000000..42289260339bf3837424706176405dffe374599d --- /dev/null +++ b/release.json @@ -0,0 +1,3 @@ +{ + "version": "1.0.21" +} \ No newline at end of file