From cec005037f5b62cb17094df53fb25c066d6a9705 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sun, 21 Jul 2019 01:52:05 +0100 Subject: [PATCH] git-playtree-setup: Rewrite in shell and call it from Perl We want this because git-debpush is going to want this functionality but doesn't want to include (or have a copy of) Dgit.pm. The installation arrangements are rather ugly. Signed-off-by: Ian Jackson Signed-off-by: Sean Whitton --- Debian/Dgit.pm | 26 ++++++++++++------------ Makefile | 2 +- debian/rules | 4 ++++ git-playtree-create | 48 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 67 insertions(+), 13 deletions(-) create mode 100755 git-playtree-create diff --git a/Debian/Dgit.pm b/Debian/Dgit.pm index 3f1d1b7b..9d4e78e1 100644 --- a/Debian/Dgit.pm +++ b/Debian/Dgit.pm @@ -1051,23 +1051,25 @@ sub playtree_setup (;$) { $t_local_git_cfg //= $local_git_cfg; # for use in the playtree # $maindir must be set, eg by calling record_maindir or fresh_playground - runcmd qw(git init -q); - runcmd qw(git config gc.auto 0); - foreach my $copy (qw(user.email user.name user.useConfigOnly - core.sharedRepository - core.compression core.looseCompression - core.bigFileThreshold core.fsyncObjectFiles)) { - my $v = $t_local_git_cfg->{$copy}; - next unless $v; - runcmd qw(git config), $copy, $_ foreach @$v; - } # this is confusing: we have # . playtree, not a worktree, has .git/, our cwd # $maindir might be a worktree so # $maindir_gitdir contains our main working "dgit", HEAD, etc. # $maindir_gitcommon the shared stuff, including .objects - rmtree('.git/objects'); - symlink "$maindir_gitcommon/objects",'.git/objects' or confess "$!"; + + # we need to invoke git-playtree-create via git because + # there may be config options it needs which are only available + # to us, sensibly, in @git + + # And, we look for it in @INC too. This is a bit perverse. + # We do this because in the Debian packages we want to have + # a copy of this script in each binary package, rather than + # making yet another .deb or tangling the dependencies. + # @INC is conveniently available. + my $newpath = join ':', +(grep { !m/:/ } @INC), + '/usr/share/dgit', $ENV{PATH}; + runcmd qw(env), "PATH=$newpath", @git, qw(playtree-create .); + ensuredir '.git/info'; open GA, "> .git/info/attributes" or confess "$!"; print GA "* $negate_harmful_gitattrs\n" or confess "$!"; diff --git a/Makefile b/Makefile index 3a4f9e0e..c8937fc9 100644 --- a/Makefile +++ b/Makefile @@ -34,7 +34,7 @@ infraexamplesdir=$(prefix)/share/doc/dgit-infrastructure/examples txtdocdir=$(prefix)/share/doc/dgit absurddir=$(prefix)/share/dgit/absurd -PROGRAMS=dgit dgit-badcommit-fixup +PROGRAMS=dgit dgit-badcommit-fixup git-playtree-create MAN1PAGES=dgit.1 MAN7PAGES=dgit.7 \ diff --git a/debian/rules b/debian/rules index 9c2afb38..4e44118d 100755 --- a/debian/rules +++ b/debian/rules @@ -43,6 +43,7 @@ override_dh_auto_install: specpkg_install_gdp \ make install prefix=/usr DESTDIR=debian/dgit make -C po install prefix=/usr DESTDIR=../debian/tmp \ SUPPRESS_PO_UPDATE=1 S='' + mv debian/dgit/usr/bin/git-playtree-create debian/dgit/usr/share/dgit make -C po4a install DESTDIR=../debian/tmp S='' override_dh_missing: @@ -72,6 +73,8 @@ specpkg_install_%: # # Most of the Perl modules in this package live in # # $(specperl). The exception is Debian::Dgit::Infra, which # # lives in $(globalperl) and adds $(specperl) to @INC. +# # We also abuse this for git-playtree-create. In .debs, this +# # goes in the per-.deb @INC dir. See Dgit.pm::playtree_setup. set -ex; \ base=debian/$(p); \ mod=Debian/Dgit/$(pm).pm; \ @@ -79,6 +82,7 @@ specpkg_install_%: dst=$${base}$(globalperl)/$${mod}; \ mkdir -p $${dst%/*}; \ mv -f $$src $$dst; \ + install -m 755 git-playtree-create $${base}$(specperl); \ perl -i -p -e 'next unless m/###substituted###/;' \ -e 'next unless s/^# (?=unshift \@INC,)//;' \ -e 'die unless s{q\{\S+\}}{q{$(specperl)}};' \ diff --git a/git-playtree-create b/git-playtree-create new file mode 100755 index 00000000..5d890a07 --- /dev/null +++ b/git-playtree-create @@ -0,0 +1,48 @@ +#!/bin/bash +# +# usage: +# rm -rf .git/some/play/thing +# git-playtree-setup .git/some/play/thing +# or: +# mkdir .git/some/play/thing +# cd .git/some/play/thing +# git-playtree-setup . + +set -ex + +target=$1; shift + +case "$#.$target" in +0.[^-]*) ;; +*) echo >&2 'bad usage' ; exit 8 ;; +esac + +[ "x$target" = x. ] || mkdir $target +cd $target + +gcd=$(cd .. && git rev-parse --git-common-dir) +case "$gcd" in +/*) ;; +*) gcd="../$gcd" ;; +esac + +git init -q +git config gc.auto 0 + +unset_all () { git config --local --unset-all $key || [ $? = 5 ]; } + +for key in \ + user.email user.name user.useConfigOnly \ + core.sharedRepository \ + core.compression core.looseCompression \ + core.bigFileThreshold core.fsyncObjectFiles \ +; do + unset_all + ( + git --git-dir="$gcd" config -z --get-all $key || [ $? = 1 ] + ) | xargs -n1 -0r -- \ + git config --local --add $key +done + +rm -rf .git/objects +ln -s "$gcd/objects" .git/objects -- 2.30.2