FILTER => undef,
IS_REVERSE => 0,
},
+ 'worktree_head' => {
+ DIFF => 'diff-index -p',
+ APPLY => sub { apply_patch 'apply -R', @_ },
+ APPLY_CHECK => 'apply -R',
+ FILTER => undef,
+ IS_REVERSE => 1,
+ },
+ 'worktree_nothead' => {
+ DIFF => 'diff-index -R -p',
+ APPLY => sub { apply_patch 'apply', @_ },
+ APPLY_CHECK => 'apply',
+ FILTER => undef,
+ IS_REVERSE => 0,
+ },
);
$patch_mode = 'stage';
}
}
-sub get_empty_tree {
- return '4b825dc642cb6eb9a060e54bf8d69288fbee4904';
+{
+ my $empty_tree;
+ sub get_empty_tree {
+ return $empty_tree if defined $empty_tree;
+
+ $empty_tree = run_cmd_pipe(qw(git hash-object -t tree /dev/null));
+ chomp $empty_tree;
+ return $empty_tree;
+ }
}
sub get_diff_reference {
next;
}
if ($ofs_delta) {
- $n_ofs += $ofs_delta;
+ if ($patch_mode_flavour{IS_REVERSE}) {
+ $o_ofs -= $ofs_delta;
+ } else {
+ $n_ofs += $ofs_delta;
+ }
$_->{TEXT}->[0] = format_hunk_header($o_ofs, $o_cnt,
$n_ofs, $n_cnt);
}
marked for discarding."),
checkout_nothead => N__(
"If the patch applies cleanly, the edited hunk will immediately be
+marked for applying."),
+ worktree_head => N__(
+"If the patch applies cleanly, the edited hunk will immediately be
+marked for discarding."),
+ worktree_nothead => N__(
+"If the patch applies cleanly, the edited hunk will immediately be
marked for applying."),
);
$o_cnt++;
} elsif ($mode eq '+') {
$n_cnt++;
- } elsif ($mode eq ' ') {
+ } elsif ($mode eq ' ' or $mode eq "\n") {
$o_cnt++;
$n_cnt++;
}
n - do not apply this hunk to index and worktree
q - quit; do not apply this hunk or any of the remaining ones
a - apply this hunk and all later hunks in the file
+d - do not apply this hunk or any of the later hunks in the file"),
+ worktree_head => N__(
+"y - discard this hunk from worktree
+n - do not discard this hunk from worktree
+q - quit; do not discard this hunk or any of the remaining ones
+a - discard this hunk and all later hunks in the file
+d - do not discard this hunk or any of the later hunks in the file"),
+ worktree_nothead => N__(
+"y - apply this hunk to worktree
+n - do not apply this hunk to worktree
+q - quit; do not apply this hunk or any of the remaining ones
+a - apply this hunk and all later hunks in the file
d - do not apply this hunk or any of the later hunks in the file"),
);
deletion => N__("Apply deletion to index and worktree [y,n,q,a,d%s,?]? "),
hunk => N__("Apply this hunk to index and worktree [y,n,q,a,d%s,?]? "),
},
+ worktree_head => {
+ mode => N__("Discard mode change from worktree [y,n,q,a,d%s,?]? "),
+ deletion => N__("Discard deletion from worktree [y,n,q,a,d%s,?]? "),
+ hunk => N__("Discard this hunk from worktree [y,n,q,a,d%s,?]? "),
+ },
+ worktree_nothead => {
+ mode => N__("Apply mode change to worktree [y,n,q,a,d%s,?]? "),
+ deletion => N__("Apply deletion to worktree [y,n,q,a,d%s,?]? "),
+ hunk => N__("Apply this hunk to worktree [y,n,q,a,d%s,?]? "),
+ },
);
sub patch_update_file {
'checkout_head' : 'checkout_nothead');
$arg = shift @ARGV or die __("missing --");
}
+ } elsif ($1 eq 'worktree') {
+ $arg = shift @ARGV or die __("missing --");
+ if ($arg eq '--') {
+ $patch_mode = 'checkout_index';
+ } else {
+ $patch_mode_revision = $arg;
+ $patch_mode = ($arg eq 'HEAD' ?
+ 'worktree_head' : 'worktree_nothead');
+ $arg = shift @ARGV or die __("missing --");
+ }
} elsif ($1 eq 'stage' or $1 eq 'stash') {
$patch_mode = $1;
$arg = shift @ARGV or die __("missing --");