Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
60 commits
Select commit Hold shift + click to select a range
5a05621
chore: prepare master for v0.41.0-dev cycle
lidel Feb 11, 2026
0ec69bc
fix: update to latest boxo (#11195)
gammazero Feb 11, 2026
8eab2fc
fix(deps): bump go-libp2p-kad-dht to latest master (#11196)
lidel Feb 11, 2026
4e7ffbd
Upgrade to Boxo v0.37.0 (#11201)
gammazero Feb 16, 2026
1c6f924
upgrade to go-ipfs-cmds v0.16.0 (#11202)
gammazero Feb 16, 2026
3ba7350
fix: improve `ipfs name put` for IPNS record republishing (#11199)
lidel Feb 16, 2026
2bb2c1c
docs: add AGENTS.md with instructions for AI coding agents (#11200)
lidel Feb 17, 2026
c577647
chore: update webui to v4.11.1 (#11204)
lidel Feb 17, 2026
eee2e73
test(gateway-conformance): update to v0.11 (#11207)
lidel Feb 24, 2026
6a082f6
fix: drop high-cardinality server.address from http_server metrics (#…
lidel Feb 24, 2026
221741e
fix(metrics): disable otel exemplars to prevent rune overflow (#11211)
lidel Feb 25, 2026
74ace9d
merge origin/master into release after v0.40.0
lidel Feb 25, 2026
f3aaf15
Merge pull request #11212 from ipfs/merge-release-v0.40.0
lidel Feb 25, 2026
24038c3
docs: streamline release checklist ordering and dependencies (#11193)
lidel Feb 25, 2026
550d3b6
fix(windows): revert update to Go 1.26 (#11215)
aschmahmann Feb 27, 2026
717a898
Merge remote-tracking branch 'origin/master' into merge-release-v0.40.1
lidel Feb 27, 2026
15017c4
Merge pull request #11217 from ipfs/merge-release-v0.40.1
lidel Feb 27, 2026
9c894a7
chore: update webui to v4.12.0 (#11221)
lidel Mar 3, 2026
c8da5c6
chore(deps): bump docker/login-action from 3 to 4 (#11223)
dependabot[bot] Mar 6, 2026
1c1f159
chore(deps): bump actions/upload-artifact from 6 to 7 (#11224)
dependabot[bot] Mar 6, 2026
1de9e41
chore: add changelog placeholder for v0.42
lidel Mar 6, 2026
baf8ff9
docs: use specs.ipfs.tech links for merged IPIPs (#11228)
lidel Mar 7, 2026
6604bcf
chore(deps): bump github.com/ipfs/go-ipld-legacy from 0.2.2 to 0.3.0 …
dependabot[bot] Mar 9, 2026
8f3b30c
chore(deps): bump ipfs/gateway-conformance from 0.11 to 0.12 (#11232)
dependabot[bot] Mar 13, 2026
c885b79
chore(deps): bump docker/build-push-action from 6 to 7 (#11231)
dependabot[bot] Mar 13, 2026
6ab4a40
chore(deps): bump docker/setup-buildx-action from 3 to 4 (#11233)
dependabot[bot] Mar 13, 2026
5c2e297
chore(deps): bump docker/setup-qemu-action from 3 to 4 (#11225)
dependabot[bot] Mar 13, 2026
c0bb1f8
test: fix flaky tests on ci (#11236)
lidel Mar 15, 2026
00ec99a
fix: validate --max-hamt-fanout CLI flag per UnixFS spec (#11230)
lidel Mar 15, 2026
56b22d7
fix(rpc/pin): return error if listing an invalid, but known, pin type…
aschmahmann Mar 17, 2026
9c4e268
fix: correct provider addresses for custom HTTP routing (#11234)
lidel Mar 18, 2026
99c092b
fix(provider): purge keystore datastore after reset (#11198)
guillaumemichel Mar 19, 2026
d843bd8
chore: bump kad-dht to v0.39.0 (#11244)
guillaumemichel Mar 19, 2026
ae98932
feat(cmd): add 'ipfs cid inspect' command (#11241)
jolo18 Mar 20, 2026
6f209df
chore: add go-libp2p and kad-dht bumps to v0.41 changelog
lidel Mar 22, 2026
14fc754
fix(cmd): use restrictive file permissions for exported keys (#11246)
lidel Mar 24, 2026
d2237df
update funding.yml
aschmahmann Mar 25, 2026
3384885
fix(rpc): validate UnixFS in `object patch` (#11248)
lidel Mar 27, 2026
a78991e
fix: replace deprecated otelhttp.WithMetricAttributesFn (#11257)
lidel Mar 29, 2026
85a27d3
chore: fix gofmt (#11256)
wjmelements Mar 29, 2026
43a26ce
fix(rpc): CARv2 import over HTTP API (#11253)
lidel Mar 31, 2026
34ee446
chore(deps): bump codecov/codecov-action from 5.5.2 to 5.5.3 (#11242)
dependabot[bot] Mar 31, 2026
e0c0661
ci: update gateway-conformance to v0.13 (#11262)
lidel Apr 1, 2026
33e73a6
fix(mfs): fix fsync deadlock, set attrs, disable default caching (#11…
wjmelements Apr 2, 2026
e11a536
chore(deps): bump codecov/codecov-action from 5.5.3 to 6.0.0 (#11267)
dependabot[bot] Apr 2, 2026
7bfc824
fix(fuse): IPNS writes actually publish (#11271)
lidel Apr 3, 2026
cd8afce
chore(deps): bump github.com/hashicorp/go-version from 1.8.0 to 1.9.0…
dependabot[bot] Apr 7, 2026
57b967d
chore(deps): bump the ipfs-ecosystem group with 2 updates (#11264)
dependabot[bot] Apr 7, 2026
d60cbc1
fix(mfs): respect Import config (#11273)
lidel Apr 7, 2026
afc8ad3
feat: go 1.26.2 (#11275)
lidel Apr 9, 2026
4d87b29
Upgrade to Boxo v0.38.0 (#11276)
gammazero Apr 9, 2026
a5179f0
fix(fuse): switch to hanwen/go-fuse (#11272)
lidel Apr 9, 2026
356d261
feat(provide): +unique and +entities strategy modifiers (#11245)
lidel Apr 10, 2026
0c00fc3
fix(filestore): respect Provide.Strategy (#11243)
HarukaMa Apr 10, 2026
54ed7cb
upgrade go-cid to v0.6.1 (#11277)
gammazero Apr 10, 2026
1f54f1d
feat: add built-in `ipfs update` command (#11203)
lidel Apr 10, 2026
b1e70f8
feat(fuse): Statfs (#11261)
wjmelements Apr 10, 2026
237251a
fix(cli/rpc): --cid-base works in all commands (#11239)
lidel Apr 10, 2026
c36e548
test(fuse): fix racy Statfs assertions
lidel Apr 10, 2026
47aafb3
chore: set version to v0.41.0-rc1
lidel Apr 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/FUNDING.yml
Original file line number Diff line number Diff line change
@@ -1 +1 @@
custom: [ipshipyard.gitwallet.co]
github: [ipshipyard]
30 changes: 26 additions & 4 deletions .github/workflows/docker-check.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,20 @@ jobs:
verbose: true
format: tty

# Guard rail: the Dockerfile ARG default is what `docker build .` uses
# locally without --build-arg. CI overrides it from go.mod, but the
# default must stay in sync so local builds and the published image use
# the same Go toolchain.
- name: Verify Dockerfile GO_VERSION default matches go.mod
run: |
GO_MOD_VERSION=$(awk '/^go [0-9]/ {print $2; exit}' go.mod)
DOCKERFILE_VERSION=$(awk -F= '/^ARG GO_VERSION=/ {print $2; exit}' Dockerfile)
if [ "$GO_MOD_VERSION" != "$DOCKERFILE_VERSION" ]; then
echo "::error file=Dockerfile::go.mod has 'go ${GO_MOD_VERSION}' but Dockerfile default ARG GO_VERSION=${DOCKERFILE_VERSION}. Update the Dockerfile default to match go.mod."
exit 1
fi
echo "OK: both pinned to ${GO_MOD_VERSION}"

build:
if: github.repository == 'ipfs/kubo' || github.event_name == 'workflow_dispatch'
runs-on: ubuntu-latest
Expand All @@ -42,17 +56,25 @@ jobs:
shell: bash
steps:
- uses: actions/checkout@v6

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

uses: docker/setup-buildx-action@v4

# Mirror the publish workflow: pull the Go version from go.mod so the
# PR check builds with the same toolchain that the published image uses.
- name: Read Go version from go.mod
id: go
run: echo "version=$(awk '/^go [0-9]/ {print $2; exit}' go.mod)" >> "$GITHUB_OUTPUT"

- name: Build Docker image with BuildKit
uses: docker/build-push-action@v6
uses: docker/build-push-action@v7
with:
context: .
push: false
load: true
tags: ${{ env.IMAGE_NAME }}:${{ env.WIP_IMAGE_TAG }}
build-args: |
GO_VERSION=${{ steps.go.outputs.version }}
cache-from: |
type=gha
type=registry,ref=${{ env.IMAGE_NAME }}:buildcache
Expand Down
28 changes: 21 additions & 7 deletions .github/workflows/docker-image.yml
Original file line number Diff line number Diff line change
Expand Up @@ -46,13 +46,13 @@ jobs:
uses: actions/checkout@v6

- name: Set up QEMU
uses: docker/setup-qemu-action@v3
uses: docker/setup-qemu-action@v4

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
uses: docker/setup-buildx-action@v4

- name: Log in to Docker Hub
uses: docker/login-action@v3
uses: docker/login-action@v4
with:
username: ${{ vars.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
Expand All @@ -66,46 +66,58 @@ jobs:
echo "EOF" >> $GITHUB_OUTPUT
shell: bash

# Read the Go version from go.mod so the Docker image is built with the
# exact same toolchain that setup-go installs in the rest of CI.
- name: Read Go version from go.mod
id: go
run: echo "version=$(awk '/^go [0-9]/ {print $2; exit}' go.mod)" >> "$GITHUB_OUTPUT"

# We have to build each platform separately because when using multi-arch
# builds, only one platform is being loaded into the cache. This would
# prevent us from testing the other platforms.
- name: Build Docker image (linux/amd64)
uses: docker/build-push-action@v6
uses: docker/build-push-action@v7
with:
platforms: linux/amd64
context: .
push: false
load: true
file: ./Dockerfile
tags: ${{ env.IMAGE_NAME }}:linux-amd64
build-args: |
GO_VERSION=${{ steps.go.outputs.version }}
cache-from: |
type=gha
type=registry,ref=${{ env.IMAGE_NAME }}:buildcache
cache-to: type=gha,mode=max

- name: Build Docker image (linux/arm/v7)
uses: docker/build-push-action@v6
uses: docker/build-push-action@v7
with:
platforms: linux/arm/v7
context: .
push: false
load: true
file: ./Dockerfile
tags: ${{ env.IMAGE_NAME }}:linux-arm-v7
build-args: |
GO_VERSION=${{ steps.go.outputs.version }}
cache-from: |
type=gha
type=registry,ref=${{ env.IMAGE_NAME }}:buildcache
cache-to: type=gha,mode=max

- name: Build Docker image (linux/arm64/v8)
uses: docker/build-push-action@v6
uses: docker/build-push-action@v7
with:
platforms: linux/arm64/v8
context: .
push: false
load: true
file: ./Dockerfile
tags: ${{ env.IMAGE_NAME }}:linux-arm64-v8
build-args: |
GO_VERSION=${{ steps.go.outputs.version }}
cache-from: |
type=gha
type=registry,ref=${{ env.IMAGE_NAME }}:buildcache
Expand All @@ -128,13 +140,15 @@ jobs:
# This will only push the previously built images.
- if: github.event_name != 'workflow_dispatch' || github.event.inputs.push == 'true'
name: Publish to Docker Hub
uses: docker/build-push-action@v6
uses: docker/build-push-action@v7
with:
platforms: linux/amd64,linux/arm/v7,linux/arm64/v8
context: .
push: true
file: ./Dockerfile
tags: "${{ github.event.inputs.tags || steps.tags.outputs.value }}"
build-args: |
GO_VERSION=${{ steps.go.outputs.version }}
cache-from: |
type=gha
type=registry,ref=${{ env.IMAGE_NAME }}:buildcache
Expand Down
16 changes: 8 additions & 8 deletions .github/workflows/gateway-conformance.yml
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ jobs:
steps:
# 1. Download the gateway-conformance fixtures
- name: Download gateway-conformance fixtures
uses: ipfs/gateway-conformance/.github/actions/extract-fixtures@v0.10
uses: ipfs/gateway-conformance/.github/actions/extract-fixtures@v0.13
with:
output: fixtures

Expand Down Expand Up @@ -93,7 +93,7 @@ jobs:

# 6. Run the gateway-conformance tests
- name: Run gateway-conformance tests
uses: ipfs/gateway-conformance/.github/actions/test@v0.10
uses: ipfs/gateway-conformance/.github/actions/test@v0.13
with:
gateway-url: http://127.0.0.1:8080
subdomain-url: http://localhost:8080
Expand All @@ -109,13 +109,13 @@ jobs:
run: cat output.md >> $GITHUB_STEP_SUMMARY
- name: Upload HTML report
if: failure() || success()
uses: actions/upload-artifact@v6
uses: actions/upload-artifact@v7
with:
name: gateway-conformance.html
path: output.html
- name: Upload JSON report
if: failure() || success()
uses: actions/upload-artifact@v6
uses: actions/upload-artifact@v7
with:
name: gateway-conformance.json
path: output.json
Expand All @@ -127,7 +127,7 @@ jobs:
steps:
# 1. Download the gateway-conformance fixtures
- name: Download gateway-conformance fixtures
uses: ipfs/gateway-conformance/.github/actions/extract-fixtures@v0.10
uses: ipfs/gateway-conformance/.github/actions/extract-fixtures@v0.13
with:
output: fixtures

Expand Down Expand Up @@ -199,7 +199,7 @@ jobs:

# 9. Run the gateway-conformance tests over libp2p
- name: Run gateway-conformance tests over libp2p
uses: ipfs/gateway-conformance/.github/actions/test@v0.10
uses: ipfs/gateway-conformance/.github/actions/test@v0.13
with:
gateway-url: http://127.0.0.1:8092
args: --specs "trustless-gateway,-trustless-ipns-gateway" -skip 'TestGatewayCar/GET_response_for_application/vnd.ipld.car/Header_Content-Length'
Expand All @@ -214,13 +214,13 @@ jobs:
run: cat output.md >> $GITHUB_STEP_SUMMARY
- name: Upload HTML report
if: failure() || success()
uses: actions/upload-artifact@v6
uses: actions/upload-artifact@v7
with:
name: gateway-conformance-libp2p.html
path: output.html
- name: Upload JSON report
if: failure() || success()
uses: actions/upload-artifact@v6
uses: actions/upload-artifact@v7
with:
name: gateway-conformance-libp2p.json
path: output.json
63 changes: 58 additions & 5 deletions .github/workflows/gotest.yml
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ jobs:
make test_unit &&
[[ ! $(jq -s -c 'map(select(.Action == "fail")) | .[]' test/unit/gotest.json) ]]
- name: Upload coverage to Codecov
uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2
uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0
if: failure() || success()
with:
name: unittests
Expand All @@ -57,7 +57,7 @@ jobs:
output: test/unit/gotest.junit.xml
if: failure() || success()
- name: Archive the JUnit XML report
uses: actions/upload-artifact@v6
uses: actions/upload-artifact@v7
with:
name: unit-tests-junit
path: test/unit/gotest.junit.xml
Expand All @@ -70,7 +70,7 @@ jobs:
output: test/unit/gotest.html
if: failure() || success()
- name: Archive the HTML report
uses: actions/upload-artifact@v6
uses: actions/upload-artifact@v7
with:
name: unit-tests-html
path: test/unit/gotest.html
Expand Down Expand Up @@ -120,7 +120,7 @@ jobs:
output: test/cli/cli-tests.junit.xml
if: failure() || success()
- name: Archive JUnit XML report
uses: actions/upload-artifact@v6
uses: actions/upload-artifact@v7
with:
name: cli-tests-junit
path: test/cli/cli-tests.junit.xml
Expand All @@ -133,7 +133,7 @@ jobs:
output: test/cli/cli-tests.html
if: failure() || success()
- name: Archive HTML report
uses: actions/upload-artifact@v6
uses: actions/upload-artifact@v7
with:
name: cli-tests-html
path: test/cli/cli-tests.html
Expand All @@ -149,6 +149,59 @@ jobs:
run: cat test/cli/cli-tests.md >> $GITHUB_STEP_SUMMARY
if: failure() || success()

# FUSE filesystem tests (require /dev/fuse and fusermount)
# Runs both FUSE unit tests (./fuse/...) and CLI integration tests (./test/cli/fuse/...)
fuse-tests:
if: github.repository == 'ipfs/kubo' || github.event_name == 'workflow_dispatch'
runs-on: ${{ fromJSON(github.repository == 'ipfs/kubo' && '["self-hosted", "linux", "x64", "2xlarge"]' || '"ubuntu-latest"') }}
concurrency:
group: fuse-tests-${{ github.repository }}
cancel-in-progress: false
# A normal run takes ~3min. 6min gives roughly 2x and lets Go's 4min
# test timeout fire first (printing a stack trace) on a hang, instead
# of GitHub silently cancelling the job.
timeout-minutes: 6
env:
# Dump all goroutines on a test panic, not just the panicking one,
# so we can see which test is actually hung.
GOTRACEBACK: all
TEST_FUSE: 1
defaults:
run:
shell: bash
steps:
- name: Check out Kubo
uses: actions/checkout@v6
- name: Set up Go
uses: actions/setup-go@v6
with:
go-version-file: 'go.mod'
- name: Install FUSE
run: |
if ! command -v fusermount3 &>/dev/null && ! command -v fusermount &>/dev/null; then
sudo apt-get update
sudo apt-get install -y fuse3
fi
- name: Clean up stale FUSE mounts
run: |
# On shared self-hosted runners, leftover mounts from previous
# runs can exhaust the kernel FUSE mount limit (mount_max).
# Unit tests mount with FsName "kubo-test"; CLI tests mount
# under the harness temp dir (ipfs/ipns/mfs subdirectories).
awk '$1 == "kubo-test" || $2 ~ /\/tmp\/.*\/(ipfs|ipns|mfs)$/ { print $2 }' /proc/mounts 2>/dev/null \
| while read -r mp; do
fusermount3 -uz "$mp" 2>/dev/null || fusermount -uz "$mp" 2>/dev/null || true
done
- name: Run FUSE tests
run: make test_fuse
- name: Clean up FUSE mounts
if: always()
run: |
awk '$1 == "kubo-test" || $2 ~ /\/tmp\/.*\/(ipfs|ipns|mfs)$/ { print $2 }' /proc/mounts 2>/dev/null \
| while read -r mp; do
fusermount3 -uz "$mp" 2>/dev/null || fusermount -uz "$mp" 2>/dev/null || true
done

# Example tests (kubo-as-a-library)
example-tests:
if: github.repository == 'ipfs/kubo' || github.event_name == 'workflow_dispatch'
Expand Down
8 changes: 4 additions & 4 deletions .github/workflows/interop.yml
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ jobs:
with:
go-version-file: 'go.mod'
- run: make build
- uses: actions/upload-artifact@v6
- uses: actions/upload-artifact@v7
with:
name: kubo
path: cmd/ipfs/ipfs
Expand All @@ -66,7 +66,7 @@ jobs:
- uses: actions/setup-node@v6
with:
node-version: lts/*
- uses: actions/download-artifact@v7
- uses: actions/download-artifact@v8
with:
name: kubo
path: cmd/ipfs
Expand Down Expand Up @@ -122,7 +122,7 @@ jobs:
run:
shell: bash
steps:
- uses: actions/download-artifact@v7
- uses: actions/download-artifact@v8
with:
name: kubo
path: cmd/ipfs
Expand Down Expand Up @@ -196,7 +196,7 @@ jobs:
working-directory: ipfs-webui
- name: Upload test artifacts on failure
if: failure()
uses: actions/upload-artifact@v6
uses: actions/upload-artifact@v7
with:
name: webui-test-results
path: ipfs-webui/test-results/
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/sharness.yml
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ jobs:
# increasing parallelism beyond 10 doesn't speed up the tests much
PARALLEL: ${{ github.repository == 'ipfs/kubo' && 10 || 3 }}
- name: Upload coverage report
uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2
uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0
if: failure() || success()
with:
name: sharness
Expand Down Expand Up @@ -90,7 +90,7 @@ jobs:
destination: sharness.html
- name: Upload one-page HTML report
if: github.repository != 'ipfs/kubo' && (failure() || success())
uses: actions/upload-artifact@v6
uses: actions/upload-artifact@v7
with:
name: sharness.html
path: kubo/test/sharness/test-results/sharness.html
Expand All @@ -110,7 +110,7 @@ jobs:
destination: sharness-html/
- name: Upload full HTML report
if: github.repository != 'ipfs/kubo' && (failure() || success())
uses: actions/upload-artifact@v6
uses: actions/upload-artifact@v7
with:
name: sharness-html
path: kubo/test/sharness/test-results/sharness-html
Expand Down
Loading
Loading