Showing preview only (6,152K chars total). Download the full file or copy to clipboard to get everything.
Repository: ipfs/kubo
Branch: master
Commit: ae989328a178
Files: 921
Total size: 5.7 MB
Directory structure:
gitextract__oi967oe/
├── .codeclimate.yml
├── .cspell.yml
├── .dockerignore
├── .gitattributes
├── .github/
│ ├── CODEOWNERS
│ ├── FUNDING.yml
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug-report.yml
│ │ ├── config.yml
│ │ ├── doc.yml
│ │ ├── enhancement.yml
│ │ └── feature.yml
│ ├── auto-comment.yml
│ ├── build-platforms.yml
│ ├── dependabot.yml
│ ├── pull_request_template.md
│ └── workflows/
│ ├── changelog.yml
│ ├── codeql-analysis.yml
│ ├── dependabot-tidy.yml
│ ├── docker-check.yml
│ ├── docker-image.yml
│ ├── gateway-conformance.yml
│ ├── generated-pr.yml
│ ├── gobuild.yml
│ ├── golang-analysis.yml
│ ├── golint.yml
│ ├── gotest.yml
│ ├── interop.yml
│ ├── sharness.yml
│ ├── spellcheck.yml
│ ├── stale.yml
│ ├── sync-release-assets.yml
│ └── test-migrations.yml
├── .gitignore
├── .golangci.yml
├── .hadolint.yaml
├── .mailmap
├── AGENTS.md
├── CHANGELOG.md
├── CONTRIBUTING.md
├── Dockerfile
├── FUNDING.json
├── GNUmakefile
├── LICENSE
├── LICENSE-APACHE
├── LICENSE-MIT
├── Makefile
├── README.md
├── Rules.mk
├── SECURITY.md
├── assets/
│ ├── README.md
│ ├── assets.go
│ └── init-doc/
│ ├── about
│ ├── contact
│ ├── docs/
│ │ └── index
│ ├── help
│ ├── ping
│ ├── quick-start
│ ├── readme
│ └── security-notes
├── bin/
│ ├── Rules.mk
│ ├── archive-branches.sh
│ ├── container_daemon
│ ├── container_init_run
│ ├── dist_get
│ ├── gencmdref
│ ├── get-docker-tags.sh
│ ├── graphmd
│ ├── ipns-republish
│ ├── maketarball.sh
│ ├── mkreleaselog
│ ├── push-docker-tags.sh
│ ├── test-go-build-platforms
│ └── test-go-fmt
├── blocks/
│ └── blockstoreutil/
│ └── remove.go
├── client/
│ └── rpc/
│ ├── README.md
│ ├── api.go
│ ├── api_test.go
│ ├── apifile.go
│ ├── auth/
│ │ └── auth.go
│ ├── block.go
│ ├── dag.go
│ ├── errors.go
│ ├── errors_test.go
│ ├── key.go
│ ├── name.go
│ ├── object.go
│ ├── path.go
│ ├── pin.go
│ ├── pubsub.go
│ ├── request.go
│ ├── requestbuilder.go
│ ├── response.go
│ ├── routing.go
│ ├── swarm.go
│ └── unixfs.go
├── codecov.yml
├── commands/
│ ├── context.go
│ └── reqlog.go
├── config/
│ ├── addresses.go
│ ├── api.go
│ ├── api_test.go
│ ├── autoconf.go
│ ├── autoconf_client.go
│ ├── autoconf_test.go
│ ├── autonat.go
│ ├── autotls.go
│ ├── bitswap.go
│ ├── bootstrap_peers.go
│ ├── bootstrap_peers_test.go
│ ├── config.go
│ ├── config_test.go
│ ├── datastore.go
│ ├── discovery.go
│ ├── dns.go
│ ├── experiments.go
│ ├── gateway.go
│ ├── http_retrieval.go
│ ├── identity.go
│ ├── import.go
│ ├── import_test.go
│ ├── init.go
│ ├── init_test.go
│ ├── internal.go
│ ├── ipns.go
│ ├── migration.go
│ ├── migration_test.go
│ ├── mounts.go
│ ├── peering.go
│ ├── plugins.go
│ ├── profile.go
│ ├── provide.go
│ ├── provide_test.go
│ ├── provider.go
│ ├── pubsub.go
│ ├── remotepin.go
│ ├── reprovider.go
│ ├── routing.go
│ ├── routing_test.go
│ ├── serialize/
│ │ ├── serialize.go
│ │ └── serialize_test.go
│ ├── swarm.go
│ ├── types.go
│ ├── types_test.go
│ └── version.go
├── core/
│ ├── .gitignore
│ ├── builder.go
│ ├── commands/
│ │ ├── active.go
│ │ ├── add.go
│ │ ├── bitswap.go
│ │ ├── block.go
│ │ ├── bootstrap.go
│ │ ├── cat.go
│ │ ├── cid.go
│ │ ├── cid_test.go
│ │ ├── cmdenv/
│ │ │ ├── cidbase.go
│ │ │ ├── cidbase_test.go
│ │ │ ├── env.go
│ │ │ ├── env_test.go
│ │ │ └── file.go
│ │ ├── cmdutils/
│ │ │ ├── sanitize.go
│ │ │ ├── utils.go
│ │ │ └── utils_test.go
│ │ ├── commands.go
│ │ ├── commands_test.go
│ │ ├── completion.go
│ │ ├── config.go
│ │ ├── config_test.go
│ │ ├── dag/
│ │ │ ├── dag.go
│ │ │ ├── export.go
│ │ │ ├── get.go
│ │ │ ├── import.go
│ │ │ ├── put.go
│ │ │ ├── resolve.go
│ │ │ └── stat.go
│ │ ├── dht.go
│ │ ├── dht_test.go
│ │ ├── diag.go
│ │ ├── e/
│ │ │ └── error.go
│ │ ├── external.go
│ │ ├── extra.go
│ │ ├── files.go
│ │ ├── files_test.go
│ │ ├── filestore.go
│ │ ├── get.go
│ │ ├── get_test.go
│ │ ├── helptext_test.go
│ │ ├── id.go
│ │ ├── keyencode/
│ │ │ └── keyencode.go
│ │ ├── keystore.go
│ │ ├── log.go
│ │ ├── ls.go
│ │ ├── ls_test.go
│ │ ├── mount_nofuse.go
│ │ ├── mount_unix.go
│ │ ├── mount_windows.go
│ │ ├── multibase.go
│ │ ├── name/
│ │ │ ├── ipns.go
│ │ │ ├── ipnsps.go
│ │ │ ├── name.go
│ │ │ └── publish.go
│ │ ├── object/
│ │ │ ├── diff.go
│ │ │ ├── object.go
│ │ │ └── patch.go
│ │ ├── p2p.go
│ │ ├── pin/
│ │ │ ├── pin.go
│ │ │ ├── remotepin.go
│ │ │ └── remotepin_test.go
│ │ ├── ping.go
│ │ ├── profile.go
│ │ ├── provide.go
│ │ ├── pubsub.go
│ │ ├── refs.go
│ │ ├── repo.go
│ │ ├── repo_verify_test.go
│ │ ├── resolve.go
│ │ ├── root.go
│ │ ├── root_test.go
│ │ ├── routing.go
│ │ ├── shutdown.go
│ │ ├── stat.go
│ │ ├── stat_dht.go
│ │ ├── stat_provide.go
│ │ ├── stat_reprovide.go
│ │ ├── swarm.go
│ │ ├── swarm_addrs_autonat.go
│ │ ├── sysdiag.go
│ │ └── version.go
│ ├── core.go
│ ├── core_test.go
│ ├── coreapi/
│ │ ├── block.go
│ │ ├── coreapi.go
│ │ ├── dag.go
│ │ ├── key.go
│ │ ├── name.go
│ │ ├── object.go
│ │ ├── path.go
│ │ ├── pin.go
│ │ ├── pubsub.go
│ │ ├── routing.go
│ │ ├── swarm.go
│ │ ├── test/
│ │ │ ├── api_test.go
│ │ │ └── path_test.go
│ │ └── unixfs.go
│ ├── corehttp/
│ │ ├── commands.go
│ │ ├── corehttp.go
│ │ ├── gateway.go
│ │ ├── gateway_test.go
│ │ ├── logs.go
│ │ ├── metrics.go
│ │ ├── metrics_test.go
│ │ ├── mutex_profile.go
│ │ ├── option_test.go
│ │ ├── p2p_proxy.go
│ │ ├── p2p_proxy_test.go
│ │ ├── redirect.go
│ │ ├── routing.go
│ │ └── webui.go
│ ├── coreiface/
│ │ ├── block.go
│ │ ├── coreapi.go
│ │ ├── dag.go
│ │ ├── errors.go
│ │ ├── idfmt.go
│ │ ├── key.go
│ │ ├── name.go
│ │ ├── object.go
│ │ ├── options/
│ │ │ ├── block.go
│ │ │ ├── dht.go
│ │ │ ├── global.go
│ │ │ ├── key.go
│ │ │ ├── name.go
│ │ │ ├── object.go
│ │ │ ├── pin.go
│ │ │ ├── pubsub.go
│ │ │ ├── routing.go
│ │ │ ├── unixfs.go
│ │ │ └── unixfs_test.go
│ │ ├── pin.go
│ │ ├── pubsub.go
│ │ ├── routing.go
│ │ ├── swarm.go
│ │ ├── tests/
│ │ │ ├── api.go
│ │ │ ├── block.go
│ │ │ ├── dag.go
│ │ │ ├── key.go
│ │ │ ├── name.go
│ │ │ ├── object.go
│ │ │ ├── path.go
│ │ │ ├── pin.go
│ │ │ ├── pubsub.go
│ │ │ ├── routing.go
│ │ │ └── unixfs.go
│ │ ├── unixfs.go
│ │ └── util.go
│ ├── corerepo/
│ │ ├── gc.go
│ │ └── stat.go
│ ├── coreunix/
│ │ ├── add.go
│ │ ├── add_test.go
│ │ ├── metadata.go
│ │ ├── metadata_test.go
│ │ └── test/
│ │ └── data/
│ │ ├── colors/
│ │ │ └── orange
│ │ ├── corps/
│ │ │ └── apple
│ │ └── fruits/
│ │ ├── apple
│ │ └── orange
│ ├── mock/
│ │ └── mock.go
│ └── node/
│ ├── bitswap.go
│ ├── builder.go
│ ├── core.go
│ ├── dns.go
│ ├── groups.go
│ ├── helpers/
│ │ └── helpers.go
│ ├── helpers.go
│ ├── identity.go
│ ├── ipns.go
│ ├── libp2p/
│ │ ├── addrs.go
│ │ ├── discovery.go
│ │ ├── dns.go
│ │ ├── fd/
│ │ │ ├── sys_not_unix.go
│ │ │ ├── sys_unix.go
│ │ │ └── sys_windows.go
│ │ ├── filters.go
│ │ ├── host.go
│ │ ├── hostopt.go
│ │ ├── libp2p.go
│ │ ├── libp2p_test.go
│ │ ├── nat.go
│ │ ├── peerstore.go
│ │ ├── pnet.go
│ │ ├── pubsub.go
│ │ ├── pubsub_test.go
│ │ ├── rcmgr.go
│ │ ├── rcmgr_defaults.go
│ │ ├── rcmgr_logging.go
│ │ ├── rcmgr_logging_test.go
│ │ ├── relay.go
│ │ ├── routing.go
│ │ ├── routingopt.go
│ │ ├── routingopt_test.go
│ │ ├── sec.go
│ │ ├── smux.go
│ │ ├── topicdiscovery.go
│ │ └── transport.go
│ ├── p2pforge_resolver.go
│ ├── p2pforge_resolver_test.go
│ ├── peering.go
│ ├── provider.go
│ └── storage.go
├── coverage/
│ ├── .gitignore
│ ├── Rules.mk
│ └── main/
│ └── main.go
├── doc.go
├── docker-compose.yaml
├── docs/
│ ├── EARLY_TESTERS.md
│ ├── README.md
│ ├── RELEASE_CHECKLIST.md
│ ├── RELEASE_ISSUE_TEMPLATE.md
│ ├── add-code-flow.md
│ ├── changelogs/
│ │ ├── v0.10.md
│ │ ├── v0.11.md
│ │ ├── v0.12.md
│ │ ├── v0.13.md
│ │ ├── v0.14.md
│ │ ├── v0.15.md
│ │ ├── v0.16.md
│ │ ├── v0.17.md
│ │ ├── v0.18.md
│ │ ├── v0.19.md
│ │ ├── v0.2.md
│ │ ├── v0.20.md
│ │ ├── v0.21.md
│ │ ├── v0.22.md
│ │ ├── v0.23.md
│ │ ├── v0.24.md
│ │ ├── v0.25.md
│ │ ├── v0.26.md
│ │ ├── v0.27.md
│ │ ├── v0.28.md
│ │ ├── v0.29.md
│ │ ├── v0.3.md
│ │ ├── v0.30.md
│ │ ├── v0.31.md
│ │ ├── v0.32.md
│ │ ├── v0.33.md
│ │ ├── v0.34.md
│ │ ├── v0.35.md
│ │ ├── v0.36.md
│ │ ├── v0.37.md
│ │ ├── v0.38.md
│ │ ├── v0.39.md
│ │ ├── v0.4.md
│ │ ├── v0.40.md
│ │ ├── v0.41.md
│ │ ├── v0.42.md
│ │ ├── v0.5.md
│ │ ├── v0.6.md
│ │ ├── v0.7.md
│ │ ├── v0.8.md
│ │ └── v0.9.md
│ ├── command-completion.md
│ ├── config.md
│ ├── content-blocking.md
│ ├── customizing.md
│ ├── datastores.md
│ ├── debug-guide.md
│ ├── delegated-routing.md
│ ├── developer-certificate-of-origin
│ ├── developer-guide.md
│ ├── environment-variables.md
│ ├── examples/
│ │ └── kubo-as-a-library/
│ │ ├── README.md
│ │ ├── go.mod
│ │ ├── go.sum
│ │ ├── main.go
│ │ └── main_test.go
│ ├── experimental-features.md
│ ├── file-transfer.md
│ ├── fuse.md
│ ├── gateway.md
│ ├── http-rpc-clients.md
│ ├── implement-api-bindings.md
│ ├── libp2p-resource-management.md
│ ├── metrics.md
│ ├── p2p-tunnels.md
│ ├── plugins.md
│ ├── production/
│ │ └── reverse-proxy.md
│ ├── provide-stats.md
│ ├── releases.md
│ ├── releases_thunderdome.md
│ ├── specifications/
│ │ ├── keystore.md
│ │ ├── repository.md
│ │ └── repository_fs.md
│ ├── telemetry.md
│ ├── transports.md
│ └── windows.md
├── fuse/
│ ├── ipns/
│ │ ├── common.go
│ │ ├── ipns_test.go
│ │ ├── ipns_unix.go
│ │ ├── link_unix.go
│ │ └── mount_unix.go
│ ├── mfs/
│ │ ├── mfs_test.go
│ │ ├── mfs_unix.go
│ │ └── mount_unix.go
│ ├── mount/
│ │ ├── fuse.go
│ │ └── mount.go
│ ├── node/
│ │ ├── mount_darwin.go
│ │ ├── mount_nofuse.go
│ │ ├── mount_notsupp.go
│ │ ├── mount_test.go
│ │ ├── mount_unix.go
│ │ └── mount_windows.go
│ └── readonly/
│ ├── doc.go
│ ├── ipfs_test.go
│ ├── mount_unix.go
│ └── readonly_unix.go
├── gc/
│ ├── gc.go
│ └── gc_test.go
├── go.mod
├── go.sum
├── misc/
│ ├── README.md
│ ├── fsutil/
│ │ ├── fsutil.go
│ │ └── fsutil_test.go
│ ├── launchd/
│ │ ├── README.md
│ │ ├── install.sh
│ │ └── io.ipfs.ipfs-daemon.plist
│ └── systemd/
│ ├── ipfs-api.socket
│ ├── ipfs-gateway.socket
│ ├── ipfs-hardened.service
│ ├── ipfs-sysusers.conf
│ └── ipfs.service
├── mk/
│ ├── footer.mk
│ ├── git.mk
│ ├── golang.mk
│ ├── header.mk
│ ├── tarball.mk
│ └── util.mk
├── p2p/
│ ├── listener.go
│ ├── local.go
│ ├── p2p.go
│ ├── remote.go
│ └── stream.go
├── plugin/
│ ├── Rules.mk
│ ├── daemon.go
│ ├── daemoninternal.go
│ ├── datastore.go
│ ├── fx.go
│ ├── ipld.go
│ ├── loader/
│ │ ├── Rules.mk
│ │ ├── load_nocgo.go
│ │ ├── load_noplugin.go
│ │ ├── load_unix.go
│ │ ├── loader.go
│ │ ├── preload.go
│ │ ├── preload.sh
│ │ └── preload_list
│ ├── plugin.go
│ ├── plugins/
│ │ ├── .gitignore
│ │ ├── Rules.mk
│ │ ├── badgerds/
│ │ │ └── badgerds.go
│ │ ├── dagjose/
│ │ │ └── dagjose.go
│ │ ├── flatfs/
│ │ │ └── flatfs.go
│ │ ├── fxtest/
│ │ │ └── fxtest.go
│ │ ├── gen_main.sh
│ │ ├── git/
│ │ │ └── git.go
│ │ ├── levelds/
│ │ │ └── levelds.go
│ │ ├── nopfs/
│ │ │ └── nopfs.go
│ │ ├── pebbleds/
│ │ │ └── pebbleds.go
│ │ ├── peerlog/
│ │ │ ├── peerlog.go
│ │ │ └── peerlog_test.go
│ │ └── telemetry/
│ │ ├── telemetry.go
│ │ ├── telemetry_test.go
│ │ └── telemetry_uuid
│ └── tracer.go
├── profile/
│ ├── goroutines.go
│ ├── profile.go
│ └── profile_test.go
├── repo/
│ ├── common/
│ │ ├── common.go
│ │ └── common_test.go
│ ├── fsrepo/
│ │ ├── config_test.go
│ │ ├── datastores.go
│ │ ├── doc.go
│ │ ├── fsrepo.go
│ │ ├── fsrepo_test.go
│ │ ├── migrations/
│ │ │ ├── README.md
│ │ │ ├── atomicfile/
│ │ │ │ ├── atomicfile.go
│ │ │ │ └── atomicfile_test.go
│ │ │ ├── common/
│ │ │ │ ├── base.go
│ │ │ │ ├── config_helpers.go
│ │ │ │ ├── migration.go
│ │ │ │ ├── testing_helpers.go
│ │ │ │ └── utils.go
│ │ │ ├── embedded.go
│ │ │ ├── embedded_test.go
│ │ │ ├── fetch.go
│ │ │ ├── fetch_test.go
│ │ │ ├── fetcher.go
│ │ │ ├── fs-repo-16-to-17/
│ │ │ │ ├── main.go
│ │ │ │ └── migration/
│ │ │ │ ├── migration.go
│ │ │ │ └── migration_test.go
│ │ │ ├── fs-repo-17-to-18/
│ │ │ │ ├── main.go
│ │ │ │ └── migration/
│ │ │ │ ├── migration.go
│ │ │ │ └── migration_test.go
│ │ │ ├── httpfetcher.go
│ │ │ ├── ipfsdir.go
│ │ │ ├── ipfsdir_test.go
│ │ │ ├── ipfsfetcher/
│ │ │ │ ├── ipfsfetcher.go
│ │ │ │ └── ipfsfetcher_test.go
│ │ │ ├── migrations.go
│ │ │ ├── migrations_test.go
│ │ │ ├── retryfetcher.go
│ │ │ ├── setup_test.go
│ │ │ ├── unpack.go
│ │ │ ├── unpack_test.go
│ │ │ ├── versions.go
│ │ │ └── versions_test.go
│ │ └── misc.go
│ ├── mock.go
│ ├── onlyone.go
│ └── repo.go
├── routing/
│ ├── composer.go
│ ├── delegated.go
│ ├── delegated_test.go
│ ├── error.go
│ └── wrapper.go
├── test/
│ ├── .gitignore
│ ├── 3nodetest/
│ │ ├── GNUmakefile
│ │ ├── README.md
│ │ ├── bin/
│ │ │ ├── .gitignore
│ │ │ ├── clean.sh
│ │ │ ├── save_logs.sh
│ │ │ └── save_profiling_data.sh
│ │ ├── bootstrap/
│ │ │ ├── Dockerfile
│ │ │ ├── README.md
│ │ │ └── config
│ │ ├── build/
│ │ │ ├── .gitignore
│ │ │ └── .gitkeep
│ │ ├── client/
│ │ │ ├── Dockerfile
│ │ │ ├── config
│ │ │ └── run.sh
│ │ ├── data/
│ │ │ ├── .gitignore
│ │ │ └── Dockerfile
│ │ ├── fig.yml
│ │ ├── run-test-on-img.sh
│ │ └── server/
│ │ ├── Dockerfile
│ │ ├── README.md
│ │ ├── config
│ │ └── run.sh
│ ├── README.md
│ ├── Rules.mk
│ ├── api-startup/
│ │ └── main.go
│ ├── bench/
│ │ ├── bench_cli_ipfs_add/
│ │ │ └── main.go
│ │ └── offline_add/
│ │ └── main.go
│ ├── bin/
│ │ ├── .gitignore
│ │ ├── Rules.mk
│ │ ├── checkflags
│ │ └── continueyn
│ ├── cli/
│ │ ├── add_test.go
│ │ ├── agent_version_unicode_test.go
│ │ ├── api_file_test.go
│ │ ├── autoconf/
│ │ │ ├── autoconf_test.go
│ │ │ ├── dns_test.go
│ │ │ ├── expand_comprehensive_test.go
│ │ │ ├── expand_fallback_test.go
│ │ │ ├── expand_test.go
│ │ │ ├── extensibility_test.go
│ │ │ ├── fuzz_test.go
│ │ │ ├── ipns_test.go
│ │ │ ├── routing_test.go
│ │ │ ├── swarm_connect_test.go
│ │ │ ├── testdata/
│ │ │ │ ├── autoconf_amino_and_ipni.json
│ │ │ │ ├── autoconf_new_routing_system.json
│ │ │ │ ├── autoconf_new_routing_with_filtering.json
│ │ │ │ ├── autoconf_with_unsupported_paths.json
│ │ │ │ ├── updated_autoconf.json
│ │ │ │ └── valid_autoconf.json
│ │ │ └── validation_test.go
│ │ ├── backup_bootstrap_test.go
│ │ ├── basic_commands_test.go
│ │ ├── bitswap_config_test.go
│ │ ├── block_size_test.go
│ │ ├── bootstrap_auto_test.go
│ │ ├── cid_profiles_test.go
│ │ ├── cid_test.go
│ │ ├── cli_https_test.go
│ │ ├── commands_without_repo_test.go
│ │ ├── completion_test.go
│ │ ├── config_secrets_test.go
│ │ ├── content_blocking_test.go
│ │ ├── content_routing_http_test.go
│ │ ├── daemon_test.go
│ │ ├── dag_layout_test.go
│ │ ├── dag_test.go
│ │ ├── delegated_routing_v1_http_client_test.go
│ │ ├── delegated_routing_v1_http_proxy_test.go
│ │ ├── delegated_routing_v1_http_server_test.go
│ │ ├── dht_autoclient_test.go
│ │ ├── dht_opt_prov_test.go
│ │ ├── diag_datastore_test.go
│ │ ├── dns_resolvers_multiaddr_test.go
│ │ ├── files_test.go
│ │ ├── fixtures/
│ │ │ ├── README.md
│ │ │ ├── TestDagStat.car
│ │ │ ├── TestDagStatExpectedOutput.txt
│ │ │ ├── TestGatewayHAMTDirectory.car
│ │ │ ├── TestGatewayMultiRange.car
│ │ │ └── TestName.car
│ │ ├── fuse_test.go
│ │ ├── gateway_limits_test.go
│ │ ├── gateway_range_test.go
│ │ ├── gateway_test.go
│ │ ├── harness/
│ │ │ ├── buffer.go
│ │ │ ├── harness.go
│ │ │ ├── http_client.go
│ │ │ ├── ipfs.go
│ │ │ ├── log.go
│ │ │ ├── node.go
│ │ │ ├── nodes.go
│ │ │ ├── pbinspect.go
│ │ │ ├── peering.go
│ │ │ └── run.go
│ │ ├── http_gateway_over_libp2p_test.go
│ │ ├── http_retrieval_client_test.go
│ │ ├── identity_cid_test.go
│ │ ├── init_test.go
│ │ ├── ipfswatch_test.go
│ │ ├── log_level_test.go
│ │ ├── ls_test.go
│ │ ├── migrations/
│ │ │ ├── migration_16_to_latest_test.go
│ │ │ ├── migration_17_to_latest_test.go
│ │ │ ├── migration_concurrent_test.go
│ │ │ ├── migration_mixed_15_to_latest_test.go
│ │ │ └── testdata/
│ │ │ ├── v15-repo/
│ │ │ │ ├── blocks/
│ │ │ │ │ ├── SHARDING
│ │ │ │ │ ├── X3/
│ │ │ │ │ │ └── CIQFTFEEHEDF6KLBT32BFAGLXEZL4UWFNWM4LFTLMXQBCERZ6CMLX3Y.data
│ │ │ │ │ ├── _README
│ │ │ │ │ └── diskUsage.cache
│ │ │ │ ├── config
│ │ │ │ ├── datastore/
│ │ │ │ │ ├── 000001.log
│ │ │ │ │ ├── CURRENT
│ │ │ │ │ ├── LOCK
│ │ │ │ │ ├── LOG
│ │ │ │ │ └── MANIFEST-000000
│ │ │ │ ├── datastore_spec
│ │ │ │ └── version
│ │ │ └── v16-repo/
│ │ │ ├── blocks/
│ │ │ │ ├── SHARDING
│ │ │ │ ├── X3/
│ │ │ │ │ └── CIQFTFEEHEDF6KLBT32BFAGLXEZL4UWFNWM4LFTLMXQBCERZ6CMLX3Y.data
│ │ │ │ ├── _README
│ │ │ │ └── diskUsage.cache
│ │ │ ├── config
│ │ │ ├── datastore/
│ │ │ │ ├── 000001.log
│ │ │ │ ├── CURRENT
│ │ │ │ ├── LOCK
│ │ │ │ ├── LOG
│ │ │ │ └── MANIFEST-000000
│ │ │ ├── datastore_spec
│ │ │ └── version
│ │ ├── must.go
│ │ ├── name_test.go
│ │ ├── p2p_test.go
│ │ ├── peering_test.go
│ │ ├── pin_ls_names_test.go
│ │ ├── pin_name_validation_test.go
│ │ ├── ping_test.go
│ │ ├── pinning_remote_test.go
│ │ ├── pins_test.go
│ │ ├── provide_stats_test.go
│ │ ├── provider_test.go
│ │ ├── pubsub_test.go
│ │ ├── rcmgr_test.go
│ │ ├── repo_verify_test.go
│ │ ├── routing_dht_test.go
│ │ ├── rpc_auth_test.go
│ │ ├── rpc_content_type_test.go
│ │ ├── rpc_get_output_test.go
│ │ ├── rpc_unixsocket_test.go
│ │ ├── stats_test.go
│ │ ├── swarm_test.go
│ │ ├── telemetry_test.go
│ │ ├── testutils/
│ │ │ ├── asserts.go
│ │ │ ├── cids.go
│ │ │ ├── files.go
│ │ │ ├── floats.go
│ │ │ ├── httprouting/
│ │ │ │ └── mock_http_content_router.go
│ │ │ ├── json.go
│ │ │ ├── pinningservice/
│ │ │ │ └── pinning.go
│ │ │ ├── protobuf.go
│ │ │ ├── random_deterministic.go
│ │ │ ├── requires.go
│ │ │ └── strings.go
│ │ ├── tracing_test.go
│ │ ├── transports_test.go
│ │ └── webui_test.go
│ ├── dependencies/
│ │ ├── GNUmakefile
│ │ ├── dependencies.go
│ │ ├── go.mod
│ │ ├── go.sum
│ │ ├── iptb/
│ │ │ └── iptb.go
│ │ ├── ma-pipe-unidir/
│ │ │ ├── LICENSE
│ │ │ └── main.go
│ │ └── pollEndpoint/
│ │ └── main.go
│ ├── integration/
│ │ ├── GNUmakefile
│ │ ├── addcat_test.go
│ │ ├── bench_cat_test.go
│ │ ├── bench_test.go
│ │ ├── bitswap_wo_routing_test.go
│ │ ├── three_legged_cat_test.go
│ │ └── wan_lan_dht_test.go
│ ├── ipfs-test-lib.sh
│ ├── sharness/
│ │ ├── .gitignore
│ │ ├── GNUmakefile
│ │ ├── README.md
│ │ ├── Rules.mk
│ │ ├── lib/
│ │ │ ├── install-sharness.sh
│ │ │ ├── iptb-lib.sh
│ │ │ ├── test-aggregate-junit-reports.sh
│ │ │ ├── test-aggregate-results.sh
│ │ │ ├── test-lib-hashes.sh
│ │ │ └── test-lib.sh
│ │ ├── t0001-tests-work.sh
│ │ ├── t0002-docker-image.sh
│ │ ├── t0003-docker-migrate.sh
│ │ ├── t0012-completion-fish.sh
│ │ ├── t0015-basic-sh-functions.sh
│ │ ├── t0018-indent.sh
│ │ ├── t0021-config.sh
│ │ ├── t0022-init-default.sh
│ │ ├── t0023-shutdown.sh
│ │ ├── t0024-datastore-config.sh
│ │ ├── t0024-files/
│ │ │ ├── spec-newshardfun
│ │ │ └── spec-nosync
│ │ ├── t0025-datastores.sh
│ │ ├── t0026-id.sh
│ │ ├── t0027-rotate.sh
│ │ ├── t0030-mount.sh
│ │ ├── t0031-mount-publish.sh
│ │ ├── t0032-mount-sharded.sh
│ │ ├── t0040-add-and-cat.sh
│ │ ├── t0042-add-skip.sh
│ │ ├── t0043-add-w.sh
│ │ ├── t0044-add-symlink.sh
│ │ ├── t0045-ls.sh
│ │ ├── t0046-id-hash.sh
│ │ ├── t0047-add-mode-mtime.sh
│ │ ├── t0050-block-data/
│ │ │ └── testPut.pb
│ │ ├── t0050-block.sh
│ │ ├── t0051-object.sh
│ │ ├── t0052-object-diff.sh
│ │ ├── t0053-dag-data/
│ │ │ └── non-canon.cbor
│ │ ├── t0053-dag.sh
│ │ ├── t0054-dag-car-import-export-data/
│ │ │ ├── README.md
│ │ │ └── test_dataset_car.tar.xz
│ │ ├── t0054-dag-car-import-export.sh
│ │ ├── t0055-dag-put-json-new-line.sh
│ │ ├── t0060-daemon.sh
│ │ ├── t0060-data/
│ │ │ ├── mss-noise
│ │ │ ├── mss-plaintext
│ │ │ └── mss-tls
│ │ ├── t0061-daemon-opts.sh
│ │ ├── t0062-daemon-api.sh
│ │ ├── t0063-daemon-init.sh
│ │ ├── t0063-external.sh
│ │ ├── t0064-api-file.sh
│ │ ├── t0065-active-requests.sh
│ │ ├── t0066-migration.sh
│ │ ├── t0067-unix-api.sh
│ │ ├── t0070-user-config.sh
│ │ ├── t0080-repo.sh
│ │ ├── t0081-repo-pinning.sh
│ │ ├── t0082-repo-gc-auto.sh
│ │ ├── t0084-repo-read-rehash.sh
│ │ ├── t0086-repo-verify.sh
│ │ ├── t0087-repo-robust-gc.sh
│ │ ├── t0088-repo-stat-symlink.sh
│ │ ├── t0090-get.sh
│ │ ├── t0095-refs.sh
│ │ ├── t0101-iptb-name.sh
│ │ ├── t0109-gateway-web-_redirects-data/
│ │ │ └── redirects.car
│ │ ├── t0109-gateway-web-_redirects.sh
│ │ ├── t0112-gateway-cors.sh
│ │ ├── t0114-gateway-subdomains/
│ │ │ ├── 12D3KooWLQzUv2FHWGVPXTXSZpdHs7oHbXub2G5WC8Tx4NQhyd2d.ipns-record
│ │ │ ├── QmVujd5Vb7moysJj8itnGufN7MEtPRCNHkKpNuA4onsRa3.ipns-record
│ │ │ ├── README.md
│ │ │ └── fixtures.car
│ │ ├── t0114-gateway-subdomains.sh
│ │ ├── t0115-gateway-dir-listing/
│ │ │ ├── README.md
│ │ │ └── fixtures.car
│ │ ├── t0115-gateway-dir-listing.sh
│ │ ├── t0116-gateway-cache/
│ │ │ ├── README.md
│ │ │ ├── fixtures.car
│ │ │ └── k51qzi5uqu5dlxdsdu5fpuu7h69wu4ohp32iwm9pdt9nq3y5rpn3ln9j12zfhe.ipns-record
│ │ ├── t0116-gateway-cache.sh
│ │ ├── t0119-prometheus-data/
│ │ │ ├── prometheus_metrics
│ │ │ ├── prometheus_metrics_added_by_enabling_rcmgr
│ │ │ └── prometheus_metrics_added_by_measure_profile
│ │ ├── t0119-prometheus.sh
│ │ ├── t0120-bootstrap.sh
│ │ ├── t0121-bootstrap-iptb.sh
│ │ ├── t0131-multinode-client-routing.sh
│ │ ├── t0140-swarm.sh
│ │ ├── t0141-addfilter.sh
│ │ ├── t0142-testfilter.sh
│ │ ├── t0150-clisuggest.sh
│ │ ├── t0151-sysdiag.sh
│ │ ├── t0152-profile.sh
│ │ ├── t0160-resolve.sh
│ │ ├── t0165-keystore-data/
│ │ │ ├── README.md
│ │ │ ├── openssl_ed25519.pem
│ │ │ ├── openssl_rsa.pem
│ │ │ └── openssl_secp384r1.pem
│ │ ├── t0165-keystore.sh
│ │ ├── t0180-p2p.sh
│ │ ├── t0181-private-network.sh
│ │ ├── t0182-circuit-relay.sh
│ │ ├── t0183-namesys-pubsub.sh
│ │ ├── t0184-http-proxy-over-p2p.sh
│ │ ├── t0185-autonat.sh
│ │ ├── t0190-quic-ping.sh
│ │ ├── t0191-webtransport-ping.sh
│ │ ├── t0195-noise.sh
│ │ ├── t0220-bitswap.sh
│ │ ├── t0230-channel-streaming-http-content-type.sh
│ │ ├── t0231-channel-streaming.sh
│ │ ├── t0235-cli-request.sh
│ │ ├── t0236-cli-api-dns-resolve.sh
│ │ ├── t0240-republisher.sh
│ │ ├── t0250-files-api.sh
│ │ ├── t0251-files-flushing.sh
│ │ ├── t0252-files-gc.sh
│ │ ├── t0260-sharding.sh
│ │ ├── t0270-filestore.sh
│ │ ├── t0271-filestore-utils.sh
│ │ ├── t0272-urlstore.sh
│ │ ├── t0275-cid-security-data/
│ │ │ ├── CIQG6PGTD2VV34S33BE4MNCQITBRFYUPYQLDXYARR3DQW37MOT7K5XI.data
│ │ │ └── EICEM7ITSI.data
│ │ ├── t0275-cid-security.sh
│ │ ├── t0276-cidv0v1.sh
│ │ ├── t0280-plugin-dag-jose-data/
│ │ │ ├── dag-cbor/
│ │ │ │ ├── bafyreicxyzuqbx5yb7ytkgkuofwksbal3ygtswxuri25crxdxms55m5fki
│ │ │ │ ├── bafyreihdfxoshbhowufyvjk7kq46dt6h7u6byejmlnifz34z7ocoq7ugk4
│ │ │ │ └── bafyreihkt4u6euddfhofkutfzxwet7w7zm5qrjpop655yhnb5dnzqw26lm
│ │ │ ├── dag-jose/
│ │ │ │ ├── bagcqcera542h3xc57nudkgjcceexyzyxrkwi4ikbn773ag6dqdcyjt6z6rga
│ │ │ │ ├── bagcqcera5uvz2qai6l4vmqjigwpowluilxngz3dyjnva2s3uwbfb5u4ao4fa
│ │ │ │ ├── bagcqcera7azagcqlpu4ivvh4xp4iv6psmb5d7eki6ln3fnfnsnbb2hzv4nxq
│ │ │ │ ├── bagcqcerakjv2mmdlbai3urym22bw5kaw7nqov73yaxf6xjnp7e56sclsrooa
│ │ │ │ ├── bagcqceraqfknq7xaemcihmq2albau32ttrutxnco7xeoik6mlejismmvw5zq
│ │ │ │ ├── bagcqcerauben4l6ee2wjf2fnkj7vaels4p7lnytenk35j3gl2lzcbtbgyoea
│ │ │ │ ├── bagcqceravvw4bx7jgkxxjwfuqo2yoja6w4cmvmu3gkew3s7yu3vt2ce7riwa
│ │ │ │ ├── bagcqceraxazmu67crshzqdeg3kwnfschs25epy5sbtqtjre2qw3d62kzplva
│ │ │ │ └── bagcqceraxvt5izt4sz7kjfrm42dxrutp6ijywgsacllkznzekmfojypkvfea
│ │ │ └── dag-json/
│ │ │ ├── baguqeeraloya3qpa25kl5l4y3bzgl7rhyta2p7lwaocyxx4vpvdligb7mt2q
│ │ │ ├── baguqeeraovfm3rr3pvmxm27zgvxp5wycbfih35xih2uznminpnds5esm4jlq
│ │ │ └── baguqeeravexfd6qijjtnzxfqq6kgknnkncztgmvhjhxm6ih352qskolt2gxa
│ │ ├── t0280-plugin-dag-jose.sh
│ │ ├── t0280-plugin-data/
│ │ │ └── example.go
│ │ ├── t0280-plugin-fx.sh
│ │ ├── t0280-plugin-git.sh
│ │ ├── t0280-plugin-peerlog.sh
│ │ ├── t0280-plugin.sh
│ │ ├── t0290-cid.sh
│ │ ├── t0295-multibase.sh
│ │ ├── t0320-pubsub.sh
│ │ ├── t0321-pubsub-gossipsub.sh
│ │ ├── t0322-pubsub-http-rpc.sh
│ │ ├── t0400-api-no-gateway/
│ │ │ ├── README.md
│ │ │ └── fixtures.car
│ │ ├── t0400-api-no-gateway.sh
│ │ ├── t0401-api-browser-security.sh
│ │ ├── t0410-api-add.sh
│ │ ├── t0500-issues-and-regressions-offline.sh
│ │ ├── t0600-issues-and-regressions-online.sh
│ │ ├── t0701-delegated-routing-reframe/
│ │ │ ├── FindProvidersRequest
│ │ │ └── FindProvidersResponse
│ │ ├── t0702-delegated-routing-http/
│ │ │ └── FindProvidersResponse
│ │ ├── t0800-blake3.sh
│ │ └── x0601-pin-fail-test.sh
│ ├── sharness_test_coverage_helper.sh
│ └── unit/
│ ├── .gitignore
│ └── Rules.mk
├── thirdparty/
│ ├── README.md
│ ├── unit/
│ │ ├── unit.go
│ │ └── unit_test.go
│ └── verifbs/
│ └── verifbs.go
├── tracing/
│ ├── doc.go
│ └── tracing.go
├── version.go
└── version_test.go
================================================
FILE CONTENTS
================================================
================================================
FILE: .codeclimate.yml
================================================
ratings:
paths:
- "**/*.go"
exclude_paths:
- test/
- Godeps/
- thirdparty/
- "**/*.pb.go"
engines:
fixme:
enabled: true
config:
strings:
- FIXME
- HACK
- XXX
- BUG
golint:
enabled: true
govet:
enabled: true
gofmt:
enabled: true
version: "2"
checks:
argument-count:
enabled: false
complex-logic:
enabled: false
file-lines:
enabled: false
method-complexity:
enabled: false
method-count:
enabled: false
method-lines:
enabled: false
nested-control-flow:
enabled: false
return-statements:
enabled: false
similar-code:
enabled: false
================================================
FILE: .cspell.yml
================================================
ignoreWords:
- childs # This spelling is used in the files command
- NodeCreater # This spelling is used in the fuse dependency
- Boddy # One of the contributors to the project - Chris Boddy
- Botto # One of the contributors to the project - Santiago Botto
- cose # dag-cose
================================================
FILE: .dockerignore
================================================
Dockerfile
Dockerfile.fast
.git/
!.git/HEAD
!.git/refs/
!.git/packed-refs
test/sharness/lib/sharness/
test/sharness/trash*
rb-pinning-service-api/
# The Docker client might not be running on Linux
# so delete any compiled binaries
bin/gx
bin/gx*
bin/tmp
================================================
FILE: .gitattributes
================================================
# Default to text
* text eol=lf
# True text
*.md text eol=auto
LICENSE text eol=auto
# Known binary types
*.png binary
*.tar binary
*.gz binary
*.xz binary
*.car binary
# Binary assets
assets/init-doc/* binary
core/coreunix/test_data/** binary
test/cli/migrations/testdata/** binary
# Generated test data
test/cli/migrations/testdata/** linguist-generated=true
test/cli/autoconf/testdata/** linguist-generated=true
test/cli/fixtures/** linguist-generated=true
test/sharness/t0054-dag-car-import-export-data/** linguist-generated=true
test/sharness/t0109-gateway-web-_redirects-data/** linguist-generated=true
test/sharness/t0114-gateway-subdomains/** linguist-generated=true
test/sharness/t0115-gateway-dir-listing/** linguist-generated=true
test/sharness/t0116-gateway-cache/** linguist-generated=true
test/sharness/t0119-prometheus-data/** linguist-generated=true
test/sharness/t0165-keystore-data/** linguist-generated=true
test/sharness/t0275-cid-security-data/** linguist-generated=true
test/sharness/t0280-plugin-dag-jose-data/** linguist-generated=true
test/sharness/t0280-plugin-data/** linguist-generated=true
test/sharness/t0280-plugin-git-data/** linguist-generated=true
test/sharness/t0400-api-no-gateway/** linguist-generated=true
test/sharness/t0701-delegated-routing-reframe/** linguist-generated=true
test/sharness/t0702-delegated-routing-http/** linguist-generated=true
================================================
FILE: .github/CODEOWNERS
================================================
# Code owners are automatically requested for review when someone opens a pull
# request that modifies code that they own. Code owners are not automatically
# requested to review draft pull requests.
# Default
* @ipfs/kubo-maintainers
# HTTP Gateway
core/corehttp/ @lidel
test/sharness/*gateway*.sh @lidel
================================================
FILE: .github/FUNDING.yml
================================================
custom: [ipshipyard.gitwallet.co]
================================================
FILE: .github/ISSUE_TEMPLATE/bug-report.yml
================================================
name: Bug Report
description: Report a bug in Kubo.
labels:
- kind/bug
- need/triage
body:
- type: markdown
attributes:
value: |
- Make sure you are running the [latest version of Kubo][releases] before reporting an issue.
- If you have an enhancement or feature request for Kubo, please select [a different option][issues].
- Please report possible security issues by email to security@ipfs.io
[issues]: https://github.com/ipfs/kubo/issues/new/choose
[releases]: https://github.com/ipfs/kubo/releases
- type: checkboxes
attributes:
label: Checklist
description: Please verify that you've followed these steps
options:
- label: This is a bug report, not a question. Ask questions on [discuss.ipfs.tech](https://discuss.ipfs.tech/c/help/13).
required: true
- label: I have searched on the [issue tracker](https://github.com/ipfs/kubo/issues?q=is%3Aissue) for my bug.
required: true
- label: I am running the latest [kubo version](https://dist.ipfs.tech/#kubo) or have an issue updating.
required: true
- type: dropdown
id: install
validations:
required: true
attributes:
label: Installation method
description: Please select your installation method
options:
- dist.ipfs.tech or ipfs-update
- docker image
- ipfs-desktop
- third-party binary
- built from source
- type: textarea
id: version
attributes:
label: Version
render: Text
description: |
Enter the output of `ipfs version --all`. If you can't run that command, please include a copy of your [gateway's version page](http://localhost:8080/api/v0/version?enc=text&all=true).
- type: textarea
id: config
attributes:
label: Config
render: json
description: |
Enter the output of `ipfs config show`.
- type: textarea
attributes:
label: Description
description: |
This is where you get to tell us what went wrong. When doing so, please make sure to include *all* relevant information.
Please try to include:
* What you were doing when you experienced the bug.
* Any error messages you saw, *where* you saw them, and what you believe may have caused them (if you have any ideas).
* When possible, steps to reliably produce the bug.
================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
- name: Getting Help on IPFS
url: https://ipfs.tech/help
about: All information about how and where to get help on IPFS.
- name: Kubo configuration reference
url: https://github.com/ipfs/kubo/blob/master/docs/config.md#readme
about: Documentation on the different configuration settings
- name: Kubo experimental features docs
url: https://github.com/ipfs/kubo/blob/master/docs/experimental-features.md#readme
about: Documentation on Private Networks, Filestore and other experimental features.
- name: Kubo RPC API Reference
url: https://docs.ipfs.tech/reference/kubo/rpc/
about: Documentation of all Kubo RPC API endpoints.
- name: IPFS Official Discussion Forum
url: https://discuss.ipfs.tech
about: Please post general questions, support requests, and discussions here.
================================================
FILE: .github/ISSUE_TEMPLATE/doc.yml
================================================
name: Documentation Issue
description: Report missing, erroneous docs, broken links or propose new Kubo docs.
labels:
- topic/docs-ipfs
- need/triage
body:
- type: markdown
attributes:
value: |
Problems with documentation on https://docs.ipfs.tech should be reported to https://github.com/ipfs/ipfs-docs
- type: checkboxes
attributes:
label: Checklist
description: Please verify the following.
options:
- label: I am reporting a documentation issue in this repo, not https://docs.ipfs.tech.
required: true
- label: I have searched on the [issue tracker](https://github.com/ipfs/kubo/issues?q=is%3Aissue) for my issue.
required: true
- type: input
attributes:
label: Location
description: |
If possible, please provide a link to the documentation issue.
- type: textarea
attributes:
label: Description
description: |
Please describe your issue.
================================================
FILE: .github/ISSUE_TEMPLATE/enhancement.yml
================================================
name: Enhancement
description: Suggest an improvement to an existing kubo feature.
labels:
- kind/enhancement
- need/triage
body:
- type: markdown
attributes:
value: |
Suggest an enhancement to Kubo (the program). If you'd like to suggest an improvement to the IPFS protocol, please discuss it on [the forum](https://discuss.ipfs.tech).
Issues in this repo must be specific, actionable, and well motivated. They should be starting points for _building_ new features, not brainstorming ideas.
If you have an idea you'd like to discuss, please open a new thread on [the forum](https://discuss.ipfs.tech).
**Example:**
> Reduce memory usage of `ipfs cat` (specific) by buffering less in ... (actionable). This would let me run Kubo on my Raspberry Pi (motivated).
- type: checkboxes
attributes:
label: Checklist
description: Please verify the following.
options:
- label: My issue is specific & actionable.
required: true
- label: I am not suggesting a protocol enhancement.
required: true
- label: I have searched on the [issue tracker](https://github.com/ipfs/kubo/issues?q=is%3Aissue) for my issue.
required: true
- type: textarea
attributes:
label: Description
description: |
Please describe your idea. When requesting an enhancement, please be sure to include your motivation and try to be as specific as possible.
================================================
FILE: .github/ISSUE_TEMPLATE/feature.yml
================================================
name: Feature
description: Suggest a new feature in Kubo.
labels:
- kind/feature
- need/triage
body:
- type: markdown
attributes:
value: |
Suggest a new feature in Kubo (the program). If you'd like to suggest an improvement to the IPFS protocol, please discuss it on [the forum](https://discuss.ipfs.tech).
Issues in this repo must be specific, actionable, and well motivated. They should be starting points for _building_ new features, not brainstorming ideas.
If you have an idea you'd like to discuss, please open a new thread on [the forum](https://discuss.ipfs.tech).
**Example:**
> Add deduplication-optimized chunking of tar files in `ipfs add` (specific) by examining tar headers ... (actionable). This would let me efficiently store and update many versions of code archives (motivated).
- type: checkboxes
attributes:
label: Checklist
description: Please verify the following.
options:
- label: My issue is specific & actionable.
required: true
- label: I am not suggesting a protocol enhancement.
required: true
- label: I have searched on the [issue tracker](https://github.com/ipfs/kubo/issues?q=is%3Aissue) for my issue.
required: true
- type: textarea
attributes:
label: Description
description: |
Please describe your idea. When requesting a feature, please be sure to include your motivation and and a concrete description of how the feature should work.
================================================
FILE: .github/auto-comment.yml
================================================
# Comment to a new issue.
# Disabled
# issueOpened: ""
# Disabled
# pullRequestOpened: ""
================================================
FILE: .github/build-platforms.yml
================================================
# Build platforms configuration for Kubo
# Matches https://github.com/ipfs/distributions/blob/master/dists/kubo/build_matrix
# plus linux-riscv64 for emerging architecture support
#
# The Go compiler handles FUSE support automatically via build tags.
# Platforms are simply listed - no need to specify FUSE capability.
platforms:
- darwin-amd64
- darwin-arm64
- freebsd-amd64
- linux-amd64
- linux-arm64
- linux-riscv64
- openbsd-amd64
- windows-amd64
- windows-arm64
================================================
FILE: .github/dependabot.yml
================================================
# Dependabot PRs are auto-tidied by .github/workflows/dependabot-tidy.yml
version: 2
updates:
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
- package-ecosystem: "gomod"
directory: "/"
schedule:
interval: "monthly"
open-pull-requests-limit: 10
labels:
- "dependencies"
ignore:
# Updated via go-ds-* wrappers in ipfs-ecosystem group
- dependency-name: "github.com/cockroachdb/pebble*"
- dependency-name: "github.com/syndtr/goleveldb"
- dependency-name: "github.com/dgraph-io/badger*"
groups:
ipfs-ecosystem:
patterns:
- "github.com/ipfs/*"
- "github.com/ipfs-shipyard/*"
- "github.com/ipshipyard/*"
- "github.com/multiformats/*"
- "github.com/ipld/*"
libp2p-ecosystem:
patterns:
- "github.com/libp2p/*"
golang-x:
patterns:
- "golang.org/x/*"
opentelemetry:
patterns:
- "go.opentelemetry.io/*"
prometheus:
patterns:
- "github.com/prometheus/*"
- "contrib.go.opencensus.io/*"
- "go.opencensus.io"
uber:
patterns:
- "go.uber.org/*"
================================================
FILE: .github/pull_request_template.md
================================================
<!--
Please update docs/changelogs/ if you're modifying Go files. If your change does not require a changelog entry, please do one of the following:
- add `[skip changelog]` to the PR title
- label the PR with `skip/changelog`
-->
================================================
FILE: .github/workflows/changelog.yml
================================================
name: Changelog
on:
pull_request:
types:
- opened
- edited
- synchronize
- reopened
- labeled
- unlabeled
paths:
- '**.go'
- '**/go.mod'
- '**/go.sum'
jobs:
changelog:
if: contains(github.event.pull_request.title, '[skip changelog]') == false &&
contains(github.event.pull_request.labels.*.name, 'skip/changelog') == false
runs-on: ubuntu-latest
name: Changelog
steps:
- id: changelog
env:
GITHUB_TOKEN: ${{ github.token }}
ENDPOINT: repos/${{ github.repository }}/pulls/${{ github.event.pull_request.number }}/files
SELECTOR: 'map(select(.filename | startswith("docs/changelogs/"))) | length'
run: gh api "$ENDPOINT" --jq "$SELECTOR" | xargs -I{} echo "modified={}" | tee -a $GITHUB_OUTPUT
- if: steps.changelog.outputs.modified == '0'
env:
MESSAGE: |
docs/changelogs/ was not modified in this PR. Please do one of the following:
- add a changelog entry
- add `[skip changelog]` to the PR title
- label the PR with `skip/changelog`
run: |
echo "::error::${MESSAGE//$'\n'/%0A}"
exit 1
================================================
FILE: .github/workflows/codeql-analysis.yml
================================================
# https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed
name: CodeQL
on:
workflow_dispatch:
push:
branches: [ master ]
pull_request:
# The branches below must be a subset of the branches above
branches: [ master ]
paths-ignore:
- '**/*.md'
schedule:
- cron: '30 12 * * 2'
permissions:
contents: read # to fetch code (actions/checkout)
security-events: write # (github/codeql-action/autobuild)
concurrency:
group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.event_name == 'push' && github.sha || github.ref }}
cancel-in-progress: true
jobs:
codeql:
if: github.repository == 'ipfs/kubo' || github.event_name == 'workflow_dispatch'
runs-on: ubuntu-latest
timeout-minutes: 20
steps:
- name: Checkout repository
uses: actions/checkout@v6
- name: Setup Go
uses: actions/setup-go@v6
with:
go-version-file: 'go.mod'
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v4
with:
languages: go
- name: Autobuild
uses: github/codeql-action/autobuild@v4
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v4
================================================
FILE: .github/workflows/dependabot-tidy.yml
================================================
# Dependabot only updates go.mod/go.sum in the root module, but this repo has
# multiple Go modules (see docs/examples/). This workflow runs `make mod_tidy`
# on Dependabot PRs to keep all go.sum files in sync, preventing go-check CI
# failures.
name: Dependabot Tidy
on:
pull_request_target:
types: [opened, synchronize]
workflow_dispatch:
inputs:
pr_number:
description: 'PR number to run mod_tidy on'
required: true
type: number
permissions:
contents: write
pull-requests: write
jobs:
tidy:
if: github.actor == 'dependabot[bot]' || github.event_name == 'workflow_dispatch'
runs-on: ubuntu-latest
steps:
- name: Get PR info
id: pr
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
pr_number="${{ inputs.pr_number }}"
else
pr_number="${{ github.event.pull_request.number }}"
fi
echo "number=$pr_number" >> $GITHUB_OUTPUT
branch=$(gh pr view "$pr_number" --repo "${{ github.repository }}" --json headRefName -q '.headRefName')
echo "branch=$branch" >> $GITHUB_OUTPUT
- uses: actions/checkout@v6
with:
ref: ${{ steps.pr.outputs.branch }}
token: ${{ secrets.GITHUB_TOKEN }}
- uses: actions/setup-go@v6
with:
go-version-file: go.mod
- name: Run make mod_tidy
run: make mod_tidy
- name: Check for changes
id: git-check
run: |
if [[ -n $(git status --porcelain) ]]; then
echo "modified=true" >> $GITHUB_OUTPUT
fi
- name: Commit changes
if: steps.git-check.outputs.modified == 'true'
run: |
git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
git add -A
git commit -m "chore: run make mod_tidy"
git push
================================================
FILE: .github/workflows/docker-check.yml
================================================
# This workflow performs a quick Docker build check on PRs and pushes to master.
# It builds the Docker image and runs a basic smoke test to ensure the image works.
# This is a lightweight check - for full multi-platform builds and publishing, see docker-image.yml
name: Docker Check
on:
workflow_dispatch:
pull_request:
paths-ignore:
- '**/*.md'
push:
branches:
- 'master'
concurrency:
group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.event_name == 'push' && github.sha || github.ref }}
cancel-in-progress: true
jobs:
lint:
if: github.repository == 'ipfs/kubo' || github.event_name == 'workflow_dispatch'
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- uses: actions/checkout@v6
- uses: hadolint/hadolint-action@v3.3.0
with:
dockerfile: Dockerfile
failure-threshold: warning
verbose: true
format: tty
build:
if: github.repository == 'ipfs/kubo' || github.event_name == 'workflow_dispatch'
runs-on: ubuntu-latest
timeout-minutes: 10
env:
IMAGE_NAME: ipfs/kubo
WIP_IMAGE_TAG: wip
defaults:
run:
shell: bash
steps:
- uses: actions/checkout@v6
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v4
- name: Build Docker image with BuildKit
uses: docker/build-push-action@v7
with:
context: .
push: false
load: true
tags: ${{ env.IMAGE_NAME }}:${{ env.WIP_IMAGE_TAG }}
cache-from: |
type=gha
type=registry,ref=${{ env.IMAGE_NAME }}:buildcache
cache-to: type=gha,mode=max
- name: Test Docker image
run: docker run --rm $IMAGE_NAME:$WIP_IMAGE_TAG --version
================================================
FILE: .github/workflows/docker-image.yml
================================================
# This workflow builds and publishes official Docker images to Docker Hub.
# It handles multi-platform builds (amd64, arm/v7, arm64/v8) and pushes tagged releases.
# This workflow is triggered on tags, specific branches, and can be manually dispatched.
# For quick build checks during development, see docker-check.yml
name: Docker Push
on:
workflow_dispatch:
inputs:
push:
description: 'Push to Docker Hub'
required: true
default: 'false'
tags:
description: 'Custom tags to use for the push'
required: false
default: ''
# # If we decide to build all images on every PR, we should make sure that
# # they are NOT pushed to Docker Hub.
# pull_request:
# paths-ignore:
# - '**/*.md'
push:
branches:
- 'master'
- 'staging'
- 'bifrost-*'
tags:
- 'v*'
permissions:
contents: read # to fetch code (actions/checkout)
jobs:
docker-hub:
if: github.repository == 'ipfs/kubo' || github.event_name == 'workflow_dispatch'
name: Push Docker image to Docker Hub
runs-on: ubuntu-latest
timeout-minutes: 15
env:
IMAGE_NAME: ipfs/kubo
outputs:
tags: ${{ steps.tags.outputs.value }}
steps:
- name: Check out the repo
uses: actions/checkout@v6
- name: Set up QEMU
uses: docker/setup-qemu-action@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v4
- name: Log in to Docker Hub
uses: docker/login-action@v4
with:
username: ${{ vars.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Get tags
id: tags
if: github.event.inputs.tags == ''
run: |
echo "value<<EOF" >> $GITHUB_OUTPUT
./bin/get-docker-tags.sh "$(date -u +%F)" >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT
shell: bash
# 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@v7
with:
platforms: linux/amd64
context: .
push: false
load: true
file: ./Dockerfile
tags: ${{ env.IMAGE_NAME }}:linux-amd64
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@v7
with:
platforms: linux/arm/v7
context: .
push: false
load: true
file: ./Dockerfile
tags: ${{ env.IMAGE_NAME }}:linux-arm-v7
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@v7
with:
platforms: linux/arm64/v8
context: .
push: false
load: true
file: ./Dockerfile
tags: ${{ env.IMAGE_NAME }}:linux-arm64-v8
cache-from: |
type=gha
type=registry,ref=${{ env.IMAGE_NAME }}:buildcache
cache-to: type=gha,mode=max
# We test all the images on amd64 host here. This uses QEMU to emulate
# the other platforms.
# NOTE: --version should finish instantly, but sometimes
# it hangs on github CI (could be qemu issue), so we retry to remove false negatives
- name: Smoke-test linux-amd64
run: for i in {1..3}; do timeout 15s docker run --rm $IMAGE_NAME:linux-amd64 version --all && break || [ $i = 3 ] && exit 1; done
timeout-minutes: 1
- name: Smoke-test linux-arm-v7
run: for i in {1..3}; do timeout 15s docker run --rm $IMAGE_NAME:linux-arm-v7 version --all && break || [ $i = 3 ] && exit 1; done
timeout-minutes: 1
- name: Smoke-test linux-arm64-v8
run: for i in {1..3}; do timeout 15s docker run --rm $IMAGE_NAME:linux-arm64-v8 version --all && break || [ $i = 3 ] && exit 1; done
timeout-minutes: 1
# 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@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 }}"
cache-from: |
type=gha
type=registry,ref=${{ env.IMAGE_NAME }}:buildcache
cache-to: |
type=gha,mode=max
type=registry,ref=${{ env.IMAGE_NAME }}:buildcache,mode=max
================================================
FILE: .github/workflows/gateway-conformance.yml
================================================
name: Gateway Conformance
on:
workflow_dispatch:
push:
branches:
- master
pull_request:
paths-ignore:
- '**/*.md'
concurrency:
group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.event_name == 'push' && github.sha || github.ref }}
cancel-in-progress: true
defaults:
run:
shell: bash
env:
# hostnames expected by https://github.com/ipfs/gateway-conformance
GATEWAY_PUBLIC_GATEWAYS: |
{
"example.com": {
"UseSubdomains": true,
"InlineDNSLink": true,
"Paths": ["/ipfs", "/ipns"]
},
"localhost": {
"UseSubdomains": true,
"InlineDNSLink": true,
"Paths": ["/ipfs", "/ipns"]
}
}
jobs:
# Testing all gateway features via TCP port specified in Addresses.Gateway
gateway-conformance:
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
# 1. Download the gateway-conformance fixtures
- name: Download gateway-conformance fixtures
uses: ipfs/gateway-conformance/.github/actions/extract-fixtures@v0.12
with:
output: fixtures
# 2. Build the kubo-gateway
- name: Checkout kubo-gateway
uses: actions/checkout@v6
with:
path: kubo-gateway
- name: Setup Go
uses: actions/setup-go@v6
with:
go-version-file: 'kubo-gateway/go.mod'
cache: true
cache-dependency-path: kubo-gateway/go.sum
- name: Build kubo-gateway
run: make build
working-directory: kubo-gateway
# 3. Init the kubo-gateway
- name: Init kubo-gateway
run: |
./ipfs init -e
./ipfs config --json Gateway.PublicGateways "$GATEWAY_PUBLIC_GATEWAYS"
working-directory: kubo-gateway/cmd/ipfs
# 4. Populate the Kubo gateway with the gateway-conformance fixtures
- name: Import fixtures
run: |
# Import car files
find ./fixtures -name '*.car' -exec kubo-gateway/cmd/ipfs/ipfs dag import --pin-roots=false {} \;
# Import ipns records
records=$(find ./fixtures -name '*.ipns-record')
for record in $records
do
key=$(basename -s .ipns-record "$record" | cut -d'_' -f1)
kubo-gateway/cmd/ipfs/ipfs routing put --allow-offline "/ipns/$key" "$record"
done
# Import dnslink records
# the IPFS_NS_MAP env will be used by the daemon
echo "IPFS_NS_MAP=$(cat ./fixtures/dnslinks.IPFS_NS_MAP)" >> $GITHUB_ENV
# 5. Start the kubo-gateway
- name: Start kubo-gateway
run: |
./ipfs daemon --offline &
working-directory: kubo-gateway/cmd/ipfs
# 6. Run the gateway-conformance tests
- name: Run gateway-conformance tests
uses: ipfs/gateway-conformance/.github/actions/test@v0.12
with:
gateway-url: http://127.0.0.1:8080
subdomain-url: http://localhost:8080
args: -skip 'TestGatewayCar/GET_response_for_application/vnd.ipld.car/Header_Content-Length'
json: output.json
xml: output.xml
html: output.html
markdown: output.md
# 7. Upload the results
- name: Upload MD summary
if: failure() || success()
run: cat output.md >> $GITHUB_STEP_SUMMARY
- name: Upload HTML report
if: failure() || success()
uses: actions/upload-artifact@v7
with:
name: gateway-conformance.html
path: output.html
- name: Upload JSON report
if: failure() || success()
uses: actions/upload-artifact@v7
with:
name: gateway-conformance.json
path: output.json
# Testing trustless gateway feature subset exposed as libp2p protocol
gateway-conformance-libp2p-experiment:
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
# 1. Download the gateway-conformance fixtures
- name: Download gateway-conformance fixtures
uses: ipfs/gateway-conformance/.github/actions/extract-fixtures@v0.12
with:
output: fixtures
# 2. Build the kubo-gateway
- name: Checkout kubo-gateway
uses: actions/checkout@v6
with:
path: kubo-gateway
- name: Setup Go
uses: actions/setup-go@v6
with:
go-version-file: 'kubo-gateway/go.mod'
cache: true
cache-dependency-path: kubo-gateway/go.sum
- name: Build kubo-gateway
run: make build
working-directory: kubo-gateway
# 3. Init the kubo-gateway
- name: Init kubo-gateway
run: |
./ipfs init --profile=test
./ipfs config --json Gateway.PublicGateways "$GATEWAY_PUBLIC_GATEWAYS"
./ipfs config --json Experimental.GatewayOverLibp2p true
./ipfs config Addresses.Gateway "/ip4/127.0.0.1/tcp/8080"
./ipfs config Addresses.API "/ip4/127.0.0.1/tcp/5001"
working-directory: kubo-gateway/cmd/ipfs
# 4. Populate the Kubo gateway with the gateway-conformance fixtures
- name: Import fixtures
run: |
# Import car files
find ./fixtures -name '*.car' -exec kubo-gateway/cmd/ipfs/ipfs dag import --pin-roots=false {} \;
# 5. Start the kubo-gateway
- name: Start kubo-gateway
run: |
( ./ipfs daemon & ) | sed '/Daemon is ready/q'
while [[ "$(./ipfs id | jq '.Addresses | length')" == '0' ]]; do sleep 1; done
working-directory: kubo-gateway/cmd/ipfs
# 6. Setup a kubo http-p2p-proxy to expose libp2p protocol as a regular HTTP port for gateway conformance tests
- name: Init p2p-proxy kubo node
env:
IPFS_PATH: "~/.kubo-p2p-proxy"
run: |
./ipfs init --profile=test -e
./ipfs config --json Experimental.Libp2pStreamMounting true
./ipfs config Addresses.Gateway "/ip4/127.0.0.1/tcp/8081"
./ipfs config Addresses.API "/ip4/127.0.0.1/tcp/5002"
working-directory: kubo-gateway/cmd/ipfs
# 7. Start the kubo http-p2p-proxy
- name: Start kubo http-p2p-proxy
env:
IPFS_PATH: "~/.kubo-p2p-proxy"
run: |
( ./ipfs daemon & ) | sed '/Daemon is ready/q'
while [[ "$(./ipfs id | jq '.Addresses | length')" == '0' ]]; do sleep 1; done
working-directory: kubo-gateway/cmd/ipfs
# 8. Start forwarding data from the http-p2p-proxy to the node serving the Gateway API over libp2p
- name: Start http-over-libp2p forwarding proxy
run: |
gatewayNodeId=$(./ipfs --api=/ip4/127.0.0.1/tcp/5001 id -f="<id>")
./ipfs --api=/ip4/127.0.0.1/tcp/5002 swarm connect $(./ipfs --api=/ip4/127.0.0.1/tcp/5001 swarm addrs local --id | head -n 1)
./ipfs --api=/ip4/127.0.0.1/tcp/5002 p2p forward --allow-custom-protocol /http/1.1 /ip4/127.0.0.1/tcp/8092 /p2p/$gatewayNodeId
working-directory: kubo-gateway/cmd/ipfs
# 9. Run the gateway-conformance tests over libp2p
- name: Run gateway-conformance tests over libp2p
uses: ipfs/gateway-conformance/.github/actions/test@v0.12
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'
json: output.json
xml: output.xml
html: output.html
markdown: output.md
# 10. Upload the results
- name: Upload MD summary
if: failure() || success()
run: cat output.md >> $GITHUB_STEP_SUMMARY
- name: Upload HTML report
if: failure() || success()
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@v7
with:
name: gateway-conformance-libp2p.json
path: output.json
================================================
FILE: .github/workflows/generated-pr.yml
================================================
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
================================================
FILE: .github/workflows/gobuild.yml
================================================
name: Go Build
on:
workflow_dispatch:
pull_request:
paths-ignore:
- '**/*.md'
push:
branches:
- 'master'
concurrency:
group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.event_name == 'push' && github.sha || github.ref }}
cancel-in-progress: true
jobs:
go-build:
if: github.repository == 'ipfs/kubo' || github.event_name == 'workflow_dispatch'
runs-on: ${{ fromJSON(github.repository == 'ipfs/kubo' && '["self-hosted", "linux", "x64", "4xlarge"]' || '"ubuntu-latest"') }}
timeout-minutes: 20
env:
TEST_DOCKER: 0
TEST_VERBOSE: 1
GIT_PAGER: cat
IPFS_CHECK_RCMGR_DEFAULTS: 1
defaults:
run:
shell: bash
steps:
- uses: actions/checkout@v6
- uses: actions/setup-go@v6
with:
go-version-file: 'go.mod'
cache: true
cache-dependency-path: go.sum
- name: Build all platforms
run: |
# Read platforms from build-platforms.yml and build each one
echo "Building kubo for all platforms..."
# Read and build each platform
grep '^ - ' .github/build-platforms.yml | sed 's/^ - //' | while read -r platform; do
if [ -z "$platform" ]; then
continue
fi
echo "::group::Building $platform"
GOOS=$(echo "$platform" | cut -d- -f1)
GOARCH=$(echo "$platform" | cut -d- -f2)
echo "Building $platform"
echo " GOOS=$GOOS GOARCH=$GOARCH go build -o /dev/null ./cmd/ipfs"
GOOS=$GOOS GOARCH=$GOARCH go build -o /dev/null ./cmd/ipfs
echo "::endgroup::"
done
echo "All platforms built successfully"
================================================
FILE: .github/workflows/golang-analysis.yml
================================================
name: Go Check
on:
workflow_dispatch:
pull_request:
paths-ignore:
- '**/*.md'
push:
branches:
- 'master'
permissions:
contents: read # to fetch code (actions/checkout)
concurrency:
group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.event_name == 'push' && github.sha || github.ref }}
cancel-in-progress: true
jobs:
go-check:
if: github.repository == 'ipfs/kubo' || github.event_name == 'workflow_dispatch'
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- uses: actions/checkout@v6
with:
submodules: recursive
- uses: actions/setup-go@v6
with:
go-version-file: 'go.mod'
- name: Check that go.mod is tidy
uses: protocol/multiple-go-modules@v1.4
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: go fmt
if: always() # run this step even if the previous one failed
run: |
out=$(go fmt ./...)
if [[ -n "$out" ]]; then
echo "Files are not go-fmt-ed:"
echo "$out"
exit 1
fi
- name: go fix
if: always() # run this step even if the previous one failed
run: |
go fix ./...
if [[ -n $(git diff --name-only) ]]; then
echo "go fix produced changes. Run 'go fix ./...' locally and commit the result."
git diff
exit 1
fi
- name: go vet
if: always() # run this step even if the previous one failed
uses: protocol/multiple-go-modules@v1.4
with:
run: go vet ./...
================================================
FILE: .github/workflows/golint.yml
================================================
name: Go Lint
on:
workflow_dispatch:
pull_request:
paths-ignore:
- '**/*.md'
push:
branches:
- 'master'
concurrency:
group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.event_name == 'push' && github.sha || github.ref }}
cancel-in-progress: true
jobs:
go-lint:
if: github.repository == 'ipfs/kubo' || github.event_name == 'workflow_dispatch'
runs-on: ubuntu-latest
timeout-minutes: 10
env:
TEST_DOCKER: 0
TEST_FUSE: 0
TEST_VERBOSE: 1
GIT_PAGER: cat
IPFS_CHECK_RCMGR_DEFAULTS: 1
defaults:
run:
shell: bash
steps:
- uses: actions/checkout@v6
- uses: actions/setup-go@v6
with:
go-version-file: 'go.mod'
- run: make -O test_go_lint
================================================
FILE: .github/workflows/gotest.yml
================================================
name: Go Test
on:
workflow_dispatch:
pull_request:
paths-ignore:
- '**/*.md'
push:
branches:
- 'master'
concurrency:
group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.event_name == 'push' && github.sha || github.ref }}
cancel-in-progress: true
jobs:
# Unit tests with coverage collection (uploaded to Codecov)
unit-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"') }}
timeout-minutes: 15
env:
GOTRACEBACK: single # reduce noise on test timeout panics
TEST_DOCKER: 0
TEST_FUSE: 0
TEST_VERBOSE: 1
GIT_PAGER: cat
IPFS_CHECK_RCMGR_DEFAULTS: 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 missing tools
run: sudo apt update && sudo apt install -y zsh
- name: Run unit tests
run: |
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
if: failure() || success()
with:
name: unittests
files: coverage/unit_tests.coverprofile
token: ${{ secrets.CODECOV_TOKEN }}
fail_ci_if_error: false
- name: Create a proper JUnit XML report
uses: ipdxco/gotest-json-to-junit-xml@v1
with:
input: test/unit/gotest.json
output: test/unit/gotest.junit.xml
if: failure() || success()
- name: Archive the JUnit XML report
uses: actions/upload-artifact@v7
with:
name: unit-tests-junit
path: test/unit/gotest.junit.xml
if: failure() || success()
- name: Create a HTML report
uses: ipdxco/junit-xml-to-html@v1
with:
mode: no-frames
input: test/unit/gotest.junit.xml
output: test/unit/gotest.html
if: failure() || success()
- name: Archive the HTML report
uses: actions/upload-artifact@v7
with:
name: unit-tests-html
path: test/unit/gotest.html
if: failure() || success()
- name: Create a Markdown report
uses: ipdxco/junit-xml-to-html@v1
with:
mode: summary
input: test/unit/gotest.junit.xml
output: test/unit/gotest.md
if: failure() || success()
- name: Set the summary
run: cat test/unit/gotest.md >> $GITHUB_STEP_SUMMARY
if: failure() || success()
# End-to-end integration/regression tests from test/cli
# (Go-based replacement for legacy test/sharness shell scripts)
cli-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"') }}
timeout-minutes: 15
env:
GOTRACEBACK: single # reduce noise on test timeout panics
TEST_VERBOSE: 1
GIT_PAGER: cat
IPFS_CHECK_RCMGR_DEFAULTS: 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 missing tools
run: sudo apt update && sudo apt install -y zsh
- name: Run CLI tests
env:
IPFS_PATH: ${{ runner.temp }}/ipfs-test
run: make test_cli
- name: Create JUnit XML report
uses: ipdxco/gotest-json-to-junit-xml@v1
with:
input: test/cli/cli-tests.json
output: test/cli/cli-tests.junit.xml
if: failure() || success()
- name: Archive JUnit XML report
uses: actions/upload-artifact@v7
with:
name: cli-tests-junit
path: test/cli/cli-tests.junit.xml
if: failure() || success()
- name: Create HTML report
uses: ipdxco/junit-xml-to-html@v1
with:
mode: no-frames
input: test/cli/cli-tests.junit.xml
output: test/cli/cli-tests.html
if: failure() || success()
- name: Archive HTML report
uses: actions/upload-artifact@v7
with:
name: cli-tests-html
path: test/cli/cli-tests.html
if: failure() || success()
- name: Create Markdown report
uses: ipdxco/junit-xml-to-html@v1
with:
mode: summary
input: test/cli/cli-tests.junit.xml
output: test/cli/cli-tests.md
if: failure() || success()
- name: Set summary
run: cat test/cli/cli-tests.md >> $GITHUB_STEP_SUMMARY
if: failure() || success()
# Example tests (kubo-as-a-library)
example-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"') }}
timeout-minutes: 5
env:
GOTRACEBACK: single
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: Run example tests
run: make test_examples
================================================
FILE: .github/workflows/interop.yml
================================================
# Interoperability Tests
#
# This workflow ensures Kubo remains compatible with the broader IPFS ecosystem.
# It builds Kubo from source, then runs:
#
# 1. helia-interop: Tests compatibility with Helia (JavaScript IPFS implementation)
# using Playwright-based tests from @helia/interop package.
#
# 2. ipfs-webui: Runs E2E tests from ipfs/ipfs-webui repository to verify
# the web interface works correctly with the locally built Kubo binary.
#
# Both jobs use caching to speed up repeated runs (npm dependencies, Playwright
# browsers, and webui build artifacts).
name: Interop
on:
workflow_dispatch:
pull_request:
paths-ignore:
- '**/*.md'
push:
branches:
- 'master'
concurrency:
group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.event_name == 'push' && github.sha || github.ref }}
cancel-in-progress: true
defaults:
run:
shell: bash
jobs:
interop-prep:
if: github.repository == 'ipfs/kubo' || github.event_name == 'workflow_dispatch'
runs-on: ubuntu-latest
timeout-minutes: 5
env:
TEST_DOCKER: 0
TEST_FUSE: 0
TEST_VERBOSE: 1
GIT_PAGER: cat
IPFS_CHECK_RCMGR_DEFAULTS: 1
defaults:
run:
shell: bash
steps:
- uses: actions/checkout@v6
- uses: actions/setup-go@v6
with:
go-version-file: 'go.mod'
- run: make build
- uses: actions/upload-artifact@v7
with:
name: kubo
path: cmd/ipfs/ipfs
helia-interop:
needs: [interop-prep]
runs-on: ${{ fromJSON(github.repository == 'ipfs/kubo' && '["self-hosted", "linux", "x64", "2xlarge"]' || '"ubuntu-latest"') }}
timeout-minutes: 20
defaults:
run:
shell: bash
steps:
- uses: actions/setup-node@v6
with:
node-version: lts/*
- uses: actions/download-artifact@v8
with:
name: kubo
path: cmd/ipfs
- run: chmod +x cmd/ipfs/ipfs
- run: sudo apt update
- run: sudo apt install -y libxkbcommon0 libxdamage1 libgbm1 libpango-1.0-0 libcairo2 # dependencies for playwright
# Cache node_modules based on latest @helia/interop version from npm registry.
# This ensures we always test against the latest release while still benefiting
# from caching when the version hasn't changed.
- name: Get latest @helia/interop version
id: helia-version
run: echo "version=$(npm view @helia/interop version)" >> $GITHUB_OUTPUT
- name: Cache helia-interop node_modules
uses: actions/cache@v5
id: helia-cache
with:
path: node_modules
key: ${{ runner.os }}-helia-interop-${{ steps.helia-version.outputs.version }}
- name: Install @helia/interop
if: steps.helia-cache.outputs.cache-hit != 'true'
run: npm install @helia/interop
# TODO(IPIP-499): Remove --grep --invert workaround once helia implements IPIP-499
# Tracking issue: https://github.com/ipfs/helia/issues/941
#
# PROVISIONAL HACK: Skip '@helia/mfs - should have the same CID after
# creating a file' test due to IPIP-499 changes in kubo.
#
# WHY IT FAILS: The test creates a 5-byte file in MFS on both kubo and helia,
# then compares the root directory CID. With kubo PR #11148, `ipfs files write`
# now produces raw CIDs for single-block files (matching `ipfs add --raw-leaves`),
# while helia uses `reduceSingleLeafToSelf: false` which keeps the dag-pb wrapper.
# Different file CIDs lead to different directory CIDs.
#
# We run aegir directly (instead of helia-interop binary) because only aegir
# supports the --grep/--invert flags needed to exclude specific tests.
- name: Run helia-interop tests (excluding IPIP-499 incompatible test)
run: npx aegir test -t node --bail -- --grep 'should have the same CID after creating a file' --invert
env:
KUBO_BINARY: ${{ github.workspace }}/cmd/ipfs/ipfs
working-directory: node_modules/@helia/interop
ipfs-webui:
needs: [interop-prep]
runs-on: ${{ fromJSON(github.repository == 'ipfs/kubo' && '["self-hosted", "linux", "x64", "2xlarge"]' || '"ubuntu-latest"') }}
timeout-minutes: 20
env:
NO_SANDBOX: true
LIBP2P_TCP_REUSEPORT: false
LIBP2P_ALLOW_WEAK_RSA_KEYS: 1
E2E_IPFSD_TYPE: go
GIT_PAGER: cat
IPFS_CHECK_RCMGR_DEFAULTS: 1
defaults:
run:
shell: bash
steps:
- uses: actions/download-artifact@v8
with:
name: kubo
path: cmd/ipfs
- run: chmod +x cmd/ipfs/ipfs
- uses: actions/checkout@v6
with:
repository: ipfs/ipfs-webui
path: ipfs-webui
- uses: actions/setup-node@v6
with:
node-version-file: 'ipfs-webui/.tool-versions'
- id: webui-ref
run: echo "ref=$(git rev-parse --short HEAD)" | tee -a $GITHUB_OUTPUT
working-directory: ipfs-webui
- id: webui-state
env:
GITHUB_TOKEN: ${{ github.token }}
ENDPOINT: repos/ipfs/ipfs-webui/commits/${{ steps.webui-ref.outputs.ref }}/status
SELECTOR: .state
KEY: state
run: gh api "$ENDPOINT" --jq "$SELECTOR" | xargs -I{} echo "$KEY={}" | tee -a $GITHUB_OUTPUT
# Cache node_modules based on package-lock.json
- name: Cache node_modules
uses: actions/cache@v5
id: node-modules-cache
with:
path: ipfs-webui/node_modules
key: ${{ runner.os }}-webui-node-modules-${{ hashFiles('ipfs-webui/package-lock.json') }}
restore-keys: |
${{ runner.os }}-webui-node-modules-
- name: Install dependencies
if: steps.node-modules-cache.outputs.cache-hit != 'true'
run: npm ci --prefer-offline --no-audit --progress=false
working-directory: ipfs-webui
# Cache Playwright browsers
- name: Cache Playwright browsers
uses: actions/cache@v5
id: playwright-cache
with:
path: ~/.cache/ms-playwright
key: ${{ runner.os }}-playwright-${{ hashFiles('ipfs-webui/package-lock.json') }}
restore-keys: |
${{ runner.os }}-playwright-
# On cache miss: download browsers and install OS dependencies
- name: Install Playwright with dependencies
if: steps.playwright-cache.outputs.cache-hit != 'true'
run: npx playwright install --with-deps
working-directory: ipfs-webui
# On cache hit: only ensure OS dependencies are present (fast, idempotent)
- name: Install Playwright OS dependencies
if: steps.playwright-cache.outputs.cache-hit == 'true'
run: npx playwright install-deps
working-directory: ipfs-webui
# Cache test build output
- name: Cache test build
uses: actions/cache@v5
id: test-build-cache
with:
path: ipfs-webui/build
key: ${{ runner.os }}-webui-build-${{ hashFiles('ipfs-webui/package-lock.json', 'ipfs-webui/src/**', 'ipfs-webui/public/**') }}
restore-keys: |
${{ runner.os }}-webui-build-
- name: Build ipfs-webui@${{ steps.webui-ref.outputs.ref }} (state=${{ steps.webui-state.outputs.state }})
if: steps.test-build-cache.outputs.cache-hit != 'true'
run: npm run test:build
working-directory: ipfs-webui
- name: Test ipfs-webui@${{ steps.webui-ref.outputs.ref }} (state=${{ steps.webui-state.outputs.state }}) E2E against the locally built Kubo binary
run: npm run test:e2e
env:
IPFS_GO_EXEC: ${{ github.workspace }}/cmd/ipfs/ipfs
working-directory: ipfs-webui
- name: Upload test artifacts on failure
if: failure()
uses: actions/upload-artifact@v7
with:
name: webui-test-results
path: ipfs-webui/test-results/
retention-days: 7
================================================
FILE: .github/workflows/sharness.yml
================================================
name: Sharness
on:
workflow_dispatch:
pull_request:
paths-ignore:
- "**/*.md"
push:
branches:
- "master"
concurrency:
group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.event_name == 'push' && github.sha || github.ref }}
cancel-in-progress: true
jobs:
sharness-test:
if: github.repository == 'ipfs/kubo' || github.event_name == 'workflow_dispatch'
runs-on: ${{ fromJSON(github.repository == 'ipfs/kubo' && '["self-hosted", "linux", "x64", "4xlarge"]' || '"ubuntu-latest"') }}
timeout-minutes: ${{ github.repository == 'ipfs/kubo' && 15 || 60 }}
defaults:
run:
shell: bash
steps:
- name: Checkout Kubo
uses: actions/checkout@v6
with:
path: kubo
- name: Setup Go
uses: actions/setup-go@v6
with:
go-version-file: 'kubo/go.mod'
- name: Install missing tools
run: sudo apt update && sudo apt install -y socat net-tools fish libxml2-utils
- uses: actions/cache@v5
with:
path: test/sharness/lib/dependencies
key: ${{ runner.os }}-test-generate-junit-html-${{ hashFiles('test/sharness/lib/test-generate-junit-html.sh') }}
- name: Run Sharness tests
run: |
make -O -j "$PARALLEL" \
test_sharness \
coverage/sharness_tests.coverprofile \
test/sharness/test-results/sharness.xml
working-directory: kubo
env:
TEST_DOCKER: 1
TEST_PLUGIN: 0
TEST_FUSE: 0
TEST_VERBOSE: 1
TEST_JUNIT: 1
TEST_EXPENSIVE: 1
IPFS_CHECK_RCMGR_DEFAULTS: 1
CONTINUE_ON_S_FAILURE: 1
# 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
if: failure() || success()
with:
name: sharness
files: kubo/coverage/sharness_tests.coverprofile
token: ${{ secrets.CODECOV_TOKEN }}
fail_ci_if_error: false
- name: Aggregate results
run: find kubo/test/sharness/test-results -name 't*-*.sh.*.counts' | kubo/test/sharness/lib/sharness/aggregate-results.sh > kubo/test/sharness/test-results/summary.txt
- name: 👉️ If this step failed, go to «Summary» (top left) → «HTML Report» → inspect the «Failures» column
run: |
cat kubo/test/sharness/test-results/summary.txt &&
grep 'failed\s*0' kubo/test/sharness/test-results/summary.txt
- name: Add aggregate results to the summary
if: failure() || success()
run: |
echo "# Summary" >> $GITHUB_STEP_SUMMARY
echo >> $GITHUB_STEP_SUMMARY
cat kubo/test/sharness/test-results/summary.txt >> $GITHUB_STEP_SUMMARY
- name: Generate one-page HTML report
uses: ipdxco/junit-xml-to-html@v1
if: failure() || success()
with:
mode: no-frames
input: kubo/test/sharness/test-results/sharness.xml
output: kubo/test/sharness/test-results/sharness.html
- name: Upload one-page HTML report to S3
id: one-page
uses: ipdxco/custom-github-runners/.github/actions/upload-artifact@main
if: github.repository == 'ipfs/kubo' && (failure() || success())
with:
source: kubo/test/sharness/test-results/sharness.html
destination: sharness.html
- name: Upload one-page HTML report
if: github.repository != 'ipfs/kubo' && (failure() || success())
uses: actions/upload-artifact@v7
with:
name: sharness.html
path: kubo/test/sharness/test-results/sharness.html
- name: Generate full HTML report
uses: ipdxco/junit-xml-to-html@v1
if: failure() || success()
with:
mode: frames
input: kubo/test/sharness/test-results/sharness.xml
output: kubo/test/sharness/test-results/sharness-html
- name: Upload full HTML report to S3
id: full
uses: ipdxco/custom-github-runners/.github/actions/upload-artifact@main
if: github.repository == 'ipfs/kubo' && (failure() || success())
with:
source: kubo/test/sharness/test-results/sharness-html
destination: sharness-html/
- name: Upload full HTML report
if: github.repository != 'ipfs/kubo' && (failure() || success())
uses: actions/upload-artifact@v7
with:
name: sharness-html
path: kubo/test/sharness/test-results/sharness-html
- name: Add S3 links to the summary
if: github.repository == 'ipfs/kubo' && (failure() || success())
run: echo "$MD" >> $GITHUB_STEP_SUMMARY
env:
MD: |
# HTML Reports
- View the [one page HTML report](${{ steps.one-page.outputs.url }})
- View the [full HTML report](${{ steps.full.outputs.url }}index.html)
================================================
FILE: .github/workflows/spellcheck.yml
================================================
name: Spell Check
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:
spellcheck:
uses: ipdxco/unified-github-workflows/.github/workflows/reusable-spellcheck.yml@v1
================================================
FILE: .github/workflows/stale.yml
================================================
name: Close Stale Issues
on:
schedule:
- cron: '0 0 * * *'
workflow_dispatch:
permissions:
issues: write
pull-requests: write
jobs:
stale:
uses: ipdxco/unified-github-workflows/.github/workflows/reusable-stale-issue.yml@v1
================================================
FILE: .github/workflows/sync-release-assets.yml
================================================
name: Sync GitHub Release Assets
on:
workflow_dispatch:
schedule:
- cron: '0 0 * * *'
concurrency:
group: release-assets-dist-sync
cancel-in-progress: true
permissions:
contents: write # to upload release asset
jobs:
dist-ipfs-tech:
if: github.repository == 'ipfs/kubo' || github.event_name == 'workflow_dispatch'
runs-on: "ubuntu-latest"
timeout-minutes: 15
steps:
- uses: ipfs/download-ipfs-distribution-action@v1
- uses: ipfs/start-ipfs-daemon-action@v1
with:
args: --init --init-profile=flatfs,server --enable-gc=false
- uses: actions/setup-node@v6
with:
node-version: 14
- name: Sync the latest 5 github releases
uses: actions/github-script@v8
with:
script: |
const fs = require('fs').promises
const max_synced = 5
// fetch github releases
resp = await github.rest.repos.listReleases({
owner: context.repo.owner,
repo: context.repo.repo,
page: 1,
per_page: max_synced
})
const release_assets = [];
num_synced = 0;
for (const release of resp.data) {
console.log("checking release tagged", release.tag_name)
if (num_synced > max_synced) {
console.log("done: synced", max_synced, "latest releases")
break;
}
num_synced += 1
const github_assets = new Set()
for (const asset of release.assets) {
github_assets.add(asset.name)
}
// fetch asset info from dist.ipfs.tech
p = '/ipns/dist.ipfs.tech/kubo/' + release.tag_name
let stdout = ''
const options = {}
options.listeners = {
stdout: (data) => {
stdout += data.toString();
}
}
await exec.exec('ipfs', ['ls', p], options)
const dist_assets = new Set()
const missing_files = []
for (const raw_line of stdout.split("\n")) {
line = raw_line.trim();
if (line.length != 0) {
file = line.split(/(\s+)/).filter( function(e) { return e.trim().length > 0; } )[2]
dist_assets.add(file)
if (!github_assets.has(file)) {
missing_files.push(file)
}
}
}
// if dist.ipfs.tech has files not found in github, copy them over
for (const file of missing_files) {
file_sha = file + ".sha512"
file_cid = file + ".cid"
// skip files that don't have .cid and .sha512 checksum files
if (!dist_assets.has(file_sha) || !dist_assets.has(file_cid)) {
if (!file.endsWith('.cid') && !file.endsWith('.sha512')) { // silent skip of .sha512.sha512 :)
console.log(`skipping "${file}" as dist.ipfs.tech does not provide .cid and .sha512 checksum files for it`)
}
continue
}
console.log("fetching", file, "from dist.ipfs.tech")
await exec.exec('ipfs', ['get', p + '/' + file])
await exec.exec('ipfs', ['get', p + '/' + file_sha])
await exec.exec('ipfs', ['get', p + '/' + file_cid])
console.log("verifying contents of", file)
// compute sha512 output for file
let sha_stdout = ''
const sha_options = {}
sha_options.listeners = {
stdout: (data) => {
sha_stdout += data.toString();
}
}
await exec.exec('sha512sum', [file], sha_options)
// read expected sha512 output
const sha_data = await fs.readFile(file_sha, "utf8")
const digest = (s) => s.split(' ').shift()
if (digest(sha_data) != digest(sha_stdout)) {
console.log(`${file}.sha512: ${sha_data}`)
console.log(`sha512sum ${file}: ${sha_stdout}`)
throw "checksum verification failed for " + file
}
console.log("uploading", file, "to github release", release.tag_name)
const uploadReleaseAsset = async (file) => github.rest.repos.uploadReleaseAsset({
owner: context.repo.owner,
repo: context.repo.repo,
release_id: release.id,
headers: {
"content-type": "application/octet-stream",
"content-length": `${(await fs.stat(file)).size}`
},
name: file,
data: await fs.readFile(file)
})
await uploadReleaseAsset(file)
await uploadReleaseAsset(file_sha)
await uploadReleaseAsset(file_cid)
}
// summary of assets on both sides
release_assets.push({ tag: release.tag_name, github_assets, dist_assets })
}
console.log(release_assets)
return release_assets
================================================
FILE: .github/workflows/test-migrations.yml
================================================
name: Migrations
on:
workflow_dispatch:
pull_request:
paths:
# Migration implementation files
- 'repo/fsrepo/migrations/**'
- 'test/cli/migrations/**'
# Config and repo handling
- 'repo/fsrepo/**'
# This workflow file itself
- '.github/workflows/test-migrations.yml'
push:
branches:
- 'master'
- 'release-*'
paths:
- 'repo/fsrepo/migrations/**'
- 'test/cli/migrations/**'
- 'repo/fsrepo/**'
- '.github/workflows/test-migrations.yml'
concurrency:
group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.event_name == 'push' && github.sha || github.ref }}
cancel-in-progress: true
jobs:
test:
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
runs-on: ${{ matrix.os }}
timeout-minutes: 20
env:
TEST_VERBOSE: 1
IPFS_CHECK_RCMGR_DEFAULTS: 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: Build kubo binary
run: |
make build
echo "Built ipfs binary at $(pwd)/cmd/ipfs/"
- name: Add kubo to PATH
run: |
echo "$(pwd)/cmd/ipfs" >> $GITHUB_PATH
- name: Verify ipfs in PATH
run: |
which ipfs || echo "ipfs not in PATH"
ipfs version || echo "Failed to run ipfs version"
- name: Run migration unit tests
run: |
go test ./repo/fsrepo/migrations/...
- name: Run CLI migration tests
env:
IPFS_PATH: ${{ runner.temp }}/ipfs-test
run: |
export PATH="${{ github.workspace }}/cmd/ipfs:$PATH"
which ipfs || echo "ipfs not found in PATH"
ipfs version || echo "Failed to run ipfs version"
go test ./test/cli/migrations/...
- name: Upload test results
if: always()
uses: actions/upload-artifact@v7
with:
name: ${{ matrix.os }}-test-results
path: |
test/**/*.log
${{ runner.temp }}/ipfs-test/
================================================
FILE: .gitignore
================================================
# ipfs can generate profiling dump files
*.cpuprof
*.memprof
*.swp
.ipfsconfig
*.out
*.coverprofile
*.test
*.orig
*~
coverage.txt
gx-workspace-update.json
.ipfs
bin/gx
bin/protoc-*
bin/gx*
bin/tmp
bin/gocovmerge
bin/cover
vendor
.tarball
go-ipfs-source.tar.gz
docs/examples/go-ipfs-as-a-library/example-folder/Qm*
/test/sharness/t0054-dag-car-import-export-data/*.car
# test artifacts from make test_unit / test_cli
/test/unit/gotest.json
/test/unit/gotest.junit.xml
/test/cli/cli-tests.json
# ignore build output from snapcraft
/ipfs_*.snap
/parts
/stage
/prime
================================================
FILE: .golangci.yml
================================================
linters:
enable:
- stylecheck
linters-settings:
stylecheck:
checks:
- all
- '-ST1003'
dot-import-whitelist:
- github.com/ipfs/kubo/test/cli/testutils
================================================
FILE: .hadolint.yaml
================================================
# Hadolint configuration for Kubo Docker image
# https://github.com/hadolint/hadolint
# Ignore specific rules
ignored:
# DL3008: Pin versions in apt-get install
# We use stable base images and prefer smaller layers over version pinning
- DL3008
# Trust base images from these registries
trustedRegistries:
- docker.io
- gcr.io
================================================
FILE: .mailmap
================================================
# This file allows re-mapping author names/emails
# while maintaining the integrity of the repository
#
# Spec: https://www.kernel.org/pub/software/scm/git/docs/git-shortlog.html#_mapping_authors
#
@RubenKelevra <cyrond@gmail.com>
Aaron Hill <aa1ronham@gmail.com>
Adam Gashlin <agashlin@gmail.com>
Adam Uhlir <uhlir.a@gmail.com>
Adin Schmahmann <adin.schmahmann@gmail.com>
Adrian Lanzafame <adrianlanzafame92@gmail.com>
Adrian Ulrich <adrian@blinkenlights.ch>
Alan Shaw <alan.shaw@protocol.ai> <alan@tableflip.io>
Alec Brickner <alecjbrick@gmail.com>
Alex <alexgbahm@gmail.com>
Alfie John <alfie@alfie.wtf>
Alfonso Montero <amontero@tinet.org>
Ali Mirlou <alimirlou@gmail.com>
Andres Buritica <andres@thelinuxkid.com>
Andrew Chin <achin@eminence32.net>
Andrew Nesbitt <andrewnez@gmail.com>
Andy Leap <andyleap@gmail.com>
Antti Kaihola <antti+ipfs@kaihola.fi>
Artem Andreenko <mio@volmy.com>
Arthur Elliott <clownpriest@gmail.com>
Bamvor Zhang <jian.zhang@ipfsbit.com>
Baptiste Jonglez <baptiste--git@jonglez.org>
Bernhard M. Wiedemann <bwiedemann@suse.de>
Boris Mann <boris@bmannconsulting.com>
Brendan Mc <Bren2010@users.noreply.github.com>
Brendan McMillion <brendan@cloudflare.com>
Brendan O'Brien <sparkle_pony_2000@qri.io>
Brian Tiger Chow <brian.holderchow@gmail.com>
Brian Tiger Chow <perfmode@users.noreply.github.com>
Caian <caian@ggaunicamp.com>
Caio Alonso <caio@caioalonso.com>
Carlos Cobo <toqueteos@gmail.com>
Casey Chance <caseyjchance@gmail.com>
Cayman Nava <caymannava@gmail.com>
Chas Leichner <chas@chas.io>
Chris Boddy <chris@boddy.im>
Chris Chinchilla <chris.ward@consensys.net>
Chris Grimmett <xtoast@gmail.com>
Chris P <sahib@online.de>
Christopher Sasarak <chris.sasarak@gmail.com>
Christian Couder <chriscool@tuxfamily.org>
Christian Kniep <christian@qnib.org>
Christopher Buesser <christopher.buesser@gmail.com>
Cole Brown <bigswim@gmail.com>
Corbin Page <corbin.page@gmail.com>
Cornelius Toole <cornelius.toole@gmail.com>
Dan <35669742+NukeManDan@users.noreply.github.com>
Daniel Aleksandersen <code@daniel.priv.no>
Daniel Grossmann-Kavanagh <me@danielgk.com>
Daniel Mack <daniel@zonque.org>
David <github@kattfest.se>
David Braun <David.Braun@Toptal.com>
David Brennan <david.n.brennan@gmail.com>
David Dias <mail@daviddias.me> <daviddias.p@gmail.com>
David Wagner <wagdav@gmail.com>
Devin <studyzy@gmail.com>
Dimitris Apostolou <dimitris.apostolou@icloud.com>
Diogo Silva <fsdiogo@gmail.com>
Dirk McCormick <dirkmdev@gmail.com>
Djalil Dreamski <32184973+dreamski21@users.noreply.github.com>
Dominic Della Valle <ddvpublic@gmail.com> <DDVpublic@Gmail.com> <ddvpublic@Gmail.com> <not@yet.net>
Dominic Tarr <dominic.tarr@gmail.com>
Ian Preston <ianopolous@protonmail.com> <ianopolous@gmail.com>
Dylan Powers <dylan.kyle.powers@gmail.com>
Edison Lee <edisonlee@edisonlee55.com>
Elias Gabrielsson <elias@benefactory.se>
Emery Hemingway <emery@vfemail.net>
Enrique Erne <enrique.erne@gmail.com>
Eoghan Ó Carragáin <eoghan.ocarragain@gmail.com>
Erik Ingenito <erik@carbonfive.com>
Esteban <eginez@gmail.com>
Ethan Buchman <ethan@coinculture.info>
Etienne Laurin <etienne@atnnn.com>
Forrest Weston <forrest@protocol.ai> <fweston@eecs.wsu.edu> <Forrest.Weston@gmail.com>
Francesco Canessa <makevoid@gmail.com>
Frank Sachsenheim <funkyfuture@users.noreply.github.com>
Frederik Riedel <frederik.riedel@frogg.io>
Friedel Ziegelmayer <dignifiedquire@gmail.com>
George Antoniadis <george@noodles.gr>
George Masgras <gmasgras@gmail.com>
Giulitti Salvatore <sgiulitti@cloudbasesolutions.com>
Giuseppe Bertone <bertone.giuseppe@gmail.com>
Gowtham G <gowthamgts12@gmail.com>
Harald Nordgren <haraldnordgren@gmail.com>
Harlan T Wood <harlantwood@users.noreply.github.com>
Hector Sanjuan <hector@protocol.ai> <code@hector.link> <hsanjuan@users.noreply.github.com>
Henrique Dias <hacdias@gmail.com>
Henry <cryptix@riseup.net>
Herman Junge <chpdg42@gmail.com>
Hlib <Glebasya2000@mail.ru>
Ho-Sheng Hsiao <talktohosh@gmail.com>
Hucg <41573766+hcg1314@users.noreply.github.com>
Iaroslav Gridin <voker57@gmail.com>
Igor Velkov <mozdiav@iav.lv>
Ivan <ivan386@users.noreply.github.com>
JP Hastings-Spital <jphastings@gmail.com>
Jack Loughran <30052269+jackloughran@users.noreply.github.com>
Jakub Sztandera <kubuxu@protocol.ai> <kubuxu@gmail.com> <kubuxu@ipfs.io> <kubuxu@protonmail.ch>
Jakub Kaczmarzyk <jakubk@mit.edu>
James Stanley <james@incoherency.co.uk>
Jamie Wilkinson <jamie@jamiedubs.com>
Jan Winkelmann <keks@cryptoscope.co> <j-winkelmann@tuhh.de>
Jason Carver <jacarver@linkedin.com>
Jeff Thompson <jefft0@remap.ucla.edu>
Jeromy Johnson <why@ipfs.io> <jeromyj@gmail.com> <jeromy.johnson@isilon.com> <whyrusleeping@users.noreply.github.com>
Jesse Weinstein <jesse@wefu.org>
Jessica Schilling <jessica@protocol.ai>
Jim McDonald <Jim@mcdee.net>
John Reed <john@re2d.xyz> <john.reeed@gmail.com>
Johnny <9611008+johnnymatthews@users.noreply.github.com>
Jon Choi <choi.jonathanh@gmail.com>
Jonathan Dahan <jonathan@jonathan.is>
Jordan Danford <jordandanford@gmail.com>
Jorropo <jorropo.pgm@gmail.com>
Juan Batiz-Benet <juan@benet.ai>
Justin Drake <drakefjustin@gmail.com>
Kacper Łukawski <kacluk98@gmail.com>
Karthik Bala <drmelonhead@gmail.com>
Kejie Zhang <601172892@qq.com>
Kerem <keremgocen@gmail.com>
Kevin Atkinson <k@kevina.org>
Kevin Simper <kevin.simper@gmail.com>
Kevin Wallace <kevin@pentabarf.net>
Kirill Goncharov <kdgoncharov@gmail.com>
Kishan Mohanbhai Sagathiya <kishansagathiya@gmail.com>
Knut Ahlers <knut@ahlers.me>
Konstantin Koroviev <kkoroviev@gmail.com>
Koushik Roy <koushik@meff.me>
Kristoffer Ström <kristoffer@rymdkoloni.se>
Kuro1 <412681778@qq.com>
Lars Gierth <larsg@systemli.org> <lgierth@users.noreply.github.com>
Leo Arias <yo@elopio.net> <leo.arias@canonical.com>
Li Zheng <flyskywhy@gmail.com>
Lorenzo Manacorda <lorenzo@mailbox.org>
Lorenzo Setale <koalalorenzo@users.noreply.github.com>
Louis Thibault <l.thibault@sentimens.com>
Lucas Garron <code@garron.net>
Lucas Molas <schomatis@gmail.com>
Marcin Janczyk <marcinjanczyk@gmail.com>
Marcin Rataj <lidel@lidel.org>
Markus Amalthea Magnuson <markus.magnuson@gmail.com>
Marten Seemann <martenseemann@gmail.com>
Masashi Salvador Mitsuzawa <masashisalvador57f@gmail.com>
Massino Tinovan <massino@droppod,io>
Mat Kelly <mkelly@cs.odu.edu>
Mathijs de Bruin <mathijs@mathijsfietst.nl>
Matouš Skála <skala.matous@gmail.com>
Matt Bell <mappum@gmail.com>
Matt Joiner <anacrolix@gmail.com>
Max Chechel <hexdigest@gmail.com> <mc@gojuno.com>
Max Kerp <maxkerp@gmail.com>
Mib Kd743naq <mib.kd743naq@gmail.com>
Michael Avila <me@michaelavila.com> <davidmichaelavila@gmail.com>
Michael Lovci <michaeltlovci@gmail.com>
Michael Muré <mure.michael@gmail.com> <batolettre@gmail.com> <michael.mure@consensys.net>
Michael Pfister <pfista@gmail.com>
Michelle Lee <michelle@protocol.ai>
Miguel Torres <migueltorreslopez@gmail.com>
Mikaela Suomalainen <mikaela+git@mikaela.info>
Mildred Ki'Lya <mildred-pub.git@mildred.fr>
Molly <momack2@users.noreply.github.com>
Muneeb Ali <muneeb@ali.vc>
Mykola Nikishov <mn@mn.com.ua>
Nathan Musoke <nathan.musoke@gmail.com>
Nick Hamann <nick@wabbo.org>
Oli Evans <oli@tableflip.io>
Or Rikon <rikonor@gmail.com>
Overbool <overbool.xu@gmail.com>
Patrick Connolly <patrick.c.connolly@gmail.com>
Pavol Rusnak <stick@gk2.sk>
Peter Borzov <peter@sowingo.com> <tihoutrom@gmail.com>
Peter Rabbitson <ribasushi@protocol.ai> <peter@protocol.ai> <ribasushi@leporine.io> <mib.kd743naq@gmail.com>
Peter Wu <pwu@cloudflare.com>
Philip Nelson <me@pnelson.ca>
Pierre-Alain TORET <pierre-alain.toret@protonmail.com>
PoorPockets McNewHold <poorpocketsmcnewhold@protonmail.ch>
Pretty Please Mark Darkly <55382229+pleasemarkdarkly@users.noreply.github.com>
Péter Szilágyi <peterke@gmail.com>
Quantomic <minima38123@gmail.com>
Quinn Slack <sqs@sourcegraph.com>
Raúl Kripalani <raul@protocol.ai> <raul.kripalani@consensys.net>
ReadmeCritic <frankensteinbot@gmail.com>
Remco Bloemen <remco-git@xn--2-umb.com>
Richard Littauer <richard.littauer@gmail.com>
RideWindX <ridewindx@163.com>
Rob Brackett <rob@robbrackett.com>
Robert Carlsen <rwcarlsen@gmail.com>
Rod Vagg <rod@vagg.org>
Roerick Sweeney <sroerick@gmail.com>
Roman Khafizianov <requilence@gmail.com>
Roman Proskuryakov <humbug@deeptown.org>
Ronsor <ronsor@ronsor.pw>
RubenKelevra <cyrond@gmail.com>
Ryan Carver <ryan@ryancarver.com>
Ryan Morey <ryan.t.morey@gmail.com>
SH <github@hertenberger.bayern>
Sag0Sag0 <Sag0Sag0@users.noreply.github.com>
Sander Pick <sanderpick@gmail.com>
Scott Bigelow <epheph@gmail.com>
Sean Lang <slang800@gmail.com>
Shanti Bouchez-Mongardé <shanti-pub.git@mildred.fr>
Shaun Bruce <shaun.m.bruce@gmail.com>
Sherod Taylor <staylor@itbit.com>
Simon Kirkby <tigger@interthingy.com>
Simon Menke <simon.menke@gmail.com>
Siraj Ravel <sirajravel@gmail.com> <llSourcell@gmail.com> <jason.ravel@cbsinteractive.com>
Siva Chandran <siva.chandran@realimage.com>
Spartucus <spartucus@users.noreply.github.com>
Stephan Kulla <git.mail@kulla.me>
Stephan Seidt <evilhackerdude@gmail.com> <stephan.seidt@gmail.com>
Stephen Sugden <me@stephensugden.com>
Stephen Whitmore <stephen.whitmore@gmail.com> <noffle@users.noreply.github.com>
Steve Recio <stevenrecio@gmail.com>
Steven Allen <steven@stebalien.com>
Steven Vandevelde <icid.asset@gmail.com>
Sönke Hahn <soenkehahn@gmail.com>
TUSF <ragef33@gmail.com>
Tarnay Kálmán <kalmisoft@gmail.com>
Thomas Gardner <tmg@fastmail.com>
Tiger <rbalajis25@gmail.com>
Tim Groeneveld <tim@timg.ws>
Tim Stahel <git@swedneck.xyz>
Timothy Hobbs <timothyhobbs@seznam.cz>
Tom O'Donnell <todonnel91@gmail.com>
Tom Swindell <t.swindell@rubyx.co.uk>
Tommi Virtanen <tv@eagain.net>
Tonis Tiigi <tonistiigi@gmail.com>
Tor Arne Vestbø <torarnv@gmail.com>
Travis Person <travis.person@gmail.com> <travis@protocol.ai>
Tylar <murray.tylar@gmail.com>
John Reed <john@re2d.xyz>
Vasil Dimov <vd@FreeBSD.org>
Vijayee Kulkaa <vijayee.kulkaa@.husmail.com>
Vikram <vikram1791@gmail.com>
Vitor Baptista <vitor@vitorbaptista.com>
W. Trevor King <wking@tremily.us>
Wes Morgan <wesmorgan@icloud.com>
Will Scott <will@cypherpunk.email>
Willi Butz <wbutz@cyberfnord.de>
Xiaoyi Wang <wangxiaoyi@hyperchain.cn>
Yuval Langer <yuval.langer@gmail.com>
Zander Mackie <zmackie@gmail.com>
ZenGround0 <ZenGround0@users.noreply.github.com>
achingbrain <alex@achingbrain.net>
adamliesko <adamliesko@gmail.com>
anarcat <anarcat@users.noreply.github.com>
bbenshoof <brendan@glidr.net>
camelmasa <camelmasa@gmail.com>
chenminjian <727180553@qq.com>
devedge <devedge@outlook.com>
dgrisham <dgrisham@mines.edu>
drathir <drathir87@gmail.com>
epitron <chris@ill-logic.com>
eric wu <eric.wu@blockheaders.com>
flowed <yoginth@protonmail.com>
forstmeier <john.forstmeier@gmail.com>
fyrchik <kraunid@gmail.com>
gatesvp <gatesvp@gmail.com>
hannahhoward <hannah@hannahhoward.net>
hikerpig <hikerpigwinnie@gmail.com>
hoenirvili <hoenirvili@gmail.com>
hucg <hucg>
ivan386 <ivan386@yandex.ru>
klauspost <klauspost@gmail.com>
kpcyrd <git@rxv.cc>
kvm2116 <kvm2116@columbia.edu>
mateon1 <matin1111@wp.pl>
matrushka <barisgumustas@gmail.com>
michael <pfista@gmail.com>
myself659 <myself659@163.com>
nmalhotra <nitish.malhotra@cspi.com>
palkeo <contact@palkeo.com>
requilence <requilence@gmail.com>
rht <rhtbot@gmail.com> <rudyht@gmail.com>
rob-deutsch <robzyb+altgithub@gmail.com>
slothbag <slothbag>
sroerick <sroerick@gmail.com>
swedneck <40505480+swedneck@users.noreply.github.com>
tarekbadr <tarekbadrshalaan@gmail.com>
tcme <hi@this-connect.me>
tg <tolstov.georgij@gmail.com>
theswitch <theswitch@users.noreply.github.com>
verokarhu <andreas.metsala@gmail.com>
vitzli <vitzli@gmail.com>
vyzo <vyzo@hackzen.org>
wzhd <dev@wzhd.org>
zramsay <zach@monax.io> <zach@erisindustries.com>
Łukasz Magiera <magik6k@gmail.com> <magik6k@users.noreply.github.com>
ᴍᴀᴛᴛ ʙᴇʟʟ <mappum@gmail.com>
ᴠɪᴄᴛᴏʀ ʙᴊᴇʟᴋʜᴏʟᴍ <victorbjelkholm@gmail.com>
================================================
FILE: AGENTS.md
================================================
# AI Agent Instructions for Kubo
This file provides instructions for AI coding agents working on the [Kubo](https://github.com/ipfs/kubo) codebase (the Go implementation of IPFS). Follow the [Developer Guide](docs/developer-guide.md) for full details.
## Quick Reference
| Task | Command |
|-------------------|----------------------------------------------------------|
| Tidy deps | `make mod_tidy` (run first if `go.mod` changed) |
| Build | `make build` |
| Unit tests | `go test ./... -run TestName -v` |
| Integration tests | `make build && go test ./test/cli/... -run TestName -v` |
| Lint | `make -O test_go_lint` |
| Format | `go fmt ./...` |
## Project Overview
Kubo is the reference implementation of IPFS in Go. Most IPFS protocol logic lives in [boxo](https://github.com/ipfs/boxo) (the IPFS SDK); kubo wires it together and exposes it via CLI and HTTP RPC API. If a change belongs in the protocol layer, it likely belongs in boxo, not here.
Key directories:
| Directory | Purpose |
|--------------------|----------------------------------------------------------|
| `cmd/ipfs/` | CLI entry point and binary |
| `core/` | core IPFS node implementation |
| `core/commands/` | CLI command definitions |
| `core/coreapi/` | Go API implementation |
| `client/rpc/` | HTTP RPC client |
| `plugin/` | plugin system |
| `repo/` | repository management |
| `test/cli/` | Go-based CLI integration tests (preferred for new tests) |
| `test/sharness/` | legacy shell-based integration tests |
| `docs/` | documentation |
Other key external dependencies: [go-libp2p](https://github.com/libp2p/go-libp2p) (networking), [go-libp2p-kad-dht](https://github.com/libp2p/go-libp2p-kad-dht) (DHT).
## Go Style
Follow these Go style references:
- [Go Code Review Comments](https://go.dev/wiki/CodeReviewComments)
- [Google Go Style Decisions](https://google.github.io/styleguide/go/decisions)
Specific conventions for this project:
- check the Go version in `go.mod` and use idiomatic features available at that version
- readability over micro-optimization: clear code is more important than saving microseconds
- prefer standard library functions and utilities over writing your own
- use early returns and indent the error flow, not the happy path
- use `slices.Contains`, `slices.DeleteFunc`, and the `maps` package instead of manual loops
- preallocate slices and maps when the size is known: `make([]T, 0, n)`
- use `map[K]struct{}` for sets, not `map[K]bool`
- receiver names: single-letter abbreviations matching the type (e.g., `s *Server`, `c *Client`)
- run `go fmt` after modifying Go source files, never indent manually
### Error Handling
- wrap errors with `fmt.Errorf("context: %w", err)`, never discard errors silently
- use `errors.Is` / `errors.As` for error checking, not string comparison
- never use `panic` in library code; only in `main` or test helpers
- return `nil` explicitly for the error value on success paths
### Canonical Examples
When adding or modifying code, follow the patterns established in these files:
- CLI command structure: `core/commands/dag/dag.go`
- CLI integration test: `test/cli/dag_test.go`
- Test harness usage: `test/cli/harness/` package
## Building
Always run commands from the repository root.
```bash
make mod_tidy # update go.mod/go.sum (use this instead of go mod tidy)
make build # build the ipfs binary to cmd/ipfs/ipfs
make install # install to $GOPATH/bin
make -O test_go_lint # run linter (use this instead of golangci-lint directly)
```
If you modify `go.mod` (add/remove/update dependencies), you must run `make mod_tidy` first, before building or testing. Use `make mod_tidy` instead of `go mod tidy` directly, as the project has multiple `go.mod` files.
If you modify any `.go` files outside of `test/`, you must run `make build` before running integration tests.
## Testing
The full test suite is composed of several targets:
| Make target | What it runs |
|----------------------|-----------------------------------------------------------------------|
| `make test` | all tests (`test_go_fmt` + `test_unit` + `test_cli` + `test_sharness`) |
| `make test_short` | fast subset (`test_go_fmt` + `test_unit`) |
| `make test_unit` | unit tests with coverage (excludes `test/cli`) |
| `make test_cli` | CLI integration tests (requires `make build` first) |
| `make test_sharness` | legacy shell-based integration tests |
| `make test_go_fmt` | checks Go source formatting |
| `make -O test_go_lint` | runs `golangci-lint` |
During development, prefer running a specific test rather than the full suite:
```bash
# run a single unit test
go test ./core/... -run TestSpecificUnit -v
# run a single CLI integration test (requires make build first)
go test ./test/cli/... -run TestSpecificCLI -v
```
### Environment Setup for Integration Tests
Before running `test_cli` or `test_sharness`, set these environment variables from the repo root:
```bash
export PATH="$PWD/cmd/ipfs:$PATH"
export IPFS_PATH="$(mktemp -d)"
```
- `PATH`: integration tests use the `ipfs` binary from `PATH`, not Go source directly
- `IPFS_PATH`: isolates test data from `~/.ipfs` or other running nodes
If you see "version (N) is lower than repos (M)", the `ipfs` binary in `PATH` is outdated. Rebuild with `make build` and verify `PATH`.
### Running Sharness Tests
Sharness tests are legacy shell-based tests. Run individual tests with a timeout:
```bash
cd test/sharness && timeout 60s ./t0080-repo.sh
```
To investigate a failing test, pass `-v` for verbose output. In this mode, daemons spawned by the test are not shut down automatically and must be killed manually afterwards.
### Cleaning Up Stale Daemons
Before running `test/cli` or `test/sharness`, stop any stale `ipfs daemon` processes owned by the current user. Leftover daemons hold locks and bind ports, causing test failures:
```bash
pkill -f "ipfs daemon"
```
### Writing Tests
- all new integration tests go in `test/cli/`, not `test/sharness/`
- if a `test/sharness` test needs significant changes, remove it and add a replacement in `test/cli/`
- use [testify](https://github.com/stretchr/testify) for assertions (already a dependency)
- for Go 1.25+, use `testing/synctest` when testing concurrent code (goroutines, channels, timers)
- reuse existing `.car` fixtures in `test/cli/fixtures/` when possible; only add new fixtures when the test requires data not covered by existing ones
- always re-run modified tests locally before submitting to confirm they pass
- avoid emojis in test names and test log output
## Before Submitting
Run these steps in order before considering work complete:
1. `make mod_tidy` (if `go.mod` changed)
2. `go fmt ./...`
3. `make build` (if non-test `.go` files changed)
4. `make -O test_go_lint`
5. `go test ./...` (or the relevant subset)
## Documentation and Commit Messages
- after editing CLI help text in `core/commands/`, verify width: `go test ./test/cli/... -run TestCommandDocsWidth`
- config options are documented in `docs/config.md`
- changelogs in `docs/changelogs/`: only edit the Table of Contents and the Highlights section; the Changelog and Contributors sections are auto-generated and must not be modified
- follow [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/)
- keep commit titles short and messages terse
## Writing Style
When writing docs, comments, and commit messages:
- avoid emojis in code, comments, and log output
- keep an empty line before lists in markdown
- use backticks around CLI commands, paths, environment variables, and config options
## PR Guidelines
- explain what changed and why in the PR description
- include test coverage for new functionality and bug fixes
- run `make -O test_go_lint` and fix any lint issues before submitting
- verify that `go test ./...` passes locally
- when modifying `test/sharness` tests significantly, migrate them to `test/cli` instead
- end the PR description with a `## References` section listing related context, one link per line
- if the PR closes an issue in `ipfs/kubo`, each closing reference should be a bullet starting with `Closes`:
```markdown
## References
- Closes https://github.com/ipfs/kubo/issues/1234
- Closes https://github.com/ipfs/kubo/issues/5678
- https://discuss.ipfs.tech/t/related-topic/999
```
## Scope and Safety
Do not modify or touch:
- files under `test/sharness/lib/` (third-party sharness test framework)
- CI workflows in `.github/` unless explicitly asked
- auto-generated sections in `docs/changelogs/` (Changelog and Contributors are generated; only TOC and Highlights are human-edited)
Do not run without being asked:
- `make test` or `make test_sharness` (full suite is slow; prefer targeted tests)
- `ipfs daemon` without a timeout
## Running the Daemon
Always run the daemon with a timeout or shut it down promptly:
```bash
timeout 60s ipfs daemon # auto-kill after 60s
ipfs shutdown # graceful shutdown via API
```
Kill dangling daemons before re-running tests: `pkill -f "ipfs daemon"`
================================================
FILE: CHANGELOG.md
================================================
# Kubo Changelogs
- [v0.42](docs/changelogs/v0.42.md)
- [v0.41](docs/changelogs/v0.41.md)
- [v0.40](docs/changelogs/v0.40.md)
- [v0.39](docs/changelogs/v0.39.md)
- [v0.38](docs/changelogs/v0.38.md)
- [v0.37](docs/changelogs/v0.37.md)
- [v0.36](docs/changelogs/v0.36.md)
- [v0.35](docs/changelogs/v0.35.md)
- [v0.34](docs/changelogs/v0.34.md)
- [v0.33](docs/changelogs/v0.33.md)
- [v0.32](docs/changelogs/v0.32.md)
- [v0.31](docs/changelogs/v0.31.md)
- [v0.30](docs/changelogs/v0.30.md)
- [v0.29](docs/changelogs/v0.29.md)
- [v0.28](docs/changelogs/v0.28.md)
- [v0.27](docs/changelogs/v0.27.md)
- [v0.26](docs/changelogs/v0.26.md)
- [v0.25](docs/changelogs/v0.25.md)
- [v0.24](docs/changelogs/v0.24.md)
- [v0.23](docs/changelogs/v0.23.md)
- [v0.22](docs/changelogs/v0.22.md)
- [v0.21](docs/changelogs/v0.21.md)
- [v0.20](docs/changelogs/v0.20.md)
- [v0.19](docs/changelogs/v0.19.md)
- [v0.18](docs/changelogs/v0.18.md)
- [v0.17](docs/changelogs/v0.17.md)
- [v0.16](docs/changelogs/v0.16.md)
- [v0.15](docs/changelogs/v0.15.md)
- [v0.14](docs/changelogs/v0.14.md)
- [v0.13](docs/changelogs/v0.13.md)
- [v0.12](docs/changelogs/v0.12.md)
- [v0.11](docs/changelogs/v0.11.md)
- [v0.10](docs/changelogs/v0.10.md)
- [v0.9](docs/changelogs/v0.9.md)
- [v0.8](docs/changelogs/v0.8.md)
- [v0.7](docs/changelogs/v0.7.md)
- [v0.6](docs/changelogs/v0.6.md)
- [v0.5](docs/changelogs/v0.5.md)
- [v0.4](docs/changelogs/v0.4.md)
- [v0.3](docs/changelogs/v0.3.md)
- [v0.2](docs/changelogs/v0.2.md)
================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to Kubo
**For development setup, building, and testing, see the [Developer Guide](docs/developer-guide.md).**
IPFS as a project, including Kubo and all of its modules, follows the [standard IPFS Community contributing guidelines](https://github.com/ipfs/community/blob/master/CONTRIBUTING.md).
We also adhere to the [Go IPFS Community contributing guidelines](https://github.com/ipfs/community/blob/master/CONTRIBUTING_GO.md) which provide additional information on how to collaborate and contribute to the Go implementation of IPFS.
We appreciate your time and attention for going over these. Please open an issue on ipfs/community if you have any questions.
Thank you.
================================================
FILE: Dockerfile
================================================
# syntax=docker/dockerfile:1
# Enables BuildKit with cache mounts for faster builds
FROM --platform=${BUILDPLATFORM:-linux/amd64} golang:1.25 AS builder
ARG TARGETOS TARGETARCH
ENV SRC_DIR=/kubo
# Cache go module downloads between builds for faster rebuilds
COPY go.mod go.sum $SRC_DIR/
WORKDIR $SRC_DIR
RUN --mount=type=cache,target=/go/pkg/mod \
go mod download
COPY . $SRC_DIR
# Preload an in-tree but disabled-by-default plugin by adding it to the IPFS_PLUGINS variable
# e.g. docker build --build-arg IPFS_PLUGINS="foo bar baz"
ARG IPFS_PLUGINS
# Allow for other targets to be built, e.g.: docker build --build-arg MAKE_TARGET="nofuse"
ARG MAKE_TARGET=build
# Build ipfs binary with cached go modules and build cache.
# mkdir .git/objects allows git rev-parse to read commit hash for version info
RUN --mount=type=cache,target=/go/pkg/mod \
--mount=type=cache,target=/root/.cache/go-build \
mkdir -p .git/objects \
&& GOOS=$TARGETOS GOARCH=$TARGETARCH GOFLAGS=-buildvcs=false make ${MAKE_TARGET} IPFS_PLUGINS=$IPFS_PLUGINS
# Extract required runtime tools from Debian.
# We use Debian instead of Alpine because we need glibc compatibility
# for the busybox base image we're using.
FROM debian:bookworm-slim AS utilities
RUN set -eux; \
apt-get update; \
apt-get install -y --no-install-recommends \
tini \
# Using gosu (~2MB) instead of su-exec (~20KB) because it's easier to
# install on Debian. Useful links:
# - https://github.com/ncopa/su-exec#why-reinvent-gosu
# - https://github.com/tianon/gosu/issues/52#issuecomment-441946745
gosu \
# fusermount enables IPFS mount commands
fuse \
ca-certificates \
; \
apt-get clean; \
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
# Final minimal image with shell for debugging (busybox provides sh)
FROM busybox:stable-glibc
# Copy ipfs binary, startup scripts, and runtime dependencies
ENV SRC_DIR=/kubo
COPY --from=utilities /usr/sbin/gosu /sbin/gosu
COPY --from=utilities /usr/bin/tini /sbin/tini
COPY --from=utilities /bin/fusermount /usr/local/bin/fusermount
COPY --from=utilities /etc/ssl/certs /etc/ssl/certs
COPY --from=builder $SRC_DIR/cmd/ipfs/ipfs /usr/local/bin/ipfs
COPY --from=builder --chmod=755 $SRC_DIR/bin/container_daemon /usr/local/bin/start_ipfs
COPY --from=builder $SRC_DIR/bin/container_init_run /usr/local/bin/container_init_run
# Set SUID for fusermount to enable FUSE mounting by non-root user
RUN chmod 4755 /usr/local/bin/fusermount
# Swarm P2P port (TCP/UDP) - expose publicly for peer connections
EXPOSE 4001 4001/udp
# API port - keep private, only for trusted clients
EXPOSE 5001
# Gateway port - can be exposed publicly via reverse proxy
EXPOSE 8080
# Swarm WebSockets - expose publicly for browser-based peers
EXPOSE 8081
# Create ipfs user (uid 1000) and required directories with proper ownership
ENV IPFS_PATH=/data/ipfs
RUN mkdir -p $IPFS_PATH /ipfs /ipns /mfs /container-init.d \
&& adduser -D -h $IPFS_PATH -u 1000 -G users ipfs \
&& chown ipfs:users $IPFS_PATH /ipfs /ipns /mfs /container-init.d
# Volume for IPFS repository data persistence
VOLUME $IPFS_PATH
# The default logging level
ENV GOLOG_LOG_LEVEL=""
# Entrypoint initializes IPFS repo if needed and configures networking.
# tini ensures proper signal handling and zombie process cleanup
ENTRYPOINT ["/sbin/tini", "--", "/usr/local/bin/start_ipfs"]
# Health check verifies IPFS daemon is responsive.
# Uses empty directory CID (QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn) as test
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD ipfs --api=/ip4/127.0.0.1/tcp/5001 dag stat /ipfs/QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn || exit 1
# Default: run IPFS daemon with auto-migration enabled
CMD ["daemon", "--migrate=true", "--agent-version-suffix=docker"]
================================================
FILE: FUNDING.json
================================================
{
"opRetro": {
"projectId": "0x7f330267969cf845a983a9d4e7b7dbcca5c700a5191269af377836d109e0bb69"
}
}
================================================
FILE: GNUmakefile
================================================
# General tools
SHELL=PATH='$(PATH)' /bin/sh
# enable second expansion
.SECONDEXPANSION:
include Rules.mk
================================================
FILE: LICENSE
================================================
This project is transitioning from an MIT-only license to a dual MIT/Apache-2.0 license.
Unless otherwise noted, all code contributed prior to 2019-05-06 and not contributed by
a user listed in [this signoff issue](https://github.com/ipfs/go-ipfs/issues/6302) is
licensed under MIT-only. All new contributions (and past contributions since 2019-05-06)
are licensed under a dual MIT/Apache-2.0 license.
MIT: https://www.opensource.org/licenses/mit
Apache-2.0: https://www.apache.org/licenses/LICENSE-2.0
================================================
FILE: LICENSE-APACHE
================================================
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
================================================
FILE: LICENSE-MIT
================================================
The MIT License (MIT)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
================================================
FILE: Makefile
================================================
all:
@gmake $@
.PHONY: all
.DEFAULT:
@gmake $@
================================================
FILE: README.md
================================================
<h1 align="center">
<br>
<a href="https://github.com/ipfs/kubo/blob/master/docs/logo/"><img src="https://user-images.githubusercontent.com/157609/250148884-d6d12db8-fdcf-4be3-8546-2550b69845d8.png" alt="Kubo logo" title="Kubo logo" width="200"></a>
<br>
Kubo: IPFS Implementation in Go
<br>
</h1>
<p align="center" style="font-size: 1.2rem;">The first implementation of IPFS.</p>
<p align="center">
<a href="https://ipfs.tech"><img src="https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square" alt="Official Part of IPFS Project"></a>
<a href="https://discuss.ipfs.tech"><img alt="Discourse Forum" src="https://img.shields.io/discourse/posts?server=https%3A%2F%2Fdiscuss.ipfs.tech"></a>
<a href="https://docs.ipfs.tech/community/"><img alt="Matrix" src="https://img.shields.io/matrix/ipfs-space%3Aipfs.io?server_fqdn=matrix.org"></a>
<a href="https://github.com/ipfs/kubo/actions"><img src="https://img.shields.io/github/actions/workflow/status/ipfs/kubo/gobuild.yml?branch=master"></a>
<a href="https://github.com/ipfs/kubo/releases"><img alt="GitHub release" src="https://img.shields.io/github/v/release/ipfs/kubo?filter=!*rc*"></a>
</p>
<hr />
<p align="center">
<b><a href="#what-is-kubo">What is Kubo?</a></b> | <b><a href="#quick-taste">Quick Taste</a></b> | <b><a href="#install">Install</a></b> | <b><a href="#documentation">Documentation</a></b> | <b><a href="#development">Development</a></b> | <b><a href="#getting-help">Getting Help</a></b>
</p>
## What is Kubo?
Kubo was the first [IPFS](https://docs.ipfs.tech/concepts/what-is-ipfs/) implementation and is the [most widely used one today](https://probelab.io/ipfs/topology/#chart-agent-types-avg). It takes an opinionated approach to content-addressing ([CIDs](https://docs.ipfs.tech/concepts/glossary/#cid), [DAGs](https://docs.ipfs.tech/concepts/glossary/#dag)) that maximizes interoperability: [UnixFS](https://docs.ipfs.tech/concepts/glossary/#unixfs) for files and directories, [HTTP Gateways](https://docs.ipfs.tech/concepts/glossary/#gateway) for web browsers, [Bitswap](https://docs.ipfs.tech/concepts/glossary/#bitswap) and [HTTP](https://specs.ipfs.tech/http-gateways/trustless-gateway/) for verifiable data transfer.
**Features:**
- Runs an IPFS node as a network service (LAN [mDNS](https://github.com/libp2p/specs/blob/master/discovery/mdns.md) and WAN [Amino DHT](https://docs.ipfs.tech/concepts/glossary/#dht))
- [Command-line interface](https://docs.ipfs.tech/reference/kubo/cli/) (`ipfs --help`)
- [WebUI](https://github.com/ipfs/ipfs-webui/#readme) for node management
- [HTTP Gateway](https://specs.ipfs.tech/http-gateways/) for trusted and [trustless](https://docs.ipfs.tech/reference/http/gateway/#trustless-verifiable-retrieval) content retrieval
- [HTTP RPC API](https://docs.ipfs.tech/reference/kubo/rpc/) to control the daemon
- [HTTP Routing V1](https://specs.ipfs.tech/routing/http-routing-v1/) client and server for [delegated routing](./docs/delegated-routing.md)
- [Content blocking](./docs/content-blocking.md) for public node operators
**Other IPFS implementations:** [Helia](https://github.com/ipfs/helia) (JavaScript), [more...](https://docs.ipfs.tech/concepts/ipfs-implementations/)
## Quick Taste
After [installing Kubo](#install), verify it works:
```console
$ ipfs init
generating ED25519 keypair...done
peer identity: 12D3KooWGcSLQdLDBi2BvoP8WnpdHvhWPbxpGcqkf93rL2XMZK7R
$ ipfs daemon &
Daemon is ready
$ echo "hello IPFS" | ipfs add -q --cid-version 1
bafkreicouv3sksjuzxb3rbb6rziy6duakk2aikegsmtqtz5rsuppjorxsa
$ ipfs cat bafkreicouv3sksjuzxb3rbb6rziy6duakk2aikegsmtqtz5rsuppjorxsa
hello IPFS
```
Verify this CID is provided by your node to the IPFS network: <https://check.ipfs.network/?cid=bafkreicouv3sksjuzxb3rbb6rziy6duakk2aikegsmtqtz5rsuppjorxsa>
See `ipfs add --help` for all import options. Ready for more? Follow the [command-line quick start](https://docs.ipfs.tech/how-to/command-line-quick-start/).
## Install
Follow the [official installation guide](https://docs.ipfs.tech/install/command-line/), or choose: [prebuilt binary](#official-prebuilt-binaries) | [Docker](#docker) | [package manager](#package-managers) | [from source](#build-from-source).
Prefer a GUI? Try [IPFS Desktop](https://docs.ipfs.tech/install/ipfs-desktop/) and/or [IPFS Companion](https://docs.ipfs.tech/install/ipfs-companion/).
### Minimal System Requirements
Kubo runs on most Linux, macOS, and Windows systems. For optimal performance, we recommend at least 6 GB of RAM and 2 CPU cores (more is ideal, as Kubo is highly parallel).
> [!IMPORTANT]
> Larger pinsets require additional memory, with an estimated ~1 GiB of RAM per 20 million items for reproviding to the Amino DHT.
> [!CAUTION]
> Systems with less than the recommended memory may experience instability, frequent OOM errors or restarts, and missing data announcement (reprovider window), which can make data fully or partially inaccessible to other peers. Running Kubo on underprovisioned hardware is at your own risk.
### Official Prebuilt Binaries
Download from https://dist.ipfs.tech#kubo or [GitHub Releases](https://github.com/ipfs/kubo/releases/latest).
### Docker
Official images are published at https://hub.docker.com/r/ipfs/kubo/: [](https://hub.docker.com/r/ipfs/kubo/)
#### 🟢 Release Images
Use these for production deployments.
- `latest` and [`release`](https://hub.docker.com/r/ipfs/kubo/tags?name=release) always point at [the latest stable release](https://github.com/ipfs/kubo/releases/latest)
- [`vN.N.N`](https://hub.docker.com/r/ipfs/kubo/tags?name=v) points at a specific [release tag](https://github.com/ipfs/kubo/releases)
```console
$ docker pull ipfs/kubo:latest
$ docker run --rm -it --net=host ipfs/kubo:latest
```
To [customize your node](https://docs.ipfs.tech/install/run-ipfs-inside-docker/#customizing-your-node), pass config via `-e` or mount scripts in `/container-init.d`.
#### 🟠 Developer Preview Images
For internal testing, not intended for production.
- [`master-latest`](https://hub.docker.com/r/ipfs/kubo/tags?name=master-latest) points at `HEAD` of [`master`](https://github.com/ipfs/kubo/commits/master/)
- [`master-YYYY-DD-MM-GITSHA`](https://hub.docker.com/r/ipfs/kubo/tags?name=master-2) points at a specific commit
#### 🔴 Internal Staging Images
For testing arbitrary commits and experimental patches (force push to `staging` branch).
- [`staging-latest`](https://hub.docker.com/r/ipfs/kubo/tags?name=staging-latest) points at `HEAD` of [`staging`](https://github.com/ipfs/kubo/commits/staging/)
- [`staging-YYYY-DD-MM-GITSHA`](https://hub.docker.com/r/ipfs/kubo/tags?name=staging-2) points at a specific commit
### Build from Source

```bash
git clone https://github.com/ipfs/kubo.git
cd kubo
make build # creates cmd/ipfs/ipfs
make install # installs to $GOPATH/bin/ipfs
```
See the [Developer Guide](docs/developer-guide.md) for details, Windows instructions, and troubleshooting.
### Package Managers
Kubo is available in community-maintained packages across many operating systems, Linux distributions, and package managers. See [Repology](https://repology.org/project/kubo/versions) for the full list: [](https://repology.org/project/kubo/versions)
> [!WARNING]
> These packages are maintained by third-party volunteers. The IPFS Project and Kubo maintainers are not responsible for their contents or supply chain security. For increased security, [build from source](#build-from-source).
#### Linux
| Distribution | Install | Version |
|--------------|---------|---------|
| Ubuntu | [PPA](https://launchpad.net/~twdragon/+archive/ubuntu/ipfs): `sudo apt install ipfs-kubo` | [](https://launchpad.net/~twdragon/+archive/ubuntu/ipfs) |
| Arch | `pacman -S kubo` | [](https://archlinux.org/packages/extra/x86_64/kubo/) |
| Fedora | [COPR](https://copr.fedorainfracloud.org/coprs/taw/ipfs/): `dnf install kubo` | [](https://copr.fedorainfracloud.org/coprs/taw/ipfs/) |
| Nix | `nix-env -i kubo` | [](https://search.nixos.org/packages?query=kubo) |
| Gentoo | `emerge -a net-p2p/kubo` | [](https://packages.gentoo.org/packages/net-p2p/kubo) |
| openSUSE | `zypper install kubo` | [](https://software.opensuse.org/package/kubo) |
| Solus | `sudo eopkg install kubo` | [](https://packages.getsol.us/shannon/k/kubo/) |
| Guix | `guix install kubo` | [](https://packages.guix.gnu.org/packages/kubo/) |
| _other_ | [See Repology for the full list](https://repology.org/project/kubo/versions) | |
~~Snap~~ no longer supported ([#8688](https://github.com/ipfs/kubo/issues/8688))
#### macOS
| Manager | Install | Version |
|---------|---------|---------|
| Homebrew | `brew install ipfs` | [](https://formulae.brew.sh/formula/ipfs) |
| MacPorts | `sudo port install ipfs` | [](https://ports.macports.org/port/ipfs/) |
| Nix | `nix-env -i kubo` | [](https://search.nixos.org/packages?query=kubo) |
| _other_ | [See Repology for the full list](https://repology.org/project/kubo/versions) | |
#### Windows
| Manager | Install | Version |
|---------|---------|---------|
| Scoop | `scoop install kubo` | [](https://scoop.sh/#/apps?q=kubo) |
| _other_ | [See Repology for the full list](https://repology.org/project/kubo/versions) | |
~~Chocolatey~~ no longer supported ([#9341](https://github.com/ipfs/kubo/issues/9341))
## Documentation
| Topic | Description |
|-------|-------------|
| [Configuration](docs/config.md) | All config options reference |
| [Environment variables](docs/environment-variables.md) | Runtime settings via env vars |
| [Experimental features](docs/experimental-features.md) | Opt-in features in development |
| [HTTP Gateway](docs/gateway.md) | Path, subdomain, and trustless gateway setup |
| [HTTP RPC clients](docs/http-rpc-clients.md) | Client libraries for Go, JS |
| [Delegated routing](docs/delegated-routing.md) | Multi-router and HTTP routing |
| [Metrics & monitoring](docs/metrics.md) | Prometheus metrics |
| [Content blocking](docs/content-blocking.md) | Denylist for public nodes |
| [Customizing](docs/customizing.md) | Unsure if use Plugins, Boxo, or fork? |
| [Debug guide](docs/debug-guide.md) | CPU profiles, memory analysis, tracing |
| [Changelogs](docs/changelogs/) | Release notes for each version |
| [All documentation](https://github.com/ipfs/kubo/tree/master/docs) | Full list of docs |
## Development
See the [Developer Guide](docs/developer-guide.md) for build instructions, testing, and contribution workflow. AI coding agents should follow [AGENTS.md](AGENTS.md).
## Getting Help
- [IPFS Forum](https://discuss.ipfs.tech) - community support, questions, and discussion
- [Community](https://docs.ipfs.tech/community/) - chat, events, and working groups
- [GitHub Issues](https://github.com/ipfs/kubo/issues) - bug reports for Kubo specifically
- [IPFS Docs Issues](https://github.com/ipfs/ipfs-docs/issues) - documentation issues
## Security Issues
See [`SECURITY.md`](SECURITY.md).
## Contributing
[](https://github.com/ipfs/community/blob/master/CONTRIBUTING.md)
We welcome contributions. See [CONTRIBUTING.md](CONTRIBUTING.md) and the [Developer Guide](docs/developer-guide.md).
This repository follows the IPFS [Code of Conduct](https://github.com/ipfs/community/blob/master/code-of-conduct.md).
## Maintainer Info
<a href="https://ipshipyard.com/"><img align="right" src="https://github.com/user-attachments/assets/39ed3504-bb71-47f6-9bf8-cb9a1698f272" /></a>
> [!NOTE]
> Kubo is maintained by the [Shipyard](https://ipshipyard.com/) team.
>
> [Release Process](https://ipshipyard.notion.site/Kubo-Release-Process-6dba4f5755c9458ab5685eeb28173778)
## License
Dual-licensed under Apache 2.0 and MIT:
- [LICENSE-APACHE](LICENSE-APACHE)
- [LICENSE-MIT](LICENSE-MIT)
================================================
FILE: Rules.mk
================================================
TGT_BIN :=
CLEAN :=
COVERAGE :=
DISTCLEAN :=
TEST :=
TEST_SHORT :=
GOCC ?= go
PROTOC ?= protoc
all: help # all has to be first defined target
.PHONY: all
include mk/git.mk # has to be before tarball.mk
include mk/tarball.mk
include mk/util.mk
include mk/golang.mk
# -------------------- #
# extra properties #
# -------------------- #
ifeq ($(TEST_FUSE),0)
GOTAGS += nofuse
endif
export LIBP2P_TCP_REUSEPORT=false
# -------------------- #
# sub-files #
# -------------------- #
dir := bin
include $(dir)/Rules.mk
# tests need access to rules from plugin
dir := plugin
include $(dir)/Rules.mk
dir := test
include $(dir)/Rules.mk
dir := cmd/ipfs
include $(dir)/Rules.mk
# include this file only if coverage target is executed
# it is quite expensive
ifneq ($(filter coverage% clean distclean test/unit/gotest.junit.xml,$(MAKECMDGOALS)),)
# has to be after cmd/ipfs due to PATH
dir := coverage
include $(dir)/Rules.mk
endif
# -------------------- #
# universal rules #
# -------------------- #
%.pb.go: %.proto bin/protoc-gen-gogofaster
$(PROTOC) --gogofaster_out=. --proto_path=.:$(GOPATH)/src:$(dir $@) $<
# -------------------- #
# core targets #
# -------------------- #
build: $(TGT_BIN)
.PHONY: build
clean:
rm -rf $(CLEAN)
.PHONY: clean
mod_tidy:
@find . -name go.mod -execdir $(GOCC) mod tidy \;
.PHONY: mod_tidy
coverage: $(COVERAGE)
.PHONY: coverage
distclean: clean
rm -rf $(DISTCLEAN)
git clean -ffxd
.PHONY: distclean
test: $(TEST)
.PHONY: test
test_short: $(TEST_SHORT)
.PHONY: test_short
deps:
.PHONY: deps
nofuse: GOTAGS += nofuse
nofuse: build
.PHONY: nofuse
install: cmd/ipfs-install
.PHONY: install
install_unsupported: install
@echo "/=======================================================================\\"
@echo '| |'
@echo '| `make install_unsupported` is deprecated, use `make install` instead. |'
@echo '| |'
@echo "\\=======================================================================/"
.PHONY: install_unsupported
uninstall:
$(GOCC) clean -i ./cmd/ipfs
.PHONY: uninstall
supported:
@echo "Currently supported platforms (from .github/build-platforms.yml):"
@grep '^ - ' .github/build-platforms.yml | sed 's/^ - //' || (echo "Error: .github/build-platforms.yml not found"; exit 1)
.PHONY: supported
help:
@echo 'DEPENDENCY TARGETS:'
@echo ''
@echo ' deps - Download dependencies using bundled gx'
@echo ' test_sharness_deps - Download and build dependencies for sharness'
@echo ''
@echo 'BUILD TARGETS:'
@echo ''
@echo ' all - print this help message'
@echo ' build - Build binary at ./cmd/ipfs/ipfs'
@echo ' nofuse - Build binary with no fuse support'
@echo ' install - Build binary and install into $$GOBIN'
@echo ' mod_tidy - Remove unused dependencies from go.mod files'
# @echo ' dist_install - TODO: c.f. ./cmd/ipfs/dist/README.md'
@echo ''
@echo 'CLEANING TARGETS:'
@echo ''
@echo ' clean - Remove files generated by build'
@echo ' distclean - Remove files that are no part of a repository'
@echo ' uninstall - Remove binary from $$GOPATH/bin'
@echo ''
@echo 'TESTING TARGETS:'
@echo ''
@echo ' test - Run all tests (test_go_fmt, test_unit, test_cli, test_sharness)'
@echo ' test_short - Run fast tests (test_go_fmt, test_unit)'
@echo ' test_unit - Run unit tests with coverage (excludes test/cli)'
@echo ' test_cli - Run CLI integration tests (requires built binary)'
@echo ' test_go_fmt - Check Go source formatting'
@echo ' test_go_build - Build kubo for all platforms from .github/build-platforms.yml'
@echo ' test_go_lint - Run golangci-lint'
@echo ' test_sharness - Run sharness tests'
@echo ' coverage - Collect coverage info from unit tests and sharness'
@echo
.PHONY: help
================================================
FILE: SECURITY.md
================================================
# Security Policy
The IPFS protocol and its implementations are still in heavy development. This
means that there may be problems in our protocols, or there may be mistakes in
our implementations. We take security
vulnerabilities very seriously. If you discover a security issue, please bring
it to our attention right away!
## Reporting a Vulnerability
If you find a vulnerability that may affect live deployments -- for example, by
exposing a remote execution exploit -- please **send your report privately** to
security@ipfs.io. Please **DO NOT file a public issue**.
If the issue is a protocol weakness that cannot be immediately exploited or
something not yet deployed, just discuss it openly.
## Reporting a non security bug
For non-security bugs, please simply file a GitHub [issue](https://github.com/ipfs/go-ipfs/issues/new/choose).
================================================
FILE: assets/README.md
================================================
# Assets loaded in with IPFS
This directory contains the go-ipfs assets:
* Getting started documentation (`init-doc`).
================================================
FILE: assets/assets.go
================================================
package assets
import (
"embed"
"fmt"
gopath "path"
"github.com/ipfs/kubo/core"
"github.com/ipfs/kubo/core/coreapi"
"github.com/ipfs/boxo/files"
cid "github.com/ipfs/go-cid"
)
//go:embed init-doc
var Asset embed.FS
// initDocPaths lists the paths for the docs we want to seed during --init.
var initDocPaths = []string{
gopath.Join("init-doc", "about"),
gopath.Join("init-doc", "readme"),
gopath.Join("init-doc", "help"),
gopath.Join("init-doc", "contact"),
gopath.Join("init-doc", "security-notes"),
gopath.Join("init-doc", "quick-start"),
gopath.Join("init-doc", "ping"),
}
// SeedInitDocs adds the list of embedded init documentation to the passed node, pins it and returns the root key.
func SeedInitDocs(nd *core.IpfsNode) (cid.Cid, error) {
return addAssetList(nd, initDocPaths)
}
func addAssetList(nd *core.IpfsNode, l []string) (cid.Cid, error) {
api, err := coreapi.NewCoreAPI(nd)
if err != nil {
return cid.Cid{}, err
}
dirMap := map[string]files.Node{}
for _, p := range l {
d, err := Asset.ReadFile(p)
if err != nil {
return cid.Cid{}, fmt.Errorf("assets: could load Asset '%s': %s", p, err)
}
dirMap[gopath.Base(p)] = files.NewBytesFile(d)
}
basePath, err := api.Unixfs().Add(nd.Context(), files.NewMapDirectory(dirMap))
if err != nil {
return cid.Cid{}, err
}
if err := api.Pin().Add(nd.Context(), basePath); err != nil {
return cid.Cid{}, err
}
return basePath.RootCid(), nil
}
================================================
FILE: assets/init-doc/about
================================================
IPFS -- Inter-Planetary File system
IPFS is a global, versioned, peer-to-peer filesystem. It combines good ideas
from Git, BitTorrent, Kademlia, SFS, and the Web. It is like a single bit-
torrent swarm, exchanging git objects. IPFS provides an interface as simple
as the HTTP web, but with permanence built-in. You can also mount the world
at /ipfs.
IPFS is a protocol:
- defines a content-addressed file system
- coordinates content delivery
- combines Kademlia + BitTorrent + Git
IPFS is a filesystem:
- has directories and files
- mountable filesystem (via FUSE)
IPFS is a web:
- can be used to view documents like the web
- files accessible via HTTP at `http://ipfs.io/<path>`
- browsers or extensions can learn to use `ipfs://` directly
- hash-addressed content guarantees the authenticity
IPFS is modular:
- connection layer over any network protocol
- routing layer
- uses a routing layer DHT (kademlia/coral)
- uses a path-based naming service
- uses BitTorrent-inspired block exchange
IPFS uses crypto:
- cryptographic-hash content addressing
- block-level deduplication
- file integrity + versioning
- filesystem-level encryption + signing support
IPFS is p2p:
- worldwide peer-to-peer file transfers
- completely decentralized architecture
- **no** central point of failure
IPFS is a CDN:
- add a file to the filesystem locally, and it's now available to the world
- caching-friendly (content-hash naming)
- BitTorrent-based bandwidth distribution
IPFS has a name service:
- IPNS, an SFS inspired name system
- global namespace based on PKI
- serves to build trust chains
- compatible with other NSes
- can map DNS, .onion, .bit, etc to IPNS
================================================
FILE: assets/init-doc/contact
================================================
Come hang out in our IRC chat room if you have any questions.
Contact the ipfs dev team:
- Bugs: https://github.com/ipfs/go-ipfs/issues
- Help: irc.freenode.org/#ipfs
- Email: dev@ipfs.io
================================================
FILE: assets/init-doc/docs/index
================================================
Index
================================================
FILE: assets/init-doc/help
================================================
Some helpful resources for finding your way around ipfs:
- quick-start: a quick show of various ipfs features.
- ipfs commands: a list of all commands
- ipfs --help: every command describes itself
- https://github.com/ipfs/go-ipfs -- the src repository
- #ipfs on irc.freenode.org -- the community IRC channel
================================================
FILE: assets/init-doc/ping
================================================
ipfs
================================================
FILE: assets/init-doc/quick-start
================================================
# 0.1 - Quick Start
This is a set of short examples with minimal explanation. It is meant as
a "quick start".
Add a file to ipfs:
echo "hello world" >hello
ipfs add hello
View it:
ipfs cat <the-hash-you-got-here>
Try a directory:
mkdir foo
mkdir foo/bar
echo "baz" > foo/baz
echo "baz" > foo/bar/baz
ipfs add -r foo
View things:
ipfs ls <the-hash-here>
ipfs ls <the-hash-here>/bar
ipfs cat <the-hash-here>/baz
ipfs cat <the-hash-here>/bar/baz
ipfs cat <the-hash-here>/bar
ipfs ls <the-hash-here>/baz
References:
ipfs refs <the-hash-here>
ipfs refs -r <the-hash-here>
ipfs refs --help
Get:
ipfs get <the-hash-here> -o foo2
diff foo foo2
Objects:
ipfs object get <the-hash-here>
ipfs object get <the-hash-here>/foo2
ipfs object --help
Pin + GC:
ipfs pin add <the-hash-here>
ipfs repo gc
ipfs ls <the-hash-here>
ipfs pin rm <the-hash-here>
ipfs repo gc
Daemon:
ipfs daemon (in another terminal)
ipfs id
Network:
(must be online)
ipfs swarm peers
ipfs id
ipfs cat <hash-of-remote-object>
Mount:
(warning: fuse is finicky!)
ipfs mount
cd /ipfs/<the-hash-here>
ls
Tool:
ipfs version
ipfs update
ipfs commands
ipfs config --help
open http://localhost:5001/webui
Browse:
WebUI:
http://localhost:5001/webui
video:
http://localhost:8080/ipfs/QmVc6zuAneKJzicnJpfrqCH9gSy6bz54JhcypfJYhGUFQu/play#/ipfs/QmTKZgRNwDNZwHtJSjCp6r5FYefzpULfy37JvMt9DwvXse
images:
http://localhost:8080/ipfs/QmZpc3HvfjEXvLWGQPWbHk3AjD5j8NEN4gmFN8Jmrd5g83/cs
markdown renderer app:
http://localhost:8080/ipfs/QmX7M9CiYXjVeFnkfVGf3y5ixTZ2ACeSGyL1vBJY1HvQPp/mdown
================================================
FILE: assets/init-doc/readme
================================================
Hello and Welcome to IPFS!
██╗██████╗ ███████╗███████╗
██║██╔══██╗██╔════╝██╔════╝
██║██████╔╝█████╗ ███████╗
██║██╔═══╝ ██╔══╝ ╚════██║
██║██║ ██║ ███████║
╚═╝╚═╝ ╚═╝ ╚══════╝
If you're seeing this, you have successfully installed
IPFS and are now interfacing with the ipfs merkledag!
-------------------------------------------------------
| Warning: |
| This is alpha software. Use at your own discretion! |
| Much is missing or lacking polish. There are bugs. |
| Not yet secure. Read the security notes for more. |
-------------------------------------------------------
Check out some of the other files in this directory:
./about
./help
./quick-start <-- usage examples
./readme <-- this file
./security-notes
================================================
FILE: assets/init-doc/security-notes
================================================
IPFS Alpha Security Notes
We try hard to ensure our system is safe and robust, but all software
has bugs, especially new software. This distribution is meant to be an
alpha preview, don't use it for anything mission critical.
Please note the following:
- This is alpha software and has not been audited. It is our goal
to conduct a proper security audit once we close in on a 1.0 release.
- ipfs is a networked program, and may have serious undiscovered
vulnerabilities. It is written in Go, and we do not execute any
user provided data. But please point any problems out to us in a
github issue, or email security@ipfs.io privately.
- security@ipfs.io GPG key:
- 4B9665FB 92636D17 7C7A86D3 50AAE8A9 59B13AF3
- https://pgp.mit.edu/pks/lookup?op=get&search=0x50AAE8A959B13AF3
- ipfs uses encryption for all communication, but it's NOT PROVEN SECURE
YET! It may be totally broken. For now, the code is included to make
sure we benchmark our operations with encryption in mind. In the future,
there will be an "unsafe" mode for high performance intranet apps.
If this is a blocking feature for you, please contact us.
================================================
FILE: bin/Rules.mk
================================================
include mk/header.mk
dist_root_$(d)="/ipfs/QmPrXH9jRVwvd7r5MC5e6nV4uauQGzLk1i2647Ye9Vbbwe"
TGTS_$(d) := $(d)/protoc
DISTCLEAN += $(d)/protoc $(d)/tmp
PATH := $(realpath $(d)):$(PATH)
$(TGTS_$(d)):
rm -f $@$(?exe)
ifeq ($(WINDOWS),1)
cp $^$(?exe) $@$(?exe)
else
ln -s $(notdir $^) $@
endif
bin/protoc-gen-gogofaster:
$(call go-build,github.com/gogo/protobuf/protoc-gen-gogofaster)
CLEAN += $(TGTS_$(d))
include mk/footer.mk
================================================
FILE: bin/archive-branches.sh
================================================
#!/usr/bin/env bash
set -euo pipefail
IFS=$'\n\t'
auth=""
#auth="-u kubuxu:$GH_TOKEN"
org=ipfs
repo=go-ipfs
arch_repo=go-ipfs-archived
api_repo="repos/$org/$repo"
exclusions=(
'master'
'release'
'feat/zcash'
'feat/ai-mirror'
)
gh_api_next() {
links=$(grep '^Link:' | sed -e 's/Link: //' -e 's/, /\n/g')
echo "$links" | grep '; rel="next"' >/dev/null || return
link=$(echo "$links" | grep '; rel="next"' | sed -e 's/^<//' -e 's/>.*//')
curl $auth -f -sD >(gh_api_next) "$link"
}
gh_api() {
curl $auth -f -sD >(gh_api_next) "https://api.github.com/$1" | jq -s '[.[] | .[]]'
}
pr_branches() {
gh_api "$api_repo/pulls" | jq -r '.[].head.label | select(test("^ipfs:"))' \
| sed 's/^ipfs://'
}
origin_refs() {
format=${1-'%(refname:short)'}
git for-each-ref --format "$format" refs/remotes/origin | sed 's|^origin/||'
}
active_branches() {
origin_refs '%(refname:short) %(committerdate:unix)' |awk \
' BEGIN { monthAgo = systime() - 31*24*60*60 }
{ if ($2 > monthAgo) print $1 }
'
}
git remote add archived "git@github.com:$org/$arch_repo.git" || true
branches_to_move="$(cat <(active_branches) <(pr_branches) <((IFS=$'\n'; echo "${exclusions[*]}")) | sort -u | comm - <(origin_refs | sort) -13)"
echo "================"
printf "%s\n" "$branches_to_move"
echo "================"
echo "Please confirm move of above branches [y/N]:"
read line
case $line in
[Yy]|[Yy][Ee][Ss]) ;;
*) exit 1 ;;
esac
printf "%s\n" "$branches_to_move" | \
while read -r ref; do
git push archived "origin/$ref:refs/heads/$ref/$(date --rfc-3339=date)"
git push origin --delete "$ref"
done
================================================
FILE: bin/container_daemon
================================================
#!/bin/sh
set -e
user=ipfs
repo="$IPFS_PATH"
if [ "$(id -u)" -eq 0 ]; then
echo "Changing user to $user"
# ensure folder is writable
gosu "$user" test -w "$repo" || chown -R -- "$user" "$repo"
# restart script with new privileges
exec gosu "$user" "$0" "$@"
fi
# 2nd invocation with regular user
ipfs version
if [ -e "$repo/config" ]; then
echo "Found IPFS fs-repo at $repo"
else
ipfs init ${IPFS_PROFILE:+"--profile=$IPFS_PROFILE"}
ipfs config Addresses.API /ip4/0.0.0.0/tcp/5001
ipfs config Addresses.Gateway /ip4/0.0.0.0/tcp/8080
# Set up the swarm key, if provided
SWARM_KEY_FILE="$repo/swarm.key"
SWARM_KEY_PERM=0400
# Create a swarm key from a given environment variable
if [ -n "$IPFS_SWARM_KEY" ] ; then
echo "Copying swarm key from variable..."
printf "%s\n" "$IPFS_SWARM_KEY" >"$SWARM_KEY_FILE" || exit 1
chmod $SWARM_KEY_PERM "$SWARM_KEY_FILE"
fi
# Unset the swarm key variable
unset IPFS_SWARM_KEY
# Check during initialization if a swarm key was provided and
# copy it to the ipfs directory with the right permissions
# WARNING: This will replace the swarm key if it exists
if [ -n "$IPFS_SWARM_KEY_FILE" ] ; then
echo "Copying swarm key from file..."
install -m $SWARM_KEY_PERM "$IPFS_SWARM_KEY_FILE" "$SWARM_KEY_FILE" || exit 1
fi
# Unset the swarm key file variable
unset IPFS_SWARM_KEY_FILE
fi
find /container-init.d -maxdepth 1 \( -type f -o -type l \) -iname '*.sh' -print0 | sort -z | xargs -n 1 -0 -r container_init_run
exec ipfs "$@"
================================================
FILE: bin/container_init_run
================================================
#!/bin/sh
set -e
# used by the container startup script for running initialization scripts
script="$1"
if [ -x "$script" ] ; then
printf "Executing '%s'...\n" "$script"
"$script"
else
printf "Sourcing '%s'...\n" "$script"
. "$script"
fi
================================================
FILE: bin/dist_get
================================================
#!/bin/sh
GOCC=${GOCC=go}
die() {
echo "$@" >&2
exit 1
}
have_binary() {
type "$1" > /dev/null 2> /dev/null
}
check_writable() {
printf "" > "$1" && rm "$1"
}
try_download() {
url="$1"
output="$2"
command="$3"
util_name="$(set -- $command; echo "$1")"
if ! have_binary "$util_name"; then
return 1
fi
printf '==> Using %s to download "%s" to "%s"\n' "$util_name" "$url" "$output"
if eval "$command"; then
echo "==> Download complete!"
return
else
echo "error: couldn't download with $util_name ($?)"
return 1
fi
}
download() {
dl_url="$1"
dl_output="$2"
test "$#" -eq "2" || die "download requires exactly two arguments, was given $@"
if ! check_writable "$dl_output"; then
die "download error: cannot write to $dl_output"
fi
try_download "$dl_url" "$dl_output" "wget '$dl_url' -O '$dl_output'" && return
try_download "$dl_url" "$dl_output" "curl --silent --fail --output '$dl_output' '$dl_url'" && return
try_download "$dl_url" "$dl_output" "fetch '$dl_url' -o '$dl_output'" && return
try_download "$dl_url" "$dl_output" "http '$dl_url' > '$dl_output'" && return
try_download "$dl_url" "$dl_output" "ftp -o '$dl_output' '$dl_url'" && return
die "Unable to download $dl_url. exiting."
}
unarchive() {
ua_archivetype="$1"
ua_infile="$2"
ua_outfile="$3"
ua_distname="$4"
ua_binpostfix=""
ua_os=$(uname -o)
if [ "$ua_os" = "Msys" ] || [ "$ua_os" = "Cygwin" ] ; then
ua_binpostfix=".exe"
fi
ua_outfile="$ua_outfile$ua_binpostfix"
if ! check_writable "$ua_outfile"; then
die "unarchive error: cannot write to $ua_outfile"
fi
case "$ua_archivetype" in
tar.gz)
if have_binary tar; then
echo "==> using 'tar' to extract binary from archive"
< "$ua_infile" tar -Ozxf - "$ua_distname/$ua_distname$ua_binpostfix" > "$ua_outfile" \
|| die "tar has failed"
else
die "no binary on system for extracting tar files"
fi
;;
zip)
if have_binary unzip; then
echo "==> using 'unzip' to extract binary from archive"
unzip -p "$ua_infile" "$ua_distname/$ua_distname$ua_binpostfix" > "$ua_outfile" \
|| die "unzip has failed"
else
die "no installed method for extracting .zip archives"
fi
;;
*)
die "unrecognized archive type '$ua_archivetype'"
esac
chmod +x "$ua_outfile" || die "chmod has failed"
}
get_go_vars() {
if [ ! -z "$GOOS" ] && [ ! -z "$GOARCH" ]; then
printf "%s-%s" "$GOOS" "$GOARCH"
elif have_binary go; then
printf "%s-%s" "$($GOCC env GOOS)" "$($GOCC env GOARCH)"
else
die "no way of determining system GOOS and GOARCH\nPlease manually set GOOS and GOARCH then retry."
fi
}
mkurl() {
m_root="$1"
m_name="$2"
m_vers="$3"
m_archive="$4"
m_govars=$(get_go_vars) || die "could not get go env vars"
echo "https://ipfs.io$m_root/$m_name/$m_vers/${m_name}_${m_vers}_$m_govars.$m_archive"
}
distroot="$1"
distname="$2"
outpath="$3"
version="$4"
if [ -z "$distroot" ] || [ -z "$distname" ] || [ -z "$outpath" ] || [ -z "$version" ]; then
die "usage: dist_get <distroot> <distname> <outpath> <version>"
fi
case $version in
v*)
# correct input
;;
*)
echo "invalid version '$version'" >&2
die "versions must begin with 'v', for example: v0.4.0"
;;
esac
# TODO: don't depend on the go tool being installed to detect this
goenv=$(get_go_vars) || die "could not get go env vars"
case $goenv in
linux-*)
archive="tar.gz"
;;
darwin-*)
archive="tar.gz"
;;
windows-*)
archive="zip"
;;
freebsd-*)
archive="tar.gz"
;;
openbsd-*)
archive="tar.gz"
;;
*)
echo "unrecognized system environment: $goenv" >&2
die "currently only linux, darwin, windows and freebsd are supported by this script"
esac
mkdir -p bin/tmp
url=$(mkurl "$distroot" "$distname" "$version" "$archive")
tmpfi="bin/tmp/$distname.$archive"
download "$url" "$tmpfi"
if [ $? -ne 0 ]; then
die "failed to download $url to $tmpfi"
fi
unarchive "$archive" "$tmpfi" "$outpath" "$distname"
if [ $? -ne 0 ]; then
die "failed to extract archive $tmpfi"
fi
================================================
FILE: bin/gencmdref
================================================
#!/usr/bin/env python
import os
import sys
import datetime
from subprocess import check_output
def run(cmd):
return check_output(cmd)
def main():
lines = [l.strip() for l in sys.stdin]
print '# ipfs command reference'
print ''
print 'generated on', datetime.datetime.now()
print ''
for line in lines:
print '- [%s](#%s)' % (line, line.replace(' ', '-'))
print ''
for line in lines:
print '## %s' % line
print ''
print '```'
print run((line + ' --help').split(' ')).strip()
print '```'
print ''
if __name__ == '__main__':
if '-h' in sys.argv or '--help' in sys.argv:
print 'usage: ipfs commands | %s >cmdref.md' % sys.argv[0]
print 'outputs all commands with --help to a markdown file'
exit(0)
main()
================================================
FILE: bin/get-docker-tags.sh
================================================
#!/usr/bin/env bash
# get-docker-tags.sh
#
# Usage:
# ./get-docker-tags.sh <build number> <git commit sha1> <git branch name> [git tag name]
#
# Example:
#
# # get tag for the master branch
# ./get-docker-tags.sh $(date -u +%F) testingsha master
#
# # get tag for a release tag
# ./get-docker-tags.sh $(date -u +%F) testingsha release v0.5.0
#
set -euo pipefail
if [[ $# -lt 1 ]] ; then
echo 'At least 1 arg required.'
echo 'Usage:'
echo './get-docker-tags.sh <build number> [git commit sha1] [git branch name] [git tag name]'
exit 1
fi
BUILD_NUM=$1
GIT_SHA1=${2:-$(git rev-parse HEAD)}
GIT_SHA1_SHORT=$(echo "$GIT_SHA1" | cut -c 1-7)
GIT_BRANCH=${3:-$(git symbolic-ref -q --short HEAD || echo "unknown")}
GIT_TAG=${4:-$(git describe --tags --exact-match 2> /dev/null || echo "")}
IMAGE_NAME=${IMAGE_NAME:-ipfs/kubo}
echoImageName () {
local IMAGE_TAG=$1
echo "$IMAGE_NAME:$IMAGE_TAG"
}
if [[ $GIT_TAG =~ ^v[0-9]+\.[0-9]+\.[0-9]+-rc ]]; then
echoImageName "$GIT_TAG"
elif [[ $GIT_TAG =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
echoImageName "$GIT_TAG"
echoImageName "latest"
echoImageName "release" # see: https://github.com/ipfs/kubo/issues/3999#issuecomment-742228981
elif [[ $GIT_BRANCH =~ ^bifrost-.* ]]; then
# sanitize the branch name since docker tags have stricter char limits than git branch names
branch=$(echo "$GIT_BRANCH" | tr '/' '-' | tr --delete --complement '[:alnum:]-')
echoImageName "${branch}-${BUILD_NUM}-${GIT_SHA1_SHORT}"
elif [ "$GIT_BRANCH" = "master" ] || [ "$GIT_BRANCH" = "staging" ]; then
echoImageName "${GIT_BRANCH}-${BUILD_NUM}-${GIT_SHA1_SHORT}"
echoImageName "${GIT_BRANCH}-latest"
else
echo "Nothing to do. No docker tag defined for branch: $GIT_BRANCH, tag: $GIT_TAG"
fi
================================================
FILE: bin/graphmd
================================================
#!/bin/sh
if [ "$#" -ne 1 ]; then
echo "usage: $0 <ipfs-path>..."
echo "output merkledag links in graphviz dot"
echo ""
echo "use it with dot:"
echo " $0 QmZPAMWUfLD95GsdorXt9hH7aVrarb2SuLDMVVe6gABYmx | dot -Tsvg"
echo " $0 QmZPAMWUfLD95GsdorXt9hH7aVrarb2SuLDMVVe6gABYmx | dot -Tpng"
echo " $0 QmZPAMWUfLD95GsdorXt9hH7aVrarb2SuLDMVVe6gABYmx | dot -Tpdf"
echo ""
exit 1
fi
src='<src> [fontsize=8 shape=box];'
dst='<dst> [fontsize=8 shape=box];'
edge='<src> -> <dst> [label="<linkname>"];'
fmt="$src
$dst
$edge"
echo "digraph {"
echo " graph [rankdir=LR];"
ipfs refs -r --format="$fmt" "$@" | awk '{ print "\t" $0 }'
# ipfs refs -r --format="$fmt" "$@" | awk '{ print "\t" $0 }' | unflatten -l3
echo "}"
================================================
FILE: bin/ipns-republish
================================================
#!/bin/bash
if [ "$#" -ne 1 ]; then
echo "usage: $0 <ipfs-or-ipns-path>"
echo "republishes an ipns name every 20 minutes"
echo "(this is an icky stop-gap until ipfs nodes do it for you)"
echo ""
echo "example:"
echo " > $0 QmSYCpuKPbPQ2iFr2swJj2hvz7wQUXfPBXPiuVsQdL5FEs"
echo ""
exit 1
fi
# must be run online.
ipfs swarm peers >/dev/null
if [ $? -ne 0 ]; then
echo "error: ipfs daemon must be online and connected to peers "
exit 1
fi
# check the object is there
ipfs dag stat "$1" >/dev/null
if [ $? -ne 0 ]; then
echo "error: ipfs cannot find $1"
exit 1
fi
echo "republishing $1 every 20 minutes"
while :
do
ipfs name publish $1
sleep 1200
done
================================================
FILE: bin/maketarball.sh
================================================
#!/usr/bin/env bash
# vim: set expandtab sw=2 ts=2:
# bash safe mode
set -euo pipefail
IFS=$'\n\t'
# readlink doesn't work on macos
OUTPUT="${1:-go-ipfs-source.tar.gz}"
if ! [[ "$OUTPUT" = /* ]]; then
OUTPUT="$PWD/$OUTPUT"
fi
GOCC=${GOCC=go}
TEMP="$(mktemp -d)"
cp -r . "$TEMP"
( cd "$TEMP" &&
echo $PWD &&
$GOCC mod vendor &&
(git describe --always --match=NeVeRmAtCh --dirty 2>/dev/null || true) > .tarball &&
chmod -R u=rwX,go=rX "$TEMP" # normalize permissions
tar -czf "$OUTPUT" --exclude="./.git" .
)
rm -rf "$TEMP"
================================================
FILE: bin/mkreleaselog
================================================
#!/bin/bash
#
# Invocation: mkreleaselog [FIRST_REF [LAST_REF]]
#
# Generates release notes with contributor statistics, deduplicating by GitHub handle.
# GitHub handles are resolved from:
# 1. GitHub noreply emails (user@users.noreply.github.com)
# 2. Merge commit messages (Merge pull request #N from user/branch)
# 3. GitHub API via gh CLI (for squash merges)
#
# Results are cached in ~/.cache/mkreleaselog/github-handles.json
set -euo pipefail
export GO111MODULE=on
GOPATH="$(go env GOPATH)"
export GOPATH
# List of PCRE regular expressions to match "included" modules.
INCLUDE_MODULES=(
# orgs
"^github.com/ipfs/"
"^github.com/ipld/"
"^github.com/libp2p/"
"^github.com/multiformats/"
"^github.com/filecoin-project/"
"^github.com/ipfs-shipyard/"
"^github.com/ipshipyard/"
"^github.com/probe-lab/"
# Authors of personal modules used by go-ipfs that should be mentioned in the
# release notes.
"^github.com/whyrusleeping/"
"^github.com/gammazero/"
"^github.com/Jorropo/"
"^github.com/guillaumemichel/"
"^github.com/Kubuxu/"
"^github.com/jbenet/"
"^github.com/Stebalien/"
"^github.com/marten-seemann/"
"^github.com/hsanjuan/"
"^github.com/lucas-clemente/"
"^github.com/warpfork/"
)
# List of PCRE regular expressions to match "excluded" modules. Applied after includes.
EXCLUDE_MODULES=(
"^github.com/marten-seemann/qtls"
)
# Ignored files as git pathspecs. These patters will match any full path component.
IGNORE_FILES=(
".gx"
"package.json"
".travis.yml"
"go.mod"
"go.sum"
".github"
"*.pb.go"
"cbor_gen.go"
"ipldsch_*.go"
"*.gen.go"
)
##########################################################################################
# GitHub Handle Resolution Infrastructure
##########################################################################################
# Cache location following XDG spec
GITHUB_CACHE_DIR="${XDG_CACHE_HOME:-$HOME/.cache}/mkreleaselog"
GITHUB_CACHE_FILE="$GITHUB_CACHE_DIR/github-handles.json"
# Timeout for gh CLI commands (seconds)
GH_TIMEOUT=10
# Associative array for email -> github handle mapping (runtime cache)
declare -A EMAIL_TO_GITHUB
# Check if gh CLI is available and authenticated
gh_available() {
command -v gh >/dev/null 2>&1 && gh auth status >/dev/null 2>&1
}
# Load cached email -> github handle mappings from disk
load_github_cache() {
EMAIL_TO_GITHUB=()
if [[ ! -f "$GITHUB_CACHE_FILE" ]]; then
return 0
fi
# Validate JSON before loading
if ! jq -e '.' "$GITHUB_CACHE_FILE" >/dev/null 2>&1; then
msg "Warning: corrupted cache file, ignoring"
return 0
fi
local email handle
while IFS=$'\t' read -r email handle; do
# Validate handle format (alphanumeric, hyphens, max 39 chars)
if [[ -n "$email" && -n "$handle" && "$handle" =~ ^[a-zA-Z0-9]([a-zA-Z0-9-]{0,37}[a-zA-Z0-9])?$ ]]; then
EMAIL_TO_GITHUB["$email"]="$handle"
fi
done < <(jq -r 'to_entries[] | "\(.key)\t\(.value)"' "$GITHUB_CACHE_FILE" 2>/dev/null)
msg "Loaded ${#EMAIL_TO_GITHUB[@]} cached GitHub handle mappings"
}
# Save email -> github handle mappings to disk (atomic write)
save_github_cache() {
if [[ ${#EMAIL_TO_GITHUB[@]} -eq 0 ]]; then
return 0
fi
mkdir -p "$GITHUB_CACHE_DIR"
local tmp_file
tmp_file="$(mktemp "$GITHUB_CACHE_DIR/cache.XXXXXX")" || return 1
# Build JSON from associative array
{
echo "{"
local first=true
local key
for key in "${!EMAIL_TO_GITHUB[@]}"; do
if [[ "$first" == "true" ]]; then
first=false
else
echo ","
fi
# Escape special characters in email for JSON
printf ' %s: %s' "$(jq -n --arg e "$key" '$e')" "$(jq -n --arg h "${EMAIL_TO_GITHUB[$key]}" '$h')"
done
echo
echo "}"
} > "$tmp_file"
# Validate before replacing
if jq -e '.' "$tmp_file" >/dev/null 2>&1; then
mv "$tmp_file" "$GITHUB_CACHE_FILE"
msg "Saved ${#EMAIL_TO_GITHUB[@]} GitHub handle mappings to cache"
else
rm -f "$tmp_file"
msg "Warning: failed to save cache (invalid JSON)"
fi
}
# Extract GitHub handle from email if it's a GitHub noreply address
# Handles: user@users.noreply.github.com and 12345678+user@users.noreply.github.com
extract_handle_from_noreply() {
local email="$1"
if [[ "$email" =~ ^([0-9]+\+)?([a-zA-Z0-9]([a-zA-Z0-9-]{0,37}[a-zA-Z0-9])?)@users\.noreply\.github\.com$ ]]; then
echo "${BASH_REMATCH[2]}"
return 0
fi
return 1
}
# Extract GitHub handle from merge commit subject
# Handles: "Merge pull request #123 from username/branch"
extract_handle_from_merge_commit() {
local subject="$1"
if [[ "$subject" =~ ^Merge\ pull\ request\ \#[0-9]+\ from\ ([a-zA-Z0-9]([a-zA-Z0-9-]{0,37}[a-zA-Z0-9])?)/.*$ ]]; then
echo "${BASH_REMATCH[1]}"
return 0
fi
return 1
}
# Extract PR number from commit subject
# Handles: "Subject (#123)" and "Merge pull request #123 from"
extract_pr_number() {
local subject="$1"
if [[ "$subject" =~ \(#([0-9]+)\)$ ]]; then
echo "${BASH_REMATCH[1]}"
return 0
elif [[ "$subject" =~ ^Merge\ pull\ request\ \#([0-9]+)\ from ]]; then
echo "${BASH_REMATCH[1]}"
return 0
fi
return 1
}
# Query GitHub API for PR author (with timeout and error handling)
query_pr_author() {
local gh_repo="$1" # e.g., "ipfs/kubo"
local pr_num="$2"
if ! gh_available; then
return 1
fi
local handle
handle="$(timeout "$GH_TIMEOUT" gh pr view "$pr_num" --repo "$gh_repo" --json author -q '.author.login' 2>/dev/null)" || return 1
# Validate handle format
if [[ -n "$handle" && "$handle" =~ ^[a-zA-Z0-9]([a-zA-Z0-9-]{0,37}[a-zA-Z0-9])?$ ]]; then
echo "$handle"
return 0
fi
return 1
}
# Query GitHub API for commit author (fallback when no PR available)
query_commit_author() {
local gh_repo="$1" # e.g., "ipfs/kubo"
local commit_sha="$2"
if ! gh_available; then
return 1
fi
local handle
handle="$(timeout "$GH_TIMEOUT" gh api "/repos/$gh_repo/commits/$commit_sha" --jq '.author.login // empty' 2>/dev/null)" || return 1
# Validate handle format
if [[ -n "$handle" && "$handle" =~ ^[a-zA-Z0-9]([a-zA-Z0-9-]{0,37}[a-zA-Z0-9])?$ ]]; then
echo "$handle"
return 0
fi
return 1
}
# Resolve email to GitHub handle using all available methods
# Args: email, commit_hash (optional), repo_dir (optional), gh_repo (optional)
resolve_github_handle() {
local email="$1"
local commit="${2:-}"
local repo_dir="${3:-}"
local gh_repo="${4:-}"
# Skip empty emails
[[ -z "$email" ]] && return 1
# Check runtime cache first
if [[ -n "${EMAIL_TO_GITHUB[$email]:-}" ]]; then
echo "${EMAIL_TO_GITHUB[$email]}"
return 0
fi
local handle=""
# Method 1: Extract from noreply email
if handle="$(extract_handle_from_noreply "$email")"; then
EMAIL_TO_GITHUB["$email"]="$handle"
echo "$handle"
return 0
fi
# Method 2: Look at commit message for merge commit pattern
if [[ -n "$commit" && -n "$repo_dir" ]]; then
local subject
subject="$(git -C "$repo_dir" log -1 --format='%s' "$commit" 2>/dev/null)" || true
if [[ -n "$subject" ]]; then
if handle="$(extract_handle_from_merge_commit "$subject")"; then
EMAIL_TO_GITHUB["$email"]="$handle"
echo "$handle"
return 0
fi
# Method 3: Query GitHub API for PR author
if [[ -n "$gh_repo" ]]; then
local pr_num
if pr_num="$(extract_pr_number "$subject")"; then
if handle="$(query_pr_author "$gh_repo" "$pr_num")"; then
EMAIL_TO_GITHUB["$email"]="$handle"
echo "$handle"
return 0
fi
fi
fi
fi
fi
return 1
}
# Build GitHub handle mappings for all commits in a range
# This does a single pass to collect PR numbers, then batch queries them
build_github_mappings() {
local module="$1"
local start="$2"
local end="${3:-HEAD}"
local repo
repo="$(strip_version "$module")"
local dir
local gh_repo=""
if [[ "$module" == "github.com/ipfs/kubo" ]]; then
dir="$ROOT_DIR"
else
dir="$GOPATH/src/$repo"
fi
# Extract gh_repo for API calls (e.g., "ipfs/kubo" from "github.com/ipfs/kubo")
if [[ "$repo" =~ ^github\.com/(.+)$ ]]; then
gh_repo="${BASH_REMATCH[1]}"
fi
msg "Building GitHub handle mappings for $module..."
# Collect all unique emails and their commit context
declare -A email_commits=()
local hash email subject
while IFS=$'\t' read -r hash email subject; do
[[ -z "$email" ]] && continue
# Skip if already resolved
[[ -n "${EMAIL_TO_GITHUB[$email]:-}" ]] && continue
# Try to resolve without API first
local handle=""
# Method 1: noreply email
if handle="$(extract_handle_from_noreply "$email")"; then
EMAIL_TO_GITHUB["$email"]="$handle"
continue
fi
# Method 2: merge commit message
if handle="$(extract_handle_from_merge_commit "$subject")"; then
EMAIL_TO_GITHUB["$email"]="$handle"
continue
fi
# Store for potential API lookup
if [[ -z "${email_commits[$email]:-}" ]]; then
email_commits["$email"]="$hash"
fi
done < <(git -C "$dir" log --format='tformat:%H%x09%aE%x09%s' --no-merges "$start..$end" 2>/dev/null)
# API batch lookup for remaining emails (if gh is available)
if gh_available && [[ -n "$gh_repo" && ${#email_commits[@]} -gt 0 ]]; then
msg "Querying GitHub API for ${#email_commits[@]} unknown contributors..."
local key
for key in "${!email_commits[@]}"; do
# Skip if already resolved
[[ -n "${EMAIL_TO_GITHUB[$key]:-}" ]] && continue
local commit_hash="${email_commits[$key]}"
local subj handle
subj="$(git -C "$dir" log -1 --format='%s' "$commit_hash" 2>/dev/null)" || true
# Try PR author lookup first (cheaper API call)
local pr_num
if pr_num="$(extract_pr_number "$subj")"; then
if handle="$(query_pr_author "$gh_repo" "$pr_num")"; then
EMAIL_TO_GITHUB["$key"]="$handle"
continue
fi
fi
# Fallback: commit author API (works for any commit)
if handle="$(query_commit_author "$gh_repo" "$commit_hash")"; then
EMAIL_TO_GITHUB["$key"]="$handle"
fi
done
fi
}
##########################################################################################
# Original infrastructure with modifications
##########################################################################################
build_include_regex() {
local result=""
local mod
for mod in "${INCLUDE_MODULES[@]}"; do
if [[ -n "$result" ]]; then
result="$result|$mod"
else
result="$mod"
fi
done
echo "($result)"
}
build_exclude_regex() {
local result=""
local mod
for mod in "${EXCLUDE_MODULES[@]}"; do
if [[ -n "$result" ]]; then
result="$result|$mod"
else
result="$mod"
fi
done
if [[ -n "$result" ]]; then
echo "($result)"
else
echo '$^' # match nothing
fi
}
if [[ ${#INCLUDE_MODULES[@]} -gt 0 ]]; then
INCLUDE_REGEX="$(build_include_regex)"
else
INCLUDE_REGEX="" # "match anything"
fi
if [[ ${#EXCLUDE_MODULES[@]} -gt 0 ]]; then
EXCLUDE_REGEX="$(build_exclude_regex)"
else
EXCLUDE_REGEX='$^' # "match nothing"
fi
IGNORE_FILES_PATHSPEC=()
for f in "${IGNORE_FILES[@]}"; do
IGNORE_FILES_PATHSPEC+=(":^:**/$f" ":^:$f") # Prepend the magic "ignore this" sequence.
done
NL=$'\n'
ROOT_DIR="$(git rev-parse --show-toplevel)"
msg() {
echo "$*" >&2
}
statlog() {
local module="$1"
local rpath
local gh_repo=""
if [[ "$module" == "github.com/ipfs/kubo" ]]; then
rpath="$ROOT_DIR"
else
rpath="$GOPATH/src/$(strip_version "$module")"
fi
# Extract gh_repo for API calls
local repo
repo="$(strip_version "$module")"
if [[ "$repo" =~ ^github\.com/(.+)$ ]]; then
gh_repo="${BASH_REMATCH[1]}"
fi
local start="${2:-}"
local end="${3:-HEAD}"
local mailmap_file="$rpath/.mailmap"
if ! [[ -e "$mailmap_file" ]]; then
mailmap_file="$ROOT_DIR/.mailmap"
fi
local stack=()
local line
while read -r line; do
if [[ -n "$line" ]]; then
stack+=("$line")
continue
fi
local changes
read -r changes
local changed=0
local insertions=0
local deletions=0
local count event
while read -r count event; do
if [[ "$event" =~ ^file ]]; then
changed=$count
elif [[ "$event" =~ ^insertion ]]; then
insertions=$count
elif [[ "$event" =~ ^deletion ]]; then
deletions=$count
else
echo "unknown event $event" >&2
exit 1
fi
done<<<"${changes//,/$NL}"
local author
for author in "${stack[@]}"; do
local hash name email
IFS=$'\t' read -r hash name email <<<"$author"
# Resolve GitHub handle
local github_handle=""
github_handle="$(resolve_github_handle "$email" "$hash" "$rpath" "$gh_repo")" || true
jq -n \
--arg "hash" "$hash" \
--arg "name" "$name" \
--arg "email" "$email" \
--arg "github" "$github_handle" \
--argjson "changed" "$changed" \
--argjson "insertions" "$insertions" \
--argjson "deletions" "$deletions" \
'{Commit: $hash, Author: $name, Email: $email, GitHub: $github, Files: $changed, Insertions: $insertions, Deletions: $deletions}'
done
stack=()
done < <(git -C "$rpath" -c mailmap.file="$mailmap_file" log --use-mailmap --shortstat --no-merges --pretty="tformat:%H%x09%aN%x09%aE" "$start..$end" -- . "${IGNORE_FILES_PATHSPEC[@]}")
}
# Returns a stream of deps changed between $1 and $2.
dep_changes() {
cat "$1" "$2" | jq -s 'JOIN(INDEX(.[0][]; .Path); .[1][]; .Path; {Path: .[0].Path, Old: (.[1] | del(.Path)), New: (.[0] | del(.Path))}) | select(.New.Version != .Old.Version)'
}
# resolve_commits resolves a git ref for each version.
resolve_commits() {
jq '. + {Ref: (.Version|capture("^((?<ref1>.*)\\+incompatible|v.*-(0\\.)?[0-9]{14}-(?<ref2>[a-f0-9]{12})|(?<ref3>v.*))$") | .ref1 // .ref2 // .ref3)}'
}
pr_link() {
local repo="$1"
local prnum="$2"
local ghname="${repo##github.com/}"
printf -- "[%s#%s](https://%s/pull/%s)" "$ghname" "$prnum" "$repo" "$prnum"
}
ignored_commit() {
local repo="$1"
local commit="$2"
local matches
# Check to see if this commit includes any non-ignored files.
matches=$(git -C "$repo" diff-tree --no-commit-id --name-only -r "$commit^" "$commit" \
-- "${IGNORE_FILES_PATHSPEC[@]}" | wc -l)
[[ "$matches" -eq 0 ]]
}
# Generate a release log for a range of commits in a single repo.
release_log() {
local module="$1"
local start="$2"
local end="${3:-HEAD}"
local repo
repo="$(strip_version "$1")"
local dir
if [[ "$module" == "github.com/ipfs/kubo" ]]; then
dir="$ROOT_DIR"
else
dir="$GOPATH/src/$repo"
fi
local commit subject
while read -r commit subject; do
# Skip commits that only touch ignored files.
if ignored_commit "$dir" "$commit"; then
continue
fi
if [[ "$subject" =~ ^Merge\ pull\ request\ \#([0-9]+)\ from ]]; then
local prnum="${BASH_REMATCH[1]}"
local desc
desc="$(git -C "$dir" show --summary --format='tformat:%b' "$commit" | head -1)"
printf -- "- %s (%s)\n" "$desc" "$(pr_link "$repo" "$prnum")"
elif [[ "$subject" =~ \(#([0-9]+)\)$ ]]; then
local prnum="${BASH_REMATCH[1]}"
printf -- "- %s (%s)\n" "$subject" "$(pr_link "$repo" "$prnum")"
else
printf -- "- %s\n" "$subject"
fi
done < <(git -C "$dir" log --format='tformat:%H %s' --first-parent "$start..$end")
}
indent() {
sed -e 's/^/ /'
}
mod_deps() {
go list -mod=mod -json -m all | jq 'select(.Version != null)'
}
ensure() {
local repo
repo="$(strip_version "$1")"
local commit="$2"
local rpath
if [[ "$1" == "github.com/ipfs/kubo" ]]; then
rpath="$ROOT_DIR"
else
rpath="$GOPATH/src/$repo"
fi
if [[ "$1" != "github.com/ipfs/kubo" ]] && [[ ! -d "$rpath" ]]; then
msg "Cloning $repo..."
git clone "http://$repo" "$rpath" >&2
fi
if ! git -C "$rpath" rev-parse --verify "$commit" >/dev/null; then
msg "Fetching $repo..."
git -C "$rpath" fetch --all >&2
fi
git -C "$rpath" rev-parse --verify "$commit" >/dev/null || return 1
}
# Summarize stats, grouping by GitHub handle (with fallback to email for dedup)
statsummary() {
jq -s '
# Group by GitHub handle if available, otherwise by email
group_by(if .GitHub != "" then .GitHub else .Email end)[] |
{
# Use first non-empty GitHub handle, or fall back to Author name
Author: .[0].Author,
GitHub: (map(select(.GitHub != "")) | .[0].GitHub // ""),
Email: .[0].Email,
Commits: (. | length),
Insertions: (map(.Insertions) | add),
Deletions: (map(.Deletions) | add),
Files: (map(.Files) | add)
}
' | jq '. + {Lines: (.Deletions + .Insertions)}'
}
strip_version() {
local repo="$1"
if [[ "$repo" =~ .*/v[0-9]+$ ]]; then
repo="$(dirname "$repo")"
fi
echo "$repo"
}
recursive_release_log() {
local start="${1:-$(git tag -l | sort -V | grep -v -- '-rc' | grep 'v'| tail -n1)}"
local end="${2:-$(git rev-parse HEAD)}"
local repo_root
repo_root="$(git rev-parse --show-toplevel)"
local module
module="$(go list -m)"
local dir
dir="$(go list -m -f '{{.Dir}}')"
# Load cached GitHub handle mappings
load_github_cache
# Kubo can be run from any directory, dependencies still use GOPATH
(
local result=0
local workspace
workspace="$(mktemp -d)"
# shellcheck disable=SC2064
trap "rm -rf '$workspace'" INT TERM EXIT
cd "$workspace"
echo "Computing old deps..." >&2
git -C "$repo_root" show "$start:go.mod" >go.mod
mod_deps | resolve_commits | jq -s > old_deps.json
echo "Computing new deps..." >&2
git -C "$repo_root" show "$end:go.mod" >go.mod
mod_deps | resolve_commits | jq -s > new_deps.json
rm -f go.mod go.sum
printf -- "Generating Changelog for %s %s..%s\n" "$module" "$start" "$end" >&2
# Pre-build GitHub mappings for main module
build_github_mappings "$module" "$start" "$end"
echo "### 📝 Changelog"
echo
echo "<details><summary>Full Changelog</summary>"
echo
printf -- "- %s:\n" "$module"
release_log "$module" "$start" "$end" | indent
statlog "$module" "$start" "$end" > statlog.json
local dep_module new new_ref old old_ref
while read -r dep_module new new_ref old old_ref; do
if ! ensure "$dep_module" "$new_ref"; then
result=1
local changelog="failed to fetch repo"
else
# Pre-build GitHub mappings for dependency
build_github_mappings "$dep_module" "$old_ref" "$new_ref"
statlog "$dep_module" "$old_ref" "$new_ref" >> statlog.json
local changelog
changelog="$(release_log "$dep_module" "$old_ref" "$new_ref")"
fi
if [[ -n "$changelog" ]]; then
printf -- "- %s (%s -> %s):\n" "$dep_module" "$old" "$new"
echo "$changelog" | indent
fi
done < <(dep_changes old_deps.json new_deps.json |
jq --arg inc "$INCLUDE_REGEX" --arg exc "$EXCLUDE_REGEX" \
'select(.Path | test($inc)) | select(.Path | test($exc) | not)' |
jq -r '"\(.Path) \(.New.Version) \(.New.Ref) \(.Old.Version) \(.Old.Ref // "")"')
echo
echo "</details>"
echo
echo "### 👨👩👧👦 Contributors"
echo
echo "| Contributor | Commits | Lines ± | Files Changed |"
echo "|-------------|---------|---------|---------------|"
statsummary <statlog.json |
jq -s 'sort_by(.Lines) | reverse | .[]' |
jq -r '
if .GitHub != "" then
"| [@\(.GitHub)](https://github.com/\(.GitHub)) | \(.Commits) | +\(.Insertions)/-\(.Deletions) | \(.Files) |"
else
"| \(.Author) | \(.Commits) | +\(.Insertions)/-\(.Deletions) | \(.Files) |"
end
'
# Save cache before exiting
save_github_cache
return "$result"
)
}
recursive_release_log "$@"
================================================
FILE: bin/push-docker-tags.sh
================================================
#!/usr/bin/env bash
#
# TODO: this script is legacy, use get-docker-tags.sh instead.
#
# push-docker-tags.sh
#
# Run from ci to tag images based on the current branch or tag name.
# A bit like dockerhub autobuild config, but somewhere we can version control it.
#
# The `docker-build` job builds the current commit in docker and tags it as ipfs/kubo:wip
#
# Then the `docker-publish` job runs this script to decide what tag, if any,
# to publish to dockerhub.
#
# Usage:
# ./push-docker-tags.sh <build number> <git commit sha1> <git branch name> [git tag name] [dry run]
#
# Example:
# # dry run. pass a 5th arg to have it print what it would do rather than do it.
# ./push-docker-tags.sh $(date -u +%F) testingsha master "" dryrun
#
# # push tag for the master branch
# ./push-docker-tags.sh $(date -u +%F) testingsha master
#
# # push tag for a release tag
# ./push-docker-tags.sh $(date -u +%F) testingsha release v0.5.0
#
set -euo pipefail
if [[ $# -lt 1 ]] ; then
echo 'At least 1 arg required. Pass 5 args for a dry run.'
echo 'Usage:'
echo './push-docker-tags.sh <build number> [git commit sha1] [git branch name] [git tag name] [dry run]'
exit 1
fi
BUILD_NUM=$1
GIT_SHA1=${2:-$(git rev-parse HEAD)}
GIT_SHA1_SHORT=$(echo "$GIT_SHA1" | cut -c 1-7)
GIT_BRANCH=${3:-$(git symbolic-ref -q --short HEAD || echo "unknown")}
GIT_TAG=${4:-$(git describe --tags --exact-match || echo "")}
DRY_RUN=${5:-false}
WIP_IMAGE_TAG=${WIP_IMAGE_TAG:-wip}
IMAGE_NAME=${IMAGE_NAME:-ipfs/kubo}
pushTag () {
local IMAGE_TAG=$1
if [ "$DRY_RUN" != false ]; then
echo "DRY RUN! I would have tagged and pushed the following..."
echo docker tag "$IMAGE_NAME:$WIP_IMAGE_TAG" "$IMAGE_NAME:$IMAGE_TAG"
echo docker push "$IMAGE_NAME:$IMAGE_TAG"
else
echo "Tagging $IMAGE_NAME:$IMAGE_TAG and pushing to dockerhub"
docker tag "$IMAGE_NAME:$WIP_IMAGE_TAG" "$IMAGE_NAME:$IMAGE_TAG"
docker push "$IMAGE_NAME:$IMAGE_TAG"
fi
}
if [[ $GIT_TAG =~ ^v[0-9]+\.[0-9]+\.[0-9]+-rc ]]; then
pushTag "$GIT_TAG"
elif [[ $GIT_TAG =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
pushTag "$GIT_TAG"
pushTag "latest"
pushTag "release" # see: https://github.com/ipfs/kubo/issues/3999#issuecomment-742228981
elif [[ $GIT_BRANCH =~ ^bifrost-.* ]]; then
# sanitize the branch name since docker tags have stricter char limits than git branch names
branch=$(echo "$GIT_BRANCH" | tr '/' '-' | tr --delete --complement '[:alnum:]-')
pushTag "${branch}-${BUILD_NUM}-${GIT_SHA1_SHORT}"
elif [ "$GIT_BRANCH" = "master" ] || [ "$GIT_BRANCH" = "staging" ]; then
pushTag "${GIT_BRANCH}-${BUILD_NUM}-${GIT_SHA1_SHORT}"
pushTag "${GIT_BRANCH}-latest"
else
echo "Nothing to do. No docker tag defined for branch: $GIT_BRANCH, tag: $GIT_TAG"
fi
================================================
FILE: bin/test-go-build-platforms
================================================
#!/bin/bash
set -e
echo "Building kubo for all platforms in .github/build-platforms.yml..."
if [ ! -f .github/build-platforms.yml ]; then
echo "Error: .github/build-platforms.yml not found"
exit 1
fi
grep '^ - ' .github/build-platforms.yml | sed 's/^ - //' | while read -r platform; do
if [ -z "$platform" ]; then
continue
fi
GOOS=$(echo "$platform" | cut -d- -f1)
GOARCH=$(echo "$platform" | cut -d- -f2)
echo "Building $platform..."
echo " GOOS=$GOOS GOARCH=$GOARCH go build -o /dev/null ./cmd/ipfs"
GOOS=$GOOS GOARCH=$GOARCH go build -o /dev/null ./cmd/ipfs
done
echo "All platforms built successfully"
================================================
FILE: bin/test-go-fmt
================================================
#!/usr/bin/env bash
set -euo pipefail
T="$(mktemp)"
find . \
-path ./test/sharness -prune \
-o -path ./plugin/loader/preload.go -prune \
-o -name '*.go' -print0 | xargs -0 gofmt -s -l > "$T"
if [ -n "$(cat $T)" ]; then
echo "Following Go code is not formatted."
echo "-----------------------------------"
cat "$T"
echo "-----------------------------------"
echo "Run 'go fmt ./...' in your source directory"
rm -f "$T"
exit 1
fi
rm -f "$T"
================================================
FILE: blocks/blockstoreutil/remove.go
================================================
// Package blockstoreutil provides utility functions for Blockstores.
package blockstoreutil
import (
"context"
"errors"
"fmt"
bs "github.com/ipfs/boxo/blockstore"
pin "github.com/ipfs/boxo/pinning/pinner"
cid "github.com/ipfs/go-cid"
format "github.com/ipfs/go-ipld-format"
)
// RemovedBlock is used to represent the result of removing a block.
// If a block was removed successfully, then the Error will be empty.
// If a block could not be removed, then Error will contain the
// reason the block could not be removed. If the removal was aborted
// due to a fatal error, Hash will be empty, Error will contain the
// reason, and no more results will be sent.
type RemovedBlock struct {
Hash string
Error error
}
// RmBlocksOpts is used to wrap options for RmBlocks().
type RmBlocksOpts struct {
Prefix string
Quiet bool
Force bool
}
// RmBlocks removes the blocks provided in the cids slice.
// It returns a channel where objects of type RemovedBlock are placed, when
// not using the Quiet option. Block removal is asynchronous and will
// skip any pinned blocks.
func RmBlocks(ctx context.Context, blocks bs.GCBlockstore, pins pin.Pinner, cids []cid.Cid, opts RmBlocksOpts) (<-chan any, error) {
// make the channel large enough to hold any result to avoid
// blocking while holding the GCLock
out := make(chan any, len(cids))
go func() {
defer close(out)
unlocker := blocks.GCLock(ctx)
defer unlocker.Unlock(ctx)
stillOkay := FilterPinned(ctx, pins, out, cids)
for _, c := range stillOkay {
// Kept for backwards compatibility. We may want to
// remove this sometime in the future.
has, err := blocks.Has(ctx, c)
if err != nil {
out <- &RemovedBlock{Hash: c.String(), Error: err}
continue
}
if !has && !opts.Force {
out <- &RemovedBlock{Hash: c.String(), Error: format.ErrNotFound{Cid: c}}
continue
}
err = blocks.DeleteBlock(ctx, c)
if err != nil {
out <- &RemovedBlock{Hash: c.String(), Error: err}
} else if !opts.Quiet {
out <- &RemovedBlock{Hash: c.String()}
}
}
}()
return out, nil
}
// FilterPinned takes a slice of Cids and returns it with the pinned Cids
// removed. If a Cid is pinned, it will place RemovedBlock objects in the given
// out channel, with an error which indicates that the Cid is pinned.
// This function is used in RmBlocks to filter out any blocks which are not
// to be removed (because they are pinned).
func FilterPinned(ctx context.Context, pins pin.Pinner, out chan<- any, cids []cid.Cid) []cid.Cid {
stillOkay := make([]cid.Cid, 0, len(cids))
res, err := pins.CheckIfPinned(ctx, cids...)
if err != nil {
out <- &RemovedBlock{Error: fmt.Errorf("pin check failed: %w", err)}
return nil
}
for _, r := range res {
if !r.Pinned() {
stillOkay = append(stillOkay, r.Key)
} else {
out <- &RemovedBlock{
Hash: r.Key.String(),
Error: errors.New(r.String()),
}
}
}
return stillOkay
}
================================================
FILE: client/rpc/README.md
================================================
# `coreiface.CoreAPI` over http `rpc`
> IPFS CoreAPI implementation using HTTP API
This package implements [`coreiface.CoreAPI`](https://pkg.go.dev/github.com/ipfs/kubo/core/coreiface#CoreAPI) over the HTTP API.
## Documentation
https://pkg.go.dev/github.com/ipfs/kubo/client/rpc
### Example
Pin file on your local IPFS node based on its CID:
```go
package main
import (
"context"
"fmt"
"github.com/ipfs/boxo/path"
"github.com/ipfs/go-cid"
"github.com/ipfs/kubo/client/rpc"
)
func main() {
// "Connect" to local node
node, err := rpc.NewLocalApi()
if err != nil {
fmt.Println(err)
return
}
// Pin a given file by its CID
ctx := context.Background()
c, err := cid.Decode("bafkreidtuosuw37f5xmn65b3ksdiikajy7pwjjslzj2lxxz2vc4wdy3zku")
if err != nil {
fmt.Println(err)
return
}
p := path.FromCid(c)
err = node.Pin().Add(ctx, p)
if err != nil {
fmt.Println(err)
return
}
}
```
================================================
FILE: client/rpc/api.go
================================================
package rpc
import (
"context"
"encoding/json"
"errors"
"fmt"
"net"
"net/http"
"os"
"path/filepath"
"strings"
"sync"
"time"
"github.com/blang/semver/v4"
"github.com/ipfs/boxo/ipld/merkledag"
"github.com/ipfs/go-cid"
legacy "github.com/ipfs/go-ipld-legacy"
ipfs "github.com/ipfs/kubo"
iface "github.com/ipfs/kubo/core/coreiface"
caopts "github.com/ipfs/kubo/core/coreiface/options"
"github.com/ipfs/kubo/misc/fsutil"
dagpb "github.com/ipld/go-codec-dagpb"
_ "github.com/ipld/go-ipld-prime/codec/dagcbor"
"github.com/ipld/go-ipld-prime/node/basicnode"
ma "github.com/multiformats/go-multiaddr"
manet "github.com/multiformats/go-multiaddr/net"
)
const (
DefaultPathName = ".ipfs"
DefaultPathRoot = "~/" + DefaultPathName
DefaultApiFile = "api"
EnvDir = "IPFS_PATH"
)
// ErrApiNotFound if we fail to find a running daemon.
var ErrApiNotFound = errors.New("ipfs api address could not be found")
// HttpApi implements github.com/ipfs/interface-go-ipfs-core/CoreAPI using
// IPFS HTTP API.
//
// For interface docs see
// https://godoc.org/github.com/ipfs/interface-go-ipfs-core#CoreAPI
type HttpApi struct {
url string
httpcli http.Client
Headers http.Header
applyGlobal func(*requestBuilder)
ipldDecoder *legacy.Decoder
versionMu sync.Mutex
version *semver.Version
}
// NewLocalApi tries to construct new HttpApi instance communicating with local
// IPFS daemon
//
// Daemon api address is pulled from the $IPFS_PATH/api file.
// If $IPFS_PATH env var is not present, it defaults to ~/.ipfs.
func NewLocalApi() (*HttpApi, error) {
baseDir := os.Getenv(EnvDir)
if baseDir == "" {
baseDir = DefaultPathRoot
}
return NewPathApi(baseDir)
}
// NewPathApi constructs new HttpApi by pulling api address from specified
// ipfspath. Api file should be located at $ipfspath/api.
func NewPathApi(ipfspath string) (*HttpApi, error) {
a, err := ApiAddr(ipfspath)
if err != nil {
if os.IsNotExist(err) {
err = ErrApiNotFound
}
return nil, err
}
return NewApi(a)
}
// ApiAddr reads api file in specified ipfs path.
func ApiAddr(ipfspath string) (ma.Multiaddr, error) {
baseDir, err := fsutil.ExpandHome(ipfspath)
if err != nil {
return nil, err
}
apiFile := filepath.Join(baseDir, DefaultApiFile)
api, err := os.ReadFile(apiFile)
if err != nil {
return nil, err
}
return ma.NewMultiaddr(strings.TrimSpace(string(api)))
}
// NewApi constructs HttpApi with specified endpoint.
func NewApi(a ma.Multiaddr) (*HttpApi, error) {
transport := &http.Transport{
Proxy: http.ProxyFromEnvironment,
DisableKeepAlives: true,
}
network, address, err := manet.DialArgs(a)
if err != nil {
return nil, err
}
if network == "unix" {
transport.DialContext = func(_ context.Context, _, _ string) (net.Conn, error) {
return net.Dial("unix", address)
}
c := &http.Client{
Transport: transport,
}
// This will create an API client which
// makes requests to `http://unix`.
return NewURLApiWithClient(network, c)
}
c := &http.Client{
Transport: transport,
}
return NewApiWithClient(a, c)
}
// NewApiWithClient constructs HttpApi with specified endpoint and custom http client.
func NewApiWithClient(a ma.Multiaddr, c *http.Client) (*HttpApi, error) {
_, url, err := manet.DialArgs(a)
if err != nil {
return nil, err
}
if a, err := ma.NewMultiaddr(url); err == nil {
_, host, err := manet.DialArgs(a)
if err == nil {
url = host
}
}
proto := "http://"
// By default, DialArgs is going to provide details suitable for connecting
// a socket to, but not really suitable for making an informed choice of http
// protocol. For multiaddresses specifying tls and/or https we want to make
// a https request instead of a http request.
protocols := a.Protocols()
for _, p := range protocols {
if p.Code == ma.P_HTTPS || p.Code == ma.P_TLS {
proto = "https://"
break
}
}
return NewURLApiWithClient(proto+url, c)
}
func NewURLApiWithClient(url string, c *http.Client) (*HttpApi, error) {
decoder := legacy.NewDecoder()
// Add support for these codecs to match what is done in the merkledag library
// Note: to match prior behavior the go-ipld-prime CBOR decoder is manually included
// TODO: allow the codec registry used to be configured by the caller not through a global variable
decoder.RegisterCodec(cid.DagProtobuf, dagpb.Type.PBNode, merkledag.ProtoNodeConverter)
decoder.RegisterCodec(cid.Raw, basicnode.Prototype.Bytes, merkledag.RawNodeConverter)
api := &HttpApi{
url: url,
httpcli: *c,
Headers: make(map[string][]string),
applyGlobal: func(*requestBuilder) {},
ipldDecoder: decoder,
}
// We don't support redirects.
api.httpcli.CheckRedirect = func(_ *http.Request, _ []*http.Request) error {
return fmt.Errorf("unexpected redirect")
}
return api, nil
}
func (api *HttpApi) WithOptions(opts ...caopts.ApiOption) (iface.CoreAPI, error) {
options, err := caopts.ApiOptions(opts...)
if err != nil {
return nil, err
}
subApi := &HttpApi{
url: api.url,
httpcli: api.httpcli,
Headers: api.Headers,
applyGlobal: func(req *requestBuilder) {
if options.Offline {
req.Option("offline", options.Offline)
}
},
ipldDecoder: api.ipldDecoder,
}
return subApi, nil
}
func (api *HttpApi) Request(command string, args ...string) RequestBuilder {
headers := make(map[string]string)
if api.Headers != nil {
for k := range api.Headers {
headers[k] = api.Headers.Get(k)
}
}
return &requestBuilder{
command: command,
args: args,
shell: api,
headers: headers,
}
}
func (api *HttpApi) Unixfs() iface.UnixfsAPI {
return (*UnixfsAPI)(api)
}
func (api *HttpApi) Block() iface.BlockAPI {
return (*BlockAPI)(api)
}
func (api *HttpApi) Dag() iface.APIDagService {
return (*HttpDagServ)(api)
}
func (api *HttpApi) Name() iface.NameAPI {
return (*NameAPI)(api)
}
func (api *HttpApi) Key() iface.KeyAPI {
return (*KeyAPI)(api)
}
func (api *HttpApi) Pin() iface.PinAPI {
return (*PinAPI)(api)
}
func (api *HttpApi) Object() iface.ObjectAPI {
return (*ObjectAPI)(api)
}
func (api *HttpApi) Swarm() iface.SwarmAPI {
return (*SwarmAPI)(api)
}
func (api *HttpApi) PubSub() iface.PubSubAPI {
return (*PubsubAPI)(api)
}
func (api *HttpApi) Routing() iface.RoutingAPI {
return (*RoutingAPI)(api)
}
func (api *HttpApi) loadRemoteVersion() (*semver.Version, error) {
api.versionMu.Lock()
defer api.versionMu.Unlock()
if api.version == nil {
ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(time.Second*30))
defer cancel()
resp, err := api.Request("version").Send(ctx)
if err != nil {
return nil, err
}
if resp.Error != nil {
return nil, resp.Error
}
defer resp.Close()
var out ipfs.VersionInfo
dec := json.NewDecoder(resp.Output)
if err := dec.Decode(&out); err != nil {
return nil, err
}
remoteVersion, err := semver.New(out.Version)
if err != nil {
return nil, err
}
api.version = remoteVersion
}
return api.version, nil
}
================================================
FILE: client/rpc/api_test.go
================================================
package rpc
import (
"context"
"errors"
"net/http"
"net/http/httptest"
"strconv"
"strings"
"sync"
"testing"
"time"
"github.com/ipfs/boxo/path"
"github.com/ipfs/kubo/config"
iface "github.com/ipfs/kubo/core/coreiface"
"github.com/ipfs/kubo/core/coreiface/tests"
"github.com/ipfs/kubo/test/cli/harness"
ma "github.com/multiformats/go-multiaddr"
)
type NodeProvider struct{}
func (np NodeProvider) MakeAPISwarm(t *testing.T, ctx context.Context, fullIdentity, online bool, n int) ([]iface.CoreAPI, error) {
h := harness.NewT(t)
apis := make([]iface.CoreAPI, n)
nodes := h.NewNodes(n)
var wg, zero sync.WaitGroup
zeroNode := nodes[0]
wg.Add(len(apis))
zero.Add(1)
var errs []error
var errsLk sync.Mutex
for i, n := range nodes {
go func(i int, n *harness.Node) {
if err := func() error {
defer wg.Done()
var err error
n.Init("--empty-repo")
c := n.ReadConfig()
c.Experimental.FilestoreEnabled = true
// only provide things we pin. Allows to test
// provide operations.
c.Provide.Strategy = config.NewOptionalString("roots")
n.WriteConfig(c)
n.StartDaemon("--enable-pubsub-experiment", "--offline="+strconv.FormatBool(!online))
if online {
if i > 0 {
zero.Wait()
n.Connect(zeroNode)
} else {
zero.Done()
}
}
apiMaddr, err := n.TryAPIAddr()
if err != nil {
return err
}
api, err := NewApi(apiMaddr)
if err != nil {
return err
}
apis[i] = api
// empty node is pinned even with --empty-repo, we don't want that
emptyNode, err := path.NewPath("/ipfs/QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn")
if err != nil {
return err
}
if err := api.Pin().Rm(ctx, emptyNode); err != nil {
return err
}
return nil
}(); err != nil {
errsLk.Lock()
errs = append(errs, err)
errsLk.Unlock()
}
}(i, n)
}
wg.Wait()
return apis, errors.Join(errs...)
}
func TestHttpApi(t *testing.T) {
t.Parallel()
tests.TestApi(NodeProvider{})(t)
}
func Test_NewURLApiWithClient_With_Headers(t *testing.T) {
t.Parallel()
var (
headerToTest = "Test-Header"
expectedHeaderValue = "thisisaheadertest"
)
ts := httptest.NewServer(
http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
val := r.Header.Get(headerToTest)
if val != expectedHeaderValue {
w.WriteHeader(400)
return
}
http.ServeContent(w, r, "", time.Now(), strings.NewReader("test"))
}),
)
defer ts.Close()
api, err := NewURLApiWithClient(ts.URL, &http.Client{
Transport: &http.Transport{
Proxy: http.ProxyFromEnvironment,
DisableKeepAlives: true,
},
})
if err != nil {
t.Fatal(err)
}
api.Headers.Set(headerToTest, expectedHeaderValue)
p, err := path.NewPath("/ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv")
if err != nil {
t.Fatal(err)
}
if err := api.Pin().Rm(context.Background(), p); err != nil {
t.Fatal(err)
}
}
func Test_NewURLApiWithClient_HTTP_Variant(t *testing.T) {
t.Parallel()
testcases := []struct {
address string
expected string
}{
{address: "/ip4/127.0.0.1/tcp/80", expected: "http://127.0.0.1:80"},
{address: "/ip4/127.0.0.1/tcp/443/tls", expected: "https://127.0.0.1:443"},
{address: "/ip4/127.0.0.1/tcp/443/https", expected: "https://127.0.0.1:443"},
{address: "/ip4/127.0.0.1/tcp/443/tls/http", expected: "https://127.0.0.1:443"},
}
for _, tc := range testcases {
address, err := ma.NewMultiaddr(tc.address)
if err != nil {
t.Fatal(err)
}
api, err := NewApiWithClient(address, &http.Client{})
if err != nil {
t.Fatal(err)
}
if api.url != tc.expected {
t.Errorf("Expected = %s; got %s", tc.expected, api.url)
}
}
}
================================================
FILE: client/rpc/apifile.go
================================================
package rpc
import (
"bytes"
"context"
"encoding/json"
"fmt"
"io"
"os"
"strconv"
"time"
"github.com/ipfs/boxo/files"
unixfs "github.com/ipfs/boxo/ipld/unixfs"
"github.com/ipfs/boxo/path"
"github.com/ipfs/go-cid"
)
const forwardSeekLimit = 1 << 14 // 16k
func (api *UnixfsAPI) Get(ctx context.Context, p path.Path) (files.Node, error) {
if p.Mutable() { // use resolved path in case we are dealing with IPNS / MFS
var err error
p, _, err = api.core().ResolvePath(ctx, p)
if err != nil {
return nil, err
}
}
var stat struct {
Hash string
Type string
Size int64 // unixfs size
Mode string
Mtime int64
MtimeNsecs int
}
err := api.core().Request("files/stat", p.String()).Exec(ctx, &stat)
if err != nil {
return nil, err
}
mode, err := stringToFileMode(stat.Mode)
if err != nil {
return nil, err
}
var modTime time.Time
if stat.Mtime != 0 {
modTime = time.Unix(stat.Mtime, int64(stat.MtimeNsecs)).UTC()
}
switch stat.Type {
case "file":
return api.getFile(ctx, p, stat.Size, mode, modTime)
case "directory":
return api.getDir(ctx, p, stat.Size, mode, modTime)
case "symlink":
return api.getSymlink(ctx, p, modTime)
default:
return nil, fmt.Errorf("unsupported file type '%s'", stat.Type)
}
}
type apiFile struct {
ctx context.Context
core *HttpApi
size int64
path path.Path
mode os.FileMode
mtime time.Time
r *Response
at int64
}
func (f *apiFile) reset() error {
if f.r != nil {
_ = f.r.Cancel()
f.r = nil
}
req := f.core.Request("cat", f.path.String())
if f.at != 0 {
req.Option("offset", f.at)
}
resp, err := req.Send(f.ctx)
if err != nil {
return err
}
if resp.Error != nil {
return resp.Error
}
f.r = resp
return nil
}
func (f *apiFile) Read(p []byte) (int, error) {
n, err := f.r.Output.Read(p)
if n > 0 {
f.at += int64(n)
}
return n, err
}
func (f *apiFile) ReadAt(p []byte, off int64) (int, error) {
// Always make a new request. This method should be parallel-safe.
resp, err := f.core.Request("cat", f.path.String()).
Option("offset", off).Option("length", len(p)).Send(f.ctx)
if err != nil {
return 0, err
}
if resp.Error != nil {
return 0, resp.Error
}
defer resp.Output.Close()
n, err := io.ReadFull(resp.Output, p)
if err == io.ErrUnexpectedEOF {
err = io.EOF
}
return n, err
}
func (f *apiFile) Seek(offset int64, whence int) (int64, error) {
switch whence {
case io.SeekEnd:
offset = f.size + offset
case io.SeekCurrent:
offset = f.at + offset
}
if f.at == offset { // noop
return offset, nil
}
if f.at < offset && offset-f.at < forwardSeekLimit { // forward skip
r, err := io.CopyN(io.Discard, f.r.Output, offset-f.at)
f.at += r
return f.at, err
}
f.at = offset
return f.at, f.reset()
}
func (f *apiFile) Close() error {
if f.r != nil {
return f.r.Cancel()
}
return nil
}
func (f *apiFile) Mode() os.FileMode {
return f.mode
}
func (f *apiFile) ModTime() time.Time {
return f.mtime
}
func (f *apiFile) Size() (int64, error) {
return f.size, nil
}
func stringToFileMode(mode string) (os.FileMode, error) {
if mode == "" {
return 0, nil
}
mode64, err := strconv.ParseUint(mode, 8, 32)
if err != nil {
return 0, fmt.Errorf("cannot parse mode %s: %s", mode, err)
}
return os.FileMode(uint32(mode64)), nil
}
func (api *UnixfsAPI) getFile(ctx context.Context, p path.Path, size int64, mode os.FileMode, mtime time.Time) (files.Node, error) {
f := &apiFile{
ctx: ctx,
core: api.core(),
size: size,
path: p,
mode: mode,
mtime: mtime,
}
return f, f.reset()
}
type apiIter struct {
ctx context.Context
core *UnixfsAPI
err error
dec *json.Decoder
curFile files.Node
cur lsLink
}
func (it *apiIter) Err() error {
return it.err
}
func (it *apiIter) Name() string {
return it.cur.Name
}
func (it *apiIter) Next() bool {
if it.ctx.Err() != nil {
it.err = it.ctx.Err()
return false
}
var out lsOutput
if err := it.dec.Decode(&out); err != nil {
if err != io.EOF {
it.err = err
}
return false
}
if len(out.Objects) != 1 {
it.err = fmt.Errorf("ls returned more objects than expected (%d)", len(out.Objects))
return false
}
if len(out.Objects[0].Links) != 1 {
it.err = fmt.Errorf("ls returned more links than expected (%d)", len(out.Objects[0].Links))
return false
}
it.cur = out.Objects[0].Links[0]
c, err := cid.Parse(it.cur.Hash)
if err != nil {
it.err = err
return false
}
switch it.cur.Type {
case unixfs.THAMTShard, unixfs.TMetadata, unixfs.TDirectory:
it.curFile, err = it.core.getDir(it.ctx, path.FromCid(c), int64(it.cur.Size), it.cur.Mode, it.cur.ModTime)
if err != nil {
it.err = err
return false
}
case unixfs.TFile:
it.curFile, err = it.core.getFile(it.ctx, path.FromCid(c), int64(it.cur.Size), it.cur.Mode, it.cur.ModTime)
if err != nil {
it.err = err
return false
}
case unixfs.TSymlink:
it.curFile, err = it.core.getSymlink(it.ctx, path.FromCid(c), it.cur.ModTime)
if err != nil {
it.err = err
return false
}
default:
it.err = fmt.Errorf("file type %d not supported", it.cur.Type)
return false
}
return true
}
func (it *apiIter) Node() files.Node {
return it.curFile
}
type apiDir struct {
ctx context.Context
core *UnixfsAPI
size int64
path path.Path
mode os.FileMode
mtime time.Time
dec *json.Decoder
}
func (d *apiDir) Close() error {
return nil
}
func (d *apiDir) Mode() os.FileMode {
return d.mode
}
func (d *apiDir) ModTime() time.Time {
return d.mtime
}
func (d *apiDir) Size() (int64, error) {
return d.size, nil
}
func (d *apiDir) Entries() files.DirIterator {
return &apiIter{
ctx: d.ctx,
core: d.core,
dec: d.dec,
}
}
func (api *UnixfsAPI) getDir(ctx context.Context, p path.Path, size int64, mode os.FileMode, modTime time.Time) (files.Node, error) {
resp, err := api.core().Request("ls", p.String()).
Option("resolve-size", true).
Option("stream", true).Send(ctx)
if err != nil {
return nil, err
}
if resp.Error != nil {
return nil, resp.Error
}
data, _ := io.ReadAll(resp.Output)
rdr := bytes.NewReader(data)
d := &apiDir{
ctx: ctx,
core: api,
size: size,
path: p,
mode: mode,
mtime: modTime,
//dec: json.NewDecoder(resp.Output),
dec: json.NewDecoder(rdr),
}
return d, nil
}
func (api *UnixfsAPI) getSymlink(ctx context.Context, p path.Path, modTime time.Time) (files.Node, error) {
resp, err := api.core().Request("cat", p.String()).
Option("resolve-size", true).
Option("stream", true).Send(ctx)
if err != nil {
return nil, err
}
if resp.Error != nil {
return nil, resp.Error
}
target, err := io.ReadAll(resp.Output)
if err != nil {
return nil, err
}
return files.NewSymlinkFile(string(target), modTime), nil
}
var (
_ files.File = &apiFile{}
_ files.Directory = &apiDir{}
)
================================================
FILE: client/rpc/auth/auth.go
================================================
package auth
import "net/http"
var _ http.RoundTripper = &AuthorizedRoundTripper{}
type AuthorizedRoundTripper struct {
authorization string
roundTripper http.RoundTripper
}
// NewAuthorizedRoundTripper creates a new [http.RoundTripper] that will set the
// Authorization HTTP header with the value of [authorization]. The given [roundTripper] is
// the base [http.RoundTripper]. If it is nil, [http.DefaultTransport] is used.
func NewAuthorizedRoundTripper(authorization string, roundTripper http.RoundTripper) http.RoundTripper {
if roundTripper == nil {
roundTripper = http.DefaultTransport
}
return &AuthorizedRoundTripper{
authorization: authorization,
roundTripper: roundTripper,
}
}
func (tp *AuthorizedRoundTripper) RoundTrip(r *http.Request) (*http.Response, error) {
r.Header.Set("Authorization", tp.authorization)
return tp.roundTripper.RoundTrip(r)
}
================================================
FILE: client/rpc/block.go
================================================
package rpc
import (
"bytes"
"context"
"fmt"
"io"
"github.com/ipfs/boxo/path"
"github.com/ipfs/go-cid"
iface "github.com/ipfs/kubo/core/coreiface"
caopts "github.com/ipfs/kubo/core/coreiface/options"
mc "github.com/multiformats/go-multicodec"
mh "github.com/multiformats/go-multihash"
)
type BlockAPI HttpApi
type blockStat struct {
Key string
BSize int `json:"Size"`
cid cid.Cid
}
func (s *blockStat) Size() int {
return s.BSize
}
func (s *blockStat) Path() path.ImmutablePath {
return path.FromCid(s.cid)
}
func (api *BlockAPI) Put(ctx context.Context, r io.Reader, opts ...caopts.BlockPutOption) (iface.BlockStat, error) {
options, err := caopts.BlockPutOptions(opts...)
px := options.CidPrefix
if err != nil {
return nil, err
}
mht, ok := mh.Codes[px.MhType]
if !ok {
return nil, fmt.Errorf("unknowm mhType %d", px.MhType)
}
var cidOptKey, cidOptVal string
switch {
case px.Version == 0 && px.Codec == cid.DagProtobuf:
// ensure legacy --format=v0 passes as BlockPutOption still works
cidOptKey = "format"
cidOptVal = "v0"
default:
// pass codec as string
cidOptKey = "cid-codec"
cidOptVal = mc.Code(px.Codec).String()
}
req := api.core().Request("block/put").
Option("mhtype", mht).
Option("mhlen", px.MhLength).
Option(cidOptKey, cidOptVal).
Option("pin", options.Pin).
FileBody(r)
var out blockStat
if err := req.Exec(ctx, &out); err != nil {
return nil, err
}
out.cid, err = cid.Parse(out.Key)
if err != nil {
return nil, err
}
return &out, nil
}
func (api *BlockAPI) Get(ctx context.Context, p path.Path) (io.Reader, error) {
resp, err := api.core().Request("block/get", p.String()).Send(ctx)
if err != nil {
return nil, err
}
if resp.Error != nil {
return nil, parseErrNotFoundWithFallbackToError(resp.Error)
}
// TODO: make get return ReadCloser to avoid copying
defer resp.Close()
b := new(bytes.Buffer)
if _, err := io.Copy(b, resp.Output); err != nil {
return nil, err
}
return b, nil
}
func (api *BlockAPI) Rm(ctx context.Context, p path.Path, opts ...caopts.BlockRmOption) error {
options, err := caopts.BlockRmOptions(opts...)
if err != nil {
return err
}
removedBlock := struct {
Hash string `json:",omitempty"`
Error string `json:",omitempty"`
}{}
req := api.core().Request("block/rm").
Option("force", options.Force).
Arguments(p.String())
if err := req.Exec(ctx, &removedBlock); err != nil {
return err
}
return parseErrNotFoundWithFallbackToMSG(removedBlock.Error)
}
func (api *BlockAPI) Stat(ctx context.Context, p path.Path) (iface.BlockStat, error) {
var out blockStat
err := api.core().Request("block/stat", p.String()).Exec(ctx, &out)
if err != nil {
return nil, parseErrNotFoundWithFallbackToError(err)
}
out.cid, err = cid.Parse(out.Key)
if err != nil {
return nil, err
}
return &out, nil
}
func (api *BlockAPI) core() *HttpApi {
return (*HttpApi)(api)
}
================================================
FILE: client/rpc/dag.go
================================================
package rpc
import (
"bytes"
"context"
"fmt"
"io"
"github.com/ipfs/boxo/path"
blocks "github.com/ipfs/go-block-format"
"github.com/ipfs/go-cid"
format "github.com/ipfs/go-ipld-format"
"github.com/ipfs/kubo/core/coreiface/options"
multicodec "github.com/multiformats/go-multicodec"
)
type (
httpNodeAdder HttpApi
HttpDagServ httpNodeAdder
pinningHttpNodeAdder httpNodeAdder
)
func (api *HttpDagServ) Get(ctx context.Context, c cid.Cid) (format.Node, error) {
r, err := api.core().Block().Get(ctx, path.FromCid(c))
if err != nil {
return nil, err
}
data, err := io.ReadAll(r)
if err != nil {
return nil, err
}
blk, err := blocks.NewBlockWithCid(data, c)
if err != nil {
return nil, err
}
return api.ipldDecoder.DecodeNode(ctx, blk)
}
func (api *HttpDagServ) GetMany(ctx context.Context, cids []cid.Cid) <-chan *format.NodeOption {
out := make(chan *format.NodeOption)
for _, c := range cids {
// TODO: Consider limiting concurrency of this somehow
go func(c cid.Cid) {
n, err := api.Get(ctx, c)
select {
case out <- &format.NodeOption{Node: n, Err: err}:
case <-ctx.Done():
}
}(c)
}
return out
}
func (api *httpNodeAdder) add(ctx context.Context, nd format.Node, pin bool) error {
c := nd.Cid()
prefix := c.Prefix()
// preserve 'cid-codec' when sent over HTTP
cidCodec := multicodec.Code(prefix.Codec).String()
// 'format' got replaced by 'cid-codec' in https://github.com/ipfs/interface-go-ipfs-core/pull/80
// but we still support it here for backward-compatibility with use of CIDv0
format := ""
if prefix.Version == 0 {
cidCodec = ""
format = "v0"
}
stat, err := api.core().Block().Put(ctx, bytes.NewReader(nd.RawData()),
options.Block.Hash(prefix.MhType, prefix.MhLength),
options.Block.CidCodec(cidCodec),
options.Block.Format(format),
options.Block.Pin(pin))
if err != nil {
return err
}
if !stat.Path().RootCid().Equals(c) {
return fmt.Errorf("cids didn't match - local %s, remote %s", c.String(), stat.Path().RootCid().String())
}
return nil
}
func (api *httpNodeAdder) addMany(ctx context.Context, nds []format.Node, pin bool) error {
for _, nd := range nds {
// TODO: optimize
if err := api.add(ctx, nd, pin); err != nil {
return err
}
}
return nil
}
func (api *HttpDagServ) AddMany(ctx context.Context, nds []format.Node) error {
return (*httpNodeAdder)(api).addMany(ctx, nds, false)
}
func (api *HttpDagServ) Add(ctx context.Context, nd format.Node) error {
return (*httpNodeAdder)(api).add(ctx, nd, false)
}
func (api *pinningHttpNodeAdder) Add(ctx context.Context, nd format.Node) error {
return (*httpNodeAdder)(api).add(ctx, nd, true)
}
func (api *pinningHttpNodeAdder) AddMany(ctx context.Context, nds []format.Node) error {
return (*httpNodeAdder)(api).addMany(ctx, nds, true)
}
func (api *HttpDagServ) Pinning() format.NodeAdder {
return (*pinningHttpNodeAdder)(api)
}
func (api *HttpDagServ) Remove(ctx context.Context, c cid.Cid) error {
return api.core().Block().Rm(ctx, path.FromCid(c)) // TODO: should we force rm?
}
func (api *HttpDagServ) RemoveMany(ctx context.Context, cids []cid.Cid) error {
for _, c := range cids {
// TODO: optimize
if err := api.Remove(ctx, c); err != nil {
return err
}
}
return nil
}
func (api *httpNodeAdder) core() *HttpApi {
return (*HttpApi)(api)
}
func (api *HttpDagServ) core() *HttpApi {
return (*HttpApi)(api)
}
================================================
FILE: client/rpc/errors.go
================================================
package rpc
import (
"errors"
"strings"
"unicode/utf8"
"github.com/ipfs/go-cid"
ipld "github.com/ipfs/go-ipld-format"
mbase "github.com/multiformats/go-multibase"
)
// This file handle parsing and returning the correct ABI based errors from error messages
type prePostWrappedNotFoundError struct {
pre string
post string
wrapped ipld.ErrNotFound
}
func (e prePostWrappedNotFoundError) String() string {
return e.Error()
}
func (e prePostWrappedNotFoundError) Error() string {
return e.pre + e.wrapped.Error() + e.post
}
func (e prePostWrappedNotFoundError) Unwrap() error {
return e.wrapped
}
func parseErrNotFoundWithFallbackToMSG(msg string) error {
err, handled := parseErrNotFound(msg)
if handled {
return err
}
return errors.New(msg)
}
func parseErrNotFoundWithFallbackToError(msg error) error {
err, handled := parseErrNotFound(msg.Error())
if handled {
return err
}
return msg
}
func parseErrNotFound(msg string) (error, bool) {
if msg == "" {
return nil, true // Fast path
}
if err, handled := parseIPLDErrNotFound(msg); handled {
return err, true
}
if err, handled := parseBlockstoreNotFound(msg); handled {
return err, true
}
return nil, false
}
// Assume CIDs break on:
// - Whitespaces: " \t\n\r\v\f"
// - Semicolon: ";" this is to parse ipld.ErrNotFound wrapped in multierr
// - Double Quotes: "\"" this is for parsing %q and %#v formatting.
const cidBreakSet = " \t\n\r\v\f;\""
func parseIPLDErrNotFound(msg string) (error, bool) {
// The pattern we search for is:
const ipldErrNotFoundKey = "ipld: could not find " /*CID*/
// We try to parse the CID, if it's invalid we give up and return a simple text error.
// We also accept "node" in place of the CID because that means it's an Undefined CID.
keyIndex := strings.Index(msg, ipldErrNotFoundKey)
if keyIndex < 0 { // Unknown error
return nil, false
}
cidStart := keyIndex + len(ipldErrNotFoundKey)
msgPostKey := msg[cidStart:]
var c cid.Cid
var postIndex int
if strings.HasPrefix(msgPostKey, "node") {
// Fallback case
c = cid.Undef
postIndex = len("node")
} else {
postIndex = strings.IndexFunc(msgPostKey, func(r rune) bool {
return strings.ContainsAny(string(r), cidBreakSet)
})
if postIndex < 0 {
// no breakage meaning the string look like this something + "ipld: could not find bafy"
postIndex = len(msgPostKey)
}
cidStr := msgPostKey[:postIndex]
var err error
c, err = cid.Decode(cidStr)
if err != nil {
// failed to decode CID give up
return nil, false
}
// check that the CID is either a CIDv0 or a base32 multibase
// because that what ipld.ErrNotFound.Error() -> cid.Cid.String() do currently
if c.Version() != 0 {
baseRune, _ := utf8.DecodeRuneInString(cidStr)
if baseRune == utf8.RuneError || baseRune != mbase.Base32 {
// not a multibase we expect, give up
return nil, fal
gitextract__oi967oe/ ├── .codeclimate.yml ├── .cspell.yml ├── .dockerignore ├── .gitattributes ├── .github/ │ ├── CODEOWNERS │ ├── FUNDING.yml │ ├── ISSUE_TEMPLATE/ │ │ ├── bug-report.yml │ │ ├── config.yml │ │ ├── doc.yml │ │ ├── enhancement.yml │ │ └── feature.yml │ ├── auto-comment.yml │ ├── build-platforms.yml │ ├── dependabot.yml │ ├── pull_request_template.md │ └── workflows/ │ ├── changelog.yml │ ├── codeql-analysis.yml │ ├── dependabot-tidy.yml │ ├── docker-check.yml │ ├── docker-image.yml │ ├── gateway-conformance.yml │ ├── generated-pr.yml │ ├── gobuild.yml │ ├── golang-analysis.yml │ ├── golint.yml │ ├── gotest.yml │ ├── interop.yml │ ├── sharness.yml │ ├── spellcheck.yml │ ├── stale.yml │ ├── sync-release-assets.yml │ └── test-migrations.yml ├── .gitignore ├── .golangci.yml ├── .hadolint.yaml ├── .mailmap ├── AGENTS.md ├── CHANGELOG.md ├── CONTRIBUTING.md ├── Dockerfile ├── FUNDING.json ├── GNUmakefile ├── LICENSE ├── LICENSE-APACHE ├── LICENSE-MIT ├── Makefile ├── README.md ├── Rules.mk ├── SECURITY.md ├── assets/ │ ├── README.md │ ├── assets.go │ └── init-doc/ │ ├── about │ ├── contact │ ├── docs/ │ │ └── index │ ├── help │ ├── ping │ ├── quick-start │ ├── readme │ └── security-notes ├── bin/ │ ├── Rules.mk │ ├── archive-branches.sh │ ├── container_daemon │ ├── container_init_run │ ├── dist_get │ ├── gencmdref │ ├── get-docker-tags.sh │ ├── graphmd │ ├── ipns-republish │ ├── maketarball.sh │ ├── mkreleaselog │ ├── push-docker-tags.sh │ ├── test-go-build-platforms │ └── test-go-fmt ├── blocks/ │ └── blockstoreutil/ │ └── remove.go ├── client/ │ └── rpc/ │ ├── README.md │ ├── api.go │ ├── api_test.go │ ├── apifile.go │ ├── auth/ │ │ └── auth.go │ ├── block.go │ ├── dag.go │ ├── errors.go │ ├── errors_test.go │ ├── key.go │ ├── name.go │ ├── object.go │ ├── path.go │ ├── pin.go │ ├── pubsub.go │ ├── request.go │ ├── requestbuilder.go │ ├── response.go │ ├── routing.go │ ├── swarm.go │ └── unixfs.go ├── codecov.yml ├── commands/ │ ├── context.go │ └── reqlog.go ├── config/ │ ├── addresses.go │ ├── api.go │ ├── api_test.go │ ├── autoconf.go │ ├── autoconf_client.go │ ├── autoconf_test.go │ ├── autonat.go │ ├── autotls.go │ ├── bitswap.go │ ├── bootstrap_peers.go │ ├── bootstrap_peers_test.go │ ├── config.go │ ├── config_test.go │ ├── datastore.go │ ├── discovery.go │ ├── dns.go │ ├── experiments.go │ ├── gateway.go │ ├── http_retrieval.go │ ├── identity.go │ ├── import.go │ ├── import_test.go │ ├── init.go │ ├── init_test.go │ ├── internal.go │ ├── ipns.go │ ├── migration.go │ ├── migration_test.go │ ├── mounts.go │ ├── peering.go │ ├── plugins.go │ ├── profile.go │ ├── provide.go │ ├── provide_test.go │ ├── provider.go │ ├── pubsub.go │ ├── remotepin.go │ ├── reprovider.go │ ├── routing.go │ ├── routing_test.go │ ├── serialize/ │ │ ├── serialize.go │ │ └── serialize_test.go │ ├── swarm.go │ ├── types.go │ ├── types_test.go │ └── version.go ├── core/ │ ├── .gitignore │ ├── builder.go │ ├── commands/ │ │ ├── active.go │ │ ├── add.go │ │ ├── bitswap.go │ │ ├── block.go │ │ ├── bootstrap.go │ │ ├── cat.go │ │ ├── cid.go │ │ ├── cid_test.go │ │ ├── cmdenv/ │ │ │ ├── cidbase.go │ │ │ ├── cidbase_test.go │ │ │ ├── env.go │ │ │ ├── env_test.go │ │ │ └── file.go │ │ ├── cmdutils/ │ │ │ ├── sanitize.go │ │ │ ├── utils.go │ │ │ └── utils_test.go │ │ ├── commands.go │ │ ├── commands_test.go │ │ ├── completion.go │ │ ├── config.go │ │ ├── config_test.go │ │ ├── dag/ │ │ │ ├── dag.go │ │ │ ├── export.go │ │ │ ├── get.go │ │ │ ├── import.go │ │ │ ├── put.go │ │ │ ├── resolve.go │ │ │ └── stat.go │ │ ├── dht.go │ │ ├── dht_test.go │ │ ├── diag.go │ │ ├── e/ │ │ │ └── error.go │ │ ├── external.go │ │ ├── extra.go │ │ ├── files.go │ │ ├── files_test.go │ │ ├── filestore.go │ │ ├── get.go │ │ ├── get_test.go │ │ ├── helptext_test.go │ │ ├── id.go │ │ ├── keyencode/ │ │ │ └── keyencode.go │ │ ├── keystore.go │ │ ├── log.go │ │ ├── ls.go │ │ ├── ls_test.go │ │ ├── mount_nofuse.go │ │ ├── mount_unix.go │ │ ├── mount_windows.go │ │ ├── multibase.go │ │ ├── name/ │ │ │ ├── ipns.go │ │ │ ├── ipnsps.go │ │ │ ├── name.go │ │ │ └── publish.go │ │ ├── object/ │ │ │ ├── diff.go │ │ │ ├── object.go │ │ │ └── patch.go │ │ ├── p2p.go │ │ ├── pin/ │ │ │ ├── pin.go │ │ │ ├── remotepin.go │ │ │ └── remotepin_test.go │ │ ├── ping.go │ │ ├── profile.go │ │ ├── provide.go │ │ ├── pubsub.go │ │ ├── refs.go │ │ ├── repo.go │ │ ├── repo_verify_test.go │ │ ├── resolve.go │ │ ├── root.go │ │ ├── root_test.go │ │ ├── routing.go │ │ ├── shutdown.go │ │ ├── stat.go │ │ ├── stat_dht.go │ │ ├── stat_provide.go │ │ ├── stat_reprovide.go │ │ ├── swarm.go │ │ ├── swarm_addrs_autonat.go │ │ ├── sysdiag.go │ │ └── version.go │ ├── core.go │ ├── core_test.go │ ├── coreapi/ │ │ ├── block.go │ │ ├── coreapi.go │ │ ├── dag.go │ │ ├── key.go │ │ ├── name.go │ │ ├── object.go │ │ ├── path.go │ │ ├── pin.go │ │ ├── pubsub.go │ │ ├── routing.go │ │ ├── swarm.go │ │ ├── test/ │ │ │ ├── api_test.go │ │ │ └── path_test.go │ │ └── unixfs.go │ ├── corehttp/ │ │ ├── commands.go │ │ ├── corehttp.go │ │ ├── gateway.go │ │ ├── gateway_test.go │ │ ├── logs.go │ │ ├── metrics.go │ │ ├── metrics_test.go │ │ ├── mutex_profile.go │ │ ├── option_test.go │ │ ├── p2p_proxy.go │ │ ├── p2p_proxy_test.go │ │ ├── redirect.go │ │ ├── routing.go │ │ └── webui.go │ ├── coreiface/ │ │ ├── block.go │ │ ├── coreapi.go │ │ ├── dag.go │ │ ├── errors.go │ │ ├── idfmt.go │ │ ├── key.go │ │ ├── name.go │ │ ├── object.go │ │ ├── options/ │ │ │ ├── block.go │ │ │ ├── dht.go │ │ │ ├── global.go │ │ │ ├── key.go │ │ │ ├── name.go │ │ │ ├── object.go │ │ │ ├── pin.go │ │ │ ├── pubsub.go │ │ │ ├── routing.go │ │ │ ├── unixfs.go │ │ │ └── unixfs_test.go │ │ ├── pin.go │ │ ├── pubsub.go │ │ ├── routing.go │ │ ├── swarm.go │ │ ├── tests/ │ │ │ ├── api.go │ │ │ ├── block.go │ │ │ ├── dag.go │ │ │ ├── key.go │ │ │ ├── name.go │ │ │ ├── object.go │ │ │ ├── path.go │ │ │ ├── pin.go │ │ │ ├── pubsub.go │ │ │ ├── routing.go │ │ │ └── unixfs.go │ │ ├── unixfs.go │ │ └── util.go │ ├── corerepo/ │ │ ├── gc.go │ │ └── stat.go │ ├── coreunix/ │ │ ├── add.go │ │ ├── add_test.go │ │ ├── metadata.go │ │ ├── metadata_test.go │ │ └── test/ │ │ └── data/ │ │ ├── colors/ │ │ │ └── orange │ │ ├── corps/ │ │ │ └── apple │ │ └── fruits/ │ │ ├── apple │ │ └── orange │ ├── mock/ │ │ └── mock.go │ └── node/ │ ├── bitswap.go │ ├── builder.go │ ├── core.go │ ├── dns.go │ ├── groups.go │ ├── helpers/ │ │ └── helpers.go │ ├── helpers.go │ ├── identity.go │ ├── ipns.go │ ├── libp2p/ │ │ ├── addrs.go │ │ ├── discovery.go │ │ ├── dns.go │ │ ├── fd/ │ │ │ ├── sys_not_unix.go │ │ │ ├── sys_unix.go │ │ │ └── sys_windows.go │ │ ├── filters.go │ │ ├── host.go │ │ ├── hostopt.go │ │ ├── libp2p.go │ │ ├── libp2p_test.go │ │ ├── nat.go │ │ ├── peerstore.go │ │ ├── pnet.go │ │ ├── pubsub.go │ │ ├── pubsub_test.go │ │ ├── rcmgr.go │ │ ├── rcmgr_defaults.go │ │ ├── rcmgr_logging.go │ │ ├── rcmgr_logging_test.go │ │ ├── relay.go │ │ ├── routing.go │ │ ├── routingopt.go │ │ ├── routingopt_test.go │ │ ├── sec.go │ │ ├── smux.go │ │ ├── topicdiscovery.go │ │ └── transport.go │ ├── p2pforge_resolver.go │ ├── p2pforge_resolver_test.go │ ├── peering.go │ ├── provider.go │ └── storage.go ├── coverage/ │ ├── .gitignore │ ├── Rules.mk │ └── main/ │ └── main.go ├── doc.go ├── docker-compose.yaml ├── docs/ │ ├── EARLY_TESTERS.md │ ├── README.md │ ├── RELEASE_CHECKLIST.md │ ├── RELEASE_ISSUE_TEMPLATE.md │ ├── add-code-flow.md │ ├── changelogs/ │ │ ├── v0.10.md │ │ ├── v0.11.md │ │ ├── v0.12.md │ │ ├── v0.13.md │ │ ├── v0.14.md │ │ ├── v0.15.md │ │ ├── v0.16.md │ │ ├── v0.17.md │ │ ├── v0.18.md │ │ ├── v0.19.md │ │ ├── v0.2.md │ │ ├── v0.20.md │ │ ├── v0.21.md │ │ ├── v0.22.md │ │ ├── v0.23.md │ │ ├── v0.24.md │ │ ├── v0.25.md │ │ ├── v0.26.md │ │ ├── v0.27.md │ │ ├── v0.28.md │ │ ├── v0.29.md │ │ ├── v0.3.md │ │ ├── v0.30.md │ │ ├── v0.31.md │ │ ├── v0.32.md │ │ ├── v0.33.md │ │ ├── v0.34.md │ │ ├── v0.35.md │ │ ├── v0.36.md │ │ ├── v0.37.md │ │ ├── v0.38.md │ │ ├── v0.39.md │ │ ├── v0.4.md │ │ ├── v0.40.md │ │ ├── v0.41.md │ │ ├── v0.42.md │ │ ├── v0.5.md │ │ ├── v0.6.md │ │ ├── v0.7.md │ │ ├── v0.8.md │ │ └── v0.9.md │ ├── command-completion.md │ ├── config.md │ ├── content-blocking.md │ ├── customizing.md │ ├── datastores.md │ ├── debug-guide.md │ ├── delegated-routing.md │ ├── developer-certificate-of-origin │ ├── developer-guide.md │ ├── environment-variables.md │ ├── examples/ │ │ └── kubo-as-a-library/ │ │ ├── README.md │ │ ├── go.mod │ │ ├── go.sum │ │ ├── main.go │ │ └── main_test.go │ ├── experimental-features.md │ ├── file-transfer.md │ ├── fuse.md │ ├── gateway.md │ ├── http-rpc-clients.md │ ├── implement-api-bindings.md │ ├── libp2p-resource-management.md │ ├── metrics.md │ ├── p2p-tunnels.md │ ├── plugins.md │ ├── production/ │ │ └── reverse-proxy.md │ ├── provide-stats.md │ ├── releases.md │ ├── releases_thunderdome.md │ ├── specifications/ │ │ ├── keystore.md │ │ ├── repository.md │ │ └── repository_fs.md │ ├── telemetry.md │ ├── transports.md │ └── windows.md ├── fuse/ │ ├── ipns/ │ │ ├── common.go │ │ ├── ipns_test.go │ │ ├── ipns_unix.go │ │ ├── link_unix.go │ │ └── mount_unix.go │ ├── mfs/ │ │ ├── mfs_test.go │ │ ├── mfs_unix.go │ │ └── mount_unix.go │ ├── mount/ │ │ ├── fuse.go │ │ └── mount.go │ ├── node/ │ │ ├── mount_darwin.go │ │ ├── mount_nofuse.go │ │ ├── mount_notsupp.go │ │ ├── mount_test.go │ │ ├── mount_unix.go │ │ └── mount_windows.go │ └── readonly/ │ ├── doc.go │ ├── ipfs_test.go │ ├── mount_unix.go │ └── readonly_unix.go ├── gc/ │ ├── gc.go │ └── gc_test.go ├── go.mod ├── go.sum ├── misc/ │ ├── README.md │ ├── fsutil/ │ │ ├── fsutil.go │ │ └── fsutil_test.go │ ├── launchd/ │ │ ├── README.md │ │ ├── install.sh │ │ └── io.ipfs.ipfs-daemon.plist │ └── systemd/ │ ├── ipfs-api.socket │ ├── ipfs-gateway.socket │ ├── ipfs-hardened.service │ ├── ipfs-sysusers.conf │ └── ipfs.service ├── mk/ │ ├── footer.mk │ ├── git.mk │ ├── golang.mk │ ├── header.mk │ ├── tarball.mk │ └── util.mk ├── p2p/ │ ├── listener.go │ ├── local.go │ ├── p2p.go │ ├── remote.go │ └── stream.go ├── plugin/ │ ├── Rules.mk │ ├── daemon.go │ ├── daemoninternal.go │ ├── datastore.go │ ├── fx.go │ ├── ipld.go │ ├── loader/ │ │ ├── Rules.mk │ │ ├── load_nocgo.go │ │ ├── load_noplugin.go │ │ ├── load_unix.go │ │ ├── loader.go │ │ ├── preload.go │ │ ├── preload.sh │ │ └── preload_list │ ├── plugin.go │ ├── plugins/ │ │ ├── .gitignore │ │ ├── Rules.mk │ │ ├── badgerds/ │ │ │ └── badgerds.go │ │ ├── dagjose/ │ │ │ └── dagjose.go │ │ ├── flatfs/ │ │ │ └── flatfs.go │ │ ├── fxtest/ │ │ │ └── fxtest.go │ │ ├── gen_main.sh │ │ ├── git/ │ │ │ └── git.go │ │ ├── levelds/ │ │ │ └── levelds.go │ │ ├── nopfs/ │ │ │ └── nopfs.go │ │ ├── pebbleds/ │ │ │ └── pebbleds.go │ │ ├── peerlog/ │ │ │ ├── peerlog.go │ │ │ └── peerlog_test.go │ │ └── telemetry/ │ │ ├── telemetry.go │ │ ├── telemetry_test.go │ │ └── telemetry_uuid │ └── tracer.go ├── profile/ │ ├── goroutines.go │ ├── profile.go │ └── profile_test.go ├── repo/ │ ├── common/ │ │ ├── common.go │ │ └── common_test.go │ ├── fsrepo/ │ │ ├── config_test.go │ │ ├── datastores.go │ │ ├── doc.go │ │ ├── fsrepo.go │ │ ├── fsrepo_test.go │ │ ├── migrations/ │ │ │ ├── README.md │ │ │ ├── atomicfile/ │ │ │ │ ├── atomicfile.go │ │ │ │ └── atomicfile_test.go │ │ │ ├── common/ │ │ │ │ ├── base.go │ │ │ │ ├── config_helpers.go │ │ │ │ ├── migration.go │ │ │ │ ├── testing_helpers.go │ │ │ │ └── utils.go │ │ │ ├── embedded.go │ │ │ ├── embedded_test.go │ │ │ ├── fetch.go │ │ │ ├── fetch_test.go │ │ │ ├── fetcher.go │ │ │ ├── fs-repo-16-to-17/ │ │ │ │ ├── main.go │ │ │ │ └── migration/ │ │ │ │ ├── migration.go │ │ │ │ └── migration_test.go │ │ │ ├── fs-repo-17-to-18/ │ │ │ │ ├── main.go │ │ │ │ └── migration/ │ │ │ │ ├── migration.go │ │ │ │ └── migration_test.go │ │ │ ├── httpfetcher.go │ │ │ ├── ipfsdir.go │ │ │ ├── ipfsdir_test.go │ │ │ ├── ipfsfetcher/ │ │ │ │ ├── ipfsfetcher.go │ │ │ │ └── ipfsfetcher_test.go │ │ │ ├── migrations.go │ │ │ ├── migrations_test.go │ │ │ ├── retryfetcher.go │ │ │ ├── setup_test.go │ │ │ ├── unpack.go │ │ │ ├── unpack_test.go │ │ │ ├── versions.go │ │ │ └── versions_test.go │ │ └── misc.go │ ├── mock.go │ ├── onlyone.go │ └── repo.go ├── routing/ │ ├── composer.go │ ├── delegated.go │ ├── delegated_test.go │ ├── error.go │ └── wrapper.go ├── test/ │ ├── .gitignore │ ├── 3nodetest/ │ │ ├── GNUmakefile │ │ ├── README.md │ │ ├── bin/ │ │ │ ├── .gitignore │ │ │ ├── clean.sh │ │ │ ├── save_logs.sh │ │ │ └── save_profiling_data.sh │ │ ├── bootstrap/ │ │ │ ├── Dockerfile │ │ │ ├── README.md │ │ │ └── config │ │ ├── build/ │ │ │ ├── .gitignore │ │ │ └── .gitkeep │ │ ├── client/ │ │ │ ├── Dockerfile │ │ │ ├── config │ │ │ └── run.sh │ │ ├── data/ │ │ │ ├── .gitignore │ │ │ └── Dockerfile │ │ ├── fig.yml │ │ ├── run-test-on-img.sh │ │ └── server/ │ │ ├── Dockerfile │ │ ├── README.md │ │ ├── config │ │ └── run.sh │ ├── README.md │ ├── Rules.mk │ ├── api-startup/ │ │ └── main.go │ ├── bench/ │ │ ├── bench_cli_ipfs_add/ │ │ │ └── main.go │ │ └── offline_add/ │ │ └── main.go │ ├── bin/ │ │ ├── .gitignore │ │ ├── Rules.mk │ │ ├── checkflags │ │ └── continueyn │ ├── cli/ │ │ ├── add_test.go │ │ ├── agent_version_unicode_test.go │ │ ├── api_file_test.go │ │ ├── autoconf/ │ │ │ ├── autoconf_test.go │ │ │ ├── dns_test.go │ │ │ ├── expand_comprehensive_test.go │ │ │ ├── expand_fallback_test.go │ │ │ ├── expand_test.go │ │ │ ├── extensibility_test.go │ │ │ ├── fuzz_test.go │ │ │ ├── ipns_test.go │ │ │ ├── routing_test.go │ │ │ ├── swarm_connect_test.go │ │ │ ├── testdata/ │ │ │ │ ├── autoconf_amino_and_ipni.json │ │ │ │ ├── autoconf_new_routing_system.json │ │ │ │ ├── autoconf_new_routing_with_filtering.json │ │ │ │ ├── autoconf_with_unsupported_paths.json │ │ │ │ ├── updated_autoconf.json │ │ │ │ └── valid_autoconf.json │ │ │ └── validation_test.go │ │ ├── backup_bootstrap_test.go │ │ ├── basic_commands_test.go │ │ ├── bitswap_config_test.go │ │ ├── block_size_test.go │ │ ├── bootstrap_auto_test.go │ │ ├── cid_profiles_test.go │ │ ├── cid_test.go │ │ ├── cli_https_test.go │ │ ├── commands_without_repo_test.go │ │ ├── completion_test.go │ │ ├── config_secrets_test.go │ │ ├── content_blocking_test.go │ │ ├── content_routing_http_test.go │ │ ├── daemon_test.go │ │ ├── dag_layout_test.go │ │ ├── dag_test.go │ │ ├── delegated_routing_v1_http_client_test.go │ │ ├── delegated_routing_v1_http_proxy_test.go │ │ ├── delegated_routing_v1_http_server_test.go │ │ ├── dht_autoclient_test.go │ │ ├── dht_opt_prov_test.go │ │ ├── diag_datastore_test.go │ │ ├── dns_resolvers_multiaddr_test.go │ │ ├── files_test.go │ │ ├── fixtures/ │ │ │ ├── README.md │ │ │ ├── TestDagStat.car │ │ │ ├── TestDagStatExpectedOutput.txt │ │ │ ├── TestGatewayHAMTDirectory.car │ │ │ ├── TestGatewayMultiRange.car │ │ │ └── TestName.car │ │ ├── fuse_test.go │ │ ├── gateway_limits_test.go │ │ ├── gateway_range_test.go │ │ ├── gateway_test.go │ │ ├── harness/ │ │ │ ├── buffer.go │ │ │ ├── harness.go │ │ │ ├── http_client.go │ │ │ ├── ipfs.go │ │ │ ├── log.go │ │ │ ├── node.go │ │ │ ├── nodes.go │ │ │ ├── pbinspect.go │ │ │ ├── peering.go │ │ │ └── run.go │ │ ├── http_gateway_over_libp2p_test.go │ │ ├── http_retrieval_client_test.go │ │ ├── identity_cid_test.go │ │ ├── init_test.go │ │ ├── ipfswatch_test.go │ │ ├── log_level_test.go │ │ ├── ls_test.go │ │ ├── migrations/ │ │ │ ├── migration_16_to_latest_test.go │ │ │ ├── migration_17_to_latest_test.go │ │ │ ├── migration_concurrent_test.go │ │ │ ├── migration_mixed_15_to_latest_test.go │ │ │ └── testdata/ │ │ │ ├── v15-repo/ │ │ │ │ ├── blocks/ │ │ │ │ │ ├── SHARDING │ │ │ │ │ ├── X3/ │ │ │ │ │ │ └── CIQFTFEEHEDF6KLBT32BFAGLXEZL4UWFNWM4LFTLMXQBCERZ6CMLX3Y.data │ │ │ │ │ ├── _README │ │ │ │ │ └── diskUsage.cache │ │ │ │ ├── config │ │ │ │ ├── datastore/ │ │ │ │ │ ├── 000001.log │ │ │ │ │ ├── CURRENT │ │ │ │ │ ├── LOCK │ │ │ │ │ ├── LOG │ │ │ │ │ └── MANIFEST-000000 │ │ │ │ ├── datastore_spec │ │ │ │ └── version │ │ │ └── v16-repo/ │ │ │ ├── blocks/ │ │ │ │ ├── SHARDING │ │ │ │ ├── X3/ │ │ │ │ │ └── CIQFTFEEHEDF6KLBT32BFAGLXEZL4UWFNWM4LFTLMXQBCERZ6CMLX3Y.data │ │ │ │ ├── _README │ │ │ │ └── diskUsage.cache │ │ │ ├── config │ │ │ ├── datastore/ │ │ │ │ ├── 000001.log │ │ │ │ ├── CURRENT │ │ │ │ ├── LOCK │ │ │ │ ├── LOG │ │ │ │ └── MANIFEST-000000 │ │ │ ├── datastore_spec │ │ │ └── version │ │ ├── must.go │ │ ├── name_test.go │ │ ├── p2p_test.go │ │ ├── peering_test.go │ │ ├── pin_ls_names_test.go │ │ ├── pin_name_validation_test.go │ │ ├── ping_test.go │ │ ├── pinning_remote_test.go │ │ ├── pins_test.go │ │ ├── provide_stats_test.go │ │ ├── provider_test.go │ │ ├── pubsub_test.go │ │ ├── rcmgr_test.go │ │ ├── repo_verify_test.go │ │ ├── routing_dht_test.go │ │ ├── rpc_auth_test.go │ │ ├── rpc_content_type_test.go │ │ ├── rpc_get_output_test.go │ │ ├── rpc_unixsocket_test.go │ │ ├── stats_test.go │ │ ├── swarm_test.go │ │ ├── telemetry_test.go │ │ ├── testutils/ │ │ │ ├── asserts.go │ │ │ ├── cids.go │ │ │ ├── files.go │ │ │ ├── floats.go │ │ │ ├── httprouting/ │ │ │ │ └── mock_http_content_router.go │ │ │ ├── json.go │ │ │ ├── pinningservice/ │ │ │ │ └── pinning.go │ │ │ ├── protobuf.go │ │ │ ├── random_deterministic.go │ │ │ ├── requires.go │ │ │ └── strings.go │ │ ├── tracing_test.go │ │ ├── transports_test.go │ │ └── webui_test.go │ ├── dependencies/ │ │ ├── GNUmakefile │ │ ├── dependencies.go │ │ ├── go.mod │ │ ├── go.sum │ │ ├── iptb/ │ │ │ └── iptb.go │ │ ├── ma-pipe-unidir/ │ │ │ ├── LICENSE │ │ │ └── main.go │ │ └── pollEndpoint/ │ │ └── main.go │ ├── integration/ │ │ ├── GNUmakefile │ │ ├── addcat_test.go │ │ ├── bench_cat_test.go │ │ ├── bench_test.go │ │ ├── bitswap_wo_routing_test.go │ │ ├── three_legged_cat_test.go │ │ └── wan_lan_dht_test.go │ ├── ipfs-test-lib.sh │ ├── sharness/ │ │ ├── .gitignore │ │ ├── GNUmakefile │ │ ├── README.md │ │ ├── Rules.mk │ │ ├── lib/ │ │ │ ├── install-sharness.sh │ │ │ ├── iptb-lib.sh │ │ │ ├── test-aggregate-junit-reports.sh │ │ │ ├── test-aggregate-results.sh │ │ │ ├── test-lib-hashes.sh │ │ │ └── test-lib.sh │ │ ├── t0001-tests-work.sh │ │ ├── t0002-docker-image.sh │ │ ├── t0003-docker-migrate.sh │ │ ├── t0012-completion-fish.sh │ │ ├── t0015-basic-sh-functions.sh │ │ ├── t0018-indent.sh │ │ ├── t0021-config.sh │ │ ├── t0022-init-default.sh │ │ ├── t0023-shutdown.sh │ │ ├── t0024-datastore-config.sh │ │ ├── t0024-files/ │ │ │ ├── spec-newshardfun │ │ │ └── spec-nosync │ │ ├── t0025-datastores.sh │ │ ├── t0026-id.sh │ │ ├── t0027-rotate.sh │ │ ├── t0030-mount.sh │ │ ├── t0031-mount-publish.sh │ │ ├── t0032-mount-sharded.sh │ │ ├── t0040-add-and-cat.sh │ │ ├── t0042-add-skip.sh │ │ ├── t0043-add-w.sh │ │ ├── t0044-add-symlink.sh │ │ ├── t0045-ls.sh │ │ ├── t0046-id-hash.sh │ │ ├── t0047-add-mode-mtime.sh │ │ ├── t0050-block-data/ │ │ │ └── testPut.pb │ │ ├── t0050-block.sh │ │ ├── t0051-object.sh │ │ ├── t0052-object-diff.sh │ │ ├── t0053-dag-data/ │ │ │ └── non-canon.cbor │ │ ├── t0053-dag.sh │ │ ├── t0054-dag-car-import-export-data/ │ │ │ ├── README.md │ │ │ └── test_dataset_car.tar.xz │ │ ├── t0054-dag-car-import-export.sh │ │ ├── t0055-dag-put-json-new-line.sh │ │ ├── t0060-daemon.sh │ │ ├── t0060-data/ │ │ │ ├── mss-noise │ │ │ ├── mss-plaintext │ │ │ └── mss-tls │ │ ├── t0061-daemon-opts.sh │ │ ├── t0062-daemon-api.sh │ │ ├── t0063-daemon-init.sh │ │ ├── t0063-external.sh │ │ ├── t0064-api-file.sh │ │ ├── t0065-active-requests.sh │ │ ├── t0066-migration.sh │ │ ├── t0067-unix-api.sh │ │ ├── t0070-user-config.sh │ │ ├── t0080-repo.sh │ │ ├── t0081-repo-pinning.sh │ │ ├── t0082-repo-gc-auto.sh │ │ ├── t0084-repo-read-rehash.sh │ │ ├── t0086-repo-verify.sh │ │ ├── t0087-repo-robust-gc.sh │ │ ├── t0088-repo-stat-symlink.sh │ │ ├── t0090-get.sh │ │ ├── t0095-refs.sh │ │ ├── t0101-iptb-name.sh │ │ ├── t0109-gateway-web-_redirects-data/ │ │ │ └── redirects.car │ │ ├── t0109-gateway-web-_redirects.sh │ │ ├── t0112-gateway-cors.sh │ │ ├── t0114-gateway-subdomains/ │ │ │ ├── 12D3KooWLQzUv2FHWGVPXTXSZpdHs7oHbXub2G5WC8Tx4NQhyd2d.ipns-record │ │ │ ├── QmVujd5Vb7moysJj8itnGufN7MEtPRCNHkKpNuA4onsRa3.ipns-record │ │ │ ├── README.md │ │ │ └── fixtures.car │ │ ├── t0114-gateway-subdomains.sh │ │ ├── t0115-gateway-dir-listing/ │ │ │ ├── README.md │ │ │ └── fixtures.car │ │ ├── t0115-gateway-dir-listing.sh │ │ ├── t0116-gateway-cache/ │ │ │ ├── README.md │ │ │ ├── fixtures.car │ │ │ └── k51qzi5uqu5dlxdsdu5fpuu7h69wu4ohp32iwm9pdt9nq3y5rpn3ln9j12zfhe.ipns-record │ │ ├── t0116-gateway-cache.sh │ │ ├── t0119-prometheus-data/ │ │ │ ├── prometheus_metrics │ │ │ ├── prometheus_metrics_added_by_enabling_rcmgr │ │ │ └── prometheus_metrics_added_by_measure_profile │ │ ├── t0119-prometheus.sh │ │ ├── t0120-bootstrap.sh │ │ ├── t0121-bootstrap-iptb.sh │ │ ├── t0131-multinode-client-routing.sh │ │ ├── t0140-swarm.sh │ │ ├── t0141-addfilter.sh │ │ ├── t0142-testfilter.sh │ │ ├── t0150-clisuggest.sh │ │ ├── t0151-sysdiag.sh │ │ ├── t0152-profile.sh │ │ ├── t0160-resolve.sh │ │ ├── t0165-keystore-data/ │ │ │ ├── README.md │ │ │ ├── openssl_ed25519.pem │ │ │ ├── openssl_rsa.pem │ │ │ └── openssl_secp384r1.pem │ │ ├── t0165-keystore.sh │ │ ├── t0180-p2p.sh │ │ ├── t0181-private-network.sh │ │ ├── t0182-circuit-relay.sh │ │ ├── t0183-namesys-pubsub.sh │ │ ├── t0184-http-proxy-over-p2p.sh │ │ ├── t0185-autonat.sh │ │ ├── t0190-quic-ping.sh │ │ ├── t0191-webtransport-ping.sh │ │ ├── t0195-noise.sh │ │ ├── t0220-bitswap.sh │ │ ├── t0230-channel-streaming-http-content-type.sh │ │ ├── t0231-channel-streaming.sh │ │ ├── t0235-cli-request.sh │ │ ├── t0236-cli-api-dns-resolve.sh │ │ ├── t0240-republisher.sh │ │ ├── t0250-files-api.sh │ │ ├── t0251-files-flushing.sh │ │ ├── t0252-files-gc.sh │ │ ├── t0260-sharding.sh │ │ ├── t0270-filestore.sh │ │ ├── t0271-filestore-utils.sh │ │ ├── t0272-urlstore.sh │ │ ├── t0275-cid-security-data/ │ │ │ ├── CIQG6PGTD2VV34S33BE4MNCQITBRFYUPYQLDXYARR3DQW37MOT7K5XI.data │ │ │ └── EICEM7ITSI.data │ │ ├── t0275-cid-security.sh │ │ ├── t0276-cidv0v1.sh │ │ ├── t0280-plugin-dag-jose-data/ │ │ │ ├── dag-cbor/ │ │ │ │ ├── bafyreicxyzuqbx5yb7ytkgkuofwksbal3ygtswxuri25crxdxms55m5fki │ │ │ │ ├── bafyreihdfxoshbhowufyvjk7kq46dt6h7u6byejmlnifz34z7ocoq7ugk4 │ │ │ │ └── bafyreihkt4u6euddfhofkutfzxwet7w7zm5qrjpop655yhnb5dnzqw26lm │ │ │ ├── dag-jose/ │ │ │ │ ├── bagcqcera542h3xc57nudkgjcceexyzyxrkwi4ikbn773ag6dqdcyjt6z6rga │ │ │ │ ├── bagcqcera5uvz2qai6l4vmqjigwpowluilxngz3dyjnva2s3uwbfb5u4ao4fa │ │ │ │ ├── bagcqcera7azagcqlpu4ivvh4xp4iv6psmb5d7eki6ln3fnfnsnbb2hzv4nxq │ │ │ │ ├── bagcqcerakjv2mmdlbai3urym22bw5kaw7nqov73yaxf6xjnp7e56sclsrooa │ │ │ │ ├── bagcqceraqfknq7xaemcihmq2albau32ttrutxnco7xeoik6mlejismmvw5zq │ │ │ │ ├── bagcqcerauben4l6ee2wjf2fnkj7vaels4p7lnytenk35j3gl2lzcbtbgyoea │ │ │ │ ├── bagcqceravvw4bx7jgkxxjwfuqo2yoja6w4cmvmu3gkew3s7yu3vt2ce7riwa │ │ │ │ ├── bagcqceraxazmu67crshzqdeg3kwnfschs25epy5sbtqtjre2qw3d62kzplva │ │ │ │ └── bagcqceraxvt5izt4sz7kjfrm42dxrutp6ijywgsacllkznzekmfojypkvfea │ │ │ └── dag-json/ │ │ │ ├── baguqeeraloya3qpa25kl5l4y3bzgl7rhyta2p7lwaocyxx4vpvdligb7mt2q │ │ │ ├── baguqeeraovfm3rr3pvmxm27zgvxp5wycbfih35xih2uznminpnds5esm4jlq │ │ │ └── baguqeeravexfd6qijjtnzxfqq6kgknnkncztgmvhjhxm6ih352qskolt2gxa │ │ ├── t0280-plugin-dag-jose.sh │ │ ├── t0280-plugin-data/ │ │ │ └── example.go │ │ ├── t0280-plugin-fx.sh │ │ ├── t0280-plugin-git.sh │ │ ├── t0280-plugin-peerlog.sh │ │ ├── t0280-plugin.sh │ │ ├── t0290-cid.sh │ │ ├── t0295-multibase.sh │ │ ├── t0320-pubsub.sh │ │ ├── t0321-pubsub-gossipsub.sh │ │ ├── t0322-pubsub-http-rpc.sh │ │ ├── t0400-api-no-gateway/ │ │ │ ├── README.md │ │ │ └── fixtures.car │ │ ├── t0400-api-no-gateway.sh │ │ ├── t0401-api-browser-security.sh │ │ ├── t0410-api-add.sh │ │ ├── t0500-issues-and-regressions-offline.sh │ │ ├── t0600-issues-and-regressions-online.sh │ │ ├── t0701-delegated-routing-reframe/ │ │ │ ├── FindProvidersRequest │ │ │ └── FindProvidersResponse │ │ ├── t0702-delegated-routing-http/ │ │ │ └── FindProvidersResponse │ │ ├── t0800-blake3.sh │ │ └── x0601-pin-fail-test.sh │ ├── sharness_test_coverage_helper.sh │ └── unit/ │ ├── .gitignore │ └── Rules.mk ├── thirdparty/ │ ├── README.md │ ├── unit/ │ │ ├── unit.go │ │ └── unit_test.go │ └── verifbs/ │ └── verifbs.go ├── tracing/ │ ├── doc.go │ └── tracing.go ├── version.go └── version_test.go
Showing preview only (325K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (3560 symbols across 482 files)
FILE: assets/assets.go
function SeedInitDocs (line 30) | func SeedInitDocs(nd *core.IpfsNode) (cid.Cid, error) {
function addAssetList (line 34) | func addAssetList(nd *core.IpfsNode, l []string) (cid.Cid, error) {
FILE: blocks/blockstoreutil/remove.go
type RemovedBlock (line 21) | type RemovedBlock struct
type RmBlocksOpts (line 27) | type RmBlocksOpts struct
function RmBlocks (line 37) | func RmBlocks(ctx context.Context, blocks bs.GCBlockstore, pins pin.Pinn...
function FilterPinned (line 78) | func FilterPinned(ctx context.Context, pins pin.Pinner, out chan<- any, ...
FILE: client/rpc/api.go
constant DefaultPathName (line 32) | DefaultPathName = ".ipfs"
constant DefaultPathRoot (line 33) | DefaultPathRoot = "~/" + DefaultPathName
constant DefaultApiFile (line 34) | DefaultApiFile = "api"
constant EnvDir (line 35) | EnvDir = "IPFS_PATH"
type HttpApi (line 46) | type HttpApi struct
method WithOptions (line 185) | func (api *HttpApi) WithOptions(opts ...caopts.ApiOption) (iface.CoreA...
method Request (line 206) | func (api *HttpApi) Request(command string, args ...string) RequestBui...
method Unixfs (line 221) | func (api *HttpApi) Unixfs() iface.UnixfsAPI {
method Block (line 225) | func (api *HttpApi) Block() iface.BlockAPI {
method Dag (line 229) | func (api *HttpApi) Dag() iface.APIDagService {
method Name (line 233) | func (api *HttpApi) Name() iface.NameAPI {
method Key (line 237) | func (api *HttpApi) Key() iface.KeyAPI {
method Pin (line 241) | func (api *HttpApi) Pin() iface.PinAPI {
method Object (line 245) | func (api *HttpApi) Object() iface.ObjectAPI {
method Swarm (line 249) | func (api *HttpApi) Swarm() iface.SwarmAPI {
method PubSub (line 253) | func (api *HttpApi) PubSub() iface.PubSubAPI {
method Routing (line 257) | func (api *HttpApi) Routing() iface.RoutingAPI {
method loadRemoteVersion (line 261) | func (api *HttpApi) loadRemoteVersion() (*semver.Version, error) {
function NewLocalApi (line 61) | func NewLocalApi() (*HttpApi, error) {
function NewPathApi (line 72) | func NewPathApi(ipfspath string) (*HttpApi, error) {
function ApiAddr (line 84) | func ApiAddr(ipfspath string) (ma.Multiaddr, error) {
function NewApi (line 101) | func NewApi(a ma.Multiaddr) (*HttpApi, error) {
function NewApiWithClient (line 131) | func NewApiWithClient(a ma.Multiaddr, c *http.Client) (*HttpApi, error) {
function NewURLApiWithClient (line 161) | func NewURLApiWithClient(url string, c *http.Client) (*HttpApi, error) {
FILE: client/rpc/api_test.go
type NodeProvider (line 22) | type NodeProvider struct
method MakeAPISwarm (line 24) | func (np NodeProvider) MakeAPISwarm(t *testing.T, ctx context.Context,...
function TestHttpApi (line 97) | func TestHttpApi(t *testing.T) {
function Test_NewURLApiWithClient_With_Headers (line 103) | func Test_NewURLApiWithClient_With_Headers(t *testing.T) {
function Test_NewURLApiWithClient_HTTP_Variant (line 140) | func Test_NewURLApiWithClient_HTTP_Variant(t *testing.T) {
FILE: client/rpc/apifile.go
constant forwardSeekLimit (line 19) | forwardSeekLimit = 1 << 14
method Get (line 21) | func (api *UnixfsAPI) Get(ctx context.Context, p path.Path) (files.Node,...
type apiFile (line 65) | type apiFile struct
method reset (line 78) | func (f *apiFile) reset() error {
method Read (line 98) | func (f *apiFile) Read(p []byte) (int, error) {
method ReadAt (line 106) | func (f *apiFile) ReadAt(p []byte, off int64) (int, error) {
method Seek (line 125) | func (f *apiFile) Seek(offset int64, whence int) (int64, error) {
method Close (line 146) | func (f *apiFile) Close() error {
method Mode (line 153) | func (f *apiFile) Mode() os.FileMode {
method ModTime (line 157) | func (f *apiFile) ModTime() time.Time {
method Size (line 161) | func (f *apiFile) Size() (int64, error) {
function stringToFileMode (line 165) | func stringToFileMode(mode string) (os.FileMode, error) {
method getFile (line 176) | func (api *UnixfsAPI) getFile(ctx context.Context, p path.Path, size int...
type apiIter (line 189) | type apiIter struct
method Err (line 200) | func (it *apiIter) Err() error {
method Name (line 204) | func (it *apiIter) Name() string {
method Next (line 208) | func (it *apiIter) Next() bool {
method Node (line 265) | func (it *apiIter) Node() files.Node {
type apiDir (line 269) | type apiDir struct
method Close (line 281) | func (d *apiDir) Close() error {
method Mode (line 285) | func (d *apiDir) Mode() os.FileMode {
method ModTime (line 289) | func (d *apiDir) ModTime() time.Time {
method Size (line 293) | func (d *apiDir) Size() (int64, error) {
method Entries (line 297) | func (d *apiDir) Entries() files.DirIterator {
method getDir (line 305) | func (api *UnixfsAPI) getDir(ctx context.Context, p path.Path, size int6...
method getSymlink (line 334) | func (api *UnixfsAPI) getSymlink(ctx context.Context, p path.Path, modTi...
FILE: client/rpc/auth/auth.go
type AuthorizedRoundTripper (line 7) | type AuthorizedRoundTripper struct
method RoundTrip (line 26) | func (tp *AuthorizedRoundTripper) RoundTrip(r *http.Request) (*http.Re...
function NewAuthorizedRoundTripper (line 15) | func NewAuthorizedRoundTripper(authorization string, roundTripper http.R...
FILE: client/rpc/block.go
type BlockAPI (line 17) | type BlockAPI
method Put (line 34) | func (api *BlockAPI) Put(ctx context.Context, r io.Reader, opts ...cao...
method Get (line 77) | func (api *BlockAPI) Get(ctx context.Context, p path.Path) (io.Reader,...
method Rm (line 96) | func (api *BlockAPI) Rm(ctx context.Context, p path.Path, opts ...caop...
method Stat (line 118) | func (api *BlockAPI) Stat(ctx context.Context, p path.Path) (iface.Blo...
method core (line 132) | func (api *BlockAPI) core() *HttpApi {
type blockStat (line 19) | type blockStat struct
method Size (line 26) | func (s *blockStat) Size() int {
method Path (line 30) | func (s *blockStat) Path() path.ImmutablePath {
FILE: client/rpc/dag.go
type httpNodeAdder (line 18) | type httpNodeAdder
method add (line 59) | func (api *httpNodeAdder) add(ctx context.Context, nd format.Node, pin...
method addMany (line 88) | func (api *httpNodeAdder) addMany(ctx context.Context, nds []format.No...
method core (line 132) | func (api *httpNodeAdder) core() *HttpApi {
type HttpDagServ (line 19) | type HttpDagServ
method Get (line 23) | func (api *HttpDagServ) Get(ctx context.Context, c cid.Cid) (format.No...
method GetMany (line 42) | func (api *HttpDagServ) GetMany(ctx context.Context, cids []cid.Cid) <...
method AddMany (line 98) | func (api *HttpDagServ) AddMany(ctx context.Context, nds []format.Node...
method Add (line 102) | func (api *HttpDagServ) Add(ctx context.Context, nd format.Node) error {
method Pinning (line 114) | func (api *HttpDagServ) Pinning() format.NodeAdder {
method Remove (line 118) | func (api *HttpDagServ) Remove(ctx context.Context, c cid.Cid) error {
method RemoveMany (line 122) | func (api *HttpDagServ) RemoveMany(ctx context.Context, cids []cid.Cid...
method core (line 136) | func (api *HttpDagServ) core() *HttpApi {
type pinningHttpNodeAdder (line 20) | type pinningHttpNodeAdder
method Add (line 106) | func (api *pinningHttpNodeAdder) Add(ctx context.Context, nd format.No...
method AddMany (line 110) | func (api *pinningHttpNodeAdder) AddMany(ctx context.Context, nds []fo...
FILE: client/rpc/errors.go
type prePostWrappedNotFoundError (line 15) | type prePostWrappedNotFoundError struct
method String (line 22) | func (e prePostWrappedNotFoundError) String() string {
method Error (line 26) | func (e prePostWrappedNotFoundError) Error() string {
method Unwrap (line 30) | func (e prePostWrappedNotFoundError) Unwrap() error {
function parseErrNotFoundWithFallbackToMSG (line 34) | func parseErrNotFoundWithFallbackToMSG(msg string) error {
function parseErrNotFoundWithFallbackToError (line 43) | func parseErrNotFoundWithFallbackToError(msg error) error {
function parseErrNotFound (line 52) | func parseErrNotFound(msg string) (error, bool) {
constant cidBreakSet (line 72) | cidBreakSet = " \t\n\r\v\f;\""
function parseIPLDErrNotFound (line 74) | func parseIPLDErrNotFound(msg string) (error, bool) {
type blockstoreNotFoundMatchingIPLDErrNotFound (line 143) | type blockstoreNotFoundMatchingIPLDErrNotFound struct
method String (line 147) | func (e blockstoreNotFoundMatchingIPLDErrNotFound) String() string {
method Error (line 151) | func (e blockstoreNotFoundMatchingIPLDErrNotFound) Error() string {
method Is (line 155) | func (e blockstoreNotFoundMatchingIPLDErrNotFound) Is(err error) bool {
function parseBlockstoreNotFound (line 160) | func parseBlockstoreNotFound(msg string) (error, bool) {
FILE: client/rpc/errors_test.go
function doParseIpldNotFoundTest (line 16) | func doParseIpldNotFoundTest(t *testing.T, original error) {
function TestParseIPLDNotFound (line 34) | func TestParseIPLDNotFound(t *testing.T) {
function TestBlockstoreNotFoundMatchingIPLDErrNotFound (line 75) | func TestBlockstoreNotFoundMatchingIPLDErrNotFound(t *testing.T) {
FILE: client/rpc/key.go
type KeyAPI (line 16) | type KeyAPI
method Generate (line 55) | func (api *KeyAPI) Generate(ctx context.Context, name string, opts ......
method Rename (line 73) | func (api *KeyAPI) Rename(ctx context.Context, oldName string, newName...
method List (line 100) | func (api *KeyAPI) List(ctx context.Context) ([]iface.Key, error) {
method Self (line 120) | func (api *KeyAPI) Self(ctx context.Context) (iface.Key, error) {
method Remove (line 129) | func (api *KeyAPI) Remove(ctx context.Context, name string) (iface.Key...
method core (line 143) | func (api *KeyAPI) core() *HttpApi {
method Sign (line 147) | func (api *KeyAPI) Sign(ctx context.Context, name string, data []byte)...
method Verify (line 174) | func (api *KeyAPI) Verify(ctx context.Context, keyOrName string, signa...
type key (line 18) | type key struct
method Name (line 38) | func (k *key) Name() string {
method Path (line 42) | func (k *key) Path() path.Path {
method ID (line 46) | func (k *key) ID() peer.ID {
function newKey (line 24) | func newKey(name, pidStr string) (*key, error) {
type keyOutput (line 50) | type keyOutput struct
FILE: client/rpc/name.go
type NameAPI (line 16) | type NameAPI
method Publish (line 23) | func (api *NameAPI) Publish(ctx context.Context, p path.Path, opts ......
method Search (line 46) | func (api *NameAPI) Search(ctx context.Context, name string, opts ...c...
method Resolve (line 107) | func (api *NameAPI) Resolve(ctx context.Context, name string, opts ......
method core (line 132) | func (api *NameAPI) core() *HttpApi {
type ipnsEntry (line 18) | type ipnsEntry struct
FILE: client/rpc/object.go
type ObjectAPI (line 12) | type ObjectAPI
method AddLink (line 18) | func (api *ObjectAPI) AddLink(ctx context.Context, base path.Path, nam...
method RmLink (line 40) | func (api *ObjectAPI) RmLink(ctx context.Context, base path.Path, link...
method Diff (line 63) | func (api *ObjectAPI) Diff(ctx context.Context, a path.Path, b path.Pa...
method core (line 86) | func (api *ObjectAPI) core() *HttpApi {
type objectOut (line 14) | type objectOut struct
type change (line 56) | type change struct
FILE: client/rpc/path.go
method ResolvePath (line 11) | func (api *HttpApi) ResolvePath(ctx context.Context, p path.Path) (path....
method ResolveNode (line 41) | func (api *HttpApi) ResolveNode(ctx context.Context, p path.Path) (ipld....
FILE: client/rpc/pin.go
type PinAPI (line 16) | type PinAPI
method Add (line 49) | func (api *PinAPI) Add(ctx context.Context, p path.Path, opts ...caopt...
method Ls (line 69) | func (api *PinAPI) Ls(ctx context.Context, pins chan<- iface.Pin, opts...
method IsPinned (line 113) | func (api *PinAPI) IsPinned(ctx context.Context, p path.Path, opts ......
method Rm (line 138) | func (api *PinAPI) Rm(ctx context.Context, p path.Path, opts ...caopts...
method Update (line 149) | func (api *PinAPI) Update(ctx context.Context, from path.Path, to path...
method Verify (line 190) | func (api *PinAPI) Verify(ctx context.Context) (<-chan iface.PinStatus...
method core (line 261) | func (api *PinAPI) core() *HttpApi {
type pinRefKeyObject (line 18) | type pinRefKeyObject struct
type pinRefKeyList (line 22) | type pinRefKeyList struct
type pin (line 26) | type pin struct
method Err (line 33) | func (p pin) Err() error {
method Path (line 37) | func (p pin) Path() path.ImmutablePath {
method Name (line 41) | func (p pin) Name() string {
method Type (line 45) | func (p pin) Type() string {
type pinLsObject (line 63) | type pinLsObject struct
type pinVerifyRes (line 159) | type pinVerifyRes struct
method Ok (line 165) | func (r pinVerifyRes) Ok() bool {
method BadNodes (line 169) | func (r pinVerifyRes) BadNodes() []iface.BadPinNode {
method Err (line 173) | func (r pinVerifyRes) Err() error {
type badNode (line 177) | type badNode struct
method Path (line 182) | func (n badNode) Path() path.ImmutablePath {
method Err (line 186) | func (n badNode) Err() error {
FILE: client/rpc/pubsub.go
type PubsubAPI (line 15) | type PubsubAPI
method Ls (line 17) | func (api *PubsubAPI) Ls(ctx context.Context) ([]string, error) {
method Peers (line 36) | func (api *PubsubAPI) Peers(ctx context.Context, opts ...caopts.PubSub...
method Publish (line 65) | func (api *PubsubAPI) Publish(ctx context.Context, topic string, messa...
method Subscribe (line 147) | func (api *PubsubAPI) Subscribe(ctx context.Context, topic string, opt...
method core (line 205) | func (api *PubsubAPI) core() *HttpApi {
type pubsubSub (line 71) | type pubsubSub struct
method Next (line 111) | func (s *pubsubSub) Next(ctx context.Context) (iface.PubSubMessage, er...
method Close (line 197) | func (s *pubsubSub) Close() error {
type pubsubMessage (line 78) | type pubsubMessage struct
method From (line 93) | func (msg *pubsubMessage) From() peer.ID {
method Data (line 97) | func (msg *pubsubMessage) Data() []byte {
method Seq (line 101) | func (msg *pubsubMessage) Seq() []byte {
method Topics (line 107) | func (msg *pubsubMessage) Topics() []string {
function toMultibase (line 210) | func toMultibase(data []byte) string {
FILE: client/rpc/request.go
type Request (line 9) | type Request struct
function NewRequest (line 19) | func NewRequest(ctx context.Context, url, command string, args ...string...
FILE: client/rpc/requestbuilder.go
type RequestBuilder (line 15) | type RequestBuilder interface
type requestBuilder (line 32) | type requestBuilder struct
method Arguments (line 44) | func (r *requestBuilder) Arguments(args ...string) RequestBuilder {
method BodyString (line 50) | func (r *requestBuilder) BodyString(body string) RequestBuilder {
method BodyBytes (line 55) | func (r *requestBuilder) BodyBytes(body []byte) RequestBuilder {
method Body (line 60) | func (r *requestBuilder) Body(body io.Reader) RequestBuilder {
method FileBody (line 66) | func (r *requestBuilder) FileBody(body io.Reader) RequestBuilder {
method Option (line 86) | func (r *requestBuilder) Option(key string, value any) RequestBuilder {
method Header (line 107) | func (r *requestBuilder) Header(name, value string) RequestBuilder {
method Send (line 116) | func (r *requestBuilder) Send(ctx context.Context) (*Response, error) {
method Exec (line 131) | func (r *requestBuilder) Exec(ctx context.Context, res any) error {
FILE: client/rpc/response.go
type trailerReader (line 20) | type trailerReader struct
method Read (line 24) | func (r *trailerReader) Read(b []byte) (int, error) {
method Close (line 34) | func (r *trailerReader) Close() error {
type Response (line 38) | type Response struct
method Close (line 43) | func (r *Response) Close() error {
method Cancel (line 58) | func (r *Response) Cancel() error {
method decode (line 67) | func (r *Response) decode(dec any) error {
method Send (line 81) | func (r *Request) Send(c *http.Client) (*Response, error) {
method getURL (line 159) | func (r *Request) getURL() string {
FILE: client/rpc/routing.go
type RoutingAPI (line 15) | type RoutingAPI
method Get (line 17) | func (api *RoutingAPI) Get(ctx context.Context, key string) ([]byte, e...
method Put (line 42) | func (api *RoutingAPI) Put(ctx context.Context, key string, value []by...
method FindPeer (line 63) | func (api *RoutingAPI) FindPeer(ctx context.Context, p peer.ID) (peer....
method FindProviders (line 87) | func (api *RoutingAPI) FindProviders(ctx context.Context, p path.Path,...
method Provide (line 143) | func (api *RoutingAPI) Provide(ctx context.Context, p path.Path, opts ...
method core (line 159) | func (api *RoutingAPI) core() *HttpApi {
FILE: client/rpc/swarm.go
type SwarmAPI (line 14) | type SwarmAPI
method Connect (line 16) | func (api *SwarmAPI) Connect(ctx context.Context, pi peer.AddrInfo) er...
method Disconnect (line 30) | func (api *SwarmAPI) Disconnect(ctx context.Context, addr multiaddr.Mu...
method Peers (line 63) | func (api *SwarmAPI) Peers(ctx context.Context) ([]iface.ConnectionInf...
method KnownAddrs (line 115) | func (api *SwarmAPI) KnownAddrs(ctx context.Context) (map[peer.ID][]mu...
method LocalAddrs (line 145) | func (api *SwarmAPI) LocalAddrs(ctx context.Context) ([]multiaddr.Mult...
method ListenAddrs (line 165) | func (api *SwarmAPI) ListenAddrs(ctx context.Context) ([]multiaddr.Mul...
method core (line 185) | func (api *SwarmAPI) core() *HttpApi {
type connInfo (line 34) | type connInfo struct
method ID (line 43) | func (c *connInfo) ID() peer.ID {
method Address (line 47) | func (c *connInfo) Address() multiaddr.Multiaddr {
method Direction (line 51) | func (c *connInfo) Direction() network.Direction {
method Latency (line 55) | func (c *connInfo) Latency() (time.Duration, error) {
method Streams (line 59) | func (c *connInfo) Streams() ([]protocol.ID, error) {
FILE: client/rpc/unixfs.go
type addEvent (line 22) | type addEvent struct
type UnixfsAPI (line 29) | type UnixfsAPI
method Add (line 31) | func (api *UnixfsAPI) Add(ctx context.Context, f files.Node, opts ...c...
method Ls (line 147) | func (api *UnixfsAPI) Ls(ctx context.Context, p path.Path, out chan<- ...
method core (line 221) | func (api *UnixfsAPI) core() *HttpApi {
type lsLink (line 128) | type lsLink struct
type lsObject (line 138) | type lsObject struct
type lsOutput (line 143) | type lsOutput struct
FILE: commands/context.go
type Context (line 23) | type Context struct
method GetConfig (line 35) | func (c *Context) GetConfig() (*config.Config, error) {
method GetNode (line 45) | func (c *Context) GetNode() (*core.IpfsNode, error) {
method ClearCachedNode (line 69) | func (c *Context) ClearCachedNode() {
method GetAPI (line 75) | func (c *Context) GetAPI() (coreiface.CoreAPI, error) {
method Context (line 99) | func (c *Context) Context() context.Context {
method LogRequest (line 112) | func (c *Context) LogRequest(req *cmds.Request) func() {
method Close (line 129) | func (c *Context) Close() {
FILE: commands/reqlog.go
type ReqLogEntry (line 9) | type ReqLogEntry struct
method Copy (line 22) | func (r *ReqLogEntry) Copy() *ReqLogEntry {
type ReqLog (line 29) | type ReqLog struct
method AddEntry (line 37) | func (rl *ReqLog) AddEntry(rle *ReqLogEntry) {
method ClearInactive (line 51) | func (rl *ReqLog) ClearInactive() {
method maybeCleanup (line 61) | func (rl *ReqLog) maybeCleanup() {
method cleanup (line 69) | func (rl *ReqLog) cleanup() {
method SetKeepTime (line 83) | func (rl *ReqLog) SetKeepTime(t time.Duration) {
method Report (line 90) | func (rl *ReqLog) Report() []*ReqLogEntry {
method Finish (line 103) | func (rl *ReqLog) Finish(rle *ReqLogEntry) {
FILE: config/addresses.go
type Addresses (line 4) | type Addresses struct
FILE: config/api.go
constant APITag (line 9) | APITag = "API"
constant AuthorizationTag (line 10) | AuthorizationTag = "Authorizations"
type RPCAuthScope (line 13) | type RPCAuthScope struct
type API (line 24) | type API struct
function ConvertAuthSecret (line 38) | func ConvertAuthSecret(secret string) string {
FILE: config/api_test.go
function TestConvertAuthSecret (line 9) | func TestConvertAuthSecret(t *testing.T) {
FILE: config/autoconf.go
type AutoConf (line 16) | type AutoConf struct
constant AutoPlaceholder (line 36) | AutoPlaceholder = "auto"
constant DefaultAutoConfEnabled (line 39) | DefaultAutoConfEnabled = true
constant DefaultAutoConfURL (line 42) | DefaultAutoConfURL = autoconf.MainnetAutoConfURL
constant DefaultAutoConfRefreshInterval (line 45) | DefaultAutoConfRefreshInterval = autoconf.DefaultRefreshInterval
constant DefaultAutoConfCacheSize (line 48) | DefaultAutoConfCacheSize = autoconf.DefaultCacheSize
constant DefaultAutoConfTimeout (line 49) | DefaultAutoConfTimeout = autoconf.DefaultTimeout
function getNativeSystems (line 53) | func getNativeSystems(routingType string) []string {
function selectRandomResolver (line 69) | func selectRandomResolver(resolvers []string) string {
method DNSResolversWithAutoConf (line 77) | func (c *Config) DNSResolversWithAutoConf() map[string]string {
function expandAutoConfSlice (line 122) | func expandAutoConfSlice(sourceSlice []string, autoConfData []string) []...
method BootstrapWithAutoConf (line 144) | func (c *Config) BootstrapWithAutoConf() []string {
method getAutoConf (line 163) | func (c *Config) getAutoConf() *autoconf.Config {
method BootstrapPeersWithAutoConf (line 186) | func (c *Config) BootstrapPeersWithAutoConf() ([]peer.AddrInfo, error) {
method DelegatedRoutersWithAutoConf (line 192) | func (c *Config) DelegatedRoutersWithAutoConf() []string {
method DelegatedPublishersWithAutoConf (line 210) | func (c *Config) DelegatedPublishersWithAutoConf() []string {
method expandConfigField (line 226) | func (c *Config) expandConfigField(expandedCfg map[string]any, fieldPath...
method ExpandAutoConfValues (line 259) | func (c *Config) ExpandAutoConfValues(cfg map[string]any) (map[string]an...
method ExpandConfigField (line 294) | func (c *Config) ExpandConfigField(key string, value any) any {
function stringSliceToInterfaceSlice (line 305) | func stringSliceToInterfaceSlice(slice []string) []any {
function stringMapToInterfaceMap (line 313) | func stringMapToInterfaceMap(m map[string]string) map[string]any {
FILE: config/autoconf_client.go
function GetAutoConfClient (line 25) | func GetAutoConfClient(cfg *Config) (*autoconf.Client, error) {
function newAutoConfClient (line 33) | func newAutoConfClient(cfg *Config) (*autoconf.Client, error) {
function ValidateAutoConfWithRepo (line 64) | func ValidateAutoConfWithRepo(cfg *Config, swarmKeyExists bool) error {
function validateAutoConfDisabled (line 81) | func validateAutoConfDisabled(cfg *Config) error {
FILE: config/autoconf_test.go
function TestAutoConfDefaults (line 10) | func TestAutoConfDefaults(t *testing.T) {
function TestAutoConfProfile (line 30) | func TestAutoConfProfile(t *testing.T) {
function TestInitWithAutoValues (line 69) | func TestInitWithAutoValues(t *testing.T) {
FILE: config/autonat.go
type AutoNATServiceMode (line 8) | type AutoNATServiceMode
method UnmarshalText (line 28) | func (m *AutoNATServiceMode) UnmarshalText(text []byte) error {
method MarshalText (line 44) | func (m AutoNATServiceMode) MarshalText() ([]byte, error) {
constant AutoNATServiceUnset (line 16) | AutoNATServiceUnset AutoNATServiceMode = iota
constant AutoNATServiceEnabled (line 19) | AutoNATServiceEnabled
constant AutoNATServiceDisabled (line 22) | AutoNATServiceDisabled
constant AutoNATServiceEnabledV1Only (line 25) | AutoNATServiceEnabledV1Only
type AutoNATConfig (line 60) | type AutoNATConfig struct
type AutoNATThrottleConfig (line 75) | type AutoNATThrottleConfig struct
FILE: config/autotls.go
type AutoTLS (line 12) | type AutoTLS struct
constant DefaultAutoTLSEnabled (line 46) | DefaultAutoTLSEnabled = true
constant DefaultDomainSuffix (line 47) | DefaultDomainSuffix = p2pforge.DefaultForgeDomain
constant DefaultRegistrationEndpoint (line 48) | DefaultRegistrationEndpoint = p2pforge.DefaultForgeEndpoint
constant DefaultCAEndpoint (line 49) | DefaultCAEndpoint = p2pforge.DefaultCAEndpoint
constant DefaultAutoWSS (line 50) | DefaultAutoWSS = true
constant DefaultAutoTLSShortAddrs (line 51) | DefaultAutoTLSShortAddrs = true
constant DefaultAutoTLSSkipDNSLookup (line 52) | DefaultAutoTLSSkipDNSLookup = true
constant DefaultAutoTLSRegistrationDelay (line 53) | DefaultAutoTLSRegistrationDelay = 1 * time.Hour
FILE: config/bitswap.go
type Bitswap (line 4) | type Bitswap struct
constant DefaultBitswapLibp2pEnabled (line 13) | DefaultBitswapLibp2pEnabled = true
constant DefaultBitswapServerEnabled (line 14) | DefaultBitswapServerEnabled = true
FILE: config/bootstrap_peers.go
method BootstrapPeers (line 13) | func (c *Config) BootstrapPeers() ([]peer.AddrInfo, error) {
method SetBootstrapPeers (line 17) | func (c *Config) SetBootstrapPeers(bps []peer.AddrInfo) {
function ParseBootstrapPeers (line 22) | func ParseBootstrapPeers(addrs []string) ([]peer.AddrInfo, error) {
function BootstrapPeerStrings (line 36) | func BootstrapPeerStrings(bps []peer.AddrInfo) []string {
FILE: config/bootstrap_peers_test.go
function TestBootstrapPeerStrings (line 11) | func TestBootstrapPeerStrings(t *testing.T) {
FILE: config/config.go
type Config (line 17) | type Config struct
method Clone (line 213) | func (c *Config) Clone() (*Config, error) {
constant DefaultPathName (line 55) | DefaultPathName = ".ipfs"
constant DefaultPathRoot (line 57) | DefaultPathRoot = "~/" + DefaultPathName
constant DefaultConfigFile (line 59) | DefaultConfigFile = "config"
constant EnvDir (line 61) | EnvDir = "IPFS_PATH"
function PathRoot (line 65) | func PathRoot() (string, error) {
function Path (line 76) | func Path(configroot, extension string) (string, error) {
function Filename (line 96) | func Filename(configroot, userConfigFile string) (string, error) {
function HumanOutput (line 109) | func HumanOutput(value any) ([]byte, error) {
function Marshal (line 118) | func Marshal(value any) ([]byte, error) {
function FromMap (line 123) | func FromMap(v map[string]any) (*Config, error) {
function ToMap (line 135) | func ToMap(conf *Config) (map[string]any, error) {
function ReflectToMap (line 150) | func ReflectToMap(conf any) any {
function CheckKey (line 229) | func CheckKey(key string) error {
FILE: config/config_test.go
function TestClone (line 7) | func TestClone(t *testing.T) {
function TestReflectToMap (line 31) | func TestReflectToMap(t *testing.T) {
function TestCheckKey (line 131) | func TestCheckKey(t *testing.T) {
FILE: config/datastore.go
constant DefaultDataStoreDirectory (line 9) | DefaultDataStoreDirectory = "datastore"
constant DefaultBlockKeyCacheSize (line 13) | DefaultBlockKeyCacheSize = 64 << 10
constant DefaultWriteThrough (line 20) | DefaultWriteThrough bool = true
type Datastore (line 24) | type Datastore struct
function DataStorePath (line 45) | func DataStorePath(configroot string) (string, error) {
FILE: config/discovery.go
type Discovery (line 3) | type Discovery struct
type MDNS (line 7) | type MDNS struct
FILE: config/dns.go
type DNS (line 4) | type DNS struct
FILE: config/experiments.go
type Experiments (line 3) | type Experiments struct
FILE: config/gateway.go
constant DefaultInlineDNSLink (line 8) | DefaultInlineDNSLink = false
constant DefaultDeserializedResponses (line 9) | DefaultDeserializedResponses = true
constant DefaultDisableHTMLErrors (line 10) | DefaultDisableHTMLErrors = false
constant DefaultExposeRoutingAPI (line 11) | DefaultExposeRoutingAPI = true
constant DefaultDiagnosticServiceURL (line 12) | DefaultDiagnosticServiceURL = "https://check.ipfs.network"
constant DefaultAllowCodecConversion (line 13) | DefaultAllowCodecConversion = false
constant DefaultRetrievalTimeout (line 16) | DefaultRetrievalTimeout = gateway.DefaultRetrievalTimeout
constant DefaultMaxRequestDuration (line 17) | DefaultMaxRequestDuration = gateway.DefaultMaxRequestDuration
constant DefaultMaxConcurrentRequests (line 18) | DefaultMaxConcurrentRequests = gateway.DefaultMaxConcurrentRequests
constant DefaultMaxRangeRequestFileSize (line 19) | DefaultMaxRangeRequestFileSize = 0
type GatewaySpec (line 22) | type GatewaySpec struct
type Gateway (line 53) | type Gateway struct
FILE: config/http_retrieval.go
type HTTPRetrieval (line 5) | type HTTPRetrieval struct
constant DefaultHTTPRetrievalEnabled (line 15) | DefaultHTTPRetrievalEnabled = true
constant DefaultHTTPRetrievalNumWorkers (line 16) | DefaultHTTPRetrievalNumWorkers = 16
constant DefaultHTTPRetrievalTLSInsecureSkipVerify (line 17) | DefaultHTTPRetrievalTLSInsecureSkipVerify = false
constant DefaultHTTPRetrievalMaxBlockSize (line 18) | DefaultHTTPRetrievalMaxBlockSize = "2MiB"
FILE: config/identity.go
constant IdentityTag (line 10) | IdentityTag = "Identity"
constant PrivKeyTag (line 11) | PrivKeyTag = "PrivKey"
constant PrivKeySelector (line 12) | PrivKeySelector = IdentityTag + "." + PrivKeyTag
type Identity (line 16) | type Identity struct
method DecodePrivateKey (line 22) | func (i *Identity) DecodePrivateKey(passphrase string) (ic.PrivKey, er...
FILE: config/import.go
constant DefaultCidVersion (line 17) | DefaultCidVersion = 0
constant DefaultUnixFSRawLeaves (line 18) | DefaultUnixFSRawLeaves = false
constant DefaultUnixFSChunker (line 19) | DefaultUnixFSChunker = "size-262144"
constant DefaultHashFunction (line 20) | DefaultHashFunction = "sha2-256"
constant DefaultFastProvideRoot (line 21) | DefaultFastProvideRoot = true
constant DefaultFastProvideWait (line 22) | DefaultFastProvideWait = false
constant DefaultUnixFSHAMTDirectorySizeThreshold (line 24) | DefaultUnixFSHAMTDirectorySizeThreshold = 262144
constant DefaultBatchMaxNodes (line 29) | DefaultBatchMaxNodes = 128
constant DefaultBatchMaxSize (line 33) | DefaultBatchMaxSize = 100 << 20
constant HAMTSizeEstimationLinks (line 36) | HAMTSizeEstimationLinks = "links"
constant HAMTSizeEstimationBlock (line 37) | HAMTSizeEstimationBlock = "block"
constant HAMTSizeEstimationDisabled (line 38) | HAMTSizeEstimationDisabled = "disabled"
constant DAGLayoutBalanced (line 41) | DAGLayoutBalanced = "balanced"
constant DAGLayoutTrickle (line 42) | DAGLayoutTrickle = "trickle"
constant DefaultUnixFSHAMTDirectorySizeEstimation (line 44) | DefaultUnixFSHAMTDirectorySizeEstimation = HAMTSizeEstimationLinks
constant DefaultUnixFSDAGLayout (line 45) | DefaultUnixFSDAGLayout = DAGLayoutBalanced
constant DefaultUnixFSIncludeEmptyDirs (line 46) | DefaultUnixFSIncludeEmptyDirs = true
type Import (line 57) | type Import struct
method HAMTSizeEstimationMode (line 226) | func (i *Import) HAMTSizeEstimationMode() uio.SizeEstimationMode {
method UnixFSSplitterFunc (line 242) | func (i *Import) UnixFSSplitterFunc() chunk.SplitterGen {
function ValidateImportConfig (line 76) | func ValidateImportConfig(cfg *Import) error {
function isPowerOfTwo (line 176) | func isPowerOfTwo(n int64) bool {
function isValidChunker (line 181) | func isValidChunker(chunker string) bool {
FILE: config/import_test.go
function TestValidateImportConfig_HAMTFanout (line 11) | func TestValidateImportConfig_HAMTFanout(t *testing.T) {
function TestValidateImportConfig_CidVersion (line 73) | func TestValidateImportConfig_CidVersion(t *testing.T) {
function TestValidateImportConfig_UnixFSFileMaxLinks (line 110) | func TestValidateImportConfig_UnixFSFileMaxLinks(t *testing.T) {
function TestValidateImportConfig_UnixFSDirectoryMaxLinks (line 147) | func TestValidateImportConfig_UnixFSDirectoryMaxLinks(t *testing.T) {
function TestValidateImportConfig_BatchMax (line 184) | func TestValidateImportConfig_BatchMax(t *testing.T) {
function TestValidateImportConfig_UnixFSChunker (line 229) | func TestValidateImportConfig_UnixFSChunker(t *testing.T) {
function TestValidateImportConfig_HashFunction (line 275) | func TestValidateImportConfig_HashFunction(t *testing.T) {
function TestValidateImportConfig_DefaultValue (line 326) | func TestValidateImportConfig_DefaultValue(t *testing.T) {
function TestIsValidChunker (line 336) | func TestIsValidChunker(t *testing.T) {
function TestIsPowerOfTwo (line 375) | func TestIsPowerOfTwo(t *testing.T) {
function TestValidateImportConfig_HAMTSizeEstimation (line 411) | func TestValidateImportConfig_HAMTSizeEstimation(t *testing.T) {
function TestValidateImportConfig_DAGLayout (line 449) | func TestValidateImportConfig_DAGLayout(t *testing.T) {
function TestImport_HAMTSizeEstimationMode (line 486) | func TestImport_HAMTSizeEstimationMode(t *testing.T) {
FILE: config/init.go
function Init (line 16) | func Init(out io.Writer, nBitsForKeypair int) (*Config, error) {
function InitWithIdentity (line 25) | func InitWithIdentity(identity Identity) (*Config, error) {
constant DefaultConnMgrHighWater (line 81) | DefaultConnMgrHighWater = 96
constant DefaultConnMgrLowWater (line 85) | DefaultConnMgrLowWater = 32
constant DefaultConnMgrGracePeriod (line 89) | DefaultConnMgrGracePeriod = time.Second * 20
constant DefaultConnMgrSilencePeriod (line 92) | DefaultConnMgrSilencePeriod = time.Second * 10
constant DefaultConnMgrType (line 96) | DefaultConnMgrType = "basic"
constant DefaultResourceMgrMinInboundConns (line 100) | DefaultResourceMgrMinInboundConns = 800
function addressesConfig (line 102) | func addressesConfig() Addresses {
function DefaultDatastoreConfig (line 123) | func DefaultDatastoreConfig() Datastore {
function pebbleSpec (line 133) | func pebbleSpec() map[string]any {
function pebbleSpecMeasure (line 142) | func pebbleSpecMeasure() map[string]any {
function badgerSpec (line 154) | func badgerSpec() map[string]any {
function badgerSpecMeasure (line 164) | func badgerSpecMeasure() map[string]any {
function flatfsSpec (line 177) | func flatfsSpec() map[string]any {
function flatfsSpecMeasure (line 200) | func flatfsSpecMeasure() map[string]any {
function CreateIdentity (line 230) | func CreateIdentity(out io.Writer, opts []options.KeyGenerateOption) (Id...
FILE: config/init_test.go
function TestCreateIdentity (line 11) | func TestCreateIdentity(t *testing.T) {
function TestCreateIdentityOptions (line 38) | func TestCreateIdentityOptions(t *testing.T) {
FILE: config/internal.go
constant DefaultMFSNoFlushLimit (line 5) | DefaultMFSNoFlushLimit = 256
type Internal (line 8) | type Internal struct
type InternalBitswap (line 23) | type InternalBitswap struct
type BitswapBroadcastControl (line 34) | type BitswapBroadcastControl struct
constant DefaultBroadcastControlEnable (line 72) | DefaultBroadcastControlEnable = true
constant DefaultBroadcastControlMaxPeers (line 73) | DefaultBroadcastControlMaxPeers = -1
constant DefaultBroadcastControlLocalPeers (line 74) | DefaultBroadcastControlLocalPeers = false
constant DefaultBroadcastControlPeeredPeers (line 75) | DefaultBroadcastControlPeeredPeers = false
constant DefaultBroadcastControlMaxRandomPeers (line 76) | DefaultBroadcastControlMaxRandomPeers = 0
constant DefaultBroadcastControlSendToPendingPeers (line 77) | DefaultBroadcastControlSendToPendingPeers = false
FILE: config/ipns.go
constant DefaultIpnsMaxCacheTTL (line 9) | DefaultIpnsMaxCacheTTL = time.Duration(math.MaxInt64)
type Ipns (line 12) | type Ipns struct
FILE: config/migration.go
constant DefaultMigrationKeep (line 3) | DefaultMigrationKeep = "cache"
type Migration (line 14) | type Migration struct
FILE: config/migration_test.go
function TestMigrationDecode (line 8) | func TestMigrationDecode(t *testing.T) {
FILE: config/mounts.go
type Mounts (line 4) | type Mounts struct
FILE: config/peering.go
type Peering (line 6) | type Peering struct
FILE: config/plugins.go
type Plugins (line 3) | type Plugins struct
type Plugin (line 8) | type Plugin struct
FILE: config/profile.go
type Transformer (line 10) | type Transformer
type Profile (line 13) | type Profile struct
function getAvailablePort (line 391) | func getAvailablePort() (port int, err error) {
function appendSingle (line 401) | func appendSingle(a []string, b []string) []string {
function deleteEntries (line 419) | func deleteEntries(arr []string, del []string) []string {
function mapKeys (line 430) | func mapKeys(m map[string]struct{}) []string {
function applyUnixFSv02015 (line 439) | func applyUnixFSv02015(c *Config) error {
FILE: config/provide.go
constant DefaultProvideEnabled (line 12) | DefaultProvideEnabled = true
constant DefaultProvideStrategy (line 13) | DefaultProvideStrategy = "all"
constant DefaultProvideDHTInterval (line 16) | DefaultProvideDHTInterval = 22 * time.Hour
constant DefaultProvideDHTMaxWorkers (line 17) | DefaultProvideDHTMaxWorkers = 16
constant DefaultProvideDHTSweepEnabled (line 18) | DefaultProvideDHTSweepEnabled = true
constant DefaultProvideDHTResumeEnabled (line 19) | DefaultProvideDHTResumeEnabled = true
constant DefaultProvideDHTDedicatedPeriodicWorkers (line 20) | DefaultProvideDHTDedicatedPeriodicWorkers = 2
constant DefaultProvideDHTDedicatedBurstWorkers (line 21) | DefaultProvideDHTDedicatedBurstWorkers = 1
constant DefaultProvideDHTMaxProvideConnsPerWorker (line 22) | DefaultProvideDHTMaxProvideConnsPerWorker = 20
constant DefaultProvideDHTKeystoreBatchSize (line 23) | DefaultProvideDHTKeystoreBatchSize = 1 << 14
constant DefaultProvideDHTOfflineDelay (line 24) | DefaultProvideDHTOfflineDelay = 2 * time.Hour
constant DefaultFastProvideTimeout (line 29) | DefaultFastProvideTimeout = 10 * time.Second
type ProvideStrategy (line 32) | type ProvideStrategy
constant ProvideStrategyAll (line 35) | ProvideStrategyAll ProvideStrategy = 1 << iota
constant ProvideStrategyPinned (line 36) | ProvideStrategyPinned
constant ProvideStrategyRoots (line 37) | ProvideStrategyRoots
constant ProvideStrategyMFS (line 38) | ProvideStrategyMFS
type Provide (line 44) | type Provide struct
type ProvideDHT (line 59) | type ProvideDHT struct
function ParseProvideStrategy (line 103) | func ParseProvideStrategy(s string) ProvideStrategy {
function ValidateProvideConfig (line 121) | func ValidateProvideConfig(cfg *Provide) error {
function ShouldProvideForStrategy (line 186) | func ShouldProvideForStrategy(strategy ProvideStrategy, isPinned bool, i...
FILE: config/provide_test.go
function TestParseProvideStrategy (line 11) | func TestParseProvideStrategy(t *testing.T) {
function TestValidateProvideConfig_Interval (line 35) | func TestValidateProvideConfig_Interval(t *testing.T) {
function TestValidateProvideConfig_MaxWorkers (line 73) | func TestValidateProvideConfig_MaxWorkers(t *testing.T) {
function TestShouldProvideForStrategy (line 109) | func TestShouldProvideForStrategy(t *testing.T) {
FILE: config/provider.go
type Provider (line 7) | type Provider struct
FILE: config/pubsub.go
constant LastSeenMessagesStrategy (line 9) | LastSeenMessagesStrategy = "last-seen"
constant FirstSeenMessagesStrategy (line 15) | FirstSeenMessagesStrategy = "first-seen"
constant DefaultSeenMessagesStrategy (line 19) | DefaultSeenMessagesStrategy = LastSeenMessagesStrategy
type PubsubConfig (line 22) | type PubsubConfig struct
FILE: config/remotepin.go
type Pinning (line 8) | type Pinning struct
type RemotePinningService (line 12) | type RemotePinningService struct
type RemotePinningServiceAPI (line 17) | type RemotePinningServiceAPI struct
type RemotePinningServicePolicies (line 22) | type RemotePinningServicePolicies struct
type RemotePinningServiceMFSPolicy (line 26) | type RemotePinningServiceMFSPolicy struct
FILE: config/reprovider.go
type Reprovider (line 7) | type Reprovider struct
FILE: config/routing.go
constant DefaultAcceleratedDHTClient (line 13) | DefaultAcceleratedDHTClient = false
constant DefaultLoopbackAddressesOnLanDHT (line 14) | DefaultLoopbackAddressesOnLanDHT = false
constant DefaultRoutingType (line 15) | DefaultRoutingType = "auto"
constant CidContactRoutingURL (line 16) | CidContactRoutingURL = "https://cid.contact"
constant PublicGoodDelegatedRoutingURL (line 17) | PublicGoodDelegatedRoutingURL = "https://delegated-ipfs.dev"
constant EnvHTTPRouters (line 18) | EnvHTTPRouters = "IPFS_HTTP_ROUTERS"
constant EnvHTTPRoutersFilterProtocols (line 19) | EnvHTTPRoutersFilterProtocols = "IPFS_HTTP_ROUTERS_FILTER_PROTOCOLS"
type Routing (line 34) | type Routing struct
type Router (line 57) | type Router struct
type Routers (line 67) | type Routers
type Methods (line 68) | type Methods
method Check (line 71) | func (m Methods) Check() error {
type RouterParser (line 94) | type RouterParser struct
method UnmarshalJSON (line 98) | func (r *RouterParser) UnmarshalJSON(b []byte) error {
type RouterType (line 130) | type RouterType
constant RouterTypeHTTP (line 133) | RouterTypeHTTP RouterType = "http"
constant RouterTypeDHT (line 134) | RouterTypeDHT RouterType = "dht"
constant RouterTypeSequential (line 135) | RouterTypeSequential RouterType = "sequential"
constant RouterTypeParallel (line 136) | RouterTypeParallel RouterType = "parallel"
type DHTMode (line 139) | type DHTMode
constant DHTModeServer (line 142) | DHTModeServer DHTMode = "server"
constant DHTModeClient (line 143) | DHTModeClient DHTMode = "client"
constant DHTModeAuto (line 144) | DHTModeAuto DHTMode = "auto"
type MethodName (line 147) | type MethodName
constant MethodNameProvide (line 150) | MethodNameProvide MethodName = "provide"
constant MethodNameFindProviders (line 151) | MethodNameFindProviders MethodName = "find-providers"
constant MethodNameFindPeers (line 152) | MethodNameFindPeers MethodName = "find-peers"
constant MethodNameGetIPNS (line 153) | MethodNameGetIPNS MethodName = "get-ipns"
constant MethodNamePutIPNS (line 154) | MethodNamePutIPNS MethodName = "put-ipns"
type HTTPRouterParams (line 159) | type HTTPRouterParams struct
method FillDefaults (line 171) | func (hrp *HTTPRouterParams) FillDefaults() {
type DHTRouterParams (line 181) | type DHTRouterParams struct
type ComposableRouterParams (line 187) | type ComposableRouterParams struct
type ConfigRouter (line 192) | type ConfigRouter struct
type Method (line 199) | type Method struct
function getEnvOrDefault (line 205) | func getEnvOrDefault(key string, defaultValue []string) []string {
method HasHTTPProviderConfigured (line 229) | func (c *Config) HasHTTPProviderConfigured() bool {
method routerSupportsHTTPProviding (line 244) | func (c *Config) routerSupportsHTTPProviding(routerName string) bool {
FILE: config/routing_test.go
function TestRouterParameters (line 11) | func TestRouterParameters(t *testing.T) {
function TestMethods (line 107) | func TestMethods(t *testing.T) {
FILE: config/serialize/serialize.go
function ReadConfigFile (line 21) | func ReadConfigFile(filename string, cfg any) error {
function WriteConfigFile (line 37) | func WriteConfigFile(filename string, cfg any) error {
function encode (line 53) | func encode(w io.Writer, value any) error {
function Load (line 64) | func Load(filename string) (*config.Config, error) {
FILE: config/serialize/serialize_test.go
function TestConfig (line 11) | func TestConfig(t *testing.T) {
FILE: config/swarm.go
type SwarmConfig (line 3) | type SwarmConfig struct
type RelayClient (line 37) | type RelayClient struct
type RelayService (line 49) | type RelayService struct
type Transports (line 74) | type Transports struct
type ConnMgr (line 106) | type ConnMgr struct
type ResourceMgr (line 116) | type ResourceMgr struct
constant ResourceMgrSystemScope (line 131) | ResourceMgrSystemScope = "system"
constant ResourceMgrTransientScope (line 132) | ResourceMgrTransientScope = "transient"
constant ResourceMgrServiceScopePrefix (line 133) | ResourceMgrServiceScopePrefix = "svc:"
constant ResourceMgrProtocolScopePrefix (line 134) | ResourceMgrProtocolScopePrefix = "proto:"
constant ResourceMgrPeerScopePrefix (line 135) | ResourceMgrPeerScopePrefix = "peer:"
FILE: config/types.go
type Strings (line 16) | type Strings
method UnmarshalJSON (line 19) | func (o *Strings) UnmarshalJSON(data []byte) error {
method MarshalJSON (line 36) | func (o Strings) MarshalJSON() ([]byte, error) {
type Flag (line 56) | type Flag
method WithDefault (line 67) | func (f Flag) WithDefault(defaultValue bool) bool {
method MarshalJSON (line 80) | func (f Flag) MarshalJSON() ([]byte, error) {
method UnmarshalJSON (line 93) | func (f *Flag) UnmarshalJSON(input []byte) error {
method String (line 107) | func (f Flag) String() string {
constant False (line 59) | False Flag = -1
constant Default (line 60) | Default Flag = 0
constant True (line 61) | True Flag = 1
function ResolveBoolFromConfig (line 123) | func ResolveBoolFromConfig(userValue bool, userSet bool, configFlag Flag...
type Priority (line 140) | type Priority
method WithDefault (line 153) | func (p Priority) WithDefault(defaultPriority Priority) (priority int6...
method MarshalJSON (line 177) | func (p Priority) MarshalJSON() ([]byte, error) {
method UnmarshalJSON (line 193) | func (p *Priority) UnmarshalJSON(input []byte) error {
method String (line 215) | func (p Priority) String() string {
constant DefaultPriority (line 143) | DefaultPriority Priority = 0
constant Disabled (line 144) | Disabled Priority = -1
type OptionalDuration (line 237) | type OptionalDuration struct
method UnmarshalJSON (line 246) | func (d *OptionalDuration) UnmarshalJSON(input []byte) error {
method IsDefault (line 262) | func (d *OptionalDuration) IsDefault() bool {
method WithDefault (line 266) | func (d *OptionalDuration) WithDefault(defaultValue time.Duration) tim...
method MarshalJSON (line 273) | func (d OptionalDuration) MarshalJSON() ([]byte, error) {
method String (line 280) | func (d OptionalDuration) String() string {
function NewOptionalDuration (line 242) | func NewOptionalDuration(d time.Duration) *OptionalDuration {
type Duration (line 292) | type Duration struct
method MarshalJSON (line 296) | func (d Duration) MarshalJSON() ([]byte, error) {
method UnmarshalJSON (line 300) | func (d *Duration) UnmarshalJSON(b []byte) error {
type OptionalInteger (line 329) | type OptionalInteger struct
method WithDefault (line 339) | func (p *OptionalInteger) WithDefault(defaultValue int64) (value int64) {
method IsDefault (line 347) | func (p *OptionalInteger) IsDefault() bool {
method MarshalJSON (line 351) | func (p OptionalInteger) MarshalJSON() ([]byte, error) {
method UnmarshalJSON (line 358) | func (p *OptionalInteger) UnmarshalJSON(input []byte) error {
method String (line 373) | func (p OptionalInteger) String() string {
function NewOptionalInteger (line 334) | func NewOptionalInteger(v int64) *OptionalInteger {
type OptionalString (line 388) | type OptionalString struct
method WithDefault (line 398) | func (p *OptionalString) WithDefault(defaultValue string) (value strin...
method IsDefault (line 406) | func (p *OptionalString) IsDefault() bool {
method MarshalJSON (line 410) | func (p OptionalString) MarshalJSON() ([]byte, error) {
method UnmarshalJSON (line 417) | func (p *OptionalString) UnmarshalJSON(input []byte) error {
method String (line 432) | func (p OptionalString) String() string {
function NewOptionalString (line 393) | func NewOptionalString(s string) *OptionalString {
type OptionalBytes (line 449) | type OptionalBytes struct
method IsDefault (line 459) | func (p *OptionalBytes) IsDefault() bool {
method WithDefault (line 468) | func (p *OptionalBytes) WithDefault(defaultValue uint64) (value uint64) {
method UnmarshalJSON (line 483) | func (p *OptionalBytes) UnmarshalJSON(input []byte) error {
function NewOptionalBytes (line 454) | func NewOptionalBytes(s string) *OptionalBytes {
type swarmLimits (line 515) | type swarmLimits
method UnmarshalJSON (line 519) | func (swarmLimits) UnmarshalJSON(b []byte) error {
type experimentalAcceleratedDHTClient (line 539) | type experimentalAcceleratedDHTClient
method UnmarshalJSON (line 543) | func (experimentalAcceleratedDHTClient) UnmarshalJSON(b []byte) error {
type doNotUse (line 566) | type doNotUse
type graphsyncEnabled (line 568) | type graphsyncEnabled
method UnmarshalJSON (line 572) | func (graphsyncEnabled) UnmarshalJSON(b []byte) error {
FILE: config/types_test.go
function TestOptionalDuration (line 13) | func TestOptionalDuration(t *testing.T) {
function TestOneStrings (line 131) | func TestOneStrings(t *testing.T) {
function TestNoStrings (line 142) | func TestNoStrings(t *testing.T) {
function TestManyStrings (line 153) | func TestManyStrings(t *testing.T) {
function TestFunkyStrings (line 164) | func TestFunkyStrings(t *testing.T) {
function TestFlag (line 175) | func TestFlag(t *testing.T) {
function TestPriority (line 243) | func TestPriority(t *testing.T) {
function TestOptionalInteger (line 310) | func TestOptionalInteger(t *testing.T) {
function TestOptionalString (line 415) | func TestOptionalString(t *testing.T) {
function TestOptionalBytes (line 516) | func TestOptionalBytes(t *testing.T) {
FILE: config/version.go
constant DefaultSwarmCheckPercentThreshold (line 3) | DefaultSwarmCheckPercentThreshold = 5
type Version (line 6) | type Version struct
FILE: core/builder.go
type FXNodeInfo (line 21) | type FXNodeInfo struct
type fxOptFunc (line 26) | type fxOptFunc
function RegisterFXOptionFunc (line 45) | func RegisterFXOptionFunc(optFunc fxOptFunc) {
type valueContext (line 50) | type valueContext struct
method Deadline (line 54) | func (valueContext) Deadline() (deadline time.Time, ok bool) { return }
method Done (line 55) | func (valueContext) Done() <-chan struct{} { return ...
method Err (line 56) | func (valueContext) Err() error { return ...
function NewNode (line 61) | func NewNode(ctx context.Context, cfg *BuildCfg) (*IpfsNode, error) {
function logAndUnwrapFxError (line 153) | func logAndUnwrapFxError(fxAppErr error) error {
FILE: core/commands/active.go
constant verboseOptionName (line 16) | verboseOptionName = "verbose"
FILE: core/commands/add.go
type AddEvent (line 32) | type AddEvent struct
constant pinNameOptionName (line 43) | pinNameOptionName = "pin-name"
constant quietOptionName (line 44) | quietOptionName = "quiet"
constant quieterOptionName (line 45) | quieterOptionName = "quieter"
constant silentOptionName (line 46) | silentOptionName = "silent"
constant progressOptionName (line 47) | progressOptionName = "progress"
constant trickleOptionName (line 48) | trickleOptionName = "trickle"
constant wrapOptionName (line 49) | wrapOptionName = "wrap-with-directory"
constant onlyHashOptionName (line 50) | onlyHashOptionName = "only-hash"
constant chunkerOptionName (line 51) | chunkerOptionName = "chunker"
constant pinOptionName (line 52) | pinOptionName = "pin"
constant rawLeavesOptionName (line 53) | rawLeavesOptionName = "raw-leaves"
constant maxFileLinksOptionName (line 54) | maxFileLinksOptionName = "max-file-links"
constant maxDirectoryLinksOptionName (line 55) | maxDirectoryLinksOptionName = "max-directory-links"
constant maxHAMTFanoutOptionName (line 56) | maxHAMTFanoutOptionName = "max-hamt-fanout"
constant noCopyOptionName (line 57) | noCopyOptionName = "nocopy"
constant fstoreCacheOptionName (line 58) | fstoreCacheOptionName = "fscache"
constant cidVersionOptionName (line 59) | cidVersionOptionName = "cid-version"
constant hashOptionName (line 60) | hashOptionName = "hash"
constant inlineOptionName (line 61) | inlineOptionName = "inline"
constant inlineLimitOptionName (line 62) | inlineLimitOptionName = "inline-limit"
constant toFilesOptionName (line 63) | toFilesOptionName = "to-files"
constant preserveModeOptionName (line 65) | preserveModeOptionName = "preserve-mode"
constant preserveMtimeOptionName (line 66) | preserveMtimeOptionName = "preserve-mtime"
constant modeOptionName (line 67) | modeOptionName = "mode"
constant mtimeOptionName (line 68) | mtimeOptionName = "mtime"
constant mtimeNsecsOptionName (line 69) | mtimeNsecsOptionName = "mtime-nsecs"
constant fastProvideRootOptionName (line 70) | fastProvideRootOptionName = "fast-provide-root"
constant fastProvideWaitOptionName (line 71) | fastProvideWaitOptionName = "fast-provide-wait"
constant emptyDirsOptionName (line 72) | emptyDirsOptionName = "empty-dirs"
constant adderOutChanSize (line 76) | adderOutChanSize = 8
FILE: core/commands/bitswap.go
constant peerOptionName (line 32) | peerOptionName = "peer"
constant bitswapVerboseOptionName (line 98) | bitswapVerboseOptionName = "verbose"
constant bitswapHumanOptionName (line 99) | bitswapHumanOptionName = "human"
FILE: core/commands/block.go
type BlockStat (line 21) | type BlockStat struct
method String (line 26) | func (bs BlockStat) String() string {
constant blockFormatOptionName (line 132) | blockFormatOptionName = "format"
constant blockCidCodecOptionName (line 133) | blockCidCodecOptionName = "cid-codec"
constant mhtypeOptionName (line 134) | mhtypeOptionName = "mhtype"
constant mhlenOptionName (line 135) | mhlenOptionName = "mhlen"
constant forceOptionName (line 253) | forceOptionName = "force"
constant blockQuietOptionName (line 254) | blockQuietOptionName = "quiet"
type removedBlock (line 257) | type removedBlock struct
FILE: core/commands/bootstrap.go
type BootstrapOutput (line 19) | type BootstrapOutput struct
constant bootstrapAllOptionName (line 115) | bootstrapAllOptionName = "all"
function bootstrapWritePeers (line 256) | func bootstrapWritePeers(w io.Writer, prefix string, peers []string) err...
function bootstrapAdd (line 269) | func bootstrapAdd(r repo.Repo, cfg *config.Config, peers []string) ([]st...
function bootstrapRemove (line 323) | func bootstrapRemove(r repo.Repo, cfg *config.Config, toRemove []string)...
function bootstrapRemoveAll (line 392) | func bootstrapRemoveAll(r repo.Repo, cfg *config.Config) ([]string, erro...
constant bootstrapSecurityWarning (line 417) | bootstrapSecurityWarning = `
FILE: core/commands/cat.go
constant progressBarMinSize (line 19) | progressBarMinSize = 1024 * 1024 * 8
constant offsetOptionName (line 20) | offsetOptionName = "offset"
constant lengthOptionName (line 21) | lengthOptionName = "length"
function cat (line 124) | func cat(ctx context.Context, api iface.CoreAPI, paths []string, offset ...
FILE: core/commands/cid.go
constant cidFormatOptionName (line 40) | cidFormatOptionName = "f"
constant cidToVersionOptionName (line 41) | cidToVersionOptionName = "v"
constant cidCodecOptionName (line 42) | cidCodecOptionName = "mc"
constant cidMultibaseOptionName (line 43) | cidMultibaseOptionName = "b"
type CidFormatRes (line 133) | type CidFormatRes struct
type cidFormatOpts (line 163) | type cidFormatOpts struct
type argumentIterator (line 170) | type argumentIterator struct
method next (line 175) | func (i *argumentIterator) next() (string, bool) {
method err (line 187) | func (i *argumentIterator) err() error {
function emitCids (line 194) | func emitCids(req *cmds.Request, resp cmds.ResponseEmitter, opts cidForm...
function toCidV0 (line 254) | func toCidV0(c cid.Cid) (cid.Cid, error) {
function toCidV1 (line 261) | func toCidV1(c cid.Cid) (cid.Cid, error) {
type CodeAndName (line 265) | type CodeAndName struct
constant prefixOptionName (line 271) | prefixOptionName = "prefix"
constant numericOptionName (line 272) | numericOptionName = "numeric"
constant codecsNumericOptionName (line 324) | codecsNumericOptionName = "numeric"
constant codecsSupportedOptionName (line 325) | codecsSupportedOptionName = "supported"
type CidInspectRes (line 409) | type CidInspectRes struct
type CidInspectBase (line 420) | type CidInspectBase struct
type CidInspectCodec (line 425) | type CidInspectCodec struct
type CidInspectHash (line 430) | type CidInspectHash struct
type multibaseSorter (line 581) | type multibaseSorter struct
method Sort (line 585) | func (s multibaseSorter) Sort() {
type codeAndNameSorter (line 595) | type codeAndNameSorter struct
method Sort (line 599) | func (s codeAndNameSorter) Sort() {
FILE: core/commands/cid_test.go
function TestCidFmtCmd (line 10) | func TestCidFmtCmd(t *testing.T) {
FILE: core/commands/cmdenv/cidbase.go
function GetCidEncoder (line 20) | func GetCidEncoder(req *cmds.Request) (cidenc.Encoder, error) {
function GetLowLevelCidEncoder (line 27) | func GetLowLevelCidEncoder(req *cmds.Request) (cidenc.Encoder, error) {
function getCidBase (line 31) | func getCidBase(req *cmds.Request, autoUpgrade bool) (cidenc.Encoder, er...
function CidBaseDefined (line 57) | func CidBaseDefined(req *cmds.Request) bool {
function CidEncoderFromPath (line 77) | func CidEncoderFromPath(p string) (cidenc.Encoder, error) {
FILE: core/commands/cmdenv/cidbase_test.go
function TestEncoderFromPath (line 10) | func TestEncoderFromPath(t *testing.T) {
FILE: core/commands/cmdenv/env.go
function GetNode (line 24) | func GetNode(env any) (*core.IpfsNode, error) {
function GetApi (line 34) | func GetApi(env cmds.Environment, req *cmds.Request) (coreiface.CoreAPI,...
function GetConfigRoot (line 59) | func GetConfigRoot(env cmds.Environment) (string, error) {
function EscNonPrint (line 72) | func EscNonPrint(s string) string {
function needEscape (line 82) | func needEscape(s string) bool {
function provideCIDSync (line 106) | func provideCIDSync(ctx context.Context, router routing.Routing, c cid.C...
function ExecuteFastProvide (line 132) | func ExecuteFastProvide(
FILE: core/commands/cmdenv/env_test.go
function TestEscNonPrint (line 8) | func TestEscNonPrint(t *testing.T) {
function hasNonPrintable (line 41) | func hasNonPrintable(s string) bool {
FILE: core/commands/cmdenv/file.go
function GetFileArg (line 10) | func GetFileArg(it files.DirIterator) (files.File, error) {
FILE: core/commands/cmdutils/sanitize.go
constant maxRunes (line 8) | maxRunes = 128
function CleanAndTrim (line 17) | func CleanAndTrim(str string) string {
FILE: core/commands/cmdutils/utils.go
constant AllowBigBlockOptionName (line 16) | AllowBigBlockOptionName = "allow-big-block"
constant SoftBlockLimit (line 19) | SoftBlockLimit = 2 * 1024 * 1024
constant MaxPinNameBytes (line 20) | MaxPinNameBytes = 255
function init (line 25) | func init() {
function CheckCIDSize (line 29) | func CheckCIDSize(req *cmds.Request, c cid.Cid, dagAPI coreiface.APIDagS...
function CheckBlockSize (line 43) | func CheckBlockSize(req *cmds.Request, size uint64) error {
function ValidatePinName (line 59) | func ValidatePinName(name string) error {
function PathOrCidPath (line 74) | func PathOrCidPath(str string) (path.Path, error) {
function CloneAddrInfo (line 94) | func CloneAddrInfo(ai peer.AddrInfo) peer.AddrInfo {
FILE: core/commands/cmdutils/utils_test.go
function TestPathOrCidPath (line 11) | func TestPathOrCidPath(t *testing.T) {
function TestValidatePinName (line 75) | func TestValidatePinName(t *testing.T) {
FILE: core/commands/commands.go
type commandEncoder (line 19) | type commandEncoder struct
method Encode (line 23) | func (e *commandEncoder) Encode(v any) error {
type Command (line 43) | type Command struct
type Option (line 51) | type Option struct
constant flagsOptionName (line 56) | flagsOptionName = "flags"
function CommandsCmd (line 61) | func CommandsCmd(root *cmds.Command) *cmds.Command {
function cmd2outputCmd (line 88) | func cmd2outputCmd(name string, cmd *cmds.Command) Command {
function cmdPathStrings (line 107) | func cmdPathStrings(cmd *Command, showOptions bool) []string {
function CompletionCmd (line 138) | func CompletionCmd(root *cmds.Command) *cmds.Command {
type nonFatalError (line 230) | type nonFatalError
function streamResult (line 235) | func streamResult(procVal func(any, io.Writer) nonFatalError) func(cmds....
FILE: core/commands/commands_test.go
function collectPaths (line 10) | func collectPaths(prefix string, cmd *cmds.Command, out map[string]struc...
function TestCommands (line 18) | func TestCommands(t *testing.T) {
FILE: core/commands/completion.go
type completionCommand (line 12) | type completionCommand struct
type singleOption (line 26) | type singleOption struct
function commandToCompletions (line 32) | func commandToCompletions(name string, fullName string, cmd *cmds.Comman...
function init (line 81) | func init() {
function writeBashCompletions (line 229) | func writeBashCompletions(cmd *cmds.Command, out io.Writer) error {
function writeFishCompletions (line 235) | func writeFishCompletions(cmd *cmds.Command, out io.Writer) error {
function writeZshCompletions (line 240) | func writeZshCompletions(cmd *cmds.Command, out io.Writer) error {
FILE: core/commands/config.go
type ConfigUpdateOutput (line 24) | type ConfigUpdateOutput struct
type ConfigField (line 29) | type ConfigField struct
constant configBoolOptionName (line 35) | configBoolOptionName = "bool"
constant configJSONOptionName (line 36) | configJSONOptionName = "json"
constant configDryRunOptionName (line 37) | configDryRunOptionName = "dry-run"
constant configExpandAutoName (line 38) | configExpandAutoName = "expand-auto"
function matchesGlobPrefix (line 179) | func matchesGlobPrefix(key string, glob []string) bool {
function scrubValue (line 276) | func scrubValue(m map[string]any, key []string) (map[string]any, error) {
function scrubOptionalValue (line 281) | func scrubOptionalValue(m map[string]any, key []string) (map[string]any,...
function scrubEither (line 285) | func scrubEither(u any, key []string, okIfMissing bool) (any, error) {
function scrubValueInternal (line 293) | func scrubValueInternal(v any, key []string, okIfMissing bool) (any, err...
function scrubMapInternal (line 300) | func scrubMapInternal(m map[string]any, key []string, okIfMissing bool) ...
function buildProfileHelp (line 449) | func buildProfileHelp() string {
function scrubPrivKey (line 466) | func scrubPrivKey(cfg *config.Config) (map[string]any, error) {
function transformConfig (line 485) | func transformConfig(configRoot string, configName string, transformer c...
function getConfig (line 523) | func getConfig(r repo.Repo, key string) (*ConfigField, error) {
function getConfigWithAutoExpand (line 534) | func getConfigWithAutoExpand(r repo.Repo, key string) (*ConfigField, err...
function setConfig (line 556) | func setConfig(r repo.Repo, key string, value any) (*ConfigField, error) {
function parseEditorCommand (line 565) | func parseEditorCommand(editor string) ([]string, error) {
function editConfig (line 569) | func editConfig(filename string) error {
function replaceConfig (line 587) | func replaceConfig(r repo.Repo, file io.Reader) error {
function getRemotePinningServices (line 644) | func getRemotePinningServices(r repo.Repo) (map[string]config.RemotePinn...
FILE: core/commands/config_test.go
function TestScrubMapInternalDelete (line 5) | func TestScrubMapInternalDelete(t *testing.T) {
function TestEditorParsing (line 18) | func TestEditorParsing(t *testing.T) {
FILE: core/commands/dag/dag.go
constant pinRootsOptionName (line 20) | pinRootsOptionName = "pin-roots"
constant progressOptionName (line 21) | progressOptionName = "progress"
constant silentOptionName (line 22) | silentOptionName = "silent"
constant statsOptionName (line 23) | statsOptionName = "stats"
constant fastProvideRootOptionName (line 24) | fastProvideRootOptionName = "fast-provide-root"
constant fastProvideWaitOptionName (line 25) | fastProvideWaitOptionName = "fast-provide-wait"
type OutputObject (line 50) | type OutputObject struct
type ResolveOutput (line 55) | type ResolveOutput struct
type CarImportStats (line 60) | type CarImportStats struct
type CarImportOutput (line 66) | type CarImportOutput struct
type RootMeta (line 72) | type RootMeta struct
type DagStat (line 296) | type DagStat struct
method String (line 302) | func (s *DagStat) String() string {
method MarshalJSON (line 306) | func (s *DagStat) MarshalJSON() ([]byte, error) {
method UnmarshalJSON (line 322) | func (s *DagStat) UnmarshalJSON(data []byte) error {
type DagStatSummary (line 346) | type DagStatSummary struct
method String (line 355) | func (s *DagStatSummary) String() string {
method incrementTotalSize (line 363) | func (s *DagStatSummary) incrementTotalSize(size uint64) {
method incrementRedundantSize (line 367) | func (s *DagStatSummary) incrementRedundantSize(size uint64) {
method appendStats (line 371) | func (s *DagStatSummary) appendStats(stats *DagStat) {
method calculateSummary (line 375) | func (s *DagStatSummary) calculateSummary() {
FILE: core/commands/dag/export.go
function dagExport (line 23) | func dagExport(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Env...
function finishCLIExport (line 101) | func finishCLIExport(res cmds.Response, re cmds.ResponseEmitter) error {
type dagStore (line 157) | type dagStore struct
method Get (line 162) | func (ds *dagStore) Get(ctx context.Context, key string) ([]byte, erro...
method Has (line 180) | func (ds *dagStore) Has(ctx context.Context, key string) (bool, error) {
function cidFromBinString (line 191) | func cidFromBinString(key string) (cid.Cid, error) {
FILE: core/commands/dag/get.go
function dagGet (line 20) | func dagGet(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Enviro...
FILE: core/commands/dag/import.go
function dagImport (line 25) | func dagImport(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Env...
FILE: core/commands/dag/put.go
function dagPut (line 30) | func dagPut(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Enviro...
FILE: core/commands/dag/resolve.go
function dagResolve (line 11) | func dagResolve(req *cmds.Request, res cmds.ResponseEmitter, env cmds.En...
FILE: core/commands/dag/stat.go
function dagStat (line 22) | func dagStat(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Envir...
function finishCLIStat (line 91) | func finishCLIStat(res cmds.Response, re cmds.ResponseEmitter) error {
FILE: core/commands/dht.go
type kademlia (line 35) | type kademlia interface
FILE: core/commands/dht_test.go
function TestKeyTranslation (line 12) | func TestKeyTranslation(t *testing.T) {
FILE: core/commands/diag.go
constant diagDatastoreHexOptionName (line 78) | diagDatastoreHexOptionName = "hex"
type diagDatastoreGetResult (line 80) | type diagDatastoreGetResult struct
function openDiagDatastore (line 89) | func openDiagDatastore(env cmds.Environment) (datastore.Datastore, func(...
type diagDatastoreCountResult (line 216) | type diagDatastoreCountResult struct
FILE: core/commands/e/error.go
function TypeErr (line 9) | func TypeErr(expected, actual any) error {
type HandlerError (line 17) | type HandlerError struct
method Error (line 23) | func (err HandlerError) Error() string {
function New (line 28) | func New(err error) HandlerError {
FILE: core/commands/external.go
function ExternalBinary (line 14) | func ExternalBinary(instructions string) *cmds.Command {
FILE: core/commands/extra.go
function CreateCmdExtras (line 7) | func CreateCmdExtras(opts ...func(e *cmds.Extra)) *cmds.Extra {
type doesNotUseRepo (line 15) | type doesNotUseRepo struct
function SetDoesNotUseRepo (line 17) | func SetDoesNotUseRepo(val bool) func(e *cmds.Extra) {
function GetDoesNotUseRepo (line 23) | func GetDoesNotUseRepo(e *cmds.Extra) (val bool, found bool) {
type doesNotUseConfigAsInput (line 33) | type doesNotUseConfigAsInput struct
function SetDoesNotUseConfigAsInput (line 35) | func SetDoesNotUseConfigAsInput(val bool) func(e *cmds.Extra) {
function GetDoesNotUseConfigAsInput (line 41) | func GetDoesNotUseConfigAsInput(e *cmds.Extra) (val bool, found bool) {
type preemptsAutoUpdate (line 47) | type preemptsAutoUpdate struct
function SetPreemptsAutoUpdate (line 49) | func SetPreemptsAutoUpdate(val bool) func(e *cmds.Extra) {
function GetPreemptsAutoUpdate (line 55) | func GetPreemptsAutoUpdate(e *cmds.Extra) (val bool, found bool) {
function getBoolFlag (line 59) | func getBoolFlag(e *cmds.Extra, key any) (val bool, found bool) {
FILE: core/commands/files.go
function updateNoFlushCounter (line 56) | func updateNoFlushCounter(nd *core.IpfsNode, flush bool) error {
constant filesCidVersionOptionName (line 146) | filesCidVersionOptionName = "cid-version"
constant filesHashOptionName (line 147) | filesHashOptionName = "hash"
type statOutput (line 157) | type statOutput struct
method MarshalJSON (line 171) | func (s *statOutput) MarshalJSON() ([]byte, error) {
method UnmarshalJSON (line 184) | func (s *statOutput) UnmarshalJSON(data []byte) error {
constant defaultStatFormat (line 206) | defaultStatFormat = `<hash>
constant filesFormatOptionName (line 213) | filesFormatOptionName = "format"
constant filesSizeOptionName (line 214) | filesSizeOptionName = "size"
constant filesWithLocalOptionName (line 215) | filesWithLocalOptionName = "with-local"
constant filesStatUnspecified (line 216) | filesStatUnspecified = "not set"
function moreThanOne (line 341) | func moreThanOne(a, b, c bool) bool {
function statGetFormatOptions (line 345) | func statGetFormatOptions(req *cmds.Request) (string, error) {
function statNode (line 363) | func statNode(nd ipld.Node, enc cidenc.Encoder) (*statOutput, error) {
function statProtoNode (line 387) | func statProtoNode(n *dag.ProtoNode, enc cidenc.Encoder, cid cid.Cid, cu...
function walkBlock (line 425) | func walkBlock(ctx context.Context, dagserv ipld.DAGService, nd ipld.Nod...
function getNodeFromPath (line 599) | func getNodeFromPath(ctx context.Context, node *core.IpfsNode, api iface...
function unlinkNodeIfExists (line 618) | func unlinkNodeIfExists(node *core.IpfsNode, path string) error {
type filesLsOutput (line 647) | type filesLsOutput struct
constant longOptionName (line 652) | longOptionName = "long"
constant dontSortOptionName (line 653) | dontSortOptionName = "U"
constant filesOffsetOptionName (line 787) | filesOffsetOptionName = "offset"
constant filesCountOptionName (line 788) | filesCountOptionName = "count"
type contextReader (line 871) | type contextReader interface
type contextReaderWrapper (line 875) | type contextReaderWrapper struct
method Read (line 880) | func (crw *contextReaderWrapper) Read(b []byte) (int, error) {
constant filesCreateOptionName (line 951) | filesCreateOptionName = "create"
constant filesParentsOptionName (line 952) | filesParentsOptionName = "parents"
constant filesTruncateOptionName (line 953) | filesTruncateOptionName = "truncate"
constant filesRawLeavesOptionName (line 954) | filesRawLeavesOptionName = "raw-leaves"
constant filesFlushOptionName (line 955) | filesFlushOptionName = "flush"
type flushRes (line 1218) | type flushRes struct
function updatePath (line 1313) | func updatePath(rt *mfs.Root, pth string, builder cid.Builder) error {
function removePath (line 1396) | func removePath(filesRoot *mfs.Root, path string, force bool, dashr bool...
function getPrefixNew (line 1449) | func getPrefixNew(req *cmds.Request, importCfg *config.Import) (cid.Buil...
function getPrefix (line 1488) | func getPrefix(req *cmds.Request, importCfg *config.Import) (cid.Builder...
function ensureContainingDirectoryExists (line 1527) | func ensureContainingDirectoryExists(r *mfs.Root, path string, builder c...
function getFileHandle (line 1542) | func getFileHandle(r *mfs.Root, path string, create bool, builder cid.Bu...
function checkPath (line 1594) | func checkPath(p string) (string, error) {
function getParentDir (line 1610) | func getParentDir(root *mfs.Root, dir string) (*mfs.Directory, error) {
constant chrootConfirmOptionName (line 1706) | chrootConfirmOptionName = "confirm"
FILE: core/commands/files_test.go
function TestFilesCp_DagCborNodeFails (line 13) | func TestFilesCp_DagCborNodeFails(t *testing.T) {
FILE: core/commands/filestore.go
constant fileOrderOptionName (line 30) | fileOrderOptionName = "file-order"
constant removeBadBlocksOptionName (line 31) | removeBadBlocksOptionName = "remove-bad-blocks"
function getFilestore (line 253) | func getFilestore(env cmds.Environment) (*core.IpfsNode, *filestore.File...
function listByArgs (line 265) | func listByArgs(ctx context.Context, res cmds.ResponseEmitter, fs *files...
FILE: core/commands/get.go
constant outputOptionName (line 28) | outputOptionName = "output"
constant archiveOptionName (line 29) | archiveOptionName = "archive"
constant compressOptionName (line 30) | compressOptionName = "compress"
constant compressionLevelOptionName (line 31) | compressionLevelOptionName = "compression-level"
type clearlineReader (line 159) | type clearlineReader struct
method Read (line 164) | func (r *clearlineReader) Read(p []byte) (n int, err error) {
function progressBarForReader (line 173) | func progressBarForReader(out io.Writer, r io.Reader, l int64) (*pb.Prog...
function makeProgressBar (line 179) | func makeProgressBar(out io.Writer, l int64) *pb.ProgressBar {
function getOutPath (line 195) | func getOutPath(req *cmds.Request) string {
type getWriter (line 205) | type getWriter struct
method Write (line 215) | func (gw *getWriter) Write(r io.Reader, fpath string) error {
method writeArchive (line 222) | func (gw *getWriter) writeArchive(r io.Reader, fpath string) error {
method writeExtracted (line 256) | func (gw *getWriter) writeExtracted(r io.Reader, fpath string) error {
function getCompressOptions (line 271) | func getCompressOptions(req *cmds.Request) (int, error) {
type identityWriteCloser (line 289) | type identityWriteCloser struct
method Write (line 293) | func (i *identityWriteCloser) Write(p []byte) (int, error) {
method Close (line 297) | func (i *identityWriteCloser) Close() error {
function fileArchive (line 301) | func fileArchive(f files.Node, name string, archive bool, compression in...
function newMaybeGzWriter (line 375) | func newMaybeGzWriter(w io.Writer, compression int) (io.WriteCloser, err...
FILE: core/commands/get_test.go
function TestGetOutputPath (line 10) | func TestGetOutputPath(t *testing.T) {
FILE: core/commands/helptext_test.go
function checkHelptextRecursive (line 10) | func checkHelptextRecursive(t *testing.T, name []string, c *cmds.Command) {
function TestHelptexts (line 51) | func TestHelptexts(t *testing.T) {
FILE: core/commands/id.go
constant offlineIDErrorMessage (line 27) | offlineIDErrorMessage = "'ipfs id' cannot query information on remote pe...
type IdOutput (line 29) | type IdOutput struct
constant formatOptionName (line 38) | formatOptionName = "format"
constant idFormatOptionName (line 39) | idFormatOptionName = "peerid-base"
function printPeer (line 149) | func printPeer(keyEnc ke.KeyEncoder, ps pstore.Peerstore, p peer.ID) (an...
function printSelf (line 192) | func printSelf(keyEnc ke.KeyEncoder, node *core.IpfsNode) (any, error) {
FILE: core/commands/keyencode/keyencode.go
constant ipnsKeyFormatOptionName (line 9) | ipnsKeyFormatOptionName = "ipns-base"
type KeyEncoder (line 13) | type KeyEncoder struct
method FormatID (line 30) | func (enc KeyEncoder) FormatID(id peer.ID) string {
function KeyEncoderFromString (line 17) | func KeyEncoderFromString(formatLabel string) (KeyEncoder, error) {
FILE: core/commands/keystore.go
type KeyOutput (line 62) | type KeyOutput struct
type KeyOutputList (line 67) | type KeyOutputList struct
type KeyRenameOutput (line 72) | type KeyRenameOutput struct
constant keyStoreAlgorithmDefault (line 80) | keyStoreAlgorithmDefault = options.Ed25519Key
constant keyStoreTypeOptionName (line 81) | keyStoreTypeOptionName = "type"
constant keyStoreSizeOptionName (line 82) | keyStoreSizeOptionName = "size"
constant oldKeyOptionName (line 83) | oldKeyOptionName = "oldkey"
constant keyFormatOptionName (line 146) | keyFormatOptionName = "format"
constant keyFormatPemCleartextOption (line 147) | keyFormatPemCleartextOption = "pem-pkcs8-cleartext"
constant keyFormatLibp2pCleartextOption (line 148) | keyFormatLibp2pCleartextOption = "libp2p-protobuf-cleartext"
constant keyAllowAnyTypeOptionName (line 149) | keyAllowAnyTypeOptionName = "allow-any-key-type"
constant keyStoreForceOptionName (line 504) | keyStoreForceOptionName = "force"
function doRotate (line 640) | func doRotate(out io.Writer, repoRoot string, oldKey string, algorithm s...
function keyOutputListEncoders (line 690) | func keyOutputListEncoders() cmds.EncoderFunc {
type KeySignOutput (line 707) | type KeySignOutput struct
type KeyVerifyOutput (line 773) | type KeyVerifyOutput struct
function DaemonNotRunning (line 842) | func DaemonNotRunning(req *cmds.Request, env cmds.Environment) error {
FILE: core/commands/log.go
constant allLogSubsystems (line 15) | allLogSubsystems = "*"
constant allLogSubsystemsAlias (line 18) | allLogSubsystemsAlias = "all"
constant defaultLogLevel (line 21) | defaultLogLevel = "default"
constant defaultSubsystemKey (line 25) | defaultSubsystemKey = "(default)"
constant logLevelOption (line 28) | logLevelOption = "log-level"
constant noSubsystemSpecified (line 30) | noSubsystemSpecified = ""
type logLevelOutput (line 33) | type logLevelOutput struct
FILE: core/commands/ls.go
type LsLink (line 24) | type LsLink struct
type LsObject (line 35) | type LsObject struct
type LsOutput (line 42) | type LsOutput struct
constant lsHeadersOptionNameTime (line 47) | lsHeadersOptionNameTime = "headers"
constant lsResolveTypeOptionName (line 48) | lsResolveTypeOptionName = "resolve-type"
constant lsSizeOptionName (line 49) | lsSizeOptionName = "size"
constant lsStreamOptionName (line 50) | lsStreamOptionName = "stream"
constant lsLongOptionName (line 51) | lsLongOptionName = "long"
function formatMode (line 249) | func formatMode(mode os.FileMode) string {
function permBit (line 318) | func permBit(mode os.FileMode, bit os.FileMode, char byte) byte {
function formatModTime (line 332) | func formatModTime(t time.Time) string {
function tabularOutput (line 348) | func tabularOutput(req *cmds.Request, w io.Writer, out *LsOutput, lastOb...
FILE: core/commands/ls_test.go
function TestFormatMode (line 11) | func TestFormatMode(t *testing.T) {
function TestFormatModTime (line 141) | func TestFormatModTime(t *testing.T) {
FILE: core/commands/mount_unix.go
constant mountIPFSPathOptionName (line 18) | mountIPFSPathOptionName = "ipfs-path"
constant mountIPNSPathOptionName (line 19) | mountIPNSPathOptionName = "ipns-path"
constant mountMFSPathOptionName (line 20) | mountMFSPathOptionName = "mfs-path"
FILE: core/commands/multibase.go
constant mbaseOptionName (line 28) | mbaseOptionName = "b"
FILE: core/commands/name/ipns.go
type ResolvedPath (line 20) | type ResolvedPath struct
constant recursiveOptionName (line 25) | recursiveOptionName = "recursive"
constant nocacheOptionName (line 26) | nocacheOptionName = "nocache"
constant dhtRecordCountOptionName (line 27) | dhtRecordCountOptionName = "dht-record-count"
constant dhtTimeoutOptionName (line 28) | dhtTimeoutOptionName = "dht-timeout"
constant streamOptionName (line 29) | streamOptionName = "stream"
FILE: core/commands/name/ipnsps.go
type ipnsPubsubState (line 15) | type ipnsPubsubState struct
type ipnsPubsubCancel (line 19) | type ipnsPubsubCancel struct
type stringList (line 23) | type stringList struct
function stringListEncoder (line 166) | func stringListEncoder() cmds.EncoderFunc {
FILE: core/commands/name/name.go
type IpnsEntry (line 21) | type IpnsEntry struct
type IpnsInspectValidation (line 86) | type IpnsInspectValidation struct
type IpnsInspectEntry (line 94) | type IpnsInspectEntry struct
type IpnsInspectResult (line 102) | type IpnsInspectResult struct
constant forceOptionName (line 333) | forceOptionName = "force"
constant putAllowOfflineOption (line 334) | putAllowOfflineOption = "allow-offline"
constant allowDelegatedOption (line 335) | allowDelegatedOption = "allow-delegated"
constant putQuietOptionName (line 336) | putQuietOptionName = "quiet"
constant maxIPNSRecordSize (line 337) | maxIPNSRecordSize = 10 << 10
FILE: core/commands/name/publish.go
constant ipfsPathOptionName (line 22) | ipfsPathOptionName = "ipfs-path"
constant resolveOptionName (line 23) | resolveOptionName = "resolve"
constant allowOfflineOptionName (line 24) | allowOfflineOptionName = "allow-offline"
constant allowDelegatedOptionName (line 25) | allowDelegatedOptionName = "allow-delegated"
constant lifeTimeOptionName (line 26) | lifeTimeOptionName = "lifetime"
constant ttlOptionName (line 27) | ttlOptionName = "ttl"
constant keyOptionName (line 28) | keyOptionName = "key"
constant quieterOptionName (line 29) | quieterOptionName = "quieter"
constant v1compatOptionName (line 30) | v1compatOptionName = "v1compat"
constant sequenceOptionName (line 31) | sequenceOptionName = "sequence"
FILE: core/commands/object/diff.go
constant verboseOptionName (line 16) | verboseOptionName = "verbose"
type Changes (line 19) | type Changes struct
FILE: core/commands/object/object.go
type Link (line 9) | type Link struct
type Object (line 14) | type Object struct
FILE: core/commands/object/patch.go
constant createOptionName (line 97) | createOptionName = "create"
FILE: core/commands/p2p.go
constant P2PProtoPrefix (line 26) | P2PProtoPrefix = "/x/"
type P2PListenerInfoOutput (line 29) | type P2PListenerInfoOutput struct
type P2PStreamInfoOutput (line 36) | type P2PStreamInfoOutput struct
type P2PLsOutput (line 44) | type P2PLsOutput struct
type P2PStreamsOutput (line 49) | type P2PStreamsOutput struct
type P2PForegroundOutput (line 54) | type P2PForegroundOutput struct
constant allowCustomProtocolOptionName (line 61) | allowCustomProtocolOptionName = "allow-custom-protocol"
constant reportPeerIDOptionName (line 62) | reportPeerIDOptionName = "report-peer-id"
constant foregroundOptionName (line 63) | foregroundOptionName = "foreground"
function parseIpfsAddr (line 213) | func parseIpfsAddr(addr string) (*peer.AddrInfo, error) {
function checkPort (line 386) | func checkPort(target ma.Multiaddr) error {
function forwardLocal (line 419) | func forwardLocal(ctx context.Context, p *p2p.P2P, ps pstore.Peerstore, ...
constant p2pHeadersOptionName (line 425) | p2pHeadersOptionName = "headers"
constant p2pAllOptionName (line 486) | p2pAllOptionName = "all"
constant p2pProtocolOptionName (line 487) | p2pProtocolOptionName = "protocol"
constant p2pListenAddressOptionName (line 488) | p2pListenAddressOptionName = "listen-address"
constant p2pTargetAddressOptionName (line 489) | p2pTargetAddressOptionName = "target-address"
function p2pGetNode (line 690) | func p2pGetNode(env cmds.Environment) (*core.IpfsNode, error) {
FILE: core/commands/pin/pin.go
type PinOutput (line 44) | type PinOutput struct
type AddPinOutput (line 48) | type AddPinOutput struct
constant pinRecursiveOptionName (line 55) | pinRecursiveOptionName = "recursive"
constant pinProgressOptionName (line 56) | pinProgressOptionName = "progress"
function pinAddMany (line 215) | func pinAddMany(ctx context.Context, api coreiface.CoreAPI, enc cidenc.E...
constant pinTypeOptionName (line 312) | pinTypeOptionName = "type"
constant pinQuietOptionName (line 313) | pinQuietOptionName = "quiet"
constant pinStreamOptionName (line 314) | pinStreamOptionName = "stream"
constant pinNamesOptionName (line 315) | pinNamesOptionName = "names"
type PinLsOutputWrapper (line 483) | type PinLsOutputWrapper struct
type PinLsList (line 489) | type PinLsList struct
type PinLsType (line 494) | type PinLsType struct
type PinLsObject (line 500) | type PinLsObject struct
function pinLsKeys (line 506) | func pinLsKeys(req *cmds.Request, mode pin.Mode, displayNames bool, pinn...
function pinLsAll (line 560) | func pinLsAll(req *cmds.Request, typeStr string, detailed bool, name str...
constant pinUnpinOptionName (line 601) | pinUnpinOptionName = "unpin"
constant pinVerboseOptionName (line 676) | pinVerboseOptionName = "verbose"
type PinVerifyRes (line 732) | type PinVerifyRes struct
method Format (line 825) | func (r PinVerifyRes) Format(out io.Writer) {
type PinStatus (line 739) | type PinStatus struct
type BadNode (line 745) | type BadNode struct
type pinVerifyOpts (line 750) | type pinVerifyOpts struct
function pinVerify (line 756) | func pinVerify(ctx context.Context, n *core.IpfsNode, opts pinVerifyOpts...
FILE: core/commands/pin/remotepin.go
constant pinNameOptionName (line 58) | pinNameOptionName = "name"
constant pinCIDsOptionName (line 59) | pinCIDsOptionName = "cid"
constant pinStatusOptionName (line 60) | pinStatusOptionName = "status"
constant pinServiceNameOptionName (line 61) | pinServiceNameOptionName = "service"
constant pinServiceNameArgName (line 62) | pinServiceNameArgName = pinServiceNameOptionName
constant pinServiceEndpointArgName (line 63) | pinServiceEndpointArgName = "endpoint"
constant pinServiceKeyArgName (line 64) | pinServiceKeyArgName = "key"
constant pinServiceStatOptionName (line 65) | pinServiceStatOptionName = "stat"
constant pinBackgroundOptionName (line 66) | pinBackgroundOptionName = "background"
constant pinForceOptionName (line 67) | pinForceOptionName = "force"
type RemotePinOutput (line 70) | type RemotePinOutput struct
function toRemotePinOutput (line 76) | func toRemotePinOutput(ps pinclient.PinStatusGetter) RemotePinOutput {
function printRemotePinDetails (line 84) | func printRemotePinDetails(w io.Writer, out *RemotePinOutput) {
function lsRemote (line 324) | func lsRemote(ctx context.Context, req *cmds.Request, c *pinclient.Clien...
type ServiceDetails (line 690) | type ServiceDetails struct
type Stat (line 696) | type Stat struct
type PinCount (line 701) | type PinCount struct
type PinServicesList (line 709) | type PinServicesList struct
method Len (line 713) | func (l PinServicesList) Len() int {
method Swap (line 717) | func (l PinServicesList) Swap(i, j int) {
method Less (line 722) | func (l PinServicesList) Less(i, j int) bool {
function getRemotePinServiceFromRequest (line 727) | func getRemotePinServiceFromRequest(req *cmds.Request, env cmds.Environm...
function getRemotePinService (line 743) | func getRemotePinService(env cmds.Environment, name string) (*pinclient....
function getRemotePinServiceInfo (line 754) | func getRemotePinServiceInfo(env cmds.Environment, name string) (endpoin...
function normalizeEndpoint (line 782) | func normalizeEndpoint(endpoint string) (string, error) {
FILE: core/commands/pin/remotepin_test.go
function TestNormalizeEndpoint (line 7) | func TestNormalizeEndpoint(t *testing.T) {
FILE: core/commands/ping.go
constant kPingTimeout (line 20) | kPingTimeout = 10 * time.Second
type PingResult (line 22) | type PingResult struct
constant pingCountOptionName (line 29) | pingCountOptionName = "count"
function ParsePeerParam (line 206) | func ParsePeerParam(text string) (ma.Multiaddr, peer.ID, error) {
FILE: core/commands/profile.go
type profileResult (line 19) | type profileResult struct
constant collectorsOptionName (line 24) | collectorsOptionName = "collectors"
constant profileTimeOption (line 25) | profileTimeOption = "profile-time"
constant mutexProfileFractionOption (line 26) | mutexProfileFractionOption = "mutex-profile-fraction"
constant blockProfileRateOption (line 27) | blockProfileRateOption = "block-profile-rate"
FILE: core/commands/provide.go
constant provideQuietOptionName (line 29) | provideQuietOptionName = "quiet"
constant provideLanOptionName (line 30) | provideLanOptionName = "lan"
constant provideStatAllOptionName (line 32) | provideStatAllOptionName = "all"
constant provideStatCompactOptionName (line 33) | provideStatCompactOptionName = "compact"
constant provideStatNetworkOptionName (line 34) | provideStatNetworkOptionName = "network"
constant provideStatConnectivityOptionName (line 35) | provideStatConnectivityOptionName = "connectivity"
constant provideStatOperationsOptionName (line 36) | provideStatOperationsOptionName = "operations"
constant provideStatTimingsOptionName (line 37) | provideStatTimingsOptionName = "timings"
constant provideStatScheduleOptionName (line 38) | provideStatScheduleOptionName = "schedule"
constant provideStatQueuesOptionName (line 39) | provideStatQueuesOptionName = "queues"
constant provideStatWorkersOptionName (line 40) | provideStatWorkersOptionName = "workers"
constant lowWorkerThreshold (line 43) | lowWorkerThreshold = 2
type provideStats (line 133) | type provideStats struct
function extractSweepingProvider (line 142) | func extractSweepingProvider(prov any, useLAN bool) *provider.SweepingPr...
function humanDuration (line 519) | func humanDuration(val time.Duration) string {
function humanDurationOrNA (line 526) | func humanDurationOrNA(val time.Duration) string {
function humanTime (line 533) | func humanTime(val time.Time) string {
function humanNumber (line 540) | func humanNumber[T constraints.Float | constraints.Integer](n T) string {
function humanNumberOrNA (line 551) | func humanNumberOrNA[T constraints.Float | constraints.Integer](n T) str...
function humanFloatOrNA (line 561) | func humanFloatOrNA(val float64) string {
function humanSI (line 568) | func humanSI[T constraints.Float | constraints.Integer](val T, decimals ...
function humanInt (line 573) | func humanInt[T constraints.Integer](val T) string {
function humanFull (line 577) | func humanFull(val float64, decimals int) string {
function provideCIDSync (line 593) | func provideCIDSync(ctx context.Context, router routing.Routing, c cid.C...
FILE: core/commands/pubsub.go
type pubsubMessage (line 51) | type pubsubMessage struct
function multibaseDecodedStringListEncoder (line 264) | func multibaseDecodedStringListEncoder(req *cmds.Request, w io.Writer, l...
function safeTextListEncoder (line 278) | func safeTextListEncoder(req *cmds.Request, w io.Writer, list *stringLis...
function urlArgsEncoder (line 354) | func urlArgsEncoder(req *cmds.Request, env cmds.Environment) error {
function urlArgsDecoder (line 364) | func urlArgsDecoder(req *cmds.Request, env cmds.Environment) error {
type pubsubResetResult (line 385) | type pubsubResetResult struct
FILE: core/commands/refs.go
type KeyList (line 33) | type KeyList struct
constant refsFormatOptionName (line 38) | refsFormatOptionName = "format"
constant refsEdgesOptionName (line 39) | refsEdgesOptionName = "edges"
constant refsUniqueOptionName (line 40) | refsUniqueOptionName = "unique"
constant refsRecursiveOptionName (line 41) | refsRecursiveOptionName = "recursive"
constant refsMaxDepthOptionName (line 42) | refsMaxDepthOptionName = "max-depth"
function objectsForPaths (line 171) | func objectsForPaths(ctx context.Context, n iface.CoreAPI, paths []strin...
type RefWrapper (line 187) | type RefWrapper struct
type RefWriter (line 192) | type RefWriter struct
method WriteRefs (line 205) | func (rw *RefWriter) WriteRefs(c cid.Cid, enc cidenc.Encoder) (int, er...
method writeRefsRecursive (line 213) | func (rw *RefWriter) writeRefsRecursive(n ipld.Node, depth int, enc ci...
method visit (line 275) | func (rw *RefWriter) visit(c cid.Cid, depth int) (bool, bool) {
method WriteEdge (line 324) | func (rw *RefWriter) WriteEdge(from, to cid.Cid, linkname string, enc ...
FILE: core/commands/repo.go
type RepoVersion (line 28) | type RepoVersion struct
type GcResult (line 51) | type GcResult struct
constant repoStreamErrorsOptionName (line 57) | repoStreamErrorsOptionName = "stream-errors"
constant repoQuietOptionName (line 58) | repoQuietOptionName = "quiet"
constant repoSilentOptionName (line 59) | repoSilentOptionName = "silent"
constant repoAllowDowngradeOptionName (line 60) | repoAllowDowngradeOptionName = "allow-downgrade"
constant repoToVersionOptionName (line 61) | repoToVersionOptionName = "to"
constant repoSizeOnlyOptionName (line 150) | repoSizeOnlyOptionName = "size-only"
constant repoHumanOptionName (line 151) | repoHumanOptionName = "human"
type VerifyProgress (line 233) | type VerifyProgress struct
type verifyState (line 240) | type verifyState
constant verifyStateValid (line 243) | verifyStateValid verifyState = iota
constant verifyStateCorrupt (line 244) | verifyStateCorrupt
constant verifyStateCorruptRemoved (line 245) | verifyStateCorruptRemoved
constant verifyStateCorruptRemoveFailed (line 246) | verifyStateCorruptRemoveFailed
constant verifyStateCorruptHealed (line 247) | verifyStateCorruptHealed
constant verifyStateCorruptHealFailed (line 248) | verifyStateCorruptHealFailed
constant verifyWorkerMultiplier (line 255) | verifyWorkerMultiplier = 2
type verifyResult (line 261) | type verifyResult struct
function verifyWorkerRun (line 272) | func verifyWorkerRun(ctx context.Context, wg *sync.WaitGroup, keys <-cha...
function verifyResultChan (line 351) | func verifyResultChan(ctx context.Context, keys <-chan cid.Cid, bs bstor...
FILE: core/commands/repo_verify_test.go
function TestVerifyWorkerHealTimeout (line 32) | func TestVerifyWorkerHealTimeout(t *testing.T) {
type mockBlockstore (line 266) | type mockBlockstore struct
method Get (line 271) | func (m *mockBlockstore) Get(ctx context.Context, c cid.Cid) (blocks.B...
method DeleteBlock (line 278) | func (m *mockBlockstore) DeleteBlock(ctx context.Context, c cid.Cid) e...
method Has (line 282) | func (m *mockBlockstore) Has(ctx context.Context, c cid.Cid) (bool, er...
method GetSize (line 286) | func (m *mockBlockstore) GetSize(ctx context.Context, c cid.Cid) (int,...
method Put (line 293) | func (m *mockBlockstore) Put(ctx context.Context, b blocks.Block) error {
method PutMany (line 297) | func (m *mockBlockstore) PutMany(ctx context.Context, bs []blocks.Bloc...
method AllKeysChan (line 301) | func (m *mockBlockstore) AllKeysChan(ctx context.Context) (<-chan cid....
method HashOnRead (line 305) | func (m *mockBlockstore) HashOnRead(enabled bool) {
type mockBlockAPI (line 309) | type mockBlockAPI struct
method Get (line 315) | func (m *mockBlockAPI) Get(ctx context.Context, p path.Path) (io.Reade...
method Put (line 330) | func (m *mockBlockAPI) Put(ctx context.Context, r io.Reader, opts ...o...
method Rm (line 334) | func (m *mockBlockAPI) Rm(ctx context.Context, p path.Path, opts ...op...
method Stat (line 338) | func (m *mockBlockAPI) Stat(ctx context.Context, p path.Path) (coreifa...
type mockCoreAPI (line 343) | type mockCoreAPI struct
method Block (line 347) | func (m *mockCoreAPI) Block() coreiface.BlockAPI {
method Unixfs (line 351) | func (m *mockCoreAPI) Unixfs() coreiface.UnixfsAPI { return nil }
method Dag (line 352) | func (m *mockCoreAPI) Dag() coreiface.APIDagService { return nil }
method Name (line 353) | func (m *mockCoreAPI) Name() coreiface.NameAPI { return nil }
method Key (line 354) | func (m *mockCoreAPI) Key() coreiface.KeyAPI { return nil }
method Pin (line 355) | func (m *mockCoreAPI) Pin() coreiface.PinAPI { return nil }
method Object (line 356) | func (m *mockCoreAPI) Object() coreiface.ObjectAPI { return nil }
method Swarm (line 357) | func (m *mockCoreAPI) Swarm() coreiface.SwarmAPI { return nil }
method PubSub (line 358) | func (m *mockCoreAPI) PubSub() coreiface.PubSubAPI { return nil }
method Routing (line 359) | func (m *mockCoreAPI) Routing() coreiface.RoutingAPI { return nil }
method ResolvePath (line 361) | func (m *mockCoreAPI) ResolvePath(ctx context.Context, p path.Path) (p...
method ResolveNode (line 365) | func (m *mockCoreAPI) ResolveNode(ctx context.Context, p path.Path) (i...
method WithOptions (line 369) | func (m *mockCoreAPI) WithOptions(...options.ApiOption) (coreiface.Cor...
FILE: core/commands/resolve.go
constant resolveRecursiveOptionName (line 22) | resolveRecursiveOptionName = "recursive"
constant resolveDhtRecordCountOptionName (line 23) | resolveDhtRecordCountOptionName = "dht-record-count"
constant resolveDhtTimeoutOptionName (line 24) | resolveDhtTimeoutOptionName = "dht-timeout"
FILE: core/commands/root.go
constant RepoDirOption (line 24) | RepoDirOption = "repo-dir"
constant ConfigFileOption (line 25) | ConfigFileOption = "config-file"
constant ConfigOption (line 26) | ConfigOption = "config"
constant DebugOption (line 27) | DebugOption = "debug"
constant LocalOption (line 28) | LocalOption = "local"
constant OfflineOption (line 29) | OfflineOption = "offline"
constant ApiOption (line 30) | ApiOption = "api"
constant ApiAuthOption (line 31) | ApiAuthOption = "api-auth"
function init (line 167) | func init() {
type MessageOutput (line 172) | type MessageOutput struct
FILE: core/commands/root_test.go
function TestCommandTree (line 7) | func TestCommandTree(t *testing.T) {
FILE: core/commands/routing.go
constant dhtVerboseOptionName (line 33) | dhtVerboseOptionName = "verbose"
constant numProvidersOptionName (line 34) | numProvidersOptionName = "num-providers"
constant allowOfflineOptionName (line 35) | allowOfflineOptionName = "allow-offline"
constant recursiveOptionName (line 141) | recursiveOptionName = "recursive"
function provideCids (line 314) | func provideCids(prov node.DHTProvider, cids []cid.Cid) error {
function provideCidsRec (line 323) | func provideCidsRec(ctx context.Context, prov node.DHTProvider, dserv ip...
type printFunc (line 559) | type printFunc
type pfuncMap (line 560) | type pfuncMap
function printEvent (line 563) | func printEvent(obj *routing.QueryEvent, out io.Writer, verbose bool, ov...
function escapeDhtKey (line 614) | func escapeDhtKey(s string) (string, error) {
FILE: core/commands/stat.go
constant statPeerOptionName (line 40) | statPeerOptionName = "peer"
constant statProtoOptionName (line 41) | statProtoOptionName = "proto"
constant statPollOptionName (line 42) | statPollOptionName = "poll"
constant statIntervalOptionName (line 43) | statIntervalOptionName = "interval"
function printStats (line 191) | func printStats(out io.Writer, bs *metrics.Stats) {
FILE: core/commands/stat_dht.go
type dhtPeerInfo (line 20) | type dhtPeerInfo struct
type dhtStat (line 28) | type dhtStat struct
type dhtBucket (line 33) | type dhtBucket struct
FILE: core/commands/swarm.go
constant dnsResolveTimeout (line 39) | dnsResolveTimeout = 10 * time.Second
type stringList (line 42) | type stringList struct
type addrMap (line 46) | type addrMap struct
constant swarmVerboseOptionName (line 72) | swarmVerboseOptionName = "verbose"
constant swarmStreamsOptionName (line 73) | swarmStreamsOptionName = "streams"
constant swarmLatencyOptionName (line 74) | swarmLatencyOptionName = "latency"
constant swarmDirectionOptionName (line 75) | swarmDirectionOptionName = "direction"
constant swarmResetLimitsOptionName (line 76) | swarmResetLimitsOptionName = "reset"
constant swarmUsedResourcesPercentageName (line 77) | swarmUsedResourcesPercentageName = "min-used-limit-perc"
constant swarmIdentifyOptionName (line 78) | swarmIdentifyOptionName = "identify"
type peeringResult (line 81) | type peeringResult struct
type addrInfos (line 189) | type addrInfos struct
type streamInfo (line 427) | type streamInfo struct
type connInfo (line 431) | type connInfo struct
method Sort (line 441) | func (ci *connInfo) Sort() {
method identifyPeer (line 457) | func (ci *connInfo) identifyPeer(ps pstore.Peerstore, p peer.ID) (IdOu...
type connInfos (line 447) | type connInfos struct
method Sort (line 451) | func (ci *connInfos) Sort() {
function directionString (line 497) | func directionString(d inet.Direction) string {
function parseAddresses (line 761) | func parseAddresses(ctx context.Context, addrs []string, rslv *madns.Res...
function resolveAddresses (line 772) | func resolveAddresses(ctx context.Context, addrs []string, rslv *madns.R...
function filtersAdd (line 1003) | func filtersAdd(r repo.Repo, cfg *config.Config, filters []string) ([]st...
function filtersRemoveAll (line 1039) | func filtersRemoveAll(r repo.Repo, cfg *config.Config) ([]string, error) {
function filtersRemove (line 1050) | func filtersRemove(r repo.Repo, cfg *config.Config, toRemoveFilters []st...
FILE: core/commands/swarm_addrs_autonat.go
type reachabilityHost (line 14) | type reachabilityHost interface
type confirmedAddrsHost (line 19) | type confirmedAddrsHost interface
type autoNATResult (line 24) | type autoNATResult struct
function multiaddrsToStrings (line 31) | func multiaddrsToStrings(addrs []ma.Multiaddr) []string {
function writeAddrSection (line 39) | func writeAddrSection(w io.Writer, label string, addrs []string) {
FILE: core/commands/sysdiag.go
function getInfo (line 37) | func getInfo(nd *core.IpfsNode) (map[string]any, error) {
function runtimeInfo (line 69) | func runtimeInfo(out map[string]any) error {
function envVarInfo (line 83) | func envVarInfo(out map[string]any) error {
function diskSpaceInfo (line 92) | func diskSpaceInfo(out map[string]any) error {
function memInfo (line 111) | func memInfo(out map[string]any) error {
function netInfo (line 125) | func netInfo(online bool, out map[string]any) error {
FILE: core/commands/version.go
constant versionNumberOptionName (line 22) | versionNumberOptionName = "number"
constant versionCommitOptionName (line 23) | versionCommitOptionName = "commit"
constant versionRepoOptionName (line 24) | versionRepoOptionName = "repo"
constant versionAllOptionName (line 25) | versionAllOptionName = "all"
constant versionCheckThresholdOptionName (line 26) | versionCheckThresholdOptionName = "min-percent"
type Dependency (line 90) | type Dependency struct
constant pkgVersionFmt (line 97) | pkgVersionFmt = "%s@%s"
constant DefaultMinimalVersionFraction (line 143) | DefaultMinimalVersionFraction = 0.05
type VersionCheckOutput (line 145) | type VersionCheckOutput struct
function DetectNewKuboVersion (line 200) | func DetectNewKuboVersion(nd *core.IpfsNode, minPercent int64) (VersionC...
FILE: core/core.go
type IpfsNode (line 67) | type IpfsNode struct
method Close (line 144) | func (n *IpfsNode) Close() error {
method HasActiveDHTClient (line 161) | func (n *IpfsNode) HasActiveDHTClient() bool {
method Context (line 185) | func (n *IpfsNode) Context() context.Context {
method Bootstrap (line 193) | func (n *IpfsNode) Bootstrap(cfg bootstrap.BootstrapConfig) error {
method loadBootstrapPeers (line 248) | func (n *IpfsNode) loadBootstrapPeers() ([]peer.AddrInfo, error) {
method saveTempBootstrapPeers (line 258) | func (n *IpfsNode) saveTempBootstrapPeers(ctx context.Context, peerLis...
method loadTempBootstrapPeers (line 271) | func (n *IpfsNode) loadTempBootstrapPeers(ctx context.Context) ([]peer...
type Mounts (line 137) | type Mounts struct
type ConstructPeerHostOpts (line 285) | type ConstructPeerHostOpts struct
FILE: core/core_test.go
function TestInitialization (line 28) | func TestInitialization(t *testing.T) {
function mockHostOption (line 84) | func mockHostOption(mn mocknet.Mocknet) libp2p.HostOption {
function TestHasActiveDHTClient (line 99) | func TestHasActiveDHTClient(t *testing.T) {
FILE: core/coreapi/block.go
type BlockAPI (line 22) | type BlockAPI
method Put (line 29) | func (api *BlockAPI) Put(ctx context.Context, src io.Reader, opts ...c...
method Get (line 74) | func (api *BlockAPI) Get(ctx context.Context, p path.Path) (io.Reader,...
method Rm (line 90) | func (api *BlockAPI) Rm(ctx context.Context, p path.Path, opts ...caop...
method Stat (line 131) | func (api *BlockAPI) Stat(ctx context.Context, p path.Path) (coreiface...
method core (line 159) | func (api *BlockAPI) core() coreiface.CoreAPI {
type BlockStat (line 24) | type BlockStat struct
method Size (line 151) | func (bs *BlockStat) Size() int {
method Path (line 155) | func (bs *BlockStat) Path() path.ImmutablePath {
FILE: core/coreapi/coreapi.go
type CoreAPI (line 46) | type CoreAPI struct
method Unixfs (line 96) | func (api *CoreAPI) Unixfs() coreiface.UnixfsAPI {
method Block (line 101) | func (api *CoreAPI) Block() coreiface.BlockAPI {
method Dag (line 106) | func (api *CoreAPI) Dag() coreiface.APIDagService {
method Name (line 114) | func (api *CoreAPI) Name() coreiface.NameAPI {
method Key (line 119) | func (api *CoreAPI) Key() coreiface.KeyAPI {
method Object (line 124) | func (api *CoreAPI) Object() coreiface.ObjectAPI {
method Pin (line 129) | func (api *CoreAPI) Pin() coreiface.PinAPI {
method Swarm (line 134) | func (api *CoreAPI) Swarm() coreiface.SwarmAPI {
method PubSub (line 139) | func (api *CoreAPI) PubSub() coreiface.PubSubAPI {
method Routing (line 144) | func (api *CoreAPI) Routing() coreiface.RoutingAPI {
method WithOptions (line 149) | func (api *CoreAPI) WithOptions(opts ...options.ApiOption) (coreiface....
method getSession (line 256) | func (api *CoreAPI) getSession(ctx context.Context) *CoreAPI {
function NewCoreAPI (line 86) | func NewCoreAPI(n *core.IpfsNode, opts ...options.ApiOption) (coreiface....
FILE: core/coreapi/dag.go
type dagAPI (line 16) | type dagAPI struct
method Pinning (line 63) | func (api *dagAPI) Pinning() ipld.NodeAdder {
method Session (line 67) | func (api *dagAPI) Session(ctx context.Context) ipld.NodeGetter {
type pinningAdder (line 22) | type pinningAdder
method Add (line 24) | func (adder *pinningAdder) Add(ctx context.Context, nd ipld.Node) error {
method AddMany (line 40) | func (adder *pinningAdder) AddMany(ctx context.Context, nds []ipld.Nod...
FILE: core/coreapi/key.go
type KeyAPI (line 21) | type KeyAPI
method Generate (line 58) | func (api *KeyAPI) Generate(ctx context.Context, name string, opts ......
method List (line 118) | func (api *KeyAPI) List(ctx context.Context) ([]coreiface.Key, error) {
method Rename (line 161) | func (api *KeyAPI) Rename(ctx context.Context, oldName string, newName...
method Remove (line 231) | func (api *KeyAPI) Remove(ctx context.Context, name string) (coreiface...
method Self (line 261) | func (api *KeyAPI) Self(ctx context.Context) (coreiface.Key, error) {
method Sign (line 271) | func (api *KeyAPI) Sign(ctx context.Context, name string, data []byte)...
method Verify (line 306) | func (api *KeyAPI) Verify(ctx context.Context, keyOrName string, signa...
type key (line 23) | type key struct
method Name (line 42) | func (k *key) Name() string {
method Path (line 47) | func (k *key) Path() path.Path {
method ID (line 52) | func (k *key) ID() peer.ID {
function newKey (line 29) | func newKey(name string, pid peer.ID) (*key, error) {
constant signedMessagePrefix (line 269) | signedMessagePrefix = "libp2p-key signed message:"
FILE: core/coreapi/name.go
type NameAPI (line 24) | type NameAPI
method Publish (line 27) | func (api *NameAPI) Publish(ctx context.Context, p path.Path, opts ......
method Search (line 102) | func (api *NameAPI) Search(ctx context.Context, name string, opts ...c...
method Resolve (line 154) | func (api *NameAPI) Resolve(ctx context.Context, name string, opts ......
function keylookup (line 179) | func keylookup(self ci.PrivKey, kstore keystore.Keystore, k string) (ci....
FILE: core/coreapi/object.go
type ObjectAPI (line 18) | type ObjectAPI
method AddLink (line 30) | func (api *ObjectAPI) AddLink(ctx context.Context, base path.Path, nam...
method RmLink (line 79) | func (api *ObjectAPI) RmLink(ctx context.Context, base path.Path, link...
method Diff (line 111) | func (api *ObjectAPI) Diff(ctx context.Context, before path.Path, afte...
method core (line 152) | func (api *ObjectAPI) core() coreiface.CoreAPI {
type Link (line 20) | type Link struct
type Node (line 25) | type Node struct
FILE: core/coreapi/path.go
method ResolveNode (line 22) | func (api *CoreAPI) ResolveNode(ctx context.Context, p path.Path) (ipld....
method ResolvePath (line 40) | func (api *CoreAPI) ResolvePath(ctx context.Context, p path.Path) (path....
FILE: core/coreapi/pin.go
type PinAPI (line 22) | type PinAPI
method Add (line 24) | func (api *PinAPI) Add(ctx context.Context, p path.Path, opts ...caopt...
method Ls (line 50) | func (api *PinAPI) Ls(ctx context.Context, pins chan<- coreiface.Pin, ...
method IsPinned (line 72) | func (api *PinAPI) IsPinned(ctx context.Context, p path.Path, opts ......
method Rm (line 97) | func (api *PinAPI) Rm(ctx context.Context, p path.Path, opts ...caopts...
method Update (line 124) | func (api *PinAPI) Update(ctx context.Context, from path.Path, to path...
method Verify (line 191) | func (api *PinAPI) Verify(ctx context.Context) (<-chan coreiface.PinSt...
method pinLsAll (line 274) | func (api *PinAPI) pinLsAll(ctx context.Context, typeStr string, detai...
method core (line 368) | func (api *PinAPI) core() coreiface.CoreAPI {
type pinStatus (line 158) | type pinStatus struct
method Ok (line 171) | func (s *pinStatus) Ok() bool {
method BadNodes (line 175) | func (s *pinStatus) BadNodes() []coreiface.BadPinNode {
method Err (line 179) | func (s *pinStatus) Err() error {
type badNode (line 166) | type badNode struct
method Path (line 183) | func (n *badNode) Path() path.ImmutablePath {
method Err (line 187) | func (n *badNode) Err() error {
type pinInfo (line 252) | type pinInfo struct
method Path (line 258) | func (p *pinInfo) Path() path.ImmutablePath {
method Type (line 262) | func (p *pinInfo) Type() string {
method Name (line 266) | func (p *pinInfo) Name() string {
FILE: core/coreapi/pubsub.go
type PubSubAPI (line 17) | type PubSubAPI
method Ls (line 27) | func (api *PubSubAPI) Ls(ctx context.Context) ([]string, error) {
method Peers (line 39) | func (api *PubSubAPI) Peers(ctx context.Context, opts ...caopts.PubSub...
method Publish (line 58) | func (api *PubSubAPI) Publish(ctx context.Context, topic string, data ...
method Subscribe (line 71) | func (api *PubSubAPI) Subscribe(ctx context.Context, topic string, opt...
method checkNode (line 98) | func (api *PubSubAPI) checkNode() (routing.Routing, error) {
type pubSubSubscription (line 19) | type pubSubSubscription struct
method Close (line 111) | func (sub *pubSubSubscription) Close() error {
method Next (line 116) | func (sub *pubSubSubscription) Next(ctx context.Context) (coreiface.Pu...
type pubSubMessage (line 23) | type pubSubMessage struct
method From (line 128) | func (msg *pubSubMessage) From() peer.ID {
method Data (line 132) | func (msg *pubSubMessage) Data() []byte {
method Seq (line 136) | func (msg *pubSubMessage) Seq() []byte {
method Topics (line 140) | func (msg *pubSubMessage) Topics() []string {
FILE: core/coreapi/routing.go
type RoutingAPI (line 26) | type RoutingAPI
method Get (line 28) | func (api *RoutingAPI) Get(ctx context.Context, key string) ([]byte, e...
method Put (line 41) | func (api *RoutingAPI) Put(ctx context.Context, key string, value []by...
method FindPeer (line 75) | func (api *RoutingAPI) FindPeer(ctx context.Context, p peer.ID) (peer....
method FindProviders (line 91) | func (api *RoutingAPI) FindProviders(ctx context.Context, p path.Path,...
method Provide (line 120) | func (api *RoutingAPI) Provide(ctx context.Context, path path.Path, op...
method core (line 225) | func (api *RoutingAPI) core() coreiface.CoreAPI {
function normalizeKey (line 60) | func normalizeKey(s string) (string, error) {
function provideKeysRec (line 163) | func provideKeysRec(ctx context.Context, prov node.DHTProvider, bs block...
FILE: core/coreapi/swarm.go
type SwarmAPI (line 20) | type SwarmAPI
method Connect (line 37) | func (api *SwarmAPI) Connect(ctx context.Context, pi peer.AddrInfo) er...
method Disconnect (line 57) | func (api *SwarmAPI) Disconnect(ctx context.Context, addr ma.Multiaddr...
method KnownAddrs (line 92) | func (api *SwarmAPI) KnownAddrs(ctx context.Context) (map[peer.ID][]ma...
method LocalAddrs (line 112) | func (api *SwarmAPI) LocalAddrs(ctx context.Context) ([]ma.Multiaddr, ...
method ListenAddrs (line 123) | func (api *SwarmAPI) ListenAddrs(ctx context.Context) ([]ma.Multiaddr,...
method Peers (line 134) | func (api *SwarmAPI) Peers(ctx context.Context) ([]coreiface.Connectio...
type connInfo (line 22) | type connInfo struct
method ID (line 170) | func (ci *connInfo) ID() peer.ID {
method Address (line 174) | func (ci *connInfo) Address() ma.Multiaddr {
method Direction (line 178) | func (ci *connInfo) Direction() inet.Direction {
method Latency (line 182) | func (ci *connInfo) Latency() (time.Duration, error) {
method Streams (line 186) | func (ci *connInfo) Streams() ([]protocol.ID, error) {
constant connectionManagerTag (line 33) | connectionManagerTag = "user-connect"
constant connectionManagerWeight (line 34) | connectionManagerWeight = 100
FILE: core/coreapi/test/api_test.go
constant testPeerID (line 30) | testPeerID = "QmTFauExutTsy4XP6JbMFcw2Wa9645HJt2bTqL6qYDCKfe"
type NodeProvider (line 32) | type NodeProvider struct
method MakeAPISwarm (line 34) | func (NodeProvider) MakeAPISwarm(t *testing.T, ctx context.Context, fu...
function TestIface (line 126) | func TestIface(t *testing.T) {
FILE: core/coreapi/test/path_test.go
function TestPathUnixFSHAMTPartial (line 17) | func TestPathUnixFSHAMTPartial(t *testing.T) {
FILE: core/coreapi/unixfs.go
type UnixfsAPI (line 38) | type UnixfsAPI
method Add (line 42) | func (api *UnixfsAPI) Add(ctx context.Context, files files.Node, opts ...
method Get (line 234) | func (api *UnixfsAPI) Get(ctx context.Context, p path.Path) (files.Nod...
method Ls (line 250) | func (api *UnixfsAPI) Ls(ctx context.Context, p path.Path, out chan<- ...
method processLink (line 282) | func (api *UnixfsAPI) processLink(ctx context.Context, linkres ft.Link...
method lsFromDirLinks (line 340) | func (api *UnixfsAPI) lsFromDirLinks(ctx context.Context, dir uio.Dire...
method lsFromLinks (line 355) | func (api *UnixfsAPI) lsFromLinks(ctx context.Context, ndlinks []*ipld...
method core (line 383) | func (api *UnixfsAPI) core() *CoreAPI {
type syncDagService (line 388) | type syncDagService struct
method Sync (line 393) | func (s *syncDagService) Sync() error {
type providingDagService (line 397) | type providingDagService struct
method Add (line 402) | func (pds *providingDagService) Add(ctx context.Context, n ipld.Node) ...
method AddMany (line 416) | func (pds *providingDagService) AddMany(ctx context.Context, nds []ipl...
FILE: core/corehttp/commands.go
constant originEnvKey (line 25) | originEnvKey = "API_ORIGIN"
constant originEnvKeyDeprecate (line 26) | originEnvKeyDeprecate = `You are using the ` + originEnvKey + `ENV Varia...
constant APIPath (line 37) | APIPath = "/api/v0"
function addCORSFromEnv (line 53) | func addCORSFromEnv(c *cmdsHttp.ServerConfig) {
function addHeadersFromConfig (line 61) | func addHeadersFromConfig(c *cmdsHttp.ServerConfig, nc *config.Config) {
function addCORSDefaults (line 90) | func addCORSDefaults(c *cmdsHttp.ServerConfig) {
function patchCORSVars (line 101) | func patchCORSVars(c *cmdsHttp.ServerConfig, addr net.Addr) {
function commandsOption (line 124) | func commandsOption(cctx oldcmds.Context, command *cmds.Command) ServeOp...
type rpcAuthScopeWithUser (line 157) | type rpcAuthScopeWithUser struct
function convertAuthorizationsMap (line 162) | func convertAuthorizationsMap(authScopes map[string]*config.RPCAuthScope...
function withAuthSecrets (line 178) | func withAuthSecrets(authorizations map[string]rpcAuthScopeWithUser, nex...
function CommandsOption (line 204) | func CommandsOption(cctx oldcmds.Context) ServeOption {
function CheckVersionOption (line 209) | func CheckVersionOption() ServeOption {
FILE: core/corehttp/corehttp.go
constant shutdownTimeout (line 24) | shutdownTimeout = 30 * time.Second
type ServeOption (line 30) | type ServeOption
function MakeHandler (line 34) | func MakeHandler(n *core.IpfsNode, l net.Listener, options ...ServeOptio...
function ListenAndServe (line 63) | func ListenAndServe(n *core.IpfsNode, listeningMultiAddr string, options...
function Serve (line 83) | func Serve(node *core.IpfsNode, lis net.Listener, options ...ServeOption...
function ServeWithReady (line 97) | func ServeWithReady(node *core.IpfsNode, lis net.Listener, ready chan<- ...
FILE: core/corehttp/gateway.go
function GatewayOption (line 33) | func GatewayOption(paths ...string) ServeOption {
function HostnameOption (line 61) | func HostnameOption() ServeOption {
function VersionOption (line 89) | func VersionOption() ServeOption {
function Libp2pGatewayOption (line 99) | func Libp2pGatewayOption() ServeOption {
function newGatewayBackend (line 144) | func newGatewayBackend(n *core.IpfsNode) (gateway.IPFSBackend, error) {
type offlineGatewayErrWrapper (line 195) | type offlineGatewayErrWrapper struct
method Get (line 206) | func (o *offlineGatewayErrWrapper) Get(ctx context.Context, path path....
method GetAll (line 212) | func (o *offlineGatewayErrWrapper) GetAll(ctx context.Context, path pa...
method GetBlock (line 218) | func (o *offlineGatewayErrWrapper) GetBlock(ctx context.Context, path ...
method Head (line 224) | func (o *offlineGatewayErrWrapper) Head(ctx context.Context, path path...
method ResolvePath (line 230) | func (o *offlineGatewayErrWrapper) ResolvePath(ctx context.Context, pa...
method GetCAR (line 236) | func (o *offlineGatewayErrWrapper) GetCAR(ctx context.Context, path pa...
method IsCached (line 242) | func (o *offlineGatewayErrWrapper) IsCached(ctx context.Context, path ...
method GetIPNSRecord (line 246) | func (o *offlineGatewayErrWrapper) GetIPNSRecord(ctx context.Context, ...
method ResolveMutable (line 252) | func (o *offlineGatewayErrWrapper) ResolveMutable(ctx context.Context,...
method GetDNSLinkRecord (line 258) | func (o *offlineGatewayErrWrapper) GetDNSLinkRecord(ctx context.Contex...
function offlineErrWrap (line 199) | func offlineErrWrap(err error) error {
function staticServerDomainAttrFn (line 279) | func staticServerDomainAttrFn(domain string) func(*http.Request) []attri...
function newServerDomainAttrFn (line 291) | func newServerDomainAttrFn(n *core.IpfsNode) func(*http.Request) []attri...
function getGatewayConfig (line 366) | func getGatewayConfig(n *core.IpfsNode) (gateway.Config, map[string][]st...
FILE: core/corehttp/gateway_test.go
type mockNamesys (line 27) | type mockNamesys
method Resolve (line 29) | func (m mockNamesys) Resolve(ctx context.Context, p path.Path, opts .....
method ResolveAsync (line 61) | func (m mockNamesys) ResolveAsync(ctx context.Context, p path.Path, op...
method Publish (line 69) | func (m mockNamesys) Publish(ctx context.Context, name ci.PrivKey, val...
method GetResolver (line 73) | func (m mockNamesys) GetResolver(subs string) (namesys.Resolver, bool) {
function newNodeWithMockNamesys (line 77) | func newNodeWithMockNamesys(ns mockNamesys) (*core.IpfsNode, error) {
type delegatedHandler (line 95) | type delegatedHandler struct
method ServeHTTP (line 99) | func (dh *delegatedHandler) ServeHTTP(w http.ResponseWriter, r *http.R...
function doWithoutRedirect (line 103) | func doWithoutRedirect(req *http.Request) (*http.Response, error) {
function newTestServerAndNode (line 117) | func newTestServerAndNode(t *testing.T, ns mockNamesys) (*httptest.Serve...
function TestVersion (line 147) | func TestVersion(t *testing.T) {
function TestDeserializedResponsesInheritance (line 178) | func TestDeserializedResponsesInheritance(t *testing.T) {
FILE: core/corehttp/logs.go
function LogOption (line 13) | func LogOption() ServeOption {
FILE: core/corehttp/metrics.go
function MetricsScrapingOption (line 18) | func MetricsScrapingOption(path string) ServeOption {
function MetricsOpenCensusCollectionOption (line 26) | func MetricsOpenCensusCollectionOption() ServeOption {
function MetricsOpenCensusDefaultPrometheusRegistry (line 57) | func MetricsOpenCensusDefaultPrometheusRegistry() ServeOption {
function MetricsCollectionOption (line 79) | func MetricsCollectionOption(handlerName string) ServeOption {
type IpfsNodeCollector (line 162) | type IpfsNodeCollector struct
method Describe (line 166) | func (IpfsNodeCollector) Describe(ch chan<- *prometheus.Desc) {
method Collect (line 170) | func (c IpfsNodeCollector) Collect(ch chan<- prometheus.Metric) {
method PeersTotalValues (line 181) | func (c IpfsNodeCollector) PeersTotalValues() map[string]float64 {
FILE: core/corehttp/metrics_test.go
function TestPeersTotal (line 18) | func TestPeersTotal(t *testing.T) {
FILE: core/corehttp/mutex_profile.go
function MutexFractionOption (line 14) | func MutexFractionOption(path string) ServeOption {
function BlockProfileRateOption (line 50) | func BlockProfileRateOption(path string) ServeOption {
FILE: core/corehttp/option_test.go
type testcasecheckversion (line 13) | type testcasecheckversion struct
method body (line 21) | func (tc testcasecheckversion) body() string {
function TestCheckVersionOption (line 29) | func TestCheckVersionOption(t *testing.T) {
FILE: core/corehttp/p2p_proxy.go
function P2PProxyOption (line 19) | func P2PProxyOption() ServeOption {
type proxyRequest (line 51) | type proxyRequest struct
function parseRequest (line 61) | func parseRequest(request *http.Request) (*proxyRequest, error) {
function handleError (line 85) | func handleError(w http.ResponseWriter, msg string, err error, code int) {
FILE: core/corehttp/p2p_proxy_test.go
type TestCase (line 12) | type TestCase struct
function TestParseRequest (line 25) | func TestParseRequest(t *testing.T) {
function TestParseRequestInvalidPath (line 43) | func TestParseRequestInvalidPath(t *testing.T) {
FILE: core/corehttp/redirect.go
function RedirectOption (line 10) | func RedirectOption(path string, redirect string) ServeOption {
type redirectHandler (line 28) | type redirectHandler struct
method ServeHTTP (line 33) | func (i *redirectHandler) ServeHTTP(w http.ResponseWriter, r *http.Req...
FILE: core/corehttp/routing.go
function RoutingOption (line 25) | func RoutingOption() ServeOption {
type contentRouter (line 39) | type contentRouter struct
method FindProviders (line 43) | func (r *contentRouter) FindProviders(ctx context.Context, key cid.Cid...
method ProvideBitswap (line 53) | func (r *contentRouter) ProvideBitswap(ctx context.Context, req *serve...
method FindPeers (line 57) | func (r *contentRouter) FindPeers(ctx context.Context, pid peer.ID, li...
method GetIPNS (line 78) | func (r *contentRouter) GetIPNS(ctx context.Context, name ipns.Name) (...
method PutIPNS (line 90) | func (r *contentRouter) PutIPNS(ctx context.Context, name ipns.Name, r...
method GetClosestPeers (line 104) | func (r *contentRouter) GetClosestPeers(ctx context.Context, key cid.C...
type peerChanIter (line 158) | type peerChanIter struct
method Next (line 164) | func (it *peerChanIter) Next() bool {
method Val (line 174) | func (it *peerChanIter) Val() types.Record {
method Close (line 191) | func (it *peerChanIter) Close() error {
FILE: core/corehttp/webui.go
constant WebUIPath (line 15) | WebUIPath = "/ipfs/bafybeihxglpcfyarpm7apn7xpezbuoqgk3l5chyk7w4gvrjwk45r...
function WebUIOption (line 92) | func WebUIOption(n *core.IpfsNode, _ net.Listener, mux *http.ServeMux) (...
type webUIHandler (line 109) | type webUIHandler struct
method ServeHTTP (line 116) | func (h *webUIHandler) ServeHTTP(w http.ResponseWriter, r *http.Reques...
method writeIncompatibleError (line 149) | func (h *webUIHandler) writeIncompatibleError(w http.ResponseWriter) {
method writeNotAvailableError (line 161) | func (h *webUIHandler) writeNotAvailableError(w http.ResponseWriter) {
FILE: core/coreiface/block.go
type BlockStat (line 12) | type BlockStat interface
type BlockAPI (line 21) | type BlockAPI interface
FILE: core/coreiface/coreapi.go
type CoreAPI (line 15) | type CoreAPI interface
FILE: core/coreiface/dag.go
type APIDagService (line 8) | type APIDagService interface
FILE: core/coreiface/idfmt.go
function FormatKeyID (line 8) | func FormatKeyID(id peer.ID) string {
function FormatKey (line 17) | func FormatKey(key Key) string {
FILE: core/coreiface/key.go
type Key (line 14) | type Key interface
type KeyAPI (line 26) | type KeyAPI interface
FILE: core/coreiface/name.go
type IpnsResult (line 14) | type IpnsResult struct
type NameAPI (line 27) | type NameAPI interface
FILE: core/coreiface/object.go
type ChangeType (line 11) | type ChangeType
constant DiffAdd (line 15) | DiffAdd ChangeType = iota
constant DiffRemove (line 18) | DiffRemove
constant DiffMod (line 21) | DiffMod
type ObjectChange (line 25) | type ObjectChange struct
type ObjectAPI (line 46) | type ObjectAPI interface
FILE: core/coreiface/options/block.go
type BlockPutSettings (line 11) | type BlockPutSettings struct
type BlockRmSettings (line 16) | type BlockRmSettings struct
type BlockPutOption (line 21) | type BlockPutOption
type BlockRmOption (line 22) | type BlockRmOption
function BlockPutOptions (line 25) | func BlockPutOptions(opts ...BlockPutOption) (*BlockPutSettings, error) {
function BlockRmOptions (line 50) | func BlockRmOptions(opts ...BlockRmOption) (*BlockRmSettings, error) {
type blockOpts (line 64) | type blockOpts struct
method CidCodec (line 71) | func (blockOpts) CidCodec(codecName string) BlockPutOption {
method Format (line 95) | func (blockOpts) Format(format string) BlockPutOption {
method Hash (line 141) | func (blockOpts) Hash(mhType uint64, mhLen int) BlockPutOption {
method Pin (line 151) | func (blockOpts) Pin(pin bool) BlockPutOption {
method Force (line 160) | func (blockOpts) Force(force bool) BlockRmOption {
function codeFromName (line 86) | func codeFromName(codecName string) (mc.Code, error) {
FILE: core/coreiface/options/global.go
type ApiSettings (line 3) | type ApiSettings struct
type ApiOption (line 8) | type ApiOption
function ApiOptions (line 10) | func ApiOptions(opts ...ApiOption) (*ApiSettings, error) {
function ApiOptionsTo (line 19) | func ApiOptionsTo(options *ApiSettings, opts ...ApiOption) (*ApiSettings...
type apiOpts (line 29) | type apiOpts struct
method Offline (line 33) | func (apiOpts) Offline(offline bool) ApiOption {
method FetchBlocks (line 42) | func (apiOpts) FetchBlocks(fetch bool) ApiOption {
FILE: core/coreiface/options/key.go
constant RSAKey (line 4) | RSAKey = "rsa"
constant Ed25519Key (line 5) | Ed25519Key = "ed25519"
constant DefaultRSALen (line 7) | DefaultRSALen = 2048
type KeyGenerateSettings (line 10) | type KeyGenerateSettings struct
type KeyRenameSettings (line 15) | type KeyRenameSettings struct
type KeyGenerateOption (line 20) | type KeyGenerateOption
type KeyRenameOption (line 21) | type KeyRenameOption
function KeyGenerateOptions (line 24) | func KeyGenerateOptions(opts ...KeyGenerateOption) (*KeyGenerateSettings...
function KeyRenameOptions (line 39) | func KeyRenameOptions(opts ...KeyRenameOption) (*KeyRenameSettings, erro...
type keyOpts (line 53) | type keyOpts struct
method Type (line 63) | func (keyOpts) Type(algorithm string) KeyGenerateOption {
method Size (line 75) | func (keyOpts) Size(size int) KeyGenerateOption {
method Force (line 84) | func (keyOpts) Force(force bool) KeyRenameOption {
FILE: core/coreiface/options/name.go
constant DefaultNameValidTime (line 10) | DefaultNameValidTime = 24 * time.Hour
type NamePublishSettings (line 13) | type NamePublishSettings struct
type NameResolveSettings (line 23) | type NameResolveSettings struct
type NamePublishOption (line 30) | type NamePublishOption
type NameResolveOption (line 31) | type NameResolveOption
function NamePublishOptions (line 34) | func NamePublishOptions(opts ...NamePublishOption) (*NamePublishSettings...
function NameResolveOptions (line 53) | func NameResolveOptions(opts ...NameResolveOption) (*NameResolveSettings...
type nameOpts (line 68) | type nameOpts struct
method ValidTime (line 74) | func (nameOpts) ValidTime(validTime time.Duration) NamePublishOption {
method Key (line 86) | func (nameOpts) Key(key string) NamePublishOption {
method AllowOffline (line 95) | func (nameOpts) AllowOffline(allow bool) NamePublishOption {
method AllowDelegated (line 105) | func (nameOpts) AllowDelegated(allowDelegated bool) NamePublishOption {
method TTL (line 114) | func (nameOpts) TTL(ttl time.Duration) NamePublishOption {
method Sequence (line 123) | func (nameOpts) Sequence(seq uint64) NamePublishOption {
method CompatibleWithV1 (line 132) | func (nameOpts) CompatibleWithV1(compatible bool) NamePublishOption {
method Cache (line 141) | func (nameOpts) Cache(cache bool) NameResolveOption {
method ResolveOption (line 148) | func (nameOpts) ResolveOption(opt namesys.ResolveOption) NameResolveOp...
FILE: core/coreiface/options/object.go
type ObjectAddLinkSettings (line 3) | type ObjectAddLinkSettings struct
type ObjectAddLinkOption (line 8) | type ObjectAddLinkOption
function ObjectAddLinkOptions (line 11) | func ObjectAddLinkOptions(opts ...ObjectAddLinkOption) (*ObjectAddLinkSe...
type objectOpts (line 25) | type objectOpts struct
method Create (line 31) | func (objectOpts) Create(create bool) ObjectAddLinkOption {
FILE: core/coreiface/options/pin.go
type PinAddSettings (line 6) | type PinAddSettings struct
type PinLsSettings (line 12) | type PinLsSettings struct
type PinIsPinnedSettings (line 19) | type PinIsPinnedSettings struct
type PinRmSettings (line 24) | type PinRmSettings struct
type PinUpdateSettings (line 29) | type PinUpdateSettings struct
type PinAddOption (line 34) | type PinAddOption
type PinLsOption (line 37) | type PinLsOption
type PinIsPinnedOption (line 40) | type PinIsPinnedOption
type PinRmOption (line 43) | type PinRmOption
type PinUpdateOption (line 46) | type PinUpdateOption
function PinAddOptions (line 50) | func PinAddOptions(opts ...PinAddOption) (*PinAddSettings, error) {
function PinLsOptions (line 67) | func PinLsOptions(opts ...PinLsOption) (*PinLsSettings, error) {
function PinIsPinnedOptions (line 84) | func PinIsPinnedOptions(opts ...PinIsPinnedOption) (*PinIsPinnedSettings...
function PinRmOptions (line 101) | func PinRmOptions(opts ...PinRmOption) (*PinRmSettings, error) {
function PinUpdateOptions (line 117) | func PinUpdateOptions(opts ...PinUpdateOption) (*PinUpdateSettings, erro...
type pinOpts (line 132) | type pinOpts struct
method Recursive (line 278) | func (pinOpts) Recursive(recursive bool) PinAddOption {
method Name (line 286) | func (pinOpts) Name(name string) PinAddOption {
method RmRecursive (line 296) | func (pinOpts) RmRecursive(recursive bool) PinRmOption {
method Unpin (line 305) | func (pinOpts) Unpin(unpin bool) PinUpdateOption {
type pinLsOpts (line 140) | type pinLsOpts struct
method All (line 144) | func (pinLsOpts) All() PinLsOption {
method Recursive (line 150) | func (pinLsOpts) Recursive() PinLsOption {
method Direct (line 156) | func (pinLsOpts) Direct() PinLsOption {
method Indirect (line 162) | func (pinLsOpts) Indirect() PinLsOption {
method Type (line 175) | func (pinLsOpts) Type(typeStr string) (PinLsOption, error) {
method pinType (line 193) | func (pinLsOpts) pinType(t string) PinLsOption {
method Detailed (line 202) | func (pinLsOpts) Detailed(detailed bool) PinLsOption {
method Name (line 209) | func (pinLsOpts) Name(name string) PinLsOption {
type pinIsPinnedOpts (line 216) | type pinIsPinnedOpts struct
method All (line 220) | func (pinIsPinnedOpts) All() PinIsPinnedOption {
method Recursive (line 226) | func (pinIsPinnedOpts) Recursive() PinIsPinnedOption {
method Direct (line 232) | func (pinIsPinnedOpts) Direct() PinIsPinnedOption {
method Indirect (line 238) | func (pinIsPinnedOpts) Indirect() PinIsPinnedOption {
method Type (line 251) | func (pinIsPinnedOpts) Type(typeStr string) (PinIsPinnedOption, error) {
method pinType (line 269) | func (pinIsPinnedOpts) pinType(t string) PinIsPinnedOption {
FILE: core/coreiface/options/pubsub.go
type PubSubPeersSettings (line 3) | type PubSubPeersSettings struct
type PubSubSubscribeSettings (line 7) | type PubSubSubscribeSettings struct
type PubSubPeersOption (line 12) | type PubSubPeersOption
type PubSubSubscribeOption (line 13) | type PubSubSubscribeOption
function PubSubPeersOptions (line 16) | func PubSubPeersOptions(opts ...PubSubPeersOption) (*PubSubPeersSettings...
function PubSubSubscribeOptions (line 30) | func PubSubSubscribeOptions(opts ...PubSubSubscribeOption) (*PubSubSubsc...
type pubsubOpts (line 44) | type pubsubOpts struct
method Topic (line 48) | func (pubsubOpts) Topic(topic string) PubSubPeersOption {
method Discover (line 55) | func (pubsubOpts) Discover(discover bool) PubSubSubscribeOption {
FILE: core/coreiface/options/routing.go
type RoutingPutSettings (line 3) | type RoutingPutSettings struct
type RoutingPutOption (line 7) | type RoutingPutOption
function RoutingPutOptions (line 9) | func RoutingPutOptions(opts ...RoutingPutOption) (*RoutingPutSettings, e...
type RoutingProvideSettings (line 28) | type RoutingProvideSettings struct
type RoutingFindProvidersSettings (line 32) | type RoutingFindProvidersSettings struct
type RoutingProvideOption (line 37) | type RoutingProvideOption
type RoutingFindProvidersOption (line 38) | type RoutingFindProvidersOption
function RoutingProvideOptions (line 41) | func RoutingProvideOptions(opts ...RoutingProvideOption) (*RoutingProvid...
function RoutingFindProvidersOptions (line 55) | func RoutingFindProvidersOptions(opts ...RoutingFindProvidersOption) (*R...
type routingOpts (line 69) | type routingOpts struct
method Recursive (line 75) | func (routingOpts) Recursive(recursive bool) RoutingProvideOption {
method NumProviders (line 84) | func (routingOpts) NumProviders(numProviders int) RoutingFindProviders...
method AllowOffline (line 93) | func (routingOpts) AllowOffline(allow bool) RoutingPutOption {
FILE: core/coreiface/options/unixfs.go
type Layout (line 16) | type Layout
constant BalancedLayout (line 19) | BalancedLayout Layout = iota
constant TrickleLayout (line 20) | TrickleLayout
type UnixfsAddSettings (line 23) | type UnixfsAddSettings struct
type UnixfsLsSettings (line 61) | type UnixfsLsSettings struct
type UnixfsAddOption (line 67) | type UnixfsAddOption
type UnixfsLsOption (line 68) | type UnixfsLsOption
function UnixfsAddOptions (line 71) | func UnixfsAddOptions(opts ...UnixfsAddOption) (*UnixfsAddSettings, cid....
function UnixfsLsOptions (line 167) | func UnixfsLsOptions(opts ...UnixfsLsOption) (*UnixfsLsSettings, error) {
type unixfsOpts (line 182) | type unixfsOpts struct
method CidVersion (line 188) | func (unixfsOpts) CidVersion(version int) UnixfsAddOption {
method Hash (line 198) | func (unixfsOpts) Hash(mhtype uint64) UnixfsAddOption {
method RawLeaves (line 207) | func (unixfsOpts) RawLeaves(enable bool) UnixfsAddOption {
method MaxFileLinks (line 217) | func (unixfsOpts) MaxFileLinks(n int) UnixfsAddOption {
method MaxDirectoryLinks (line 227) | func (unixfsOpts) MaxDirectoryLinks(n int) UnixfsAddOption {
method MaxHAMTFanout (line 238) | func (unixfsOpts) MaxHAMTFanout(n int) UnixfsAddOption {
method SizeEstimationMode (line 250) | func (unixfsOpts) SizeEstimationMode(mode io.SizeEstimationMode) Unixf...
method Inline (line 259) | func (unixfsOpts) Inline(enable bool) UnixfsAddOption {
method InlineLimit (line 274) | func (unixfsOpts) InlineLimit(limit int) UnixfsAddOption {
method Chunker (line 286) | func (unixfsOpts) Chunker(chunker string) UnixfsAddOption {
method Layout (line 297) | func (unixfsOpts) Layout(layout Layout) UnixfsAddOption {
method Pin (line 305) | func (unixfsOpts) Pin(pin bool, pinName string) UnixfsAddOption {
method HashOnly (line 317) | func (unixfsOpts) HashOnly(hashOnly bool) UnixfsAddOption {
method Events (line 328) | func (unixfsOpts) Events(sink chan<- any) UnixfsAddOption {
method Silent (line 336) | func (unixfsOpts) Silent(silent bool) UnixfsAddOption {
method Progress (line 344) | func (unixfsOpts) Progress(enable bool) UnixfsAddOption {
method FsCache (line 354) | func (unixfsOpts) FsCache(enable bool) UnixfsAddOption {
method Nocopy (line 364) | func (unixfsOpts) Nocopy(enable bool) UnixfsAddOption {
method ResolveChildren (line 371) | func (unixfsOpts) ResolveChildren(resolve bool) UnixfsLsOption {
method UseCumulativeSize (line 378) | func (unixfsOpts) UseCumulativeSize(use bool) UnixfsLsOption {
method PreserveMode (line 386) | func (unixfsOpts) PreserveMode(enable bool) UnixfsAddOption {
method PreserveMtime (line 394) | func (unixfsOpts) PreserveMtime(enable bool) UnixfsAddOption {
method Mode (line 402) | func (unixfsOpts) Mode(mode os.FileMode) UnixfsAddOption {
method Mtime (line 410) | func (unixfsOpts) Mtime(seconds int64, nsecs uint32) UnixfsAddOption {
method IncludeEmptyDirs (line 421) | func (unixfsOpts) IncludeEmptyDirs(include bool) UnixfsAddOption {
FILE: core/coreiface/options/unixfs_test.go
function TestMaxHAMTFanoutValidation (line 9) | func TestMaxHAMTFanoutValidation(t *testing.T) {
FILE: core/coreiface/pin.go
type Pin (line 12) | type Pin interface
type PinStatus (line 24) | type PinStatus interface
type BadPinNode (line 36) | type BadPinNode interface
type PinAPI (line 45) | type PinAPI interface
FILE: core/coreiface/pubsub.go
type PubSubSubscription (line 13) | type PubSubSubscription interface
type PubSubMessage (line 21) | type PubSubMessage interface
type PubSubAPI (line 36) | type PubSubAPI interface
FILE: core/coreiface/routing.go
type RoutingAPI (line 12) | type RoutingAPI interface
FILE: core/coreiface/swarm.go
type ConnectionInfo (line 21) | type ConnectionInfo interface
type SwarmAPI (line 39) | type SwarmAPI interface
FILE: core/coreiface/tests/api.go
type Provider (line 14) | type Provider interface
type TestSuite (line 53) | type TestSuite struct
method makeAPISwarm (line 19) | func (tp *TestSuite) makeAPISwarm(t *testing.T, ctx context.Context, f...
method makeAPI (line 31) | func (tp *TestSuite) makeAPI(t *testing.T, ctx context.Context) (corei...
method makeAPIWithIdentityAndOffline (line 40) | func (tp *TestSuite) makeAPIWithIdentityAndOffline(t *testing.T, ctx c...
method MakeAPISwarm (line 49) | func (tp *TestSuite) MakeAPISwarm(t *testing.T, ctx context.Context, n...
method hasApi (line 98) | func (tp *TestSuite) hasApi(t *testing.T, tf func(coreiface.CoreAPI) e...
function TestApi (line 59) | func TestApi(p Provider) func(t *testing.T) {
FILE: core/coreiface/tests/block.go
function pbBlock (line 25) | func pbBlock() io.Reader {
function cborBlock (line 30) | func cborBlock() io.Reader {
method TestBlock (line 34) | func (tp *TestSuite) TestBlock(t *testing.T) {
method TestBlockPut (line 56) | func (tp *TestSuite) TestBlockPut(t *testing.T) {
method TestBlockPutFormatDagCbor (line 75) | func (tp *TestSuite) TestBlockPutFormatDagCbor(t *testing.T) {
method TestBlockPutFormatDagPb (line 94) | func (tp *TestSuite) TestBlockPutFormatDagPb(t *testing.T) {
method TestBlockPutFormatV0 (line 113) | func (tp *TestSuite) TestBlockPutFormatV0(t *testing.T) {
method TestBlockPutCidCodecDagCbor (line 130) | func (tp *TestSuite) TestBlockPutCidCodecDagCbor(t *testing.T) {
method TestBlockPutCidCodecDagPb (line 147) | func (tp *TestSuite) TestBlockPutCidCodecDagPb(t *testing.T) {
method TestBlockPutHash (line 164) | func (tp *TestSuite) TestBlockPutHash(t *testing.T) {
method TestBlockGet (line 186) | func (tp *TestSuite) TestBlockGet(t *testing.T) {
method TestBlockRm (line 223) | func (tp *TestSuite) TestBlockRm(t *testing.T) {
method TestBlockStat (line 276) | func (tp *TestSuite) TestBlockStat(t *testing.T) {
method TestBlockPin (line 302) | func (tp *TestSuite) TestBlockPin(t *testing.T) {
FILE: core/coreiface/tests/dag.go
method TestDag (line 16) | func (tp *TestSuite) TestDag(t *testing.T) {
method TestPut (line 39) | func (tp *TestSuite) TestPut(t *testing.T) {
method TestPutWithHash (line 61) | func (tp *TestSuite) TestPutWithHash(t *testing.T) {
method TestDagPath (line 83) | func (tp *TestSuite) TestDagPath(t *testing.T) {
method TestTree (line 130) | func (tp *TestSuite) TestTree(t *testing.T) {
method TestBatch (line 164) | func (tp *TestSuite) TestBatch(t *testing.T) {
FILE: core/coreiface/tests/key.go
method TestKey (line 17) | func (tp *TestSuite) TestKey(t *testing.T) {
method TestListSelf (line 44) | func (tp *TestSuite) TestListSelf(t *testing.T) {
method TestRenameSelf (line 60) | func (tp *TestSuite) TestRenameSelf(t *testing.T) {
method TestRemoveSelf (line 73) | func (tp *TestSuite) TestRemoveSelf(t *testing.T) {
method TestGenerate (line 83) | func (tp *TestSuite) TestGenerate(t *testing.T) {
function verifyIPNSPath (line 96) | func verifyIPNSPath(t *testing.T, p string) {
method TestGenerateSize (line 110) | func (tp *TestSuite) TestGenerateSize(t *testing.T) {
method TestGenerateType (line 123) | func (tp *TestSuite) TestGenerateType(t *testing.T) {
method TestGenerateExisting (line 138) | func (tp *TestSuite) TestGenerateExisting(t *testing.T) {
method TestList (line 154) | func (tp *TestSuite) TestList(t *testing.T) {
method TestRename (line 173) | func (tp *TestSuite) TestRename(t *testing.T) {
method TestRenameToSelf (line 188) | func (tp *TestSuite) TestRenameToSelf(t *testing.T) {
method TestRenameToSelfForce (line 201) | func (tp *TestSuite) TestRenameToSelfForce(t *testing.T) {
method TestRenameOverwriteNoForce (line 214) | func (tp *TestSuite) TestRenameOverwriteNoForce(t *testing.T) {
method TestRenameOverwrite (line 230) | func (tp *TestSuite) TestRenameOverwrite(t *testing.T) {
method TestRenameSameNameNoForce (line 249) | func (tp *TestSuite) TestRenameSameNameNoForce(t *testing.T) {
method TestRenameSameName (line 264) | func (tp *TestSuite) TestRenameSameName(t *testing.T) {
method TestRemove (line 279) | func (tp *TestSuite) TestRemove(t *testing.T) {
method TestSign (line 302) | func (tp *TestSuite) TestSign(t *testing.T) {
method TestVerify (line 327) | func (tp *TestSuite) TestVerify(t *testing.T) {
FILE: core/coreiface/tests/name.go
method TestName (line 18) | func (tp *TestSuite) TestName(t *testing.T) {
function addTestObject (line 33) | func addTestObject(ctx context.Context, api coreiface.CoreAPI) (path.Pat...
method TestPublishResolve (line 37) | func (tp *TestSuite) TestPublishResolve(t *testing.T) {
method TestBasicPublishResolveKey (line 121) | func (tp *TestSuite) TestBasicPublishResolveKey(t *testing.T) {
method TestBasicPublishResolveTimeout (line 142) | func (tp *TestSuite) TestBasicPublishResolveTimeout(t *testing.T) {
FILE: core/coreiface/tests/object.go
method TestObject (line 15) | func (tp *TestSuite) TestObject(t *testing.T) {
function putDagPbNode (line 29) | func putDagPbNode(t *testing.T, ctx context.Context, api iface.CoreAPI, ...
method TestObjectAddLink (line 47) | func (tp *TestSuite) TestObjectAddLink(t *testing.T) {
method TestObjectAddLinkCreate (line 73) | func (tp *TestSuite) TestObjectAddLinkCreate(t *testing.T) {
method TestObjectRmLink (line 102) | func (tp *TestSuite) TestObjectRmLink(t *testing.T) {
method TestDiffTest (line 126) | func (tp *TestSuite) TestDiffTest(t *testing.T) {
FILE: core/coreiface/tests/path.go
function newIPLDPath (line 16) | func newIPLDPath(t *testing.T, cid cid.Cid) path.ImmutablePath {
method TestPath (line 24) | func (tp *TestSuite) TestPath(t *testing.T) {
method TestMutablePath (line 33) | func (tp *TestSuite) TestMutablePath(t *testing.T) {
method TestPathRemainder (line 49) | func (tp *TestSuite) TestPathRemainder(t *testing.T) {
method TestEmptyPathRemainder (line 70) | func (tp *TestSuite) TestEmptyPathRemainder(t *testing.T) {
method TestInvalidPathRemainder (line 88) | func (tp *TestSuite) TestInvalidPathRemainder(t *testing.T) {
method TestPathRoot (line 109) | func (tp *TestSuite) TestPathRoot(t *testing.T) {
method TestPathJoin (line 134) | func (tp *TestSuite) TestPathJoin(t *testing.T) {
FILE: core/coreiface/tests/pin.go
method TestPin (line 18) | func (tp *TestSuite) TestPin(t *testing.T) {
method TestPinAdd (line 35) | func (tp *TestSuite) TestPinAdd(t *testing.T) {
method TestPinSimple (line 53) | func (tp *TestSuite) TestPinSimple(t *testing.T) {
method TestPinRecursive (line 104) | func (tp *TestSuite) TestPinRecursive(t *testing.T) {
method TestPinLsIndirect (line 250) | func (tp *TestSuite) TestPinLsIndirect(t *testing.T) {
method TestPinLsPrecedence (line 273) | func (tp *TestSuite) TestPinLsPrecedence(t *testing.T) {
method TestPinLsPredenceRecursiveIndirect (line 282) | func (tp *TestSuite) TestPinLsPredenceRecursiveIndirect(t *testing.T) {
method TestPinLsPrecedenceDirectIndirect (line 305) | func (tp *TestSuite) TestPinLsPrecedenceDirectIndirect(t *testing.T) {
method TestPinLsPrecedenceRecursiveDirect (line 328) | func (tp *TestSuite) TestPinLsPrecedenceRecursiveDirect(t *testing.T) {
method TestPinIsPinned (line 363) | func (tp *TestSuite) TestPinIsPinned(t *testing.T) {
type cidContainer (line 395) | type cidContainer interface
type immutablePathCidContainer (line 399) | type immutablePathCidContainer struct
method Cid (line 403) | func (i immutablePathCidContainer) Cid() cid.Cid {
function getThreeChainedNodes (line 407) | func getThreeChainedNodes(t *testing.T, ctx context.Context, api iface.C...
function assertPinTypes (line 430) | func assertPinTypes(t *testing.T, ctx context.Context, api iface.CoreAPI...
function assertPinCids (line 456) | func assertPinCids(t *testing.T, pins []iface.Pin, cids ...cidContainer) {
function assertPinLsAllConsistency (line 495) | func assertPinLsAllConsistency(t *testing.T, ctx context.Context, api if...
function assertIsPinned (line 549) | func assertIsPinned(t *testing.T, ctx context.Context, api iface.CoreAPI...
method TestPinNames (line 577) | func (tp *TestSuite) TestPinNames(t *testing.T) {
function assertNotPinned (line 715) | func assertNotPinned(t *testing.T, ctx context.Context, api iface.CoreAP...
function accPins (line 728) | func accPins(ctx context.Context, api iface.CoreAPI, opts ...opt.PinLsOp...
FILE: core/coreiface/tests/pubsub.go
method TestPubSub (line 12) | func (tp *TestSuite) TestPubSub(t *testing.T) {
method TestBasicPubSub (line 23) | func (tp *TestSuite) TestBasicPubSub(t *testing.T) {
FILE: core/coreiface/tests/routing.go
method TestRouting (line 16) | func (tp *TestSuite) TestRouting(t *testing.T) {
method testRoutingPublishKey (line 32) | func (tp *TestSuite) testRoutingPublishKey(t *testing.T, ctx context.Con...
method TestRoutingGet (line 43) | func (tp *TestSuite) TestRoutingGet(t *testing.T) {
method TestRoutingPut (line 64) | func (tp *TestSuite) TestRoutingPut(t *testing.T) {
method TestRoutingPutOffline (line 81) | func (tp *TestSuite) TestRoutingPutOffline(t *testing.T) {
method TestRoutingFindPeer (line 103) | func (tp *TestSuite) TestRoutingFindPeer(t *testing.T) {
method TestRoutingFindProviders (line 157) | func (tp *TestSuite) TestRoutingFindProviders(t *testing.T) {
method TestRoutingProvide (line 195) | func (tp *TestSuite) TestRoutingProvide(t *testing.T) {
FILE: core/coreiface/tests/unixfs.go
method TestUnixfs (line 31) | func (tp *TestSuite) TestUnixfs(t *testing.T) {
function strFile (line 63) | func strFile(data string) func() files.Node {
function twoLevelDir (line 69) | func twoLevelDir() func() files.Node {
function flatDir (line 82) | func flatDir() files.Node {
function wrapped (line 89) | func wrapped(names ...string) func(f files.Node) files.Node {
method TestAdd (line 100) | func (tp *TestSuite) TestAdd(t *testing.T) {
method TestAddPinned (line 531) | func (tp *TestSuite) TestAddPinned(t *testing.T) {
method TestAddHashOnly (line 556) | func (tp *TestSuite) TestAddHashOnly(t *testing.T) {
method TestGetEmptyFile (line 581) | func (tp *TestSuite) TestGetEmptyFile(t *testing.T) {
method TestGetDir (line 613) | func (tp *TestSuite) TestGetDir(t *testing.T) {
method TestGetNonUnixfs (line 640) | func (tp *TestSuite) TestGetNonUnixfs(t *testing.T) {
method TestLs (line 659) | func (tp *TestSuite) TestLs(t *testing.T) {
method TestEntriesExpired (line 720) | func (tp *TestSuite) TestEntriesExpired(t *testing.T) {
method TestLsEmptyDir (line 762) | func (tp *TestSuite) TestLsEmptyDir(t *testing.T) {
method TestLsNonUnixfs (line 794) | func (tp *TestSuite) TestLsNonUnixfs(t *testing.T) {
type closeTestF (line 830) | type closeTestF struct
method Close (line 853) | func (f *closeTestF) Close() error {
type closeTestD (line 837) | type closeTestD struct
method Close (line 844) | func (f *closeTestD) Close() error {
method TestAddCloses (line 861) | func (tp *TestSuite) TestAddCloses(t *testing.T) {
method TestGetSeek (line 898) | func (tp *TestSuite) TestGetSeek(t *testing.T) {
method TestGetReadAt (line 1003) | func (tp *TestSuite) TestGetReadAt(t *testing.T) {
FILE: core/coreiface/unixfs.go
type AddEvent (line 15) | type AddEvent struct
type FileType (line 26) | type FileType
method String (line 40) | func (t FileType) String() string {
constant TUnknown (line 31) | TUnknown FileType = iota
constant TFile (line 33) | TFile
constant TDirectory (line 35) | TDirectory
constant TSymlink (line 37) | TSymlink
type DirEntry (line 56) | type DirEntry struct
type UnixfsAPI (line 71) | type UnixfsAPI interface
function LsIter (line 116) | func LsIter(ctx context.Context, api UnixfsAPI, p path.Path, opts ...opt...
FILE: core/coreiface/util.go
type Reader (line 8) | type Reader interface
type ReadSeekCloser (line 15) | type ReadSeekCloser interface
FILE: core/corerepo/gc.go
type GC (line 23) | type GC struct
method maybeGC (line 204) | func (gc *GC) maybeGC(ctx context.Context, offset uint64) error {
function NewGC (line 32) | func NewGC(n *core.IpfsNode) (*GC, error) {
function BestEffortRoots (line 74) | func BestEffortRoots(filesRoot *mfs.Root) ([]cid.Cid, error) {
function GarbageCollect (line 83) | func GarbageCollect(n *core.IpfsNode, ctx context.Context) error {
function CollectResult (line 96) | func CollectResult(ctx context.Context, gcOut <-chan gc.Result, cb func(...
function NewMultiError (line 127) | func NewMultiError(errs ...error) *MultiError {
type MultiError (line 132) | type MultiError struct
method Error (line 137) | func (e *MultiError) Error() string {
function GarbageCollectAsync (line 147) | func GarbageCollectAsync(n *core.IpfsNode, ctx context.Context) <-chan g...
function PeriodicGC (line 159) | func PeriodicGC(ctx context.Context, node *core.IpfsNode) error {
function ConditionalGC (line 196) | func ConditionalGC(ctx context.Context, node *core.IpfsNode, offset uint...
FILE: core/corerepo/stat.go
type SizeStat (line 16) | type SizeStat struct
type Stat (line 22) | type Stat struct
constant NoLimit (line 30) | NoLimit uint64 = math.MaxUint64
function RepoStat (line 33) | func RepoStat(ctx context.Context, n *core.IpfsNode) (Stat, error) {
function RepoSize (line 66) | func RepoSize(ctx context.Context, n *core.IpfsNode) (SizeStat, error) {
FILE: core/coreunix/add.go
constant progressReaderIncrement (line 38) | progressReaderIncrement = 1024 * 256
type Link (line 42) | type Link struct
type syncer (line 47) | type syncer interface
function NewAdder (line 52) | func NewAdder(ctx context.Context, p pin.Pinner, bs bstore.GCLocker, ds ...
type Adder (line 72) | type Adder struct
method mfsRoot (line 104) | func (adder *Adder) mfsRoot() (*mfs.Root, error) {
method SetMfsRoot (line 124) | func (adder *Adder) SetMfsRoot(r *mfs.Root) {
method add (line 129) | func (adder *Adder) add(reader io.Reader) (ipld.Node, error) {
method curRootNode (line 168) | func (adder *Adder) curRootNode() (ipld.Node, error) {
method PinRoot (line 194) | func (adder *Adder) PinRoot(ctx context.Context, root ipld.Node, name ...
method outputDirs (line 225) | func (adder *Adder) outputDirs(path string, fsn mfs.FSNode) error {
method addNode (line 260) | func (adder *Adder) addNode(node ipld.Node, path string) error {
method AddAllAndPin (line 301) | func (adder *Adder) AddAllAndPin(ctx context.Context, file files.Node)...
method addFileNode (line 388) | func (adder *Adder) addFileNode(ctx context.Context, path string, file...
method addSymlink (line 433) | func (adder *Adder) addSymlink(ctx context.Context, path string, l *fi...
method addFile (line 464) | func (adder *Adder) addFile(path string, file files.File) error {
method addDir (line 486) | func (adder *Adder) addDir(ctx context.Context, path string, dir files...
method maybePauseForGC (line 557) | func (adder *Adder) maybePauseForGC(ctx context.Context) error {
function outputDagnode (line 579) | func outputDagnode(out chan<- any, name string, dn ipld.Node) error {
function getOutput (line 599) | func getOutput(dagnode ipld.Node) (*coreiface.AddEvent, error) {
type progressReader (line 614) | type progressReader struct
method Read (line 622) | func (i *progressReader) Read(p []byte) (int, error) {
type progressReader2 (line 637) | type progressReader2 struct
method Read (line 642) | func (i *progressReader2) Read(p []byte) (int, error) {
FILE: core/coreunix/add_test.go
constant testPeerID (line 30) | testPeerID = "QmTFauExutTsy4XP6JbMFcw2Wa9645HJt2bTqL6qYDCKfe"
function TestAddMultipleGCLive (line 32) | func TestAddMultipleGCLive(t *testing.T) {
function TestAddGCLive (line 164) | func TestAddGCLive(t *testing.T) {
function testAddWPosInfo (line 273) | func testAddWPosInfo(t *testing.T, rawLeaves bool) {
function TestAddWPosInfo (line 331) | func TestAddWPosInfo(t *testing.T) {
function TestAddWPosInfoAndRawLeafs (line 335) | func TestAddWPosInfoAndRawLeafs(t *testing.T) {
type testBlockstore (line 339) | type testBlockstore struct
method Put (line 347) | func (bs *testBlockstore) Put(ctx context.Context, block blocks.Block)...
method PutMany (line 352) | func (bs *testBlockstore) PutMany(ctx context.Context, blocks []blocks...
method CheckForPosInfo (line 359) | func (bs *testBlockstore) CheckForPosInfo(block blocks.Block) {
type dummyFileInfo (line 374) | type dummyFileInfo struct
method Name (line 380) | func (fi *dummyFileInfo) Name() string { return fi.name }
method Size (line 381) | func (fi *dummyFileInfo) Size() int64 { return fi.size }
method Mode (line 382) | func (fi *dummyFileInfo) Mode() os.FileMode { return 0 }
method ModTime (line 383) | func (fi *dummyFileInfo) ModTime() time.Time { return fi.modTime }
method IsDir (line 384) | func (fi *dummyFileInfo) IsDir() bool { return false }
method Sys (line 385) | func (fi *dummyFileInfo) Sys() any { return nil }
FILE: core/coreunix/metadata.go
function AddMetadataTo (line 10) | func AddMetadataTo(n *core.IpfsNode, skey string, m *ft.Metadata) (strin...
function Metadata (line 40) | func Metadata(n *core.IpfsNode, skey string) (*ft.Metadata, error) {
FILE: core/coreunix/metadata_test.go
function getDagserv (line 26) | func getDagserv(t *testing.T) ipld.DAGService {
function TestMetadata (line 33) | func TestMetadata(t *testing.T) {
FILE: core/mock/mock.go
function NewMockNode (line 28) | func NewMockNode() (*core.IpfsNode, error) {
function MockHostOption (line 36) | func MockHostOption(mn mocknet.Mocknet) libp2p2.HostOption {
function MockCmdsCtx (line 51) | func MockCmdsCtx() (commands.Context, error) {
function MockPublicNode (line 85) | func MockPublicNode(ctx context.Context, mn mocknet.Mocknet) (*core.Ipfs...
FILE: core/node/bitswap.go
constant DefaultEngineBlockstoreWorkerCount (line 33) | DefaultEngineBlockstoreWorkerCount = 128
constant DefaultTaskWorkerCount (line 34) | DefaultTaskWorkerCount = 8
constant DefaultEngineTaskWorkerCount (line 35) | DefaultEngineTaskWorkerCount = 8
constant DefaultMaxOutstandingBytesPerPeer (line 36) | DefaultMaxOutstandingBytesPerPeer = 1 << 20
constant DefaultProviderSearchDelay (line 37) | DefaultProviderSearchDelay = 1000 * time.Millisecond
constant DefaultMaxProviders (line 38) | DefaultMaxProviders = 10
constant DefaultWantHaveReplaceSize (line 39) | DefaultWantHaveReplaceSize = 1024
type bitswapOptionsOut (line 42) | type bitswapOptionsOut struct
function BitswapOptions (line 50) | func BitswapOptions(cfg *config.Config) any {
type bitswapIn (line 70) | type bitswapIn struct
function Bitswap (line 84) | func Bitswap(serverEnabled, libp2pEnabled, httpEnabled bool) any {
function OnlineExchange (line 209) | func OnlineExchange(isBitswapActive bool) any {
type noopExchange (line 223) | type noopExchange struct
method GetBlock (line 227) | func (e *noopExchange) GetBlock(ctx context.Context, c cid.Cid) (block...
method GetBlocks (line 231) | func (e *noopExchange) GetBlocks(ctx context.Context, cids []cid.Cid) ...
method NotifyNewBlocks (line 237) | func (e *noopExchange) NotifyNewBlocks(ctx context.Context, blocks ......
method Close (line 241) | func (e *noopExchange) Close() error {
FILE: core/node/builder.go
type BuildCfg (line 22) | type BuildCfg struct
method getOpt (line 42) | func (cfg *BuildCfg) getOpt(key string) bool {
method fillDefaults (line 50) | func (cfg *BuildCfg) fillDefaults() error {
method options (line 71) | func (cfg *BuildCfg) options(ctx context.Context) (fx.Option, *cfg.Con...
function defaultRepo (line 112) | func defaultRepo(dstore repo.Datastore) (repo.Repo, error) {
FILE: core/node/core.go
function BlockService (line 37) | func BlockService(cfg *config.Config) func(lc fx.Lifecycle, bs blockstor...
function Pinning (line 54) | func Pinning(strategy string) func(bstore blockstore.Blockstore, ds form...
type syncDagService (line 107) | type syncDagService struct
method Sync (line 112) | func (s *syncDagService) Sync(ctx context.Context) error {
method Session (line 116) | func (s *syncDagService) Session(ctx context.Context) format.NodeGetter {
type FetchersOut (line 121) | type FetchersOut struct
type FetchersIn (line 130) | type FetchersIn struct
function FetcherConfig (line 139) | func FetcherConfig(bs blockservice.BlockService) FetchersOut {
type PathResolversOut (line 161) | type PathResolversOut struct
function PathResolverConfig (line 170) | func PathResolverConfig(fetchers FetchersIn) PathResolversOut {
function Dag (line 180) | func Dag(bs blockservice.BlockService) format.DAGService {
function Files (line 185) | func Files(strategy string) func(mctx helpers.MetricsCtx, lc fx.Lifecycl...
FILE: core/node/dns.go
function DNSResolver (line 17) | func DNSResolver(cfg *config.Config) (*madns.Resolver, error) {
FILE: core/node/groups.go
function LibP2P (line 39) | func LibP2P(bcfg *BuildCfg, cfg *config.Config, userResourceOverrides rc...
function Storage (line 236) | func Storage(bcfg *BuildCfg, cfg *config.Config) fx.Option {
function Identity (line 263) | func Identity(cfg *config.Config) fx.Option {
function Online (line 308) | func Online(bcfg *BuildCfg, cfg *config.Config, userResourceOverrides rc...
function Offline (line 372) | func Offline(cfg *config.Config) fx.Option {
function Networked (line 392) | func Networked(bcfg *BuildCfg, cfg *config.Config, userResourceOverrides...
function IPFS (line 400) | func IPFS(ctx context.Context, bcfg *BuildCfg) fx.Option {
FILE: core/node/helpers.go
type lcStartStop (line 10) | type lcStartStop struct
method Append (line 17) | func (lcss *lcStartStop) Append(f func() func()) {
function maybeProvide (line 43) | func maybeProvide(opt any, enable bool) fx.Option {
function maybeInvoke (line 51) | func maybeInvoke(opt any, enable bool) fx.Option {
FILE: core/node/helpers/helpers.go
type MetricsCtx (line 9) | type MetricsCtx
function LifecycleCtx (line 15) | func LifecycleCtx(mctx MetricsCtx, lc fx.Lifecycle) context.Context {
FILE: core/node/identity.go
function PeerID (line 10) | func PeerID(id peer.ID) func() peer.ID {
function PrivateKey (line 17) | func PrivateKey(sk crypto.PrivKey) func(id peer.ID) (crypto.PrivKey, err...
FILE: core/node/ipns.go
constant DefaultIpnsCacheSize (line 20) | DefaultIpnsCacheSize = 128
function RecordValidator (line 23) | func RecordValidator(ps peerstore.Peerstore) record.Validator {
function Namesys (line 31) | func Namesys(cacheSize int, cacheMaxTTL time.Duration) func(rt irouting....
function IpnsRepublisher (line 48) | func IpnsRepublisher(repubPeriod time.Duration, recordLifetime time.Dura...
FILE: core/node/libp2p/addrs.go
function AddrFilters (line 24) | func AddrFilters(filters []string) func() (*ma.Filters, Libp2pOpts, erro...
function makeAddrsFactory (line 39) | func makeAddrsFactory(announce []string, appendAnnounce []string, noAnno...
function AddrsFactory (line 102) | func AddrsFactory(announce []string, appendAnnounce []string, noAnnounce...
function ListenOn (line 127) | func ListenOn(addresses []string) any {
function P2PForgeCertMgr (line 137) | func P2PForgeCertMgr(repoPath string, cfg config.AutoTLS, atlsLog *loggi...
function StartP2PAutoTLS (line 176) | func StartP2PAutoTLS(lc fx.Lifecycle, certMgr *p2pforge.P2PForgeCertMgr,...
FILE: core/node/libp2p/discovery.go
constant discoveryConnTimeout (line 16) | discoveryConnTimeout = time.Second * 30
type discoveryHandler (line 18) | type discoveryHandler struct
method HandlePeerFound (line 23) | func (dh *discoveryHandler) HandlePeerFound(p peer.AddrInfo) {
function DiscoveryHandler (line 32) | func DiscoveryHandler(mctx helpers.MetricsCtx, lc fx.Lifecycle, host hos...
function SetupDiscovery (line 39) | func SetupDiscovery(useMdns bool) func(helpers.MetricsCtx, fx.Lifecycle,...
FILE: core/node/libp2p/dns.go
function MultiaddrResolver (line 9) | func MultiaddrResolver(rslv *madns.Resolver) (opts Libp2pOpts, err error) {
FILE: core/node/libp2p/fd/sys_not_unix.go
function GetNumFDs (line 5) | func GetNumFDs() int {
FILE: core/node/libp2p/fd/sys_unix.go
function GetNumFDs (line 9) | func GetNumFDs() int {
FILE: core/node/libp2p/fd/sys_windows.go
function GetNumFDs (line 9) | func GetNumFDs() int {
FILE: core/node/libp2p/filters.go
type filtersConnectionGater (line 14) | type filtersConnectionGater
method InterceptAddrDial (line 18) | func (f *filtersConnectionGater) InterceptAddrDial(_ peer.ID, addr ma....
method InterceptPeerDial (line 22) | func (f *filtersConnectionGater) InterceptPeerDial(p peer.ID) (allow b...
method InterceptAccept (line 26) | func (f *filtersConnectionGater) InterceptAccept(connAddr network.Conn...
method InterceptSecured (line 30) | func (f *filtersConnectionGater) InterceptSecured(_ network.Direction,...
method InterceptUpgraded (line 34) | func (f *filtersConnectionGater) InterceptUpgraded(_ network.Conn) (al...
FILE: core/node/libp2p/host.go
type P2PHostIn (line 21) | type P2PHostIn struct
type P2PHostOut (line 34) | type P2PHostOut struct
function Host (line 41) | func Host(mctx helpers.MetricsCtx, lc fx.Lifecycle, params P2PHostIn) (o...
FILE: core/node/libp2p/hostopt.go
type HostOption (line 12) | type HostOption
function constructPeerHost (line 17) | func constructPeerHost(id peer.ID, ps peerstore.Peerstore, options ...li...
FILE: core/node/libp2p/libp2p.go
type Libp2pOpts (line 22) | type Libp2pOpts struct
function ConnectionManager (line 28) | func ConnectionManager(low, high int, grace, silence time.Duration) func...
function PstoreAddSelfKeys (line 42) | func PstoreAddSelfKeys(id peer.ID, sk crypto.PrivKey, ps peerstore.Peers...
function UserAgent (line 50) | func UserAgent() func() (opts Libp2pOpts, err error) {
function simpleOpt (line 54) | func simpleOpt(opt libp2p.Option) func() (opts Libp2pOpts, err error) {
type priorityOption (line 61) | type priorityOption struct
function prioritizeOptions (line 66) | func prioritizeOptions(opts []priorityOption) libp2p.Option {
function ForceReachability (line 90) | func ForceReachability(val *config.OptionalString) func() (opts Libp2pOp...
FILE: core/node/libp2p/libp2p_test.go
function TestPrioritize (line 14) | func TestPrioritize(t *testing.T) {
FILE: core/node/libp2p/nat.go
function AutoNATService (line 12) | func AutoNATService(throttle *config.AutoNATThrottleConfig, v1only bool)...
FILE: core/node/libp2p/peerstore.go
function Peerstore (line 11) | func Peerstore(lc fx.Lifecycle) (peerstore.Peerstore, error) {
FILE: core/node/libp2p/pnet.go
type PNetFingerprint (line 19) | type PNetFingerprint
function PNet (line 21) | func PNet(repo repo.Repo) (opts Libp2pOpts, fp PNetFingerprint, err erro...
function PNetChecker (line 37) | func PNetChecker(repo repo.Repo, ph host.Host, lc fx.Lifecycle) error {
function pnetFingerprint (line 74) | func pnetFingerprint(psk pnet.PSK) []byte {
FILE: core/node/libp2p/pubsub.go
type pubsubParams (line 20) | type pubsubParams struct
function FloodSub (line 28) | func FloodSub(pubsubOptions ...pubsub.Option) any {
function GossipSub (line 40) | func GossipSub(pubsubOptions ...pubsub.Option) any {
function newSeqnoValidator (line 53) | func newSeqnoValidator(ds datastore.Datastore) pubsub.ValidatorEx {
constant SeqnoStorePrefix (line 58) | SeqnoStorePrefix = "/pubsub/seqno/"
type seqnoStore (line 63) | type seqnoStore struct
method Get (line 72) | func (s *seqnoStore) Get(ctx context.Context, p peer.ID) ([]byte, erro...
method Put (line 82) | func (s *seqnoStore) Put(ctx context.Context, p peer.ID, val []byte) e...
FILE: core/node/libp2p/pubsub_test.go
function TestSeqnoStore (line 17) | func TestSeqnoStore(t *testing.T) {
FILE: core/node/libp2p/rcmgr.go
constant NetLimitTraceFilename (line 27) | NetLimitTraceFilename = "rcmgr.json.gz"
function ResourceManager (line 31) | func ResourceManager(repoPath string, cfg config.SwarmConfig, userResour...
function isPartialConfigEmpty (line 136) | func isPartialConfigEmpty(cfg rcmgr.PartialLimitConfig) bool {
function LimitConfig (line 180) | func LimitConfig(cfg config.SwarmConfig, userResourceOverrides rcmgr.Par...
type ResourceLimitsAndUsage (line 198) | type ResourceLimitsAndUsage struct
method ToResourceLimits (line 218) | func (u ResourceLimitsAndUsage) ToResourceLimits() rcmgr.ResourceLimits {
type LimitsConfigAndUsage (line 231) | type LimitsConfigAndUsage struct
method MarshalJSON (line 241) | func (u LimitsConfigAndUsage) MarshalJSON() ([]byte, error) {
method ToPartialLimitConfig (line 258) | func (u LimitsConfigAndUsage) ToPartialLimitConfig() (result rcmgr.Par...
function MergeLimitsAndStatsIntoLimitsConfigAndUsage (line 278) | func MergeLimitsAndStatsIntoLimitsConfigAndUsage(l rcmgr.ConcreteLimitCo...
function mergeLimitsAndStatsMapIntoLimitsConfigAndUsageMap (line 290) | func mergeLimitsAndStatsMapIntoLimitsConfigAndUsageMap[K comparable](lim...
function maxInt (line 311) | func maxInt(x, y int) int {
function mergeResourceLimitsAndScopeStatToResourceLimitsAndUsage (line 318) | func mergeResourceLimitsAndScopeStatToResourceLimitsAndUsage(rl rcmgr.Re...
type ResourceInfos (line 339) | type ResourceInfos
type ResourceInfo (line 341) | type ResourceInfo struct
function LimitConfigsToInfo (line 349) | func LimitConfigsToInfo(stats LimitsConfigAndUsage) ResourceInfos {
constant limitNameMemory (line 380) | limitNameMemory = "Memory"
constant limitNameFD (line 381) | limitNameFD = "FD"
constant limitNameConns (line 382) | limitNameConns = "Conns"
constant limitNameConnsInbound (line 383) | limitNameConnsInbound = "ConnsInbound"
constant limitNameConnsOutbound (line 384) | limitNameConnsOutbound = "ConnsOutbound"
constant limitNameStreams (line 385) | limitNameStreams = "Streams"
constant limitNameStreamsInbound (line 386) | limitNameStreamsInbound = "StreamsInbound"
constant limitNameStreamsOutbound (line 387) | limitNameStreamsOutbound = "StreamsOutbound"
function resourceLimitsAndUsageToResourceInfo (line 401) | func resourceLimitsAndUsageToResourceInfo(scopeName string, stats Resour...
function ensureConnMgrMakeSenseVsResourceMgr (line 453) | func ensureConnMgrMakeSenseVsResourceMgr(concreteLimits rcmgr.ConcreteLi...
FILE: core/node/libp2p/rcmgr_defaults.go
function createDefaultLimitConfig (line 21) | func createDefaultLimitConfig(cfg config.SwarmConfig) (limitConfig rcmgr...
FILE: core/node/libp2p/rcmgr_logging.go
type loggingResourceManager (line 18) | type loggingResourceManager struct
method start (line 38) | func (n *loggingResourceManager) start(ctx context.Context) {
method countErrs (line 69) | func (n *loggingResourceManager) countErrs(err error) {
method ViewSystem (line 86) | func (n *loggingResourceManager) ViewSystem(f func(network.ResourceSco...
method ViewTransient (line 90) | func (n *loggingResourceManager) ViewTransient(f func(network.Resource...
method ViewService (line 96) | func (n *loggingResourceManager) ViewService(svc string, f func(networ...
method ViewProtocol (line 102) | func (n *loggingResourceManager) ViewProtocol(p protocol.ID, f func(ne...
method ViewPeer (line 108) | func (n *loggingResourceManager) ViewPeer(p peer.ID, f func(network.Pe...
method OpenConnection (line 114) | func (n *loggingResourceManager) OpenConnection(dir network.Direction,...
method OpenStream (line 120) | func (n *loggingResourceManager) OpenStream(p peer.ID, dir network.Dir...
method Close (line 126) | func (n *loggingResourceManager) Close() error {
method ListServices (line 130) | func (n *loggingResourceManager) ListServices() []string {
method ListProtocols (line 139) | func (n *loggingResourceManager) ListProtocols() []protocol.ID {
method ListPeers (line 148) | func (n *loggingResourceManager) ListPeers() []peer.ID {
method Stat (line 157) | func (n *loggingResourceManager) Stat() rcmgr.ResourceManagerStat {
method VerifySourceAddress (line 166) | func (n *loggingResourceManager) VerifySourceAddress(addr net.Addr) bo...
type loggingScope (line 27) | type loggingScope struct
method ReserveMemory (line 170) | func (s *loggingScope) ReserveMemory(size int, prio uint8) error {
method ReleaseMemory (line 176) | func (s *loggingScope) ReleaseMemory(size int) {
method Stat (line 180) | func (s *loggingScope) Stat() network.ScopeStat {
method BeginSpan (line 184) | func (s *loggingScope) BeginSpan() (network.ResourceScopeSpan, error) {
method Done (line 188) | func (s *loggingScope) Done() {
method Name (line 192) | func (s *loggingScope) Name() string {
method Protocol (line 196) | func (s *loggingScope) Protocol() protocol.ID {
method Peer (line 200) | func (s *loggingScope) Peer() peer.ID {
method PeerScope (line 204) | func (s *loggingScope) PeerScope() network.PeerScope {
method SetPeer (line 208) | func (s *loggingScope) SetPeer(p peer.ID) error {
method ProtocolScope (line 214) | func (s *loggingScope) ProtocolScope() network.ProtocolScope {
method SetProtocol (line 218) | func (s *loggingScope) SetProtocol(proto protocol.ID) error {
method ServiceScope (line 224) | func (s *loggingScope) ServiceScope() network.ServiceScope {
method SetService (line 228) | func (s *loggingScope) SetService(srv string) error {
method Limit (line 234) | func (s *loggingScope) Limit() rcmgr.Limit {
method SetLimit (line 238) | func (s *loggingScope) SetLimit(limit rcmgr.Limit) {
FILE: core/node/libp2p/rcmgr_logging_test.go
function TestLoggingResourceManager (line 16) | func TestLoggingResourceManager(t *testing.T) {
FILE: core/node/libp2p/relay.go
function RelayTransport (line 14) | func RelayTransport(enableRelay bool) func() (opts Libp2pOpts, err error) {
function RelayService (line 25) | func RelayService(enable bool, relayOpts config.RelayService) func() (op...
function MaybeAutoRelay (line 48) | func MaybeAutoRelay(staticRelays []string, cfgPeering config.Peering, en...
function HolePunching (line 108) | func HolePunching(flag config.Flag, hasRelayClient bool) func() (opts Li...
FILE: core/node/libp2p/routing.go
type Router (line 31) | type Router struct
type p2pRouterOut (line 37) | type p2pRouterOut struct
type processInitialRoutingIn (line 43) | type processInitialRoutingIn struct
type processInitialRoutingOut (line 54) | type processInitialRoutingOut struct
type AddrInfoChan (line 64) | type AddrInfoChan
function BaseRouting (line 66) | func BaseRouting(cfg *config.Config) any {
type p2pOnlineContentRoutingIn (line 159) | type p2pOnlineContentRoutingIn struct
function ContentRouting (line 167) | func ContentRouting(in p2pOnlineContentRoutingIn) routing.ContentRouting {
function ContentDiscovery (line 184) | func ContentDiscovery(in irouting.ProvideManyRouter) routing.ContentDisc...
type p2pOnlineRoutingIn (line 188) | type p2pOnlineRoutingIn struct
function Routing (line 197) | func Routing(in p2pOnlineRoutingIn) irouting.ProvideManyRouter {
function OfflineRouting (line 218) | func OfflineRouting(dstore ds.Datastore, validator record.Validator) p2p...
type p2pPSRoutingIn (line 227) | type p2pPSRoutingIn struct
function PubsubRouter (line 235) | func PubsubRouter(mctx helpers.MetricsCtx, lc fx.Lifecycle, in p2pPSRout...
function autoRelayFeeder (line 260) | func autoRelayFeeder(cfgPeering config.Peering, peerChan chan<- peer.Add...
FILE: core/node/libp2p/routingopt.go
type RoutingOptionArgs (line 26) | type RoutingOptionArgs struct
type RoutingOption (line 37) | type RoutingOption
type EndpointSource (line 42) | type EndpointSource struct
function determineCapabilities (line 49) | func determineCapabilities(endpoint EndpointSource) (string, autoconf.En...
function collectAllEndpoints (line 60) | func collectAllEndpoints(cfg *config.Config) []EndpointSource {
function constructDefaultHTTPRouters (line 111) | func constructDefaultHTTPRouters(cfg *config.Config, addrFunc func() []m...
function ConstructDelegatedOnlyRouting (line 191) | func ConstructDelegatedOnlyRouting(cfg *config.Config) RoutingOption {
function ConstructDefaultRouting (line 215) | func ConstructDefaultRouting(cfg *config.Config, routingOpt RoutingOptio...
function constructDHTRouting (line 246) | func constructDHTRouting(mode dht.ModeOpt) RoutingOption {
function ConstructDelegatedRouting (line 277) | func ConstructDelegatedRouting(routers config.Routers, methods config.Me...
function constructNilRouting (line 298) | func constructNilRouting(_ RoutingOptionArgs) (routing.Routing, error) {
type confirmedAddrsHost (line 310) | type confirmedAddrsHost interface
function httpRouterAddrFunc (line 331) | func httpRouterAddrFunc(h host.Host, cfgAddrs config.Addresses) func() [...
function parseMultiaddrs (line 372) | func parseMultiaddrs(strs []string) []ma.Multiaddr {
FILE: core/node/libp2p/routingopt_test.go
function TestDetermineCapabilities (line 20) | func TestDetermineCapabilities(t *testing.T) {
function TestEndpointCapabilitiesReadWriteLogic (line 142) | func TestEndpointCapabilitiesReadWriteLogic(t *testing.T) {
type stubHost (line 211) | type stubHost struct
method ConfirmedAddrs (line 215) | func (h *stubHost) ConfirmedAddrs() (reachable, unreachable, unknown [...
method ID (line 219) | func (h *stubHost) ID() peer.ID ...
method Addrs (line 220) | func (h *stubHost) Addrs() []ma.Multiaddr ...
method Peerstore (line 221) | func (h *stubHost) Peerstore() peerstore.Peerstore ...
method Network (line 222) | func (h *stubHost) Network() network.Network ...
method Mux (line 223) | func (h *stubHost) Mux() protocol.Switch ...
method Connect (line 224) | func (h *stubHost) Connect(context.Context, peer.AddrInfo) error ...
method SetStreamHandler (line 225) | func (h *stubHost) SetStreamHandler(protocol.ID, network.StreamHandler...
method SetStreamHandlerMatch (line 226) | func (h *stubHost) SetStreamHandlerMatch(protocol.ID, func(protocol.ID...
method RemoveStreamHandler (line 229) | func (h *stubHost) RemoveStreamHandler(protocol.ID) { panic("unused") }
method NewStream (line 230) | func (h *stubHost) NewStream(context.Context, peer.ID, ...protocol.ID)...
method Close (line 233) | func (h *stubHost) Close() error { panic("unused") }
method ConnManager (line 234) | func (h *stubHost) ConnManager() connmgr.ConnManager { panic("unused") }
method EventBus (line 235) | func (h *stubHost) EventBus() event.Bus { panic("unused") }
function TestHttpRouterAddrFunc (line 237) | func TestHttpRouterAddrFunc(t *testing.T) {
FILE: core/node/libp2p/sec.go
function Security (line 11) | func Security(enabled bool, tptConfig config.Transports) any {
FILE: core/node/libp2p/smux.go
function makeSmuxTransportOption (line 13) | func makeSmuxTransportOption(tptConfig config.Transports) (libp2p.Option...
function SmuxTransport (line 24) | func SmuxTransport(tptConfig config.Transports) func() (opts Libp2pOpts,...
FILE: core/node/libp2p/topicdiscovery.go
function TopicDiscovery (line 15) | func TopicDiscovery() any {
FILE: core/node/libp2p/transport.go
function Transports (line 20) | func Transports(tptConfig config.Transports) any {
function BandwidthCounter (line 83) | func BandwidthCounter() (opts Libp2pOpts, reporter *metrics.BandwidthCou...
FILE: core/node/p2pforge_resolver.go
type p2pForgeResolver (line 29) | type p2pForgeResolver struct
method LookupIPAddr (line 58) | func (r *p2pForgeResolver) LookupIPAddr(ctx context.Context, hostname ...
method LookupTXT (line 118) | func (r *p2pForgeResolver) LookupTXT(ctx context.Context, hostname str...
function NewP2PForgeResolver (line 41) | func NewP2PForgeResolver(suffixes []string, fallback madns.BasicResolver...
FILE: core/node/p2pforge_resolver_test.go
constant testPeerID (line 19) | testPeerID = "k51qzi5uqu5dhnwe629wdlncpql6frppdpwnz4wtlcw816aysd5wwlk63g...
constant domainSuffix (line 22) | domainSuffix = config.DefaultDomainSuffix
type mockResolver (line 26) | type mockResolver struct
method LookupIPAddr (line 32) | func (m *mockResolver) LookupIPAddr(_ context.Context, hostname string...
method LookupTXT (line 42) | func (m *mockResolver) LookupTXT(_ context.Context, name string) ([]st...
function newTestResolver (line 50) | func newTestResolver(t *testing.T) *p2pForgeResolver {
function assertLookupIP (line 56) | func assertLookupIP(t *testing.T, r *p2pForgeResolver, hostname, wantIP ...
function TestP2PForgeResolver_LookupIPAddr (line 64) | func TestP2PForgeResolver_LookupIPAddr(t *testing.T) {
function TestP2PForgeResolver_LookupIPAddr_MultipleSuffixes (line 92) | func TestP2PForgeResolver_LookupIPAddr_MultipleSuffixes(t *testing.T) {
function TestP2PForgeResolver_LookupIPAddr_FallbackToNetwork (line 110) | func TestP2PForgeResolver_LookupIPAddr_FallbackToNetwork(t *testing.T) {
function TestP2PForgeResolver_LookupIPAddr_FallbackError (line 143) | func TestP2PForgeResolver_LookupIPAddr_FallbackError(t *testing.T) {
function TestP2PForgeResolver_LookupTXT (line 152) | func TestP2PForgeResolver_LookupTXT(t *testing.T) {
FILE: core/node/peering.go
function Peering (line 14) | func Peering(lc fx.Lifecycle, host host.Host) *peering.PeeringService {
function PeerWith (line 29) | func PeerWith(peers ...peer.AddrInfo) fx.Option {
FILE: core/node/provider.go
constant sampledBatchSize (line 50) | sampledBatchSize = 1000
constant reprovideStrategyKey (line 53) | reprovideStrategyKey = "/reprovideStrategy"
constant KeystoreDatastorePath (line 56) | KeystoreDatastorePath = "provider-keystore"
function validateKeystoreSuffix (line 72) | func validateKeystoreSuffix(suffix string) error {
constant reprovideAlertPollInterval (line 81) | reprovideAlertPollInterval = 15 * time.Minute
constant consecutiveAlertsThreshold (line 86) | consecutiveAlertsThreshold = 3
type DHTProvider (line 92) | type DHTProvider interface
type NoopProvider (line 155) | type NoopProvider struct
method StartProviding (line 157) | func (r *NoopProvider) StartProviding(bool, ...mh.Multihash) error { r...
method ProvideOnce (line 158) | func (r *NoopProvider) ProvideOnce(...mh.Multihash) error { r...
method Clear (line 159) | func (r *NoopProvider) Clear() int { r...
method RefreshSchedule (line 160) | func (r *NoopProvider) RefreshSchedule() error { r...
method Close (line 161) | func (r *NoopProvider) Close() error { r...
type LegacyProvider (line 171) | type LegacyProvider struct
method StartProviding (line 175) | func (r *LegacyProvider) StartProviding(force bool, keys ...mh.Multiha...
method ProvideOnce (line 179) | func (r *LegacyProvider) ProvideOnce(keys ...mh.Multihash) error {
method Clear (line 192) | func (r *LegacyProvider) Clear() int {
method RefreshSchedule (line 196) | func (r *LegacyProvider) RefreshSchedule() error { return nil }
function LegacyProviderOpt (line 200) | func LegacyProviderOpt(reprovideInterval time.Duration, strategy string,...
type dhtImpl (line 342) | type dhtImpl interface
type fullrtRouter (line 349) | type fullrtRouter struct
method GetClosestPeers (line 365) | func (fr *fullrtRouter) GetClosestPeers(ctx context.Context, key strin...
function newFullRTRouter (line 355) | func newFullRTRouter(fr *fullrt.FullRT, loggerName string) *fullrtRouter {
type addrsFilter (line 388) | type addrsFilter interface
function findRootDatastoreSpec (line 396) | func findRootDatastoreSpec(spec map[string]any) map[string]any {
function MountKeystoreDatastores (line 437) | func MountKeystoreDatastores(repo repo.Repo) ([]mount.Mount, func(), err...
function openDatastoreAt (line 479) | func openDatastoreAt(rootSpec map[string]any, path string) (datastore.Ba...
function copySpec (line 491) | func copySpec(spec map[string]any) map[string]any {
constant purgeBatchSize (line 519) | purgeBatchSize = 1 << 12
function purgeOrphanedKeystoreData (line 528) | func purgeOrphanedKeystoreData(ctx context.Context, ds datastore.Batchin...
function SweepingProviderOpt (line 586) | func SweepingProviderOpt(cfg *config.Config) fx.Option {
function hasDHTRouting (line 1051) | func hasDHTRouting(cfg *config.Config) bool {
function routerIncludesDHT (line 1071) | func routerIncludesDHT(rp config.RouterParser, cfg *config.Config) bool {
function OnlineProviders (line 1090) | func OnlineProviders(provide bool, cfg *config.Config) fx.Option {
function OfflineProviders (line 1127) | func OfflineProviders() fx.Option {
function mfsProvider (line 1133) | func mfsProvider(mfsRoot *mfs.Root, fetcher fetcher.Factory) provider.Ke...
type provStrategyIn (line 1149) | type provStrategyIn struct
type provStrategyOut (line 1159) | type provStrategyOut struct
function createKeyProvider (line 1171) | func createKeyProvider(strategyFlag config.ProvideStrategy, in provStrat...
function detectStrategyChange (line 1191) | func detectStrategyChange(ctx context.Context, strategy string, ds datas...
function persistStrategy (line 1208) | func persistStrategy(ctx context.Context, strategy string, ds datastore....
function handleStrategyChange (line 1221) | func handleStrategyChange(strategy string, provider DHTProvider, ds data...
function setReproviderKeyProvider (line 1242) | func setReproviderKeyProvider(strategy string) func(in provStrategyIn) p...
FILE: core/node/storage.go
function RepoConfig (line 16) | func RepoConfig(repo repo.Repo) (*config.Config, error) {
function Datastore (line 22) | func Datastore(repo repo.Repo) datastore.Datastore {
type BaseBlocks (line 27) | type BaseBlocks
function BaseBlockstoreCtor (line 30) | func BaseBlockstoreCtor(
function GcBlockstoreCtor (line 71) | func GcBlockstoreCtor(bb BaseBlocks) (gclocker blockstore.GCLocker, gcbs...
function FilestoreBlockstoreCtor (line 80) | func FilestoreBlockstoreCtor(repo repo.Repo, bb BaseBlocks, prov DHTProv...
FILE: coverage/main/main.go
function main (line 15) | func main() {
FILE: docs/examples/kubo-as-a-library/main.go
function setupPlugins (line 31) | func setupPlugins(externalPluginsPath string) error {
function createTempRepo (line 50) | func createTempRepo() (string, error) {
function createNode (line 112) | func createNode(ctx context.Context, repoPath string) (*core.IpfsNode, e...
function spawnEphemeral (line 138) | func spawnEphemeral(ctx context.Context) (icore.CoreAPI, *core.IpfsNode,...
function connectToPeers (line 163) | func connectToPeers(ctx context.Context, ipfs icore.CoreAPI, peers []str...
function getUnixfsNode (line 197) | func getUnixfsNode(path string) (files.Node, error) {
function main (line 215) | func main() {
FILE: docs/examples/kubo-as-a-library/main_test.go
function TestExample (line 13) | func TestExample(t *testing.T) {
FILE: fuse/ipns/common.go
function InitializeKeyspace (line 15) | func InitializeKeyspace(n *core.IpfsNode, key ci.PrivKey) error {
FILE: fuse/ipns/ipns_test.go
function maybeSkipFuseTests (line 26) | func maybeSkipFuseTests(t *testing.T) {
function randBytes (line 32) | func randBytes(size int) []byte {
function mkdir (line 41) | func mkdir(t *testing.T, path string) {
function writeFileOrFail (line 48) | func writeFileOrFail(t *testing.T, size int, path string) []byte {
function writeFile (line 56) | func writeFile(size int, path string) ([]byte, error) {
function verifyFile (line 62) | func verifyFile(t *testing.T, path string, wantData []byte) {
function checkExists (line 75) | func checkExists(t *testing.T, path string) {
function closeMount (line 82) | func closeMount(mnt *mountWrap) {
type mountWrap (line 90) | type mountWrap struct
method Close (line 95) | func (m *mountWrap) Close() error {
function setupIpnsTest (line 101) | func setupIpnsTest(t *testing.T, node *core.IpfsNode) (*core.IpfsNode, *...
function TestIpnsLocalLink (line 141) | func TestIpnsLocalLink(t *testing.T) {
function TestIpnsBasicIO (line 159) | func TestIpnsBasicIO(t *testing.T) {
function TestFilePersistence (line 190) | func TestFilePersistence(t *testing.T) {
function TestMultipleDirs (line 215) | func TestMultipleDirs(t *testing.T) {
function TestFileSizeReporting (line 253) | func TestFileSizeReporting(t *testing.T) {
function TestDoubleEntryFailure (line 274) | func TestDoubleEntryFailure(t *testing.T) {
function TestAppendFile (line 293) | func TestAppendFile(t *testing.T) {
function TestConcurrentWrites (line 334) | func TestConcurrentWrites(t *testing.T) {
function TestFSThrash (line 381) | func TestFSThrash(t *testing.T) {
function TestMultiWrite (line 466) | func TestMultiWrite(t *testing.T) {
FILE: fuse/ipns/ipns_unix.go
function init (line 30) | func init() {
type FileSystem (line 41) | type FileSystem struct
method Root (line 61) | func (f *FileSystem) Root() (fs.Node, error) {
method Destroy (line 66) | func (f *FileSystem) Destroy() {
function NewFileSystem (line 47) | func NewFileSystem(ctx context.Context, ipfs iface.CoreAPI, ipfspath, ip...
type Root (line 74) | type Root struct
method Attr (line 154) | func (r *Root) Attr(ctx context.Context, a *fuse.Attr) error {
method Lookup (line 161) | func (r *Root) Lookup(ctx context.Context, name string) (fs.Node, erro...
method Close (line 199) | func (r *Root) Close() error {
method Forget (line 211) | func (r *Root) Forget() {
method ReadDirAll (line 220) | func (r *Root) ReadDirAll(ctx context.Context) ([]fuse.Dirent, error) {
function ipnsPubFunc (line 87) | func ipnsPubFunc(ipfs iface.CoreAPI, key iface.Key) mfs.PubFunc {
function loadRoot (line 94) | func loadRoot(ctx context.Context, ipfs iface.CoreAPI, key iface.Key) (*...
function CreateRoot (line 121) | func CreateRoot(ctx context.Context, ipfs iface.CoreAPI, keys map[string...
type Directory (line 239) | type Directory struct
method Attr (line 253) | func (d *Directory) Attr(ctx context.Context, a *fuse.Attr) error {
method Lookup (line 277) | func (d *Directory) Lookup(ctx context.Context, name string) (fs.Node,...
method ReadDirAll (line 297) | func (d *Directory) ReadDirAll(ctx context.Context) ([]fuse.Dirent, er...
method Mkdir (line 408) | func (d *Directory) Mkdir(ctx context.Context, req *fuse.MkdirRequest)...
method Create (line 458) | func (d *Directory) Create(ctx context.Context, req *fuse.CreateReques...
method Remove (line 490) | func (d *Directory) Remove(ctx context.Context, req *fuse.RemoveReques...
method Rename (line 499) | func (d *Directory) Rename(ctx context.Context, req *fuse.RenameReques...
type FileNode (line 243) | type FileNode struct
method Attr (line 262) | func (fi *FileNode) Attr(ctx context.Context, a *fuse.Attr) error {
method Fsync (line 385) | func (fi *FileNode) Fsync(ctx context.Context, req *fuse.FsyncRequest)...
method Open (line 417) | func (fi *FileNode) Open(ctx context.Context, req *fuse.OpenRequest, r...
type File (line 248) | type File struct
method Read (line 322) | func (fi *File) Read(ctx context.Context, req *fuse.ReadRequest, resp ...
method Write (line 345) | func (fi *File) Write(ctx context.Context, req *fuse.WriteRequest, res...
method Flush (line 355) | func (fi *File) Flush(ctx context.Context, req *fuse.FlushRequest) err...
method Setattr (line 368) | func (fi *File) Setattr(ctx context.Context, req *fuse.SetattrRequest,...
method Forget (line 400) | func (fi *File) Forget() {
method Release (line 454) | func (fi *File) Release(ctx context.Context, req *fuse.ReleaseRequest)...
type ipnsRoot (line 532) | type ipnsRoot interface
type ipnsDirectory (line 540) | type ipnsDirectory interface
type ipnsFile (line 552) | type ipnsFile interface
type ipnsFileNode (line 559) | type ipnsFileNode interface
FILE: fuse/ipns/link_unix.go
type Link (line 13) | type Link struct
method Attr (line 17) | func (l *Link) Attr(ctx context.Context, a *fuse.Attr) error {
method Readlink (line 23) | func (l *Link) Readlink(ctx context.Context, req *fuse.ReadlinkRequest...
FILE: fuse/ipns/mount_unix.go
function Mount (line 12) | func Mount(ipfs *core.IpfsNode, ipnsmp, ipfsmp string) (mount.Mount, err...
FILE: fuse/mfs/mfs_test.go
function setUp (line 26) | func setUp(t *testing.T, ipfs *core.IpfsNode) (fs.FS, *fstestutil.Mount) {
function TestReadWrite (line 52) | func TestReadWrite(t *testing.T) {
function TestMkdir (line 94) | func TestMkdir(t *testing.T) {
function TestPersistence (line 118) | func TestPersistence(t *testing.T) {
function TestAttr (line 169) | func TestAttr(t *testing.T) {
function TestConcurrentRW (line 220) | func TestConcurrentRW(t *testing.T) {
function TestMFSRootXattr (line 298) | func TestMFSRootXattr(t *testing.T) {
FILE: fuse/mfs/mfs_unix.go
constant ipfsCIDXattr (line 23) | ipfsCIDXattr = "ipfs_cid"
constant mfsDirMode (line 24) | mfsDirMode = os.ModeDir | 0755
constant mfsFileMode (line 25) | mfsFileMode = 0644
constant blockSize (line 26) | blockSize = 512
constant dirSize (line 27) | dirSize = 8
type FileSystem (line 31) | type FileSystem struct
method Root (line 36) | func (fs *FileSystem) Root() (fs.Node, error) {
type Dir (line 41) | type Dir struct
method Attr (line 46) | func (dir *Dir) Attr(ctx context.Context, attr *fuse.Attr) error {
method Lookup (line 54) | func (dir *Dir) Lookup(ctx context.Context, req *fuse.LookupRequest, r...
method ReadDirAll (line 81) | func (dir *Dir) ReadDirAll(ctx context.Context) ([]fuse.Dirent, error) {
method Mkdir (line 102) | func (dir *Dir) Mkdir(ctx context.Context, req *fuse.MkdirRequest) (fs...
method Remove (line 113) | func (dir *Dir) Remove(ctx context.Context, req *fuse.RemoveRequest) e...
method Rename (line 138) | func (dir *Dir) Rename(ctx context.Context, req *fuse.RenameRequest, n...
method Create (line 169) | func (dir *Dir) Create(ctx context.Context, req *fuse.CreateRequest, r...
method Listxattr (line 217) | func (dir *Dir) Listxattr(ctx context.Context, req *fuse.ListxattrRequ...
method Getxattr (line 223) | func (dir *Dir) Getxattr(ctx context.Context, req *fuse.GetxattrReques...
type File (line 238) | type File struct
method Attr (line 243) | func (file *File) Attr(ctx context.Context, attr *fuse.Attr) error {
method Open (line 261) | func (file *File) Open(ctx context.Context, req *fuse.OpenRequest, res...
method Fsync (line 285) | func (file *File) Fsync(ctx context.Context, req *fuse.FsyncRequest) e...
method Listxattr (line 290) | func (file *File) Listxattr(ctx context.Context, req *fuse.ListxattrRe...
method Getxattr (line 296) | func (file *File) Getxattr(ctx context.Context, req *fuse.GetxattrRequ...
type FileHandler (line 312) | type FileHandler struct
method Read (line 318) | func (fh *FileHandler) Read(ctx context.Context, req *fuse.ReadRequest...
method Write (line 341) | func (fh *FileHandler) Write(ctx context.Context, req *fuse.WriteReque...
method Flush (line 355) | func (fh *FileHandler) Flush(ctx context.Context, req *fuse.FlushReque...
method Release (line 363) | func (fh *FileHandler) Release(ctx context.Context, req *fuse.ReleaseR...
function NewFileSystem (line 371) | func NewFileSystem(ipfs *core.IpfsNode) fs.FS {
type mfsDir (line 380) | type mfsDir interface
type mfsFile (line 394) | type mfsFile interface
type mfsHandler (line 404) | type mfsHandler interface
FILE: fuse/mfs/mount_unix.go
function Mount (line 11) | func Mount(ipfs *core.IpfsNode, mountpoint string) (mount.Mount, error) {
FILE: fuse/mount/fuse.go
type mount (line 18) | type mount struct
method mount (line 66) | func (m *mount) mount() error {
method unmount (line 105) | func (m *mount) unmount() error {
method MountPoint (line 134) | func (m *mount) MountPoint() string {
method Unmount (line 138) | func (m *mount) Unmount() error {
method IsActive (line 151) | func (m *mount) IsActive() bool {
method setActive (line 158) | func (m *mount) setActive(a bool) {
function NewMount (line 31) | func NewMount(fsys fs.FS, mountpoint string, allowOther bool) (Mount, er...
FILE: fuse/mount/mount.go
type Mount (line 19) | type Mount interface
function ForceUnmount (line 32) | func ForceUnmount(m Mount) error {
function UnmountCmd (line 64) | func UnmountCmd(point string) (*exec.Cmd, error) {
function ForceUnmountManyTimes (line 78) | func ForceUnmountManyTimes(m Mount, attempts int) error {
type closer (line 91) | type closer struct
method Close (line 95) | func (c *closer) Close() error {
function Closer (line 100) | func Closer(m Mount) io.Closer {
FILE: fuse/node/mount_darwin.go
function init (line 18) | func init() {
constant dontCheckOSXFUSEConfigKey (line 25) | dontCheckOSXFUSEConfigKey = "DontCheckOSXFUSE"
constant fuseVersionPkg (line 28) | fuseVersionPkg = "github.com/jbenet/go-fuse-version/fuse-version"
constant errStrFuseRequired (line 31) | errStrFuseRequired = `OSXFUSE not found.
type errNeedFuseVersion (line 61) | type errNeedFuseVersion struct
method Error (line 65) | func (me errNeedFuseVersion) Error() string {
function darwinFuseCheckVersion (line 128) | func darwinFuseCheckVersion(node *core.IpfsNode) error {
function tryGFV (line 161) | func tryGFV() (string, error) {
function trySysctl (line 172) | func trySysctl() (string, error) {
function tryGFVFromFuseVersion (line 182) | func tryGFVFromFuseVersion()
Condensed preview — 921 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (6,408K chars).
[
{
"path": ".codeclimate.yml",
"chars": 648,
"preview": "ratings:\n paths: \n - \"**/*.go\"\n\nexclude_paths:\n- test/\n- Godeps/\n- thirdparty/\n- \"**/*.pb.go\"\n\nengines:\n fixme:\n e"
},
{
"path": ".cspell.yml",
"chars": 284,
"preview": "ignoreWords:\n - childs # This spelling is used in the files command\n - NodeCreater # This spelling is used in the fuse"
},
{
"path": ".dockerignore",
"chars": 255,
"preview": "Dockerfile\nDockerfile.fast\n.git/\n!.git/HEAD\n!.git/refs/\n!.git/packed-refs\ntest/sharness/lib/sharness/\ntest/sharness/tras"
},
{
"path": ".gitattributes",
"chars": 1400,
"preview": "# Default to text\n* text eol=lf\n\n# True text\n*.md text eol=auto\nLICENSE text eol=auto\n\n# Known binary types\n*.png binary"
},
{
"path": ".github/CODEOWNERS",
"chars": 311,
"preview": "# Code owners are automatically requested for review when someone opens a pull\n# request that modifies code that they ow"
},
{
"path": ".github/FUNDING.yml",
"chars": 34,
"preview": "custom: [ipshipyard.gitwallet.co]\n"
},
{
"path": ".github/ISSUE_TEMPLATE/bug-report.yml",
"chars": 2426,
"preview": "name: Bug Report\ndescription: Report a bug in Kubo.\nlabels:\n - kind/bug\n - need/triage\nbody:\n - type: markdown\n at"
},
{
"path": ".github/ISSUE_TEMPLATE/config.yml",
"chars": 852,
"preview": "blank_issues_enabled: false\ncontact_links:\n - name: Getting Help on IPFS\n url: https://ipfs.tech/help\n about: All in"
},
{
"path": ".github/ISSUE_TEMPLATE/doc.yml",
"chars": 980,
"preview": "name: Documentation Issue\ndescription: Report missing, erroneous docs, broken links or propose new Kubo docs.\nlabels:\n "
},
{
"path": ".github/ISSUE_TEMPLATE/enhancement.yml",
"chars": 1481,
"preview": "name: Enhancement\ndescription: Suggest an improvement to an existing kubo feature.\nlabels:\n - kind/enhancement\n - need"
},
{
"path": ".github/ISSUE_TEMPLATE/feature.yml",
"chars": 1537,
"preview": "name: Feature\ndescription: Suggest a new feature in Kubo.\nlabels:\n - kind/feature\n - need/triage\nbody:\n - type: markd"
},
{
"path": ".github/auto-comment.yml",
"chars": 91,
"preview": "# Comment to a new issue.\n# Disabled\n# issueOpened: \"\"\n\n# Disabled\n# pullRequestOpened: \"\"\n"
},
{
"path": ".github/build-platforms.yml",
"chars": 486,
"preview": "# Build platforms configuration for Kubo\n# Matches https://github.com/ipfs/distributions/blob/master/dists/kubo/build_ma"
},
{
"path": ".github/dependabot.yml",
"chars": 1246,
"preview": "# Dependabot PRs are auto-tidied by .github/workflows/dependabot-tidy.yml\nversion: 2\nupdates:\n - package-ecosystem: \"gi"
},
{
"path": ".github/pull_request_template.md",
"chars": 231,
"preview": "<!--\nPlease update docs/changelogs/ if you're modifying Go files. If your change does not require a changelog entry, ple"
},
{
"path": ".github/workflows/changelog.yml",
"chars": 1229,
"preview": "name: Changelog\n\non:\n pull_request:\n types:\n - opened\n - edited\n - synchronize\n - reopened\n "
},
{
"path": ".github/workflows/codeql-analysis.yml",
"chars": 1358,
"preview": "# https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/config"
},
{
"path": ".github/workflows/dependabot-tidy.yml",
"chars": 2017,
"preview": "# Dependabot only updates go.mod/go.sum in the root module, but this repo has\n# multiple Go modules (see docs/examples/)"
},
{
"path": ".github/workflows/docker-check.yml",
"chars": 1805,
"preview": "# This workflow performs a quick Docker build check on PRs and pushes to master.\n# It builds the Docker image and runs a"
},
{
"path": ".github/workflows/docker-image.yml",
"chars": 4970,
"preview": "# This workflow builds and publishes official Docker images to Docker Hub.\n# It handles multi-platform builds (amd64, ar"
},
{
"path": ".github/workflows/gateway-conformance.yml",
"chars": 8025,
"preview": "name: Gateway Conformance\n\non:\n workflow_dispatch:\n push:\n branches:\n - master\n pull_request:\n paths-ignor"
},
{
"path": ".github/workflows/generated-pr.yml",
"chars": 246,
"preview": "name: Close Generated PRs\n\non:\n schedule:\n - cron: '0 0 * * *'\n workflow_dispatch:\n\npermissions:\n issues: write\n "
},
{
"path": ".github/workflows/gobuild.yml",
"chars": 1727,
"preview": "name: Go Build\n\non:\n workflow_dispatch:\n pull_request:\n paths-ignore:\n - '**/*.md'\n push:\n branches:\n "
},
{
"path": ".github/workflows/golang-analysis.yml",
"chars": 1845,
"preview": "name: Go Check\n\non:\n workflow_dispatch:\n pull_request:\n paths-ignore:\n - '**/*.md'\n push:\n branches:\n "
},
{
"path": ".github/workflows/golint.yml",
"chars": 781,
"preview": "name: Go Lint\n\non:\n workflow_dispatch:\n pull_request:\n paths-ignore:\n - '**/*.md'\n push:\n branches:\n "
},
{
"path": ".github/workflows/gotest.yml",
"chars": 5674,
"preview": "name: Go Test\n\non:\n workflow_dispatch:\n pull_request:\n paths-ignore:\n - '**/*.md'\n push:\n branches:\n "
},
{
"path": ".github/workflows/interop.yml",
"chars": 7934,
"preview": "# Interoperability Tests\n#\n# This workflow ensures Kubo remains compatible with the broader IPFS ecosystem.\n# It builds "
},
{
"path": ".github/workflows/sharness.yml",
"chars": 5059,
"preview": "name: Sharness\n\non:\n workflow_dispatch:\n pull_request:\n paths-ignore:\n - \"**/*.md\"\n push:\n branches:\n "
},
{
"path": ".github/workflows/spellcheck.yml",
"chars": 393,
"preview": "name: Spell Check\n\non:\n pull_request:\n push:\n branches: [\"master\"]\n workflow_dispatch:\n\npermissions:\n contents: r"
},
{
"path": ".github/workflows/stale.yml",
"chars": 244,
"preview": "name: Close Stale Issues\n\non:\n schedule:\n - cron: '0 0 * * *'\n workflow_dispatch:\n\npermissions:\n issues: write\n p"
},
{
"path": ".github/workflows/sync-release-assets.yml",
"chars": 5371,
"preview": "name: Sync GitHub Release Assets\n\non:\n workflow_dispatch:\n schedule:\n - cron: '0 0 * * *'\n\nconcurrency:\n group: re"
},
{
"path": ".github/workflows/test-migrations.yml",
"chars": 2224,
"preview": "name: Migrations\n\non:\n workflow_dispatch:\n pull_request:\n paths:\n # Migration implementation files\n - 're"
},
{
"path": ".gitignore",
"chars": 570,
"preview": "# ipfs can generate profiling dump files\n*.cpuprof\n*.memprof\n\n*.swp\n.ipfsconfig\n*.out\n*.coverprofile\n*.test\n*.orig\n*~\n\nc"
},
{
"path": ".golangci.yml",
"chars": 181,
"preview": "linters:\n enable:\n - stylecheck\n\nlinters-settings:\n stylecheck:\n checks:\n - all\n - '-ST1003'\n dot-impor"
},
{
"path": ".hadolint.yaml",
"chars": 338,
"preview": "# Hadolint configuration for Kubo Docker image\n# https://github.com/hadolint/hadolint\n\n# Ignore specific rules\nignored:\n"
},
{
"path": ".mailmap",
"chars": 11761,
"preview": "# This file allows re-mapping author names/emails\n# while maintaining the integrity of the repository\n#\n# Spec: https://"
},
{
"path": "AGENTS.md",
"chars": 10039,
"preview": "# AI Agent Instructions for Kubo\n\nThis file provides instructions for AI coding agents working on the [Kubo](https://git"
},
{
"path": "CHANGELOG.md",
"chars": 1479,
"preview": "# Kubo Changelogs\n\n- [v0.42](docs/changelogs/v0.42.md)\n- [v0.41](docs/changelogs/v0.41.md)\n- [v0.40](docs/changelogs/v0."
},
{
"path": "CONTRIBUTING.md",
"chars": 691,
"preview": "# Contributing to Kubo\n\n**For development setup, building, and testing, see the [Developer Guide](docs/developer-guide.m"
},
{
"path": "Dockerfile",
"chars": 3807,
"preview": "# syntax=docker/dockerfile:1\n# Enables BuildKit with cache mounts for faster builds\nFROM --platform=${BUILDPLATFORM:-lin"
},
{
"path": "FUNDING.json",
"chars": 109,
"preview": "{\n \"opRetro\": {\n \"projectId\": \"0x7f330267969cf845a983a9d4e7b7dbcca5c700a5191269af377836d109e0bb69\"\n }\n}\n"
},
{
"path": "GNUmakefile",
"chars": 109,
"preview": "# General tools\n\nSHELL=PATH='$(PATH)' /bin/sh\n\n# enable second expansion\n.SECONDEXPANSION:\n\ninclude Rules.mk\n"
},
{
"path": "LICENSE",
"chars": 508,
"preview": "This project is transitioning from an MIT-only license to a dual MIT/Apache-2.0 license. \nUnless otherwise noted, all co"
},
{
"path": "LICENSE-APACHE",
"chars": 520,
"preview": "Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except in compliance with the "
},
{
"path": "LICENSE-MIT",
"chars": 1046,
"preview": "The MIT License (MIT)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and"
},
{
"path": "Makefile",
"chars": 50,
"preview": "all:\n\t@gmake $@\n.PHONY: all\n\n.DEFAULT:\n\t@gmake $@\n"
},
{
"path": "README.md",
"chars": 13146,
"preview": "<h1 align=\"center\">\n <br>\n <a href=\"https://github.com/ipfs/kubo/blob/master/docs/logo/\"><img src=\"https://user-images"
},
{
"path": "Rules.mk",
"chars": 4065,
"preview": "TGT_BIN :=\nCLEAN :=\nCOVERAGE :=\nDISTCLEAN :=\nTEST :=\nTEST_SHORT :=\nGOCC ?= go\nPROTOC ?= protoc\n\nall: help # all has t"
},
{
"path": "SECURITY.md",
"chars": 848,
"preview": "# Security Policy\n\nThe IPFS protocol and its implementations are still in heavy development. This\nmeans that there may b"
},
{
"path": "assets/README.md",
"chars": 121,
"preview": "# Assets loaded in with IPFS\n\nThis directory contains the go-ipfs assets:\n\n* Getting started documentation (`init-doc`)."
},
{
"path": "assets/assets.go",
"chars": 1450,
"preview": "package assets\n\nimport (\n\t\"embed\"\n\t\"fmt\"\n\tgopath \"path\"\n\n\t\"github.com/ipfs/kubo/core\"\n\t\"github.com/ipfs/kubo/core/coreap"
},
{
"path": "assets/init-doc/about",
"chars": 1681,
"preview": "\n IPFS -- Inter-Planetary File system\n\nIPFS is a global, versioned, peer-to-peer filesystem. It combine"
},
{
"path": "assets/init-doc/contact",
"chars": 189,
"preview": "Come hang out in our IRC chat room if you have any questions.\n\nContact the ipfs dev team:\n- Bugs: https://github.com/ipf"
},
{
"path": "assets/init-doc/docs/index",
"chars": 6,
"preview": "Index\n"
},
{
"path": "assets/init-doc/help",
"chars": 311,
"preview": "Some helpful resources for finding your way around ipfs:\n\n- quick-start: a quick show of various ipfs features.\n- ipfs c"
},
{
"path": "assets/init-doc/ping",
"chars": 4,
"preview": "ipfs"
},
{
"path": "assets/init-doc/quick-start",
"chars": 1681,
"preview": "# 0.1 - Quick Start\n\nThis is a set of short examples with minimal explanation. It is meant as\na \"quick start\".\n\n\nAdd a f"
},
{
"path": "assets/init-doc/readme",
"chars": 819,
"preview": "Hello and Welcome to IPFS!\n\n██╗██████╗ ███████╗███████╗\n██║██╔══██╗██╔════╝██╔════╝\n██║██████╔╝█████╗ ███████╗\n██║██╔══"
},
{
"path": "assets/init-doc/security-notes",
"chars": 1162,
"preview": " IPFS Alpha Security Notes\n\nWe try hard to ensure our system is safe and robust, but all software\nhas"
},
{
"path": "bin/Rules.mk",
"chars": 433,
"preview": "include mk/header.mk\n\ndist_root_$(d)=\"/ipfs/QmPrXH9jRVwvd7r5MC5e6nV4uauQGzLk1i2647Ye9Vbbwe\"\n\nTGTS_$(d) := $(d)/protoc\nDI"
},
{
"path": "bin/archive-branches.sh",
"chars": 1601,
"preview": "#!/usr/bin/env bash\nset -euo pipefail\nIFS=$'\\n\\t'\n\nauth=\"\"\n#auth=\"-u kubuxu:$GH_TOKEN\"\norg=ipfs\nrepo=go-ipfs\narch_repo=g"
},
{
"path": "bin/container_daemon",
"chars": 1537,
"preview": "#!/bin/sh\nset -e\n\nuser=ipfs\nrepo=\"$IPFS_PATH\"\n\nif [ \"$(id -u)\" -eq 0 ]; then\n echo \"Changing user to $user\"\n # ensure "
},
{
"path": "bin/container_init_run",
"chars": 256,
"preview": "#!/bin/sh\n\nset -e\n\n# used by the container startup script for running initialization scripts\n\nscript=\"$1\"\nif [ -x \"$scri"
},
{
"path": "bin/dist_get",
"chars": 3998,
"preview": "#!/bin/sh\n\nGOCC=${GOCC=go}\n\ndie() {\n\techo \"$@\" >&2\n\texit 1\n}\n\nhave_binary() {\n\ttype \"$1\" > /dev/null 2> /dev/null\n}\n\nche"
},
{
"path": "bin/gencmdref",
"chars": 770,
"preview": "#!/usr/bin/env python\n\nimport os\nimport sys\nimport datetime\n\nfrom subprocess import check_output\n\ndef run(cmd):\n return"
},
{
"path": "bin/get-docker-tags.sh",
"chars": 1756,
"preview": "#!/usr/bin/env bash\n\n# get-docker-tags.sh\n#\n# Usage:\n# ./get-docker-tags.sh <build number> <git commit sha1> <git bran"
},
{
"path": "bin/graphmd",
"chars": 723,
"preview": "#!/bin/sh\n\nif [ \"$#\" -ne 1 ]; then\n echo \"usage: $0 <ipfs-path>...\"\n echo \"output merkledag links in graphviz dot\"\n e"
},
{
"path": "bin/ipns-republish",
"chars": 681,
"preview": "#!/bin/bash\n\nif [ \"$#\" -ne 1 ]; then\n echo \"usage: $0 <ipfs-or-ipns-path>\"\n echo \"republishes an ipns name every 20 mi"
},
{
"path": "bin/maketarball.sh",
"chars": 541,
"preview": "#!/usr/bin/env bash\n# vim: set expandtab sw=2 ts=2:\n\n# bash safe mode\nset -euo pipefail\nIFS=$'\\n\\t'\n\n# readlink doesn't "
},
{
"path": "bin/mkreleaselog",
"chars": 21804,
"preview": "#!/bin/bash\n#\n# Invocation: mkreleaselog [FIRST_REF [LAST_REF]]\n#\n# Generates release notes with contributor statistics,"
},
{
"path": "bin/push-docker-tags.sh",
"chars": 2754,
"preview": "#!/usr/bin/env bash\n#\n# TODO: this script is legacy, use get-docker-tags.sh instead.\n#\n# push-docker-tags.sh\n#\n# Run fro"
},
{
"path": "bin/test-go-build-platforms",
"chars": 658,
"preview": "#!/bin/bash\nset -e\n\necho \"Building kubo for all platforms in .github/build-platforms.yml...\"\n\nif [ ! -f .github/build-pl"
},
{
"path": "bin/test-go-fmt",
"chars": 454,
"preview": "#!/usr/bin/env bash\nset -euo pipefail\nT=\"$(mktemp)\"\nfind . \\\n -path ./test/sharness -prune \\\n -o -path ./plugin/loade"
},
{
"path": "blocks/blockstoreutil/remove.go",
"chars": 2949,
"preview": "// Package blockstoreutil provides utility functions for Blockstores.\npackage blockstoreutil\n\nimport (\n\t\"context\"\n\t\"erro"
},
{
"path": "client/rpc/README.md",
"chars": 913,
"preview": "# `coreiface.CoreAPI` over http `rpc`\n\n> IPFS CoreAPI implementation using HTTP API\n\nThis package implements [`coreiface"
},
{
"path": "client/rpc/api.go",
"chars": 7046,
"preview": "package rpc\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net\"\n\t\"net/http\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n"
},
{
"path": "client/rpc/api_test.go",
"chars": 3729,
"preview": "package rpc\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"net/http\"\n\t\"net/http/httptest\"\n\t\"strconv\"\n\t\"strings\"\n\t\"sync\"\n\t\"testing\"\n\t\"t"
},
{
"path": "client/rpc/apifile.go",
"chars": 6862,
"preview": "package rpc\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"github.com/ipfs/boxo"
},
{
"path": "client/rpc/auth/auth.go",
"chars": 885,
"preview": "package auth\n\nimport \"net/http\"\n\nvar _ http.RoundTripper = &AuthorizedRoundTripper{}\n\ntype AuthorizedRoundTripper struct"
},
{
"path": "client/rpc/block.go",
"chars": 2927,
"preview": "package rpc\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\n\t\"github.com/ipfs/boxo/path\"\n\t\"github.com/ipfs/go-cid\"\n\tiface \"g"
},
{
"path": "client/rpc/dag.go",
"chars": 3427,
"preview": "package rpc\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\n\t\"github.com/ipfs/boxo/path\"\n\tblocks \"github.com/ipfs/go-block-f"
},
{
"path": "client/rpc/errors.go",
"chars": 4015,
"preview": "package rpc\n\nimport (\n\t\"errors\"\n\t\"strings\"\n\t\"unicode/utf8\"\n\n\t\"github.com/ipfs/go-cid\"\n\tipld \"github.com/ipfs/go-ipld-for"
},
{
"path": "client/rpc/errors_test.go",
"chars": 2800,
"preview": "package rpc\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/ipfs/go-cid\"\n\tipld \"github.com/ipfs/go-ipld-format\"\n\tmba"
},
{
"path": "client/rpc/key.go",
"chars": 4002,
"preview": "package rpc\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"errors\"\n\n\t\"github.com/ipfs/boxo/ipns\"\n\t\"github.com/ipfs/boxo/path\"\n\tiface \"g"
},
{
"path": "client/rpc/name.go",
"chars": 3181,
"preview": "package rpc\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\n\t\"github.com/ipfs/boxo/ipns\"\n\t\"github.com/ipfs/boxo/name"
},
{
"path": "client/rpc/object.go",
"chars": 2019,
"preview": "package rpc\n\nimport (\n\t\"context\"\n\n\t\"github.com/ipfs/boxo/path\"\n\t\"github.com/ipfs/go-cid\"\n\tiface \"github.com/ipfs/kubo/co"
},
{
"path": "client/rpc/path.go",
"chars": 1103,
"preview": "package rpc\n\nimport (\n\t\"context\"\n\n\t\"github.com/ipfs/boxo/path\"\n\tcid \"github.com/ipfs/go-cid\"\n\tipld \"github.com/ipfs/go-i"
},
{
"path": "client/rpc/pin.go",
"chars": 5199,
"preview": "package rpc\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"io\"\n\t\"strings\"\n\n\t\"github.com/ipfs/boxo/path\"\n\t\"github.com/"
},
{
"path": "client/rpc/pubsub.go",
"chars": 4472,
"preview": "package rpc\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/json\"\n\t\"io\"\n\n\tiface \"github.com/ipfs/kubo/core/coreiface\"\n\tcaopts \""
},
{
"path": "client/rpc/request.go",
"chars": 623,
"preview": "package rpc\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"strings\"\n)\n\ntype Request struct {\n\tCtx context.Context\n\tApiBase string\n\tCom"
},
{
"path": "client/rpc/requestbuilder.go",
"chars": 3743,
"preview": "package rpc\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"github.com/blang/semver/v4\"\n\t\"github.com"
},
{
"path": "client/rpc/response.go",
"chars": 3804,
"preview": "package rpc\n\nimport (\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"mime\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"os\"\n\n\t\"github.com/ipfs/bo"
},
{
"path": "client/rpc/routing.go",
"chars": 3518,
"preview": "package rpc\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/base64\"\n\t\"encoding/json\"\n\n\t\"github.com/ipfs/boxo/path\"\n\t\"github.com"
},
{
"path": "client/rpc/swarm.go",
"chars": 3969,
"preview": "package rpc\n\nimport (\n\t\"context\"\n\t\"time\"\n\n\tiface \"github.com/ipfs/kubo/core/coreiface\"\n\t\"github.com/libp2p/go-libp2p/cor"
},
{
"path": "client/rpc/unixfs.go",
"chars": 4611,
"preview": "package rpc\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"time\"\n\n\t\"github.com/ipfs/boxo/files\"\n\tu"
},
{
"path": "codecov.yml",
"chars": 322,
"preview": "codecov:\n ci:\n - \"!travis-ci.org\"\n - \"!ci.ipfs.team:8111\"\n - \"!ci.ipfs.team\"\n - \"github.com\"\n notify:\n "
},
{
"path": "commands/context.go",
"chars": 3789,
"preview": "package commands\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"strings\"\n\t\"time\"\n\n\tcore \"github.com/ipfs/kubo/core\"\n\tcoreapi \"github.c"
},
{
"path": "commands/reqlog.go",
"chars": 2042,
"preview": "package commands\n\nimport (\n\t\"sync\"\n\t\"time\"\n)\n\n// ReqLogEntry is an entry in the request log.\ntype ReqLogEntry struct {\n\t"
},
{
"path": "config/addresses.go",
"chars": 621,
"preview": "package config\n\n// Addresses stores the (string) multiaddr addresses for the node.\ntype Addresses struct {\n\tSwarm "
},
{
"path": "config/api.go",
"chars": 1802,
"preview": "package config\n\nimport (\n\t\"encoding/base64\"\n\t\"strings\"\n)\n\nconst (\n\tAPITag = \"API\"\n\tAuthorizationTag = \"Authori"
},
{
"path": "config/api_test.go",
"chars": 460,
"preview": "package config\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc TestConvertAuthSecret(t *testing.T) {"
},
{
"path": "config/autoconf.go",
"chars": 10357,
"preview": "package config\n\nimport (\n\t\"maps\"\n\t\"math/rand/v2\"\n\t\"strings\"\n\n\t\"github.com/ipfs/boxo/autoconf\"\n\tlogging \"github.com/ipfs/"
},
{
"path": "config/autoconf_client.go",
"chars": 4331,
"preview": "package config\n\nimport (\n\t\"fmt\"\n\t\"path/filepath\"\n\t\"slices\"\n\t\"sync\"\n\n\t\"github.com/ipfs/boxo/autoconf\"\n\tlogging \"github.co"
},
{
"path": "config/autoconf_test.go",
"chars": 2723,
"preview": "package config\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nfun"
},
{
"path": "config/autonat.go",
"chars": 2579,
"preview": "package config\n\nimport (\n\t\"fmt\"\n)\n\n// AutoNATServiceMode configures the ipfs node's AutoNAT service.\ntype AutoNATService"
},
{
"path": "config/autotls.go",
"chars": 2411,
"preview": "package config\n\nimport (\n\t\"time\"\n\n\tp2pforge \"github.com/ipshipyard/p2p-forge/client\"\n)\n\n// AutoTLS includes optional con"
},
{
"path": "config/bitswap.go",
"chars": 513,
"preview": "package config\n\n// Bitswap holds Bitswap configuration options\ntype Bitswap struct {\n\t// Libp2pEnabled controls if the n"
},
{
"path": "config/bootstrap_peers.go",
"chars": 1256,
"preview": "package config\n\nimport (\n\t\"errors\"\n\n\tpeer \"github.com/libp2p/go-libp2p/core/peer\"\n\tma \"github.com/multiformats/go-multia"
},
{
"path": "config/bootstrap_peers_test.go",
"chars": 922,
"preview": "package config\n\nimport (\n\t\"testing\"\n\n\t\"github.com/ipfs/boxo/autoconf\"\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com"
},
{
"path": "config/config.go",
"chars": 7169,
"preview": "// package config implements the ipfs config file datastructures and utilities.\npackage config\n\nimport (\n\t\"bytes\"\n\t\"enco"
},
{
"path": "config/config_test.go",
"chars": 4436,
"preview": "package config\n\nimport (\n\t\"testing\"\n)\n\nfunc TestClone(t *testing.T) {\n\tc := new(Config)\n\tc.Identity.PeerID = \"faketest\"\n"
},
{
"path": "config/datastore.go",
"chars": 1541,
"preview": "package config\n\nimport (\n\t\"encoding/json\"\n)\n\nconst (\n\t// DefaultDataStoreDirectory is the directory to store all the loc"
},
{
"path": "config/discovery.go",
"chars": 89,
"preview": "package config\n\ntype Discovery struct {\n\tMDNS MDNS\n}\n\ntype MDNS struct {\n\tEnabled bool\n}\n"
},
{
"path": "config/dns.go",
"chars": 731,
"preview": "package config\n\n// DNS specifies DNS resolution rules using custom resolvers.\ntype DNS struct {\n\t// Resolvers is a map o"
},
{
"path": "config/experiments.go",
"chars": 698,
"preview": "package config\n\ntype Experiments struct {\n\tFilestoreEnabled bool\n\tUrlstoreEnabled bool\n\tShard"
},
{
"path": "config/gateway.go",
"chars": 5857,
"preview": "package config\n\nimport (\n\t\"github.com/ipfs/boxo/gateway\"\n)\n\nconst (\n\tDefaultInlineDNSLink = false\n\tDefaultDeseri"
},
{
"path": "config/http_retrieval.go",
"chars": 875,
"preview": "package config\n\n// HTTPRetrieval is the configuration object for HTTP Retrieval settings.\n// Implicit defaults can be fo"
},
{
"path": "config/identity.go",
"chars": 728,
"preview": "package config\n\nimport (\n\t\"encoding/base64\"\n\n\tic \"github.com/libp2p/go-libp2p/core/crypto\"\n)\n\nconst (\n\tIdentityTag ="
},
{
"path": "config/import.go",
"chars": 9126,
"preview": "package config\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"strconv\"\n\t\"strings\"\n\n\tchunk \"github.com/ipfs/boxo/chunker\"\n\t\"github.com/ipfs/box"
},
{
"path": "config/import_test.go",
"chars": 16420,
"preview": "package config\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/ipfs/boxo/ipld/unixfs/io\"\n\tmh \"github.com/multiformats/go-m"
},
{
"path": "config/init.go",
"chars": 6921,
"preview": "package config\n\nimport (\n\t\"crypto/rand\"\n\t\"encoding/base64\"\n\t\"fmt\"\n\t\"io\"\n\t\"time\"\n\n\t\"github.com/cockroachdb/pebble/v2\"\n\t\"g"
},
{
"path": "config/init_test.go",
"chars": 1130,
"preview": "package config\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/ipfs/kubo/core/coreiface/options\"\n\tcrypto_pb \"github.com/libp"
},
{
"path": "config/internal.go",
"chars": 4086,
"preview": "package config\n\nconst (\n\t// DefaultMFSNoFlushLimit is the default limit for consecutive unflushed MFS operations\n\tDefaul"
},
{
"path": "config/ipns.go",
"chars": 510,
"preview": "package config\n\nimport (\n\t\"math\"\n\t\"time\"\n)\n\nconst (\n\tDefaultIpnsMaxCacheTTL = time.Duration(math.MaxInt64)\n)\n\ntype Ipns "
},
{
"path": "config/migration.go",
"chars": 967,
"preview": "package config\n\nconst DefaultMigrationKeep = \"cache\"\n\n// DefaultMigrationDownloadSources defines the default download so"
},
{
"path": "config/migration_test.go",
"chars": 659,
"preview": "package config\n\nimport (\n\t\"encoding/json\"\n\t\"testing\"\n)\n\nfunc TestMigrationDecode(t *testing.T) {\n\tstr := `\n\t\t{\n\t\t\t\"Downl"
},
{
"path": "config/mounts.go",
"chars": 173,
"preview": "package config\n\n// Mounts stores the (string) mount points.\ntype Mounts struct {\n\tIPFS string\n\tIPNS "
},
{
"path": "config/peering.go",
"chars": 215,
"preview": "package config\n\nimport \"github.com/libp2p/go-libp2p/core/peer\"\n\n// Peering configures the peering service.\ntype Peering "
},
{
"path": "config/plugins.go",
"chars": 214,
"preview": "package config\n\ntype Plugins struct {\n\tPlugins map[string]Plugin\n\t// TODO: Loader Path? Leaving that out for now due to "
},
{
"path": "config/profile.go",
"chars": 15352,
"preview": "package config\n\nimport (\n\t\"fmt\"\n\t\"net\"\n\t\"time\"\n)\n\n// Transformer is a function which takes configuration and applies som"
},
{
"path": "config/provide.go",
"chars": 7711,
"preview": "package config\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/libp2p/go-libp2p-kad-dht/amino\"\n)\n\nconst (\n\tDefaultProv"
},
{
"path": "config/provide_test.go",
"chars": 6446,
"preview": "package config\n\nimport (\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require"
},
{
"path": "config/provider.go",
"chars": 703,
"preview": "package config\n\n// Provider configuration describes how NEW CIDs are announced the moment they are created.\n// For perio"
},
{
"path": "config/pubsub.go",
"chars": 1595,
"preview": "package config\n\nconst (\n\t// LastSeenMessagesStrategy is a strategy that calculates the TTL countdown\n\t// based on the la"
},
{
"path": "config/remotepin.go",
"chars": 835,
"preview": "package config\n\nvar (\n\tRemoteServicesPath = \"Pinning.RemoteServices\"\n\tPinningConcealSelector = []string{\"Pinning\", \""
},
{
"path": "config/reprovider.go",
"chars": 621,
"preview": "package config\n\n// Reprovider configuration describes how CID from local datastore are periodically re-announced to rout"
},
{
"path": "config/routing.go",
"chars": 7953,
"preview": "package config\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"os\"\n\t\"runtime\"\n\t\"slices\"\n\t\"strings\"\n)\n\nconst (\n\tDefaultAcceleratedDHT"
},
{
"path": "config/routing_test.go",
"chars": 3047,
"preview": "package config\n\nimport (\n\t\"encoding/json\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc TestRouterP"
},
{
"path": "config/serialize/serialize.go",
"chars": 1541,
"preview": "package fsrepo\n\nimport (\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"path/filepath\"\n\n\t\"github.com/ipfs/kubo/config\"\n"
},
{
"path": "config/serialize/serialize_test.go",
"chars": 772,
"preview": "package fsrepo\n\nimport (\n\t\"os\"\n\t\"runtime\"\n\t\"testing\"\n\n\tconfig \"github.com/ipfs/kubo/config\"\n)\n\nfunc TestConfig(t *testin"
},
{
"path": "config/swarm.go",
"chars": 5147,
"preview": "package config\n\ntype SwarmConfig struct {\n\t// AddrFilters specifies a set libp2p addresses that we should never\n\t// dial"
},
{
"path": "config/types.go",
"chars": 13889,
"preview": "package config\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\t\"strings\"\n\t\"time\"\n\n\thumanize \"github.com/dustin/go-huma"
},
{
"path": "config/types_test.go",
"chars": 16702,
"preview": "package config\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.co"
},
{
"path": "config/version.go",
"chars": 529,
"preview": "package config\n\nconst DefaultSwarmCheckPercentThreshold = 5\n\n// Version allows controlling things like custom user agent"
},
{
"path": "core/.gitignore",
"chars": 8,
"preview": ".testdb\n"
},
{
"path": "core/builder.go",
"chars": 5471,
"preview": "package core\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/ipfs/boxo/bootstrap\"\n\t\"github.com/ipfs"
},
{
"path": "core/commands/active.go",
"chars": 2757,
"preview": "package commands\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"slices\"\n\t\"text/tabwriter\"\n\t\"time\"\n\n\toldcmds \"github.com/ipfs/kubo/commands\"\n\n\t"
},
{
"path": "core/commands/add.go",
"chars": 29024,
"preview": "package commands\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\tgopath \"path\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"github.com/ipfs/kubo/con"
},
{
"path": "core/commands/bitswap.go",
"chars": 5806,
"preview": "package commands\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\n\tcmdenv \"github.com/ipfs/kubo/core/commands/cmdenv\"\n\n\thumanize \"github.com/dust"
},
{
"path": "core/commands/block.go",
"chars": 8748,
"preview": "package commands\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\n\t\"github.com/ipfs/boxo/files\"\n\n\t\"github.com/ipfs/kubo/config\"\n\t"
},
{
"path": "core/commands/bootstrap.go",
"chars": 11446,
"preview": "package commands\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"slices\"\n\t\"strings\"\n\n\tcmds \"github.com/ipfs/go-ipfs-cmds\"\n\tconfig \"gi"
},
{
"path": "core/commands/cat.go",
"chars": 4379,
"preview": "package commands\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"io\"\n\t\"os\"\n\n\t\"github.com/ipfs/kubo/core/commands/cmdenv\"\n\t\"github.com/i"
},
{
"path": "core/commands/cid.go",
"chars": 16919,
"preview": "package commands\n\nimport (\n\t\"cmp\"\n\t\"encoding/hex\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"slices\"\n\t\"strings\"\n\t\"unicode\"\n\n\tverifcid \"git"
},
{
"path": "core/commands/cid_test.go",
"chars": 2918,
"preview": "package commands\n\nimport (\n\t\"testing\"\n\n\tcmds \"github.com/ipfs/go-ipfs-cmds\"\n\t\"github.com/multiformats/go-multibase\"\n)\n\nf"
},
{
"path": "core/commands/cmdenv/cidbase.go",
"chars": 3293,
"preview": "package cmdenv\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\n\tcid \"github.com/ipfs/go-cid\"\n\tcidenc \"github.com/ipfs/go-cidutil/cidenc\"\n\tc"
},
{
"path": "core/commands/cmdenv/cidbase_test.go",
"chars": 1574,
"preview": "package cmdenv\n\nimport (\n\t\"testing\"\n\n\tcidenc \"github.com/ipfs/go-cidutil/cidenc\"\n\tmbase \"github.com/multiformats/go-mult"
},
{
"path": "core/commands/cmdenv/env.go",
"chars": 6529,
"preview": "package cmdenv\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"github.com/ipfs/go-cid\"\n\tcmds \"github.com/ipfs/go-ip"
},
{
"path": "core/commands/cmdenv/env_test.go",
"chars": 897,
"preview": "package cmdenv\n\nimport (\n\t\"strconv\"\n\t\"testing\"\n)\n\nfunc TestEscNonPrint(t *testing.T) {\n\tb := []byte(\"hello\")\n\tb[2] = 0x7"
},
{
"path": "core/commands/cmdenv/file.go",
"chars": 443,
"preview": "package cmdenv\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/ipfs/boxo/files\"\n)\n\n// GetFileArg returns the next file from the directory"
},
{
"path": "core/commands/cmdutils/sanitize.go",
"chars": 1482,
"preview": "package cmdutils\n\nimport (\n\t\"strings\"\n\t\"unicode\"\n)\n\nconst maxRunes = 128\n\n// CleanAndTrim sanitizes untrusted strings fr"
},
{
"path": "core/commands/cmdutils/utils.go",
"chars": 3025,
"preview": "package cmdutils\n\nimport (\n\t\"fmt\"\n\t\"slices\"\n\n\tcmds \"github.com/ipfs/go-ipfs-cmds\"\n\n\t\"github.com/ipfs/boxo/path\"\n\t\"github"
},
{
"path": "core/commands/cmdutils/utils_test.go",
"chars": 3456,
"preview": "package cmdutils\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/re"
},
{
"path": "core/commands/commands.go",
"chars": 6838,
"preview": "// Package commands implements the ipfs command interface\n//\n// Using github.com/ipfs/kubo/commands to define the comman"
},
{
"path": "core/commands/commands_test.go",
"chars": 4610,
"preview": "package commands\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\tcmds \"github.com/ipfs/go-ipfs-cmds\"\n)\n\nfunc collectPaths(prefix strin"
},
{
"path": "core/commands/completion.go",
"chars": 6388,
"preview": "package commands\n\nimport (\n\t\"io\"\n\t\"slices\"\n\t\"strings\"\n\t\"text/template\"\n\n\tcmds \"github.com/ipfs/go-ipfs-cmds\"\n)\n\ntype com"
},
{
"path": "core/commands/config.go",
"chars": 17783,
"preview": "package commands\n\nimport (\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"maps\"\n\t\"os\"\n\t\"os/exec\"\n\t\"slices\"\n\t\"strings\"\n\n\t\"gith"
},
{
"path": "core/commands/config_test.go",
"chars": 3129,
"preview": "package commands\n\nimport \"testing\"\n\nfunc TestScrubMapInternalDelete(t *testing.T) {\n\tm, err := scrubMapInternal(nil, nil"
},
{
"path": "core/commands/dag/dag.go",
"chars": 13007,
"preview": "package dagcmd\n\nimport (\n\t\"encoding/csv\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\t\"path\"\n\n\t\"github.com/dustin/go-humanize\"\n\t\"githu"
},
{
"path": "core/commands/dag/export.go",
"chars": 4810,
"preview": "package dagcmd\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"time\"\n\n\t\"github.com/cheggaaa/pb\"\n\tcid \"github.com/ipf"
},
{
"path": "core/commands/dag/get.go",
"chars": 1616,
"preview": "package dagcmd\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\n\t\"github.com/ipfs/boxo/path\"\n\tipldlegacy \"github.com/ipfs/go-ipld-legacy\"\n\t\"githu"
},
{
"path": "core/commands/dag/import.go",
"chars": 6832,
"preview": "package dagcmd\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\n\t\"github.com/ipfs/boxo/files\"\n\tblocks \"github.com/ipfs/go-block-format\""
},
{
"path": "core/commands/dag/put.go",
"chars": 3089,
"preview": "package dagcmd\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\n\tblocks \"github.com/ipfs/go-block-format\"\n\t\"github.com/ipfs/go-cid\"\n\tipldlegac"
},
{
"path": "core/commands/dag/resolve.go",
"chars": 646,
"preview": "package dagcmd\n\nimport (\n\t\"github.com/ipfs/boxo/path\"\n\t\"github.com/ipfs/kubo/core/commands/cmdenv\"\n\t\"github.com/ipfs/kub"
},
{
"path": "core/commands/dag/stat.go",
"chars": 3735,
"preview": "package dagcmd\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\n\t\"github.com/dustin/go-humanize\"\n\tmdag \"github.com/ipfs/boxo/ipld/merkledag"
},
{
"path": "core/commands/dht.go",
"chars": 3322,
"preview": "package commands\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\n\tcmds \"github.com/ipfs/go-ipfs-cmds\"\n\t\"github.com/ipfs/kub"
},
{
"path": "core/commands/dht_test.go",
"chars": 608,
"preview": "package commands\n\nimport (\n\t\"testing\"\n\n\t\"github.com/ipfs/boxo/namesys\"\n\n\tipns \"github.com/ipfs/boxo/ipns\"\n\t\"github.com/l"
},
{
"path": "core/commands/diag.go",
"chars": 7436,
"preview": "package commands\n\nimport (\n\t\"encoding/hex\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\n\t\"github.com/ipfs/go-datastore\"\n\t\"github.com/ipfs/go-"
},
{
"path": "core/commands/e/error.go",
"chars": 720,
"preview": "package e\n\nimport (\n\t\"fmt\"\n\t\"runtime/debug\"\n)\n\n// TypeErr returns an error with a string that explains what error was ex"
},
{
"path": "core/commands/external.go",
"chars": 1663,
"preview": "package commands\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"os/exec\"\n\t\"strings\"\n\n\tcmds \"github.com/ipfs/go-ipfs-cmds\"\n)\n\nfu"
},
{
"path": "core/commands/extra.go",
"chars": 1638,
"preview": "package commands\n\nimport (\n\tcmds \"github.com/ipfs/go-ipfs-cmds\"\n)\n\nfunc CreateCmdExtras(opts ...func(e *cmds.Extra)) *cm"
},
{
"path": "core/commands/files.go",
"chars": 49524,
"preview": "package commands\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\tgopath \"path\"\n\t\"slices\"\n\t\"strconv\"\n"
},
{
"path": "core/commands/files_test.go",
"chars": 984,
"preview": "package commands\n\nimport (\n\t\"io\"\n\t\"testing\"\n\n\tdag \"github.com/ipfs/boxo/ipld/merkledag\"\n\tcmds \"github.com/ipfs/go-ipfs-c"
},
{
"path": "core/commands/filestore.go",
"chars": 7247,
"preview": "package commands\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\n\tfilestore \"github.com/ipfs/boxo/filestore\"\n\tcmds \"github.com/"
},
{
"path": "core/commands/get.go",
"chars": 9645,
"preview": "package commands\n\nimport (\n\tgotar \"archive/tar\"\n\t\"bufio\"\n\t\"compress/gzip\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\tgopath \"path\"\n\t\""
},
{
"path": "core/commands/get_test.go",
"chars": 1460,
"preview": "package commands\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n\n\tcmds \"github.com/ipfs/go-ipfs-cmds\"\n)\n\nfunc TestGetOutputPath(t *testing."
},
{
"path": "core/commands/helptext_test.go",
"chars": 1104,
"preview": "package commands\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\tcmds \"github.com/ipfs/go-ipfs-cmds\"\n)\n\nfunc checkHelptextRecursive(t "
},
{
"path": "core/commands/id.go",
"chars": 5970,
"preview": "package commands\n\nimport (\n\t\"encoding/base64\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"slices\"\n\t\"strings\"\n\n\tversion \"gi"
},
{
"path": "core/commands/keyencode/keyencode.go",
"chars": 992,
"preview": "package keyencode\n\nimport (\n\tcmds \"github.com/ipfs/go-ipfs-cmds\"\n\tpeer \"github.com/libp2p/go-libp2p/core/peer\"\n\tmbase \"g"
},
{
"path": "core/commands/keystore.go",
"chars": 23901,
"preview": "package commands\n\nimport (\n\t\"bytes\"\n\t\"crypto/ed25519\"\n\t\"crypto/x509\"\n\t\"encoding/pem\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"path"
},
{
"path": "core/commands/log.go",
"chars": 9310,
"preview": "package commands\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"slices\"\n\n\tcmds \"github.com/ipfs/go-ipfs-cmds\"\n\tlogging \"github.com/ipfs/go-log"
},
{
"path": "core/commands/ls.go",
"chars": 11869,
"preview": "package commands\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"slices\"\n\t\"strings\"\n\t\"text/tabwriter\"\n\t\"time\"\n\n\tcmdenv \"github"
},
{
"path": "core/commands/ls_test.go",
"chars": 4770,
"preview": "package commands\n\nimport (\n\t\"os\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc TestFormatMode(t *tes"
},
{
"path": "core/commands/mount_nofuse.go",
"chars": 595,
"preview": "//go:build !windows && nofuse\n\npackage commands\n\nimport (\n\tcmds \"github.com/ipfs/go-ipfs-cmds\"\n)\n\nvar MountCmd = &cmds.C"
},
{
"path": "core/commands/mount_unix.go",
"chars": 3836,
"preview": "//go:build !windows && !nofuse\n\npackage commands\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\n\toldcmds \"github.com/ipfs/kubo/commands\"\n\tcmden"
},
{
"path": "core/commands/mount_windows.go",
"chars": 407,
"preview": "package commands\n\nimport (\n\t\"errors\"\n\n\tcmds \"github.com/ipfs/go-ipfs-cmds\"\n)\n\nvar MountCmd = &cmds.Command{\n\tHelptext: c"
},
{
"path": "core/commands/multibase.go",
"chars": 4564,
"preview": "package commands\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"io\"\n\t\"strings\"\n\n\tcmds \"github.com/ipfs/go-ipfs-cmds\"\n\t\"github.com/ipfs/kubo"
},
{
"path": "core/commands/name/ipns.go",
"chars": 4655,
"preview": "package name\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/ipfs/boxo/namesys\"\n\t\"github.com/ipfs/boxo"
},
{
"path": "core/commands/name/ipnsps.go",
"chars": 4180,
"preview": "package name\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"strings\"\n\n\tcmds \"github.com/ipfs/go-ipfs-cmds\"\n\t\"github.com/ipfs/kubo/core/command"
},
{
"path": "core/commands/name/name.go",
"chars": 17149,
"preview": "package name\n\nimport (\n\t\"bytes\"\n\t\"encoding/hex\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"strings\"\n\t\"text/tabwriter\"\n\t\"time\"\n\n\t\"github.co"
},
{
"path": "core/commands/name/publish.go",
"chars": 7452,
"preview": "package name\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"time\"\n\n\tcmdenv \"github.com/ipfs/kubo/core/commands/cmdenv\"\n\t\"github.com/"
}
]
// ... and 721 more files (download for full content)
About this extraction
This page contains the full source code of the ipfs/kubo GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 921 files (5.7 MB), approximately 1.5M tokens, and a symbol index with 3560 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.