Merge branch 'maint'
authorJunio C Hamano <gitster@pobox.com>
Tue, 11 Nov 2008 22:46:31 +0000 (14:46 -0800)
committerJunio C Hamano <gitster@pobox.com>
Tue, 11 Nov 2008 22:49:50 +0000 (14:49 -0800)
* maint:
Fix non-literal format in printf-style calls
git-submodule: Avoid printing a spurious message.
git ls-remote: make usage string match manpage
Makefile: help people who run 'make check' by mistake

1  2 
Makefile
builtin-remote.c
environment.c
fsck.c
git-submodule.sh
grep.c
refs.c
diff --combined Makefile
index 220de39914c4df3abf394ad052ebb1fd6f62d3f7,186a8efd1b74a0510e67e75a6191206a1a6818c2..920cb4207844648f9a7ae7e74be8b426543ea7e4
+++ b/Makefile
@@@ -124,9 -124,6 +124,9 @@@ all:
  # Define USE_STDEV below if you want git to care about the underlying device
  # change being considered an inode change from the update-index perspective.
  #
 +# Define NO_ST_BLOCKS_IN_STRUCT_STAT if your platform does not have st_blocks
 +# field that counts the on-disk footprint in 512-byte blocks.
 +#
  # Define ASCIIDOC8 if you want to format documentation with AsciiDoc 8
  #
  # Define DOCBOOK_XSL_172 if you want to format man pages with DocBook XSL v1.72.
@@@ -294,8 -291,8 +294,8 @@@ PROGRAMS += git-mktag$
  PROGRAMS += git-mktree$X
  PROGRAMS += git-pack-redundant$X
  PROGRAMS += git-patch-id$X
 -PROGRAMS += git-receive-pack$X
  PROGRAMS += git-send-pack$X
 +PROGRAMS += git-shell$X
  PROGRAMS += git-show-index$X
  PROGRAMS += git-unpack-file$X
  PROGRAMS += git-update-server-info$X
@@@ -346,7 -343,6 +346,7 @@@ LIB_H += cache.
  LIB_H += cache-tree.h
  LIB_H += commit.h
  LIB_H += compat/mingw.h
 +LIB_H += compat/cygwin.h
  LIB_H += csum-file.h
  LIB_H += decorate.h
  LIB_H += delta.h
@@@ -358,8 -354,6 +358,8 @@@ LIB_H += git-compat-util.
  LIB_H += graph.h
  LIB_H += grep.h
  LIB_H += hash.h
 +LIB_H += help.h
 +LIB_H += levenshtein.h
  LIB_H += list-objects.h
  LIB_H += ll-merge.h
  LIB_H += log-tree.h
@@@ -389,7 -383,6 +389,7 @@@ LIB_H += transport.
  LIB_H += tree.h
  LIB_H += tree-walk.h
  LIB_H += unpack-trees.h
 +LIB_H += userdiff.h
  LIB_H += utf8.h
  LIB_H += wt-status.h
  
@@@ -437,7 -430,6 +437,7 @@@ LIB_OBJS += hash.
  LIB_OBJS += help.o
  LIB_OBJS += ident.o
  LIB_OBJS += interpolate.o
 +LIB_OBJS += levenshtein.o
  LIB_OBJS += list-objects.o
  LIB_OBJS += ll-merge.o
  LIB_OBJS += lockfile.o
@@@ -445,7 -437,6 +445,7 @@@ LIB_OBJS += log-tree.
  LIB_OBJS += mailmap.o
  LIB_OBJS += match-trees.o
  LIB_OBJS += merge-file.o
 +LIB_OBJS += merge-recursive.o
  LIB_OBJS += name-hash.o
  LIB_OBJS += object.o
  LIB_OBJS += pack-check.o
@@@ -486,7 -477,6 +486,7 @@@ LIB_OBJS += tree-diff.
  LIB_OBJS += tree.o
  LIB_OBJS += tree-walk.o
  LIB_OBJS += unpack-trees.o
 +LIB_OBJS += userdiff.o
  LIB_OBJS += usage.o
  LIB_OBJS += utf8.o
  LIB_OBJS += walker.o
@@@ -528,7 -518,6 +528,7 @@@ BUILTIN_OBJS += builtin-for-each-ref.
  BUILTIN_OBJS += builtin-fsck.o
  BUILTIN_OBJS += builtin-gc.o
  BUILTIN_OBJS += builtin-grep.o
 +BUILTIN_OBJS += builtin-help.o
  BUILTIN_OBJS += builtin-init-db.o
  BUILTIN_OBJS += builtin-log.o
  BUILTIN_OBJS += builtin-ls-files.o
@@@ -549,7 -538,6 +549,7 @@@ BUILTIN_OBJS += builtin-prune-packed.
  BUILTIN_OBJS += builtin-prune.o
  BUILTIN_OBJS += builtin-push.o
  BUILTIN_OBJS += builtin-read-tree.o
 +BUILTIN_OBJS += builtin-receive-pack.o
  BUILTIN_OBJS += builtin-reflog.o
  BUILTIN_OBJS += builtin-remote.o
  BUILTIN_OBJS += builtin-rerere.o
@@@ -587,11 -575,9 +587,11 @@@ EXTLIBS 
  
  ifeq ($(uname_S),Linux)
        NO_STRLCPY = YesPlease
 +      THREADED_DELTA_SEARCH = YesPlease
  endif
  ifeq ($(uname_S),GNU/kFreeBSD)
        NO_STRLCPY = YesPlease
 +      THREADED_DELTA_SEARCH = YesPlease
  endif
  ifeq ($(uname_S),UnixWare)
        CC = cc
@@@ -640,6 -626,8 +640,6 @@@ ifeq ($(uname_S),Darwin
        endif
        NO_STRLCPY = YesPlease
        NO_MEMMEM = YesPlease
 -      COMPAT_CFLAGS += -Icompat/regex
 -      COMPAT_OBJS += compat/regex/regex.o
  endif
  ifeq ($(uname_S),SunOS)
        NEEDS_SOCKET = YesPlease
@@@ -689,7 -677,8 +689,7 @@@ ifeq ($(uname_S),FreeBSD
        BASIC_CFLAGS += -I/usr/local/include
        BASIC_LDFLAGS += -L/usr/local/lib
        DIR_HAS_BSD_GROUP_SEMANTICS = YesPlease
 -      COMPAT_CFLAGS += -Icompat/regex
 -      COMPAT_OBJS += compat/regex/regex.o
 +      THREADED_DELTA_SEARCH = YesPlease
  endif
  ifeq ($(uname_S),OpenBSD)
        NO_STRCASESTR = YesPlease
        NEEDS_LIBICONV = YesPlease
        BASIC_CFLAGS += -I/usr/local/include
        BASIC_LDFLAGS += -L/usr/local/lib
 +      THREADED_DELTA_SEARCH = YesPlease
  endif
  ifeq ($(uname_S),NetBSD)
        ifeq ($(shell expr "$(uname_R)" : '[01]\.'),2)
                NEEDS_LIBICONV = YesPlease
        endif
        BASIC_CFLAGS += -I/usr/pkg/include
 -      BASIC_LDFLAGS += -L/usr/pkg/lib
 -      ALL_LDFLAGS += -Wl,-rpath,/usr/pkg/lib
 +      BASIC_LDFLAGS += -L/usr/pkg/lib $(CC_LD_DYNPATH)/usr/pkg/lib
 +      THREADED_DELTA_SEARCH = YesPlease
  endif
  ifeq ($(uname_S),AIX)
        NO_STRCASESTR=YesPlease
        INTERNAL_QSORT = UnfortunatelyYes
        NEEDS_LIBICONV=YesPlease
        BASIC_CFLAGS += -D_LARGE_FILES
 -      COMPAT_CFLAGS += -Icompat/regex
 -      COMPAT_OBJS += compat/regex/regex.o
  endif
  ifeq ($(uname_S),GNU)
        # GNU/Hurd
@@@ -745,9 -735,6 +745,9 @@@ ifeq ($(uname_S),HP-UX
        NO_SYS_SELECT_H = YesPlease
        SNPRINTF_RETURNS_BOGUS = YesPlease
  endif
 +ifneq (,$(findstring CYGWIN,$(uname_S)))
 +      COMPAT_OBJS += compat/cygwin.o
 +endif
  ifneq (,$(findstring MINGW,$(uname_S)))
        NO_MMAP = YesPlease
        NO_PREAD = YesPlease
        NO_SVN_TESTS = YesPlease
        NO_PERL_MAKEMAKER = YesPlease
        NO_POSIX_ONLY_PROGRAMS = YesPlease
 +      NO_ST_BLOCKS_IN_STRUCT_STAT = YesPlease
        COMPAT_CFLAGS += -D__USE_MINGW_ACCESS -DNOGDI -Icompat -Icompat/regex -Icompat/fnmatch
        COMPAT_CFLAGS += -DSNPRINTF_SIZE_CORR=1
        COMPAT_CFLAGS += -DSTRIP_EXTENSION=\".exe\"
@@@ -802,14 -788,12 +802,14 @@@ ifeq ($(uname_S),Darwin
        endif
  endif
  
 -ifdef NO_R_TO_GCC_LINKER
 -      # Some gcc does not accept and pass -R to the linker to specify
 -      # the runtime dynamic library path.
 -      CC_LD_DYNPATH = -Wl,-rpath=
 -else
 -      CC_LD_DYNPATH = -R
 +ifndef CC_LD_DYNPATH
 +      ifdef NO_R_TO_GCC_LINKER
 +              # Some gcc does not accept and pass -R to the linker to specify
 +              # the runtime dynamic library path.
 +              CC_LD_DYNPATH = -Wl,-rpath,
 +      else
 +              CC_LD_DYNPATH = -R
 +      endif
  endif
  
  ifdef NO_CURL
@@@ -845,6 -829,7 +845,6 @@@ EXTLIBS += -l
  ifndef NO_POSIX_ONLY_PROGRAMS
        PROGRAMS += git-daemon$X
        PROGRAMS += git-imap-send$X
 -      PROGRAMS += git-shell$X
  endif
  ifndef NO_OPENSSL
        OPENSSL_LIBSSL = -lssl
@@@ -885,9 -870,6 +885,9 @@@ endi
  ifdef NO_D_INO_IN_DIRENT
        BASIC_CFLAGS += -DNO_D_INO_IN_DIRENT
  endif
 +ifdef NO_ST_BLOCKS_IN_STRUCT_STAT
 +      BASIC_CFLAGS += -DNO_ST_BLOCKS_IN_STRUCT_STAT
 +endif
  ifdef NO_C99_FORMAT
        BASIC_CFLAGS += -DNO_C99_FORMAT
  endif
@@@ -1116,7 -1098,7 +1116,7 @@@ git$X: git.o $(BUILTIN_OBJS) $(GITLIBS
        $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ git.o \
                $(BUILTIN_OBJS) $(ALL_LDFLAGS) $(LIBS)
  
 -help.o: help.c common-cmds.h GIT-CFLAGS
 +builtin-help.o: builtin-help.c common-cmds.h GIT-CFLAGS
        $(QUIET_CC)$(CC) -o $*.o -c $(ALL_CFLAGS) \
                '-DGIT_HTML_PATH="$(htmldir_SQ)"' \
                '-DGIT_MAN_PATH="$(mandir_SQ)"' \
@@@ -1243,9 -1225,7 +1243,9 @@@ endi
  git-%$X: %.o $(GITLIBS)
        $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(LIBS)
  
 -git-imap-send$X: imap-send.o $(LIB_FILE)
 +git-imap-send$X: imap-send.o $(GITLIBS)
 +      $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
 +              $(LIBS) $(OPENSSL_LINK) $(OPENSSL_LIBSSL)
  
  http.o http-walker.o http-push.o transport.o: http.h
  
@@@ -1272,12 -1252,6 +1272,12 @@@ $(XDIFF_LIB): $(XDIFF_OBJS
  doc:
        $(MAKE) -C Documentation all
  
 +man:
 +      $(MAKE) -C Documentation man
 +
 +html:
 +      $(MAKE) -C Documentation html
 +
  info:
        $(MAKE) -C Documentation info
  
@@@ -1355,7 -1329,16 +1355,16 @@@ check-sha1:: test-sha1$
        ./test-sha1.sh
  
  check: common-cmds.h
-       for i in *.c; do sparse $(ALL_CFLAGS) $(SPARSE_FLAGS) $$i || exit; done
+       if sparse; \
+       then \
+               for i in *.c; \
+               do \
+                       sparse $(ALL_CFLAGS) $(SPARSE_FLAGS) $$i || exit; \
+               done; \
+       else \
+               echo 2>&1 "Did you mean 'make test'?"; \
+               exit 1; \
+       fi
  
  remove-dashes:
        ./fixup-builtins $(BUILT_INS) $(PROGRAMS) $(SCRIPTS)
@@@ -1405,9 -1388,6 +1414,9 @@@ endi
  install-doc:
        $(MAKE) -C Documentation install
  
 +install-man:
 +      $(MAKE) -C Documentation install-man
 +
  install-html:
        $(MAKE) -C Documentation install-html
  
@@@ -1417,12 -1397,6 +1426,12 @@@ install-info
  quick-install-doc:
        $(MAKE) -C Documentation quick-install
  
 +quick-install-man:
 +      $(MAKE) -C Documentation quick-install-man
 +
 +quick-install-html:
 +      $(MAKE) -C Documentation quick-install-html
 +
  
  
  ### Maintainer's dist rules
diff --combined builtin-remote.c
index e396a3ac9055aa91d0f808abb196fb6ea9a99a29,5af4e643eb9dceccc62a5ce44069e0164bc12311..47deb0a8028760a7195d11b8212904e312a8998c
@@@ -54,7 -54,7 +54,7 @@@ static int add(int argc, const char **a
        struct string_list track = { NULL, 0, 0 };
        const char *master = NULL;
        struct remote *remote;
 -      struct strbuf buf, buf2;
 +      struct strbuf buf = STRBUF_INIT, buf2 = STRBUF_INIT;
        const char *name, *url;
        int i;
  
@@@ -81,6 -81,9 +81,6 @@@
                        remote->fetch_refspec_nr))
                die("remote %s already exists.", name);
  
 -      strbuf_init(&buf, 0);
 -      strbuf_init(&buf2, 0);
 -
        strbuf_addf(&buf2, "refs/heads/test:refs/remotes/%s/test", name);
        if (!valid_fetch_refspec(buf2.buf))
                die("'%s' is not a valid remote name", name);
@@@ -320,7 -323,7 +320,7 @@@ static int add_branch_for_removal(cons
  
        /* make sure that symrefs are deleted */
        if (flags & REF_ISSYMREF)
-               return unlink(git_path(refname));
+               return unlink(git_path("%s", refname));
  
        item = string_list_append(refname, branches->branches);
        item->util = xmalloc(20);
@@@ -349,7 -352,7 +349,7 @@@ static int rm(int argc, const char **ar
                OPT_END()
        };
        struct remote *remote;
 -      struct strbuf buf;
 +      struct strbuf buf = STRBUF_INIT;
        struct known_remotes known_remotes = { NULL, NULL };
        struct string_list branches = { NULL, 0, 0, 1 };
        struct branches_for_remote cb_data = { NULL, &branches, &known_remotes };
        known_remotes.to_delete = remote;
        for_each_remote(add_known_remote, &known_remotes);
  
 -      strbuf_init(&buf, 0);
        strbuf_addf(&buf, "remote.%s", remote->name);
        if (git_config_rename_section(buf.buf, NULL) < 1)
                return error("Could not remove config section '%s'", buf.buf);
@@@ -412,9 -416,10 +412,9 @@@ static void show_list(const char *title
                return;
  
        printf(title, list->nr > 1 ? "es" : "", extra_arg);
 -      printf("\n    ");
 -      for (i = 0; i < list->nr; i++)
 -              printf("%s%s", i ? " " : "", list->items[i].string);
        printf("\n");
 +      for (i = 0; i < list->nr; i++)
 +              printf("    %s\n", list->items[i].string);
  }
  
  static int get_remote_ref_states(const char *name,
@@@ -510,17 -515,17 +510,17 @@@ static int show(int argc, const char **
                show_list("  Tracked remote branch%s", &states.tracked, "");
  
                if (states.remote->push_refspec_nr) {
 -                      printf("  Local branch%s pushed with 'git push'\n   ",
 +                      printf("  Local branch%s pushed with 'git push'\n",
                                states.remote->push_refspec_nr > 1 ?
                                        "es" : "");
                        for (i = 0; i < states.remote->push_refspec_nr; i++) {
                                struct refspec *spec = states.remote->push + i;
 -                              printf(" %s%s%s%s", spec->force ? "+" : "",
 +                              printf("    %s%s%s%s\n",
 +                                     spec->force ? "+" : "",
                                       abbrev_branch(spec->src),
                                       spec->dst ? ":" : "",
                                       spec->dst ? abbrev_branch(spec->dst) : "");
                        }
 -                      printf("\n");
                }
  
                /* NEEDSWORK: free remote */
diff --combined environment.c
index bf93a598d0e2c4aedbc4065a43df0e9750f93a1c,9ebf485a738740fe6ad0ebaa5c5bf4695ee527ef..bb96ac0a71bc5614cd3352902586ff0a70a4eece
@@@ -80,11 -80,6 +80,11 @@@ int is_bare_repository(void
        return is_bare_repository_cfg && !get_git_work_tree();
  }
  
 +int have_git_dir(void)
 +{
 +      return !!git_dir;
 +}
 +
  const char *get_git_dir(void)
  {
        if (!git_dir)
@@@ -118,7 -113,7 +118,7 @@@ const char *get_git_work_tree(void
                        work_tree = git_work_tree_cfg;
                        /* make_absolute_path also normalizes the path */
                        if (work_tree && !is_absolute_path(work_tree))
-                               work_tree = xstrdup(make_absolute_path(git_path(work_tree)));
+                               work_tree = xstrdup(make_absolute_path(git_path("%s", work_tree)));
                } else if (work_tree)
                        work_tree = xstrdup(make_absolute_path(work_tree));
                git_work_tree_initialized = 1;
diff --combined fsck.c
index 0cf5f012bdfa876fae4e15ed9cb94ed304314bf6,ab64c18a2baf5e88de8e98d9d8526ba3a7dfed14..97f76c58155249412d7c59e965b564dfc0f75181
--- 1/fsck.c
--- 2/fsck.c
+++ b/fsck.c
@@@ -307,8 -307,9 +307,8 @@@ int fsck_error_function(struct object *
  {
        va_list ap;
        int len;
 -      struct strbuf sb;
 +      struct strbuf sb = STRBUF_INIT;
  
 -      strbuf_init(&sb, 0);
        strbuf_addf(&sb, "object %s:", obj->sha1?sha1_to_hex(obj->sha1):"(null)");
  
        va_start(ap, fmt);
                        die("this should not happen, your snprintf is broken");
        }
  
-       error(sb.buf);
+       error("%s", sb.buf);
        strbuf_release(&sb);
        return 1;
  }
diff --combined git-submodule.sh
index b63e5c30874bfa382c7d6d0ca1942d116930b62a,97e4d9a1ef9478f54613144e74e9e12314230877..220d94ec0c53c9d6c4535d1e50f5d1cb9dc99689
@@@ -6,10 -6,9 +6,10 @@@
  
  USAGE="[--quiet] [--cached] \
  [add <repo> [-b branch] <path>]|[status|init|update [-i|--init]|summary [-n|--summary-limit <n>] [<commit>]] \
 -[--] [<path>...]"
 +[--] [<path>...]|[foreach <command>]|[sync [--] [<path>...]]"
  OPTIONS_SPEC=
  . git-sh-setup
 +. git-parse-remote
  require_work_tree
  
  command=
@@@ -31,11 -30,12 +31,11 @@@ say(
  # Resolve relative url by appending to parent's url
  resolve_relative_url ()
  {
 -      branch="$(git symbolic-ref HEAD 2>/dev/null)"
 -      remote="$(git config branch.${branch#refs/heads/}.remote)"
 -      remote="${remote:-origin}"
 +      remote=$(get_default_remote)
        remoteurl=$(git config "remote.$remote.url") ||
                die "remote ($remote) does not have a url defined in .git/config"
        url="$1"
 +      remoteurl=${remoteurl%/}
        while test -n "$url"
        do
                case "$url" in
                        break;;
                esac
        done
 -      echo "$remoteurl/$url"
 +      echo "$remoteurl/${url%/}"
 +}
 +
 +#
 +# Get submodule info for registered submodules
 +# $@ = path to limit submodule list
 +#
 +module_list()
 +{
 +      git ls-files --stage -- "$@" | grep '^160000 '
  }
  
  #
@@@ -207,26 -198,6 +207,26 @@@ cmd_add(
        die "Failed to register submodule '$path'"
  }
  
 +#
 +# Execute an arbitrary command sequence in each checked out
 +# submodule
 +#
 +# $@ = command to execute
 +#
 +cmd_foreach()
 +{
 +      module_list |
 +      while read mode sha1 stage path
 +      do
 +              if test -e "$path"/.git
 +              then
 +                      say "Entering '$path'"
 +                      (cd "$path" && eval "$@") ||
 +                      die "Stopping at '$path'; script returned non-zero status."
 +              fi
 +      done
 +}
 +
  #
  # Register submodules in .git/config
  #
@@@ -255,7 -226,7 +255,7 @@@ cmd_init(
                shift
        done
  
 -      git ls-files --stage -- "$@" | grep '^160000 ' |
 +      module_list "$@" |
        while read mode sha1 stage path
        do
                # Skip already registered paths
@@@ -313,7 -284,7 +313,7 @@@ cmd_update(
                esac
        done
  
 -      git ls-files --stage -- "$@" | grep '^160000 ' |
 +      module_list "$@" |
        while read mode sha1 stage path
        do
                name=$(module_name "$path") || exit
                        # Only mention uninitialized submodules when its
                        # path have been specified
                        test "$#" != "0" &&
-                       say "Submodule path '$path' not initialized"
+                       say "Submodule path '$path' not initialized" &&
                        say "Maybe you want to use 'update --init'?"
                        continue
                fi
@@@ -424,7 -395,7 +424,7 @@@ cmd_summary() 
        cd_to_toplevel
        # Get modified modules cared by user
        modules=$(git diff-index $cached --raw $head -- "$@" |
 -              grep -e '^:160000' -e '^:[0-7]* 160000' |
 +              egrep '^:([0-7]* )?160000' |
                while read mod_src mod_dst sha1_src sha1_dst status name
                do
                        # Always show modules deleted or type-changed (blob<->module)
        test -z "$modules" && return
  
        git diff-index $cached --raw $head -- $modules |
 -      grep -e '^:160000' -e '^:[0-7]* 160000' |
 +      egrep '^:([0-7]* )?160000' |
        cut -c2- |
        while read mod_src mod_dst sha1_src sha1_dst status name
        do
@@@ -583,7 -554,7 +583,7 @@@ cmd_status(
                shift
        done
  
 -      git ls-files --stage -- "$@" | grep '^160000 ' |
 +      module_list "$@" |
        while read mode sha1 stage path
        do
                name=$(module_name "$path") || exit
                fi
        done
  }
 +#
 +# Sync remote urls for submodules
 +# This makes the value for remote.$remote.url match the value
 +# specified in .gitmodules.
 +#
 +cmd_sync()
 +{
 +      while test $# -ne 0
 +      do
 +              case "$1" in
 +              -q|--quiet)
 +                      quiet=1
 +                      shift
 +                      ;;
 +              --)
 +                      shift
 +                      break
 +                      ;;
 +              -*)
 +                      usage
 +                      ;;
 +              *)
 +                      break
 +                      ;;
 +              esac
 +      done
 +      cd_to_toplevel
 +      module_list "$@" |
 +      while read mode sha1 stage path
 +      do
 +              name=$(module_name "$path")
 +              url=$(git config -f .gitmodules --get submodule."$name".url)
 +
 +              # Possibly a url relative to parent
 +              case "$url" in
 +              ./*|../*)
 +                      url=$(resolve_relative_url "$url") || exit
 +                      ;;
 +              esac
 +
 +              if test -e "$path"/.git
 +              then
 +              (
 +                      unset GIT_DIR
 +                      cd "$path"
 +                      remote=$(get_default_remote)
 +                      say "Synchronizing submodule url for '$name'"
 +                      git config remote."$remote".url "$url"
 +              )
 +              fi
 +      done
 +}
  
  # This loop parses the command line arguments to find the
  # subcommand name to dispatch.  Parsing of the subcommand specific
  while test $# != 0 && test -z "$command"
  do
        case "$1" in
 -      add | init | update | status | summary)
 +      add | foreach | init | update | status | summary | sync)
                command=$1
                ;;
        -q|--quiet)
diff --combined grep.c
index e2c190a7f66f9e9311f91d9a41b7dc3f295f00fb,13c18ff6529f437e6aea2671ab0003d4fd047ac7..600f69f2fe2a0271f4bdf736f95f70c8f7381aa4
--- 1/grep.c
--- 2/grep.c
+++ b/grep.c
@@@ -239,8 -239,6 +239,8 @@@ static int word_char(char ch
  static void show_line(struct grep_opt *opt, const char *bol, const char *eol,
                      const char *name, unsigned lno, char sign)
  {
 +      if (opt->null_following_name)
 +              sign = '\0';
        if (opt->pathname)
                printf("%s%c", name, sign);
        if (opt->linenum)
        printf("%.*s\n", (int)(eol-bol), bol);
  }
  
 +static void show_name(struct grep_opt *opt, const char *name)
 +{
 +      printf("%s%c", name, opt->null_following_name ? '\0' : '\n');
 +}
 +
  static int fixmatch(const char *pattern, char *line, regmatch_t *match)
  {
        char *hit = strstr(line, pattern);
@@@ -496,7 -489,7 +496,7 @@@ static int grep_buffer_1(struct grep_op
                                return 1;
                        }
                        if (opt->name_only) {
 -                              printf("%s\n", name);
 +                              show_name(opt, name);
                                return 1;
                        }
                        /* Hit at this line.  If we haven't shown the
                                if (from <= last_shown)
                                        from = last_shown + 1;
                                if (last_shown && from != last_shown + 1)
-                                       printf(hunk_mark);
+                                       fputs(hunk_mark, stdout);
                                while (from < lno) {
                                        pcl = &prev[lno-from-1];
                                        show_line(opt, pcl->bol, pcl->eol,
                                last_shown = lno-1;
                        }
                        if (last_shown && lno != last_shown + 1)
-                               printf(hunk_mark);
+                               fputs(hunk_mark, stdout);
                        if (!opt->count)
                                show_line(opt, bol, eol, name, lno, ':');
                        last_shown = last_hit = lno;
                         * we need to show this line.
                         */
                        if (last_shown && lno != last_shown + 1)
-                               printf(hunk_mark);
+                               fputs(hunk_mark, stdout);
                        show_line(opt, bol, eol, name, lno, '-');
                        last_shown = lno;
                }
                return 0;
        if (opt->unmatch_name_only) {
                /* We did not see any hit, so we want to show this */
 -              printf("%s\n", name);
 +              show_name(opt, name);
                return 1;
        }
  
         * make it another option?  For now suppress them.
         */
        if (opt->count && count)
 -              printf("%s:%u\n", name, count);
 +              printf("%s%c%u\n", name,
 +                     opt->null_following_name ? '\0' : ':', count);
        return !!last_hit;
  }
  
diff --combined refs.c
index 42bde72ddbab4a7b338e9072f3c7ab17549cb361,be095cb07d23ca9f0e20d2cc46df33827a123274..33ced65a7801f8653d608a9580e237ce8df39ae2
--- 1/refs.c
--- 2/refs.c
+++ b/refs.c
@@@ -390,18 -390,6 +390,18 @@@ int resolve_gitlink_ref(const char *pat
        return retval;
  }
  
 +/*
 + * If the "reading" argument is set, this function finds out what _object_
 + * the ref points at by "reading" the ref.  The ref, if it is not symbolic,
 + * has to exist, and if it is symbolic, it has to point at an existing ref,
 + * because the "read" goes through the symref to the ref it points at.
 + *
 + * The access that is not "reading" may often be "writing", but does not
 + * have to; it can be merely checking _where it leads to_. If it is a
 + * prelude to "writing" to the ref, a write to a symref that points at
 + * yet-to-be-born ref will create the real ref pointed by the symref.
 + * reading=0 allows the caller to check where such a symref leads to.
 + */
  const char *resolve_ref(const char *ref, unsigned char *sha1, int reading, int *flag)
  {
        int depth = MAXDEPTH;
                        return NULL;
  
                git_snpath(path, sizeof(path), "%s", ref);
 -              /* Special case: non-existing file.
 -               * Not having the refs/heads/new-branch is OK
 -               * if we are writing into it, so is .git/HEAD
 -               * that points at refs/heads/master still to be
 -               * born.  It is NOT OK if we are resolving for
 -               * reading.
 -               */
 +              /* Special case: non-existing file. */
                if (lstat(path, &st) < 0) {
                        struct ref_list *list = get_packed_refs();
                        while (list) {
@@@ -940,7 -934,7 +940,7 @@@ int delete_ref(const char *refname, con
                        lock->lk->filename[i] = 0;
                        path = lock->lk->filename;
                } else {
-                       path = git_path(refname);
+                       path = git_path("%s", refname);
                }
                err = unlink(path);
                if (err && errno != ENOENT) {