# [PATCH/RFC] git-gui: disable (un)staging for files with typechange flags

5 messages from 2010-11-30 to 2010-12-06. Participants: Bert Wesarg, Pat Thoyts.
Thread: https://gitlist.dev/t/25874

## Bert Wesarg, 2010-11-30 22:21

Subject: [PATCH/RFC] git-gui: disable (un)staging for files with typechange flags
Message-ID: <50fc511f363e8b13b9b1a27db71136d262c95f0d.1291155371.git.bert.wesarg@googlemail.com>
URL: https://gitlist.dev/e/50fc511f363e8b13b9b1a27db71136d262c95f0d.1291155371.git.bert.wesarg%40googlemail.com

```
This covers also the case for newly added files in the index. Like this:

    echo bar >foo
    git add foo
    rm foo
    ln -s bar foo

This will result in an state of AT. And for cases where the type change is
staged, and the new type was modified after the staging. Like this (cont.):

    git add foo
    git commit -mfoo
    rm foo
    echo bar >foo
    git add foo
    echo baz >foo

Will result in an state of TM for foo.

Signed-off-by: Bert Wesarg <bert.wesarg@googlemail.com>
---
 git-gui.sh |    6 ++++--
 1 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/git-gui.sh b/git-gui.sh
index 38362fa..1bebcf1 100755
--- a/git-gui.sh
+++ b/git-gui.sh
@@ -1993,7 +1993,9 @@ foreach i {
 		{MD {mc "Staged for commit, missing"}}
 
 		{_T {mc "File type changed, not staged"}}
+		{AT {mc "File type changed, old type staged for commit"}}
 		{T_ {mc "File type changed, staged"}}
+		{TM {mc "Staged file type change, modification not staged"}}
 
 		{_O {mc "Untracked, not staged"}}
 		{A_ {mc "Staged for commit"}}
@@ -3533,8 +3535,8 @@ proc popup_diff_menu {ctxm ctxmmg ctxmsm x y X Y} {
 			|| $current_diff_path eq {}
 			|| {__} eq $state
 			|| {_O} eq $state
-			|| {_T} eq $state
-			|| {T_} eq $state
+			|| [string match {?T} $state]
+			|| [string match {T?} $state]
 			|| [has_textconv $current_diff_path]} {
 			set s disabled
 		} else {
-- 
1.7.3.2.1200.ge4bf6

```

## Bert Wesarg, 2010-12-03 13:34

Subject: Re: [PATCH/RFC] git-gui: disable (un)staging for files with typechange flags
Message-ID: <AANLkTimz-XZQzTygKxQDJ+E6ZJm1+8aZNuKfZ6-AwQh3@mail.gmail.com>
URL: https://gitlist.dev/e/AANLkTimz-XZQzTygKxQDJ%2BE6ZJm1%2B8aZNuKfZ6-AwQh3%40mail.gmail.com
In-Reply-To: <50fc511f363e8b13b9b1a27db71136d262c95f0d.1291155371.git.bert.wesarg@googlemail.com>

```
[ Adding Gustaf Hendeby, the author of the first patch to support type changes ]

On Tue, Nov 30, 2010 at 23:21, Bert Wesarg <bert.wesarg@googlemail.com> wrote:
> This covers also the case for newly added files in the index. Like this:
>
>    echo bar >foo
>    git add foo
>    rm foo
>    ln -s bar foo
>
> This will result in an state of AT. And for cases where the type change is
> staged, and the new type was modified after the staging. Like this (cont.):
>
>    git add foo
>    git commit -mfoo
>    rm foo
>    echo bar >foo
>    git add foo
>    echo baz >foo
>
> Will result in an state of TM for foo.
>
> Signed-off-by: Bert Wesarg <bert.wesarg@googlemail.com>
> ---
>  git-gui.sh |    6 ++++--
>  1 files changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/git-gui.sh b/git-gui.sh
> index 38362fa..1bebcf1 100755
> --- a/git-gui.sh
> +++ b/git-gui.sh
> @@ -1993,7 +1993,9 @@ foreach i {
>                {MD {mc "Staged for commit, missing"}}
>
>                {_T {mc "File type changed, not staged"}}
> +               {AT {mc "File type changed, old type staged for commit"}}
>                {T_ {mc "File type changed, staged"}}
> +               {TM {mc "Staged file type change, modification not staged"}}
>
>                {_O {mc "Untracked, not staged"}}
>                {A_ {mc "Staged for commit"}}
> @@ -3533,8 +3535,8 @@ proc popup_diff_menu {ctxm ctxmmg ctxmsm x y X Y} {
>                        || $current_diff_path eq {}
>                        || {__} eq $state
>                        || {_O} eq $state
> -                       || {_T} eq $state
> -                       || {T_} eq $state
> +                       || [string match {?T} $state]
> +                       || [string match {T?} $state]
>                        || [has_textconv $current_diff_path]} {
>                        set s disabled
>                } else {
> --
> 1.7.3.2.1200.ge4bf6
>
>

```

## Bert Wesarg, 2010-12-06 21:28

Subject: Re: [PATCH/RFC] git-gui: disable (un)staging for files with typechange flags
Message-ID: <AANLkTik9ZSSQ5pXs6wpU6dXGmVTJ=LTY6CQn79Pup9o1@mail.gmail.com>
URL: https://gitlist.dev/e/AANLkTik9ZSSQ5pXs6wpU6dXGmVTJ%3DLTY6CQn79Pup9o1%40mail.gmail.com
In-Reply-To: <AANLkTimz-XZQzTygKxQDJ+E6ZJm1+8aZNuKfZ6-AwQh3@mail.gmail.com>

```
On Fri, Dec 3, 2010 at 14:34, Bert Wesarg <bert.wesarg@googlemail.com> wrote:
> [ Adding Gustaf Hendeby, the author of the first patch to support type changes ]
>
> On Tue, Nov 30, 2010 at 23:21, Bert Wesarg <bert.wesarg@googlemail.com> wrote:
>> This covers also the case for newly added files in the index. Like this:
>>
>>    echo bar >foo
>>    git add foo
>>    rm foo
>>    ln -s bar foo
>>
>> This will result in an state of AT. And for cases where the type change is
>> staged, and the new type was modified after the staging. Like this (cont.):
>>
>>    git add foo
>>    git commit -mfoo
>>    rm foo
>>    echo bar >foo
>>    git add foo
>>    echo baz >foo
>>
>> Will result in an state of TM for foo.

This patch is incomplete. There are more places where the new AT and
TM states needs to be handled. Please wait for a re-roll.

Bert

```

## Pat Thoyts, 2010-12-06 21:48

Subject: Re: [PATCH/RFC] git-gui: disable (un)staging for files with typechange flags
Message-ID: <87aakiy3lt.fsf@fox.patthoyts.tk>
URL: https://gitlist.dev/e/87aakiy3lt.fsf%40fox.patthoyts.tk
In-Reply-To: <50fc511f363e8b13b9b1a27db71136d262c95f0d.1291155371.git.bert.wesarg@googlemail.com>

```
Bert Wesarg <bert.wesarg@googlemail.com> writes:

>This covers also the case for newly added files in the index. Like this:
>
>    echo bar >foo
>    git add foo
>    rm foo
>    ln -s bar foo
>
>This will result in an state of AT. And for cases where the type change is
>staged, and the new type was modified after the staging. Like this (cont.):
>
>    git add foo
>    git commit -mfoo
>    rm foo
>    echo bar >foo
>    git add foo
>    echo baz >foo
>
>Will result in an state of TM for foo.
>
>Signed-off-by: Bert Wesarg <bert.wesarg@googlemail.com>
>---
> git-gui.sh |    6 ++++--
> 1 files changed, 4 insertions(+), 2 deletions(-)
>
>diff --git a/git-gui.sh b/git-gui.sh
>index 38362fa..1bebcf1 100755
>--- a/git-gui.sh
>+++ b/git-gui.sh
>@@ -1993,7 +1993,9 @@ foreach i {
> 		{MD {mc "Staged for commit, missing"}}
> 
> 		{_T {mc "File type changed, not staged"}}
>+		{AT {mc "File type changed, old type staged for commit"}}
> 		{T_ {mc "File type changed, staged"}}
>+		{TM {mc "Staged file type change, modification not staged"}}
> 
> 		{_O {mc "Untracked, not staged"}}
> 		{A_ {mc "Staged for commit"}}
>@@ -3533,8 +3535,8 @@ proc popup_diff_menu {ctxm ctxmmg ctxmsm x y X Y} {
> 			|| $current_diff_path eq {}
> 			|| {__} eq $state
> 			|| {_O} eq $state
>-			|| {_T} eq $state
>-			|| {T_} eq $state
>+			|| [string match {?T} $state]
>+			|| [string match {T?} $state]
> 			|| [has_textconv $current_diff_path]} {
> 			set s disabled
> 		} else {

This seems fine. We do get a warning about an 'unhandled 2 way diff
marker' when it bumps into the second 'diff --git a/foo b/foo' section
but I'm not sure anything can be safely done about that.
-- 
Pat Thoyts                            http://www.patthoyts.tk/
PGP fingerprint 2C 6E 98 07 2C 59 C8 97  10 CE 11 E6 04 E0 B9 DD

```

## Bert Wesarg, 2010-12-06 22:17

Subject: Re: [PATCH/RFC] git-gui: disable (un)staging for files with typechange flags
Message-ID: <AANLkTikTY-KsB6zgf0MZJDDr8dCMB1VUQh4pvrvgSLud@mail.gmail.com>
URL: https://gitlist.dev/e/AANLkTikTY-KsB6zgf0MZJDDr8dCMB1VUQh4pvrvgSLud%40mail.gmail.com
In-Reply-To: <87aakiy3lt.fsf@fox.patthoyts.tk>

```
On Mon, Dec 6, 2010 at 22:48, Pat Thoyts
<patthoyts@users.sourceforge.net> wrote:
> Bert Wesarg <bert.wesarg@googlemail.com> writes:
>
>>This covers also the case for newly added files in the index. Like this:
>>
>>    echo bar >foo
>>    git add foo
>>    rm foo
>>    ln -s bar foo
>>
>>This will result in an state of AT. And for cases where the type change is
>>staged, and the new type was modified after the staging. Like this (cont.):
>>
>>    git add foo
>>    git commit -mfoo
>>    rm foo
>>    echo bar >foo
>>    git add foo
>>    echo baz >foo
>>
>>Will result in an state of TM for foo.
>>
>>Signed-off-by: Bert Wesarg <bert.wesarg@googlemail.com>
>>---
>> git-gui.sh |    6 ++++--
>> 1 files changed, 4 insertions(+), 2 deletions(-)
>>
>>diff --git a/git-gui.sh b/git-gui.sh
>>index 38362fa..1bebcf1 100755
>>--- a/git-gui.sh
>>+++ b/git-gui.sh
>>@@ -1993,7 +1993,9 @@ foreach i {
>>               {MD {mc "Staged for commit, missing"}}
>>
>>               {_T {mc "File type changed, not staged"}}
>>+              {AT {mc "File type changed, old type staged for commit"}}
>>               {T_ {mc "File type changed, staged"}}
>>+              {TM {mc "Staged file type change, modification not staged"}}
>>
>>               {_O {mc "Untracked, not staged"}}
>>               {A_ {mc "Staged for commit"}}
>>@@ -3533,8 +3535,8 @@ proc popup_diff_menu {ctxm ctxmmg ctxmsm x y X Y} {
>>                       || $current_diff_path eq {}
>>                       || {__} eq $state
>>                       || {_O} eq $state
>>-                      || {_T} eq $state
>>-                      || {T_} eq $state
>>+                      || [string match {?T} $state]
>>+                      || [string match {T?} $state]
>>                       || [has_textconv $current_diff_path]} {
>>                       set s disabled
>>               } else {
>
> This seems fine. We do get a warning about an 'unhandled 2 way diff
> marker' when it bumps into the second 'diff --git a/foo b/foo' section
> but I'm not sure anything can be safely done about that.

We had this before, and you have proposed a fix for that ("git-gui:
handle symlink replaced by file"). But as I wrote I have a better and
nicer solution to that specific problem.

Bert

> --
> Pat Thoyts                            http://www.patthoyts.tk/
> PGP fingerprint 2C 6E 98 07 2C 59 C8 97  10 CE 11 E6 04 E0 B9 DD
>
>

```
