chiark / gitweb /
playground refactoring: Dgit.pm: Provide fresh_playground etc.
[dgit.git] / Debian / Dgit.pm
index 515a32f600b805634a8b3991e21b702c603dc56d..27fd29ab6fefa21ab0ae991fe1661fbc0c0ddfd3 100644 (file)
@@ -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 (;$) {