@@ -17,10 +17,16 @@ limitations under the License.
17
17
package initproject
18
18
19
19
import (
20
+ "bufio"
21
+ "bytes"
20
22
"fmt"
23
+ "html/template"
24
+ "io"
25
+ "io/ioutil"
21
26
"log"
22
27
"os"
23
28
"os/exec"
29
+ "strings"
24
30
25
31
"github.com/spf13/cobra"
26
32
@@ -49,30 +55,17 @@ func RunVendorInstall(cmd *cobra.Command, args []string) {
49
55
if ! depExists () {
50
56
log .Fatalf ("Dep is not installed. Follow steps at: https://golang.github.io/dep/docs/installation.html" )
51
57
}
52
- var backupFilename string
53
58
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 )
58
61
}
62
+ } else {
63
+ createNewDepManifest ()
59
64
}
60
- depTmplArgs := map [string ]string {
61
- "Version" : version .GetVersion ().KubeBuilderVersion ,
62
- }
63
- util .Write (depManifestFile , "dep-manifest-file" , depManifestTmpl , depTmplArgs )
64
65
if err := runDepEnsure (); err != nil {
65
66
fmt .Printf ("Error running 'dep ensure': %v\n " , err )
66
- fmt .Printf ("Previous Gopkg.toml file has been saved at '%s'\n " , backupFilename )
67
67
return
68
68
}
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
76
69
}
77
70
78
71
func runDepEnsure () error {
@@ -92,16 +85,94 @@ func depExists() bool {
92
85
return err == nil
93
86
}
94
87
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
+ }
96
134
97
- const depManifestHeader = `
98
- # Users add deps lines here
135
+ defer os .Remove (tmpfile .Name ()) // clean up
99
136
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
+ }
103
145
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