@@ -17,10 +17,16 @@ limitations under the License.
1717package initproject
1818
1919import (
20+ "bufio"
21+ "bytes"
2022 "fmt"
23+ "html/template"
24+ "io"
25+ "io/ioutil"
2126 "log"
2227 "os"
2328 "os/exec"
29+ "strings"
2430
2531 "github.com/spf13/cobra"
2632
@@ -49,30 +55,17 @@ func RunVendorInstall(cmd *cobra.Command, args []string) {
4955 if ! depExists () {
5056 log .Fatalf ("Dep is not installed. Follow steps at: https://golang.github.io/dep/docs/installation.html" )
5157 }
52- var backupFilename string
5358 if Update {
54- backupFilename = fmt .Sprintf ("%s.bkp" , depManifestFile )
55- if err := os .Rename (depManifestFile , backupFilename ); err != nil {
56- fmt .Printf ("Error renaming existing Gopkg.toml file: %v \n " , err )
57- return
59+ if err := updateDepManifest (); err != nil {
60+ log .Fatalf ("error upgrading the dep manifest (Gopkg.toml): %v" , err )
5861 }
62+ } else {
63+ createNewDepManifest ()
5964 }
60- depTmplArgs := map [string ]string {
61- "Version" : version .GetVersion ().KubeBuilderVersion ,
62- }
63- util .Write (depManifestFile , "dep-manifest-file" , depManifestTmpl , depTmplArgs )
6465 if err := runDepEnsure (); err != nil {
6566 fmt .Printf ("Error running 'dep ensure': %v\n " , err )
66- fmt .Printf ("Previous Gopkg.toml file has been saved at '%s'\n " , backupFilename )
6767 return
6868 }
69- if Update && backupFilename != "" {
70- err := os .Remove (backupFilename )
71- if err != nil {
72- fmt .Printf ("Warning: failed to remove backup file: %s" , backupFilename )
73- }
74- }
75- return
7669}
7770
7871func runDepEnsure () error {
@@ -92,16 +85,94 @@ func depExists() bool {
9285 return err == nil
9386}
9487
95- var depManifestTmpl = fmt .Sprintf ("%s\n %s" , depManifestHeader , depManifestOverride )
88+ func createNewDepManifest () {
89+ depTmplArgs := map [string ]string {
90+ "Version" : version .GetVersion ().KubeBuilderVersion ,
91+ }
92+ depManifestTmpl := fmt .Sprintf ("%s\n %s\n %s" , depManifestHeader , depManifestKBMarker , depManifestOverride )
93+ util .Write (depManifestFile , "dep-manifest-file" , depManifestTmpl , depTmplArgs )
94+ }
95+
96+ // updateDepManifest updates the existing dep manifest with newer dependencies.
97+ // dep manifest update workflow:
98+ // Try to read user managed dep manifest section. If success, then append the
99+ // user managed dep with KB managed section and update the dep Manifest.
100+ func updateDepManifest () error {
101+ // open the existing dep manifest.
102+ f , err := os .Open (depManifestFile )
103+ if err != nil {
104+ return err
105+ }
106+ defer f .Close ()
107+
108+ // try to read content till the dep marker
109+ userDeps , foundKBMarker , err := tryReadingUserDeps (f )
110+ if err != nil {
111+ return err
112+ }
113+
114+ if ! foundKBMarker {
115+ // depManifest file or abort the operation here.
116+ // for now, aborting.
117+ log .Fatalf (`
118+ Failed to upgrade the dep manifest (Gopkg.toml) file. It seems that the dep manifest
119+ is not being managed by Kubebuilder. You can run the command with --overwrite-dep-manifest
120+ flag if you want to re-initialize the dep manifest file.
121+ ` )
122+ }
123+
124+ b := bytes .NewBufferString (userDeps )
125+ err = addKubeBuilderDeps (b )
126+ if err != nil {
127+ return err
128+ }
129+
130+ tmpfile , err := ioutil .TempFile ("." , "dep" )
131+ if err != nil {
132+ return err
133+ }
96134
97- const depManifestHeader = `
98- # Users add deps lines here
135+ defer os .Remove (tmpfile .Name ()) // clean up
99136
100- [prune]
101- go-tests = true
102- #unused-packages = true
137+ _ , err = tmpfile .Write (b .Bytes ())
138+ if err != nil {
139+ return err
140+ }
141+ err = tmpfile .Close ()
142+ if err != nil {
143+ return err
144+ }
103145
104- # Note: Stanzas below are generated by Kubebuilder and may be rewritten when
105- # upgrading kubebuilder versions.
106- # DO NOT MODIFY BELOW THIS LINE.
107- `
146+ err = os .Rename (tmpfile .Name (), depManifestFile )
147+ if err != nil {
148+ return err
149+ }
150+ return nil
151+ }
152+
153+ func tryReadingUserDeps (r io.Reader ) (userDeps string , foundMarker bool , err error ) {
154+ b := & bytes.Buffer {}
155+ scanner := bufio .NewScanner (r )
156+
157+ for scanner .Scan () {
158+ line := scanner .Text ()
159+ b .WriteString (line )
160+ b .WriteString ("\n " )
161+ if strings .HasPrefix (line , depManifestKBMarker ) {
162+ foundMarker = true
163+ userDeps = b .String ()
164+ return
165+ }
166+ }
167+
168+ err = scanner .Err ()
169+ return
170+ }
171+
172+ func addKubeBuilderDeps (w io.Writer ) error {
173+ depTmplArgs := map [string ]string {
174+ "Version" : version .GetVersion ().KubeBuilderVersion ,
175+ }
176+ t := template .Must (template .New ("dep-manifest-template" ).Parse (depManifestOverride ))
177+ return t .Execute (w , depTmplArgs )
178+ }
0 commit comments