diff --git a/cache.h b/cache.h index a5fc23235e..dbca69ddfb 100644 --- a/cache.h +++ b/cache.h @@ -432,6 +432,7 @@ extern char *git_log_output_encoding; extern int copy_fd(int ifd, int ofd); extern void read_or_die(int fd, void *buf, size_t count); +extern int write_in_full(int fd, const void *buf, size_t count, const char *); extern void write_or_die(int fd, const void *buf, size_t count); extern int write_or_whine(int fd, const void *buf, size_t count, const char *msg); diff --git a/fetch-pack.c b/fetch-pack.c index c527bf9e96..1530a94794 100644 --- a/fetch-pack.c +++ b/fetch-pack.c @@ -625,6 +625,8 @@ static int remove_duplicates(int nr_heads, char **heads) return dst; } +static struct lock_file lock; + int main(int argc, char **argv) { int i, ret, nr_heads; @@ -632,7 +634,6 @@ int main(int argc, char **argv) int fd[2]; pid_t pid; struct stat st; - struct lock_file lock; setup_git_directory(); diff --git a/git-commit.sh b/git-commit.sh index 6bce41af4d..04aad5e5da 100755 --- a/git-commit.sh +++ b/git-commit.sh @@ -8,7 +8,6 @@ SUBDIRECTORY_OK=Yes . git-sh-setup git-rev-parse --verify HEAD >/dev/null 2>&1 || initial_commit=t -branch=$(GIT_DIR="$GIT_DIR" git-symbolic-ref HEAD) case "$0" in *status) diff --git a/git-instaweb.sh b/git-instaweb.sh index 16cd351f7f..08362f43c0 100755 --- a/git-instaweb.sh +++ b/git-instaweb.sh @@ -160,10 +160,20 @@ apache2_conf () { test "$local" = true && bind='127.0.0.1:' echo 'text/css css' > $fqgitdir/mime.types cat > "$conf" <> "$conf" + fi + done + cat >> "$conf" <old_sha1), 40); buf[0] = '^'; buf[41] = '\n'; - write(pipe_fd[1], buf, 42); + if (!write_in_full(pipe_fd[1], buf, 42, + "send-pack: send refs")) + break; } if (!is_null_sha1(refs->new_sha1)) { memcpy(buf, sha1_to_hex(refs->new_sha1), 40); buf[40] = '\n'; - write(pipe_fd[1], buf, 41); + if (!write_in_full(pipe_fd[1], buf, 41, + "send-pack: send refs")) + break; } refs = refs->next; } diff --git a/write_or_die.c b/write_or_die.c index 8cf6486025..6db1d3123d 100644 --- a/write_or_die.c +++ b/write_or_die.c @@ -59,3 +59,26 @@ int write_or_whine(int fd, const void *buf, size_t count, const char *msg) return 1; } + +int write_in_full(int fd, const void *buf, size_t count, const char *msg) +{ + const char *p = buf; + ssize_t written; + + while (count > 0) { + written = xwrite(fd, p, count); + if (written == 0) { + fprintf(stderr, "%s: disk full?\n", msg); + return 0; + } + else if (written < 0) { + fprintf(stderr, "%s: write error (%s)\n", + msg, strerror(errno)); + return 0; + } + count -= written; + p += written; + } + + return 1; +} diff --git a/wt-status.c b/wt-status.c index db427384ff..9b777a569e 100644 --- a/wt-status.c +++ b/wt-status.c @@ -15,7 +15,7 @@ static char wt_status_colors[][COLOR_MAXLEN] = { "\033[31m", /* WT_STATUS_CHANGED: red */ "\033[31m", /* WT_STATUS_UNTRACKED: red */ }; -static const char* use_add_msg = "use \"git add file1 file2\" to include for commit"; +static const char* use_add_msg = "use \"git add ...\" to incrementally add content to commit"; static int parse_status_slot(const char *var, int offset) { @@ -41,8 +41,6 @@ void wt_status_prepare(struct wt_status *s) unsigned char sha1[20]; const char *head; - s->is_initial = get_sha1("HEAD", sha1) ? 1 : 0; - head = resolve_ref("HEAD", sha1, 0, NULL); s->branch = head ? xstrdup(head) : NULL; @@ -51,6 +49,8 @@ void wt_status_prepare(struct wt_status *s) s->verbose = 0; s->commitable = 0; s->untracked = 0; + + s->workdir_clean = 1; } static void wt_status_print_header(const char *main, const char *sub) @@ -162,9 +162,12 @@ static void wt_status_print_changed_cb(struct diff_queue_struct *q, struct diff_options *options, void *data) { + struct wt_status *s = data; int i; - if (q->nr) + if (q->nr) { + s->workdir_clean = 0; wt_status_print_header("Changed but not added", use_add_msg); + } for (i = 0; i < q->nr; i++) wt_status_print_filepair(WT_STATUS_CHANGED, q->queue[i]); if (q->nr) @@ -215,7 +218,7 @@ static void wt_status_print_changed(struct wt_status *s) run_diff_files(&rev, 0); } -static void wt_status_print_untracked(const struct wt_status *s) +static void wt_status_print_untracked(struct wt_status *s) { struct dir_struct dir; const char *x; @@ -250,6 +253,7 @@ static void wt_status_print_untracked(const struct wt_status *s) continue; } if (!shown_header) { + s->workdir_clean = 0; wt_status_print_header("Untracked files", use_add_msg); shown_header = 1; } @@ -271,6 +275,9 @@ static void wt_status_print_verbose(struct wt_status *s) void wt_status_print(struct wt_status *s) { + unsigned char sha1[20]; + s->is_initial = get_sha1(s->reference, sha1) ? 1 : 0; + if (s->branch) color_printf_ln(color(WT_STATUS_HEADER), "# On branch %s", s->branch); @@ -291,10 +298,16 @@ void wt_status_print(struct wt_status *s) if (s->verbose && !s->is_initial) wt_status_print_verbose(s); - if (!s->commitable) - printf("%s (%s)\n", - s->amend ? "# No changes" : "nothing to commit", - use_add_msg); + if (!s->commitable) { + if (s->amend) + printf("# No changes\n"); + else if (s->workdir_clean) + printf(s->is_initial + ? "nothing to commit\n" + : "nothing to commit (working directory matches HEAD)\n"); + else + printf("no changes added to commit (use \"git add\" and/or \"git commit [-a|-i|-o]\")\n"); + } } int git_status_config(const char *k, const char *v) diff --git a/wt-status.h b/wt-status.h index 0a5a5b7ba9..892a86c76a 100644 --- a/wt-status.h +++ b/wt-status.h @@ -16,6 +16,7 @@ struct wt_status { int verbose; int amend; int untracked; + int workdir_clean; }; int git_status_config(const char *var, const char *value);