168 lines
4.4 KiB
Go
168 lines
4.4 KiB
Go
package main
|
|
|
|
import (
|
|
"bufio"
|
|
_ "embed"
|
|
"encoding/json"
|
|
"fmt"
|
|
"ldiff-converter/pb"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
|
|
"github.com/schollz/progressbar/v3"
|
|
)
|
|
|
|
//go:embed bin/7za.exe
|
|
var sevenZip []byte
|
|
|
|
func main() {
|
|
reader := bufio.NewReader(os.Stdin)
|
|
fmt.Print("Enter ldiff path: ")
|
|
ldiff, _ := reader.ReadString('\n')
|
|
ldiff = strings.TrimSpace(ldiff)
|
|
if ldiff == "" {
|
|
fmt.Fprintln(os.Stderr, "no ldiff file provided")
|
|
os.Exit(1)
|
|
}
|
|
|
|
fmt.Print("Enter zip hdiff output: ")
|
|
hdiff, _ := reader.ReadString('\n')
|
|
hdiff = strings.TrimSpace(hdiff)
|
|
if hdiff == "" {
|
|
fmt.Fprintln(os.Stderr, "no hdiff output provided")
|
|
os.Exit(1)
|
|
}
|
|
if !strings.HasSuffix(strings.ToLower(hdiff), ".zip") {
|
|
hdiff += ".zip"
|
|
}
|
|
|
|
tmpFolderPath := filepath.Join(".", "temp")
|
|
if err := os.MkdirAll(tmpFolderPath, 0755); err != nil {
|
|
fmt.Fprintln(os.Stderr, "error creating temp dir:", err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
fmt.Println("Unzipping ldiff...")
|
|
if err := UnzipWith7za(ldiff, tmpFolderPath); err != nil {
|
|
fmt.Fprintln(os.Stderr, "error:", err)
|
|
os.Exit(1)
|
|
}
|
|
fmt.Println("Unzipping ldiff done.")
|
|
|
|
ldiffPath := filepath.Join(tmpFolderPath, "ldiff")
|
|
manifestPath := filepath.Join(tmpFolderPath, "manifest")
|
|
hdiffFolderPath := filepath.Join(".", "hdiff")
|
|
|
|
fmt.Println("Loading manifest proto...")
|
|
manifestProto, err := LoadManifestProto(manifestPath)
|
|
if err != nil {
|
|
fmt.Fprintln(os.Stderr, "error loading manifest proto:", err)
|
|
os.Exit(1)
|
|
}
|
|
fmt.Println("Loading manifest proto done.")
|
|
|
|
ldiffEntries, err := os.ReadDir(ldiffPath)
|
|
if err != nil {
|
|
fmt.Fprintln(os.Stderr, "error reading ldiff dir:", err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
bar := progressbar.NewOptions(len(ldiffEntries),
|
|
progressbar.OptionSetDescription("📦 Converting ldiff files"),
|
|
progressbar.OptionShowCount(),
|
|
progressbar.OptionSetWidth(30),
|
|
progressbar.OptionSetPredictTime(true),
|
|
)
|
|
fmt.Println("Converting ldiff files...")
|
|
for _, ldiffEntry := range ldiffEntries {
|
|
assetName := ldiffEntry.Name()
|
|
var matchingAssets []struct {
|
|
AssetName string
|
|
AssetSize int64
|
|
Asset *pb.AssetManifest
|
|
}
|
|
|
|
for _, assetGroup := range manifestProto.Assets {
|
|
if data := assetGroup.AssetData; data != nil {
|
|
for _, asset := range data.Assets {
|
|
if asset.ChunkFileName == assetName {
|
|
matchingAssets = append(matchingAssets, struct {
|
|
AssetName string
|
|
AssetSize int64
|
|
Asset *pb.AssetManifest
|
|
}{assetGroup.AssetName, assetGroup.AssetSize, asset})
|
|
}
|
|
}
|
|
}
|
|
}
|
|
bar.Add(1)
|
|
for _, ma := range matchingAssets {
|
|
err := LDiffFile(ma.Asset, ma.AssetName, ma.AssetSize, ldiffPath, hdiffFolderPath)
|
|
if err != nil {
|
|
continue
|
|
}
|
|
}
|
|
}
|
|
bar.Finish()
|
|
fmt.Println()
|
|
fmt.Println("Converting ldiff files done.")
|
|
diffMapNames := make([]string, len(ldiffEntries))
|
|
for i, e := range ldiffEntries {
|
|
diffMapNames[i] = e.Name()
|
|
}
|
|
|
|
fmt.Println("Making diff map...")
|
|
diffMapList, err := MakeDiffMap(manifestProto, diffMapNames)
|
|
if err != nil {
|
|
fmt.Fprintln(os.Stderr, "error making diff map:", err)
|
|
os.Exit(1)
|
|
}
|
|
diffMapJson, err := json.Marshal(diffMapList)
|
|
if err != nil {
|
|
fmt.Fprintln(os.Stderr, "error marshal diff map:", err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
diffMapJsonPath := filepath.Join(hdiffFolderPath, "hdifffiles.json")
|
|
if err := os.WriteFile(diffMapJsonPath, diffMapJson, 0644); err != nil {
|
|
fmt.Fprintln(os.Stderr, "error writing diff map:", err)
|
|
os.Exit(1)
|
|
}
|
|
fmt.Println("Making diff map done.")
|
|
|
|
fmt.Println("Removing temp ldiff files...")
|
|
if err := RemoveFolderWithProgress(tmpFolderPath, "🗑️ Removing temp ldiff files"); err != nil {
|
|
fmt.Fprintln(os.Stderr, "error removing temp dir:", err)
|
|
os.Exit(1)
|
|
}
|
|
fmt.Println()
|
|
fmt.Println("Removing temp ldiff files done.")
|
|
|
|
fmt.Println("Zipping hdiff files...")
|
|
if err := ZipWith7za(hdiffFolderPath, hdiff); err != nil {
|
|
fmt.Fprintln(os.Stderr, "error zip hdiff:", err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
if _, err := os.Stat(hdiff); os.IsNotExist(err) {
|
|
fmt.Println("File not found, retrying...")
|
|
if err := ZipWith7za(hdiffFolderPath, hdiff); err != nil {
|
|
fmt.Println("Retry failed:", err)
|
|
os.Exit(1)
|
|
}
|
|
}
|
|
fmt.Println("Zipping hdiff files done.")
|
|
|
|
fmt.Println("Removing hdiff temp files...")
|
|
if err := RemoveFolderWithProgress(hdiffFolderPath, "🗑️ Removing hdiff temp files"); err != nil {
|
|
fmt.Fprintln(os.Stderr, "error removing temp dir:", err)
|
|
os.Exit(1)
|
|
}
|
|
fmt.Println()
|
|
fmt.Println("Removing hdiff temp files done.")
|
|
|
|
fmt.Println("Done!")
|
|
|
|
}
|