Rework fatal mechanism, open config on demand.

This commit is contained in:
Andrey Smirnov
2014-04-06 21:05:06 +04:00
parent 3db7125932
commit 83b2e0250d
4 changed files with 63 additions and 98 deletions
+47 -2
View File
@@ -20,7 +20,8 @@ import (
// Common context shared by all commands
type AptlyContext struct {
flags *flag.FlagSet
flags *flag.FlagSet
configLoaded bool
progress aptly.Progress
downloader aptly.Downloader
@@ -38,7 +39,51 @@ type AptlyContext struct {
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 {
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
}
@@ -112,7 +157,7 @@ func (context *AptlyContext) CollectionFactory() *debian.CollectionFactory {
if context.collectionFactory == nil {
db, err := context.Database()
if err != nil {
panic(err)
Fatal(err)
}
context.collectionFactory = debian.NewCollectionFactory(db)
}
+10 -69
View File
@@ -3,65 +3,18 @@ package main
import (
"fmt"
"github.com/smira/aptly/cmd"
"github.com/smira/aptly/utils"
"github.com/smira/commander"
"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() {
defer func() {
if errorMessage != "" {
fmt.Print(errorMessage)
}
if returnCode != 0 {
os.Exit(returnCode)
if r := recover(); r != nil {
fatal, ok := r.(*cmd.FatalError)
if !ok {
panic(r)
}
fmt.Println("ERROR:", fatal.Message)
os.Exit(fatal.ReturnCode)
}
}()
@@ -69,29 +22,17 @@ func main() {
flags, args, err := command.ParseFlags(os.Args[1:])
if err != nil {
fatal(err)
return
}
err = loadConfig(command)
if err != nil {
fatal(err)
return
}
if returnCode != 0 {
return
cmd.Fatal(err)
}
err = cmd.InitContext(flags)
if err != nil {
fatal(err)
return
cmd.Fatal(err)
}
defer cmd.ShutdownContext()
err = command.Dispatch(args)
if err != nil {
fatal(err)
return
cmd.Fatal(err)
}
}
+1 -23
View File
@@ -1,23 +1 @@
aptly - Debian repository management tool
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
No mirrors found, create one with `aptly mirror create ...`.
+5 -4
View File
@@ -12,7 +12,7 @@ class CreateConfigTest(BaseTest):
"""
new file is generated if missing
"""
runCmd = "aptly"
runCmd = "aptly mirror list"
checkedFile = os.path.join(os.environ["HOME"], ".aptly.conf")
check = BaseTest.check_file
@@ -24,7 +24,7 @@ class BadConfigTest(BaseTest):
"""
broken config file
"""
runCmd = "aptly"
runCmd = "aptly mirror list"
expectedCode = 1
gold_processor = BaseTest.expand_environ
@@ -41,7 +41,8 @@ class ConfigInFileTest(BaseTest):
"""
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
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
"""
runCmd = ["aptly", "-config=nosuchfile.conf"]
runCmd = ["aptly", "mirror", "list", "-config=nosuchfile.conf"]
expectedCode = 1
prepare = BaseTest.prepare_remove_all