#!/bin/bash # # Copyright (c) 2020 Wind River Systems, Inc. # # SPDX-License-Identifier: Apache-2.0 # # # A collection of utilities relating to 'repo' # # # Echo to stderr # echo_stderr [any text you want] # echo_stderr () { echo "$@" >&2 } # # Get the root dir of a repo managed repository # repo_root [] # repo_root () { local query_dir="${1:-${PWD}}" local work_dir if [ ! -d "${query_dir}" ]; then echo_stderr "not a valid directory: ${query_dir}" return 1 fi if [ "${query_dir:0:1}" != "/" ]; then query_dir=$(readlink -f ${query_dir}) if [ $? -ne 0 ]; then return 1 fi fi work_dir="${query_dir}" while true; do if [ -d "$work_dir/.repo/manifests" ]; then echo $work_dir return 0 fi if [ "${work_dir}" == "/" ]; then break fi work_dir="$(dirname "${work_dir}")" done echo_stderr "directory is not controlled by repo: ${query_dir}" return 1 } # # Get the active manifest file of a repo managed repository # repo_manifest [] # repo_manifest () { local query_dir="${1:-${PWD}}" local root_dir="" local repo_manifest="" root_dir="$(repo_root "${query_dir}")" if [ $? -ne 0 ]; then return 1 fi repo_manifest="${root_dir}/.repo/manifest.xml" # Depending on repo version, ${repo_manifest} is either a symlink to # the real manifest, or a wrapper manifest that includes the real manifest if [ -L "${repo_manifest}" ]; then readlink -f "${repo_manifest}" else grep " # # old_manifest = Path to original manifest. # new_manifest = Path to modified manifest. It will not overwrite an # existing file. # revision = A branch, tag ,or sha. Branch and SHA can be used # directly, but repo requires that a tag be in the form # "refs/tags/". # lock_down = 0 or 1. If 1, set a revision on all other non-listed # projects to equal the SHA of the current git head. # project-list = A space seperated list of projects. Listed projects # will have their revision set to the provided revision # value. # manifest_set_revision () { local old_manifest="${1}" local new_manifest="${2}" local revision="${3}" local lock_down="${4}" shift 4 local projects="${@}" local repo_root_dir="" local line="" local FOUND=0 local path="" local project="" local rev="" repo_root_dir=$(repo_root) if [ $? -ne 0 ]; then echo_stderr "Current directory is not managed by repo." return 1 fi if [ ! -f "${old_manifest}" ]; then echo_stderr "Old manifest file is missing '${old_manifest}'." return 1 fi if [ -f "${new_manifest}" ]; then echo_stderr "New manifest file already present '${new_manifest}'." return 1 fi mkdir -p "$(dirname "${new_manifest}")" if [ $? -ne 0 ]; then echo_stderr "Failed to create directory '$(dirname "${new_manifest}")'" return 1 fi while IFS= read -r line; do echo "${line}" | grep -q '