66 Commits

Author SHA1 Message Date
6761dbf419 test(docker-compose): add further tests regrading depends_on
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2025-02-25 16:21:13 +01:00
ab282e5173 feat: support depends_on
All checks were successful
continuous-integration/drone/push Build is passing
This PR supports the extended pattern of `depends_on`. If the short version of
`depends_on` is defined, it will be migrated to the extended version like the
example below:

```yaml
services:
  web:
    depends_on
    - database

services:
  web:
    depends_on:
      database:
        condition: service_started
```

All three types of merging strategies are supported.
2025-02-24 22:44:11 +01:00
003db26fe5 feat: respect individual ports instead of replacing the entire slice of ports
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
The following patch adapts the logic of the merge strategy existing and last
win for service ports.

In the past, the complete object has been replaced based on the merge strategy.
This behavior has been adapted, that each port should now considered
individually per strategy.

Both strategies now focus on the src port of the host system. With a last-win,
the dest port of the container is overwritten with an existing src port.

```diff
  service:
    my-app:
      ports:
- - 0.0.0.0:8080:80
+ - 0.0.0.0:8080:8080
      - 0.0.0.0:8443:8443
```

The situation is different with the existing win strategy. There, the destination
port can no longer be changed once there is a connection with a sourc port.
2025-02-21 13:55:53 +01:00
f8b4fe9af6 fix(dockerCompoe): compare srcIP and srcPort of mergeExistingWinPorts() 2025-02-21 09:51:53 +01:00
2c91222753 chore(renovate): disable go package gopkg.in/yaml.v2
All checks were successful
continuous-integration/drone/push Build is passing
2025-02-20 17:29:39 +01:00
b45f8181aa style(lint): block unused parameter
All checks were successful
continuous-integration/drone/push Build is passing
2025-02-20 17:26:43 +01:00
13301cb367 fix(dockerCompose): add further methods of port
This patch adds the following methods:

ports.ExistsDstIP()
ports.ExistsDstPort()
ports.ExistsProtocol()
ports.ExistsSrcIP()
ports.ExistsSrcPort()
ports.GetDstIP()
ports.GetDstPort()
ports.GetProtocol()
ports.GetSrcIP()
ports.GetSrcPort()
2025-02-20 17:26:43 +01:00
0a68b2d8e7 fix(dockerCompose): add port.ExistProtocol 2025-02-20 17:26:43 +01:00
54af4469a4 chore(deps): update docker.io/plugins/docker docker tag to v20.18.7
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-02-18 08:08:41 +00:00
dc15512229 chore(deps): update module github.com/spf13/cobra to v1.9.1
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-02-17 02:10:59 +00:00
5fa0991bc2 chore(deps): update docker.io/library/golang docker tag to v1.24.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-02-15 23:09:33 +00:00
efb5fba9a9 chore(deps): update module github.com/spf13/cobra to v1.9.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-02-15 20:12:23 +00:00
c8894de28c chore(deps): update docker.io/library/golang docker tag to v1.23.6
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-02-05 23:22:50 +00:00
da34769ff3 chore(deps): update docker.io/library/golang docker tag to v1.23.5
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-01-17 02:09:57 +00:00
1a9fa39c94 chore(deps): update docker.io/plugins/docker docker tag to v20.18.6
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2024-12-25 05:07:40 +00:00
554c73bd7b chore(deps): update docker.io/library/golang docker tag to v1.23.4
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2024-12-06 05:06:28 +00:00
ea0bb14ac4 chore(deps): update docker.io/library/alpine docker tag to v3.21
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2024-12-05 23:07:30 +00:00
20b4f12dd1 chore(deps): update git.cryptic.systems/volker.raschek/markdownlint docker tag to v0.43.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2024-12-03 14:10:12 +00:00
f2dc3d5174 fix(fetcher): handle all os.Stat() errors
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2024-12-03 11:09:38 +01:00
37de3302c6 chore(deps): update docker.io/plugins/docker docker tag to v20.18.5
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2024-11-29 11:08:17 +00:00
57dff5ff36 chore(deps): update git.cryptic.systems/volker.raschek/git docker tag to v1.4.0
Some checks reported errors
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build encountered an error
2024-11-25 23:08:50 +00:00
f0f5e586d9 chore(deps): update module github.com/stretchr/testify to v1.10.0
Some checks reported errors
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build encountered an error
2024-11-23 14:06:33 +00:00
0cd81642bb chore(deps): update quay.io/skopeo/stable docker tag to v1.17.0
Some checks reported errors
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build encountered an error
2024-11-21 17:08:04 +00:00
e6e3b0d4fc chore(deps): update docker.io/library/golang docker tag to v1.23.3
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2024-11-07 08:06:11 +00:00
e66b2045f2 chore(deps): update git.cryptic.systems/volker.raschek/markdownlint docker tag to v0.42.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2024-10-14 19:09:18 +00:00
141779c2a0 chore(deps): update docker.io/library/golang docker tag to v1.23.2
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2024-10-02 01:07:01 +00:00
c2ad246c32 chore(deps): update docker.io/library/golang docker tag to v1.23.1
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2024-09-06 01:06:09 +00:00
e1a7f3b900 chore(deps): update quay.io/skopeo/stable docker tag to v1.16.1
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2024-09-03 16:06:24 +00:00
5417844dcc chore(deps): update docker.io/plugins/docker docker tag to v20.18.4
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2024-08-22 16:06:40 +00:00
63030b3523 chore(deps): update docker.io/library/golang docker tag to v1.23.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2024-08-18 19:08:04 +00:00
168026c4ac chore(deps): update quay.io/skopeo/stable docker tag to v1.16.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2024-08-18 16:07:00 +00:00
992941abdc chore(deps): update docker.io/plugins/docker docker tag to v20.18.3
Some checks failed
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is failing
2024-07-26 12:03:46 +00:00
e8093e7266 chore(deps): update docker.io/plugins/docker docker tag to v20.18.2
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2024-07-23 19:09:28 +00:00
a04c5f9606 chore(deps): update quay.io/skopeo/stable docker tag to v1.15.2
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2024-07-16 16:05:39 +00:00
7edd465bc6 chore(deps): update docker.io/plugins/docker docker tag to v20.18.1
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2024-07-15 22:07:28 +00:00
c62c747551 chore(deps): update quay.io/skopeo/stable docker tag to v1.15.1
Some checks failed
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is failing
2024-07-13 22:04:55 +00:00
900e5535ed chore(deps): update module github.com/spf13/cobra to v1.8.1
All checks were successful
continuous-integration/drone/push Build is passing
2024-07-13 20:04:40 +00:00
dc329229e1 chore(deps): update docker.io/library/golang docker tag to v1.22.5
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2024-07-13 19:06:30 +00:00
49b1cfb1fe chore(deps): update docker.io/plugins/docker docker tag to v20.18.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2024-07-13 10:54:03 +00:00
910172cc94 chore(deps): update git.cryptic.systems/volker.raschek/markdownlint docker tag to v0.41.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2024-05-27 13:09:43 +00:00
04455e02b4 chore(deps): update docker.io/library/alpine docker tag to v3.20
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2024-05-22 19:05:46 +00:00
e2c38f76b7 chore(deps): update docker.io/plugins/docker docker tag to v20.17.5
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2024-05-20 13:08:10 +00:00
4c67cb4198 chore(deps): update docker.io/plugins/docker docker tag to v20.17.4
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2024-05-13 10:05:49 +00:00
5c3ba383b6 chore(deps): update git.cryptic.systems/volker.raschek/markdownlint docker tag to v0.40.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2024-05-07 22:12:31 +00:00
bbade1e4f9 chore(deps): update docker.io/library/golang docker tag to v1.22.3
Some checks failed
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is failing
2024-05-07 19:05:10 +00:00
4085619557 chore(deps): update docker.io/library/golang docker tag to v1.22.2
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2024-04-03 19:43:35 +00:00
a1b8695aae chore(deps): update quay.io/skopeo/stable docker tag to v1.15.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2024-03-31 16:06:08 +00:00
934997b20a chore(deps): update docker.io/plugins/docker docker tag to v20.17.3
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2024-03-11 08:06:06 +00:00
702c1ac4b6 chore(deps): update docker.io/library/golang docker tag to v1.22.1
Some checks reported errors
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build was killed
2024-03-05 20:04:44 +00:00
ea5269027d chore(deps): update module github.com/stretchr/testify to v1.9.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2024-03-02 14:04:47 +00:00
6ced20b951 fix(ci): update renovate config
All checks were successful
continuous-integration/drone/push Build is passing
2024-03-02 13:42:00 +01:00
a6b4fd0afc chore(deps): update quay.io/skopeo/stable docker tag to v1.14.2
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2024-02-18 17:05:17 +00:00
07288bf752 chore(deps): update docker.io/library/golang docker tag to v1.22.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2024-02-07 05:03:55 +00:00
e09eaebfb3 chore(deps): update git.cryptic.systems/volker.raschek/markdownlint docker tag to v0.39.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2024-01-28 23:05:04 +00:00
6224a9d38f chore(deps): update docker.io/library/alpine docker tag to v3.19.1
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2024-01-27 02:03:49 +00:00
2da0b01a44 fix(renovate): remove automerge options
All checks were successful
continuous-integration/drone/push Build is passing
2024-01-21 15:03:05 +01:00
7628004096 Merge pull request 'chore(deps): update docker.io/plugins/docker docker tag to v20.17.2' (#27) from renovate/docker.io-plugins-docker-20.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2024-01-10 17:15:47 +00:00
19f70937e9 chore(deps): update docker.io/plugins/docker docker tag to v20.17.2
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2024-01-10 17:05:37 +00:00
d8e064d873 Merge pull request 'chore(deps): update docker.io/library/golang docker tag to v1.21.6' (#26) from renovate/docker.io-library-golang-1.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2024-01-09 23:16:54 +00:00
7cb4c5634c chore(deps): update docker.io/library/golang docker tag to v1.21.6
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2024-01-09 23:04:40 +00:00
86695b62ec Merge pull request 'chore(deps): update docker.io/library/alpine docker tag to v3.19.0' (#24) from renovate/docker.io-library-alpine-3.x into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #24
2023-12-20 11:16:03 +00:00
dc861f13b1 chore(deps): update docker.io/library/alpine docker tag to v3.19.0
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2023-12-13 17:43:44 +00:00
9a3c64e91a chore(deps): update git.cryptic.systems/volker.raschek/markdownlint docker tag to v0.38.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2023-12-09 14:33:36 +00:00
610dd87a4b chore(deps): update quay.io/skopeo/stable docker tag to v1.14.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2023-12-06 17:17:51 +01:00
165cd6a778 chore(deps): update docker.io/library/alpine docker tag to v3.18.5
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2023-12-06 02:03:16 +01:00
2f9a7d0dd5 chore(deps): update docker.io/library/golang docker tag to v1.21.5
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2023-12-05 23:05:16 +00:00
11 changed files with 1942 additions and 252 deletions

View File

@ -11,12 +11,12 @@ platform:
steps:
- name: clone
image: git.cryptic.systems/volker.raschek/git:1.3.1
image: git.cryptic.systems/volker.raschek/git:1.4.0
- name: markdown lint
commands:
- markdownlint *.md
image: git.cryptic.systems/volker.raschek/markdownlint:0.37.0
image: git.cryptic.systems/volker.raschek/markdownlint:0.43.0
resources:
limits:
cpu: 150
@ -62,12 +62,12 @@ platform:
steps:
- name: clone
image: git.cryptic.systems/volker.raschek/git:1.3.1
image: git.cryptic.systems/volker.raschek/git:1.4.0
- name: unit-test
commands:
- go test -v ./...
image: docker.io/library/golang:1.21.4
image: docker.io/library/golang:1.24.0
trigger:
event:
@ -87,12 +87,12 @@ platform:
steps:
- name: clone
image: git.cryptic.systems/volker.raschek/git:1.3.1
image: git.cryptic.systems/volker.raschek/git:1.4.0
- name: unit-test
commands:
- go test -v ./...
image: docker.io/library/golang:1.21.4
image: docker.io/library/golang:1.24.0
trigger:
event:
@ -120,10 +120,10 @@ platform:
steps:
- name: clone
image: git.cryptic.systems/volker.raschek/git:1.3.1
image: git.cryptic.systems/volker.raschek/git:1.4.0
- name: build
image: docker.io/plugins/docker:20.17.1
image: docker.io/plugins/docker:20.18.7
settings:
auto_tag: false
dockerfile: Dockerfile
@ -187,10 +187,10 @@ platform:
steps:
- name: clone
image: git.cryptic.systems/volker.raschek/git:1.3.1
image: git.cryptic.systems/volker.raschek/git:1.4.0
- name: build
image: docker.io/plugins/docker:20.17.1
image: docker.io/plugins/docker:20.18.7
settings:
auto_tag: false
dockerfile: Dockerfile
@ -254,10 +254,10 @@ platform:
steps:
- name: clone
image: git.cryptic.systems/volker.raschek/git:1.3.1
image: git.cryptic.systems/volker.raschek/git:1.4.0
- name: build
image: docker.io/plugins/docker:20.17.1
image: docker.io/plugins/docker:20.18.7
settings:
auto_tag: false
dockerfile: Dockerfile
@ -319,10 +319,10 @@ platform:
steps:
- name: clone
image: git.cryptic.systems/volker.raschek/git:1.3.1
image: git.cryptic.systems/volker.raschek/git:1.4.0
- name: build
image: docker.io/plugins/docker:20.17.1
image: docker.io/plugins/docker:20.18.7
settings:
auto_tag: false
dockerfile: Dockerfile
@ -385,7 +385,7 @@ node_selector:
steps:
- name: clone
image: git.cryptic.systems/volker.raschek/git:1.3.1
image: git.cryptic.systems/volker.raschek/git:1.4.0
- name: build-manifest
image: docker.io/plugins/manifest:1.4.0
@ -442,7 +442,7 @@ depends_on:
steps:
- name: clone
image: git.cryptic.systems/volker.raschek/git:1.3.1
image: git.cryptic.systems/volker.raschek/git:1.4.0
- name: latest-sync
commands:
@ -456,7 +456,7 @@ steps:
from_secret: container_image_registry_user
DEST_CRED_PASSWORD:
from_secret: container_image_registry_password
image: quay.io/skopeo/stable:v1.13.3
image: quay.io/skopeo/stable:v1.17.0
- name: email-notification
environment:
@ -503,10 +503,10 @@ platform:
steps:
- name: clone
image: git.cryptic.systems/volker.raschek/git:1.3.1
image: git.cryptic.systems/volker.raschek/git:1.4.0
- name: build
image: docker.io/plugins/docker:20.17.1
image: docker.io/plugins/docker:20.18.7
settings:
auto_tag: true
auto_tag_suffix: amd64
@ -563,10 +563,10 @@ platform:
steps:
- name: clone
image: git.cryptic.systems/volker.raschek/git:1.3.1
image: git.cryptic.systems/volker.raschek/git:1.4.0
- name: build
image: docker.io/plugins/docker:20.17.1
image: docker.io/plugins/docker:20.18.7
settings:
auto_tag: true
auto_tag_suffix: arm64-v8
@ -628,7 +628,7 @@ node_selector:
steps:
- name: clone
image: git.cryptic.systems/volker.raschek/git:1.3.1
image: git.cryptic.systems/volker.raschek/git:1.4.0
- name: build-manifest
image: docker.io/plugins/manifest:1.4.0
@ -682,7 +682,7 @@ depends_on:
steps:
- name: clone
image: git.cryptic.systems/volker.raschek/git:1.3.1
image: git.cryptic.systems/volker.raschek/git:1.4.0
- name: tagged-sync
commands:
@ -696,7 +696,7 @@ steps:
from_secret: container_image_registry_user
DEST_CRED_PASSWORD:
from_secret: container_image_registry_password
image: quay.io/skopeo/stable:v1.13.3
image: quay.io/skopeo/stable:v1.17.0
- name: email-notification
environment:

View File

@ -1,4 +1,4 @@
FROM docker.io/library/golang:1.21.4-alpine3.18 AS build
FROM docker.io/library/golang:1.23.4-alpine3.19 AS build
RUN apk add git make
@ -10,7 +10,7 @@ RUN make install \
PREFIX=/usr \
VERSION=${VERSION}
FROM docker.io/library/alpine:3.18.4
FROM docker.io/library/alpine:3.21
COPY --from=build /cache /

View File

@ -8,7 +8,7 @@ import (
"git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose"
"git.cryptic.systems/volker.raschek/dcmerge/pkg/fetcher"
"github.com/spf13/cobra"
"gopkg.in/yaml.v2"
"gopkg.in/yaml.v3"
)
func Execute(version string) error {
@ -100,10 +100,12 @@ func run(cmd *cobra.Command, args []string) error {
defer f.Close()
yamlEncoder := yaml.NewEncoder(f)
yamlEncoder.SetIndent(0)
return yamlEncoder.Encode(dockerComposeConfig)
default:
yamlEncoder := yaml.NewEncoder(os.Stdout)
yamlEncoder.SetIndent(0)
return yamlEncoder.Encode(dockerComposeConfig)
}

663
coverage.txt Normal file
View File

@ -0,0 +1,663 @@
mode: count
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:26.50,28.9 2 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:28.9,30.3 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:32.2,32.9 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:33.33,34.14 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:35.33,36.14 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:37.33,38.15 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:39.10,44.45 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:49.50,51.2 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:54.49,56.2 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:59.50,61.2 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:64.49,66.2 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:69.40,70.45 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:70.45,71.29 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:71.29,73.4 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:76.2,76.43 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:76.43,77.28 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:77.28,79.4 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:82.2,82.45 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:82.45,83.29 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:83.29,85.4 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:88.2,88.43 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:88.43,89.28 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:89.28,91.4 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:96.51,97.9 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:98.33,99.14 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:100.33,101.9 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:111.10,116.44 5 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:121.47,122.9 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:123.33,124.14 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:125.33,126.9 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:136.10,141.40 5 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:145.58,146.25 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:146.25,148.3 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:151.73,152.45 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:152.45,153.21 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:153.21,154.12 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:157.3,157.35 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:157.35,159.4 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:159.9,161.4 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:165.70,166.42 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:166.42,167.20 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:167.20,168.12 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:171.3,171.34 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:171.34,173.4 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:173.9,175.4 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:179.73,180.45 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:180.45,181.21 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:181.21,182.12 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:185.3,185.35 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:185.35,187.4 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:187.9,189.4 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:193.70,194.42 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:194.42,195.20 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:195.20,196.12 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:199.3,199.34 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:199.34,201.4 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:201.9,203.4 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:207.54,208.26 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:208.26,210.3 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:213.69,214.45 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:214.45,215.21 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:215.21,216.12 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:219.3,219.35 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:219.35,221.4 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:221.9,223.4 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:227.66,228.42 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:228.42,229.20 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:229.20,230.12 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:233.3,233.34 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:233.34,235.4 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:235.9,237.4 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:241.69,242.45 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:242.45,243.21 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:243.21,244.12 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:247.3,247.35 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:247.35,249.4 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:249.9,251.4 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:255.66,256.42 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:256.42,257.20 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:257.20,258.12 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:261.3,261.34 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:261.34,263.4 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:263.9,265.4 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:269.26,276.2 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:285.51,287.9 2 5
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:287.9,289.3 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:291.2,291.9 1 3
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:292.34,293.14 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:294.34,295.14 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:296.34,297.15 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:298.10,301.30 1 3
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:305.54,306.9 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:307.34,308.14 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:309.34,310.9 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:320.10,321.39 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:325.50,326.9 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:327.34,328.14 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:329.34,330.9 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:340.10,341.35 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:345.66,346.32 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:346.32,348.3 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:351.62,352.32 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:352.32,354.3 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:357.28,362.2 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:369.59,371.9 2 5
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:371.9,373.3 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:375.2,375.9 1 3
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:376.42,377.14 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:378.42,379.14 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:380.42,381.15 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:382.10,383.51 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:387.70,388.9 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:389.42,390.14 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:391.42,392.9 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:402.10,403.52 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:407.66,408.9 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:409.42,410.14 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:411.42,412.9 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:422.10,423.48 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:427.91,428.55 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:428.55,429.55 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:429.55,431.4 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:435.87,436.55 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:436.55,437.55 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:437.55,439.4 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:443.36,447.2 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:454.71,456.9 2 4
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:456.9,458.3 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:460.2,460.9 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:461.54,462.14 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:463.54,464.14 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:465.54,466.15 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:467.10,468.56 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:472.48,474.2 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:481.50,483.9 2 4
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:483.9,485.3 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:487.2,487.9 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:488.33,489.14 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:490.33,491.14 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:492.33,493.15 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:494.10,495.31 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:501.51,502.22 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:502.22,504.3 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:509.47,510.22 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:510.22,512.3 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:515.26,517.2 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:537.55,538.45 1 3
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:538.45,540.18 2 3
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:540.18,542.4 1 3
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:545.2,545.14 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:549.49,550.33 1 3
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:550.33,552.18 2 3
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:552.18,554.4 1 3
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:557.2,557.14 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:570.48,571.28 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:571.28,572.24 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:572.24,574.4 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:576.2,576.14 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:580.75,581.35 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:581.35,583.41 2 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:583.41,585.4 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:588.2,588.14 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:592.61,593.35 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:593.35,595.16 2 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:595.16,597.4 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:600.2,600.14 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:604.55,605.35 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:605.35,607.15 2 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:607.15,609.4 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:612.2,612.14 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:616.51,618.9 2 189
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:618.9,620.3 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:622.2,622.9 1 187
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:623.34,624.14 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:625.34,626.14 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:627.34,628.15 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:629.10,642.42 1 185
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:646.54,647.9 1 80
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:648.34,649.14 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:650.34,651.9 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:661.10,674.45 13 79
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:680.50,681.9 1 80
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:682.34,683.14 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:684.34,685.9 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:695.10,708.41 13 79
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:712.77,713.48 1 79
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:713.48,714.81 1 3
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:714.81,716.4 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:720.79,721.50 1 79
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:721.50,722.83 1 3
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:722.83,724.4 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:728.65,729.34 1 79
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:729.34,730.59 1 3
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:730.59,732.4 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:736.65,737.9 1 79
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:738.40,739.20 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:740.40,741.14 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:742.40,743.9 1 77
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:744.10,745.36 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:749.71,750.9 1 79
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:751.52,752.32 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:753.52,754.14 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:755.52,756.9 1 73
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:757.10,758.44 1 5
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:758.44,759.29 1 4
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:759.29,760.13 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:763.4,764.33 2 3
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:764.33,766.5 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:771.55,772.9 1 79
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:773.44,774.18 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:775.44,776.14 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:777.44,778.14 1 78
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:779.10,780.9 1 79
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:784.67,785.39 1 79
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:785.39,786.68 1 3
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:786.68,788.4 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:792.59,793.9 1 79
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:794.40,795.20 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:796.40,797.14 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:798.40,799.9 1 73
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:800.10,801.32 1 5
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:801.32,802.23 1 4
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:802.23,803.13 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:806.4,807.27 2 3
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:807.27,809.5 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:814.81,815.9 1 79
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:816.44,817.24 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:818.44,819.14 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:820.44,821.9 1 74
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:822.10,823.39 1 4
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:823.39,824.45 1 3
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:824.45,826.5 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:826.10,828.5 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:833.55,834.9 1 79
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:835.38,836.18 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:837.38,838.14 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:839.38,840.9 1 71
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:841.10,843.24 1 7
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:843.24,844.26 1 6
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:844.26,845.18 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:848.4,850.27 2 6
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:850.27,852.12 2 7
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:854.48,855.19 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:857.56,858.19 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:860.56,861.19 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:863.56,864.19 1 4
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:868.4,868.39 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:873.61,874.33 1 79
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:874.33,875.59 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:875.59,877.4 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:881.68,882.9 1 79
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:883.42,884.22 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:885.42,886.14 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:887.42,888.9 1 75
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:889.10,890.38 1 3
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:894.61,895.9 1 79
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:896.42,897.22 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:898.42,899.14 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:900.42,901.9 1 75
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:902.10,903.34 1 3
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:903.34,905.40 2 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:905.40,907.5 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:912.73,913.48 1 79
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:913.48,914.30 1 3
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:914.30,915.12 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:918.3,918.55 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:918.55,920.4 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:924.75,925.50 1 79
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:925.50,926.31 1 3
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:926.31,927.12 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:930.3,930.57 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:930.57,932.4 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:936.61,937.32 1 79
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:937.32,938.20 1 3
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:938.20,939.12 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:942.3,942.39 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:942.39,944.4 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:948.61,949.9 1 79
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:950.40,951.20 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:952.40,953.14 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:954.40,955.9 1 77
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:956.10,957.32 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:961.67,962.9 1 79
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:963.52,964.32 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:965.52,966.14 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:967.52,968.9 1 74
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:969.10,970.44 1 4
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:970.44,971.29 1 3
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:971.29,972.13 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:975.4,976.32 2 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:981.51,982.9 1 79
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:983.44,984.18 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:985.44,986.14 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:987.44,988.9 1 78
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:989.10,990.23 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:990.23,992.4 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:996.63,997.39 1 79
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:997.39,998.26 1 3
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:998.26,999.12 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1002.3,1002.46 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1002.46,1004.4 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1008.55,1009.9 1 79
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1010.40,1011.20 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1012.40,1013.14 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1014.40,1015.9 1 74
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1016.10,1017.32 1 4
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1017.32,1018.23 1 3
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1018.23,1019.13 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1022.4,1023.26 2 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1028.77,1029.9 1 79
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1030.44,1031.24 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1032.44,1033.14 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1034.44,1035.9 1 75
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1036.10,1037.39 1 3
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1037.39,1038.45 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1038.45,1040.5 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1040.10,1042.5 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1047.51,1048.9 1 79
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1049.38,1050.18 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1051.38,1052.14 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1053.38,1054.9 1 70
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1055.10,1056.24 1 8
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1056.24,1057.26 1 7
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1057.26,1058.13 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1060.4,1060.31 1 6
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1065.57,1066.33 1 79
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1066.33,1067.23 1 3
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1067.23,1068.12 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1071.3,1071.40 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1071.40,1073.4 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1077.64,1078.9 1 79
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1079.42,1080.22 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1081.42,1082.14 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1083.42,1084.9 1 75
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1085.10,1086.34 1 3
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1090.57,1091.9 1 79
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1092.42,1093.22 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1094.42,1095.14 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1096.42,1097.9 1 74
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1098.10,1099.34 1 4
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1099.34,1100.24 1 3
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1100.24,1101.13 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1104.4,1105.32 2 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1112.50,1114.45 2 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1114.45,1116.18 2 3
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1116.18,1118.4 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1120.2,1120.31 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1124.44,1126.33 2 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1126.33,1128.18 2 3
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1128.18,1130.4 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1132.2,1132.19 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1142.48,1144.31 2 3
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1144.31,1145.10 1 9
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1146.30,1147.12 1 4
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1148.11,1149.31 1 5
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1152.2,1152.17 1 3
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1162.47,1164.31 2 14
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1164.31,1165.10 1 23
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1166.29,1167.12 1 14
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1168.11,1169.31 1 9
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1172.2,1172.17 1 14
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1176.45,1178.35 2 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1178.35,1181.10 2 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1182.43,1183.92 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1184.42,1185.119 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1188.2,1188.21 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1192.61,1195.2 2 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1198.55,1201.2 2 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1209.40,1213.2 3 11
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1216.67,1218.20 2 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1218.20,1220.3 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1220.8,1222.3 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1226.28,1240.2 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1247.58,1249.9 2 194
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1249.9,1251.3 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1253.2,1253.9 1 192
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1254.41,1255.14 1 177
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1256.41,1257.14 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1258.41,1259.15 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1260.10,1261.53 1 14
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1267.73,1268.9 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1269.41,1270.14 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1271.41,1272.9 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1282.10,1283.62 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1289.69,1290.9 1 9
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1291.41,1292.14 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1293.41,1294.9 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1304.10,1305.58 1 7
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1309.93,1310.9 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1311.47,1312.27 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1313.47,1314.14 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1315.47,1316.9 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1317.10,1318.43 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1322.89,1323.9 1 7
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1324.47,1325.27 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1326.47,1327.14 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1328.47,1329.9 1 4
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1330.10,1331.39 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1335.40,1339.2 1 14
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1347.68,1349.9 2 35
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1349.9,1351.3 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1353.2,1353.9 1 33
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1354.51,1355.14 1 4
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1356.51,1357.14 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1358.51,1359.15 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1360.10,1362.63 1 28
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1368.101,1369.9 1 9
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1370.51,1371.14 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1372.51,1373.9 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1378.51,1380.14 2 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1381.10,1383.72 2 8
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1389.97,1390.9 1 8
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1391.51,1392.14 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1393.51,1394.9 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1399.51,1401.14 2 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1402.10,1404.68 2 7
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1408.97,1409.9 1 8
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1410.42,1411.22 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1412.42,1413.14 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1414.42,1415.9 1 6
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1416.10,1417.38 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1421.109,1422.9 1 8
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1423.54,1424.34 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1425.54,1426.14 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1427.54,1428.9 1 5
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1429.10,1430.50 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1434.93,1435.9 1 7
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1436.42,1437.22 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1438.42,1439.14 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1440.42,1441.9 1 5
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1442.10,1443.34 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1447.105,1448.9 1 7
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1449.54,1450.34 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1451.54,1452.14 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1453.54,1454.9 1 5
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1455.10,1456.46 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1460.58,1465.2 1 3
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1473.75,1475.9 2 72
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1475.9,1477.3 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1479.2,1479.9 1 70
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1480.58,1481.14 1 38
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1482.58,1483.14 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1484.58,1485.15 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1486.10,1488.54 1 30
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1494.120,1495.9 1 10
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1496.58,1497.14 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1498.58,1499.9 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1509.10,1511.67 2 8
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1517.116,1518.9 1 7
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1519.58,1520.14 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1521.58,1522.9 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1532.10,1534.63 2 5
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1538.77,1539.25 1 8
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1539.25,1541.3 1 4
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1544.81,1545.27 1 8
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1545.27,1547.3 1 4
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1550.73,1551.23 1 5
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1551.23,1553.3 1 3
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1556.77,1557.27 1 5
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1557.27,1559.3 1 3
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1562.70,1564.2 1 6
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1571.59,1573.9 2 33
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1573.9,1575.3 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1577.2,1577.9 1 31
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1578.42,1579.14 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1580.42,1581.14 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1582.42,1583.15 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1584.10,1585.56 1 29
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1591.76,1592.9 1 7
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1593.42,1594.14 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1595.42,1596.9 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1605.42,1607.14 2 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1608.10,1609.53 1 5
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1615.72,1616.9 1 5
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1617.42,1618.14 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1619.42,1620.9 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1629.42,1631.14 2 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1632.10,1633.49 1 3
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1637.69,1638.32 1 5
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1638.32,1639.58 1 6
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1639.58,1641.4 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1645.65,1646.32 1 3
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1646.32,1647.58 1 3
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1647.58,1649.4 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1653.42,1657.2 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1665.58,1667.9 2 188
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1667.9,1669.3 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1671.2,1671.9 1 186
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1672.41,1673.14 1 165
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1674.41,1675.14 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1676.41,1677.15 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1678.10,1680.41 1 20
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1686.75,1687.9 1 7
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1688.41,1689.14 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1690.41,1691.9 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1700.10,1702.50 2 5
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1708.71,1709.9 1 7
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1710.41,1711.14 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1712.41,1713.9 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1722.10,1724.46 2 5
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1728.60,1729.22 1 5
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1729.22,1731.3 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1732.2,1732.17 1 3
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1735.79,1736.29 1 5
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1736.29,1738.3 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1741.56,1742.22 1 5
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1742.22,1744.3 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1747.75,1748.29 1 5
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1748.29,1750.3 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1753.42,1757.2 1 17
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1765.65,1767.9 2 47
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1767.9,1769.3 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1771.2,1771.9 1 45
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1772.48,1773.14 1 12
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1774.48,1775.14 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1776.48,1777.15 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1778.10,1780.40 1 32
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1786.94,1787.9 1 7
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1788.48,1789.14 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1790.48,1791.9 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1801.10,1803.53 2 5
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1809.90,1810.9 1 7
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1811.48,1812.14 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1813.48,1814.9 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1824.10,1826.49 2 5
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1830.65,1831.21 1 5
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1831.21,1833.3 1 3
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1834.2,1834.16 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1837.65,1838.21 1 5
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1838.21,1840.3 1 3
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1841.2,1841.16 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1844.61,1845.21 1 5
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1845.21,1847.3 1 3
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1850.61,1851.21 1 5
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1851.21,1853.3 1 3
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1856.54,1858.2 1 3
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1865.50,1867.9 2 14
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1867.9,1869.3 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1871.2,1871.9 1 12
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1872.33,1873.14 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1874.33,1875.14 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1876.33,1877.15 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1878.10,1879.39 1 10
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1885.51,1886.9 1 5
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1887.33,1888.14 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1889.33,1890.9 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1899.10,1900.46 1 3
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1904.47,1905.9 1 4
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1906.33,1907.14 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1908.33,1909.9 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1918.10,1919.42 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1923.51,1924.16 1 3
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1924.16,1926.3 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1927.2,1927.19 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1930.54,1931.28 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1931.28,1933.3 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1936.26,1940.2 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1944.61,1945.32 1 33
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1945.32,1946.13 1 25
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1946.13,1948.4 1 12
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1950.2,1950.14 1 21
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1953.60,1954.49 1 1643
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1954.49,1956.25 1 3275
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1956.25,1957.26 1 243
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1957.26,1958.31 1 275
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1958.31,1959.19 1 232
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1962.4,1962.16 1 11
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1964.3,1964.14 1 3264
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1967.2,1967.63 1 1643
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1970.60,1974.2 3 22
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1985.66,1989.9 3 4
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1990.44,1991.59 1 3
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1992.24,1993.23 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1996.2,1997.9 2 4
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:1998.44,1999.59 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:2000.24,2001.23 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:2004.2,2004.34 1 4
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:2007.61,2011.42 4 8
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:2011.42,2014.3 2 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:2015.2,2015.22 1 8
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:2025.36,2027.2 1 12
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:2030.34,2032.2 1 27
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:2035.37,2037.2 1 11
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:2040.34,2042.2 1 94
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:2045.36,2047.2 1 13
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:2051.31,2052.9 1 9
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:2053.23,2054.76 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:2055.10,2056.24 1 7
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:2061.33,2065.9 3 43
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:2066.25,2067.12 1 6
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:2068.13,2069.12 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:2072.2,2072.19 1 37
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:2076.35,2080.9 3 35
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:2081.25,2082.12 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:2083.13,2084.12 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:2087.2,2087.19 1 33
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:2091.36,2095.9 3 26
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:2096.25,2097.12 1 6
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:2098.13,2099.12 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:2102.2,2102.19 1 20
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:2107.31,2108.9 1 38
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:2109.23,2110.76 1 24
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:2111.10,2112.24 1 14
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:2117.33,2121.9 3 133
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:2122.25,2123.12 1 6
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:2124.13,2125.12 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:2128.2,2128.19 1 127
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:2132.35,2136.9 3 75
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:2137.25,2138.12 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:2139.13,2140.12 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/config.go:2143.2,2143.19 1 73
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/equalable.go:8.53,9.9 1 3
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/equalable.go:10.38,11.14 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/equalable.go:12.38,13.15 1 1
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/equalable.go:14.38,15.15 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/equalable.go:16.10,18.25 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/equalable.go:18.25,19.26 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/equalable.go:19.26,20.35 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/equalable.go:20.35,21.19 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/equalable.go:24.4,24.16 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/equalable.go:26.3,26.14 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/equalable.go:31.50,35.2 1 2
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/equalable.go:38.64,39.50 1 176
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/equalable.go:39.50,41.34 1 352
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/equalable.go:41.34,42.35 1 18
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/equalable.go:42.35,44.27 1 22
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/equalable.go:44.27,45.19 1 18
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/equalable.go:48.4,48.16 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/equalable.go:50.3,50.14 1 352
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/equalable.go:53.2,53.55 1 176
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/equalable.go:57.59,58.9 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/equalable.go:59.16,60.15 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose/equalable.go:61.10,63.17 2 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/fetcher/fetcher.go:14.61,17.30 2 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/fetcher/fetcher.go:17.30,19.17 2 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/fetcher/fetcher.go:19.17,21.4 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/fetcher/fetcher.go:23.3,23.10 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/fetcher/fetcher.go:24.80,26.18 2 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/fetcher/fetcher.go:26.18,28.5 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/fetcher/fetcher.go:30.4,30.76 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/fetcher/fetcher.go:31.42,32.15 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/fetcher/fetcher.go:33.11,35.18 2 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/fetcher/fetcher.go:35.18,37.5 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/fetcher/fetcher.go:39.4,39.76 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/fetcher/fetcher.go:43.2,43.34 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/fetcher/fetcher.go:48.73,50.16 2 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/fetcher/fetcher.go:50.16,52.3 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/fetcher/fetcher.go:54.2,55.16 2 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/fetcher/fetcher.go:55.16,57.3 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/fetcher/fetcher.go:58.2,60.38 2 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/fetcher/fetcher.go:60.38,62.3 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/fetcher/fetcher.go:64.2,68.16 4 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/fetcher/fetcher.go:68.16,70.3 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/fetcher/fetcher.go:72.2,72.27 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/fetcher/fetcher.go:75.76,77.9 2 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/fetcher/fetcher.go:78.18,79.18 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/fetcher/fetcher.go:80.24,81.57 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/fetcher/fetcher.go:84.2,85.16 2 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/fetcher/fetcher.go:85.16,87.3 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/fetcher/fetcher.go:88.2,94.16 5 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/fetcher/fetcher.go:94.16,96.3 1 0
git.cryptic.systems/volker.raschek/dcmerge/pkg/fetcher/fetcher.go:98.2,98.27 1 0

9
go.mod
View File

@ -3,15 +3,14 @@ module git.cryptic.systems/volker.raschek/dcmerge
go 1.20
require (
github.com/spf13/cobra v1.8.0
github.com/stretchr/testify v1.8.4
gopkg.in/yaml.v2 v2.4.0
github.com/spf13/cobra v1.9.1
github.com/stretchr/testify v1.10.0
gopkg.in/yaml.v3 v3.0.1
)
require (
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/spf13/pflag v1.0.5 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
github.com/spf13/pflag v1.0.6 // indirect
)

16
go.sum
View File

@ -1,4 +1,4 @@
github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
@ -6,15 +6,13 @@ github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLf
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0=
github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho=
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo=
github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0=
github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o=
github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

View File

@ -2,7 +2,10 @@ package dockerCompose
import (
"fmt"
"regexp"
"strings"
"gopkg.in/yaml.v3"
)
const (
@ -516,19 +519,19 @@ func NewSecret() *Secret {
}
type Service struct {
CapabilitiesAdd []string `json:"cap_add,omitempty" yaml:"cap_add,omitempty"`
CapabilitiesDrop []string `json:"cap_drop,omitempty" yaml:"cap_drop,omitempty"`
DependsOn []string `json:"depends_on,omitempty" yaml:"depends_on,omitempty"`
Deploy *ServiceDeploy `json:"deploy,omitempty" yaml:"deploy,omitempty"`
Environments []string `json:"environment,omitempty" yaml:"environment,omitempty"`
ExtraHosts []string `json:"extra_hosts,omitempty" yaml:"extra_hosts,omitempty"`
Image string `json:"image,omitempty" yaml:"image,omitempty"`
Labels []string `json:"labels,omitempty" yaml:"labels,omitempty"`
Networks map[string]*ServiceNetwork `json:"networks,omitempty" yaml:"networks,omitempty"`
Ports []string `json:"ports,omitempty" yaml:"ports,omitempty"`
Secrets []string `json:"secrets,omitempty" yaml:"secrets,omitempty"`
ULimits *ServiceULimits `json:"ulimits,omitempty" yaml:"ulimits,omitempty"`
Volumes []string `json:"volumes,omitempty" yaml:"volumes,omitempty"`
CapabilitiesAdd []string `json:"cap_add,omitempty" yaml:"cap_add,omitempty"`
CapabilitiesDrop []string `json:"cap_drop,omitempty" yaml:"cap_drop,omitempty"`
DependsOnContainer *DependsOnContainer `json:"depends_on,omitempty" yaml:"depends_on,omitempty"`
Deploy *ServiceDeploy `json:"deploy,omitempty" yaml:"deploy,omitempty"`
Environments []string `json:"environment,omitempty" yaml:"environment,omitempty"`
ExtraHosts []string `json:"extra_hosts,omitempty" yaml:"extra_hosts,omitempty"`
Image string `json:"image,omitempty" yaml:"image,omitempty"`
Labels []string `json:"labels,omitempty" yaml:"labels,omitempty"`
Networks map[string]*ServiceNetwork `json:"networks,omitempty" yaml:"networks,omitempty"`
Ports []Port `json:"ports,omitempty" yaml:"ports,omitempty"`
Secrets []string `json:"secrets,omitempty" yaml:"secrets,omitempty"`
ULimits *ServiceULimits `json:"ulimits,omitempty" yaml:"ulimits,omitempty"`
Volumes []string `json:"volumes,omitempty" yaml:"volumes,omitempty"`
}
// ExistsEnvironment returns true if the passed name of environment variable is
@ -556,39 +559,22 @@ func (s *Service) ExistsLabel(name string) bool {
return false
}
// ExistsPort returns true if the port definition is already present.
func (s *Service) ExistsPort(src string, dest string, protocol string) bool {
for _, port := range s.Ports {
s, d, p := splitStringInPort(port)
if s == src && d == dest && p == protocol {
// ExistsPort returns true if the port definition is already present. The port defines a mapping between the host system
// port and the container port. It is also possible to specify the individual ip address of the host system or the
// container. Additionally, the protocol can be specified as suffix.
//
// // Example
// s := new(Service)
// b := s.ExistsPort("80:80")
// b = s.ExistsPort("0.0.0.0:80:80/tcp")
// b = s.ExistsPort("0.0.0.0:80:80/tcp")
// b = s.ExistsPort("192.168.178.10:80:172.25.18.20:80/tcp")
func (s *Service) ExistsPort(port string) bool {
for _, p := range s.Ports {
if string(p) == port {
return true
}
}
return false
}
// ExistsDestinationPort returns true if the destination port is already used.
func (s *Service) ExistsDestinationPort(dest string) bool {
for _, port := range s.Ports {
_, d, _ := splitStringInPort(port)
if d == dest {
return true
}
}
return false
}
// ExistsSourcePort returns true if the source port is already used.
func (s *Service) ExistsSourcePort(src string) bool {
for _, port := range s.Ports {
s, _, _ := splitStringInPort(port)
if s == src {
return true
}
}
return false
}
@ -645,7 +631,7 @@ func (s *Service) Equal(equalable Equalable) bool {
default:
return equalSlice(s.CapabilitiesAdd, service.CapabilitiesAdd) &&
equalSlice(s.CapabilitiesDrop, service.CapabilitiesDrop) &&
equalSlice(s.DependsOn, service.DependsOn) &&
s.DependsOnContainer.Equal(service.DependsOnContainer) &&
s.Deploy.Equal(service.Deploy) &&
equalSlice(s.Environments, service.Environments) &&
equalSlice(s.ExtraHosts, service.ExtraHosts) &&
@ -677,7 +663,7 @@ func (s *Service) MergeExistingWin(service *Service) {
default:
s.mergeExistingWinCapabilitiesAdd(service.CapabilitiesAdd)
s.mergeExistingWinCapabilitiesDrop(service.CapabilitiesDrop)
s.mergeExistingWinDependsOn(service.DependsOn)
s.mergeExistingWinDependsOnContainer(service.DependsOnContainer)
s.mergeExistingWinDeploy(service.Deploy)
s.mergeExistingWinEnvironments(service.Environments)
s.mergeExistingWinExtraHosts(service.ExtraHosts)
@ -711,7 +697,7 @@ func (s *Service) MergeLastWin(service *Service) {
default:
s.mergeLastWinCapabilitiesAdd(service.CapabilitiesAdd)
s.mergeLastWinCapabilitiesDrop(service.CapabilitiesDrop)
s.mergeLastWinDependsOn(service.DependsOn)
s.mergeLastWinDependsOnContainer(service.DependsOnContainer)
s.mergeLastWinDeploy(service.Deploy)
s.mergeLastWinEnvironments(service.Environments)
s.mergeLastWinExtraHosts(service.ExtraHosts)
@ -741,10 +727,22 @@ func (s *Service) mergeExistingWinCapabilitiesDrop(capabilitiesDrop []string) {
}
}
func (s *Service) mergeExistingWinDependsOn(dependsOn []string) {
for _, depOn := range dependsOn {
if !existsInSlice(s.DependsOn, depOn) && len(depOn) > 0 {
s.DependsOn = append(s.DependsOn, depOn)
func (s *Service) mergeExistingWinDependsOnContainer(dependsOnContainer *DependsOnContainer) {
switch {
case s.DependsOnContainer != nil && dependsOnContainer == nil:
fallthrough
case s.DependsOnContainer == nil && dependsOnContainer == nil:
return
case s.DependsOnContainer == nil && dependsOnContainer != nil:
s.DependsOnContainer = dependsOnContainer
default:
for name, depOn := range dependsOnContainer.DependsOn {
if !ExistsInMap(s.DependsOnContainer.DependsOn, name) && depOn != nil {
if s.DependsOnContainer.DependsOn == nil {
s.DependsOnContainer.DependsOn = make(map[string]*ServiceDependsOn)
}
s.DependsOnContainer.DependsOn[name] = depOn
}
}
}
}
@ -846,7 +844,7 @@ func (s *Service) mergeExistingWinNetworks(networks map[string]*ServiceNetwork)
}
}
func (s *Service) mergeExistingWinPorts(ports []string) {
func (s *Service) mergeExistingWinPorts(ports []Port) {
switch {
case s.Ports == nil && ports != nil:
s.Ports = ports
@ -855,15 +853,33 @@ func (s *Service) mergeExistingWinPorts(ports []string) {
case s.Ports == nil && ports == nil:
return
default:
for _, port := range ports {
if len(port) <= 0 {
continue
LOOP:
for i := range ports {
if len(ports[i]) <= 0 {
continue LOOP
}
src, dest, protocol := splitStringInPort(port)
if !s.ExistsDestinationPort(dest) {
s.SetPort(src, dest, protocol)
newPort := Port(ports[i])
for j := range s.Ports {
existingPort := Port(s.Ports[j])
switch {
case newPort.existsSrcIP() && existingPort.existsSrcIP() &&
newPort.getSrc() == existingPort.getSrc():
continue LOOP
case !newPort.existsSrcIP() && existingPort.existsSrcIP() &&
newPort.getSrcPort() == existingPort.getSrcPort():
continue LOOP
case newPort.existsSrcIP() && !existingPort.existsSrcIP() &&
newPort.getSrcPort() == existingPort.getSrcPort():
continue LOOP
case !newPort.existsSrcIP() && !existingPort.existsSrcIP() &&
newPort.getSrcPort() == existingPort.getSrcPort():
continue LOOP
}
}
s.Ports = append(s.Ports, ports[i])
}
}
}
@ -931,14 +947,20 @@ func (s *Service) mergeLastWinCapabilitiesDrop(capabilitiesDrop []string) {
}
}
func (s *Service) mergeLastWinDependsOn(dependsOn []string) {
for _, dep := range dependsOn {
if len(dep) <= 0 {
continue
}
if !existsInSlice(s.DependsOn, dep) {
s.DependsOn = append(s.DependsOn, dep)
func (s *Service) mergeLastWinDependsOnContainer(dependsOnContainer *DependsOnContainer) {
switch {
case s.DependsOnContainer != nil && dependsOnContainer == nil:
fallthrough
case s.DependsOnContainer == nil && dependsOnContainer == nil:
return
case s.DependsOnContainer == nil && dependsOnContainer != nil:
s.DependsOnContainer = dependsOnContainer
default:
for name, depOn := range dependsOnContainer.DependsOn {
if s.DependsOnContainer.DependsOn == nil {
s.DependsOnContainer.DependsOn = make(map[string]*ServiceDependsOn)
}
s.DependsOnContainer.DependsOn[name] = depOn
}
}
}
@ -1042,7 +1064,7 @@ func (s *Service) mergeLastWinNetworks(networks map[string]*ServiceNetwork) {
}
}
func (s *Service) mergeLastWinPorts(ports []string) {
func (s *Service) mergeLastWinPorts(ports []Port) {
switch {
case s.Ports == nil && ports != nil:
s.Ports = ports
@ -1051,13 +1073,11 @@ func (s *Service) mergeLastWinPorts(ports []string) {
case s.Ports == nil && ports == nil:
return
default:
for _, port := range ports {
if len(port) <= 0 {
for i := range ports {
if len(ports[i]) <= 0 {
continue
}
src, dest, protocol := splitStringInPort(port)
s.SetPort(src, dest, protocol)
s.SetPort(string(ports[i]))
}
}
}
@ -1120,8 +1140,7 @@ func (s *Service) RemoveEnvironment(name string) {
s.Environments = environments
}
// RemoveLabel remove all found labels from the internal slice matching by the
// passed name.
// RemoveLabel remove all found labels from the internal slice matching by the passed name.
func (s *Service) RemoveLabel(name string) {
labels := make([]string, 0)
for _, label := range s.Labels {
@ -1133,25 +1152,47 @@ func (s *Service) RemoveLabel(name string) {
s.Labels = labels
}
// RemovePort remove all found ports from the internal slice matching by the
// passed dest port.
func (s *Service) RemovePort(dest string) {
ports := make([]string, 0)
// RemovePortByDst remove all found ports from the internal slice matching by the passed destination. The destination
// can contains only the destination port, but also the destination ip address.
//
// // Example
// s := new(Service)
// s.RemovePortByDst("8080")
// s.RemovePortByDst("172.25.18.20:8080")
func (s *Service) RemovePortByDst(dest string) {
ports := make([]Port, 0)
for _, port := range s.Ports {
srcPort, destPort, protocol := splitStringInPort(port)
switch {
case destPort == dest && len(protocol) <= 0:
s.Ports = append(s.Ports, fmt.Sprintf("%s%s%s", srcPort, portDelimiter, destPort))
case destPort == dest && len(protocol) > 0:
s.Ports = append(s.Ports, fmt.Sprintf("%s%s%s%s%s", srcPort, portDelimiter, destPort, portProtocolDelimiter, protocol))
case port.getDst() == dest:
continue
default:
ports = append(ports, port)
}
}
s.Ports = ports
}
// RemoveVolume remove all found volumes from the internal slice matching by the
// dest path.
// RemovePortBySrc remove all found ports from the internal slice matching by the passed source. The source can contains
// only the source port, but also the source ip address.
//
// // Example
// s := new(Service)
// s.RemovePortBySrc("8080")
// s.RemovePortBySrc("192.168.178.10:8080")
func (s *Service) RemovePortBySrc(src string) {
ports := make([]Port, 0)
for _, port := range s.Ports {
switch {
case port.getSrc() == src:
continue
default:
ports = append(ports, port)
}
}
s.Ports = ports
}
// RemoveVolume remove all found volumes from the internal slice matching by the dest path.
func (s *Service) RemoveVolume(dest string) {
volumes := make([]string, 0)
for _, volume := range s.Volumes {
@ -1179,14 +1220,16 @@ func (s *Service) SetLabel(name string, value string) {
s.Labels = append(s.Labels, fmt.Sprintf("%s%s%s", name, labelDelimiter, value))
}
// SetPort add or overwrite an existing port.
func (s *Service) SetPort(src string, dest string, protocol string) {
s.RemovePort(dest)
if len(protocol) <= 0 {
s.Ports = append(s.Ports, fmt.Sprintf("%s%s%s", src, volumeDelimiter, dest))
} else {
s.Ports = append(s.Ports, fmt.Sprintf("%s%s%s%s%s", src, portDelimiter, dest, portProtocolDelimiter, protocol))
}
// SetPort add or overwrite an existing source port.
//
// // Example
// s := new(Service)
// s.SetPort("0.0.0.0:443:172.25.18.20:8443/tcp") // Add new port
// s.SetPort("0.0.0.0:443:10.254.611.66:443/tcp") // Overwrite port determined by source port
func (s *Service) SetPort(port string) {
newPort := Port(port)
s.RemovePortBySrc(newPort.getSrc())
s.Ports = append(s.Ports, newPort)
}
// SetVolume add or overwrite an existing volume.
@ -1199,6 +1242,66 @@ func (s *Service) SetVolume(src string, dest string, perm string) {
}
}
const ServiceDependsOnConditionServiceStarted string = "service_started"
// DependsOnContainer is a wrapper to handle different YAML type formats of DependsOn.
type DependsOnContainer struct {
Slice []string
DependsOn map[string]*ServiceDependsOn
}
// Equal returns true if the passed equalable is equal
func (sdoc *DependsOnContainer) Equal(equalable Equalable) bool {
serviceDependsOnContainer, ok := equalable.(*DependsOnContainer)
if !ok {
return false
}
switch {
case sdoc == nil && serviceDependsOnContainer == nil:
return true
case sdoc != nil && serviceDependsOnContainer == nil:
fallthrough
case sdoc == nil && serviceDependsOnContainer != nil:
return false
default:
return equalSlice(sdoc.Slice, serviceDependsOnContainer.Slice) &&
EqualStringMap(sdoc.DependsOn, serviceDependsOnContainer.DependsOn)
}
}
// MarshalYAML implements the MarshalYAML interface to customize the behavior when being marshaled into a YAML document.
func (sdoc *DependsOnContainer) MarshalYAML() (interface{}, error) {
return sdoc.DependsOn, nil
}
// UnmarshalYAML implements the UnmarshalYAML interface to customize the behavior when being unmarshaled into a YAML
// document.
func (sdoc *DependsOnContainer) UnmarshalYAML(value *yaml.Node) error {
if sdoc.DependsOn == nil {
sdoc.DependsOn = make(map[string]*ServiceDependsOn)
}
if sdoc.Slice == nil {
sdoc.Slice = make([]string, 0)
}
if err := value.Decode(&sdoc.Slice); err == nil {
for _, s := range sdoc.Slice {
sdoc.DependsOn[s] = &ServiceDependsOn{
Condition: ServiceDependsOnConditionServiceStarted,
}
}
return nil
}
if err := value.Decode(sdoc.DependsOn); err != nil {
return err
}
return nil
}
// NewService returns an empty initialized Service.
func NewService() *Service {
return &Service{
@ -1209,13 +1312,38 @@ func NewService() *Service {
ExtraHosts: make([]string, 0),
Labels: make([]string, 0),
Networks: make(map[string]*ServiceNetwork),
Ports: make([]string, 0),
Ports: make([]Port, 0),
Secrets: make([]string, 0),
ULimits: new(ServiceULimits),
Volumes: make([]string, 0),
}
}
type ServiceDependsOn struct {
Condition string `yaml:"condition,omitempty"`
Restart string `yaml:"restart,omitempty"`
}
// Equal returns true if the passed equalable is equal
func (sdo *ServiceDependsOn) Equal(equalable Equalable) bool {
serviceDependsOn, ok := equalable.(*ServiceDependsOn)
if !ok {
return false
}
switch {
case sdo == nil && serviceDependsOn == nil:
return true
case sdo != nil && serviceDependsOn == nil:
fallthrough
case sdo == nil && serviceDependsOn != nil:
return false
default:
return sdo.Condition == serviceDependsOn.Condition &&
sdo.Restart == serviceDependsOn.Restart
}
}
type ServiceDeploy struct {
Resources *ServiceDeployResources `json:"resources" yaml:"resources"`
}
@ -1897,7 +2025,7 @@ func (v *Volume) MergeLastWin(volume *Volume) {
}
}
func (v *Volume) mergeExistingWinExternal(external bool) {
func (v *Volume) mergeExistingWinExternal(_ bool) {
if v.External {
return
}
@ -1950,17 +2078,35 @@ func splitStringInKeyValue(s, sep string) (string, string) {
return key, value
}
func splitStringInPort(s string) (string, string, string) {
parts := strings.Split(s, portDelimiter)
src := parts[0]
rest := parts[1]
// splitStringInPortMapping parses a string and returns the src, dest port including an optional protocol.
//
// // Example
// s, d, p := splitStringInPortMapping("80:80/tcp")
// // Output: "80" "80" "tcp"
// s, d, p := splitStringInPortMapping("0.0.0.0:80:80/tcp")
// // Output: "0.0.0.0:80" "80" "tcp"
//
// Deprecated: Instead of using the splitStringInPortMapping function, use the method of the type Port{}.
func splitStringInPortMapping(s string) (string, string, string) {
p := Port(s)
parts = strings.Split(rest, portProtocolDelimiter)
if len(parts) == 2 {
return src, parts[0], parts[1]
var src string
switch {
case p.existsSrcIP() && p.existsSrcPort():
src = fmt.Sprintf("%s:%s", p.getSrcIP(), p.getSrcPort())
case !p.existsSrcIP():
src = p.getSrcPort()
}
return src, parts[0], ""
var dst string
switch {
case p.existsDstIP() && p.existsDstPort():
dst = fmt.Sprintf("%s:%s", p.getDstIP(), p.getDstPort())
case !p.existsDstIP():
dst = p.getDstPort()
}
return src, dst, p.getProtocol()
}
func splitStringInVolume(s string) (string, string, string) {
@ -1973,3 +2119,131 @@ func splitStringInVolume(s string) (string, string, string) {
}
return src, dest, ""
}
var (
regExpPort = regexp.MustCompile(`^((?<srcIP>([\d]{1,3}\.){3}[\d]{1,3}):)?(?<srcPort>[\d]{1,5}):((?<dstIP>([\d]{1,3}\.){3}[\d]{1,3}):)?(?<dstPort>[\d]{1,5})(\/(?<protocol>[a-z]*))?$`)
)
type Port string
// existsDstPort returns true, if the port string contains a trailing destination port definition.
func (p Port) existsDstPort() bool {
return len(p.getDstPort()) > 0
}
// existsDstIP returns true, if the port string contains a trailing destination ip definition.
func (p Port) existsDstIP() bool {
return len(p.getDstIP()) > 0
}
// existsProtocol returns true, if the port string contains a protocol definition.
func (p Port) existsProtocol() bool {
return len(p.getProtocol()) > 0
}
// existsSrcIP returns true, if the port string contains a leading src ip definition.
func (p Port) existsSrcIP() bool {
return len(p.getSrcIP()) > 0
}
// existsSrcPort returns true, if the port string contains a leading src port definition.
func (p Port) existsSrcPort() bool {
return len(p.getSrcPort()) > 0
}
// getDst returns the concatenation of the destination ip and port. If the destination ip is empty, only the port will
// be returned.
func (p Port) getDst() string {
switch {
case p.existsDstIP():
return fmt.Sprintf("%s%s%s", p.getDstIP(), portDelimiter, p.getDstPort())
default:
return p.getDstPort()
}
}
// getSrcIP returns the destination ip, if the port string contains a destination ip definition.
func (p Port) getDstIP() string {
matches := regExpPort.FindStringSubmatch(string(p))
i := regExpPort.SubexpIndex("dstIP")
switch {
case len(matches) <= 0:
return ""
case i < 0:
return ""
}
return matches[i]
}
// getSrcPort returns the destination port, if the port string contains an destination port definition.
func (p Port) getDstPort() string {
matches := regExpPort.FindStringSubmatch(string(p))
i := regExpPort.SubexpIndex("dstPort")
switch {
case len(matches) <= 0:
return ""
case i < 0:
return ""
}
return matches[i]
}
// getProtocol returns the protocol, if the port string contains a protocol definition.
func (p Port) getProtocol() string {
matches := regExpPort.FindStringSubmatch(string(p))
i := regExpPort.SubexpIndex("protocol")
switch {
case len(matches) <= 0:
return ""
case i < 0:
return ""
}
return matches[i]
}
// getSrc returns the concatenation of the source ip and port. If the source ip is empty, only the port will be
// returned.
func (p Port) getSrc() string {
switch {
case p.existsSrcIP():
return fmt.Sprintf("%s%s%s", p.getSrcIP(), portDelimiter, p.getSrcPort())
default:
return p.getSrcPort()
}
}
// getSrcIP returns the source ip, if the port string contains an src ip definition.
func (p Port) getSrcIP() string {
matches := regExpPort.FindStringSubmatch(string(p))
i := regExpPort.SubexpIndex("srcIP")
switch {
case len(matches) <= 0:
return ""
case i < 0:
return ""
}
return matches[i]
}
// getSrcPort returns the source port, if the port string contains an src port definition.
func (p Port) getSrcPort() string {
matches := regExpPort.FindStringSubmatch(string(p))
i := regExpPort.SubexpIndex("srcPort")
switch {
case len(matches) <= 0:
return ""
case i < 0:
return ""
}
return matches[i]
}

View File

@ -0,0 +1,418 @@
package dockerCompose
import (
"testing"
"github.com/stretchr/testify/require"
)
func Test_splitStringInPortMapping(t *testing.T) {
require := require.New(t)
testCases := []struct {
s string
expectedSrc string
expectedDst string
expectedProtocol string
}{
{
s: "53:53",
expectedSrc: "53",
expectedDst: "53",
expectedProtocol: "",
},
{
s: "0.0.0.0:53:53",
expectedSrc: "0.0.0.0:53",
expectedDst: "53",
expectedProtocol: "",
},
{
s: "0.0.0.0:53:10.11.12.13:53",
expectedSrc: "0.0.0.0:53",
expectedDst: "10.11.12.13:53",
expectedProtocol: "",
},
{
s: "0.0.0.0:53:10.11.12.13:53/tcp",
expectedSrc: "0.0.0.0:53",
expectedDst: "10.11.12.13:53",
expectedProtocol: "tcp",
},
}
for i, testCase := range testCases {
actualSrc, actualDst, actualProtocol := splitStringInPortMapping(testCase.s)
require.Equal(testCase.expectedSrc, actualSrc, "TestCase %v", i)
require.Equal(testCase.expectedDst, actualDst, "TestCase %v", i)
require.Equal(testCase.expectedProtocol, actualProtocol, "TestCase %v", i)
}
}
func TestPort_DstIP(t *testing.T) {
require := require.New(t)
testCases := []struct {
s string
expectedBool bool
expectedString string
}{
{
s: "",
expectedBool: false,
expectedString: "",
},
{
s: "53:53",
expectedBool: false,
expectedString: "",
},
{
s: "53:53/tcp",
expectedBool: false,
expectedString: "",
},
{
s: "53:53/udp",
expectedBool: false,
expectedString: "",
},
{
s: "0.0.0.0:53",
expectedBool: false,
expectedString: "",
},
{
s: "53:0.0.0.0:53",
expectedBool: true,
expectedString: "0.0.0.0",
},
{
s: "53:0.0.0.0:53/tcp",
expectedBool: true,
expectedString: "0.0.0.0",
},
{
s: "53:0.0.0.0:53/udp",
expectedBool: true,
expectedString: "0.0.0.0",
},
{
s: "10.11.12.13:53",
expectedBool: false,
expectedString: "",
},
{
s: "53:10.11.12.13:53",
expectedBool: true,
expectedString: "10.11.12.13",
},
{
s: "53:10.11.12.13:53/tcp",
expectedBool: true,
expectedString: "10.11.12.13",
},
{
s: "53:10.11.12.13:53/udp",
expectedBool: true,
expectedString: "10.11.12.13",
},
}
for i, testCase := range testCases {
p := Port(testCase.s)
require.Equal(testCase.expectedBool, p.existsDstIP(), "TestCase %v", i)
require.Equal(testCase.expectedString, p.getDstIP(), "TestCase %v", i)
}
}
func TestPort_DstPort(t *testing.T) {
require := require.New(t)
testCases := []struct {
s string
expectedBool bool
expectedString string
}{
{
s: "",
expectedBool: false,
expectedString: "",
},
{
s: "53:53",
expectedBool: true,
expectedString: "53",
},
{
s: "53:53/tcp",
expectedBool: true,
expectedString: "53",
},
{
s: "53:53/udp",
expectedBool: true,
expectedString: "53",
},
{
s: "53:0.0.0.0:53",
expectedBool: true,
expectedString: "53",
},
{
s: "53:0.0.0.0:53/tcp",
expectedBool: true,
expectedString: "53",
},
{
s: "53:0.0.0.0:53/udp",
expectedBool: true,
expectedString: "53",
},
{
s: "53:10.11.12.13:53",
expectedBool: true,
expectedString: "53",
},
{
s: "53:10.11.12.13:53/tcp",
expectedBool: true,
expectedString: "53",
},
{
s: "53:10.11.12.13:53/udp",
expectedBool: true,
expectedString: "53",
},
}
for i, testCase := range testCases {
p := Port(testCase.s)
require.Equal(testCase.expectedBool, p.existsDstPort(), "TestCase %v", i)
require.Equal(testCase.expectedString, p.getDstPort(), "TestCase %v", i)
}
}
func TestPort_Protocol(t *testing.T) {
require := require.New(t)
testCases := []struct {
s string
expectedBool bool
expectedString string
}{
{
s: "0",
expectedBool: false,
expectedString: "",
},
{
s: "53/tcp",
expectedBool: false,
expectedString: "",
},
{
s: "53/udp",
expectedBool: false,
expectedString: "",
},
{
s: "53:53",
expectedBool: false,
expectedString: "",
},
{
s: "53:53/tcp",
expectedBool: true,
expectedString: "tcp",
},
{
s: "53:53/udp",
expectedBool: true,
expectedString: "udp",
},
{
s: "0.0.0.0:53:53/tcp",
expectedBool: true,
expectedString: "tcp",
},
{
s: "0.0.0.0:53:53/udp",
expectedBool: true,
expectedString: "udp",
},
{
s: "0.0.0.0:53:53/tcp",
expectedBool: true,
expectedString: "tcp",
},
{
s: "0.0.0.0:53:11.12.13.14:53/tcp",
expectedBool: true,
expectedString: "tcp",
},
{
s: "0.0.0.0:53:11.12.13.14:53/udp",
expectedBool: true,
expectedString: "udp",
},
}
for i, testCase := range testCases {
p := Port(testCase.s)
require.Equal(testCase.expectedBool, p.existsProtocol(), "TestCase %v", i)
require.Equal(testCase.expectedString, p.getProtocol(), "TestCase %v", i)
}
}
func TestPort_SrcIP(t *testing.T) {
require := require.New(t)
testCases := []struct {
s string
expectedBool bool
expectedString string
}{
{
s: "",
expectedBool: false,
expectedString: "",
},
{
s: "53:53",
expectedBool: false,
expectedString: "",
},
{
s: "53:53/tcp",
expectedBool: false,
expectedString: "",
},
{
s: "53:53/udp",
expectedBool: false,
expectedString: "",
},
{
s: "0.0.0.0:53",
expectedBool: false,
expectedString: "",
},
{
s: "0.0.0.0:53:53",
expectedBool: true,
expectedString: "0.0.0.0",
},
{
s: "0.0.0.0:53:53/tcp",
expectedBool: true,
expectedString: "0.0.0.0",
},
{
s: "0.0.0.0:53:53/udp",
expectedBool: true,
expectedString: "0.0.0.0",
},
{
s: "10.11.12.13:53",
expectedBool: false,
expectedString: "",
},
{
s: "10.11.12.13:53:53",
expectedBool: true,
expectedString: "10.11.12.13",
},
{
s: "10.11.12.13:53:53/tcp",
expectedBool: true,
expectedString: "10.11.12.13",
},
{
s: "10.11.12.13:53:53/udp",
expectedBool: true,
expectedString: "10.11.12.13",
},
}
for i, testCase := range testCases {
p := Port(testCase.s)
require.Equal(testCase.expectedBool, p.existsSrcIP(), "TestCase %v", i)
require.Equal(testCase.expectedString, p.getSrcIP(), "TestCase %v", i)
}
}
func TestPort_SrcPort(t *testing.T) {
require := require.New(t)
testCases := []struct {
s string
expectedBool bool
expectedString string
}{
{
s: "",
expectedBool: false,
expectedString: "",
},
{
s: "53:53",
expectedBool: true,
expectedString: "53",
},
{
s: "53:53/tcp",
expectedBool: true,
expectedString: "53",
},
{
s: "53:53/udp",
expectedBool: true,
expectedString: "53",
},
{
s: "0.0.0.0:53:53",
expectedBool: true,
expectedString: "53",
},
{
s: "0.0.0.0:53:53/tcp",
expectedBool: true,
expectedString: "53",
},
{
s: "0.0.0.0:53:53/udp",
expectedBool: true,
expectedString: "53",
},
{
s: "10.11.12.13:53:53",
expectedBool: true,
expectedString: "53",
},
{
s: "10.11.12.13:53:53/tcp",
expectedBool: true,
expectedString: "53",
},
{
s: "10.11.12.13:53:53/udp",
expectedBool: true,
expectedString: "53",
},
}
for i, testCase := range testCases {
p := Port(testCase.s)
require.Equal(testCase.expectedBool, p.existsSrcPort(), "TestCase %v", i)
require.Equal(testCase.expectedString, p.getSrcPort(), "TestCase %v", i)
}
}

View File

@ -223,34 +223,34 @@ func TestService_Equal(t *testing.T) {
},
{
equalableA: &dockerCompose.Service{
CapabilitiesAdd: []string{},
CapabilitiesDrop: []string{},
DependsOn: []string{},
Deploy: nil,
Environments: []string{},
ExtraHosts: []string{},
Image: "",
Labels: []string{},
Networks: map[string]*dockerCompose.ServiceNetwork{},
Ports: []string{},
Secrets: []string{},
ULimits: nil,
Volumes: []string{},
CapabilitiesAdd: []string{},
CapabilitiesDrop: []string{},
DependsOnContainer: &dockerCompose.DependsOnContainer{},
Deploy: nil,
Environments: []string{},
ExtraHosts: []string{},
Image: "",
Labels: []string{},
Networks: map[string]*dockerCompose.ServiceNetwork{},
Ports: []dockerCompose.Port{},
Secrets: []string{},
ULimits: nil,
Volumes: []string{},
},
equalableB: &dockerCompose.Service{
CapabilitiesAdd: []string{},
CapabilitiesDrop: []string{},
DependsOn: []string{},
Deploy: nil,
Environments: []string{},
ExtraHosts: []string{},
Image: "",
Labels: []string{},
Networks: map[string]*dockerCompose.ServiceNetwork{},
Ports: []string{},
Secrets: []string{},
ULimits: nil,
Volumes: []string{},
CapabilitiesAdd: []string{},
CapabilitiesDrop: []string{},
DependsOnContainer: &dockerCompose.DependsOnContainer{},
Deploy: nil,
Environments: []string{},
ExtraHosts: []string{},
Image: "",
Labels: []string{},
Networks: map[string]*dockerCompose.ServiceNetwork{},
Ports: []dockerCompose.Port{},
Secrets: []string{},
ULimits: nil,
Volumes: []string{},
},
expectedResult: true,
},
@ -292,19 +292,74 @@ func TestService_Equal(t *testing.T) {
},
{
equalableA: &dockerCompose.Service{
DependsOn: []string{"app"},
DependsOnContainer: &dockerCompose.DependsOnContainer{Slice: []string{"app"}},
},
equalableB: &dockerCompose.Service{
DependsOn: []string{},
DependsOnContainer: nil,
},
expectedResult: false,
},
{
equalableA: &dockerCompose.Service{
DependsOn: []string{"app"},
DependsOnContainer: &dockerCompose.DependsOnContainer{Slice: []string{"app"}},
},
equalableB: &dockerCompose.Service{
DependsOn: []string{"app"},
DependsOnContainer: &dockerCompose.DependsOnContainer{},
},
expectedResult: false,
},
{
equalableA: &dockerCompose.Service{
DependsOnContainer: &dockerCompose.DependsOnContainer{Slice: []string{"app"}},
},
equalableB: &dockerCompose.Service{
DependsOnContainer: &dockerCompose.DependsOnContainer{Slice: []string{}},
},
expectedResult: false,
},
{
equalableA: &dockerCompose.Service{
DependsOnContainer: &dockerCompose.DependsOnContainer{Slice: []string{"app"}},
},
equalableB: &dockerCompose.Service{
DependsOnContainer: &dockerCompose.DependsOnContainer{Slice: []string{"app"}},
},
expectedResult: true,
},
{
equalableA: &dockerCompose.Service{
DependsOnContainer: &dockerCompose.DependsOnContainer{DependsOn: map[string]*dockerCompose.ServiceDependsOn{"app": {Condition: "service_started"}}},
},
equalableB: &dockerCompose.Service{
DependsOnContainer: &dockerCompose.DependsOnContainer{},
},
expectedResult: false,
},
{
equalableA: &dockerCompose.Service{
DependsOnContainer: &dockerCompose.DependsOnContainer{DependsOn: map[string]*dockerCompose.ServiceDependsOn{"app": {Condition: "service_started"}}},
},
equalableB: &dockerCompose.Service{
DependsOnContainer: &dockerCompose.DependsOnContainer{},
},
expectedResult: false,
},
{
equalableA: &dockerCompose.Service{
DependsOnContainer: &dockerCompose.DependsOnContainer{DependsOn: map[string]*dockerCompose.ServiceDependsOn{"app": {Condition: "service_started"}}},
},
equalableB: &dockerCompose.Service{
DependsOnContainer: &dockerCompose.DependsOnContainer{DependsOn: map[string]*dockerCompose.ServiceDependsOn{}},
},
expectedResult: false,
},
{
equalableA: &dockerCompose.Service{
DependsOnContainer: &dockerCompose.DependsOnContainer{DependsOn: map[string]*dockerCompose.ServiceDependsOn{"app": {Condition: "service_started"}}},
},
equalableB: &dockerCompose.Service{
DependsOnContainer: &dockerCompose.DependsOnContainer{DependsOn: map[string]*dockerCompose.ServiceDependsOn{"app": {Condition: "service_started"}}},
},
expectedResult: true,
},
@ -418,19 +473,19 @@ func TestService_Equal(t *testing.T) {
},
{
equalableA: &dockerCompose.Service{
Ports: []string{"80:80/tcp"},
Ports: []dockerCompose.Port{"80:80/tcp"},
},
equalableB: &dockerCompose.Service{
Ports: []string{"80:80/tcp"},
Ports: []dockerCompose.Port{"80:80/tcp"},
},
expectedResult: true,
},
{
equalableA: &dockerCompose.Service{
Ports: []string{"80:80/tcp"},
Ports: []dockerCompose.Port{"80:80/tcp"},
},
equalableB: &dockerCompose.Service{
Ports: []string{"80:80/udp"},
Ports: []dockerCompose.Port{"80:80/udp"},
},
expectedResult: false,
},
@ -598,46 +653,46 @@ func TestService_MergeExistingWin(t *testing.T) {
// DependsOn
{
serviceDeploymentA: &dockerCompose.Service{
DependsOn: []string{"app"},
DependsOnContainer: &dockerCompose.DependsOnContainer{DependsOn: map[string]*dockerCompose.ServiceDependsOn{"app": {Condition: "service_started"}}},
},
serviceDeploymentB: &dockerCompose.Service{
DependsOn: []string{},
DependsOnContainer: &dockerCompose.DependsOnContainer{},
},
expectedService: &dockerCompose.Service{
DependsOn: []string{"app"},
DependsOnContainer: &dockerCompose.DependsOnContainer{DependsOn: map[string]*dockerCompose.ServiceDependsOn{"app": {Condition: "service_started"}}},
},
},
{
serviceDeploymentA: &dockerCompose.Service{
DependsOn: []string{},
DependsOnContainer: &dockerCompose.DependsOnContainer{},
},
serviceDeploymentB: &dockerCompose.Service{
DependsOn: []string{"app"},
DependsOnContainer: &dockerCompose.DependsOnContainer{DependsOn: map[string]*dockerCompose.ServiceDependsOn{"app": {Condition: "service_started"}}},
},
expectedService: &dockerCompose.Service{
DependsOn: []string{"app"},
DependsOnContainer: &dockerCompose.DependsOnContainer{DependsOn: map[string]*dockerCompose.ServiceDependsOn{"app": {Condition: "service_started"}}},
},
},
{
serviceDeploymentA: &dockerCompose.Service{
DependsOn: []string{"app"},
DependsOnContainer: &dockerCompose.DependsOnContainer{DependsOn: map[string]*dockerCompose.ServiceDependsOn{"app": {Condition: "service_started"}}},
},
serviceDeploymentB: &dockerCompose.Service{
DependsOn: []string{"app"},
DependsOnContainer: &dockerCompose.DependsOnContainer{DependsOn: map[string]*dockerCompose.ServiceDependsOn{"app": {Condition: "service_started"}}},
},
expectedService: &dockerCompose.Service{
DependsOn: []string{"app"},
DependsOnContainer: &dockerCompose.DependsOnContainer{DependsOn: map[string]*dockerCompose.ServiceDependsOn{"app": {Condition: "service_started"}}},
},
},
{
serviceDeploymentA: &dockerCompose.Service{
DependsOn: []string{"app"},
DependsOnContainer: &dockerCompose.DependsOnContainer{DependsOn: map[string]*dockerCompose.ServiceDependsOn{"app": {Condition: "service_started"}}},
},
serviceDeploymentB: &dockerCompose.Service{
DependsOn: []string{""},
DependsOnContainer: nil,
},
expectedService: &dockerCompose.Service{
DependsOn: []string{"app"},
DependsOnContainer: &dockerCompose.DependsOnContainer{DependsOn: map[string]*dockerCompose.ServiceDependsOn{"app": {Condition: "service_started"}}},
},
},
@ -1108,13 +1163,13 @@ func TestService_MergeExistingWin(t *testing.T) {
},
{
serviceDeploymentA: &dockerCompose.Service{
Ports: []string{},
Ports: []dockerCompose.Port{},
},
serviceDeploymentB: &dockerCompose.Service{
Ports: nil,
},
expectedService: &dockerCompose.Service{
Ports: []string{},
Ports: []dockerCompose.Port{},
},
},
{
@ -1122,65 +1177,102 @@ func TestService_MergeExistingWin(t *testing.T) {
Ports: nil,
},
serviceDeploymentB: &dockerCompose.Service{
Ports: []string{},
Ports: []dockerCompose.Port{},
},
expectedService: &dockerCompose.Service{
Ports: []string{},
Ports: []dockerCompose.Port{},
},
},
{
serviceDeploymentA: &dockerCompose.Service{
Ports: []string{},
Ports: []dockerCompose.Port{},
},
serviceDeploymentB: &dockerCompose.Service{
Ports: []string{},
Ports: []dockerCompose.Port{},
},
expectedService: &dockerCompose.Service{
Ports: []string{},
Ports: []dockerCompose.Port{},
},
},
{
serviceDeploymentA: &dockerCompose.Service{
Ports: []string{"80:80"},
Ports: []dockerCompose.Port{"80:80"},
},
serviceDeploymentB: &dockerCompose.Service{
Ports: []string{"80:80"},
Ports: []dockerCompose.Port{"80:80"},
},
expectedService: &dockerCompose.Service{
Ports: []string{"80:80"},
Ports: []dockerCompose.Port{"80:80"},
},
},
{
serviceDeploymentA: &dockerCompose.Service{
Ports: []string{"80:80"},
Ports: []dockerCompose.Port{"80:80"},
},
serviceDeploymentB: &dockerCompose.Service{
Ports: []string{"10080:80"},
Ports: []dockerCompose.Port{"80:8080"},
},
expectedService: &dockerCompose.Service{
Ports: []string{"80:80"},
Ports: []dockerCompose.Port{"80:80"},
},
},
{
serviceDeploymentA: &dockerCompose.Service{
Ports: []string{"80:80/tcp"},
Ports: []dockerCompose.Port{"80:80/tcp"},
},
serviceDeploymentB: &dockerCompose.Service{
Ports: []string{"80:80"},
Ports: []dockerCompose.Port{"80:80"},
},
expectedService: &dockerCompose.Service{
Ports: []string{"80:80/tcp"},
Ports: []dockerCompose.Port{"80:80/tcp"},
},
},
{
serviceDeploymentA: &dockerCompose.Service{
Ports: []string{"80:80"},
Ports: []dockerCompose.Port{"80:80"},
},
serviceDeploymentB: &dockerCompose.Service{
Ports: []string{"10080:80/udp"},
Ports: []dockerCompose.Port{"80:80/udp"},
},
expectedService: &dockerCompose.Service{
Ports: []string{"80:80"},
Ports: []dockerCompose.Port{"80:80"},
},
},
{
serviceDeploymentA: &dockerCompose.Service{
Ports: []dockerCompose.Port{
"0.0.0.0:15005:5005/tcp",
"0.0.0.0:18080:8080/tcp",
},
},
serviceDeploymentB: &dockerCompose.Service{
Ports: []dockerCompose.Port{"0.0.0.0:6300:6300/tcp"},
},
expectedService: &dockerCompose.Service{
Ports: []dockerCompose.Port{
"0.0.0.0:15005:5005/tcp",
"0.0.0.0:18080:8080/tcp",
"0.0.0.0:6300:6300/tcp",
},
},
},
{
serviceDeploymentA: &dockerCompose.Service{
Ports: []dockerCompose.Port{
"0.0.0.0:15005:5005/tcp",
"0.0.0.0:18080:8080/tcp",
},
},
serviceDeploymentB: &dockerCompose.Service{
Ports: []dockerCompose.Port{
"15005:15005",
},
},
expectedService: &dockerCompose.Service{
Ports: []dockerCompose.Port{
"0.0.0.0:15005:5005/tcp",
"0.0.0.0:18080:8080/tcp",
},
},
},
@ -1545,46 +1637,46 @@ func TestService_MergeLastWin(t *testing.T) {
// DependsOn
{
serviceDeploymentA: &dockerCompose.Service{
DependsOn: []string{"app"},
DependsOnContainer: &dockerCompose.DependsOnContainer{DependsOn: map[string]*dockerCompose.ServiceDependsOn{"app": {Condition: "service_started"}}},
},
serviceDeploymentB: &dockerCompose.Service{
DependsOn: []string{},
DependsOnContainer: &dockerCompose.DependsOnContainer{},
},
expectedService: &dockerCompose.Service{
DependsOn: []string{"app"},
DependsOnContainer: &dockerCompose.DependsOnContainer{DependsOn: map[string]*dockerCompose.ServiceDependsOn{"app": {Condition: "service_started"}}},
},
},
{
serviceDeploymentA: &dockerCompose.Service{
DependsOn: []string{},
DependsOnContainer: &dockerCompose.DependsOnContainer{},
},
serviceDeploymentB: &dockerCompose.Service{
DependsOn: []string{"app"},
DependsOnContainer: &dockerCompose.DependsOnContainer{DependsOn: map[string]*dockerCompose.ServiceDependsOn{"app": {Condition: "service_started"}}},
},
expectedService: &dockerCompose.Service{
DependsOn: []string{"app"},
DependsOnContainer: &dockerCompose.DependsOnContainer{DependsOn: map[string]*dockerCompose.ServiceDependsOn{"app": {Condition: "service_started"}}},
},
},
{
serviceDeploymentA: &dockerCompose.Service{
DependsOn: []string{"app"},
DependsOnContainer: &dockerCompose.DependsOnContainer{DependsOn: map[string]*dockerCompose.ServiceDependsOn{"app": {Condition: "service_started"}}},
},
serviceDeploymentB: &dockerCompose.Service{
DependsOn: []string{"app"},
DependsOnContainer: &dockerCompose.DependsOnContainer{DependsOn: map[string]*dockerCompose.ServiceDependsOn{"app": {Condition: "service_started"}}},
},
expectedService: &dockerCompose.Service{
DependsOn: []string{"app"},
DependsOnContainer: &dockerCompose.DependsOnContainer{DependsOn: map[string]*dockerCompose.ServiceDependsOn{"app": {Condition: "service_started"}}},
},
},
{
serviceDeploymentA: &dockerCompose.Service{
DependsOn: []string{"app"},
DependsOnContainer: &dockerCompose.DependsOnContainer{DependsOn: map[string]*dockerCompose.ServiceDependsOn{"app": {Condition: "service_started"}}},
},
serviceDeploymentB: &dockerCompose.Service{
DependsOn: []string{""},
DependsOnContainer: nil,
},
expectedService: &dockerCompose.Service{
DependsOn: []string{"app"},
DependsOnContainer: &dockerCompose.DependsOnContainer{DependsOn: map[string]*dockerCompose.ServiceDependsOn{"app": {Condition: "service_started"}}},
},
},
@ -2016,13 +2108,13 @@ func TestService_MergeLastWin(t *testing.T) {
},
{
serviceDeploymentA: &dockerCompose.Service{
Ports: []string{},
Ports: []dockerCompose.Port{},
},
serviceDeploymentB: &dockerCompose.Service{
Ports: nil,
},
expectedService: &dockerCompose.Service{
Ports: []string{},
Ports: []dockerCompose.Port{},
},
},
{
@ -2030,76 +2122,113 @@ func TestService_MergeLastWin(t *testing.T) {
Ports: nil,
},
serviceDeploymentB: &dockerCompose.Service{
Ports: []string{},
Ports: []dockerCompose.Port{},
},
expectedService: &dockerCompose.Service{
Ports: []string{},
Ports: []dockerCompose.Port{},
},
},
{
serviceDeploymentA: &dockerCompose.Service{
Ports: []string{},
Ports: []dockerCompose.Port{},
},
serviceDeploymentB: &dockerCompose.Service{
Ports: []string{},
Ports: []dockerCompose.Port{},
},
expectedService: &dockerCompose.Service{
Ports: []string{},
Ports: []dockerCompose.Port{},
},
},
{
serviceDeploymentA: &dockerCompose.Service{
Ports: []string{"80:80"},
Ports: []dockerCompose.Port{"80:80"},
},
serviceDeploymentB: &dockerCompose.Service{
Ports: []string{"80:80"},
Ports: []dockerCompose.Port{"80:80"},
},
expectedService: &dockerCompose.Service{
Ports: []string{"80:80"},
Ports: []dockerCompose.Port{"80:80"},
},
},
{
serviceDeploymentA: &dockerCompose.Service{
Ports: []string{"80:80"},
Ports: []dockerCompose.Port{"80:80"},
},
serviceDeploymentB: &dockerCompose.Service{
Ports: []string{"10080:80"},
Ports: []dockerCompose.Port{"80:10080"},
},
expectedService: &dockerCompose.Service{
Ports: []string{"10080:80"},
Ports: []dockerCompose.Port{"80:10080"},
},
},
{
serviceDeploymentA: &dockerCompose.Service{
Ports: []string{"80:80/tcp"},
Ports: []dockerCompose.Port{"80:80/tcp"},
},
serviceDeploymentB: &dockerCompose.Service{
Ports: []string{"80:80"},
Ports: []dockerCompose.Port{"80:80"},
},
expectedService: &dockerCompose.Service{
Ports: []string{"80:80"},
Ports: []dockerCompose.Port{"80:80"},
},
},
{
serviceDeploymentA: &dockerCompose.Service{
Ports: []string{"80:80"},
Ports: []dockerCompose.Port{"80:80"},
},
serviceDeploymentB: &dockerCompose.Service{
Ports: []string{"10080:80/udp"},
Ports: []dockerCompose.Port{"80:80/udp"},
},
expectedService: &dockerCompose.Service{
Ports: []string{"10080:80/udp"},
Ports: []dockerCompose.Port{"80:80/udp"},
},
},
{
serviceDeploymentA: &dockerCompose.Service{
Ports: []string{"80:80"},
Ports: []dockerCompose.Port{"80:80"},
},
serviceDeploymentB: &dockerCompose.Service{
Ports: []string{""},
Ports: []dockerCompose.Port{""},
},
expectedService: &dockerCompose.Service{
Ports: []string{"80:80"},
Ports: []dockerCompose.Port{"80:80"},
},
},
{
serviceDeploymentA: &dockerCompose.Service{
Ports: []dockerCompose.Port{
"0.0.0.0:15005:5005/tcp",
"0.0.0.0:18080:8080/tcp",
},
},
serviceDeploymentB: &dockerCompose.Service{
Ports: []dockerCompose.Port{"0.0.0.0:6300:6300/tcp"},
},
expectedService: &dockerCompose.Service{
Ports: []dockerCompose.Port{
"0.0.0.0:15005:5005/tcp",
"0.0.0.0:18080:8080/tcp",
"0.0.0.0:6300:6300/tcp",
},
},
},
{
serviceDeploymentA: &dockerCompose.Service{
Ports: []dockerCompose.Port{
"0.0.0.0:15005:5005/tcp",
"0.0.0.0:18080:8080/tcp",
},
},
serviceDeploymentB: &dockerCompose.Service{
Ports: []dockerCompose.Port{
"0.0.0.0:15005:15005",
},
},
expectedService: &dockerCompose.Service{
Ports: []dockerCompose.Port{
"0.0.0.0:15005:15005",
"0.0.0.0:18080:8080/tcp",
},
},
},
@ -2372,6 +2501,203 @@ func TestService_MergeLastWin(t *testing.T) {
}
}
func TestService_RemovePortByDst(t *testing.T) {
require := require.New(t)
testCases := []struct {
s *dockerCompose.Service
removePortsByDst []string
expectedPorts []dockerCompose.Port
}{
{
s: &dockerCompose.Service{
Ports: []dockerCompose.Port{
"80:80/tcp",
"0.0.0.0:443:172.25.18.20:443/tcp",
"10.11.12.13:53:53/tcp",
"10.11.12.13:53:53/udp",
},
},
removePortsByDst: []string{
"53",
},
expectedPorts: []dockerCompose.Port{
"80:80/tcp",
"0.0.0.0:443:172.25.18.20:443/tcp",
},
},
{
s: &dockerCompose.Service{
Ports: []dockerCompose.Port{
"80:80/tcp",
"0.0.0.0:443:172.25.18.20:443/tcp",
"10.11.12.13:53:53/tcp",
"10.11.12.13:53:53/udp",
},
},
removePortsByDst: []string{
"172.25.18.20:443",
},
expectedPorts: []dockerCompose.Port{
"80:80/tcp",
"10.11.12.13:53:53/tcp",
"10.11.12.13:53:53/udp",
},
},
{
s: &dockerCompose.Service{
Ports: []dockerCompose.Port{
"0.0.0.0:443:443/tcp",
},
},
removePortsByDst: []string{
"443",
},
expectedPorts: []dockerCompose.Port{},
},
}
for i, testCase := range testCases {
for _, removePortByDst := range testCase.removePortsByDst {
testCase.s.RemovePortByDst(removePortByDst)
}
require.Equal(testCase.expectedPorts, testCase.s.Ports, "TestCase %v", i)
}
}
func TestService_RemovePortBySrc(t *testing.T) {
require := require.New(t)
testCases := []struct {
s *dockerCompose.Service
removePortsBySrc []string
expectedPorts []dockerCompose.Port
}{
{
s: &dockerCompose.Service{
Ports: []dockerCompose.Port{
"80:80/tcp",
"0.0.0.0:443:172.25.18.20:443/tcp",
"10.11.12.13:53:53/tcp",
"10.11.12.13:53:53/udp",
},
},
removePortsBySrc: []string{
"10.11.12.13:53",
},
expectedPorts: []dockerCompose.Port{
"80:80/tcp",
"0.0.0.0:443:172.25.18.20:443/tcp",
},
},
{
s: &dockerCompose.Service{
Ports: []dockerCompose.Port{
"80:80/tcp",
"0.0.0.0:443:172.25.18.20:443/tcp",
"10.11.12.13:53:53/tcp",
"10.11.12.13:53:53/udp",
},
},
removePortsBySrc: []string{
"0.0.0.0:443",
},
expectedPorts: []dockerCompose.Port{
"80:80/tcp",
"10.11.12.13:53:53/tcp",
"10.11.12.13:53:53/udp",
},
},
{
s: &dockerCompose.Service{
Ports: []dockerCompose.Port{
"0.0.0.0:443:443/tcp",
},
},
removePortsBySrc: []string{
"0.0.0.0:443",
},
expectedPorts: []dockerCompose.Port{},
},
}
for i, testCase := range testCases {
for _, removePortBySrc := range testCase.removePortsBySrc {
testCase.s.RemovePortBySrc(removePortBySrc)
}
require.Equal(testCase.expectedPorts, testCase.s.Ports, "TestCase %v", i)
}
}
func TestService_SetPort(t *testing.T) {
require := require.New(t)
testCases := []struct {
s *dockerCompose.Service
setPorts []string
expectedPorts []dockerCompose.Port
}{
{
s: &dockerCompose.Service{
Ports: []dockerCompose.Port{"8080:8080"},
},
setPorts: []string{},
expectedPorts: []dockerCompose.Port{"8080:8080"},
},
{
s: &dockerCompose.Service{
Ports: []dockerCompose.Port{"8080:8080"},
},
setPorts: []string{"8080:8080"},
expectedPorts: []dockerCompose.Port{"8080:8080"},
},
{
s: &dockerCompose.Service{
Ports: []dockerCompose.Port{"8080:8080"},
},
setPorts: []string{"8080:80"},
expectedPorts: []dockerCompose.Port{"8080:80"},
},
{
s: &dockerCompose.Service{
Ports: []dockerCompose.Port{"0.0.0.0:8080:8080"},
},
setPorts: []string{},
expectedPorts: []dockerCompose.Port{"0.0.0.0:8080:8080"},
},
{
s: &dockerCompose.Service{
Ports: []dockerCompose.Port{"0.0.0.0:8080:8080"},
},
setPorts: []string{"0.0.0.0:8080:8080"},
expectedPorts: []dockerCompose.Port{"0.0.0.0:8080:8080"},
},
{
s: &dockerCompose.Service{
Ports: []dockerCompose.Port{"0.0.0.0:8080:8080"},
},
setPorts: []string{"0.0.0.0:8080:80"},
expectedPorts: []dockerCompose.Port{"0.0.0.0:8080:80"},
},
{
s: &dockerCompose.Service{
Ports: []dockerCompose.Port{"0.0.0.0:8080:8080", "0.0.0.0:8443:8443"},
},
setPorts: []string{"0.0.0.0:8080:80"},
expectedPorts: []dockerCompose.Port{"0.0.0.0:8080:80", "0.0.0.0:8443:8443"},
},
}
for i, testCase := range testCases {
for _, setPort := range testCase.setPorts {
testCase.s.SetPort(setPort)
}
require.ElementsMatch(testCase.expectedPorts, testCase.s.Ports, "TestCase %v", i)
}
}
func TestSecretDeploy_Equal(t *testing.T) {
require := require.New(t)

View File

@ -8,7 +8,7 @@ import (
"os"
"git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose"
"gopkg.in/yaml.v2"
"gopkg.in/yaml.v3"
)
func Fetch(urls ...string) ([]*dockerCompose.Config, error) {
@ -75,7 +75,7 @@ func getDockerComposeViaHTTP(url string) (*dockerCompose.Config, error) {
func readDockerComposeFromFile(name string) (*dockerCompose.Config, error) {
fileStat, err := os.Stat(name)
switch {
case errors.Is(err, os.ErrNotExist):
case err != nil:
return nil, err
case fileStat.IsDir():
return nil, fmt.Errorf("%w: %s", ErrorPathIsDir, name)

View File

@ -1,8 +1,6 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"assignees": [ "volker.raschek" ],
"automergeStrategy": "merge-commit",
"automergeType": "pr",
"labels": [ "renovate" ],
"packageRules": [
{
@ -17,15 +15,27 @@
"automerge": true,
"matchBaseBranches": [ "master" ],
"matchManagers": [ "dockerfile" ],
"matchUpdateTypes": [ "patch" ]
"matchUpdateTypes": [ "minor", "patch" ]
},
{
"addLabels": [ "renovate/dcmerge", "renovate/automerge" ],
"automerge": false,
"matchPackageNames": [ "dcmerge" ],
"matchManagers": [ "regex" ]
"description": "Automatically update minor and patch versions of go modules",
"addLabels": [ "renovate/gomod", "renovate/automerge" ],
"automerge": true,
"matchManagers": [ "gomod" ],
"matchUpdateTypes": [ "minor", "patch" ]
},
{
"description": "Disable major update version of go modules",
"enabled": false,
"matchManagers": [ "gomod" ],
"matchPackageNames": [
"gopkg.in/yaml.v2"
]
}
],
"postUpdateOptions": [
"gomodTidy"
],
"rebaseLabel": "renovate/rebase",
"rebaseWhen": "behind-base-branch"
}