git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Jeff King <peff@peff.net>
To: Drew Gross <drew.a.gross@gmail.com>
Cc: git <git@vger.kernel.org>
Subject: Re: Fwd: Delivery Status Notification (Failure)
Date: Sat, 6 Apr 2013 00:49:11 -0400	[thread overview]
Message-ID: <20130406044911.GA26544@sigill.intra.peff.net> (raw)
In-Reply-To: <CAECh7fD6SKtfZudByeVD_HUjxN-fHBF1bA+pVM6=gV=Jy5Uhwg@mail.gmail.com>

On Sat, Apr 06, 2013 at 12:15:33AM -0400, Drew Gross wrote:

> I'm am trying to patch git to refuse to commit if there are both staged and
> unstaged changes, and I pass the -a flag. I expected this simple addition
> to parse_and_validate_options() in commit.c to accomplish most of what I
> want:
> 
> if (all && s->workdir_dirty)
>     die(_("Cannot commit with -a if there are staged and unstaged changes"));
> 
> But when compiled, this will commit anyway even with staged and unstaged
> files. I think I misunderstanding the workdir_dirty flag. Can someone help
> me?

I am not sure if that is a good safety measure in general. But
ignoring that question for a moment, there are a few issues with your
proposed implementation:

  1. workdir_dirty only talks about unstaged changes; it sounds like you
     want to check for both staged and unstaged.

  2. no flags in in the wt_status struct are set until wt_status_collect
     is called; you need to put your check later. But of course by the
     time we call it, we have already updated the index, so you would
     not know anymore which changes were already in the index and which
     were added by "-a".

  3. we do not always run wt_collect_status (e.g., if you are not going
     to run an editor, we do not bother going to the effort to create
     the commit template).

So you'd probably need something more like this:

diff --git a/builtin/commit.c b/builtin/commit.c
index 4620437..ebb5480 100644
--- a/builtin/commit.c
+++ b/builtin/commit.c
@@ -1061,6 +1061,10 @@ static int parse_and_validate_options(int argc, const char *argv[],
 	if (status_format != STATUS_FORMAT_NONE)
 		dry_run = 1;
 
+	wt_status_collect(s);
+	if (all && s->change.nr && s->workdir_dirty)
+		die("Cannot use '-a' with staged and unstaged changes");
+
 	return argc;
 }
 

Note that this may run the diff-index and diff-files procedures twice
(once here, and once later if we actually call run_status). If were
doing this for real (and I do not think it is something we want to take
upstream anyway), you would want to make sure that information was
cached.

-Peff

  reply	other threads:[~2013-04-06 16:59 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <CAECh7fANnQDfSNHvOUH7AhyVNciypCKLXadY-jFxso4etCuvrg@mail.gmail.com>
     [not found] ` <047d7b3a85a201067604d9a948e8@google.com>
2013-04-06  4:15   ` Fwd: Delivery Status Notification (Failure) Drew Gross
2013-04-06  4:49     ` Jeff King [this message]
2010-01-29 14:17 Implement --password option for git svn perl script Laszlo Papp
     [not found] ` <001636ed7681994278047e4e4a6f@google.com>
2010-01-29 14:18   ` Fwd: Delivery Status Notification (Failure) Laszlo Papp

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20130406044911.GA26544@sigill.intra.peff.net \
    --to=peff@peff.net \
    --cc=drew.a.gross@gmail.com \
    --cc=git@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).