Skip to content

Commit

Permalink
revert: actually check for a dirty index
Browse files Browse the repository at this point in the history
The previous code mistakenly used wt_status_prepare to check whether the
index had anything commitable in it; however, that function is just an
init function, and will never report a dirty index.

The correct way with wt_status_* would be to call wt_status_print with the
output pointing to /dev/null or similar. However, that does extra work by
both examining the working tree and spewing status information to nowhere.

Instead, let's just implement the useful subset of wt_status_print as an
"is_index_dirty" function.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Jeff King authored and Junio C Hamano committed Mar 3, 2008
1 parent 90d0ed9 commit 0f2d447
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 4 deletions.
20 changes: 16 additions & 4 deletions builtin-revert.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
#include "exec_cmd.h"
#include "utf8.h"
#include "parse-options.h"
#include "diff.h"
#include "revision.h"

/*
* This implements the builtins revert and cherry-pick.
Expand Down Expand Up @@ -245,6 +247,17 @@ static char *help_msg(const unsigned char *sha1)
return helpbuf;
}

static int index_is_dirty(void)
{
struct rev_info rev;
init_revisions(&rev, NULL);
setup_revisions(0, NULL, &rev, "HEAD");
DIFF_OPT_SET(&rev.diffopt, QUIET);
DIFF_OPT_SET(&rev.diffopt, EXIT_WITH_STATUS);
run_diff_index(&rev, 1);
return !!DIFF_OPT_TST(&rev.diffopt, HAS_CHANGES);
}

static int revert_or_cherry_pick(int argc, const char **argv)
{
unsigned char head[20];
Expand Down Expand Up @@ -273,12 +286,11 @@ static int revert_or_cherry_pick(int argc, const char **argv)
if (write_tree(head, 0, NULL))
die ("Your index file is unmerged.");
} else {
struct wt_status s;

if (get_sha1("HEAD", head))
die ("You do not have a valid HEAD");
wt_status_prepare(&s);
if (s.commitable)
if (read_cache() < 0)
die("could not read the index");
if (index_is_dirty())
die ("Dirty index: cannot %s", me);
discard_cache();
}
Expand Down
9 changes: 9 additions & 0 deletions t/t3501-revert-cherry-pick.sh
Original file line number Diff line number Diff line change
Expand Up @@ -59,4 +59,13 @@ test_expect_success 'revert after renaming branch' '
'

test_expect_success 'revert forbidden on dirty working tree' '
echo content >extra_file &&
git add extra_file &&
test_must_fail git revert HEAD 2>errors &&
grep "Dirty index" errors
'

test_done

0 comments on commit 0f2d447

Please sign in to comment.