dotcloud/docker

View on GitHub
distribution/pull_v2.go

Summary

Maintainability
F
1 wk
Test Coverage

File pull_v2.go has 874 lines of code (exceeds 500 allowed). Consider refactoring.
Open

package distribution // import "github.com/docker/docker/distribution"

import (
    "context"
    "encoding/json"
Severity: Major
Found in distribution/pull_v2.go - About 1 day to fix

    Method puller.pullSchema2Layers has a Cognitive Complexity of 54 (exceeds 20 allowed). Consider refactoring.
    Open

    func (p *puller) pullSchema2Layers(ctx context.Context, target distribution.Descriptor, layers []distribution.Descriptor, platform *ocispec.Platform) (id digest.Digest, err error) {
        if _, err := p.config.ImageStore.Get(ctx, target.Digest); err == nil {
            // If the image already exists locally, no need to pull
            // anything.
            return target.Digest, nil
    Severity: Minor
    Found in distribution/pull_v2.go - About 5 hrs to fix

    Cognitive Complexity

    Cognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.

    A method's cognitive complexity is based on a few simple rules:

    • Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one
    • Code is considered more complex for each "break in the linear flow of the code"
    • Code is considered more complex when "flow breaking structures are nested"

    Further reading

    Method puller.pullTag has a Cognitive Complexity of 48 (exceeds 20 allowed). Consider refactoring.
    Open

    func (p *puller) pullTag(ctx context.Context, ref reference.Named, platform *ocispec.Platform) (tagUpdated bool, err error) {
        var (
            tagOrDigest string // Used for logging/progress only
            dgst        digest.Digest
            mt          string
    Severity: Minor
    Found in distribution/pull_v2.go - About 4 hrs to fix

    Cognitive Complexity

    Cognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.

    A method's cognitive complexity is based on a few simple rules:

    • Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one
    • Code is considered more complex for each "break in the linear flow of the code"
    • Code is considered more complex when "flow breaking structures are nested"

    Further reading

    Method layerDescriptor.Download has a Cognitive Complexity of 48 (exceeds 20 allowed). Consider refactoring.
    Open

    func (ld *layerDescriptor) Download(ctx context.Context, progressOutput progress.Output) (io.ReadCloser, int64, error) {
        log.G(ctx).Debugf("pulling blob %q", ld.digest)
    
        var (
            err    error
    Severity: Minor
    Found in distribution/pull_v2.go - About 4 hrs to fix

    Cognitive Complexity

    Cognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.

    A method's cognitive complexity is based on a few simple rules:

    • Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one
    • Code is considered more complex for each "break in the linear flow of the code"
    • Code is considered more complex when "flow breaking structures are nested"

    Further reading

    Method puller.pullSchema2Layers has 134 lines of code (exceeds 50 allowed). Consider refactoring.
    Open

    func (p *puller) pullSchema2Layers(ctx context.Context, target distribution.Descriptor, layers []distribution.Descriptor, platform *ocispec.Platform) (id digest.Digest, err error) {
        if _, err := p.config.ImageStore.Get(ctx, target.Digest); err == nil {
            // If the image already exists locally, no need to pull
            // anything.
            return target.Digest, nil
    Severity: Major
    Found in distribution/pull_v2.go - About 4 hrs to fix

      Method puller.pullTag has 124 lines of code (exceeds 50 allowed). Consider refactoring.
      Open

      func (p *puller) pullTag(ctx context.Context, ref reference.Named, platform *ocispec.Platform) (tagUpdated bool, err error) {
          var (
              tagOrDigest string // Used for logging/progress only
              dgst        digest.Digest
              mt          string
      Severity: Major
      Found in distribution/pull_v2.go - About 3 hrs to fix

        Method layerDescriptor.Download has 106 lines of code (exceeds 50 allowed). Consider refactoring.
        Open

        func (ld *layerDescriptor) Download(ctx context.Context, progressOutput progress.Output) (io.ReadCloser, int64, error) {
            log.G(ctx).Debugf("pulling blob %q", ld.digest)
        
            var (
                err    error
        Severity: Major
        Found in distribution/pull_v2.go - About 3 hrs to fix

          Method puller.pullManifestList has a Cognitive Complexity of 30 (exceeds 20 allowed). Consider refactoring.
          Open

          func (p *puller) pullManifestList(ctx context.Context, ref reference.Named, mfstList *manifestlist.DeserializedManifestList, pp *ocispec.Platform) (id digest.Digest, manifestListDigest digest.Digest, err error) {
              manifestListDigest, err = schema2ManifestDigest(ref, mfstList)
              if err != nil {
                  return "", "", err
              }
          Severity: Minor
          Found in distribution/pull_v2.go - About 1 hr to fix

          Cognitive Complexity

          Cognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.

          A method's cognitive complexity is based on a few simple rules:

          • Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one
          • Code is considered more complex for each "break in the linear flow of the code"
          • Code is considered more complex when "flow breaking structures are nested"

          Further reading

          Method puller.pullSchema2Layers has 18 return statements (exceeds 4 allowed).
          Open

          func (p *puller) pullSchema2Layers(ctx context.Context, target distribution.Descriptor, layers []distribution.Descriptor, platform *ocispec.Platform) (id digest.Digest, err error) {
              if _, err := p.config.ImageStore.Get(ctx, target.Digest); err == nil {
                  // If the image already exists locally, no need to pull
                  // anything.
                  return target.Digest, nil
          Severity: Major
          Found in distribution/pull_v2.go - About 1 hr to fix

            Method puller.pullManifestList has 66 lines of code (exceeds 50 allowed). Consider refactoring.
            Open

            func (p *puller) pullManifestList(ctx context.Context, ref reference.Named, mfstList *manifestlist.DeserializedManifestList, pp *ocispec.Platform) (id digest.Digest, manifestListDigest digest.Digest, err error) {
                manifestListDigest, err = schema2ManifestDigest(ref, mfstList)
                if err != nil {
                    return "", "", err
                }
            Severity: Minor
            Found in distribution/pull_v2.go - About 1 hr to fix

              Method puller.pullTag has 17 return statements (exceeds 4 allowed).
              Open

              func (p *puller) pullTag(ctx context.Context, ref reference.Named, platform *ocispec.Platform) (tagUpdated bool, err error) {
                  var (
                      tagOrDigest string // Used for logging/progress only
                      dgst        digest.Digest
                      mt          string
              Severity: Major
              Found in distribution/pull_v2.go - About 1 hr to fix

                Method layerDescriptor.Download has 15 return statements (exceeds 4 allowed).
                Open

                func (ld *layerDescriptor) Download(ctx context.Context, progressOutput progress.Output) (io.ReadCloser, int64, error) {
                    log.G(ctx).Debugf("pulling blob %q", ld.digest)
                
                    var (
                        err    error
                Severity: Major
                Found in distribution/pull_v2.go - About 1 hr to fix

                  Method puller.pullSchema1 has 59 lines of code (exceeds 50 allowed). Consider refactoring.
                  Open

                  func (p *puller) pullSchema1(ctx context.Context, ref reference.Reference, unverifiedManifest *schema1.SignedManifest, platform *ocispec.Platform) (id digest.Digest, manifestDigest digest.Digest, err error) {
                      if platform != nil {
                          // Early bath if the requested OS doesn't match that of the configuration.
                          // This avoids doing the download, only to potentially fail later.
                          if err := image.CheckOS(platform.OS); err != nil {
                  Severity: Minor
                  Found in distribution/pull_v2.go - About 1 hr to fix

                    Method puller.pullSchema1 has 10 return statements (exceeds 4 allowed).
                    Open

                    func (p *puller) pullSchema1(ctx context.Context, ref reference.Reference, unverifiedManifest *schema1.SignedManifest, platform *ocispec.Platform) (id digest.Digest, manifestDigest digest.Digest, err error) {
                        if platform != nil {
                            // Early bath if the requested OS doesn't match that of the configuration.
                            // This avoids doing the download, only to potentially fail later.
                            if err := image.CheckOS(platform.OS); err != nil {
                    Severity: Major
                    Found in distribution/pull_v2.go - About 1 hr to fix

                      Method puller.pullManifestList has 10 return statements (exceeds 4 allowed).
                      Open

                      func (p *puller) pullManifestList(ctx context.Context, ref reference.Named, mfstList *manifestlist.DeserializedManifestList, pp *ocispec.Platform) (id digest.Digest, manifestListDigest digest.Digest, err error) {
                          manifestListDigest, err = schema2ManifestDigest(ref, mfstList)
                          if err != nil {
                              return "", "", err
                          }
                      Severity: Major
                      Found in distribution/pull_v2.go - About 1 hr to fix

                        Method puller.pullRepository has 6 return statements (exceeds 4 allowed).
                        Open

                        func (p *puller) pullRepository(ctx context.Context, ref reference.Named) (err error) {
                            var layersDownloaded bool
                            if !reference.IsNameOnly(ref) {
                                layersDownloaded, err = p.pullTag(ctx, ref, p.config.Platform)
                                if err != nil {
                        Severity: Major
                        Found in distribution/pull_v2.go - About 40 mins to fix

                          Consider simplifying this complex logical expression.
                          Open

                              if p.OS == "" && p.Architecture == "" && p.Variant == "" && p.OSVersion == "" && p.OSFeatures == nil && p.Features == nil {
                          Severity: Major
                          Found in distribution/pull_v2.go - About 40 mins to fix

                            Function verifySchema1Manifest has 6 return statements (exceeds 4 allowed).
                            Open

                            func verifySchema1Manifest(signedManifest *schema1.SignedManifest, ref reference.Reference) (m *schema1.Manifest, err error) {
                                // If pull by digest, then verify the manifest digest. NOTE: It is
                                // important to do this first, before any other content validation. If the
                                // digest cannot be verified, don't even bother with those other things.
                                if digested, isCanonical := ref.(reference.Canonical); isCanonical {
                            Severity: Major
                            Found in distribution/pull_v2.go - About 40 mins to fix

                              Function fixManifestLayers has 6 return statements (exceeds 4 allowed).
                              Open

                              func fixManifestLayers(m *schema1.Manifest) error {
                                  imgs := make([]*image.V1Image, len(m.FSLayers))
                                  for i := range m.FSLayers {
                                      img := &image.V1Image{}
                              
                              
                              Severity: Major
                              Found in distribution/pull_v2.go - About 40 mins to fix

                                Function schema2ManifestDigest has 5 return statements (exceeds 4 allowed).
                                Open

                                func schema2ManifestDigest(ref reference.Named, mfst distribution.Manifest) (digest.Digest, error) {
                                    _, canonical, err := mfst.Payload()
                                    if err != nil {
                                        return "", err
                                    }
                                Severity: Major
                                Found in distribution/pull_v2.go - About 35 mins to fix

                                  Method puller.pullSchema2Config has 5 return statements (exceeds 4 allowed).
                                  Open

                                  func (p *puller) pullSchema2Config(ctx context.Context, dgst digest.Digest) (configJSON []byte, err error) {
                                      blobs := p.repo.Blobs(ctx)
                                      err = retry(ctx, defaultMaxSchemaPullAttempts, defaultSchemaPullBackoff, func(ctx context.Context) (err error) {
                                          configJSON, err = blobs.Get(ctx, dgst)
                                          return err
                                  Severity: Major
                                  Found in distribution/pull_v2.go - About 35 mins to fix

                                    Similar blocks of code found in 2 locations. Consider refactoring.
                                    Open

                                    func (p *puller) pullSchema2(ctx context.Context, ref reference.Named, mfst *schema2.DeserializedManifest, platform *ocispec.Platform) (id digest.Digest, manifestDigest digest.Digest, err error) {
                                        manifestDigest, err = schema2ManifestDigest(ref, mfst)
                                        if err != nil {
                                            return "", "", err
                                        }
                                    Severity: Major
                                    Found in distribution/pull_v2.go and 1 other location - About 1 hr to fix
                                    distribution/pull_v2.go on lines 797..804

                                    Duplicated Code

                                    Duplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:

                                    Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.

                                    When you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).

                                    Tuning

                                    This issue has a mass of 145.

                                    We set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.

                                    The threshold configuration represents the minimum mass a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.

                                    If the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.

                                    See codeclimate-duplication's documentation for more information about tuning the mass threshold in your .codeclimate.yml.

                                    Refactorings

                                    Further Reading

                                    Similar blocks of code found in 2 locations. Consider refactoring.
                                    Open

                                    func (p *puller) pullOCI(ctx context.Context, ref reference.Named, mfst *ocischema.DeserializedManifest, platform *ocispec.Platform) (id digest.Digest, manifestDigest digest.Digest, err error) {
                                        manifestDigest, err = schema2ManifestDigest(ref, mfst)
                                        if err != nil {
                                            return "", "", err
                                        }
                                    Severity: Major
                                    Found in distribution/pull_v2.go and 1 other location - About 1 hr to fix
                                    distribution/pull_v2.go on lines 788..795

                                    Duplicated Code

                                    Duplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:

                                    Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.

                                    When you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).

                                    Tuning

                                    This issue has a mass of 145.

                                    We set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.

                                    The threshold configuration represents the minimum mass a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.

                                    If the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.

                                    See codeclimate-duplication's documentation for more information about tuning the mass threshold in your .codeclimate.yml.

                                    Refactorings

                                    Further Reading

                                    There are no issues that match your filters.

                                    Category
                                    Status