From 04714e266cfd6d60f4d1672cb50cce9f078636a7 Mon Sep 17 00:00:00 2001 From: Oliver Tonnhofer Date: Fri, 26 Jul 2013 15:59:03 +0200 Subject: [PATCH] fixed parsing of diff command options --- config/config.go | 85 +++++++++++++++++++++++++++++---------------- diff/cmd/process.go | 26 +++++++------- goposm.go | 61 ++++++++++++++++++-------------- 3 files changed, 103 insertions(+), 69 deletions(-) diff --git a/config/config.go b/config/config.go index fe6b01e..c2cc11d 100644 --- a/config/config.go +++ b/config/config.go @@ -19,12 +19,12 @@ type Config struct { const defaultSrid = 3857 const defaultCacheDir = "/tmp/goposm" -var ImportFlags = flag.NewFlagSet("import", flag.ContinueOnError) -var DiffImportFlags = flag.NewFlagSet("diff", flag.ContinueOnError) +var ImportFlags = flag.NewFlagSet("import", flag.ExitOnError) +var DiffImportFlags = flag.NewFlagSet("diff", flag.ExitOnError) type ImportBaseOptions struct { Connection string - Cachedir string + CacheDir string MappingFile string Srid int LimitTo string @@ -57,7 +57,7 @@ var DiffImportOptions = _DiffImportOptions{} func addBaseFlags(flags *flag.FlagSet, baseOptions *ImportBaseOptions) { flags.StringVar(&baseOptions.Connection, "connection", "", "connection parameters") - flags.StringVar(&baseOptions.Cachedir, "cachedir", defaultCacheDir, "cache directory") + flags.StringVar(&baseOptions.CacheDir, "cachedir", defaultCacheDir, "cache directory") flags.StringVar(&baseOptions.MappingFile, "mapping", "", "mapping file") flags.IntVar(&baseOptions.Srid, "srid", defaultSrid, "srs id") flags.StringVar(&baseOptions.LimitTo, "limitto", "", "limit to geometries") @@ -100,60 +100,85 @@ func init() { // configFile = flag.String("config", "", "config (json)") // ) -func Parse(args []string) (*Config, []error) { +func ParseImport(args []string) []error { err := ImportFlags.Parse(args) if err != nil { log.Fatal(err) } + errs := updateBaseOpts(&ImportOptions.Base) + if errs != nil { + return errs + } - config := &Config{ + errs = checkOptions(&ImportOptions.Base) + return errs +} + +func updateBaseOpts(opts *ImportBaseOptions) []error { + + conf := &Config{ CacheDir: defaultCacheDir, Srid: defaultSrid, } - if ImportOptions.Base.ConfigFile != "" { - f, err := os.Open(ImportOptions.Base.ConfigFile) + + if opts.ConfigFile != "" { + f, err := os.Open(opts.ConfigFile) if err != nil { - return nil, []error{err} + return []error{err} } decoder := json.NewDecoder(f) - err = decoder.Decode(&config) + err = decoder.Decode(&conf) if err != nil { - return nil, []error{err} + return []error{err} } } - if ImportOptions.Base.Connection != "" { - config.Connection = ImportOptions.Base.Connection + if opts.Connection == "" { + opts.Connection = conf.Connection } - if config.Srid == 0 { - config.Srid = defaultSrid + if conf.Srid == 0 { + conf.Srid = defaultSrid } - if ImportOptions.Base.Srid != defaultSrid { - config.Srid = ImportOptions.Base.Srid + if opts.Srid != defaultSrid { + opts.Srid = conf.Srid } - if ImportOptions.Base.MappingFile != "" { - config.MappingFile = ImportOptions.Base.MappingFile + if opts.MappingFile == "" { + opts.MappingFile = conf.MappingFile } - if ImportOptions.Base.LimitTo != "" { - config.LimitTo = ImportOptions.Base.LimitTo + if opts.LimitTo == "" { + opts.LimitTo = conf.LimitTo } - if ImportOptions.Base.Cachedir != defaultCacheDir { - config.CacheDir = ImportOptions.Base.Cachedir + if opts.CacheDir == defaultCacheDir { + opts.CacheDir = conf.CacheDir } - - errs := checkConfig(config) - return config, errs + return nil } -func checkConfig(config *Config) []error { +func ParseDiffImport(args []string) []error { + err := DiffImportFlags.Parse(args) + if err != nil { + log.Fatal(err) + } + + errs := updateBaseOpts(&DiffImportOptions.Base) + if errs != nil { + return errs + } + + errs = checkOptions(&DiffImportOptions.Base) + + return errs +} + +func checkOptions(opts *ImportBaseOptions) []error { errs := []error{} - if config.Srid != 3857 { + if opts.Srid != 3857 { errs = append(errs, errors.New("srid!=3857 not implemented")) } - if config.MappingFile == "" { + if opts.MappingFile == "" { errs = append(errs, errors.New("missing mapping")) } - if config.Connection == "" { + if opts.Connection == "" { errs = append(errs, errors.New("missing connection")) } return errs diff --git a/diff/cmd/process.go b/diff/cmd/process.go index 8395e84..3b23d9c 100644 --- a/diff/cmd/process.go +++ b/diff/cmd/process.go @@ -21,17 +21,17 @@ import ( var log = logging.NewLogger("") -func Update(oscFile string, conf *config.Config, force bool) { +func Update(oscFile string, force bool) { state, err := diffstate.ParseFromOsc(oscFile) if err != nil { log.Fatal(err) } - lastState, err := diffstate.ParseLastState(conf.CacheDir) + lastState, err := diffstate.ParseLastState(config.DiffImportOptions.Base.CacheDir) if err != nil { log.Fatal(err) } - if lastState != nil && lastState.Sequence != 0 && state.Sequence <= lastState.Sequence { + if lastState != nil && lastState.Sequence != 0 && state != nil && state.Sequence <= lastState.Sequence { if !force { log.Warn(state, " already imported") return @@ -42,28 +42,28 @@ func Update(oscFile string, conf *config.Config, force bool) { elems, errc := parser.Parse(oscFile) - osmCache := cache.NewOSMCache(conf.CacheDir) + osmCache := cache.NewOSMCache(config.DiffImportOptions.Base.CacheDir) err = osmCache.Open() if err != nil { log.Fatal("osm cache: ", err) } - diffCache := cache.NewDiffCache(conf.CacheDir) + diffCache := cache.NewDiffCache(config.DiffImportOptions.Base.CacheDir) err = diffCache.Open() if err != nil { log.Fatal("diff cache: ", err) } - tagmapping, err := mapping.NewMapping(conf.MappingFile) + tagmapping, err := mapping.NewMapping(config.DiffImportOptions.Base.MappingFile) if err != nil { log.Fatal(err) } - connType := database.ConnectionType(conf.Connection) + connType := database.ConnectionType(config.DiffImportOptions.Base.Connection) dbConf := database.Config{ Type: connType, - ConnectionParams: conf.Connection, - Srid: conf.Srid, + ConnectionParams: config.DiffImportOptions.Base.Connection, + Srid: config.DiffImportOptions.Base.Srid, } db, err := database.Open(dbConf, tagmapping) if err != nil { @@ -107,19 +107,19 @@ func Update(oscFile string, conf *config.Config, force bool) { nodes := make(chan *element.Node) relWriter := writer.NewRelationWriter(osmCache, diffCache, relations, - db, polygonsTagMatcher, progress, conf.Srid) + db, polygonsTagMatcher, progress, config.DiffImportOptions.Base.Srid) relWriter.SetClipper(geometryClipper) relWriter.SetExpireTiles(expiredTiles) relWriter.Start() wayWriter := writer.NewWayWriter(osmCache, diffCache, ways, db, - lineStringsTagMatcher, polygonsTagMatcher, progress, conf.Srid) + lineStringsTagMatcher, polygonsTagMatcher, progress, config.DiffImportOptions.Base.Srid) wayWriter.SetClipper(geometryClipper) wayWriter.SetExpireTiles(expiredTiles) wayWriter.Start() nodeWriter := writer.NewNodeWriter(osmCache, nodes, db, - pointsTagMatcher, progress, conf.Srid) + pointsTagMatcher, progress, config.DiffImportOptions.Base.Srid) nodeWriter.SetClipper(geometryClipper) nodeWriter.Start() @@ -277,7 +277,7 @@ For: log.StopStep(step) progress.Stop() - err = diffstate.WriteLastState(conf.CacheDir, state) + err = diffstate.WriteLastState(config.DiffImportOptions.Base.CacheDir, state) if err != nil { log.Warn(err) // warn only } diff --git a/goposm.go b/goposm.go index ecefea8..8f16947 100644 --- a/goposm.go +++ b/goposm.go @@ -33,6 +33,15 @@ func dief(msg string, args ...interface{}) { log.Fatalf(msg, args...) } +func reportErrors(errs []error) { + log.Warn("errors in config/options:") + for _, err := range errs { + log.Warnf("\t%s", err) + } + logging.Shutdown() + os.Exit(1) +} + func main() { golog.SetFlags(golog.LstdFlags | golog.Lshortfile) @@ -44,22 +53,22 @@ func main() { os.Exit(1) } - conf, errs := config.Parse(os.Args[2:]) - if len(errs) > 0 { - log.Warn("errors in config/options:") - for _, err := range errs { - log.Warnf("\t%s", err) - } - logging.Shutdown() - os.Exit(1) - } - switch os.Args[1] { case "import": - mainimport(conf) + errs := config.ParseImport(os.Args[2:]) + if len(errs) > 0 { + reportErrors(errs) + break + } + mainimport() case "diff": + errs := config.ParseDiffImport(os.Args[2:]) + if len(errs) > 0 { + reportErrors(errs) + break + } for _, oscFile := range config.DiffImportFlags.Args() { - cmd.Update(oscFile, conf, false) + cmd.Update(oscFile, false) } default: log.Fatal("invalid command") @@ -69,7 +78,7 @@ func main() { } -func mainimport(conf *config.Config) { +func mainimport() { if config.ImportOptions.Cpuprofile != "" { f, err := os.Create(config.ImportOptions.Cpuprofile) if err != nil { @@ -113,21 +122,21 @@ func mainimport(conf *config.Config) { } var geometryClipper *clipper.Clipper - if config.ImportOptions.Write && conf.LimitTo != "" { + if config.ImportOptions.Write && config.ImportOptions.Base.LimitTo != "" { var err error step := log.StartStep("Reading limitto geometries") - geometryClipper, err = clipper.NewFromOgrSource(conf.LimitTo) + geometryClipper, err = clipper.NewFromOgrSource(config.ImportOptions.Base.LimitTo) if err != nil { die(err) } log.StopStep(step) } - osmCache := cache.NewOSMCache(conf.CacheDir) + osmCache := cache.NewOSMCache(config.ImportOptions.Base.CacheDir) if config.ImportOptions.Read != "" && osmCache.Exists() { if config.ImportOptions.Overwritecache { - log.Printf("removing existing cache %s", conf.CacheDir) + log.Printf("removing existing cache %s", config.ImportOptions.Base.CacheDir) err := osmCache.Remove() if err != nil { die("unable to remove cache:", err) @@ -139,7 +148,7 @@ func mainimport(conf *config.Config) { progress := stats.StatsReporter() - tagmapping, err := mapping.NewMapping(conf.MappingFile) + tagmapping, err := mapping.NewMapping(config.ImportOptions.Base.MappingFile) if err != nil { die("mapping file: ", err) } @@ -147,11 +156,11 @@ func mainimport(conf *config.Config) { var db database.DB if config.ImportOptions.Write || config.ImportOptions.DeployProduction || config.ImportOptions.RevertDeploy || config.ImportOptions.RemoveBackup || config.ImportOptions.Optimize { - connType := database.ConnectionType(conf.Connection) + connType := database.ConnectionType(config.ImportOptions.Base.Connection) conf := database.Config{ Type: connType, - ConnectionParams: conf.Connection, - Srid: conf.Srid, + ConnectionParams: config.ImportOptions.Base.Connection, + Srid: config.ImportOptions.Base.Srid, } db, err = database.Open(conf, tagmapping) if err != nil { @@ -183,7 +192,7 @@ func mainimport(conf *config.Config) { if config.ImportOptions.Diff { diffstate := state.FromPbf(pbfFile) if diffstate != nil { - diffstate.WriteToFile(path.Join(conf.CacheDir, "last.state.txt")) + diffstate.WriteToFile(path.Join(config.ImportOptions.Base.CacheDir, "last.state.txt")) } } } @@ -209,7 +218,7 @@ func mainimport(conf *config.Config) { var diffCache *cache.DiffCache if config.ImportOptions.Diff { - diffCache = cache.NewDiffCache(conf.CacheDir) + diffCache = cache.NewDiffCache(config.ImportOptions.Base.CacheDir) if err = diffCache.Remove(); err != nil { die(err) } @@ -229,7 +238,7 @@ func mainimport(conf *config.Config) { relations := osmCache.Relations.Iter() relWriter := writer.NewRelationWriter(osmCache, diffCache, relations, - db, polygonsTagMatcher, progress, conf.Srid) + db, polygonsTagMatcher, progress, config.ImportOptions.Base.Srid) relWriter.SetClipper(geometryClipper) relWriter.Start() @@ -239,7 +248,7 @@ func mainimport(conf *config.Config) { ways := osmCache.Ways.Iter() wayWriter := writer.NewWayWriter(osmCache, diffCache, ways, db, - lineStringsTagMatcher, polygonsTagMatcher, progress, conf.Srid) + lineStringsTagMatcher, polygonsTagMatcher, progress, config.ImportOptions.Base.Srid) wayWriter.SetClipper(geometryClipper) wayWriter.Start() @@ -249,7 +258,7 @@ func mainimport(conf *config.Config) { nodes := osmCache.Nodes.Iter() nodeWriter := writer.NewNodeWriter(osmCache, nodes, db, - pointsTagMatcher, progress, conf.Srid) + pointsTagMatcher, progress, config.ImportOptions.Base.Srid) nodeWriter.SetClipper(geometryClipper) nodeWriter.Start()