Compare commits

...

11 Commits

Author SHA1 Message Date
7ed6fee298
chore(deps): update davidanson/markdownlint-cli2-action action to v20
All checks were successful
Golang Tests / unittest (stable, ubuntu-latest-amd64) (pull_request) Successful in 6s
Golang CI lint / golangci (stable, ubuntu-latest-amd64) (pull_request) Successful in 8s
Lint Markdown files / markdown-lint (pull_request) Successful in 14s
Golang Tests / unittest (stable, ubuntu-latest-arm64) (pull_request) Successful in 33s
Golang CI lint / golangci (stable, ubuntu-latest-arm64) (pull_request) Successful in 46s
Golang Tests / unittest (stable, ubuntu-latest-amd64) (push) Successful in 5s
Golang CI lint / golangci (stable, ubuntu-latest-amd64) (push) Successful in 8s
Lint Markdown files / markdown-lint (push) Successful in 4s
Golang Tests / unittest (stable, ubuntu-latest-arm64) (push) Successful in 22s
Golang CI lint / golangci (stable, ubuntu-latest-arm64) (push) Successful in 30s
2025-06-01 11:43:25 +00:00
9c256a53c4
chore(ci): use DavidAnson/markdownlint-cli2-action@v19.1.0
All checks were successful
Golang Tests / unittest (stable, ubuntu-latest-amd64) (push) Successful in 6s
Golang CI lint / golangci (stable, ubuntu-latest-amd64) (push) Successful in 8s
Lint Markdown files / markdown-lint (push) Successful in 4s
Golang Tests / unittest (stable, ubuntu-latest-arm64) (push) Successful in 31s
Golang CI lint / golangci (stable, ubuntu-latest-arm64) (push) Successful in 47s
2025-06-01 13:38:28 +02:00
a5423dfe4d
chore(ci): use matrix to run tests on multiple architectures
All checks were successful
Golang Tests / unittest (stable, ubuntu-latest-amd64) (push) Successful in 27s
Golang CI lint / golangci (stable, ubuntu-latest-amd64) (push) Successful in 15s
Markdown linter / markdown-lint (push) Successful in 3s
Golang Tests / unittest (stable, ubuntu-latest-arm64) (push) Successful in 1m18s
Golang CI lint / golangci (stable, ubuntu-latest-arm64) (push) Successful in 46s
2025-06-01 12:11:41 +02:00
9705b468fa
chore(ci): be golangci-lint compatible
All checks were successful
Golang Tests / unittest (push) Successful in 28s
Markdown linter / markdown-lint (push) Successful in 3s
Golang CI lint / golangci (stable, ubuntu-latest-amd64) (push) Successful in 1m49s
Golang CI lint / golangci (stable, ubuntu-latest-arm64) (push) Successful in 2m13s
2025-05-31 23:02:00 +02:00
f8a7634e91
chore(ci): add matrix for golangci-lint
Some checks failed
Markdown linter / markdown-lint (push) Successful in 7s
Golang Tests / unittest (push) Successful in 30s
Golang CI lint / golangci (stable, ubuntu-latest-amd64) (push) Failing after 43s
Golang CI lint / golangci (stable, ubuntu-latest-arm64) (push) Failing after 3m24s
2025-05-31 22:57:52 +02:00
96bdc09d14
chore(ci): add golangci-lint
Some checks failed
Golang Tests / unittest (push) Successful in 30s
Markdown linter / markdown-lint (push) Successful in 10s
Golang CI lint / golangci (push) Failing after 3m0s
2025-05-31 22:54:06 +02:00
96447f88b3
chore(ci): update workflow_dispatch for update docker hub description
All checks were successful
Golang Tests / unittest (push) Successful in 32s
Markdown linter / markdown-lint (push) Successful in 14s
2025-05-31 22:05:54 +02:00
8635fd3334
fix(ignore): add dist directory
All checks were successful
Golang Tests / unittest (push) Successful in 20s
Markdown linter / markdown-lint (push) Successful in 10s
2025-05-31 21:41:49 +02:00
a6da12db45
style(vscode): remove project config
All checks were successful
Markdown linter / markdown-lint (push) Successful in 13s
Golang Tests / unittest (push) Successful in 25s
2025-05-31 21:05:39 +02:00
07067b6b47
chore(Makefile): remove unqualified image tag
All checks were successful
Markdown linter / markdown-lint (push) Successful in 8s
Golang Tests / unittest (push) Successful in 34s
2025-05-31 18:11:35 +02:00
b50b9d8f19
style(linter): be compliant with golangci-lint
All checks were successful
Markdown linter / markdown-lint (push) Successful in 12s
Golang Tests / unittest (push) Successful in 29s
2025-05-29 13:44:55 +02:00
12 changed files with 67 additions and 40 deletions

View File

@ -9,13 +9,16 @@ on:
jobs: jobs:
unittest: unittest:
runs-on: runs-on: ${{ matrix.os }}
- ubuntu-latest strategy:
matrix:
go: [ stable ]
os: [ ubuntu-latest-amd64, ubuntu-latest-arm64 ]
steps: steps:
- uses: actions/checkout@v4.2.2 - uses: actions/checkout@v4.2.2
- uses: actions/setup-go@v5.5.0 - uses: actions/setup-go@v5.5.0
with: with:
go-version: stable go-version: ${{ matrix.go }}
- env: - env:
GOPROXY: ${{ vars.GOPROXY }} GOPROXY: ${{ vars.GOPROXY }}
run: make test/unit run: make test/unit

View File

@ -0,0 +1,27 @@
name: Golang CI lint
on:
pull_request:
types: [ "opened", "reopened", "synchronize" ]
push:
branches: [ '**' ]
tags-ignore: [ '**' ]
permissions:
contents: read
jobs:
golangci:
runs-on: ${{ matrix.os }}
strategy:
matrix:
go: [ stable ]
os: [ ubuntu-latest-amd64, ubuntu-latest-arm64 ]
steps:
- uses: actions/checkout@v4.2.2
- uses: actions/setup-go@v5.5.0
with:
go-version: ${{ matrix.go }}
- uses: golangci/golangci-lint-action@v8.0.0
with:
version: v2.1

View File

@ -1,20 +1,18 @@
name: Markdown linter name: 'Lint Markdown files'
on: on:
pull_request: pull_request:
types: [ "opened", "reopened", "synchronize" ] types: [ "opened", "reopened", "synchronize" ]
push: push:
branches: [ '**' ] branches: [ '*' ]
tags-ignore: [ '**' ] tags-ignore: [ '*' ]
workflow_dispatch: {}
jobs: jobs:
markdown-lint: markdown-lint:
container:
image: git.cryptic.systems/volker.raschek/markdownlint:0.45.0
runs-on: runs-on:
- ubuntu-latest - ubuntu-latest
steps: steps:
- uses: actions/checkout@v4.2.2 - uses: actions/checkout@v4.2.2
- name: Lint Markdown files - uses: DavidAnson/markdownlint-cli2-action@v20.0.0
run: markdownlint --config .markdownlint.yaml . with:
globs: '**/*.md'

View File

@ -4,6 +4,7 @@ on:
push: push:
branches: [ 'master' ] branches: [ 'master' ]
paths: [ 'README.md' ] paths: [ 'README.md' ]
workflow_dispatch: {}
jobs: jobs:
update-description-on-hub-docker-io: update-description-on-hub-docker-io:

3
.gitignore vendored
View File

@ -1,2 +1,3 @@
dcmerge dcmerge
coverage.txt coverage.txt
dist

View File

@ -1,3 +0,0 @@
{
"rewrap.wrappingColumn": 120,
}

View File

@ -20,7 +20,6 @@ DCMERGE_IMAGE_NAMESPACE?=${DCMERGE_IMAGE_REGISTRY_USER}
DCMERGE_IMAGE_NAME:=${EXECUTABLE} DCMERGE_IMAGE_NAME:=${EXECUTABLE}
DCMERGE_IMAGE_VERSION?=latest DCMERGE_IMAGE_VERSION?=latest
DCMERGE_IMAGE_FULLY_QUALIFIED=${DCMERGE_IMAGE_REGISTRY_NAME}/${DCMERGE_IMAGE_NAMESPACE}/${DCMERGE_IMAGE_NAME}:${DCMERGE_IMAGE_VERSION} DCMERGE_IMAGE_FULLY_QUALIFIED=${DCMERGE_IMAGE_REGISTRY_NAME}/${DCMERGE_IMAGE_NAMESPACE}/${DCMERGE_IMAGE_NAME}:${DCMERGE_IMAGE_VERSION}
DCMERGE_IMAGE_UNQUALIFIED=${DCMERGE_IMAGE_NAMESPACE}/${DCMERGE_IMAGE_NAME}:${DCMERGE_IMAGE_VERSION}
# BIN # BIN
# ============================================================================== # ==============================================================================
@ -93,14 +92,13 @@ container-image/build:
--no-cache \ --no-cache \
--pull \ --pull \
--tag ${DCMERGE_IMAGE_FULLY_QUALIFIED} \ --tag ${DCMERGE_IMAGE_FULLY_QUALIFIED} \
--tag ${DCMERGE_IMAGE_UNQUALIFIED} \
. .
# DELETE CONTAINER IMAGE # DELETE CONTAINER IMAGE
# ============================================================================== # ==============================================================================
PHONY:=container-image/delete PHONY:=container-image/delete
container-image/delete: container-image/delete:
- ${CONTAINER_RUNTIME} image rm ${DCMERGE_IMAGE_FULLY_QUALIFIED} ${DCMERGE_IMAGE_UNQUALIFIED} - ${CONTAINER_RUNTIME} image rm ${DCMERGE_IMAGE_FULLY_QUALIFIED}
# PUSH CONTAINER IMAGE # PUSH CONTAINER IMAGE
# ============================================================================== # ==============================================================================

View File

@ -19,16 +19,18 @@ func Execute(version string) error {
DisableFlagsInUseLine: true, DisableFlagsInUseLine: true,
ValidArgs: []string{"bash", "zsh", "fish", "powershell"}, ValidArgs: []string{"bash", "zsh", "fish", "powershell"},
Args: cobra.MatchAll(cobra.ExactArgs(1)), Args: cobra.MatchAll(cobra.ExactArgs(1)),
Run: func(cmd *cobra.Command, args []string) { RunE: func(cmd *cobra.Command, args []string) error {
switch args[0] { switch args[0] {
case "bash": case "bash":
cmd.Root().GenBashCompletion(os.Stdout) return cmd.Root().GenBashCompletion(os.Stdout)
case "zsh": case "zsh":
cmd.Root().GenZshCompletion(os.Stdout) return cmd.Root().GenZshCompletion(os.Stdout)
case "fish": case "fish":
cmd.Root().GenFishCompletion(os.Stdout, true) return cmd.Root().GenFishCompletion(os.Stdout, true)
case "powershell": case "powershell":
cmd.Root().GenPowerShellCompletionWithDesc(os.Stdout) return cmd.Root().GenPowerShellCompletionWithDesc(os.Stdout)
default:
return fmt.Errorf("unknown shell: %v", args[0])
} }
}, },
} }
@ -53,17 +55,17 @@ dcmerge docker-compose.yml https://git.example.local/user/repo/docker-compose.ym
func run(cmd *cobra.Command, args []string) error { func run(cmd *cobra.Command, args []string) error {
mergeExisting, err := cmd.Flags().GetBool("existing-win") mergeExisting, err := cmd.Flags().GetBool("existing-win")
if err != nil { if err != nil {
return fmt.Errorf("Failed to parse flag last-win: %s", err) return fmt.Errorf("failed to parse flag last-win: %s", err)
} }
mergeLastWin, err := cmd.Flags().GetBool("last-win") mergeLastWin, err := cmd.Flags().GetBool("last-win")
if err != nil { if err != nil {
return fmt.Errorf("Failed to parse flag last-win: %s", err) return fmt.Errorf("failed to parse flag last-win: %s", err)
} }
outputFile, err := cmd.Flags().GetString("output-file") outputFile, err := cmd.Flags().GetString("output-file")
if err != nil { if err != nil {
return fmt.Errorf("Failed to parse flag output-file: %s", err) return fmt.Errorf("failed to parse flag output-file: %s", err)
} }
dockerComposeConfig := dockerCompose.NewConfig() dockerComposeConfig := dockerCompose.NewConfig()
@ -76,7 +78,7 @@ func run(cmd *cobra.Command, args []string) error {
for _, config := range dockerComposeConfigs { for _, config := range dockerComposeConfigs {
switch { switch {
case mergeExisting && mergeLastWin: case mergeExisting && mergeLastWin:
return fmt.Errorf("Neither --first-win or --last-win can be specified - not booth.") return fmt.Errorf("neither --first-win or --last-win can be specified - not booth")
case mergeExisting && !mergeLastWin: case mergeExisting && !mergeLastWin:
dockerComposeConfig.MergeExistingWin(config) dockerComposeConfig.MergeExistingWin(config)
case !mergeExisting && mergeLastWin: case !mergeExisting && mergeLastWin:
@ -97,7 +99,7 @@ func run(cmd *cobra.Command, args []string) error {
if err != nil { if err != nil {
return err return err
} }
defer f.Close() defer func() { _ = f.Close() }()
yamlEncoder := yaml.NewEncoder(f) yamlEncoder := yaml.NewEncoder(f)
yamlEncoder.SetIndent(2) yamlEncoder.SetIndent(2)

View File

@ -5,5 +5,5 @@ import "git.cryptic.systems/volker.raschek/dcmerge/cmd"
var version string var version string
func main() { func main() {
cmd.Execute(version) _ = cmd.Execute(version)
} }

View File

@ -1305,8 +1305,8 @@ func (sdoc *DependsOnContainer) Equal(equalable Equalable) bool {
// MarshalYAML implements the MarshalYAML interface to customize the behavior when being marshaled into a YAML document. // MarshalYAML implements the MarshalYAML interface to customize the behavior when being marshaled into a YAML document.
func (sdoc *DependsOnContainer) MarshalYAML() (interface{}, error) { func (sdoc *DependsOnContainer) MarshalYAML() (interface{}, error) {
var foundAnotherCondition bool = false var foundAnotherCondition = false
var dependencyNames []string var dependencyNames = make([]string, 0)
for dependencyName, dependencyDefinition := range sdoc.DependsOn { for dependencyName, dependencyDefinition := range sdoc.DependsOn {
if dependencyDefinition.Condition == ServiceDependsOnConditionServiceStarted { if dependencyDefinition.Condition == ServiceDependsOnConditionServiceStarted {

View File

@ -55,8 +55,8 @@ func EqualStringMap[R Equalable](mapA, mapB map[string]R) bool {
// ExistsInMap returns true if object of type any exists under the passed name. // ExistsInMap returns true if object of type any exists under the passed name.
func ExistsInMap[T any](m map[string]T, name string) bool { func ExistsInMap[T any](m map[string]T, name string) bool {
switch { switch m {
case m == nil: case nil:
return false return false
default: default:
_, present := m[name] _, present := m[name]

View File

@ -20,15 +20,15 @@ func Fetch(urls ...string) ([]*dockerCompose.Config, error) {
return nil, err return nil, err
} }
switch { switch dockerComposeURL.Scheme {
case dockerComposeURL.Scheme == "http" || dockerComposeURL.Scheme == "https": case "http", "https":
dockerComposeConfig, err := getDockerComposeViaHTTP(dockerComposeURL.String()) dockerComposeConfig, err := getDockerComposeViaHTTP(dockerComposeURL.String())
if err != nil { if err != nil {
return nil, err return nil, err
} }
dockerComposeConfigs = append(dockerComposeConfigs, dockerComposeConfig) dockerComposeConfigs = append(dockerComposeConfigs, dockerComposeConfig)
case dockerComposeURL.Scheme == "file": case "file":
fallthrough fallthrough
default: default:
dockerComposeConfig, err := readDockerComposeFromFile(dockerComposeURL.Path) dockerComposeConfig, err := readDockerComposeFromFile(dockerComposeURL.Path)
@ -43,7 +43,7 @@ func Fetch(urls ...string) ([]*dockerCompose.Config, error) {
return dockerComposeConfigs, nil return dockerComposeConfigs, nil
} }
var ErrorPathIsDir error = errors.New("Path is a directory") var ErrorPathIsDir error = errors.New("path is a directory")
func getDockerComposeViaHTTP(url string) (*dockerCompose.Config, error) { func getDockerComposeViaHTTP(url string) (*dockerCompose.Config, error) {
req, err := http.NewRequest(http.MethodGet, url, nil) req, err := http.NewRequest(http.MethodGet, url, nil)
@ -55,10 +55,10 @@ func getDockerComposeViaHTTP(url string) (*dockerCompose.Config, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
defer resp.Body.Close() defer func() { _ = resp.Body.Close() }()
if resp.StatusCode != http.StatusOK { if resp.StatusCode != http.StatusOK {
return nil, fmt.Errorf("Received unexpected HTTP-Statuscode %v", resp.StatusCode) return nil, fmt.Errorf("received unexpected HTTP-Statuscode %v", resp.StatusCode)
} }
dockerCompose := dockerCompose.NewConfig() dockerCompose := dockerCompose.NewConfig()
@ -85,7 +85,7 @@ func readDockerComposeFromFile(name string) (*dockerCompose.Config, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
defer file.Close() defer func() { _ = file.Close() }()
dockerCompose := dockerCompose.NewConfig() dockerCompose := dockerCompose.NewConfig()