archive,hookfiles: convert paths to usr-merge when necessary (MR 39)
Co-authored-by: Caleb Connolly <caleb@postmarketos.org>
This commit is contained in:
@@ -237,7 +237,10 @@ func (archive *Archive) AddItemsExclude(flister filelist.FileLister, exclude fil
|
||||
|
||||
// Adds the given file or directory at "source" to the archive at "dest"
|
||||
func (archive *Archive) AddItem(source string, dest string) error {
|
||||
|
||||
if osutil.HasMergedUsr() {
|
||||
source = osutil.MergeUsr(source)
|
||||
dest = osutil.MergeUsr(dest)
|
||||
}
|
||||
sourceStat, err := os.Lstat(source)
|
||||
if err != nil {
|
||||
e, ok := err.(*os.PathError)
|
||||
|
@@ -11,6 +11,7 @@ import (
|
||||
|
||||
"gitlab.com/postmarketOS/postmarketos-mkinitfs/internal/filelist"
|
||||
"gitlab.com/postmarketOS/postmarketos-mkinitfs/internal/misc"
|
||||
"gitlab.com/postmarketOS/postmarketos-mkinitfs/internal/osutil"
|
||||
)
|
||||
|
||||
type HookFiles struct {
|
||||
@@ -64,6 +65,9 @@ func slurpFiles(fd io.Reader) (*filelist.FileList, error) {
|
||||
}
|
||||
|
||||
src, dest, has_dest := strings.Cut(line, ":")
|
||||
if osutil.HasMergedUsr() {
|
||||
src = osutil.MergeUsr(src)
|
||||
}
|
||||
|
||||
fFiles, err := misc.GetFiles([]string{src}, true)
|
||||
if err != nil {
|
||||
|
@@ -27,6 +27,27 @@ func HasMergedUsr() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
// Converts given path to one supported by a merged /usr config.
|
||||
// E.g., /bin/foo becomes /usr/bin/foo, /lib/bar becomes /usr/lib/bar
|
||||
// See: https://www.freedesktop.org/wiki/Software/systemd/TheCaseForTheUsrMerge
|
||||
func MergeUsr(file string) string {
|
||||
|
||||
// Prepend /usr to supported paths
|
||||
for _, prefix := range []string{"/bin", "/sbin", "/lib", "/lib64"} {
|
||||
if strings.HasPrefix(file, prefix) {
|
||||
file = filepath.Join("/usr", file)
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
// Convert /usr/sbin --> /usr/bin
|
||||
if part, found := strings.CutPrefix(file, "/usr/sbin"); found {
|
||||
file = filepath.Join("/usr/bin/", part)
|
||||
}
|
||||
|
||||
return file
|
||||
}
|
||||
|
||||
// Converts a relative symlink target path (e.g. ../../lib/foo.so), that is
|
||||
// absolute path
|
||||
func RelativeSymlinkTargetToDir(symPath string, dir string) (string, error) {
|
||||
|
49
internal/osutil/osutil_test.go
Normal file
49
internal/osutil/osutil_test.go
Normal file
@@ -0,0 +1,49 @@
|
||||
// Copyright 2024 Clayton Craft <clayton@craftyguy.net>
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
package osutil
|
||||
|
||||
import (
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestMergeUsr(t *testing.T) {
|
||||
subtests := []struct {
|
||||
in string
|
||||
expected string
|
||||
}{
|
||||
{
|
||||
in: "/bin/foo",
|
||||
expected: "/usr/bin/foo",
|
||||
},
|
||||
{
|
||||
in: "/sbin/foo",
|
||||
expected: "/usr/bin/foo",
|
||||
},
|
||||
{
|
||||
in: "/usr/sbin/foo",
|
||||
expected: "/usr/bin/foo",
|
||||
},
|
||||
{
|
||||
in: "/usr/bin/foo",
|
||||
expected: "/usr/bin/foo",
|
||||
},
|
||||
{
|
||||
in: "/lib/foo.so",
|
||||
expected: "/usr/lib/foo.so",
|
||||
},
|
||||
{
|
||||
in: "/lib64/foo.so",
|
||||
expected: "/usr/lib64/foo.so",
|
||||
},
|
||||
}
|
||||
|
||||
for _, st := range subtests {
|
||||
t.Run(st.in, func(t *testing.T) {
|
||||
out := MergeUsr(st.in)
|
||||
if out != st.expected {
|
||||
t.Fatalf("expected: %q, got: %q\n", st.expected, out)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user