Skip to content

Commit abe0488

Browse files
authored
Merge pull request #26 from Lotti/feature/composer
Feature/composer
2 parents ba147be + 1951d5f commit abe0488

File tree

5 files changed

+199
-31
lines changed

5 files changed

+199
-31
lines changed

commands/help.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import (
77

88
func Help(notFoundError bool) {
99
theme.Title("pvm: PHP Version Manager")
10-
theme.Info("Version 1.1.1")
10+
theme.Info("Version 1.2.0")
1111

1212
if notFoundError {
1313
theme.Error("Command not found")

commands/install.go

Lines changed: 60 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -143,64 +143,67 @@ func Install(args []string) {
143143
}
144144

145145
// check if .pvm folder exists
146-
if _, err := os.Stat(homeDir + "/.pvm"); os.IsNotExist(err) {
146+
pvmPath := filepath.Join(homeDir, ".pvm")
147+
if _, err := os.Stat(pvmPath); os.IsNotExist(err) {
147148
theme.Info("Creating .pvm folder in home directory")
148-
os.Mkdir(homeDir+"/.pvm", 0755)
149+
os.Mkdir(pvmPath, 0755)
149150
}
150151

151152
// check if .pvm/versions folder exists
152-
if _, err := os.Stat(homeDir + "/.pvm/versions"); os.IsNotExist(err) {
153+
versionsPath := filepath.Join(pvmPath, "versions")
154+
if _, err := os.Stat(versionsPath); os.IsNotExist(err) {
153155
theme.Info("Creating .pvm/versions folder in home directory")
154-
os.Mkdir(homeDir+"/.pvm/versions", 0755)
156+
os.Mkdir(versionsPath, 0755)
155157
}
156158

157159
theme.Info("Downloading")
158160

159-
// Get the data
160-
downloadResponse, err := http.Get("https://windows.php.net" + desiredVersion.Url)
161-
if err != nil {
162-
log.Fatalln(err)
163-
}
164-
165-
defer downloadResponse.Body.Close()
166-
167161
// zip filename from url
162+
zipUrl := "https://windows.php.net" + desiredVersion.Url
168163
zipFileName := strings.Split(desiredVersion.Url, "/")[len(strings.Split(desiredVersion.Url, "/"))-1]
164+
zipPath := filepath.Join(versionsPath, zipFileName)
169165

170166
// check if zip already exists
171-
if _, err := os.Stat(homeDir + "/.pvm/versions/" + zipFileName); err == nil {
167+
if _, err := os.Stat(zipPath); err == nil {
172168
theme.Error(fmt.Sprintf("PHP %s already exists", desiredVersion))
173169
return
174170
}
175171

176-
// Create the file
177-
out, err := os.Create(homeDir + "/.pvm/versions/" + zipFileName)
178-
if err != nil {
179-
log.Fatalln(err)
180-
}
181-
182-
// Write the body to file
183-
_, err = io.Copy(out, downloadResponse.Body)
184-
185-
if err != nil {
186-
out.Close()
187-
log.Fatalln(err)
172+
// Get the data
173+
if _, err := downloadFile(zipUrl, zipPath); err != nil {
174+
log.Fatalf("Error while downloading PHP from %v: %v!", zipUrl, err)
188175
}
189176

190-
// Close the file
191-
out.Close()
192-
193177
// extract the zip file to a folder
178+
phpFolder := strings.Replace(zipFileName, ".zip", "", -1)
179+
phpPath := filepath.Join(versionsPath, phpFolder)
194180
theme.Info("Unzipping")
195-
Unzip(homeDir+"/.pvm/versions/"+zipFileName, homeDir+"/.pvm/versions/"+strings.Replace(zipFileName, ".zip", "", -1))
181+
Unzip(zipPath, phpPath)
196182

197183
// remove the zip file
198184
theme.Info("Cleaning up")
199-
err = os.Remove(homeDir + "/.pvm/versions/" + zipFileName)
185+
err = os.Remove(zipPath)
200186
if err != nil {
201187
log.Fatalln(err)
202188
}
203189

190+
// install composer
191+
composerFolderPath := filepath.Join(phpPath, "composer")
192+
if _, err := os.Stat(composerFolderPath); os.IsNotExist(err) {
193+
theme.Info("Creating .pvm/versions folder in home directory")
194+
os.Mkdir(composerFolderPath, 0755)
195+
}
196+
197+
composerPath := filepath.Join(composerFolderPath, "composer.phar")
198+
composerUrl := "https://getcomposer.org/download/latest-stable/composer.phar"
199+
if desiredVersion.LessThan(common.Version{Major: 7, Minor: 2}) {
200+
composerUrl = "https://getcomposer.org/download/latest-2.2.x/composer.phar"
201+
}
202+
203+
if _, err := downloadFile(composerUrl, composerPath); err != nil {
204+
log.Fatalf("Error while downloading Composer from %v: %v!", composerUrl, err)
205+
}
206+
204207
theme.Success(fmt.Sprintf("Finished installing PHP %s", desiredVersion))
205208
}
206209

@@ -316,3 +319,30 @@ func FindLatestMinor(versions []common.Version, major int, threadSafe bool) comm
316319

317320
return latestMinor
318321
}
322+
323+
func downloadFile(fileUrl string, filePath string) (bool, error) {
324+
downloadResponse, err := http.Get(fileUrl)
325+
if err != nil {
326+
return false, err
327+
}
328+
329+
defer downloadResponse.Body.Close()
330+
331+
// Create the file
332+
out, err := os.Create(filePath)
333+
if err != nil {
334+
return false, err
335+
}
336+
337+
// Write the body to file
338+
_, err = io.Copy(out, downloadResponse.Body)
339+
340+
if err != nil {
341+
out.Close()
342+
return false, err
343+
}
344+
345+
// Close the file
346+
out.Close()
347+
return true, nil
348+
}

commands/use.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,9 +108,22 @@ func Use(args []string) {
108108
os.Remove(shPathCGI)
109109
}
110110

111+
// remove old composer bat script
112+
batPathComposer := filepath.Join(binPath, "composer.bat")
113+
if _, err := os.Stat(batPathComposer); err == nil {
114+
os.Remove(batPathComposer)
115+
}
116+
117+
// remove the old composer sh script
118+
shPathComposer := filepath.Join(binPath, "composer")
119+
if _, err := os.Stat(shPathComposer); err == nil {
120+
os.Remove(shPathComposer)
121+
}
122+
111123
versionFolderPath := filepath.Join(homeDir, ".pvm", "versions", selectedVersion.folder.Name())
112124
versionPath := filepath.Join(versionFolderPath, "php.exe")
113125
versionPathCGI := filepath.Join(versionFolderPath, "php-cgi.exe")
126+
composerPath := filepath.Join(versionFolderPath, "composer", "composer.phar")
114127

115128
// create bat script for php
116129
batCommand := "@echo off \n"
@@ -158,6 +171,31 @@ func Use(args []string) {
158171
log.Fatalln(err)
159172
}
160173

174+
// create bat script for composer
175+
batCommandComposer := "@echo off \n"
176+
batCommandComposer = batCommandComposer + "set filepath=\"" + versionPath + "\"\n"
177+
batCommandComposer = batCommandComposer + "set composerpath=\"" + composerPath + "\"\n"
178+
batCommandComposer = batCommandComposer + "set arguments=%*\n"
179+
batCommandComposer = batCommandComposer + "%filepath% %composerpath% %arguments%\n"
180+
181+
err = os.WriteFile(batPathComposer, []byte(batCommandComposer), 0755)
182+
183+
if err != nil {
184+
log.Fatalln(err)
185+
}
186+
187+
// create sh script for php
188+
shCommandComposer := "#!/bin/bash\n"
189+
shCommandComposer = shCommandComposer + "filepath=\"" + versionPath + "\"\n"
190+
shCommandComposer = shCommandComposer + "composerpath=\"" + composerPath + "\"\n"
191+
shCommandComposer = shCommandComposer + "\"$filepath\" \"$composerpath\" \"$@\""
192+
193+
err = os.WriteFile(shPathComposer, []byte(shCommandComposer), 0755)
194+
195+
if err != nil {
196+
log.Fatalln(err)
197+
}
198+
161199
// create directory link to ext directory
162200
extensionDirPath := filepath.Join(versionFolderPath, "ext")
163201
extensionLinkPath := filepath.Join(binPath, "ext")

common/helpers.go

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,3 +52,60 @@ func GetVersion(text string, safe bool, url string) Version {
5252
Url: url,
5353
}
5454
}
55+
56+
func (v Version) Compare(o Version) int {
57+
if v.Major == -1 || o.Major == -1 {
58+
return 0
59+
}
60+
if v.Major != o.Major {
61+
if v.Major < o.Major {
62+
return -1
63+
}
64+
return 1
65+
}
66+
67+
if v.Minor == -1 || o.Minor == -1 {
68+
return 0
69+
}
70+
if v.Minor != o.Minor {
71+
if v.Minor < o.Minor {
72+
return -1
73+
}
74+
return 1
75+
}
76+
77+
if v.Patch == -1 || o.Patch == -1 {
78+
return 0
79+
}
80+
if v.Patch != o.Patch {
81+
if v.Patch < o.Patch {
82+
return -1
83+
}
84+
return 1
85+
}
86+
return 0
87+
}
88+
89+
func (v Version) LessThan(other Version) bool {
90+
return v.Compare(other) == -1
91+
}
92+
93+
func (v Version) LessThanOrEqual(other Version) bool {
94+
return v.Compare(other) == -1 || v.Compare(other) == 0
95+
}
96+
97+
func (v Version) GreaterThan(other Version) bool {
98+
return v.Compare(other) == 1
99+
}
100+
101+
func (v Version) GreaterThanOrEqual(other Version) bool {
102+
return v.Compare(other) == 1 || v.Compare(other) == 0
103+
}
104+
105+
func (v Version) Equal(other Version) bool {
106+
return v.Compare(other) == 0
107+
}
108+
109+
func (v Version) Same(other Version) bool {
110+
return v.Compare(other) == 0 && v.ThreadSafe == other.ThreadSafe
111+
}

common/helpers_test.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package common
2+
3+
import (
4+
"testing"
5+
6+
"github.com/stretchr/testify/assert"
7+
)
8+
9+
func Test_Version_Compare(t *testing.T) {
10+
v1 := Version{Major: 1, Minor: 2, Patch: 3, ThreadSafe: false}
11+
v2 := Version{Major: 1, Minor: 2, Patch: 4}
12+
v3 := Version{Major: 1, Minor: 2, Patch: 3, ThreadSafe: true}
13+
14+
assert.Equal(t, v1.LessThan(v2), true)
15+
assert.Equal(t, v1.LessThanOrEqual(v2), true)
16+
assert.Equal(t, v1.LessThanOrEqual(v3), true)
17+
assert.Equal(t, v1.GreaterThan(v2), false)
18+
assert.Equal(t, v1.GreaterThanOrEqual(v2), false)
19+
assert.Equal(t, v1.GreaterThanOrEqual(v3), true)
20+
assert.Equal(t, v1.Equal(v2), false)
21+
assert.Equal(t, v1.Equal(v3), true)
22+
assert.Equal(t, v1.Same(v3), false)
23+
24+
// testing versions with "nulled" (-1) values
25+
26+
v4 := Version{Major: 1, Minor: 2, Patch: -1}
27+
v5 := Version{Major: 1, Minor: 2, Patch: 3}
28+
29+
assert.Equal(t, v4.LessThan(v5), false)
30+
assert.Equal(t, v4.LessThanOrEqual(v5), true)
31+
assert.Equal(t, v4.GreaterThan(v5), false)
32+
assert.Equal(t, v4.GreaterThanOrEqual(v5), true)
33+
assert.Equal(t, v4.Equal(v5), true)
34+
35+
v6 := Version{Major: 1, Minor: -1}
36+
v7 := Version{Major: 1, Minor: 2}
37+
38+
assert.Equal(t, v6.LessThan(v7), false)
39+
assert.Equal(t, v6.LessThanOrEqual(v7), true)
40+
assert.Equal(t, v6.GreaterThan(v7), false)
41+
assert.Equal(t, v6.GreaterThanOrEqual(v7), true)
42+
assert.Equal(t, v6.Equal(v7), true)
43+
}

0 commit comments

Comments
 (0)