chiark / gitweb /
test suite: new test forcesplit-linear
[dgit.git] / dgit
diff --git a/dgit b/dgit
index 5172c4dd180aa04eb62422d57bfb205744bee570..26a8bf0cc9d835c80d221e57d4a538056dc81ef5 100755 (executable)
--- a/dgit
+++ b/dgit
@@ -80,6 +80,8 @@ our $rmchanges;
 our $overwrite_version; # undef: not specified; '': check changelog
 our $quilt_mode;
 our $quilt_modes_re = 'linear|smash|auto|nofix|nocheck|gbp|dpm|unapplied';
+our $splitview_mode;
+our $splitview_modes_re = qr{auto|always|never};
 our $dodep14tag;
 our %internal_object_save;
 our $we_are_responder;
@@ -177,7 +179,7 @@ our $do_split_brain;
 
 # Interactions between quilt mode and split brain
 # (currently, split brain only implemented iff
-#  madformat_wantfixup && quiltmode_splitbrain)
+#  madformat_wantfixup && quiltmode_splitting)
 #
 #   source format        sane           `3.0 (quilt)'
 #                                       madformat_wantfixup()
@@ -291,7 +293,7 @@ sub deliberately_not_fast_forward () {
     }
 }
 
-sub quiltmode_splitbrain () {
+sub quiltmode_splitting () {
     $quilt_mode =~ m/gbp|dpm|unapplied/;
 }
 
@@ -969,8 +971,21 @@ sub notpushing () {
 
 sub determine_whether_split_brain () {
     my ($format,) = get_source_format();
+
+    {
+       local $access_forpush;
+       default_from_access_cfg(\$splitview_mode, 'split-view', 'auto',
+                               $splitview_modes_re);
+       $do_split_brain = 1 if $splitview_mode eq 'always';
+    }
+
     printdebug "format $format, quilt mode $quilt_mode\n";
-    if (madformat_wantfixup($format) && quiltmode_splitbrain()) {
+
+    if (madformat_wantfixup($format) && quiltmode_splitting()) {
+       $splitview_mode ne 'never' or
+           fail f_ "dgit: quilt mode \`%s' (for format \`%s')".
+                   " implies split view, but split-view set to \`%s'",
+                   $quilt_mode, $format, $splitview_mode;
        $do_split_brain = 1;
     }
     $do_split_brain //= 0;
@@ -4444,7 +4459,7 @@ END
     my $actualhead = git_rev_parse('HEAD');
 
     if (branch_is_gdr_unstitched_ff($symref, $actualhead, $archive_hash)) {
-       if (quiltmode_splitbrain()) {
+       if (quiltmode_splitting()) {
            my ($ffq_prev, $gdrlast) = branch_gdr_info($symref, $actualhead);
            fail f_ <<END, $ffq_prev, $quilt_mode;
 Branch is managed by git-debrebase (%s
@@ -4835,10 +4850,11 @@ sub cmd_fetch {
 sub cmd_pull {
     parseopts();
     fetchpullargs();
-    if (quiltmode_splitbrain()) {
+    determine_whether_split_brain();
+    if (do_split_brain()) {
        my ($format, $fopts) = get_source_format();
        madformat($format) and fail f_ <<END, $quilt_mode
-dgit pull not yet supported in split view mode (--quilt=%s)
+dgit pull not yet supported in split view mode (including with view-splitting quilt modes)
 END
     }
     pull();
@@ -5341,7 +5357,7 @@ sub quiltify_tree_sentinelfiles ($) {
     return $r;
 }
 
-sub quiltify_splitbrain ($$$$$$$) {
+sub quiltify_splitting ($$$$$$$) {
     my ($clogp, $unapplied, $headref, $oldtiptree, $diffbits,
        $editedignores, $cachekey) = @_;
     my $gitignore_special = 1;
@@ -5772,7 +5788,7 @@ sub build_maybe_quilt_fixup () {
        fail f_
  "quilt mode %s does not make sense (or is not supported) with single-debian-patch",
            $quilt_mode
-           if quiltmode_splitbrain();
+           if quiltmode_splitting();
        quilt_fixup_singlepatch($clogp, $headref, $upstreamversion);
     } else {
        quilt_fixup_multipatch($clogp, $headref, $upstreamversion,
@@ -6210,10 +6226,10 @@ END
     push @failsuggestion, [ 'origs', __
  "Maybe orig tarball(s) are not identical to git representation?" ];
 
-    if (quiltmode_splitbrain()) {
-       quiltify_splitbrain($clogp, $unapplied, $headref, $oldtiptree,
-                            $diffbits, \%editedignores,
-                           $splitbrain_cachekey);
+    if (quiltmode_splitting()) {
+       quiltify_splitting($clogp, $unapplied, $headref, $oldtiptree,
+                          $diffbits, \%editedignores,
+                          $splitbrain_cachekey);
        return;
     }
 
@@ -6372,7 +6388,8 @@ sub build_or_push_prep_early () {
 sub build_or_push_prep_modes () {
     determine_whether_split_brain();
 
-    fail __ "dgit: --include-dirty is not supported in split view quilt mode"
+    fail __ "dgit: --include-dirty is not supported with split view".
+            " (including with view-splitting quilt modes)"
        if do_split_brain() && $includedirty;
 }
 
@@ -7323,6 +7340,12 @@ sub parseopts () {
            } elsif (m/^--overwrite$/s) {
                push @ropts, $_;
                $overwrite_version = '';
+           } elsif (m/^--split-(?:view|brain)$/s) {
+               push @ropts, $_;
+               $splitview_mode = 'always';
+           } elsif (m/^--split-(?:view|brain)=($splitview_modes_re)$/s) {
+               push @ropts, $_;
+               $splitview_mode = $1;
            } elsif (m/^--overwrite=(.+)$/s) {
                push @ropts, $_;
                $overwrite_version = $1;