aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xlibreboot2
-rwxr-xr-xlibs/common25
-rwxr-xr-xlibs/project60
3 files changed, 83 insertions, 4 deletions
diff --git a/libreboot b/libreboot
index 483dff93..c6464239 100755
--- a/libreboot
+++ b/libreboot
@@ -239,7 +239,7 @@ libreboot() {
exit 1
fi
- requirements "tar" "sed" "gpg" "sha256sum"
+ requirements 'tar' 'sed' 'gpg' 'sha256sum' 'wget'
if project_check "${target}"; then
libreboot_project "${action}" "${target}" "$@"
diff --git a/libs/common b/libs/common
index d0fd1203..7898f115 100755
--- a/libs/common
+++ b/libs/common
@@ -64,16 +64,35 @@ arguments_list() {
done
}
+download_wrapper() {
+ local download_dir="$1"
+ shift
+ local uris=($@)
+
+ # TODO: Add support for curl, in addition
+ # to wget, for compatibility reasons
+ wget_options=(
+ --config=/dev/null
+ --secure-protocol=PFS
+ --directory-prefix="${download_dir}"
+ --continue
+ --
+ )
+
+ wget "${wget_options[@]}" "${uris[@]}"
+}
+
diff_patch_file() {
local repository_path="$1"
local patch_file_path="$2"
- local filename_in_diff="$(sed -rne 's/^-{3} {1}(.*)$/\1/p' <"${patch_file_path}")"
+ # TODO: Improve handling of filenames to avoid gotchas w/ \n, \t, etc.
+ local filename_in_diff="$(sed -rne 's/^-{3}\s+([^ \r\n]*).*/\1/p' "${patch_file_path}")"
local source_file_path
- if ! ( grep -E '^-{3}.*/' <"${patch_file_path}" >/dev/null 2>&1 ); then
- source_file_path="${repository_path}/${filename_in_diff##\ }"
+ if ! ( grep -E '^-{3}.*/' "${patch_file_path}" >/dev/null 2>&1 ); then
+ source_file_path="${repository_path}/${filename_in_diff}"
else
source_file_path="${repository_path}/${filename_in_diff##*/}"
fi
diff --git a/libs/project b/libs/project
index 38e9b40d..93f07ae5 100755
--- a/libs/project
+++ b/libs/project
@@ -504,6 +504,27 @@ project_sources_archive_missing_check() {
fi
}
+project_sources_prepare() {
+ local project="$1"
+ local sources_path="$2"
+
+ # Not implemented yet / May end up not being needed
+ #project_sources_prepare_blobs
+ project_sources_prepare_patch "${project}" "${sources_path}" "$@"
+}
+
+project_sources_prepare_patch() {
+ local project="$1"
+ local sources_path="$2"
+
+ local project_path="$(project_path "${project}")"
+ local patches_path="${project_path}/${PATCHES}"
+
+ for patch in "${patches_path}"/[!.]*.{patch,diff}; do
+ diff_patch_file "${sources_path}" "${patch}"
+ done
+}
+
project_blobs_path() {
local project=$1
shift
@@ -676,6 +697,45 @@ project_download_check_git() {
git_project_prepare_check "$project" "$repository" "$@"
}
+project_download_archive() {
+ local project="$1"
+ shift
+ local archive_uri="$1"
+ shift
+ local archive_dsig_uri="$1"
+
+ local archive="${archive_uri##*/}"
+ local compress_fmt="${archive##*.tar}"
+
+ local directory_prefix="${root}/${SOURCES}"
+ local archive_path="${root}/${SOURCES}/${archive}"
+ local sources_path="${root}/${SOURCES}/${project}"
+
+ if [[ "${compress_fmt#*.}" != "${ARCHIVE#*.}" ]]; then
+ ARCHIVE="tar${compress_fmt}"
+ fi
+
+ # TODO: Split this code block into separate functions
+ # Archive verification will be included at that point in time
+ if ! project_sources_directory_filled_check "${project}"; then
+ wget_wrapper "${directory_prefix}" "${archive_uri}" "${archive_dsig_uri}"
+ archive_extract "${archive_path}" "${directory_prefix}"
+
+ mv "${archive_path%.tar*}" "${sources_path}"
+ fi
+
+ # Patch the source, if necessary
+ project_sources_prepare "${project}" "${sources_path}"
+}
+
+project_download_check_archive() {
+ local project="$1"
+ local sources_path="$2"
+
+ # TODO: Write the following function
+ #project_sources_archive_extract_check "${project}" "${sources_path}"
+}
+
project_extract() {
local project=$1
shift