diff mbox

[3/4,v2] support/download/git: add support for submodules

Message ID e70d8f886ab73e2dbe51f90f59c83d0ad1d486f6.1459541702.git.yann.morin.1998@free.fr
State Changes Requested
Headers show

Commit Message

Yann E. MORIN April 1, 2016, 8:25 p.m. UTC
Some git repositories may be split into a master repository and
submodules. Up until now, we did not have support for submodules,
because we were using bare clones, in which it is not possible to
update the list of submodules.

Now that we are using plain clones with a working copy, we can retrieve
the submdoules.

Add an option to the git downlaod helper to kick the update of
submodules, so that they are only fetched for those packages that
require them. Also document the existing -q option at the same time.

Submodules have a .git file at their root, which contains the path to
the real .git directory of the master repository. Since we remove it,
there is no point in keeping those .git files either.

Note: this is currently unused, but will be enabled with the follow-up
patch , that adds the necessary parts in the pkg-generic and pkg-download
infrastructures.

Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
---
 support/download/git | 23 +++++++++++++++++------
 1 file changed, 17 insertions(+), 6 deletions(-)

Comments

Matt Weber April 2, 2016, 5:02 a.m. UTC | #1
Yann,

On Fri, Apr 1, 2016 at 3:25 PM, Yann E. MORIN <yann.morin.1998@free.fr> wrote:
> Some git repositories may be split into a master repository and
> submodules. Up until now, we did not have support for submodules,
> because we were using bare clones, in which it is not possible to
> update the list of submodules.
>
> Now that we are using plain clones with a working copy, we can retrieve
> the submdoules.
>
> Add an option to the git downlaod helper to kick the update of
> submodules, so that they are only fetched for those packages that
> require them. Also document the existing -q option at the same time.
>
> Submodules have a .git file at their root, which contains the path to
> the real .git directory of the master repository. Since we remove it,
> there is no point in keeping those .git files either.
>
> Note: this is currently unused, but will be enabled with the follow-up
> patch , that adds the necessary parts in the pkg-generic and pkg-download
> infrastructures.
>
> Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr>

Tested-by: Matt Weber <matt@thewebers.ws>
Reviewed-by: Matt Weber <matt@thewebers.ws>

> ---
>  support/download/git | 23 +++++++++++++++++------
>  1 file changed, 17 insertions(+), 6 deletions(-)
>
> diff --git a/support/download/git b/support/download/git
> index 5672217..99bd996 100755
> --- a/support/download/git
> +++ b/support/download/git
> @@ -6,15 +6,20 @@ set -e
>  # Download helper for git, to be called from the download wrapper script
>  #
>  # Call it as:
> -#   .../git [-q] OUT_FILE REPO_URL CSET BASENAME
> +#   .../git [-q] [-r] OUT_FILE REPO_URL CSET BASENAME
> +#
> +#   -q  Be quiet.
> +#   -r  Clone and archive sub-modules.
>  #
>  # Environment:
>  #   GIT      : the git command to call
>
>  verbose=
> -while getopts :q OPT; do
> +recurse=0
> +while getopts :qr OPT; do
>      case "${OPT}" in
>      q)  verbose=-q; exec >/dev/null;;
> +    r)  recurse=1;;
>      \?) printf "unknown option '%s'\n" "${OPTARG}" >&2; exit 1;;
>      esac
>  done
> @@ -61,18 +66,24 @@ pushd "${basename}" >/dev/null
>  # below, if there is an issue anyway. Since most of the cset we're gonna
>  # have to clone are not such special refs, consign the output to oblivion
>  # so as not to alarm unsuspecting users, but still trace it as a warning.
> -if ! _git fetch "'${cset}:${cset}'" >/dev/null 2>&1; then
> +if ! _git fetch origin "'${cset}'" >/dev/null 2>&1; then
>      printf "Could not fetch special ref '%s'; assuming it is not special.\n" "${cset}"
>  fi
>
> -# Checkout the required changeset.
> +# Checkout the required changeset, so that we can update the required
> +# submodules.
>  _git checkout -q "'${cset}'"
>
>  # Get date of commit to generate a reproducible archive.
>  date="$( _git show --no-patch --pretty=format:%cD )"
>
> -# We do not need the .git dir to generate the tarball
> -rm -rf .git
> +# There might be submodules, so fetch them.
> +if [ ${recurse} -eq 1 ]; then
> +    _git submodule update --init --recursive
> +fi
> +
> +# We do not need the .git dir and files to generate the tarball
> +find . \( -name .git -o -name .gitmodules \) -exec rm -rf {} +
>
>  popd >/dev/null
>
> --
> 1.9.1
>
> _______________________________________________
> buildroot mailing list
> buildroot@busybox.net
> http://lists.busybox.net/mailman/listinfo/buildroot
diff mbox

Patch

diff --git a/support/download/git b/support/download/git
index 5672217..99bd996 100755
--- a/support/download/git
+++ b/support/download/git
@@ -6,15 +6,20 @@  set -e
 # Download helper for git, to be called from the download wrapper script
 #
 # Call it as:
-#   .../git [-q] OUT_FILE REPO_URL CSET BASENAME
+#   .../git [-q] [-r] OUT_FILE REPO_URL CSET BASENAME
+#
+#   -q  Be quiet.
+#   -r  Clone and archive sub-modules.
 #
 # Environment:
 #   GIT      : the git command to call
 
 verbose=
-while getopts :q OPT; do
+recurse=0
+while getopts :qr OPT; do
     case "${OPT}" in
     q)  verbose=-q; exec >/dev/null;;
+    r)  recurse=1;;
     \?) printf "unknown option '%s'\n" "${OPTARG}" >&2; exit 1;;
     esac
 done
@@ -61,18 +66,24 @@  pushd "${basename}" >/dev/null
 # below, if there is an issue anyway. Since most of the cset we're gonna
 # have to clone are not such special refs, consign the output to oblivion
 # so as not to alarm unsuspecting users, but still trace it as a warning.
-if ! _git fetch "'${cset}:${cset}'" >/dev/null 2>&1; then
+if ! _git fetch origin "'${cset}'" >/dev/null 2>&1; then
     printf "Could not fetch special ref '%s'; assuming it is not special.\n" "${cset}"
 fi
 
-# Checkout the required changeset.
+# Checkout the required changeset, so that we can update the required
+# submodules.
 _git checkout -q "'${cset}'"
 
 # Get date of commit to generate a reproducible archive.
 date="$( _git show --no-patch --pretty=format:%cD )"
 
-# We do not need the .git dir to generate the tarball
-rm -rf .git
+# There might be submodules, so fetch them.
+if [ ${recurse} -eq 1 ]; then
+    _git submodule update --init --recursive
+fi
+
+# We do not need the .git dir and files to generate the tarball
+find . \( -name .git -o -name .gitmodules \) -exec rm -rf {} +
 
 popd >/dev/null