mirror of
https://github.com/ipfs/kubo.git
synced 2026-02-21 10:27:46 +08:00
Merge branch 'master' into feat/add-size-progress-tracker
This commit is contained in:
commit
fa704601b4
26
.github/legacy/Dockerfile.goipfs-stub
vendored
26
.github/legacy/Dockerfile.goipfs-stub
vendored
@ -1,26 +0,0 @@
|
||||
# syntax=docker/dockerfile:1
|
||||
# Stub Dockerfile for the deprecated 'ipfs/go-ipfs' image name.
|
||||
# This image redirects users to the new 'ipfs/kubo' name.
|
||||
FROM busybox:stable-glibc
|
||||
|
||||
# Copy stub entrypoint that displays deprecation message
|
||||
COPY .github/legacy/goipfs_stub.sh /usr/local/bin/ipfs
|
||||
|
||||
# Make it executable
|
||||
RUN chmod +x /usr/local/bin/ipfs
|
||||
|
||||
# Use the same ports as the real image for compatibility
|
||||
EXPOSE 4001 4001/udp 5001 8080 8081
|
||||
|
||||
# Create ipfs user for consistency
|
||||
ENV IPFS_PATH=/data/ipfs
|
||||
RUN mkdir -p $IPFS_PATH \
|
||||
&& adduser -D -h $IPFS_PATH -u 1000 -G users ipfs \
|
||||
&& chown ipfs:users $IPFS_PATH
|
||||
|
||||
# Run as ipfs user
|
||||
USER ipfs
|
||||
|
||||
# The stub script will run and exit with an error message
|
||||
ENTRYPOINT ["/usr/local/bin/ipfs"]
|
||||
CMD ["daemon"]
|
||||
20
.github/legacy/goipfs_stub.sh
vendored
20
.github/legacy/goipfs_stub.sh
vendored
@ -1,20 +0,0 @@
|
||||
#!/bin/sh
|
||||
# Stub script for the deprecated 'ipfs/go-ipfs' Docker image.
|
||||
# This informs users to switch to 'ipfs/kubo'.
|
||||
|
||||
cat >&2 <<'EOF'
|
||||
ERROR: The name 'go-ipfs' is no longer used.
|
||||
|
||||
Please update your Docker scripts to use 'ipfs/kubo' instead of 'ipfs/go-ipfs'.
|
||||
|
||||
For example:
|
||||
docker pull ipfs/kubo:release
|
||||
|
||||
More information:
|
||||
- https://github.com/ipfs/kubo#docker
|
||||
- https://hub.docker.com/r/ipfs/kubo
|
||||
- https://docs.ipfs.tech/install/run-ipfs-inside-docker/
|
||||
|
||||
EOF
|
||||
|
||||
exit 1
|
||||
49
.github/workflows/docker-image.yml
vendored
49
.github/workflows/docker-image.yml
vendored
@ -141,52 +141,3 @@ jobs:
|
||||
cache-to: |
|
||||
type=gha,mode=max
|
||||
type=registry,ref=${{ env.IMAGE_NAME }}:buildcache,mode=max
|
||||
|
||||
# Build and push stub image to the legacy ipfs/go-ipfs name
|
||||
# This redirects users to use ipfs/kubo instead
|
||||
legacy-name:
|
||||
needs: docker-hub
|
||||
if: github.repository == 'ipfs/kubo' || github.event_name == 'workflow_dispatch'
|
||||
name: Push stub to legacy ipfs/go-ipfs name
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 5
|
||||
env:
|
||||
LEGACY_IMAGE_NAME: ipfs/go-ipfs
|
||||
steps:
|
||||
- name: Check out the repo
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v3
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
- name: Log in to Docker Hub
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
username: ${{ vars.DOCKER_USERNAME }}
|
||||
password: ${{ secrets.DOCKER_PASSWORD }}
|
||||
|
||||
- name: Convert tags to legacy image name
|
||||
id: legacy_tags
|
||||
run: |
|
||||
TAGS="${{ github.event.inputs.tags || needs.docker-hub.outputs.tags }}"
|
||||
if ! echo "$TAGS" | grep -q "kubo"; then
|
||||
echo "ERROR: Tags must contain kubo image name"
|
||||
exit 1
|
||||
fi
|
||||
echo "value<<EOF" >> $GITHUB_OUTPUT
|
||||
echo "$TAGS" | sed "s|ipfs/kubo|$LEGACY_IMAGE_NAME|g" >> $GITHUB_OUTPUT
|
||||
echo "EOF" >> $GITHUB_OUTPUT
|
||||
shell: bash
|
||||
|
||||
- if: github.event_name != 'workflow_dispatch' || github.event.inputs.push == 'true'
|
||||
name: Build and push legacy stub image
|
||||
uses: docker/build-push-action@v6
|
||||
with:
|
||||
platforms: linux/amd64,linux/arm/v7,linux/arm64/v8
|
||||
context: .
|
||||
push: true
|
||||
file: ./.github/legacy/Dockerfile.goipfs-stub
|
||||
tags: ${{ steps.legacy_tags.outputs.value }}
|
||||
|
||||
@ -50,6 +50,6 @@ else
|
||||
unset IPFS_SWARM_KEY_FILE
|
||||
fi
|
||||
|
||||
find /container-init.d -maxdepth 1 -type f -iname '*.sh' -print0 | sort -z | xargs -n 1 -0 -r container_init_run
|
||||
find /container-init.d -maxdepth 1 \( -type f -o -type l \) -iname '*.sh' -print0 | sort -z | xargs -n 1 -0 -r container_init_run
|
||||
|
||||
exec ipfs "$@"
|
||||
|
||||
@ -41,7 +41,7 @@ if [[ $GIT_TAG =~ ^v[0-9]+\.[0-9]+\.[0-9]+-rc ]]; then
|
||||
elif [[ $GIT_TAG =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
|
||||
echoImageName "$GIT_TAG"
|
||||
echoImageName "latest"
|
||||
echoImageName "release" # see: https://github.com/ipfs/go-ipfs/issues/3999#issuecomment-742228981
|
||||
echoImageName "release" # see: https://github.com/ipfs/kubo/issues/3999#issuecomment-742228981
|
||||
|
||||
elif [[ $GIT_BRANCH =~ ^bifrost-.* ]]; then
|
||||
# sanitize the branch name since docker tags have stricter char limits than git branch names
|
||||
|
||||
532
bin/mkreleaselog
532
bin/mkreleaselog
@ -1,10 +1,19 @@
|
||||
#!/bin/zsh
|
||||
#!/bin/bash
|
||||
#
|
||||
# Invocation: mkreleaselog [FIRST_REF [LAST_REF]]
|
||||
#
|
||||
# Generates release notes with contributor statistics, deduplicating by GitHub handle.
|
||||
# GitHub handles are resolved from:
|
||||
# 1. GitHub noreply emails (user@users.noreply.github.com)
|
||||
# 2. Merge commit messages (Merge pull request #N from user/branch)
|
||||
# 3. GitHub API via gh CLI (for squash merges)
|
||||
#
|
||||
# Results are cached in ~/.cache/mkreleaselog/github-handles.json
|
||||
|
||||
set -euo pipefail
|
||||
export GO111MODULE=on
|
||||
export GOPATH="$(go env GOPATH)"
|
||||
GOPATH="$(go env GOPATH)"
|
||||
export GOPATH
|
||||
|
||||
# List of PCRE regular expressions to match "included" modules.
|
||||
INCLUDE_MODULES=(
|
||||
@ -15,10 +24,15 @@ INCLUDE_MODULES=(
|
||||
"^github.com/multiformats/"
|
||||
"^github.com/filecoin-project/"
|
||||
"^github.com/ipfs-shipyard/"
|
||||
"^github.com/ipshipyard/"
|
||||
"^github.com/probe-lab/"
|
||||
|
||||
# Authors of personal modules used by go-ipfs that should be mentioned in the
|
||||
# release notes.
|
||||
"^github.com/whyrusleeping/"
|
||||
"^github.com/gammazero/"
|
||||
"^github.com/Jorropo/"
|
||||
"^github.com/guillaumemichel/"
|
||||
"^github.com/Kubuxu/"
|
||||
"^github.com/jbenet/"
|
||||
"^github.com/Stebalien/"
|
||||
@ -48,15 +62,348 @@ IGNORE_FILES=(
|
||||
)
|
||||
|
||||
##########################################################################################
|
||||
# GitHub Handle Resolution Infrastructure
|
||||
##########################################################################################
|
||||
|
||||
# Cache location following XDG spec
|
||||
GITHUB_CACHE_DIR="${XDG_CACHE_HOME:-$HOME/.cache}/mkreleaselog"
|
||||
GITHUB_CACHE_FILE="$GITHUB_CACHE_DIR/github-handles.json"
|
||||
|
||||
# Timeout for gh CLI commands (seconds)
|
||||
GH_TIMEOUT=10
|
||||
|
||||
# Associative array for email -> github handle mapping (runtime cache)
|
||||
declare -A EMAIL_TO_GITHUB
|
||||
|
||||
# Check if gh CLI is available and authenticated
|
||||
gh_available() {
|
||||
command -v gh >/dev/null 2>&1 && gh auth status >/dev/null 2>&1
|
||||
}
|
||||
|
||||
# Load cached email -> github handle mappings from disk
|
||||
load_github_cache() {
|
||||
EMAIL_TO_GITHUB=()
|
||||
|
||||
if [[ ! -f "$GITHUB_CACHE_FILE" ]]; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
# Validate JSON before loading
|
||||
if ! jq -e '.' "$GITHUB_CACHE_FILE" >/dev/null 2>&1; then
|
||||
msg "Warning: corrupted cache file, ignoring"
|
||||
return 0
|
||||
fi
|
||||
|
||||
local email handle
|
||||
while IFS=$'\t' read -r email handle; do
|
||||
# Validate handle format (alphanumeric, hyphens, max 39 chars)
|
||||
if [[ -n "$email" && -n "$handle" && "$handle" =~ ^[a-zA-Z0-9]([a-zA-Z0-9-]{0,37}[a-zA-Z0-9])?$ ]]; then
|
||||
EMAIL_TO_GITHUB["$email"]="$handle"
|
||||
fi
|
||||
done < <(jq -r 'to_entries[] | "\(.key)\t\(.value)"' "$GITHUB_CACHE_FILE" 2>/dev/null)
|
||||
|
||||
msg "Loaded ${#EMAIL_TO_GITHUB[@]} cached GitHub handle mappings"
|
||||
}
|
||||
|
||||
# Save email -> github handle mappings to disk (atomic write)
|
||||
save_github_cache() {
|
||||
if [[ ${#EMAIL_TO_GITHUB[@]} -eq 0 ]]; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
mkdir -p "$GITHUB_CACHE_DIR"
|
||||
|
||||
local tmp_file
|
||||
tmp_file="$(mktemp "$GITHUB_CACHE_DIR/cache.XXXXXX")" || return 1
|
||||
|
||||
# Build JSON from associative array
|
||||
{
|
||||
echo "{"
|
||||
local first=true
|
||||
local key
|
||||
for key in "${!EMAIL_TO_GITHUB[@]}"; do
|
||||
if [[ "$first" == "true" ]]; then
|
||||
first=false
|
||||
else
|
||||
echo ","
|
||||
fi
|
||||
# Escape special characters in email for JSON
|
||||
printf ' %s: %s' "$(jq -n --arg e "$key" '$e')" "$(jq -n --arg h "${EMAIL_TO_GITHUB[$key]}" '$h')"
|
||||
done
|
||||
echo
|
||||
echo "}"
|
||||
} > "$tmp_file"
|
||||
|
||||
# Validate before replacing
|
||||
if jq -e '.' "$tmp_file" >/dev/null 2>&1; then
|
||||
mv "$tmp_file" "$GITHUB_CACHE_FILE"
|
||||
msg "Saved ${#EMAIL_TO_GITHUB[@]} GitHub handle mappings to cache"
|
||||
else
|
||||
rm -f "$tmp_file"
|
||||
msg "Warning: failed to save cache (invalid JSON)"
|
||||
fi
|
||||
}
|
||||
|
||||
# Extract GitHub handle from email if it's a GitHub noreply address
|
||||
# Handles: user@users.noreply.github.com and 12345678+user@users.noreply.github.com
|
||||
extract_handle_from_noreply() {
|
||||
local email="$1"
|
||||
|
||||
if [[ "$email" =~ ^([0-9]+\+)?([a-zA-Z0-9]([a-zA-Z0-9-]{0,37}[a-zA-Z0-9])?)@users\.noreply\.github\.com$ ]]; then
|
||||
echo "${BASH_REMATCH[2]}"
|
||||
return 0
|
||||
fi
|
||||
return 1
|
||||
}
|
||||
|
||||
# Extract GitHub handle from merge commit subject
|
||||
# Handles: "Merge pull request #123 from username/branch"
|
||||
extract_handle_from_merge_commit() {
|
||||
local subject="$1"
|
||||
|
||||
if [[ "$subject" =~ ^Merge\ pull\ request\ \#[0-9]+\ from\ ([a-zA-Z0-9]([a-zA-Z0-9-]{0,37}[a-zA-Z0-9])?)/.*$ ]]; then
|
||||
echo "${BASH_REMATCH[1]}"
|
||||
return 0
|
||||
fi
|
||||
return 1
|
||||
}
|
||||
|
||||
# Extract PR number from commit subject
|
||||
# Handles: "Subject (#123)" and "Merge pull request #123 from"
|
||||
extract_pr_number() {
|
||||
local subject="$1"
|
||||
|
||||
if [[ "$subject" =~ \(#([0-9]+)\)$ ]]; then
|
||||
echo "${BASH_REMATCH[1]}"
|
||||
return 0
|
||||
elif [[ "$subject" =~ ^Merge\ pull\ request\ \#([0-9]+)\ from ]]; then
|
||||
echo "${BASH_REMATCH[1]}"
|
||||
return 0
|
||||
fi
|
||||
return 1
|
||||
}
|
||||
|
||||
# Query GitHub API for PR author (with timeout and error handling)
|
||||
query_pr_author() {
|
||||
local gh_repo="$1" # e.g., "ipfs/kubo"
|
||||
local pr_num="$2"
|
||||
|
||||
if ! gh_available; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
local handle
|
||||
handle="$(timeout "$GH_TIMEOUT" gh pr view "$pr_num" --repo "$gh_repo" --json author -q '.author.login' 2>/dev/null)" || return 1
|
||||
|
||||
# Validate handle format
|
||||
if [[ -n "$handle" && "$handle" =~ ^[a-zA-Z0-9]([a-zA-Z0-9-]{0,37}[a-zA-Z0-9])?$ ]]; then
|
||||
echo "$handle"
|
||||
return 0
|
||||
fi
|
||||
return 1
|
||||
}
|
||||
|
||||
# Query GitHub API for commit author (fallback when no PR available)
|
||||
query_commit_author() {
|
||||
local gh_repo="$1" # e.g., "ipfs/kubo"
|
||||
local commit_sha="$2"
|
||||
|
||||
if ! gh_available; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
local handle
|
||||
handle="$(timeout "$GH_TIMEOUT" gh api "/repos/$gh_repo/commits/$commit_sha" --jq '.author.login // empty' 2>/dev/null)" || return 1
|
||||
|
||||
# Validate handle format
|
||||
if [[ -n "$handle" && "$handle" =~ ^[a-zA-Z0-9]([a-zA-Z0-9-]{0,37}[a-zA-Z0-9])?$ ]]; then
|
||||
echo "$handle"
|
||||
return 0
|
||||
fi
|
||||
return 1
|
||||
}
|
||||
|
||||
# Resolve email to GitHub handle using all available methods
|
||||
# Args: email, commit_hash (optional), repo_dir (optional), gh_repo (optional)
|
||||
resolve_github_handle() {
|
||||
local email="$1"
|
||||
local commit="${2:-}"
|
||||
local repo_dir="${3:-}"
|
||||
local gh_repo="${4:-}"
|
||||
|
||||
# Skip empty emails
|
||||
[[ -z "$email" ]] && return 1
|
||||
|
||||
# Check runtime cache first
|
||||
if [[ -n "${EMAIL_TO_GITHUB[$email]:-}" ]]; then
|
||||
echo "${EMAIL_TO_GITHUB[$email]}"
|
||||
return 0
|
||||
fi
|
||||
|
||||
local handle=""
|
||||
|
||||
# Method 1: Extract from noreply email
|
||||
if handle="$(extract_handle_from_noreply "$email")"; then
|
||||
EMAIL_TO_GITHUB["$email"]="$handle"
|
||||
echo "$handle"
|
||||
return 0
|
||||
fi
|
||||
|
||||
# Method 2: Look at commit message for merge commit pattern
|
||||
if [[ -n "$commit" && -n "$repo_dir" ]]; then
|
||||
local subject
|
||||
subject="$(git -C "$repo_dir" log -1 --format='%s' "$commit" 2>/dev/null)" || true
|
||||
|
||||
if [[ -n "$subject" ]]; then
|
||||
if handle="$(extract_handle_from_merge_commit "$subject")"; then
|
||||
EMAIL_TO_GITHUB["$email"]="$handle"
|
||||
echo "$handle"
|
||||
return 0
|
||||
fi
|
||||
|
||||
# Method 3: Query GitHub API for PR author
|
||||
if [[ -n "$gh_repo" ]]; then
|
||||
local pr_num
|
||||
if pr_num="$(extract_pr_number "$subject")"; then
|
||||
if handle="$(query_pr_author "$gh_repo" "$pr_num")"; then
|
||||
EMAIL_TO_GITHUB["$email"]="$handle"
|
||||
echo "$handle"
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
return 1
|
||||
}
|
||||
|
||||
# Build GitHub handle mappings for all commits in a range
|
||||
# This does a single pass to collect PR numbers, then batch queries them
|
||||
build_github_mappings() {
|
||||
local module="$1"
|
||||
local start="$2"
|
||||
local end="${3:-HEAD}"
|
||||
local repo
|
||||
repo="$(strip_version "$module")"
|
||||
local dir
|
||||
local gh_repo=""
|
||||
|
||||
if [[ "$module" == "github.com/ipfs/kubo" ]]; then
|
||||
dir="$ROOT_DIR"
|
||||
else
|
||||
dir="$GOPATH/src/$repo"
|
||||
fi
|
||||
|
||||
# Extract gh_repo for API calls (e.g., "ipfs/kubo" from "github.com/ipfs/kubo")
|
||||
if [[ "$repo" =~ ^github\.com/(.+)$ ]]; then
|
||||
gh_repo="${BASH_REMATCH[1]}"
|
||||
fi
|
||||
|
||||
msg "Building GitHub handle mappings for $module..."
|
||||
|
||||
# Collect all unique emails and their commit context
|
||||
declare -A email_commits=()
|
||||
local hash email subject
|
||||
|
||||
while IFS=$'\t' read -r hash email subject; do
|
||||
[[ -z "$email" ]] && continue
|
||||
|
||||
# Skip if already resolved
|
||||
[[ -n "${EMAIL_TO_GITHUB[$email]:-}" ]] && continue
|
||||
|
||||
# Try to resolve without API first
|
||||
local handle=""
|
||||
|
||||
# Method 1: noreply email
|
||||
if handle="$(extract_handle_from_noreply "$email")"; then
|
||||
EMAIL_TO_GITHUB["$email"]="$handle"
|
||||
continue
|
||||
fi
|
||||
|
||||
# Method 2: merge commit message
|
||||
if handle="$(extract_handle_from_merge_commit "$subject")"; then
|
||||
EMAIL_TO_GITHUB["$email"]="$handle"
|
||||
continue
|
||||
fi
|
||||
|
||||
# Store for potential API lookup
|
||||
if [[ -z "${email_commits[$email]:-}" ]]; then
|
||||
email_commits["$email"]="$hash"
|
||||
fi
|
||||
done < <(git -C "$dir" log --format='tformat:%H%x09%aE%x09%s' --no-merges "$start..$end" 2>/dev/null)
|
||||
|
||||
# API batch lookup for remaining emails (if gh is available)
|
||||
if gh_available && [[ -n "$gh_repo" && ${#email_commits[@]} -gt 0 ]]; then
|
||||
msg "Querying GitHub API for ${#email_commits[@]} unknown contributors..."
|
||||
local key
|
||||
for key in "${!email_commits[@]}"; do
|
||||
# Skip if already resolved
|
||||
[[ -n "${EMAIL_TO_GITHUB[$key]:-}" ]] && continue
|
||||
|
||||
local commit_hash="${email_commits[$key]}"
|
||||
local subj handle
|
||||
subj="$(git -C "$dir" log -1 --format='%s' "$commit_hash" 2>/dev/null)" || true
|
||||
|
||||
# Try PR author lookup first (cheaper API call)
|
||||
local pr_num
|
||||
if pr_num="$(extract_pr_number "$subj")"; then
|
||||
if handle="$(query_pr_author "$gh_repo" "$pr_num")"; then
|
||||
EMAIL_TO_GITHUB["$key"]="$handle"
|
||||
continue
|
||||
fi
|
||||
fi
|
||||
|
||||
# Fallback: commit author API (works for any commit)
|
||||
if handle="$(query_commit_author "$gh_repo" "$commit_hash")"; then
|
||||
EMAIL_TO_GITHUB["$key"]="$handle"
|
||||
fi
|
||||
done
|
||||
fi
|
||||
}
|
||||
|
||||
##########################################################################################
|
||||
# Original infrastructure with modifications
|
||||
##########################################################################################
|
||||
|
||||
build_include_regex() {
|
||||
local result=""
|
||||
local mod
|
||||
for mod in "${INCLUDE_MODULES[@]}"; do
|
||||
if [[ -n "$result" ]]; then
|
||||
result="$result|$mod"
|
||||
else
|
||||
result="$mod"
|
||||
fi
|
||||
done
|
||||
echo "($result)"
|
||||
}
|
||||
|
||||
build_exclude_regex() {
|
||||
local result=""
|
||||
local mod
|
||||
for mod in "${EXCLUDE_MODULES[@]}"; do
|
||||
if [[ -n "$result" ]]; then
|
||||
result="$result|$mod"
|
||||
else
|
||||
result="$mod"
|
||||
fi
|
||||
done
|
||||
if [[ -n "$result" ]]; then
|
||||
echo "($result)"
|
||||
else
|
||||
echo '$^' # match nothing
|
||||
fi
|
||||
}
|
||||
|
||||
if [[ ${#INCLUDE_MODULES[@]} -gt 0 ]]; then
|
||||
INCLUDE_REGEX="(${$(printf "|%s" "${INCLUDE_MODULES[@]}"):1})"
|
||||
INCLUDE_REGEX="$(build_include_regex)"
|
||||
else
|
||||
INCLUDE_REGEX="" # "match anything"
|
||||
fi
|
||||
|
||||
if [[ ${#EXCLUDE_MODULES[@]} -gt 0 ]]; then
|
||||
EXCLUDE_REGEX="(${$(printf "|%s" "${EXCLUDE_MODULES[@]}"):1})"
|
||||
EXCLUDE_REGEX="$(build_exclude_regex)"
|
||||
else
|
||||
EXCLUDE_REGEX='$^' # "match nothing"
|
||||
fi
|
||||
@ -71,8 +418,6 @@ NL=$'\n'
|
||||
|
||||
ROOT_DIR="$(git rev-parse --show-toplevel)"
|
||||
|
||||
alias jq="jq --unbuffered"
|
||||
|
||||
msg() {
|
||||
echo "$*" >&2
|
||||
}
|
||||
@ -80,11 +425,21 @@ msg() {
|
||||
statlog() {
|
||||
local module="$1"
|
||||
local rpath
|
||||
local gh_repo=""
|
||||
|
||||
if [[ "$module" == "github.com/ipfs/kubo" ]]; then
|
||||
rpath="$ROOT_DIR"
|
||||
else
|
||||
rpath="$GOPATH/src/$(strip_version "$module")"
|
||||
fi
|
||||
|
||||
# Extract gh_repo for API calls
|
||||
local repo
|
||||
repo="$(strip_version "$module")"
|
||||
if [[ "$repo" =~ ^github\.com/(.+)$ ]]; then
|
||||
gh_repo="${BASH_REMATCH[1]}"
|
||||
fi
|
||||
|
||||
local start="${2:-}"
|
||||
local end="${3:-HEAD}"
|
||||
local mailmap_file="$rpath/.mailmap"
|
||||
@ -93,18 +448,21 @@ statlog() {
|
||||
fi
|
||||
|
||||
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
|
||||
local line
|
||||
while read -r line; do
|
||||
if [[ -n "$line" ]]; then
|
||||
stack+=("$line")
|
||||
continue
|
||||
fi
|
||||
|
||||
local changes
|
||||
read -r changes
|
||||
|
||||
changed=0
|
||||
insertions=0
|
||||
deletions=0
|
||||
while read count event; do
|
||||
local changed=0
|
||||
local insertions=0
|
||||
local deletions=0
|
||||
local count event
|
||||
while read -r count event; do
|
||||
if [[ "$event" =~ ^file ]]; then
|
||||
changed=$count
|
||||
elif [[ "$event" =~ ^insertion ]]; then
|
||||
@ -117,27 +475,32 @@ statlog() {
|
||||
fi
|
||||
done<<<"${changes//,/$NL}"
|
||||
|
||||
local author
|
||||
for author in "${stack[@]}"; do
|
||||
local hash name email
|
||||
IFS=$'\t' read -r hash name email <<<"$author"
|
||||
|
||||
# Resolve GitHub handle
|
||||
local github_handle=""
|
||||
github_handle="$(resolve_github_handle "$email" "$hash" "$rpath" "$gh_repo")" || true
|
||||
|
||||
jq -n \
|
||||
--arg "hash" "$hash" \
|
||||
--arg "name" "$name" \
|
||||
--arg "email" "$email" \
|
||||
--arg "github" "$github_handle" \
|
||||
--argjson "changed" "$changed" \
|
||||
--argjson "insertions" "$insertions" \
|
||||
--argjson "deletions" "$deletions" \
|
||||
'{Commit: $hash, Author: $name, Email: $email, Files: $changed, Insertions: $insertions, Deletions: $deletions}'
|
||||
'{Commit: $hash, Author: $name, Email: $email, GitHub: $github, Files: $changed, Insertions: $insertions, Deletions: $deletions}'
|
||||
done
|
||||
stack=()
|
||||
done
|
||||
done < <(git -C "$rpath" -c mailmap.file="$mailmap_file" log --use-mailmap --shortstat --no-merges --pretty="tformat:%H%x09%aN%x09%aE" "$start..$end" -- . "${IGNORE_FILES_PATHSPEC[@]}")
|
||||
}
|
||||
|
||||
# Returns a stream of deps changed between $1 and $2.
|
||||
dep_changes() {
|
||||
{
|
||||
<"$1"
|
||||
<"$2"
|
||||
} | jq -s 'JOIN(INDEX(.[0][]; .Path); .[1][]; .Path; {Path: .[0].Path, Old: (.[1] | del(.Path)), New: (.[0] | del(.Path))}) | select(.New.Version != .Old.Version)'
|
||||
cat "$1" "$2" | jq -s 'JOIN(INDEX(.[0][]; .Path); .[1][]; .Path; {Path: .[0].Path, Old: (.[1] | del(.Path)), New: (.[0] | del(.Path))}) | select(.New.Version != .Old.Version)'
|
||||
}
|
||||
|
||||
# resolve_commits resolves a git ref for each version.
|
||||
@ -165,12 +528,11 @@ ignored_commit() {
|
||||
|
||||
# Generate a release log for a range of commits in a single repo.
|
||||
release_log() {
|
||||
setopt local_options BASH_REMATCH
|
||||
|
||||
local module="$1"
|
||||
local start="$2"
|
||||
local end="${3:-HEAD}"
|
||||
local repo="$(strip_version "$1")"
|
||||
local repo
|
||||
repo="$(strip_version "$1")"
|
||||
local dir
|
||||
if [[ "$module" == "github.com/ipfs/kubo" ]]; then
|
||||
dir="$ROOT_DIR"
|
||||
@ -178,28 +540,25 @@ release_log() {
|
||||
dir="$GOPATH/src/$repo"
|
||||
fi
|
||||
|
||||
local commit pr
|
||||
git -C "$dir" log \
|
||||
--format='tformat:%H %s' \
|
||||
--first-parent \
|
||||
"$start..$end" |
|
||||
while read commit subject; do
|
||||
# Skip commits that only touch ignored files.
|
||||
if ignored_commit "$dir" "$commit"; then
|
||||
continue
|
||||
fi
|
||||
local commit subject
|
||||
while read -r commit subject; do
|
||||
# Skip commits that only touch ignored files.
|
||||
if ignored_commit "$dir" "$commit"; then
|
||||
continue
|
||||
fi
|
||||
|
||||
if [[ "$subject" =~ '^Merge pull request #([0-9]+) from' ]]; then
|
||||
local prnum="${BASH_REMATCH[2]}"
|
||||
local desc="$(git -C "$dir" show --summary --format='tformat:%b' "$commit" | head -1)"
|
||||
printf -- "- %s (%s)\n" "$desc" "$(pr_link "$repo" "$prnum")"
|
||||
elif [[ "$subject" =~ '\(#([0-9]+)\)$' ]]; then
|
||||
local prnum="${BASH_REMATCH[2]}"
|
||||
printf -- "- %s (%s)\n" "$subject" "$(pr_link "$repo" "$prnum")"
|
||||
else
|
||||
printf -- "- %s\n" "$subject"
|
||||
fi
|
||||
done
|
||||
if [[ "$subject" =~ ^Merge\ pull\ request\ \#([0-9]+)\ from ]]; then
|
||||
local prnum="${BASH_REMATCH[1]}"
|
||||
local desc
|
||||
desc="$(git -C "$dir" show --summary --format='tformat:%b' "$commit" | head -1)"
|
||||
printf -- "- %s (%s)\n" "$desc" "$(pr_link "$repo" "$prnum")"
|
||||
elif [[ "$subject" =~ \(#([0-9]+)\)$ ]]; then
|
||||
local prnum="${BASH_REMATCH[1]}"
|
||||
printf -- "- %s (%s)\n" "$subject" "$(pr_link "$repo" "$prnum")"
|
||||
else
|
||||
printf -- "- %s\n" "$subject"
|
||||
fi
|
||||
done < <(git -C "$dir" log --format='tformat:%H %s' --first-parent "$start..$end")
|
||||
}
|
||||
|
||||
indent() {
|
||||
@ -211,7 +570,8 @@ mod_deps() {
|
||||
}
|
||||
|
||||
ensure() {
|
||||
local repo="$(strip_version "$1")"
|
||||
local repo
|
||||
repo="$(strip_version "$1")"
|
||||
local commit="$2"
|
||||
local rpath
|
||||
if [[ "$1" == "github.com/ipfs/kubo" ]]; then
|
||||
@ -232,14 +592,27 @@ ensure() {
|
||||
git -C "$rpath" rev-parse --verify "$commit" >/dev/null || return 1
|
||||
}
|
||||
|
||||
# Summarize stats, grouping by GitHub handle (with fallback to email for dedup)
|
||||
statsummary() {
|
||||
jq -s 'group_by(.Author)[] | {Author: .[0].Author, Commits: (. | length), Insertions: (map(.Insertions) | add), Deletions: (map(.Deletions) | add), Files: (map(.Files) | add)}' |
|
||||
jq '. + {Lines: (.Deletions + .Insertions)}'
|
||||
jq -s '
|
||||
# Group by GitHub handle if available, otherwise by email
|
||||
group_by(if .GitHub != "" then .GitHub else .Email end)[] |
|
||||
{
|
||||
# Use first non-empty GitHub handle, or fall back to Author name
|
||||
Author: .[0].Author,
|
||||
GitHub: (map(select(.GitHub != "")) | .[0].GitHub // ""),
|
||||
Email: .[0].Email,
|
||||
Commits: (. | length),
|
||||
Insertions: (map(.Insertions) | add),
|
||||
Deletions: (map(.Deletions) | add),
|
||||
Files: (map(.Files) | add)
|
||||
}
|
||||
' | jq '. + {Lines: (.Deletions + .Insertions)}'
|
||||
}
|
||||
|
||||
strip_version() {
|
||||
local repo="$1"
|
||||
if [[ "$repo" =~ '.*/v[0-9]+$' ]]; then
|
||||
if [[ "$repo" =~ .*/v[0-9]+$ ]]; then
|
||||
repo="$(dirname "$repo")"
|
||||
fi
|
||||
echo "$repo"
|
||||
@ -248,16 +621,24 @@ strip_version() {
|
||||
recursive_release_log() {
|
||||
local start="${1:-$(git tag -l | sort -V | grep -v -- '-rc' | grep 'v'| tail -n1)}"
|
||||
local end="${2:-$(git rev-parse HEAD)}"
|
||||
local repo_root="$(git rev-parse --show-toplevel)"
|
||||
local module="$(go list -m)"
|
||||
local dir="$(go list -m -f '{{.Dir}}')"
|
||||
local repo_root
|
||||
repo_root="$(git rev-parse --show-toplevel)"
|
||||
local module
|
||||
module="$(go list -m)"
|
||||
local dir
|
||||
dir="$(go list -m -f '{{.Dir}}')"
|
||||
|
||||
# Load cached GitHub handle mappings
|
||||
load_github_cache
|
||||
|
||||
# Kubo can be run from any directory, dependencies still use GOPATH
|
||||
|
||||
(
|
||||
local result=0
|
||||
local workspace="$(mktemp -d)"
|
||||
trap "$(printf 'rm -rf "%q"' "$workspace")" INT TERM EXIT
|
||||
local workspace
|
||||
workspace="$(mktemp -d)"
|
||||
# shellcheck disable=SC2064
|
||||
trap "rm -rf '$workspace'" INT TERM EXIT
|
||||
cd "$workspace"
|
||||
|
||||
echo "Computing old deps..." >&2
|
||||
@ -272,6 +653,9 @@ recursive_release_log() {
|
||||
|
||||
printf -- "Generating Changelog for %s %s..%s\n" "$module" "$start" "$end" >&2
|
||||
|
||||
# Pre-build GitHub mappings for main module
|
||||
build_github_mappings "$module" "$start" "$end"
|
||||
|
||||
echo "### 📝 Changelog"
|
||||
echo
|
||||
echo "<details><summary>Full Changelog</summary>"
|
||||
@ -282,24 +666,26 @@ recursive_release_log() {
|
||||
|
||||
statlog "$module" "$start" "$end" > statlog.json
|
||||
|
||||
dep_changes old_deps.json new_deps.json |
|
||||
local dep_module new new_ref old old_ref
|
||||
while read -r dep_module new new_ref old old_ref; do
|
||||
if ! ensure "$dep_module" "$new_ref"; then
|
||||
result=1
|
||||
local changelog="failed to fetch repo"
|
||||
else
|
||||
# Pre-build GitHub mappings for dependency
|
||||
build_github_mappings "$dep_module" "$old_ref" "$new_ref"
|
||||
statlog "$dep_module" "$old_ref" "$new_ref" >> statlog.json
|
||||
local changelog
|
||||
changelog="$(release_log "$dep_module" "$old_ref" "$new_ref")"
|
||||
fi
|
||||
if [[ -n "$changelog" ]]; then
|
||||
printf -- "- %s (%s -> %s):\n" "$dep_module" "$old" "$new"
|
||||
echo "$changelog" | indent
|
||||
fi
|
||||
done < <(dep_changes old_deps.json new_deps.json |
|
||||
jq --arg inc "$INCLUDE_REGEX" --arg exc "$EXCLUDE_REGEX" \
|
||||
'select(.Path | test($inc)) | select(.Path | test($exc) | not)' |
|
||||
# Compute changelogs
|
||||
jq -r '"\(.Path) \(.New.Version) \(.New.Ref) \(.Old.Version) \(.Old.Ref // "")"' |
|
||||
while read module new new_ref old old_ref; do
|
||||
if ! ensure "$module" "$new_ref"; then
|
||||
result=1
|
||||
local changelog="failed to fetch repo"
|
||||
else
|
||||
statlog "$module" "$old_ref" "$new_ref" >> statlog.json
|
||||
local changelog="$(release_log "$module" "$old_ref" "$new_ref")"
|
||||
fi
|
||||
if [[ -n "$changelog" ]]; then
|
||||
printf -- "- %s (%s -> %s):\n" "$module" "$old" "$new"
|
||||
echo "$changelog" | indent
|
||||
fi
|
||||
done
|
||||
jq -r '"\(.Path) \(.New.Version) \(.New.Ref) \(.Old.Version) \(.Old.Ref // "")"')
|
||||
|
||||
echo
|
||||
echo "</details>"
|
||||
@ -311,8 +697,18 @@ recursive_release_log() {
|
||||
echo "|-------------|---------|---------|---------------|"
|
||||
statsummary <statlog.json |
|
||||
jq -s 'sort_by(.Lines) | reverse | .[]' |
|
||||
jq -r '"| \(.Author) | \(.Commits) | +\(.Insertions)/-\(.Deletions) | \(.Files) |"'
|
||||
return "$status"
|
||||
jq -r '
|
||||
if .GitHub != "" then
|
||||
"| [@\(.GitHub)](https://github.com/\(.GitHub)) | \(.Commits) | +\(.Insertions)/-\(.Deletions) | \(.Files) |"
|
||||
else
|
||||
"| \(.Author) | \(.Commits) | +\(.Insertions)/-\(.Deletions) | \(.Files) |"
|
||||
end
|
||||
'
|
||||
|
||||
# Save cache before exiting
|
||||
save_github_cache
|
||||
|
||||
return "$result"
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@ -7,7 +7,7 @@
|
||||
# Run from ci to tag images based on the current branch or tag name.
|
||||
# A bit like dockerhub autobuild config, but somewhere we can version control it.
|
||||
#
|
||||
# The `docker-build` job builds the current commit in docker and tags it as ipfs/go-ipfs:wip
|
||||
# The `docker-build` job builds the current commit in docker and tags it as ipfs/kubo:wip
|
||||
#
|
||||
# Then the `docker-publish` job runs this script to decide what tag, if any,
|
||||
# to publish to dockerhub.
|
||||
@ -42,7 +42,7 @@ GIT_TAG=${4:-$(git describe --tags --exact-match || echo "")}
|
||||
DRY_RUN=${5:-false}
|
||||
|
||||
WIP_IMAGE_TAG=${WIP_IMAGE_TAG:-wip}
|
||||
IMAGE_NAME=${IMAGE_NAME:-ipfs/go-ipfs}
|
||||
IMAGE_NAME=${IMAGE_NAME:-ipfs/kubo}
|
||||
|
||||
pushTag () {
|
||||
local IMAGE_TAG=$1
|
||||
@ -63,7 +63,7 @@ if [[ $GIT_TAG =~ ^v[0-9]+\.[0-9]+\.[0-9]+-rc ]]; then
|
||||
elif [[ $GIT_TAG =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
|
||||
pushTag "$GIT_TAG"
|
||||
pushTag "latest"
|
||||
pushTag "release" # see: https://github.com/ipfs/go-ipfs/issues/3999#issuecomment-742228981
|
||||
pushTag "release" # see: https://github.com/ipfs/kubo/issues/3999#issuecomment-742228981
|
||||
|
||||
elif [[ $GIT_BRANCH =~ ^bifrost-.* ]]; then
|
||||
# sanitize the branch name since docker tags have stricter char limits than git branch names
|
||||
|
||||
@ -1,7 +1,6 @@
|
||||
package commands
|
||||
|
||||
import (
|
||||
"context"
|
||||
"io"
|
||||
"testing"
|
||||
|
||||
@ -12,8 +11,7 @@ import (
|
||||
)
|
||||
|
||||
func TestFilesCp_DagCborNodeFails(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
|
||||
cmdCtx, err := coremock.MockCmdsCtx()
|
||||
require.NoError(t, err)
|
||||
|
||||
@ -1,7 +1,6 @@
|
||||
package commands
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"testing"
|
||||
|
||||
@ -52,8 +51,7 @@ func TestGetOutputPath(t *testing.T) {
|
||||
|
||||
for i, tc := range cases {
|
||||
t.Run(fmt.Sprintf("%s-%d", t.Name(), i), func(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
|
||||
req, err := cmds.NewRequest(ctx, []string{}, tc.opts, tc.args, nil, GetCmd)
|
||||
if err != nil {
|
||||
|
||||
@ -15,8 +15,7 @@ import (
|
||||
)
|
||||
|
||||
func TestPathUnixFSHAMTPartial(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
|
||||
// Create a node
|
||||
apis, err := NodeProvider{}.MakeAPISwarm(t, ctx, true, true, 1)
|
||||
|
||||
@ -2,7 +2,6 @@ package tests
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"io"
|
||||
"strings"
|
||||
"testing"
|
||||
@ -55,8 +54,7 @@ func (tp *TestSuite) TestBlock(t *testing.T) {
|
||||
|
||||
// when no opts are passed, produced CID has 'raw' codec
|
||||
func (tp *TestSuite) TestBlockPut(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
@ -75,8 +73,7 @@ func (tp *TestSuite) TestBlockPut(t *testing.T) {
|
||||
// Format is deprecated, it used invalid codec names.
|
||||
// Confirm 'cbor' gets fixed to 'dag-cbor'
|
||||
func (tp *TestSuite) TestBlockPutFormatDagCbor(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
@ -95,8 +92,7 @@ func (tp *TestSuite) TestBlockPutFormatDagCbor(t *testing.T) {
|
||||
// Format is deprecated, it used invalid codec names.
|
||||
// Confirm 'protobuf' got fixed to 'dag-pb'
|
||||
func (tp *TestSuite) TestBlockPutFormatDagPb(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
@ -115,8 +111,7 @@ func (tp *TestSuite) TestBlockPutFormatDagPb(t *testing.T) {
|
||||
// Format is deprecated, it used invalid codec names.
|
||||
// Confirm fake codec 'v0' got fixed to CIDv0 (with implicit dag-pb codec)
|
||||
func (tp *TestSuite) TestBlockPutFormatV0(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
@ -133,8 +128,7 @@ func (tp *TestSuite) TestBlockPutFormatV0(t *testing.T) {
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestBlockPutCidCodecDagCbor(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
@ -151,8 +145,7 @@ func (tp *TestSuite) TestBlockPutCidCodecDagCbor(t *testing.T) {
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestBlockPutCidCodecDagPb(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
@ -169,8 +162,7 @@ func (tp *TestSuite) TestBlockPutCidCodecDagPb(t *testing.T) {
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestBlockPutHash(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
@ -192,8 +184,7 @@ func (tp *TestSuite) TestBlockPutHash(t *testing.T) {
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestBlockGet(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
@ -230,8 +221,7 @@ func (tp *TestSuite) TestBlockGet(t *testing.T) {
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestBlockRm(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
@ -284,8 +274,7 @@ func (tp *TestSuite) TestBlockRm(t *testing.T) {
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestBlockStat(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
@ -311,8 +300,7 @@ func (tp *TestSuite) TestBlockStat(t *testing.T) {
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestBlockPin(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
|
||||
@ -1,7 +1,6 @@
|
||||
package tests
|
||||
|
||||
import (
|
||||
"context"
|
||||
"math"
|
||||
"strings"
|
||||
"testing"
|
||||
@ -38,8 +37,7 @@ var treeExpected = map[string]struct{}{
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestPut(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
@ -61,8 +59,7 @@ func (tp *TestSuite) TestPut(t *testing.T) {
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestPutWithHash(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
@ -84,8 +81,7 @@ func (tp *TestSuite) TestPutWithHash(t *testing.T) {
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestDagPath(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
@ -132,8 +128,7 @@ func (tp *TestSuite) TestDagPath(t *testing.T) {
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestTree(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
@ -167,8 +162,7 @@ func (tp *TestSuite) TestTree(t *testing.T) {
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestBatch(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
|
||||
@ -1,7 +1,6 @@
|
||||
package tests
|
||||
|
||||
import (
|
||||
"context"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
@ -43,8 +42,7 @@ func (tp *TestSuite) TestKey(t *testing.T) {
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestListSelf(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
require.NoError(t, err)
|
||||
@ -60,8 +58,7 @@ func (tp *TestSuite) TestListSelf(t *testing.T) {
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestRenameSelf(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
require.NoError(t, err)
|
||||
@ -74,8 +71,7 @@ func (tp *TestSuite) TestRenameSelf(t *testing.T) {
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestRemoveSelf(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
require.NoError(t, err)
|
||||
@ -85,8 +81,7 @@ func (tp *TestSuite) TestRemoveSelf(t *testing.T) {
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestGenerate(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
require.NoError(t, err)
|
||||
@ -113,8 +108,7 @@ func verifyIPNSPath(t *testing.T, p string) {
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestGenerateSize(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
require.NoError(t, err)
|
||||
@ -129,8 +123,7 @@ func (tp *TestSuite) TestGenerateSize(t *testing.T) {
|
||||
func (tp *TestSuite) TestGenerateType(t *testing.T) {
|
||||
t.Skip("disabled until libp2p/specs#111 is fixed")
|
||||
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
require.NoError(t, err)
|
||||
@ -143,8 +136,7 @@ func (tp *TestSuite) TestGenerateType(t *testing.T) {
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestGenerateExisting(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
require.NoError(t, err)
|
||||
@ -160,8 +152,7 @@ func (tp *TestSuite) TestGenerateExisting(t *testing.T) {
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestList(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
require.NoError(t, err)
|
||||
@ -180,8 +171,7 @@ func (tp *TestSuite) TestList(t *testing.T) {
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestRename(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
require.NoError(t, err)
|
||||
@ -196,8 +186,7 @@ func (tp *TestSuite) TestRename(t *testing.T) {
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestRenameToSelf(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
require.NoError(t, err)
|
||||
@ -210,8 +199,7 @@ func (tp *TestSuite) TestRenameToSelf(t *testing.T) {
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestRenameToSelfForce(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
require.NoError(t, err)
|
||||
@ -224,8 +212,7 @@ func (tp *TestSuite) TestRenameToSelfForce(t *testing.T) {
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestRenameOverwriteNoForce(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
require.NoError(t, err)
|
||||
@ -241,8 +228,7 @@ func (tp *TestSuite) TestRenameOverwriteNoForce(t *testing.T) {
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestRenameOverwrite(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
require.NoError(t, err)
|
||||
@ -261,8 +247,7 @@ func (tp *TestSuite) TestRenameOverwrite(t *testing.T) {
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestRenameSameNameNoForce(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
require.NoError(t, err)
|
||||
@ -277,8 +262,7 @@ func (tp *TestSuite) TestRenameSameNameNoForce(t *testing.T) {
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestRenameSameName(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
require.NoError(t, err)
|
||||
@ -293,8 +277,7 @@ func (tp *TestSuite) TestRenameSameName(t *testing.T) {
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestRemove(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
require.NoError(t, err)
|
||||
@ -317,8 +300,7 @@ func (tp *TestSuite) TestRemove(t *testing.T) {
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestSign(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
require.NoError(t, err)
|
||||
@ -348,8 +330,7 @@ func (tp *TestSuite) TestVerify(t *testing.T) {
|
||||
t.Run("Verify Own Key", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
require.NoError(t, err)
|
||||
@ -370,8 +351,7 @@ func (tp *TestSuite) TestVerify(t *testing.T) {
|
||||
t.Run("Verify Self", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
|
||||
api, err := tp.makeAPIWithIdentityAndOffline(t, ctx)
|
||||
require.NoError(t, err)
|
||||
@ -390,8 +370,7 @@ func (tp *TestSuite) TestVerify(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
// Spin some node and get signature out.
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
require.NoError(t, err)
|
||||
@ -411,8 +390,7 @@ func (tp *TestSuite) TestVerify(t *testing.T) {
|
||||
{"Prefixed IPNS Path", ipns.NameFromPeer(key.ID()).AsPath().String()},
|
||||
} {
|
||||
t.Run(testCase[0], func(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
|
||||
// Spin new node.
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
|
||||
@ -35,8 +35,7 @@ func addTestObject(ctx context.Context, api coreiface.CoreAPI) (path.Path, error
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestPublishResolve(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
init := func() (coreiface.CoreAPI, path.Path) {
|
||||
apis, err := tp.MakeAPISwarm(t, ctx, 5)
|
||||
require.NoError(t, err)
|
||||
@ -120,8 +119,7 @@ func (tp *TestSuite) TestPublishResolve(t *testing.T) {
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestBasicPublishResolveKey(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
apis, err := tp.MakeAPISwarm(t, ctx, 5)
|
||||
require.NoError(t, err)
|
||||
api := apis[0]
|
||||
@ -142,8 +140,7 @@ func (tp *TestSuite) TestBasicPublishResolveKey(t *testing.T) {
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestBasicPublishResolveTimeout(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
apis, err := tp.MakeAPISwarm(t, ctx, 5)
|
||||
require.NoError(t, err)
|
||||
api := apis[0]
|
||||
|
||||
@ -45,8 +45,7 @@ func putDagPbNode(t *testing.T, ctx context.Context, api iface.CoreAPI, data str
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestObjectAddLink(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
require.NoError(t, err)
|
||||
|
||||
@ -72,8 +71,7 @@ func (tp *TestSuite) TestObjectAddLink(t *testing.T) {
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestObjectAddLinkCreate(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
require.NoError(t, err)
|
||||
|
||||
@ -102,8 +100,7 @@ func (tp *TestSuite) TestObjectAddLinkCreate(t *testing.T) {
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestObjectRmLink(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
require.NoError(t, err)
|
||||
|
||||
@ -127,8 +124,7 @@ func (tp *TestSuite) TestObjectRmLink(t *testing.T) {
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestDiffTest(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
require.NoError(t, err)
|
||||
|
||||
|
||||
@ -1,7 +1,6 @@
|
||||
package tests
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"math"
|
||||
"strings"
|
||||
@ -32,8 +31,7 @@ func (tp *TestSuite) TestPath(t *testing.T) {
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestMutablePath(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
require.NoError(t, err)
|
||||
@ -49,8 +47,7 @@ func (tp *TestSuite) TestMutablePath(t *testing.T) {
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestPathRemainder(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
require.NoError(t, err)
|
||||
@ -71,8 +68,7 @@ func (tp *TestSuite) TestPathRemainder(t *testing.T) {
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestEmptyPathRemainder(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
require.NoError(t, err)
|
||||
@ -90,8 +86,7 @@ func (tp *TestSuite) TestEmptyPathRemainder(t *testing.T) {
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestInvalidPathRemainder(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
require.NoError(t, err)
|
||||
@ -112,8 +107,7 @@ func (tp *TestSuite) TestInvalidPathRemainder(t *testing.T) {
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestPathRoot(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
require.NoError(t, err)
|
||||
|
||||
@ -33,8 +33,7 @@ func (tp *TestSuite) TestPin(t *testing.T) {
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestPinAdd(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
@ -52,8 +51,7 @@ func (tp *TestSuite) TestPinAdd(t *testing.T) {
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestPinSimple(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
@ -104,8 +102,7 @@ func (tp *TestSuite) TestPinSimple(t *testing.T) {
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestPinRecursive(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
@ -251,8 +248,7 @@ func (tp *TestSuite) TestPinRecursive(t *testing.T) {
|
||||
|
||||
// TestPinLsIndirect verifies that indirect nodes are listed by pin ls even if a parent node is directly pinned
|
||||
func (tp *TestSuite) TestPinLsIndirect(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
@ -284,8 +280,7 @@ func (tp *TestSuite) TestPinLsPrecedence(t *testing.T) {
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestPinLsPredenceRecursiveIndirect(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
@ -308,8 +303,7 @@ func (tp *TestSuite) TestPinLsPredenceRecursiveIndirect(t *testing.T) {
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestPinLsPrecedenceDirectIndirect(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
@ -332,8 +326,7 @@ func (tp *TestSuite) TestPinLsPrecedenceDirectIndirect(t *testing.T) {
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestPinLsPrecedenceRecursiveDirect(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
@ -368,8 +361,7 @@ func (tp *TestSuite) TestPinLsPrecedenceRecursiveDirect(t *testing.T) {
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestPinIsPinned(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
@ -583,8 +575,7 @@ func assertIsPinned(t *testing.T, ctx context.Context, api iface.CoreAPI, p path
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestPinNames(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
require.NoError(t, err)
|
||||
|
||||
|
||||
@ -41,8 +41,7 @@ func (tp *TestSuite) testRoutingPublishKey(t *testing.T, ctx context.Context, ap
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestRoutingGet(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
|
||||
apis, err := tp.MakeAPISwarm(t, ctx, 2)
|
||||
require.NoError(t, err)
|
||||
@ -63,8 +62,7 @@ func (tp *TestSuite) TestRoutingGet(t *testing.T) {
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestRoutingPut(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
apis, err := tp.MakeAPISwarm(t, ctx, 2)
|
||||
require.NoError(t, err)
|
||||
|
||||
@ -81,8 +79,7 @@ func (tp *TestSuite) TestRoutingPut(t *testing.T) {
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestRoutingPutOffline(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
|
||||
// init a swarm & publish an IPNS entry to get a valid payload
|
||||
apis, err := tp.MakeAPISwarm(t, ctx, 2)
|
||||
@ -104,8 +101,7 @@ func (tp *TestSuite) TestRoutingPutOffline(t *testing.T) {
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestRoutingFindPeer(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
apis, err := tp.MakeAPISwarm(t, ctx, 5)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
@ -159,8 +155,7 @@ func (tp *TestSuite) TestRoutingFindPeer(t *testing.T) {
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestRoutingFindProviders(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
apis, err := tp.MakeAPISwarm(t, ctx, 5)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
@ -198,8 +193,7 @@ func (tp *TestSuite) TestRoutingFindProviders(t *testing.T) {
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestRoutingProvide(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
apis, err := tp.MakeAPISwarm(t, ctx, 5)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
|
||||
@ -98,8 +98,7 @@ func wrapped(names ...string) func(f files.Node) files.Node {
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestAdd(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
@ -532,8 +531,7 @@ func (tp *TestSuite) TestAdd(t *testing.T) {
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestAddPinned(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
@ -558,8 +556,7 @@ func (tp *TestSuite) TestAddPinned(t *testing.T) {
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestAddHashOnly(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
@ -584,8 +581,7 @@ func (tp *TestSuite) TestAddHashOnly(t *testing.T) {
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestGetEmptyFile(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
@ -617,8 +613,7 @@ func (tp *TestSuite) TestGetEmptyFile(t *testing.T) {
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestGetDir(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
@ -645,8 +640,7 @@ func (tp *TestSuite) TestGetDir(t *testing.T) {
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestGetNonUnixfs(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
@ -665,8 +659,7 @@ func (tp *TestSuite) TestGetNonUnixfs(t *testing.T) {
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestLs(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
@ -769,8 +762,7 @@ func (tp *TestSuite) TestEntriesExpired(t *testing.T) {
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestLsEmptyDir(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
@ -802,8 +794,7 @@ func (tp *TestSuite) TestLsEmptyDir(t *testing.T) {
|
||||
|
||||
// TODO(lgierth) this should test properly, with len(links) > 0
|
||||
func (tp *TestSuite) TestLsNonUnixfs(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
@ -870,8 +861,7 @@ func (f *closeTestF) Close() error {
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestAddCloses(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
@ -908,8 +898,7 @@ func (tp *TestSuite) TestAddCloses(t *testing.T) {
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestGetSeek(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
@ -1014,8 +1003,7 @@ func (tp *TestSuite) TestGetSeek(t *testing.T) {
|
||||
}
|
||||
|
||||
func (tp *TestSuite) TestGetReadAt(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
api, err := tp.makeAPI(t, ctx)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
|
||||
@ -1,7 +1,6 @@
|
||||
package libp2p
|
||||
|
||||
import (
|
||||
"context"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
@ -42,8 +41,7 @@ func TestLoggingResourceManager(t *testing.T) {
|
||||
}
|
||||
|
||||
// run the logger which will write an entry for those errors
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
lrm.start(ctx)
|
||||
clock.Add(3 * time.Second)
|
||||
|
||||
|
||||
@ -8,29 +8,33 @@ This release was brought to you by the [Shipyard](https://ipshipyard.com/) team.
|
||||
|
||||
## v0.39.0
|
||||
|
||||
[<img align="right" width="256px" src="https://github.com/user-attachments/assets/427702e8-b6b8-4ac2-8425-18069626c321" />](https://github.com/user-attachments/assets/427702e8-b6b8-4ac2-8425-18069626c321)
|
||||
|
||||
- [Overview](#overview)
|
||||
- [🔦 Highlights](#-highlights)
|
||||
- [🎯 Amino DHT Sweep provider is now the default](#-amino-dht-sweep-provider-is-now-the-default)
|
||||
- [🎯 DHT Sweep provider is now the default](#-dht-sweep-provider-is-now-the-default)
|
||||
- [⚡ Fast root CID providing for immediate content discovery](#-fast-root-cid-providing-for-immediate-content-discovery)
|
||||
- [📊 Detailed statistics for Sweep provider with `ipfs provide stat`](#-detailed-statistics-for-sweep-provider-with-ipfs-provide-stat)
|
||||
- [⏯️ Provider resume cycle for improved reproviding reliability](#provider-resume-cycle-for-improved-reproviding-reliability)
|
||||
- [🔔 Sweep provider slow reprovide warnings](#-sweep-provider-slow-reprovide-warnings)
|
||||
- [⏯️ Provider state persists across restarts](#️-provider-state-persists-across-restarts)
|
||||
- [📊 Detailed statistics with `ipfs provide stat`](#-detailed-statistics-with-ipfs-provide-stat)
|
||||
- [🔔 Slow reprovide warnings](#-slow-reprovide-warnings)
|
||||
- [📊 Metric rename: `provider_provides_total`](#-metric-rename-provider_provides_total)
|
||||
- [🔧 Fixed UPnP port forwarding after router restarts](#-fixed-upnp-port-forwarding-after-router-restarts)
|
||||
- [🖥️ RISC-V support with prebuilt binaries](#️-risc-v-support-with-prebuilt-binaries)
|
||||
- [🚦 Gateway range request limits for CDN compatibility](#-gateway-range-request-limits-for-cdn-compatibility)
|
||||
- [🔧 Automatic UPnP recovery after router restarts](#-automatic-upnp-recovery-after-router-restarts)
|
||||
- [🪦 Deprecated `go-ipfs` name no longer published](#-deprecated-go-ipfs-name-no-longer-published)
|
||||
- [🚦 Gateway range request limits for CDN compatibility](#-gateway-range-request-limits-for-cdn-compatibility)
|
||||
- [🖥️ RISC-V support with prebuilt binaries](#️-risc-v-support-with-prebuilt-binaries)
|
||||
- [📦️ Important dependency updates](#-important-dependency-updates)
|
||||
- [📝 Changelog](#-changelog)
|
||||
- [👨👩👧👦 Contributors](#-contributors)
|
||||
|
||||
### Overview
|
||||
|
||||
Kubo 0.39.0 graduates the experimental sweep provider to default, bringing efficient content announcement to all nodes. This release adds fast root CID providing for immediate content discovery via `ipfs add`, detailed provider statistics, automatic state persistence for reliable reproviding after restarts, and proactive monitoring alerts for identifying issues early. It also includes important fixes for UPnP port forwarding, RISC-V prebuilt binaries, and finalizes the deprecation of the legacy go-ipfs name.
|
||||
Kubo 0.39 makes self-hosting practical on consumer hardware and home networks. The DHT sweep provider (now default) announces your content to the network without traffic spikes that overwhelm residential connections. Automatic UPnP recovery means your node stays reachable after router restarts without manual intervention.
|
||||
|
||||
New content becomes findable immediately after `ipfs add`. The provider system persists state across restarts, alerts you when falling behind, and exposes detailed stats for monitoring. This release also finalizes the deprecation of the legacy `go-ipfs` name.
|
||||
|
||||
### 🔦 Highlights
|
||||
|
||||
#### 🎯 Amino DHT Sweep provider is now the default
|
||||
#### 🎯 DHT Sweep provider is now the default
|
||||
|
||||
The Amino DHT Sweep provider system, introduced as experimental in v0.38, is now enabled by default (`Provide.DHT.SweepEnabled=true`).
|
||||
|
||||
@ -41,16 +45,18 @@ The Amino DHT Sweep provider system, introduced as experimental in v0.38, is now
|
||||
- If you explicitly set `Provide.DHT.SweepEnabled=false` in v0.38, you'll continue using the legacy provider
|
||||
- If you were using the default settings, you'll automatically get the sweep provider
|
||||
- To opt out and return to legacy behavior: `ipfs config --json Provide.DHT.SweepEnabled false`
|
||||
- Providers with medium to large datasets may need to adjust defaults; see [Capacity Planning](https://github.com/ipfs/kubo/blob/master/docs/provide-stats.md#capacity-planning)
|
||||
- When `Routing.AcceleratedDHTClient` is enabled, full sweep efficiency may not be available yet; consider disabling the accelerated client as sweep is sufficient for most workloads. See [caveat 4](https://github.com/ipfs/kubo/blob/master/docs/config.md#routingaccelerateddhtclient).
|
||||
|
||||
**New features available with sweep mode:**
|
||||
|
||||
- Detailed statistics via `ipfs provide stat` ([see below](#-detailed-statistics-for-sweep-provider-with-ipfs-provide-stat))
|
||||
- Automatic resume after restarts with persistent state ([see below](#provider-resume-cycle-for-improved-reproviding-reliability))
|
||||
- Proactive alerts when reproviding falls behind ([see below](#-sweep-provider-slow-reprovide-warnings))
|
||||
- Detailed statistics via `ipfs provide stat` ([see below](#-detailed-statistics-with-ipfs-provide-stat))
|
||||
- Automatic resume after restarts with persistent state ([see below](#️-provider-state-persists-across-restarts))
|
||||
- Proactive alerts when reproviding falls behind ([see below](#-slow-reprovide-warnings))
|
||||
- Better metrics for monitoring (`provider_provides_total`) ([see below](#-metric-rename-provider_provides_total))
|
||||
- Fast optimistic provide of new root CIDs ([see below](#-fast-root-cid-providing-for-immediate-content-discovery))
|
||||
|
||||
For background on the sweep provider design and motivations, see [`Provide.DHT.SweepEnabled`](https://github.com/ipfs/kubo/blob/master/docs/config.md#providedhtsweepenabled) and [ipshipyard.com#8](https://github.com/ipshipyard/ipshipyard.com/pull/8).
|
||||
For background on the sweep provider design and motivations, see [`Provide.DHT.SweepEnabled`](https://github.com/ipfs/kubo/blob/master/docs/config.md#providedhtsweepenabled) and Shipyard's blogpost [Provide Sweep: Solving the DHT Provide Bottleneck](https://ipshipyard.com/blog/2025-dht-provide-sweep/).
|
||||
|
||||
#### ⚡ Fast root CID providing for immediate content discovery
|
||||
|
||||
@ -72,22 +78,9 @@ ipfs dag import file.car # Same for CAR imports
|
||||
|
||||
**Configuration:** Set defaults via `Import.FastProvideRoot` (default: `true`) and `Import.FastProvideWait` (default: `false`). See `ipfs add --help` and `ipfs dag import --help` for more details and examples.
|
||||
|
||||
This optimization works best with the sweep provider and accelerated DHT client, where provide operations are significantly faster. Automatically skipped when DHT is unavailable (e.g., `Routing.Type=none` or delegated-only configurations).
|
||||
Fast root CID provide is automatically skipped when DHT routing is unavailable (e.g., `Routing.Type=none` or delegated-only configurations).
|
||||
|
||||
#### 📊 Detailed statistics for Sweep provider with `ipfs provide stat`
|
||||
|
||||
The Sweep provider system now exposes detailed statistics through `ipfs provide stat`, helping you monitor provider health and troubleshoot issues.
|
||||
|
||||
Run `ipfs provide stat` for a quick summary, or use `--all` to see complete metrics including connectivity status, queue sizes, reprovide schedules, network statistics, operation rates, and worker utilization. For real-time monitoring, use `watch ipfs provide stat --all --compact` to observe changes in a 2-column layout. Individual sections can be displayed with flags like `--network`, `--operations`, or `--workers`.
|
||||
|
||||
For Dual DHT configurations, use `--lan` to view LAN DHT statistics instead of the default WAN DHT stats.
|
||||
|
||||
For more information, run `ipfs provide stat --help` or see the [Provide Stats documentation](https://github.com/ipfs/kubo/blob/master/docs/provide-stats.md).
|
||||
|
||||
> [!NOTE]
|
||||
> Legacy provider (when `Provide.DHT.SweepEnabled=false`) shows basic statistics without flag support.
|
||||
|
||||
#### ⏯️ Provider resume cycle for improved reproviding reliability
|
||||
#### ⏯️ Provider state persists across restarts
|
||||
|
||||
The Sweep provider now persists the reprovide cycle state and automatically resumes where it left off after a restart. This brings several improvements:
|
||||
|
||||
@ -98,7 +91,20 @@ The Sweep provider now persists the reprovide cycle state and automatically resu
|
||||
|
||||
This feature improves reliability for nodes that experience intermittent connectivity or restarts.
|
||||
|
||||
#### 🔔 Sweep provider slow reprovide warnings
|
||||
#### 📊 Detailed statistics with `ipfs provide stat`
|
||||
|
||||
The Sweep provider system now exposes detailed statistics through `ipfs provide stat`, helping you monitor provider health and troubleshoot issues.
|
||||
|
||||
Run `ipfs provide stat` for a quick summary, or use `--all` to see complete metrics including connectivity status, queue sizes, reprovide schedules, network statistics, operation rates, and worker utilization. For real-time monitoring, use `watch ipfs provide stat --all --compact` to observe changes in a 2-column layout. Individual sections can be displayed with flags like `--network`, `--operations`, or `--workers`.
|
||||
|
||||
For Dual DHT configurations, use `--lan` to view LAN DHT statistics instead of the default WAN DHT stats.
|
||||
|
||||
For more information, run `ipfs provide stat --help` or see the [Provide Stats documentation](https://github.com/ipfs/kubo/blob/master/docs/provide-stats.md), including [Capacity Planning](https://github.com/ipfs/kubo/blob/master/docs/provide-stats.md#capacity-planning).
|
||||
|
||||
> [!NOTE]
|
||||
> Legacy provider (when `Provide.DHT.SweepEnabled=false`) shows basic statistics without flag support.
|
||||
|
||||
#### 🔔 Slow reprovide warnings
|
||||
|
||||
Kubo now monitors DHT reprovide operations when `Provide.DHT.SweepEnabled=true`
|
||||
and alerts you if your node is falling behind on reprovides.
|
||||
@ -120,7 +126,7 @@ The Amino DHT Sweep provider metric has been renamed from `total_provide_count_t
|
||||
|
||||
**Migration:** If you have Prometheus queries, dashboards, or alerts monitoring the old `total_provide_count_total` metric, update them to use `provider_provides_total` instead. This affects all nodes using sweep mode, which is now the default in v0.39 (previously opt-in experimental in v0.38).
|
||||
|
||||
#### 🔧 Fixed UPnP port forwarding after router restarts
|
||||
#### 🔧 Automatic UPnP recovery after router restarts
|
||||
|
||||
Kubo now automatically recovers UPnP port mappings when routers restart or
|
||||
become temporarily unavailable, fixing a critical connectivity issue that
|
||||
@ -144,20 +150,6 @@ without manual intervention.
|
||||
This significantly improves reliability for desktop and self-hosted IPFS nodes
|
||||
using UPnP for NAT traversal.
|
||||
|
||||
#### 🖥️ RISC-V support with prebuilt binaries
|
||||
|
||||
Kubo provides official `linux-riscv64` prebuilt binaries, bringing IPFS to [RISC-V](https://en.wikipedia.org/wiki/RISC-V) open hardware.
|
||||
|
||||
As RISC-V single-board computers and embedded systems become more accessible, the distributed web is now supported on open hardware architectures - a natural pairing of open technologies.
|
||||
|
||||
Download from <https://dist.ipfs.tech/kubo/> or <https://github.com/ipfs/kubo/releases> and look for the `linux-riscv64` archive.
|
||||
|
||||
#### 🚦 Gateway range request limits for CDN compatibility
|
||||
|
||||
The new [`Gateway.MaxRangeRequestFileSize`](https://github.com/ipfs/kubo/blob/master/docs/config.md#gatewaymaxrangerequestfilesize) configuration protects against CDN range request limitations that cause bandwidth overcharges on deserialized responses. Some CDNs convert range requests over large files into full file downloads, causing clients requesting small byte ranges to unknowingly download entire multi-gigabyte files.
|
||||
|
||||
This only impacts deserialized responses. Clients using verifiable block requests (`application/vnd.ipld.raw`) are not affected. See the [configuration documentation](https://github.com/ipfs/kubo/blob/master/docs/config.md#gatewaymaxrangerequestfilesize) for details.
|
||||
|
||||
#### 🪦 Deprecated `go-ipfs` name no longer published
|
||||
|
||||
The `go-ipfs` name was deprecated in 2022 and renamed to `kubo`. Starting with this release, the legacy Docker image name has been replaced with a stub that displays an error message directing users to switch to `ipfs/kubo`.
|
||||
@ -168,19 +160,205 @@ The `go-ipfs` name was deprecated in 2022 and renamed to `kubo`. Starting with t
|
||||
|
||||
All users should migrate to the `kubo` name in their scripts and configurations.
|
||||
|
||||
#### Routing V1 HTTP API now exposed by default
|
||||
#### 🚦 Gateway range request limits for CDN compatibility
|
||||
|
||||
The [Routing V1 HTTP API](https://specs.ipfs.tech/routing/http-routing-v1/) is now exposed by default at `http://127.0.0.1:8080/routing/v1`. This allows light clients in browsers to use Kubo Gateway as a delegated routing backend instead of running a full DHT client. Support for [IPIP-476: Delegated Routing DHT Closest Peers API](https://github.com/ipfs/specs/pull/476) is included. Can be disabled via [`Gateway.ExposeRoutingAPI`](https://github.com/ipfs/kubo/blob/master/docs/config.md#gatewayexposeroutingapi).
|
||||
The new [`Gateway.MaxRangeRequestFileSize`](https://github.com/ipfs/kubo/blob/master/docs/config.md#gatewaymaxrangerequestfilesize) configuration protects against CDN range request limitations that cause bandwidth overcharges on deserialized responses. Some CDNs convert range requests over large files into full file downloads, causing clients requesting small byte ranges to unknowingly download entire multi-gigabyte files.
|
||||
|
||||
This only impacts deserialized responses. Clients using verifiable block requests (`application/vnd.ipld.raw`) are not affected. See the [configuration documentation](https://github.com/ipfs/kubo/blob/master/docs/config.md#gatewaymaxrangerequestfilesize) for details.
|
||||
|
||||
#### 🖥️ RISC-V support with prebuilt binaries
|
||||
|
||||
Kubo provides official `linux-riscv64` prebuilt binaries, bringing IPFS to [RISC-V](https://en.wikipedia.org/wiki/RISC-V) open hardware.
|
||||
|
||||
As RISC-V single-board computers and embedded systems become more accessible, the distributed web is now supported on open hardware architectures - a natural pairing of open technologies.
|
||||
|
||||
Download from <https://dist.ipfs.tech/kubo/> or <https://github.com/ipfs/kubo/releases> and look for the `linux-riscv64` archive.
|
||||
|
||||
### 📦️ Important dependency updates
|
||||
|
||||
- update `go-libp2p` to [v0.45.0](https://github.com/libp2p/go-libp2p/releases/tag/v0.45.0) (incl. [v0.44.0](https://github.com/libp2p/go-libp2p/releases/tag/v0.44.0)) with self-healing UPnP port mappings and go-log/slog interop fixes
|
||||
- update `quic-go` to [v0.55.0](https://github.com/quic-go/quic-go/releases/tag/v0.55.0)
|
||||
- update `go-log` to [v2.9.0](https://github.com/ipfs/go-log/releases/tag/v2.9.0) with slog integration for go-libp2p
|
||||
- update `go-ds-pebble` to [v0.5.6](https://github.com/ipfs/go-ds-pebble/releases/tag/v0.5.6) (includes pebble [v2.1.1](https://github.com/cockroachdb/pebble/releases/tag/v2.1.1))
|
||||
- update `go-ds-pebble` to [v0.5.7](https://github.com/ipfs/go-ds-pebble/releases/tag/v0.5.7) (includes pebble [v2.1.2](https://github.com/cockroachdb/pebble/releases/tag/v2.1.2))
|
||||
- update `boxo` to [v0.35.2](https://github.com/ipfs/boxo/releases/tag/v0.35.2) (includes boxo [v0.35.1](https://github.com/ipfs/boxo/releases/tag/v0.35.1))
|
||||
- update `ipfs-webui` to [v4.10.0](https://github.com/ipfs/ipfs-webui/releases/tag/v4.10.0)
|
||||
- update `go-libp2p-kad-dht` to [v0.36.0](https://github.com/libp2p/go-libp2p-kad-dht/releases/tag/v0.36.0)
|
||||
|
||||
### 📝 Changelog
|
||||
|
||||
<details><summary>Full Changelog</summary>
|
||||
|
||||
- github.com/ipfs/kubo:
|
||||
- docs: mkreleaselog for 0.39
|
||||
- chore: version 0.39.0
|
||||
- bin/mkreleaselog: add github handle resolution and deduplication
|
||||
- docs: restructure v0.39 changelog for clarity
|
||||
- upgrade go-libp2p-kad-dht to v0.36.0 (#11079) ([ipfs/kubo#11079](https://github.com/ipfs/kubo/pull/11079))
|
||||
- fix(docker): include symlinks in scanning for init scripts (#11077) ([ipfs/kubo#11077](https://github.com/ipfs/kubo/pull/11077))
|
||||
- Update deprecation message for Reprovider fields (#11072) ([ipfs/kubo#11072](https://github.com/ipfs/kubo/pull/11072))
|
||||
- chore: release v0.39.0-rc1
|
||||
- test: add regression tests for config secrets protection (#11061) ([ipfs/kubo#11061](https://github.com/ipfs/kubo/pull/11061))
|
||||
- test: add regression tests for API.Authorizations (#11060) ([ipfs/kubo#11060](https://github.com/ipfs/kubo/pull/11060))
|
||||
- test: verifyWorkerRun and helptext (#11063) ([ipfs/kubo#11063](https://github.com/ipfs/kubo/pull/11063))
|
||||
- test(cmdutils): add tests for PathOrCidPath and ValidatePinName (#11062) ([ipfs/kubo#11062](https://github.com/ipfs/kubo/pull/11062))
|
||||
- fix: return original error in PathOrCidPath fallback (#11059) ([ipfs/kubo#11059](https://github.com/ipfs/kubo/pull/11059))
|
||||
- feat: fast provide support in `dag import` (#11058) ([ipfs/kubo#11058](https://github.com/ipfs/kubo/pull/11058))
|
||||
- feat(cli/rpc/add): fast provide of root CID (#11046) ([ipfs/kubo#11046](https://github.com/ipfs/kubo/pull/11046))
|
||||
- feat(telemetry): collect high level provide DHT sweep settings (#11056) ([ipfs/kubo#11056](https://github.com/ipfs/kubo/pull/11056))
|
||||
- feat: enable DHT Provide Sweep by default (#10955) ([ipfs/kubo#10955](https://github.com/ipfs/kubo/pull/10955))
|
||||
- feat(config): optional Gateway.MaxRangeRequestFileSize (#10997) ([ipfs/kubo#10997](https://github.com/ipfs/kubo/pull/10997))
|
||||
- docs: clarify provide stats metric types and calculations (#11041) ([ipfs/kubo#11041](https://github.com/ipfs/kubo/pull/11041))
|
||||
- Upgrade to Boxo v0.35.2 (#11050) ([ipfs/kubo#11050](https://github.com/ipfs/kubo/pull/11050))
|
||||
- fix(go-log@2.9/go-libp2p@0.45): dynamic log level control and tail (#11039) ([ipfs/kubo#11039](https://github.com/ipfs/kubo/pull/11039))
|
||||
- chore: update webui to v4.10.0 (#11048) ([ipfs/kubo#11048](https://github.com/ipfs/kubo/pull/11048))
|
||||
- fix(provider/stats): number format (#11045) ([ipfs/kubo#11045](https://github.com/ipfs/kubo/pull/11045))
|
||||
- provider: protect libp2p connections (#11028) ([ipfs/kubo#11028](https://github.com/ipfs/kubo/pull/11028))
|
||||
- Merge release v0.38.2 ([ipfs/kubo#11044](https://github.com/ipfs/kubo/pull/11044))
|
||||
- Upgrade to Boxo v0.35.1 (#11043) ([ipfs/kubo#11043](https://github.com/ipfs/kubo/pull/11043))
|
||||
- feat(provider): resume cycle (#11031) ([ipfs/kubo#11031](https://github.com/ipfs/kubo/pull/11031))
|
||||
- chore: upgrade pebble to v2.1.1 (#11040) ([ipfs/kubo#11040](https://github.com/ipfs/kubo/pull/11040))
|
||||
- fix(cli): provide stat cosmetics (#11034) ([ipfs/kubo#11034](https://github.com/ipfs/kubo/pull/11034))
|
||||
- fix: go-libp2p v0.44 with self-healing UPnP port mappings (#11032) ([ipfs/kubo#11032](https://github.com/ipfs/kubo/pull/11032))
|
||||
- feat(provide): slow reprovide alerts when SweepEnabled (#11021) ([ipfs/kubo#11021](https://github.com/ipfs/kubo/pull/11021))
|
||||
- feat: trace delegated routing http client (#11017) ([ipfs/kubo#11017](https://github.com/ipfs/kubo/pull/11017))
|
||||
- feat(provide): detailed `ipfs provide stat` (#11019) ([ipfs/kubo#11019](https://github.com/ipfs/kubo/pull/11019))
|
||||
- config: increase default Provide.DHT.MaxProvideConnsPerWorker (#11016) ([ipfs/kubo#11016](https://github.com/ipfs/kubo/pull/11016))
|
||||
- docs: update release checklist based on v0.38.0 learnings (#11007) ([ipfs/kubo#11007](https://github.com/ipfs/kubo/pull/11007))
|
||||
- chore: merge release v0.38.1 ([ipfs/kubo#11020](https://github.com/ipfs/kubo/pull/11020))
|
||||
- fix: migrations for Windows (#11010) ([ipfs/kubo#11010](https://github.com/ipfs/kubo/pull/11010))
|
||||
- Upgrade go-ds-pebble to v0.5.3 (#11011) ([ipfs/kubo#11011](https://github.com/ipfs/kubo/pull/11011))
|
||||
- Merge release v0.38.0 ([ipfs/kubo#11006](https://github.com/ipfs/kubo/pull/11006))
|
||||
- feat: add docker stub for deprecated ipfs/go-ipfs name (#10998) ([ipfs/kubo#10998](https://github.com/ipfs/kubo/pull/10998))
|
||||
- docs: add sweeping provide worker count recommendation (#11001) ([ipfs/kubo#11001](https://github.com/ipfs/kubo/pull/11001))
|
||||
- chore: bump go-libp2p-kad-dht to v0.35.0 (#11002) ([ipfs/kubo#11002](https://github.com/ipfs/kubo/pull/11002))
|
||||
- upgrade go-ds-pebble to v0.5.2 (#11000) ([ipfs/kubo#11000](https://github.com/ipfs/kubo/pull/11000))
|
||||
- Upgrade to Boxo v0.35.0 (#10999) ([ipfs/kubo#10999](https://github.com/ipfs/kubo/pull/10999))
|
||||
- Non-functional changes (#10996) ([ipfs/kubo#10996](https://github.com/ipfs/kubo/pull/10996))
|
||||
- chore: update boxo and kad-dht dependencies (#10995) ([ipfs/kubo#10995](https://github.com/ipfs/kubo/pull/10995))
|
||||
- fix: update webui to v4.9.1 (#10994) ([ipfs/kubo#10994](https://github.com/ipfs/kubo/pull/10994))
|
||||
- fix: provider merge conflicts (#10989) ([ipfs/kubo#10989](https://github.com/ipfs/kubo/pull/10989))
|
||||
- fix(mfs): add soft limit for `--flush=false` (#10985) ([ipfs/kubo#10985](https://github.com/ipfs/kubo/pull/10985))
|
||||
- fix: provide Filestore nodes (#10990) ([ipfs/kubo#10990](https://github.com/ipfs/kubo/pull/10990))
|
||||
- feat: limit pin names to 255 bytes (#10981) ([ipfs/kubo#10981](https://github.com/ipfs/kubo/pull/10981))
|
||||
- fix: SweepingProvider slow start (#10980) ([ipfs/kubo#10980](https://github.com/ipfs/kubo/pull/10980))
|
||||
- chore: start v0.39.0 release cycle
|
||||
- github.com/gammazero/deque (v1.1.0 -> v1.2.0):
|
||||
- add slice operation functions (#40) ([gammazero/deque#40](https://github.com/gammazero/deque/pull/40))
|
||||
- maintain base capacity after IterPop iteration (#44) ([gammazero/deque#44](https://github.com/gammazero/deque/pull/44))
|
||||
- github.com/ipfs/boxo (v0.35.1 -> v0.35.2):
|
||||
- Release v0.35.2 ([ipfs/boxo#1068](https://github.com/ipfs/boxo/pull/1068))
|
||||
- fix(logs): upgrade go-libp2p to v0.45.0 and go-log to v2.9.0 ([ipfs/boxo#1066](https://github.com/ipfs/boxo/pull/1066))
|
||||
- github.com/ipfs/go-cid (v0.5.0 -> v0.6.0):
|
||||
- v0.6.0 bump (#178) ([ipfs/go-cid#178](https://github.com/ipfs/go-cid/pull/178))
|
||||
- github.com/ipfs/go-ds-pebble (v0.5.3 -> v0.5.7):
|
||||
- new version (#74) ([ipfs/go-ds-pebble#74](https://github.com/ipfs/go-ds-pebble/pull/74))
|
||||
- do not override logger if logger is provided (#72) ([ipfs/go-ds-pebble#72](https://github.com/ipfs/go-ds-pebble/pull/72))
|
||||
- new version (#70) ([ipfs/go-ds-pebble#70](https://github.com/ipfs/go-ds-pebble/pull/70))
|
||||
- new-version (#68) ([ipfs/go-ds-pebble#68](https://github.com/ipfs/go-ds-pebble/pull/68))
|
||||
- Do not allow batch to be reused after commit (#67) ([ipfs/go-ds-pebble#67](https://github.com/ipfs/go-ds-pebble/pull/67))
|
||||
- new version (#66) ([ipfs/go-ds-pebble#66](https://github.com/ipfs/go-ds-pebble/pull/66))
|
||||
- Make pebble write options configurable ([ipfs/go-ds-pebble#63](https://github.com/ipfs/go-ds-pebble/pull/63))
|
||||
- github.com/ipfs/go-dsqueue (v0.1.0 -> v0.1.1):
|
||||
- new version (#26) ([ipfs/go-dsqueue#26](https://github.com/ipfs/go-dsqueue/pull/26))
|
||||
- update deque package and add stress test (#25) ([ipfs/go-dsqueue#25](https://github.com/ipfs/go-dsqueue/pull/25))
|
||||
- github.com/ipfs/go-log/v2 (v2.8.2 -> v2.9.0):
|
||||
- chore: release v2.9.0 (#177) ([ipfs/go-log#177](https://github.com/ipfs/go-log/pull/177))
|
||||
- fix: go-libp2p and slog interop (#176) ([ipfs/go-log#176](https://github.com/ipfs/go-log/pull/176))
|
||||
- github.com/libp2p/go-libp2p (v0.43.0 -> v0.45.0):
|
||||
- Release v0.45.0 (#3424) ([libp2p/go-libp2p#3424](https://github.com/libp2p/go-libp2p/pull/3424))
|
||||
- feat(gologshim): Add SetDefaultHandler (#3418) ([libp2p/go-libp2p#3418](https://github.com/libp2p/go-libp2p/pull/3418))
|
||||
- Update Drips ownedBy address in FUNDING.json
|
||||
- fix(websocket): use debug level for http.Server errors
|
||||
- chore: release v0.44.0
|
||||
- autonatv2: fix normalization for websocket addrs
|
||||
- autonatv2: remove dependency on webrtc and webtransport
|
||||
- quicreuse: update libp2p/go-netroute (#3405) ([libp2p/go-libp2p#3405](https://github.com/libp2p/go-libp2p/pull/3405))
|
||||
- basichost: don't advertise unreachable addrs. (#3357) ([libp2p/go-libp2p#3357](https://github.com/libp2p/go-libp2p/pull/3357))
|
||||
- basichost: improve autonatv2 reachability logic (#3356) ([libp2p/go-libp2p#3356](https://github.com/libp2p/go-libp2p/pull/3356))
|
||||
- basichost: fix lint error
|
||||
- basichost: move EvtLocalAddrsChanged to addrs_manager (#3355) ([libp2p/go-libp2p#3355](https://github.com/libp2p/go-libp2p/pull/3355))
|
||||
- chore: gitignore go.work files
|
||||
- refactor!: move insecure transport outside of core
|
||||
- refactor: drop go-varint dependency
|
||||
- refactor!: move canonicallog package outside of core
|
||||
- fix: assignment to entry in nil map
|
||||
- docs: Update contribute section with mailing list and irc (#3387) ([libp2p/go-libp2p#3387](https://github.com/libp2p/go-libp2p/pull/3387))
|
||||
- README: remove Drand from notable users section
|
||||
- chore: add help comment
|
||||
- refactor: replace context.WithCancel with t.Context
|
||||
- feat(network): Add Conn.As
|
||||
- Skip mdns tests on macOS in CI
|
||||
- fix: deduplicate NAT port mapping requests
|
||||
- fix: heal NAT mappings after router restart
|
||||
- feat: relay: add option for custom filter function
|
||||
- docs: remove broken link (#3375) ([libp2p/go-libp2p#3375](https://github.com/libp2p/go-libp2p/pull/3375))
|
||||
- AI tooling must be disclosed for contributions (#3372) ([libp2p/go-libp2p#3372](https://github.com/libp2p/go-libp2p/pull/3372))
|
||||
- feat: Migrate to log/slog (#3364) ([libp2p/go-libp2p#3364](https://github.com/libp2p/go-libp2p/pull/3364))
|
||||
- basichost: move observed address manager to basichost (#3332) ([libp2p/go-libp2p#3332](https://github.com/libp2p/go-libp2p/pull/3332))
|
||||
- chore: support Go 1.24 & 1.25 (#3366) ([libp2p/go-libp2p#3366](https://github.com/libp2p/go-libp2p/pull/3366))
|
||||
- feat(simlibp2p): Simulated libp2p Networks (#3262) ([libp2p/go-libp2p#3262](https://github.com/libp2p/go-libp2p/pull/3262))
|
||||
- bandwidthcounter: add Reset and TrimIdle methods to reporter interface (#3343) ([libp2p/go-libp2p#3343](https://github.com/libp2p/go-libp2p/pull/3343))
|
||||
- network: rename NAT Types (#3331) ([libp2p/go-libp2p#3331](https://github.com/libp2p/go-libp2p/pull/3331))
|
||||
- refactor(quicreuse): use errors.Join in Close method (#3363) ([libp2p/go-libp2p#3363](https://github.com/libp2p/go-libp2p/pull/3363))
|
||||
- swarm: move AddCertHashes to swarm (#3330) ([libp2p/go-libp2p#3330](https://github.com/libp2p/go-libp2p/pull/3330))
|
||||
- quicreuse: clean up associations for closed listeners. (#3306) ([libp2p/go-libp2p#3306](https://github.com/libp2p/go-libp2p/pull/3306))
|
||||
- github.com/libp2p/go-libp2p-kad-dht (v0.35.1 -> v0.36.0):
|
||||
- new version (#1204) ([libp2p/go-libp2p-kad-dht#1204](https://github.com/libp2p/go-libp2p-kad-dht/pull/1204))
|
||||
- update dependencies (#1205) ([libp2p/go-libp2p-kad-dht#1205](https://github.com/libp2p/go-libp2p-kad-dht/pull/1205))
|
||||
- fix(provider): protect `SweepingProvider.wg` (#1200) ([libp2p/go-libp2p-kad-dht#1200](https://github.com/libp2p/go-libp2p-kad-dht/pull/1200))
|
||||
- fix(ResettableKeystore): race when closing during reset (#1201) ([libp2p/go-libp2p-kad-dht#1201](https://github.com/libp2p/go-libp2p-kad-dht/pull/1201))
|
||||
- fix(provider): conflict resolution (#1199) ([libp2p/go-libp2p-kad-dht#1199](https://github.com/libp2p/go-libp2p-kad-dht/pull/1199))
|
||||
- fix(provider): remove from trie by pruning prefix (#1198) ([libp2p/go-libp2p-kad-dht#1198](https://github.com/libp2p/go-libp2p-kad-dht/pull/1198))
|
||||
- fix(provider): rename metric to follow OpenTelemetry conventions (#1195) ([libp2p/go-libp2p-kad-dht#1195](https://github.com/libp2p/go-libp2p-kad-dht/pull/1195))
|
||||
- fix(provider): resume cycle from persisted keystore (#1193) ([libp2p/go-libp2p-kad-dht#1193](https://github.com/libp2p/go-libp2p-kad-dht/pull/1193))
|
||||
- feat(provider): connectivity callbacks (#1194) ([libp2p/go-libp2p-kad-dht#1194](https://github.com/libp2p/go-libp2p-kad-dht/pull/1194))
|
||||
- feat(provider): trie iterators (#1189) ([libp2p/go-libp2p-kad-dht#1189](https://github.com/libp2p/go-libp2p-kad-dht/pull/1189))
|
||||
- refactor(provider): optimize memory when allocating keys to peers (#1187) ([libp2p/go-libp2p-kad-dht#1187](https://github.com/libp2p/go-libp2p-kad-dht/pull/1187))
|
||||
- refactor(keystore): track size (#1181) ([libp2p/go-libp2p-kad-dht#1181](https://github.com/libp2p/go-libp2p-kad-dht/pull/1181))
|
||||
- Remove go-libp2p-maintainers from codeowners (#1192) ([libp2p/go-libp2p-kad-dht#1192](https://github.com/libp2p/go-libp2p-kad-dht/pull/1192))
|
||||
- switch to bit256.NewKeyFromArray (#1188) ([libp2p/go-libp2p-kad-dht#1188](https://github.com/libp2p/go-libp2p-kad-dht/pull/1188))
|
||||
- fix(provider): `RegionsFromPeers` may return multiple regions (#1185) ([libp2p/go-libp2p-kad-dht#1185](https://github.com/libp2p/go-libp2p-kad-dht/pull/1185))
|
||||
- feat(provider): skip bootstrap reprovide (#1186) ([libp2p/go-libp2p-kad-dht#1186](https://github.com/libp2p/go-libp2p-kad-dht/pull/1186))
|
||||
- refactor(provider): use adaptive deadline for CycleStats cleanup (#1183) ([libp2p/go-libp2p-kad-dht#1183](https://github.com/libp2p/go-libp2p-kad-dht/pull/1183))
|
||||
- refactor(provider/stats): use int64 to avoid overflows (#1182) ([libp2p/go-libp2p-kad-dht#1182](https://github.com/libp2p/go-libp2p-kad-dht/pull/1182))
|
||||
- provider: trigger connectivity check when missing libp2p addresses (#1180) ([libp2p/go-libp2p-kad-dht#1180](https://github.com/libp2p/go-libp2p-kad-dht/pull/1180))
|
||||
- fix(provider): resume cycle (#1176) ([libp2p/go-libp2p-kad-dht#1176](https://github.com/libp2p/go-libp2p-kad-dht/pull/1176))
|
||||
- tests: fix flaky TestProvidesExpire (#1179) ([libp2p/go-libp2p-kad-dht#1179](https://github.com/libp2p/go-libp2p-kad-dht/pull/1179))
|
||||
- tests: fix flaky TestFindPeerWithQueryFilter (#1178) ([libp2p/go-libp2p-kad-dht#1178](https://github.com/libp2p/go-libp2p-kad-dht/pull/1178))
|
||||
- tests: fix #1175 (#1177) ([libp2p/go-libp2p-kad-dht#1177](https://github.com/libp2p/go-libp2p-kad-dht/pull/1177))
|
||||
- feat(provider): exit early region exploration if no new peers discovered (#1174) ([libp2p/go-libp2p-kad-dht#1174](https://github.com/libp2p/go-libp2p-kad-dht/pull/1174))
|
||||
- provider: protect connections (#1172) ([libp2p/go-libp2p-kad-dht#1172](https://github.com/libp2p/go-libp2p-kad-dht/pull/1172))
|
||||
- feat(provider): resume reprovides (#1170) ([libp2p/go-libp2p-kad-dht#1170](https://github.com/libp2p/go-libp2p-kad-dht/pull/1170))
|
||||
- fix(provider): custom logger name (#1173) ([libp2p/go-libp2p-kad-dht#1173](https://github.com/libp2p/go-libp2p-kad-dht/pull/1173))
|
||||
- feat(provider): persist provide queue (#1167) ([libp2p/go-libp2p-kad-dht#1167](https://github.com/libp2p/go-libp2p-kad-dht/pull/1167))
|
||||
- provider: stats (#1144) ([libp2p/go-libp2p-kad-dht#1144](https://github.com/libp2p/go-libp2p-kad-dht/pull/1144))
|
||||
- github.com/probe-lab/go-libdht (v0.3.0 -> v0.4.0):
|
||||
- chore: release v0.4.0 (#26) ([probe-lab/go-libdht#26](https://github.com/probe-lab/go-libdht/pull/26))
|
||||
- feat(key/bit256): memory optimized constructor (#25) ([probe-lab/go-libdht#25](https://github.com/probe-lab/go-libdht/pull/25))
|
||||
- refactor(trie): AddMany memory optimization (#24) ([probe-lab/go-libdht#24](https://github.com/probe-lab/go-libdht/pull/24))
|
||||
|
||||
</details>
|
||||
|
||||
### 👨👩👧👦 Contributors
|
||||
|
||||
| Contributor | Commits | Lines ± | Files Changed |
|
||||
|-------------|---------|---------|---------------|
|
||||
| [@guillaumemichel](https://github.com/guillaumemichel) | 41 | +9906/-1383 | 170 |
|
||||
| [@lidel](https://github.com/lidel) | 30 | +6652/-694 | 97 |
|
||||
| [@sukunrt](https://github.com/sukunrt) | 9 | +1618/-1524 | 39 |
|
||||
| [@MarcoPolo](https://github.com/MarcoPolo) | 17 | +1665/-1452 | 160 |
|
||||
| [@gammazero](https://github.com/gammazero) | 23 | +514/-53 | 29 |
|
||||
| [@Prabhat1308](https://github.com/Prabhat1308) | 1 | +197/-67 | 4 |
|
||||
| [@peterargue](https://github.com/peterargue) | 3 | +82/-25 | 5 |
|
||||
| [@cargoedit](https://github.com/cargoedit) | 1 | +35/-72 | 14 |
|
||||
| [@hsanjuan](https://github.com/hsanjuan) | 2 | +66/-29 | 5 |
|
||||
| [@shoriwe](https://github.com/shoriwe) | 1 | +68/-21 | 3 |
|
||||
| [@dennis-tra](https://github.com/dennis-tra) | 2 | +27/-2 | 2 |
|
||||
| [@Lil-Duckling-22](https://github.com/Lil-Duckling-22) | 1 | +4/-1 | 1 |
|
||||
| [@crStiv](https://github.com/crStiv) | 1 | +1/-3 | 1 |
|
||||
| [@cpeliciari](https://github.com/cpeliciari) | 1 | +3/-0 | 1 |
|
||||
| [@rvagg](https://github.com/rvagg) | 1 | +1/-1 | 1 |
|
||||
| [@p-shahi](https://github.com/p-shahi) | 1 | +1/-1 | 1 |
|
||||
| [@lbarrettanderson](https://github.com/lbarrettanderson) | 1 | +1/-1 | 1 |
|
||||
| [@filipremb](https://github.com/filipremb) | 1 | +1/-1 | 1 |
|
||||
| [@marten-seemann](https://github.com/marten-seemann) | 1 | +0/-1 | 1 |
|
||||
|
||||
@ -10,6 +10,7 @@ This release was brought to you by the [Shipyard](https://ipshipyard.com/) team.
|
||||
|
||||
- [Overview](#overview)
|
||||
- [🔦 Highlights](#-highlights)
|
||||
- [Routing V1 HTTP API now exposed by default](#routing-v1-http-api-now-exposed-by-default)
|
||||
- [📝 Changelog](#-changelog)
|
||||
- [👨👩👧👦 Contributors](#-contributors)
|
||||
|
||||
@ -17,6 +18,10 @@ This release was brought to you by the [Shipyard](https://ipshipyard.com/) team.
|
||||
|
||||
### 🔦 Highlights
|
||||
|
||||
#### Routing V1 HTTP API now exposed by default
|
||||
|
||||
The [Routing V1 HTTP API](https://specs.ipfs.tech/routing/http-routing-v1/) is now exposed by default at `http://127.0.0.1:8080/routing/v1`. This allows light clients in browsers to use Kubo Gateway as a delegated routing backend instead of running a full DHT client. Support for [IPIP-476: Delegated Routing DHT Closest Peers API](https://github.com/ipfs/specs/pull/476) is included. Can be disabled via [`Gateway.ExposeRoutingAPI`](https://github.com/ipfs/kubo/blob/master/docs/config.md#gatewayexposeroutingapi).
|
||||
|
||||
### 📝 Changelog
|
||||
|
||||
### 👨👩👧👦 Contributors
|
||||
|
||||
@ -1945,8 +1945,6 @@ map CIDs to your peer ID, enabling content discovery across the network.
|
||||
While designed to support multiple routing systems in the future, the current
|
||||
default configuration only supports [providing to the Amino DHT](#providedht).
|
||||
|
||||
<!-- TODO: See the [Reprovide Sweep blog post](https://github.com/ipshipyard/ipshipyard.com/pull/8) for detailed performance comparisons. -->
|
||||
|
||||
### `Provide.Enabled`
|
||||
|
||||
Controls whether Kubo provide and reprovide systems are enabled.
|
||||
@ -2118,6 +2116,7 @@ connections this setting can generate.
|
||||
> users. The system will only use workers as needed - unused resources won't be
|
||||
> consumed. Ensure you adjust the swarm [connection manager](#swarmconnmgr) and
|
||||
> [resource manager](#swarmresourcemgr) configuration accordingly.
|
||||
> See [Capacity Planning](https://github.com/ipfs/kubo/blob/master/docs/provide-stats.md#capacity-planning) for more details.
|
||||
|
||||
Default: `16`
|
||||
|
||||
@ -2189,6 +2188,8 @@ to `false`.
|
||||
>
|
||||
> Sweep mode achieves similar effectiveness to the Accelerated DHT client but with steady resource consumption.
|
||||
|
||||
For background on the sweep provider design and motivations, see Shipyard's blogpost [Provide Sweep: Solving the DHT Provide Bottleneck](https://ipshipyard.com/blog/2025-dht-provide-sweep/).
|
||||
|
||||
You can compare the effectiveness of sweep mode vs legacy mode by monitoring the appropriate metrics (see [Monitoring Provide Operations](#monitoring-provide-operations) above).
|
||||
|
||||
> [!NOTE]
|
||||
@ -2639,6 +2640,10 @@ prepared. This means operations like searching the DHT for particular peers or c
|
||||
- You can see if the DHT has been initially populated by running `ipfs stats dht`
|
||||
3. Currently, the accelerated DHT client is not compatible with LAN-based DHTs and will not perform operations against
|
||||
them
|
||||
4. (⚠️ 0.39 limitation) When used with [`Provide.DHT.SweepEnabled`](#providedhtsweepenabled), the sweep provider may
|
||||
fail to estimate DHT size during the accelerated client's network crawl, resulting in all CIDs grouped into a
|
||||
single region. Content still gets reprovided, but without sweep efficiency gains. Consider disabling the
|
||||
accelerated client when using sweep mode.
|
||||
|
||||
Default: `false`
|
||||
|
||||
|
||||
@ -75,7 +75,7 @@ require (
|
||||
github.com/ipfs/bbloom v0.0.4 // indirect
|
||||
github.com/ipfs/go-bitfield v1.1.0 // indirect
|
||||
github.com/ipfs/go-block-format v0.2.3 // indirect
|
||||
github.com/ipfs/go-cid v0.5.0 // indirect
|
||||
github.com/ipfs/go-cid v0.6.0 // indirect
|
||||
github.com/ipfs/go-cidutil v0.1.0 // indirect
|
||||
github.com/ipfs/go-datastore v0.9.0 // indirect
|
||||
github.com/ipfs/go-ds-badger v0.3.4 // indirect
|
||||
@ -115,7 +115,7 @@ require (
|
||||
github.com/libp2p/go-doh-resolver v0.5.0 // indirect
|
||||
github.com/libp2p/go-flow-metrics v0.3.0 // indirect
|
||||
github.com/libp2p/go-libp2p-asn-util v0.4.1 // indirect
|
||||
github.com/libp2p/go-libp2p-kad-dht v0.35.2-0.20251112013111-6d2d861e0abb // indirect
|
||||
github.com/libp2p/go-libp2p-kad-dht v0.36.0 // indirect
|
||||
github.com/libp2p/go-libp2p-kbucket v0.8.0 // indirect
|
||||
github.com/libp2p/go-libp2p-pubsub v0.14.2 // indirect
|
||||
github.com/libp2p/go-libp2p-pubsub-router v0.6.0 // indirect
|
||||
@ -212,14 +212,14 @@ require (
|
||||
go.uber.org/zap/exp v0.3.0 // indirect
|
||||
go.yaml.in/yaml/v2 v2.4.3 // indirect
|
||||
go4.org v0.0.0-20230225012048-214862532bf5 // indirect
|
||||
golang.org/x/crypto v0.43.0 // indirect
|
||||
golang.org/x/crypto v0.45.0 // indirect
|
||||
golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546 // indirect
|
||||
golang.org/x/mod v0.29.0 // indirect
|
||||
golang.org/x/net v0.46.0 // indirect
|
||||
golang.org/x/sync v0.17.0 // indirect
|
||||
golang.org/x/sys v0.37.0 // indirect
|
||||
golang.org/x/net v0.47.0 // indirect
|
||||
golang.org/x/sync v0.18.0 // indirect
|
||||
golang.org/x/sys v0.38.0 // indirect
|
||||
golang.org/x/telemetry v0.0.0-20251008203120-078029d740a8 // indirect
|
||||
golang.org/x/text v0.30.0 // indirect
|
||||
golang.org/x/text v0.31.0 // indirect
|
||||
golang.org/x/time v0.12.0 // indirect
|
||||
golang.org/x/tools v0.38.0 // indirect
|
||||
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect
|
||||
|
||||
@ -301,8 +301,8 @@ github.com/ipfs/go-block-format v0.2.3/go.mod h1:WJaQmPAKhD3LspLixqlqNFxiZ3BZ3xg
|
||||
github.com/ipfs/go-cid v0.0.3/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM=
|
||||
github.com/ipfs/go-cid v0.0.4/go.mod h1:4LLaPOQwmk5z9LBgQnpkivrx8BJjUyGwTXCd5Xfj6+M=
|
||||
github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I=
|
||||
github.com/ipfs/go-cid v0.5.0 h1:goEKKhaGm0ul11IHA7I6p1GmKz8kEYniqFopaB5Otwg=
|
||||
github.com/ipfs/go-cid v0.5.0/go.mod h1:0L7vmeNXpQpUS9vt+yEARkJ8rOg43DF3iPgn4GIN0mk=
|
||||
github.com/ipfs/go-cid v0.6.0 h1:DlOReBV1xhHBhhfy/gBNNTSyfOM6rLiIx9J7A4DGf30=
|
||||
github.com/ipfs/go-cid v0.6.0/go.mod h1:NC4kS1LZjzfhK40UGmpXv5/qD2kcMzACYJNntCUiDhQ=
|
||||
github.com/ipfs/go-cidutil v0.1.0 h1:RW5hO7Vcf16dplUU60Hs0AKDkQAVPVplr7lk97CFL+Q=
|
||||
github.com/ipfs/go-cidutil v0.1.0/go.mod h1:e7OEVBMIv9JaOxt9zaGEmAoSlXW9jdFZ5lP/0PwcfpA=
|
||||
github.com/ipfs/go-datastore v0.1.0/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE=
|
||||
@ -430,8 +430,8 @@ github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl9
|
||||
github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8=
|
||||
github.com/libp2p/go-libp2p-core v0.2.4/go.mod h1:STh4fdfa5vDYr0/SzYYeqnt+E6KfEV5VxfIrm0bcI0g=
|
||||
github.com/libp2p/go-libp2p-core v0.3.0/go.mod h1:ACp3DmS3/N64c2jDzcV429ukDpicbL6+TrrxANBjPGw=
|
||||
github.com/libp2p/go-libp2p-kad-dht v0.35.2-0.20251112013111-6d2d861e0abb h1:jOWsCSRZKnRgocz4Ocu25Yigh5ZUkar2zWt/bzBh43Q=
|
||||
github.com/libp2p/go-libp2p-kad-dht v0.35.2-0.20251112013111-6d2d861e0abb/go.mod h1:WIysu8hNWQN8t73dKyTNqiZdcYKRrGFl4wjzX4Gz6pQ=
|
||||
github.com/libp2p/go-libp2p-kad-dht v0.36.0 h1:7QuXhV36+Vyj+L6A7mrYkn2sYLrbRcbjvsYDu/gXhn8=
|
||||
github.com/libp2p/go-libp2p-kad-dht v0.36.0/go.mod h1:O24LxTH9Rt3I5XU8nmiA9VynS4TrTwAyj+zBJKB05vQ=
|
||||
github.com/libp2p/go-libp2p-kbucket v0.3.1/go.mod h1:oyjT5O7tS9CQurok++ERgc46YLwEpuGoFq9ubvoUOio=
|
||||
github.com/libp2p/go-libp2p-kbucket v0.8.0 h1:QAK7RzKJpYe+EuSEATAaaHYMYLkPDGC18m9jxPLnU8s=
|
||||
github.com/libp2p/go-libp2p-kbucket v0.8.0/go.mod h1:JMlxqcEyKwO6ox716eyC0hmiduSWZZl6JY93mGaaqc4=
|
||||
@ -842,8 +842,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y
|
||||
golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE=
|
||||
golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
|
||||
golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
|
||||
golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04=
|
||||
golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0=
|
||||
golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q=
|
||||
golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4=
|
||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
|
||||
@ -913,8 +913,8 @@ golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
|
||||
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
|
||||
golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
|
||||
golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
|
||||
golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4=
|
||||
golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210=
|
||||
golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY=
|
||||
golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU=
|
||||
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=
|
||||
@ -933,8 +933,8 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ
|
||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug=
|
||||
golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
|
||||
golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I=
|
||||
golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
|
||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
@ -981,8 +981,8 @@ golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ=
|
||||
golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
|
||||
golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc=
|
||||
golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
|
||||
golang.org/x/telemetry v0.0.0-20251008203120-078029d740a8 h1:LvzTn0GQhWuvKH/kVRS3R3bVAsdQWI7hvfLHGgh9+lU=
|
||||
golang.org/x/telemetry v0.0.0-20251008203120-078029d740a8/go.mod h1:Pi4ztBfryZoJEkyFTI5/Ocsu2jXyDr6iSdgJiYE/uwE=
|
||||
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
||||
@ -1004,8 +1004,8 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
||||
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
||||
golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
||||
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
||||
golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k=
|
||||
golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM=
|
||||
golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM=
|
||||
golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM=
|
||||
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
|
||||
@ -221,6 +221,11 @@ reprovide duration gives CIDs/min/worker.
|
||||
|
||||
Number of regions reprovided in the last cycle.
|
||||
|
||||
> [!NOTE]
|
||||
> (⚠️ 0.39 limitation) If this shows 1 region while using
|
||||
> [`Routing.AcceleratedDHTClient`](./config.md#routingaccelerateddhtclient), sweep mode lost
|
||||
> efficiency gains. Consider disabling the accelerated client. See [caveat 4](./config.md#routingaccelerateddhtclient).
|
||||
|
||||
## Workers
|
||||
|
||||
### Active workers
|
||||
@ -278,6 +283,9 @@ To check if your provide system has sufficient capacity:
|
||||
- High active workers with growing reprovide queue: Need more workers or network connectivity is limiting throughput
|
||||
- Low active workers with non-empty reprovide queue: Workers may be waiting for network or DHT operations
|
||||
- Check [Reachable peers](#reachable-peers) to diagnose network connectivity issues
|
||||
- (⚠️ 0.39 limitation) If [Regions scheduled](#regions-scheduled) shows 1 while using
|
||||
[`Routing.AcceleratedDHTClient`](./config.md#routingaccelerateddhtclient), consider disabling
|
||||
the accelerated client to restore sweep efficiency. See [caveat 4](./config.md#routingaccelerateddhtclient).
|
||||
|
||||
## See Also
|
||||
|
||||
|
||||
16
go.mod
16
go.mod
@ -26,7 +26,7 @@ require (
|
||||
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0
|
||||
github.com/ipfs/boxo v0.35.3-0.20251118170232-e71f50ea2263
|
||||
github.com/ipfs/go-block-format v0.2.3
|
||||
github.com/ipfs/go-cid v0.5.0
|
||||
github.com/ipfs/go-cid v0.6.0
|
||||
github.com/ipfs/go-cidutil v0.1.0
|
||||
github.com/ipfs/go-datastore v0.9.0
|
||||
github.com/ipfs/go-detect-race v0.0.1
|
||||
@ -55,7 +55,7 @@ require (
|
||||
github.com/libp2p/go-doh-resolver v0.5.0
|
||||
github.com/libp2p/go-libp2p v0.45.0
|
||||
github.com/libp2p/go-libp2p-http v0.5.0
|
||||
github.com/libp2p/go-libp2p-kad-dht v0.35.2-0.20251112013111-6d2d861e0abb
|
||||
github.com/libp2p/go-libp2p-kad-dht v0.36.0
|
||||
github.com/libp2p/go-libp2p-kbucket v0.8.0
|
||||
github.com/libp2p/go-libp2p-pubsub v0.14.2
|
||||
github.com/libp2p/go-libp2p-pubsub-router v0.6.0
|
||||
@ -90,11 +90,11 @@ require (
|
||||
go.uber.org/dig v1.19.0
|
||||
go.uber.org/fx v1.24.0
|
||||
go.uber.org/zap v1.27.0
|
||||
golang.org/x/crypto v0.43.0
|
||||
golang.org/x/crypto v0.45.0
|
||||
golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546
|
||||
golang.org/x/mod v0.29.0
|
||||
golang.org/x/sync v0.17.0
|
||||
golang.org/x/sys v0.37.0
|
||||
golang.org/x/sync v0.18.0
|
||||
golang.org/x/sys v0.38.0
|
||||
google.golang.org/protobuf v1.36.10
|
||||
)
|
||||
|
||||
@ -258,11 +258,11 @@ require (
|
||||
go.uber.org/zap/exp v0.3.0 // indirect
|
||||
go.yaml.in/yaml/v2 v2.4.3 // indirect
|
||||
go4.org v0.0.0-20230225012048-214862532bf5 // indirect
|
||||
golang.org/x/net v0.46.0 // indirect
|
||||
golang.org/x/net v0.47.0 // indirect
|
||||
golang.org/x/oauth2 v0.32.0 // indirect
|
||||
golang.org/x/telemetry v0.0.0-20251008203120-078029d740a8 // indirect
|
||||
golang.org/x/term v0.36.0 // indirect
|
||||
golang.org/x/text v0.30.0 // indirect
|
||||
golang.org/x/term v0.37.0 // indirect
|
||||
golang.org/x/text v0.31.0 // indirect
|
||||
golang.org/x/time v0.12.0 // indirect
|
||||
golang.org/x/tools v0.38.0 // indirect
|
||||
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect
|
||||
|
||||
32
go.sum
32
go.sum
@ -366,8 +366,8 @@ github.com/ipfs/go-block-format v0.2.3/go.mod h1:WJaQmPAKhD3LspLixqlqNFxiZ3BZ3xg
|
||||
github.com/ipfs/go-cid v0.0.3/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM=
|
||||
github.com/ipfs/go-cid v0.0.4/go.mod h1:4LLaPOQwmk5z9LBgQnpkivrx8BJjUyGwTXCd5Xfj6+M=
|
||||
github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I=
|
||||
github.com/ipfs/go-cid v0.5.0 h1:goEKKhaGm0ul11IHA7I6p1GmKz8kEYniqFopaB5Otwg=
|
||||
github.com/ipfs/go-cid v0.5.0/go.mod h1:0L7vmeNXpQpUS9vt+yEARkJ8rOg43DF3iPgn4GIN0mk=
|
||||
github.com/ipfs/go-cid v0.6.0 h1:DlOReBV1xhHBhhfy/gBNNTSyfOM6rLiIx9J7A4DGf30=
|
||||
github.com/ipfs/go-cid v0.6.0/go.mod h1:NC4kS1LZjzfhK40UGmpXv5/qD2kcMzACYJNntCUiDhQ=
|
||||
github.com/ipfs/go-cidutil v0.1.0 h1:RW5hO7Vcf16dplUU60Hs0AKDkQAVPVplr7lk97CFL+Q=
|
||||
github.com/ipfs/go-cidutil v0.1.0/go.mod h1:e7OEVBMIv9JaOxt9zaGEmAoSlXW9jdFZ5lP/0PwcfpA=
|
||||
github.com/ipfs/go-datastore v0.1.0/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE=
|
||||
@ -512,8 +512,8 @@ github.com/libp2p/go-libp2p-gostream v0.6.0 h1:QfAiWeQRce6pqnYfmIVWJFXNdDyfiR/qk
|
||||
github.com/libp2p/go-libp2p-gostream v0.6.0/go.mod h1:Nywu0gYZwfj7Jc91PQvbGU8dIpqbQQkjWgDuOrFaRdA=
|
||||
github.com/libp2p/go-libp2p-http v0.5.0 h1:+x0AbLaUuLBArHubbbNRTsgWz0RjNTy6DJLOxQ3/QBc=
|
||||
github.com/libp2p/go-libp2p-http v0.5.0/go.mod h1:glh87nZ35XCQyFsdzZps6+F4HYI6DctVFY5u1fehwSg=
|
||||
github.com/libp2p/go-libp2p-kad-dht v0.35.2-0.20251112013111-6d2d861e0abb h1:jOWsCSRZKnRgocz4Ocu25Yigh5ZUkar2zWt/bzBh43Q=
|
||||
github.com/libp2p/go-libp2p-kad-dht v0.35.2-0.20251112013111-6d2d861e0abb/go.mod h1:WIysu8hNWQN8t73dKyTNqiZdcYKRrGFl4wjzX4Gz6pQ=
|
||||
github.com/libp2p/go-libp2p-kad-dht v0.36.0 h1:7QuXhV36+Vyj+L6A7mrYkn2sYLrbRcbjvsYDu/gXhn8=
|
||||
github.com/libp2p/go-libp2p-kad-dht v0.36.0/go.mod h1:O24LxTH9Rt3I5XU8nmiA9VynS4TrTwAyj+zBJKB05vQ=
|
||||
github.com/libp2p/go-libp2p-kbucket v0.3.1/go.mod h1:oyjT5O7tS9CQurok++ERgc46YLwEpuGoFq9ubvoUOio=
|
||||
github.com/libp2p/go-libp2p-kbucket v0.8.0 h1:QAK7RzKJpYe+EuSEATAaaHYMYLkPDGC18m9jxPLnU8s=
|
||||
github.com/libp2p/go-libp2p-kbucket v0.8.0/go.mod h1:JMlxqcEyKwO6ox716eyC0hmiduSWZZl6JY93mGaaqc4=
|
||||
@ -1007,8 +1007,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y
|
||||
golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE=
|
||||
golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
|
||||
golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
|
||||
golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04=
|
||||
golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0=
|
||||
golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q=
|
||||
golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4=
|
||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
|
||||
@ -1097,8 +1097,8 @@ golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
|
||||
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
|
||||
golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
|
||||
golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
|
||||
golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4=
|
||||
golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210=
|
||||
golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY=
|
||||
golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU=
|
||||
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=
|
||||
@ -1125,8 +1125,8 @@ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJ
|
||||
golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug=
|
||||
golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
|
||||
golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I=
|
||||
golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
|
||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
@ -1194,8 +1194,8 @@ golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ=
|
||||
golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
|
||||
golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc=
|
||||
golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
|
||||
golang.org/x/telemetry v0.0.0-20251008203120-078029d740a8 h1:LvzTn0GQhWuvKH/kVRS3R3bVAsdQWI7hvfLHGgh9+lU=
|
||||
golang.org/x/telemetry v0.0.0-20251008203120-078029d740a8/go.mod h1:Pi4ztBfryZoJEkyFTI5/Ocsu2jXyDr6iSdgJiYE/uwE=
|
||||
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
||||
@ -1206,8 +1206,8 @@ golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY=
|
||||
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
|
||||
golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU=
|
||||
golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY=
|
||||
golang.org/x/term v0.36.0 h1:zMPR+aF8gfksFprF/Nc/rd1wRS1EI6nDBGyWAvDzx2Q=
|
||||
golang.org/x/term v0.36.0/go.mod h1:Qu394IJq6V6dCBRgwqshf3mPF85AqzYEzofzRdZkWss=
|
||||
golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU=
|
||||
golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254=
|
||||
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
@ -1219,8 +1219,8 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
||||
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
||||
golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
||||
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
||||
golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k=
|
||||
golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM=
|
||||
golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM=
|
||||
golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM=
|
||||
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
|
||||
@ -3,7 +3,6 @@ package migrations
|
||||
import (
|
||||
"bufio"
|
||||
"bytes"
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
@ -42,8 +41,7 @@ func TestGetDistPath(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestHttpFetch(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
|
||||
fetcher := NewHttpFetcher(testIpfsDist, testServer.URL, "", 0)
|
||||
|
||||
@ -79,8 +77,7 @@ func TestHttpFetch(t *testing.T) {
|
||||
func TestFetchBinary(t *testing.T) {
|
||||
tmpDir := t.TempDir()
|
||||
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
|
||||
fetcher := NewHttpFetcher(testIpfsDist, testServer.URL, "", 0)
|
||||
|
||||
@ -162,8 +159,7 @@ func TestFetchBinary(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestMultiFetcher(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
|
||||
badFetcher := NewHttpFetcher("", "bad-url", "", 0)
|
||||
fetcher := NewHttpFetcher(testIpfsDist, testServer.URL, "", 0)
|
||||
|
||||
@ -3,7 +3,6 @@ package ipfsfetcher
|
||||
import (
|
||||
"bufio"
|
||||
"bytes"
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
@ -23,8 +22,7 @@ func init() {
|
||||
func TestIpfsFetcher(t *testing.T) {
|
||||
skipUnlessEpic(t)
|
||||
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
|
||||
fetcher := NewIpfsFetcher("", 0, nil, "")
|
||||
defer fetcher.Close()
|
||||
@ -58,8 +56,7 @@ func TestIpfsFetcher(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestInitIpfsFetcher(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
|
||||
f := NewIpfsFetcher("", 0, nil, "")
|
||||
defer f.Close()
|
||||
|
||||
@ -15,8 +15,7 @@ import (
|
||||
func TestFindMigrations(t *testing.T) {
|
||||
tmpDir := t.TempDir()
|
||||
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
|
||||
migs, bins, err := findMigrations(ctx, 0, 5)
|
||||
if err != nil {
|
||||
@ -60,8 +59,7 @@ func TestFindMigrations(t *testing.T) {
|
||||
func TestFindMigrationsReverse(t *testing.T) {
|
||||
tmpDir := t.TempDir()
|
||||
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
|
||||
migs, bins, err := findMigrations(ctx, 5, 0)
|
||||
if err != nil {
|
||||
@ -103,8 +101,7 @@ func TestFindMigrationsReverse(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestFetchMigrations(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
|
||||
fetcher := NewHttpFetcher(testIpfsDist, testServer.URL, "", 0)
|
||||
|
||||
@ -156,8 +153,7 @@ func TestRunMigrations(t *testing.T) {
|
||||
|
||||
fetcher := NewHttpFetcher(testIpfsDist, testServer.URL, "", 0)
|
||||
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
|
||||
targetVer := 9
|
||||
|
||||
|
||||
@ -1,7 +1,6 @@
|
||||
package migrations
|
||||
|
||||
import (
|
||||
"context"
|
||||
"testing"
|
||||
|
||||
"github.com/blang/semver/v4"
|
||||
@ -10,8 +9,7 @@ import (
|
||||
const testDist = "go-ipfs"
|
||||
|
||||
func TestDistVersions(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
|
||||
fetcher := NewHttpFetcher(testIpfsDist, testServer.URL, "", 0)
|
||||
|
||||
@ -27,8 +25,7 @@ func TestDistVersions(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestLatestDistVersion(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
|
||||
fetcher := NewHttpFetcher(testIpfsDist, testServer.URL, "", 0)
|
||||
|
||||
|
||||
@ -139,7 +139,7 @@ require (
|
||||
github.com/ipfs/boxo v0.35.3-0.20251118170232-e71f50ea2263 // indirect
|
||||
github.com/ipfs/go-bitfield v1.1.0 // indirect
|
||||
github.com/ipfs/go-block-format v0.2.3 // indirect
|
||||
github.com/ipfs/go-cid v0.5.0 // indirect
|
||||
github.com/ipfs/go-cid v0.6.0 // indirect
|
||||
github.com/ipfs/go-datastore v0.9.0 // indirect
|
||||
github.com/ipfs/go-dsqueue v0.1.1 // indirect
|
||||
github.com/ipfs/go-ipfs-cmds v0.15.0 // indirect
|
||||
@ -184,7 +184,7 @@ require (
|
||||
github.com/libp2p/go-flow-metrics v0.3.0 // indirect
|
||||
github.com/libp2p/go-libp2p v0.45.0 // indirect
|
||||
github.com/libp2p/go-libp2p-asn-util v0.4.1 // indirect
|
||||
github.com/libp2p/go-libp2p-kad-dht v0.35.2-0.20251112013111-6d2d861e0abb // indirect
|
||||
github.com/libp2p/go-libp2p-kad-dht v0.36.0 // indirect
|
||||
github.com/libp2p/go-libp2p-kbucket v0.8.0 // indirect
|
||||
github.com/libp2p/go-libp2p-record v0.3.1 // indirect
|
||||
github.com/libp2p/go-libp2p-routing-helpers v0.7.5 // indirect
|
||||
@ -327,15 +327,15 @@ require (
|
||||
go.uber.org/zap v1.27.0 // indirect
|
||||
go.uber.org/zap/exp v0.3.0 // indirect
|
||||
go.yaml.in/yaml/v2 v2.4.3 // indirect
|
||||
golang.org/x/crypto v0.43.0 // indirect
|
||||
golang.org/x/crypto v0.45.0 // indirect
|
||||
golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546 // indirect
|
||||
golang.org/x/exp/typeparams v0.0.0-20250210185358-939b2ce775ac // indirect
|
||||
golang.org/x/mod v0.29.0 // indirect
|
||||
golang.org/x/net v0.46.0 // indirect
|
||||
golang.org/x/sync v0.17.0 // indirect
|
||||
golang.org/x/sys v0.37.0 // indirect
|
||||
golang.org/x/term v0.36.0 // indirect
|
||||
golang.org/x/text v0.30.0 // indirect
|
||||
golang.org/x/net v0.47.0 // indirect
|
||||
golang.org/x/sync v0.18.0 // indirect
|
||||
golang.org/x/sys v0.38.0 // indirect
|
||||
golang.org/x/term v0.37.0 // indirect
|
||||
golang.org/x/text v0.31.0 // indirect
|
||||
golang.org/x/time v0.12.0 // indirect
|
||||
golang.org/x/tools v0.38.0 // indirect
|
||||
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect
|
||||
|
||||
@ -340,8 +340,8 @@ github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbG
|
||||
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
|
||||
github.com/ipfs/go-block-format v0.2.3 h1:mpCuDaNXJ4wrBJLrtEaGFGXkferrw5eqVvzaHhtFKQk=
|
||||
github.com/ipfs/go-block-format v0.2.3/go.mod h1:WJaQmPAKhD3LspLixqlqNFxiZ3BZ3xgqxxoSR/76pnA=
|
||||
github.com/ipfs/go-cid v0.5.0 h1:goEKKhaGm0ul11IHA7I6p1GmKz8kEYniqFopaB5Otwg=
|
||||
github.com/ipfs/go-cid v0.5.0/go.mod h1:0L7vmeNXpQpUS9vt+yEARkJ8rOg43DF3iPgn4GIN0mk=
|
||||
github.com/ipfs/go-cid v0.6.0 h1:DlOReBV1xhHBhhfy/gBNNTSyfOM6rLiIx9J7A4DGf30=
|
||||
github.com/ipfs/go-cid v0.6.0/go.mod h1:NC4kS1LZjzfhK40UGmpXv5/qD2kcMzACYJNntCUiDhQ=
|
||||
github.com/ipfs/go-cidutil v0.1.0 h1:RW5hO7Vcf16dplUU60Hs0AKDkQAVPVplr7lk97CFL+Q=
|
||||
github.com/ipfs/go-cidutil v0.1.0/go.mod h1:e7OEVBMIv9JaOxt9zaGEmAoSlXW9jdFZ5lP/0PwcfpA=
|
||||
github.com/ipfs/go-datastore v0.9.0 h1:WocriPOayqalEsueHv6SdD4nPVl4rYMfYGLD4bqCZ+w=
|
||||
@ -464,8 +464,8 @@ github.com/libp2p/go-libp2p v0.45.0 h1:Pdhr2HsFXaYjtfiNcBP4CcRUONvbMFdH3puM9vV4T
|
||||
github.com/libp2p/go-libp2p v0.45.0/go.mod h1:NovCojezAt4dnDd4fH048K7PKEqH0UFYYqJRjIIu8zc=
|
||||
github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94=
|
||||
github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8=
|
||||
github.com/libp2p/go-libp2p-kad-dht v0.35.2-0.20251112013111-6d2d861e0abb h1:jOWsCSRZKnRgocz4Ocu25Yigh5ZUkar2zWt/bzBh43Q=
|
||||
github.com/libp2p/go-libp2p-kad-dht v0.35.2-0.20251112013111-6d2d861e0abb/go.mod h1:WIysu8hNWQN8t73dKyTNqiZdcYKRrGFl4wjzX4Gz6pQ=
|
||||
github.com/libp2p/go-libp2p-kad-dht v0.36.0 h1:7QuXhV36+Vyj+L6A7mrYkn2sYLrbRcbjvsYDu/gXhn8=
|
||||
github.com/libp2p/go-libp2p-kad-dht v0.36.0/go.mod h1:O24LxTH9Rt3I5XU8nmiA9VynS4TrTwAyj+zBJKB05vQ=
|
||||
github.com/libp2p/go-libp2p-kbucket v0.8.0 h1:QAK7RzKJpYe+EuSEATAaaHYMYLkPDGC18m9jxPLnU8s=
|
||||
github.com/libp2p/go-libp2p-kbucket v0.8.0/go.mod h1:JMlxqcEyKwO6ox716eyC0hmiduSWZZl6JY93mGaaqc4=
|
||||
github.com/libp2p/go-libp2p-record v0.3.1 h1:cly48Xi5GjNw5Wq+7gmjfBiG9HCzQVkiZOUZ8kUl+Fg=
|
||||
@ -915,8 +915,8 @@ golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98y
|
||||
golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
|
||||
golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
|
||||
golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
|
||||
golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04=
|
||||
golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0=
|
||||
golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q=
|
||||
golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4=
|
||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546 h1:mgKeJMpvi0yx/sU5GsxQ7p6s2wtOnGAHZWCHUM4KGzY=
|
||||
golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546/go.mod h1:j/pmGrbnkbPtQfxEe5D0VQhZC6qKbfKifgD0oM7sR70=
|
||||
@ -969,8 +969,8 @@ golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
|
||||
golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
|
||||
golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
|
||||
golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
|
||||
golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4=
|
||||
golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210=
|
||||
golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY=
|
||||
golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU=
|
||||
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=
|
||||
@ -989,8 +989,8 @@ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJ
|
||||
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
|
||||
golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
|
||||
golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug=
|
||||
golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
|
||||
golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I=
|
||||
golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
|
||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
@ -1020,8 +1020,8 @@ golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ=
|
||||
golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
|
||||
golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc=
|
||||
golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
|
||||
golang.org/x/telemetry v0.0.0-20251008203120-078029d740a8 h1:LvzTn0GQhWuvKH/kVRS3R3bVAsdQWI7hvfLHGgh9+lU=
|
||||
golang.org/x/telemetry v0.0.0-20251008203120-078029d740a8/go.mod h1:Pi4ztBfryZoJEkyFTI5/Ocsu2jXyDr6iSdgJiYE/uwE=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
@ -1035,8 +1035,8 @@ golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU=
|
||||
golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=
|
||||
golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=
|
||||
golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY=
|
||||
golang.org/x/term v0.36.0 h1:zMPR+aF8gfksFprF/Nc/rd1wRS1EI6nDBGyWAvDzx2Q=
|
||||
golang.org/x/term v0.36.0/go.mod h1:Qu394IJq6V6dCBRgwqshf3mPF85AqzYEzofzRdZkWss=
|
||||
golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU=
|
||||
golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||
@ -1050,8 +1050,8 @@ golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
||||
golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
||||
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
||||
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
||||
golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k=
|
||||
golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM=
|
||||
golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM=
|
||||
golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM=
|
||||
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE=
|
||||
|
||||
@ -2,7 +2,6 @@ package integrationtest
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"testing"
|
||||
|
||||
blocks "github.com/ipfs/go-block-format"
|
||||
@ -14,8 +13,7 @@ import (
|
||||
)
|
||||
|
||||
func TestBitswapWithoutRouting(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ctx := t.Context()
|
||||
const numPeers = 4
|
||||
|
||||
// create network
|
||||
|
||||
Loading…
Reference in New Issue
Block a user