1. 14 7月, 2014 11 次提交
    • K
      git: add performance tracing for git's main() function to debug scripts · 578da039
      Karsten Blees 提交于
      Use trace_performance to measure and print execution time and command line
      arguments of the entire main() function. In constrast to the shell's 'time'
      utility, which measures total time of the parent process, this logs all
      involved git commands recursively. This is particularly useful to debug
      performance issues of scripted commands (i.e. which git commands were
      called with which parameters, and how long did they execute).
      
      Due to git's deliberate use of exit(), the implementation uses an atexit
      routine rather than just adding trace_performance_since() at the end of
      main().
      
      Usage example: > GIT_TRACE_PERFORMANCE=~/git-trace.log git stash list
      
      Creates a log file like this:
      23:57:38.638765 trace.c:405 performance: 0.000310107 s: git command: 'git' 'rev-parse' '--git-dir'
      23:57:38.644387 trace.c:405 performance: 0.000261759 s: git command: 'git' 'rev-parse' '--show-toplevel'
      23:57:38.646207 trace.c:405 performance: 0.000304468 s: git command: 'git' 'config' '--get-colorbool' 'color.interactive'
      23:57:38.648491 trace.c:405 performance: 0.000241667 s: git command: 'git' 'config' '--get-color' 'color.interactive.help' 'red bold'
      23:57:38.650465 trace.c:405 performance: 0.000243063 s: git command: 'git' 'config' '--get-color' '' 'reset'
      23:57:38.654850 trace.c:405 performance: 0.025126313 s: git command: 'git' 'stash' 'list'
      Signed-off-by: NKarsten Blees <blees@dcon.de>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      578da039
    • K
      trace: add trace_performance facility to debug performance issues · 09b2c1c7
      Karsten Blees 提交于
      Add trace_performance and trace_performance_since macros that print a
      duration and an optional printf-formatted text to the file specified in
      environment variable GIT_TRACE_PERFORMANCE.
      
      These macros, in conjunction with getnanotime(), are intended to simplify
      performance measurements from within the application (i.e. profiling via
      manual instrumentation, rather than using an external profiling tool).
      
      Unless enabled via GIT_TRACE_PERFORMANCE, these macros have no noticeable
      impact on performance, so that test code for well known time killers may
      be shipped in release builds. Alternatively, a developer could provide an
      additional performance patch (not meant for master) that allows reviewers
      to reproduce performance tests more easily, e.g. on other platforms or
      using their own repositories.
      
      Usage examples:
      
      Simple use case (measure one code section):
      
        uint64_t start = getnanotime();
        /* code section to measure */
        trace_performance_since(start, "foobar");
      
      Complex use case (measure repetitive code sections):
      
        uint64_t t = 0;
        for (;;) {
          /* ignore */
          t -= getnanotime();
          /* code section to measure */
          t += getnanotime();
          /* ignore */
        }
        trace_performance(t, "frotz");
      Signed-off-by: NKarsten Blees <blees@dcon.de>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      09b2c1c7
    • K
      trace: add high resolution timer function to debug performance issues · 148d6771
      Karsten Blees 提交于
      Add a getnanotime() function that returns nanoseconds since 01/01/1970 as
      unsigned 64-bit integer (i.e. overflows in july 2554). This is easier to
      work with than e.g. struct timeval or struct timespec. Basing the timer on
      the epoch allows using the results with other time-related APIs.
      
      To simplify adaption to different platforms, split the implementation into
      a common getnanotime() and a platform-specific highres_nanos() function.
      
      The common getnanotime() function handles errors, falling back to
      gettimeofday() if highres_nanos() isn't implemented or doesn't work.
      
      getnanotime() is also responsible for normalizing to the epoch. The offset
      to the system clock is calculated only once on initialization, i.e.
      manually setting the system clock has no impact on the timer (except if
      the fallback gettimeofday() is in use). Git processes are typically short
      lived, so we don't need to handle clock drift.
      
      The highres_nanos() function returns monotonically increasing nanoseconds
      relative to some arbitrary point in time (e.g. system boot), or 0 on
      failure. Providing platform-specific implementations should be relatively
      easy, e.g. adapting to clock_gettime() as defined by the POSIX realtime
      extensions is seven lines of code.
      
      This version includes highres_nanos() implementations for:
       * Linux: using clock_gettime(CLOCK_MONOTONIC)
       * Windows: using QueryPerformanceCounter()
      
      Todo:
       * enable clock_gettime() on more platforms
       * add Mac OSX version, e.g. using mach_absolute_time + mach_timebase_info
      Signed-off-by: NKarsten Blees <blees@dcon.de>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      148d6771
    • K
      trace: add 'file:line' to all trace output · e05bed96
      Karsten Blees 提交于
      This is useful to see where trace output came from.
      
      Add 'const char *file, int line' parameters to the printing functions and
      rename them to *_fl.
      
      Add trace_printf* and trace_strbuf macros resolving to the *_fl functions
      and let the preprocessor fill in __FILE__ and __LINE__.
      
      As the trace_printf* functions take a variable number of arguments, this
      requires variadic macros (i.e. '#define foo(...) foo_impl(__VA_ARGS__)'.
      Though part of C99, it is unclear whether older compilers support this.
      Thus keep the old functions and only enable variadic macros for GNUC and
      MSVC 2005+ (_MSC_VER 1400). This has the nice side effect that the old
      C-style declarations serve as documentation how the macros are to be used.
      
      Print 'file:line ' as prefix to each trace line. Align the remaining trace
      output at column 40 to accommodate 18 char file names + 4 digit line
      number (currently there are 30 *.c files of length 18 and just 11 of 19).
      Trace output from longer source files (e.g. builtin/receive-pack.c) will
      not be aligned.
      Signed-off-by: NKarsten Blees <blees@dcon.de>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      e05bed96
    • K
      trace: move code around, in preparation to file:line output · 66f66c59
      Karsten Blees 提交于
      No functional changes, just move stuff around so that the next patch isn't
      that ugly...
      Signed-off-by: NKarsten Blees <blees@dcon.de>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      66f66c59
    • K
      trace: add current timestamp to all trace output · b72be02c
      Karsten Blees 提交于
      This is useful to tell apart trace output of separate test runs.
      
      It can also be used for basic, coarse-grained performance analysis. Note
      that the accuracy is tainted by writing to the trace file, and you have to
      calculate the deltas yourself (which is next to impossible if multiple
      threads or processes are involved).
      Signed-off-by: NKarsten Blees <blees@dcon.de>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      b72be02c
    • K
      trace: disable additional trace output for unit tests · 124647c4
      Karsten Blees 提交于
      Some unit-tests use trace output to verify internal state, and unstable
      output such as timestamps and line numbers are not useful there.
      
      Disable additional trace output if GIT_TRACE_BARE is set.
      Signed-off-by: NKarsten Blees <blees@dcon.de>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      124647c4
    • K
      trace: add infrastructure to augment trace output with additional info · c69dfd24
      Karsten Blees 提交于
      To be able to add a common prefix or suffix to all trace output (e.g.
      a timestamp or file:line of the caller), factor out common setup and
      cleanup tasks of the trace* functions.
      
      When adding a common prefix, it makes sense that the output of each trace
      call starts on a new line. Add '\n' in case the caller forgot.
      
      Note that this explicitly limits trace output to line-by-line, it is no
      longer possible to trace-print just part of a line. Until now, this was
      just an implicit assumption (trace-printing part of a line worked, but
      messed up the trace file if multiple threads or processes were involved).
      
      Thread-safety / inter-process-safety is also the reason why we need to do
      the prefixing and suffixing in memory rather than issuing multiple write()
      calls. Write_or_whine_pipe() / xwrite() is atomic unless the size exceeds
      MAX_IO_SIZE (8MB, see wrapper.c). In case of trace_strbuf, this costs an
      additional string copy (which should be irrelevant for performance in light
      of actual file IO).
      
      While we're at it, rename trace_strbuf's 'buf' argument, which suggests
      that the function is modifying the buffer. Trace_strbuf() currently is the
      only trace API that can print arbitrary binary data (without barfing on
      '%' or stopping at '\0'), so 'data' seems more appropriate.
      Signed-off-by: NKarsten Blees <blees@dcon.de>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      c69dfd24
    • K
      sha1_file: change GIT_TRACE_PACK_ACCESS logging to use trace API · 67dc598e
      Karsten Blees 提交于
      This changes GIT_TRACE_PACK_ACCESS functionality as follows:
       * supports the same options as GIT_TRACE (e.g. printing to stderr)
       * no longer supports relative paths
       * appends to the trace file rather than overwriting
      Signed-off-by: NKarsten Blees <blees@dcon.de>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      67dc598e
    • K
      Documentation/git.txt: improve documentation of 'GIT_TRACE*' variables · eb9250df
      Karsten Blees 提交于
      Separate GIT_TRACE description into what it prints and how to configure
      where trace output is printed to. Change other GIT_TRACE_* descriptions to
      refer to GIT_TRACE.
      
      Add descriptions for GIT_TRACE_SETUP and GIT_TRACE_SHALLOW.
      Signed-off-by: NKarsten Blees <blees@dcon.de>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      eb9250df
    • K
      trace: improve trace performance · 6aa30857
      Karsten Blees 提交于
      The trace API currently rechecks the environment variable and reopens the
      trace file on every API call. This has the ugly side effect that errors
      (e.g. file cannot be opened, or the user specified a relative path) are
      also reported on every call. Performance can be improved by about factor
      three by remembering the environment state and keeping the file open.
      
      Replace the 'const char *key' parameter in the API with a pointer to a
      'struct trace_key' that bundles the environment variable name with
      additional, trace-internal state. Change the call sites of these APIs to
      use a static 'struct trace_key' instead of a string constant.
      
      In trace.c::get_trace_fd(), save and reuse the file descriptor in 'struct
      trace_key'.
      
      Add a 'trace_disable()' API, so that packet_trace() can cleanly disable
      tracing when it encounters packed data (instead of using unsetenv()).
      Signed-off-by: NKarsten Blees <blees@dcon.de>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      6aa30857
  2. 18 6月, 2014 3 次提交
  3. 17 6月, 2014 26 次提交
    • J
      Third batch for 2.1 · cb682f8c
      Junio C Hamano 提交于
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      cb682f8c
    • J
      Merge branch 'ib/test-selectively-run' · 7e1a5381
      Junio C Hamano 提交于
      Allow specifying only certain individual test pieces to be run
      using a range notation (e.g. "t1234-test.sh --run='1-4 6 8 9-'").
      
      * ib/test-selectively-run:
        t0000-*.sh: fix the GIT_SKIP_TESTS sub-tests
        test-lib: '--run' to run only specific tests
        test-lib: tests skipped by GIT_SKIP_TESTS say so
        test-lib: document short options in t/README
      7e1a5381
    • J
      Merge branch 'ta/string-list-init' · c6d3abbf
      Junio C Hamano 提交于
      * ta/string-list-init:
        string-list: spell all values out that are given to a string_list initializer
      c6d3abbf
    • J
      Merge branch 'jm/dedup-test-config' · bbfa0cc7
      Junio C Hamano 提交于
      * jm/dedup-test-config:
        t/t7810-grep.sh: remove duplicate test_config()
      bbfa0cc7
    • J
      Merge branch 'dt/refs-check-refname-component-optim' · ae7dd1a4
      Junio C Hamano 提交于
      * dt/refs-check-refname-component-optim:
        refs.c: optimize check_refname_component()
      ae7dd1a4
    • J
      Merge branch 'sk/test-cmp-bin' · c651ccc9
      Junio C Hamano 提交于
      * sk/test-cmp-bin:
        t5000, t5003: do not use test_cmp to compare binary files
      c651ccc9
    • J
      Merge branch 'sh/enable-preloadindex' · 96b29bde
      Junio C Hamano 提交于
      * sh/enable-preloadindex:
        environment.c: enable core.preloadindex by default
      96b29bde
    • J
      Merge branch 'rs/read-ref-at' · bb0ced75
      Junio C Hamano 提交于
      * rs/read-ref-at:
        refs.c: change read_ref_at to use the reflog iterators
      bb0ced75
    • J
      Merge branch 'jk/error-resolve-conflict-advice' · d0d5ba7e
      Junio C Hamano 提交于
      * jk/error-resolve-conflict-advice:
        error_resolve_conflict: drop quotations around operation
        error_resolve_conflict: rewrap advice message
      d0d5ba7e
    • J
      Merge branch 'rs/pack-objects-no-unnecessary-realloc' · 57a2eee9
      Junio C Hamano 提交于
      Avoid unnecessary copy of previous contents when extending the
      hashtable used in pack-objects.
      
      * rs/pack-objects-no-unnecessary-realloc:
        pack-objects: use free()+xcalloc() instead of xrealloc()+memset()
      57a2eee9
    • J
      Merge branch 'lt/log-auto-decorate' · 3009afd5
      Junio C Hamano 提交于
      * lt/log-auto-decorate:
        git log: support "auto" decorations
      3009afd5
    • J
      Merge branch 'jm/doc-wording-tweaks' · 668668ad
      Junio C Hamano 提交于
      * jm/doc-wording-tweaks:
        Documentation: wording fixes in the user manual and glossary
      668668ad
    • J
      Merge branch 'jm/format-patch-mail-sig' · f18871dc
      Junio C Hamano 提交于
      * jm/format-patch-mail-sig:
        format-patch: add "--signature-file=<file>" option
        format-patch: make newline after signature conditional
      f18871dc
    • J
      Merge branch 'jk/http-errors' · 2075a0c2
      Junio C Hamano 提交于
      Propagate the error messages from the webserver better to the
      client coming over the HTTP transport.
      
      * jk/http-errors:
        http: default text charset to iso-8859-1
        remote-curl: reencode http error messages
        strbuf: add strbuf_reencode helper
        http: optionally extract charset parameter from content-type
        http: extract type/subtype portion of content-type
        t5550: test display of remote http error messages
        t/lib-httpd: use write_script to copy CGI scripts
        test-lib: preserve GIT_CURL_VERBOSE from the environment
      2075a0c2
    • J
      Merge branch 'ow/config-mailmap-pathname' · c37d3269
      Junio C Hamano 提交于
      mailmap.file configuration names a pathname, hence should honor
      ~/path and ~user/path as its value.
      
      * ow/config-mailmap-pathname:
        config: respect '~' and '~user' in mailmap.file
      c37d3269
    • J
      Merge branch 'fc/remote-helper-refmap' · c9fc3a6a
      Junio C Hamano 提交于
      Allow remote-helper/fast-import based transport to rename the refs
      while transferring the history.
      
      * fc/remote-helper-refmap:
        transport-helper: remove unnecessary strbuf resets
        transport-helper: add support to delete branches
        fast-export: add support to delete refs
        fast-import: add support to delete refs
        transport-helper: add support to push symbolic refs
        transport-helper: add support for old:new refspec
        fast-export: add new --refspec option
        fast-export: improve argument parsing
      c9fc3a6a
    • J
      Merge branch 'nd/daemonize-gc' · 1a81f6ce
      Junio C Hamano 提交于
      "git gc --auto" was recently changed to run in the background to
      give control back early to the end-user sitting in front of the
      terminal, but it forgot that housekeeping involving reflogs should
      be done without other processes competing for accesses to the refs.
      
      * nd/daemonize-gc:
        gc --auto: do not lock refs in the background
      1a81f6ce
    • J
      Merge branch 'jm/t9138-style-fix' · 8dbd3133
      Junio C Hamano 提交于
      * jm/t9138-style-fix:
        t9138-git-svn-authors-prog.sh fixups
      8dbd3133
    • J
      Merge branch 'jm/instaweb-apache-24' · bf2941be
      Junio C Hamano 提交于
      * jm/instaweb-apache-24:
        git-instaweb: add support for Apache 2.4
      bf2941be
    • J
      Merge branch 'jl/remote-rm-prune' · 474df928
      Junio C Hamano 提交于
      "git remote rm" and "git remote prune" can involve removing many
      refs at once, which is not a very efficient thing to do when very
      many refs exist in the packed-refs file.
      
      * jl/remote-rm-prune:
        remote prune: optimize "dangling symref" check/warning
        remote: repack packed-refs once when deleting multiple refs
        remote rm: delete remote configuration as the last
      474df928
    • J
      Merge branch 'jk/complete-merge-pull' · 5cf2c571
      Junio C Hamano 提交于
      The completion code did not know about quite a few options that are
      common between "git merge" and "git pull", and a couple of options
      unique to "git merge".
      
      * jk/complete-merge-pull:
        completion: add missing options for git-merge
        completion: add a note that merge options are shared
      5cf2c571
    • J
      Merge branch 'bg/xcalloc-nmemb-then-size' · a634a6d2
      Junio C Hamano 提交于
      Like calloc(3), xcalloc() takes nmemb and then size.
      
      * bg/xcalloc-nmemb-then-size:
        transport-helper.c: rearrange xcalloc arguments
        remote.c: rearrange xcalloc arguments
        reflog-walk.c: rearrange xcalloc arguments
        pack-revindex.c: rearrange xcalloc arguments
        notes.c: rearrange xcalloc arguments
        imap-send.c: rearrange xcalloc arguments
        http-push.c: rearrange xcalloc arguments
        diff.c: rearrange xcalloc arguments
        config.c: rearrange xcalloc arguments
        commit.c: rearrange xcalloc arguments
        builtin/remote.c: rearrange xcalloc arguments
        builtin/ls-remote.c: rearrange xcalloc arguments
      a634a6d2
    • J
      Merge branch 'jl/status-added-submodule-is-never-ignored' · 6d681f0a
      Junio C Hamano 提交于
      submodule.*.ignore and diff.ignoresubmodules are used to ignore all
      submodule changes in "diff" output, but it can be confusing to
      apply these configuration values to status and commit.
      
      This is a backward-incompatible change, but should be so in a good
      way (aka bugfix).
      
      * jl/status-added-submodule-is-never-ignored:
        commit -m: commit staged submodules regardless of ignore config
        status/commit: show staged submodules regardless of ignore config
      6d681f0a
    • J
      Merge branch 'cb/byte-order' · 83a4904f
      Junio C Hamano 提交于
      Compatibility enhancement for Solaris.
      
      * cb/byte-order:
        compat/bswap.h: fix endianness detection
        compat/bswap.h: restore preference __BIG_ENDIAN over BIG_ENDIAN
        compat/bswap.h: detect endianness on more platforms that don't use BYTE_ORDER
      83a4904f
    • J
      Merge branch 'jk/strbuf-tolower' · b4bba8de
      Junio C Hamano 提交于
      * jk/strbuf-tolower:
        strbuf: add strbuf_tolower function
      b4bba8de
    • J
      Merge branch 'jk/daemon-tolower' · b4516df9
      Junio C Hamano 提交于
      * jk/daemon-tolower:
        daemon/config: factor out duplicate xstrdup_tolower
      b4516df9