git.sh 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. # SPDX-License-Identifier: GPL-3.0-or-later
  2. # SPDX-FileCopyrightText: 2020,2021,2023 Leah Rowe <leah@libreboot.org>
  3. # SPDX-FileCopyrightText: 2022 Caleb La Grange <thonkpeasant@protonmail.com>
  4. # This file is only used by update/project/trees
  5. eval "$(setvars "" _target rev _xm loc url bkup_url depend)"
  6. tmp_git_dir="${PWD}/tmp/gitclone"
  7. fetch_project_trees()
  8. {
  9. _target="${target}"
  10. [ -d "src/${project}/${project}" ] || fetch_from_upstream
  11. fetch_config
  12. [ -z "${rev}" ] && err "fetch_project_trees $target: undefined rev"
  13. if [ -d "src/${project}/${tree}" ]; then
  14. printf "download/%s %s (%s): exists\n" \
  15. "${project}" "${tree}" "${_target}" 1>&2
  16. return 0
  17. fi
  18. prepare_new_tree
  19. }
  20. fetch_from_upstream()
  21. {
  22. [ -d "src/${project}/${project}" ] && return 0
  23. x_ mkdir -p "src/${project}"
  24. fetch_project_repo "${project}"
  25. }
  26. fetch_config()
  27. {
  28. rm -f "${cfgsdir}/"*/seen || err "fetch_config ${cfgsdir}: !rm seen"
  29. while true; do
  30. eval "$(setvars "" rev tree)"
  31. _xm="fetch_config ${project}/${_target}"
  32. load_target_config "${_target}"
  33. [ "${_target}" != "${tree}" ] && _target="${tree}" && continue
  34. break
  35. done
  36. }
  37. load_target_config()
  38. {
  39. [ -f "${cfgsdir}/${1}/target.cfg" ] || \
  40. err "${_xm} check: target.cfg does not exist"
  41. [ -f "${cfgsdir}/${1}/seen" ] && \
  42. err "${_xm} check: infinite loop in tree definitions"
  43. . "${cfgsdir}/${1}/target.cfg" || \
  44. err "load_target_config ${cfgsdir}/${1}: cannot load config"
  45. touch "${cfgsdir}/${1}/seen" || err "load_config $cfgsdir/$1: !mk seen"
  46. }
  47. prepare_new_tree()
  48. {
  49. printf "Creating %s tree %s (%s)\n" "${project}" "${tree}" "${_target}"
  50. x_ cp -R "src/${project}/${project}" "src/${project}/${tree}"
  51. git_reset_rev "src/${project}/${tree}" "${rev}"
  52. (
  53. x_ cd "src/${project}/${tree}"
  54. if [ -f ".gitmodules" ]; then
  55. git submodule update --init || \
  56. err "prepare_new_tree ${project}/${tree}: !submodules"
  57. fi
  58. )
  59. git_am_patches "$PWD/src/$project/$tree" "$PWD/$cfgsdir/$tree/patches"
  60. }
  61. fetch_project_repo()
  62. {
  63. scan_config "${project}" "config/git" "err"
  64. verify_config
  65. clone_project
  66. [ -z "${depend}" ] || for d in ${depend} ; do
  67. x_ ./update trees -f ${d}
  68. done
  69. rm -Rf "${tmp_git_dir}" || err "fetch_repo: !rm -Rf ${tmp_git_dir}"
  70. }
  71. verify_config()
  72. {
  73. [ -z "${rev+x}" ] && err 'verify_config: rev not set'
  74. [ -z "${loc+x}" ] && err 'verify_config: loc not set'
  75. [ -z "${url+x}" ] && err 'verify_config: url not set'
  76. return 0
  77. }
  78. clone_project()
  79. {
  80. rm -Rf "${tmp_git_dir}" || err "clone_project: !rm -Rf ${tmp_git_dir}"
  81. mkdir -p "${tmp_git_dir%/*}" || \
  82. err "clone_project: !mkdir -p ${tmp_git_dir%/*}"
  83. loc="${loc#src/}"
  84. loc="src/${loc}"
  85. if [ -d "${loc}" ]; then
  86. printf "%s already exists, so skipping download\n" "$loc" 1>&2
  87. return 0
  88. fi
  89. git clone ${url} "${tmp_git_dir}" || \
  90. git clone ${bkup_url} "${tmp_git_dir}" || \
  91. err "clone_project: could not download ${project}"
  92. git_reset_rev "${tmp_git_dir}" "${rev}"
  93. git_am_patches "${tmp_git_dir}" "${PWD}/config/${project}/patches"
  94. x_ rm -Rf "${loc}"
  95. [ "${loc}" = "${loc%/*}" ] || x_ mkdir -p ${loc%/*}
  96. mv "${tmp_git_dir}" "${loc}" || \
  97. err "clone_project: !mv ${tmp_git_dir} ${loc}"
  98. }
  99. git_reset_rev()
  100. {
  101. (
  102. cd "${1}" || err "git_reset_rev: !cd ${1}"
  103. git reset --hard ${2} || err "!git reset ${1} <- ${2}"
  104. )
  105. }
  106. git_am_patches()
  107. {
  108. sdir="${1}" # assumed to be absolute path
  109. patchdir="${2}" # ditto
  110. (
  111. cd "${sdir}" || err "git_am_patches: !cd ${sdir}"
  112. for patch in "${patchdir}/"*; do
  113. [ -L "${patch}" ] && continue
  114. [ -f "${patch}" ] || continue
  115. patchfail="n"
  116. git am "${patch}" || patchfail="y"
  117. if [ "${patchfail}" = "y" ]; then
  118. git am --abort || err "${sdir}: !git am --abort"
  119. err "!git am ${patch} -> ${sdir}"
  120. fi
  121. done
  122. )
  123. for patches in "${patchdir}/"*; do
  124. [ -L "${patches}" ] && continue
  125. [ ! -d "${patches}" ] && continue
  126. git_am_patches "${sdir}" "${patches}"
  127. done
  128. }
  129. # can delete from multi- and single-tree projects.
  130. # called from build_projects() and handle_src_tree() on script/update/trees
  131. nukeblobs()
  132. {
  133. del="n"
  134. pjcfgdir="${1%/}"
  135. pjsrcdir="${2%/}"
  136. pjsrcdir="${pjsrcdir#src/}"
  137. if [ ! -f "config/${pjcfgdir}/blobs.list" ]; then
  138. [ "${project}" != "coreboot" ] && [ "${project}" != "u-boot" ] \
  139. && return 0
  140. err "nukeblobs config/${pjcfgdir}: blobs.list file missing"
  141. fi
  142. while read blobfile; do
  143. rmf="$(realpath "src/${pjsrcdir}/${blobfile}" 2>/dev/null)" || \
  144. continue
  145. [ -L "${rmf}" ] && continue # we will delete the actual file
  146. [ "${rmf#${PWD}/src/${pjsrcdir}}" = "${rmf}" ] && continue
  147. [ "${rmf#${PWD}/src/}" = "${pjsrcdir}" ] && continue
  148. rmf="${rmf#${PWD}/}"
  149. [ -e "${rmf}" ] || continue
  150. del="y"
  151. rm -Rf "${rmf}" || \
  152. err "nukeblobs ${pjcfgdir}/blobs: can't rm \"${blobfile}\""
  153. printf "nukeblobs %s: deleted \"%s\"\n" "${pjcfgdir}" "${rmf}"
  154. done < "config/${pjcfgdir}/blobs.list"
  155. [ "${del}" = "y" ] && return 0
  156. printf "nukeblobs %s: no defined blobs exist in dir, src/%s\n" 1>&2 \
  157. "${pjcfgdir}" "${pjsrcdir}"
  158. printf "(this is not an error)\n"
  159. }