z_mirror/fmm
git clone https://git.raiguard.me/z_mirror/fmm
50e96b6
updating
1package fmm 2 3import ( 4"archive/zip" 5"encoding/json" 6"errors" 7"io" 8"os" 9"path/filepath" 10"strings" 11) 12 13type Release struct { 14Name string 15Dependencies []* Dependency 16Path string 17Version Version 18} 19 20func releaseFromFile (path string ) (* Release ,error ) { 21info ,err := os .Stat (path ) 22if err != nil { 23return nil ,errors .Join (errors .New ("unable to get file info" ),err ) 24 } 25filename := filepath .Base (path ) 26var infoJson infoJson 27if info .Mode ().IsRegular () { 28infoJson ,err = readZipInfoJson (path ) 29 }else if info .IsDir ()|| isSymlink (info ) { 30file ,err := os .Open (filepath .Join (path ,"info.json" )) 31if err == nil { 32infoJson ,err = readInfoJson (file ) 33 } 34 } 35 36if err != nil { 37return nil ,errors .Join (errors .New ("error when parsing info.json" ),err ) 38 } 39 40ident := NewModIdent (filename ) 41if ident .Name == infoJson .Name && infoJson .Version .Cmp (ident .Version )!= VersionEq { 42return nil ,errors .New ("invalid release filename" ) 43 } 44 45return & Release { 46infoJson .Name , 47infoJson .Dependencies , 48filename , 49infoJson .Version , 50 },nil 51} 52 53type infoJson struct { 54Dependencies []* Dependency `json:"dependencies"` 55Name string `json:"name"` 56Version Version `json:"version"` 57FactorioVersion Version `json:"factorio_version"` 58} 59 60func isSymlink (info os.FileInfo )bool { 61return info .Mode ()& os .ModeSymlink > 0 62} 63 64func readInfoJson (rc io.ReadCloser ) (infoJson ,error ) { 65var infoJson infoJson 66 67content ,err := io .ReadAll (rc ) 68if err != nil { 69return infoJson ,err 70 } 71 72err = json .Unmarshal (content ,& infoJson ) 73return infoJson ,err 74} 75 76func readZipInfoJson (path string ) (infoJson ,error ) { 77r ,err := zip .OpenReader (path ) 78if err != nil { 79return infoJson {},err 80 } 81 82var file * zip.File 83 84for _ ,existing := range r .File { 85parts := strings .Split (existing .Name ,"/" ) 86if len (parts )== 2 && parts [1 ]== "info.json" { 87file = existing 88break 89 } 90 } 91 92if file == nil { 93return infoJson {},errors .New ("could not locate info.json file" ) 94 } 95 96rc ,err := file .Open () 97if err != nil { 98return infoJson {},err 99 } 100defer rc .Close () 101 102return readInfoJson (rc ) 103}