Skip to content

Commit

Permalink
[PATCH] Better error reporting for "git status"
Browse files Browse the repository at this point in the history
Instead of "git status" ignoring (and hiding) potential errors from the
"git-update-index" call, make it exit if it fails, and show the error.

In order to do this, use the "-q" flag (to ignore not-up-to-date files)
and add a new "--unmerged" flag that allows unmerged entries in the index
without any errors.

This also avoids marking the index "changed" if an entry isn't actually
modified, and makes sure that we exit with an understandable error message
if the index is corrupt or unreadable. "read_cache()" no longer returns an
error for the caller to check.

Finally, make die() and usage() exit with recognizable error codes, if we
ever want to check the failure reason in scripts.

Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
  • Loading branch information
Linus Torvalds authored and Junio C Hamano committed Oct 2, 2005
1 parent 455a7f3 commit 5d1a5c0
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 12 deletions.
2 changes: 1 addition & 1 deletion git-status.sh
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ refs/heads/master) ;;
*) echo "# On branch $branch" ;;
esac

git-update-index --refresh >/dev/null 2>&1
git-update-index -q --unmerged --refresh || exit

if GIT_DIR="$GIT_DIR" git-rev-parse --verify HEAD >/dev/null 2>&1
then
Expand Down
14 changes: 9 additions & 5 deletions read-cache.c
Original file line number Diff line number Diff line change
Expand Up @@ -464,11 +464,15 @@ int read_cache(void)

errno = EBUSY;
if (active_cache)
return error("more than one cachefile");
return active_nr;

errno = ENOENT;
fd = open(get_index_file(), O_RDONLY);
if (fd < 0)
return (errno == ENOENT) ? 0 : error("open failed");
if (fd < 0) {
if (errno == ENOENT)
return 0;
die("index file open failed (%s)", strerror(errno));
}

size = 0; // avoid gcc warning
map = MAP_FAILED;
Expand All @@ -480,7 +484,7 @@ int read_cache(void)
}
close(fd);
if (map == MAP_FAILED)
return error("mmap failed");
die("index file mmap failed (%s)", strerror(errno));

hdr = map;
if (verify_hdr(hdr, size) < 0)
Expand All @@ -501,7 +505,7 @@ int read_cache(void)
unmap:
munmap(map, size);
errno = EINVAL;
return error("verify header failed");
die("index file corrupt");
}

#define WRITE_BUFFER_SIZE 8192
Expand Down
16 changes: 12 additions & 4 deletions update-index.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
* like "git-update-index *" and suddenly having all the object
* files be revision controlled.
*/
static int allow_add = 0, allow_remove = 0, allow_replace = 0, not_new = 0, quiet = 0, info_only = 0;
static int allow_add = 0, allow_remove = 0, allow_replace = 0, allow_unmerged = 0, not_new = 0, quiet = 0, info_only = 0;
static int force_remove;

/* Three functions to allow overloaded pointer return; see linux/err.h */
Expand Down Expand Up @@ -135,7 +135,7 @@ static struct cache_entry *refresh_entry(struct cache_entry *ce)

changed = ce_match_stat(ce, &st);
if (!changed)
return ce;
return NULL;

if (ce_modified(ce, &st))
return ERR_PTR(-EINVAL);
Expand All @@ -156,16 +156,20 @@ static int refresh_cache(void)
struct cache_entry *ce, *new;
ce = active_cache[i];
if (ce_stage(ce)) {
printf("%s: needs merge\n", ce->name);
has_errors = 1;
while ((i < active_nr) &&
! strcmp(active_cache[i]->name, ce->name))
i++;
i--;
if (allow_unmerged)
continue;
printf("%s: needs merge\n", ce->name);
has_errors = 1;
continue;
}

new = refresh_entry(ce);
if (!new)
continue;
if (IS_ERR(new)) {
if (not_new && PTR_ERR(new) == -ENOENT)
continue;
Expand Down Expand Up @@ -335,6 +339,10 @@ int main(int argc, const char **argv)
allow_remove = 1;
continue;
}
if (!strcmp(path, "--unmerged")) {
allow_unmerged = 1;
continue;
}
if (!strcmp(path, "--refresh")) {
has_errors |= refresh_cache();
continue;
Expand Down
4 changes: 2 additions & 2 deletions usage.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ static void report(const char *prefix, const char *err, va_list params)
void usage(const char *err)
{
fprintf(stderr, "usage: %s\n", err);
exit(1);
exit(129);
}

void die(const char *err, ...)
Expand All @@ -25,7 +25,7 @@ void die(const char *err, ...)
va_start(params, err);
report("fatal: ", err, params);
va_end(params);
exit(1);
exit(128);
}

int error(const char *err, ...)
Expand Down

0 comments on commit 5d1a5c0

Please sign in to comment.