Skip to content

Commit 6100e86

Browse files
committed
Add git initialization, README.md and LICENSE creation
1 parent d53ddda commit 6100e86

File tree

10 files changed

+1797
-0
lines changed

10 files changed

+1797
-0
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ codegame --help
2828
- Go
2929
- Create a new game server
3030
- Go
31+
- Initialize Git
32+
- Create README and LICENSE files
3133

3234
## Installation
3335

commands/new.go

Lines changed: 176 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,17 @@
11
package commands
22

33
import (
4+
_ "embed"
45
"encoding/json"
6+
"errors"
7+
"fmt"
58
"io"
69
"net/http"
710
"os"
811
"path/filepath"
912
"strings"
13+
"text/template"
14+
"time"
1015

1116
"github.com/code-game-project/codegame-cli/cli"
1217
"github.com/code-game-project/codegame-cli/external"
@@ -53,6 +58,19 @@ func New() error {
5358
return err
5459
}
5560

61+
err = git(projectName)
62+
if err != nil {
63+
return err
64+
}
65+
err = readme(projectName)
66+
if err != nil {
67+
return err
68+
}
69+
err = license(projectName)
70+
if err != nil {
71+
return err
72+
}
73+
5674
cli.Success("Successfully created project in '%s/'.", projectName)
5775
return nil
5876
}
@@ -134,6 +152,164 @@ func newClient(projectName string) error {
134152
return err
135153
}
136154

155+
func git(projectName string) error {
156+
if !external.IsInstalled("git") {
157+
return nil
158+
}
159+
160+
yes, err := cli.YesNo("Do you want to initialize git?", true)
161+
if err != nil {
162+
os.RemoveAll(projectName)
163+
return err
164+
}
165+
if !yes {
166+
return nil
167+
}
168+
out, err := external.ExecuteInDirHidden(projectName, "git", "init")
169+
if err != nil {
170+
if out != "" {
171+
cli.Error(out)
172+
}
173+
return err
174+
}
175+
176+
return nil
177+
}
178+
179+
func readme(projectName string) error {
180+
yes, err := cli.YesNo("Create a README file?", true)
181+
if err != nil {
182+
os.RemoveAll(projectName)
183+
return err
184+
}
185+
if !yes {
186+
return nil
187+
}
188+
189+
fileContent := fmt.Sprintf("# %s", projectName)
190+
191+
err = os.WriteFile(filepath.Join(projectName, "README.md"), []byte(fileContent), 0644)
192+
if err != nil {
193+
cli.Error(err.Error())
194+
}
195+
return err
196+
}
197+
198+
//go:embed templates/licenses/MIT.tmpl
199+
var licenseMIT string
200+
201+
//go:embed templates/licenses/MIT_README.tmpl
202+
var licenseReadmeMIT string
203+
204+
//go:embed templates/licenses/GPL.tmpl
205+
var licenseGPL string
206+
207+
//go:embed templates/licenses/GPL_README.tmpl
208+
var licenseReadmeGPL string
209+
210+
//go:embed templates/licenses/AGPL.tmpl
211+
var licenseAGPL string
212+
213+
//go:embed templates/licenses/AGPL_README.tmpl
214+
var licenseReadmeAGPL string
215+
216+
//go:embed templates/licenses/Apache.tmpl
217+
var licenseApache string
218+
219+
//go:embed templates/licenses/Apache_README.tmpl
220+
var licenseReadmeApache string
221+
222+
func license(projectName string) error {
223+
license, err := cli.Select("Select a license", []string{"None", "MIT", "GPLv3", "AGPL", "Apache 2.0"}, []string{"none", "MIT", "GPL", "AGPL", "Apache"})
224+
if err != nil {
225+
os.RemoveAll(projectName)
226+
return err
227+
}
228+
229+
var licenseTemplate string
230+
var licenseReadmeTemplate string
231+
switch license {
232+
case "MIT":
233+
licenseTemplate = licenseMIT
234+
licenseReadmeTemplate = licenseReadmeMIT
235+
case "GPL":
236+
licenseTemplate = licenseGPL
237+
licenseReadmeTemplate = licenseReadmeGPL
238+
case "AGPL":
239+
licenseTemplate = licenseAGPL
240+
licenseReadmeTemplate = licenseReadmeAGPL
241+
case "Apache":
242+
licenseTemplate = licenseApache
243+
licenseReadmeTemplate = licenseReadmeApache
244+
case "none":
245+
return nil
246+
default:
247+
return errors.New("Unknown license.")
248+
}
249+
250+
err = writeLicense(licenseTemplate, projectName, external.GetUsername(), time.Now().Year())
251+
if err != nil {
252+
os.Remove(filepath.Join(projectName, "LICENSE"))
253+
return err
254+
}
255+
256+
if _, err := os.Stat("README.md"); err == nil {
257+
err = writeReadmeLicense(licenseReadmeTemplate, projectName, external.GetUsername(), time.Now().Year())
258+
if err != nil {
259+
return err
260+
}
261+
}
262+
263+
return nil
264+
}
265+
266+
func writeLicense(templateText, projectName, username string, year int) error {
267+
type data struct {
268+
Year int
269+
Username string
270+
}
271+
tmpl, err := template.New("LICENSE").Parse(templateText)
272+
if err != nil {
273+
return err
274+
}
275+
276+
file, err := os.Create(filepath.Join(projectName, "LICENSE"))
277+
if err != nil {
278+
return cli.Error("Failed to create LICENSE file!")
279+
}
280+
defer file.Close()
281+
282+
return tmpl.Execute(file, data{
283+
Year: year,
284+
Username: username,
285+
})
286+
}
287+
288+
func writeReadmeLicense(templateText, projectName, username string, year int) error {
289+
readme, err := os.OpenFile(filepath.Join(projectName, "README.md"), os.O_APPEND|os.O_WRONLY, 0755)
290+
if err != nil {
291+
return cli.Error("Failed to append license text to README.")
292+
}
293+
defer readme.Close()
294+
295+
text := "\n\n## License\n\n"
296+
readme.WriteString(text)
297+
298+
tmpl, err := template.New("README_License").Parse(templateText)
299+
if err != nil {
300+
return err
301+
}
302+
303+
type data struct {
304+
Year int
305+
Username string
306+
}
307+
return tmpl.Execute(readme, data{
308+
Year: year,
309+
Username: username,
310+
})
311+
}
312+
137313
func getCodeGameInfo(baseURL string) (string, string, error) {
138314
type response struct {
139315
Name string `json:"name"`

0 commit comments

Comments
 (0)