typora-installer/main.go

198 lines
4.0 KiB
Go

package main
import (
"context"
"flag"
"fmt"
"io"
"net/http"
"os"
"os/exec"
"path/filepath"
"runtime"
"typorainstaller/common"
"typorainstaller/constants"
)
func pull(pull_type int) error {
var urlToDownload string
var fname string
switch pull_type {
case PULL_INSTALLER:
urlToDownload = "https://git.godopu.net/Godopu/typora-installer/media/branch/main/installer/" + constants.Installer
fname = constants.Installer
case PULL_CONFIG:
urlToDownload = "https://git.godopu.net/Godopu/typora-installer/media/branch/main/themes.zip"
fname = "themes.zip"
}
resp, err := http.Get(urlToDownload)
if err != nil {
return err
}
file, err := os.Create(fname)
if err != nil {
return err
}
defer file.Close()
_, err = io.Copy(file, resp.Body)
if err != nil {
return err
}
return nil
}
func installOnWindows(ctx context.Context) (context.Context, error) {
cmd := exec.Command("powershell", "-nologo", "-noprofile")
stdin, err := cmd.StdinPipe()
if err != nil {
return nil, err
}
errorCh := make(chan error, 1)
defer close(errorCh)
go func() {
defer stdin.Close()
fmt.Fprintln(stdin, "$T = Get-Date")
fmt.Fprintln(stdin, "Set-Date -Date ($T).AddYears(30)")
bout, err := exec.Command(constants.Installer).Output()
if err != nil {
errorCh <- err
}
fmt.Println(bout)
fmt.Fprintln(stdin, "Set-Date -Date ($T)")
errorCh <- nil
}()
_, err = cmd.Output()
if err != nil {
errorCh <- err
}
return nil, <-errorCh
}
func configOnWindows() error {
err := os.RemoveAll(filepath.Join(constants.ConfigPath, "themes"))
if err != nil {
return err
}
return common.Unzip("./themes.zip", constants.ConfigPath)
}
const (
PULL_INSTALLER = iota
PULL_CONFIG
)
func IsExistConfig() bool {
if _, err := os.Stat("./themes.zip"); err == nil {
return true
}
return false
}
func IsExistInstaller() bool {
// if _, err := os.Stat("./themes.zip"); err == nil {
// return true
// }
return false
}
func main() {
conf := flag.Bool("config", false, "Config")
inst := flag.Bool("install", false, "Install")
clear := flag.Bool("clear", false, "Clear cache")
flag.Parse()
if *clear {
err := os.RemoveAll(constants.WorkPath)
if err != nil {
panic(err)
}
}
err := os.MkdirAll(constants.WorkPath, os.ModePerm)
if err != nil {
panic(err)
}
err = os.Chdir(constants.WorkPath)
if err != nil {
panic(err)
}
if *conf {
if !IsExistConfig() {
fmt.Println("Downloading config file...")
pull(PULL_CONFIG)
fmt.Println("Download Success")
}
fmt.Println("Setting config")
switch runtime.GOOS {
case "windows":
err = configOnWindows()
if err != nil {
panic(err)
}
default:
fmt.Println("Not supported operating system")
}
fmt.Println("Install success")
} else if *inst {
if !IsExistInstaller() {
fmt.Println("Downloading install program...")
err := pull(PULL_INSTALLER)
if err != nil {
panic(err)
}
fmt.Println("Download Success")
}
fmt.Println("Installing...")
reactiveHandler := common.ReactiveHandlerOnOS{HandleFunc: map[string]func(context.Context) (context.Context, error){}}
reactiveHandler.HandleFunc["windows"] = installOnWindows
_, err := reactiveHandler.Handle(context.Background())
if err != nil {
panic(err)
}
fmt.Println("Install success")
}
// if *inst {
// if _, err := os.Stat(filepath.Join(workPath, "typora-installer")); err != nil {
// fmt.Println("Start download")
// download()
// fmt.Println("download success")
// fmt.Println("Start unzip")
// unzip("main.zip")
// fmt.Println("Unzip success")
// }
// fmt.Println("Installing...")
// install()
// fmt.Println("Install success")
// } else if *conf {
// if _, err := os.Stat(filepath.Join(workPath, "typora-installer")); err != nil {
// fmt.Println("Start download")
// download()
// fmt.Println("download success")
// fmt.Println("Start unzip")
// unzip("main.zip")
// fmt.Println("Unzip success")
// }
// fmt.Println("Set config")
// config()
// fmt.Println("Config success")
// }
}