Buildroot Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Yann E. MORIN <yann.morin.1998@free.fr>
To: buildroot@busybox.net
Subject: [Buildroot] [v4 13/13] download: git: introduce cache feature
Date: Mon, 2 Apr 2018 14:09:56 +0200	[thread overview]
Message-ID: <20180402120956.GI3625@scaer> (raw)
In-Reply-To: <20180402081434.4411-13-maxime.hadjinlian@gmail.com>

On 2018-04-02 10:14 +0200, Maxime Hadjinlian spake thusly:
> Now we keep the git clone that we download and generates our tarball
> from there.
> The main goal here is that if you change the version of a package (say
> Linux), instead of cloning all over again, you will simply 'git fetch'
> from the repo the missing objects, then generates the tarball again.
> 
> This should speed the 'source' part of the build significantly.
> 
> The drawback is that the DL_DIR will grow much larger; but time is more
> important than disk space nowadays.
> 
> Signed-off-by: Maxime Hadjinlian <maxime.hadjinlian@gmail.com>
> ---
>  support/download/git | 63 ++++++++++++++++++++++++++++++++--------------------
>  1 file changed, 39 insertions(+), 24 deletions(-)
> 
> diff --git a/support/download/git b/support/download/git
> index 58a2c6ad9d..c6b0f81f13 100755
> --- a/support/download/git
> +++ b/support/download/git
> @@ -39,29 +39,40 @@ _git() {
>      eval ${GIT} "${@}"
>  }
>  
> -# Try a shallow clone, since it is faster than a full clone - but that only
> -# works if the version is a ref (tag or branch). Before trying to do a shallow
> -# clone we check if ${cset} is in the list provided by git ls-remote. If not
> -# we fall back on a full clone.
> +# We want to check if a cache of the git clone of this repo already exists.

Comment is now incorrect. Waht about:

    # Location of the local git cache

> +git_cache="${BR2_DL_DIR}/${basename%%-*}/git"
> +
> +# If the cache directory already exists, don't try to clone.

Comment is now incorrect. What about:

    # If there is no local git cache yet, initialise an empty
    # git tree, it will be filled later  via git fetch

> +if [ ! -d "${git_cache}" ]; then
> +    _git init "'${git_cache}'"
> +    _git -C "'${git_cache}'" remote add origin "'${uri}'"
> +fi
> +
> +pushd "${git_cache}" >/dev/null
> +
> +_git remote set-url origin "'${uri}'"
> +
> +# Try to fetch with limited depth, since it is faster than a full clone - but
> +# that only works if the version is a ref (tag or branch). Before trying to do
> +# a shallow clone we check if ${cset} is in the list provided by git ls-remote.
> +# If not we fall back on a full fetch.

* fallback _to_

(even if that was like that before, take the opportunity to fix it.)

>  #
> -# Messages for the type of clone used are provided to ease debugging in case of
> -# problems
> +# Messages for the type of clone used are provided to ease debugging in
> +# case of problems
>  git_done=0
> -if [ -n "$(_git ls-remote "'${uri}'" "'${cset}'" 2>&1)" ]; then
> -    printf "Doing shallow clone\n"
> -    if _git clone ${verbose} "${@}" --depth 1 -b "'${cset}'" "'${uri}'" "'${basename}'"; then
> +if [ -n "$(_git ls-remote origin "'${cset}'" 2>&1)" ]; then
> +    printf "Doing fetch with limited depth\n"

* Doing a shallow fetch

> +    if _git fetch "${@}" --depth 1 origin "'${cset}'"; then
>          git_done=1
>      else
> -        printf "Shallow clone failed, falling back to doing a full clone\n"
> +        printf "Fetching ref failed, falling back to fetching all refs\n"

To be in-line with the prevbious message, what about:

    Shallow fetch failed, falling back to...

>      fi
>  fi
>  if [ ${git_done} -eq 0 ]; then
> -    printf "Doing full clone\n"
> -    _git clone ${verbose} "${@}" "'${uri}'" "'${basename}'"
> +    printf "Fetching all references\n"
> +    _git fetch origin -t
>  fi
>  
> -pushd "${basename}" >/dev/null
> -
>  # Try to get the special refs exposed by some forges (pull-requests for
>  # github, changes for gerrit...). There is no easy way to know whether
>  # the cset the user passed us is such a special ref or a tag or a sha1
> @@ -86,20 +97,24 @@ if [ ${recurse} -eq 1 ]; then
>      _git submodule update --init --recursive
>  fi
>  
> -# We do not want the .git dir; we keep other .git files, in case they
> -# are the only files in their directory.
> +# Generate the archive, sort with the C locale so that it is reproducible
> +# We do not want the .git dir; we keep other .git
> +# files, in case they are the only files in their directory.

Bad wrapping,  line 2 is too short...

Regards,
Yann E. MORIN.

>  # The .git dir would generate non reproducible tarballs as it depends on
>  # the state of the remote server. It also would generate large tarballs
>  # (gigabytes for some linux trees) when a full clone took place.
> -rm -rf .git
> +find . -not -type d \
> +	-and -not -path "./.git/*" >"${output}.list"
> +LC_ALL=C sort <"${output}.list" >"${output}.list.sorted"
>  
> -popd >/dev/null
> -
> -# Generate the archive, sort with the C locale so that it is reproducible
> -find "${basename}" -not -type d >"${basename}.list"
> -LC_ALL=C sort <"${basename}.list" >"${basename}.list.sorted"
>  # Create GNU-format tarballs, since that's the format of the tarballs on
>  # sources.buildroot.org and used in the *.hash files
> -tar cf - --numeric-owner --owner=0 --group=0 --mtime="${date}" --format=gnu \
> -         -T "${basename}.list.sorted" >"${output}.tar"
> +tar cf - --transform="s/^\.$/${basename}/" \
> +	--numeric-owner --owner=0 --group=0 --mtime="${date}" --format=gnu \
> +         -T "${output}.list.sorted" >"${output}.tar"
>  gzip -6 -n <"${output}.tar" >"${output}"
> +
> +rm -f "${output}.list"
> +rm -f "${output}.list.sorted"
> +
> +popd >/dev/null
> -- 
> 2.16.2
> 
> _______________________________________________
> buildroot mailing list
> buildroot at busybox.net
> http://lists.busybox.net/mailman/listinfo/buildroot

-- 
.-----------------.--------------------.------------------.--------------------.
|  Yann E. MORIN  | Real-Time Embedded | /"\ ASCII RIBBON | Erics' conspiracy: |
| +33 662 376 056 | Software  Designer | \ / CAMPAIGN     |  ___               |
| +33 223 225 172 `------------.-------:  X  AGAINST      |  \e/  There is no  |
| http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL    |   v   conspiracy.  |
'------------------------------^-------^------------------^--------------------'

  reply	other threads:[~2018-04-02 12:09 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-04-02  8:14 [Buildroot] [v4 01/13] core/pkg-download: change all helpers to use common options Maxime Hadjinlian
2018-04-02  8:14 ` [Buildroot] [v4 02/13] download: put most of the infra in dl-wrapper Maxime Hadjinlian
2018-04-02 10:23   ` Yann E. MORIN
2018-04-02 12:18   ` Peter Korsgaard
2018-04-02  8:14 ` [Buildroot] [v4 03/13] packages: use new $($PKG)_DL_DIR) variable Maxime Hadjinlian
2018-04-02 10:36   ` Yann E. MORIN
2018-04-02  8:14 ` [Buildroot] [v4 04/13] arc/xtensa: store the eXtensa overlay in the per-package DL_DIR Maxime Hadjinlian
2018-04-02 12:08   ` Thomas Petazzoni
2018-04-02  8:14 ` [Buildroot] [v4 05/13] pkg-{download, generic}: use new $($(PKG)_DL_DIR) Maxime Hadjinlian
2018-04-02 11:06   ` Yann E. MORIN
2018-04-02 12:09     ` Thomas Petazzoni
2018-04-02  8:14 ` [Buildroot] [v4 06/13] support/download: make sure the download folder is created Maxime Hadjinlian
2018-04-02 11:08   ` Yann E. MORIN
2018-04-02 12:10   ` Thomas Petazzoni
2018-04-02  8:14 ` [Buildroot] [v4 07/13] pkg-generic: add a subdirectory to the DL_DIR Maxime Hadjinlian
2018-04-02  8:14 ` [Buildroot] [v4 08/13] pkg-download: support new subdir for mirrors Maxime Hadjinlian
2018-04-02 12:13   ` Thomas Petazzoni
2018-04-02 12:29     ` Yann E. MORIN
2018-04-02  8:14 ` [Buildroot] [v4 09/13] pkg-generic: introduce _SAME_SOURCE_AS Maxime Hadjinlian
2018-04-02 11:57   ` Yann E. MORIN
2018-04-02  8:14 ` [Buildroot] [v4 10/13] package: share downloaded files for big packages Maxime Hadjinlian
2018-04-02  8:14 ` [Buildroot] [v4 11/13] help/manual: update help about the new $(LIBFOO_DL_DIR) Maxime Hadjinlian
2018-04-02 11:59   ` Yann E. MORIN
2018-04-02  8:14 ` [Buildroot] [v4 12/13] download: add flock call before dl-wrapper Maxime Hadjinlian
2018-04-02 12:00   ` Yann E. MORIN
2018-04-02  8:14 ` [Buildroot] [v4 13/13] download: git: introduce cache feature Maxime Hadjinlian
2018-04-02 12:09   ` Yann E. MORIN [this message]
2018-04-02  8:25 ` [Buildroot] [v4 01/13] core/pkg-download: change all helpers to use common options Yann E. MORIN
2018-04-02  8:40 ` Thomas Petazzoni
2018-04-02 10:26 ` Peter Korsgaard

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20180402120956.GI3625@scaer \
    --to=yann.morin.1998@free.fr \
    --cc=buildroot@busybox.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox