@@ -10,8 +10,10 @@ import (
10
10
"os"
11
11
"os/exec"
12
12
"path/filepath"
13
+ "sort"
13
14
"strings"
14
15
16
+ "github.com/Masterminds/semver/v3"
15
17
"github.com/schollz/progressbar/v3"
16
18
)
17
19
@@ -20,15 +22,60 @@ var env = Environment{
20
22
Symlink : os .Getenv ("PHP_SYMLINK" ),
21
23
}
22
24
25
+ func ListAllVersions () ([]* semver.Version , error ) {
26
+ // fetch all versions from https://windows.php.net/downloads/releases/archives/
27
+ // print all versions
28
+ resp , err := http .Get ("https://windows.php.net/downloads/releases/archives/" )
29
+ if err != nil {
30
+ fmt .Println ("Error while fetching versions: " , err )
31
+ return nil , err
32
+ }
33
+ defer resp .Body .Close ()
34
+
35
+ body , err := io .ReadAll (resp .Body )
36
+ if err != nil {
37
+ fmt .Println ("Error while fetching versions: " , err )
38
+ return nil , err
39
+ }
40
+
41
+ versions := strings .Split (string (body ), "php-" )
42
+ allVersions := make (map [string ]bool )
43
+ for _ , version := range versions {
44
+ if strings .Contains (version , "-Win32" ) && ! strings .Contains (version , "pack" ) {
45
+ allVersions [strings .Split (version , "-" )[0 ]] = true
46
+ }
47
+ }
48
+
49
+ // convert map[string]bool to []string
50
+ var versionsList []string
51
+ for version := range allVersions {
52
+ versionsList = append (versionsList , version )
53
+ }
54
+
55
+ vs := make ([]* semver.Version , len (versionsList ))
56
+ for i , r := range versionsList {
57
+ v , err := semver .NewVersion (r )
58
+ if err != nil {
59
+ fmt .Println ("Error while fetching versions: " , err )
60
+ return nil , err
61
+ }
62
+
63
+ vs [i ] = v
64
+ }
65
+
66
+ sort .Sort (semver .Collection (vs ))
67
+
68
+ return vs , nil
69
+ }
70
+
23
71
func ChangeVersion (version string ) {
24
72
// check if there is directory in C:\php\versions\version
25
73
// if not, start download
26
74
// if yes, run command "cmd /c mklink /D C:\php\current C:\php\versions\version"
27
75
installdir := filepath .Join (env .Root , "versions" , version )
28
76
29
77
if _ , err := os .Stat (installdir ); os .IsNotExist (err ) {
30
- fmt .Println ("Version" , version , "does not exist" )
31
- fmt .Println ("Downloading " + version + "..." )
78
+ fmt .Println ("Version" , version , "does not exist on local machine, checking if version is available on PHP Servers." )
32
79
DownloadVersion (version )
33
80
} else {
34
81
if _ , err := os .Stat (env .Symlink ); ! os .IsNotExist (err ) {
@@ -49,24 +96,50 @@ func ChangeVersion(version string) {
49
96
}
50
97
51
98
func DownloadVersion (version string ) {
52
- // check if system is 32 or 64 bit
53
- // download the correct version
54
- // extract the zip file
55
- // move all content from where to C:\php\versions\version
56
- // open php.ini from C:\php\versions\version and add the following lines
57
- // extension_dir = "ext"
99
+ allVersions , err := ListAllVersions ()
100
+ if err != nil {
101
+ panic (err )
102
+ }
103
+
104
+ isPresent := false
105
+ for _ , v := range allVersions {
106
+ if v .Original () == version {
107
+ isPresent = true
108
+ break
109
+ }
110
+ }
111
+
112
+ if isPresent {
113
+ resp , err := http .Get ("https://windows.php.net/downloads/releases/archives/" )
114
+ if err != nil {
115
+ fmt .Println ("Error while fetching versions: " , err )
116
+ }
117
+ defer resp .Body .Close ()
118
+
119
+ body , err := io .ReadAll (resp .Body )
120
+ if err != nil {
121
+ fmt .Println ("Error while fetching versions: " , err )
122
+ }
123
+
124
+ versions := strings .Split (string (body ), "php-" + version + "-Win32-" )
125
+ matched := false
126
+ for _ , v := range versions {
127
+ // test regex for php-{version}-Win32-{something}-x64.zip
128
+ part := strings .Split (v , ".zip" )[0 ]
129
+ if strings .Contains (part , "x64" ) {
130
+ matched = true
131
+ fmt .Println ("Found x64 version: " , part )
132
+ url := "https://windows.php.net/downloads/releases/archives/php-" + version + "-Win32-" + part + ".zip"
133
+ fmt .Println ("Downloading from: " , url )
134
+ downloadAndInstall (url , version )
135
+ break
136
+ }
137
+ }
138
+
139
+ if ! matched {
140
+ fmt .Println ("Could not find x64 version for PHP " + version )
141
+ }
58
142
59
- switch version {
60
- case "8.2" :
61
- downloadAndInstall ("https://windows.php.net/downloads/releases/php-8.2.1-Win32-vs16-x64.zip" , version )
62
- case "8.1" :
63
- downloadAndInstall ("https://windows.php.net/downloads/releases/php-8.1.14-Win32-vs16-x64.zip" , version )
64
- case "8.0" :
65
- downloadAndInstall ("https://windows.php.net/downloads/releases/php-8.0.27-Win32-vs16-x64.zip" , version )
66
- case "7.4" :
67
- downloadAndInstall ("https://windows.php.net/downloads/releases/php-7.4.33-Win32-vc15-x64.zip" , version )
68
- default :
69
- fmt .Println ("Version" , version , "does not exist" )
70
143
}
71
144
}
72
145
@@ -141,6 +214,18 @@ func downloadAndInstall(url string, version string) {
141
214
// copy php.ini from C:\php\versions\version\php.ini-development to C:\php\versions\version\php.ini
142
215
os .Rename (dst + "\\ php.ini-development" , dst + "\\ php.ini" )
143
216
217
+ // edit php.ini and add the following lines
218
+ // extension_dir = "ext"
219
+ file , err := os .OpenFile (dst + "\\ php.ini" , os .O_APPEND | os .O_WRONLY , 0644 )
220
+ if err != nil {
221
+ panic (err )
222
+ }
223
+ defer file .Close ()
224
+
225
+ if _ , err = file .WriteString ("extension_dir = \" ext\" " ); err != nil {
226
+ panic (err )
227
+ }
228
+
144
229
// change version to the one that was just downloaded
145
230
ChangeVersion (version )
146
231
}
0 commit comments