From d69f00cafcb1a8ab3ec1c75a4a35b0db496a60ad Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Wed, 2 Aug 2017 15:50:03 +0100 Subject: playground refactoring: Dgit.pm: Provide fresh_playground etc. These functions will shortly replace the similar, but less-flexible, ad-hoc functions in dgit proper. Signed-off-by: Ian Jackson --- Debian/Dgit.pm | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 65 insertions(+), 1 deletion(-) (limited to 'Debian/Dgit.pm') diff --git a/Debian/Dgit.pm b/Debian/Dgit.pm index 515a32f..27fd29a 100644 --- a/Debian/Dgit.pm +++ b/Debian/Dgit.pm @@ -30,6 +30,7 @@ use Digest::SHA; use Data::Dumper; use IPC::Open2; use File::Path; +use File::Basename; BEGIN { use Exporter (); @@ -62,7 +63,8 @@ BEGIN { playtree_setup); # implicitly uses $main::us %EXPORT_TAGS = ( policyflags => [qw(NOFFCHECK FRESHREPO NOCOMMITCHECK)], - playground => [qw($local_git_cfg)]); + playground => [qw(record_maindir $maindir $local_git_cfg + fresh_playground $playground)]); @EXPORT_OK = ( @{ $EXPORT_TAGS{policyflags} }, @{ $EXPORT_TAGS{playground} } ); } @@ -458,10 +460,72 @@ sub git_slurp_config_src ($) { # ========== playground handling ========== +# terminology: +# +# $maindir user's git working tree +# $playground area in .git/ where we can make files, unpack, etc. etc. +# playtree git working tree sharing object store with the user's +# inside playground, or identical to it +# +# other globals +# # $local_git_cfg hash of arrays of values: git config from $maindir +# +# expected calling pattern +# +# firstly +# +# [record_maindir] +# must be run in directory containing .git +# assigns to $maindir if not already set +# also calls git_slurp_config_src to record git config +# in $local_git_cfg, unless it's already set +# +# fresh_playground SUBDIR_PATH_COMPONENTS +# e.g fresh_playground 'dgit/unpack' ('.git/' is implied) +# default SUBDIR_PATH_COMPONENTS is $playground_subdir +# calls record_maindir +# sets up a new playground (destroying any old one) +# assigns to $playground and returns the same pathname +# caller may call multiple times with different subdir paths +# createing different playgrounds; but $playground global can +# refer only to one, obv. +# +# then can use +# +# changedir $playground +# changedir $maindir +# +# playtree_setup $local_git_cfg +# # ^ call in some (perhaps trivial) subdir of $playground +# +# rmtree $playground + +# ----- maindir ----- +our $maindir; our $local_git_cfg; +sub record_maindir () { + $maindir //= must_getcwd(); + $local_git_cfg //= git_slurp_config_src 'local'; +} + +# ----- playgrounds ----- + +our $playground; + +sub fresh_playground ($) { + my ($spc) = @_; + record_maindir(); + $spc = ".git/$spc"; + my $parent = dirname $spc; + mkdir $parent or $!==EEXIST or fail "failed to mkdir $parent: $!"; + rmtree $spc; + mkdir $spc or die "$spc $!"; + return $playground = "$maindir/$spc"; +} + # ----- playtrees ----- sub playtree_setup (;$) { -- cgit v1.2.3