From: Linus Torvalds Date: Mon, 30 May 2005 19:51:00 +0000 (-0700) Subject: Add "commit" helper script X-Git-Tag: v0.99~411 X-Git-Url: https://git.verplant.org/?a=commitdiff_plain;h=a3e870f2e2bcacc80d5b81d7b77c15a7928a9082;p=git.git Add "commit" helper script This is meant to make raw git not hugely less usable than something like raw CVS. I want to make a 1.0 release of the plumbing, and the actual commit part was just too intimidating. --- diff --git a/Makefile b/Makefile index db14b8fa..ba75d673 100644 --- a/Makefile +++ b/Makefile @@ -22,7 +22,7 @@ INSTALL=install SCRIPTS=git-apply-patch-script git-merge-one-file-script git-prune-script \ git-pull-script git-tag-script git-resolve-script git-whatchanged \ - git-deltafy-script git-fetch-script + git-deltafy-script git-fetch-script git-status-script git-commit-script PROG= git-update-cache git-diff-files git-init-db git-write-tree \ git-read-tree git-commit-tree git-cat-file git-fsck-cache \ @@ -31,7 +31,7 @@ PROG= git-update-cache git-diff-files git-init-db git-write-tree \ git-unpack-file git-export git-diff-cache git-convert-cache \ git-http-pull git-rpush git-rpull git-rev-list git-mktag \ git-diff-helper git-tar-tree git-local-pull git-write-blob \ - git-get-tar-commit-id git-mkdelta git-apply + git-get-tar-commit-id git-mkdelta git-apply git-stripspace all: $(PROG) @@ -112,6 +112,7 @@ git-diff-helper: diff-helper.c git-tar-tree: tar-tree.c git-write-blob: write-blob.c git-mkdelta: mkdelta.c +git-stripspace: stripspace.c git-http-pull: LIBS += -lcurl diff --git a/git-commit-script b/git-commit-script new file mode 100755 index 00000000..f8d568ce --- /dev/null +++ b/git-commit-script @@ -0,0 +1,15 @@ +#!/bin/sh +git-status-script > .editmsg +if [ "$?" != "0" ] +then + cat .editmsg + exit 1 +fi +ED=${VISUAL:$EDITOR} +ED=${ED:vi} +$ED .editmsg +grep -v '^#' < .editmsg | git-stripspace > .cmitmsg +[ -s .cmitmsg ] || exit 1 +tree=$(git-write-tree) || exit 1 +commit=$(cat .cmitmsg | git-commit-tree $tree -p HEAD) || exit 1 +echo $commit > .git/HEAD diff --git a/git-status-script b/git-status-script new file mode 100755 index 00000000..72a93f74 --- /dev/null +++ b/git-status-script @@ -0,0 +1,38 @@ +#!/bin/sh +report () { + header="# +# $1: +# ($2) +# +" + trailer="" + while read oldmode mode oldsha sha status name newname + do + echo -n "$header" + header="" + trailer="# +" + case "$status" in + M) echo "# modified: $name";; + D) echo "# deleted: $name";; + T) echo "# typechange: $name";; + C) echo "# copied: $name -> $newname";; + R) echo "# renamed: $name -> $newname";; + N) echo "# new file: $name";; + U) echo "# unmerged: $name";; + esac + done + echo -n "$trailer" + [ "$header" ] +} + +git-update-cache --refresh >& /dev/null +git-diff-cache -B -C --cached HEAD | sed 's/^://' | report "Updated but not checked in" "will commit" +committable="$?" +git-diff-files | sed 's/^://' | report "Changed but not updated" "use git-update-cache to mark for commit" +if [ "$committable" == "0" ] +then + echo "nothing to commit" + exit 1 +fi +exit 0 diff --git a/stripspace.c b/stripspace.c new file mode 100644 index 00000000..96cd0a88 --- /dev/null +++ b/stripspace.c @@ -0,0 +1,48 @@ +#include +#include +#include + +/* + * Remove empty lines from the beginning and end. + * + * Turn multiple consecutive empty lines into just one + * empty line. + */ +static void cleanup(char *line) +{ + int len = strlen(line); + + if (len > 1 && line[len-1] == '\n') { + do { + unsigned char c = line[len-2]; + if (!isspace(c)) + break; + line[len-2] = '\n'; + len--; + line[len] = 0; + } while (len > 1); + } +} + +int main(int argc, char **argv) +{ + int empties = -1; + char line[1024]; + + while (fgets(line, sizeof(line), stdin)) { + cleanup(line); + + /* Not just an empty line? */ + if (line[0] != '\n') { + if (empties > 0) + putchar('\n'); + empties = 0; + fputs(line, stdout); + continue; + } + if (empties < 0) + continue; + empties++; + } + return 0; +}