@@ -9,9 +9,9 @@ SHASUM ?= shasum -a 256 | |||
export PATH := $($(GO) env GOPATH)/bin:$(PATH) | |||
ifeq ($(OS), Windows_NT) | |||
EXECUTABLE := gitea.exe | |||
EXECUTABLE ?= gitea.exe | |||
else | |||
EXECUTABLE := gitea | |||
EXECUTABLE ?= gitea | |||
UNAME_S := $(shell uname -s) | |||
ifeq ($(UNAME_S),Darwin) | |||
SED_INPLACE := sed -i '' | |||
@@ -39,7 +39,7 @@ else | |||
GITEA_VERSION ?= $(shell git describe --tags --always | sed 's/-/+/' | sed 's/^v//') | |||
endif | |||
LDFLAGS := -X "main.MakeVersion=$(MAKE_VERSION)" -X "main.Version=$(GITEA_VERSION)" -X "main.Tags=$(TAGS)" | |||
LDFLAGS := $(LDFLAGS) -X "main.MakeVersion=$(MAKE_VERSION)" -X "main.Version=$(GITEA_VERSION)" -X "main.Tags=$(TAGS)" | |||
PACKAGES ?= $(filter-out code.gitea.io/gitea/integrations/migration-test,$(filter-out code.gitea.io/gitea/integrations,$(shell $(GO) list ./... | grep -v /vendor/))) | |||
SOURCES ?= $(shell find . -name "*.go" -type f) | |||
@@ -70,12 +70,6 @@ TEST_MSSQL_DBNAME ?= gitea | |||
TEST_MSSQL_USERNAME ?= sa | |||
TEST_MSSQL_PASSWORD ?= MwantsaSecurePassword1 | |||
ifeq ($(OS), Windows_NT) | |||
EXECUTABLE := gitea.exe | |||
else | |||
EXECUTABLE := gitea | |||
endif | |||
# $(call strip-suffix,filename) | |||
strip-suffix = $(firstword $(subst ., ,$(1))) | |||
@@ -60,11 +60,6 @@ var ( | |||
Name: "admin", | |||
Usage: "User is an admin", | |||
}, | |||
cli.StringFlag{ | |||
Name: "config, c", | |||
Value: "custom/conf/app.ini", | |||
Usage: "Custom configuration file path", | |||
}, | |||
cli.BoolFlag{ | |||
Name: "random-password", | |||
Usage: "Generate a random password for the user", | |||
@@ -96,11 +91,6 @@ var ( | |||
Value: "", | |||
Usage: "New password to set for user", | |||
}, | |||
cli.StringFlag{ | |||
Name: "config, c", | |||
Value: "custom/conf/app.ini", | |||
Usage: "Custom configuration file path", | |||
}, | |||
}, | |||
} | |||
@@ -123,26 +113,12 @@ var ( | |||
Name: "hooks", | |||
Usage: "Regenerate git-hooks", | |||
Action: runRegenerateHooks, | |||
Flags: []cli.Flag{ | |||
cli.StringFlag{ | |||
Name: "config, c", | |||
Value: "custom/conf/app.ini", | |||
Usage: "Custom configuration file path", | |||
}, | |||
}, | |||
} | |||
microcmdRegenKeys = cli.Command{ | |||
Name: "keys", | |||
Usage: "Regenerate authorized_keys file", | |||
Action: runRegenerateKeys, | |||
Flags: []cli.Flag{ | |||
cli.StringFlag{ | |||
Name: "config, c", | |||
Value: "custom/conf/app.ini", | |||
Usage: "Custom configuration file path", | |||
}, | |||
}, | |||
} | |||
subcmdAuth = cli.Command{ | |||
@@ -160,13 +136,6 @@ var ( | |||
Name: "list", | |||
Usage: "List auth sources", | |||
Action: runListAuth, | |||
Flags: []cli.Flag{ | |||
cli.StringFlag{ | |||
Name: "config, c", | |||
Value: "custom/conf/app.ini", | |||
Usage: "Custom configuration file path", | |||
}, | |||
}, | |||
} | |||
idFlag = cli.Int64Flag{ | |||
@@ -178,22 +147,9 @@ var ( | |||
Name: "delete", | |||
Usage: "Delete specific auth source", | |||
Action: runDeleteAuth, | |||
Flags: []cli.Flag{ | |||
cli.StringFlag{ | |||
Name: "config, c", | |||
Value: "custom/conf/app.ini", | |||
Usage: "Custom configuration file path", | |||
}, | |||
idFlag, | |||
}, | |||
} | |||
oauthCLIFlags = []cli.Flag{ | |||
cli.StringFlag{ | |||
Name: "config, c", | |||
Value: "custom/conf/app.ini", | |||
Usage: "Custom configuration file path", | |||
}, | |||
cli.StringFlag{ | |||
Name: "name", | |||
Value: "", | |||
@@ -266,10 +222,6 @@ func runChangePassword(c *cli.Context) error { | |||
return err | |||
} | |||
if c.IsSet("config") { | |||
setting.CustomConf = c.String("config") | |||
} | |||
if err := initDB(); err != nil { | |||
return err | |||
} | |||
@@ -331,10 +283,6 @@ func runCreateUser(c *cli.Context) error { | |||
return errors.New("must set either password or random-password flag") | |||
} | |||
if c.IsSet("config") { | |||
setting.CustomConf = c.String("config") | |||
} | |||
if err := initDB(); err != nil { | |||
return err | |||
} | |||
@@ -430,10 +378,6 @@ func getReleaseCount(id int64) (int64, error) { | |||
} | |||
func runRegenerateHooks(c *cli.Context) error { | |||
if c.IsSet("config") { | |||
setting.CustomConf = c.String("config") | |||
} | |||
if err := initDB(); err != nil { | |||
return err | |||
} | |||
@@ -441,10 +385,6 @@ func runRegenerateHooks(c *cli.Context) error { | |||
} | |||
func runRegenerateKeys(c *cli.Context) error { | |||
if c.IsSet("config") { | |||
setting.CustomConf = c.String("config") | |||
} | |||
if err := initDB(); err != nil { | |||
return err | |||
} | |||
@@ -473,10 +413,6 @@ func parseOAuth2Config(c *cli.Context) *models.OAuth2Config { | |||
} | |||
func runAddOauth(c *cli.Context) error { | |||
if c.IsSet("config") { | |||
setting.CustomConf = c.String("config") | |||
} | |||
if err := initDB(); err != nil { | |||
return err | |||
} | |||
@@ -490,10 +426,6 @@ func runAddOauth(c *cli.Context) error { | |||
} | |||
func runUpdateOauth(c *cli.Context) error { | |||
if c.IsSet("config") { | |||
setting.CustomConf = c.String("config") | |||
} | |||
if !c.IsSet("id") { | |||
return fmt.Errorf("--id flag is missing") | |||
} | |||
@@ -561,10 +493,6 @@ func runUpdateOauth(c *cli.Context) error { | |||
} | |||
func runListAuth(c *cli.Context) error { | |||
if c.IsSet("config") { | |||
setting.CustomConf = c.String("config") | |||
} | |||
if err := initDB(); err != nil { | |||
return err | |||
} | |||
@@ -587,10 +515,6 @@ func runListAuth(c *cli.Context) error { | |||
} | |||
func runDeleteAuth(c *cli.Context) error { | |||
if c.IsSet("config") { | |||
setting.CustomConf = c.String("config") | |||
} | |||
if !c.IsSet("id") { | |||
return fmt.Errorf("--id flag is missing") | |||
} |
@@ -30,11 +30,6 @@ var CmdDump = cli.Command{ | |||
It can be used for backup and capture Gitea server image to send to maintainer`, | |||
Action: runDump, | |||
Flags: []cli.Flag{ | |||
cli.StringFlag{ | |||
Name: "config, c", | |||
Value: "custom/conf/app.ini", | |||
Usage: "Custom configuration file path", | |||
}, | |||
cli.StringFlag{ | |||
Name: "file, f", | |||
Value: fmt.Sprintf("gitea-dump-%d.zip", time.Now().Unix()), | |||
@@ -61,9 +56,6 @@ It can be used for backup and capture Gitea server image to send to maintainer`, | |||
} | |||
func runDump(ctx *cli.Context) error { | |||
if ctx.IsSet("config") { | |||
setting.CustomConf = ctx.String("config") | |||
} | |||
setting.NewContext() | |||
setting.NewServices() // cannot access session settings otherwise | |||
models.LoadConfigs() |
@@ -16,7 +16,6 @@ import ( | |||
"code.gitea.io/gitea/modules/git" | |||
"code.gitea.io/gitea/modules/log" | |||
"code.gitea.io/gitea/modules/private" | |||
"code.gitea.io/gitea/modules/setting" | |||
"code.gitea.io/gitea/modules/util" | |||
"github.com/urfave/cli" | |||
@@ -28,13 +27,6 @@ var ( | |||
Name: "hook", | |||
Usage: "Delegate commands to corresponding Git hooks", | |||
Description: "This should only be called by Git", | |||
Flags: []cli.Flag{ | |||
cli.StringFlag{ | |||
Name: "config, c", | |||
Value: "custom/conf/app.ini", | |||
Usage: "Custom configuration file path", | |||
}, | |||
}, | |||
Subcommands: []cli.Command{ | |||
subcmdHookPreReceive, | |||
subcmdHookUpdate, | |||
@@ -67,12 +59,6 @@ func runHookPreReceive(c *cli.Context) error { | |||
return nil | |||
} | |||
if c.IsSet("config") { | |||
setting.CustomConf = c.String("config") | |||
} else if c.GlobalIsSet("config") { | |||
setting.CustomConf = c.GlobalString("config") | |||
} | |||
setup("hooks/pre-receive.log") | |||
// the environment setted on serv command | |||
@@ -143,12 +129,6 @@ func runHookUpdate(c *cli.Context) error { | |||
return nil | |||
} | |||
if c.IsSet("config") { | |||
setting.CustomConf = c.String("config") | |||
} else if c.GlobalIsSet("config") { | |||
setting.CustomConf = c.GlobalString("config") | |||
} | |||
setup("hooks/update.log") | |||
return nil | |||
@@ -159,12 +139,6 @@ func runHookPostReceive(c *cli.Context) error { | |||
return nil | |||
} | |||
if c.IsSet("config") { | |||
setting.CustomConf = c.String("config") | |||
} else if c.GlobalIsSet("config") { | |||
setting.CustomConf = c.GlobalString("config") | |||
} | |||
setup("hooks/post-receive.log") | |||
// the environment setted on serv command |
@@ -10,7 +10,6 @@ import ( | |||
"strings" | |||
"code.gitea.io/gitea/models" | |||
"code.gitea.io/gitea/modules/setting" | |||
"github.com/urfave/cli" | |||
) | |||
@@ -41,19 +40,10 @@ var CmdKeys = cli.Command{ | |||
Value: "", | |||
Usage: "Base64 encoded content of the SSH key provided to the SSH Server (requires type to be provided too)", | |||
}, | |||
cli.StringFlag{ | |||
Name: "config, c", | |||
Value: "custom/conf/app.ini", | |||
Usage: "Custom configuration file path", | |||
}, | |||
}, | |||
} | |||
func runKeys(c *cli.Context) error { | |||
if c.IsSet("config") { | |||
setting.CustomConf = c.String("config") | |||
} | |||
if !c.IsSet("username") { | |||
return errors.New("No username provided") | |||
} |
@@ -19,20 +19,9 @@ var CmdMigrate = cli.Command{ | |||
Usage: "Migrate the database", | |||
Description: "This is a command for migrating the database, so that you can run gitea admin create-user before starting the server.", | |||
Action: runMigrate, | |||
Flags: []cli.Flag{ | |||
cli.StringFlag{ | |||
Name: "config, c", | |||
Value: "custom/conf/app.ini", | |||
Usage: "Custom configuration file path", | |||
}, | |||
}, | |||
} | |||
func runMigrate(ctx *cli.Context) error { | |||
if ctx.IsSet("config") { | |||
setting.CustomConf = ctx.String("config") | |||
} | |||
if err := initDB(); err != nil { | |||
return err | |||
} |
@@ -39,11 +39,6 @@ var CmdServ = cli.Command{ | |||
Description: `Serv provide access auth for repositories`, | |||
Action: runServ, | |||
Flags: []cli.Flag{ | |||
cli.StringFlag{ | |||
Name: "config, c", | |||
Value: "custom/conf/app.ini", | |||
Usage: "Custom configuration file path", | |||
}, | |||
cli.BoolFlag{ | |||
Name: "enable-pprof", | |||
}, | |||
@@ -109,9 +104,6 @@ func fail(userMessage, logMessage string, args ...interface{}) { | |||
} | |||
func runServ(c *cli.Context) error { | |||
if c.IsSet("config") { | |||
setting.CustomConf = c.String("config") | |||
} | |||
setup("serv.log") | |||
if setting.SSH.Disabled { |
@@ -40,11 +40,6 @@ and it takes care of all the other things for you`, | |||
Value: "3000", | |||
Usage: "Temporary port number to prevent conflict", | |||
}, | |||
cli.StringFlag{ | |||
Name: "config, c", | |||
Value: "custom/conf/app.ini", | |||
Usage: "Custom configuration file path", | |||
}, | |||
cli.StringFlag{ | |||
Name: "pid, P", | |||
Value: "/var/run/gitea.pid", | |||
@@ -110,10 +105,6 @@ func runLetsEncryptFallbackHandler(w http.ResponseWriter, r *http.Request) { | |||
} | |||
func runWeb(ctx *cli.Context) error { | |||
if ctx.IsSet("config") { | |||
setting.CustomConf = ctx.String("config") | |||
} | |||
if ctx.IsSet("pid") { | |||
setting.CustomPID = ctx.String("pid") | |||
} |
@@ -43,6 +43,7 @@ func runPR() { | |||
if err != nil { | |||
log.Fatal(err) | |||
} | |||
setting.SetCustomPathAndConf("", "") | |||
setting.NewContext() | |||
setting.RepoRootPath, err = ioutil.TempDir(os.TempDir(), "repos") |
@@ -4,7 +4,6 @@ DOCKER_IMAGE ?= gitea/gitea | |||
DOCKER_TAG ?= latest | |||
DOCKER_REF := $(DOCKER_IMAGE):$(DOCKER_TAG) | |||
.PHONY: docker | |||
docker: | |||
docker build --disable-content-trust=false -t $(DOCKER_REF) . | |||
@@ -12,4 +11,4 @@ docker: | |||
.PHONY: docker-build | |||
docker-build: | |||
docker run -ti --rm -v $(CURDIR):/srv/app/src/code.gitea.io/gitea -w /srv/app/src/code.gitea.io/gitea -e TAGS="bindata $(TAGS)" webhippie/golang:edge make clean generate build | |||
docker run -ti --rm -v $(CURDIR):/srv/app/src/code.gitea.io/gitea -w /srv/app/src/code.gitea.io/gitea -e TAGS="bindata $(TAGS)" LDFLAGS="$(LDFLAGS)" webhippie/golang:edge make clean generate build |
@@ -15,19 +15,28 @@ menu: | |||
# Customizing Gitea | |||
Customizing Gitea is typically done using the `custom` folder. This is the central | |||
place to override configuration settings, templates, etc. | |||
Customizing Gitea is typically done using the `CustomPath` folder - by default this is | |||
the `custom` folder from the running directory, but may be different if your build has | |||
set this differently. This is the central place to override configuration settings, | |||
templates, etc. You can check the `CustomPath` using `gitea help`. You can override | |||
the `CustomPath` by setting either the `GITEA_CUSTOM` environment variable or by | |||
using the `--custom-path` option on the `gitea` binary. (The option will override the | |||
environment variable.) | |||
If Gitea is deployed from binary, all default paths will be relative to the Gitea | |||
binary. If installed from a distribution, these paths will likely be modified to | |||
the Linux Filesystem Standard. Gitea will create required folders, including `custom/`. | |||
Application settings are configured in `custom/conf/app.ini`. Distributions may | |||
provide a symlink for `custom` using `/etc/gitea/`. | |||
the Linux Filesystem Standard. Gitea will attempt to create required folders, including | |||
`custom/`. Distributions may provide a symlink for `custom` using `/etc/gitea/`. | |||
Application settings can be found in file `CustomConf` which is by default, | |||
`CustomPath/conf/app.ini` but may be different if your build has set this differently. | |||
Again `gitea help` will allow you review this variable and you can override it using the | |||
`--config` option on the `gitea` binary. | |||
- [Quick Cheat Sheet](https://docs.gitea.io/en-us/config-cheat-sheet/) | |||
- [Complete List](https://github.com/go-gitea/gitea/blob/master/custom/conf/app.ini.sample) | |||
If the `custom` folder can't be found next to the binary, check the `GITEA_CUSTOM` | |||
If the `CustomPath` folder can't be found despite checking `gitea help`, check the `GITEA_CUSTOM` | |||
environment variable; this can be used to override the default path to something else. | |||
`GITEA_CUSTOM` might, for example, be set by an init script. | |||
@@ -38,7 +47,8 @@ environment variable; this can be used to override the default path to something | |||
## Customizing /robots.txt | |||
To make Gitea serve a custom `/robots.txt` (default: empty 404), create a file called | |||
`robots.txt` in the `custom` folder with [expected contents](http://www.robotstxt.org/). | |||
`robots.txt` in the `custom` folder (or `CustomPath`) with | |||
[expected contents](http://www.robotstxt.org/). | |||
## Serving custom public files | |||
@@ -117,3 +117,26 @@ launched manually from command line, it can be killed by pressing `Ctrl + C`. | |||
```bash | |||
./gitea web | |||
``` | |||
## Changing the default CustomPath, CustomConf and AppWorkDir | |||
Gitea will search for a number of things from the `CustomPath`. By default this is | |||
the `custom/` directory in the current working directory when running Gitea. It will also | |||
look for its configuration file `CustomConf` in `$CustomPath/conf/app.ini`, and will use the | |||
current working directory as the relative base path `AppWorkDir` for a number configurable | |||
values. | |||
These values, although useful when developing, may conflict with downstream users preferences. | |||
One option is to use a script file to shadow the `gitea` binary and create an appropriate | |||
environment before running Gitea. However, when building you can change these defaults | |||
using the `LDFLAGS` environment variable for `make`. The appropriate settings are as follows | |||
* To set the `CustomPath` use `LDFLAGS="-X \"code.gitea.io/gitea/modules/setting.CustomPath=custom-path\""` | |||
* For `CustomConf` you should use `-X \"code.gitea.io/gitea/modules/setting.CustomConf=conf.ini\"` | |||
* For `AppWorkDir` you should use `-X \"code.gitea.io/gitea/modules/setting.AppWorkDir=working-directory\"` | |||
Add as many of the strings with their preceding `-X` to the `LDFLAGS` variable and run `make build` | |||
with the appropriate `TAGS` as above. | |||
Running `gitea help` will allow you to review what the computed settings will be for your `gitea`. |
@@ -17,13 +17,16 @@ menu: | |||
### Usage | |||
`gitea [global options] command [command options] [arguments...]` | |||
`gitea [global options] command [command or global options] [arguments...]` | |||
### Global options | |||
- `--help`, `-h`: Show help text and exit. Optional. This can be used with any of the | |||
subcommands to see help text for it. | |||
- `--version`, `-v`: Show version and exit. Optional. (example: `Gitea version | |||
1.1.0+218-g7b907ed built with: bindata, sqlite`). | |||
All global options can be placed at the command level. | |||
- `--help`, `-h`: Show help text and exit. Optional. | |||
- `--version`, `-v`: Show version and exit. Optional. (example: `Gitea version 1.1.0+218-g7b907ed built with: bindata, sqlite`). | |||
- `--custom-path path`, `-C path`: Location of the Gitea custom folder. Optional. (default: $PWD/custom). | |||
- `--config path`, `-c path`: Gitea configuration file path. Optional. (default: custom/conf/app.ini). | |||
### Commands | |||
@@ -33,7 +36,6 @@ Starts the server: | |||
- Options: | |||
- `--port number`, `-p number`: Port number. Optional. (default: 3000). Overrides configuration file. | |||
- `--config path`, `-c path`: Gitea configuration file path. Optional. (default: custom/conf/app.ini). | |||
- `--pid path`, `-P path`: Pidfile path. Optional. | |||
- Examples: | |||
- `gitea web` | |||
@@ -56,7 +58,6 @@ Admin operations: | |||
- `--password value`: Password. Required. | |||
- `--email value`: Email. Required. | |||
- `--admin`: If provided, this makes the user an admin. Optional. | |||
- `--config path`: Gitea configuration file path. Optional. (default: custom/conf/app.ini). | |||
- `--must-change-password`: If provided, the created user will be required to choose a newer password after | |||
the initial login. Optional. (default: true). | |||
- ``--random-password``: If provided, a randomly generated password will be used as the password of | |||
@@ -69,7 +70,6 @@ Admin operations: | |||
- Options: | |||
- `--username value`, `-u value`: Username. Required. | |||
- `--password value`, `-p value`: New password. Required. | |||
- `--config path`: Gitea configuration file path. Optional. (default: custom/conf/app.ini). | |||
- Examples: | |||
- `gitea admin change-password --username myname --password asecurepassword` | |||
- `regenerate` | |||
@@ -82,19 +82,15 @@ Admin operations: | |||
- `auth`: | |||
- `list`: | |||
- Description: lists all external authentication sources that exist | |||
- Options: | |||
- `--config path`: Gitea configuration file path. Optional. (default: custom/conf/app.ini). | |||
- Examples: | |||
- `gitea admin auth list` | |||
- `delete`: | |||
- Options: | |||
- `--id`: ID of source to be deleted. Required. | |||
- `--config path`: Gitea configuration file path. Optional. (default: custom/conf/app.ini). | |||
- Examples: | |||
- `gitea admin auth delete --id 1` | |||
- `add-oauth`: | |||
- Options: | |||
- `--config path`: Gitea configuration file path. Optional. (default: custom/conf/app.ini). | |||
- `--name`: Application Name. | |||
- `--provider`: OAuth2 Provider. | |||
- `--key`: Client ID (Key). | |||
@@ -110,7 +106,6 @@ Admin operations: | |||
- `update-oauth`: | |||
- Options: | |||
- `--id`: ID of source to be updated. Required. | |||
- `--config path`: Gitea configuration file path. Optional. (default: custom/conf/app.ini). | |||
- `--name`: Application Name. | |||
- `--provider`: OAuth2 Provider. | |||
- `--key`: Client ID (Key). | |||
@@ -148,7 +143,6 @@ Dumps all files and databases into a zip file. Outputs into a file like `gitea-d | |||
in the current directory. | |||
- Options: | |||
- `--config path`, `-c path`: Gitea configuration file path. Optional. (default: custom/conf/app.ini). | |||
- `--file name`, `-f name`: Name of the dump file with will be created. Optional. (default: gitea-dump-[timestamp].zip). | |||
- `--tempdir path`, `-t path`: Path to the temporary directory used. Optional. (default: /tmp). | |||
- `--skip-repository`, `-R`: Skip the repository dumping. Optional. |
@@ -118,6 +118,7 @@ func initIntegrationTest() { | |||
setting.CustomConf = giteaConf | |||
} | |||
setting.SetCustomPathAndConf("", "") | |||
setting.NewContext() | |||
setting.CheckLFSVersion() | |||
models.LoadConfigs() |
@@ -7,6 +7,7 @@ | |||
package main // import "code.gitea.io/gitea" | |||
import ( | |||
"fmt" | |||
"os" | |||
"runtime" | |||
"strings" | |||
@@ -30,11 +31,20 @@ var ( | |||
Tags = "" | |||
// MakeVersion holds the current Make version if built with make | |||
MakeVersion = "" | |||
originalAppHelpTemplate = "" | |||
originalCommandHelpTemplate = "" | |||
originalSubcommandHelpTemplate = "" | |||
) | |||
func init() { | |||
setting.AppVer = Version | |||
setting.AppBuiltWith = formatBuiltWith(Tags) | |||
// Grab the original help templates | |||
originalAppHelpTemplate = cli.AppHelpTemplate | |||
originalCommandHelpTemplate = cli.CommandHelpTemplate | |||
originalSubcommandHelpTemplate = cli.SubcommandHelpTemplate | |||
} | |||
func main() { | |||
@@ -55,14 +65,107 @@ arguments - which can alternatively be run by running the subcommand web.` | |||
cmd.CmdMigrate, | |||
cmd.CmdKeys, | |||
} | |||
// Now adjust these commands to add our global configuration options | |||
// First calculate the default paths and set the AppHelpTemplates in this context | |||
setting.SetCustomPathAndConf("", "") | |||
setAppHelpTemplates() | |||
// default configuration flags | |||
defaultFlags := []cli.Flag{ | |||
cli.StringFlag{ | |||
Name: "custom-path, C", | |||
Value: setting.CustomPath, | |||
Usage: "Custom path file path", | |||
}, | |||
cli.StringFlag{ | |||
Name: "config, c", | |||
Value: setting.CustomConf, | |||
Usage: "Custom configuration file path", | |||
}, | |||
cli.VersionFlag, | |||
} | |||
// Set the default to be equivalent to cmdWeb and add the default flags | |||
app.Flags = append(app.Flags, cmd.CmdWeb.Flags...) | |||
app.Flags = append(app.Flags, defaultFlags...) | |||
app.Action = cmd.CmdWeb.Action | |||
// Add functions to set these paths and these flags to the commands | |||
app.Before = establishCustomPath | |||
for i := range app.Commands { | |||
setFlagsAndBeforeOnSubcommands(&app.Commands[i], defaultFlags, establishCustomPath) | |||
} | |||
err := app.Run(os.Args) | |||
if err != nil { | |||
log.Fatal("Failed to run app with %s: %v", os.Args, err) | |||
} | |||
} | |||
func setFlagsAndBeforeOnSubcommands(command *cli.Command, defaultFlags []cli.Flag, before cli.BeforeFunc) { | |||
command.Flags = append(command.Flags, defaultFlags...) | |||
command.Before = establishCustomPath | |||
for i := range command.Subcommands { | |||
setFlagsAndBeforeOnSubcommands(&command.Subcommands[i], defaultFlags, before) | |||
} | |||
} | |||
func establishCustomPath(ctx *cli.Context) error { | |||
var providedCustom string | |||
var providedConf string | |||
currentCtx := ctx | |||
for { | |||
if len(providedCustom) != 0 && len(providedConf) != 0 { | |||
break | |||
} | |||
if currentCtx == nil { | |||
break | |||
} | |||
if currentCtx.IsSet("custom-path") && len(providedCustom) == 0 { | |||
providedCustom = currentCtx.String("custom-path") | |||
} | |||
if currentCtx.IsSet("config") && len(providedConf) == 0 { | |||
providedConf = currentCtx.String("config") | |||
} | |||
currentCtx = currentCtx.Parent() | |||
} | |||
setting.SetCustomPathAndConf(providedCustom, providedConf) | |||
setAppHelpTemplates() | |||
if ctx.IsSet("version") { | |||
cli.ShowVersion(ctx) | |||
os.Exit(0) | |||
} | |||
return nil | |||
} | |||
func setAppHelpTemplates() { | |||
cli.AppHelpTemplate = adjustHelpTemplate(originalAppHelpTemplate) | |||
cli.CommandHelpTemplate = adjustHelpTemplate(originalCommandHelpTemplate) | |||
cli.SubcommandHelpTemplate = adjustHelpTemplate(originalSubcommandHelpTemplate) | |||
} | |||
func adjustHelpTemplate(originalTemplate string) string { | |||
overrided := "" | |||
if _, ok := os.LookupEnv("GITEA_CUSTOM"); ok { | |||
overrided = "(GITEA_CUSTOM)" | |||
} | |||
return fmt.Sprintf(`%s | |||
DEFAULT CONFIGURATION: | |||
CustomPath: %s %s | |||
CustomConf: %s | |||
AppPath: %s | |||
AppWorkPath: %s | |||
`, originalTemplate, setting.CustomPath, overrided, setting.CustomConf, setting.AppPath, setting.AppWorkPath) | |||
} | |||
func formatBuiltWith(makeTags string) string { | |||
var version = runtime.Version() | |||
if len(MakeVersion) > 0 { |
@@ -14,6 +14,7 @@ import ( | |||
) | |||
func init() { | |||
setting.SetCustomPathAndConf("", "") | |||
setting.NewContext() | |||
} | |||
@@ -391,12 +391,12 @@ func getAppPath() (string, error) { | |||
} | |||
func getWorkPath(appPath string) string { | |||
workPath := "" | |||
giteaWorkPath := os.Getenv("GITEA_WORK_DIR") | |||
workPath := AppWorkPath | |||
if len(giteaWorkPath) > 0 { | |||
if giteaWorkPath, ok := os.LookupEnv("GITEA_WORK_DIR"); ok { | |||
workPath = giteaWorkPath | |||
} else { | |||
} | |||
if len(workPath) == 0 { | |||
i := strings.LastIndex(appPath, "/") | |||
if i == -1 { | |||
workPath = appPath | |||
@@ -475,27 +475,40 @@ func CheckLFSVersion() { | |||
} | |||
} | |||
// NewContext initializes configuration context. | |||
// NOTE: do not print any log except error. | |||
func NewContext() { | |||
Cfg = ini.Empty() | |||
CustomPath = os.Getenv("GITEA_CUSTOM") | |||
// SetCustomPathAndConf will set CustomPath and CustomConf with reference to the | |||
// GITEA_CUSTOM environment variable and with provided overrides before stepping | |||
// back to the default | |||
func SetCustomPathAndConf(providedCustom, providedConf string) { | |||
if giteaCustom, ok := os.LookupEnv("GITEA_CUSTOM"); ok { | |||
CustomPath = giteaCustom | |||
} | |||
if len(providedCustom) != 0 { | |||
CustomPath = providedCustom | |||
} | |||
if len(CustomPath) == 0 { | |||
CustomPath = path.Join(AppWorkPath, "custom") | |||
} else if !filepath.IsAbs(CustomPath) { | |||
CustomPath = path.Join(AppWorkPath, CustomPath) | |||
} | |||
if len(CustomPID) > 0 { | |||
createPIDFile(CustomPID) | |||
if len(providedConf) != 0 { | |||
CustomConf = providedConf | |||
} | |||
if len(CustomConf) == 0 { | |||
CustomConf = path.Join(CustomPath, "conf/app.ini") | |||
} else if !filepath.IsAbs(CustomConf) { | |||
CustomConf = path.Join(CustomPath, CustomConf) | |||
} | |||
} | |||
// NewContext initializes configuration context. | |||
// NOTE: do not print any log except error. | |||
func NewContext() { | |||
Cfg = ini.Empty() | |||
if len(CustomPID) > 0 { | |||
createPIDFile(CustomPID) | |||
} | |||
if com.IsFile(CustomConf) { | |||
if err := Cfg.Append(CustomConf); err != nil { |