Skip to content

Add contrib/ini-to-shell #32669

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@ RUN if [ -n "${GITEA_VERSION}" ]; then git checkout "${GITEA_VERSION}"; fi \
# Begin env-to-ini build
RUN go build contrib/environment-to-ini/environment-to-ini.go

# Begin ini-to-shell build
RUN go build contrib/ini-to-shell/ini-to-shell.go

# Copy local files
COPY docker/root /tmp/local

Expand All @@ -38,7 +41,8 @@ RUN chmod 755 /tmp/local/usr/bin/entrypoint \
/tmp/local/etc/s6/openssh/* \
/tmp/local/etc/s6/.s6-svscan/* \
/go/src/code.gitea.io/gitea/gitea \
/go/src/code.gitea.io/gitea/environment-to-ini
/go/src/code.gitea.io/gitea/environment-to-ini \
/go/src/code.gitea.io/gitea/ini-to-shell
RUN chmod 644 /go/src/code.gitea.io/gitea/contrib/autocompletion/bash_autocomplete

FROM docker.io/library/alpine:3.20
Expand Down Expand Up @@ -83,4 +87,5 @@ CMD ["/bin/s6-svscan", "/etc/s6"]
COPY --from=build-env /tmp/local /
COPY --from=build-env /go/src/code.gitea.io/gitea/gitea /app/gitea/gitea
COPY --from=build-env /go/src/code.gitea.io/gitea/environment-to-ini /usr/local/bin/environment-to-ini
COPY --from=build-env /go/src/code.gitea.io/gitea/ini-to-shell /usr/local/bin/ini-to-shell
COPY --from=build-env /go/src/code.gitea.io/gitea/contrib/autocompletion/bash_autocomplete /etc/profile.d/gitea_bash_autocomplete.sh
7 changes: 6 additions & 1 deletion Dockerfile.rootless
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@ RUN if [ -n "${GITEA_VERSION}" ]; then git checkout "${GITEA_VERSION}"; fi \
# Begin env-to-ini build
RUN go build contrib/environment-to-ini/environment-to-ini.go

# Begin ini-to-shell build
RUN go build contrib/ini-to-shell/ini-to-shell.go

# Copy local files
COPY docker/rootless /tmp/local

Expand All @@ -36,7 +39,8 @@ RUN chmod 755 /tmp/local/usr/local/bin/docker-entrypoint.sh \
/tmp/local/usr/local/bin/docker-setup.sh \
/tmp/local/usr/local/bin/gitea \
/go/src/code.gitea.io/gitea/gitea \
/go/src/code.gitea.io/gitea/environment-to-ini
/go/src/code.gitea.io/gitea/environment-to-ini \
/go/src/code.gitea.io/gitea/ini-to-shell
RUN chmod 644 /go/src/code.gitea.io/gitea/contrib/autocompletion/bash_autocomplete

FROM docker.io/library/alpine:3.20
Expand Down Expand Up @@ -71,6 +75,7 @@ RUN chown git:git /var/lib/gitea /etc/gitea
COPY --from=build-env /tmp/local /
COPY --from=build-env --chown=root:root /go/src/code.gitea.io/gitea/gitea /app/gitea/gitea
COPY --from=build-env --chown=root:root /go/src/code.gitea.io/gitea/environment-to-ini /usr/local/bin/environment-to-ini
COPY --from=build-env --chown=root:root /go/src/code.gitea.io/gitea/ini-to-shell /usr/local/bin/ini-to-shell
COPY --from=build-env /go/src/code.gitea.io/gitea/contrib/autocompletion/bash_autocomplete /etc/profile.d/gitea_bash_autocomplete.sh

# git:git
Expand Down
19 changes: 19 additions & 0 deletions contrib/ini-to-shell/README
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
Ini to Shell
==================

This is the counterpart to environment-to-ini. It allows extracting
settings from an existing ini file for further processing in e.g. a shell.

The original incentive comes from the Helm Chart repository, where
the ini file must be recreated on changes while preserving some of them.

Since it is not possible to define an environment variable for the
parent process, this script simply echoes the value.

To build locally, run:

go build contrib/ini-to-shell/ini-to-shell.go

To extract a value from an ini file, run:

reflogExpire=$(go run contrib/ini-to-shell/ini-to-shell.go -c app.ini -s 'git.config' -k 'gc.reflogExpire')
101 changes: 101 additions & 0 deletions contrib/ini-to-shell/ini-to-shell.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
// Copyright 2024 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT

package main

import (
golog "log"
"os"

"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/setting"

"github.com/urfave/cli/v2"
)

func main() {
app := cli.NewApp()
app.Name = "ini-to-shell"
app.Usage = "Extract settings from an existing configuration ini"
app.Description = `This is the counterpart to environment-to-ini.
It allows extracting settings from an existing ini file for further
processing in e.g. a shell.

Since it is not possible to define an environment variable for the
parent process, this script simply echoes the value.

"""
./ini-to-shell -c /path/to/app.ini -s '<section name>' -k '<key name>'
"""

Section and key name are case sensitive and MUST match with the ini content.`
app.Flags = []cli.Flag{
&cli.StringFlag{
Name: "custom-path",
Aliases: []string{"C"},
Value: setting.CustomPath,
Usage: "Custom path file path",
},
&cli.StringFlag{
Name: "config",
Aliases: []string{"c"},
Value: setting.CustomConf,
Usage: "Custom configuration file path",
},
&cli.StringFlag{
Name: "work-path",
Aliases: []string{"w"},
Value: setting.AppWorkPath,
Usage: "Set the gitea working path",
},
&cli.StringFlag{
Name: "section",
Aliases: []string{"s"},
Value: "",
Usage: "Section name to search the given key (leave empty for default/root section)",
},
&cli.StringFlag{
Name: "key",
Aliases: []string{"k"},
Required: true,
Value: "",
Usage: "Key name to extract the value from",
},
}
app.Action = runIniToShell
err := app.Run(os.Args)
if err != nil {
log.Fatal("Failed to run app with %s: %v", os.Args, err)
}
}

func runIniToShell(c *cli.Context) error {
setting.InitWorkPathAndCfgProvider(os.Getenv, setting.ArgWorkPathAndCustomConf{
WorkPath: c.String("work-path"),
CustomPath: c.String("custom-path"),
CustomConf: c.String("config"),
})
Comment on lines +73 to +77
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Necessary?

I think we only need to pass the "config file" to the program, without InitWorkPathAndCfgProvider, and just NewConfigProviderFromFile


cfg, err := setting.NewConfigProviderFromFile(setting.CustomConf)
if err != nil {
log.Fatal("Failed to load custom conf '%s': %v", setting.CustomConf, err)
}

sName := c.String("section")
kName := c.String("key")

section, err := cfg.GetSection(sName)
if err != nil {
log.Fatal("Failed to load section '%s': %v", sName, err)
}

if !section.HasKey(kName) {
log.Fatal("Section '%s' does not have key '%s'", sName, kName)
}

golog.SetOutput(os.Stdout)
golog.SetFlags(golog.Flags() &^ (golog.Ldate | golog.Ltime))
golog.Println(section.Key(kName).Value())
Comment on lines +96 to +98
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I do not think it should use log module, it should just print to stdout as-is


return nil
}
Loading