Merge branch 'js/mv'
authorJunio C Hamano <junkio@cox.net>
Sun, 30 Jul 2006 20:24:48 +0000 (13:24 -0700)
committerJunio C Hamano <junkio@cox.net>
Sun, 30 Jul 2006 20:24:48 +0000 (13:24 -0700)
* js/mv:
builtin git-mv: support moving directories
Make git-mv a builtin
Extract helper bits from c-merge-recursive work

1  2 
Makefile
git.c
diff --combined Makefile
index 814c5642e70e15b3754e88a5c0818e70260a773f,73733e9025ac40708e70a2daa092744cef138708..e9dce268f86cab1bbfe987acb041c3c05fcc72ea
+++ b/Makefile
@@@ -151,7 -151,7 +151,7 @@@ SCRIPT_PERL = 
        git-archimport.perl git-cvsimport.perl git-relink.perl \
        git-shortlog.perl git-rerere.perl \
        git-annotate.perl git-cvsserver.perl \
-       git-svnimport.perl git-mv.perl git-cvsexportcommit.perl \
+       git-svnimport.perl git-cvsexportcommit.perl \
        git-send-email.perl git-svn.perl
  
  SCRIPT_PYTHON = \
@@@ -192,7 -192,7 +192,7 @@@ BUILT_INS = git-log$X git-whatchanged$
        git-read-tree$X git-commit-tree$X git-write-tree$X \
        git-apply$X git-show-branch$X git-diff-files$X git-update-index$X \
        git-diff-index$X git-diff-stages$X git-diff-tree$X git-cat-file$X \
-       git-fmt-merge-msg$X git-prune$X
+       git-fmt-merge-msg$X git-prune$X git-mv$X
  
  # what 'all' will build and 'install' will install, in gitexecdir
  ALL_PROGRAMS = $(PROGRAMS) $(SIMPLE_PROGRAMS) $(SCRIPTS)
@@@ -221,7 -221,7 +221,7 @@@ LIB_H = 
        blob.h cache.h commit.h csum-file.h delta.h \
        diff.h object.h pack.h pkt-line.h quote.h refs.h \
        run-command.h strbuf.h tag.h tree.h git-compat-util.h revision.h \
-       tree-walk.h log-tree.h dir.h
+       tree-walk.h log-tree.h dir.h path-list.h
  
  DIFF_OBJS = \
        diff.o diff-lib.o diffcore-break.o diffcore-order.o \
@@@ -236,7 -236,7 +236,7 @@@ LIB_OBJS = 
        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 \
        fetch-clone.o revision.o pager.o tree-walk.o xdiff-interface.o \
-       alloc.o merge-file.o $(DIFF_OBJS)
+       alloc.o merge-file.o path-list.o $(DIFF_OBJS)
  
  BUILTIN_OBJS = \
        builtin-log.o builtin-help.o builtin-count.o builtin-diff.o builtin-push.o \
        builtin-apply.o builtin-show-branch.o builtin-diff-files.o \
        builtin-diff-index.o builtin-diff-stages.o builtin-diff-tree.o \
        builtin-cat-file.o builtin-mailsplit.o builtin-stripspace.o \
-       builtin-update-ref.o builtin-fmt-merge-msg.o builtin-prune.o
+       builtin-update-ref.o builtin-fmt-merge-msg.o builtin-prune.o \
+       builtin-mv.o
  
  GITLIBS = $(LIB_FILE) $(XDIFF_LIB)
  LIBS = $(GITLIBS) -lz
@@@ -352,7 -353,6 +353,7 @@@ ifneq (,$(findstring arm,$(uname_M))
        ARM_SHA1 = YesPlease
  endif
  
 +-include config.mak.autogen
  -include config.mak
  
  ifdef WITH_OWN_SUBPROCESS_PY
@@@ -615,8 -615,6 +616,8 @@@ $(SIMPLE_PROGRAMS) : git-%$X : %.
        $(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
                $(LIB_FILE) $(SIMPLE_LIB)
  
 +ssh-pull.o: ssh-fetch.c
 +ssh-push.o: ssh-upload.c
  git-local-fetch$X: fetch.o
  git-ssh-fetch$X: rsh.o fetch.o
  git-ssh-upload$X: rsh.o
@@@ -772,8 -770,6 +773,8 @@@ clean
                $(LIB_FILE) $(XDIFF_LIB)
        rm -f $(ALL_PROGRAMS) $(BUILT_INS) git$X
        rm -f *.spec *.pyc *.pyo */*.pyc */*.pyo common-cmds.h TAGS tags
 +      rm -rf autom4te.cache
 +      rm -f config.log config.mak.autogen configure config.status config.cache
        rm -rf $(GIT_TARNAME) .doc-tmp-dir
        rm -f $(GIT_TARNAME).tar.gz git-core_$(GIT_VERSION)-*.tar.gz
        rm -f $(htmldocs).tar.gz $(manpages).tar.gz
diff --combined git.c
index 885e1ce75b5c085c544c74029d2a32562b4fcaa1,d47e9d8db9503159b5655b22903758a05df3bf64..4ea5efb7a52de0a0cfa210875b52d279114cb1b2
--- 1/git.c
--- 2/git.c
+++ b/git.c
@@@ -35,59 -35,6 +35,59 @@@ static void prepend_to_path(const char 
        setenv("PATH", path, 1);
  }
  
 +static int handle_options(const char*** argv, int* argc)
 +{
 +      int handled = 0;
 +
 +      while (*argc > 0) {
 +              const char *cmd = (*argv)[0];
 +              if (cmd[0] != '-')
 +                      break;
 +
 +              /*
 +               * For legacy reasons, the "version" and "help"
 +               * commands can be written with "--" prepended
 +               * to make them look like flags.
 +               */
 +              if (!strcmp(cmd, "--help") || !strcmp(cmd, "--version"))
 +                      break;
 +
 +              /*
 +               * Check remaining flags.
 +               */
 +              if (!strncmp(cmd, "--exec-path", 11)) {
 +                      cmd += 11;
 +                      if (*cmd == '=')
 +                              git_set_exec_path(cmd + 1);
 +                      else {
 +                              puts(git_exec_path());
 +                              exit(0);
 +                      }
 +              } else if (!strcmp(cmd, "-p") || !strcmp(cmd, "--paginate")) {
 +                      setup_pager();
 +              } else if (!strcmp(cmd, "--git-dir")) {
 +                      if (*argc < 1)
 +                              return -1;
 +                      setenv("GIT_DIR", (*argv)[1], 1);
 +                      (*argv)++;
 +                      (*argc)--;
 +              } else if (!strncmp(cmd, "--git-dir=", 10)) {
 +                      setenv("GIT_DIR", cmd + 10, 1);
 +              } else if (!strcmp(cmd, "--bare")) {
 +                      static char git_dir[1024];
 +                      setenv("GIT_DIR", getcwd(git_dir, 1024), 1);
 +              } else {
 +                      fprintf(stderr, "Unknown option: %s\n", cmd);
 +                      cmd_usage(0, NULL, NULL);
 +              }
 +
 +              (*argv)++;
 +              (*argc)--;
 +              handled++;
 +      }
 +      return handled;
 +}
 +
  static const char *alias_command;
  static char *alias_string = NULL;
  
@@@ -159,7 -106,7 +159,7 @@@ static int handle_alias(int *argcp, con
  
        subdir = setup_git_directory_gently(&nongit);
        if (!nongit) {
 -              int count;
 +              int count, option_count;
                const char** new_argv;
  
                alias_command = (*argv)[0];
                if (alias_string) {
  
                        count = split_cmdline(alias_string, &new_argv);
 +                      option_count = handle_options(&new_argv, &count);
 +                      memmove(new_argv - option_count, new_argv,
 +                                      count * sizeof(char *));
 +                      new_argv -= option_count;
  
                        if (count < 1)
                                die("empty alias for %s", alias_command);
@@@ -259,6 -202,7 +259,7 @@@ static void handle_internal_command(in
                { "update-ref", cmd_update_ref },
                { "fmt-merge-msg", cmd_fmt_merge_msg },
                { "prune", cmd_prune },
+               { "mv", cmd_mv },
        };
        int i;
  
@@@ -325,19 -269,51 +326,19 @@@ int main(int argc, const char **argv, c
                die("cannot handle %s internally", cmd);
        }
  
 -      /* Default command: "help" */
 -      cmd = "help";
 -
        /* Look for flags.. */
 -      while (argc > 1) {
 -              cmd = *++argv;
 -              argc--;
 -
 -              if (!strcmp(cmd, "-p") || !strcmp(cmd, "--paginate")) {
 -                      setup_pager();
 -                      continue;
 -              }
 -
 -              if (strncmp(cmd, "--", 2))
 -                      break;
 -
 -              cmd += 2;
 -
 -              /*
 -               * For legacy reasons, the "version" and "help"
 -               * commands can be written with "--" prepended
 -               * to make them look like flags.
 -               */
 -              if (!strcmp(cmd, "help"))
 -                      break;
 -              if (!strcmp(cmd, "version"))
 -                      break;
 -
 -              /*
 -               * Check remaining flags (which by now must be
 -               * "--exec-path", but maybe we will accept
 -               * other arguments some day)
 -               */
 -              if (!strncmp(cmd, "exec-path", 9)) {
 -                      cmd += 9;
 -                      if (*cmd == '=') {
 -                              git_set_exec_path(cmd + 1);
 -                              continue;
 -                      }
 -                      puts(git_exec_path());
 -                      exit(0);
 -              }
 -              cmd_usage(0, NULL, NULL);
 +      argv++;
 +      argc--;
 +      handle_options(&argv, &argc);
 +      if (argc > 0) {
 +              if (!strncmp(argv[0], "--", 2))
 +                      argv[0] += 2;
 +      } else {
 +              /* Default command: "help" */
 +              argv[0] = "help";
 +              argc = 1;
        }
 -      argv[0] = cmd;
 +      cmd = argv[0];
  
        /*
         * We search for git commands in the following order: