threads / patch / 34455

patchFix dirty index errors when resolving conflicts

Subject: [StGit PATCH] Fix dirty index errors when resolving conflicts

## tl;dr

3 messages between Jul 17, 2013 and Jul 17, 2013. Diffs are folded; open one to read it.

replies: 2people: 3as markdown or json

Zane Bitter· Jul 17, 2013, 13:57 UTC · lore

The patch 6e8fdc58c786a45d7a63c5edf9c702f1874a7a19 causes StGit to raise "warnings" (actually: errors) in the event that there are changes staged in the index and a refresh is performed without specifying either --index or --force. This is great for preventing an entire class of common mistakes, but is also a giant pain when resolving conflicts after a pull/rebase. Depending on the workflow in use, this may occur with a frequency anywhere between "never" and "mulitple times on every pull".

This patch removes the pain by:
 - Reporting unresolved conflicts *before* complaining about staged
   changes, since it goes without saying that, when present, these are the
   main problem.
 - Not complaining about staged changes if there are no unstaged changes in
   the working directory, since the presence of --index is immaterial in
   this case.
Signed-off-by: Zane Bitter <zbitter@redhat.com>
---
 stgit/commands/refresh.py |   13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)
Show changes to stgit/commands/refresh.py +7 −6
diff --git a/stgit/commands/refresh.py b/stgit/commands/refresh.py
index a2bab42..331c18d 100644
--- a/stgit/commands/refresh.py
+++ b/stgit/commands/refresh.py
@@ -247,18 +247,19 @@ def func(parser, options, args):
     patch_name = get_patch(stack, options.patch)
     paths = list_files(stack, patch_name, args, options.index, options.update)
 
-    # Make sure the index is clean before performing a full refresh
-    if not options.index and not options.force:
-        if not stack.repository.default_index.is_clean(stack.head):
-            raise common.CmdException(
-                'The index is dirty. Did you mean --index? To force a full refresh use --force.')
-
     # Make sure there are no conflicts in the files we want to
     # refresh.
     if stack.repository.default_index.conflicts() & paths:
         raise common.CmdException(
             'Cannot refresh -- resolve conflicts first')
 
+    # Make sure the index is clean before performing a full refresh
+    if not options.index and not options.force:
+        if not (stack.repository.default_index.is_clean(stack.head) or
+                stack.repository.default_iw.worktree_clean()):
+            raise common.CmdException(
+                'The index is dirty. Did you mean --index? To force a full refresh use --force.')
+
     # Commit index to temp patch, and absorb it into the target patch.
     retval, temp_name = make_temp_patch(
         stack, patch_name, paths, temp_index = path_limiting)
Keller, Jacob E· Jul 17, 2013, 20:59 UTC · re: Zane Bitter · lore

RE: [StGit PATCH] Fix dirty index errors when resolving conflicts

Show 64 quoted lines
> -----Original Message-----
> From: Zane Bitter [mailto:zbitter@redhat.com]
> Sent: Wednesday, July 17, 2013 6:57 AM
> To: git@vger.kernel.org
> Cc: Keller, Jacob E; Waskiewicz Jr, Peter P; catalin.marinas@gmail.com
> Subject: [StGit PATCH] Fix dirty index errors when resolving conflicts
> 
> The patch 6e8fdc58c786a45d7a63c5edf9c702f1874a7a19 causes StGit
> to raise
> "warnings" (actually: errors) in the event that there are changes staged in
> the index and a refresh is performed without specifying either --index or
> --force. This is great for preventing an entire class of common mistakes,
> but is also a giant pain when resolving conflicts after a pull/rebase.
> Depending on the workflow in use, this may occur with a frequency
> anywhere
> between "never" and "mulitple times on every pull".
> 
> This patch removes the pain by:
>  - Reporting unresolved conflicts *before* complaining about staged
>    changes, since it goes without saying that, when present, these are the
>    main problem.
>  - Not complaining about staged changes if there are no unstaged changes
> in
>    the working directory, since the presence of --index is immaterial in
>    this case.
> 
> Signed-off-by: Zane Bitter <zbitter@redhat.com>
> ---
>  stgit/commands/refresh.py |   13 +++++++------
>  1 file changed, 7 insertions(+), 6 deletions(-)
> 
> diff --git a/stgit/commands/refresh.py b/stgit/commands/refresh.py
> index a2bab42..331c18d 100644
> --- a/stgit/commands/refresh.py
> +++ b/stgit/commands/refresh.py
> @@ -247,18 +247,19 @@ def func(parser, options, args):
>      patch_name = get_patch(stack, options.patch)
>      paths = list_files(stack, patch_name, args, options.index,
> options.update)
> 
> -    # Make sure the index is clean before performing a full refresh
> -    if not options.index and not options.force:
> -        if not stack.repository.default_index.is_clean(stack.head):
> -            raise common.CmdException(
> -                'The index is dirty. Did you mean --index? To force a full refresh
> use --force.')
> -
>      # Make sure there are no conflicts in the files we want to
>      # refresh.
>      if stack.repository.default_index.conflicts() & paths:
>          raise common.CmdException(
>              'Cannot refresh -- resolve conflicts first')
> 
> +    # Make sure the index is clean before performing a full refresh
> +    if not options.index and not options.force:
> +        if not (stack.repository.default_index.is_clean(stack.head) or
> +                stack.repository.default_iw.worktree_clean()):
> +            raise common.CmdException(
> +                'The index is dirty. Did you mean --index? To force a full refresh
> use --force.')
> +
>      # Commit index to temp patch, and absorb it into the target patch.
>      retval, temp_name = make_temp_patch(
>          stack, patch_name, paths, temp_index = path_limiting)
ACK. This looks great. Thanks for noticing!
- Jake
Waskiewicz Jr, Peter P· Jul 17, 2013, 21:23 UTC · re: Zane Bitter · lore

Re: [StGit PATCH] Fix dirty index errors when resolving conflicts

On Wed, 2013-07-17 at 15:57 +0200, Zane Bitter wrote:
Show 7 quoted lines
> The patch 6e8fdc58c786a45d7a63c5edf9c702f1874a7a19 causes StGit to raise
> "warnings" (actually: errors) in the event that there are changes staged in
> the index and a refresh is performed without specifying either --index or
> --force. This is great for preventing an entire class of common mistakes,
> but is also a giant pain when resolving conflicts after a pull/rebase.
> Depending on the workflow in use, this may occur with a frequency anywhere
> between "never" and "mulitple times on every pull".

I actually had someone else mention this problem to me last week. This looks good, I'll be applying this later today.

Cheers, -PJ

Show 45 quoted lines
> 
> This patch removes the pain by:
>  - Reporting unresolved conflicts *before* complaining about staged
>    changes, since it goes without saying that, when present, these are the
>    main problem.
>  - Not complaining about staged changes if there are no unstaged changes in
>    the working directory, since the presence of --index is immaterial in
>    this case.
> 
> Signed-off-by: Zane Bitter <zbitter@redhat.com>
> ---
>  stgit/commands/refresh.py |   13 +++++++------
>  1 file changed, 7 insertions(+), 6 deletions(-)
> 
> diff --git a/stgit/commands/refresh.py b/stgit/commands/refresh.py
> index a2bab42..331c18d 100644
> --- a/stgit/commands/refresh.py
> +++ b/stgit/commands/refresh.py
> @@ -247,18 +247,19 @@ def func(parser, options, args):
>      patch_name = get_patch(stack, options.patch)
>      paths = list_files(stack, patch_name, args, options.index, options.update)
>  
> -    # Make sure the index is clean before performing a full refresh
> -    if not options.index and not options.force:
> -        if not stack.repository.default_index.is_clean(stack.head):
> -            raise common.CmdException(
> -                'The index is dirty. Did you mean --index? To force a full refresh use --force.')
> -
>      # Make sure there are no conflicts in the files we want to
>      # refresh.
>      if stack.repository.default_index.conflicts() & paths:
>          raise common.CmdException(
>              'Cannot refresh -- resolve conflicts first')
>  
> +    # Make sure the index is clean before performing a full refresh
> +    if not options.index and not options.force:
> +        if not (stack.repository.default_index.is_clean(stack.head) or
> +                stack.repository.default_iw.worktree_clean()):
> +            raise common.CmdException(
> +                'The index is dirty. Did you mean --index? To force a full refresh use --force.')
> +
>      # Commit index to temp patch, and absorb it into the target patch.
>      retval, temp_name = make_temp_patch(
>          stack, patch_name, paths, temp_index = path_limiting)
> 

← back to recent threads