Merge branch 'js/remote'
authorJunio C Hamano <gitster@pobox.com>
Wed, 12 Mar 2008 05:33:51 +0000 (22:33 -0700)
committerJunio C Hamano <gitster@pobox.com>
Wed, 12 Mar 2008 05:33:51 +0000 (22:33 -0700)
* js/remote:
  "remote update": print remote name being fetched from
  builtin remote rm: remove symbolic refs, too
  remote: fix "update [group...]"
  remote show: Clean up connection correctly if object fetch wasn't done
  builtin-remote: prune remotes correctly that were added with --mirror
  Make git-remote a builtin
  Test "git remote show" and "git remote prune"
  parseopt: add flag to stop on first non option
  path-list: add functions to work with unsorted lists

Conflicts:

parse-options.c

1  2 
Makefile
contrib/examples/git-remote.perl
parse-options.c
parse-options.h

diff --combined Makefile
+++ b/Makefile
@@@ -3,10 -3,6 +3,10 @@@ all:
  
  # Define V=1 to have a more verbose compile.
  #
 +# Define SNPRINTF_RETURNS_BOGUS if your are on a system which snprintf()
 +# or vsnprintf() return -1 instead of number of characters which would
 +# have been written to the final string if enough space had been available.
 +#
  # Define FREAD_READS_DIRECTORIES if your are on a system which succeeds
  # when attempting to read from an fopen'ed directory.
  #
@@@ -247,7 -243,7 +247,7 @@@ SCRIPT_SH = 
  SCRIPT_PERL = \
        git-add--interactive.perl \
        git-archimport.perl git-cvsimport.perl git-relink.perl \
-       git-cvsserver.perl git-remote.perl git-cvsexportcommit.perl \
+       git-cvsserver.perl git-cvsexportcommit.perl \
        git-send-email.perl git-svn.perl
  
  SCRIPTS = $(patsubst %.sh,%,$(SCRIPT_SH)) \
@@@ -308,8 -304,7 +308,8 @@@ LIB_H = 
        run-command.h strbuf.h tag.h tree.h git-compat-util.h revision.h \
        tree-walk.h log-tree.h dir.h path-list.h unpack-trees.h builtin.h \
        utf8.h reflog-walk.h patch-ids.h attr.h decorate.h progress.h \
 -      mailmap.h remote.h parse-options.h transport.h diffcore.h hash.h
 +      mailmap.h remote.h parse-options.h transport.h diffcore.h hash.h ll-merge.h fsck.h \
 +      pack-revindex.h
  
  DIFF_OBJS = \
        diff.o diff-lib.o diffcore-break.o diffcore-order.o \
@@@ -324,7 -319,7 +324,7 @@@ LIB_OBJS = 
        patch-ids.o \
        object.o pack-check.o pack-write.o patch-delta.o path.o pkt-line.o \
        sideband.o reachable.o reflog-walk.o \
 -      quote.o read-cache.o refs.o run-command.o dir.o object-refs.o \
 +      quote.o read-cache.o refs.o run-command.o dir.o \
        server-info.o setup.o sha1_file.o sha1_name.o strbuf.o \
        tag.o tree.o usage.o config.o environment.o ctype.o copy.o \
        revision.o pager.o tree-walk.o xdiff-interface.o \
        color.o wt-status.o archive-zip.o archive-tar.o shallow.o utf8.o \
        convert.o attr.o decorate.o progress.o mailmap.o symlinks.o remote.o \
        transport.o bundle.o walker.o parse-options.o ws.o archive.o branch.o \
 -      alias.o
 +      ll-merge.o alias.o fsck.o pack-revindex.o
  
  BUILTIN_OBJS = \
        builtin-add.o \
        builtin-push.o \
        builtin-read-tree.o \
        builtin-reflog.o \
+       builtin-remote.o \
        builtin-send-pack.o \
        builtin-config.o \
        builtin-rerere.o \
@@@ -482,7 -478,6 +483,7 @@@ ifeq ($(uname_S),FreeBSD
        NO_MEMMEM = YesPlease
        BASIC_CFLAGS += -I/usr/local/include
        BASIC_LDFLAGS += -L/usr/local/lib
 +      DIR_HAS_BSD_GROUP_SEMANTICS = YesPlease
  endif
  ifeq ($(uname_S),OpenBSD)
        NO_STRCASESTR = YesPlease
@@@ -634,10 -629,6 +635,10 @@@ endi
  ifdef NO_C99_FORMAT
        BASIC_CFLAGS += -DNO_C99_FORMAT
  endif
 +ifdef SNPRINTF_RETURNS_BOGUS
 +      COMPAT_CFLAGS += -DSNPRINTF_RETURNS_BOGUS
 +      COMPAT_OBJS += compat/snprintf.o
 +endif
  ifdef FREAD_READS_DIRECTORIES
        COMPAT_CFLAGS += -DFREAD_READS_DIRECTORIES
        COMPAT_OBJS += compat/fopen.o
@@@ -756,9 -747,6 +757,9 @@@ ifdef THREADED_DELTA_SEARC
        EXTLIBS += -lpthread
        LIB_OBJS += thread-utils.o
  endif
 +ifdef DIR_HAS_BSD_GROUP_SEMANTICS
 +      COMPAT_CFLAGS += -DDIR_HAS_BSD_GROUP_SEMANTICS
 +endif
  
  ifeq ($(TCLTK_PATH),)
  NO_TCLTK=NoThanks
@@@ -825,7 -813,7 +826,7 @@@ export TAR INSTALL DESTDIR SHELL_PAT
  
  ### Build rules
  
 -all:: $(ALL_PROGRAMS) $(BUILT_INS) $(OTHER_PROGRAMS)
 +all:: $(ALL_PROGRAMS) $(BUILT_INS) $(OTHER_PROGRAMS) GIT-BUILD-OPTIONS
  ifneq (,$X)
        $(foreach p,$(patsubst %$X,%,$(filter %$X,$(ALL_PROGRAMS) $(BUILT_INS) git$X)), $(RM) '$p';)
  endif
@@@ -1024,9 -1012,6 +1025,9 @@@ GIT-CFLAGS: .FORCE-GIT-CFLAG
                echo "$$FLAGS" >GIT-CFLAGS; \
              fi
  
 +GIT-BUILD-OPTIONS: .FORCE-GIT-BUILD-OPTIONS
 +      @echo SHELL_PATH=\''$(SHELL_PATH_SQ)'\' >$@
 +
  ### Detect Tck/Tk interpreter path changes
  ifndef NO_TCLTK
  TRACK_VARS = $(subst ','\'',-DTCLTK_PATH='$(TCLTK_PATH_SQ)')
@@@ -1182,11 -1167,10 +1183,11 @@@ ifndef NO_TCLT
        $(MAKE) -C gitk-git clean
        $(MAKE) -C git-gui clean
  endif
 -      $(RM) GIT-VERSION-FILE GIT-CFLAGS GIT-GUI-VARS
 +      $(RM) GIT-VERSION-FILE GIT-CFLAGS GIT-GUI-VARS GIT-BUILD-OPTIONS
  
  .PHONY: all install clean strip
  .PHONY: .FORCE-GIT-VERSION-FILE TAGS tags cscope .FORCE-GIT-CFLAGS
 +.PHONY: .FORCE-GIT-BUILD-OPTIONS
  
  ### Check documentation
  #
@@@ -7,10 -7,10 +7,10 @@@ my $git = Git->repository()
  sub add_remote_config {
        my ($hash, $name, $what, $value) = @_;
        if ($what eq 'url') {
 -              if (exists $hash->{$name}{'URL'}) {
 -                      print STDERR "Warning: more than one remote.$name.url\n";
 +              # Having more than one is Ok -- it is used for push.
 +              if (! exists $hash->{'URL'}) {
 +                      $hash->{$name}{'URL'} = $value;
                }
 -              $hash->{$name}{'URL'} = $value;
        }
        elsif ($what eq 'fetch') {
                $hash->{$name}{'FETCH'} ||= [];
diff --combined parse-options.c
@@@ -6,8 -6,7 +6,8 @@@
  
  struct optparse_t {
        const char **argv;
 -      int argc;
 +      const char **out;
 +      int argc, cpidx;
        const char *opt;
  };
  
@@@ -160,16 -159,6 +160,16 @@@ static int parse_long_opt(struct optpar
                        continue;
  
                rest = skip_prefix(arg, options->long_name);
 +              if (options->type == OPTION_ARGUMENT) {
 +                      if (!rest)
 +                              continue;
 +                      if (*rest == '=')
 +                              return opterror(options, "takes no value", flags);
 +                      if (*rest)
 +                              continue;
 +                      p->out[p->cpidx++] = arg - 2;
 +                      return 0;
 +              }
                if (!rest) {
                        /* abbreviated? */
                        if (!strncmp(options->long_name, arg, arg_end - arg)) {
@@@ -253,13 -242,16 +253,15 @@@ static NORETURN void usage_with_options
  int parse_options(int argc, const char **argv, const struct option *options,
                    const char * const usagestr[], int flags)
  {
 -      struct optparse_t args = { argv + 1, argc - 1, NULL };
 -      int j = 0;
 +      struct optparse_t args = { argv + 1, argv, argc - 1, 0, NULL };
  
        for (; args.argc; args.argc--, args.argv++) {
                const char *arg = args.argv[0];
  
                if (*arg != '-' || !arg[1]) {
 -                      argv[j++] = args.argv[0];
+                       if (flags & PARSE_OPT_STOP_AT_NON_OPTION)
+                               break;
 +                      args.out[args.cpidx++] = args.argv[0];
                        continue;
                }
  
                        usage_with_options(usagestr, options);
        }
  
 -      memmove(argv + j, args.argv, args.argc * sizeof(*argv));
 -      argv[j + args.argc] = NULL;
 -      return j + args.argc;
 +      memmove(args.out + args.cpidx, args.argv, args.argc * sizeof(*args.out));
 +      args.out[args.cpidx + args.argc] = NULL;
 +      return args.cpidx + args.argc;
  }
  
  #define USAGE_OPTS_WIDTH 24
@@@ -338,8 -330,6 +340,8 @@@ void usage_with_options_internal(const 
                        pos += fprintf(stderr, "--%s", opts->long_name);
  
                switch (opts->type) {
 +              case OPTION_ARGUMENT:
 +                      break;
                case OPTION_INTEGER:
                        if (opts->flags & PARSE_OPT_OPTARG)
                                pos += fprintf(stderr, " [<n>]");
diff --combined parse-options.h
@@@ -4,7 -4,6 +4,7 @@@
  enum parse_opt_type {
        /* special types */
        OPTION_END,
 +      OPTION_ARGUMENT,
        OPTION_GROUP,
        /* options with no arguments */
        OPTION_BIT,
@@@ -19,6 -18,7 +19,7 @@@
  
  enum parse_opt_flags {
        PARSE_OPT_KEEP_DASHDASH = 1,
+       PARSE_OPT_STOP_AT_NON_OPTION = 2,
  };
  
  enum parse_opt_option_flags {
@@@ -85,7 -85,6 +86,7 @@@ struct option 
  };
  
  #define OPT_END()                   { OPTION_END }
 +#define OPT_ARGUMENT(l, h)          { OPTION_ARGUMENT, 0, (l), NULL, NULL, (h) }
  #define OPT_GROUP(h)                { OPTION_GROUP, 0, NULL, NULL, NULL, (h) }
  #define OPT_BIT(s, l, v, h, b)      { OPTION_BIT, (s), (l), (v), NULL, (h), 0, NULL, (b) }
  #define OPT_BOOLEAN(s, l, v, h)     { OPTION_BOOLEAN, (s), (l), (v), NULL, (h) }