From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Shawn O. Pearce" Subject: [PATCH 1/3] git-pack-objects: Automatically pack annotated tags if object was packed Date: Mon, 3 Mar 2008 21:36:07 -0500 Message-ID: <20080304023607.GA16152@spearce.org> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Cc: git@vger.kernel.org, Nicolas Pitre , Daniel Barkalow To: Junio C Hamano X-From: git-owner@vger.kernel.org Tue Mar 04 03:37:27 2008 Return-path: Envelope-to: gcvg-git-2@gmane.org Received: from vger.kernel.org ([209.132.176.167]) by lo.gmane.org with esmtp (Exim 4.50) id 1JWN1R-0006iZ-2K for gcvg-git-2@gmane.org; Tue, 04 Mar 2008 03:36:53 +0100 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756655AbYCDCgP (ORCPT ); Mon, 3 Mar 2008 21:36:15 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1756600AbYCDCgP (ORCPT ); Mon, 3 Mar 2008 21:36:15 -0500 Received: from corvette.plexpod.net ([64.38.20.226]:38697 "EHLO corvette.plexpod.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756186AbYCDCgO (ORCPT ); Mon, 3 Mar 2008 21:36:14 -0500 Received: from cpe-74-70-48-173.nycap.res.rr.com ([74.70.48.173] helo=asimov.home.spearce.org) by corvette.plexpod.net with esmtpa (Exim 4.68) (envelope-from ) id 1JWN0X-0006CE-SA; Mon, 03 Mar 2008 21:35:58 -0500 Received: by asimov.home.spearce.org (Postfix, from userid 1000) id F2D6720FBAE; Mon, 3 Mar 2008 21:36:07 -0500 (EST) Content-Disposition: inline User-Agent: Mutt/1.5.11 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - corvette.plexpod.net X-AntiAbuse: Original Domain - vger.kernel.org X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - spearce.org Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Archived-At: The new option "--auto-follow-tags" allows the caller to request that any annotated tag be included into the packfile if the object the tag references was also included as part of the packfile. This option can be useful on the server side of a native git transport, where the server knows what commits it is including into a packfile to update the client. If new annotated tags have been introduced then we can also include them in the packfile, saving the client from needing to request them through a second connection. This change only introduces the backend option and provides a test. Protocol extensions to make this useful in fetch-pack/upload-pack are still necessary to activate the logic during transport. Signed-off-by: Shawn O. Pearce --- Documentation/git-pack-objects.txt | 5 ++ builtin-pack-objects.c | 24 +++++++++- t/t5305-autofollow-tag.sh | 84 ++++++++++++++++++++++++++++++++++++ 3 files changed, 111 insertions(+), 2 deletions(-) create mode 100755 t/t5305-autofollow-tag.sh diff --git a/Documentation/git-pack-objects.txt b/Documentation/git-pack-objects.txt index 5c1bd3b..0ba9cbe 100644 --- a/Documentation/git-pack-objects.txt +++ b/Documentation/git-pack-objects.txt @@ -170,6 +170,11 @@ base-name:: length, this option typically shrinks the resulting packfile by 3-5 per-cent. +--auto-follow-tags:: + Automatically include annotated tags if the object they + reference was included in the resulting packfile. This + can be useful to send new tags to native git clients. + --threads=:: Specifies the number of threads to spawn when searching for best delta matches. This requires that pack-objects be compiled with diff --git a/builtin-pack-objects.c b/builtin-pack-objects.c index 2799e68..8b5d90a 100644 --- a/builtin-pack-objects.c +++ b/builtin-pack-objects.c @@ -15,6 +15,7 @@ #include "revision.h" #include "list-objects.h" #include "progress.h" +#include "refs.h" #ifdef THREADED_DELTA_SEARCH #include "thread-utils.h" @@ -27,7 +28,8 @@ git-pack-objects [{ -q | --progress | --all-progress }] \n\ [--window=N] [--window-memory=N] [--depth=N] \n\ [--no-reuse-delta] [--no-reuse-object] [--delta-base-offset] \n\ [--threads=N] [--non-empty] [--revs [--unpacked | --all]*] [--reflog] \n\ - [--stdout | base-name] [--keep-unreachable] [d && + git update-index --add d && + tree=`git write-tree` && + commit=`git commit-tree $tree sig && + echo "type commit" >>sig && + echo "tag mytag" >>sig && + echo "tagger $(git var GIT_COMMITTER_IDENT)" >>sig && + echo >>sig && + echo "our test tag" >>sig && + tag=`git mktag obj-list +' + +rm -rf clone.git +test_expect_success 'pack without --auto-follow-tags' ' + packname_1=$(git pack-objects \ + --window=0 \ + test-1 list.expect && + ( + GIT_DIR=clone.git && + export GIT_DIR && + test_must_fail git cat-file -e $tag && + git rev-list --objects $commit + ) >list.actual && + git diff list.expect list.actual +' + +rm -rf clone.git +test_expect_success 'pack with --auto-follow-tags' ' + packname_1=$(git pack-objects \ + --window=0 \ + --auto-follow-tags \ + test-2 list.expect && + ( + GIT_DIR=clone.git && + export GIT_DIR && + git rev-list --objects $tag + ) >list.actual && + git diff list.expect list.actual +' + +test_done -- 1.5.4.3.529.gb25fb