UPDATE: native with new hdiff type
This commit is contained in:
34
pkg/hpatchz/hpatchz.go
Normal file
34
pkg/hpatchz/hpatchz.go
Normal file
@@ -0,0 +1,34 @@
|
||||
package hpatchz
|
||||
|
||||
import (
|
||||
"firefly-launcher/pkg/constant"
|
||||
"fmt"
|
||||
"os/exec"
|
||||
"syscall"
|
||||
)
|
||||
|
||||
func ApplyPatch(oldFile, diffFile, newFile string) error {
|
||||
cmd := exec.Command(constant.ToolHPatchzExe.String(), "-f", oldFile, diffFile, newFile)
|
||||
cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}
|
||||
output, err := cmd.CombinedOutput()
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to execute hpatchz: %w", err)
|
||||
}
|
||||
if cmd.ProcessState.ExitCode() != 0 {
|
||||
return fmt.Errorf("hpatchz failed: %s", string(output))
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func ApplyPatchEmpty(diffFile, newFile string) error {
|
||||
cmd := exec.Command(constant.ToolHPatchzExe.String(), "-f", "", diffFile, newFile)
|
||||
cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}
|
||||
output, err := cmd.CombinedOutput()
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to execute hpatchz: %w", err)
|
||||
}
|
||||
if cmd.ProcessState.ExitCode() != 0 {
|
||||
return fmt.Errorf("hpatchz failed: %s", string(output))
|
||||
}
|
||||
return nil
|
||||
}
|
||||
43
pkg/models/hdiffFiles.go
Normal file
43
pkg/models/hdiffFiles.go
Normal file
@@ -0,0 +1,43 @@
|
||||
package models
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"os"
|
||||
)
|
||||
|
||||
type HDiffFiles struct {
|
||||
RemoteFile string `json:"remoteName"`
|
||||
}
|
||||
func (h *HDiffFiles) ToHDiffData() *HDiffData {
|
||||
return &HDiffData{
|
||||
SourceFileName: h.RemoteFile,
|
||||
TargetFileName: h.RemoteFile,
|
||||
PatchFileName: fmt.Sprintf("%s.hdiff", h.RemoteFile),
|
||||
}
|
||||
}
|
||||
|
||||
func LoadHDiffFiles(path string) ([]*HDiffFiles, error) {
|
||||
file, err := os.Open(path)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
var results []*HDiffFiles
|
||||
scanner := bufio.NewScanner(file)
|
||||
for scanner.Scan() {
|
||||
line := scanner.Text()
|
||||
var item HDiffFiles
|
||||
if err := json.Unmarshal([]byte(line), &item); err == nil {
|
||||
results = append(results, &item)
|
||||
}
|
||||
}
|
||||
|
||||
if err := scanner.Err(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return results, nil
|
||||
}
|
||||
@@ -12,4 +12,18 @@ type DiffMapType struct {
|
||||
PatchFileName string `json:"patch_file_name"`
|
||||
PatchFileMD5 string `json:"patch_file_md5"`
|
||||
PatchFileSize int64 `json:"patch_file_size"`
|
||||
}
|
||||
|
||||
type HDiffData struct {
|
||||
SourceFileName string `json:"source_file_name"`
|
||||
TargetFileName string `json:"target_file_name"`
|
||||
PatchFileName string `json:"patch_file_name"`
|
||||
}
|
||||
|
||||
func (d *DiffMapType) ToHDiffData() *HDiffData {
|
||||
return &HDiffData{
|
||||
SourceFileName: d.SourceFileName,
|
||||
TargetFileName: d.TargetFileName,
|
||||
PatchFileName: d.PatchFileName,
|
||||
}
|
||||
}
|
||||
36
pkg/models/pkgVersion.go
Normal file
36
pkg/models/pkgVersion.go
Normal file
@@ -0,0 +1,36 @@
|
||||
package models
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"encoding/json"
|
||||
"os"
|
||||
)
|
||||
|
||||
type PkgVersion struct {
|
||||
RemoteFile string `json:"remoteName"`
|
||||
MD5 string `json:"md5"`
|
||||
}
|
||||
|
||||
func LoadPkgVersion(path string) ([]*PkgVersion, error) {
|
||||
file, err := os.Open(path)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
var results []*PkgVersion
|
||||
scanner := bufio.NewScanner(file)
|
||||
for scanner.Scan() {
|
||||
line := scanner.Text()
|
||||
var item PkgVersion
|
||||
if err := json.Unmarshal([]byte(line), &item); err == nil {
|
||||
results = append(results, &item)
|
||||
}
|
||||
}
|
||||
|
||||
if err := scanner.Err(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return results, nil
|
||||
}
|
||||
@@ -29,6 +29,41 @@ func IsFileIn7z(archivePath, fileInside string) (bool, error) {
|
||||
return false, fmt.Errorf("%s not found in %s", fileInside, archivePath)
|
||||
}
|
||||
|
||||
func ListFilesInZip(archivePath string) ([]string, error) {
|
||||
cmd := exec.Command(constant.Tool7zaExe.String(), "l", archivePath)
|
||||
var out bytes.Buffer
|
||||
cmd.Stdout = &out
|
||||
cmd.Stderr = &out
|
||||
|
||||
if err := cmd.Run(); err != nil {
|
||||
return nil, fmt.Errorf("7za list failed: %v\nOutput: %s", err, out.String())
|
||||
}
|
||||
|
||||
lines := strings.Split(out.String(), "\n")
|
||||
var files []string
|
||||
foundTable := false
|
||||
|
||||
for _, line := range lines {
|
||||
if strings.HasPrefix(line, "----------") {
|
||||
if foundTable {
|
||||
break
|
||||
}
|
||||
foundTable = true
|
||||
continue
|
||||
}
|
||||
|
||||
if foundTable {
|
||||
fields := strings.Fields(line)
|
||||
if len(fields) >= 6 {
|
||||
fileName := strings.Join(fields[5:], " ")
|
||||
files = append(files, fileName)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return files, nil
|
||||
}
|
||||
|
||||
func ExtractAFileFromZip(archivePath, fileInside, outDir string) error {
|
||||
cmd := exec.Command(constant.Tool7zaExe.String(), "e", archivePath, fileInside, "-o"+outDir, "-y")
|
||||
cmd.Stdout = os.Stdout
|
||||
|
||||
Reference in New Issue
Block a user