X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=git-debrebase;h=50f5e1674c6574afa7d42c8e7d04a33c31b99867;hb=aebf260fa5e34808157bf42f1dd70d3ce85c11aa;hp=b467a56d17a03d92706b86ee34796c7b7ffef77e;hpb=9a4a89c2ce5cdb6e4b22c1aeb7ce0aa3993a2c3d;p=dgit.git diff --git a/git-debrebase b/git-debrebase index b467a56d..50f5e167 100755 --- a/git-debrebase +++ b/git-debrebase @@ -116,7 +116,7 @@ sub dd ($) { sub get_commit ($) { my ($objid) = @_; - my $data = git_cat_file $objid, 'commit'; + my $data = (git_cat_file $objid, 'commit'); $data =~ m/(?<=\n)\n/ or die "$objid ($data) ?"; return ($`,$'); } @@ -200,8 +200,8 @@ sub get_differs ($$) { if ($mode eq 'A' && !m/\.series$/s) { $ok = 1; } elsif ($mode eq 'M' && $_ eq 'series') { - my $x_s = git_cat_file "$x:debian/patches/series", 'blob'; - my $y_s = git_cat_file "$y:debian/patches/series", 'blob'; + my $x_s = (git_cat_file "$x:debian/patches/series", 'blob'); + my $y_s = (git_cat_file "$y:debian/patches/series", 'blob'); chomp $x_s; $x_s .= "\n"; $ok = $x_s eq substr($y_s, 0, length $x_s); } else { @@ -912,7 +912,7 @@ sub cmd_new_upstream_v0 () { in_workarea sub { my @upstream_merge_parents; - if (!$problems) { + if (!$fproblems) { push @upstream_merge_parents, $old_upstream->{CommitId}; } @@ -990,6 +990,45 @@ END # now it's for the user to sort out } +sub cmd_gbp2debrebase () { + badusage "needs 1 optional argument, the upstream" unless @ARGV<=1; + my ($upstream_spec) = @ARGV; + $upstream_spec //= 'refs/heads/upstream'; + my $upstream = git_rev_parse $upstream_spec; + my $old_head = get_head(); + + my $upsdiff = get_differs $upstream, $old_head; + if ($upsdiff & D_UPS) { + runcmd @git, qw(--no-pager diff), + $upstream, $old_head, + qw( -- :!/debian :/); + fail "upstream ($upstream_spec) and HEAD are not identical in upstream files"; + } + + if (!is_fast_fwd $upstream, $old_head) { + fproblem "upstream ($upstream) is not an ancestor of HEAD"; + } else { + my $wrong = cmdoutput + (@git, qw(rev-list --ancestry-path), "$upstream..HEAD", + qw(-- :/ :!/debian)); + if (length $wrong) { + fproblem "history between upstream ($upstream) and HEAD contains direct changes to upstream files - are you sure this is a gbp (patches-unapplied) branch?"; + print STDERR "list expected changes with: git log --stat --ancestry-path $upstream_spec..HEAD -- :/ ':!/debian'\n"; + } + } + + if ((git_cat_file "$upstream:debian")[0] ne 'missing') { + fproblem "upstream ($upstream) contains debian/ directory"; + } + die; + + fresh_workarea(); + in_workarea sub { + runcmd @git, qw(checkout -b work), $old_head; + + }; +} + sub cmd_downstream_rebase_launder_v0 () { badusage "needs 1 argument, the baseline" unless @ARGV==1; my ($base) = @ARGV;