From 44eed5234a761ffd8bd4c402aeaa53e1962ec552 Mon Sep 17 00:00:00 2001 From: Sebastiaan van Stijn Date: Thu, 23 Apr 2020 14:07:53 +0200 Subject: [PATCH 1/2] Makefile: use shallow clone Before this change: make clean time make checkout git clone -q "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/docker/cli.git" src/github.com/docker/cli git clone -q "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/docker/docker.git" src/github.com/docker/docker 69.16 real 15.69 user 9.69 sys After this change: make clean time make checkout ... From https://github.com/docker/docker * branch HEAD -> FETCH_HEAD git -C src/github.com/docker/docker checkout -q FETCH_HEAD 14.73 real 1.35 user 2.37 sys Signed-off-by: Sebastiaan van Stijn --- Makefile | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 55d07752fa..e912cd522a 100644 --- a/Makefile +++ b/Makefile @@ -23,7 +23,8 @@ src/github.com/docker/cli: cp -r "$(CLI_DIR)" $@ else src/github.com/docker/cli: - git clone -q "$(DOCKER_CLI_REPO)" $@ + git init $@ + git -C $@ remote add origin "$(DOCKER_CLI_REPO)" endif ifdef ENGINE_DIR @@ -32,16 +33,19 @@ src/github.com/docker/docker: cp -r "$(ENGINE_DIR)" $@ else src/github.com/docker/docker: - git clone -q "$(DOCKER_ENGINE_REPO)" $@ + git init $@ + git -C $@ remote add origin "$(DOCKER_ENGINE_REPO)" endif .PHONY: checkout-cli checkout-cli: src/github.com/docker/cli - @git -C src/github.com/docker/cli checkout -q "$(DOCKER_CLI_REF)" + @git -C src/github.com/docker/cli fetch --depth 1 origin "$(DOCKER_CLI_REF)" + @git -C src/github.com/docker/cli checkout -q FETCH_HEAD .PHONY: checkout-docker checkout-docker: src/github.com/docker/docker - @git -C src/github.com/docker/docker checkout -q "$(DOCKER_ENGINE_REF)" + @git -C src/github.com/docker/docker fetch --depth 1 origin "$(DOCKER_ENGINE_REF)" + @git -C src/github.com/docker/docker checkout -q FETCH_HEAD .PHONY: checkout checkout: checkout-cli checkout-docker ## checkout source at the given reference(s) From 7435ad6ba574f6a0248a1b4a6fe7d15695d760ec Mon Sep 17 00:00:00 2001 From: Sebastiaan van Stijn Date: Fri, 31 Jul 2020 20:09:13 +0200 Subject: [PATCH 2/2] Add checkout.sh to handle tags with shallow clones fetching a tag ref does not download the tag itself. This patch makes sure that the tag (or branch) is downloaded otherwise fallsback to fetching the commit hash as it did before. Co-Authored-By: Tibor Vass Signed-off-by: Sebastiaan van Stijn --- Makefile | 6 ++---- scripts/checkout.sh | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 4 deletions(-) create mode 100755 scripts/checkout.sh diff --git a/Makefile b/Makefile index e912cd522a..462eec9742 100644 --- a/Makefile +++ b/Makefile @@ -39,13 +39,11 @@ endif .PHONY: checkout-cli checkout-cli: src/github.com/docker/cli - @git -C src/github.com/docker/cli fetch --depth 1 origin "$(DOCKER_CLI_REF)" - @git -C src/github.com/docker/cli checkout -q FETCH_HEAD + ./scripts/checkout.sh src/github.com/docker/cli "$(DOCKER_CLI_REF)" .PHONY: checkout-docker checkout-docker: src/github.com/docker/docker - @git -C src/github.com/docker/docker fetch --depth 1 origin "$(DOCKER_ENGINE_REF)" - @git -C src/github.com/docker/docker checkout -q FETCH_HEAD + ./scripts/checkout.sh src/github.com/docker/docker "$(DOCKER_ENGINE_REF)" .PHONY: checkout checkout: checkout-cli checkout-docker ## checkout source at the given reference(s) diff --git a/scripts/checkout.sh b/scripts/checkout.sh new file mode 100755 index 0000000000..6bc18479dd --- /dev/null +++ b/scripts/checkout.sh @@ -0,0 +1,39 @@ +#!/usr/bin/env sh + +# Copyright 2018-2020 Docker Inc. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +checkout() ( + set -ex + SRC="$1" + REF="$2" + REF_FETCH="$REF" + # if ref is branch or tag, retrieve its canonical form + REF=$(git -C "$SRC" ls-remote --refs --heads --tags origin "$REF" | awk '{print $2}') + if [ -n "$REF" ]; then + # if branch or tag then create it locally too + REF_FETCH="$REF:$REF" + else + REF="FETCH_HEAD" + fi + git -C "$SRC" fetch --update-head-ok --depth 1 origin "$REF_FETCH" + git -C "$SRC" checkout -q "$REF" +) + + +# Only execute checkout function above if this file is executed, not sourced from another script +prog=checkout.sh # needs to be in sync with this file's name +if [ "$(basename -- $0)" = "$prog" ]; then + checkout $* +fi