@@ -1217,19 +1217,17 @@ func isExitError(err error) bool {
12171217 return errors .As (err , & exitErr )
12181218}
12191219
1220- const (
1220+ var (
12211221 repoURL = "https://api.github.com/repos/anasfanani/tailscale-magisk-build/releases"
12221222 downloadDir = "/data/adb/tailscale/tmp/tailscale-android-update"
12231223 dirExtract = "/data/adb/tailscale/bin/"
12241224)
12251225
12261226func (up * Updater ) updateAndroid () error {
12271227 if up .Version != "" {
1228- return errors .New ("installing a specific version on Android currently not supported" )
1229- }
1230-
1231- if up .Track != StableTrack {
1232- return errors .New ("only stable track currently supported on Android" )
1228+ repoURL = fmt .Sprintf (repoURL + "/tags/v%s-android" , up .Version )
1229+ } else {
1230+ repoURL = fmt .Sprintf (repoURL + "/latest" )
12331231 }
12341232 resp , err := http .Get (repoURL )
12351233 if err != nil {
@@ -1241,29 +1239,38 @@ func (up *Updater) updateAndroid() error {
12411239 return fmt .Errorf ("unexpected status code: %d" , resp .StatusCode )
12421240 }
12431241 // Decode the JSON response
1244- var releases [] struct {
1242+ var release struct {
12451243 TagName string `json:"tag_name"`
12461244 Assets []struct {
12471245 Name string `json:"name"`
12481246 URL string `json:"browser_download_url"`
12491247 } `json:"assets"`
12501248 Prerelease bool `json:"prerelease"`
12511249 }
1252- if err := json .NewDecoder (resp .Body ).Decode (& releases ); err != nil {
1250+ if err := json .NewDecoder (resp .Body ).Decode (& release ); err != nil {
12531251 return fmt .Errorf ("failed to decode release metadata: %w" , err )
12541252 }
12551253
12561254 var ver string
1257-
1258- for _ , release := range releases {
1259- if release .Prerelease {
1260- continue
1261- }
1262- ver = strings .TrimPrefix (release .TagName , "v" )
1263- break
1264- }
1265-
1266- if ! up .confirm (ver ) {
1255+ ver = strings .TrimPrefix (release .TagName , "v" )
1256+ ver = strings .TrimSuffix (ver , "-android" )
1257+
1258+ // for _, release := range releases {
1259+ // if release.Prerelease && up.Track != StableTrack {
1260+ // ver = strings.TrimPrefix(release.TagName, "v")
1261+ // ver = strings.TrimSuffix(ver, "-android")
1262+ // break
1263+ // } else if release.Prerelease {
1264+ // up.Logf("Skipping pre-release version: %s", release.TagName)
1265+ // continue
1266+ // } else {
1267+ // ver = strings.TrimPrefix(release.TagName, "v")
1268+ // ver = strings.TrimSuffix(ver, "-android")
1269+ // break
1270+ // }
1271+ // }
1272+
1273+ if ! up .Confirm (ver ) {
12671274 return nil
12681275 }
12691276 // Determine the appropriate release based on the track
@@ -1273,26 +1280,37 @@ func (up *Updater) updateAndroid() error {
12731280 return fmt .Errorf ("unsupported architecture: %s" , runtime .GOARCH )
12741281 }
12751282
1276- assetsName := fmt .Sprintf (`tailscale.combined-%s-%s.tar.gz` , runtime .GOARCH , ver )
1277- for _ , release := range releases {
1278- // Iterate through the assets to find the matching one
1279- for _ , asset := range release .Assets {
1280- // Match the asset name format: Magisk-Tailscaled-arch-version
1281- matched , err := regexp .MatchString (`^` + assetsName + `$` , asset .Name )
1282- if err != nil {
1283- return fmt .Errorf ("failed to match asset name: %w" , err )
1284- }
1285- if matched {
1286- assetURL = asset .URL
1287- break
1288- }
1283+ assetsName := fmt .Sprintf (`tailscale.combined.%s.%s.tar.gz` , runtime .GOARCH , ver )
1284+ for _ , asset := range release .Assets {
1285+ // Match the asset name format: Magisk-Tailscaled-arch-version
1286+ matched , err := regexp .MatchString (`^` + assetsName + `$` , asset .Name )
1287+ if err != nil {
1288+ return fmt .Errorf ("failed to match asset name: %w" , err )
12891289 }
1290-
1291- // Stop searching if a suitable release is found
1292- if assetURL != "" {
1290+ if matched {
1291+ assetURL = asset .URL
12931292 break
12941293 }
12951294 }
1295+ // for _, release := range releases {
1296+ // // Iterate through the assets to find the matching one
1297+ // for _, asset := range release.Assets {
1298+ // // Match the asset name format: Magisk-Tailscaled-arch-version
1299+ // matched, err := regexp.MatchString(`^`+assetsName+`$`, asset.Name)
1300+ // if err != nil {
1301+ // return fmt.Errorf("failed to match asset name: %w", err)
1302+ // }
1303+ // if matched {
1304+ // assetURL = asset.URL
1305+ // break
1306+ // }
1307+ // }
1308+
1309+ // // Stop searching if a suitable release is found
1310+ // if assetURL != "" {
1311+ // break
1312+ // }
1313+ // }
12961314
12971315 if assetURL == "" {
12981316 return fmt .Errorf ("error while fetch release for arch %q, asset name %q, download manually on %q" , runtime .GOARCH , assetsName , repoURL )
@@ -1358,7 +1376,7 @@ func (up *Updater) updateAndroid() error {
13581376 }
13591377 // Create the destination file
13601378 destPath := filepath .Join (dirExtract , header .Name )
1361- destFile , err := os .Create (destPath )
1379+ destFile , err := os .Create (destPath + ".new" )
13621380 if err != nil {
13631381 return fmt .Errorf ("failed to create destination file: %w" , err )
13641382 }
@@ -1368,9 +1386,13 @@ func (up *Updater) updateAndroid() error {
13681386 return fmt .Errorf ("failed to extract file: %w" , err )
13691387 }
13701388 // Set the file permissions
1371- if err := os .Chmod (destPath , os .FileMode (0755 )| os .ModePerm ); err != nil {
1389+ if err := os .Chmod (destPath + ".new" , os .FileMode (0755 )| os .ModePerm ); err != nil {
13721390 return fmt .Errorf ("failed to set executable permissions: %w" , err )
13731391 }
1392+ // Rename the new file to replace the old one
1393+ if err := os .Rename (destPath + ".new" , destPath ); err != nil {
1394+ return fmt .Errorf ("failed to rename file: %w" , err )
1395+ }
13741396 up .Logf ("Extracted %s to %s" , header .Name , destPath )
13751397 }
13761398
0 commit comments