1. 05 8月, 2015 2 次提交
    • P
      builtin-am: implement patch queue mechanism · 8c3bd9e2
      Paul Tan 提交于
      git-am applies a series of patches. If the process terminates
      abnormally, we want to be able to resume applying the series of patches.
      This requires the session state to be saved in a persistent location.
      
      Implement the mechanism of a "patch queue", represented by 2 integers --
      the index of the current patch we are applying and the index of the last
      patch, as well as its lifecycle through the following functions:
      
      * am_setup(), which will set up the state directory
        $GIT_DIR/rebase-apply. As such, even if the process exits abnormally,
        the last-known state will still persist.
      
      * am_load(), which is called if there is an am session in
        progress, to load the last known state from the state directory so we
        can resume applying patches.
      
      * am_run(), which will do the actual patch application. After applying a
        patch, it calls am_next() to increment the current patch index. The
        logic for applying and committing a patch is not implemented yet.
      
      * am_destroy(), which is finally called when we successfully applied all
        the patches in the queue, to clean up by removing the state directory
        and its contents.
      Helped-by: NJunio C Hamano <gitster@pobox.com>
      Helped-by: NStefan Beller <sbeller@google.com>
      Helped-by: NJohannes Schindelin <johannes.schindelin@gmx.de>
      Signed-off-by: NPaul Tan <pyokagan@gmail.com>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      8c3bd9e2
    • P
      builtin-am: implement skeletal builtin am · 73c2779f
      Paul Tan 提交于
      For the purpose of rewriting git-am.sh into a C builtin, implement a
      skeletal builtin/am.c that redirects to $GIT_EXEC_PATH/git-am if the
      environment variable _GIT_USE_BUILTIN_AM is not defined. Since in the
      Makefile git-am.sh takes precedence over builtin/am.c,
      $GIT_EXEC_PATH/git-am will contain the shell script git-am.sh, and thus
      this allows us to fall back on the functional git-am.sh when running the
      test suite for tests that depend on a working git-am implementation.
      
      Since git-am.sh cannot handle any environment modifications by
      setup_git_directory(), "am" is declared with no setup flags in git.c. On
      the other hand, to re-implement git-am.sh in builtin/am.c, we need to
      run all the git dir and work tree setup logic that git.c typically does
      for us. As such, we work around this temporarily by copying the logic in
      git.c's run_builtin(), which is roughly:
      
      	prefix = setup_git_directory();
      	trace_repo_setup(prefix);
      	setup_work_tree();
      
      This redirection should be removed when all the features of git-am.sh
      have been re-implemented in builtin/am.c.
      Helped-by: NJunio C Hamano <gitster@pobox.com>
      Signed-off-by: NPaul Tan <pyokagan@gmail.com>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      73c2779f