mirror of
https://github.com/ipfs/kubo.git
synced 2026-02-21 10:27:46 +08:00
Merge branch 'master' into ci-build-docker-with-plugins
This commit is contained in:
commit
499b596efa
@ -37,10 +37,8 @@ executors:
|
||||
working_directory: ~/ipfs/go-ipfs
|
||||
environment:
|
||||
<<: *default_environment
|
||||
GO111MODULE: "on"
|
||||
TEST_NO_DOCKER: 1
|
||||
TEST_NO_FUSE: 1
|
||||
GOPATH: /home/circleci/go
|
||||
TEST_VERBOSE: 1
|
||||
node:
|
||||
docker:
|
||||
@ -123,10 +121,8 @@ jobs:
|
||||
working_directory: ~/ipfs/go-ipfs
|
||||
environment:
|
||||
<<: *default_environment
|
||||
GO111MODULE: "on"
|
||||
TEST_NO_DOCKER: 1
|
||||
TEST_NO_FUSE: 1
|
||||
GOPATH: /home/circleci/go
|
||||
TEST_VERBOSE: 1
|
||||
steps:
|
||||
- run: sudo apt update
|
||||
@ -151,10 +147,10 @@ jobs:
|
||||
- run:
|
||||
name: Setup Environment Variables
|
||||
# we need the docker host IP; all ports exported by child containers can be accessed there.
|
||||
command: echo "export DOCKER_HOST=$(ip -4 addr show docker0 | grep -Po 'inet \K[\d.]+')" >> $BASH_ENV
|
||||
command: echo "export TEST_DOCKER_HOST=$(ip -4 addr show docker0 | grep -Po 'inet \K[\d.]+')" >> $BASH_ENV
|
||||
- run:
|
||||
echo DOCKER_HOST=$DOCKER_HOST &&
|
||||
make -O -j 3 coverage/sharness_tests.coverprofile test/sharness/test-results/sharness.xml TEST_GENERATE_JUNIT=1 CONTINUE_ON_S_FAILURE=1 DOCKER_HOST=$DOCKER_HOST
|
||||
echo TEST_DOCKER_HOST=$TEST_DOCKER_HOST &&
|
||||
make -O -j 3 coverage/sharness_tests.coverprofile test/sharness/test-results/sharness.xml TEST_GENERATE_JUNIT=1 CONTINUE_ON_S_FAILURE=1 TEST_DOCKER_HOST=$TEST_DOCKER_HOST
|
||||
|
||||
- run:
|
||||
when: always
|
||||
|
||||
23
.github/ISSUE_TEMPLATE/bug-report.md
vendored
23
.github/ISSUE_TEMPLATE/bug-report.md
vendored
@ -1,23 +0,0 @@
|
||||
---
|
||||
name: 'Bug Report'
|
||||
about: 'Report a bug in go-ipfs.'
|
||||
labels: kind/bug, need/triage
|
||||
---
|
||||
|
||||
<!-- Please report security issues by email to security@ipfs.io -->
|
||||
|
||||
#### Version information:
|
||||
<!-- Output From `ipfs version --all`
|
||||
|
||||
Please check dist.ipfs.io for a newer version of go-ipfs and update if necessary. Report back if the problem persists.
|
||||
|
||||
If you can't run `ipfs version --all` or that command fails, include as much information as you can: IPFS version, computer architecture (e.g., Intel x86 64bit), operating system, etc. -->
|
||||
|
||||
#### 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.
|
||||
-->
|
||||
62
.github/ISSUE_TEMPLATE/bug-report.yml
vendored
Normal file
62
.github/ISSUE_TEMPLATE/bug-report.yml
vendored
Normal file
@ -0,0 +1,62 @@
|
||||
name: Bug Report
|
||||
description: Report a bug in go-ipfs.
|
||||
labels:
|
||||
- kind/bug
|
||||
- need/triage
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
- Make sure you are running the [latest version of go-ipfs][releases] before reporting an issue.
|
||||
- If you have an enhancement or feature request for go-ipfs, please select [a different option][issues].
|
||||
- Please report possible security issues by email to security@ipfs.io
|
||||
|
||||
[issues]: https://github.com/ipfs/go-ipfs/issues/new/choose
|
||||
[releases]: https://github.com/ipfs/go-ipfs/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.io](https://discuss.ipfs.io).
|
||||
required: true
|
||||
- label: I have searched on the [issue tracker](https://github.com/ipfs/go-ipfs/issues?q=is%3Aissue) for my bug.
|
||||
required: true
|
||||
- label: I am running the latest [go-ipfs version](https://dist.ipfs.io/#go-ipfs) 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:
|
||||
- ipfs-desktop
|
||||
- ipfs-update or dist.ipfs.io
|
||||
- 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.
|
||||
14
.github/ISSUE_TEMPLATE/doc.md
vendored
14
.github/ISSUE_TEMPLATE/doc.md
vendored
@ -1,14 +0,0 @@
|
||||
---
|
||||
name: 'Documentation Issue'
|
||||
about: 'Report missing, erroneous docs, broken links or propose new go-ipfs docs'
|
||||
labels: topic/docs-ipfs, need/triage
|
||||
---
|
||||
<!-- Problems with documentation on https://docs.ipfs.io should be reported to https://github.com/ipfs/ipfs-docs -->
|
||||
|
||||
#### Location
|
||||
|
||||
<!-- In the case of missing/erroneous documentation, where is the error? If possible, a link/URL would be great! -->
|
||||
|
||||
#### Description
|
||||
|
||||
<!-- Describe the documentation issue. -->
|
||||
29
.github/ISSUE_TEMPLATE/doc.yml
vendored
Normal file
29
.github/ISSUE_TEMPLATE/doc.yml
vendored
Normal file
@ -0,0 +1,29 @@
|
||||
name: Documentation Issue
|
||||
description: Report missing, erroneous docs, broken links or propose new go-ipfs docs.
|
||||
labels:
|
||||
- topic/docs-ipfs
|
||||
- need/triage
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
Problems with documentation on https://docs.ipfs.io 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.io.
|
||||
required: true
|
||||
- label: I have searched on the [issue tracker](https://github.com/ipfs/go-ipfs/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.
|
||||
11
.github/ISSUE_TEMPLATE/enhancement.md
vendored
11
.github/ISSUE_TEMPLATE/enhancement.md
vendored
@ -1,11 +0,0 @@
|
||||
---
|
||||
name: 'Enhancement'
|
||||
about: 'Suggest an improvement to an existing go-ipfs feature.'
|
||||
labels: kind/enhancement
|
||||
---
|
||||
|
||||
<!--
|
||||
Note: If you'd like to suggest an idea related to IPFS but not specifically related to the Go implementation, please post in https://discuss.ipfs.io instead.
|
||||
|
||||
When requesting an _enhancement_, please be sure to include your motivation and try to be as specific as possible.
|
||||
-->
|
||||
33
.github/ISSUE_TEMPLATE/enhancement.yml
vendored
Normal file
33
.github/ISSUE_TEMPLATE/enhancement.yml
vendored
Normal file
@ -0,0 +1,33 @@
|
||||
name: Enhancement
|
||||
description: Suggest an improvement to an existing go-ipfs feature.
|
||||
labels:
|
||||
- kind/enhancement
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
Suggest an enhancement to go-ipfs (the program). If you'd like to suggest an improvement to the IPFS protocol, please discuss it on [the forum](https://discuss.ipfs.io).
|
||||
|
||||
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.io).
|
||||
|
||||
**Example:**
|
||||
|
||||
> Reduce memory usage of `ipfs cat` (specific) by buffering less in ... (actionable). This would let me run go-ipfs 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/go-ipfs/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.
|
||||
15
.github/ISSUE_TEMPLATE/feature.md
vendored
15
.github/ISSUE_TEMPLATE/feature.md
vendored
@ -1,15 +0,0 @@
|
||||
---
|
||||
name: 'Feature'
|
||||
about: 'Suggest a new feature in go-ipfs.'
|
||||
labels: kind/feature, need/triage
|
||||
---
|
||||
|
||||
<!--
|
||||
Note: If you'd like to suggest an idea related to IPFS but not specifically related to the Go implementation, please post in https://discuss.ipfs.io instead.
|
||||
|
||||
When requesting a _feature_, please be sure to include:
|
||||
* Your motivation. Why do you need the feature?
|
||||
* How the feature should work.
|
||||
|
||||
Please try to be as specific and concrete as possible.
|
||||
-->
|
||||
34
.github/ISSUE_TEMPLATE/feature.yml
vendored
Normal file
34
.github/ISSUE_TEMPLATE/feature.yml
vendored
Normal file
@ -0,0 +1,34 @@
|
||||
name: Feature
|
||||
description: Suggest a new feature in go-ipfs.
|
||||
labels:
|
||||
- kind/feature
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
Suggest a new feature in go-ipfs (the program). If you'd like to suggest an improvement to the IPFS protocol, please discuss it on [the forum](https://discuss.ipfs.io).
|
||||
|
||||
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.io).
|
||||
|
||||
**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/go-ipfs/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.
|
||||
771
CHANGELOG.md
771
CHANGELOG.md
@ -1,5 +1,776 @@
|
||||
# go-ipfs changelog
|
||||
|
||||
## v0.9.1 2021-07-20
|
||||
|
||||
This is a small bug fix release resolving the following issues:
|
||||
1. A regression where the empty CID bafkqaaa could not resolve on gateways [#8230](https://github.com/ipfs/go-ipfs/issues/8230)
|
||||
2. A panic on OpenBSD [#8211](https://github.com/ipfs/go-ipfs/issues/8211)
|
||||
3. High CPU usage with QUIC [#8256](https://github.com/ipfs/go-ipfs/issues/8256)
|
||||
4. High memory usage with TCP [#8219](https://github.com/ipfs/go-ipfs/issues/8219)
|
||||
5. Some pubsub issues ([libp2p/go-libp2p-pubsub#427](https://github.com/libp2p/go-libp2p-pubsub/pull/427), [libp2p/go-libp2p-pubsub#430](https://github.com/libp2p/go-libp2p-pubsub/pull/430))
|
||||
6. Updated WebUI to [v2.12.4](https://github.com/ipfs/ipfs-webui/releases/tag/v2.12.4)
|
||||
7. Fixed the snap deployment [#8212](https://github.com/ipfs/go-ipfs/pull/8212)
|
||||
|
||||
### Changelog
|
||||
|
||||
- github.com/ipfs/go-ipfs:
|
||||
- chore: update deps
|
||||
- feat: webui v2.12.4
|
||||
- test: gateway response for bafkqaaa
|
||||
- fix: downgrade mimetype dependency
|
||||
- update go-libp2p to v0.14.3
|
||||
- bump snap to build with Go 1.16
|
||||
- github.com/libp2p/go-libp2p (v0.14.2 -> v0.14.3):
|
||||
- update go-tcp-transport to v0.2.3 and go-multiaddr to v0.3.3 ([libp2p/go-libp2p#1121](https://github.com/libp2p/go-libp2p/pull/1121))
|
||||
- github.com/libp2p/go-libp2p-pubsub (v0.4.1 -> v0.4.2):
|
||||
- release priority locks early when handling batches
|
||||
- don't respawn writer if we fail to open a stream; declare it a peer error
|
||||
- batch process dead peer notifications
|
||||
- use a priority lock instead of a semaphore
|
||||
- do the notification in a goroutine
|
||||
- emit new peer notification without holding the semaphore
|
||||
- use a semaphore for new peer notifications so that we don't block the event loop
|
||||
- don't accumulate pending goroutines from new connections
|
||||
- Make close concurrent safe
|
||||
- Fix close of closed channel
|
||||
- github.com/libp2p/go-libp2p-quic-transport (v0.11.1 -> v0.11.2):
|
||||
- update quic-go to v0.21.2
|
||||
- github.com/libp2p/go-tcp-transport (v0.2.2 -> v0.2.4):
|
||||
- collect metrics in a separate go routine ([libp2p/go-tcp-transport#82](https://github.com/libp2p/go-tcp-transport/pull/82))
|
||||
- fix: avoid logging "invalid argument" errors when setting keepalive ([libp2p/go-tcp-transport#83](https://github.com/libp2p/go-tcp-transport/pull/83))
|
||||
- Skip SetKeepAlivePeriod call on OpenBSD ([libp2p/go-tcp-transport#80](https://github.com/libp2p/go-tcp-transport/pull/80))
|
||||
- sync: update CI config files (#79) ([libp2p/go-tcp-transport#79](https://github.com/libp2p/go-tcp-transport/pull/79))
|
||||
- github.com/lucas-clemente/quic-go (v0.21.1 -> v0.21.2):
|
||||
- update qtls to include the crypto/tls fix of Go 1.16.6 / 1.15.14
|
||||
- cancel the PTO timer when all Handshake packets are acknowledged
|
||||
- update to Go 1.17rc1
|
||||
- update Ginkgo to v1.16.4 and Gomega to v1.13.0 ([lucas-clemente/quic-go#3139](https://github.com/lucas-clemente/quic-go/pull/3139))
|
||||
- github.com/multiformats/go-multiaddr (v0.3.2 -> v0.3.3):
|
||||
- guard against nil {Local,Remote}Addr() return values ([multiformats/go-multiaddr#155](https://github.com/multiformats/go-multiaddr/pull/155))
|
||||
- sync: update CI config files (#154) ([multiformats/go-multiaddr#154](https://github.com/multiformats/go-multiaddr/pull/154))
|
||||
|
||||
### Contributors
|
||||
|
||||
| Contributor | Commits | Lines ± | Files Changed |
|
||||
|-------------|---------|---------|---------------|
|
||||
| vyzo | 8 | +205/-141 | 12 |
|
||||
| Marten Seemann | 7 | +127/-74 | 11 |
|
||||
| gammazero | 2 | +43/-5 | 3 |
|
||||
| Steven Allen | 1 | +13/-2 | 1 |
|
||||
| Adin Schmahmann | 3 | +13/-2 | 3 |
|
||||
| Marcin Rataj | 2 | +9/-1 | 2 |
|
||||
| Aaron Bieber | 1 | +6/-2 | 1 |
|
||||
|
||||
## v0.9.0 2021-06-22
|
||||
|
||||
We're happy to announce go-ipfs 0.9.0. This release makes go-ipfs even more configurable with some fun experiments to boot. We're also deprecating or removing some uncommonly used features to make it easier for users to discover the easy ways to use go-ipfs safely and efficiently.
|
||||
|
||||
As usual, this release includes important fixes, some of which may be critical for security. Unless the fix addresses a bug being exploited in the wild, the fix will _not_ be called out in the release notes. Please make sure to update ASAP. See our [release process](https://github.com/ipfs/go-ipfs/tree/master/docs/releases.md#security-fix-policy) for details.
|
||||
|
||||
### 🔦 Highlights
|
||||
|
||||
#### 📦 Exporting of DAGs via Gateways
|
||||
|
||||
Gateways now support downloading arbitrary IPLD graphs via the `/api/v0/dag/export` endpoint. This endpoint works in the same way as the `ipfs dag export` command.
|
||||
|
||||
One major thing this enables is ability to verify data downloaded from public gateways. If you go to `https://somegateway.example.net/ipfs/bafyexample` you are using the old school HTTP transport, and trusting that the gateway is being well behaved. However, if you download the graph as a [DAG archive](https://github.com/ipld/specs/blob/master/block-layer/content-addressable-archives.md) then it is possible to verify that the data you downloaded does in fact match `bafyexample`.
|
||||
|
||||
Additionally, it was previously quite painful to download things other than UnixFS (files + directories) using gateways. It is now possible to download arbitrary IPLD graphs from gateways, making them useful as a general-purpose alternative to p2p transports.
|
||||
|
||||
This opens exciting opportunities in areas like thin clients, mobile browsers and IoT devices, which now can delegate IPFS resolution to any public gateway, and have ability to verify that the data received matches the requested hash.
|
||||
|
||||
#### ☁ Custom DNS Resolvers
|
||||
|
||||
Resolution of DNS records for DNSLink and DNSAddrs means that names are sent in cleartext between the operating system and the DNS server provided by an ISP. In the past, the only way to customize DNS resolution in IPFS stack was to set up own DNS proxy server.
|
||||
|
||||
There is now the ability to [customize DNS resolution](https://github.com/ipfs/go-ipfs/blob/master/docs/config.md#dns) and override the default resolver from the OS with [DNS over HTTPS](https://en.wikipedia.org/wiki/DNS_over_HTTPS) (DoH) one. We made it really flexible: override can be applied globally, or per specific [TLD](https://en.wikipedia.org/wiki/Top-level_domain)/[FQDN](https://en.wikipedia.org/wiki/Fully_qualified_domain_name). Examples can be found in the [documentation](https://github.com/ipfs/go-ipfs/blob/master/docs/config.md#dns).
|
||||
|
||||
#### 👪 Support for non-ICANN DNSLink names
|
||||
|
||||
Building off of the support for custom DNS resolvers it is now possible to create DNSLink names not handled by ICANN and choose how that domain name will be resolved. An example of this is how ENS is supported, despite `.eth` not being an ICANN TLD you can point `.eth` to any ENS resolver you want (including a local one).
|
||||
|
||||
While go-ipfs may have some DoH defaults for a few popular non-ICANN DNSLink names (e.g. ENS), you are free to use any protocol for a naming system and as long as it exposes a DNSLink record via a DNS endpoint you can make it work.
|
||||
|
||||
#### 🖥️ Updated to the latest WebUI
|
||||
|
||||
Our web interface now includes experimental support for pinning services, and various updates to _Files_ and _Peers_ screens.
|
||||
|
||||
Remote pinning services added via the `ipfs pin remote service add` command are already detected, one can also add one from _Settings_ screen, and it will appear in _Set pinning_ interface on the _Files_ screen.
|
||||
|
||||
Data presented on the _Peers_ screen can now be copied by simply clicking on a specific cell, and a list of open streams gives better insight into how a local node interacts with a specific peer.
|
||||
|
||||
See release notes for [ipfs-webui v2.12](https://github.com/ipfs/ipfs-webui/releases/tag/v2.12.0) for screenshots and more details.
|
||||
|
||||
#### 🔑 IPNS keys can now be exported via the CLI without stopping the daemon
|
||||
|
||||
`ipfs key export` no longer requires interrupting `ipfs daemon` ✨
|
||||
|
||||
#### 🕸 Experimental DHT Client and Provider System
|
||||
|
||||
An area of go-ipfs that has been historically tricky is how go-ipfs finds who has the data they are looking for. While the IPFS Public DHT is only one of the ways go-ipfs can find data it tends to be an important one. While since go-ipfs v0.5.0 the time to find content in the network has dropped significantly the time to put/get IPNS records or for a node to advertise the content it has still has much room for improvement.
|
||||
|
||||
We have been doing some experimenting and have an alternative DHT client that essentially trades off some resources and in return is much more performant. We have also included with the experimental DHT client a bulk provider system that takes advantage of the new client to more efficiently do many advertisements at a time
|
||||
|
||||
This work is quite new and still under development, however, the results so far have been promising especially for users with lots of data who have otherwise been having difficulty advertising their data into the IPFS Public DHT
|
||||
|
||||
As described in the experimental features [documentation](https://github.com/ipfs/go-ipfs/blob/master/docs/experimental-features.md#accelerated-dht-client) the experimental client can be enabled using the command below (or modifying the config file).
|
||||
|
||||
```
|
||||
ipfs config --json Experimental.AcceleratedDHTClient true
|
||||
```
|
||||
|
||||
A few things to take note of when `AcceleratedDHTClient` is enabled:
|
||||
- go-ipfs will likely use more resources then previously
|
||||
- DHT queries will not be usable (i.e. finding which peers have some data, finding where a particular peer is, etc.) for the first 5-10 minutes of operation depending on your network conditions
|
||||
- There is an `ipfs stats provide` command that will help you track your provide/reprovide usage, if you are providing lots of data you may want to consider how to reduce the amount you are providing (e.g. [Reprovider Strategies](https://github.com/ipfs/go-ipfs/blob/master/docs/config.md#reproviderstrategy) and/or [Strategic Providing](https://github.com/ipfs/go-ipfs/blob/master/docs/experimental-features.md#strategic-providing))
|
||||
|
||||
See the [documentation](https://github.com/ipfs/go-ipfs/blob/master/docs/experimental-features.md#accelerated-dht-client) for more details.
|
||||
|
||||
#### 🚶♀️ Migrations
|
||||
|
||||
##### Migrations are now individually packaged
|
||||
|
||||
While previously the go-ipfs [repo migration](https://github.com/ipfs/fs-repo-migrations) binary was monolithic and contained all migrations from previous go-ipfs versions the binaries are now packaged individually. However, the fs-repo-migrations binary is still there to help those who manually upgrade their repos to download all the individual migrations.
|
||||
|
||||
This means faster download times for upgrades, a much easier time building migrations for those who make use of custom plugins, and an easier time developing new migrations going forward.
|
||||
|
||||
##### Configurable migration downloads enable downloading over IPFS
|
||||
|
||||
Previously the migration downloader built into go-ipfs downloaded the migrations from [dist.ipfs.io](https://dist.ipfs.io). While users could use tools like [ipfs-update](https://github.com/ipfs/ipfs-update) to download the migrations over IPFS or manually download the migrations (over IPFS or otherwise) themselves, this is now automated and configurable. Users can choose to download the migrations over IPFS or from any specified IPFS Gateway.
|
||||
|
||||
The configurable migration options are described in the config file [documentation](https://github.com/ipfs/go-ipfs/blob/master/docs/config.md#migration), although most users should not need to change the default settings.
|
||||
|
||||
The main benefit here is that users behind restrictive firewalls, or in offline/private deployments, won't have to run migrations manually, which is especially important for desktop use cases where go-ipfs is running inside of [IPFS Desktop](https://github.com/ipfs-shipyard/ipfs-desktop#readme) and [Brave](https://brave.com/ipfs-support/).
|
||||
|
||||
#### 🍎 Published builds for Apple M1 hardware
|
||||
|
||||
Go now supports building for Darwin ARM64, and we are now publishing those builds
|
||||
|
||||
#### 👋 Deprecations and Feature Removals
|
||||
|
||||
##### The `ipfs object` commands are now deprecated
|
||||
|
||||
In the last couple years most of the Object API's commands have become fulfillable using alternative APIs.
|
||||
|
||||
The utility of Object API's is limited to data in UnixFS-v1 (`dag-pb`) format. If you are still using it, it is highly recommended that you switch to the DAG `ipfs dag` (supports modern data types like `dag-cbor`) or Files `ipfs files` (more intuitive for working with `dag-pb`) APIs.
|
||||
|
||||
While the Object API and commands are still usable they are now marked as deprecated and hidden from users on the command line to discourage further use. We also updated their `--help` text to point at the modern replacements.
|
||||
|
||||
|
||||
##### `X-Ipfs-Gateway-Prefix` is now deprecated
|
||||
|
||||
IPFS community moved towards dedicated Origins (DNSLink and [subdomain gateways](https://docs.ipfs.io/how-to/address-ipfs-on-web/#subdomain-gateway)) which are much easier to isolate and reason about.
|
||||
|
||||
Setting up `Gateway.PathPrefixes` and `X-Ipfs-Gateway-Prefix` is no longer necessary and support [will be removed in near future](https://github.com/ipfs/go-ipfs/issues/7702).
|
||||
|
||||
##### Proquints support removed
|
||||
|
||||
A little known feature that was not well used or documented and was more well known for the error message `Error: not a valid proquint string` users received when trying to download invalid IPNS or DNSLink names (e.g. `https://dweb.link/ipns/badname`). We have removed support for proquints as they were out of place and largely unused, however proquints are [valid multibases](https://github.com/multiformats/multibase/pull/78) so if there is renewed interest in them there is a way forward.
|
||||
|
||||
##### SECIO support removed
|
||||
|
||||
SECIO was deprecated and turned off by default given the prevalence of TLS and Noise support, SECIO support is now removed entirely.
|
||||
|
||||
### Changelog
|
||||
|
||||
- github.com/ipfs/go-ipfs:
|
||||
- chore: switch tar-utils dep to ipfs org
|
||||
- chore: update CHANGELOG
|
||||
- refactor: warning when bootstrap disabled by user
|
||||
- feat: print error on bootstrap failure
|
||||
- fix: typo in migration error
|
||||
- Release v0.9.0-rc2
|
||||
- refactor: improved humanNumber and humanSI
|
||||
- feat: humanized durations in stat provide
|
||||
- feat: humanized numbers in stat provide
|
||||
- feat: add a text output encoding for the stats provide command
|
||||
- fix: webui-2.12.3
|
||||
- refactor(pinmfs): log error if pre-existing pin failed (#8056) ([ipfs/go-ipfs#8056](https://github.com/ipfs/go-ipfs/pull/8056))
|
||||
- Release v0.9.0-rc1
|
||||
- Added support for an experimental DHT client and provider system via the Experiments.AcceleratedDHTClient config option ([ipfs/go-ipfs#8061](https://github.com/ipfs/go-ipfs/pull/8061))
|
||||
- feat: support DNSLink on non-ICANN DNS names ([ipfs/go-ipfs#8071](https://github.com/ipfs/go-ipfs/pull/8071))
|
||||
- update go-tcp-transport to v0.2.2 ([ipfs/go-ipfs#8129](https://github.com/ipfs/go-ipfs/pull/8129))
|
||||
- update quic-go to v0.21.0-rc.1 ([ipfs/go-ipfs#8125](https://github.com/ipfs/go-ipfs/pull/8125))
|
||||
- chore: bump minimum go version to 1.15 ([ipfs/go-ipfs#7944](https://github.com/ipfs/go-ipfs/pull/7944))
|
||||
- chore: update deps ([ipfs/go-ipfs#8128](https://github.com/ipfs/go-ipfs/pull/8128))
|
||||
- feat: allow key export in online mode ([ipfs/go-ipfs#8113](https://github.com/ipfs/go-ipfs/pull/8113))
|
||||
- Feat/migration ipfs download (#8064) ([ipfs/go-ipfs#8064](https://github.com/ipfs/go-ipfs/pull/8064))
|
||||
- feat: support custom DoH resolvers ([ipfs/go-ipfs#8068](https://github.com/ipfs/go-ipfs/pull/8068))
|
||||
- update go-libp2p to v0.14.0 ([ipfs/go-ipfs#8122](https://github.com/ipfs/go-ipfs/pull/8122))
|
||||
- feat(gw): expose /api/v0/dag/export on gateway port ([ipfs/go-ipfs#8111](https://github.com/ipfs/go-ipfs/pull/8111))
|
||||
- chore: update webui to 2.12.2 ([ipfs/go-ipfs#8097](https://github.com/ipfs/go-ipfs/pull/8097))
|
||||
- docs: deprecate object commands ([ipfs/go-ipfs#8098](https://github.com/ipfs/go-ipfs/pull/8098))
|
||||
- fix: omit empty pins slice when reporting pin progress ([ipfs/go-ipfs#8023](https://github.com/ipfs/go-ipfs/pull/8023))
|
||||
- Fix typo in comment ([ipfs/go-ipfs#8087](https://github.com/ipfs/go-ipfs/pull/8087))
|
||||
- fix: set systemd startup timeout to infinity ([ipfs/go-ipfs#8040](https://github.com/ipfs/go-ipfs/pull/8040))
|
||||
- fix(mkreleaselog): partially handle v2 modules ([ipfs/go-ipfs#8073](https://github.com/ipfs/go-ipfs/pull/8073))
|
||||
- Update migration sharness tests for new migrations (#8053) ([ipfs/go-ipfs#8053](https://github.com/ipfs/go-ipfs/pull/8053))
|
||||
- fix: make migrations log output to stdout ([ipfs/go-ipfs#8054](https://github.com/ipfs/go-ipfs/pull/8054))
|
||||
- fix(gw): remove hardcoded hostnames ([ipfs/go-ipfs#8069](https://github.com/ipfs/go-ipfs/pull/8069))
|
||||
- Fix transposed words in docs/config.md ([ipfs/go-ipfs#8051](https://github.com/ipfs/go-ipfs/pull/8051))
|
||||
- fix: update root help ([ipfs/go-ipfs#8052](https://github.com/ipfs/go-ipfs/pull/8052))
|
||||
- chore: dont docker tag rc as latest ([ipfs/go-ipfs#8055](https://github.com/ipfs/go-ipfs/pull/8055))
|
||||
- Add info to "pin rm" help about how to tell if pin is indirect ([ipfs/go-ipfs#8044](https://github.com/ipfs/go-ipfs/pull/8044))
|
||||
- build(deps): bump contrib.go.opencensus.io/exporter/prometheus from 0.2.0 to 0.3.0 ([ipfs/go-ipfs#8020](https://github.com/ipfs/go-ipfs/pull/8020))
|
||||
- fix(gw): remove use of Clear-Site-Data in subdomain router ([ipfs/go-ipfs#7890](https://github.com/ipfs/go-ipfs/pull/7890))
|
||||
- ([ipfs/go-ipfs#7857](https://github.com/ipfs/go-ipfs/pull/7857))
|
||||
- docs: clarification of the Strategic Providing functionality ([ipfs/go-ipfs#8035](https://github.com/ipfs/go-ipfs/pull/8035))
|
||||
- docs: cosmetic fixes of help text ([ipfs/go-ipfs#8010](https://github.com/ipfs/go-ipfs/pull/8010))
|
||||
- chore: deprecate Gateway.PathPrefixes ([ipfs/go-ipfs#7994](https://github.com/ipfs/go-ipfs/pull/7994))
|
||||
- Fix text contrast for dark mode ([ipfs/go-ipfs#8027](https://github.com/ipfs/go-ipfs/pull/8027))
|
||||
- Do not fetch recursive pins from pinner unnecessarily ([ipfs/go-ipfs#7883](https://github.com/ipfs/go-ipfs/pull/7883))
|
||||
- test(sharness): verify the list of exported metrics ([ipfs/go-ipfs#7987](https://github.com/ipfs/go-ipfs/pull/7987))
|
||||
- fix: return an error if repo verify is canceled ([ipfs/go-ipfs#7973](https://github.com/ipfs/go-ipfs/pull/7973))
|
||||
- doc: document security fix policy ([ipfs/go-ipfs#7991](https://github.com/ipfs/go-ipfs/pull/7991))
|
||||
- feat(gw): /ipfs/ipfs/{cid} → /ipfs/{cid} ([ipfs/go-ipfs#7930](https://github.com/ipfs/go-ipfs/pull/7930))
|
||||
- Fix: innacuracies in MFS command documentation. ([ipfs/go-ipfs#8001](https://github.com/ipfs/go-ipfs/pull/8001))
|
||||
- Feat: Re-import InitializeKeyspace code from go-namesys ([ipfs/go-ipfs#7984](https://github.com/ipfs/go-ipfs/pull/7984))
|
||||
- revert registration of metrics against unexposed prom registry ([ipfs/go-ipfs#7986](https://github.com/ipfs/go-ipfs/pull/7986))
|
||||
- Extract the namesys and the keystore submodules ([ipfs/go-ipfs#7925](https://github.com/ipfs/go-ipfs/pull/7925))
|
||||
- split core/commands/dag into individual files for different subcommands ([ipfs/go-ipfs#7970](https://github.com/ipfs/go-ipfs/pull/7970))
|
||||
- test(sharness): pass correct timeout format to go-timeout ([ipfs/go-ipfs#7971](https://github.com/ipfs/go-ipfs/pull/7971))
|
||||
- fix race condition when logging requests ([ipfs/go-ipfs#7953](https://github.com/ipfs/go-ipfs/pull/7953))
|
||||
- fix some sharness-in-CI issues ([ipfs/go-ipfs#7946](https://github.com/ipfs/go-ipfs/pull/7946))
|
||||
- chore: update deps ([ipfs/go-ipfs#7941](https://github.com/ipfs/go-ipfs/pull/7941))
|
||||
- fix: correctly return pin ls errors ([ipfs/go-ipfs#7942](https://github.com/ipfs/go-ipfs/pull/7942))
|
||||
- feat: remove secio support ([ipfs/go-ipfs#7943](https://github.com/ipfs/go-ipfs/pull/7943))
|
||||
- Set supported platforms by go-version ([ipfs/go-ipfs#7927](https://github.com/ipfs/go-ipfs/pull/7927))
|
||||
- docs: tips on debugging Policies.MFS (#7929) ([ipfs/go-ipfs#7929](https://github.com/ipfs/go-ipfs/pull/7929))
|
||||
- docs: fix DNSLink gw recipe ([ipfs/go-ipfs#7932](https://github.com/ipfs/go-ipfs/pull/7932))
|
||||
- Merge branch 'release'
|
||||
- docs: RepinInterval
|
||||
- style: docs/config.md
|
||||
- style: improved MFS PinName example
|
||||
- docs: Pinning.RemoteServices.Policies
|
||||
- peering: add logs before many-second waits ([ipfs/go-ipfs#7904](https://github.com/ipfs/go-ipfs/pull/7904))
|
||||
- all: gofmt -s ([ipfs/go-ipfs#7900](https://github.com/ipfs/go-ipfs/pull/7900))
|
||||
- github.com/ipfs/go-bitswap (v0.3.3 -> v0.3.4):
|
||||
- remove Makefile ([ipfs/go-bitswap#483](https://github.com/ipfs/go-bitswap/pull/483))
|
||||
- test: deflake engine test ([ipfs/go-bitswap#480](https://github.com/ipfs/go-bitswap/pull/480))
|
||||
- test: deflake large-message test ([ipfs/go-bitswap#479](https://github.com/ipfs/go-bitswap/pull/479))
|
||||
- fix: fix alignment of stats struct in virtual network ([ipfs/go-bitswap#478](https://github.com/ipfs/go-bitswap/pull/478))
|
||||
- fix(network): impl: add timeout in newStreamToPeer call ([ipfs/go-bitswap#477](https://github.com/ipfs/go-bitswap/pull/477))
|
||||
- fix staticcheck ([ipfs/go-bitswap#474](https://github.com/ipfs/go-bitswap/pull/474))
|
||||
- ignore transient connections ([ipfs/go-bitswap#470](https://github.com/ipfs/go-bitswap/pull/470))
|
||||
- fix a startup race by creating the blockstoremanager process on init ([ipfs/go-bitswap#465](https://github.com/ipfs/go-bitswap/pull/465))
|
||||
- github.com/ipfs/go-block-format (v0.0.2 -> v0.0.3):
|
||||
- doc: add a lead maintainer ([ipfs/go-block-format#16](https://github.com/ipfs/go-block-format/pull/16))
|
||||
- github.com/ipfs/go-graphsync (v0.6.0 -> v0.8.0):
|
||||
- docs(CHANGELOG): update for v0.8.0
|
||||
- Update for LinkSystem (#161) ([ipfs/go-graphsync#161](https://github.com/ipfs/go-graphsync/pull/161))
|
||||
- Round out diagnostic parameters (#157) ([ipfs/go-graphsync#157](https://github.com/ipfs/go-graphsync/pull/157))
|
||||
- map response codes to names (#148) ([ipfs/go-graphsync#148](https://github.com/ipfs/go-graphsync/pull/148))
|
||||
- Discard http output (#156) ([ipfs/go-graphsync#156](https://github.com/ipfs/go-graphsync/pull/156))
|
||||
- Add debug logging (#121) ([ipfs/go-graphsync#121](https://github.com/ipfs/go-graphsync/pull/121))
|
||||
- Add optional HTTP comparison (#153) ([ipfs/go-graphsync#153](https://github.com/ipfs/go-graphsync/pull/153))
|
||||
- docs(architecture): update architecture docs (#154) ([ipfs/go-graphsync#154](https://github.com/ipfs/go-graphsync/pull/154))
|
||||
- release v0.7.0 ([ipfs/go-graphsync#152](https://github.com/ipfs/go-graphsync/pull/152))
|
||||
- chore: update deps (#151) ([ipfs/go-graphsync#151](https://github.com/ipfs/go-graphsync/pull/151))
|
||||
- Automatically record heap profiles in testplans (#147) ([ipfs/go-graphsync#147](https://github.com/ipfs/go-graphsync/pull/147))
|
||||
- feat(deps): update go-ipld-prime v0.7.0 (#145) ([ipfs/go-graphsync#145](https://github.com/ipfs/go-graphsync/pull/145))
|
||||
- Release/v0.6.0 ([ipfs/go-graphsync#144](https://github.com/ipfs/go-graphsync/pull/144))
|
||||
- github.com/ipfs/go-ipfs-blockstore (v0.1.4 -> v0.1.6):
|
||||
- use bloom filter in GetSize
|
||||
- github.com/ipfs/go-ipfs-config (v0.12.0 -> v0.14.0):
|
||||
- Added Experiments.AcceleratedDHTClient option ([ipfs/go-ipfs-config#125](https://github.com/ipfs/go-ipfs-config/pull/125))
|
||||
- Add config for downloading repo migrations ([ipfs/go-ipfs-config#128](https://github.com/ipfs/go-ipfs-config/pull/128))
|
||||
- remove duplicate entries in defaultServerFilters ([ipfs/go-ipfs-config#121](https://github.com/ipfs/go-ipfs-config/pull/121))
|
||||
- add custom DNS Resolver configuration ([ipfs/go-ipfs-config#126](https://github.com/ipfs/go-ipfs-config/pull/126))
|
||||
- github.com/ipfs/go-ipfs-provider (v0.4.3 -> v0.5.1):
|
||||
- Fix batched providing of empty keys ([ipfs/go-ipfs-provider#37](https://github.com/ipfs/go-ipfs-provider/pull/37))
|
||||
- Bulk Provide/Reproviding System (#34) ([ipfs/go-ipfs-provider#34](https://github.com/ipfs/go-ipfs-provider/pull/34))
|
||||
- chore: update the Usage part of readme ([ipfs/go-ipfs-provider#33](https://github.com/ipfs/go-ipfs-provider/pull/33))
|
||||
- Retract and revert 1.0.0 ([ipfs/go-ipfs-provider#31](https://github.com/ipfs/go-ipfs-provider/pull/31))
|
||||
- replace go-merkledag with go-fetcher ([ipfs/go-ipfs-provider#30](https://github.com/ipfs/go-ipfs-provider/pull/30))
|
||||
- github.com/ipfs/go-ipld-git (v0.0.3 -> v0.0.4):
|
||||
- add license file so it can be found by go-licenses ([ipfs/go-ipld-git#42](https://github.com/ipfs/go-ipld-git/pull/42))
|
||||
- github.com/ipfs/go-ipns (v0.0.2 -> v0.1.0):
|
||||
- Add support for extensible records (and v2 signature)
|
||||
- github.com/ipfs/go-log (v1.0.4 -> v1.0.5):
|
||||
- chore: update v1 deps ([ipfs/go-log#108](https://github.com/ipfs/go-log/pull/108))
|
||||
- github.com/ipfs/go-log/v2 (v2.1.1 -> v2.1.3):
|
||||
- doc(README): use circle-ci badge ([ipfs/go-log#106](https://github.com/ipfs/go-log/pull/106))
|
||||
- feat: add ability to specify labels for all loggers ([ipfs/go-log#105](https://github.com/ipfs/go-log/pull/105))
|
||||
- Add an option to pass URL to zap ([ipfs/go-log#101](https://github.com/ipfs/go-log/pull/101))
|
||||
- enable configuring several log outputs ([ipfs/go-log#98](https://github.com/ipfs/go-log/pull/98))
|
||||
- Fix caller not being added ([ipfs/go-log#96](https://github.com/ipfs/go-log/pull/96))
|
||||
- github.com/ipfs/go-unixfs (v0.2.4 -> v0.2.5):
|
||||
- correct file size for raw node ([ipfs/go-unixfs#88](https://github.com/ipfs/go-unixfs/pull/88))
|
||||
- github.com/ipld/go-car (v0.1.1-0.20201015032735-ff6ccdc46acc -> v0.3.1):
|
||||
- chore: make sure we get an error where we expect one
|
||||
- chore: refactor header tests to iterate over a struct
|
||||
- chore: add header error tests
|
||||
- fix: lint errors
|
||||
- fix: go mod tidy
|
||||
- chore: update go.mod to 1.15
|
||||
- fix: ReadHeader return value mismatch
|
||||
- Updates for ipld linksystem branch ([ipld/go-car#56](https://github.com/ipld/go-car/pull/56))
|
||||
- replace go-ipld-prime-proto with go-codec-dagpb
|
||||
- fix staticcheck errors ([ipld/go-car#67](https://github.com/ipld/go-car/pull/67))
|
||||
- chore: switch to a single license file ([ipld/go-car#59](https://github.com/ipld/go-car/pull/59))
|
||||
- chore: remove LICENSE ([ipld/go-car#58](https://github.com/ipld/go-car/pull/58))
|
||||
- chore: relicense ([ipld/go-car#57](https://github.com/ipld/go-car/pull/57))
|
||||
- ci: remove travis support ([ipld/go-car#55](https://github.com/ipld/go-car/pull/55))
|
||||
- run gofmt -s
|
||||
- Allow user defined block hooks when using two step write for selective cars ([ipld/go-car#37](https://github.com/ipld/go-car/pull/37))
|
||||
- feat: handle mid-varint EOF case as UnexpectedEOF
|
||||
- fix: main NewReader call
|
||||
- github.com/ipld/go-ipld-prime (v0.5.1-0.20201021195245-109253e8a018 -> v0.9.1-0.20210324083106-dc342a9917db):
|
||||
- Add option to tell link system storage is trusted and we can skip hash on read ([ipld/go-ipld-prime#149](https://github.com/ipld/go-ipld-prime/pull/149))
|
||||
- implement non-dag cbor codec ([ipld/go-ipld-prime#153](https://github.com/ipld/go-ipld-prime/pull/153))
|
||||
- add non-dag json codec ([ipld/go-ipld-prime#152](https://github.com/ipld/go-ipld-prime/pull/152))
|
||||
- typo fixes
|
||||
- mark v0.9.0
|
||||
- Changelog: more backfill :)
|
||||
- hackme: about merge strategies.
|
||||
- Dropping .gopath and other unmaintained scripts.
|
||||
- introduce LinkSystem ([ipld/go-ipld-prime#143](https://github.com/ipld/go-ipld-prime/pull/143))
|
||||
- Readme updates.
|
||||
- codec/raw: implement the raw codec
|
||||
- add an ADL interface type
|
||||
- schema/gen/go: cache genned code in os.TempDir
|
||||
- fluent/qp: finish writing all data model helpers
|
||||
- fluent: add qp, a different spin on quip
|
||||
- schema/gen/go: prevent some unkeyed literal vet errors
|
||||
- schema/gen/go: remove two common subtest levels
|
||||
- use %q in error strings
|
||||
- schema/gen/go: please vet a bit more
|
||||
- Introduce 'quip' data building helpers. ([ipld/go-ipld-prime#134](https://github.com/ipld/go-ipld-prime/pull/134))
|
||||
- gengo: support for unions with stringprefix representation. ([ipld/go-ipld-prime#133](https://github.com/ipld/go-ipld-prime/pull/133))
|
||||
- target of opporunity DRY improvement: use more shared templates for structs with stringjoin representations.
|
||||
- fix small consistency typo in gen function names.
|
||||
- drop old generation mechanisms that were already deprecated.
|
||||
- error type cleanup, and helpers.
|
||||
- v0.7.0 and changelog update
|
||||
- Revert "rename AssignNode to ConvertFrom"
|
||||
- Implement traversal.FocusedTransform. ([ipld/go-ipld-prime#130](https://github.com/ipld/go-ipld-prime/pull/130))
|
||||
- Update a few more lingering ReprKind references.
|
||||
- all: rename schema.Kind to TypeKind, ipld.ReprKind to Kind ([ipld/go-ipld-prime#127](https://github.com/ipld/go-ipld-prime/pull/127))
|
||||
- all: rename AssignNode to ConvertFrom
|
||||
- all: rewrite interfaces and APIs to support int64
|
||||
- mark v0.6.0
|
||||
- clean up node/gendemo regeneration ([ipld/go-ipld-prime#123](https://github.com/ipld/go-ipld-prime/pull/123))
|
||||
- cleanup: drop orphaned gitignore file.
|
||||
- Schema types rebased to use codegen types for the data ([ipld/go-ipld-prime#107](https://github.com/ipld/go-ipld-prime/pull/107))
|
||||
- codegen: assembler for struct with map representation validates all non-optional fields are present ([ipld/go-ipld-prime#121](https://github.com/ipld/go-ipld-prime/pull/121))
|
||||
- changelog: backfill.
|
||||
- fluent: finish out matrix of helper methods, and fix error handling of the non-Must methods.
|
||||
- all: fix a lot of "unkeyed literal" vet warnings
|
||||
- node/mixins: use simpler filenames
|
||||
- node/gendemo: use the new code generator
|
||||
- Merge pull request #96 , originally known as ipld/cidlink-only-usable-as-ptr
|
||||
- Codec revamp ([ipld/go-ipld-prime#112](https://github.com/ipld/go-ipld-prime/pull/112))
|
||||
- Allow overriden types (#116) ([ipld/go-ipld-prime#116](https://github.com/ipld/go-ipld-prime/pull/116))
|
||||
- add import to ipld in ipldsch_types.go ([ipld/go-ipld-prime#115](https://github.com/ipld/go-ipld-prime/pull/115))
|
||||
- Codegen output rearrange ([ipld/go-ipld-prime#105](https://github.com/ipld/go-ipld-prime/pull/105))
|
||||
- Validate struct builder sufficiency ([ipld/go-ipld-prime#111](https://github.com/ipld/go-ipld-prime/pull/111))
|
||||
- Fresh take on codec APIs, and some tokenization utilities. ([ipld/go-ipld-prime#101](https://github.com/ipld/go-ipld-prime/pull/101))
|
||||
- Add a demo ADL (rot13adl) ([ipld/go-ipld-prime#98](https://github.com/ipld/go-ipld-prime/pull/98))
|
||||
- Introduce traversal function that selects links out of a tree. ([ipld/go-ipld-prime#110](https://github.com/ipld/go-ipld-prime/pull/110))
|
||||
- Codegen various improvements ([ipld/go-ipld-prime#106](https://github.com/ipld/go-ipld-prime/pull/106))
|
||||
- github.com/libp2p/go-conn-security-multistream (v0.2.0 -> v0.2.1):
|
||||
- Implement support for simultaneous open (#14) ([libp2p/go-conn-security-multistream#14](https://github.com/libp2p/go-conn-security-multistream/pull/14))
|
||||
- github.com/libp2p/go-libp2p (v0.13.0 -> v0.14.2):
|
||||
- Fix race in adding connections to connsByPeer ([libp2p/go-libp2p#1116](https://github.com/libp2p/go-libp2p/pull/1116))
|
||||
- speed up the mock tests ([libp2p/go-libp2p#1103](https://github.com/libp2p/go-libp2p/pull/1103))
|
||||
- remove slow ObservedAddrManager test that doesn't test anything ([libp2p/go-libp2p#1104](https://github.com/libp2p/go-libp2p/pull/1104))
|
||||
- remove Codecov config ([libp2p/go-libp2p#1100](https://github.com/libp2p/go-libp2p/pull/1100))
|
||||
- doc: document standard connection manager ([libp2p/go-libp2p#1099](https://github.com/libp2p/go-libp2p/pull/1099))
|
||||
- run go mod tidy in the examples ([libp2p/go-libp2p#1098](https://github.com/libp2p/go-libp2p/pull/1098))
|
||||
- Cleanup some remaining examples nits ([libp2p/go-libp2p#1097](https://github.com/libp2p/go-libp2p/pull/1097))
|
||||
- chore: bring examples back into repository and add tests ([libp2p/go-libp2p#1092](https://github.com/libp2p/go-libp2p/pull/1092))
|
||||
- fix(mkreleasenotes): handle first commit ([libp2p/go-libp2p#1095](https://github.com/libp2p/go-libp2p/pull/1095))
|
||||
- doc: add a basic release process ([libp2p/go-libp2p#1080](https://github.com/libp2p/go-libp2p/pull/1080))
|
||||
- chore: update yamux ([libp2p/go-libp2p#1089](https://github.com/libp2p/go-libp2p/pull/1089))
|
||||
- fix: re-expose AutoNAT service on BasicHost ([libp2p/go-libp2p#1088](https://github.com/libp2p/go-libp2p/pull/1088))
|
||||
- remove NEWS.md ([libp2p/go-libp2p#1086](https://github.com/libp2p/go-libp2p/pull/1086))
|
||||
- test: deflake TestProtoDowngrade ([libp2p/go-libp2p#1084](https://github.com/libp2p/go-libp2p/pull/1084))
|
||||
- sync: update CI config files (and fix tests) ([libp2p/go-libp2p#1083](https://github.com/libp2p/go-libp2p/pull/1083))
|
||||
- static check fixes ([libp2p/go-libp2p#1076](https://github.com/libp2p/go-libp2p/pull/1076))
|
||||
- fix go vet ([libp2p/go-libp2p#1075](https://github.com/libp2p/go-libp2p/pull/1075))
|
||||
- option for custom dns resolver ([libp2p/go-libp2p#1073](https://github.com/libp2p/go-libp2p/pull/1073))
|
||||
- chore: update deps ([libp2p/go-libp2p#1066](https://github.com/libp2p/go-libp2p/pull/1066))
|
||||
- fix autonat race ([libp2p/go-libp2p#1062](https://github.com/libp2p/go-libp2p/pull/1062))
|
||||
- use transient connections in identify streams ([libp2p/go-libp2p#1061](https://github.com/libp2p/go-libp2p/pull/1061))
|
||||
- Emit event for User's NAT Type i.e. Hard NAT or Easy NAT (#1042) ([libp2p/go-libp2p#1042](https://github.com/libp2p/go-libp2p/pull/1042))
|
||||
- Finish and Test the simultaneous connect problem in libp2p peers (#1041) ([libp2p/go-libp2p#1041](https://github.com/libp2p/go-libp2p/pull/1041))
|
||||
- Close peerstore and document Host Close (#1037) ([libp2p/go-libp2p#1037](https://github.com/libp2p/go-libp2p/pull/1037))
|
||||
- Timeout all Identify stream reads (#1032) ([libp2p/go-libp2p#1032](https://github.com/libp2p/go-libp2p/pull/1032))
|
||||
- github.com/libp2p/go-libp2p-autonat (v0.4.0 -> v0.4.2):
|
||||
- Fix: Stream read timeout ([libp2p/go-libp2p-autonat#99](https://github.com/libp2p/go-libp2p-autonat/pull/99))
|
||||
- fix: simplify address replacement ([libp2p/go-libp2p-autonat#102](https://github.com/libp2p/go-libp2p-autonat/pull/102))
|
||||
- replace the port number for double NAT mapping ([libp2p/go-libp2p-autonat#101](https://github.com/libp2p/go-libp2p-autonat/pull/101))
|
||||
- github.com/libp2p/go-libp2p-core (v0.8.0 -> v0.8.5):
|
||||
- mind the dot.
|
||||
- context option for simultaneous connect
|
||||
- Event for user's NAT Device Type: Tell user if the node is behind an Easy or Hard NAT (#173) ([libp2p/go-libp2p-core#173](https://github.com/libp2p/go-libp2p-core/pull/173))
|
||||
- address aarshian nitpicks
|
||||
- make UseTransient context option take a reason argument, for consistency with other options
|
||||
- abstract Conn Stat interface for threading
|
||||
- Update network/context.go
|
||||
- add ErrTransientConn error
|
||||
- add support for transient connections
|
||||
- more docs for stream fncs (#183) ([libp2p/go-libp2p-core#183](https://github.com/libp2p/go-libp2p-core/pull/183))
|
||||
- refactor: use a helper type to decode AddrInfo from JSON (#178) ([libp2p/go-libp2p-core#178](https://github.com/libp2p/go-libp2p-core/pull/178))
|
||||
- fix stream docs (#182) ([libp2p/go-libp2p-core#182](https://github.com/libp2p/go-libp2p-core/pull/182))
|
||||
- context to force direct dial (#181) ([libp2p/go-libp2p-core#181](https://github.com/libp2p/go-libp2p-core/pull/181))
|
||||
- Secure Muxer Interface (#180) ([libp2p/go-libp2p-core#180](https://github.com/libp2p/go-libp2p-core/pull/180))
|
||||
- github.com/libp2p/go-libp2p-discovery (v0.5.0 -> v0.5.1):
|
||||
- Fix hang in BackoffDiscovery.FindPeers when requesting limit lower than number of peers available ([libp2p/go-libp2p-discovery#69](https://github.com/libp2p/go-libp2p-discovery/pull/69))
|
||||
- fix staticcheck ([libp2p/go-libp2p-discovery#70](https://github.com/libp2p/go-libp2p-discovery/pull/70))
|
||||
- github.com/libp2p/go-libp2p-kad-dht (v0.11.1 -> v0.12.2):
|
||||
- fullrt rework batching (#720) ([libp2p/go-libp2p-kad-dht#720](https://github.com/libp2p/go-libp2p-kad-dht/pull/720))
|
||||
- sync: update CI config files ([libp2p/go-libp2p-kad-dht#712](https://github.com/libp2p/go-libp2p-kad-dht/pull/712))
|
||||
- fix staticcheck ([libp2p/go-libp2p-kad-dht#721](https://github.com/libp2p/go-libp2p-kad-dht/pull/721))
|
||||
- fix: fullrt dht bug fixes ([libp2p/go-libp2p-kad-dht#719](https://github.com/libp2p/go-libp2p-kad-dht/pull/719))
|
||||
- Crawler based DHT client (#709) ([libp2p/go-libp2p-kad-dht#709](https://github.com/libp2p/go-libp2p-kad-dht/pull/709))
|
||||
- test: fix unique addr check ([libp2p/go-libp2p-kad-dht#714](https://github.com/libp2p/go-libp2p-kad-dht/pull/714))
|
||||
- chore: update deps ([libp2p/go-libp2p-kad-dht#713](https://github.com/libp2p/go-libp2p-kad-dht/pull/713))
|
||||
- Add basic crawler (#663) ([libp2p/go-libp2p-kad-dht#663](https://github.com/libp2p/go-libp2p-kad-dht/pull/663))
|
||||
- various staticcheck fixes ([libp2p/go-libp2p-kad-dht#710](https://github.com/libp2p/go-libp2p-kad-dht/pull/710))
|
||||
- findpeer should work even on peers that are not part of DHT queries ([libp2p/go-libp2p-kad-dht#711](https://github.com/libp2p/go-libp2p-kad-dht/pull/711))
|
||||
- Extract DHT message sender from the DHT ([libp2p/go-libp2p-kad-dht#659](https://github.com/libp2p/go-libp2p-kad-dht/pull/659))
|
||||
- github.com/libp2p/go-libp2p-noise (v0.1.2 -> v0.2.0):
|
||||
- Update github.com/flynn/noise to address nonce handling security issues ([libp2p/go-libp2p-noise#95](https://github.com/libp2p/go-libp2p-noise/pull/95))
|
||||
- fix staticcheck ([libp2p/go-libp2p-noise#96](https://github.com/libp2p/go-libp2p-noise/pull/96))
|
||||
- chore: update deps ([libp2p/go-libp2p-noise#94](https://github.com/libp2p/go-libp2p-noise/pull/94))
|
||||
- chore: relicense MIT/Apache-2.0 ([libp2p/go-libp2p-noise#93](https://github.com/libp2p/go-libp2p-noise/pull/93))
|
||||
- github.com/libp2p/go-libp2p-peerstore (v0.2.6 -> v0.2.7):
|
||||
- fix: delete addrs when "updating" them to zero ([libp2p/go-libp2p-peerstore#157](https://github.com/libp2p/go-libp2p-peerstore/pull/157))
|
||||
- github.com/libp2p/go-libp2p-quic-transport (v0.10.0 -> v0.11.1):
|
||||
- update quic-go, enable QUIC v1 (RFC 9000) ([libp2p/go-libp2p-quic-transport#207](https://github.com/libp2p/go-libp2p-quic-transport/pull/207))
|
||||
- update quic-go to v0.21.0-rc2 ([libp2p/go-libp2p-quic-transport#206](https://github.com/libp2p/go-libp2p-quic-transport/pull/206))
|
||||
- increase test timeout to reduce flakiness of test on Windows ([libp2p/go-libp2p-quic-transport#204](https://github.com/libp2p/go-libp2p-quic-transport/pull/204))
|
||||
- correctly export version negotiation failures to Prometheus ([libp2p/go-libp2p-quic-transport#205](https://github.com/libp2p/go-libp2p-quic-transport/pull/205))
|
||||
- update quic-go to v0.20.1 ([libp2p/go-libp2p-quic-transport#201](https://github.com/libp2p/go-libp2p-quic-transport/pull/201))
|
||||
- expose some Prometheus metrics ([libp2p/go-libp2p-quic-transport#200](https://github.com/libp2p/go-libp2p-quic-transport/pull/200))
|
||||
- update quic-go to v0.20.0 ([libp2p/go-libp2p-quic-transport#198](https://github.com/libp2p/go-libp2p-quic-transport/pull/198))
|
||||
- reduce the zstd window size from 8 MB to 32 KB ([libp2p/go-libp2p-quic-transport#195](https://github.com/libp2p/go-libp2p-quic-transport/pull/195))
|
||||
- compress qlogs when the QUIC connection is closed ([libp2p/go-libp2p-quic-transport#193](https://github.com/libp2p/go-libp2p-quic-transport/pull/193))
|
||||
- switch from gzip to zstd for qlog compression ([libp2p/go-libp2p-quic-transport#190](https://github.com/libp2p/go-libp2p-quic-transport/pull/190))
|
||||
- github.com/libp2p/go-libp2p-swarm (v0.4.0 -> v0.5.0):
|
||||
- run connection gating tests on both TCP and QUIC ([libp2p/go-libp2p-swarm#258](https://github.com/libp2p/go-libp2p-swarm/pull/258))
|
||||
- fix: avoid returning typed nils ([libp2p/go-libp2p-swarm#257](https://github.com/libp2p/go-libp2p-swarm/pull/257))
|
||||
- fix staticcheck ([libp2p/go-libp2p-swarm#255](https://github.com/libp2p/go-libp2p-swarm/pull/255))
|
||||
- fix go vet ([libp2p/go-libp2p-swarm#253](https://github.com/libp2p/go-libp2p-swarm/pull/253))
|
||||
- New Dialer ([libp2p/go-libp2p-swarm#243](https://github.com/libp2p/go-libp2p-swarm/pull/243))
|
||||
- fix: use 64bit stream/conn IDs ([libp2p/go-libp2p-swarm#247](https://github.com/libp2p/go-libp2p-swarm/pull/247))
|
||||
- feat: close transports that implement io.Closer ([libp2p/go-libp2p-swarm#227](https://github.com/libp2p/go-libp2p-swarm/pull/227))
|
||||
- fix swarm transient conn (#241) ([libp2p/go-libp2p-swarm#241](https://github.com/libp2p/go-libp2p-swarm/pull/241))
|
||||
- Support for Hole punching (#233) ([libp2p/go-libp2p-swarm#233](https://github.com/libp2p/go-libp2p-swarm/pull/233))
|
||||
- Treat transient connections as opt-in when opening new streams ([libp2p/go-libp2p-swarm#236](https://github.com/libp2p/go-libp2p-swarm/pull/236))
|
||||
- avoid assigning a function to a variable ([libp2p/go-libp2p-swarm#239](https://github.com/libp2p/go-libp2p-swarm/pull/239))
|
||||
- only listen on localhost in tests ([libp2p/go-libp2p-swarm#238](https://github.com/libp2p/go-libp2p-swarm/pull/238))
|
||||
- prevent dialing addresses that we're listening on ([libp2p/go-libp2p-swarm#237](https://github.com/libp2p/go-libp2p-swarm/pull/237))
|
||||
- Enable QUIC in Test Swarm (#235) ([libp2p/go-libp2p-swarm#235](https://github.com/libp2p/go-libp2p-swarm/pull/235))
|
||||
- github.com/libp2p/go-libp2p-transport-upgrader (v0.4.0 -> v0.4.2):
|
||||
- Expose underlying transport connection stat where available ([libp2p/go-libp2p-transport-upgrader#71](https://github.com/libp2p/go-libp2p-transport-upgrader/pull/71))
|
||||
- Implement support for simultaneous open (#25) ([libp2p/go-libp2p-transport-upgrader#25](https://github.com/libp2p/go-libp2p-transport-upgrader/pull/25))
|
||||
- github.com/libp2p/go-libp2p-yamux (v0.5.1 -> v0.5.4):
|
||||
- remove Makefile ([libp2p/go-libp2p-yamux#35](https://github.com/libp2p/go-libp2p-yamux/pull/35))
|
||||
- github.com/libp2p/go-netroute (v0.1.3 -> v0.1.6):
|
||||
- add js stub impl
|
||||
- github.com/libp2p/go-sockaddr (v0.0.2 -> v0.1.1):
|
||||
- fix: allocate "any" socket type then cast ([libp2p/go-sockaddr#20](https://github.com/libp2p/go-sockaddr/pull/20))
|
||||
- fix: remove CGO functions ([libp2p/go-sockaddr#18](https://github.com/libp2p/go-sockaddr/pull/18))
|
||||
- github.com/libp2p/go-tcp-transport (v0.2.1 -> v0.2.2):
|
||||
- use log.Warn instead of log.Warning ([libp2p/go-tcp-transport#77](https://github.com/libp2p/go-tcp-transport/pull/77))
|
||||
- add bandwidth-related metrics (for Linux and OSX) ([libp2p/go-tcp-transport#76](https://github.com/libp2p/go-tcp-transport/pull/76))
|
||||
- expose some Prometheus metrics ([libp2p/go-tcp-transport#75](https://github.com/libp2p/go-tcp-transport/pull/75))
|
||||
- enable TCP keepalives ([libp2p/go-tcp-transport#73](https://github.com/libp2p/go-tcp-transport/pull/73))
|
||||
- stop using the deprecated go-multiaddr-net package ([libp2p/go-tcp-transport#72](https://github.com/libp2p/go-tcp-transport/pull/72))
|
||||
- github.com/libp2p/go-yamux/v2 (v2.0.0 -> v2.2.0):
|
||||
- make the initial stream receive window configurable ([libp2p/go-yamux#59](https://github.com/libp2p/go-yamux/pull/59))
|
||||
- set initial window size to spec value (256 kB), remove config option ([libp2p/go-yamux#57](https://github.com/libp2p/go-yamux/pull/57))
|
||||
- fix: don't change the receive window if we're forcing an update ([libp2p/go-yamux#56](https://github.com/libp2p/go-yamux/pull/56))
|
||||
- sync: update CI config files ([libp2p/go-yamux#55](https://github.com/libp2p/go-yamux/pull/55))
|
||||
- increase the receive window size if we're sending updates to frequently ([libp2p/go-yamux#54](https://github.com/libp2p/go-yamux/pull/54))
|
||||
- remove unused Stream.Shrink() method ([libp2p/go-yamux#52](https://github.com/libp2p/go-yamux/pull/52))
|
||||
- remove misleading comment about the MaxMessageSize ([libp2p/go-yamux#50](https://github.com/libp2p/go-yamux/pull/50))
|
||||
- clean up the receive window check ([libp2p/go-yamux#49](https://github.com/libp2p/go-yamux/pull/49))
|
||||
- don't reslice byte slices taking from the buffer ([libp2p/go-yamux#48](https://github.com/libp2p/go-yamux/pull/48))
|
||||
- don't reimplement io.ReadFull ([libp2p/go-yamux#38](https://github.com/libp2p/go-yamux/pull/38))
|
||||
- remove the recvLock in the stream ([libp2p/go-yamux#42](https://github.com/libp2p/go-yamux/pull/42))
|
||||
- remove the sendLock in the stream ([libp2p/go-yamux#41](https://github.com/libp2p/go-yamux/pull/41))
|
||||
- remove misleading statement about NAT traversal ([libp2p/go-yamux#45](https://github.com/libp2p/go-yamux/pull/45))
|
||||
- remove .gx directory, add last gx version to README ([libp2p/go-yamux#43](https://github.com/libp2p/go-yamux/pull/43))
|
||||
- reduce usage of goto ([libp2p/go-yamux#40](https://github.com/libp2p/go-yamux/pull/40))
|
||||
- remove unused error return value in Stream.processFlags ([libp2p/go-yamux#39](https://github.com/libp2p/go-yamux/pull/39))
|
||||
- github.com/lucas-clemente/quic-go (v0.19.3 -> v0.21.1):
|
||||
- add support for Go 1.17 Beta 1 ([lucas-clemente/quic-go#3203](https://github.com/lucas-clemente/quic-go/pull/3203))
|
||||
- add a CI test that go mod vendor works ([lucas-clemente/quic-go#3202](https://github.com/lucas-clemente/quic-go/pull/3202))
|
||||
- prevent go mod vendor from stumbling over the Go 1.18 file ([lucas-clemente/quic-go#3195](https://github.com/lucas-clemente/quic-go/pull/3195))
|
||||
- remove CipherSuiteName and HkdfExtract for Go 1.17 ([lucas-clemente/quic-go#3192](https://github.com/lucas-clemente/quic-go/pull/3192))
|
||||
- fix relocation target for cipherSuiteTLS13ByID in Go 1.17
|
||||
- use HkdfExtract from x/crypto ([lucas-clemente/quic-go#3173](https://github.com/lucas-clemente/quic-go/pull/3173))
|
||||
- add support for QUIC v1, RFC 9000 ([lucas-clemente/quic-go#3190](https://github.com/lucas-clemente/quic-go/pull/3190))
|
||||
- use tls.CipherSuiteName, instead of wrapping it in the qtls package ([lucas-clemente/quic-go#3174](https://github.com/lucas-clemente/quic-go/pull/3174))
|
||||
- use a pre-generated test vectors to test hkdfExpandLabel ([lucas-clemente/quic-go#3175](https://github.com/lucas-clemente/quic-go/pull/3175))
|
||||
- reduce flakiness of packet number generation test ([lucas-clemente/quic-go#3181](https://github.com/lucas-clemente/quic-go/pull/3181))
|
||||
- simplify the qtls tests ([lucas-clemente/quic-go#3185](https://github.com/lucas-clemente/quic-go/pull/3185))
|
||||
- add support for Go 1.17 (tip) ([lucas-clemente/quic-go#3182](https://github.com/lucas-clemente/quic-go/pull/3182))
|
||||
- prevent quic-go from building on Go 1.17 ([lucas-clemente/quic-go#3180](https://github.com/lucas-clemente/quic-go/pull/3180))
|
||||
- fix DONT_FRAGMENT error when using a IPv6 connection on Windows ([lucas-clemente/quic-go#3178](https://github.com/lucas-clemente/quic-go/pull/3178))
|
||||
- use net.ErrClosed (for Go 1.16) ([lucas-clemente/quic-go#3163](https://github.com/lucas-clemente/quic-go/pull/3163))
|
||||
- use the new error types to log the reason why a connection is closed ([lucas-clemente/quic-go#3166](https://github.com/lucas-clemente/quic-go/pull/3166))
|
||||
- fix race condition in deadline integration test ([lucas-clemente/quic-go#3165](https://github.com/lucas-clemente/quic-go/pull/3165))
|
||||
- add support for QUIC v1 ([lucas-clemente/quic-go#3160](https://github.com/lucas-clemente/quic-go/pull/3160))
|
||||
- rework error return values ([lucas-clemente/quic-go#3159](https://github.com/lucas-clemente/quic-go/pull/3159))
|
||||
- declare Path MTU probe packets lost with the early retransmit timer ([lucas-clemente/quic-go#3152](https://github.com/lucas-clemente/quic-go/pull/3152))
|
||||
- declare the handshake confirmed when receiving an ACK for a 1-RTT packet ([lucas-clemente/quic-go#3148](https://github.com/lucas-clemente/quic-go/pull/3148))
|
||||
- trace and qlog version selection / negotiation ([lucas-clemente/quic-go#3153](https://github.com/lucas-clemente/quic-go/pull/3153))
|
||||
- set the don't fragment (DF) bit on Windows (#3155) ([lucas-clemente/quic-go#3155](https://github.com/lucas-clemente/quic-go/pull/3155))
|
||||
- fix doc comment for Tracer.TracerForConnection ([lucas-clemente/quic-go#3154](https://github.com/lucas-clemente/quic-go/pull/3154))
|
||||
- make it possible to associate a ConnectionTracer with a Session ([lucas-clemente/quic-go#3146](https://github.com/lucas-clemente/quic-go/pull/3146))
|
||||
- remove the .editorconfig ([lucas-clemente/quic-go#3147](https://github.com/lucas-clemente/quic-go/pull/3147))
|
||||
- don't use a lower RTT than 5ms after receiving a Retry packet ([lucas-clemente/quic-go#3129](https://github.com/lucas-clemente/quic-go/pull/3129))
|
||||
- don't pass the QUIC version to the StartedConnection event ([lucas-clemente/quic-go#3109](https://github.com/lucas-clemente/quic-go/pull/3109))
|
||||
- update the packet numbers in decoding test to the ones from the draft ([lucas-clemente/quic-go#3137](https://github.com/lucas-clemente/quic-go/pull/3137))
|
||||
- various amplification limit fixes ([lucas-clemente/quic-go#3132](https://github.com/lucas-clemente/quic-go/pull/3132))
|
||||
- fix calculation of the handshake idle timeout ([lucas-clemente/quic-go#3120](https://github.com/lucas-clemente/quic-go/pull/3120))
|
||||
- only start PMTUD after handshake confirmation ([lucas-clemente/quic-go#3138](https://github.com/lucas-clemente/quic-go/pull/3138))
|
||||
- don't regard PMTU probe packets as outstanding ([lucas-clemente/quic-go#3126](https://github.com/lucas-clemente/quic-go/pull/3126))
|
||||
- expose the draft-34 version ([lucas-clemente/quic-go#3100](https://github.com/lucas-clemente/quic-go/pull/3100))
|
||||
- clean up the testutils ([lucas-clemente/quic-go#3104](https://github.com/lucas-clemente/quic-go/pull/3104))
|
||||
- initialize the congestion controller with the actual max datagram size ([lucas-clemente/quic-go#3107](https://github.com/lucas-clemente/quic-go/pull/3107))
|
||||
- make it possible to trace acknowledged packets ([lucas-clemente/quic-go#3134](https://github.com/lucas-clemente/quic-go/pull/3134))
|
||||
- avoid type confusion between protocol.PacketType and logging.PacketType ([lucas-clemente/quic-go#3108](https://github.com/lucas-clemente/quic-go/pull/3108))
|
||||
- fix duplicate logging of errors when the first error was a timeout error ([lucas-clemente/quic-go#3112](https://github.com/lucas-clemente/quic-go/pull/3112))
|
||||
- use a tracer to make the packetization test more useful ([lucas-clemente/quic-go#3136](https://github.com/lucas-clemente/quic-go/pull/3136))
|
||||
- improve string representation of timeout errors ([lucas-clemente/quic-go#3118](https://github.com/lucas-clemente/quic-go/pull/3118))
|
||||
- fix flaky timeout test ([lucas-clemente/quic-go#3105](https://github.com/lucas-clemente/quic-go/pull/3105))
|
||||
- fix calculation of the time for the next keep alive
|
||||
- add a 0-RTT test with different connecton ID lengths ([lucas-clemente/quic-go#3098](https://github.com/lucas-clemente/quic-go/pull/3098))
|
||||
- only run Ginkgo focus detection in staged files in pre-commit hook ([lucas-clemente/quic-go#3099](https://github.com/lucas-clemente/quic-go/pull/3099))
|
||||
- allow 0-RTT when flow control windows are increased ([lucas-clemente/quic-go#3096](https://github.com/lucas-clemente/quic-go/pull/3096))
|
||||
- improve the 0-RTT rejection integration test ([lucas-clemente/quic-go#3097](https://github.com/lucas-clemente/quic-go/pull/3097))
|
||||
- rename config values for flow control limits ([lucas-clemente/quic-go#3089](https://github.com/lucas-clemente/quic-go/pull/3089))
|
||||
- allow 0-RTT resumption if the server's stream limit was increased ([lucas-clemente/quic-go#3086](https://github.com/lucas-clemente/quic-go/pull/3086))
|
||||
- cache the serialized OOB in the conn, not in the packet info ([lucas-clemente/quic-go#3093](https://github.com/lucas-clemente/quic-go/pull/3093))
|
||||
- use code points from x/sys/unix for PKTINFO syscalls ([lucas-clemente/quic-go#3094](https://github.com/lucas-clemente/quic-go/pull/3094))
|
||||
- make it possible to detect version negotiation failures in logging, fix qlogging of those ([lucas-clemente/quic-go#3092](https://github.com/lucas-clemente/quic-go/pull/3092))
|
||||
- make the initial stream / connection flow control windows configurable ([lucas-clemente/quic-go#3083](https://github.com/lucas-clemente/quic-go/pull/3083))
|
||||
- only apply server's transport parameters after handshake completion ([lucas-clemente/quic-go#3085](https://github.com/lucas-clemente/quic-go/pull/3085))
|
||||
- fix documentation for baseFlowController.UpdateSendWindow ([lucas-clemente/quic-go#3087](https://github.com/lucas-clemente/quic-go/pull/3087))
|
||||
- set the Content-Length for HTTP/3 responses ([lucas-clemente/quic-go#3091](https://github.com/lucas-clemente/quic-go/pull/3091))
|
||||
- update the flow control windows of streams opened in 0-RTT ([lucas-clemente/quic-go#3088](https://github.com/lucas-clemente/quic-go/pull/3088))
|
||||
- Use the correct source IP when binding multiple IPs ([lucas-clemente/quic-go#3067](https://github.com/lucas-clemente/quic-go/pull/3067))
|
||||
- fix race condition when receiving 0-RTT packets ([lucas-clemente/quic-go#3074](https://github.com/lucas-clemente/quic-go/pull/3074))
|
||||
- require the application to handle 0-RTT rejection ([lucas-clemente/quic-go#3066](https://github.com/lucas-clemente/quic-go/pull/3066))
|
||||
- add an internal queue to signal that a datagram frame has been dequeued ([lucas-clemente/quic-go#3081](https://github.com/lucas-clemente/quic-go/pull/3081))
|
||||
- increase the maximum size of DATAGRAM frames ([lucas-clemente/quic-go#2966](https://github.com/lucas-clemente/quic-go/pull/2966))
|
||||
- remove non-functioning 0-RTT test with different conn ID lengths ([lucas-clemente/quic-go#3079](https://github.com/lucas-clemente/quic-go/pull/3079))
|
||||
- remove stray struct equality check ([lucas-clemente/quic-go#3078](https://github.com/lucas-clemente/quic-go/pull/3078))
|
||||
- fix issuing of connection IDs when dialing a 0-RTT connections ([lucas-clemente/quic-go#3058](https://github.com/lucas-clemente/quic-go/pull/3058))
|
||||
- only accept 0-RTT it the active_connection_id_limit didn't change ([lucas-clemente/quic-go#3060](https://github.com/lucas-clemente/quic-go/pull/3060))
|
||||
- remove unused error return value from HandleMaxStreamsFrame ([lucas-clemente/quic-go#3072](https://github.com/lucas-clemente/quic-go/pull/3072))
|
||||
- fix flaky accept queue integration test ([lucas-clemente/quic-go#3068](https://github.com/lucas-clemente/quic-go/pull/3068))
|
||||
- don't reset the QPACK encoder / decoder streams ([lucas-clemente/quic-go#3063](https://github.com/lucas-clemente/quic-go/pull/3063))
|
||||
- remove incorrect logging for client side retry packet ([lucas-clemente/quic-go#3071](https://github.com/lucas-clemente/quic-go/pull/3071))
|
||||
- allow sending 1xx responses (#3047) ([lucas-clemente/quic-go#3047](https://github.com/lucas-clemente/quic-go/pull/3047))
|
||||
- fix retry key and nonce for draft-34 ([lucas-clemente/quic-go#3062](https://github.com/lucas-clemente/quic-go/pull/3062))
|
||||
- implement DPLPMTUD ([lucas-clemente/quic-go#3028](https://github.com/lucas-clemente/quic-go/pull/3028))
|
||||
- only read multiple packets at a time after handshake completion ([lucas-clemente/quic-go#3041](https://github.com/lucas-clemente/quic-go/pull/3041))
|
||||
- make the certificate verificiation integration tests more explicit ([lucas-clemente/quic-go#3040](https://github.com/lucas-clemente/quic-go/pull/3040))
|
||||
- update gomock to v1.5.0, use mockgen source mode ([lucas-clemente/quic-go#3049](https://github.com/lucas-clemente/quic-go/pull/3049))
|
||||
- trace dropping of 0-RTT keys ([lucas-clemente/quic-go#3054](https://github.com/lucas-clemente/quic-go/pull/3054))
|
||||
- improve timeout measurement in the timeout test ([lucas-clemente/quic-go#3042](https://github.com/lucas-clemente/quic-go/pull/3042))
|
||||
- add a randomized test for the received_packet_history ([lucas-clemente/quic-go#3052](https://github.com/lucas-clemente/quic-go/pull/3052))
|
||||
- fix documentation of default values for MaxReceive{Stream, Connection}FlowControlWindow ([lucas-clemente/quic-go#3055](https://github.com/lucas-clemente/quic-go/pull/3055))
|
||||
- refactor merge packet number ranges ([lucas-clemente/quic-go#3051](https://github.com/lucas-clemente/quic-go/pull/3051))
|
||||
- add draft-34 to support versions in README
|
||||
- update README to reflect dropped Go 1.14 support
|
||||
- remove redundant nil-check in the packet packer ([lucas-clemente/quic-go#3048](https://github.com/lucas-clemente/quic-go/pull/3048))
|
||||
- avoid using rand.Source ([lucas-clemente/quic-go#3046](https://github.com/lucas-clemente/quic-go/pull/3046))
|
||||
- update Go to 1.16, drop support for 1.14 ([lucas-clemente/quic-go#3045](https://github.com/lucas-clemente/quic-go/pull/3045))
|
||||
- fix error message when the UDP receive buffer size can't be increased ([lucas-clemente/quic-go#3039](https://github.com/lucas-clemente/quic-go/pull/3039))
|
||||
- add the time_format field to qlog common_fields ([lucas-clemente/quic-go#3038](https://github.com/lucas-clemente/quic-go/pull/3038))
|
||||
- log connection IDs without the 0x prefix ([lucas-clemente/quic-go#3036](https://github.com/lucas-clemente/quic-go/pull/3036))
|
||||
- add support for QUIC draft-34 ([lucas-clemente/quic-go#3031](https://github.com/lucas-clemente/quic-go/pull/3031))
|
||||
- fix qtls imports in mockgen generated mocks ([lucas-clemente/quic-go#3037](https://github.com/lucas-clemente/quic-go/pull/3037))
|
||||
- improve error message when the read buffer size can't be set ([lucas-clemente/quic-go#3030](https://github.com/lucas-clemente/quic-go/pull/3030))
|
||||
- qlog the quic-go version ([lucas-clemente/quic-go#3033](https://github.com/lucas-clemente/quic-go/pull/3033))
|
||||
- remove the metrics package ([lucas-clemente/quic-go#3032](https://github.com/lucas-clemente/quic-go/pull/3032))
|
||||
- expose the constructor for the qlog connection tracer ([lucas-clemente/quic-go#3034](https://github.com/lucas-clemente/quic-go/pull/3034))
|
||||
- expose the constructor for the multipexed connection tracer ([lucas-clemente/quic-go#3035](https://github.com/lucas-clemente/quic-go/pull/3035))
|
||||
- make sure the server is stopped before closing all server sessions ([lucas-clemente/quic-go#3020](https://github.com/lucas-clemente/quic-go/pull/3020))
|
||||
- increase the size of the send queue ([lucas-clemente/quic-go#3016](https://github.com/lucas-clemente/quic-go/pull/3016))
|
||||
- prioritize receiving packets over sending out more packets ([lucas-clemente/quic-go#3015](https://github.com/lucas-clemente/quic-go/pull/3015))
|
||||
- reenable key updates for HTTP/3 ([lucas-clemente/quic-go#3017](https://github.com/lucas-clemente/quic-go/pull/3017))
|
||||
- check for errors after handling each previously undecryptable packet ([lucas-clemente/quic-go#3011](https://github.com/lucas-clemente/quic-go/pull/3011))
|
||||
- fix flaky streams map test on Windows ([lucas-clemente/quic-go#3013](https://github.com/lucas-clemente/quic-go/pull/3013))
|
||||
- fix flaky stream cancelation integration test ([lucas-clemente/quic-go#3014](https://github.com/lucas-clemente/quic-go/pull/3014))
|
||||
- preallocate a slice of one frame when packing a packet ([lucas-clemente/quic-go#3018](https://github.com/lucas-clemente/quic-go/pull/3018))
|
||||
- allow sending of ACKs when pacing limited ([lucas-clemente/quic-go#3010](https://github.com/lucas-clemente/quic-go/pull/3010))
|
||||
- fix qlogging of the packet payload length ([lucas-clemente/quic-go#3004](https://github.com/lucas-clemente/quic-go/pull/3004))
|
||||
- corrupt more ACKs in the MITM test ([lucas-clemente/quic-go#3007](https://github.com/lucas-clemente/quic-go/pull/3007))
|
||||
- fix flaky key update integration test ([lucas-clemente/quic-go#3005](https://github.com/lucas-clemente/quic-go/pull/3005))
|
||||
- immediately complete streams that were canceled, drop retransmissions ([lucas-clemente/quic-go#3003](https://github.com/lucas-clemente/quic-go/pull/3003))
|
||||
- stop generating new packets when the send queue is full ([lucas-clemente/quic-go#2971](https://github.com/lucas-clemente/quic-go/pull/2971))
|
||||
- allow access to the underlying quic.Stream from a http.ResponseWriter ([lucas-clemente/quic-go#2993](https://github.com/lucas-clemente/quic-go/pull/2993))
|
||||
- remove stay print statement from session test
|
||||
- allow receiving of multiple packets before sending a packet ([lucas-clemente/quic-go#2984](https://github.com/lucas-clemente/quic-go/pull/2984))
|
||||
- use cryptographic random for determining skipped packet numbers ([lucas-clemente/quic-go#2940](https://github.com/lucas-clemente/quic-go/pull/2940))
|
||||
- fix interpretation of time.Time{} as a pacing deadline ([lucas-clemente/quic-go#2980](https://github.com/lucas-clemente/quic-go/pull/2980))
|
||||
- qlog restored transport parameters ([lucas-clemente/quic-go#2991](https://github.com/lucas-clemente/quic-go/pull/2991))
|
||||
- use a pkg.go.dev instead of a GoDoc badge ([lucas-clemente/quic-go#2982](https://github.com/lucas-clemente/quic-go/pull/2982))
|
||||
- introduce a separate queue for undecryptable packets ([lucas-clemente/quic-go#2988](https://github.com/lucas-clemente/quic-go/pull/2988))
|
||||
- improve 0-RTT queue ([lucas-clemente/quic-go#2990](https://github.com/lucas-clemente/quic-go/pull/2990))
|
||||
- simplify switch statement in the transport parameter parser ([lucas-clemente/quic-go#2995](https://github.com/lucas-clemente/quic-go/pull/2995))
|
||||
- remove unneeded overflow check when parsing the max_ack_delay ([lucas-clemente/quic-go#2996](https://github.com/lucas-clemente/quic-go/pull/2996))
|
||||
- remove unneeded check in receivedPacketHandler.IsPotentiallyDuplicate ([lucas-clemente/quic-go#2998](https://github.com/lucas-clemente/quic-go/pull/2998))
|
||||
- qlog the max_datagram_frame_size transport parameter ([lucas-clemente/quic-go#2997](https://github.com/lucas-clemente/quic-go/pull/2997))
|
||||
- qlog draft-02 fixes ([lucas-clemente/quic-go#2987](https://github.com/lucas-clemente/quic-go/pull/2987))
|
||||
- fix flaky qlog test ([lucas-clemente/quic-go#2981](https://github.com/lucas-clemente/quic-go/pull/2981))
|
||||
- only run gofumpt on .go files in pre-commit hook ([lucas-clemente/quic-go#2983](https://github.com/lucas-clemente/quic-go/pull/2983))
|
||||
- fix outdated comment for the http3.Server
|
||||
- make the OpenStreamSync cancelation test less flaky ([lucas-clemente/quic-go#2978](https://github.com/lucas-clemente/quic-go/pull/2978))
|
||||
- add some useful pre-commit hooks ([lucas-clemente/quic-go#2979](https://github.com/lucas-clemente/quic-go/pull/2979))
|
||||
- publicize QUIC varint reading and writing ([lucas-clemente/quic-go#2973](https://github.com/lucas-clemente/quic-go/pull/2973))
|
||||
- add a http3.RoundTripOpt to skip the request scheme check ([lucas-clemente/quic-go#2962](https://github.com/lucas-clemente/quic-go/pull/2962))
|
||||
- use the standard quic.Config in the deadline tests ([lucas-clemente/quic-go#2970](https://github.com/lucas-clemente/quic-go/pull/2970))
|
||||
- update golangci-lint to v1.34.1 ([lucas-clemente/quic-go#2964](https://github.com/lucas-clemente/quic-go/pull/2964))
|
||||
- update text about QUIC versions in the README ([lucas-clemente/quic-go#2975](https://github.com/lucas-clemente/quic-go/pull/2975))
|
||||
- remove stray TODO in the http3.Server
|
||||
- add support for Go 1.16 ([lucas-clemente/quic-go#2953](https://github.com/lucas-clemente/quic-go/pull/2953))
|
||||
- cancel reading on unidirectional streams when the stream type is unknown ([lucas-clemente/quic-go#2952](https://github.com/lucas-clemente/quic-go/pull/2952))
|
||||
- remove duplicate check of the URL scheme in the HTTP/3 client ([lucas-clemente/quic-go#2956](https://github.com/lucas-clemente/quic-go/pull/2956))
|
||||
- increase queueing duration in 0-RTT queue test to reduce flakiness ([lucas-clemente/quic-go#2954](https://github.com/lucas-clemente/quic-go/pull/2954))
|
||||
- implement the HTTP/3 Datagram negotiation ([lucas-clemente/quic-go#2951](https://github.com/lucas-clemente/quic-go/pull/2951))
|
||||
- implement HTTP/3 control stream handling ([lucas-clemente/quic-go#2949](https://github.com/lucas-clemente/quic-go/pull/2949))
|
||||
- fix flaky sentPacketHandler test ([lucas-clemente/quic-go#2950](https://github.com/lucas-clemente/quic-go/pull/2950))
|
||||
- don't retransmit PING frames added to ACK-only packets ([lucas-clemente/quic-go#2942](https://github.com/lucas-clemente/quic-go/pull/2942))
|
||||
- move the transport parameter stream limit check to the parser ([lucas-clemente/quic-go#2944](https://github.com/lucas-clemente/quic-go/pull/2944))
|
||||
- remove unused initialVersion variable in session ([lucas-clemente/quic-go#2946](https://github.com/lucas-clemente/quic-go/pull/2946))
|
||||
- remove unneeded check for the peer's transport parameters ([lucas-clemente/quic-go#2945](https://github.com/lucas-clemente/quic-go/pull/2945))
|
||||
- add the H3_MESSAGE_ERROR ([lucas-clemente/quic-go#2947](https://github.com/lucas-clemente/quic-go/pull/2947))
|
||||
- simplify Read and Write mock calls in http3 tests ([lucas-clemente/quic-go#2948](https://github.com/lucas-clemente/quic-go/pull/2948))
|
||||
- implement the datagram draft ([lucas-clemente/quic-go#2162](https://github.com/lucas-clemente/quic-go/pull/2162))
|
||||
- fix logging of bytes_in_flight when receiving an ACK ([lucas-clemente/quic-go#2937](https://github.com/lucas-clemente/quic-go/pull/2937))
|
||||
- trace when a packet is dropped because the receivedPackets chan is full ([lucas-clemente/quic-go#2939](https://github.com/lucas-clemente/quic-go/pull/2939))
|
||||
- various improvements to the packet number generator ([lucas-clemente/quic-go#2905](https://github.com/lucas-clemente/quic-go/pull/2905))
|
||||
- introduce a quic.Config.HandshakeIdleTimeout, remove HandshakeTimeout ([lucas-clemente/quic-go#2930](https://github.com/lucas-clemente/quic-go/pull/2930))
|
||||
- allow up to 20 byte for the initial connection IDs ([lucas-clemente/quic-go#2936](https://github.com/lucas-clemente/quic-go/pull/2936))
|
||||
- reduce memory footprint of undecryptable packet handling ([lucas-clemente/quic-go#2932](https://github.com/lucas-clemente/quic-go/pull/2932))
|
||||
- use a buffer from the pool for composing Retry packets ([lucas-clemente/quic-go#2934](https://github.com/lucas-clemente/quic-go/pull/2934))
|
||||
- release the packet buffer after sending a CONNECTION_CLOSE in the server ([lucas-clemente/quic-go#2935](https://github.com/lucas-clemente/quic-go/pull/2935))
|
||||
- move integration tests to GitHub Actions, disable Travis ([lucas-clemente/quic-go#2891](https://github.com/lucas-clemente/quic-go/pull/2891))
|
||||
- use golang.org/x/sys/unix instead of syscall ([lucas-clemente/quic-go#2927](https://github.com/lucas-clemente/quic-go/pull/2927))
|
||||
- add support for the connection_closed qlog event ([lucas-clemente/quic-go#2921](https://github.com/lucas-clemente/quic-go/pull/2921))
|
||||
- qlog tokens in NEW_TOKEN frames, Retry packets and Initial packets ([lucas-clemente/quic-go#2863](https://github.com/lucas-clemente/quic-go/pull/2863))
|
||||
- qlog the packet_type as part of the packet header, not the event itself ([lucas-clemente/quic-go#2758](https://github.com/lucas-clemente/quic-go/pull/2758))
|
||||
- use the new, streaming-friendly NDJSON-based qlog encoding ([lucas-clemente/quic-go#2736](https://github.com/lucas-clemente/quic-go/pull/2736))
|
||||
- add a generic Debug() function to the connection tracer ([lucas-clemente/quic-go#2909](https://github.com/lucas-clemente/quic-go/pull/2909))
|
||||
- remove unnecessary call to time.Now() when sending a packet ([lucas-clemente/quic-go#2911](https://github.com/lucas-clemente/quic-go/pull/2911))
|
||||
- remove support for quic-trace ([lucas-clemente/quic-go#2913](https://github.com/lucas-clemente/quic-go/pull/2913))
|
||||
- reduce the maximum number of ACK ranges ([lucas-clemente/quic-go#2887](https://github.com/lucas-clemente/quic-go/pull/2887))
|
||||
- don't allocate for acked packets ([lucas-clemente/quic-go#2899](https://github.com/lucas-clemente/quic-go/pull/2899))
|
||||
- avoid allocating when detecting lost packets ([lucas-clemente/quic-go#2898](https://github.com/lucas-clemente/quic-go/pull/2898))
|
||||
- use the string optimization for map keys in the packet handler map ([lucas-clemente/quic-go#2892](https://github.com/lucas-clemente/quic-go/pull/2892))
|
||||
- use a single map in the incoming streams map ([lucas-clemente/quic-go#2890](https://github.com/lucas-clemente/quic-go/pull/2890))
|
||||
- github.com/marten-seemann/qtls-go1-15 (v0.1.1 -> v0.1.4):
|
||||
- use a prefix for client session cache keys
|
||||
- add callbacks to store and restore app data along a session state
|
||||
- don't use TLS 1.3 compatibility mode when using alternative record layer
|
||||
- delete the session ticket after attempting 0-RTT
|
||||
- reject 0-RTT when a different ALPN is chosen
|
||||
- encode the ALPN into the session ticket
|
||||
- add a field to the ConnectionState to tell if 0-RTT was used
|
||||
- add a callback to tell the client about rejection of 0-RTT
|
||||
- don't offer 0-RTT after a HelloRetryRequest
|
||||
- add Accept0RTT to Config callback to decide if 0-RTT should be accepted
|
||||
- github.com/marten-seemann/qtls-go1-16 (null -> v0.1.3):
|
||||
- use a prefix for client session cache keys
|
||||
- add callbacks to store and restore app data along a session state
|
||||
- don't use TLS 1.3 compatibility mode when using alternative record layer
|
||||
- delete the session ticket after attempting 0-RTT
|
||||
- reject 0-RTT when a different ALPN is chosen
|
||||
- github.com/multiformats/go-multiaddr (v0.3.1 -> v0.3.2):
|
||||
- fix(net): export new net.Addr conversion registration functions ([multiformats/go-multiaddr#152](https://github.com/multiformats/go-multiaddr/pull/152))
|
||||
- sync: run go mod tidy (and set Go 1.15) and gofmt -s in copy workflow (#146) ([multiformats/go-multiaddr#146](https://github.com/multiformats/go-multiaddr/pull/146))
|
||||
- more linter fixes ([multiformats/go-multiaddr#145](https://github.com/multiformats/go-multiaddr/pull/145))
|
||||
- fix go vet and staticcheck failures ([multiformats/go-multiaddr#143](https://github.com/multiformats/go-multiaddr/pull/143))
|
||||
- don't listen on all interfaces in tests, unless on CI ([multiformats/go-multiaddr#136](https://github.com/multiformats/go-multiaddr/pull/136))
|
||||
- Fix Local Address on TCP connections ([multiformats/go-multiaddr#135](https://github.com/multiformats/go-multiaddr/pull/135))
|
||||
- github.com/multiformats/go-multiaddr-dns (v0.2.0 -> v0.3.1):
|
||||
- Normalize domains to fqdn for resolver selection ([multiformats/go-multiaddr-dns#27](https://github.com/multiformats/go-multiaddr-dns/pull/27))
|
||||
- refactor Resolver to support custom per-TLD resolvers ([multiformats/go-multiaddr-dns#26](https://github.com/multiformats/go-multiaddr-dns/pull/26))
|
||||
- feat: exposes backend ([multiformats/go-multiaddr-dns#25](https://github.com/multiformats/go-multiaddr-dns/pull/25))
|
||||
- github.com/multiformats/go-multihash (v0.0.14 -> v0.0.15):
|
||||
- Refactor registry system: no direct dependencies; expose standard hash.Hash; be a data carrier. ([multiformats/go-multihash#136](https://github.com/multiformats/go-multihash/pull/136))
|
||||
- github.com/multiformats/go-multistream (v0.2.0 -> v0.2.2):
|
||||
- change the simultaneous open protocol to /libp2p/simultaneous-connect ([multiformats/go-multistream#66](https://github.com/multiformats/go-multistream/pull/66))
|
||||
- fix the lazy stress read test on Windows ([multiformats/go-multistream#61](https://github.com/multiformats/go-multistream/pull/61))
|
||||
- fix go vet and staticcheck errors ([multiformats/go-multistream#60](https://github.com/multiformats/go-multistream/pull/60))
|
||||
- Implement simultaneous open extension ([multiformats/go-multistream#42](https://github.com/multiformats/go-multistream/pull/42))
|
||||
- reduce the number of streams in the stress tests, fix error handling ([multiformats/go-multistream#54](https://github.com/multiformats/go-multistream/pull/54))
|
||||
- github.com/whyrusleeping/cbor-gen (v0.0.0-20200710004633-5379fc63235d -> v0.0.0-20210219115102-f37d292932f2):
|
||||
- feat: allow unmarshaling of struct with more fields than marshaled struct ([whyrusleeping/cbor-gen#50](https://github.com/whyrusleeping/cbor-gen/pull/50))
|
||||
- chore: add a license file ([whyrusleeping/cbor-gen#49](https://github.com/whyrusleeping/cbor-gen/pull/49))
|
||||
- fix: enforce maxlen in ReadByteArray() ([whyrusleeping/cbor-gen#43](https://github.com/whyrusleeping/cbor-gen/pull/43))
|
||||
- use unix nanoseconds for encoding Cbortime ([whyrusleeping/cbor-gen#41](https://github.com/whyrusleeping/cbor-gen/pull/41))
|
||||
- add json marshalers to CborTime
|
||||
- add a helper for roundtripping time.time objects ([whyrusleeping/cbor-gen#40](https://github.com/whyrusleeping/cbor-gen/pull/40))
|
||||
- Add a validate function. ([whyrusleeping/cbor-gen#39](https://github.com/whyrusleeping/cbor-gen/pull/39))
|
||||
- Fix import handling ([whyrusleeping/cbor-gen#38](https://github.com/whyrusleeping/cbor-gen/pull/38))
|
||||
- Optimize discarding in ScanForLinks ([whyrusleeping/cbor-gen#36](https://github.com/whyrusleeping/cbor-gen/pull/36))
|
||||
- Always allocate scratch space when marshalling into a map. ([whyrusleeping/cbor-gen#37](https://github.com/whyrusleeping/cbor-gen/pull/37))
|
||||
- optimize byte reading ([whyrusleeping/cbor-gen#35](https://github.com/whyrusleeping/cbor-gen/pull/35))
|
||||
- Optimize decoding ([whyrusleeping/cbor-gen#34](https://github.com/whyrusleeping/cbor-gen/pull/34))
|
||||
- Fix named string issue ([whyrusleeping/cbor-gen#30](https://github.com/whyrusleeping/cbor-gen/pull/30))
|
||||
- Fix encoding/decoding fixed byte arrays ([whyrusleeping/cbor-gen#29](https://github.com/whyrusleeping/cbor-gen/pull/29))
|
||||
- fix overread on scanforlinks ([whyrusleeping/cbor-gen#28](https://github.com/whyrusleeping/cbor-gen/pull/28))
|
||||
|
||||
### ❤️ Contributors
|
||||
|
||||
| Contributor | Commits | Lines ± | Files Changed |
|
||||
|-------------|---------|---------|---------------|
|
||||
| Marten Seemann | 358 | +17444/-12000 | 1268 |
|
||||
| Eric Myhre | 82 | +9672/-2459 | 328 |
|
||||
| Ian Davis | 7 | +8421/-737 | 116 |
|
||||
| Daniel Martí | 18 | +2733/-4377 | 313 |
|
||||
| Adin Schmahmann | 46 | +5387/-1289 | 125 |
|
||||
| Steven Allen | 95 | +3278/-1861 | 200 |
|
||||
| hannahhoward | 14 | +1380/-3667 | 84 |
|
||||
| gammazero | 29 | +2520/-1161 | 88 |
|
||||
| Hector Sanjuan | 12 | +511/-3129 | 52 |
|
||||
| vyzo | 77 | +2198/-940 | 117 |
|
||||
| Will Scott | 12 | +912/-593 | 37 |
|
||||
| Dirk McCormick | 3 | +1384/-63 | 14 |
|
||||
| Andrew Gillis | 3 | +1231/-39 | 19 |
|
||||
| Marcin Rataj | 37 | +549/-308 | 72 |
|
||||
| Aarsh Shah | 13 | +668/-86 | 30 |
|
||||
| Olivier Poitrey | 1 | +469/-182 | 15 |
|
||||
| Rod Vagg | 9 | +364/-184 | 14 |
|
||||
| whyrusleeping | 5 | +253/-32 | 11 |
|
||||
| Cory Schwartz | 10 | +162/-115 | 37 |
|
||||
| Adrian Lanzafame | 8 | +212/-60 | 11 |
|
||||
| aarshkshah1992 | 7 | +102/-110 | 9 |
|
||||
| Jakub Sztandera | 7 | +126/-75 | 16 |
|
||||
| huoju | 4 | +127/-41 | 6 |
|
||||
| acruikshank | 6 | +32/-24 | 7 |
|
||||
| Toby | 1 | +41/-1 | 2 |
|
||||
| Naveen | 1 | +40/-0 | 1 |
|
||||
| Bogdan Stirbat | 1 | +22/-16 | 2 |
|
||||
| Kévin Dunglas | 1 | +32/-2 | 2 |
|
||||
| Nicholas Bollweg | 1 | +22/-0 | 1 |
|
||||
| q191201771 | 2 | +4/-11 | 2 |
|
||||
| Mathis Engelbart | 1 | +12/-2 | 1 |
|
||||
| requilence | 1 | +13/-0 | 1 |
|
||||
| divingpetrel | 1 | +7/-4 | 2 |
|
||||
| Oli Evans | 2 | +9/-2 | 3 |
|
||||
| Lucas Molas | 3 | +7/-3 | 3 |
|
||||
| RubenKelevra | 3 | +2/-6 | 3 |
|
||||
| Will | 1 | +1/-5 | 1 |
|
||||
| Jorropo | 1 | +4/-2 | 1 |
|
||||
| Ju Huo | 1 | +2/-2 | 1 |
|
||||
| zhoujiajie | 1 | +1/-1 | 1 |
|
||||
| Luflosi | 1 | +1/-1 | 1 |
|
||||
| Jonathan Rudenberg | 1 | +1/-1 | 1 |
|
||||
| David Pflug | 1 | +1/-1 | 1 |
|
||||
| Ari Mattila | 1 | +1/-1 | 1 |
|
||||
| Yingrong Zhao | 1 | +0/-1 | 1 |
|
||||
|
||||
## v0.8.0 2021-02-18
|
||||
|
||||
We're happy to announce go-ipfs 0.8.0! This is planned to be a fairly small release focused on integrating in the new pinning service/remote pinning [API](https://github.com/ipfs/pinning-services-api-spec) that makes the experience of managing pins across pinning services easier and more uniform.
|
||||
|
||||
18
README.md
18
README.md
@ -2,12 +2,8 @@
|
||||
|
||||

|
||||
|
||||
[](http://ipn.io)
|
||||
[](https://matrix.to/#/room/#ipfs:matrix.org)
|
||||
[](http://webchat.freenode.net/?channels=%23ipfs)
|
||||
[](https://discord.gg/24fmuwR)
|
||||
[](https://protocol.ai)
|
||||
[](https://godoc.org/github.com/ipfs/go-ipfs)
|
||||
[](https://github.com/RichardLitt/standard-readme)
|
||||
[](https://circleci.com/gh/ipfs/go-ipfs)
|
||||
|
||||
## What is IPFS?
|
||||
@ -22,6 +18,7 @@ Before opening an issue, consider using one of the following locations to ensure
|
||||
- IPFS _design_ in [ipfs/specs issues](https://github.com/ipfs/specs/issues).
|
||||
- Exploration of new ideas in [ipfs/notes issues](https://github.com/ipfs/notes/issues).
|
||||
- Ask questions and meet the rest of the community at the [IPFS Forum](https://discuss.ipfs.io).
|
||||
- Or [chat with us](https://docs.ipfs.io/community/chat/).
|
||||
|
||||
## Table of Contents
|
||||
|
||||
@ -144,10 +141,10 @@ $ sudo snap install ipfs
|
||||
|
||||
#### Chocolatey
|
||||
|
||||
The package [ipfs](https://chocolatey.org/packages/ipfs) currently points to go-ipfs and is being maintained.
|
||||
The package name is [go-ipfs](https://chocolatey.org/packages/go-ipfs):
|
||||
|
||||
```Powershell
|
||||
PS> choco install ipfs
|
||||
PS> choco install go-ipfs
|
||||
```
|
||||
|
||||
#### Scoop
|
||||
@ -222,8 +219,8 @@ dependencies as well.
|
||||
- _WARNING_: Older versions of OSX FUSE (for Mac OS X) can cause kernel panics when mounting!-
|
||||
We strongly recommend you use the [latest version of OSX FUSE](http://osxfuse.github.io/).
|
||||
(See https://github.com/ipfs/go-ipfs/issues/177)
|
||||
- For more details on setting up FUSE (so that you can mount the filesystem), see the docs folder.
|
||||
- Shell command completion is available in `misc/completion/ipfs-completion.bash`. Read [docs/command-completion.md](docs/command-completion.md) to learn how to install it.
|
||||
- Read [docs/fuse.md](docs/fuse.md) for more details on setting up FUSE (so that you can mount the filesystem).
|
||||
- Shell command completions can be generated with one of the `ipfs commands completion` subcommands. Read [docs/command-completion.md](docs/command-completion.md) to learn more.
|
||||
- See the [misc folder](https://github.com/ipfs/go-ipfs/tree/master/misc) for how to connect IPFS to systemd or whatever init system your distro uses.
|
||||
|
||||
### Updating go-ipfs
|
||||
@ -532,8 +529,7 @@ We ❤️ all [our contributors](docs/AUTHORS); this project wouldn’t be what
|
||||
|
||||
This repository falls under the IPFS [Code of Conduct](https://github.com/ipfs/community/blob/master/code-of-conduct.md).
|
||||
|
||||
You can contact us on the freenode #ipfs-dev channel or attend one of our
|
||||
[weekly calls](https://github.com/ipfs/team-mgmt/issues/674).
|
||||
Please reach out to us in one [chat](https://docs.ipfs.io/community/chat/) rooms.
|
||||
|
||||
## License
|
||||
|
||||
|
||||
136
bin/mkreleaselog
136
bin/mkreleaselog
@ -1,40 +1,78 @@
|
||||
#!/bin/zsh
|
||||
#set -x
|
||||
#
|
||||
# Invocation: mkreleaselog [FIRST_REF [LAST_REF]]
|
||||
|
||||
set -euo pipefail
|
||||
export GO111MODULE=on
|
||||
export GOPATH="$(go env GOPATH)"
|
||||
|
||||
alias jq="jq --unbuffered"
|
||||
|
||||
AUTHORS=(
|
||||
# List of PCRE regular expressions to match "included" modules.
|
||||
INCLUDE_MODULES=(
|
||||
# orgs
|
||||
ipfs
|
||||
ipld
|
||||
libp2p
|
||||
multiformats
|
||||
filecoin-project
|
||||
ipfs-shipyard
|
||||
"^github.com/ipfs/"
|
||||
"^github.com/ipld/"
|
||||
"^github.com/libp2p/"
|
||||
"^github.com/multiformats/"
|
||||
"^github.com/filecoin-project/"
|
||||
"^github.com/ipfs-shipyard/"
|
||||
|
||||
# Authors of personal repos used by go-ipfs that should be mentioned in the
|
||||
# Authors of personal modules used by go-ipfs that should be mentioned in the
|
||||
# release notes.
|
||||
whyrusleeping
|
||||
Kubuxu
|
||||
jbenet
|
||||
Stebalien
|
||||
marten-seemann
|
||||
hsanjuan
|
||||
lucas-clemente
|
||||
warpfork
|
||||
"^github.com/whyrusleeping/"
|
||||
"^github.com/Kubuxu/"
|
||||
"^github.com/jbenet/"
|
||||
"^github.com/Stebalien/"
|
||||
"^github.com/marten-seemann/"
|
||||
"^github.com/hsanjuan/"
|
||||
"^github.com/lucas-clemente/"
|
||||
"^github.com/warpfork/"
|
||||
)
|
||||
|
||||
[[ -n "${REPO_FILTER+x}" ]] || REPO_FILTER="github.com/(${$(printf "|%s" "${AUTHORS[@]}"):1})"
|
||||
# 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"
|
||||
".circleci"
|
||||
"*.pb.go"
|
||||
"cbor_gen.go"
|
||||
"ipldsch_*.go"
|
||||
)
|
||||
|
||||
##########################################################################################
|
||||
|
||||
if [[ ${#INCLUDE_MODULES[@]} -gt 0 ]]; then
|
||||
INCLUDE_REGEX="(${$(printf "|%s" "${INCLUDE_MODULES[@]}"):1})"
|
||||
else
|
||||
INCLUDE_REGEX="" # "match anything"
|
||||
fi
|
||||
|
||||
if [[ ${#EXCLUDE_MODULES[@]} -gt 0 ]]; then
|
||||
EXCLUDE_REGEX="(${$(printf "|%s" "${EXCLUDE_MODULES[@]}"):1})"
|
||||
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
|
||||
|
||||
[[ -n "${IGNORED_FILES+x}" ]] || IGNORED_FILES='^\(\.gx\|package\.json\|\.travis\.yml\|go\.mod\|go\.sum\|\.github\|\.circleci\|.*\.pb\.go\|cbor_gen\.go\|.*ipldsch.*\.go\)$'
|
||||
|
||||
NL=$'\n'
|
||||
|
||||
ROOT_DIR="$(git rev-parse --show-toplevel)"
|
||||
|
||||
alias jq="jq --unbuffered"
|
||||
|
||||
msg() {
|
||||
echo "$*" >&2
|
||||
}
|
||||
@ -49,13 +87,15 @@ statlog() {
|
||||
mailmap_file="$ROOT_DIR/.mailmap"
|
||||
fi
|
||||
|
||||
git -C "$rpath" -c mailmap.file="$mailmap_file" log --use-mailmap --shortstat --no-merges --pretty="tformat:%H%n%aN%n%aE" "$start..$end" -- . ':^*\.pb\.go' ':^*ipldsch*\.go' ':^cbor_gen\.go\' ':^go\.mod' ':^go\.sum' | while
|
||||
read hash
|
||||
read name
|
||||
read email
|
||||
read _ # empty line
|
||||
read changes
|
||||
do
|
||||
local stack=()
|
||||
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[@]}" | while read -r line; do
|
||||
if [[ -n "$line" ]]; then
|
||||
stack+=("$line")
|
||||
continue
|
||||
fi
|
||||
|
||||
read -r changes
|
||||
|
||||
changed=0
|
||||
insertions=0
|
||||
deletions=0
|
||||
@ -72,14 +112,18 @@ statlog() {
|
||||
fi
|
||||
done<<<"${changes//,/$NL}"
|
||||
|
||||
jq -n \
|
||||
--arg "hash" "$hash" \
|
||||
--arg "name" "$name" \
|
||||
--arg "email" "$email" \
|
||||
--argjson "changed" "$changed" \
|
||||
--argjson "insertions" "$insertions" \
|
||||
--argjson "deletions" "$deletions" \
|
||||
'{Commit: $hash, Author: $name, Email: $email, Files: $changed, Insertions: $insertions, Deletions: $deletions}'
|
||||
for author in "${stack[@]}"; do
|
||||
IFS=$'\t' read -r hash name email <<<"$author"
|
||||
jq -n \
|
||||
--arg "hash" "$hash" \
|
||||
--arg "name" "$name" \
|
||||
--arg "email" "$email" \
|
||||
--argjson "changed" "$changed" \
|
||||
--argjson "insertions" "$insertions" \
|
||||
--argjson "deletions" "$deletions" \
|
||||
'{Commit: $hash, Author: $name, Email: $email, Files: $changed, Insertions: $insertions, Deletions: $deletions}'
|
||||
done
|
||||
stack=()
|
||||
done
|
||||
}
|
||||
|
||||
@ -103,6 +147,16 @@ pr_link() {
|
||||
printf -- "[%s#%s](https://%s/pull/%s)" "$ghname" "$prnum" "$repo" "$prnum"
|
||||
}
|
||||
|
||||
ignored_commit() {
|
||||
local commit="$1"
|
||||
local matches
|
||||
|
||||
# Check to see if this commit includes any non-ignored files.
|
||||
matches=$(git -C "$dir" diff-tree --no-commit-id --name-only -r "$commit" \
|
||||
-- "${IGNORE_FILES_PATHSPEC[@]}" | wc -l)
|
||||
[[ "$matches" -eq 0 ]]
|
||||
}
|
||||
|
||||
# Generate a release log for a range of commits in a single repo.
|
||||
release_log() {
|
||||
setopt local_options BASH_REMATCH
|
||||
@ -119,9 +173,10 @@ release_log() {
|
||||
--first-parent \
|
||||
"$start..$end" |
|
||||
while read commit subject; do
|
||||
# Skip gx-only PRs.
|
||||
git -C "$dir" diff-tree --no-commit-id --name-only "$commit^" "$commit" |
|
||||
grep -v "${IGNORED_FILES}" >/dev/null || continue
|
||||
# Skip commits that only touch ignored files.
|
||||
if ignored_commit "$commit"; then
|
||||
continue
|
||||
fi
|
||||
|
||||
if [[ "$subject" =~ '^Merge pull request #([0-9]+) from' ]]; then
|
||||
local prnum="${BASH_REMATCH[2]}"
|
||||
@ -211,7 +266,8 @@ recursive_release_log() {
|
||||
statlog "$module" "$start" "$end" > statlog.json
|
||||
|
||||
dep_changes old_deps.json new_deps.json |
|
||||
jq --arg filter "$REPO_FILTER" 'select(.Path | match($filter))' |
|
||||
jq --arg inc "$INCLUDE_REGEX" --arg exc "$EXCLUDE_REGEX" \
|
||||
'select(.Path | test($inc)) | select(.Path | test($exc) | not)' |
|
||||
# Compute changelogs
|
||||
jq -r '"\(.Path) \(.New.Version) \(.New.Ref) \(.Old.Version) \(.Old.Ref // "")"' |
|
||||
while read module new new_ref old old_ref; do
|
||||
|
||||
@ -2,17 +2,13 @@ package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"net/url"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
config "github.com/ipfs/go-ipfs-config"
|
||||
"github.com/ipfs/go-ipfs-files"
|
||||
"github.com/ipfs/go-ipfs/core"
|
||||
"github.com/ipfs/go-ipfs/core/coreapi"
|
||||
@ -24,140 +20,7 @@ import (
|
||||
"github.com/libp2p/go-libp2p-core/peer"
|
||||
)
|
||||
|
||||
// readMigrationConfig reads the migration config out of the config, avoiding
|
||||
// reading anything other than the migration section. That way, we're free to
|
||||
// make arbitrary changes to all _other_ sections in migrations.
|
||||
func readMigrationConfig(repoRoot string) (*config.Migration, error) {
|
||||
var cfg struct {
|
||||
Migration config.Migration
|
||||
}
|
||||
|
||||
cfgPath, err := config.Filename(repoRoot)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
cfgFile, err := os.Open(cfgPath)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer cfgFile.Close()
|
||||
|
||||
err = json.NewDecoder(cfgFile).Decode(&cfg)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
switch cfg.Migration.Keep {
|
||||
case "":
|
||||
cfg.Migration.Keep = config.DefaultMigrationKeep
|
||||
case "discard", "cache", "keep":
|
||||
default:
|
||||
return nil, errors.New("unknown config value, Migrations.Keep must be 'cache', 'pin', or 'discard'")
|
||||
}
|
||||
|
||||
if len(cfg.Migration.DownloadSources) == 0 {
|
||||
cfg.Migration.DownloadSources = config.DefaultMigrationDownloadSources
|
||||
}
|
||||
|
||||
return &cfg.Migration, nil
|
||||
}
|
||||
|
||||
func readIpfsConfig(repoRoot *string) (bootstrap []string, peers []peer.AddrInfo) {
|
||||
if repoRoot == nil {
|
||||
return
|
||||
}
|
||||
|
||||
cfgPath, err := config.Filename(*repoRoot)
|
||||
if err != nil {
|
||||
fmt.Fprintln(os.Stderr, err)
|
||||
return
|
||||
}
|
||||
|
||||
cfgFile, err := os.Open(cfgPath)
|
||||
if err != nil {
|
||||
fmt.Fprintln(os.Stderr, err)
|
||||
return
|
||||
}
|
||||
defer cfgFile.Close()
|
||||
|
||||
// Attempt to read bootstrap addresses
|
||||
var bootstrapCfg struct {
|
||||
Bootstrap []string
|
||||
}
|
||||
err = json.NewDecoder(cfgFile).Decode(&bootstrapCfg)
|
||||
if err != nil {
|
||||
fmt.Fprintln(os.Stderr, "cannot read bootstrap peers from config")
|
||||
} else {
|
||||
bootstrap = bootstrapCfg.Bootstrap
|
||||
}
|
||||
|
||||
if _, err = cfgFile.Seek(0, 0); err != nil {
|
||||
fmt.Fprintln(os.Stderr, err)
|
||||
}
|
||||
|
||||
// Attempt to read peers
|
||||
var peeringCfg struct {
|
||||
Peering config.Peering
|
||||
}
|
||||
err = json.NewDecoder(cfgFile).Decode(&peeringCfg)
|
||||
if err != nil {
|
||||
fmt.Fprintln(os.Stderr, "cannot read peering from config")
|
||||
} else {
|
||||
peers = peeringCfg.Peering.Peers
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// getMigrationFetcher creates one or more fetchers according to
|
||||
// config.Migration.DownloadSources. If an IpfsFetcher is required, then
|
||||
// bootstrap and peer information in read from the config file in repoRoot,
|
||||
// unless repoRoot is nil.
|
||||
func getMigrationFetcher(cfg *config.Migration, repoRoot *string) (migrations.Fetcher, error) {
|
||||
const httpUserAgent = "go-ipfs"
|
||||
|
||||
// Fetch migrations from current distribution, or location from environ
|
||||
fetchDistPath := migrations.GetDistPathEnv(migrations.CurrentIpfsDist)
|
||||
|
||||
var fetchers []migrations.Fetcher
|
||||
for _, src := range cfg.DownloadSources {
|
||||
src := strings.TrimSpace(src)
|
||||
switch src {
|
||||
case "IPFS", "ipfs":
|
||||
bootstrap, peers := readIpfsConfig(repoRoot)
|
||||
fetchers = append(fetchers, ipfsfetcher.NewIpfsFetcher(fetchDistPath, 0, bootstrap, peers))
|
||||
case "HTTPS", "https", "HTTP", "http":
|
||||
fetchers = append(fetchers, migrations.NewHttpFetcher(fetchDistPath, "", httpUserAgent, 0))
|
||||
default:
|
||||
u, err := url.Parse(src)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("bad gateway address: %s", err)
|
||||
}
|
||||
switch u.Scheme {
|
||||
case "":
|
||||
u.Scheme = "https"
|
||||
case "https", "http":
|
||||
default:
|
||||
return nil, errors.New("bad gateway address: url scheme must be http or https")
|
||||
}
|
||||
fetchers = append(fetchers, migrations.NewHttpFetcher(fetchDistPath, u.String(), httpUserAgent, 0))
|
||||
case "":
|
||||
// Ignore empty string
|
||||
}
|
||||
}
|
||||
if len(fetchers) == 0 {
|
||||
return nil, errors.New("no sources specified")
|
||||
}
|
||||
|
||||
if len(fetchers) == 1 {
|
||||
return fetchers[0], nil
|
||||
}
|
||||
|
||||
// Wrap fetchers in a MultiFetcher to try them in order
|
||||
return migrations.NewMultiFetcher(fetchers...), nil
|
||||
}
|
||||
|
||||
// addMigrations adds any migration downloaded by the fetcher to the IPFS node
|
||||
func addMigrations(ctx context.Context, node *core.IpfsNode, fetcher migrations.Fetcher, pin bool) error {
|
||||
var fetchers []migrations.Fetcher
|
||||
if mf, ok := fetcher.(*migrations.MultiFetcher); ok {
|
||||
@ -12,6 +12,7 @@ import (
|
||||
"runtime"
|
||||
"sort"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
multierror "github.com/hashicorp/go-multierror"
|
||||
|
||||
@ -22,12 +23,14 @@ import (
|
||||
oldcmds "github.com/ipfs/go-ipfs/commands"
|
||||
"github.com/ipfs/go-ipfs/core"
|
||||
commands "github.com/ipfs/go-ipfs/core/commands"
|
||||
"github.com/ipfs/go-ipfs/core/coreapi"
|
||||
corehttp "github.com/ipfs/go-ipfs/core/corehttp"
|
||||
corerepo "github.com/ipfs/go-ipfs/core/corerepo"
|
||||
libp2p "github.com/ipfs/go-ipfs/core/node/libp2p"
|
||||
nodeMount "github.com/ipfs/go-ipfs/fuse/node"
|
||||
fsrepo "github.com/ipfs/go-ipfs/repo/fsrepo"
|
||||
"github.com/ipfs/go-ipfs/repo/fsrepo/migrations"
|
||||
"github.com/ipfs/go-ipfs/repo/fsrepo/migrations/ipfsfetcher"
|
||||
sockets "github.com/libp2p/go-socket-activation"
|
||||
|
||||
cmds "github.com/ipfs/go-ipfs-cmds"
|
||||
@ -292,12 +295,26 @@ func daemonFunc(req *cmds.Request, re cmds.ResponseEmitter, env cmds.Environment
|
||||
return fmt.Errorf("fs-repo requires migration")
|
||||
}
|
||||
|
||||
migrationCfg, err := readMigrationConfig(cctx.ConfigRoot)
|
||||
// Read Migration section of IPFS config
|
||||
migrationCfg, err := migrations.ReadMigrationConfig(cctx.ConfigRoot)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
fetcher, err = getMigrationFetcher(migrationCfg, &cctx.ConfigRoot)
|
||||
// Define function to create IPFS fetcher. Do not supply an
|
||||
// already-constructed IPFS fetcher, because this may be expensive and
|
||||
// not needed according to migration config. Instead, supply a function
|
||||
// to construct the particular IPFS fetcher implementation used here,
|
||||
// which is called only if an IPFS fetcher is needed.
|
||||
newIpfsFetcher := func(distPath string) migrations.Fetcher {
|
||||
return ipfsfetcher.NewIpfsFetcher(distPath, 0, &cctx.ConfigRoot)
|
||||
}
|
||||
|
||||
// Fetch migrations from current distribution, or location from environ
|
||||
fetchDistPath := migrations.GetDistPathEnv(migrations.CurrentIpfsDist)
|
||||
|
||||
// Create fetchers according to migrationCfg.DownloadSources
|
||||
fetcher, err = migrations.GetMigrationFetcher(migrationCfg.DownloadSources, fetchDistPath, newIpfsFetcher)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -458,7 +475,7 @@ func daemonFunc(req *cmds.Request, re cmds.ResponseEmitter, env cmds.Environment
|
||||
if cacheMigrations || pinMigrations {
|
||||
err = addMigrations(cctx.Context(), node, fetcher, pinMigrations)
|
||||
if err != nil {
|
||||
fmt.Fprintln(os.Stderr, "Could not add migragion to IPFS:", err)
|
||||
fmt.Fprintln(os.Stderr, "Could not add migration to IPFS:", err)
|
||||
}
|
||||
// Remove download directory so that it does not remain for lifetime of
|
||||
// daemon or get left behind if daemon has a hard exit
|
||||
@ -510,6 +527,33 @@ func daemonFunc(req *cmds.Request, re cmds.ResponseEmitter, env cmds.Environment
|
||||
fmt.Println("(Hit ctrl-c again to force-shutdown the daemon.)")
|
||||
}()
|
||||
|
||||
// Give the user heads up if daemon running in online mode has no peers after 1 minute
|
||||
if !offline {
|
||||
time.AfterFunc(1*time.Minute, func() {
|
||||
cfg, err := cctx.GetConfig()
|
||||
if err != nil {
|
||||
log.Errorf("failed to access config: %s", err)
|
||||
}
|
||||
if len(cfg.Bootstrap) == 0 && len(cfg.Peering.Peers) == 0 {
|
||||
// Skip peer check if Bootstrap and Peering lists are empty
|
||||
// (means user disabled them on purpose)
|
||||
log.Warn("skipping bootstrap: empty Bootstrap and Peering lists")
|
||||
return
|
||||
}
|
||||
ipfs, err := coreapi.NewCoreAPI(node)
|
||||
if err != nil {
|
||||
log.Errorf("failed to access CoreAPI: %v", err)
|
||||
}
|
||||
peers, err := ipfs.Swarm().Peers(cctx.Context())
|
||||
if err != nil {
|
||||
log.Errorf("failed to read swarm peers: %v", err)
|
||||
}
|
||||
if len(peers) == 0 {
|
||||
log.Error("failed to bootstrap (no peers found): consider updating Bootstrap or Peering section of your config")
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// collect long-running errors and block for shutdown
|
||||
// TODO(cryptix): our fuse currently doesn't follow this pattern for graceful shutdown
|
||||
var errs error
|
||||
|
||||
@ -1,312 +0,0 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
config "github.com/ipfs/go-ipfs-config"
|
||||
"github.com/ipfs/go-ipfs/repo/fsrepo/migrations"
|
||||
"github.com/ipfs/go-ipfs/repo/fsrepo/migrations/ipfsfetcher"
|
||||
)
|
||||
|
||||
var testConfig = `
|
||||
{
|
||||
"Bootstrap": [
|
||||
"/dnsaddr/bootstrap.libp2p.io/p2p/QmcZf59bWwK5XFi76CZX8cbJ4BhTzzA3gU1ZjYZcYW3dwt",
|
||||
"/ip4/104.131.131.82/tcp/4001/p2p/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ"
|
||||
],
|
||||
"Migration": {
|
||||
"DownloadSources": ["IPFS", "HTTP", "127.0.0.1", "https://127.0.1.1"],
|
||||
"Keep": "cache"
|
||||
},
|
||||
"Peering": {
|
||||
"Peers": [
|
||||
{
|
||||
"ID": "12D3KooWGC6TvWhfapngX6wvJHMYvKpDMXPb3ZnCZ6dMoaMtimQ5",
|
||||
"Addrs": ["/ip4/127.0.0.1/tcp/4001", "/ip4/127.0.0.1/udp/4001/quic"]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
`
|
||||
|
||||
func TestReadMigrationConfigDefaults(t *testing.T) {
|
||||
tmpDir := makeConfig("{}")
|
||||
defer os.RemoveAll(tmpDir)
|
||||
|
||||
cfg, err := readMigrationConfig(tmpDir)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if cfg.Keep != config.DefaultMigrationKeep {
|
||||
t.Error("expected default value for Keep")
|
||||
}
|
||||
|
||||
if len(cfg.DownloadSources) != len(config.DefaultMigrationDownloadSources) {
|
||||
t.Fatal("expected default number of download sources")
|
||||
}
|
||||
for i, src := range config.DefaultMigrationDownloadSources {
|
||||
if cfg.DownloadSources[i] != src {
|
||||
t.Errorf("wrong DownloadSource: %s", cfg.DownloadSources[i])
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestReadMigrationConfigErrors(t *testing.T) {
|
||||
tmpDir := makeConfig(`{"Migration": {"Keep": "badvalue"}}`)
|
||||
defer os.RemoveAll(tmpDir)
|
||||
|
||||
_, err := readMigrationConfig(tmpDir)
|
||||
if err == nil {
|
||||
t.Fatal("expected error")
|
||||
}
|
||||
if !strings.HasPrefix(err.Error(), "unknown") {
|
||||
t.Fatal("did not get expected error:", err)
|
||||
}
|
||||
|
||||
os.RemoveAll(tmpDir)
|
||||
_, err = readMigrationConfig(tmpDir)
|
||||
if err == nil {
|
||||
t.Fatal("expected error")
|
||||
}
|
||||
|
||||
bootstrap, peers := readIpfsConfig(&tmpDir)
|
||||
if bootstrap != nil {
|
||||
t.Error("expected nil bootstrap")
|
||||
}
|
||||
if peers != nil {
|
||||
t.Error("expected nil peers")
|
||||
}
|
||||
|
||||
tmpDir = makeConfig(`}{`)
|
||||
defer os.RemoveAll(tmpDir)
|
||||
_, err = readMigrationConfig(tmpDir)
|
||||
if err == nil {
|
||||
t.Fatal("expected error")
|
||||
}
|
||||
}
|
||||
|
||||
func TestReadMigrationConfig(t *testing.T) {
|
||||
tmpDir := makeConfig(testConfig)
|
||||
defer os.RemoveAll(tmpDir)
|
||||
|
||||
cfg, err := readMigrationConfig(tmpDir)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if len(cfg.DownloadSources) != 4 {
|
||||
t.Fatal("wrong number of DownloadSources")
|
||||
}
|
||||
expect := []string{"IPFS", "HTTP", "127.0.0.1", "https://127.0.1.1"}
|
||||
for i := range expect {
|
||||
if cfg.DownloadSources[i] != expect[i] {
|
||||
t.Errorf("wrong DownloadSource at %d", i)
|
||||
}
|
||||
}
|
||||
|
||||
if cfg.Keep != "cache" {
|
||||
t.Error("wrong value for Keep")
|
||||
}
|
||||
}
|
||||
|
||||
func TestReadIpfsConfig(t *testing.T) {
|
||||
tmpDir := makeConfig(testConfig)
|
||||
defer os.RemoveAll(tmpDir)
|
||||
|
||||
bootstrap, peers := readIpfsConfig(nil)
|
||||
if bootstrap != nil || peers != nil {
|
||||
t.Fatal("expected nil ipfs config items")
|
||||
}
|
||||
|
||||
bootstrap, peers = readIpfsConfig(&tmpDir)
|
||||
if len(bootstrap) != 2 {
|
||||
t.Fatal("wrong number of bootstrap addresses")
|
||||
}
|
||||
if bootstrap[0] != "/dnsaddr/bootstrap.libp2p.io/p2p/QmcZf59bWwK5XFi76CZX8cbJ4BhTzzA3gU1ZjYZcYW3dwt" {
|
||||
t.Fatal("wrong bootstrap address")
|
||||
}
|
||||
|
||||
if len(peers) != 1 {
|
||||
t.Fatal("wrong number of peers")
|
||||
}
|
||||
|
||||
peer := peers[0]
|
||||
if peer.ID.String() != "12D3KooWGC6TvWhfapngX6wvJHMYvKpDMXPb3ZnCZ6dMoaMtimQ5" {
|
||||
t.Errorf("wrong ID for first peer")
|
||||
}
|
||||
if len(peer.Addrs) != 2 {
|
||||
t.Error("wrong number of addrs for first peer")
|
||||
}
|
||||
}
|
||||
|
||||
func TestReadPartialIpfsConfig(t *testing.T) {
|
||||
const (
|
||||
configBadBootstrap = `
|
||||
{
|
||||
"Bootstrap": "unreadable",
|
||||
"Migration": {
|
||||
"DownloadSources": ["IPFS", "HTTP", "127.0.0.1"],
|
||||
"Keep": "cache"
|
||||
},
|
||||
"Peering": {
|
||||
"Peers": [
|
||||
{
|
||||
"ID": "12D3KooWGC6TvWhfapngX6wvJHMYvKpDMXPb3ZnCZ6dMoaMtimQ5",
|
||||
"Addrs": ["/ip4/127.0.0.1/tcp/4001", "/ip4/127.0.0.1/udp/4001/quic"]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
`
|
||||
configBadPeers = `
|
||||
{
|
||||
"Bootstrap": [
|
||||
"/dnsaddr/bootstrap.libp2p.io/p2p/QmcZf59bWwK5XFi76CZX8cbJ4BhTzzA3gU1ZjYZcYW3dwt",
|
||||
"/ip4/104.131.131.82/tcp/4001/p2p/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ"
|
||||
],
|
||||
"Migration": {
|
||||
"DownloadSources": ["IPFS", "HTTP", "127.0.0.1"],
|
||||
"Keep": "cache"
|
||||
},
|
||||
"Peering": "Unreadable-data"
|
||||
}
|
||||
`
|
||||
)
|
||||
|
||||
tmpDir := makeConfig(configBadBootstrap)
|
||||
defer os.RemoveAll(tmpDir)
|
||||
|
||||
bootstrap, peers := readIpfsConfig(&tmpDir)
|
||||
if bootstrap != nil {
|
||||
t.Fatal("expected nil bootstrap")
|
||||
}
|
||||
if len(peers) != 1 {
|
||||
t.Fatal("wrong number of peers")
|
||||
}
|
||||
if len(peers[0].Addrs) != 2 {
|
||||
t.Error("wrong number of addrs for first peer")
|
||||
}
|
||||
os.RemoveAll(tmpDir)
|
||||
|
||||
tmpDir = makeConfig(configBadPeers)
|
||||
defer os.RemoveAll(tmpDir)
|
||||
|
||||
bootstrap, peers = readIpfsConfig(&tmpDir)
|
||||
if peers != nil {
|
||||
t.Fatal("expected nil peers")
|
||||
}
|
||||
if len(bootstrap) != 2 {
|
||||
t.Fatal("wrong number of bootstrap addresses")
|
||||
}
|
||||
if bootstrap[0] != "/dnsaddr/bootstrap.libp2p.io/p2p/QmcZf59bWwK5XFi76CZX8cbJ4BhTzzA3gU1ZjYZcYW3dwt" {
|
||||
t.Fatal("wrong bootstrap address")
|
||||
}
|
||||
}
|
||||
|
||||
func makeConfig(configData string) string {
|
||||
tmpDir, err := ioutil.TempDir("", "migration_test")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
cfgFile, err := os.Create(filepath.Join(tmpDir, "config"))
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
if _, err = cfgFile.Write([]byte(configData)); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
if err = cfgFile.Close(); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return tmpDir
|
||||
}
|
||||
|
||||
func TestGetMigrationFetcher(t *testing.T) {
|
||||
var f migrations.Fetcher
|
||||
var err error
|
||||
|
||||
cfg := &config.Migration{}
|
||||
|
||||
cfg.DownloadSources = []string{"ftp://bad.gateway.io"}
|
||||
_, err = getMigrationFetcher(cfg, nil)
|
||||
if err == nil || !strings.HasPrefix(err.Error(), "bad gateway addr") {
|
||||
t.Fatal("Expected bad gateway address error, got:", err)
|
||||
}
|
||||
|
||||
cfg.DownloadSources = []string{"::bad.gateway.io"}
|
||||
_, err = getMigrationFetcher(cfg, nil)
|
||||
if err == nil || !strings.HasPrefix(err.Error(), "bad gateway addr") {
|
||||
t.Fatal("Expected bad gateway address error, got:", err)
|
||||
}
|
||||
|
||||
cfg.DownloadSources = []string{"http://localhost"}
|
||||
f, err = getMigrationFetcher(cfg, nil)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if _, ok := f.(*migrations.HttpFetcher); !ok {
|
||||
t.Fatal("expected HttpFetcher")
|
||||
}
|
||||
|
||||
cfg.DownloadSources = []string{"ipfs"}
|
||||
f, err = getMigrationFetcher(cfg, nil)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if _, ok := f.(*ipfsfetcher.IpfsFetcher); !ok {
|
||||
t.Fatal("expected IpfsFetcher")
|
||||
}
|
||||
|
||||
cfg.DownloadSources = []string{"http"}
|
||||
f, err = getMigrationFetcher(cfg, nil)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if _, ok := f.(*migrations.HttpFetcher); !ok {
|
||||
t.Fatal("expected HttpFetcher")
|
||||
}
|
||||
|
||||
cfg.DownloadSources = []string{"IPFS", "HTTPS"}
|
||||
f, err = getMigrationFetcher(cfg, nil)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
mf, ok := f.(*migrations.MultiFetcher)
|
||||
if !ok {
|
||||
t.Fatal("expected MultiFetcher")
|
||||
}
|
||||
if mf.Len() != 2 {
|
||||
t.Fatal("expected 2 fetchers in MultiFetcher")
|
||||
}
|
||||
|
||||
cfg.DownloadSources = []string{"ipfs", "https", "some.domain.io"}
|
||||
f, err = getMigrationFetcher(cfg, nil)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
mf, ok = f.(*migrations.MultiFetcher)
|
||||
if !ok {
|
||||
t.Fatal("expected MultiFetcher")
|
||||
}
|
||||
if mf.Len() != 3 {
|
||||
t.Fatal("expected 3 fetchers in MultiFetcher")
|
||||
}
|
||||
|
||||
cfg.DownloadSources = nil
|
||||
_, err = getMigrationFetcher(cfg, nil)
|
||||
if err == nil {
|
||||
t.Fatal("expected error when no sources specified")
|
||||
}
|
||||
|
||||
cfg.DownloadSources = []string{"", ""}
|
||||
_, err = getMigrationFetcher(cfg, nil)
|
||||
if err == nil {
|
||||
t.Fatal("expected error when empty string fetchers specified")
|
||||
}
|
||||
}
|
||||
@ -138,9 +138,9 @@ func pinAllMFS(ctx context.Context, node pinMFSNode, cfg *config.Config, rootCid
|
||||
for svcName_, svcConfig_ := range cfg.Pinning.RemoteServices {
|
||||
// skip services where MFS is not enabled
|
||||
svcName, svcConfig := svcName_, svcConfig_
|
||||
mfslog.Debugf("pinning considering service %s for mfs pinning", svcName)
|
||||
mfslog.Debugf("pinning MFS root considering service %q", svcName)
|
||||
if !svcConfig.Policies.MFS.Enable {
|
||||
mfslog.Debugf("pinning service %s is not enabled", svcName)
|
||||
mfslog.Debugf("pinning service %q is not enabled", svcName)
|
||||
ch <- lastPin{}
|
||||
continue
|
||||
}
|
||||
@ -153,7 +153,7 @@ func pinAllMFS(ctx context.Context, node pinMFSNode, cfg *config.Config, rootCid
|
||||
repinInterval, err = time.ParseDuration(svcConfig.Policies.MFS.RepinInterval)
|
||||
if err != nil {
|
||||
select {
|
||||
case errCh <- fmt.Errorf("remote pinning service %s has invalid MFS.RepinInterval (%v)", svcName, err):
|
||||
case errCh <- fmt.Errorf("remote pinning service %q has invalid MFS.RepinInterval (%v)", svcName, err):
|
||||
case <-ctx.Done():
|
||||
}
|
||||
ch <- lastPin{}
|
||||
@ -165,20 +165,20 @@ func pinAllMFS(ctx context.Context, node pinMFSNode, cfg *config.Config, rootCid
|
||||
if last, ok := lastPins[svcName]; ok {
|
||||
if last.ServiceConfig == svcConfig && (last.CID == rootCid || time.Since(last.Time) < repinInterval) {
|
||||
if last.CID == rootCid {
|
||||
mfslog.Debugf("pinning MFS root to %s: pin for %s exists since %s, skipping", svcName, rootCid, last.Time.String())
|
||||
mfslog.Debugf("pinning MFS root to %q: pin for %q exists since %s, skipping", svcName, rootCid, last.Time.String())
|
||||
} else {
|
||||
mfslog.Debugf("pinning MFS root to %s: skipped due to MFS.RepinInterval=%s (remaining: %s)", svcName, repinInterval.String(), (repinInterval - time.Since(last.Time)).String())
|
||||
mfslog.Debugf("pinning MFS root to %q: skipped due to MFS.RepinInterval=%s (remaining: %s)", svcName, repinInterval.String(), (repinInterval - time.Since(last.Time)).String())
|
||||
}
|
||||
ch <- lastPin{}
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
mfslog.Debugf("pinning MFS root %s to %s", rootCid, svcName)
|
||||
mfslog.Debugf("pinning MFS root %q to %q", rootCid, svcName)
|
||||
go func() {
|
||||
if r, err := pinMFS(ctx, node, rootCid, svcName, svcConfig); err != nil {
|
||||
select {
|
||||
case errCh <- fmt.Errorf("pinning MFS root %s to %s (%v)", rootCid, svcName, err):
|
||||
case errCh <- fmt.Errorf("pinning MFS root %q to %q (%v)", rootCid, svcName, err):
|
||||
case <-ctx.Done():
|
||||
}
|
||||
ch <- lastPin{}
|
||||
@ -212,12 +212,18 @@ func pinMFS(
|
||||
pinStatuses := []pinclient.Status{pinclient.StatusQueued, pinclient.StatusPinning, pinclient.StatusPinned, pinclient.StatusFailed}
|
||||
lsPinCh, lsErrCh := c.Ls(ctx, pinclient.PinOpts.FilterName(pinName), pinclient.PinOpts.FilterStatus(pinStatuses...))
|
||||
existingRequestID := "" // is there any pre-existing MFS pin with pinName (for any CID)?
|
||||
alreadyPinned := false // is CID for current MFS already pinned?
|
||||
pinning := false // is CID for current MFS already being pinned?
|
||||
pinTime := time.Now().UTC()
|
||||
pinStatusMsg := "pinning to %q: received pre-existing %q status for %q (requestid=%q)"
|
||||
for ps := range lsPinCh {
|
||||
existingRequestID = ps.GetRequestId()
|
||||
if ps.GetPin().GetCid() == cid && ps.GetStatus() == pinclient.StatusFailed {
|
||||
mfslog.Errorf(pinStatusMsg, svcName, pinclient.StatusFailed, cid, existingRequestID)
|
||||
} else {
|
||||
mfslog.Debugf(pinStatusMsg, svcName, ps.GetStatus(), ps.GetPin().GetCid(), existingRequestID)
|
||||
}
|
||||
if ps.GetPin().GetCid() == cid && ps.GetStatus() != pinclient.StatusFailed {
|
||||
alreadyPinned = true
|
||||
pinning = true
|
||||
pinTime = ps.GetCreated().UTC()
|
||||
break
|
||||
}
|
||||
@ -228,9 +234,9 @@ func pinMFS(
|
||||
return lastPin{}, fmt.Errorf("error while listing remote pins: %v", err)
|
||||
}
|
||||
|
||||
// CID of the current MFS root is already pinned, nothing to do
|
||||
if alreadyPinned {
|
||||
mfslog.Debugf("pinning MFS to %s: pin for %s exists since %s, skipping", svcName, cid, pinTime.String())
|
||||
// CID of the current MFS root is already being pinned, nothing to do
|
||||
if pinning {
|
||||
mfslog.Debugf("pinning MFS to %q: pin for %q exists since %s, skipping", svcName, cid, pinTime.String())
|
||||
return lastPin{Time: pinTime, ServiceName: svcName, ServiceConfig: svcConfig, CID: cid}, nil
|
||||
}
|
||||
|
||||
@ -250,13 +256,13 @@ func pinMFS(
|
||||
|
||||
// Create or replace pin for MFS root
|
||||
if existingRequestID != "" {
|
||||
mfslog.Debugf("pinning to %s: replacing existing MFS root pin with %s", svcName, cid)
|
||||
mfslog.Debugf("pinning to %q: replacing existing MFS root pin with %q", svcName, cid)
|
||||
_, err := c.Replace(ctx, existingRequestID, cid, addOpts...)
|
||||
if err != nil {
|
||||
return lastPin{}, err
|
||||
}
|
||||
} else {
|
||||
mfslog.Debugf("pinning to %s: creating a new MFS root pin for %s", svcName, cid)
|
||||
mfslog.Debugf("pinning to %q: creating a new MFS root pin for %q", svcName, cid)
|
||||
_, err := c.Add(ctx, cid, addOpts...)
|
||||
if err != nil {
|
||||
return lastPin{}, err
|
||||
|
||||
@ -9,7 +9,7 @@ import (
|
||||
|
||||
config "github.com/ipfs/go-ipfs-config"
|
||||
ipld "github.com/ipfs/go-ipld-format"
|
||||
"github.com/ipfs/go-merkledag"
|
||||
merkledag "github.com/ipfs/go-merkledag"
|
||||
"github.com/libp2p/go-libp2p-core/host"
|
||||
peer "github.com/libp2p/go-libp2p-core/peer"
|
||||
)
|
||||
@ -149,7 +149,7 @@ func TestPinMFSService(t *testing.T) {
|
||||
},
|
||||
},
|
||||
}
|
||||
testPinMFSServiceWithError(t, cfg_invalid_interval, "remote pinning service invalid_interval has invalid MFS.RepinInterval")
|
||||
testPinMFSServiceWithError(t, cfg_invalid_interval, "remote pinning service \"invalid_interval\" has invalid MFS.RepinInterval")
|
||||
testPinMFSServiceWithError(t, cfg_valid_unnamed, "error while listing remote pins: empty response from remote pinning service")
|
||||
testPinMFSServiceWithError(t, cfg_valid_named, "error while listing remote pins: empty response from remote pinning service")
|
||||
}
|
||||
|
||||
@ -6,6 +6,7 @@
|
||||
package commands
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
@ -63,6 +64,9 @@ func CommandsCmd(root *cmds.Command) *cmds.Command {
|
||||
Tagline: "List all available commands.",
|
||||
ShortDescription: `Lists all available commands (and subcommands) and exits.`,
|
||||
},
|
||||
Subcommands: map[string]*cmds.Command{
|
||||
"completion": CompletionCmd(root),
|
||||
},
|
||||
Options: []cmds.Option{
|
||||
cmds.BoolOption(flagsOptionName, "f", "Show command flags"),
|
||||
},
|
||||
@ -131,6 +135,44 @@ func cmdPathStrings(cmd *Command, showOptions bool) []string {
|
||||
return cmds
|
||||
}
|
||||
|
||||
func CompletionCmd(root *cmds.Command) *cmds.Command {
|
||||
return &cmds.Command{
|
||||
Helptext: cmds.HelpText{
|
||||
Tagline: "Generate shell completions.",
|
||||
},
|
||||
NoRemote: true,
|
||||
Subcommands: map[string]*cmds.Command{
|
||||
"bash": {
|
||||
Helptext: cmds.HelpText{
|
||||
Tagline: "Generate bash shell completions.",
|
||||
ShortDescription: "Generates command completions for the bash shell.",
|
||||
LongDescription: `
|
||||
Generates command completions for the bash shell.
|
||||
|
||||
The simplest way to see it working is write the completions
|
||||
to a file and then source it:
|
||||
|
||||
> ipfs commands completion bash > ipfs-completion.bash
|
||||
> source ./ipfs-completion.bash
|
||||
|
||||
To install the completions permanently, they can be moved to
|
||||
/etc/bash_completion.d or sourced from your ~/.bashrc file.
|
||||
`,
|
||||
},
|
||||
NoRemote: true,
|
||||
Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error {
|
||||
var buf bytes.Buffer
|
||||
if err := writeBashCompletions(root, &buf); err != nil {
|
||||
return err
|
||||
}
|
||||
res.SetLength(uint64(buf.Len()))
|
||||
return res.Emit(&buf)
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
type nonFatalError string
|
||||
|
||||
// streamResult is a helper function to stream results that possibly
|
||||
|
||||
@ -22,6 +22,8 @@ func TestROCommands(t *testing.T) {
|
||||
"/block/stat",
|
||||
"/cat",
|
||||
"/commands",
|
||||
"/commands/completion",
|
||||
"/commands/completion/bash",
|
||||
"/dag",
|
||||
"/dag/get",
|
||||
"/dag/resolve",
|
||||
@ -89,6 +91,8 @@ func TestCommands(t *testing.T) {
|
||||
"/bootstrap/rm/all",
|
||||
"/cat",
|
||||
"/commands",
|
||||
"/commands/completion",
|
||||
"/commands/completion/bash",
|
||||
"/config",
|
||||
"/config/edit",
|
||||
"/config/replace",
|
||||
@ -113,6 +117,7 @@ func TestCommands(t *testing.T) {
|
||||
"/diag/cmds",
|
||||
"/diag/cmds/clear",
|
||||
"/diag/cmds/set-time",
|
||||
"/diag/profile",
|
||||
"/diag/sys",
|
||||
"/dns",
|
||||
"/file",
|
||||
|
||||
142
core/commands/completion.go
Normal file
142
core/commands/completion.go
Normal file
@ -0,0 +1,142 @@
|
||||
package commands
|
||||
|
||||
import (
|
||||
"io"
|
||||
"sort"
|
||||
"text/template"
|
||||
|
||||
cmds "github.com/ipfs/go-ipfs-cmds"
|
||||
)
|
||||
|
||||
type completionCommand struct {
|
||||
Name string
|
||||
Subcommands []*completionCommand
|
||||
ShortFlags []string
|
||||
ShortOptions []string
|
||||
LongFlags []string
|
||||
LongOptions []string
|
||||
}
|
||||
|
||||
func commandToCompletions(name string, cmd *cmds.Command) *completionCommand {
|
||||
parsed := &completionCommand{
|
||||
Name: name,
|
||||
}
|
||||
for name, subCmd := range cmd.Subcommands {
|
||||
parsed.Subcommands = append(parsed.Subcommands, commandToCompletions(name, subCmd))
|
||||
}
|
||||
sort.Slice(parsed.Subcommands, func(i, j int) bool {
|
||||
return parsed.Subcommands[i].Name < parsed.Subcommands[j].Name
|
||||
})
|
||||
|
||||
for _, opt := range cmd.Options {
|
||||
if opt.Type() == cmds.Bool {
|
||||
parsed.LongFlags = append(parsed.LongFlags, opt.Name())
|
||||
for _, name := range opt.Names() {
|
||||
if len(name) == 1 {
|
||||
parsed.ShortFlags = append(parsed.ShortFlags, name)
|
||||
break
|
||||
}
|
||||
}
|
||||
} else {
|
||||
parsed.LongOptions = append(parsed.LongOptions, opt.Name())
|
||||
for _, name := range opt.Names() {
|
||||
if len(name) == 1 {
|
||||
parsed.ShortOptions = append(parsed.ShortOptions, name)
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
sort.Slice(parsed.LongFlags, func(i, j int) bool {
|
||||
return parsed.LongFlags[i] < parsed.LongFlags[j]
|
||||
})
|
||||
sort.Slice(parsed.ShortFlags, func(i, j int) bool {
|
||||
return parsed.ShortFlags[i] < parsed.ShortFlags[j]
|
||||
})
|
||||
sort.Slice(parsed.LongOptions, func(i, j int) bool {
|
||||
return parsed.LongOptions[i] < parsed.LongOptions[j]
|
||||
})
|
||||
sort.Slice(parsed.ShortOptions, func(i, j int) bool {
|
||||
return parsed.ShortOptions[i] < parsed.ShortOptions[j]
|
||||
})
|
||||
return parsed
|
||||
}
|
||||
|
||||
var bashCompletionTemplate *template.Template
|
||||
|
||||
func init() {
|
||||
commandTemplate := template.Must(template.New("command").Parse(`
|
||||
while [[ ${index} -lt ${COMP_CWORD} ]]; do
|
||||
case "${COMP_WORDS[index]}" in
|
||||
-*)
|
||||
let index++
|
||||
continue
|
||||
;;
|
||||
{{ range .Subcommands }}
|
||||
"{{ .Name }}")
|
||||
let index++
|
||||
{{ template "command" . }}
|
||||
return 0
|
||||
;;
|
||||
{{ end }}
|
||||
esac
|
||||
break
|
||||
done
|
||||
|
||||
if [[ "${word}" == -* ]]; then
|
||||
{{ if .ShortFlags -}}
|
||||
_ipfs_compgen -W $'{{ range .ShortFlags }}-{{.}} \n{{end}}' -- "${word}"
|
||||
{{ end -}}
|
||||
{{- if .ShortOptions -}}
|
||||
_ipfs_compgen -S = -W $'{{ range .ShortOptions }}-{{.}}\n{{end}}' -- "${word}"
|
||||
{{ end -}}
|
||||
{{- if .LongFlags -}}
|
||||
_ipfs_compgen -W $'{{ range .LongFlags }}--{{.}} \n{{end}}' -- "${word}"
|
||||
{{ end -}}
|
||||
{{- if .LongOptions -}}
|
||||
_ipfs_compgen -S = -W $'{{ range .LongOptions }}--{{.}}\n{{end}}' -- "${word}"
|
||||
{{ end -}}
|
||||
return 0
|
||||
fi
|
||||
|
||||
while [[ ${index} -lt ${COMP_CWORD} ]]; do
|
||||
if [[ "${COMP_WORDS[index]}" != -* ]]; then
|
||||
let argidx++
|
||||
fi
|
||||
let index++
|
||||
done
|
||||
|
||||
{{- if .Subcommands }}
|
||||
if [[ "${argidx}" -eq 0 ]]; then
|
||||
_ipfs_compgen -W $'{{ range .Subcommands }}{{.Name}} \n{{end}}' -- "${word}"
|
||||
fi
|
||||
{{ end -}}
|
||||
`))
|
||||
|
||||
bashCompletionTemplate = template.Must(commandTemplate.New("root").Parse(`#!/bin/bash
|
||||
|
||||
_ipfs_compgen() {
|
||||
local oldifs="$IFS"
|
||||
IFS=$'\n'
|
||||
while read -r line; do
|
||||
COMPREPLY+=("$line")
|
||||
done < <(compgen "$@")
|
||||
IFS="$oldifs"
|
||||
}
|
||||
|
||||
_ipfs() {
|
||||
COMPREPLY=()
|
||||
local index=1
|
||||
local argidx=0
|
||||
local word="${COMP_WORDS[COMP_CWORD]}"
|
||||
{{ template "command" . }}
|
||||
}
|
||||
complete -o nosort -o nospace -o default -F _ipfs ipfs
|
||||
`))
|
||||
}
|
||||
|
||||
// writeBashCompletions generates a bash completion script for the given command tree.
|
||||
func writeBashCompletions(cmd *cmds.Command, out io.Writer) error {
|
||||
cmds := commandToCompletions("ipfs", cmd)
|
||||
return bashCompletionTemplate.Execute(out, cmds)
|
||||
}
|
||||
@ -10,7 +10,8 @@ var DiagCmd = &cmds.Command{
|
||||
},
|
||||
|
||||
Subcommands: map[string]*cmds.Command{
|
||||
"sys": sysDiagCmd,
|
||||
"cmds": ActiveReqsCmd,
|
||||
"sys": sysDiagCmd,
|
||||
"cmds": ActiveReqsCmd,
|
||||
"profile": sysProfileCmd,
|
||||
},
|
||||
}
|
||||
|
||||
@ -18,7 +18,7 @@ import (
|
||||
cmds "github.com/ipfs/go-ipfs-cmds"
|
||||
files "github.com/ipfs/go-ipfs-files"
|
||||
"github.com/ipfs/interface-go-ipfs-core/path"
|
||||
"github.com/whyrusleeping/tar-utils"
|
||||
"github.com/ipfs/tar-utils"
|
||||
)
|
||||
|
||||
var ErrInvalidCompressionLevel = errors.New("compression level must be between 1 and 9")
|
||||
|
||||
@ -167,13 +167,19 @@ NOTE: a comma-separated notation is supported in CLI for convenience:
|
||||
}
|
||||
|
||||
// Prepare Pin.origins
|
||||
// Add own multiaddrs to the 'origins' array, so Pinning Service can
|
||||
// use that as a hint and connect back to us (if possible)
|
||||
// If CID in blockstore, add own multiaddrs to the 'origins' array
|
||||
// so pinning service can use that as a hint and connect back to us.
|
||||
node, err := cmdenv.GetNode(env)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if node.PeerHost != nil {
|
||||
|
||||
isInBlockstore, err := node.Blockstore.Has(rp.Cid())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if isInBlockstore && node.PeerHost != nil {
|
||||
addrs, err := peer.AddrInfoToP2pAddrs(host.InfoFromHost(node.PeerHost))
|
||||
if err != nil {
|
||||
return err
|
||||
|
||||
237
core/commands/profile.go
Normal file
237
core/commands/profile.go
Normal file
@ -0,0 +1,237 @@
|
||||
package commands
|
||||
|
||||
import (
|
||||
"archive/zip"
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
"runtime"
|
||||
"runtime/pprof"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
cmds "github.com/ipfs/go-ipfs-cmds"
|
||||
"github.com/ipfs/go-ipfs/core/commands/e"
|
||||
)
|
||||
|
||||
// time format that works in filenames on windows.
|
||||
var timeFormat = strings.ReplaceAll(time.RFC3339, ":", "_")
|
||||
|
||||
type profileResult struct {
|
||||
File string
|
||||
}
|
||||
|
||||
const cpuProfileTimeOption = "cpu-profile-time"
|
||||
|
||||
var sysProfileCmd = &cmds.Command{
|
||||
Helptext: cmds.HelpText{
|
||||
Tagline: "Collect a performance profile for debugging.",
|
||||
ShortDescription: `
|
||||
Collects cpu, heap, and goroutine profiles from a running go-ipfs daemon
|
||||
into a single zip file. To aid in debugging, this command also attempts to
|
||||
include a copy of the running go-ipfs binary.
|
||||
`,
|
||||
LongDescription: `
|
||||
Collects cpu, heap, and goroutine profiles from a running go-ipfs daemon
|
||||
into a single zipfile. To aid in debugging, this command also attempts to
|
||||
include a copy of the running go-ipfs binary.
|
||||
|
||||
Profile's can be examined using 'go tool pprof', some tips can be found at
|
||||
https://github.com/ipfs/go-ipfs/blob/master/docs/debug-guide.md.
|
||||
|
||||
Privacy Notice:
|
||||
|
||||
The output file includes:
|
||||
|
||||
- A list of running goroutines.
|
||||
- A CPU profile.
|
||||
- A heap profile.
|
||||
- Your copy of go-ipfs.
|
||||
- The output of 'ipfs version --all'.
|
||||
|
||||
It does not include:
|
||||
|
||||
- Any of your IPFS data or metadata.
|
||||
- Your config or private key.
|
||||
- Your IP address.
|
||||
- The contents of your computer's memory, filesystem, etc.
|
||||
|
||||
However, it could reveal:
|
||||
|
||||
- Your build path, if you built go-ipfs yourself.
|
||||
- If and how a command/feature is being used (inferred from running functions).
|
||||
- Memory offsets of various data structures.
|
||||
- Any modifications you've made to go-ipfs.
|
||||
`,
|
||||
},
|
||||
NoLocal: true,
|
||||
Options: []cmds.Option{
|
||||
cmds.StringOption(outputOptionName, "o", "The path where the output should be stored."),
|
||||
cmds.StringOption(cpuProfileTimeOption, "The amount of time spent profiling CPU usage.").WithDefault("30s"),
|
||||
},
|
||||
Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error {
|
||||
cpuProfileTimeStr, _ := req.Options[cpuProfileTimeOption].(string)
|
||||
cpuProfileTime, err := time.ParseDuration(cpuProfileTimeStr)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to parse CPU profile duration %q: %w", cpuProfileTimeStr, err)
|
||||
}
|
||||
|
||||
r, w := io.Pipe()
|
||||
go func() {
|
||||
_ = w.CloseWithError(writeProfiles(req.Context, cpuProfileTime, w))
|
||||
}()
|
||||
return res.Emit(r)
|
||||
},
|
||||
PostRun: cmds.PostRunMap{
|
||||
cmds.CLI: func(res cmds.Response, re cmds.ResponseEmitter) error {
|
||||
v, err := res.Next()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
outReader, ok := v.(io.Reader)
|
||||
if !ok {
|
||||
return e.New(e.TypeErr(outReader, v))
|
||||
}
|
||||
|
||||
outPath, _ := res.Request().Options[outputOptionName].(string)
|
||||
if outPath == "" {
|
||||
outPath = "ipfs-profile-" + time.Now().Format(timeFormat) + ".zip"
|
||||
}
|
||||
fi, err := os.Create(outPath)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer fi.Close()
|
||||
|
||||
_, err = io.Copy(fi, outReader)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return re.Emit(&profileResult{File: outPath})
|
||||
},
|
||||
},
|
||||
Encoders: cmds.EncoderMap{
|
||||
cmds.Text: cmds.MakeTypedEncoder(func(req *cmds.Request, w io.Writer, out *profileResult) error {
|
||||
fmt.Fprintf(w, "Wrote profiles to: %s\n", out.File)
|
||||
return nil
|
||||
}),
|
||||
},
|
||||
}
|
||||
|
||||
func writeProfiles(ctx context.Context, cpuProfileTime time.Duration, w io.Writer) error {
|
||||
archive := zip.NewWriter(w)
|
||||
|
||||
// Take some profiles.
|
||||
type profile struct {
|
||||
name string
|
||||
file string
|
||||
debug int
|
||||
}
|
||||
|
||||
profiles := []profile{{
|
||||
name: "goroutine",
|
||||
file: "goroutines.stacks",
|
||||
debug: 2,
|
||||
}, {
|
||||
name: "goroutine",
|
||||
file: "goroutines.pprof",
|
||||
}, {
|
||||
name: "heap",
|
||||
file: "heap.pprof",
|
||||
}}
|
||||
|
||||
for _, profile := range profiles {
|
||||
prof := pprof.Lookup(profile.name)
|
||||
out, err := archive.Create(profile.file)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = prof.WriteTo(out, profile.debug)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
// Take a CPU profile.
|
||||
if cpuProfileTime != 0 {
|
||||
out, err := archive.Create("cpu.pprof")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = writeCPUProfile(ctx, cpuProfileTime, out)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
// Collect version info
|
||||
// I'd use diag sysinfo, but that includes some more sensitive information
|
||||
// (GOPATH, etc.).
|
||||
{
|
||||
out, err := archive.Create("version.json")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = json.NewEncoder(out).Encode(getVersionInfo())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
// Collect binary
|
||||
if fi, err := openIPFSBinary(); err == nil {
|
||||
fname := "ipfs"
|
||||
if runtime.GOOS == "windows" {
|
||||
fname += ".exe"
|
||||
}
|
||||
|
||||
out, err := archive.Create(fname)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = io.Copy(out, fi)
|
||||
_ = fi.Close()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return archive.Close()
|
||||
}
|
||||
|
||||
func writeCPUProfile(ctx context.Context, d time.Duration, w io.Writer) error {
|
||||
if err := pprof.StartCPUProfile(w); err != nil {
|
||||
return err
|
||||
}
|
||||
defer pprof.StopCPUProfile()
|
||||
|
||||
timer := time.NewTimer(d)
|
||||
defer timer.Stop()
|
||||
|
||||
select {
|
||||
case <-timer.C:
|
||||
case <-ctx.Done():
|
||||
return ctx.Err()
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func openIPFSBinary() (*os.File, error) {
|
||||
if runtime.GOOS == "linux" {
|
||||
pid := os.Getpid()
|
||||
fi, err := os.Open(fmt.Sprintf("/proc/%d/exe", pid))
|
||||
if err == nil {
|
||||
return fi, nil
|
||||
}
|
||||
}
|
||||
path, err := os.Executable()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return os.Open(path)
|
||||
}
|
||||
@ -2,7 +2,11 @@ package commands
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"text/tabwriter"
|
||||
"time"
|
||||
|
||||
humanize "github.com/dustin/go-humanize"
|
||||
cmds "github.com/ipfs/go-ipfs-cmds"
|
||||
"github.com/ipfs/go-ipfs/core/commands/cmdenv"
|
||||
|
||||
@ -46,6 +50,40 @@ This interface is not stable and may change from release to release.
|
||||
|
||||
return nil
|
||||
},
|
||||
Encoders: cmds.EncoderMap{},
|
||||
Type: batched.BatchedProviderStats{},
|
||||
Encoders: cmds.EncoderMap{
|
||||
cmds.Text: cmds.MakeTypedEncoder(func(req *cmds.Request, w io.Writer, s *batched.BatchedProviderStats) error {
|
||||
wtr := tabwriter.NewWriter(w, 1, 2, 1, ' ', 0)
|
||||
defer wtr.Flush()
|
||||
|
||||
fmt.Fprintf(wtr, "TotalProvides:\t%s\n", humanNumber(s.TotalProvides))
|
||||
fmt.Fprintf(wtr, "AvgProvideDuration:\t%s\n", humanDuration(s.AvgProvideDuration))
|
||||
fmt.Fprintf(wtr, "LastReprovideDuration:\t%s\n", humanDuration(s.LastReprovideDuration))
|
||||
fmt.Fprintf(wtr, "LastReprovideBatchSize:\t%s\n", humanNumber(s.LastReprovideBatchSize))
|
||||
return nil
|
||||
}),
|
||||
},
|
||||
Type: batched.BatchedProviderStats{},
|
||||
}
|
||||
|
||||
func humanDuration(val time.Duration) string {
|
||||
return val.Truncate(time.Microsecond).String()
|
||||
}
|
||||
|
||||
func humanNumber(n int) string {
|
||||
nf := float64(n)
|
||||
str := humanSI(nf, 0)
|
||||
fullStr := humanFull(nf, 0)
|
||||
if str != fullStr {
|
||||
return fmt.Sprintf("%s\t(%s)", str, fullStr)
|
||||
}
|
||||
return str
|
||||
}
|
||||
|
||||
func humanSI(val float64, decimals int) string {
|
||||
v, unit := humanize.ComputeSI(val)
|
||||
return fmt.Sprintf("%s%s", humanFull(v, decimals), unit)
|
||||
}
|
||||
|
||||
func humanFull(val float64, decimals int) string {
|
||||
return humanize.CommafWithDigits(val, decimals)
|
||||
}
|
||||
|
||||
@ -6,6 +6,7 @@ import (
|
||||
"runtime"
|
||||
|
||||
version "github.com/ipfs/go-ipfs"
|
||||
"github.com/ipfs/go-ipfs/core"
|
||||
cmdenv "github.com/ipfs/go-ipfs/core/commands/cmdenv"
|
||||
|
||||
cmds "github.com/ipfs/go-ipfs-cmds"
|
||||
@ -21,42 +22,51 @@ Prints out information about your computer to aid in easier debugging.
|
||||
`,
|
||||
},
|
||||
Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error {
|
||||
info := make(map[string]interface{})
|
||||
err := runtimeInfo(info)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = envVarInfo(info)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = diskSpaceInfo(info)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = memInfo(info)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
nd, err := cmdenv.GetNode(env)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = netInfo(nd.IsOnline, info)
|
||||
info, err := getInfo(nd)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
info["ipfs_version"] = version.CurrentVersionNumber
|
||||
info["ipfs_commit"] = version.CurrentCommit
|
||||
return cmds.EmitOnce(res, info)
|
||||
},
|
||||
}
|
||||
|
||||
func getInfo(nd *core.IpfsNode) (map[string]interface{}, error) {
|
||||
info := make(map[string]interface{})
|
||||
err := runtimeInfo(info)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
err = envVarInfo(info)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
err = diskSpaceInfo(info)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
err = memInfo(info)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
err = netInfo(nd.IsOnline, info)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
info["ipfs_version"] = version.CurrentVersionNumber
|
||||
info["ipfs_commit"] = version.CurrentCommit
|
||||
return info, nil
|
||||
}
|
||||
|
||||
func runtimeInfo(out map[string]interface{}) error {
|
||||
rt := make(map[string]interface{})
|
||||
rt["os"] = runtime.GOOS
|
||||
|
||||
@ -28,6 +28,16 @@ const (
|
||||
versionAllOptionName = "all"
|
||||
)
|
||||
|
||||
func getVersionInfo() *VersionOutput {
|
||||
return &VersionOutput{
|
||||
Version: version.CurrentVersionNumber,
|
||||
Commit: version.CurrentCommit,
|
||||
Repo: fmt.Sprint(fsrepo.RepoVersion),
|
||||
System: runtime.GOARCH + "/" + runtime.GOOS, //TODO: Precise version here
|
||||
Golang: runtime.Version(),
|
||||
}
|
||||
}
|
||||
|
||||
var VersionCmd = &cmds.Command{
|
||||
Helptext: cmds.HelpText{
|
||||
Tagline: "Show IPFS version information.",
|
||||
@ -46,13 +56,7 @@ var VersionCmd = &cmds.Command{
|
||||
// must be permitted to run before init
|
||||
Extra: CreateCmdExtras(SetDoesNotUseRepo(true), SetDoesNotUseConfigAsInput(true)),
|
||||
Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error {
|
||||
return cmds.EmitOnce(res, &VersionOutput{
|
||||
Version: version.CurrentVersionNumber,
|
||||
Commit: version.CurrentCommit,
|
||||
Repo: fmt.Sprint(fsrepo.RepoVersion),
|
||||
System: runtime.GOARCH + "/" + runtime.GOOS, //TODO: Precise version here
|
||||
Golang: runtime.Version(),
|
||||
})
|
||||
return cmds.EmitOnce(res, getVersionInfo())
|
||||
},
|
||||
Encoders: cmds.EncoderMap{
|
||||
cmds.Text: cmds.MakeTypedEncoder(func(req *cmds.Request, w io.Writer, version *VersionOutput) error {
|
||||
|
||||
@ -1,11 +1,12 @@
|
||||
package corehttp
|
||||
|
||||
// TODO: move to IPNS
|
||||
const WebUIPath = "/ipfs/bafybeifuexpvt6g4bkbmsrlb7rnudskfakn6vdrtoja4ml4zbxne2hu6bq" // v2.12.2
|
||||
const WebUIPath = "/ipfs/bafybeiflkjt66aetfgcrgvv75izymd5kc47g6luepqmfq6zsf5w6ueth6y" // v2.12.4
|
||||
|
||||
// this is a list of all past webUI paths.
|
||||
var WebUIPaths = []string{
|
||||
WebUIPath,
|
||||
"/ipfs/bafybeid26vjplsejg7t3nrh7mxmiaaxriebbm4xxrxxdunlk7o337m5sqq",
|
||||
"/ipfs/bafybeif4zkmu7qdhkpf3pnhwxipylqleof7rl6ojbe7mq3fzogz6m4xk3i",
|
||||
"/ipfs/bafybeianwe4vy7sprht5sm3hshvxjeqhwcmvbzq73u55sdhqngmohkjgs4",
|
||||
"/ipfs/bafybeicitin4p7ggmyjaubqpi3xwnagrwarsy6hiihraafk5rcrxqxju6m",
|
||||
|
||||
@ -3,7 +3,6 @@ package node
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/ipfs/go-bitswap"
|
||||
"github.com/ipfs/go-bitswap/network"
|
||||
@ -11,11 +10,11 @@ import (
|
||||
"github.com/ipfs/go-cid"
|
||||
"github.com/ipfs/go-datastore"
|
||||
"github.com/ipfs/go-filestore"
|
||||
"github.com/ipfs/go-ipfs-blockstore"
|
||||
"github.com/ipfs/go-ipfs-exchange-interface"
|
||||
"github.com/ipfs/go-ipfs-pinner"
|
||||
blockstore "github.com/ipfs/go-ipfs-blockstore"
|
||||
exchange "github.com/ipfs/go-ipfs-exchange-interface"
|
||||
pin "github.com/ipfs/go-ipfs-pinner"
|
||||
"github.com/ipfs/go-ipfs-pinner/dspinner"
|
||||
"github.com/ipfs/go-ipld-format"
|
||||
format "github.com/ipfs/go-ipld-format"
|
||||
"github.com/ipfs/go-merkledag"
|
||||
"github.com/ipfs/go-mfs"
|
||||
"github.com/ipfs/go-unixfs"
|
||||
@ -52,8 +51,7 @@ func Pinning(bstore blockstore.Blockstore, ds format.DAGService, repo repo.Repo)
|
||||
}
|
||||
syncDs := &syncDagService{ds, syncFn}
|
||||
|
||||
ctx, cancel := context.WithTimeout(context.TODO(), 2*time.Minute)
|
||||
defer cancel()
|
||||
ctx := context.TODO()
|
||||
|
||||
pinning, err := dspinner.New(ctx, rootDS, syncDs)
|
||||
if err != nil {
|
||||
|
||||
27
docs/PATCH_RELEASE_TEMPLATE.md
Normal file
27
docs/PATCH_RELEASE_TEMPLATE.md
Normal file
@ -0,0 +1,27 @@
|
||||
# Patch Release Checklist
|
||||
|
||||
This process handles patch releases from version `vX.Y.Z` to `vX.Y.Z+1` assuming that `vX.Y.Z` is the latest released version of go-ipfs.
|
||||
|
||||
- [ ] Fork a new branch (`release-vX.Y.Z`) from `release` and cherry-pick the relevant commits from master (or custom fixes) onto this branch
|
||||
- [ ] Make a minimal changelog update tracking the relevant fixes to CHANGELOG.
|
||||
- [ ] version string in `version.go` has been updated (in the `release-vX.Y.Z+1` branch).
|
||||
- [ ] Make a PR merging `release-vX.Y.Z+1` into the release branch
|
||||
- [ ] tag the merge commit in the `release` branch with `vX.Y.Z+1`
|
||||
- [ ] upload to dist.ipfs.io
|
||||
1. Build: https://github.com/ipfs/distributions#usage.
|
||||
2. Pin the resulting release.
|
||||
3. Make a PR against ipfs/distributions with the updated versions, including the new hash in the PR comment.
|
||||
4. Ask the infra team to update the DNSLink record for dist.ipfs.io to point to the new distribution.
|
||||
- [ ] cut a release on [github](https://github.com/ipfs/go-ipfs/releases) and upload the result of the ipfs/distributions build in the previous step.
|
||||
- Announce the Release:
|
||||
- [ ] On IRC/Matrix (both #ipfs and #ipfs-dev)
|
||||
- [ ] On discuss.ipfs.io
|
||||
- [ ] Release published
|
||||
- [ ] to [dist.ipfs.io](https://dist.ipfs.io)
|
||||
- [ ] to [npm-go-ipfs](https://github.com/ipfs/npm-go-ipfs)
|
||||
- [ ] to [chocolatey](https://chocolatey.org/packages/ipfs)
|
||||
- [ ] to [snap](https://snapcraft.io/ipfs)
|
||||
- [ ] to [github](https://github.com/ipfs/go-ipfs/releases)
|
||||
- [ ] to [arch](https://www.archlinux.org/packages/community/x86_64/go-ipfs/) (flag it out of date)
|
||||
- [ ] Cut a new ipfs-desktop release
|
||||
- [ ] Merge the `release` branch back into `master`, ignoring the changes to `version.go` (keep the `-dev` version from master).
|
||||
@ -1,29 +1,13 @@
|
||||
Command Completion
|
||||
==================
|
||||
# Command Completion
|
||||
|
||||
Shell command completion is provided by the script at
|
||||
[/misc/completion/ipfs-completion.bash](../misc/completion/ipfs-completion.bash).
|
||||
Shell command completions can be generated by running one of the `ipfs commands completions`
|
||||
sub-commands.
|
||||
|
||||
The simplest way to "eval" the completions logic:
|
||||
|
||||
Installation
|
||||
------------
|
||||
The simplest way to see it working is to run
|
||||
`source misc/completion/ipfs-completion.bash` straight from your shell. This
|
||||
is only temporary and to fully enable it, you'll have to follow one of the steps
|
||||
below.
|
||||
|
||||
### Bash on Linux
|
||||
For bash, completion can be enabled in a couple of ways. One is to copy the
|
||||
completion script to the directory `~/.ipfs/` and then in the file
|
||||
`~/.bash_completion` add
|
||||
```bash
|
||||
source ~/.ipfs/ipfs-completion.bash
|
||||
> eval "$(ipfs commands completion bash)"
|
||||
```
|
||||
It will automatically be loaded the next time bash is loaded.
|
||||
To enable ipfs command completion globally on your system you may also
|
||||
copy the completion script to `/etc/bash_completion.d/`.
|
||||
|
||||
|
||||
Additional References
|
||||
---------------------
|
||||
* https://www.debian-administration.org/article/316/An_introduction_to_bash_completion_part_1
|
||||
To install the completions permanently, they can be moved to
|
||||
`/etc/bash_completion.d` or sourced from your `~/.bashrc` file.
|
||||
|
||||
@ -8,7 +8,7 @@ config file at runtime.
|
||||
## Profiles
|
||||
|
||||
Configuration profiles allow to tweak configuration quickly. Profiles can be
|
||||
applied with `--profile` flag to `ipfs init` or with the `ipfs config profile
|
||||
applied with the `--profile` flag to `ipfs init` or with the `ipfs config profile
|
||||
apply` command. When a profile is applied a backup of the configuration file
|
||||
will be created in `$IPFS_PATH`.
|
||||
|
||||
@ -22,7 +22,7 @@ documented in `ipfs config profile --help`.
|
||||
|
||||
- `randomports`
|
||||
|
||||
Use a random port number for swarm.
|
||||
Use a random port number for the incoming swarm connections.
|
||||
|
||||
- `default-datastore`
|
||||
|
||||
@ -34,8 +34,8 @@ documented in `ipfs config profile --help`.
|
||||
|
||||
- `local-discovery`
|
||||
|
||||
Sets default values to fields affected by the server
|
||||
profile, enables discovery in local networks.
|
||||
Enables local discovery (enabled by default). Useful to re-enable local discovery after it's
|
||||
disabled by another profile (e.g., the server profile).
|
||||
|
||||
- `test`
|
||||
|
||||
@ -56,7 +56,7 @@ documented in `ipfs config profile --help`.
|
||||
|
||||
- You need a very simple and very reliable datastore and you trust your
|
||||
filesystem. This datastore stores each block as a separate file in the
|
||||
underlying filesystem so it's unlikely to loose data unless there's an issue
|
||||
underlying filesystem so it's unlikely to lose data unless there's an issue
|
||||
with the underlying file system.
|
||||
- You need to run garbage collection on a small (<= 10GiB) datastore. The
|
||||
default datastore, badger, can leave several gigabytes of data behind when
|
||||
@ -258,7 +258,7 @@ Type: `strings` (multiaddrs)
|
||||
|
||||
### `Addresses.Swarm`
|
||||
|
||||
Array of multiaddrs describing which addresses to listen on for p2p swarm
|
||||
An array of multiaddrs describing which addresses to listen on for p2p swarm
|
||||
connections.
|
||||
|
||||
Supported Transports:
|
||||
@ -289,7 +289,7 @@ Default: `[]`
|
||||
Type: `array[string]` (multiaddrs)
|
||||
|
||||
### `Addresses.NoAnnounce`
|
||||
Array of swarm addresses not to announce to the network.
|
||||
An array of swarm addresses not to announce to the network.
|
||||
|
||||
Default: `[]`
|
||||
|
||||
@ -363,8 +363,7 @@ Type: `duration` (when `0`/unset, the default value is used)
|
||||
|
||||
## `Bootstrap`
|
||||
|
||||
Bootstrap is an array of multiaddrs of trusted nodes to connect to in order to
|
||||
initiate a connection to the network.
|
||||
Bootstrap is an array of multiaddrs of trusted nodes that your node connects to, to fetch other nodes of the network on startup.
|
||||
|
||||
Default: The ipfs.io bootstrap nodes
|
||||
|
||||
@ -405,7 +404,7 @@ Type: `duration` (an empty string means the default value)
|
||||
|
||||
### `Datastore.HashOnRead`
|
||||
|
||||
A boolean value. If set to true, all block reads from disk will be hashed and
|
||||
A boolean value. If set to true, all block reads from the disk will be hashed and
|
||||
verified. This will cause increased CPU utilization.
|
||||
|
||||
Default: `false`
|
||||
@ -416,13 +415,13 @@ Type: `bool`
|
||||
|
||||
A number representing the size in bytes of the blockstore's [bloom
|
||||
filter](https://en.wikipedia.org/wiki/Bloom_filter). A value of zero represents
|
||||
the feature being disabled.
|
||||
the feature is disabled.
|
||||
|
||||
This site generates useful graphs for various bloom filter values:
|
||||
<https://hur.st/bloomfilter/?n=1e6&p=0.01&m=&k=7> You may use it to find a
|
||||
preferred optimal value, where `m` is `BloomFilterSize` in bits. Remember to
|
||||
convert the value `m` from bits, into bytes for use as `BloomFilterSize` in the
|
||||
config file. For example, for 1,000,000 blocks, expecting a 1% false positive
|
||||
config file. For example, for 1,000,000 blocks, expecting a 1% false-positive
|
||||
rate, you'd end up with a filter size of 9592955 bits, so for `BloomFilterSize`
|
||||
we'd want to use 1199120 bytes. As of writing, [7 hash
|
||||
functions](https://github.com/ipfs/go-ipfs-blockstore/blob/547442836ade055cc114b562a3cc193d4e57c884/caching.go#L22)
|
||||
@ -496,7 +495,7 @@ Type: `bool`
|
||||
|
||||
#### `Discovery.MDNS.Interval`
|
||||
|
||||
A number of seconds to wait between discovery checks.
|
||||
The number of seconds between discovery checks.
|
||||
|
||||
Default: `5`
|
||||
|
||||
@ -518,8 +517,8 @@ Type: `bool`
|
||||
### `Gateway.NoDNSLink`
|
||||
|
||||
A boolean to configure whether DNSLink lookup for value in `Host` HTTP header
|
||||
should be performed. If DNSLink is present, content path stored in the DNS TXT
|
||||
record becomes the `/` and respective payload is returned to the client.
|
||||
should be performed. If DNSLink is present, the content path stored in the DNS TXT
|
||||
record becomes the `/` and the respective payload is returned to the client.
|
||||
|
||||
Default: `false`
|
||||
|
||||
@ -567,7 +566,7 @@ Type: `bool`
|
||||
**DEPRECATED:** see [go-ipfs#7702](https://github.com/ipfs/go-ipfs/issues/7702)
|
||||
|
||||
<!--
|
||||
Array of acceptable url paths that a client can specify in X-Ipfs-Path-Prefix
|
||||
An array of acceptable url paths that a client can specify in X-Ipfs-Path-Prefix
|
||||
header.
|
||||
|
||||
The X-Ipfs-Path-Prefix header is used to specify a base path to prepend to links
|
||||
@ -611,7 +610,7 @@ Examples:
|
||||
|
||||
#### `Gateway.PublicGateways: Paths`
|
||||
|
||||
Array of paths that should be exposed on the hostname.
|
||||
An array of paths that should be exposed on the hostname.
|
||||
|
||||
Example:
|
||||
```json
|
||||
@ -779,7 +778,7 @@ Type: `string` (peer ID)
|
||||
|
||||
### `Identity.PrivKey`
|
||||
|
||||
The base64 encoded protobuf describing (and containing) the nodes private key.
|
||||
The base64 encoded protobuf describing (and containing) the node's private key.
|
||||
|
||||
Type: `string` (base64 encoded)
|
||||
|
||||
@ -850,19 +849,19 @@ Type: `string` (filesystem path)
|
||||
|
||||
### `Mounts.FuseAllowOther`
|
||||
|
||||
Sets the FUSE allow other option on the mountpoint.
|
||||
Sets the 'FUSE allow other'-option on the mount point.
|
||||
|
||||
## `Pinning`
|
||||
|
||||
Pinning configures the options available for pinning content
|
||||
(i.e. keeping content longer term instead of as temporarily cached storage).
|
||||
(i.e. keeping content longer-term instead of as temporarily cached storage).
|
||||
|
||||
### `Pinning.RemoteServices`
|
||||
|
||||
`RemoteServices` maps a name for a remote pinning service to its configuration.
|
||||
|
||||
A remote pinning service is a remote service that exposes an API for managing
|
||||
that service's interest in longer term data storage.
|
||||
that service's interest in long-term data storage.
|
||||
|
||||
The exposed API conforms to the specification defined at
|
||||
https://ipfs.github.io/pinning-services-api-spec/
|
||||
@ -1004,7 +1003,7 @@ When a node is added to the set of peered nodes, go-ipfs will:
|
||||
Peering can be asymmetric or symmetric:
|
||||
|
||||
* When symmetric, the connection will be protected by both nodes and will likely
|
||||
be vary stable.
|
||||
be very stable.
|
||||
* When asymmetric, only one node (the node that configured peering) will protect
|
||||
the connection and attempt to re-connect to the peered node on disconnect. If
|
||||
the peered node is under heavy load and/or has a low connection limit, the
|
||||
@ -1087,7 +1086,7 @@ When the DHT is enabled, it can operate in two modes: client and server.
|
||||
respond to requests from other peers (both requests to store records and
|
||||
requests to retrieve records).
|
||||
* In client mode, your node will query the DHT as a client but will not respond
|
||||
to requests from other peers. This mode is less resource intensive than server
|
||||
to requests from other peers. This mode is less resource-intensive than server
|
||||
mode.
|
||||
|
||||
When `Routing.Type` is set to `dht`, your node will start as a DHT client, and
|
||||
|
||||
@ -15,8 +15,8 @@ When you see ipfs doing something (using lots of CPU, memory, or otherwise
|
||||
being weird), the first thing you want to do is gather all the relevant
|
||||
profiling information.
|
||||
|
||||
There's a script (`bin/collect-profiles.sh`) that will do this for you and
|
||||
bundle the results up into a tarball, ready to be attached to a bug report.
|
||||
There's a command (`ipfs diag profile`) that will do this for you and
|
||||
bundle the results up into a zip file, ready to be attached to a bug report.
|
||||
|
||||
If you feel intrepid, you can dump this information and investigate it yourself:
|
||||
|
||||
@ -79,6 +79,9 @@ that goroutine in the middle of a short wait for something. If the wait time is
|
||||
over a few minutes, that either means that goroutine doesn't do much, or
|
||||
something is pretty wrong.
|
||||
|
||||
If you're seeing a lot of goroutines, consider using
|
||||
[stackparse](https://github.com/whyrusleeping/stackparse) to filter, sort, and summarize them.
|
||||
|
||||
### Analyzing the CPU Profile
|
||||
|
||||
The go team wrote an [excellent article on profiling go
|
||||
@ -97,4 +100,3 @@ The output is JSON formatted and includes badger store statistics, the command l
|
||||
If you have any questions, or want us to analyze some weird go-ipfs behaviour,
|
||||
just let us know, and be sure to include all the profiling information
|
||||
mentioned at the top.
|
||||
|
||||
|
||||
@ -4,12 +4,12 @@ go 1.14
|
||||
|
||||
require (
|
||||
github.com/ipfs/go-ipfs v0.7.0
|
||||
github.com/ipfs/go-ipfs-config v0.9.0
|
||||
github.com/ipfs/go-ipfs-config v0.14.0
|
||||
github.com/ipfs/go-ipfs-files v0.0.8
|
||||
github.com/ipfs/interface-go-ipfs-core v0.4.0
|
||||
github.com/libp2p/go-libp2p-core v0.6.0
|
||||
github.com/libp2p/go-libp2p-peerstore v0.2.6
|
||||
github.com/multiformats/go-multiaddr v0.2.2
|
||||
github.com/libp2p/go-libp2p-core v0.8.6
|
||||
github.com/libp2p/go-libp2p-peerstore v0.2.8
|
||||
github.com/multiformats/go-multiaddr v0.3.3
|
||||
)
|
||||
|
||||
replace github.com/ipfs/go-ipfs => ./../../..
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -12,14 +12,13 @@ import (
|
||||
|
||||
config "github.com/ipfs/go-ipfs-config"
|
||||
files "github.com/ipfs/go-ipfs-files"
|
||||
libp2p "github.com/ipfs/go-ipfs/core/node/libp2p"
|
||||
icore "github.com/ipfs/interface-go-ipfs-core"
|
||||
icorepath "github.com/ipfs/interface-go-ipfs-core/path"
|
||||
peerstore "github.com/libp2p/go-libp2p-peerstore"
|
||||
ma "github.com/multiformats/go-multiaddr"
|
||||
|
||||
"github.com/ipfs/go-ipfs/core"
|
||||
"github.com/ipfs/go-ipfs/core/coreapi"
|
||||
"github.com/ipfs/go-ipfs/core/node/libp2p"
|
||||
"github.com/ipfs/go-ipfs/plugin/loader" // This package is needed so that all the preloaded plugins are loaded automatically
|
||||
"github.com/ipfs/go-ipfs/repo/fsrepo"
|
||||
"github.com/libp2p/go-libp2p-core/peer"
|
||||
@ -46,7 +45,7 @@ func setupPlugins(externalPluginsPath string) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func createTempRepo(ctx context.Context) (string, error) {
|
||||
func createTempRepo() (string, error) {
|
||||
repoPath, err := ioutil.TempDir("", "ipfs-shell")
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("failed to get temp dir: %s", err)
|
||||
@ -118,7 +117,7 @@ func spawnEphemeral(ctx context.Context) (icore.CoreAPI, error) {
|
||||
}
|
||||
|
||||
// Create a Temporary Repo
|
||||
repoPath, err := createTempRepo(ctx)
|
||||
repoPath, err := createTempRepo()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to create temp repo: %s", err)
|
||||
}
|
||||
@ -131,19 +130,19 @@ func spawnEphemeral(ctx context.Context) (icore.CoreAPI, error) {
|
||||
|
||||
func connectToPeers(ctx context.Context, ipfs icore.CoreAPI, peers []string) error {
|
||||
var wg sync.WaitGroup
|
||||
peerInfos := make(map[peer.ID]*peerstore.PeerInfo, len(peers))
|
||||
peerInfos := make(map[peer.ID]*peer.AddrInfo, len(peers))
|
||||
for _, addrStr := range peers {
|
||||
addr, err := ma.NewMultiaddr(addrStr)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
pii, err := peerstore.InfoFromP2pAddr(addr)
|
||||
pii, err := peer.AddrInfoFromP2pAddr(addr)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
pi, ok := peerInfos[pii.ID]
|
||||
if !ok {
|
||||
pi = &peerstore.PeerInfo{ID: pii.ID}
|
||||
pi = &peer.AddrInfo{ID: pii.ID}
|
||||
peerInfos[pi.ID] = pi
|
||||
}
|
||||
pi.Addrs = append(pi.Addrs, pii.Addrs...)
|
||||
@ -151,7 +150,7 @@ func connectToPeers(ctx context.Context, ipfs icore.CoreAPI, peers []string) err
|
||||
|
||||
wg.Add(len(peerInfos))
|
||||
for _, peerInfo := range peerInfos {
|
||||
go func(peerInfo *peerstore.PeerInfo) {
|
||||
go func(peerInfo *peer.AddrInfo) {
|
||||
defer wg.Done()
|
||||
err := ipfs.Swarm().Connect(ctx, *peerInfo)
|
||||
if err != nil {
|
||||
@ -212,7 +211,7 @@ func main() {
|
||||
fmt.Println("Spawning node on default repo")
|
||||
ipfs, err := spawnDefault(ctx)
|
||||
if err != nil {
|
||||
fmt.Println("No IPFS repo available on the default path")
|
||||
panic(fmt.Errorf("failed to spawnDefault node: %s", err))
|
||||
}
|
||||
*/
|
||||
|
||||
@ -313,7 +312,12 @@ func main() {
|
||||
// "/ip4/127.0.0.1/udp/4010/quic/p2p/QmZp2fhDLxjYue2RiUvLwT9MWdnbDxam32qYFnGmxZDh5L",
|
||||
}
|
||||
|
||||
go connectToPeers(ctx, ipfs, bootstrapNodes)
|
||||
go func() {
|
||||
err := connectToPeers(ctx, ipfs, bootstrapNodes)
|
||||
if err != nil {
|
||||
log.Printf("failed connect to peers: %s", err)
|
||||
}
|
||||
}()
|
||||
|
||||
exampleCIDStr := "QmUaoioqU7bxezBQZkUcgcSyokatMY71sxsALxQmRRrHrj"
|
||||
|
||||
|
||||
44
go.mod
44
go.mod
@ -5,28 +5,28 @@ require (
|
||||
contrib.go.opencensus.io/exporter/prometheus v0.3.0
|
||||
github.com/blang/semver/v4 v4.0.0
|
||||
github.com/cheggaaa/pb v1.0.29
|
||||
github.com/coreos/go-systemd/v22 v22.3.1
|
||||
github.com/coreos/go-systemd/v22 v22.3.2
|
||||
github.com/dustin/go-humanize v1.0.0
|
||||
github.com/elgris/jsondiff v0.0.0-20160530203242-765b5c24c302
|
||||
github.com/fsnotify/fsnotify v1.4.9
|
||||
github.com/gabriel-vasile/mimetype v1.2.0
|
||||
github.com/gabriel-vasile/mimetype v1.1.2
|
||||
github.com/go-bindata/go-bindata/v3 v3.1.3
|
||||
github.com/hashicorp/go-multierror v1.1.1
|
||||
github.com/ipfs/go-bitswap v0.3.3
|
||||
github.com/ipfs/go-bitswap v0.3.4
|
||||
github.com/ipfs/go-block-format v0.0.3
|
||||
github.com/ipfs/go-blockservice v0.1.4
|
||||
github.com/ipfs/go-cid v0.0.7
|
||||
github.com/ipfs/go-cidutil v0.0.2
|
||||
github.com/ipfs/go-datastore v0.4.5
|
||||
github.com/ipfs/go-detect-race v0.0.1
|
||||
github.com/ipfs/go-ds-badger v0.2.6
|
||||
github.com/ipfs/go-ds-badger v0.2.7
|
||||
github.com/ipfs/go-ds-flatfs v0.4.5
|
||||
github.com/ipfs/go-ds-leveldb v0.4.2
|
||||
github.com/ipfs/go-ds-measure v0.1.0
|
||||
github.com/ipfs/go-filestore v0.0.3
|
||||
github.com/ipfs/go-fs-lock v0.0.6
|
||||
github.com/ipfs/go-fs-lock v0.0.7
|
||||
github.com/ipfs/go-graphsync v0.8.0
|
||||
github.com/ipfs/go-ipfs-blockstore v0.1.4
|
||||
github.com/ipfs/go-ipfs-blockstore v0.1.6
|
||||
github.com/ipfs/go-ipfs-chunker v0.0.5
|
||||
github.com/ipfs/go-ipfs-cmds v0.6.0
|
||||
github.com/ipfs/go-ipfs-config v0.14.0
|
||||
@ -34,9 +34,9 @@ require (
|
||||
github.com/ipfs/go-ipfs-exchange-offline v0.0.1
|
||||
github.com/ipfs/go-ipfs-files v0.0.8
|
||||
github.com/ipfs/go-ipfs-keystore v0.0.2
|
||||
github.com/ipfs/go-ipfs-pinner v0.1.1
|
||||
github.com/ipfs/go-ipfs-pinner v0.1.2
|
||||
github.com/ipfs/go-ipfs-posinfo v0.0.1
|
||||
github.com/ipfs/go-ipfs-provider v0.4.4-0.20210513014626-1c19caa05024
|
||||
github.com/ipfs/go-ipfs-provider v0.5.1
|
||||
github.com/ipfs/go-ipfs-routing v0.1.0
|
||||
github.com/ipfs/go-ipfs-util v0.0.2
|
||||
github.com/ipfs/go-ipld-cbor v0.0.5
|
||||
@ -54,39 +54,40 @@ require (
|
||||
github.com/ipfs/go-unixfs v0.2.5
|
||||
github.com/ipfs/go-verifcid v0.0.1
|
||||
github.com/ipfs/interface-go-ipfs-core v0.4.0
|
||||
github.com/ipld/go-car v0.3.0
|
||||
github.com/ipfs/tar-utils v0.0.1
|
||||
github.com/ipld/go-car v0.3.1
|
||||
github.com/jbenet/go-random v0.0.0-20190219211222-123a90aedc0c
|
||||
github.com/jbenet/go-temp-err-catcher v0.1.0
|
||||
github.com/jbenet/goprocess v0.1.4
|
||||
github.com/libp2p/go-doh-resolver v0.3.0
|
||||
github.com/libp2p/go-libp2p v0.14.0
|
||||
github.com/libp2p/go-doh-resolver v0.3.1
|
||||
github.com/libp2p/go-libp2p v0.14.4
|
||||
github.com/libp2p/go-libp2p-circuit v0.4.0
|
||||
github.com/libp2p/go-libp2p-connmgr v0.2.4
|
||||
github.com/libp2p/go-libp2p-core v0.8.5
|
||||
github.com/libp2p/go-libp2p-discovery v0.5.0
|
||||
github.com/libp2p/go-libp2p-core v0.8.6
|
||||
github.com/libp2p/go-libp2p-discovery v0.5.1
|
||||
github.com/libp2p/go-libp2p-http v0.2.0
|
||||
github.com/libp2p/go-libp2p-kad-dht v0.12.0
|
||||
github.com/libp2p/go-libp2p-kad-dht v0.12.2
|
||||
github.com/libp2p/go-libp2p-kbucket v0.4.7
|
||||
github.com/libp2p/go-libp2p-loggables v0.1.0
|
||||
github.com/libp2p/go-libp2p-mplex v0.4.1
|
||||
github.com/libp2p/go-libp2p-noise v0.2.0
|
||||
github.com/libp2p/go-libp2p-peerstore v0.2.7
|
||||
github.com/libp2p/go-libp2p-pubsub v0.4.1
|
||||
github.com/libp2p/go-libp2p-peerstore v0.2.8
|
||||
github.com/libp2p/go-libp2p-pubsub v0.4.2
|
||||
github.com/libp2p/go-libp2p-pubsub-router v0.4.0
|
||||
github.com/libp2p/go-libp2p-quic-transport v0.11.0-rc.1
|
||||
github.com/libp2p/go-libp2p-quic-transport v0.11.2
|
||||
github.com/libp2p/go-libp2p-record v0.1.3
|
||||
github.com/libp2p/go-libp2p-routing-helpers v0.2.3
|
||||
github.com/libp2p/go-libp2p-swarm v0.5.0
|
||||
github.com/libp2p/go-libp2p-testing v0.4.0
|
||||
github.com/libp2p/go-libp2p-tls v0.1.3
|
||||
github.com/libp2p/go-libp2p-yamux v0.5.3
|
||||
github.com/libp2p/go-libp2p-yamux v0.5.4
|
||||
github.com/libp2p/go-socket-activation v0.0.2
|
||||
github.com/libp2p/go-tcp-transport v0.2.2
|
||||
github.com/libp2p/go-tcp-transport v0.2.4
|
||||
github.com/libp2p/go-ws-transport v0.4.0
|
||||
github.com/lucas-clemente/quic-go v0.21.0-rc.2
|
||||
github.com/lucas-clemente/quic-go v0.21.2
|
||||
github.com/miekg/dns v1.1.41
|
||||
github.com/mitchellh/go-homedir v1.1.0
|
||||
github.com/multiformats/go-multiaddr v0.3.1
|
||||
github.com/multiformats/go-multiaddr v0.3.3
|
||||
github.com/multiformats/go-multiaddr-dns v0.3.1
|
||||
github.com/multiformats/go-multibase v0.0.3
|
||||
github.com/multiformats/go-multihash v0.0.15
|
||||
@ -97,7 +98,6 @@ require (
|
||||
github.com/syndtr/goleveldb v1.0.0
|
||||
github.com/whyrusleeping/go-sysinfo v0.0.0-20190219211824-4a357d4b90b1
|
||||
github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7
|
||||
github.com/whyrusleeping/tar-utils v0.0.0-20201201191210-20a61371de5b
|
||||
go.opencensus.io v0.23.0
|
||||
go.uber.org/fx v1.13.1
|
||||
go.uber.org/zap v1.16.0
|
||||
|
||||
150
go.sum
150
go.sum
@ -125,8 +125,8 @@ github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7
|
||||
github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d h1:t5Wuyh53qYyg9eqn4BbnlIT+vmhyww0TatL+zT3uWgI=
|
||||
github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
||||
github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk=
|
||||
github.com/coreos/go-systemd/v22 v22.3.1 h1:7OO2CXWMYNDdaAzP51t4lCCZWwpQHmvPbm9sxWjm3So=
|
||||
github.com/coreos/go-systemd/v22 v22.3.1/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
|
||||
github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI=
|
||||
github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
|
||||
github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
|
||||
github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
|
||||
@ -187,8 +187,8 @@ github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM
|
||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
||||
github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
|
||||
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
|
||||
github.com/gabriel-vasile/mimetype v1.2.0 h1:A6z5J8OhjiWFV91sQ3dMI8apYu/tvP9keDaMM3Xu6p4=
|
||||
github.com/gabriel-vasile/mimetype v1.2.0/go.mod h1:6CDPel/o/3/s4+bp6kIbsWATq8pmgOisOPG40CJa6To=
|
||||
github.com/gabriel-vasile/mimetype v1.1.2 h1:gaPnPcNor5aZSVCJVSGipcpbgMWiAAj9z182ocSGbHU=
|
||||
github.com/gabriel-vasile/mimetype v1.1.2/go.mod h1:6CDPel/o/3/s4+bp6kIbsWATq8pmgOisOPG40CJa6To=
|
||||
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
||||
github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
|
||||
github.com/go-bindata/go-bindata/v3 v3.1.3 h1:F0nVttLC3ws0ojc7p60veTurcOm//D4QBODNM7EGrCI=
|
||||
@ -205,6 +205,8 @@ github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V
|
||||
github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
|
||||
github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
|
||||
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
||||
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I=
|
||||
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
|
||||
github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
||||
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
||||
github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s=
|
||||
@ -228,8 +230,8 @@ github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfb
|
||||
github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
|
||||
github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
|
||||
github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
|
||||
github.com/golang/mock v1.5.0 h1:jlYHihg//f7RRwuPfptm04yp4s7O6Kw8EZiVYIGcH0g=
|
||||
github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8=
|
||||
github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=
|
||||
github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
|
||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0=
|
||||
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
@ -242,8 +244,10 @@ github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:W
|
||||
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
|
||||
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
|
||||
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
||||
github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM=
|
||||
github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
||||
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
|
||||
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
|
||||
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
|
||||
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db h1:woRePGFeVFfLKN/pOkfl+p/TAqKOfFu+7KPlMVpok/w=
|
||||
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||
@ -343,8 +347,8 @@ github.com/ipfs/go-bitswap v0.1.0/go.mod h1:FFJEf18E9izuCqUtHxbWEvq+reg7o4CW5wSA
|
||||
github.com/ipfs/go-bitswap v0.1.2/go.mod h1:qxSWS4NXGs7jQ6zQvoPY3+NmOfHHG47mhkiLzBpJQIs=
|
||||
github.com/ipfs/go-bitswap v0.1.3/go.mod h1:YEQlFy0kkxops5Vy+OxWdRSEZIoS7I7KDIwoa5Chkps=
|
||||
github.com/ipfs/go-bitswap v0.1.8/go.mod h1:TOWoxllhccevbWFUR2N7B1MTSVVge1s6XSMiCSA4MzM=
|
||||
github.com/ipfs/go-bitswap v0.3.3 h1:CrTO3OiOYFBcdliw074/C7T2QYHEOsPClgvR6RIYcO4=
|
||||
github.com/ipfs/go-bitswap v0.3.3/go.mod h1:AyWWfN3moBzQX0banEtfKOfbXb3ZeoOeXnZGNPV9S6w=
|
||||
github.com/ipfs/go-bitswap v0.3.4 h1:AhJhRrG8xkxh6x87b4wWs+4U4y3DVB3doI8yFNqgQME=
|
||||
github.com/ipfs/go-bitswap v0.3.4/go.mod h1:4T7fvNv/LmOys+21tnLzGKncMeeXUYUd1nUiJ2teMvI=
|
||||
github.com/ipfs/go-block-format v0.0.1/go.mod h1:DK/YYcsSUIVAFNwo/KZCdIIbpN0ROH/baNLgayt4pFc=
|
||||
github.com/ipfs/go-block-format v0.0.2/go.mod h1:AWR46JfpcObNfg3ok2JHDUfdiHRgWhJgCQF+KIgOPJY=
|
||||
github.com/ipfs/go-block-format v0.0.3 h1:r8t66QstRp/pd/or4dpnbVfXT5Gt7lOqRvC+/dDTpMc=
|
||||
@ -384,8 +388,9 @@ github.com/ipfs/go-ds-badger v0.0.5/go.mod h1:g5AuuCGmr7efyzQhLL8MzwqcauPojGPUaH
|
||||
github.com/ipfs/go-ds-badger v0.0.7/go.mod h1:qt0/fWzZDoPW6jpQeqUjR5kBfhDNB65jd9YlmAvpQBk=
|
||||
github.com/ipfs/go-ds-badger v0.2.1/go.mod h1:Tx7l3aTph3FMFrRS838dcSJh+jjA7cX9DrGVwx/NOwE=
|
||||
github.com/ipfs/go-ds-badger v0.2.3/go.mod h1:pEYw0rgg3FIrywKKnL+Snr+w/LjJZVMTBRn4FS6UHUk=
|
||||
github.com/ipfs/go-ds-badger v0.2.6 h1:Hy8jw4rifxtRDrqpvC1yh36oIyE37KDzsUzlHUPOFiU=
|
||||
github.com/ipfs/go-ds-badger v0.2.6/go.mod h1:02rnztVKA4aZwDuaRPTf8mpqcKmXP7mLl6JPxd14JHA=
|
||||
github.com/ipfs/go-ds-badger v0.2.7 h1:ju5REfIm+v+wgVnQ19xGLYPHYHbYLR6qJfmMbCDSK1I=
|
||||
github.com/ipfs/go-ds-badger v0.2.7/go.mod h1:02rnztVKA4aZwDuaRPTf8mpqcKmXP7mLl6JPxd14JHA=
|
||||
github.com/ipfs/go-ds-flatfs v0.4.5 h1:4QceuKEbH+HVZ2ZommstJMi3o3II+dWS3IhLaD7IGHs=
|
||||
github.com/ipfs/go-ds-flatfs v0.4.5/go.mod h1:e4TesLyZoA8k1gV/yCuBTnt2PJtypn4XUlB5n8KQMZY=
|
||||
github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc=
|
||||
@ -397,14 +402,15 @@ github.com/ipfs/go-ds-measure v0.1.0 h1:vE4TyY4aeLeVgnnPBC5QzKIjKrqzha0NCujTfgvV
|
||||
github.com/ipfs/go-ds-measure v0.1.0/go.mod h1:1nDiFrhLlwArTME1Ees2XaBOl49OoCgd2A3f8EchMSY=
|
||||
github.com/ipfs/go-filestore v0.0.3 h1:MhZ1jT5K3NewZwim6rS/akcJLm1xM+r6nz6foeB9EwE=
|
||||
github.com/ipfs/go-filestore v0.0.3/go.mod h1:dvXRykFzyyXN2CdNlRGzDAkXMDPyI+D7JE066SiKLSE=
|
||||
github.com/ipfs/go-fs-lock v0.0.6 h1:sn3TWwNVQqSeNjlWy6zQ1uUGAZrV3hPOyEA6y1/N2a0=
|
||||
github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28L7zESmM=
|
||||
github.com/ipfs/go-fs-lock v0.0.7 h1:6BR3dajORFrFTkb5EpCUFIAypsoxpGpDSVUdFwzgL9U=
|
||||
github.com/ipfs/go-fs-lock v0.0.7/go.mod h1:Js8ka+FNYmgQRLrRXzU3CB/+Csr1BwrRilEcvYrHhhc=
|
||||
github.com/ipfs/go-graphsync v0.8.0 h1:Zhh6QdTqdipYHD71ncLO8eA6c8EGUTOoJ4Rqybw3K+o=
|
||||
github.com/ipfs/go-graphsync v0.8.0/go.mod h1:CLxN859dUTcXCav1DvNvmAUWPZfmNLjlGLJYy+c3dlM=
|
||||
github.com/ipfs/go-ipfs-blockstore v0.0.1/go.mod h1:d3WClOmRQKFnJ0Jz/jj/zmksX0ma1gROTlovZKBmN08=
|
||||
github.com/ipfs/go-ipfs-blockstore v0.1.0/go.mod h1:5aD0AvHPi7mZc6Ci1WCAhiBQu2IsfTduLl+422H6Rqw=
|
||||
github.com/ipfs/go-ipfs-blockstore v0.1.4 h1:2SGI6U1B44aODevza8Rde3+dY30Pb+lbcObe1LETxOQ=
|
||||
github.com/ipfs/go-ipfs-blockstore v0.1.4/go.mod h1:Jxm3XMVjh6R17WvxFEiyKBLUGr86HgIYJW/D/MwqeYQ=
|
||||
github.com/ipfs/go-ipfs-blockstore v0.1.6 h1:+RNM/gkTF6lzLPtt/xqjEUXJuG0lFwAiv+MV8MoAhvA=
|
||||
github.com/ipfs/go-ipfs-blockstore v0.1.6/go.mod h1:Jxm3XMVjh6R17WvxFEiyKBLUGr86HgIYJW/D/MwqeYQ=
|
||||
github.com/ipfs/go-ipfs-blocksutil v0.0.1 h1:Eh/H4pc1hsvhzsQoMEP3Bke/aW5P5rVM1IWFJMcGIPQ=
|
||||
github.com/ipfs/go-ipfs-blocksutil v0.0.1/go.mod h1:Yq4M86uIOmxmGPUHv/uI7uKqZNtLb449gwKqXjIsnRk=
|
||||
github.com/ipfs/go-ipfs-chunker v0.0.1/go.mod h1:tWewYK0we3+rMbOh7pPFGDyypCtvGcBFymgY4rSDLAw=
|
||||
@ -429,15 +435,17 @@ github.com/ipfs/go-ipfs-files v0.0.8 h1:8o0oFJkJ8UkO/ABl8T6ac6tKF3+NIpj67aAB6Zpu
|
||||
github.com/ipfs/go-ipfs-files v0.0.8/go.mod h1:wiN/jSG8FKyk7N0WyctKSvq3ljIa2NNTiZB55kpTdOs=
|
||||
github.com/ipfs/go-ipfs-keystore v0.0.2 h1:Fa9xg9IFD1VbiZtrNLzsD0GuELVHUFXCWF64kCPfEXU=
|
||||
github.com/ipfs/go-ipfs-keystore v0.0.2/go.mod h1:H49tRmibOEs7gLMgbOsjC4dqh1u5e0R/SWuc2ScfgSo=
|
||||
github.com/ipfs/go-ipfs-pinner v0.1.1 h1:iJd1gwILGQJSZhhI0jn6yFOLg34Ua7fdKcB6mXp6k/M=
|
||||
github.com/ipfs/go-ipfs-pinner v0.1.1/go.mod h1:EzyyaWCWeZJ/he9cDBH6QrEkSuRqTRWMmCoyNkylTTg=
|
||||
github.com/ipfs/go-ipfs-pinner v0.1.2-0.20210728161430-a223f5b32749 h1:t92ibx9OyuUwFgvb0squZP29iMf2H3YyMn0QMSQe1RY=
|
||||
github.com/ipfs/go-ipfs-pinner v0.1.2-0.20210728161430-a223f5b32749/go.mod h1:/u9kMe+TyQybN21O5OBicdyx3x93lVI77PCtiTnArUk=
|
||||
github.com/ipfs/go-ipfs-pinner v0.1.2 h1:Ve9OBhL6eg5+tVqEnIhPZOCXDtMjB+OhOohVZxPUxms=
|
||||
github.com/ipfs/go-ipfs-pinner v0.1.2/go.mod h1:/u9kMe+TyQybN21O5OBicdyx3x93lVI77PCtiTnArUk=
|
||||
github.com/ipfs/go-ipfs-posinfo v0.0.1 h1:Esoxj+1JgSjX0+ylc0hUmJCOv6V2vFoZiETLR6OtpRs=
|
||||
github.com/ipfs/go-ipfs-posinfo v0.0.1/go.mod h1:SwyeVP+jCwiDu0C313l/8jg6ZxM0qqtlt2a0vILTc1A=
|
||||
github.com/ipfs/go-ipfs-pq v0.0.1/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7BgUmUfY=
|
||||
github.com/ipfs/go-ipfs-pq v0.0.2 h1:e1vOOW6MuOwG2lqxcLA+wEn93i/9laCY8sXAw76jFOY=
|
||||
github.com/ipfs/go-ipfs-pq v0.0.2/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7BgUmUfY=
|
||||
github.com/ipfs/go-ipfs-provider v0.4.4-0.20210513014626-1c19caa05024 h1:eYfdZ27ogtwfnwKdfphOwcQ7PEOjKqXlWzVOakK0a60=
|
||||
github.com/ipfs/go-ipfs-provider v0.4.4-0.20210513014626-1c19caa05024/go.mod h1:kUMTf1R8c+KgWUWKTGSZiXCDZWMCkxCX3wyepk0cYEA=
|
||||
github.com/ipfs/go-ipfs-provider v0.5.1 h1:kZj72jzWLtGcorlwnMvBL6y6KJk6klO2Kb8QSeqEB0o=
|
||||
github.com/ipfs/go-ipfs-provider v0.5.1/go.mod h1:fem6HKSru7n35Ljap6kowWdJrUzvcWJW01uhAkqNnzo=
|
||||
github.com/ipfs/go-ipfs-routing v0.0.1/go.mod h1:k76lf20iKFxQTjcJokbPM9iBXVXVZhcOwc360N4nuKs=
|
||||
github.com/ipfs/go-ipfs-routing v0.1.0 h1:gAJTT1cEeeLj6/DlLX6t+NxD9fQe2ymTO6qWRDI/HQQ=
|
||||
github.com/ipfs/go-ipfs-routing v0.1.0/go.mod h1:hYoUkJLyAUKhF58tysKpids8RNDPO42BVMgK5dNsoqY=
|
||||
@ -470,8 +478,9 @@ github.com/ipfs/go-log/v2 v2.0.2/go.mod h1:O7P1lJt27vWHhOwQmcFEvlmo49ry2VY2+JfBW
|
||||
github.com/ipfs/go-log/v2 v2.0.3/go.mod h1:O7P1lJt27vWHhOwQmcFEvlmo49ry2VY2+JfBWFaa9+0=
|
||||
github.com/ipfs/go-log/v2 v2.0.5/go.mod h1:eZs4Xt4ZUJQFM3DlanGhy7TkwwawCZcSByscwkWG+dw=
|
||||
github.com/ipfs/go-log/v2 v2.1.1/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHntrv9KM=
|
||||
github.com/ipfs/go-log/v2 v2.1.3 h1:1iS3IU7aXRlbgUpN8yTTpJ53NXYjAe37vcI5+5nYrzk=
|
||||
github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g=
|
||||
github.com/ipfs/go-log/v2 v2.3.0 h1:31Re/cPqFHpsRHgyVwjWADPoF0otB1WrjTy8ZFYwEZU=
|
||||
github.com/ipfs/go-log/v2 v2.3.0/go.mod h1:QqGoj30OTpnKaG/LKTGTxoP2mmQtjVMEnK72gynbe/g=
|
||||
github.com/ipfs/go-merkledag v0.0.6/go.mod h1:QYPdnlvkOg7GnQRofu9XZimC5ZW5Wi3bKys/4GQQfto=
|
||||
github.com/ipfs/go-merkledag v0.1.0/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk=
|
||||
github.com/ipfs/go-merkledag v0.2.3/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk=
|
||||
@ -505,8 +514,10 @@ github.com/ipfs/go-verifcid v0.0.1 h1:m2HI7zIuR5TFyQ1b79Da5N9dnnCP1vcu2QqawmWlK2
|
||||
github.com/ipfs/go-verifcid v0.0.1/go.mod h1:5Hrva5KBeIog4A+UpqlaIU+DEstipcJYQQZc0g37pY0=
|
||||
github.com/ipfs/interface-go-ipfs-core v0.4.0 h1:+mUiamyHIwedqP8ZgbCIwpy40oX7QcXUbo4CZOeJVJg=
|
||||
github.com/ipfs/interface-go-ipfs-core v0.4.0/go.mod h1:UJBcU6iNennuI05amq3FQ7g0JHUkibHFAfhfUIy927o=
|
||||
github.com/ipld/go-car v0.3.0 h1:TV0Cb9k0Ux5lZ2h9+8xwQuIExYhHsllMGla1rB45lF4=
|
||||
github.com/ipld/go-car v0.3.0/go.mod h1:dPkEWeAK8KaVvH5TahaCs6Mncpd4lDMpkbs0/SPzuVs=
|
||||
github.com/ipfs/tar-utils v0.0.1 h1:8Na0KBD6GddGyXwU4rXNtVTE24iuZws8mENJQPLG7W4=
|
||||
github.com/ipfs/tar-utils v0.0.1/go.mod h1:ACflm9wXvV9w0eMJt6yYXxS2zuIV+yXGNwbuq1bhLeE=
|
||||
github.com/ipld/go-car v0.3.1 h1:WT+3cdmXlvmWOlGxk9webhj4auGO5QvgqC2vCCkFRXs=
|
||||
github.com/ipld/go-car v0.3.1/go.mod h1:dPkEWeAK8KaVvH5TahaCs6Mncpd4lDMpkbs0/SPzuVs=
|
||||
github.com/ipld/go-codec-dagpb v1.2.0 h1:2umV7ud8HBMkRuJgd8gXw95cLhwmcYrihS3cQEy9zpI=
|
||||
github.com/ipld/go-codec-dagpb v1.2.0/go.mod h1:6nBN7X7h8EOsEejZGqC7tej5drsdBAXbMHyBT+Fne5s=
|
||||
github.com/ipld/go-ipld-prime v0.9.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8=
|
||||
@ -589,8 +600,8 @@ github.com/libp2p/go-conn-security-multistream v0.2.1 h1:ft6/POSK7F+vl/2qzegnHDa
|
||||
github.com/libp2p/go-conn-security-multistream v0.2.1 h1:ft6/POSK7F+vl/2qzegnHDaXFU0iWB4yVTYrioC6Zy0=
|
||||
github.com/libp2p/go-conn-security-multistream v0.2.1/go.mod h1:cR1d8gA0Hr59Fj6NhaTpFhJZrjSYuNmhpT2r25zYR70=
|
||||
github.com/libp2p/go-conn-security-multistream v0.2.1/go.mod h1:cR1d8gA0Hr59Fj6NhaTpFhJZrjSYuNmhpT2r25zYR70=
|
||||
github.com/libp2p/go-doh-resolver v0.3.0 h1:YePXUmvjyFT7NsqgnEkhEi5d/Nqab97QZf7BPNUWSqo=
|
||||
github.com/libp2p/go-doh-resolver v0.3.0/go.mod h1:y5go1ZppAq9N2eppbX0xON01CyPBeUg2yS6BTssssog=
|
||||
github.com/libp2p/go-doh-resolver v0.3.1 h1:1wbVGkB4Tdj4WEvjAuYknOPyt4vSSDn9thnj13pKPaY=
|
||||
github.com/libp2p/go-doh-resolver v0.3.1/go.mod h1:y5go1ZppAq9N2eppbX0xON01CyPBeUg2yS6BTssssog=
|
||||
github.com/libp2p/go-eventbus v0.1.0/go.mod h1:vROgu5cs5T7cv7POWlWxBaVLxfSegC5UGQf8A2eEmx4=
|
||||
github.com/libp2p/go-eventbus v0.2.1 h1:VanAdErQnpTioN2TowqNcOijf6YwhuODe4pPKSDpxGc=
|
||||
github.com/libp2p/go-eventbus v0.2.1/go.mod h1:jc2S4SoEVPP48H9Wpzm5aiGwUCBMfGhVhhBjyhhCJs8=
|
||||
@ -607,8 +618,8 @@ github.com/libp2p/go-libp2p v0.7.4/go.mod h1:oXsBlTLF1q7pxr+9w6lqzS1ILpyHsaBPniV
|
||||
github.com/libp2p/go-libp2p v0.8.1/go.mod h1:QRNH9pwdbEBpx5DTJYg+qxcVaDMAz3Ee/qDKwXujH5o=
|
||||
github.com/libp2p/go-libp2p v0.12.0/go.mod h1:FpHZrfC1q7nA8jitvdjKBDF31hguaC676g/nT9PgQM0=
|
||||
github.com/libp2p/go-libp2p v0.13.0/go.mod h1:pM0beYdACRfHO1WcJlp65WXyG2A6NqYM+t2DTVAJxMo=
|
||||
github.com/libp2p/go-libp2p v0.14.0 h1:mYab0qShfAojYN/QTOtxPyQoK9knUHbUncwst4+wBcA=
|
||||
github.com/libp2p/go-libp2p v0.14.0/go.mod h1:dsQrWLAoIn+GkHPN/U+yypizkHiB9tnv79Os+kSgQ4Q=
|
||||
github.com/libp2p/go-libp2p v0.14.4 h1:QCJE+jGyqxWdrSPuS4jByXCzosgaIg4SJTLCRplJ53w=
|
||||
github.com/libp2p/go-libp2p v0.14.4/go.mod h1:EIRU0Of4J5S8rkockZM7eJp2S0UrCyi55m2kJVru3rM=
|
||||
github.com/libp2p/go-libp2p-asn-util v0.0.0-20200825225859-85005c6cf052 h1:BM7aaOF7RpmNn9+9g6uTjGJ0cTzWr5j9i9IKeun2M8U=
|
||||
github.com/libp2p/go-libp2p-asn-util v0.0.0-20200825225859-85005c6cf052/go.mod h1:nRMRTab+kZuk0LnKZpxhOVH/ndsdr2Nr//Zltc/vwgo=
|
||||
github.com/libp2p/go-libp2p-autonat v0.0.6/go.mod h1:uZneLdOkZHro35xIhpbtTzLlgYturpu4J5+0cZK3MqE=
|
||||
@ -657,8 +668,9 @@ github.com/libp2p/go-libp2p-core v0.7.0/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJB
|
||||
github.com/libp2p/go-libp2p-core v0.8.0/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8=
|
||||
github.com/libp2p/go-libp2p-core v0.8.1/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8=
|
||||
github.com/libp2p/go-libp2p-core v0.8.2/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8=
|
||||
github.com/libp2p/go-libp2p-core v0.8.5 h1:aEgbIcPGsKy6zYcC+5AJivYFedhYa4sW7mIpWpUaLKw=
|
||||
github.com/libp2p/go-libp2p-core v0.8.5/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8=
|
||||
github.com/libp2p/go-libp2p-core v0.8.6 h1:3S8g006qG6Tjpj1JdRK2S+TWc2DJQKX/RG9fdLeiLSU=
|
||||
github.com/libp2p/go-libp2p-core v0.8.6/go.mod h1:dgHr0l0hIKfWpGpqAMbpo19pen9wJfdCGv51mTmdpmM=
|
||||
github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE=
|
||||
github.com/libp2p/go-libp2p-crypto v0.0.2/go.mod h1:eETI5OUfBnvARGOHrJz2eWNyTUxEGZnBxMcbUjfIj4I=
|
||||
github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI=
|
||||
@ -666,8 +678,9 @@ github.com/libp2p/go-libp2p-discovery v0.0.5/go.mod h1:YtF20GUxjgoKZ4zmXj8j3Nb2T
|
||||
github.com/libp2p/go-libp2p-discovery v0.1.0/go.mod h1:4F/x+aldVHjHDHuX85x1zWoFTGElt8HnoDzwkFZm29g=
|
||||
github.com/libp2p/go-libp2p-discovery v0.2.0/go.mod h1:s4VGaxYMbw4+4+tsoQTqh7wfxg97AEdo4GYBt6BadWg=
|
||||
github.com/libp2p/go-libp2p-discovery v0.3.0/go.mod h1:o03drFnz9BVAZdzC/QUQ+NeQOu38Fu7LJGEOK2gQltw=
|
||||
github.com/libp2p/go-libp2p-discovery v0.5.0 h1:Qfl+e5+lfDgwdrXdu4YNCWyEo3fWuP+WgN9mN0iWviQ=
|
||||
github.com/libp2p/go-libp2p-discovery v0.5.0/go.mod h1:+srtPIU9gDaBNu//UHvcdliKBIcr4SfDcm0/PfPJLug=
|
||||
github.com/libp2p/go-libp2p-discovery v0.5.1 h1:CJylx+h2+4+s68GvrM4pGNyfNhOYviWBPtVv5PA7sfo=
|
||||
github.com/libp2p/go-libp2p-discovery v0.5.1/go.mod h1:+srtPIU9gDaBNu//UHvcdliKBIcr4SfDcm0/PfPJLug=
|
||||
github.com/libp2p/go-libp2p-gostream v0.3.0 h1:rnas//vRdHYCr7bjraZJISPwZV8OGMjeX5k5fN5Ax44=
|
||||
github.com/libp2p/go-libp2p-gostream v0.3.0/go.mod h1:pLBQu8db7vBMNINGsAwLL/ZCE8wng5V1FThoaE5rNjc=
|
||||
github.com/libp2p/go-libp2p-host v0.0.1/go.mod h1:qWd+H1yuU0m5CwzAkvbSjqKairayEHdR5MMl7Cwa7Go=
|
||||
@ -679,8 +692,8 @@ github.com/libp2p/go-libp2p-interface-connmgr v0.0.4/go.mod h1:GarlRLH0LdeWcLnYM
|
||||
github.com/libp2p/go-libp2p-interface-connmgr v0.0.5/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k=
|
||||
github.com/libp2p/go-libp2p-interface-pnet v0.0.1/go.mod h1:el9jHpQAXK5dnTpKA4yfCNBZXvrzdOU75zz+C6ryp3k=
|
||||
github.com/libp2p/go-libp2p-kad-dht v0.11.1/go.mod h1:5ojtR2acDPqh/jXf5orWy8YGb8bHQDS+qeDcoscL/PI=
|
||||
github.com/libp2p/go-libp2p-kad-dht v0.12.0 h1:R5vvp8kuXjsyDE/HEMKgM8XIwlRsP5BdAZexM+tJxdU=
|
||||
github.com/libp2p/go-libp2p-kad-dht v0.12.0/go.mod h1:zdQYru1c7dnluMpZls4i9Fj2TwYXS7YyDkJ1Yahv0w0=
|
||||
github.com/libp2p/go-libp2p-kad-dht v0.12.2 h1:INBYK7pEPzka5TrAWB2II+PYLeEaRlu6RWIoukfEBFQ=
|
||||
github.com/libp2p/go-libp2p-kad-dht v0.12.2/go.mod h1:mznpWRg0Nbkr9PB2Dm9XWN24V2BChE3FT1dHmwaDVws=
|
||||
github.com/libp2p/go-libp2p-kbucket v0.3.1/go.mod h1:oyjT5O7tS9CQurok++ERgc46YLwEpuGoFq9ubvoUOio=
|
||||
github.com/libp2p/go-libp2p-kbucket v0.4.7 h1:spZAcgxifvFZHBD8tErvppbnNiKA5uokDu3CV7axu70=
|
||||
github.com/libp2p/go-libp2p-kbucket v0.4.7/go.mod h1:XyVo99AfQH0foSf176k4jY1xUJ2+jUJIZCSDm7r2YKk=
|
||||
@ -721,20 +734,21 @@ github.com/libp2p/go-libp2p-peerstore v0.2.0/go.mod h1:N2l3eVIeAitSg3Pi2ipSrJYnq
|
||||
github.com/libp2p/go-libp2p-peerstore v0.2.1/go.mod h1:NQxhNjWxf1d4w6PihR8btWIRjwRLBr4TYKfNgrUkOPA=
|
||||
github.com/libp2p/go-libp2p-peerstore v0.2.2/go.mod h1:NQxhNjWxf1d4w6PihR8btWIRjwRLBr4TYKfNgrUkOPA=
|
||||
github.com/libp2p/go-libp2p-peerstore v0.2.6/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s=
|
||||
github.com/libp2p/go-libp2p-peerstore v0.2.7 h1:83JoLxyR9OYTnNfB5vvFqvMUv/xDNa6NoPHnENhBsGw=
|
||||
github.com/libp2p/go-libp2p-peerstore v0.2.7/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s=
|
||||
github.com/libp2p/go-libp2p-peerstore v0.2.8 h1:nJghUlUkFVvyk7ccsM67oFA6kqUkwyCM1G4WPVMCWYA=
|
||||
github.com/libp2p/go-libp2p-peerstore v0.2.8/go.mod h1:gGiPlXdz7mIHd2vfAsHzBNAMqSDkt2UBFwgcITgw1lA=
|
||||
github.com/libp2p/go-libp2p-pnet v0.2.0 h1:J6htxttBipJujEjz1y0a5+eYoiPcFHhSYHH6na5f0/k=
|
||||
github.com/libp2p/go-libp2p-pnet v0.2.0/go.mod h1:Qqvq6JH/oMZGwqs3N1Fqhv8NVhrdYcO0BW4wssv21LA=
|
||||
github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s=
|
||||
github.com/libp2p/go-libp2p-protocol v0.1.0/go.mod h1:KQPHpAabB57XQxGrXCNvbL6UEXfQqUgC/1adR2Xtflk=
|
||||
github.com/libp2p/go-libp2p-pubsub v0.4.0/go.mod h1:izkeMLvz6Ht8yAISXjx60XUQZMq9ZMe5h2ih4dLIBIQ=
|
||||
github.com/libp2p/go-libp2p-pubsub v0.4.1 h1:j4umIg5nyus+sqNfU+FWvb9aeYFQH/A+nDFhWj+8yy8=
|
||||
github.com/libp2p/go-libp2p-pubsub v0.4.1/go.mod h1:izkeMLvz6Ht8yAISXjx60XUQZMq9ZMe5h2ih4dLIBIQ=
|
||||
github.com/libp2p/go-libp2p-pubsub v0.4.2 h1:QKfDCfmmZSx3cTuGHU+/g8XV5x66Tlt4FPKcuhGcPTE=
|
||||
github.com/libp2p/go-libp2p-pubsub v0.4.2/go.mod h1:izkeMLvz6Ht8yAISXjx60XUQZMq9ZMe5h2ih4dLIBIQ=
|
||||
github.com/libp2p/go-libp2p-pubsub-router v0.4.0 h1:KjzTLIOBCt0+/4wH6epTxD/Qu4Up/IyeKHlj9MhWRJI=
|
||||
github.com/libp2p/go-libp2p-pubsub-router v0.4.0/go.mod h1:hs0j0ugcBjMOMgJ6diOlZM2rZEId/w5Gg86E+ac4SmQ=
|
||||
github.com/libp2p/go-libp2p-quic-transport v0.10.0/go.mod h1:RfJbZ8IqXIhxBRm5hqUEJqjiiY8xmEuq3HUDS993MkA=
|
||||
github.com/libp2p/go-libp2p-quic-transport v0.11.0-rc.1 h1:fq3BHwjS0zbU16zd0Yfuq2fSsGt/FhmSINQBOo334YM=
|
||||
github.com/libp2p/go-libp2p-quic-transport v0.11.0-rc.1/go.mod h1:+6KxAO7wHfPQqNzvJHO3ItqbYfhMuI7qc/+u/Tjgh3k=
|
||||
github.com/libp2p/go-libp2p-quic-transport v0.11.2 h1:p1YQDZRHH4Cv2LPtHubqlQ9ggz4CKng/REZuXZbZMhM=
|
||||
github.com/libp2p/go-libp2p-quic-transport v0.11.2/go.mod h1:wlanzKtIh6pHrq+0U3p3DY9PJfGqxMgPaGKaK5LifwQ=
|
||||
github.com/libp2p/go-libp2p-record v0.0.1/go.mod h1:grzqg263Rug/sRex85QrDOLntdFAymLDLm7lxMgU79Q=
|
||||
github.com/libp2p/go-libp2p-record v0.1.0/go.mod h1:ujNc8iuE5dlKWVy6wuL6dd58t0n7xI4hAIl8pE6wu5Q=
|
||||
github.com/libp2p/go-libp2p-record v0.1.1/go.mod h1:VRgKajOyMVgP/F0L5g3kH7SVskp17vFi2xheb5uMJtg=
|
||||
@ -793,8 +807,8 @@ github.com/libp2p/go-libp2p-yamux v0.2.8/go.mod h1:/t6tDqeuZf0INZMTgd0WxIRbtK2Ez
|
||||
github.com/libp2p/go-libp2p-yamux v0.4.0/go.mod h1:+DWDjtFMzoAwYLVkNZftoucn7PelNoy5nm3tZ3/Zw30=
|
||||
github.com/libp2p/go-libp2p-yamux v0.5.0/go.mod h1:AyR8k5EzyM2QN9Bbdg6X1SkVVuqLwTGf0L4DFq9g6po=
|
||||
github.com/libp2p/go-libp2p-yamux v0.5.1/go.mod h1:dowuvDu8CRWmr0iqySMiSxK+W0iL5cMVO9S94Y6gkv4=
|
||||
github.com/libp2p/go-libp2p-yamux v0.5.3 h1:x2bK2BWktdMdTrciiDmgTMIxYNBdkxewQFEjHDl7VgU=
|
||||
github.com/libp2p/go-libp2p-yamux v0.5.3/go.mod h1:Vy3TMonBAfTMXHWopsMc8iX/XGRYrRlpUaMzaeuHV/s=
|
||||
github.com/libp2p/go-libp2p-yamux v0.5.4 h1:/UOPtT/6DHPtr3TtKXBHa6g0Le0szYuI33Xc/Xpd7fQ=
|
||||
github.com/libp2p/go-libp2p-yamux v0.5.4/go.mod h1:tfrXbyaTqqSU654GTvK3ocnSZL3BuHoeTSqhcel1wsE=
|
||||
github.com/libp2p/go-maddr-filter v0.0.1/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q=
|
||||
github.com/libp2p/go-maddr-filter v0.0.4/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q=
|
||||
github.com/libp2p/go-maddr-filter v0.0.5/go.mod h1:Jk+36PMfIqCJhAnaASRH83bdAvfDRp/w6ENFaC9bG+M=
|
||||
@ -852,8 +866,8 @@ github.com/libp2p/go-tcp-transport v0.1.0/go.mod h1:oJ8I5VXryj493DEJ7OsBieu8fcg2
|
||||
github.com/libp2p/go-tcp-transport v0.1.1/go.mod h1:3HzGvLbx6etZjnFlERyakbaYPdfjg2pWP97dFZworkY=
|
||||
github.com/libp2p/go-tcp-transport v0.2.0/go.mod h1:vX2U0CnWimU4h0SGSEsg++AzvBcroCGYw28kh94oLe0=
|
||||
github.com/libp2p/go-tcp-transport v0.2.1/go.mod h1:zskiJ70MEfWz2MKxvFB/Pv+tPIB1PpPUrHIWQ8aFw7M=
|
||||
github.com/libp2p/go-tcp-transport v0.2.2 h1:vSjOYEJnfvAn20LJRuddghr+lrLDqU+DOV9fsCMG6zI=
|
||||
github.com/libp2p/go-tcp-transport v0.2.2/go.mod h1:9dvr03yqrPyYGIEN6Dy5UvdJZjyPFvl1S/igQ5QD1SU=
|
||||
github.com/libp2p/go-tcp-transport v0.2.4 h1:IL5ZAQrkLftufe24mWrmGtTV6drGi6BiXWMTLEM9PBE=
|
||||
github.com/libp2p/go-tcp-transport v0.2.4/go.mod h1:9dvr03yqrPyYGIEN6Dy5UvdJZjyPFvl1S/igQ5QD1SU=
|
||||
github.com/libp2p/go-testutil v0.0.1/go.mod h1:iAcJc/DKJQanJ5ws2V+u5ywdL2n12X1WbbEG+Jjy69I=
|
||||
github.com/libp2p/go-testutil v0.1.0/go.mod h1:81b2n5HypcVyrCg/MJx4Wgfp/VHojytjVe/gLzZ2Ehc=
|
||||
github.com/libp2p/go-ws-transport v0.0.5/go.mod h1:Qbl4BxPfXXhhd/o0wcrgoaItHqA9tnZjoFZnxykuaXU=
|
||||
@ -874,13 +888,13 @@ github.com/libp2p/go-yamux v1.4.0/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/h
|
||||
github.com/libp2p/go-yamux v1.4.1 h1:P1Fe9vF4th5JOxxgQvfbOHkrGqIZniTLf+ddhZp8YTI=
|
||||
github.com/libp2p/go-yamux v1.4.1/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE=
|
||||
github.com/libp2p/go-yamux/v2 v2.0.0/go.mod h1:NVWira5+sVUIU6tu1JWvaRn1dRnG+cawOJiflsAM+7U=
|
||||
github.com/libp2p/go-yamux/v2 v2.1.1 h1:3RkXAnDmaXJPckF/QbDnNbA6lZXMgycNTVMMTQ2YlAI=
|
||||
github.com/libp2p/go-yamux/v2 v2.1.1/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ=
|
||||
github.com/libp2p/go-yamux/v2 v2.2.0 h1:RwtpYZ2/wVviZ5+3pjC8qdQ4TKnrak0/E01N1UWoAFU=
|
||||
github.com/libp2p/go-yamux/v2 v2.2.0/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ=
|
||||
github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM=
|
||||
github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4=
|
||||
github.com/lucas-clemente/quic-go v0.19.3/go.mod h1:ADXpNbTQjq1hIzCpB+y/k5iz4n4z4IwqoLb94Kh5Hu8=
|
||||
github.com/lucas-clemente/quic-go v0.21.0-rc.2 h1:HWPytXS1LueuD6vIHwSMW0FQkmf4Rb4Keyk9Vvapm1A=
|
||||
github.com/lucas-clemente/quic-go v0.21.0-rc.2/go.mod h1:T+SpiNEBFsIo/TO6N8XDIhpnx3LMlNL/b9vyQtuvj1M=
|
||||
github.com/lucas-clemente/quic-go v0.21.2 h1:8LqqL7nBQFDUINadW0fHV/xSaCQJgmJC0Gv+qUnjd78=
|
||||
github.com/lucas-clemente/quic-go v0.21.2/go.mod h1:vF5M1XqhBAHgbjKcJOXY3JZz3GP0T3FQhz/uyOUS38Q=
|
||||
github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI=
|
||||
github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ=
|
||||
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
||||
@ -889,10 +903,13 @@ github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN
|
||||
github.com/marten-seemann/qpack v0.2.1/go.mod h1:F7Gl5L1jIgN1D11ucXefiuJS9UMVP2opoCp2jDKb7wc=
|
||||
github.com/marten-seemann/qtls v0.10.0/go.mod h1:UvMd1oaYDACI99/oZUYLzMCkBXQVT0aGm99sJhbT8hs=
|
||||
github.com/marten-seemann/qtls-go1-15 v0.1.1/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I=
|
||||
github.com/marten-seemann/qtls-go1-15 v0.1.4 h1:RehYMOyRW8hPVEja1KBVsFVNSm35Jj9Mvs5yNoZZ28A=
|
||||
github.com/marten-seemann/qtls-go1-15 v0.1.4/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I=
|
||||
github.com/marten-seemann/qtls-go1-16 v0.1.3 h1:XEZ1xGorVy9u+lJq+WXNE+hiqRYLNvJGYmwfwKQN2gU=
|
||||
github.com/marten-seemann/qtls-go1-16 v0.1.3/go.mod h1:gNpI2Ol+lRS3WwSOtIUUtRwZEQMXjYK+dQSBFbethAk=
|
||||
github.com/marten-seemann/qtls-go1-15 v0.1.5 h1:Ci4EIUN6Rlb+D6GmLdej/bCQ4nPYNtVXQB+xjiXE1nk=
|
||||
github.com/marten-seemann/qtls-go1-15 v0.1.5/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I=
|
||||
github.com/marten-seemann/qtls-go1-16 v0.1.4 h1:xbHbOGGhrenVtII6Co8akhLEdrawwB2iHl5yhJRpnco=
|
||||
github.com/marten-seemann/qtls-go1-16 v0.1.4/go.mod h1:gNpI2Ol+lRS3WwSOtIUUtRwZEQMXjYK+dQSBFbethAk=
|
||||
github.com/marten-seemann/qtls-go1-17 v0.1.0-rc.1 h1:/rpmWuGvceLwwWuaKPdjpR4JJEUH0tq64/I3hvzaNLM=
|
||||
github.com/marten-seemann/qtls-go1-17 v0.1.0-rc.1/go.mod h1:fz4HIxByo+LlWcreM4CZOYNuz3taBQ8rN2X6FqvaWo8=
|
||||
github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd h1:br0buuQ854V8u83wA0rVZ8ttrq5CpaPZdvrK0LP2lOk=
|
||||
github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd/go.mod h1:QuCEs1Nt24+FYQEqAAncTDPJIuGs+LxK1MCiFL25pMU=
|
||||
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
|
||||
@ -904,8 +921,9 @@ github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNx
|
||||
github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
|
||||
github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
||||
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
||||
github.com/mattn/go-isatty v0.0.11 h1:FxPOTFNqGkuDUGi3H/qkUbQO4ZiBa2brKq5r0l8TGeM=
|
||||
github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=
|
||||
github.com/mattn/go-isatty v0.0.13 h1:qdl+GuBjcsKKDco5BsxPJlId98mSWNKqYA+Co0SC1yA=
|
||||
github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
|
||||
github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
|
||||
github.com/mattn/go-runewidth v0.0.4 h1:2BvfKmzob6Bmd4YsL0zygOqfdFnK7GR4QL06Do4/p7Y=
|
||||
github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
|
||||
@ -967,8 +985,9 @@ github.com/multiformats/go-multiaddr v0.2.0/go.mod h1:0nO36NvPpyV4QzvTLi/lafl2y9
|
||||
github.com/multiformats/go-multiaddr v0.2.1/go.mod h1:s/Apk6IyxfvMjDafnhJgJ3/46z7tZ04iMk5wP4QMGGE=
|
||||
github.com/multiformats/go-multiaddr v0.2.2/go.mod h1:NtfXiOtHvghW9KojvtySjH5y0u0xW5UouOmQQrn6a3Y=
|
||||
github.com/multiformats/go-multiaddr v0.3.0/go.mod h1:dF9kph9wfJ+3VLAaeBqo9Of8x4fJxp6ggJGteB8HQTI=
|
||||
github.com/multiformats/go-multiaddr v0.3.1 h1:1bxa+W7j9wZKTZREySx1vPMs2TqrYWjVZ7zE6/XLG1I=
|
||||
github.com/multiformats/go-multiaddr v0.3.1/go.mod h1:uPbspcUPd5AfaP6ql3ujFY+QWzmBD8uLLL4bXW0XfGc=
|
||||
github.com/multiformats/go-multiaddr v0.3.3 h1:vo2OTSAqnENB2rLk79pLtr+uhj+VAzSe3uef5q0lRSs=
|
||||
github.com/multiformats/go-multiaddr v0.3.3/go.mod h1:lCKNGP1EQ1eZ35Za2wlqnabm9xQkib3fyB+nZXHLag0=
|
||||
github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q=
|
||||
github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q=
|
||||
github.com/multiformats/go-multiaddr-dns v0.2.0/go.mod h1:TJ5pr5bBO7Y1B18djPuRsVkduhQH2YqYSbxWJzYGdK0=
|
||||
@ -1028,8 +1047,9 @@ github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxzi
|
||||
github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
|
||||
github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo=
|
||||
github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM=
|
||||
github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78=
|
||||
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
|
||||
github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
|
||||
github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
|
||||
github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs=
|
||||
github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA=
|
||||
github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
|
||||
@ -1038,15 +1058,18 @@ github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W
|
||||
github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||
github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg=
|
||||
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
|
||||
github.com/onsi/ginkgo v1.14.0 h1:2mOpI4JVVPBN+WQRa0WKH2eXR+Ey+uK4n7Zj0aYpIQA=
|
||||
github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
|
||||
github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E=
|
||||
github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc=
|
||||
github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=
|
||||
github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
|
||||
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
||||
github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
||||
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
|
||||
github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA=
|
||||
github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE=
|
||||
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
|
||||
github.com/onsi/gomega v1.13.0 h1:7lLHu94wT9Ij0o6EWWclhu0aOh32VxhkwEJvzuWPeak=
|
||||
github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY=
|
||||
github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk=
|
||||
github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis=
|
||||
github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74=
|
||||
@ -1239,8 +1262,6 @@ github.com/whyrusleeping/mdns v0.0.0-20190826153040-b9b60ed33aa9 h1:Y1/FEOpaCpD2
|
||||
github.com/whyrusleeping/mdns v0.0.0-20190826153040-b9b60ed33aa9/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4=
|
||||
github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 h1:E9S12nwJwEOXe2d6gT6qxdvqMnNq+VnSsKPgm2ZZNds=
|
||||
github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7/go.mod h1:X2c0RVCI1eSUFI8eLcY3c0423ykwiUdxLJtkDvruhjI=
|
||||
github.com/whyrusleeping/tar-utils v0.0.0-20201201191210-20a61371de5b h1:wA3QeTsaAXybLL2kb2cKhCAQTHgYTMwuI8lBlJSv5V8=
|
||||
github.com/whyrusleeping/tar-utils v0.0.0-20201201191210-20a61371de5b/go.mod h1:xT1Y5p2JR2PfSZihE0s4mjdJaRGp1waCTf5JzhQLBck=
|
||||
github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee h1:lYbXeSvJi5zk5GLKVuid9TVjS9a0OmLIDKTfoZBL6Ow=
|
||||
github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee/go.mod h1:m2aV4LZI4Aez7dP5PMyVKEHhUyEJ/RjmPEDOpDvudHg=
|
||||
github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE=
|
||||
@ -1248,6 +1269,7 @@ github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q
|
||||
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
|
||||
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
|
||||
go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
|
||||
go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg=
|
||||
go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA=
|
||||
@ -1272,8 +1294,9 @@ go.uber.org/dig v1.10.0/go.mod h1:X34SnWGr8Fyla9zQNO2GSO2D+TIuqB14OS8JhYocIyw=
|
||||
go.uber.org/fx v1.13.1 h1:CFNTr1oin5OJ0VCZ8EycL3wzF29Jz2g0xe55RFsf2a4=
|
||||
go.uber.org/fx v1.13.1/go.mod h1:bREWhavnedxpJeTq9pQT53BbvwhUv7TcpsOqcH4a+3w=
|
||||
go.uber.org/goleak v0.10.0/go.mod h1:VCZuO8V8mFPlL0F5J5GK1rtHV3DrFcQ1R8ryq7FK0aI=
|
||||
go.uber.org/goleak v1.0.0 h1:qsup4IcBdlmsnGfqyLl4Ntn3C2XCCuKAE7DwHpScyUo=
|
||||
go.uber.org/goleak v1.0.0/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A=
|
||||
go.uber.org/goleak v1.1.10 h1:z+mqJhf6ss6BSfSM671tgKyZBFPTTJM+HLxnhPC3wu0=
|
||||
go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A=
|
||||
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
|
||||
go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
|
||||
go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
|
||||
@ -1352,8 +1375,9 @@ golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
|
||||
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
|
||||
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/mod v0.4.1 h1:Kvvh58BN8Y9/lBi7hTekvtMpm07eUZ0ck5pRHpsMWrY=
|
||||
golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo=
|
||||
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
@ -1394,8 +1418,10 @@ golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwY
|
||||
golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||
golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=
|
||||
golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6 h1:0PC75Fz/kyMGhL0e1QnypqK2kQMqKt9csD1GnMJR+Zk=
|
||||
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
|
||||
golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
|
||||
golang.org/x/net v0.0.0-20210428140749-89ef3d95e781 h1:DzZ89McO9/gWPsQXS/FVKAlG02ZjaQ6AlZRBimEYOd0=
|
||||
golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
|
||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
@ -1457,6 +1483,7 @@ golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7w
|
||||
golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
@ -1470,15 +1497,17 @@ golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7w
|
||||
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20201231184435-2d18734c6014/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210317225723-c4fcb01b228e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210426080607-c94f62235c83/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20210511113859-b0526f3d8744 h1:yhBbb4IRs2HS9PPlAg6DMC6mUOKexJBNsLf4Z+6En1Q=
|
||||
golang.org/x/sys v0.0.0-20210511113859-b0526f3d8744/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
||||
@ -1533,9 +1562,11 @@ golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapK
|
||||
golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||
golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||
golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||
golang.org/x/tools v0.1.1-0.20210225150353-54dc8c5edb56 h1:g3QwFWCjsUzBtcQIcI+CYmiL/0i0BxTJjQp54GGDLEM=
|
||||
golang.org/x/tools v0.1.1-0.20210225150353-54dc8c5edb56/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU=
|
||||
golang.org/x/tools v0.1.1 h1:wGiQel/hW0NnEkJUk8lbzkX2gFJU6PFxf1v5OlCfuOs=
|
||||
golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
@ -1609,8 +1640,10 @@ google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2
|
||||
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||
google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
|
||||
google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c=
|
||||
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
|
||||
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
|
||||
google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk=
|
||||
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc=
|
||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
@ -1634,8 +1667,9 @@ gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
|
||||
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
||||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o=
|
||||
|
||||
@ -1,958 +0,0 @@
|
||||
_do_comp()
|
||||
{
|
||||
if [[ $(type compopt) == *"builtin" ]]; then
|
||||
compopt $@
|
||||
else
|
||||
complete $@
|
||||
fi
|
||||
}
|
||||
|
||||
_ipfs_comp()
|
||||
{
|
||||
COMPREPLY=( $(compgen -W "$1" -- ${word}) )
|
||||
if [[ ${#COMPREPLY[@]} == 1 && ${COMPREPLY[0]} == "--"*"=" ]] ; then
|
||||
# If there's only one option, with =, then discard space
|
||||
_do_comp -o nospace
|
||||
fi
|
||||
}
|
||||
|
||||
_ipfs_help_only()
|
||||
{
|
||||
_ipfs_comp "--help"
|
||||
}
|
||||
|
||||
_ipfs_add()
|
||||
{
|
||||
if [[ "${prev}" == "--chunker" ]] ; then
|
||||
_ipfs_comp "placeholder1 placeholder2 placeholder3" # TODO: a) Give real options, b) Solve autocomplete bug for "="
|
||||
elif [ "${prev}" == "--pin" ] ; then
|
||||
_ipfs_comp "true false"
|
||||
elif [[ ${word} == -* ]] ; then
|
||||
_ipfs_comp "--recursive --dereference-args --stdin-name= --hidden --ignore= --ignore-rules-path= --quiet --quieter --silent --progress --trickle --only-hash --wrap-with-directory --chunker= --pin= --raw-leaves --nocopy --fscache --cid-version= --hash= --inline --inline-limit= --help "
|
||||
else
|
||||
_ipfs_filesystem_complete
|
||||
fi
|
||||
}
|
||||
|
||||
_ipfs_bitswap()
|
||||
{
|
||||
ipfs_comp "ledger stat wantlist --help"
|
||||
}
|
||||
|
||||
_ipfs_bitswap_ledger()
|
||||
{
|
||||
_ipfs_help_only
|
||||
}
|
||||
|
||||
_ipfs_bitswap_stat()
|
||||
{
|
||||
_ipfs_help_only
|
||||
}
|
||||
|
||||
_ipfs_bitswap_wantlist()
|
||||
{
|
||||
ipfs_comp "--peer= --help"
|
||||
}
|
||||
|
||||
_ipfs_block()
|
||||
{
|
||||
_ipfs_comp "get put rm stat --help"
|
||||
}
|
||||
|
||||
_ipfs_block_get()
|
||||
{
|
||||
_ipfs_hash_complete
|
||||
}
|
||||
|
||||
_ipfs_block_put()
|
||||
{
|
||||
if [ "${prev}" == "--format" ] ; then
|
||||
_ipfs_comp "v0 placeholder2 placeholder3" # TODO: a) Give real options, b) Solve autocomplete bug for "="
|
||||
elif [[ ${word} == -* ]] ; then
|
||||
_ipfs_comp "--format= --help"
|
||||
else
|
||||
_ipfs_filesystem_complete
|
||||
fi
|
||||
}
|
||||
|
||||
_ipfs_block_rm()
|
||||
{
|
||||
if [[ ${word} == -* ]] ; then
|
||||
_ipfs_comp "--force --quiet --help"
|
||||
else
|
||||
_ipfs_hash_complete
|
||||
fi
|
||||
}
|
||||
|
||||
_ipfs_block_stat()
|
||||
{
|
||||
_ipfs_hash_complete
|
||||
}
|
||||
|
||||
_ipfs_bootstrap()
|
||||
{
|
||||
_ipfs_comp "add list rm --help"
|
||||
}
|
||||
|
||||
_ipfs_bootstrap_add()
|
||||
{
|
||||
_ipfs_comp "default --help"
|
||||
}
|
||||
|
||||
_ipfs_bootstrap_list()
|
||||
{
|
||||
_ipfs_help_only
|
||||
}
|
||||
|
||||
_ipfs_bootstrap_rm()
|
||||
{
|
||||
_ipfs_comp "all --help"
|
||||
}
|
||||
|
||||
_ipfs_cat()
|
||||
{
|
||||
if [[ ${prev} == */* ]] ; then
|
||||
COMPREPLY=() # Only one argument allowed
|
||||
elif [[ ${word} == */* ]] ; then
|
||||
_ipfs_hash_complete
|
||||
else
|
||||
_ipfs_pinned_complete
|
||||
fi
|
||||
}
|
||||
|
||||
_ipfs_commands()
|
||||
{
|
||||
_ipfs_comp "--flags --help"
|
||||
}
|
||||
|
||||
_ipfs_config()
|
||||
{
|
||||
if [[ ${word} == -* ]] ; then
|
||||
_ipfs_comp "--bool --json"
|
||||
elif [[ ${prev} == *.* ]] ; then
|
||||
COMPREPLY=() # Only one subheader of the config can be shown or edited.
|
||||
else
|
||||
_ipfs_comp "show edit replace"
|
||||
fi
|
||||
}
|
||||
|
||||
_ipfs_config_edit()
|
||||
{
|
||||
_ipfs_help_only
|
||||
}
|
||||
|
||||
_ipfs_config_replace()
|
||||
{
|
||||
if [[ ${word} == -* ]] ; then
|
||||
_ipfs_comp "--help"
|
||||
else
|
||||
_ipfs_filesystem_complete
|
||||
fi
|
||||
}
|
||||
|
||||
_ipfs_config_show()
|
||||
{
|
||||
_ipfs_help_only
|
||||
}
|
||||
|
||||
_ipfs_daemon()
|
||||
{
|
||||
if [[ ${prev} == "--routing" ]] ; then
|
||||
_ipfs_comp "dht dhtclient none" # TODO: Solve autocomplete bug for "="
|
||||
elif [[ ${prev} == "--mount-ipfs" ]] || [[ ${prev} == "--mount-ipns" ]] || [[ ${prev} == "=" ]]; then
|
||||
_ipfs_filesystem_complete
|
||||
elif [[ ${word} == -* ]] ; then
|
||||
_ipfs_comp "--init --routing= --mount --writable --mount-ipfs= \
|
||||
--mount-ipns= --unrestricted-api --disable-transport-encryption \
|
||||
-- enable-gc --manage-fdlimit --offline --migrate --help"
|
||||
fi
|
||||
}
|
||||
|
||||
_ipfs_dag()
|
||||
{
|
||||
_ipfs_comp "get put --help"
|
||||
}
|
||||
|
||||
_ipfs_dag_get()
|
||||
{
|
||||
_ipfs_help_only
|
||||
}
|
||||
|
||||
_ipfs_dag_put()
|
||||
{
|
||||
if [[ ${prev} == "--format" ]] ; then
|
||||
_ipfs_comp "cbor placeholder1" # TODO: a) Which format more than cbor is valid? b) Solve autocomplete bug for "="
|
||||
elif [[ ${prev} == "--input-enc" ]] ; then
|
||||
_ipfs_comp "json placeholder1" # TODO: a) Which format more than json is valid? b) Solve autocomplete bug for "="
|
||||
elif [[ ${word} == -* ]] ; then
|
||||
_ipfs_comp "--format= --input-enc= --help"
|
||||
else
|
||||
_ipfs_filesystem_complete
|
||||
fi
|
||||
}
|
||||
|
||||
_ipfs_dht()
|
||||
{
|
||||
_ipfs_comp "findpeer findprovs get provide put query --help"
|
||||
}
|
||||
|
||||
_ipfs_dht_findpeer()
|
||||
{
|
||||
_ipfs_comp "--verbose --help"
|
||||
}
|
||||
|
||||
_ipfs_dht_findprovs()
|
||||
{
|
||||
_ipfs_comp "--verbose --help"
|
||||
}
|
||||
|
||||
_ipfs_dht_get()
|
||||
{
|
||||
_ipfs_comp "--verbose --help"
|
||||
}
|
||||
|
||||
_ipfs_dht_provide()
|
||||
{
|
||||
_ipfs_comp "--recursive --verbose --help"
|
||||
}
|
||||
|
||||
_ipfs_dht_put()
|
||||
{
|
||||
_ipfs_comp "--verbose --help"
|
||||
}
|
||||
|
||||
_ipfs_dht_query()
|
||||
{
|
||||
_ipfs_comp "--verbose --help"
|
||||
}
|
||||
|
||||
_ipfs_diag()
|
||||
{
|
||||
_ipfs_comp "sys cmds net --help"
|
||||
}
|
||||
|
||||
_ipfs_diag_cmds()
|
||||
{
|
||||
if [[ ${prev} == "clear" ]] ; then
|
||||
return 0
|
||||
elif [[ ${prev} =~ ^-?[0-9]+$ ]] ; then
|
||||
_ipfs_comp "ns us µs ms s m h" # TODO: Trigger without space, eg. "ipfs diag set-time 10ns" not "... set-time 10 ns"
|
||||
elif [[ ${prev} == "set-time" ]] ; then
|
||||
_ipfs_help_only
|
||||
elif [[ ${word} == -* ]] ; then
|
||||
_ipfs_comp "--verbose --help"
|
||||
else
|
||||
_ipfs_comp "clear set-time"
|
||||
fi
|
||||
}
|
||||
|
||||
_ipfs_diag_sys()
|
||||
{
|
||||
_ipfs_help_only
|
||||
}
|
||||
|
||||
_ipfs_diag_net()
|
||||
{
|
||||
if [[ ${prev} == "--vis" ]] ; then
|
||||
_ipfs_comp "d3 dot text" # TODO: Solve autocomplete bug for "="
|
||||
elif [[ ${word} == -* ]] ; then
|
||||
_ipfs_comp "--timeout= --vis= --help"
|
||||
fi
|
||||
}
|
||||
|
||||
_ipfs_dns()
|
||||
{
|
||||
if [[ ${word} == -* ]] ; then
|
||||
_ipfs_comp "--recursive --help"
|
||||
fi
|
||||
}
|
||||
|
||||
_ipfs_files()
|
||||
{
|
||||
_ipfs_comp "mv rm flush read write cp ls mkdir stat"
|
||||
}
|
||||
|
||||
_ipfs_files_mv()
|
||||
{
|
||||
if [[ ${word} == -* ]] ; then
|
||||
_ipfs_comp "--recursive --flush"
|
||||
elif [[ ${word} == /* ]] ; then
|
||||
_ipfs_files_complete
|
||||
else
|
||||
COMPREPLY=( / )
|
||||
[[ $COMPREPLY = */ ]] && _do_comp -o nospace
|
||||
fi
|
||||
}
|
||||
|
||||
_ipfs_files_rm()
|
||||
{
|
||||
if [[ ${word} == -* ]] ; then
|
||||
_ipfs_comp "--recursive --flush"
|
||||
elif [[ ${word} == /* ]] ; then
|
||||
_ipfs_files_complete
|
||||
else
|
||||
COMPREPLY=( / )
|
||||
[[ $COMPREPLY = */ ]] && _do_comp -o nospace
|
||||
fi
|
||||
}
|
||||
_ipfs_files_flush()
|
||||
{
|
||||
if [[ ${word} == /* ]] ; then
|
||||
_ipfs_files_complete
|
||||
else
|
||||
COMPREPLY=( / )
|
||||
[[ $COMPREPLY = */ ]] && _do_comp -o nospace
|
||||
fi
|
||||
}
|
||||
|
||||
_ipfs_files_read()
|
||||
{
|
||||
if [[ ${prev} == "--count" ]] || [[ ${prev} == "--offset" ]] ; then
|
||||
COMPREPLY=() # Numbers, just keep it empty
|
||||
elif [[ ${word} == -* ]] ; then
|
||||
_ipfs_comp "--offset --count --help"
|
||||
elif [[ ${word} == /* ]] ; then
|
||||
_ipfs_files_complete
|
||||
else
|
||||
COMPREPLY=( / )
|
||||
[[ $COMPREPLY = */ ]] && _do_comp -o nospace
|
||||
fi
|
||||
}
|
||||
|
||||
_ipfs_files_write()
|
||||
{
|
||||
if [[ ${prev} == "--count" ]] || [[ ${prev} == "--offset" ]] ; then # Dirty check
|
||||
COMPREPLY=() # Numbers, just keep it empty
|
||||
elif [[ ${word} == -* ]] ; then
|
||||
_ipfs_comp "--offset --count --create --truncate --help"
|
||||
elif [[ ${prev} == /* ]] ; then
|
||||
_ipfs_filesystem_complete
|
||||
elif [[ ${word} == /* ]] ; then
|
||||
_ipfs_files_complete
|
||||
else
|
||||
COMPREPLY=( / )
|
||||
[[ $COMPREPLY = */ ]] && _do_comp -o nospace
|
||||
fi
|
||||
}
|
||||
|
||||
_ipfs_files_cp()
|
||||
{
|
||||
if [[ ${word} == /* ]] ; then
|
||||
_ipfs_files_complete
|
||||
else
|
||||
COMPREPLY=( / )
|
||||
[[ $COMPREPLY = */ ]] && _do_comp -o nospace
|
||||
fi
|
||||
}
|
||||
|
||||
_ipfs_files_ls()
|
||||
{
|
||||
if [[ ${word} == -* ]] ; then
|
||||
_ipfs_comp "-l --help"
|
||||
elif [[ ${prev} == /* ]] ; then
|
||||
COMPREPLY=() # Path exist
|
||||
elif [[ ${word} == /* ]] ; then
|
||||
_ipfs_files_complete
|
||||
else
|
||||
COMPREPLY=( / )
|
||||
[[ $COMPREPLY = */ ]] && _do_comp -o nospace
|
||||
fi
|
||||
}
|
||||
|
||||
_ipfs_files_mkdir()
|
||||
{
|
||||
if [[ ${word} == -* ]] ; then
|
||||
_ipfs_comp "--parents --help"
|
||||
|
||||
elif [[ ${prev} == /* ]] ; then
|
||||
COMPREPLY=() # Path exist
|
||||
elif [[ ${word} == /* ]] ; then
|
||||
_ipfs_files_complete
|
||||
else
|
||||
COMPREPLY=( / )
|
||||
[[ $COMPREPLY = */ ]] && _do_comp -o nospace
|
||||
fi
|
||||
}
|
||||
|
||||
_ipfs_files_stat()
|
||||
{
|
||||
if [[ ${prev} == /* ]] ; then
|
||||
COMPREPLY=() # Path exist
|
||||
elif [[ ${word} == /* ]] ; then
|
||||
_ipfs_files_complete
|
||||
else
|
||||
COMPREPLY=( / )
|
||||
[[ $COMPREPLY = */ ]] && _do_comp -o nospace
|
||||
fi
|
||||
}
|
||||
|
||||
_ipfs_file()
|
||||
{
|
||||
if [[ ${prev} == "ls" ]] ; then
|
||||
_ipfs_hash_complete
|
||||
else
|
||||
_ipfs_comp "ls --help"
|
||||
fi
|
||||
}
|
||||
|
||||
_ipfs_file_ls()
|
||||
{
|
||||
_ipfs_help_only
|
||||
}
|
||||
|
||||
_ipfs_get()
|
||||
{
|
||||
if [ "${prev}" == "--output" ] ; then
|
||||
_do_comp -o default # Re-enable default file read
|
||||
COMPREPLY=()
|
||||
elif [ "${prev}" == "--compression-level" ] ; then
|
||||
_ipfs_comp "-1 1 2 3 4 5 6 7 8 9" # TODO: Solve autocomplete bug for "="
|
||||
elif [[ ${word} == -* ]] ; then
|
||||
_ipfs_comp "--output= --archive --compress --compression-level= --help"
|
||||
else
|
||||
_ipfs_hash_complete
|
||||
fi
|
||||
}
|
||||
|
||||
_ipfs_id()
|
||||
{
|
||||
if [[ ${word} == -* ]] ; then
|
||||
_ipfs_comp "--format= --help"
|
||||
fi
|
||||
}
|
||||
|
||||
_ipfs_init()
|
||||
{
|
||||
_ipfs_comp "--bits --force --empty-repo --help"
|
||||
}
|
||||
|
||||
_ipfs_log()
|
||||
{
|
||||
_ipfs_comp "level ls tail --help"
|
||||
}
|
||||
|
||||
_ipfs_log_level()
|
||||
{
|
||||
# TODO: auto-complete subsystem and level
|
||||
_ipfs_help_only
|
||||
}
|
||||
|
||||
_ipfs_log_ls()
|
||||
{
|
||||
_ipfs_help_only
|
||||
}
|
||||
|
||||
_ipfs_log_tail()
|
||||
{
|
||||
_ipfs_help_only
|
||||
}
|
||||
|
||||
_ipfs_ls()
|
||||
{
|
||||
if [[ ${word} == -* ]] ; then
|
||||
_ipfs_comp "--headers --resolve-type=false --help"
|
||||
else
|
||||
_ipfs_hash_complete
|
||||
fi
|
||||
}
|
||||
|
||||
_ipfs_mount()
|
||||
{
|
||||
if [[ ${prev} == "--ipfs-path" ]] || [[ ${prev} == "--ipns-path" ]] || [[ ${prev} == "=" ]] ; then
|
||||
_ipfs_filesystem_complete
|
||||
elif [[ ${word} == -* ]] ; then
|
||||
_ipfs_comp "--ipfs-path= --ipns-path= --help"
|
||||
fi
|
||||
}
|
||||
|
||||
_ipfs_name()
|
||||
{
|
||||
_ipfs_comp "publish resolve --help"
|
||||
}
|
||||
|
||||
_ipfs_name_publish()
|
||||
{
|
||||
if [[ ${prev} == "--lifetime" ]] || [[ ${prev} == "--ttl" ]] ; then
|
||||
COMPREPLY=() # Accept only numbers
|
||||
elif [[ ${prev} =~ ^-?[0-9]+$ ]] ; then
|
||||
_ipfs_comp "ns us µs ms s m h" # TODO: Trigger without space, eg. "ipfs diag set-time 10ns" not "... set-time 10 ns"
|
||||
elif [[ ${word} == -* ]] ; then
|
||||
_ipfs_comp "--resolve --lifetime --ttl --help"
|
||||
elif [[ ${word} == */ ]]; then
|
||||
_ipfs_hash_complete
|
||||
else
|
||||
_ipfs_pinned_complete
|
||||
fi
|
||||
}
|
||||
|
||||
_ipfs_name_resolve()
|
||||
{
|
||||
if [[ ${word} == -* ]] ; then
|
||||
_ipfs_comp "--recursive --nocache --help"
|
||||
fi
|
||||
}
|
||||
|
||||
_ipfs_object()
|
||||
{
|
||||
_ipfs_comp "data diff get links new patch put stat --help"
|
||||
}
|
||||
|
||||
_ipfs_object_data()
|
||||
{
|
||||
_ipfs_hash_complete
|
||||
}
|
||||
|
||||
_ipfs_object_diff()
|
||||
{
|
||||
if [[ ${word} == -* ]] ; then
|
||||
_ipfs_comp "--verbose --help"
|
||||
else
|
||||
_ipfs_hash_complete
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
_ipfs_object_get()
|
||||
{
|
||||
if [ "${prev}" == "--encoding" ] ; then
|
||||
_ipfs_comp "protobuf json xml"
|
||||
elif [[ ${word} == -* ]] ; then
|
||||
_ipfs_comp "--encoding --help"
|
||||
else
|
||||
_ipfs_hash_complete
|
||||
fi
|
||||
}
|
||||
|
||||
_ipfs_object_links()
|
||||
{
|
||||
if [[ ${word} == -* ]] ; then
|
||||
_ipfs_comp "--headers --help"
|
||||
else
|
||||
_ipfs_hash_complete
|
||||
fi
|
||||
}
|
||||
|
||||
_ipfs_object_new()
|
||||
{
|
||||
if [[ ${word} == -* ]] ; then
|
||||
_ipfs_comp "--help"
|
||||
else
|
||||
_ipfs_comp "unixfs-dir"
|
||||
fi
|
||||
}
|
||||
|
||||
_ipfs_object_patch()
|
||||
{
|
||||
if [[ -n "${COMP_WORDS[3]}" ]] ; then # Root merkledag object exist
|
||||
case "${COMP_WORDS[4]}" in
|
||||
append-data)
|
||||
_ipfs_help_only
|
||||
;;
|
||||
add-link)
|
||||
if [[ ${word} == -* ]] && [[ ${prev} == "add-link" ]] ; then # Dirty check
|
||||
_ipfs_comp "--create"
|
||||
#else
|
||||
# TODO: Hash path autocomplete. This is tricky, can be hash or a name.
|
||||
fi
|
||||
;;
|
||||
rm-link)
|
||||
_ipfs_hash_complete
|
||||
;;
|
||||
set-data)
|
||||
_ipfs_filesystem_complete
|
||||
;;
|
||||
*)
|
||||
_ipfs_comp "append-data add-link rm-link set-data"
|
||||
;;
|
||||
esac
|
||||
else
|
||||
_ipfs_hash_complete
|
||||
fi
|
||||
}
|
||||
|
||||
_ipfs_object_put()
|
||||
{
|
||||
if [ "${prev}" == "--inputenc" ] ; then
|
||||
_ipfs_comp "protobuf json"
|
||||
elif [ "${prev}" == "--datafieldenc" ] ; then
|
||||
_ipfs_comp "text base64"
|
||||
elif [[ ${word} == -* ]] ; then
|
||||
_ipfs_comp "--inputenc --datafieldenc --help"
|
||||
else
|
||||
_ipfs_hash_complete
|
||||
fi
|
||||
}
|
||||
|
||||
_ipfs_object_stat()
|
||||
{
|
||||
_ipfs_hash_complete
|
||||
}
|
||||
|
||||
_ipfs_pin()
|
||||
{
|
||||
_ipfs_comp "rm ls add --help"
|
||||
}
|
||||
|
||||
_ipfs_pin_add()
|
||||
{
|
||||
if [[ ${word} == -* ]] ; then
|
||||
_ipfs_comp "--recursive= --help"
|
||||
elif [[ ${word} == */ ]] && [[ ${word} != "/ipfs/" ]] ; then
|
||||
_ipfs_hash_complete
|
||||
fi
|
||||
}
|
||||
|
||||
_ipfs_pin_ls()
|
||||
{
|
||||
if [[ ${prev} == "--type" ]] || [[ ${prev} == "-t" ]] ; then
|
||||
_ipfs_comp "direct indirect recursive all" # TODO: Solve autocomplete bug for
|
||||
elif [[ ${word} == -* ]] ; then
|
||||
_ipfs_comp "--count --quiet --type= --help"
|
||||
elif [[ ${word} == */ ]] && [[ ${word} != "/ipfs/" ]] ; then
|
||||
_ipfs_hash_complete
|
||||
fi
|
||||
}
|
||||
|
||||
_ipfs_pin_rm()
|
||||
{
|
||||
if [[ ${word} == -* ]] ; then
|
||||
_ipfs_comp "--recursive --help"
|
||||
elif [[ ${word} == */ ]] && [[ ${word} != "/ipfs/" ]] ; then
|
||||
COMPREPLY=() # TODO: _ipfs_hash_complete() + List local pinned hashes as default?
|
||||
fi
|
||||
}
|
||||
|
||||
_ipfs_ping()
|
||||
{
|
||||
_ipfs_comp "--count= --help"
|
||||
}
|
||||
|
||||
_ipfs_pubsub()
|
||||
{
|
||||
_ipfs_comp "ls peers pub sub --help"
|
||||
}
|
||||
|
||||
_ipfs_pubsub_ls()
|
||||
{
|
||||
_ipfs_help_only
|
||||
}
|
||||
|
||||
_ipfs_pubsub_peers()
|
||||
{
|
||||
_ipfs_help_only
|
||||
}
|
||||
|
||||
_ipfs_pubsub_pub()
|
||||
{
|
||||
_ipfs_help_only
|
||||
}
|
||||
|
||||
_ipfs_pubsub_sub()
|
||||
{
|
||||
_ipfs_comp "--discover --help"
|
||||
}
|
||||
|
||||
_ipfs_refs()
|
||||
{
|
||||
if [ "${prev}" == "--format" ] ; then
|
||||
_ipfs_comp "src dst linkname"
|
||||
elif [[ ${word} == -* ]] ; then
|
||||
_ipfs_comp "local --format= --edges --unique --recursive --help"
|
||||
#else
|
||||
# TODO: Use "ipfs ref" and combine it with autocomplete, see _ipfs_hash_complete
|
||||
fi
|
||||
}
|
||||
|
||||
_ipfs_refs_local()
|
||||
{
|
||||
_ipfs_help_only
|
||||
}
|
||||
|
||||
_ipfs_repo()
|
||||
{
|
||||
_ipfs_comp "fsck gc stat verify version --help"
|
||||
}
|
||||
|
||||
_ipfs_repo_version()
|
||||
{
|
||||
_ipfs_comp "--quiet --help"
|
||||
}
|
||||
|
||||
_ipfs_repo_verify()
|
||||
{
|
||||
_ipfs_help_only
|
||||
}
|
||||
|
||||
_ipfs_repo_gc()
|
||||
{
|
||||
_ipfs_comp "--quiet --help"
|
||||
}
|
||||
|
||||
_ipfs_repo_stat()
|
||||
{
|
||||
_ipfs_comp "--human --help"
|
||||
}
|
||||
|
||||
_ipfs_repo_fsck()
|
||||
{
|
||||
_ipfs_help_only
|
||||
}
|
||||
|
||||
_ipfs_resolve()
|
||||
{
|
||||
if [[ ${word} == /ipfs/* ]] ; then
|
||||
_ipfs_hash_complete
|
||||
elif [[ ${word} == /ipns/* ]] ; then
|
||||
COMPREPLY=() # Can't autocomplete ipns
|
||||
elif [[ ${word} == -* ]] ; then
|
||||
_ipfs_comp "--recursive --help"
|
||||
else
|
||||
opts="/ipns/ /ipfs/"
|
||||
COMPREPLY=( $(compgen -W "${opts}" -- ${word}) )
|
||||
[[ $COMPREPLY = */ ]] && _do_comp -o nospace
|
||||
fi
|
||||
}
|
||||
|
||||
_ipfs_stats()
|
||||
{
|
||||
_ipfs_comp "bitswap bw repo --help"
|
||||
}
|
||||
|
||||
_ipfs_stats_bitswap()
|
||||
{
|
||||
_ipfs_help_only
|
||||
}
|
||||
|
||||
_ipfs_stats_bw()
|
||||
{
|
||||
# TODO: Which protocol is valid?
|
||||
_ipfs_comp "--peer= --proto= --poll --interval= --help"
|
||||
}
|
||||
|
||||
_ipfs_stats_repo()
|
||||
{
|
||||
_ipfs_comp "--human= --help"
|
||||
}
|
||||
|
||||
_ipfs_swarm()
|
||||
{
|
||||
_ipfs_comp "addrs connect disconnect filters peers --help"
|
||||
}
|
||||
|
||||
_ipfs_swarm_addrs()
|
||||
{
|
||||
_ipfs_comp "local --help"
|
||||
}
|
||||
|
||||
_ipfs_swarm_addrs_local()
|
||||
{
|
||||
_ipfs_comp "--id --help"
|
||||
}
|
||||
|
||||
_ipfs_swarm_connect()
|
||||
{
|
||||
_ipfs_multiaddr_complete
|
||||
}
|
||||
|
||||
_ipfs_swarm_disconnect()
|
||||
{
|
||||
local OLDIFS="$IFS" ; local IFS=$'\n' # Change divider for iterator one line below
|
||||
opts=$(for x in `ipfs swarm peers`; do echo ${x} ; done)
|
||||
IFS="$OLDIFS" # Reset divider to space, ' '
|
||||
COMPREPLY=( $(compgen -W "${opts}" -- ${word}) )
|
||||
[[ $COMPREPLY = */ ]] && _do_comp -o nospace -o filenames
|
||||
}
|
||||
|
||||
_ipfs_swarm_filters()
|
||||
{
|
||||
if [[ ${prev} == "add" ]] || [[ ${prev} == "rm" ]]; then
|
||||
_ipfs_multiaddr_complete
|
||||
else
|
||||
_ipfs_comp "add rm --help"
|
||||
fi
|
||||
}
|
||||
|
||||
_ipfs_swarm_filters_add()
|
||||
{
|
||||
_ipfs_help_only
|
||||
}
|
||||
|
||||
_ipfs_swarm_filters_rm()
|
||||
{
|
||||
_ipfs_help_only
|
||||
}
|
||||
|
||||
_ipfs_swarm_peers()
|
||||
{
|
||||
_ipfs_help_only
|
||||
}
|
||||
|
||||
_ipfs_tar()
|
||||
{
|
||||
_ipfs_comp "add cat --help"
|
||||
}
|
||||
|
||||
_ipfs_tar_add()
|
||||
{
|
||||
if [[ ${word} == -* ]] ; then
|
||||
_ipfs_comp "--help"
|
||||
else
|
||||
_ipfs_filesystem_complete
|
||||
fi
|
||||
}
|
||||
|
||||
_ipfs_tar_cat()
|
||||
{
|
||||
if [[ ${word} == -* ]] ; then
|
||||
_ipfs_comp "--help"
|
||||
else
|
||||
_ipfs_filesystem_complete
|
||||
fi
|
||||
}
|
||||
|
||||
_ipfs_update()
|
||||
{
|
||||
if [[ ${word} == -* ]] ; then
|
||||
_ipfs_comp "--version" # TODO: How does "--verbose" option work?
|
||||
else
|
||||
_ipfs_comp "versions version install stash revert fetch"
|
||||
fi
|
||||
}
|
||||
|
||||
_ipfs_update_install()
|
||||
{
|
||||
if [[ ${prev} == v*.*.* ]] ; then
|
||||
COMPREPLY=()
|
||||
elif [[ ${word} == -* ]] ; then
|
||||
_ipfs_comp "--version"
|
||||
else
|
||||
local OLDIFS="$IFS" ; local IFS=$'\n' # Change divider for iterator one line below
|
||||
opts=$(for x in `ipfs update versions`; do echo ${x} ; done)
|
||||
IFS="$OLDIFS" # Reset divider to space, ' '
|
||||
COMPREPLY=( $(compgen -W "${opts}" -- ${word}) )
|
||||
fi
|
||||
}
|
||||
|
||||
_ipfs_update_stash()
|
||||
{
|
||||
if [[ ${word} == -* ]] ; then
|
||||
_ipfs_comp "--tag --help"
|
||||
fi
|
||||
}
|
||||
_ipfs_update_fetch()
|
||||
{
|
||||
if [[ ${prev} == "--output" ]] ; then
|
||||
_ipfs_filesystem_complete
|
||||
elif [[ ${word} == -* ]] ; then
|
||||
_ipfs_comp "--output --help"
|
||||
fi
|
||||
}
|
||||
|
||||
_ipfs_version()
|
||||
{
|
||||
_ipfs_comp "--number --commit --repo"
|
||||
}
|
||||
|
||||
_ipfs_hash_complete()
|
||||
{
|
||||
local lastDir=${word%/*}/
|
||||
echo "LastDir: ${lastDir}" >> ~/Downloads/debug-ipfs.txt
|
||||
local OLDIFS="$IFS" ; local IFS=$'\n' # Change divider for iterator one line below
|
||||
opts=$(for x in `ipfs file ls ${lastDir}`; do echo ${lastDir}${x}/ ; done) # TODO: Implement "ipfs file ls -F" to get rid of frontslash after files. This take long time to run first time on a new shell.
|
||||
echo "Options: ${opts}" >> ~/Downloads/debug-ipfs.txt
|
||||
IFS="$OLDIFS" # Reset divider to space, ' '
|
||||
echo "Current: ${word}" >> ~/Downloads/debug-ipfs.txt
|
||||
COMPREPLY=( $(compgen -W "${opts}" -- ${word}) )
|
||||
echo "Suggestion: ${COMPREPLY}" >> ~/Downloads/debug-ipfs.txt
|
||||
[[ $COMPREPLY = */ ]] && _do_comp -o nospace -o filenames # Removing whitespace after output & handle output as filenames. (Only printing the latest folder of files.)
|
||||
return 0
|
||||
}
|
||||
|
||||
_ipfs_files_complete()
|
||||
{
|
||||
local lastDir=${word%/*}/
|
||||
local OLDIFS="$IFS" ; local IFS=$'\n' # Change divider for iterator one line below
|
||||
opts=$(for x in `ipfs files ls ${lastDir}`; do echo ${lastDir}${x}/ ; done) # TODO: Implement "ipfs files ls -F" to get rid of frontslash after files. This does currently throw "Error: /cats/foo/ is not a directory"
|
||||
IFS="$OLDIFS" # Reset divider to space, ' '
|
||||
COMPREPLY=( $(compgen -W "${opts}" -- ${word}) )
|
||||
[[ $COMPREPLY = */ ]] && _do_comp -o nospace -o filenames
|
||||
return 0
|
||||
}
|
||||
|
||||
_ipfs_multiaddr_complete()
|
||||
{
|
||||
local lastDir=${word%/*}/
|
||||
# Special case
|
||||
if [[ ${word} == */"ipcidr"* ]] ; then # TODO: Broken, fix it.
|
||||
opts="1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32" # TODO: IPv6?
|
||||
COMPREPLY=( $(compgen -W "${opts}" -- ${word}) )
|
||||
# "Loop"
|
||||
elif [[ ${word} == /*/ ]] || [[ ${word} == /*/* ]] ; then
|
||||
if [[ ${word} == /*/*/*/*/*/ ]] ; then
|
||||
COMPREPLY=()
|
||||
elif [[ ${word} == /*/*/*/*/ ]] ; then
|
||||
word=${word##*/}
|
||||
opts="ipfs/ "
|
||||
COMPREPLY=( $(compgen -W "${opts}" -- ${word}) )
|
||||
elif [[ ${word} == /*/*/*/ ]] ; then
|
||||
word=${word##*/}
|
||||
opts="4001/ "
|
||||
COMPREPLY=( $(compgen -W "${opts}" -- ${word}) )
|
||||
elif [[ ${word} == /*/*/ ]] ; then
|
||||
word=${word##*/}
|
||||
opts="udp/ tcp/ ipcidr/"
|
||||
COMPREPLY=( $(compgen -W "${opts}" -- ${word}) )
|
||||
elif [[ ${word} == /*/ ]] ; then
|
||||
COMPREPLY=() # TODO: This need to return something to NOT break the function. Maybe a "/" in the end as well due to -o filename option.
|
||||
fi
|
||||
COMPREPLY=${lastDir}${COMPREPLY}
|
||||
else # start case
|
||||
opts="/ip4/ /ip6/"
|
||||
COMPREPLY=( $(compgen -W "${opts}" -- ${word}) )
|
||||
fi
|
||||
[[ $COMPREPLY = */ ]] && _do_comp -o nospace -o filenames
|
||||
return 0
|
||||
}
|
||||
|
||||
_ipfs_pinned_complete()
|
||||
{
|
||||
local OLDIFS="$IFS" ; local IFS=$'\n'
|
||||
local pinned=$(ipfs pin ls)
|
||||
COMPREPLY=( $(compgen -W "${pinned}" -- ${word}) )
|
||||
IFS="$OLDIFS"
|
||||
if [[ ${#COMPREPLY[*]} -eq 1 ]]; then # Only one completion, remove pretty output
|
||||
COMPREPLY=( ${COMPREPLY[0]/ *//} ) #Remove ' ' and everything after
|
||||
[[ $COMPREPLY = */ ]] && _do_comp -o nospace # Removing whitespace after output
|
||||
fi
|
||||
}
|
||||
_ipfs_filesystem_complete()
|
||||
{
|
||||
_do_comp -o default # Re-enable default file read
|
||||
COMPREPLY=()
|
||||
}
|
||||
|
||||
_ipfs()
|
||||
{
|
||||
COMPREPLY=()
|
||||
_do_comp +o default # Disable default to not deny completion, see: http://stackoverflow.com/a/19062943/1216348
|
||||
|
||||
local word="${COMP_WORDS[COMP_CWORD]}"
|
||||
local prev="${COMP_WORDS[COMP_CWORD-1]}"
|
||||
|
||||
case "${COMP_CWORD}" in
|
||||
1)
|
||||
local opts="add bitswap block bootstrap cat commands config daemon dag dht \
|
||||
diag dns file files get id init log ls mount name object pin ping pubsub \
|
||||
refs repo resolve stats swarm tar update version"
|
||||
COMPREPLY=( $(compgen -W "${opts}" -- ${word}) );;
|
||||
2)
|
||||
local command="${COMP_WORDS[1]}"
|
||||
eval "_ipfs_$command" 2> /dev/null ;;
|
||||
*)
|
||||
local command="${COMP_WORDS[1]}"
|
||||
local subcommand="${COMP_WORDS[2]}"
|
||||
eval "_ipfs_${command}_${subcommand}" 2> /dev/null && return
|
||||
eval "_ipfs_$command" 2> /dev/null ;;
|
||||
esac
|
||||
}
|
||||
complete -F _ipfs ipfs
|
||||
@ -66,7 +66,7 @@ func TestPeeringService(t *testing.T) {
|
||||
t.Logf("waiting for h1's connection to h3 to work")
|
||||
require.NoError(t, h1.Connect(ctx, peer.AddrInfo{ID: h3.ID(), Addrs: h3.Addrs()}))
|
||||
require.Eventually(t, func() bool {
|
||||
return h1.Network().Connectedness(h2.ID()) == network.Connected
|
||||
return h1.Network().Connectedness(h3.ID()) == network.Connected
|
||||
}, 30*time.Second, 100*time.Millisecond)
|
||||
|
||||
require.Len(t, h1.Network().Peers(), 3)
|
||||
|
||||
@ -298,7 +298,7 @@ func (loader *PluginLoader) Start(node *core.IpfsNode) error {
|
||||
return loader.transition(loaderStarting, loaderStarted)
|
||||
}
|
||||
|
||||
// StopDaemon stops all long-running plugins.
|
||||
// Close stops all long-running plugins.
|
||||
func (loader *PluginLoader) Close() error {
|
||||
switch loader.state {
|
||||
case loaderClosing, loaderFailed, loaderClosed:
|
||||
|
||||
@ -127,11 +127,7 @@ func TestHttpFetch(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestFetchBinary(t *testing.T) {
|
||||
tmpDir, err := ioutil.TempDir("", "fetchtest")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
defer os.RemoveAll(tmpDir)
|
||||
tmpDir := t.TempDir()
|
||||
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
|
||||
@ -13,13 +13,7 @@ var (
|
||||
)
|
||||
|
||||
func TestRepoDir(t *testing.T) {
|
||||
var err error
|
||||
fakeHome, err = ioutil.TempDir("", "testhome")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
defer os.RemoveAll(fakeHome)
|
||||
|
||||
fakeHome = t.TempDir()
|
||||
os.Setenv("HOME", fakeHome)
|
||||
fakeIpfs = filepath.Join(fakeHome, ".ipfs")
|
||||
|
||||
|
||||
@ -2,6 +2,7 @@ package ipfsfetcher
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
@ -32,10 +33,9 @@ const (
|
||||
)
|
||||
|
||||
type IpfsFetcher struct {
|
||||
distPath string
|
||||
limit int64
|
||||
bootstrap []string
|
||||
peers []peer.AddrInfo
|
||||
distPath string
|
||||
limit int64
|
||||
repoRoot *string
|
||||
|
||||
openOnce sync.Once
|
||||
openErr error
|
||||
@ -56,12 +56,15 @@ type IpfsFetcher struct {
|
||||
//
|
||||
// Specifying "" for distPath sets the default IPNS path.
|
||||
// Specifying 0 for fetchLimit sets the default, -1 means no limit.
|
||||
func NewIpfsFetcher(distPath string, fetchLimit int64, bootstrap []string, peers []peer.AddrInfo) *IpfsFetcher {
|
||||
//
|
||||
// Bootstrap and peer information in read from the IPFS config file in
|
||||
// repoRoot, unless repoRoot is nil. If repoRoot is empty (""), then read the
|
||||
// config from the default IPFS directory.
|
||||
func NewIpfsFetcher(distPath string, fetchLimit int64, repoRoot *string) *IpfsFetcher {
|
||||
f := &IpfsFetcher{
|
||||
limit: defaultFetchLimit,
|
||||
distPath: migrations.LatestIpfsDist,
|
||||
bootstrap: bootstrap,
|
||||
peers: peers,
|
||||
limit: defaultFetchLimit,
|
||||
distPath: migrations.LatestIpfsDist,
|
||||
repoRoot: repoRoot,
|
||||
}
|
||||
|
||||
if distPath != "" {
|
||||
@ -88,7 +91,8 @@ func (f *IpfsFetcher) Fetch(ctx context.Context, filePath string) (io.ReadCloser
|
||||
// Initialize and start IPFS node on first call to Fetch, since the fetcher
|
||||
// may be created by not used.
|
||||
f.openOnce.Do(func() {
|
||||
f.ipfsTmpDir, f.openErr = initTempNode(ctx, f.bootstrap, f.peers)
|
||||
bootstrap, peers := readIpfsConfig(f.repoRoot)
|
||||
f.ipfsTmpDir, f.openErr = initTempNode(ctx, bootstrap, peers)
|
||||
if f.openErr != nil {
|
||||
return
|
||||
}
|
||||
@ -277,3 +281,52 @@ func parsePath(fetchPath string) (ipath.Path, error) {
|
||||
}
|
||||
return ipfsPath, ipfsPath.IsValid()
|
||||
}
|
||||
|
||||
func readIpfsConfig(repoRoot *string) (bootstrap []string, peers []peer.AddrInfo) {
|
||||
if repoRoot == nil {
|
||||
return
|
||||
}
|
||||
|
||||
cfgPath, err := config.Filename(*repoRoot)
|
||||
if err != nil {
|
||||
fmt.Fprintln(os.Stderr, err)
|
||||
return
|
||||
}
|
||||
|
||||
cfgFile, err := os.Open(cfgPath)
|
||||
if err != nil {
|
||||
fmt.Fprintln(os.Stderr, err)
|
||||
return
|
||||
}
|
||||
defer cfgFile.Close()
|
||||
|
||||
// Attempt to read bootstrap addresses
|
||||
var bootstrapCfg struct {
|
||||
Bootstrap []string
|
||||
}
|
||||
err = json.NewDecoder(cfgFile).Decode(&bootstrapCfg)
|
||||
if err != nil {
|
||||
fmt.Fprintln(os.Stderr, "cannot read bootstrap peers from config")
|
||||
} else {
|
||||
bootstrap = bootstrapCfg.Bootstrap
|
||||
}
|
||||
|
||||
if _, err = cfgFile.Seek(0, 0); err != nil {
|
||||
// If Seek fails, only log the error and continue on to try to read the
|
||||
// peering config anyway as it might still be readable
|
||||
fmt.Fprintln(os.Stderr, err)
|
||||
}
|
||||
|
||||
// Attempt to read peers
|
||||
var peeringCfg struct {
|
||||
Peering config.Peering
|
||||
}
|
||||
err = json.NewDecoder(cfgFile).Decode(&peeringCfg)
|
||||
if err != nil {
|
||||
fmt.Fprintln(os.Stderr, "cannot read peering from config")
|
||||
} else {
|
||||
peers = peeringCfg.Peering.Peers
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
@ -25,7 +25,7 @@ func TestIpfsFetcher(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
|
||||
fetcher := NewIpfsFetcher("", 0, nil, nil)
|
||||
fetcher := NewIpfsFetcher("", 0, nil)
|
||||
defer fetcher.Close()
|
||||
|
||||
rc, err := fetcher.Fetch(ctx, "go-ipfs/versions")
|
||||
@ -63,11 +63,11 @@ func TestInitIpfsFetcher(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
|
||||
f := NewIpfsFetcher("", 0, nil, nil)
|
||||
f := NewIpfsFetcher("", 0, nil)
|
||||
defer f.Close()
|
||||
|
||||
// Init ipfs repo
|
||||
f.ipfsTmpDir, f.openErr = initTempNode(ctx, f.bootstrap, f.peers)
|
||||
f.ipfsTmpDir, f.openErr = initTempNode(ctx, nil, nil)
|
||||
if f.openErr != nil {
|
||||
t.Fatalf("failed to initialize ipfs node: %s", f.openErr)
|
||||
}
|
||||
@ -110,6 +110,144 @@ func TestInitIpfsFetcher(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestReadIpfsConfig(t *testing.T) {
|
||||
var testConfig = `
|
||||
{
|
||||
"Bootstrap": [
|
||||
"/dnsaddr/bootstrap.libp2p.io/p2p/QmcZf59bWwK5XFi76CZX8cbJ4BhTzzA3gU1ZjYZcYW3dwt",
|
||||
"/ip4/104.131.131.82/tcp/4001/p2p/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ"
|
||||
],
|
||||
"Migration": {
|
||||
"DownloadSources": ["IPFS", "HTTP", "127.0.0.1", "https://127.0.1.1"],
|
||||
"Keep": "cache"
|
||||
},
|
||||
"Peering": {
|
||||
"Peers": [
|
||||
{
|
||||
"ID": "12D3KooWGC6TvWhfapngX6wvJHMYvKpDMXPb3ZnCZ6dMoaMtimQ5",
|
||||
"Addrs": ["/ip4/127.0.0.1/tcp/4001", "/ip4/127.0.0.1/udp/4001/quic"]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
`
|
||||
|
||||
noSuchDir := "no_such_dir-5953aa51-1145-4efd-afd1-a069075fcf76"
|
||||
bootstrap, peers := readIpfsConfig(&noSuchDir)
|
||||
if bootstrap != nil {
|
||||
t.Error("expected nil bootstrap")
|
||||
}
|
||||
if peers != nil {
|
||||
t.Error("expected nil peers")
|
||||
}
|
||||
|
||||
tmpDir := makeConfig(t, testConfig)
|
||||
|
||||
bootstrap, peers = readIpfsConfig(nil)
|
||||
if bootstrap != nil || peers != nil {
|
||||
t.Fatal("expected nil ipfs config items")
|
||||
}
|
||||
|
||||
bootstrap, peers = readIpfsConfig(&tmpDir)
|
||||
if len(bootstrap) != 2 {
|
||||
t.Fatal("wrong number of bootstrap addresses")
|
||||
}
|
||||
if bootstrap[0] != "/dnsaddr/bootstrap.libp2p.io/p2p/QmcZf59bWwK5XFi76CZX8cbJ4BhTzzA3gU1ZjYZcYW3dwt" {
|
||||
t.Fatal("wrong bootstrap address")
|
||||
}
|
||||
|
||||
if len(peers) != 1 {
|
||||
t.Fatal("wrong number of peers")
|
||||
}
|
||||
|
||||
peer := peers[0]
|
||||
if peer.ID.String() != "12D3KooWGC6TvWhfapngX6wvJHMYvKpDMXPb3ZnCZ6dMoaMtimQ5" {
|
||||
t.Errorf("wrong ID for first peer")
|
||||
}
|
||||
if len(peer.Addrs) != 2 {
|
||||
t.Error("wrong number of addrs for first peer")
|
||||
}
|
||||
}
|
||||
|
||||
func TestBadBootstrappingIpfsConfig(t *testing.T) {
|
||||
const configBadBootstrap = `
|
||||
{
|
||||
"Bootstrap": "unreadable",
|
||||
"Migration": {
|
||||
"DownloadSources": ["IPFS", "HTTP", "127.0.0.1"],
|
||||
"Keep": "cache"
|
||||
},
|
||||
"Peering": {
|
||||
"Peers": [
|
||||
{
|
||||
"ID": "12D3KooWGC6TvWhfapngX6wvJHMYvKpDMXPb3ZnCZ6dMoaMtimQ5",
|
||||
"Addrs": ["/ip4/127.0.0.1/tcp/4001", "/ip4/127.0.0.1/udp/4001/quic"]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
`
|
||||
|
||||
tmpDir := makeConfig(t, configBadBootstrap)
|
||||
|
||||
bootstrap, peers := readIpfsConfig(&tmpDir)
|
||||
if bootstrap != nil {
|
||||
t.Fatal("expected nil bootstrap")
|
||||
}
|
||||
if len(peers) != 1 {
|
||||
t.Fatal("wrong number of peers")
|
||||
}
|
||||
if len(peers[0].Addrs) != 2 {
|
||||
t.Error("wrong number of addrs for first peer")
|
||||
}
|
||||
os.RemoveAll(tmpDir)
|
||||
}
|
||||
|
||||
func TestBadPeersIpfsConfig(t *testing.T) {
|
||||
const configBadPeers = `
|
||||
{
|
||||
"Bootstrap": [
|
||||
"/dnsaddr/bootstrap.libp2p.io/p2p/QmcZf59bWwK5XFi76CZX8cbJ4BhTzzA3gU1ZjYZcYW3dwt",
|
||||
"/ip4/104.131.131.82/tcp/4001/p2p/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ"
|
||||
],
|
||||
"Migration": {
|
||||
"DownloadSources": ["IPFS", "HTTP", "127.0.0.1"],
|
||||
"Keep": "cache"
|
||||
},
|
||||
"Peering": "Unreadable-data"
|
||||
}
|
||||
`
|
||||
|
||||
tmpDir := makeConfig(t, configBadPeers)
|
||||
|
||||
bootstrap, peers := readIpfsConfig(&tmpDir)
|
||||
if peers != nil {
|
||||
t.Fatal("expected nil peers")
|
||||
}
|
||||
if len(bootstrap) != 2 {
|
||||
t.Fatal("wrong number of bootstrap addresses")
|
||||
}
|
||||
if bootstrap[0] != "/dnsaddr/bootstrap.libp2p.io/p2p/QmcZf59bWwK5XFi76CZX8cbJ4BhTzzA3gU1ZjYZcYW3dwt" {
|
||||
t.Fatal("wrong bootstrap address")
|
||||
}
|
||||
}
|
||||
|
||||
func makeConfig(t *testing.T, configData string) string {
|
||||
tmpDir := t.TempDir()
|
||||
|
||||
cfgFile, err := os.Create(filepath.Join(tmpDir, "config"))
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if _, err = cfgFile.Write([]byte(configData)); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if err = cfgFile.Close(); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
return tmpDir
|
||||
}
|
||||
|
||||
func skipUnlessEpic(t *testing.T) {
|
||||
if os.Getenv("IPFS_EPIC_TEST") == "" {
|
||||
t.SkipNow()
|
||||
|
||||
@ -2,15 +2,20 @@ package migrations
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"log"
|
||||
"net/url"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path"
|
||||
"runtime"
|
||||
"strings"
|
||||
"sync"
|
||||
|
||||
config "github.com/ipfs/go-ipfs-config"
|
||||
)
|
||||
|
||||
const (
|
||||
@ -107,6 +112,89 @@ func ExeName(name string) string {
|
||||
return name
|
||||
}
|
||||
|
||||
// ReadMigrationConfig reads the Migration section of the IPFS config, avoiding
|
||||
// reading anything other than the Migration section. That way, we're free to
|
||||
// make arbitrary changes to all _other_ sections in migrations.
|
||||
func ReadMigrationConfig(repoRoot string) (*config.Migration, error) {
|
||||
var cfg struct {
|
||||
Migration config.Migration
|
||||
}
|
||||
|
||||
cfgPath, err := config.Filename(repoRoot)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
cfgFile, err := os.Open(cfgPath)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer cfgFile.Close()
|
||||
|
||||
err = json.NewDecoder(cfgFile).Decode(&cfg)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
switch cfg.Migration.Keep {
|
||||
case "":
|
||||
cfg.Migration.Keep = config.DefaultMigrationKeep
|
||||
case "discard", "cache", "keep":
|
||||
default:
|
||||
return nil, errors.New("unknown config value, Migrations.Keep must be 'cache', 'pin', or 'discard'")
|
||||
}
|
||||
|
||||
if len(cfg.Migration.DownloadSources) == 0 {
|
||||
cfg.Migration.DownloadSources = config.DefaultMigrationDownloadSources
|
||||
}
|
||||
|
||||
return &cfg.Migration, nil
|
||||
}
|
||||
|
||||
// GetMigrationFetcher creates one or more fetchers according to
|
||||
// downloadSources,
|
||||
func GetMigrationFetcher(downloadSources []string, distPath string, newIpfsFetcher func(string) Fetcher) (Fetcher, error) {
|
||||
const httpUserAgent = "go-ipfs"
|
||||
|
||||
var fetchers []Fetcher
|
||||
for _, src := range downloadSources {
|
||||
src := strings.TrimSpace(src)
|
||||
switch src {
|
||||
case "HTTPS", "https", "HTTP", "http":
|
||||
fetchers = append(fetchers, NewHttpFetcher(distPath, "", httpUserAgent, 0))
|
||||
case "IPFS", "ipfs":
|
||||
if newIpfsFetcher != nil {
|
||||
fetchers = append(fetchers, newIpfsFetcher(distPath))
|
||||
}
|
||||
default:
|
||||
u, err := url.Parse(src)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("bad gateway address: %s", err)
|
||||
}
|
||||
switch u.Scheme {
|
||||
case "":
|
||||
u.Scheme = "https"
|
||||
case "https", "http":
|
||||
default:
|
||||
return nil, errors.New("bad gateway address: url scheme must be http or https")
|
||||
}
|
||||
fetchers = append(fetchers, NewHttpFetcher(distPath, u.String(), httpUserAgent, 0))
|
||||
case "":
|
||||
// Ignore empty string
|
||||
}
|
||||
}
|
||||
|
||||
switch len(fetchers) {
|
||||
case 0:
|
||||
return nil, errors.New("no sources specified")
|
||||
case 1:
|
||||
return fetchers[0], nil
|
||||
}
|
||||
|
||||
// Wrap fetchers in a MultiFetcher to try them in order
|
||||
return NewMultiFetcher(fetchers...), nil
|
||||
}
|
||||
|
||||
func migrationName(from, to int) string {
|
||||
return fmt.Sprintf("fs-repo-%d-to-%d", from, to)
|
||||
}
|
||||
|
||||
@ -3,20 +3,18 @@ package migrations
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"io"
|
||||
"log"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
config "github.com/ipfs/go-ipfs-config"
|
||||
)
|
||||
|
||||
func TestFindMigrations(t *testing.T) {
|
||||
tmpDir, err := ioutil.TempDir("", "migratetest")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
defer os.RemoveAll(tmpDir)
|
||||
tmpDir := t.TempDir()
|
||||
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
@ -63,11 +61,7 @@ func TestFindMigrations(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestFindMigrationsReverse(t *testing.T) {
|
||||
tmpDir, err := ioutil.TempDir("", "migratetest")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
defer os.RemoveAll(tmpDir)
|
||||
tmpDir := t.TempDir()
|
||||
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
@ -121,11 +115,7 @@ func TestFetchMigrations(t *testing.T) {
|
||||
defer ts.Close()
|
||||
fetcher := NewHttpFetcher(CurrentIpfsDist, ts.URL, "", 0)
|
||||
|
||||
tmpDir, err := ioutil.TempDir("", "migratetest")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
defer os.RemoveAll(tmpDir)
|
||||
tmpDir := t.TempDir()
|
||||
|
||||
needed := []string{"fs-repo-1-to-2", "fs-repo-2-to-3"}
|
||||
buf := new(strings.Builder)
|
||||
@ -157,16 +147,12 @@ func TestFetchMigrations(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestRunMigrations(t *testing.T) {
|
||||
fakeHome, err := ioutil.TempDir("", "testhome")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
defer os.RemoveAll(fakeHome)
|
||||
fakeHome := t.TempDir()
|
||||
|
||||
os.Setenv("HOME", fakeHome)
|
||||
fakeIpfs := filepath.Join(fakeHome, ".ipfs")
|
||||
|
||||
err = os.Mkdir(fakeIpfs, os.ModePerm)
|
||||
err := os.Mkdir(fakeIpfs, os.ModePerm)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
@ -211,3 +197,205 @@ func createFakeBin(from, to int, tmpDir string) {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
|
||||
var testConfig = `
|
||||
{
|
||||
"Bootstrap": [
|
||||
"/dnsaddr/bootstrap.libp2p.io/p2p/QmcZf59bWwK5XFi76CZX8cbJ4BhTzzA3gU1ZjYZcYW3dwt",
|
||||
"/ip4/104.131.131.82/tcp/4001/p2p/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ"
|
||||
],
|
||||
"Migration": {
|
||||
"DownloadSources": ["IPFS", "HTTP", "127.0.0.1", "https://127.0.1.1"],
|
||||
"Keep": "cache"
|
||||
},
|
||||
"Peering": {
|
||||
"Peers": [
|
||||
{
|
||||
"ID": "12D3KooWGC6TvWhfapngX6wvJHMYvKpDMXPb3ZnCZ6dMoaMtimQ5",
|
||||
"Addrs": ["/ip4/127.0.0.1/tcp/4001", "/ip4/127.0.0.1/udp/4001/quic"]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
`
|
||||
|
||||
func TestReadMigrationConfigDefaults(t *testing.T) {
|
||||
tmpDir := makeConfig(t, "{}")
|
||||
|
||||
cfg, err := ReadMigrationConfig(tmpDir)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if cfg.Keep != config.DefaultMigrationKeep {
|
||||
t.Error("expected default value for Keep")
|
||||
}
|
||||
|
||||
if len(cfg.DownloadSources) != len(config.DefaultMigrationDownloadSources) {
|
||||
t.Fatal("expected default number of download sources")
|
||||
}
|
||||
for i, src := range config.DefaultMigrationDownloadSources {
|
||||
if cfg.DownloadSources[i] != src {
|
||||
t.Errorf("wrong DownloadSource: %s", cfg.DownloadSources[i])
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestReadMigrationConfigErrors(t *testing.T) {
|
||||
tmpDir := makeConfig(t, `{"Migration": {"Keep": "badvalue"}}`)
|
||||
|
||||
_, err := ReadMigrationConfig(tmpDir)
|
||||
if err == nil {
|
||||
t.Fatal("expected error")
|
||||
}
|
||||
if !strings.HasPrefix(err.Error(), "unknown") {
|
||||
t.Fatal("did not get expected error:", err)
|
||||
}
|
||||
|
||||
os.RemoveAll(tmpDir)
|
||||
_, err = ReadMigrationConfig(tmpDir)
|
||||
if err == nil {
|
||||
t.Fatal("expected error")
|
||||
}
|
||||
|
||||
tmpDir = makeConfig(t, `}{`)
|
||||
_, err = ReadMigrationConfig(tmpDir)
|
||||
if err == nil {
|
||||
t.Fatal("expected error")
|
||||
}
|
||||
}
|
||||
|
||||
func TestReadMigrationConfig(t *testing.T) {
|
||||
tmpDir := makeConfig(t, testConfig)
|
||||
|
||||
cfg, err := ReadMigrationConfig(tmpDir)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if len(cfg.DownloadSources) != 4 {
|
||||
t.Fatal("wrong number of DownloadSources")
|
||||
}
|
||||
expect := []string{"IPFS", "HTTP", "127.0.0.1", "https://127.0.1.1"}
|
||||
for i := range expect {
|
||||
if cfg.DownloadSources[i] != expect[i] {
|
||||
t.Errorf("wrong DownloadSource at %d", i)
|
||||
}
|
||||
}
|
||||
|
||||
if cfg.Keep != "cache" {
|
||||
t.Error("wrong value for Keep")
|
||||
}
|
||||
}
|
||||
|
||||
type mockIpfsFetcher struct{}
|
||||
|
||||
func (m *mockIpfsFetcher) Fetch(ctx context.Context, filePath string) (io.ReadCloser, error) {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
func (m *mockIpfsFetcher) Close() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func TestGetMigrationFetcher(t *testing.T) {
|
||||
var f Fetcher
|
||||
var err error
|
||||
|
||||
newIpfsFetcher := func(distPath string) Fetcher {
|
||||
return &mockIpfsFetcher{}
|
||||
}
|
||||
|
||||
downloadSources := []string{"ftp://bad.gateway.io"}
|
||||
_, err = GetMigrationFetcher(downloadSources, "", newIpfsFetcher)
|
||||
if err == nil || !strings.HasPrefix(err.Error(), "bad gateway addr") {
|
||||
t.Fatal("Expected bad gateway address error, got:", err)
|
||||
}
|
||||
|
||||
downloadSources = []string{"::bad.gateway.io"}
|
||||
_, err = GetMigrationFetcher(downloadSources, "", newIpfsFetcher)
|
||||
if err == nil || !strings.HasPrefix(err.Error(), "bad gateway addr") {
|
||||
t.Fatal("Expected bad gateway address error, got:", err)
|
||||
}
|
||||
|
||||
downloadSources = []string{"http://localhost"}
|
||||
f, err = GetMigrationFetcher(downloadSources, "", newIpfsFetcher)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if _, ok := f.(*HttpFetcher); !ok {
|
||||
t.Fatal("expected HttpFetcher")
|
||||
}
|
||||
|
||||
downloadSources = []string{"ipfs"}
|
||||
f, err = GetMigrationFetcher(downloadSources, "", newIpfsFetcher)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if _, ok := f.(*mockIpfsFetcher); !ok {
|
||||
t.Fatal("expected IpfsFetcher")
|
||||
}
|
||||
|
||||
downloadSources = []string{"http"}
|
||||
f, err = GetMigrationFetcher(downloadSources, "", newIpfsFetcher)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if _, ok := f.(*HttpFetcher); !ok {
|
||||
t.Fatal("expected HttpFetcher")
|
||||
}
|
||||
|
||||
downloadSources = []string{"IPFS", "HTTPS"}
|
||||
f, err = GetMigrationFetcher(downloadSources, "", newIpfsFetcher)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
mf, ok := f.(*MultiFetcher)
|
||||
if !ok {
|
||||
t.Fatal("expected MultiFetcher")
|
||||
}
|
||||
if mf.Len() != 2 {
|
||||
t.Fatal("expected 2 fetchers in MultiFetcher")
|
||||
}
|
||||
|
||||
downloadSources = []string{"ipfs", "https", "some.domain.io"}
|
||||
f, err = GetMigrationFetcher(downloadSources, "", newIpfsFetcher)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
mf, ok = f.(*MultiFetcher)
|
||||
if !ok {
|
||||
t.Fatal("expected MultiFetcher")
|
||||
}
|
||||
if mf.Len() != 3 {
|
||||
t.Fatal("expected 3 fetchers in MultiFetcher")
|
||||
}
|
||||
|
||||
downloadSources = nil
|
||||
_, err = GetMigrationFetcher(downloadSources, "", newIpfsFetcher)
|
||||
if err == nil {
|
||||
t.Fatal("expected error when no sources specified")
|
||||
}
|
||||
|
||||
downloadSources = []string{"", ""}
|
||||
_, err = GetMigrationFetcher(downloadSources, "", newIpfsFetcher)
|
||||
if err == nil {
|
||||
t.Fatal("expected error when empty string fetchers specified")
|
||||
}
|
||||
}
|
||||
|
||||
func makeConfig(t *testing.T, configData string) string {
|
||||
tmpDir := t.TempDir()
|
||||
|
||||
cfgFile, err := os.Create(filepath.Join(tmpDir, "config"))
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if _, err = cfgFile.Write([]byte(configData)); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if err = cfgFile.Close(); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
return tmpDir
|
||||
}
|
||||
|
||||
@ -33,14 +33,10 @@ func TestUnpackArchive(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestUnpackTgz(t *testing.T) {
|
||||
tmpDir, err := ioutil.TempDir("", "testunpacktgz")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
defer os.RemoveAll(tmpDir)
|
||||
tmpDir := t.TempDir()
|
||||
|
||||
badTarGzip := filepath.Join(tmpDir, "bad.tar.gz")
|
||||
err = ioutil.WriteFile(badTarGzip, []byte("bad-data\n"), 0644)
|
||||
err := ioutil.WriteFile(badTarGzip, []byte("bad-data\n"), 0644)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
@ -81,14 +77,10 @@ func TestUnpackTgz(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestUnpackZip(t *testing.T) {
|
||||
tmpDir, err := ioutil.TempDir("", "testunpackzip")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
defer os.RemoveAll(tmpDir)
|
||||
tmpDir := t.TempDir()
|
||||
|
||||
badZip := filepath.Join(tmpDir, "bad.zip")
|
||||
err = ioutil.WriteFile(badZip, []byte("bad-data\n"), 0644)
|
||||
err := ioutil.WriteFile(badZip, []byte("bad-data\n"), 0644)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
@ -29,7 +29,7 @@ parts:
|
||||
source-tag: master
|
||||
plugin: go
|
||||
# keep me up to date with the go version that go-ipfs expects to be built with.
|
||||
go-channel: 1.14/stable
|
||||
go-channel: 1.16/stable
|
||||
go-importpath: github.com/ipfs/go-ipfs
|
||||
build-packages:
|
||||
- build-essential
|
||||
|
||||
@ -98,6 +98,7 @@ test "$TEST_NO_PLUGIN" != 1 && test "$TEST_OS" = "LINUX" && test_set_prereq PLUG
|
||||
|
||||
# this may not be available, skip a few dependent tests
|
||||
type socat >/dev/null 2>&1 && test_set_prereq SOCAT
|
||||
type unzip >/dev/null 2>&1 && test_set_prereq UNZIP
|
||||
|
||||
|
||||
# Set a prereq as error messages are often different on Windows/Cygwin
|
||||
@ -280,6 +281,10 @@ test_launch_ipfs_daemon() {
|
||||
'
|
||||
}
|
||||
|
||||
test_launch_ipfs_daemon_without_network() {
|
||||
test_launch_ipfs_daemon --offline "$@"
|
||||
}
|
||||
|
||||
do_umount() {
|
||||
if [ "$(uname -s)" = "Linux" ]; then
|
||||
fusermount -u "$1"
|
||||
|
||||
15
test/sharness/t0011-completion.sh
Executable file
15
test/sharness/t0011-completion.sh
Executable file
@ -0,0 +1,15 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
test_description="Test generated bash completions"
|
||||
|
||||
. lib/test-lib.sh
|
||||
|
||||
test_expect_success "'ipfs commands completion bash' succeeds" '
|
||||
ipfs commands completion bash > completions.bash
|
||||
'
|
||||
|
||||
test_expect_success "generated completions defines '_ipfs'" '
|
||||
bash -c "source completions.bash && type -t _ipfs"
|
||||
'
|
||||
|
||||
test_done
|
||||
@ -24,7 +24,7 @@ test_expect_success "daemon no longer running" '
|
||||
done
|
||||
'
|
||||
|
||||
test_launch_ipfs_daemon --offline
|
||||
test_launch_ipfs_daemon_without_network
|
||||
|
||||
test_expect_success "shutdown succeeds" '
|
||||
ipfs shutdown
|
||||
|
||||
@ -842,7 +842,7 @@ test_add_named_pipe
|
||||
test_add_pwd_is_symlink
|
||||
|
||||
# Test daemon in offline mode
|
||||
test_launch_ipfs_daemon --offline
|
||||
test_launch_ipfs_daemon_without_network
|
||||
|
||||
test_add_cat_file
|
||||
|
||||
|
||||
@ -312,7 +312,7 @@ test_expect_success "'ipfs ls --resolve-type=true --size=false' fails" '
|
||||
test_must_fail ipfs ls --resolve-type=true --size=false $DIR
|
||||
'
|
||||
|
||||
test_launch_ipfs_daemon --offline
|
||||
test_launch_ipfs_daemon_without_network
|
||||
|
||||
test_expect_success "'ipfs ls --resolve-type=false --size=false' ok" '
|
||||
ipfs ls --resolve-type=false --size=false $DIR > /dev/null
|
||||
|
||||
40
test/sharness/t0055-dag-put-json-new-line.sh
Executable file
40
test/sharness/t0055-dag-put-json-new-line.sh
Executable file
@ -0,0 +1,40 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
test_description='Test retrieval of JSON put as CBOR does not end with new-line'
|
||||
|
||||
. lib/test-lib.sh
|
||||
|
||||
test_init_ipfs
|
||||
|
||||
test_expect_success 'create test JSON files' '
|
||||
WANT_JSON="{\"data\":1234}"
|
||||
WANT_HASH="bafyreidcqah6v3py3ujdc3ris22rjlfntaw7ajrus2f2477kpnizulaoea"
|
||||
printf "${WANT_JSON}\n" > with_newline.json &&
|
||||
printf "${WANT_JSON}" > without_newline.json
|
||||
'
|
||||
|
||||
test_expect_success 'puts as CBOR work' '
|
||||
GOT_HASH_WITHOUT_NEWLINE="$(cat without_newline.json | ipfs dag put -f cbor)"
|
||||
GOT_HASH_WITH_NEWLINE="$(cat with_newline.json | ipfs dag put -f cbor)"
|
||||
'
|
||||
|
||||
test_expect_success 'put hashes with or without newline are equal' '
|
||||
test "${GOT_HASH_WITH_NEWLINE}" = "${GOT_HASH_WITHOUT_NEWLINE}"
|
||||
'
|
||||
|
||||
test_expect_success 'hashes are of expected value' '
|
||||
test "${WANT_HASH}" = "${GOT_HASH_WITH_NEWLINE}"
|
||||
test "${WANT_HASH}" = "${GOT_HASH_WITHOUT_NEWLINE}"
|
||||
'
|
||||
|
||||
# Retrieval must not contain a new-line regardless of input JSON, because
|
||||
# objects are put using the stable CBOR format.
|
||||
# despite this, dag retrieval returns JSON with new-line.
|
||||
# Expect failure until fixed, as per:
|
||||
# - https://github.com/ipfs/go-ipfs/issues/3503#issuecomment-877295280
|
||||
test_expect_failure "retrieval by hash does not have new line" '
|
||||
ipfs dag get "${WANT_HASH}" > got.json
|
||||
test_cmp without_newline.json got.json
|
||||
'
|
||||
|
||||
test_done
|
||||
@ -25,7 +25,7 @@ test_expect_success SOCAT 'transport should be unencrypted ( needs socat )' '
|
||||
|
||||
test_kill_ipfs_daemon
|
||||
|
||||
test_launch_ipfs_daemon --offline
|
||||
test_launch_ipfs_daemon_without_network
|
||||
|
||||
gwyaddr=$GWAY_ADDR
|
||||
apiaddr=$API_ADDR
|
||||
|
||||
@ -9,7 +9,7 @@ test_description="Test ipfs repo operations"
|
||||
. lib/test-lib.sh
|
||||
|
||||
test_init_ipfs
|
||||
test_launch_ipfs_daemon --offline
|
||||
test_launch_ipfs_daemon_without_network
|
||||
|
||||
test_expect_success "'ipfs repo gc' succeeds" '
|
||||
ipfs repo gc >gc_out_actual
|
||||
@ -63,7 +63,7 @@ test_expect_success "ipfs repo gc fully reverse ipfs add (part 2)" '
|
||||
test_cmp expected_blocks actual_blocks
|
||||
'
|
||||
|
||||
test_launch_ipfs_daemon --offline
|
||||
test_launch_ipfs_daemon_without_network
|
||||
|
||||
test_expect_success "file no longer pinned" '
|
||||
ipfs pin ls --type=recursive --quiet >actual2 &&
|
||||
|
||||
@ -237,7 +237,7 @@ test_expect_success "some are no longer there" '
|
||||
test_must_fail ipfs ls "$HASH_DIR3"
|
||||
'
|
||||
|
||||
test_launch_ipfs_daemon --offline
|
||||
test_launch_ipfs_daemon_without_network
|
||||
test_expect_success "recursive pin fails without objects" '
|
||||
test_must_fail ipfs pin add -r "$HASH_DIR1" 2>err_expected8 &&
|
||||
grep "pin: merkledag: not found" err_expected8 ||
|
||||
|
||||
@ -180,7 +180,7 @@ test_pin_dag --raw-leaves
|
||||
|
||||
test_pin_progress
|
||||
|
||||
test_launch_ipfs_daemon --offline
|
||||
test_launch_ipfs_daemon_without_network
|
||||
|
||||
test_pins '' '' ''
|
||||
test_pins --progress '' ''
|
||||
|
||||
@ -157,7 +157,7 @@ test_init_ipfs
|
||||
test_gc_robust_part1
|
||||
test_gc_robust_part2
|
||||
|
||||
test_launch_ipfs_daemon --offline
|
||||
test_launch_ipfs_daemon_without_network
|
||||
|
||||
test_gc_robust_part1
|
||||
test_gc_robust_part2
|
||||
|
||||
@ -9,7 +9,7 @@ test_description="Test 'ipfs refs' command"
|
||||
. lib/test-lib.sh
|
||||
|
||||
test_init_ipfs
|
||||
test_launch_ipfs_daemon --offline
|
||||
test_launch_ipfs_daemon_without_network
|
||||
|
||||
# This file performs tests with the following directory
|
||||
# structure.
|
||||
|
||||
@ -228,7 +228,7 @@ test_name_with_self() {
|
||||
test_kill_ipfs_daemon
|
||||
|
||||
# Test daemon in offline mode
|
||||
test_launch_ipfs_daemon --offline
|
||||
test_launch_ipfs_daemon_without_network
|
||||
|
||||
test_expect_success "'ipfs name publish' fails offline mode" '
|
||||
test_expect_code 1 ipfs name publish "/ipfs/$HASH_WELCOME_DOCS"
|
||||
|
||||
@ -84,6 +84,13 @@ test_expect_success "GET IPFS nonexistent file returns code expected (404)" '
|
||||
test_curl_resp_http_code "http://127.0.0.1:$port/ipfs/$HASH2/pleaseDontAddMe" "HTTP/1.1 404 Not Found"
|
||||
'
|
||||
|
||||
# https://github.com/ipfs/go-ipfs/issues/8230
|
||||
test_expect_success "GET IPFS inlined zero-length data object returns ok code (200)" '
|
||||
curl -sD - "http://127.0.0.1:$port/ipfs/bafkqaaa" > empty_ok_response &&
|
||||
test_should_contain "HTTP/1.1 200 OK" empty_ok_response &&
|
||||
test_should_contain "Content-Length: 0" empty_ok_response
|
||||
'
|
||||
|
||||
test_expect_success "GET /ipfs/ipfs/{cid} returns redirect to the valid path" '
|
||||
curl -sD - "http://127.0.0.1:$port/ipfs/ipfs/bafkqaaa?query=to-remember" > response_with_double_ipfs_ns &&
|
||||
test_should_contain "<meta http-equiv=\"refresh\" content=\"10;url=/ipfs/bafkqaaa?query=to-remember\" />" response_with_double_ipfs_ns &&
|
||||
|
||||
@ -89,7 +89,7 @@ test_expect_success "ipfs init" '
|
||||
ipfs init --profile=test > /dev/null
|
||||
'
|
||||
|
||||
test_launch_ipfs_daemon --offline
|
||||
test_launch_ipfs_daemon_without_network
|
||||
|
||||
# CIDv0to1 is necessary because raw-leaves are enabled by default during
|
||||
# "ipfs add" with CIDv1 and disabled with CIDv0
|
||||
@ -141,7 +141,7 @@ test_expect_success "Publish test text file to IPNS using ED25519 keys" '
|
||||
test_expect_success 'start daemon with empty config for Gateway.PublicGateways' '
|
||||
test_kill_ipfs_daemon &&
|
||||
ipfs config --json Gateway.PublicGateways "{}" &&
|
||||
test_launch_ipfs_daemon --offline
|
||||
test_launch_ipfs_daemon_without_network
|
||||
'
|
||||
|
||||
## ============================================================================
|
||||
@ -337,7 +337,7 @@ ipfs config --json Gateway.PublicGateways '{
|
||||
}' || exit 1
|
||||
# restart daemon to apply config changes
|
||||
test_kill_ipfs_daemon
|
||||
test_launch_ipfs_daemon --offline
|
||||
test_launch_ipfs_daemon_without_network
|
||||
|
||||
|
||||
# example.com/ip(f|n)s/*
|
||||
@ -519,7 +519,7 @@ ipfs config --json Gateway.PublicGateways '{
|
||||
}' || exit 1
|
||||
# restart daemon to apply config changes
|
||||
test_kill_ipfs_daemon
|
||||
test_launch_ipfs_daemon --offline
|
||||
test_launch_ipfs_daemon_without_network
|
||||
|
||||
# not mounted at the root domain
|
||||
test_hostname_gateway_response_should_contain \
|
||||
@ -632,7 +632,7 @@ ipfs config --json Gateway.PublicGateways '{
|
||||
}' || exit 1
|
||||
# restart daemon to apply config changes
|
||||
test_kill_ipfs_daemon
|
||||
test_launch_ipfs_daemon --offline
|
||||
test_launch_ipfs_daemon_without_network
|
||||
|
||||
# refuse requests to Paths that were not explicitly whitelisted for the hostname
|
||||
test_hostname_gateway_response_should_contain \
|
||||
@ -661,7 +661,7 @@ ipfs config --json Gateway.PublicGateways '{
|
||||
|
||||
# restart daemon to apply config changes
|
||||
test_kill_ipfs_daemon
|
||||
test_launch_ipfs_daemon --offline
|
||||
test_launch_ipfs_daemon_without_network
|
||||
|
||||
# example.com/ip(f|n)s/* smoke-tests
|
||||
# =============================================================================
|
||||
@ -834,7 +834,7 @@ ipfs config --json Gateway.PublicGateways '{
|
||||
}' || exit 1
|
||||
# restart daemon to apply config changes
|
||||
test_kill_ipfs_daemon
|
||||
test_launch_ipfs_daemon --offline
|
||||
test_launch_ipfs_daemon_without_network
|
||||
|
||||
test_expect_success "request for http://fake.domain.com/ipfs/{CID} doesn't match the example.com gateway" "
|
||||
curl -H \"Host: fake.domain.com\" -sD - \"http://127.0.0.1:$GWAY_PORT/ipfs/$CIDv1\" > response &&
|
||||
@ -876,7 +876,7 @@ ipfs config --json Gateway.PublicGateways '{
|
||||
}' || exit 1
|
||||
# restart daemon to apply config changes
|
||||
test_kill_ipfs_daemon
|
||||
test_launch_ipfs_daemon --offline
|
||||
test_launch_ipfs_daemon_without_network
|
||||
|
||||
# *.example1.com
|
||||
|
||||
@ -945,7 +945,7 @@ ipfs config --json Gateway.PublicGateways '{
|
||||
|
||||
# restart daemon to apply config changes
|
||||
test_kill_ipfs_daemon
|
||||
test_launch_ipfs_daemon --offline
|
||||
test_launch_ipfs_daemon_without_network
|
||||
|
||||
test_localhost_gateway_response_should_contain \
|
||||
"request for localhost/ipfs/{CID} stays on path when subdomain gw is explicitly disabled" \
|
||||
|
||||
@ -16,7 +16,7 @@ test_expect_success "ipfs init" '
|
||||
ipfs init --profile=test > /dev/null
|
||||
'
|
||||
|
||||
test_launch_ipfs_daemon --offline
|
||||
test_launch_ipfs_daemon_without_network
|
||||
|
||||
test_expect_success "Add the test directory" '
|
||||
mkdir -p rootDir/ipfs &&
|
||||
|
||||
64
test/sharness/t0152-profile.sh
Executable file
64
test/sharness/t0152-profile.sh
Executable file
@ -0,0 +1,64 @@
|
||||
#!/usr/bin/env bash
|
||||
#
|
||||
# Copyright (c) 2016 Jeromy Johnson
|
||||
# MIT Licensed; see the LICENSE file in this repository.
|
||||
#
|
||||
|
||||
test_description="Test profile collection"
|
||||
|
||||
. lib/test-lib.sh
|
||||
|
||||
test_init_ipfs
|
||||
|
||||
test_expect_success "profiling requires a running daemon" '
|
||||
test_must_fail ipfs diag profile
|
||||
'
|
||||
|
||||
test_launch_ipfs_daemon
|
||||
|
||||
test_expect_success "test profiling (without CPU)" '
|
||||
ipfs diag profile --cpu-profile-time=0 > cmd_out
|
||||
'
|
||||
|
||||
test_expect_success "filename shows up in output" '
|
||||
grep -q "ipfs-profile" cmd_out > /dev/null
|
||||
'
|
||||
|
||||
test_expect_success "profile file created" '
|
||||
test -e "$(sed -n -e "s/.*\(ipfs-profile.*\.zip\)/\1/p" cmd_out)"
|
||||
'
|
||||
|
||||
test_expect_success "test profiling with -o" '
|
||||
ipfs diag profile --cpu-profile-time=1s -o test-profile.zip
|
||||
'
|
||||
|
||||
test_expect_success "test that test-profile.zip exists" '
|
||||
test -e test-profile.zip
|
||||
'
|
||||
test_kill_ipfs_daemon
|
||||
|
||||
if ! test_have_prereq UNZIP; then
|
||||
test_done
|
||||
fi
|
||||
|
||||
test_expect_success "unpack profiles" '
|
||||
unzip -d profiles test-profile.zip
|
||||
'
|
||||
|
||||
test_expect_success "cpu profile is valid" '
|
||||
go tool pprof -top profiles/ipfs "profiles/cpu.pprof" | grep -q "Type: cpu"
|
||||
'
|
||||
|
||||
test_expect_success "heap profile is valid" '
|
||||
go tool pprof -top profiles/ipfs "profiles/heap.pprof" | grep -q "Type: inuse_space"
|
||||
'
|
||||
|
||||
test_expect_success "goroutines profile is valid" '
|
||||
go tool pprof -top profiles/ipfs "profiles/goroutines.pprof" | grep -q "Type: goroutine"
|
||||
'
|
||||
|
||||
test_expect_success "goroutines stacktrace is valid" '
|
||||
grep -q "goroutine" "profiles/goroutines.stacks"
|
||||
'
|
||||
|
||||
test_done
|
||||
@ -498,8 +498,12 @@ test_files_api() {
|
||||
echo "testing" | ipfs files write $ARGS $RAW_LEAVES -f=false -e /cats/walrus
|
||||
'
|
||||
|
||||
# Skip this test if the commands are not being run through the daemon
|
||||
# ($WITH_DAEMON not set) as standalone commands will *always* flush
|
||||
# after being done and the 'no-flush' call from the previous test will
|
||||
# not be enforced.
|
||||
test_expect_success "root hash not bubbled up yet $EXTRA" '
|
||||
test -z "$ONLINE" ||
|
||||
test -z "$WITH_DAEMON" ||
|
||||
(ipfs refs local > refsout &&
|
||||
test_expect_code 1 grep $ROOT_HASH refsout)
|
||||
'
|
||||
@ -693,8 +697,10 @@ test_files_api() {
|
||||
'
|
||||
}
|
||||
|
||||
# test offline and online
|
||||
|
||||
# test with and without the daemon (EXTRA="with-daemon" and EXTRA="no-daemon"
|
||||
# respectively).
|
||||
# FIXME: Check if we are correctly using the "no-daemon" flag in these test
|
||||
# combinations.
|
||||
tests_for_files_api() {
|
||||
local EXTRA
|
||||
EXTRA=$1
|
||||
@ -712,7 +718,7 @@ tests_for_files_api() {
|
||||
create_files --raw-leaves
|
||||
'
|
||||
|
||||
if [ "$EXTRA" = "offline" ]; then
|
||||
if [ "$EXTRA" = "with-daemon" ]; then
|
||||
ROOT_HASH=QmTpKiKcAj4sbeesN6vrs5w3QeVmd4QmGpxRL81hHut4dZ
|
||||
CATS_HASH=QmPhPkmtUGGi8ySPHoPu1qbfryLJKKq1GYxpgLyyCruvGe
|
||||
test_files_api "($EXTRA, partial raw-leaves)"
|
||||
@ -728,7 +734,7 @@ tests_for_files_api() {
|
||||
CATS_HASH=bafybeig4cpvfu2qwwo3u4ffazhqdhyynfhnxqkzvbhrdbamauthf5mfpuq
|
||||
FILE_HASH=bafybeibkrazpbejqh3qun7xfnsl7yofl74o4jwhxebpmtrcpavebokuqtm
|
||||
TRUNC_HASH=bafybeigwhb3q36yrm37jv5fo2ap6r6eyohckqrxmlejrenex4xlnuxiy3e
|
||||
if [ "$EXTRA" = "offline" ]; then
|
||||
if [ "$EXTRA" = "with-daemon" ]; then
|
||||
test_files_api "($EXTRA, cidv1)" --cid-version=1
|
||||
fi
|
||||
|
||||
@ -742,7 +748,7 @@ tests_for_files_api() {
|
||||
ROOT_HASH=bafybeifxnoetaa2jetwmxubv3gqiyaknnujwkkkhdeua63kulm63dcr5wu
|
||||
test_files_api "($EXTRA, cidv1 root)"
|
||||
|
||||
if [ "$EXTRA" = "offline" ]; then
|
||||
if [ "$EXTRA" = "with-daemon" ]; then
|
||||
test_expect_success "can update root hash to blake2b-256" '
|
||||
ipfs files chcid --hash=blake2b-256 / &&
|
||||
echo bafykbzacebugfutjir6qie7apo5shpry32ruwfi762uytd5g3u2gk7tpscndq > hash_expect &&
|
||||
@ -764,21 +770,23 @@ tests_for_files_api() {
|
||||
'
|
||||
}
|
||||
|
||||
tests_for_files_api "online"
|
||||
tests_for_files_api "no-daemon"
|
||||
|
||||
test_launch_ipfs_daemon --offline
|
||||
test_launch_ipfs_daemon_without_network
|
||||
|
||||
ONLINE=1 # set online flag so tests can easily tell
|
||||
WITH_DAEMON=1
|
||||
# FIXME: Used only on a specific test inside `test_files_api` but we should instead
|
||||
# propagate the `"with-daemon"` argument in its caller `tests_for_files_api`.
|
||||
|
||||
tests_for_files_api "offline"
|
||||
tests_for_files_api "with-daemon"
|
||||
|
||||
test_kill_ipfs_daemon --offline
|
||||
test_kill_ipfs_daemon
|
||||
|
||||
test_expect_success "enable sharding in config" '
|
||||
ipfs config --json Experimental.ShardingEnabled true
|
||||
'
|
||||
|
||||
test_launch_ipfs_daemon --offline
|
||||
test_launch_ipfs_daemon_without_network
|
||||
|
||||
SHARD_HASH=QmPkwLJTYZRGPJ8Lazr9qPdrLmswPtUjaDbEpmR9jEh1se
|
||||
test_sharding "(cidv0)"
|
||||
|
||||
@ -187,7 +187,7 @@ test_init
|
||||
|
||||
# must be in offline mode so tests that retrieve non-existent blocks
|
||||
# doesn't hang
|
||||
test_launch_ipfs_daemon --offline
|
||||
test_launch_ipfs_daemon_without_network
|
||||
|
||||
test_filestore_adds
|
||||
|
||||
@ -251,7 +251,7 @@ test_init
|
||||
|
||||
# must be in offline mode so tests that retrieve non-existent blocks
|
||||
# doesn't hang
|
||||
test_launch_ipfs_daemon --offline
|
||||
test_launch_ipfs_daemon_without_network
|
||||
|
||||
test_filestore_adds
|
||||
|
||||
|
||||
@ -26,7 +26,7 @@ test_urlstore() {
|
||||
HASH3a=$(ipfs add -q --trickle --raw-leaves=false file3)
|
||||
'
|
||||
|
||||
test_launch_ipfs_daemon --offline
|
||||
test_launch_ipfs_daemon_without_network
|
||||
|
||||
test_expect_success "make sure files can be retrieved via the gateway" '
|
||||
curl http://127.0.0.1:$GWAY_PORT/ipfs/$HASH1a -o file1.actual &&
|
||||
@ -48,7 +48,7 @@ test_urlstore() {
|
||||
ipfs config --json Experimental.UrlstoreEnabled true
|
||||
'
|
||||
|
||||
test_launch_ipfs_daemon --offline
|
||||
test_launch_ipfs_daemon_without_network
|
||||
|
||||
test_expect_success "add files using gateway address via url store using $ADD_CMD" '
|
||||
HASH1=$(ipfs $ADD_CMD --pin=false http://127.0.0.1:$GWAY_PORT/ipfs/$HASH1a) &&
|
||||
|
||||
@ -59,7 +59,7 @@ test_expect_success "ipfs daemon --offline --mount fails - #2995" '
|
||||
test_fsh cat daemon_err
|
||||
'
|
||||
|
||||
test_launch_ipfs_daemon --offline
|
||||
test_launch_ipfs_daemon_without_network
|
||||
|
||||
test_expect_success "'ipfs name resolve' succeeds after ipfs id when daemon offline" '
|
||||
PEERID=`ipfs key list --ipns-base=base36 -l | grep self | cut -d " " -f1` &&
|
||||
|
||||
@ -4,9 +4,9 @@ test_description="Test ipfs remote pinning operations"
|
||||
|
||||
. lib/test-lib.sh
|
||||
|
||||
if [ -z ${DOCKER_HOST+x} ]; then
|
||||
if [ -z ${TEST_DOCKER_HOST+x} ]; then
|
||||
# TODO: set up instead of skipping?
|
||||
skip_all='Skipping pinning service integration tests: missing DOCKER_HOST, remote pinning service not available'
|
||||
skip_all='Skipping pinning service integration tests: missing TEST_DOCKER_HOST, remote pinning service not available'
|
||||
test_done
|
||||
fi
|
||||
|
||||
@ -15,7 +15,7 @@ test_init_ipfs
|
||||
test_launch_ipfs_daemon
|
||||
|
||||
# create user on pinning service
|
||||
TEST_PIN_SVC="http://${DOCKER_HOST}:5000/api/v1"
|
||||
TEST_PIN_SVC="http://${TEST_DOCKER_HOST}:5000/api/v1"
|
||||
TEST_PIN_SVC_KEY=$(curl -s -X POST "$TEST_PIN_SVC/users" -d email="go-ipfs-sharness@ipfs.example.com" | jq --raw-output .access_token)
|
||||
|
||||
# pin remote service add|ls|rm
|
||||
|
||||
Loading…
Reference in New Issue
Block a user