git.sh 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  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 patchfail)"
  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. rm -Rf "${tmp_git_dir%/*}" || \
  51. err "prepare_new_tree ${project}/${tree}: can't rm tmpclone"
  52. mkdir "${tmp_git_dir%/*}" || \
  53. err "prepare_new_tree ${project}/${tree}: can't mkdir tmp"
  54. cp -R "src/${project}/${project}" "${tmp_git_dir}" || \
  55. err "prepare_new_tree ${project}/${tree}: can't make tmpclone"
  56. git_reset_rev "${tmp_git_dir}" "${rev}"
  57. (
  58. cd "${tmp_git_dir}" || \
  59. err "prepare_new_tree ${project}/${tree}: can't cd tmpclone"
  60. if [ -f ".gitmodules" ]; then
  61. git submodule update --init --checkout || \
  62. err "prepare_new_tree ${project}/${tree}: !submodules"
  63. fi
  64. ) || err "git submodule update failure"
  65. git_am_patches "${tmp_git_dir}" "$PWD/$cfgsdir/$tree/patches" || \
  66. err "prepare_new_tree ${project}/${tree}: patch fail"
  67. [ "${patchfail}" = "y" ] && err "PATCH FAIL"
  68. mv "${tmp_git_dir}" "src/${project}/${tree}" || \
  69. err "prepare_new_tree ${project}/${tree}: can't copy tmpclone"
  70. }
  71. fetch_project_repo()
  72. {
  73. scan_config "${project}" "config/git" "err"
  74. verify_config
  75. clone_project
  76. [ -z "${depend}" ] || for d in ${depend} ; do
  77. x_ ./update trees -f ${d}
  78. done
  79. rm -Rf "${tmp_git_dir}" || err "fetch_repo: !rm -Rf ${tmp_git_dir}"
  80. }
  81. verify_config()
  82. {
  83. [ -z "${rev+x}" ] && err 'verify_config: rev not set'
  84. [ -z "${loc+x}" ] && err 'verify_config: loc not set'
  85. [ -z "${url+x}" ] && err 'verify_config: url not set'
  86. return 0
  87. }
  88. clone_project()
  89. {
  90. rm -Rf "${tmp_git_dir}" || err "clone_project: !rm -Rf ${tmp_git_dir}"
  91. mkdir -p "${tmp_git_dir%/*}" || \
  92. err "clone_project: !mkdir -p ${tmp_git_dir%/*}"
  93. loc="${loc#src/}"
  94. loc="src/${loc}"
  95. if [ -d "${loc}" ]; then
  96. printf "%s already exists, so skipping download\n" "$loc" 1>&2
  97. return 0
  98. fi
  99. git clone ${url} "${tmp_git_dir}" || \
  100. git clone ${bkup_url} "${tmp_git_dir}" || \
  101. err "clone_project: could not download ${project}"
  102. git_reset_rev "${tmp_git_dir}" "${rev}"
  103. git_am_patches "${tmp_git_dir}" "${PWD}/config/${project}/patches" \
  104. || err "clone_project ${project} ${loc}: patch fail"
  105. [ "${patchfail}" = "y" ] && err "PATCH FAIL"
  106. x_ rm -Rf "${loc}"
  107. [ "${loc}" = "${loc%/*}" ] || x_ mkdir -p "${loc%/*}"
  108. mv "${tmp_git_dir}" "${loc}" || \
  109. err "clone_project: !mv ${tmp_git_dir} ${loc}"
  110. }
  111. git_reset_rev()
  112. {
  113. (
  114. cd "${1}" || err "git_reset_rev: !cd ${1}"
  115. git reset --hard ${2} || err "!git reset ${1} <- ${2}"
  116. if [ "${project}" != "coreboot" ] && [ "${project}" != "u-boot" ] && \
  117. [ -f ".gitmodules" ]; then
  118. git submodule update --init --checkout || \
  119. err "git_reset_rev ${1}: can't download submodules"
  120. fi
  121. ) || err "git reset fail"
  122. }
  123. git_am_patches()
  124. {
  125. sdir="${1}" # assumed to be absolute path
  126. patchdir="${2}" # ditto
  127. (
  128. cd "${sdir}" || err "git_am_patches: !cd ${sdir}"
  129. for patch in "${patchdir}/"*; do
  130. [ -L "${patch}" ] && continue
  131. [ -f "${patch}" ] || continue
  132. git am "${patch}" || patchfail="y"
  133. if [ "${patchfail}" = "y" ]; then
  134. git am --abort || err "${sdir}: !git am --abort"
  135. err "!git am ${patch} -> ${sdir}"
  136. fi
  137. done
  138. ) || err "PATCH FAILURE"
  139. for patches in "${patchdir}/"*; do
  140. [ -L "${patches}" ] && continue
  141. [ ! -d "${patches}" ] && continue
  142. git_am_patches "${sdir}" "${patches}"
  143. done
  144. [ "${patchfail}" = "y" ] && return 1
  145. return 0
  146. }