Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 23d5ae4f authored by Alexander Smundak's avatar Alexander Smundak Committed by Gerrit Code Review
Browse files

Merge changes I2d61d966,Ic4315ce2

* changes:
  Fix copy_files implementation
  Add find_files builtin, use it to fix find_and_copy implementation
parents bb0d6a42 6797bfaa
Loading
Loading
Loading
Loading
+8 −2
Original line number Diff line number Diff line
@@ -373,9 +373,14 @@ def _inherit(handle, pcm_name, pcm):
        if type(val) == "list":
            val.append(_indirect(pcm_name))

def __base(path):
    """Returns basename."""
    return path.rsplit("/",1)[-1]


def _copy_files(l, outdir):
    """Generate <item>:<outdir>/item for each item."""
    return ["%s:%s/%s" % (item, outdir, item) for item in __words(l)]
    return ["%s:%s/%s" % (path, outdir, __base(path)) for path in __words(l)]

def _copy_if_exists(path_pair):
    """If from file exists, returns [from:to] pair."""
@@ -396,7 +401,8 @@ def _file_wildcard_exists(file_pattern):

def _find_and_copy(pattern, from_dir, to_dir):
    """Return a copy list for the files matching the pattern."""
    return ["%s/%s:%s/%s" % (from_dir, f, to_dir, f) for f in rblf_wildcard(pattern, from_dir)]
    return ["%s/%s:%s/%s" % (
        from_dir, f, to_dir, f) for f in rblf_find_files(from_dir, pattern, only_files=1)]

def _filter_out(pattern, text):
    """Return all the words from `text' that do not match any word in `pattern'.
+3 −1
Original line number Diff line number Diff line
@@ -45,9 +45,11 @@ def init(g, handle):
  cfg["PRODUCT_COPY_FILES"] += ["device_from:device_to"]
  _include1_init(g, handle)
  cfg["PRODUCT_PACKAGES"] += ["dev_after"]
  cfg["PRODUCT_COPY_FILES"] += (rblf.find_and_copy("audio_platform_info*.xml", "device/google/redfin/audio", "||VENDOR-PATH-PH||/etc") +
  cfg["PRODUCT_COPY_FILES"] += (rblf.find_and_copy("audio_platform_info*.xml", "device/google/redfin", "||VENDOR-PATH-PH||/etc") +
      ["xyz:/etc/xyz"])
  cfg["PRODUCT_COPY_FILES"] += rblf.copy_files("x.xml y.xml", "/etc")
  cfg["PRODUCT_COPY_FILES"] += rblf.copy_files(["from/sub/x", "from/sub/y"], "to")

  rblf.add_soong_config_namespace(g, "NS1")
  rblf.add_soong_config_var_value(g, "NS1", "v1", "abc")
  rblf.add_soong_config_var_value(g, "NS1", "v2", "def")
+3 −1
Original line number Diff line number Diff line
@@ -53,10 +53,12 @@ assert_eq(
      "PRODUCT_COPY_FILES": [
          "part_from:part_to",
          "device_from:device_to",
          "device/google/redfin/audio/audio_platform_info_noextcodec_snd.xml:||VENDOR-PATH-PH||/etc/audio_platform_info_noextcodec_snd.xml",
          "device/google/redfin/audio/audio_platform_info_noextcodec_snd.xml:||VENDOR-PATH-PH||/etc/audio/audio_platform_info_noextcodec_snd.xml",
          "xyz:/etc/xyz",
          "x.xml:/etc/x.xml",
          "y.xml:/etc/y.xml",
          "from/sub/x:to/x",
          "from/sub/y:to/y",
      ],
      "PRODUCT_HOST_PACKAGES": ["host"],
      "PRODUCT_PACKAGES": [
+5 −0
Original line number Diff line number Diff line
@@ -68,6 +68,11 @@ will have the value of `rblf_cli.FOO` be `"bar"`

Returns `True`  if *file* exists

#### rblf_find_files(*top*, *file-pattern*, only_files = 0)

Returns all the paths under *top* whose basename matches *pattern* (which is a shell's glob pattern). If *only_files* is
not zero, only the paths to the regular files are returned. The returned paths are relative to *top*.

#### rblf_wildcard(*glob*, *top* = None)

Expands *glob*. If *top* is supplied, expands "*top*/*glob*", then removes
+43 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@ package rbcrun

import (
	"fmt"
	"io/fs"
	"os"
	"os/exec"
	"path/filepath"
@@ -170,6 +171,46 @@ func wildcard(_ *starlark.Thread, b *starlark.Builtin, args starlark.Tuple,
	return makeStringList(files), nil
}

// find(top, pattern, only_files = 0) returns all the paths under 'top'
// whose basename matches 'pattern' (which is a shell's glob pattern).
// If 'only_files' is non-zero, only the paths to the regular files are
// returned. The returned paths are relative to 'top'.
func find(_ *starlark.Thread, b *starlark.Builtin, args starlark.Tuple,
	kwargs []starlark.Tuple) (starlark.Value, error) {
	var top, pattern string
	var onlyFiles int
	if err := starlark.UnpackArgs(b.Name(), args, kwargs,
		"top", &top, "pattern", &pattern, "only_files?", &onlyFiles); err != nil {
		return starlark.None, err
	}
	top = filepath.Clean(top)
	pattern = filepath.Clean(pattern)
	// Go's filepath.Walk is slow, consider using OS's find
	var res []string
	err := filepath.WalkDir(top, func(path string, d fs.DirEntry, err error) error {
		if err != nil {
			if d != nil && d.IsDir() {
				return fs.SkipDir
			} else {
				return nil
			}
		}
		relPath := strings.TrimPrefix(path, top)
		if len(relPath) > 0 && relPath[0] == os.PathSeparator {
			relPath = relPath[1:]
		}
		// Do not return top-level dir
		if len(relPath) == 0 {
			return nil
		}
		if matched, err := filepath.Match(pattern, d.Name()); err == nil && matched && (onlyFiles == 0 || d.Type().IsRegular()) {
			res = append(res, relPath)
		}
		return nil
	})
	return makeStringList(res), err
}

// shell(command) runs OS shell with given command and returns back
// its output the same way as Make's $(shell ) function. The end-of-lines
// ("\n" or "\r\n") are replaced with " " in the result, and the trailing
@@ -226,6 +267,8 @@ func setup(env []string) {
		"rblf_env": structFromEnv(os.Environ()),
		// To convert makefile's $(wildcard foo)
		"rblf_file_exists": starlark.NewBuiltin("rblf_file_exists", fileExists),
		// To convert find-copy-subdir and product-copy-files-by pattern
		"rblf_find_files": starlark.NewBuiltin("rblf_find_files", find),
		// To convert makefile's $(filter ...)/$(filter-out)
		"rblf_regex": starlark.NewBuiltin("rblf_regex", regexMatch),
		// To convert makefile's $(shell cmd)
Loading