Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor: fixing (potential) bugs around closing #1995

Merged
merged 7 commits into from Mar 3, 2021
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
11 changes: 7 additions & 4 deletions app/preferences.go
Expand Up @@ -64,19 +64,22 @@ func (p *preferences) load() {
}
}

func (p *preferences) loadFromFile(path string) error {
func (p *preferences) loadFromFile(path string) (err error) {
tehsphinx marked this conversation as resolved.
Show resolved Hide resolved
file, err := os.Open(path) // #nosec
if err != nil {
if os.IsNotExist(err) {
err := os.MkdirAll(filepath.Dir(path), 0700)
if err != nil {
if err := os.MkdirAll(filepath.Dir(path), 0700); err != nil {
return err
}
return nil
}
return err
}
defer file.Close()
defer func() {
if r := file.Close(); r != nil {
tehsphinx marked this conversation as resolved.
Show resolved Hide resolved
err = r
}
}()
decode := json.NewDecoder(file)

p.InMemoryPreferences.WriteValues(func(values map[string]interface{}) {
Expand Down
54 changes: 33 additions & 21 deletions cmd/fyne/internal/commands/bundle.go
Expand Up @@ -138,35 +138,23 @@ func (b *Bundler) Run(args []string) {
}
}

func (b *Bundler) bundleAction(ctx *cli.Context) error {
func (b *Bundler) bundleAction(ctx *cli.Context) (err error) {
if ctx.Args().Len() != 1 {
return errors.New("missing required file or directory parameter after flags")
}

outFile := os.Stdout
if b.out != "" {
fileModes := os.O_RDWR | os.O_CREATE | os.O_TRUNC
if b.noheader {
fileModes = os.O_RDWR | os.O_APPEND
file, closeFile, err := getOutputFile(b.out, b.noheader)
if err != nil {
return err
}

f, err := os.OpenFile(b.out, fileModes, 0666)
if err == nil {
outFile = f
} else {
if os.IsNotExist(err) {
f, err = os.Create(b.out)
if err == nil {
outFile = f
} else {
fyne.LogError("Unable to read, or create, output file : "+b.out, err)
return err
}
} else {
fyne.LogError("Unable to open output file", err)
return err
defer func() {
if r := closeFile(); r != nil {
err = r
tehsphinx marked this conversation as resolved.
Show resolved Hide resolved
}
}
}()
outFile = file
}

arg := ctx.Args().First()
Expand Down Expand Up @@ -227,6 +215,30 @@ func (b *Bundler) doBundle(filepath string, out *os.File) {
writeResource(filepath, b.name, out)
}

func getOutputFile(filePath string, noheader bool) (file *os.File, close func() error, err error) {
tehsphinx marked this conversation as resolved.
Show resolved Hide resolved
fileModes := os.O_RDWR | os.O_CREATE | os.O_TRUNC
if noheader {
fileModes = os.O_RDWR | os.O_APPEND
}

f, err := os.OpenFile(filePath, fileModes, 0666)
if err != nil {
if !os.IsNotExist(err) {
fyne.LogError("Unable to open output file", err)
return nil, nil, err
}

// try creating the file
f, err = os.Create(filePath)
if err != nil {
fyne.LogError("Unable to read, or create, output file : "+filePath, err)
return nil, nil, err
}
}

return f, f.Close, nil
}

func sanitiseName(file, prefix string) string {
titled := strings.Title(file)

Expand Down
24 changes: 17 additions & 7 deletions cmd/fyne/internal/commands/package-darwin.go
Expand Up @@ -20,25 +20,31 @@ type darwinData struct {
Category string
}

func (p *Packager) packageDarwin() error {
func (p *Packager) packageDarwin() (err error) {
appDir := util.EnsureSubDir(p.dir, p.name+".app")
exeName := filepath.Base(p.exe)

contentsDir := util.EnsureSubDir(appDir, "Contents")
info := filepath.Join(contentsDir, "Info.plist")
infoFile, _ := os.Create(info)
infoFile, err := os.Create(info)
if err != nil {
return errors.Wrap(err, "Failed to write plist template")
}
tehsphinx marked this conversation as resolved.
Show resolved Hide resolved
defer func() {
if r := infoFile.Close(); r != nil {
tehsphinx marked this conversation as resolved.
Show resolved Hide resolved
err = r
tehsphinx marked this conversation as resolved.
Show resolved Hide resolved
}
}()
tehsphinx marked this conversation as resolved.
Show resolved Hide resolved

tplData := darwinData{Name: p.name, ExeName: exeName, AppID: p.appID, Version: p.appVersion, Build: p.appBuild,
Category: strings.ToLower(p.category)}
err := templates.InfoPlistDarwin.Execute(infoFile, tplData)
if err != nil {
if err := templates.InfoPlistDarwin.Execute(infoFile, tplData); err != nil {
return errors.Wrap(err, "Failed to write plist template")
}

macOSDir := util.EnsureSubDir(contentsDir, "MacOS")
binName := filepath.Join(macOSDir, exeName)
err = util.CopyExeFile(p.exe, binName)
if err != nil {
if err := util.CopyExeFile(p.exe, binName); err != nil {
return errors.Wrap(err, "Failed to copy exe file")
}

Expand All @@ -58,7 +64,11 @@ func (p *Packager) packageDarwin() error {
if err != nil {
return errors.Wrap(err, "Failed to open destination file")
}
defer dest.Close()
defer func() {
if r := dest.Close(); r != nil {
tehsphinx marked this conversation as resolved.
Show resolved Hide resolved
err = r
tehsphinx marked this conversation as resolved.
Show resolved Hide resolved
}
}()
if err := icns.Encode(dest, srcImg); err != nil {
return errors.Wrap(err, "Failed to encode icns")
}
Expand Down
46 changes: 32 additions & 14 deletions cmd/fyne/internal/commands/release.go
Expand Up @@ -8,6 +8,7 @@ import (
"os/exec"
"path/filepath"
"strings"
"text/template"

"fyne.io/fyne/v2"
"fyne.io/fyne/v2/cmd/fyne/internal/mobile"
Expand Down Expand Up @@ -260,23 +261,22 @@ func (r *Releaser) packageIOSRelease() error {
}

payload := filepath.Join(r.dir, "Payload")
os.Mkdir(payload, 0750)
_ = os.Mkdir(payload, 0750)
defer os.RemoveAll(payload)
appName := mobile.AppOutputName(r.os, r.name)
payloadAppDir := filepath.Join(payload, appName)
os.Rename(filepath.Join(r.dir, appName), payloadAppDir)
if err := os.Rename(filepath.Join(r.dir, appName), payloadAppDir); err != nil {
return err
}

entitlementPath := filepath.Join(r.dir, "entitlements.plist")
entitlements, _ := os.Create(entitlementPath)
entitlementData := struct{ TeamID, AppID string }{
cleanup, err := r.writeEntitlements(templates.EntitlementsDarwinMobile, struct{ TeamID, AppID string }{
TeamID: team,
AppID: r.appID,
}
err = templates.EntitlementsDarwinMobile.Execute(entitlements, entitlementData)
entitlements.Close()
})
if err != nil {
return errors.New("failed to write entitlements plist template")
}
defer cleanup()

cmd := exec.Command("codesign", "-f", "-vv", "-s", r.certificate, "--entitlements",
"entitlements.plist", "Payload/"+appName+"/")
Expand All @@ -297,14 +297,12 @@ func (r *Releaser) packageMacOSRelease() error {
unsignedPath := r.name + "-unsigned.pkg"

defer os.RemoveAll(r.name + ".app") // this was the output of package and it can get in the way of future builds
entitlementPath := filepath.Join(r.dir, "entitlements.plist")
entitlements, _ := os.Create(entitlementPath)
err := templates.EntitlementsDarwin.Execute(entitlements, nil)
entitlements.Close()

cleanup, err := r.writeEntitlements(templates.EntitlementsDarwin, nil)
if err != nil {
return errors.New("failed to write entitlements plist template")
}
defer os.Remove(entitlementPath)
defer cleanup()

cmd := exec.Command("codesign", "-vfs", appCert, "--entitlement", "entitlements.plist", r.name+".app")
err = cmd.Run()
Expand All @@ -328,7 +326,7 @@ func (r *Releaser) packageMacOSRelease() error {

func (r *Releaser) packageWindowsRelease(outFile string) error {
payload := filepath.Join(r.dir, "Payload")
os.Mkdir(payload, 0750)
_ = os.Mkdir(payload, 0750)
defer os.RemoveAll(payload)

manifestPath := filepath.Join(payload, "appxmanifest.xml")
Expand Down Expand Up @@ -447,6 +445,26 @@ func (r *Releaser) validate() error {
return nil
}

func (r *Releaser) writeEntitlements(tmpl *template.Template, entitlementData interface{}) (cleanup func(), err error) {
entitlementPath := filepath.Join(r.dir, "entitlements.plist")
entitlements, err := os.Create(entitlementPath)
if err != nil {
return nil, err
}
defer func() {
if r := entitlements.Close(); r != nil {
tehsphinx marked this conversation as resolved.
Show resolved Hide resolved
err = r
}
}()

if err := tmpl.Execute(entitlements, entitlementData); err != nil {
return nil, err
}
return func() {
_ = os.Remove(entitlementPath)
fpabl0 marked this conversation as resolved.
Show resolved Hide resolved
}, nil
}

func (r *Releaser) zipAlign(path string) error {
unaligned := filepath.Join(filepath.Dir(path), "unaligned.apk")
err := os.Rename(path, unaligned)
Expand Down
11 changes: 7 additions & 4 deletions cmd/fyne/internal/util/file.go
Expand Up @@ -39,9 +39,8 @@ func EnsureSubDir(parent, name string) string {
return path
}

func copyFileMode(src, tgt string, perm os.FileMode) error {
_, err := os.Stat(src)
if err != nil {
func copyFileMode(src, tgt string, perm os.FileMode) (err error) {
if _, err := os.Stat(src); err != nil {
fpabl0 marked this conversation as resolved.
Show resolved Hide resolved
return err
}

Expand All @@ -55,7 +54,11 @@ func copyFileMode(src, tgt string, perm os.FileMode) error {
if err != nil {
return err
}
defer target.Close()
defer func() {
if r := target.Close(); r != nil {
tehsphinx marked this conversation as resolved.
Show resolved Hide resolved
err = r
tehsphinx marked this conversation as resolved.
Show resolved Hide resolved
}
}()

_, err = io.Copy(target, source)
return err
Expand Down
1 change: 1 addition & 0 deletions resource.go
Expand Up @@ -63,6 +63,7 @@ func LoadResourceFromURLString(urlStr string) (Resource, error) {
if err != nil {
return nil, err
}
defer res.Body.Close()

bytes, err := ioutil.ReadAll(res.Body)
if err != nil {
Expand Down