// Copyright 2020 The Monogon Project Authors.
//
// SPDX-License-Identifier: Apache-2.0
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package main

func depsContainerd(p *planner) {
	p.collectOverride(
		"github.com/containerd/containerd", "v1.4.3",
		buildTags("no_zfs", "no_aufs", "no_devicemapper", "no_btrfs"),
		disabledProtoBuild,
	).use(
		"github.com/BurntSushi/toml",
		"github.com/Microsoft/go-winio",
		"github.com/beorn7/perks",
		"github.com/cespare/xxhash/v2",
		"github.com/cilium/ebpf",
		"github.com/containerd/btrfs",
		"github.com/containerd/console",
		"github.com/containerd/continuity",
		"github.com/containerd/fifo",
		"github.com/containerd/go-cni",
		"github.com/containerd/go-runc",
		"github.com/containerd/imgcrypt",
		"github.com/containers/ocicrypt",
		"github.com/containerd/typeurl",
		"github.com/containernetworking/cni",
		"github.com/coreos/go-systemd/v22",
		"github.com/cpuguy83/go-md2man/v2",
		"github.com/davecgh/go-spew",
		"github.com/docker/docker",
		"github.com/docker/go-events",
		"github.com/docker/go-metrics",
		"github.com/docker/go-units",
		"github.com/docker/spdystream",
		"github.com/emicklei/go-restful",
		"github.com/fullsailor/pkcs7",
		"github.com/godbus/dbus/v5",
		"github.com/gogo/protobuf",
		"github.com/go-logr/logr",
		"github.com/google/gofuzz",
		"github.com/google/uuid",
		"github.com/hashicorp/errwrap",
		"github.com/hashicorp/go-multierror",
		"github.com/hashicorp/golang-lru",
		"github.com/imdario/mergo",
		"github.com/json-iterator/go",
		"github.com/konsorten/go-windows-terminal-sequences",
		"github.com/matttproud/golang_protobuf_extensions",
		"github.com/modern-go/concurrent",
		"github.com/modern-go/reflect2",
		"github.com/opencontainers/go-digest",
		"github.com/opencontainers/image-spec",
		"github.com/opencontainers/runc",
		"github.com/opencontainers/runtime-spec",
		"github.com/pkg/errors",
		"github.com/prometheus/client_golang",
		"github.com/prometheus/client_model",
		"github.com/prometheus/common",
		"github.com/prometheus/procfs",
		"github.com/russross/blackfriday/v2",
		"github.com/shurcooL/sanitized_anchor_name",
		"github.com/sirupsen/logrus",
		"github.com/syndtr/gocapability",
		"github.com/tchap/go-patricia",
		"github.com/urfave/cli",
		"go.etcd.io/bbolt",
		"go.opencensus.io",
		"golang.org/x/crypto",
		"golang.org/x/oauth2",
		"golang.org/x/sync",
		"google.golang.org/genproto",
		"gopkg.in/inf.v0",
		"gopkg.in/yaml.v2",
		"k8s.io/klog/v2",
		"sigs.k8s.io/yaml",
	).with(disabledProtoBuild).use(
		"github.com/Microsoft/hcsshim",
		"github.com/containerd/cgroups",
		"github.com/containerd/cri",
		"github.com/gogo/googleapis",
	).with(buildTags("selinux")).use(
		"github.com/opencontainers/selinux",
		"github.com/willf/bitset",
	).with(patches(
		"ttrpc-hacks.patch",
	)).use(
		"github.com/containerd/ttrpc",
	).replace(
		// ttrpc is broken by go protobuf v2, this is a tentative PR that's
		// not yet merged by upstream.
		// See: https://github.com/containerd/ttrpc/pull/67
		//
		// It also contains our own fix that builds up on the above and allows
		// services to return the original status error library values. This is
		// required for ttrpc to actually work from runsc and for results to be
		// correctly interpreted by containerd.
		// See: https://github.com/monogon-dev/ttrpc/commit/222b428f008e3ecb11cfff12e3fd92e3143a2f01
		//
		// Note: this is not a good fix, and has known issues, like not being
		// able to return Details in gRPC status errors. However, with the
		// limited usage within gvisor/containerd it works. In the future
		// upstream will have to resolve this properly, eg. port ttrpc away
		// from gogo, or fix gogo to work with the new protobuf APU.
		"github.com/containerd/ttrpc",
		"github.com/monogon-dev/ttrpc", "222b428f008e3ecb11cfff12e3fd92e3143a2f01",
	)

	// This is depended on by github.com/containerd/containerd, but not mentioned in their
	// vendor.conf. They seem to be moving off of vendoring to gomod, so this should be
	// reverted on the next containerd bump (when fietsje will panic about vendor.conf
	// missing).
	p.collectOverride(
		"github.com/checkpoint-restore/go-criu/v4", "v4.1.0",
	)

	// containernetworking/plugins
	p.collectOverride(
		"github.com/containernetworking/plugins", "v0.8.2",
	).use(
		"github.com/alexflint/go-filemutex",
		"github.com/coreos/go-iptables",
		"github.com/j-keck/arping",
		"github.com/safchain/ethtool",
	)
}
