Launcher, app/base, sentry, update service

This commit is contained in:
James Houlahan
2020-11-23 11:56:57 +01:00
parent 6fffb460b8
commit dc3f61acee
164 changed files with 5368 additions and 4039 deletions

82
pkg/files/removal.go Normal file
View File

@ -0,0 +1,82 @@
// Copyright (c) 2020 Proton Technologies AG
//
// This file is part of ProtonMail Bridge.
//
// ProtonMail Bridge is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// ProtonMail Bridge is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with ProtonMail Bridge. If not, see <https://www.gnu.org/licenses/>.
// Package files provides standard filesystem operations.
package files
import (
"os"
"path/filepath"
"sort"
"strings"
"github.com/hashicorp/go-multierror"
)
type OpRemove struct {
targets []string
exceptions []string
}
func Remove(targets ...string) *OpRemove {
return &OpRemove{targets: targets}
}
func (op *OpRemove) Except(exceptions ...string) *OpRemove {
op.exceptions = exceptions
return op
}
func (op *OpRemove) Do() error {
var multiErr error
for _, target := range op.targets {
if err := remove(target, op.exceptions...); err != nil {
multiErr = multierror.Append(multiErr, err)
}
}
return multiErr
}
func remove(dir string, except ...string) error {
var toRemove []string
if err := filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
for _, exception := range except {
if path == exception || strings.HasPrefix(exception, path) || strings.HasPrefix(path, exception) {
return nil
}
}
toRemove = append(toRemove, path)
return nil
}); err != nil {
return err
}
sort.Sort(sort.Reverse(sort.StringSlice(toRemove)))
for _, target := range toRemove {
if err := os.RemoveAll(target); err != nil {
return err
}
}
return nil
}

116
pkg/files/removal_test.go Normal file
View File

@ -0,0 +1,116 @@
// Copyright (c) 2020 Proton Technologies AG
//
// This file is part of ProtonMail Bridge.
//
// ProtonMail Bridge is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// ProtonMail Bridge is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with ProtonMail Bridge. If not, see <https://www.gnu.org/licenses/>.
package files
import (
"io/ioutil"
"os"
"path/filepath"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestRemove(t *testing.T) {
dir := newTestDir(t,
"subdir1",
"subdir2/subdir3",
)
defer delTestDir(t, dir)
createTestFiles(t, dir,
"subdir1/file1",
"subdir1/file2",
"subdir2/file3",
"subdir2/file4",
"subdir2/subdir3/file5",
"subdir2/subdir3/file6",
)
require.NoError(t, Remove(
filepath.Join(dir, "subdir1"),
filepath.Join(dir, "subdir2", "file3"),
filepath.Join(dir, "subdir2", "subdir3", "file5"),
).Do())
assert.NoFileExists(t, filepath.Join(dir, "subdir1", "file1"))
assert.NoFileExists(t, filepath.Join(dir, "subdir1", "file2"))
assert.NoFileExists(t, filepath.Join(dir, "subdir2", "file3"))
assert.FileExists(t, filepath.Join(dir, "subdir2", "file4"))
assert.NoFileExists(t, filepath.Join(dir, "subdir2", "subdir3", "file5"))
assert.FileExists(t, filepath.Join(dir, "subdir2", "subdir3", "file6"))
}
func TestRemoveWithExceptions(t *testing.T) {
dir := newTestDir(t,
"subdir1",
"subdir2/subdir3",
"subdir4",
)
defer delTestDir(t, dir)
createTestFiles(t, dir,
"subdir1/file1",
"subdir1/file2",
"subdir2/file3",
"subdir2/file4",
"subdir2/subdir3/file5",
"subdir2/subdir3/file6",
"subdir4/file7",
"subdir4/file8",
)
require.NoError(t, Remove(dir).Except(
filepath.Join(dir, "subdir2", "file4"),
filepath.Join(dir, "subdir2", "subdir3", "file6"),
filepath.Join(dir, "subdir4"),
).Do())
assert.NoFileExists(t, filepath.Join(dir, "subdir1", "file1"))
assert.NoFileExists(t, filepath.Join(dir, "subdir1", "file2"))
assert.NoFileExists(t, filepath.Join(dir, "subdir2", "file3"))
assert.FileExists(t, filepath.Join(dir, "subdir2", "file4"))
assert.NoFileExists(t, filepath.Join(dir, "subdir2", "subdir3", "file5"))
assert.FileExists(t, filepath.Join(dir, "subdir2", "subdir3", "file6"))
assert.FileExists(t, filepath.Join(dir, "subdir4", "file7"))
assert.FileExists(t, filepath.Join(dir, "subdir4", "file8"))
}
func newTestDir(t *testing.T, subdirs ...string) string {
dir, err := ioutil.TempDir("", "test-files-dir")
require.NoError(t, err)
for _, target := range subdirs {
require.NoError(t, os.MkdirAll(filepath.Join(dir, target), 0700))
}
return dir
}
func createTestFiles(t *testing.T, dir string, files ...string) {
for _, target := range files {
f, err := os.Create(filepath.Join(dir, target))
require.NoError(t, err)
require.NoError(t, f.Close())
}
}
func delTestDir(t *testing.T, dir string) {
require.NoError(t, os.RemoveAll(dir))
}