Merge branch 'jk/add-i-mode'
* jk/add-i-mode: add--interactive: allow user to choose mode update add--interactive: ignore mode change in 'p'atch command
This commit is contained in:
commit
ce47dc0775
@ -550,6 +550,21 @@ sub parse_diff {
|
|||||||
return @hunk;
|
return @hunk;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub parse_diff_header {
|
||||||
|
my $src = shift;
|
||||||
|
|
||||||
|
my $head = { TEXT => [], DISPLAY => [] };
|
||||||
|
my $mode = { TEXT => [], DISPLAY => [] };
|
||||||
|
|
||||||
|
for (my $i = 0; $i < @{$src->{TEXT}}; $i++) {
|
||||||
|
my $dest = $src->{TEXT}->[$i] =~ /^(old|new) mode (\d+)$/ ?
|
||||||
|
$mode : $head;
|
||||||
|
push @{$dest->{TEXT}}, $src->{TEXT}->[$i];
|
||||||
|
push @{$dest->{DISPLAY}}, $src->{DISPLAY}->[$i];
|
||||||
|
}
|
||||||
|
return ($head, $mode);
|
||||||
|
}
|
||||||
|
|
||||||
sub hunk_splittable {
|
sub hunk_splittable {
|
||||||
my ($text) = @_;
|
my ($text) = @_;
|
||||||
|
|
||||||
@ -795,9 +810,40 @@ sub patch_update_file {
|
|||||||
my ($ix, $num);
|
my ($ix, $num);
|
||||||
my $path = shift;
|
my $path = shift;
|
||||||
my ($head, @hunk) = parse_diff($path);
|
my ($head, @hunk) = parse_diff($path);
|
||||||
|
($head, my $mode) = parse_diff_header($head);
|
||||||
for (@{$head->{DISPLAY}}) {
|
for (@{$head->{DISPLAY}}) {
|
||||||
print;
|
print;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (@{$mode->{TEXT}}) {
|
||||||
|
while (1) {
|
||||||
|
print @{$mode->{DISPLAY}};
|
||||||
|
print colored $prompt_color,
|
||||||
|
"Stage mode change [y/n/a/d/?]? ";
|
||||||
|
my $line = <STDIN>;
|
||||||
|
if ($line =~ /^y/i) {
|
||||||
|
$mode->{USE} = 1;
|
||||||
|
last;
|
||||||
|
}
|
||||||
|
elsif ($line =~ /^n/i) {
|
||||||
|
$mode->{USE} = 0;
|
||||||
|
last;
|
||||||
|
}
|
||||||
|
elsif ($line =~ /^a/i) {
|
||||||
|
$_->{USE} = 1 foreach ($mode, @hunk);
|
||||||
|
last;
|
||||||
|
}
|
||||||
|
elsif ($line =~ /^d/i) {
|
||||||
|
$_->{USE} = 0 foreach ($mode, @hunk);
|
||||||
|
last;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
help_patch_cmd('');
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$num = scalar @hunk;
|
$num = scalar @hunk;
|
||||||
$ix = 0;
|
$ix = 0;
|
||||||
|
|
||||||
@ -920,6 +966,9 @@ sub patch_update_file {
|
|||||||
|
|
||||||
my $n_lofs = 0;
|
my $n_lofs = 0;
|
||||||
my @result = ();
|
my @result = ();
|
||||||
|
if ($mode->{USE}) {
|
||||||
|
push @result, @{$mode->{TEXT}};
|
||||||
|
}
|
||||||
for (@hunk) {
|
for (@hunk) {
|
||||||
my $text = $_->{TEXT};
|
my $text = $_->{TEXT};
|
||||||
my ($o_ofs, $o_cnt, $n_ofs, $n_cnt) =
|
my ($o_ofs, $o_cnt, $n_ofs, $n_cnt) =
|
||||||
|
@ -66,4 +66,23 @@ test_expect_success 'revert works (commit)' '
|
|||||||
grep "unchanged *+3/-0 file" output
|
grep "unchanged *+3/-0 file" output
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'patch does not affect mode' '
|
||||||
|
git reset --hard &&
|
||||||
|
echo content >>file &&
|
||||||
|
chmod +x file &&
|
||||||
|
printf "n\\ny\\n" | git add -p &&
|
||||||
|
git show :file | grep content &&
|
||||||
|
git diff file | grep "new mode"
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'stage mode but not hunk' '
|
||||||
|
git reset --hard &&
|
||||||
|
echo content >>file &&
|
||||||
|
chmod +x file &&
|
||||||
|
printf "y\\nn\\n" | git add -p &&
|
||||||
|
git diff --cached file | grep "new mode" &&
|
||||||
|
git diff file | grep "+content"
|
||||||
|
'
|
||||||
|
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
Loading…
Reference in New Issue
Block a user