{"id":22615572,"url":"https://github.com/marcellodesales/cloner","last_synced_at":"2025-07-09T20:36:40.353Z","repository":{"id":56039088,"uuid":"222853162","full_name":"marcellodesales/cloner","owner":"marcellodesales","description":"Clones a given git repo to an organized directory based on dir/host/user/repo","archived":false,"fork":false,"pushed_at":"2020-11-29T16:13:16.000Z","size":430,"stargazers_count":0,"open_issues_count":5,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-03-29T00:42:30.255Z","etag":null,"topics":["cli","cloner","git-cloner","golang"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/marcellodesales.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-11-20T04:49:06.000Z","updated_at":"2020-10-20T02:11:48.000Z","dependencies_parsed_at":"2022-08-15T12:00:40.758Z","dependency_job_id":null,"html_url":"https://github.com/marcellodesales/cloner","commit_stats":null,"previous_names":[],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/marcellodesales/cloner","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marcellodesales%2Fcloner","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marcellodesales%2Fcloner/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marcellodesales%2Fcloner/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marcellodesales%2Fcloner/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/marcellodesales","download_url":"https://codeload.github.com/marcellodesales/cloner/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marcellodesales%2Fcloner/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":264502992,"owners_count":23618674,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","cloner","git-cloner","golang"],"created_at":"2024-12-08T19:08:23.299Z","updated_at":"2025-07-09T20:36:40.327Z","avatar_url":"https://github.com/marcellodesales.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# cloner\n\nThis is a CLI that makes git clone simpler with an optional config to clone a given URL \nin a location for all of your git projects based on the host.\n\n# Why cloner?\n\n* You don't need to change to the directory where your github repos are located.\n* The base git repo will be based on the host, so they all are on the same place.\n* Commands are idempotent\n  * For repeated repos, you must use the force option\n\n```shell\ncloner local -r https://github.com/comsysto/redis-locks-with-grafana\ncloner local --repo git@github.com:marcellodesales/alpine-git-hub-docker-image.git\ncloner local -r https://github.com/intuit/intuit-spring-cloud-config-inspector\ncloner local -r git@github.com:intuit/unmazedboot\ncloner local -r https://gitlab.com:supercash/services/sms-gateway-service.git\ncloner local -r https://github.com/comsysto/redis-locks-with-grafana -f\n\ntree -L 4 ~/dev/\n/Users/marcellodesales/dev/\n├── github.com\n│   ├── comsysto\n│   │   └── redis-locks-with-grafana\n│   └── marcellodesales\n│       └── alpine-git-hub-docker-image\n│   ├── intuit\n│   │   ├── intuit-spring-cloud-config-inspector\n│   │   └── unmazedboot\n├── gitlab.com\n│   └── supercash\n│       └── services\n│           └── sms-gateway-service\n```\n\n\u003e **ATTENTION**: Assuming all defaults, of the clone location to `~/dev`, the cloned\n\u003e and the private key being `~/.ssh/id_rsa`. See below the options to the CLI.\n\n# Config\n\n* `~/.cloner.yaml`\n  **git.cloneBaseDir**: as the location for base git host dirs\n\n```yaml\nversion: 1.0\ngit:\n  cloneBaseDir: ~/dev\n```\n\nWhen the CLI runs, it will create the dirs `git.cloneBaseDir/git.host/git.org/git.repo`\n\n\u003e NOTE: Gitlab's and other hosts may be located in deeper folders.\n\n# Options\n\n* Just run the help to see the current options\n\n```\ncloner local --help\nClones a given git repo URL\n\nUsage:\n  cloner local [flags]\n\nFlags:\n  -f, --force               Forces cloning by deleting existing dir\n  -h, --help                help for git\n  -k, --privateKey string   The private key associated to the public key to clone 'git@' repos\n  -r, --repo string         The repo URL to clone\n\nGlobal Flags:\n      --cloner string      Config file (default is $HOME/.cloner.yaml) (default \"cloner\")\n  -v, --verbosity string   Log level (debug, info, warn, error, fatal, panic (default \"info\")\n```\n\n# Running\n\n* Clone for the first time\n\n```shell\ncloner local --repo https://github.com/comsysto/redis-locks-with-grafana\nINFO[0000] Loading the config object 'git' from '/Users/marcellodesales/.cloner.yaml'\nINFO[2020-09-08T12:28:11-03:00] Cloning into '/Users/marcellodesales/dev/github.com/comsysto/redis-locks-with-grafana'\nEnumerating objects: 233, done.\nTotal 233 (delta 0), reused 0 (delta 0), pack-reused 233\nINFO[2020-09-08T12:28:18-03:00] Done...\n```\n\n* Existing cloned repos will fail\n\n```\ncloner local --repo https://github.com/comsysto/redis-locks-with-grafana\nINFO[0000] Loading the config object 'git' from '/Users/marcellodesales/.cloner.yaml'\nERRO[2020-09-08T12:29:58-03:00] Can't clone repo: clone location '/Users/marcellodesales/dev/github.com/comsysto/redis-locks-with-grafana' exists and it's not empty\nERRO[2020-09-08T12:29:58-03:00] You can specify --force or -f to delete the existing dir and clone again. Make sure there are no panding changes!\n```\n\n* Force the clone if needed\n\n```\ncloner local --repo https://github.com/comsysto/redis-locks-with-grafana -f\nINFO[0000] Loading the config object 'git' from '/Users/marcellodesales/.cloner.yaml'\nINFO[2020-09-08T12:30:42-03:00] Forcing clone...\nINFO[2020-09-08T12:30:42-03:00] Deleted dir '/Users/marcellodesales/dev/github.com/comsysto/redis-locks-with-grafana'\nINFO[2020-09-08T12:30:42-03:00] Cloning into '/Users/marcellodesales/dev/github.com/comsysto/redis-locks-with-grafana'\nEnumerating objects: 233, done.\nTotal 233 (delta 0), reused 0 (delta 0), pack-reused 233\nINFO[2020-09-08T12:28:18-03:00] Done...\n```\n\n* You can provide a private key for `git@host:org/repo` URLs\n\n```\ncloner local --repo git@github.com/marcellodesales/cloner --privateKey ~/.ssh/id_gmail\nINFO[0000] Loading the config object 'git' from '/Users/marcellodesales/.cloner.yaml'\nINFO[2020-09-08T12:30:42-03:00] Forcing clone...\nINFO[2020-09-08T12:30:42-03:00] Deleted dir '/Users/marcellodesales/dev/github.com/marcellodesales/cloner'\nINFO[2020-09-08T12:30:42-03:00] Cloning into '/Users/marcellodesales/dev/github.com/marcellodesales/cloner'\nEnumerating objects: 233, done.\nTotal 233 (delta 0), reused 0 (delta 0), pack-reused 233\nINFO[2020-09-08T12:28:18-03:00] Done...\n```\n\n## From Docker Container\n\n* You can run cloner in docker as well... \n\n```\n$ docker run -ti -v $(pwd):/data marcellodesales/cloner:20.09.7 git \\\n         --repo git@github.com:marcellodesales/unmazedboot.git -v debug -k /data/id_cloner_test\nDEBU[2020-09-18T02:17:38Z] config.git.cloneBaseDir=/root/cloner\nINFO[2020-09-18T02:17:38Z] Cloning into '/root/cloner/github.com/marcellodesales/unmazedboot'\nDEBU[2020-09-18T02:17:38Z] Attempting to clone repo 'git@github.com:marcellodesales/unmazedboot.git' =\u003e '/root/cloner/github.com/marcellodesales/unmazedboot'\nDEBU[2020-09-18T02:17:38Z] Authenticating using the key\nEnumerating objects: 16, done.\nCounting objects: 100% (16/16), done.\nCompressing objects: 100% (16/16), done.\nTotal 144 (delta 9), reused 2 (delta 0), pack-reused 128\nINFO[2020-09-18T02:17:41Z] Done...\nINFO[2020-09-18T02:17:41Z]\n/root/cloner/github.com/marcellodesales/unmazedboot\n└── .env\n└── CHANGELOG\n└── LICENSE\n└── README.md\n└── builder\n│   ├── gradle.Dockerfile\n│   ├── maven.Dockerfile\n```\n\n# Development\n\n* Here's how we are doing it!\n* Go to Github Actions for all automation\n  * [Dockerized exeution through Makefile](https://github.com/marcellodesales/cloner/actions)\n\n## Design\n\nThe design now is as follows:\n\n```\n            +-----+       +-----+      +------+\nmain +-----\u003e+ CMD +------\u003e+ API +-----\u003e+ UTIL |\n            +--+--+       +-----+      +------+\n               ^\n               |      +--------+\n               +------+ CONFIG |\n                      +--------+\n```\n\n* `CMD`: CLI implementation using `Cobra`\n* `CONFIG`: Yaml configuration using `Viper`\n* `API`: Abstraction of services that implement capabilities\n* `UTIL`: Utility functions serving the API services\n\n## Tests\n\n* Look at the scenarios of the CLI in the tests\n  * Tests at `cmd/git_test.go`\n\n```shell\nmake test\n```\n\n## Binaries\n\nYou can use Golang locally to build a local executable as follows (MacOS). The Github Actions CI [build-develop](https://github.com/marcellodesales/cloner/actions?query=workflow%3Abuild-develop) implements the steps below, publishing binary artifacts at every commit under the `develop` branch.\n\n```console\n$ make local\n```\n\n* The local build will be available at `dist/cloner-darwin-local`\n\nOther binary versions are available at the `Artifacts` section of the `build-develop` Github Actions. If you want to build locally, here's what you need to do:\n\n\u003e Requirement: install the following:\n\u003e * `docker`\n\u003e * `build tools`\n\nRun the following commands:\n\n```console\nmake dist\n```\n\nYou should get the CLI binaries in different platforms-architectures\n\nThe CLI will print the help\n\n\u003e **ATTENTION**: Make sure to select the proper binary for your current host!\n\n```console\n$ ./dist/cloner-darwin-amd64\n```\n\n## Remote Debug\n\n* Use `debug.docker-compose.yaml` to start a Delve container that listens to port `:40000`.\n  * https://github.com/igor-kupczynski/remote-debug-example\n  * Details at PR #29\n\n```\n$ docker-compose -f debug.docker-compose.yaml up\nRecreating cloner_cli-debug_1 ... done\nAttaching to cloner_cli-debug_1\ncli-debug_1  | API server listening at: [::]:40000\n```\n\n* For example, open Goland and use a `Go Remote` debug instance with port `40000`.\n\n## Bug Reports \u0026 Feature Requests\n\nPlease use the [issue tracker](https://github.com/marcellodesales/cloner/issues) to report any bugs or file feature requests.\n\n## Social Coding and Contributing\n\n1. Create an issue to discuss about your idea\n2. [Fork it] (https://github.com/marcellodesales/cloner/fork)\n3. Create your feature branch (`git checkout -b feature/my-new-feature`)\n4. Commit your changes (`git commit -am 'feature x: Add some capability'`)\n5. Push to the branch (`git push origin feature/my-new-feature`)\n6. Create a new Pull Request\n7. Profit! :white_check_mark:\n\nOur Gitflow is as follows:\n\n* `develop`: CI that runs all builds and generate binaries.\n  * Target your PR here.\n* `master`: CD that creates a new release based on a TAG\n  * Performed from PRs from `develop`\n  * Publishes latest binary version from `develop`\n\n## Releases\n\nRequires `make` and `docker` for a dockerized build and cross-compilation for Golang. We can run the same exact script on local host or in a CI environemtn. See our Github Action `release-master`, which runs at every PR merge to the `master` branch.  \n\n\u003e ATTENTION: Make sure to have a Github token with write permissions to the repo\n\u003e  * https://help.github.com/en/github/authenticating-to-github/creating-a-personal-access-token-for-the-command-line\n\n* Initial releases MUST have the code fully pushed to the repo\n* Git with versions are created in the format of `yy.mm.#`\n  * Where, # is incremented at each release automatically.\n\n```console\n$ make release PUBLISH_GITHUB_TOKEN=6100**********dbeb326\nfatal: No names found, cannot describe anything.\nrm -rf dist\nmkdir dist\n#docker build -t cloner --build-arg BIN_NAME=cloner --build-arg BIN_VERSION=19.11.1 .\nBuilding next version 19.11.1\nBIN_VERSION=19.11.1 docker-compose build --build-arg BIN_VERSION=19.11.1 cli\nBuilding cli\nStep 1/24 : FROM golang:1.13.0-stretch as builder\n ---\u003e d68f79d0e22c\nStep 2/24 : WORKDIR /build\n ---\u003e Using cache\n ---\u003e 22957f5469a2\nStep 3/24 : RUN apt-get update \u0026\u0026 apt-get install -y file\n ---\u003e Using cache\n ---\u003e 1ec0f47f5d8c\nStep 4/24 : COPY go.mod /build/go.mod\n ---\u003e Using cache\n ---\u003e 1799a4b09df6\nStep 5/24 : COPY go.sum /build/go.sum\n ---\u003e Using cache\n ---\u003e 358b83dc11ce\nStep 6/24 : ENV GO111MODULE=on\n ---\u003e Using cache\n ---\u003e b2eb62f39971\nStep 7/24 : RUN go mod download\n ---\u003e Using cache\n ---\u003e d5704e9c7950\nStep 8/24 : COPY main.go /build/main.go\n ---\u003e Using cache\n ---\u003e 2e40e04f3424\nStep 9/24 : COPY api /build/api\n ---\u003e Using cache\n ---\u003e c31b316588cb\nStep 10/24 : COPY cmd /build/cmd\n ---\u003e Using cache\n ---\u003e 7556207f1bf7\nStep 11/24 : COPY config /build/config\n ---\u003e Using cache\n ---\u003e 2e44679ae6b9\nStep 12/24 : COPY util /build/util\n ---\u003e Using cache\n ---\u003e 0d4c826dc7da\nStep 13/24 : ARG BIN_NAME\n ---\u003e Using cache\n ---\u003e 7da993355ee9\nStep 14/24 : ARG BIN_VERSION\n ---\u003e Using cache\n ---\u003e 2e380a0cc0e7\nStep 15/24 : ENV BIN_NAME ${BIN_NAME:-unknown}\n ---\u003e Using cache\n ---\u003e 2b9e4a4772b8\nStep 16/24 : ENV BUILD_VERSION ${BIN_VERSION:-0.1.0}\n ---\u003e Using cache\n ---\u003e a86be0c52bcb\nStep 17/24 : ENV PLATFORMS \"darwin linux windows\"\n ---\u003e Using cache\n ---\u003e 46dcf836a303\nStep 18/24 : ENV ARCHS \"amd64\"\n ---\u003e Using cache\n ---\u003e e53be57a615f\nStep 19/24 : COPY .git/ /build/.git/\n ---\u003e f00b7d01fd82\nStep 20/24 : RUN export GO_MODULE_FULL_NAME=$(git -C /build/.git remote -v | grep fetch | awk '{print $2}' | sed -En \"s/git@//p\" | sed -En \"s/.git//p\" | sed -En \"s/:/\\//p\") \u0026\u0026         export BUILD_GIT_SHA=$(git rev-parse --short HEAD) \u0026\u0026         for GOOS in ${PLATFORMS}; do for GOARCH in ${ARCHS}; do BINARY=\"${BIN_NAME}-$GOOS-$GOARCH\"; if [ $GOOS = \"windows\" ]; then BINARY=\"${BINARY}.exe\"; fi; export BUILD_TIME=\"$(date -u +\"%Y-%m-%d_%H:%M:%S_GMT\")\"; echo \"Cross-compiling $GO_MODULE_FULL_NAME@$BUILD_GIT_SHA as ${BINARY}@$BUILD_VERSION at $BUILD_TIME\"; GO_MODULE_FULL_NAME=$GO_MODULE_FULL_NAME BUILD_GIT_SHA=$BUILD_GIT_SHA BUILD_VERSION=$BUILD_VERSION BUILD_TIME=$BUILD_TIME GO111MODULE=$GO111MODULE CGO_ENABLED=0 GOARCH=$GOARCH GOOS=$GOOS GOPRIVATE=$GOPRIVATE go build -o ${BINARY} -a -ldflags \"-X ${GO_MODULE_FULL_NAME}/config.BuildModule=${GO_MODULE_FULL_NAME} -X ${GO_MODULE_FULL_NAME}/config.BuildVersion=${BUILD_VERSION} -X ${GO_MODULE_FULL_NAME}/config.BuildGitSha=${BUILD_GIT_SHA} -X ${GO_MODULE_FULL_NAME}/config.BuildTime=${BUILD_TIME}\"; ls -la \"/build/${BINARY}\"; file \"/build/${BINARY}\"; chmod +x \"/build/${BINARY}\"; if [ $GOOS = \"linux\" ]; then sh -c \"/build/${BINARY}\"; fi; done; done\n ---\u003e Running in 2453c3ae25a8\nCross-compiling github.com/marcellodesales/cloner@65d3043 as cloner-darwin-amd64@19.11.1 at 2019-11-25_01:18:25_GMT\n-rwxr-xr-x 1 root root 12332944 Nov 25 01:18 /build/cloner-darwin-amd64\n/build/cloner-darwin-amd64: Mach-O 64-bit x86_64 executable\nCross-compiling github.com/marcellodesales/cloner@65d3043 as cloner-linux-amd64@19.11.1 at 2019-11-25_01:18:43_GMT\n-rwxr-xr-x 1 root root 12468409 Nov 25 01:19 /build/cloner-linux-amd64\n/build/cloner-linux-amd64: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped\ncloner knows how to clone version-control urls by simply making sure\nit can place software in specific location designed.\n\nUsage:\n  cloner [command]\n\nAvailable Commands:\n  git         Clones a given git repo\n  help        Help about any command\n\nFlags:\n      --cloner string      Spec file (default is $HOME/cloner.yaml) (default \"cloner\")\n  -h, --help               help for cloner\n  -v, --verbosity string   Log level (debug, info, warn, error, fatal, panic (default \"info\")\n\nUse \"cloner [command] --help\" for more information about a command.\nCross-compiling github.com/marcellodesales/cloner@65d3043 as cloner-windows-amd64.exe@19.11.1 at 2019-11-25_01:19:00_GMT\n-rwxr-xr-x 1 root root 12219392 Nov 25 01:19 /build/cloner-windows-amd64.exe\n/build/cloner-windows-amd64.exe: PE32+ executable (console) x86-64 (stripped to external PDB), for MS Windows\nRemoving intermediate container 2453c3ae25a8\n ---\u003e d0e20c40137d\nStep 21/24 : FROM alpine:latest\n ---\u003e 961769676411\nStep 22/24 : WORKDIR /root/\n ---\u003e Using cache\n ---\u003e 17b62865a5d4\nStep 23/24 : COPY --from=builder /build/${BIN_NAME}* /bin/\n ---\u003e 412bd633d2da\nStep 24/24 : ENTRYPOINT /bin/${ARG BIN_NAME}-linux-amd64\n ---\u003e Running in 44b3f771668a\nRemoving intermediate container 44b3f771668a\n ---\u003e 1715a2e68e3a\nSuccessfully built 1715a2e68e3a\nSuccessfully tagged marcellodesales/cloner:19.11.1\nDistribution libraries for version 19.11.1\ndocker run --rm -ti --entrypoint sh -v /Users/marcellodesales/dev/github.com/marcellodesales/cloner/dist:/bins marcellodesales/cloner:19.11.1 -c \"cp /bin/cloner-darwin-amd64 /bins\"\ndocker run --rm -ti --entrypoint sh -v /Users/marcellodesales/dev/github.com/marcellodesales/cloner/dist:/bins marcellodesales/cloner:19.11.1 -c \"cp /bin/cloner-linux-amd64 /bins\"\ndocker run --rm -ti --entrypoint sh -v /Users/marcellodesales/dev/github.com/marcellodesales/cloner/dist:/bins marcellodesales/cloner:19.11.1 -c \"cp /bin/cloner-windows-amd64.exe /bins\"\nls -la /Users/marcellodesales/dev/github.com/marcellodesales/cloner/dist\ntotal 73880\ndrwxr-xr-x   5 marcellodesales  CORP\\Domain Users       160 Nov 24 17:19 .\ndrwxr-xr-x  19 marcellodesales  CORP\\Domain Users       608 Nov 24 17:18 ..\n-rwxr-xr-x   1 marcellodesales  CORP\\Domain Users  12332944 Nov 24 17:19 cloner-darwin-amd64\n-rwxr-xr-x   1 marcellodesales  CORP\\Domain Users  12468409 Nov 24 17:19 cloner-linux-amd64\n-rwxr-xr-x   1 marcellodesales  CORP\\Domain Users  12219392 Nov 24 17:19 cloner-windows-amd64.exe\necho \"Releasing next version 19.11.1\"\nReleasing next version 19.11.1\ngit tag v19.11.1 || true\ngit push origin v19.11.1 || true\nEnumerating objects: 25, done.\nCounting objects: 100% (25/25), done.\nDelta compression using up to 8 threads\nCompressing objects: 100% (13/13), done.\nWriting objects: 100% (14/14), 2.04 KiB | 2.04 MiB/s, done.\nTotal 14 (delta 8), reused 0 (delta 0)\nremote: Resolving deltas: 100% (8/8), completed with 7 local objects.\nTo github.com:marcellodesales/cloner.git\n * [new tag]         v19.11.1 -\u003e v19.11.1\ndocker run -ti -e GITHUB_HOST=github.com -e GITHUB_USER=marcellodesales  -e GITHUB_TOKEN=6100758b68072e0570ce0c250a6e398cadbeb326 -e GITHUB_REPOSITORY=marcellodesales/cloner -e HUB_PROTOCOL=https -v /Users/marcellodesales/dev/github.com/marcellodesales/cloner:/git marcellodesales/github-hub release create --prerelease --attach dist/cloner-darwin-amd64 --attach dist/cloner-linux-amd64 --attach dist/cloner-windows-amd64.exe -m \"cloner 19.11.1 release\" v19.11.1\nAttaching release asset `dist/cloner-darwin-amd64'...\nAttaching release asset `dist/cloner-linux-amd64'...\nAttaching release asset `dist/cloner-windows-amd64.exe'...\nhttps://github.com/marcellodesales/cloner/releases/tag/v19.11.1\n```\n\n## License\n\n```\nThe MIT License (MIT)\n\nCopyright (c) 2019-2020 Marcello de Sales\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarcellodesales%2Fcloner","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmarcellodesales%2Fcloner","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarcellodesales%2Fcloner/lists"}