1*105f6285SAndroid Build Coastguard Worker// Copyright 2020 Google LLC 2*105f6285SAndroid Build Coastguard Worker// 3*105f6285SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*105f6285SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*105f6285SAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*105f6285SAndroid Build Coastguard Worker// 7*105f6285SAndroid Build Coastguard Worker// https://www.apache.org/licenses/LICENSE-2.0 8*105f6285SAndroid Build Coastguard Worker// 9*105f6285SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*105f6285SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*105f6285SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*105f6285SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*105f6285SAndroid Build Coastguard Worker// limitations under the License. 14*105f6285SAndroid Build Coastguard Worker 15*105f6285SAndroid Build Coastguard Worker// Package client implements the hacksaw cli client 16*105f6285SAndroid Build Coastguard Workerpackage client 17*105f6285SAndroid Build Coastguard Worker 18*105f6285SAndroid Build Coastguard Workerimport ( 19*105f6285SAndroid Build Coastguard Worker "io/ioutil" 20*105f6285SAndroid Build Coastguard Worker "os" 21*105f6285SAndroid Build Coastguard Worker "path" 22*105f6285SAndroid Build Coastguard Worker "reflect" 23*105f6285SAndroid Build Coastguard Worker 24*105f6285SAndroid Build Coastguard Worker "android.googlesource.com/platform/tools/treble.git/hacksaw/bind" 25*105f6285SAndroid Build Coastguard Worker "android.googlesource.com/platform/tools/treble.git/hacksaw/config" 26*105f6285SAndroid Build Coastguard Worker) 27*105f6285SAndroid Build Coastguard Worker 28*105f6285SAndroid Build Coastguard Workerfunc ensureConfigFileExists(cfgPath string) error { 29*105f6285SAndroid Build Coastguard Worker _, err := os.Stat(cfgPath) 30*105f6285SAndroid Build Coastguard Worker if os.IsNotExist(err) { 31*105f6285SAndroid Build Coastguard Worker //continue to init config file 32*105f6285SAndroid Build Coastguard Worker } else { 33*105f6285SAndroid Build Coastguard Worker return err 34*105f6285SAndroid Build Coastguard Worker } 35*105f6285SAndroid Build Coastguard Worker 36*105f6285SAndroid Build Coastguard Worker //init config file 37*105f6285SAndroid Build Coastguard Worker if err = os.MkdirAll(path.Dir(cfgPath), os.ModePerm); err != nil { 38*105f6285SAndroid Build Coastguard Worker return err 39*105f6285SAndroid Build Coastguard Worker } 40*105f6285SAndroid Build Coastguard Worker return ioutil.WriteFile(cfgPath, []byte("{}"), os.ModePerm) 41*105f6285SAndroid Build Coastguard Worker} 42*105f6285SAndroid Build Coastguard Worker 43*105f6285SAndroid Build Coastguard Workerfunc HandleCommand(workspaceTopDir string, pathBinder bind.PathBinder, args []string) error { 44*105f6285SAndroid Build Coastguard Worker cfgPath := path.Join(workspaceTopDir, "config.json") 45*105f6285SAndroid Build Coastguard Worker if err := ensureConfigFileExists(cfgPath); err != nil { 46*105f6285SAndroid Build Coastguard Worker return err 47*105f6285SAndroid Build Coastguard Worker } 48*105f6285SAndroid Build Coastguard Worker cfg := config.GetConfig() 49*105f6285SAndroid Build Coastguard Worker if err := cfg.ReadConfigFromFile(cfgPath); err != nil { 50*105f6285SAndroid Build Coastguard Worker return err 51*105f6285SAndroid Build Coastguard Worker } 52*105f6285SAndroid Build Coastguard Worker //Save a copy of the config to detect changes 53*105f6285SAndroid Build Coastguard Worker savedCfg := cfg.Copy() 54*105f6285SAndroid Build Coastguard Worker cmd := NewCommand(pathBinder, workspaceTopDir) 55*105f6285SAndroid Build Coastguard Worker if err := cmd.Handle(args); err != nil { 56*105f6285SAndroid Build Coastguard Worker return err 57*105f6285SAndroid Build Coastguard Worker } 58*105f6285SAndroid Build Coastguard Worker if reflect.DeepEqual(savedCfg, cfg) { 59*105f6285SAndroid Build Coastguard Worker return nil 60*105f6285SAndroid Build Coastguard Worker } 61*105f6285SAndroid Build Coastguard Worker return cfg.WriteConfigToFile(cfgPath) 62*105f6285SAndroid Build Coastguard Worker} 63