Skip to content

Commit

Permalink
git-commit.sh: convert run_status to a C builtin
Browse files Browse the repository at this point in the history
This creates a new git-runstatus which should do roughly the same thing
as the run_status function from git-commit.sh. Except for color support,
the main focus has been to keep the output identical, so that it can be
verified as correct and then used as a C platform for other improvements to
the status printing code.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
  • Loading branch information
peff authored and Junio C Hamano committed Sep 8, 2006
1 parent 7c92fe0 commit c91f0d9
Show file tree
Hide file tree
Showing 10 changed files with 349 additions and 100 deletions.
1 change: 1 addition & 0 deletions .gitignore
Expand Up @@ -94,6 +94,7 @@ git-rev-list
git-rev-parse
git-revert
git-rm
git-runstatus
git-send-email
git-send-pack
git-sh-setup
Expand Down
3 changes: 2 additions & 1 deletion Makefile
Expand Up @@ -252,7 +252,7 @@ LIB_OBJS = \
fetch-clone.o revision.o pager.o tree-walk.o xdiff-interface.o \
write_or_die.o trace.o \
alloc.o merge-file.o path-list.o help.o unpack-trees.o $(DIFF_OBJS) \
color.o
color.o wt-status.o

BUILTIN_OBJS = \
builtin-add.o \
Expand Down Expand Up @@ -286,6 +286,7 @@ BUILTIN_OBJS = \
builtin-rev-list.o \
builtin-rev-parse.o \
builtin-rm.o \
builtin-runstatus.o \
builtin-show-branch.o \
builtin-stripspace.o \
builtin-symbolic-ref.o \
Expand Down
34 changes: 34 additions & 0 deletions builtin-runstatus.c
@@ -0,0 +1,34 @@
#include "wt-status.h"
#include "cache.h"

extern int wt_status_use_color;

static const char runstatus_usage[] =
"git-runstatus [--color|--nocolor] [--amend] [--verbose]";

int cmd_runstatus(int argc, const char **argv, const char *prefix)
{
struct wt_status s;
int i;

git_config(git_status_config);
wt_status_prepare(&s);

for (i = 1; i < argc; i++) {
if (!strcmp(argv[i], "--color"))
wt_status_use_color = 1;
else if (!strcmp(argv[i], "--nocolor"))
wt_status_use_color = 0;
else if (!strcmp(argv[i], "--amend")) {
s.amend = 1;
s.reference = "HEAD^1";
}
else if (!strcmp(argv[i], "--verbose"))
s.verbose = 1;
else
usage(runstatus_usage);
}

wt_status_print(&s);
return s.commitable ? 0 : 1;
}
1 change: 1 addition & 0 deletions builtin.h
Expand Up @@ -47,6 +47,7 @@ extern int cmd_repo_config(int argc, const char **argv, const char *prefix);
extern int cmd_rev_list(int argc, const char **argv, const char *prefix);
extern int cmd_rev_parse(int argc, const char **argv, const char *prefix);
extern int cmd_rm(int argc, const char **argv, const char *prefix);
extern int cmd_runstatus(int argc, const char **argv, const char *prefix);
extern int cmd_show_branch(int argc, const char **argv, const char *prefix);
extern int cmd_show(int argc, const char **argv, const char *prefix);
extern int cmd_stripspace(int argc, const char **argv, const char *prefix);
Expand Down
7 changes: 7 additions & 0 deletions dir.c
Expand Up @@ -397,3 +397,10 @@ int read_directory(struct dir_struct *dir, const char *path, const char *base, i
qsort(dir->entries, dir->nr, sizeof(struct dir_entry *), cmp_name);
return dir->nr;
}

int
file_exists(const char *f)
{
struct stat sb;
return stat(f, &sb) == 0;
}
1 change: 1 addition & 0 deletions dir.h
Expand Up @@ -47,5 +47,6 @@ extern int excluded(struct dir_struct *, const char *);
extern void add_excludes_from_file(struct dir_struct *, const char *fname);
extern void add_exclude(const char *string, const char *base,
int baselen, struct exclude_list *which);
extern int file_exists(const char *);

#endif
106 changes: 7 additions & 99 deletions git-commit.sh
Expand Up @@ -60,26 +60,6 @@ report () {
}

run_status () {
(
# We always show status for the whole tree.
cd "$TOP"

IS_INITIAL="$initial_commit"
REFERENCE=HEAD
case "$amend" in
t)
# If we are amending the initial commit, there
# is no HEAD^1.
if git-rev-parse --verify "HEAD^1" >/dev/null 2>&1
then
REFERENCE="HEAD^1"
IS_INITIAL=
else
IS_INITIAL=t
fi
;;
esac

# If TMP_INDEX is defined, that means we are doing
# "--only" partial commit, and that index file is used
# to build the tree for the commit. Otherwise, if
Expand All @@ -96,85 +76,13 @@ run_status () {
export GIT_INDEX_FILE
fi

case "$branch" in
refs/heads/master) ;;
*) echo "# On branch $branch" ;;
esac

if test -z "$IS_INITIAL"
then
git-diff-index -M --cached --name-status \
--diff-filter=MDTCRA $REFERENCE |
sed -e '
s/\\/\\\\/g
s/ /\\ /g
' |
report "Updated but not checked in" "will commit"
committable="$?"
else
echo '#
# Initial commit
#'
git-ls-files |
sed -e '
s/\\/\\\\/g
s/ /\\ /g
s/^/A /
' |
report "Updated but not checked in" "will commit"

committable="$?"
fi

git-diff-files --name-status |
sed -e '
s/\\/\\\\/g
s/ /\\ /g
' |
report "Changed but not updated" \
"use git-update-index to mark for commit"

option=""
if test -z "$untracked_files"; then
option="--directory --no-empty-directory"
fi
hdr_shown=
if test -f "$GIT_DIR/info/exclude"
then
git-ls-files --others $option \
--exclude-from="$GIT_DIR/info/exclude" \
--exclude-per-directory=.gitignore
else
git-ls-files --others $option \
--exclude-per-directory=.gitignore
fi |
while read line; do
if [ -z "$hdr_shown" ]; then
echo '#'
echo '# Untracked files:'
echo '# (use "git add" to add to commit)'
echo '#'
hdr_shown=1
fi
echo "# $line"
done

if test -n "$verbose" -a -z "$IS_INITIAL"
then
git-diff-index --cached -M -p --diff-filter=MDTCRA $REFERENCE
fi
case "$committable" in
0)
case "$amend" in
t)
echo "# No changes" ;;
*)
echo "nothing to commit" ;;
esac
exit 1 ;;
esac
exit 0
)
case "$status_only" in
t) color= ;;
*) color=--nocolor ;;
esac
git-runstatus ${color} \
${verbose:+--verbose} \
${amend:+--amend}
}

trap '
Expand Down
1 change: 1 addition & 0 deletions git.c
Expand Up @@ -252,6 +252,7 @@ static void handle_internal_command(int argc, const char **argv, char **envp)
{ "rev-list", cmd_rev_list, RUN_SETUP },
{ "rev-parse", cmd_rev_parse, RUN_SETUP },
{ "rm", cmd_rm, RUN_SETUP },
{ "runstatus", cmd_runstatus, RUN_SETUP },
{ "show-branch", cmd_show_branch, RUN_SETUP },
{ "show", cmd_show, RUN_SETUP | USE_PAGER },
{ "stripspace", cmd_stripspace },
Expand Down

0 comments on commit c91f0d9

Please sign in to comment.