mirror of
https://github.com/aptly-dev/aptly.git
synced 2026-07-27 13:57:46 +00:00
Rework fatal mechanism, open config on demand.
This commit is contained in:
+47
-2
@@ -20,7 +20,8 @@ import (
|
|||||||
|
|
||||||
// Common context shared by all commands
|
// Common context shared by all commands
|
||||||
type AptlyContext struct {
|
type AptlyContext struct {
|
||||||
flags *flag.FlagSet
|
flags *flag.FlagSet
|
||||||
|
configLoaded bool
|
||||||
|
|
||||||
progress aptly.Progress
|
progress aptly.Progress
|
||||||
downloader aptly.Downloader
|
downloader aptly.Downloader
|
||||||
@@ -38,7 +39,51 @@ type AptlyContext struct {
|
|||||||
|
|
||||||
var context *AptlyContext
|
var context *AptlyContext
|
||||||
|
|
||||||
|
type FatalError struct {
|
||||||
|
ReturnCode int
|
||||||
|
Message string
|
||||||
|
}
|
||||||
|
|
||||||
|
func Fatal(err error) {
|
||||||
|
panic(&FatalError{ReturnCode: 1, Message: err.Error()})
|
||||||
|
}
|
||||||
|
|
||||||
func (context *AptlyContext) Config() *utils.ConfigStructure {
|
func (context *AptlyContext) Config() *utils.ConfigStructure {
|
||||||
|
if !context.configLoaded {
|
||||||
|
var err error
|
||||||
|
|
||||||
|
configLocation := context.flags.Lookup("config").Value.String()
|
||||||
|
if configLocation != "" {
|
||||||
|
err = utils.LoadConfig(configLocation, &utils.Config)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
Fatal(err)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
configLocations := []string{
|
||||||
|
filepath.Join(os.Getenv("HOME"), ".aptly.conf"),
|
||||||
|
"/etc/aptly.conf",
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, configLocation := range configLocations {
|
||||||
|
err = utils.LoadConfig(configLocation, &utils.Config)
|
||||||
|
if err == nil {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if !os.IsNotExist(err) {
|
||||||
|
Fatal(fmt.Errorf("error loading config file %s: %s", configLocation, err))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("Config file not found, creating default config at %s\n\n", configLocations[0])
|
||||||
|
utils.SaveConfig(configLocations[0], &utils.Config)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
context.configLoaded = true
|
||||||
|
|
||||||
|
}
|
||||||
return &utils.Config
|
return &utils.Config
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -112,7 +157,7 @@ func (context *AptlyContext) CollectionFactory() *debian.CollectionFactory {
|
|||||||
if context.collectionFactory == nil {
|
if context.collectionFactory == nil {
|
||||||
db, err := context.Database()
|
db, err := context.Database()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
Fatal(err)
|
||||||
}
|
}
|
||||||
context.collectionFactory = debian.NewCollectionFactory(db)
|
context.collectionFactory = debian.NewCollectionFactory(db)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,65 +3,18 @@ package main
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/smira/aptly/cmd"
|
"github.com/smira/aptly/cmd"
|
||||||
"github.com/smira/aptly/utils"
|
|
||||||
"github.com/smira/commander"
|
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
|
||||||
returnCode = 0
|
|
||||||
errorMessage string
|
|
||||||
)
|
|
||||||
|
|
||||||
func fatal(err error) {
|
|
||||||
errorMessage = fmt.Sprintf("ERROR: %s\n", err)
|
|
||||||
returnCode = 1
|
|
||||||
}
|
|
||||||
|
|
||||||
func loadConfig(command *commander.Command) error {
|
|
||||||
var err error
|
|
||||||
|
|
||||||
configLocation := command.Flag.Lookup("config").Value.String()
|
|
||||||
if configLocation != "" {
|
|
||||||
err = utils.LoadConfig(configLocation, &utils.Config)
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
configLocations := []string{
|
|
||||||
filepath.Join(os.Getenv("HOME"), ".aptly.conf"),
|
|
||||||
"/etc/aptly.conf",
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, configLocation := range configLocations {
|
|
||||||
err = utils.LoadConfig(configLocation, &utils.Config)
|
|
||||||
if err == nil {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
if !os.IsNotExist(err) {
|
|
||||||
fatal(fmt.Errorf("error loading config file %s: %s", configLocation, err))
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
fmt.Printf("Config file not found, creating default config at %s\n\n", configLocations[0])
|
|
||||||
utils.SaveConfig(configLocations[0], &utils.Config)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
defer func() {
|
defer func() {
|
||||||
if errorMessage != "" {
|
if r := recover(); r != nil {
|
||||||
fmt.Print(errorMessage)
|
fatal, ok := r.(*cmd.FatalError)
|
||||||
}
|
if !ok {
|
||||||
if returnCode != 0 {
|
panic(r)
|
||||||
os.Exit(returnCode)
|
}
|
||||||
|
fmt.Println("ERROR:", fatal.Message)
|
||||||
|
os.Exit(fatal.ReturnCode)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
@@ -69,29 +22,17 @@ func main() {
|
|||||||
|
|
||||||
flags, args, err := command.ParseFlags(os.Args[1:])
|
flags, args, err := command.ParseFlags(os.Args[1:])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fatal(err)
|
cmd.Fatal(err)
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
err = loadConfig(command)
|
|
||||||
if err != nil {
|
|
||||||
fatal(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if returnCode != 0 {
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
err = cmd.InitContext(flags)
|
err = cmd.InitContext(flags)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fatal(err)
|
cmd.Fatal(err)
|
||||||
return
|
|
||||||
}
|
}
|
||||||
defer cmd.ShutdownContext()
|
defer cmd.ShutdownContext()
|
||||||
|
|
||||||
err = command.Dispatch(args)
|
err = command.Dispatch(args)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fatal(err)
|
cmd.Fatal(err)
|
||||||
return
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,23 +1 @@
|
|||||||
aptly - Debian repository management tool
|
No mirrors found, create one with `aptly mirror create ...`.
|
||||||
|
|
||||||
Commands:
|
|
||||||
|
|
||||||
db manage aptly's internal database and package pool
|
|
||||||
graph render graph of relationships
|
|
||||||
mirror manage mirrors of remote repositories
|
|
||||||
publish manage published repositories
|
|
||||||
repo manage local package repositories
|
|
||||||
serve HTTP serve published repositories
|
|
||||||
snapshot manage snapshots of repositories
|
|
||||||
version display version
|
|
||||||
|
|
||||||
Use "aptly help <command>" for more information about a command.
|
|
||||||
|
|
||||||
|
|
||||||
Options:
|
|
||||||
-architectures="": list of architectures to consider during (comma-separated), default to all available
|
|
||||||
-config="": location of configuration file (default locations are /etc/aptly.conf, ~/.aptly.conf)
|
|
||||||
-dep-follow-all-variants=false: when processing dependencies, follow a & b if depdency is 'a|b'
|
|
||||||
-dep-follow-recommends=false: when processing dependencies, follow Recommends
|
|
||||||
-dep-follow-source=false: when processing dependencies, follow from binary to Source packages
|
|
||||||
-dep-follow-suggests=false: when processing dependencies, follow Suggests
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ class CreateConfigTest(BaseTest):
|
|||||||
"""
|
"""
|
||||||
new file is generated if missing
|
new file is generated if missing
|
||||||
"""
|
"""
|
||||||
runCmd = "aptly"
|
runCmd = "aptly mirror list"
|
||||||
checkedFile = os.path.join(os.environ["HOME"], ".aptly.conf")
|
checkedFile = os.path.join(os.environ["HOME"], ".aptly.conf")
|
||||||
|
|
||||||
check = BaseTest.check_file
|
check = BaseTest.check_file
|
||||||
@@ -24,7 +24,7 @@ class BadConfigTest(BaseTest):
|
|||||||
"""
|
"""
|
||||||
broken config file
|
broken config file
|
||||||
"""
|
"""
|
||||||
runCmd = "aptly"
|
runCmd = "aptly mirror list"
|
||||||
expectedCode = 1
|
expectedCode = 1
|
||||||
|
|
||||||
gold_processor = BaseTest.expand_environ
|
gold_processor = BaseTest.expand_environ
|
||||||
@@ -41,7 +41,8 @@ class ConfigInFileTest(BaseTest):
|
|||||||
"""
|
"""
|
||||||
config in other file test
|
config in other file test
|
||||||
"""
|
"""
|
||||||
runCmd = ["aptly", "-config=%s" % (os.path.join(os.path.dirname(inspect.getsourcefile(BadConfigTest)), "aptly.conf"), )]
|
runCmd = ["aptly", "mirror", "list",
|
||||||
|
"-config=%s" % (os.path.join(os.path.dirname(inspect.getsourcefile(BadConfigTest)), "aptly.conf"), )]
|
||||||
prepare = BaseTest.prepare_remove_all
|
prepare = BaseTest.prepare_remove_all
|
||||||
|
|
||||||
outputMatchPrepare = lambda _, s: re.sub(r' -(cpuprofile|memprofile|memstats|meminterval)=.*\n', '', s, flags=re.MULTILINE)
|
outputMatchPrepare = lambda _, s: re.sub(r' -(cpuprofile|memprofile|memstats|meminterval)=.*\n', '', s, flags=re.MULTILINE)
|
||||||
@@ -51,6 +52,6 @@ class ConfigInMissingFileTest(BaseTest):
|
|||||||
"""
|
"""
|
||||||
config in other file test
|
config in other file test
|
||||||
"""
|
"""
|
||||||
runCmd = ["aptly", "-config=nosuchfile.conf"]
|
runCmd = ["aptly", "mirror", "list", "-config=nosuchfile.conf"]
|
||||||
expectedCode = 1
|
expectedCode = 1
|
||||||
prepare = BaseTest.prepare_remove_all
|
prepare = BaseTest.prepare_remove_all
|
||||||
|
|||||||
Reference in New Issue
Block a user