Merge branch 'nd/traces'
authorJunio C Hamano <gitster@pobox.com>
Thu, 20 Jun 2013 23:02:28 +0000 (16:02 -0700)
committerJunio C Hamano <gitster@pobox.com>
Thu, 20 Jun 2013 23:02:28 +0000 (16:02 -0700)
* nd/traces:
git.txt: document GIT_TRACE_PACKET
core: use env variable instead of config var to turn on logging pack access

1  2 
Documentation/git.txt
cache.h
config.c
sha1_file.c
diff --combined Documentation/git.txt
index 2e23cbb224854c3090ecd73cb36e437978d0d063,3c77b82add1bca5d578d94dd969e22735ab4993f..894454609fab8f3773afff7e1e3fc4aadfb825f0
@@@ -43,18 -43,12 +43,18 @@@ unreleased) version of Git, that is ava
  branch of the `git.git` repository.
  Documentation for older releases are available here:
  
 +* link:v1.8.3.1/git.html[documentation for release 1.8.3.1]
 +
 +* release notes for
 +  link:RelNotes/1.8.3.1.txt[1.8.3.1],
 +  link:RelNotes/1.8.3.txt[1.8.3].
 +
  * link:v1.8.2.3/git.html[documentation for release 1.8.2.3]
  
  * release notes for
 -  link:RelNotes/1.8.2.3.txt[1.8.2.3].
 -  link:RelNotes/1.8.2.2.txt[1.8.2.2].
 -  link:RelNotes/1.8.2.1.txt[1.8.2.1].
 +  link:RelNotes/1.8.2.3.txt[1.8.2.3],
 +  link:RelNotes/1.8.2.2.txt[1.8.2.2],
 +  link:RelNotes/1.8.2.1.txt[1.8.2.1],
    link:RelNotes/1.8.2.txt[1.8.2].
  
  * link:v1.8.1.6/git.html[documentation for release 1.8.1.6]
@@@ -683,7 -677,9 +683,7 @@@ Git so take care if using Cogito etc
        The '--git-dir' command-line option also sets this value.
  
  'GIT_WORK_TREE'::
 -      Set the path to the working tree.  The value will not be
 -      used in combination with repositories found automatically in
 -      a .git directory (i.e. $GIT_DIR is not set).
 +      Set the path to the root of the working tree.
        This can also be controlled by the '--work-tree' command line
        option and the core.worktree configuration variable.
  
@@@ -815,9 -811,8 +815,9 @@@ for further details
  'GIT_FLUSH'::
        If this environment variable is set to "1", then commands such
        as 'git blame' (in incremental mode), 'git rev-list', 'git log',
 -      and 'git whatchanged' will force a flush of the output stream
 -      after each commit-oriented record have been flushed.   If this
 +      'git check-attr', 'git check-ignore', and 'git whatchanged' will
 +      force a flush of the output stream after each record have been
 +      flushed. If this
        variable is set to "0", the output of these commands will be done
        using completely buffered I/O.   If this environment variable is
        not set, Git will choose buffered or record-oriented flushing
        as a file path and will try to write the trace messages
        into it.
  
+ 'GIT_TRACE_PACK_ACCESS'::
+       If this variable is set to a path, a file will be created at
+       the given path logging all accesses to any packs. For each
+       access, the pack file name and an offset in the pack is
+       recorded. This may be helpful for troubleshooting some
+       pack-related performance problems.
+ 'GIT_TRACE_PACKET'::
+       If this variable is set, it shows a trace of all packets
+       coming in or out of a given program. This can help with
+       debugging object negotiation or other protocol issues. Tracing
+       is turned off at a packet starting with "PACK".
  GIT_LITERAL_PATHSPECS::
        Setting this variable to `1` will cause Git to treat all
        pathspecs literally, rather than as glob patterns. For example,
diff --combined cache.h
index 820aa05c7a6f42aa3a3599c48f560a1074132596,9bfd76b740ac17800f9923d48035b639f05959b9..ec8240f62a77cf718436d3de62f8ab7f66d4a322
+++ b/cache.h
@@@ -190,8 -190,7 +190,8 @@@ struct cache_entry 
   * another. But we never change the name, or the hash state!
   */
  #define CE_STATE_MASK (CE_HASHED | CE_UNHASHED)
 -static inline void copy_cache_entry(struct cache_entry *dst, struct cache_entry *src)
 +static inline void copy_cache_entry(struct cache_entry *dst,
 +                                  const struct cache_entry *src)
  {
        unsigned int state = dst->ce_flags & CE_STATE_MASK;
  
@@@ -223,8 -222,7 +223,8 @@@ static inline unsigned int create_ce_mo
                return S_IFGITLINK;
        return S_IFREG | ce_permissions(mode);
  }
 -static inline unsigned int ce_mode_from_stat(struct cache_entry *ce, unsigned int mode)
 +static inline unsigned int ce_mode_from_stat(const struct cache_entry *ce,
 +                                           unsigned int mode)
  {
        extern int trust_executable_bit, has_symlinks;
        if (!has_symlinks && S_ISREG(mode) &&
@@@ -482,8 -480,8 +482,8 @@@ extern void *read_blob_data_from_index(
  #define CE_MATCH_RACY_IS_DIRTY                02
  /* do stat comparison even if CE_SKIP_WORKTREE is true */
  #define CE_MATCH_IGNORE_SKIP_WORKTREE 04
 -extern int ie_match_stat(const struct index_state *, struct cache_entry *, struct stat *, unsigned int);
 -extern int ie_modified(const struct index_state *, struct cache_entry *, struct stat *, unsigned int);
 +extern int ie_match_stat(const struct index_state *, const struct cache_entry *, struct stat *, unsigned int);
 +extern int ie_modified(const struct index_state *, const struct cache_entry *, struct stat *, unsigned int);
  
  #define PATHSPEC_ONESTAR 1    /* the pathspec pattern sastisfies GFNM_ONESTAR */
  
@@@ -774,9 -772,6 +774,6 @@@ extern int parse_sha1_header(const cha
  /* global flag to enable extra checks when accessing packed objects */
  extern int do_check_packed_object_crc;
  
- /* for development: log offset of pack access */
- extern const char *log_pack_access;
  extern int check_sha1_signature(const unsigned char *sha1, void *buf, unsigned long size, const char *type);
  
  extern int move_temp_to_file(const char *tmpfile, const char *filename);
@@@ -912,7 -907,6 +909,7 @@@ void show_date_relative(unsigned long t
                        struct strbuf *timebuf);
  int parse_date(const char *date, char *buf, int bufsize);
  int parse_date_basic(const char *date, unsigned long *timestamp, int *offset);
 +int parse_expiry_date(const char *date, unsigned long *timestamp);
  void datestamp(char *buf, int bufsize);
  #define approxidate(s) approxidate_careful((s), NULL)
  unsigned long approxidate_careful(const char *, int *);
@@@ -1027,21 -1021,9 +1024,21 @@@ struct ref 
        unsigned int
                force:1,
                forced_update:1,
 -              merge:1,
                deletion:1,
                matched:1;
 +
 +      /*
 +       * Order is important here, as we write to FETCH_HEAD
 +       * in numeric order. And the default NOT_FOR_MERGE
 +       * should be 0, so that xcalloc'd structures get it
 +       * by default.
 +       */
 +      enum {
 +              FETCH_HEAD_MERGE = -1,
 +              FETCH_HEAD_NOT_FOR_MERGE = 0,
 +              FETCH_HEAD_IGNORE = 1
 +      } fetch_head_status;
 +
        enum {
                REF_STATUS_NONE = 0,
                REF_STATUS_OK,
diff --combined config.c
index 7a85ebdbae79cf13305ebc821fafcd21a67c16d4,ce074d74a60641f8dcecb60c427f7e953ecdd09d..d04e8157abc415c6956bb8a237c8a17bd9624f8c
+++ b/config.c
@@@ -58,7 -58,7 +58,7 @@@ static int handle_path_include(const ch
                path = buf.buf;
        }
  
 -      if (!access_or_die(path, R_OK)) {
 +      if (!access_or_die(path, R_OK, 0)) {
                if (++inc->depth > MAX_INCLUDE_DEPTH)
                        die(include_depth_advice, MAX_INCLUDE_DEPTH, path,
                            cf && cf->name ? cf->name : "the command line");
@@@ -566,20 -566,7 +566,20 @@@ static int git_default_core_config(cons
                trust_ctime = git_config_bool(var, value);
                return 0;
        }
 -      if (!strcmp(var, "core.statinfo")) {
 +      if (!strcmp(var, "core.statinfo") ||
 +          !strcmp(var, "core.checkstat")) {
 +              /*
 +               * NEEDSWORK: statinfo was a typo in v1.8.2 that has
 +               * never been advertised.  we will remove it at Git
 +               * 2.0 boundary.
 +               */
 +              if (!strcmp(var, "core.statinfo")) {
 +                      static int warned;
 +                      if (!warned++) {
 +                              warning("'core.statinfo' will be removed in Git 2.0; "
 +                                      "use 'core.checkstat' instead.");
 +                      }
 +              }
                if (!strcasecmp(value, "default"))
                        check_stat = 1;
                else if (!strcasecmp(value, "minimal"))
                return 0;
        }
  
-       if (!strcmp(var, "core.logpackaccess"))
-               return git_config_string(&log_pack_access, var, value);
        if (!strcmp(var, "core.autocrlf")) {
                if (value && !strcasecmp(value, "input")) {
                        if (core_eol == EOL_CRLF)
@@@ -967,23 -951,23 +964,23 @@@ int git_config_early(config_fn_t fn, vo
  
        home_config_paths(&user_config, &xdg_config, "config");
  
 -      if (git_config_system() && !access_or_die(git_etc_gitconfig(), R_OK)) {
 +      if (git_config_system() && !access_or_die(git_etc_gitconfig(), R_OK, 0)) {
                ret += git_config_from_file(fn, git_etc_gitconfig(),
                                            data);
                found += 1;
        }
  
 -      if (xdg_config && !access_or_die(xdg_config, R_OK)) {
 +      if (xdg_config && !access_or_die(xdg_config, R_OK, ACCESS_EACCES_OK)) {
                ret += git_config_from_file(fn, xdg_config, data);
                found += 1;
        }
  
 -      if (user_config && !access_or_die(user_config, R_OK)) {
 +      if (user_config && !access_or_die(user_config, R_OK, ACCESS_EACCES_OK)) {
                ret += git_config_from_file(fn, user_config, data);
                found += 1;
        }
  
 -      if (repo_config && !access_or_die(repo_config, R_OK)) {
 +      if (repo_config && !access_or_die(repo_config, R_OK, 0)) {
                ret += git_config_from_file(fn, repo_config, data);
                found += 1;
        }
diff --combined sha1_file.c
index 5c08701ae85d7bc5a4465ed138fd80b3f3480052,7fa62c2d9345c0e42c08684866de95176e6acea0..16f08d475cde5e96282aa830dd3373277c2b898f
@@@ -36,6 -36,9 +36,9 @@@ static inline uintmax_t sz_fmt(size_t s
  
  const unsigned char null_sha1[20];
  
+ static const char *no_log_pack_access = "no_log_pack_access";
+ static const char *log_pack_access;
  /*
   * This is meant to hold a *small* number of objects that you would
   * want read_sha1_file() to be able to return, but yet you do not want
@@@ -1956,12 -1959,19 +1959,19 @@@ static void write_pack_access_log(struc
  {
        static FILE *log_file;
  
+       if (!log_pack_access)
+               log_pack_access = getenv("GIT_TRACE_PACK_ACCESS");
+       if (!log_pack_access)
+               log_pack_access = no_log_pack_access;
+       if (log_pack_access == no_log_pack_access)
+               return;
        if (!log_file) {
                log_file = fopen(log_pack_access, "w");
                if (!log_file) {
                        error("cannot open pack access log '%s' for writing: %s",
                              log_pack_access, strerror(errno));
-                       log_pack_access = NULL;
+                       log_pack_access = no_log_pack_access;
                        return;
                }
        }
@@@ -1992,7 -2002,7 +2002,7 @@@ void *unpack_entry(struct packed_git *p
        int delta_stack_nr = 0, delta_stack_alloc = UNPACK_ENTRY_STACK_PREALLOC;
        int base_from_cache = 0;
  
-       if (log_pack_access)
+       if (log_pack_access != no_log_pack_access)
                write_pack_access_log(p, obj_offset);
  
        /* PHASE 1: drill down to the innermost base object */
                if (!data)
                        die("failed to apply delta");
  
 -              free (delta_data);
 +              free(delta_data);
        }
  
        *final_type = type;
@@@ -2348,7 -2358,7 +2358,7 @@@ static int sha1_loose_object_info(cons
  
        map = map_sha1_file(sha1, &mapsize);
        if (!map)
 -              return error("unable to find %s", sha1_to_hex(sha1));
 +              return -1;
        if (unpack_sha1_header(&stream, map, mapsize, hdr, sizeof(hdr)) < 0)
                status = error("unable to unpack %s header",
                               sha1_to_hex(sha1));