Compare commits

...

58 Commits

Author SHA1 Message Date
cf0ccd2f6e refactor(benchmark_test): migrate from github.com/ipfs/go-cid to code.sonr.org/go/cid
Some checks failed
Close Stale Issues / stale (push) Has been cancelled
Close Generated PRs / stale (push) Has been cancelled
Go Checks / go-check (push) Has been cancelled
Go Test / go-test (push) Has been cancelled
Releaser / releaser (push) Has been cancelled
Tag Push Checker / releaser (push) Has been cancelled
2026-01-08 15:46:16 -05:00
a7a1f319b3 docs(readme): update readme to reflect new package path 2026-01-08 15:46:14 -05:00
8c8b22eab1 docs(core): update deprecated comment with new pull request link 2026-01-08 15:46:13 -05:00
af732567fd chore(config): add Repo.toml and update go.mod for config changes 2026-01-08 15:46:12 -05:00
dependabot[bot]
1b3fc58457 chore(deps): bump golang.org/x/crypto from 0.35.0 to 0.45.0 (#179)
Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.35.0 to 0.45.0.
- [Commits](https://github.com/golang/crypto/compare/v0.35.0...v0.45.0)

---
updated-dependencies:
- dependency-name: golang.org/x/crypto
  dependency-version: 0.45.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-11-24 14:57:43 +13:00
Rod Vagg
594b41a340 v0.6.0 bump (#178) 2025-10-28 12:15:36 +11:00
dependabot[bot]
7942a87de8 chore(deps): bump github.com/multiformats/go-varint from 0.0.7 to 0.1.0 (#177)
Bumps [github.com/multiformats/go-varint](https://github.com/multiformats/go-varint) from 0.0.7 to 0.1.0.
- [Release notes](https://github.com/multiformats/go-varint/releases)
- [Commits](https://github.com/multiformats/go-varint/compare/v0.0.7...v0.1.0)

---
updated-dependencies:
- dependency-name: github.com/multiformats/go-varint
  dependency-version: 0.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-28 12:12:14 +11:00
Andrew Gillis
6365bffd65 Merge pull request #176 from ipfs/uci/update-go
ci: uci/update-go
2025-08-20 22:10:32 -07:00
web3-bot
1022508918 chore!: bump go.mod to Go 1.24 and run go fix
BREAKING CHANGE: Updating the Go version to 1.24
2025-08-20 16:22:55 +00:00
dependabot[bot]
1afa3fef92 chore(deps): bump golang.org/x/crypto from 0.31.0 to 0.35.0 (#175)
* chore(deps): bump golang.org/x/crypto from 0.31.0 to 0.35.0

Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.31.0 to 0.35.0.
- [Commits](https://github.com/golang/crypto/compare/v0.31.0...v0.35.0)

---
updated-dependencies:
- dependency-name: golang.org/x/crypto
  dependency-version: 0.35.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update go.mod

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Rod Vagg <rod@vagg.org>
2025-04-15 10:32:11 +10:00
web3-bot
3b830eb57c ci: uci/copy-templates (#174)
* chore: add or force update .github/workflows/stale.yml

* chore: add or force update .github/workflows/generated-pr.yml
2025-03-28 19:15:37 +01:00
web3-bot
4d43496971 chore!: bump go.mod to Go 1.23 and run go fix (#173)
BREAKING CHANGE: Updating the Go version to 1.23
2025-02-16 22:33:16 +01:00
Rod Vagg
5cddba5d53 v0.5.0 bump (#172) 2025-01-22 13:02:05 +11:00
dependabot[bot]
c38d1ef3f4 chore(deps): bump golang.org/x/crypto from 0.17.0 to 0.31.0
Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.17.0 to 0.31.0.
- [Commits](https://github.com/golang/crypto/compare/v0.17.0...v0.31.0)

---
updated-dependencies:
- dependency-name: golang.org/x/crypto
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-12 16:18:17 +11:00
Michael Muré
7f61b44eb9 move _rsrch/cidiface into an internal package
_rsrch/cidiface is an engineering experiment package to explore the right form for a CID. As such, it's not meant to be actually used, and could result in conflict if used.

To avoid accidentally importing it (or even getting suggestions to do so), this package is moved into an "internal" folder, hinting tooling that it's not meant for external consumption.
2024-09-27 09:13:31 +10:00
web3-bot
13ed68d2d7 chore!: bump go.mod to Go 1.22 and run go fix (#167) 2024-08-26 11:01:52 +10:00
web3-bot
b655a59a8a Merge pull request #166 from ipfs/uci/copy-templates
ci: uci/copy-templates
2024-03-22 12:54:37 +00:00
web3-bot
81bd42a55c chore: add or force update .github/workflows/tagpush.yml 2024-03-21 15:36:17 +00:00
web3-bot
23af06e490 chore: add or force update .github/workflows/release-check.yml 2024-03-21 15:36:17 +00:00
web3-bot
52653019a7 chore: add or force update .github/workflows/releaser.yml 2024-03-21 15:36:17 +00:00
web3-bot
11e146d86d chore: add or force update .github/workflows/go-check.yml 2024-03-21 15:36:17 +00:00
web3-bot
91f1b23adf chore: add or force update .github/workflows/go-test.yml 2024-03-21 15:36:17 +00:00
web3-bot
607591de0b chore: add or force update .github/workflows/tagpush.yml 2024-03-21 14:55:31 +00:00
web3-bot
93d2928381 chore: add or force update .github/workflows/release-check.yml 2024-03-21 14:55:31 +00:00
web3-bot
1f9bd88a8e chore: add or force update .github/workflows/releaser.yml 2024-03-21 14:55:31 +00:00
web3-bot
f6805b41a0 chore: add or force update .github/workflows/go-check.yml 2024-03-21 14:55:31 +00:00
web3-bot
01aca4cad3 chore: add or force update .github/workflows/go-test.yml 2024-03-21 14:55:31 +00:00
web3-bot
9b08623b01 chore: add or force update .github/workflows/tagpush.yml 2024-03-21 14:13:35 +00:00
web3-bot
1399b513f9 chore: add or force update .github/workflows/release-check.yml 2024-03-21 14:13:35 +00:00
web3-bot
00c494db15 chore: add or force update .github/workflows/releaser.yml 2024-03-21 14:13:35 +00:00
web3-bot
d1e16392a7 chore: add or force update .github/workflows/go-check.yml 2024-03-21 14:13:35 +00:00
web3-bot
af4cf3c53a chore: add or force update .github/workflows/go-test.yml 2024-03-21 14:13:35 +00:00
web3-bot
01fcc60a8c Merge pull request #165 from ipfs/uci/update-go
ci: uci/update-go
2024-03-14 11:40:58 +00:00
web3-bot
663c9b30cf chore: run go mod tidy 2024-03-13 14:58:09 +00:00
web3-bot
4a2ad46e4c chore: bump go.mod to Go 1.21 and run go fix 2024-03-13 14:58:09 +00:00
GitHub
a126b93d54 chore: Update .github/workflows/stale.yml [skip ci] 2024-01-31 17:37:03 +00:00
dependabot[bot]
7db2df1954 chore(deps): bump golang.org/x/crypto from 0.1.0 to 0.17.0
Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.1.0 to 0.17.0.
- [Commits](https://github.com/golang/crypto/compare/v0.1.0...v0.17.0)

---
updated-dependencies:
- dependency-name: golang.org/x/crypto
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-02 10:46:28 +11:00
web3-bot
d900d766af chore: bump go.mod to Go 1.20 and run go fix (#163) 2023-08-14 15:37:26 +02:00
web3-bot
aea9f4a20c chore: add or force update .github/workflows/tagpush.yml 2023-08-14 12:00:07 +10:00
web3-bot
6bf5ab9148 chore: add or force update .github/workflows/release-check.yml 2023-08-14 12:00:07 +10:00
web3-bot
ef021a6454 chore: add or force update .github/workflows/releaser.yml 2023-08-14 12:00:07 +10:00
web3-bot
13f45bfa17 chore: add or force update .github/workflows/go-check.yml 2023-08-14 12:00:07 +10:00
web3-bot
4828462368 chore: add or force update .github/workflows/go-test.yml 2023-08-14 12:00:07 +10:00
web3-bot
e12272217c chore: delete templates [skip ci] (#161) 2023-08-13 18:52:13 +02:00
GitHub
3863e676fd chore: Update .github/workflows/stale.yml [skip ci] 2023-06-28 08:49:10 +00:00
GitHub
9a3cbeb6a0 chore: Update .github/workflows/stale.yml [skip ci] 2023-06-14 11:15:02 +00:00
dependabot[bot]
f834302da4 chore(deps): bump github.com/multiformats/go-multihash
Bumps [github.com/multiformats/go-multihash](https://github.com/multiformats/go-multihash) from 0.2.2 to 0.2.3.
- [Release notes](https://github.com/multiformats/go-multihash/releases)
- [Commits](https://github.com/multiformats/go-multihash/compare/v0.2.2...v0.2.3)

---
updated-dependencies:
- dependency-name: github.com/multiformats/go-multihash
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-13 14:45:14 +10:00
dependabot[bot]
6b3d27fb29 chore(deps): bump github.com/multiformats/go-multihash
Bumps [github.com/multiformats/go-multihash](https://github.com/multiformats/go-multihash) from 0.2.1 to 0.2.2.
- [Release notes](https://github.com/multiformats/go-multihash/releases)
- [Commits](https://github.com/multiformats/go-multihash/compare/v0.2.1...v0.2.2)

---
updated-dependencies:
- dependency-name: github.com/multiformats/go-multihash
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-30 11:04:36 +10:00
dependabot[bot]
829c826f6b chore(deps): bump github.com/multiformats/go-varint from 0.0.6 to 0.0.7
Bumps [github.com/multiformats/go-varint](https://github.com/multiformats/go-varint) from 0.0.6 to 0.0.7.
- [Release notes](https://github.com/multiformats/go-varint/releases)
- [Commits](https://github.com/multiformats/go-varint/compare/v0.0.6...v0.0.7)

---
updated-dependencies:
- dependency-name: github.com/multiformats/go-varint
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-04-05 13:13:25 +10:00
dependabot[bot]
8bb6c55e54 chore(deps): bump github.com/multiformats/go-multihash
Bumps [github.com/multiformats/go-multihash](https://github.com/multiformats/go-multihash) from 0.0.15 to 0.2.1.
- [Release notes](https://github.com/multiformats/go-multihash/releases)
- [Commits](https://github.com/multiformats/go-multihash/compare/v0.0.15...v0.2.1)

---
updated-dependencies:
- dependency-name: github.com/multiformats/go-multihash
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-04-05 12:53:59 +10:00
dependabot[bot]
72c7f21dcd chore(deps): bump github.com/multiformats/go-multibase
Bumps [github.com/multiformats/go-multibase](https://github.com/multiformats/go-multibase) from 0.0.3 to 0.2.0.
- [Release notes](https://github.com/multiformats/go-multibase/releases)
- [Commits](https://github.com/multiformats/go-multibase/compare/v0.0.3...v0.2.0)

---
updated-dependencies:
- dependency-name: github.com/multiformats/go-multibase
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-04-05 12:50:34 +10:00
dependabot-preview[bot]
93a8da769f Upgrade to GitHub-native Dependabot 2023-04-04 14:13:57 +10:00
Rod Vagg
d46e7f2866 v0.4.1 2023-04-04 14:08:15 +10:00
gammazero
83a0e939a4 Add unit test for unexpected eof 2023-04-04 14:08:15 +10:00
Andrew Gillis
0981f8566c Update cid.go
Co-authored-by: Rod Vagg <rod@vagg.org>
2023-04-04 14:08:15 +10:00
gammazero
166a3a6880 CidFromReader should not wrap valid EOF return.
When reading from an io.Reader that has no data, the io.EOF error should not be wrapped in ErrInvalidCid. This is not an invalid CID, and is not the same as a partial read which is indicated by io.ErrUnexpectedEOF.

This fix is needed because existing code that uses CidFromReader may check for the end of an input stream by `if err == io.EOF` instead of the preferred `if errors.Is(err, io.EOF)`, and that code break at runtime after upgrading to go-cid v0.4.0.
2023-04-04 14:08:15 +10:00
Henrique Dias
8098d66787 chore: version 0.4.0 2023-03-20 09:29:34 +01:00
Henrique Dias
b98e249130 feat: wrap parsing errors into ErrInvalidCid 2023-03-20 09:29:34 +01:00
25 changed files with 352 additions and 261 deletions

7
.github/Repo.toml vendored Normal file
View File

@@ -0,0 +1,7 @@
[scopes]
ci = [".github/workflows"]
config = [".github", "codecov.yml", "go.mod", "go.sum", "Makefile", "version.json"]
docs = ["README.md", "LICENSE"]
tests = ["*_test.go", "fuzz-data"]
research = ["_rsrch"]
core = ["cid.go", "builder.go", "set.go", "varint.go", "cid_fuzz.go", "deprecated.go"]

8
.github/dependabot.yml vendored Normal file
View File

@@ -0,0 +1,8 @@
version: 2
updates:
- package-ecosystem: gomod
directory: "/"
schedule:
interval: weekly
time: "11:00"
open-pull-requests-limit: 10

View File

@@ -1,11 +0,0 @@
# File managed by web3-bot. DO NOT EDIT.
# See https://github.com/protocol/.github/ for details.
name: Automerge
on: [ pull_request ]
jobs:
automerge:
uses: protocol/.github/.github/workflows/automerge.yml@master
with:
job: 'automerge'

14
.github/workflows/generated-pr.yml vendored Normal file
View File

@@ -0,0 +1,14 @@
name: Close Generated PRs
on:
schedule:
- cron: '0 0 * * *'
workflow_dispatch:
permissions:
issues: write
pull-requests: write
jobs:
stale:
uses: ipdxco/unified-github-workflows/.github/workflows/reusable-generated-pr.yml@v1

View File

@@ -1,67 +1,18 @@
# File managed by web3-bot. DO NOT EDIT.
# See https://github.com/protocol/.github/ for details.
on: [push, pull_request]
name: Go Checks name: Go Checks
on:
pull_request:
push:
branches: ["master"]
workflow_dispatch:
permissions:
contents: read
concurrency:
group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.event_name == 'push' && github.sha || github.ref }}
cancel-in-progress: true
jobs: jobs:
unit: go-check:
runs-on: ubuntu-latest uses: ipdxco/unified-github-workflows/.github/workflows/go-check.yml@v1.0
name: All
steps:
- uses: actions/checkout@v3
with:
submodules: recursive
- id: config
uses: protocol/.github/.github/actions/read-config@master
- uses: actions/setup-go@v3
with:
go-version: 1.20.x
- name: Run repo-specific setup
uses: ./.github/actions/go-check-setup
if: hashFiles('./.github/actions/go-check-setup') != ''
- name: Install staticcheck
run: go install honnef.co/go/tools/cmd/staticcheck@4970552d932f48b71485287748246cf3237cebdf # 2023.1 (v0.4.0)
- name: Check that go.mod is tidy
uses: protocol/multiple-go-modules@v1.2
with:
run: |
go mod tidy
if [[ -n $(git ls-files --other --exclude-standard --directory -- go.sum) ]]; then
echo "go.sum was added by go mod tidy"
exit 1
fi
git diff --exit-code -- go.sum go.mod
- name: gofmt
if: success() || failure() # run this step even if the previous one failed
run: |
out=$(gofmt -s -l .)
if [[ -n "$out" ]]; then
echo $out | awk '{print "::error file=" $0 ",line=0,col=0::File is not gofmt-ed."}'
exit 1
fi
- name: go vet
if: success() || failure() # run this step even if the previous one failed
uses: protocol/multiple-go-modules@v1.2
with:
run: go vet ./...
- name: staticcheck
if: success() || failure() # run this step even if the previous one failed
uses: protocol/multiple-go-modules@v1.2
with:
run: |
set -o pipefail
staticcheck ./... | sed -e 's@\(.*\)\.go@./\1.go@g'
- name: go generate
uses: protocol/multiple-go-modules@v1.2
if: (success() || failure()) && fromJSON(steps.config.outputs.json).gogenerate == true
with:
run: |
git clean -fd # make sure there aren't untracked files / directories
go generate -x ./...
# check if go generate modified or added any files
if ! $(git add . && git diff-index HEAD --exit-code --quiet); then
echo "go generated caused changes to the repository:"
git status --short
exit 1
fi

View File

@@ -1,76 +1,20 @@
# File managed by web3-bot. DO NOT EDIT.
# See https://github.com/protocol/.github/ for details.
on: [push, pull_request]
name: Go Test name: Go Test
on:
pull_request:
push:
branches: ["master"]
workflow_dispatch:
permissions:
contents: read
concurrency:
group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.event_name == 'push' && github.sha || github.ref }}
cancel-in-progress: true
jobs: jobs:
unit: go-test:
strategy: uses: ipdxco/unified-github-workflows/.github/workflows/go-test.yml@v1.0
fail-fast: false secrets:
matrix: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
os: [ "ubuntu", "windows", "macos" ]
go: ["1.19.x","1.20.x"]
env:
COVERAGES: ""
runs-on: ${{ fromJSON(vars[format('UCI_GO_TEST_RUNNER_{0}', matrix.os)] || format('"{0}-latest"', matrix.os)) }}
name: ${{ matrix.os }} (go ${{ matrix.go }})
steps:
- uses: actions/checkout@v3
with:
submodules: recursive
- id: config
uses: protocol/.github/.github/actions/read-config@master
- uses: actions/setup-go@v3
with:
go-version: ${{ matrix.go }}
- name: Go information
run: |
go version
go env
- name: Use msys2 on windows
if: matrix.os == 'windows'
shell: bash
# The executable for msys2 is also called bash.cmd
# https://github.com/actions/virtual-environments/blob/main/images/win/Windows2019-Readme.md#shells
# If we prepend its location to the PATH
# subsequent 'shell: bash' steps will use msys2 instead of gitbash
run: echo "C:/msys64/usr/bin" >> $GITHUB_PATH
- name: Run repo-specific setup
uses: ./.github/actions/go-test-setup
if: hashFiles('./.github/actions/go-test-setup') != ''
- name: Run tests
if: contains(fromJSON(steps.config.outputs.json).skipOSes, matrix.os) == false
uses: protocol/multiple-go-modules@v1.2
with:
# Use -coverpkg=./..., so that we include cross-package coverage.
# If package ./A imports ./B, and ./A's tests also cover ./B,
# this means ./B's coverage will be significantly higher than 0%.
run: go test -v -shuffle=on -coverprofile=module-coverage.txt -coverpkg=./... ./...
- name: Run tests (32 bit)
# can't run 32 bit tests on OSX.
if: matrix.os != 'macos' &&
fromJSON(steps.config.outputs.json).skip32bit != true &&
contains(fromJSON(steps.config.outputs.json).skipOSes, matrix.os) == false
uses: protocol/multiple-go-modules@v1.2
env:
GOARCH: 386
with:
run: |
export "PATH=$PATH_386:$PATH"
go test -v -shuffle=on ./...
- name: Run tests with race detector
# speed things up. Windows and OSX VMs are slow
if: matrix.os == 'ubuntu' &&
contains(fromJSON(steps.config.outputs.json).skipOSes, matrix.os) == false
uses: protocol/multiple-go-modules@v1.2
with:
run: go test -v -race ./...
- name: Collect coverage files
shell: bash
run: echo "COVERAGES=$(find . -type f -name 'module-coverage.txt' | tr -s '\n' ',' | sed 's/,$//')" >> $GITHUB_ENV
- name: Upload coverage to Codecov
uses: codecov/codecov-action@d9f34f8cd5cb3b3eb79b3e4b5dae3a16df499a70 # v3.1.1
with:
files: '${{ env.COVERAGES }}'
env_vars: OS=${{ matrix.os }}, GO=${{ matrix.go }}

View File

@@ -1,13 +1,19 @@
# File managed by web3-bot. DO NOT EDIT.
# See https://github.com/protocol/.github/ for details.
name: Release Checker name: Release Checker
on: on:
pull_request_target: pull_request_target:
paths: [ 'version.json' ] paths: [ 'version.json' ]
types: [ opened, synchronize, reopened, labeled, unlabeled ]
workflow_dispatch:
permissions:
contents: write
pull-requests: write
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs: jobs:
release-check: release-check:
uses: protocol/.github/.github/workflows/release-check.yml@master uses: ipdxco/unified-github-workflows/.github/workflows/release-check.yml@v1.0
with:
go-version: 1.20.x

View File

@@ -1,11 +1,17 @@
# File managed by web3-bot. DO NOT EDIT.
# See https://github.com/protocol/.github/ for details.
name: Releaser name: Releaser
on: on:
push: push:
paths: [ 'version.json' ] paths: [ 'version.json' ]
workflow_dispatch:
permissions:
contents: write
concurrency:
group: ${{ github.workflow }}-${{ github.sha }}
cancel-in-progress: true
jobs: jobs:
releaser: releaser:
uses: protocol/.github/.github/workflows/releaser.yml@master uses: ipdxco/unified-github-workflows/.github/workflows/releaser.yml@v1.0

View File

@@ -1,26 +1,14 @@
name: Close and mark stale issue name: Close Stale Issues
on: on:
schedule: schedule:
- cron: '0 0 * * *' - cron: '0 0 * * *'
workflow_dispatch:
permissions:
issues: write
pull-requests: write
jobs: jobs:
stale: stale:
uses: ipdxco/unified-github-workflows/.github/workflows/reusable-stale-issue.yml@v1
runs-on: ubuntu-latest
permissions:
issues: write
pull-requests: write
steps:
- uses: actions/stale@v3
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
stale-issue-message: 'Oops, seems like we needed more information for this issue, please comment with more details or this issue will be closed in 7 days.'
close-issue-message: 'This issue was closed because it is missing author input.'
stale-issue-label: 'kind/stale'
any-of-labels: 'need/author-input'
exempt-issue-labels: 'need/triage,need/community-input,need/maintainer-input,need/maintainers-input,need/analysis,status/blocked,status/in-progress,status/ready,status/deferred,status/inactive'
days-before-issue-stale: 6
days-before-issue-close: 7
enable-statistics: true

View File

@@ -1,12 +1,18 @@
# File managed by web3-bot. DO NOT EDIT.
# See https://github.com/protocol/.github/ for details.
name: Tag Push Checker name: Tag Push Checker
on: on:
push: push:
tags: tags:
- v* - v*
permissions:
contents: read
issues: write
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs: jobs:
releaser: releaser:
uses: protocol/.github/.github/workflows/tagpush.yml@master uses: ipdxco/unified-github-workflows/.github/workflows/tagpush.yml@v1.0

View File

@@ -5,7 +5,7 @@ go-cid
[![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](http://ipfs.io/) [![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](http://ipfs.io/)
[![](https://img.shields.io/badge/freenode-%23ipfs-blue.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23ipfs) [![](https://img.shields.io/badge/freenode-%23ipfs-blue.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23ipfs)
[![](https://img.shields.io/badge/readme%20style-standard-brightgreen.svg?style=flat-square)](https://github.com/RichardLitt/standard-readme) [![](https://img.shields.io/badge/readme%20style-standard-brightgreen.svg?style=flat-square)](https://github.com/RichardLitt/standard-readme)
[![GoDoc](https://godoc.org/github.com/ipfs/go-cid?status.svg)](https://godoc.org/github.com/ipfs/go-cid) [![GoDoc](https://godoc.org/code.sonr.org/go/cid?status.svg)](https://godoc.org/code.sonr.org/go/cid)
[![Coverage Status](https://coveralls.io/repos/github/ipfs/go-cid/badge.svg?branch=master)](https://coveralls.io/github/ipfs/go-cid?branch=master) [![Coverage Status](https://coveralls.io/repos/github/ipfs/go-cid/badge.svg?branch=master)](https://coveralls.io/github/ipfs/go-cid?branch=master)
[![Travis CI](https://travis-ci.org/ipfs/go-cid.svg?branch=master)](https://travis-ci.org/ipfs/go-cid) [![Travis CI](https://travis-ci.org/ipfs/go-cid.svg?branch=master)](https://travis-ci.org/ipfs/go-cid)
@@ -31,7 +31,7 @@ It is used in `go-ipfs` and related packages to refer to a typed hunk of data.
`go-cid` is a standard Go module which can be installed with: `go-cid` is a standard Go module which can be installed with:
```sh ```sh
go get github.com/ipfs/go-cid go get code.sonr.org/go/cid
``` ```
## Usage ## Usage
@@ -61,7 +61,7 @@ fmt.Println("Got CID: ", c)
```go ```go
import ( import (
cid "github.com/ipfs/go-cid" cid "code.sonr.org/go/cid"
mc "github.com/multiformats/go-multicodec" mc "github.com/multiformats/go-multicodec"
mh "github.com/multiformats/go-multihash" mh "github.com/multiformats/go-multihash"
) )

View File

@@ -4,7 +4,7 @@ import (
"math/rand" "math/rand"
"testing" "testing"
"github.com/ipfs/go-cid" "code.sonr.org/go/cid"
"github.com/multiformats/go-multihash" "github.com/multiformats/go-multihash"
) )

104
cid.go
View File

@@ -37,10 +37,32 @@ import (
// UnsupportedVersionString just holds an error message // UnsupportedVersionString just holds an error message
const UnsupportedVersionString = "<unsupported cid version>" const UnsupportedVersionString = "<unsupported cid version>"
// ErrInvalidCid is an error that indicates that a CID is invalid.
type ErrInvalidCid struct {
Err error
}
func (e ErrInvalidCid) Error() string {
return fmt.Sprintf("invalid cid: %s", e.Err)
}
func (e ErrInvalidCid) Unwrap() error {
return e.Err
}
func (e ErrInvalidCid) Is(err error) bool {
switch err.(type) {
case ErrInvalidCid, *ErrInvalidCid:
return true
default:
return false
}
}
var ( var (
// ErrCidTooShort means that the cid passed to decode was not long // ErrCidTooShort means that the cid passed to decode was not long
// enough to be a valid Cid // enough to be a valid Cid
ErrCidTooShort = errors.New("cid too short") ErrCidTooShort = ErrInvalidCid{errors.New("cid too short")}
// ErrInvalidEncoding means that selected encoding is not supported // ErrInvalidEncoding means that selected encoding is not supported
// by this Cid version // by this Cid version
@@ -48,7 +70,7 @@ var (
) )
// Consts below are DEPRECATED and left only for legacy reasons: // Consts below are DEPRECATED and left only for legacy reasons:
// <https://github.com/ipfs/go-cid/pull/137> // <https://code.sonr.org/go/cid/pull/137>
// Modern code should use consts from go-multicodec instead: // Modern code should use consts from go-multicodec instead:
// <https://github.com/multiformats/go-multicodec> // <https://github.com/multiformats/go-multicodec>
const ( const (
@@ -90,10 +112,10 @@ func tryNewCidV0(mhash mh.Multihash) (Cid, error) {
// incorrectly detect it as CidV1 in the Version() method // incorrectly detect it as CidV1 in the Version() method
dec, err := mh.Decode(mhash) dec, err := mh.Decode(mhash)
if err != nil { if err != nil {
return Undef, err return Undef, ErrInvalidCid{err}
} }
if dec.Code != mh.SHA2_256 || dec.Length != 32 { if dec.Code != mh.SHA2_256 || dec.Length != 32 {
return Undef, fmt.Errorf("invalid hash for cidv0 %d-%d", dec.Code, dec.Length) return Undef, ErrInvalidCid{fmt.Errorf("invalid hash for cidv0 %d-%d", dec.Code, dec.Length)}
} }
return Cid{string(mhash)}, nil return Cid{string(mhash)}, nil
} }
@@ -177,7 +199,7 @@ func Parse(v interface{}) (Cid, error) {
case Cid: case Cid:
return v2, nil return v2, nil
default: default:
return Undef, fmt.Errorf("can't parse %+v as Cid", v2) return Undef, ErrInvalidCid{fmt.Errorf("can't parse %+v as Cid", v2)}
} }
} }
@@ -210,7 +232,7 @@ func Decode(v string) (Cid, error) {
if len(v) == 46 && v[:2] == "Qm" { if len(v) == 46 && v[:2] == "Qm" {
hash, err := mh.FromB58String(v) hash, err := mh.FromB58String(v)
if err != nil { if err != nil {
return Undef, err return Undef, ErrInvalidCid{err}
} }
return tryNewCidV0(hash) return tryNewCidV0(hash)
@@ -218,7 +240,7 @@ func Decode(v string) (Cid, error) {
_, data, err := mbase.Decode(v) _, data, err := mbase.Decode(v)
if err != nil { if err != nil {
return Undef, err return Undef, ErrInvalidCid{err}
} }
return Cast(data) return Cast(data)
@@ -240,7 +262,7 @@ func ExtractEncoding(v string) (mbase.Encoding, error) {
// check encoding is valid // check encoding is valid
_, err := mbase.NewEncoder(encoding) _, err := mbase.NewEncoder(encoding)
if err != nil { if err != nil {
return -1, err return -1, ErrInvalidCid{err}
} }
return encoding, nil return encoding, nil
@@ -260,11 +282,11 @@ func ExtractEncoding(v string) (mbase.Encoding, error) {
func Cast(data []byte) (Cid, error) { func Cast(data []byte) (Cid, error) {
nr, c, err := CidFromBytes(data) nr, c, err := CidFromBytes(data)
if err != nil { if err != nil {
return Undef, err return Undef, ErrInvalidCid{err}
} }
if nr != len(data) { if nr != len(data) {
return Undef, fmt.Errorf("trailing bytes in data buffer passed to cid Cast") return Undef, ErrInvalidCid{fmt.Errorf("trailing bytes in data buffer passed to cid Cast")}
} }
return c, nil return c, nil
@@ -434,7 +456,7 @@ func (c Cid) Equals(o Cid) bool {
// UnmarshalJSON parses the JSON representation of a Cid. // UnmarshalJSON parses the JSON representation of a Cid.
func (c *Cid) UnmarshalJSON(b []byte) error { func (c *Cid) UnmarshalJSON(b []byte) error {
if len(b) < 2 { if len(b) < 2 {
return fmt.Errorf("invalid cid json blob") return ErrInvalidCid{fmt.Errorf("invalid cid json blob")}
} }
obj := struct { obj := struct {
CidTarget string `json:"/"` CidTarget string `json:"/"`
@@ -442,7 +464,7 @@ func (c *Cid) UnmarshalJSON(b []byte) error {
objptr := &obj objptr := &obj
err := json.Unmarshal(b, &objptr) err := json.Unmarshal(b, &objptr)
if err != nil { if err != nil {
return err return ErrInvalidCid{err}
} }
if objptr == nil { if objptr == nil {
*c = Cid{} *c = Cid{}
@@ -450,12 +472,12 @@ func (c *Cid) UnmarshalJSON(b []byte) error {
} }
if obj.CidTarget == "" { if obj.CidTarget == "" {
return fmt.Errorf("cid was incorrectly formatted") return ErrInvalidCid{fmt.Errorf("cid was incorrectly formatted")}
} }
out, err := Decode(obj.CidTarget) out, err := Decode(obj.CidTarget)
if err != nil { if err != nil {
return err return ErrInvalidCid{err}
} }
*c = out *c = out
@@ -542,12 +564,12 @@ func (p Prefix) Sum(data []byte) (Cid, error) {
if p.Version == 0 && (p.MhType != mh.SHA2_256 || if p.Version == 0 && (p.MhType != mh.SHA2_256 ||
(p.MhLength != 32 && p.MhLength != -1)) { (p.MhLength != 32 && p.MhLength != -1)) {
return Undef, fmt.Errorf("invalid v0 prefix") return Undef, ErrInvalidCid{fmt.Errorf("invalid v0 prefix")}
} }
hash, err := mh.Sum(data, p.MhType, length) hash, err := mh.Sum(data, p.MhType, length)
if err != nil { if err != nil {
return Undef, err return Undef, ErrInvalidCid{err}
} }
switch p.Version { switch p.Version {
@@ -556,7 +578,7 @@ func (p Prefix) Sum(data []byte) (Cid, error) {
case 1: case 1:
return NewCidV1(p.Codec, hash), nil return NewCidV1(p.Codec, hash), nil
default: default:
return Undef, fmt.Errorf("invalid cid version") return Undef, ErrInvalidCid{fmt.Errorf("invalid cid version")}
} }
} }
@@ -586,22 +608,22 @@ func PrefixFromBytes(buf []byte) (Prefix, error) {
r := bytes.NewReader(buf) r := bytes.NewReader(buf)
vers, err := varint.ReadUvarint(r) vers, err := varint.ReadUvarint(r)
if err != nil { if err != nil {
return Prefix{}, err return Prefix{}, ErrInvalidCid{err}
} }
codec, err := varint.ReadUvarint(r) codec, err := varint.ReadUvarint(r)
if err != nil { if err != nil {
return Prefix{}, err return Prefix{}, ErrInvalidCid{err}
} }
mhtype, err := varint.ReadUvarint(r) mhtype, err := varint.ReadUvarint(r)
if err != nil { if err != nil {
return Prefix{}, err return Prefix{}, ErrInvalidCid{err}
} }
mhlen, err := varint.ReadUvarint(r) mhlen, err := varint.ReadUvarint(r)
if err != nil { if err != nil {
return Prefix{}, err return Prefix{}, ErrInvalidCid{err}
} }
return Prefix{ return Prefix{
@@ -615,12 +637,12 @@ func PrefixFromBytes(buf []byte) (Prefix, error) {
func CidFromBytes(data []byte) (int, Cid, error) { func CidFromBytes(data []byte) (int, Cid, error) {
if len(data) > 2 && data[0] == mh.SHA2_256 && data[1] == 32 { if len(data) > 2 && data[0] == mh.SHA2_256 && data[1] == 32 {
if len(data) < 34 { if len(data) < 34 {
return 0, Undef, fmt.Errorf("not enough bytes for cid v0") return 0, Undef, ErrInvalidCid{fmt.Errorf("not enough bytes for cid v0")}
} }
h, err := mh.Cast(data[:34]) h, err := mh.Cast(data[:34])
if err != nil { if err != nil {
return 0, Undef, err return 0, Undef, ErrInvalidCid{err}
} }
return 34, Cid{string(h)}, nil return 34, Cid{string(h)}, nil
@@ -628,21 +650,21 @@ func CidFromBytes(data []byte) (int, Cid, error) {
vers, n, err := varint.FromUvarint(data) vers, n, err := varint.FromUvarint(data)
if err != nil { if err != nil {
return 0, Undef, err return 0, Undef, ErrInvalidCid{err}
} }
if vers != 1 { if vers != 1 {
return 0, Undef, fmt.Errorf("expected 1 as the cid version number, got: %d", vers) return 0, Undef, ErrInvalidCid{fmt.Errorf("expected 1 as the cid version number, got: %d", vers)}
} }
_, cn, err := varint.FromUvarint(data[n:]) _, cn, err := varint.FromUvarint(data[n:])
if err != nil { if err != nil {
return 0, Undef, err return 0, Undef, ErrInvalidCid{err}
} }
mhnr, _, err := mh.MHFromBytes(data[n+cn:]) mhnr, _, err := mh.MHFromBytes(data[n+cn:])
if err != nil { if err != nil {
return 0, Undef, err return 0, Undef, ErrInvalidCid{err}
} }
l := n + cn + mhnr l := n + cn + mhnr
@@ -695,6 +717,9 @@ func (r *bufByteReader) ReadByte() (byte, error) {
// It's recommended to supply a reader that buffers and implements io.ByteReader, // It's recommended to supply a reader that buffers and implements io.ByteReader,
// as CidFromReader has to do many single-byte reads to decode varints. // as CidFromReader has to do many single-byte reads to decode varints.
// If the argument only implements io.Reader, single-byte Read calls are used instead. // If the argument only implements io.Reader, single-byte Read calls are used instead.
//
// If the Reader is found to yield zero bytes, an io.EOF error is returned directly, in all
// other error cases, an ErrInvalidCid, wrapping the original error, is returned.
func CidFromReader(r io.Reader) (int, Cid, error) { func CidFromReader(r io.Reader) (int, Cid, error) {
// 64 bytes is enough for any CIDv0, // 64 bytes is enough for any CIDv0,
// and it's enough for most CIDv1s in practice. // and it's enough for most CIDv1s in practice.
@@ -705,32 +730,37 @@ func CidFromReader(r io.Reader) (int, Cid, error) {
// The varint package wants a io.ByteReader, so we must wrap our io.Reader. // The varint package wants a io.ByteReader, so we must wrap our io.Reader.
vers, err := varint.ReadUvarint(br) vers, err := varint.ReadUvarint(br)
if err != nil { if err != nil {
return len(br.dst), Undef, err if err == io.EOF {
// First-byte read in ReadUvarint errors with io.EOF, so reader has no data.
// Subsequent reads with an EOF will return io.ErrUnexpectedEOF and be wrapped here.
return 0, Undef, err
}
return len(br.dst), Undef, ErrInvalidCid{err}
} }
// If we have a CIDv0, read the rest of the bytes and cast the buffer. // If we have a CIDv0, read the rest of the bytes and cast the buffer.
if vers == mh.SHA2_256 { if vers == mh.SHA2_256 {
if n, err := io.ReadFull(r, br.dst[1:34]); err != nil { if n, err := io.ReadFull(r, br.dst[1:34]); err != nil {
return len(br.dst) + n, Undef, err return len(br.dst) + n, Undef, ErrInvalidCid{err}
} }
br.dst = br.dst[:34] br.dst = br.dst[:34]
h, err := mh.Cast(br.dst) h, err := mh.Cast(br.dst)
if err != nil { if err != nil {
return len(br.dst), Undef, err return len(br.dst), Undef, ErrInvalidCid{err}
} }
return len(br.dst), Cid{string(h)}, nil return len(br.dst), Cid{string(h)}, nil
} }
if vers != 1 { if vers != 1 {
return len(br.dst), Undef, fmt.Errorf("expected 1 as the cid version number, got: %d", vers) return len(br.dst), Undef, ErrInvalidCid{fmt.Errorf("expected 1 as the cid version number, got: %d", vers)}
} }
// CID block encoding multicodec. // CID block encoding multicodec.
_, err = varint.ReadUvarint(br) _, err = varint.ReadUvarint(br)
if err != nil { if err != nil {
return len(br.dst), Undef, err return len(br.dst), Undef, ErrInvalidCid{err}
} }
// We could replace most of the code below with go-multihash's ReadMultihash. // We could replace most of the code below with go-multihash's ReadMultihash.
@@ -741,19 +771,19 @@ func CidFromReader(r io.Reader) (int, Cid, error) {
// Multihash hash function code. // Multihash hash function code.
_, err = varint.ReadUvarint(br) _, err = varint.ReadUvarint(br)
if err != nil { if err != nil {
return len(br.dst), Undef, err return len(br.dst), Undef, ErrInvalidCid{err}
} }
// Multihash digest length. // Multihash digest length.
mhl, err := varint.ReadUvarint(br) mhl, err := varint.ReadUvarint(br)
if err != nil { if err != nil {
return len(br.dst), Undef, err return len(br.dst), Undef, ErrInvalidCid{err}
} }
// Refuse to make large allocations to prevent OOMs due to bugs. // Refuse to make large allocations to prevent OOMs due to bugs.
const maxDigestAlloc = 32 << 20 // 32MiB const maxDigestAlloc = 32 << 20 // 32MiB
if mhl > maxDigestAlloc { if mhl > maxDigestAlloc {
return len(br.dst), Undef, fmt.Errorf("refusing to allocate %d bytes for a digest", mhl) return len(br.dst), Undef, ErrInvalidCid{fmt.Errorf("refusing to allocate %d bytes for a digest", mhl)}
} }
// Fine to convert mhl to int, given maxDigestAlloc. // Fine to convert mhl to int, given maxDigestAlloc.
@@ -772,7 +802,7 @@ func CidFromReader(r io.Reader) (int, Cid, error) {
if n, err := io.ReadFull(r, br.dst[prefixLength:cidLength]); err != nil { if n, err := io.ReadFull(r, br.dst[prefixLength:cidLength]); err != nil {
// We can't use len(br.dst) here, // We can't use len(br.dst) here,
// as we've only read n bytes past prefixLength. // as we've only read n bytes past prefixLength.
return prefixLength + n, Undef, err return prefixLength + n, Undef, ErrInvalidCid{err}
} }
// This simply ensures the multihash is valid. // This simply ensures the multihash is valid.
@@ -780,7 +810,7 @@ func CidFromReader(r io.Reader) (int, Cid, error) {
// for now, it helps ensure consistency with CidFromBytes. // for now, it helps ensure consistency with CidFromBytes.
_, _, err = mh.MHFromBytes(br.dst[mhStart:]) _, _, err = mh.MHFromBytes(br.dst[mhStart:])
if err != nil { if err != nil {
return len(br.dst), Undef, err return len(br.dst), Undef, ErrInvalidCid{err}
} }
return len(br.dst), Cid{string(br.dst)}, nil return len(br.dst), Cid{string(br.dst)}, nil

View File

@@ -4,6 +4,7 @@ import (
"bytes" "bytes"
crand "crypto/rand" crand "crypto/rand"
"encoding/json" "encoding/json"
"errors"
"fmt" "fmt"
"io" "io"
"math/rand" "math/rand"
@@ -32,7 +33,7 @@ func assertEqual(t *testing.T, a, b Cid) {
func TestPrefixSum(t *testing.T) { func TestPrefixSum(t *testing.T) {
// Test creating CIDs both manually and with Prefix. // Test creating CIDs both manually and with Prefix.
// Tests: https://github.com/ipfs/go-cid/issues/83 // Tests: https://code.sonr.org/go/cid/issues/83
for _, hashfun := range []uint64{ for _, hashfun := range []uint64{
mh.IDENTITY, mh.SHA3, mh.SHA2_256, mh.IDENTITY, mh.SHA3, mh.SHA2_256,
} { } {
@@ -162,6 +163,9 @@ func TestBasesMarshaling(t *testing.T) {
if err == nil { if err == nil {
t.Fatal("expected too-short error from ExtractEncoding") t.Fatal("expected too-short error from ExtractEncoding")
} }
if !errors.Is(err, ErrInvalidCid{}) {
t.Fatal("expected error to be ErrInvalidCid")
}
if ee != -1 { if ee != -1 {
t.Fatal("expected -1 from too-short ExtractEncoding") t.Fatal("expected -1 from too-short ExtractEncoding")
} }
@@ -227,6 +231,9 @@ func TestEmptyString(t *testing.T) {
if err == nil { if err == nil {
t.Fatal("shouldnt be able to parse an empty cid") t.Fatal("shouldnt be able to parse an empty cid")
} }
if !errors.Is(err, ErrInvalidCid{}) {
t.Fatal("error must be ErrInvalidCid")
}
} }
func TestV0Handling(t *testing.T) { func TestV0Handling(t *testing.T) {
@@ -282,6 +289,9 @@ func TestV0ErrorCases(t *testing.T) {
if err == nil { if err == nil {
t.Fatal("should have failed to decode that ref") t.Fatal("should have failed to decode that ref")
} }
if !errors.Is(err, ErrInvalidCid{}) {
t.Fatal("error must be ErrInvalidCid")
}
} }
func TestNewPrefixV1(t *testing.T) { func TestNewPrefixV1(t *testing.T) {
@@ -372,6 +382,9 @@ func TestInvalidV0Prefix(t *testing.T) {
if err == nil { if err == nil {
t.Fatalf("should error (index %d)", i) t.Fatalf("should error (index %d)", i)
} }
if !errors.Is(err, ErrInvalidCid{}) {
t.Fatal("expected error to be ErrInvalidCid")
}
} }
} }
@@ -381,6 +394,9 @@ func TestBadPrefix(t *testing.T) {
if err == nil { if err == nil {
t.Fatalf("expected error on v3 prefix Sum") t.Fatalf("expected error on v3 prefix Sum")
} }
if !errors.Is(err, ErrInvalidCid{}) {
t.Fatal("expected error to be ErrInvalidCid")
}
} }
func TestPrefixRoundtrip(t *testing.T) { func TestPrefixRoundtrip(t *testing.T) {
@@ -417,18 +433,30 @@ func TestBadPrefixFromBytes(t *testing.T) {
if err == nil { if err == nil {
t.Fatal("expected error for bad byte 0") t.Fatal("expected error for bad byte 0")
} }
if !errors.Is(err, ErrInvalidCid{}) {
t.Fatal("expected error to be ErrInvalidCid")
}
_, err = PrefixFromBytes([]byte{0x01, 0x80}) _, err = PrefixFromBytes([]byte{0x01, 0x80})
if err == nil { if err == nil {
t.Fatal("expected error for bad byte 1") t.Fatal("expected error for bad byte 1")
} }
if !errors.Is(err, ErrInvalidCid{}) {
t.Fatal("expected error to be ErrInvalidCid")
}
_, err = PrefixFromBytes([]byte{0x01, 0x01, 0x80}) _, err = PrefixFromBytes([]byte{0x01, 0x01, 0x80})
if err == nil { if err == nil {
t.Fatal("expected error for bad byte 2") t.Fatal("expected error for bad byte 2")
} }
if !errors.Is(err, ErrInvalidCid{}) {
t.Fatal("expected error to be ErrInvalidCid")
}
_, err = PrefixFromBytes([]byte{0x01, 0x01, 0x01, 0x80}) _, err = PrefixFromBytes([]byte{0x01, 0x01, 0x01, 0x80})
if err == nil { if err == nil {
t.Fatal("expected error for bad byte 3") t.Fatal("expected error for bad byte 3")
} }
if !errors.Is(err, ErrInvalidCid{}) {
t.Fatal("expected error to be ErrInvalidCid")
}
} }
func Test16BytesVarint(t *testing.T) { func Test16BytesVarint(t *testing.T) {
@@ -455,6 +483,9 @@ func TestParse(t *testing.T) {
if !strings.Contains(err.Error(), "can't parse 123 as Cid") { if !strings.Contains(err.Error(), "can't parse 123 as Cid") {
t.Fatalf("expected int error, got %s", err.Error()) t.Fatalf("expected int error, got %s", err.Error())
} }
if !errors.Is(err, ErrInvalidCid{}) {
t.Fatalf("expected ErrInvalidCid, got %s", err.Error())
}
theHash := "QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n" theHash := "QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n"
h, err := mh.FromB58String(theHash) h, err := mh.FromB58String(theHash)
@@ -572,17 +603,29 @@ func TestJsonRoundTrip(t *testing.T) {
t.Fatal("cids not equal for Cid") t.Fatal("cids not equal for Cid")
} }
if err = actual2.UnmarshalJSON([]byte("1")); err == nil { err = actual2.UnmarshalJSON([]byte("1"))
if err == nil {
t.Fatal("expected error for too-short JSON") t.Fatal("expected error for too-short JSON")
} }
if !errors.Is(err, ErrInvalidCid{}) {
if err = actual2.UnmarshalJSON([]byte(`{"nope":"nope"}`)); err == nil { t.Fatal("expected error to be ErrInvalidCid")
t.Fatal("expected error for bad CID JSON")
} }
if err = actual2.UnmarshalJSON([]byte(`bad "" json!`)); err == nil { err = actual2.UnmarshalJSON([]byte(`{"nope":"nope"}`))
if err == nil {
t.Fatal("expected error for bad CID JSON")
}
if !errors.Is(err, ErrInvalidCid{}) {
t.Fatal("expected error to be ErrInvalidCid")
}
err = actual2.UnmarshalJSON([]byte(`bad "" json!`))
if err == nil {
t.Fatal("expected error for bad JSON") t.Fatal("expected error for bad JSON")
} }
if !errors.Is(err, ErrInvalidCid{}) {
t.Fatal("expected error to be ErrInvalidCid")
}
var actual3 Cid var actual3 Cid
enc, err = actual3.MarshalJSON() enc, err = actual3.MarshalJSON()
@@ -740,6 +783,30 @@ func TestBadCidInput(t *testing.T) {
} }
} }
func TestFromReaderNoData(t *testing.T) {
// Reading no data from io.Reader should return io.EOF, not ErrInvalidCid.
n, cid, err := CidFromReader(bytes.NewReader(nil))
if err != io.EOF {
t.Fatal("Expected io.EOF error")
}
if cid != Undef {
t.Fatal("Expected Undef CID")
}
if n != 0 {
t.Fatal("Expected 0 data")
}
// Read byte indicatiing more data to and check error is ErrInvalidCid.
_, _, err = CidFromReader(bytes.NewReader([]byte{0x80}))
if !errors.Is(err, ErrInvalidCid{}) {
t.Fatal("Expected ErrInvalidCid error")
}
// Check for expected wrapped error.
if !errors.Is(err, io.ErrUnexpectedEOF) {
t.Fatal("Expected error", io.ErrUnexpectedEOF)
}
}
func TestBadParse(t *testing.T) { func TestBadParse(t *testing.T) {
hash, err := mh.Sum([]byte("foobar"), mh.SHA3_256, -1) hash, err := mh.Sum([]byte("foobar"), mh.SHA3_256, -1)
if err != nil { if err != nil {
@@ -749,6 +816,9 @@ func TestBadParse(t *testing.T) {
if err == nil { if err == nil {
t.Fatal("expected to fail to parse an invalid CIDv1 CID") t.Fatal("expected to fail to parse an invalid CIDv1 CID")
} }
if !errors.Is(err, ErrInvalidCid{}) {
t.Fatal("error must be ErrInvalidCid")
}
} }
func TestLoggable(t *testing.T) { func TestLoggable(t *testing.T) {
@@ -763,3 +833,80 @@ func TestLoggable(t *testing.T) {
t.Fatalf("did not get expected loggable form (got %v)", actual) t.Fatalf("did not get expected loggable form (got %v)", actual)
} }
} }
func TestErrInvalidCidIs(t *testing.T) {
for i, test := range []struct {
err error
target error
}{
{&ErrInvalidCid{}, ErrInvalidCid{}},
{ErrInvalidCid{}, &ErrInvalidCid{}},
{ErrInvalidCid{}, ErrInvalidCid{}},
{&ErrInvalidCid{}, &ErrInvalidCid{}},
} {
if !errors.Is(test.err, test.target) {
t.Fatalf("expected error to be ErrInvalidCid, case %d", i)
}
}
}
func TestErrInvalidCid(t *testing.T) {
run := func(err error) {
if err == nil {
t.Fatal("expected error")
}
if !strings.HasPrefix(err.Error(), "invalid cid: ") {
t.Fatal(`expected error message to contain "invalid cid: "`)
}
is := errors.Is(err, ErrInvalidCid{})
if !is {
t.Fatal("expected error to be ErrInvalidCid")
}
if !errors.Is(err, &ErrInvalidCid{}) {
t.Fatal("expected error to be &ErrInvalidCid")
}
}
_, err := Decode("")
run(err)
_, err = Decode("not-a-cid")
run(err)
_, err = Decode("bafyInvalid")
run(err)
_, err = Decode("QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zIII")
run(err)
_, err = Cast([]byte("invalid"))
run(err)
_, err = Parse("not-a-cid")
run(err)
_, err = Parse("bafyInvalid")
run(err)
_, err = Parse("QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zIII")
run(err)
_, err = Parse(123)
run(err)
_, _, err = CidFromBytes([]byte("invalid"))
run(err)
_, err = Prefix{}.Sum([]byte("data"))
run(err)
_, err = PrefixFromBytes([]byte{0x80})
run(err)
_, err = ExtractEncoding("invalid ")
run(err)
}

19
go.mod
View File

@@ -1,20 +1,21 @@
module github.com/ipfs/go-cid module code.sonr.org/go/cid
require ( require (
github.com/multiformats/go-multibase v0.0.3 github.com/multiformats/go-multibase v0.2.0
github.com/multiformats/go-multihash v0.0.15 github.com/multiformats/go-multihash v0.2.3
github.com/multiformats/go-varint v0.0.6 github.com/multiformats/go-varint v0.1.0
) )
require ( require (
github.com/klauspost/cpuid/v2 v2.0.4 // indirect github.com/klauspost/cpuid/v2 v2.0.9 // indirect
github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 // indirect
github.com/minio/sha256-simd v1.0.0 // indirect github.com/minio/sha256-simd v1.0.0 // indirect
github.com/mr-tron/base58 v1.2.0 // indirect github.com/mr-tron/base58 v1.2.0 // indirect
github.com/multiformats/go-base32 v0.0.3 // indirect github.com/multiformats/go-base32 v0.0.3 // indirect
github.com/multiformats/go-base36 v0.1.0 // indirect github.com/multiformats/go-base36 v0.1.0 // indirect
golang.org/x/crypto v0.1.0 // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect
golang.org/x/sys v0.1.0 // indirect golang.org/x/crypto v0.45.0 // indirect
golang.org/x/sys v0.38.0 // indirect
lukechampine.com/blake3 v1.1.6 // indirect
) )
go 1.19 go 1.24.0

38
go.sum
View File

@@ -1,31 +1,25 @@
github.com/klauspost/cpuid/v2 v2.0.4 h1:g0I61F2K2DjRHz1cnxlkNSBIaePVoJIjjnHui8QHbiw=
github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4=
github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g=
github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM=
github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8=
github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o=
github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc=
github.com/multiformats/go-base32 v0.0.3 h1:tw5+NhuwaOjJCC5Pp82QuXbrmLzWg7uxlMFp8Nq/kkI= github.com/multiformats/go-base32 v0.0.3 h1:tw5+NhuwaOjJCC5Pp82QuXbrmLzWg7uxlMFp8Nq/kkI=
github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA=
github.com/multiformats/go-base36 v0.1.0 h1:JR6TyF7JjGd3m6FbLU2cOxhC0Li8z8dLNGQ89tUg4F4= github.com/multiformats/go-base36 v0.1.0 h1:JR6TyF7JjGd3m6FbLU2cOxhC0Li8z8dLNGQ89tUg4F4=
github.com/multiformats/go-base36 v0.1.0/go.mod h1:kFGE83c6s80PklsHO9sRn2NCoffoRdUUOENyW/Vv6sM= github.com/multiformats/go-base36 v0.1.0/go.mod h1:kFGE83c6s80PklsHO9sRn2NCoffoRdUUOENyW/Vv6sM=
github.com/multiformats/go-multibase v0.0.3 h1:l/B6bJDQjvQ5G52jw4QGSYeOTZoAwIO77RblWplfIqk= github.com/multiformats/go-multibase v0.2.0 h1:isdYCVLvksgWlMW9OZRYJEa9pZETFivncJHmHnnd87g=
github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc= github.com/multiformats/go-multibase v0.2.0/go.mod h1:bFBZX4lKCA/2lyOFSAoKH5SS6oPyjtnzK/XTFDPkNuk=
github.com/multiformats/go-multihash v0.0.15 h1:hWOPdrNqDjwHDx82vsYGSDZNyktOJJ2dzZJzFkOV1jM= github.com/multiformats/go-multihash v0.2.3 h1:7Lyc8XfX/IY2jWb/gI7JP+o7JEq9hOa7BFvVU9RSh+U=
github.com/multiformats/go-multihash v0.0.15/go.mod h1:D6aZrWNLFTV/ynMpKsNtB40mJzmCl4jb1alC0OvHiHg= github.com/multiformats/go-multihash v0.2.3/go.mod h1:dXgKXCXjBzdscBLk9JkjINiEsCKRVch90MdaGiKsvSM=
github.com/multiformats/go-varint v0.0.6 h1:gk85QWKxh3TazbLxED/NlDVv8+q+ReFJk7Y2W/KhfNY= github.com/multiformats/go-varint v0.1.0 h1:i2wqFp4sdl3IcIxfAonHQV9qU5OsZ4Ts9IOoETFs5dI=
github.com/multiformats/go-varint v0.0.6/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/multiformats/go-varint v0.1.0/go.mod h1:5KVAVXegtfmNQQm/lCY+ATvDzvJJhSkUlGQV9wgObdI=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI=
golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
golang.org/x/crypto v0.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU= golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q=
golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= lukechampine.com/blake3 v1.1.6 h1:H3cROdztr7RCfoaTpGZFQsrqvweFLrqS73j7L7cmR5c=
golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= lukechampine.com/blake3 v1.1.6/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA=
golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U=
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=

View File

@@ -1,3 +1,3 @@
{ {
"version": "v0.3.2" "version": "v0.6.0"
} }