xref: /aosp_15_r20/tools/treble/hacksaw/client/client.go (revision 105f628577ac4ba0e277a494fbb614ed8c12a994)
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