1. 23 12月, 2010 1 次提交
    • P
      convert filter: supply path to external driver · a2b665de
      Pete Wyckoff 提交于
      Filtering to support keyword expansion may need the name of
      the file being filtered.  In particular, to support p4 keywords
      like
      
          $File: //depot/product/dir/script.sh $
      
      the smudge filter needs to know the name of the file it is
      smudging.
      
      Allow "%f" in the custom filter command line specified in the
      configuration.  This will be substituted by the filename
      inside a single-quote pair to be passed to the shell.
      Signed-off-by: NPete Wyckoff <pw@padd.com>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      a2b665de
  2. 03 7月, 2010 2 次提交
    • E
      Don't expand CRLFs when normalizing text during merge · 43dd2332
      Eyvind Bernhardsen 提交于
      Disable CRLF expansion when convert_to_working_tree() is called from
      normalize_buffer().  This improves performance when merging branches
      with conflicting line endings when core.eol=crlf or core.autocrlf=true
      by making the normalization act as if core.eol=lf.
      Signed-off-by: NEyvind Bernhardsen <eyvind.bernhardsen@gmail.com>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      43dd2332
    • E
      Avoid conflicts when merging branches with mixed normalization · f217f0e8
      Eyvind Bernhardsen 提交于
      Currently, merging across changes in line ending normalization is
      painful since files containing CRLF will conflict with normalized files,
      even if the only difference between the two versions is the line
      endings.  Additionally, any "real" merge conflicts that exist are
      obscured because every line in the file has a conflict.
      
      Assume you start out with a repo that has a lot of text files with CRLF
      checked in (A):
      
            o---C
           /     \
          A---B---D
      
      B: Add "* text=auto" to .gitattributes and normalize all files to
         LF-only
      
      C: Modify some of the text files
      
      D: Try to merge C
      
      You will get a ridiculous number of LF/CRLF conflicts when trying to
      merge C into D, since the repository contents for C are "wrong" wrt the
      new .gitattributes file.
      
      Fix ll-merge so that the "base", "theirs" and "ours" stages are passed
      through convert_to_worktree() and convert_to_git() before a three-way
      merge.  This ensures that all three stages are normalized in the same
      way, removing from consideration differences that are only due to
      normalization.
      
      This feature is optional for now since it changes a low-level mechanism
      and is not necessary for the majority of users.  The "merge.renormalize"
      config variable enables it.
      Signed-off-by: NEyvind Bernhardsen <eyvind.bernhardsen@gmail.com>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      f217f0e8
  3. 07 6月, 2010 1 次提交
  4. 01 6月, 2010 1 次提交
    • G
      Rewrite dynamic structure initializations to runtime assignment · 66dbfd55
      Gary V. Vaughan 提交于
      Unfortunately, there are still plenty of production systems with
      vendor compilers that choke unless all compound declarations can be
      determined statically at compile time, for example hpux10.20 (I can
      provide a comprehensive list of our supported platforms that exhibit
      this problem if necessary).
      
      This patch simply breaks apart any compound declarations with dynamic
      initialisation expressions, and moves the initialisation until after
      the last declaration in the same block, in all the places necessary to
      have the offending compilers accept the code.
      Signed-off-by: NGary V. Vaughan <gary@thewrittenword.com>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      66dbfd55
  5. 20 5月, 2010 2 次提交
  6. 12 5月, 2010 1 次提交
    • F
      autocrlf: Make it work also for un-normalized repositories · c4805393
      Finn Arne Gangstad 提交于
      Previously, autocrlf would only work well for normalized
      repositories. Any text files that contained CRLF in the repository
      would cause problems, and would be modified when handled with
      core.autocrlf set.
      
      Change autocrlf to not do any conversions to files that in the
      repository already contain a CR. git with autocrlf set will never
      create such a file, or change a LF only file to contain CRs, so the
      (new) assumption is that if a file contains a CR, it is intentional,
      and autocrlf should not change that.
      
      The following sequence should now always be a NOP even with autocrlf
      set (assuming a clean working directory):
      
      git checkout <something>
      touch *
      git add -A .    (will add nothing)
      git commit      (nothing to commit)
      
      Previously this would break for any text file containing a CR.
      
      Some of you may have been folowing Eyvind's excellent thread about
      trying to make end-of-line translation in git a bit smoother.
      
      I decided to attack the problem from a different angle: Is it possible
      to make autocrlf behave non-destructively for all the previous problem cases?
      
      Stealing the problem from Eyvind's initial mail (paraphrased and
      summarized a bit):
      
      1. Setting autocrlf globally is a pain since autocrlf does not work well
         with CRLF in the repo
      2. Setting it in individual repos is hard since you do it "too late"
         (the clone will get it wrong)
      3. If someone checks in a file with CRLF later, you get into problems again
      4. If a repository once has contained CRLF, you can't tell autocrlf
         at which commit everything is sane again
      5. autocrlf does needless work if you know that all your users want
         the same EOL style.
      
      I belive that this patch makes autocrlf a safe (and good) default
      setting for Windows, and this solves problems 1-4 (it solves 2 by being
      set by default, which is early enough for clone).
      
      I implemented it by looking for CR charactes in the index, and
      aborting any conversion attempt if this is found.
      Signed-off-by: NFinn Arne Gangstad <finag@pvv.org>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      c4805393
  7. 11 4月, 2010 2 次提交
  8. 06 2月, 2010 1 次提交
    • E
      run-command: support custom fd-set in async · ae6a5609
      Erik Faye-Lund 提交于
      This patch adds the possibility to supply a set of non-0 file
      descriptors for async process communication instead of the
      default-created pipe.
      
      Additionally, we now support bi-directional communiction with the
      async procedure, by giving the async function both read and write
      file descriptors.
      
      To retain compatiblity and similar "API feel" with start_command,
      we require start_async callers to set .out = -1 to get a readable
      file descriptor.  If either of .in or .out is 0, we supply no file
      descriptor to the async process.
      
      [sp: Note: Erik started this patch, and a huge bulk of it is
           his work.  All bugs were introduced later by Shawn.]
      Signed-off-by: NErik Faye-Lund <kusmabite@gmail.com>
      Signed-off-by: NShawn O. Pearce <spearce@spearce.org>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      ae6a5609
  9. 17 1月, 2010 1 次提交
  10. 06 1月, 2010 1 次提交
  11. 06 7月, 2009 1 次提交
    • J
      run_command: return exit code as positive value · 5709e036
      Johannes Sixt 提交于
      As a general guideline, functions in git's code return zero to indicate
      success and negative values to indicate failure. The run_command family of
      functions followed this guideline. But there are actually two different
      kinds of failure:
      
      - failures of system calls;
      
      - non-zero exit code of the program that was run.
      
      Usually, a non-zero exit code of the program is a failure and means a
      failure to the caller. Except that sometimes it does not. For example, the
      exit code of merge programs (e.g. external merge drivers) conveys
      information about how the merge failed, and not all exit calls are
      actually failures.
      
      Furthermore, the return value of run_command is sometimes used as exit
      code by the caller.
      
      This change arranges that the exit code of the program is returned as a
      positive value, which can now be regarded as the "result" of the function.
      System call failures continue to be reported as negative values.
      Signed-off-by: NJohannes Sixt <j6t@kdbg.org>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      5709e036
  12. 13 10月, 2008 1 次提交
  13. 12 7月, 2008 1 次提交
  14. 06 7月, 2008 1 次提交
  15. 15 5月, 2008 1 次提交
  16. 12 2月, 2008 1 次提交
  17. 07 2月, 2008 1 次提交
    • S
      safecrlf: Add mechanism to warn about irreversible crlf conversions · 21e5ad50
      Steffen Prohaska 提交于
      CRLF conversion bears a slight chance of corrupting data.
      autocrlf=true will convert CRLF to LF during commit and LF to
      CRLF during checkout.  A file that contains a mixture of LF and
      CRLF before the commit cannot be recreated by git.  For text
      files this is the right thing to do: it corrects line endings
      such that we have only LF line endings in the repository.
      But for binary files that are accidentally classified as text the
      conversion can corrupt data.
      
      If you recognize such corruption early you can easily fix it by
      setting the conversion type explicitly in .gitattributes.  Right
      after committing you still have the original file in your work
      tree and this file is not yet corrupted.  You can explicitly tell
      git that this file is binary and git will handle the file
      appropriately.
      
      Unfortunately, the desired effect of cleaning up text files with
      mixed line endings and the undesired effect of corrupting binary
      files cannot be distinguished.  In both cases CRLFs are removed
      in an irreversible way.  For text files this is the right thing
      to do because CRLFs are line endings, while for binary files
      converting CRLFs corrupts data.
      
      This patch adds a mechanism that can either warn the user about
      an irreversible conversion or can even refuse to convert.  The
      mechanism is controlled by the variable core.safecrlf, with the
      following values:
      
       - false: disable safecrlf mechanism
       - warn: warn about irreversible conversions
       - true: refuse irreversible conversions
      
      The default is to warn.  Users are only affected by this default
      if core.autocrlf is set.  But the current default of git is to
      leave core.autocrlf unset, so users will not see warnings unless
      they deliberately chose to activate the autocrlf mechanism.
      
      The safecrlf mechanism's details depend on the git command.  The
      general principles when safecrlf is active (not false) are:
      
       - we warn/error out if files in the work tree can modified in an
         irreversible way without giving the user a chance to backup the
         original file.
      
       - for read-only operations that do not modify files in the work tree
         we do not not print annoying warnings.
      
      There are exceptions.  Even though...
      
       - "git add" itself does not touch the files in the work tree, the
         next checkout would, so the safety triggers;
      
       - "git apply" to update a text file with a patch does touch the files
         in the work tree, but the operation is about text files and CRLF
         conversion is about fixing the line ending inconsistencies, so the
         safety does not trigger;
      
       - "git diff" itself does not touch the files in the work tree, it is
         often run to inspect the changes you intend to next "git add".  To
         catch potential problems early, safety triggers.
      
      The concept of a safety check was originally proposed in a similar
      way by Linus Torvalds.  Thanks to Dimitry Potapov for insisting
      on getting the naked LF/autocrlf=true case right.
      Signed-off-by: NSteffen Prohaska <prohaska@zib.de>
      21e5ad50
  18. 17 1月, 2008 1 次提交
    • D
      treat any file with NUL as binary · 28624193
      Dmitry Potapov 提交于
      There are two heuristics in Git to detect whether a file is binary
      or text. One in xdiff-interface.c (which is taken from GNU diff)
      relies on existence of the NUL byte at the beginning. However,
      convert.c used a different heuristic, which relied on the percent
      of non-printable symbols (less than 1% for text files).
      
      Due to differences in detection whether a file is binary or not,
      it was possible that a file that diff treats as binary could be
      treated as text by CRLF conversion. This is very confusing for a
      user who sees that 'git diff' shows the file as binary expects it
      to be added as binary.
      
      This patch makes is_binary to consider any file that contains at
      least one NUL character as binary, to ensure that the heuristics
      used for CRLF conversion is tighter than what is used by diff.
      Signed-off-by: NDmitry Potapov <dpotapov@gmail.com>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      28624193
  19. 21 10月, 2007 3 次提交
  20. 16 10月, 2007 1 次提交
  21. 29 9月, 2007 1 次提交
    • P
      strbuf change: be sure ->buf is never ever NULL. · b315c5c0
      Pierre Habouzit 提交于
      For that purpose, the ->buf is always initialized with a char * buf living
      in the strbuf module. It is made a char * so that we can sloppily accept
      things that perform: sb->buf[0] = '\0', and because you can't pass "" as an
      initializer for ->buf without making gcc unhappy for very good reasons.
      
      strbuf_init/_detach/_grow have been fixed to trust ->alloc and not ->buf
      anymore.
      
      as a consequence strbuf_detach is _mandatory_ to detach a buffer, copying
      ->buf isn't an option anymore, if ->buf is going to escape from the scope,
      and eventually be free'd.
      
      API changes:
        * strbuf_setlen now always works, so just make strbuf_reset a convenience
          macro.
        * strbuf_detatch takes a size_t* optional argument (meaning it can be
          NULL) to copy the buffer's len, as it was needed for this refactor to
          make the code more readable, and working like the callers.
      Signed-off-by: NPierre Habouzit <madcoder@debian.org>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      b315c5c0
  22. 19 9月, 2007 1 次提交
  23. 17 9月, 2007 2 次提交
  24. 04 9月, 2007 1 次提交
  25. 26 5月, 2007 1 次提交
    • A
      Fix mishandling of $Id$ expanded in the repository copy in convert.c · c23290d5
      Andy Parkins 提交于
      If the repository contained an expanded ident keyword (i.e. $Id:XXXX$),
      then the wrong bytes were discarded, and the Id keyword was not
      expanded.  The fault was in convert.c:ident_to_worktree().
      
      Previously, when a "$Id:" was found in the repository version,
      ident_to_worktree() would search for the next "$" after this, and
      discarded everything it found until then.  That was done with the loop:
      
          do {
              ch = *cp++;
              if (ch == '$')
                  break;
              rem--;
          } while (rem);
      
      The above loop left cp pointing one character _after_ the final "$"
      (because of ch = *cp++).  This was different from the non-expanded case,
      were cp is left pointing at the "$", and was different from the comment
      which stated "discard up to but not including the closing $".  This
      patch fixes that by making the loop:
      
          do {
              ch = *cp;
              if (ch == '$')
                  break;
              cp++;
              rem--;
          } while (rem);
      
      That is, cp is tested _then_ incremented.
      
      This loop exits if it finds a "$" or if it runs out of bytes in the
      source.  After this loop, if there was no closing "$" the expansion is
      skipped, and the outer loop is allowed to continue leaving this
      non-keyword as it was.  However, when the "$" is found, size is
      corrected, before running the expansion:
      
          size -= (cp - src);
      
      This is wrong; size is going to be corrected anyway after the expansion,
      so there is no need to do it here.  This patch removes that redundant
      correction.
      
      To help find this bug, I heavily commented the routine; those comments
      are included here as a bonus.
      Signed-off-by: NAndy Parkins <andyparkins@gmail.com>
      Signed-off-by: NJunio C Hamano <junkio@cox.net>
      c23290d5
  26. 19 5月, 2007 2 次提交
    • A
      Fix crlf attribute handling to match documentation · 760f0c62
      Andy Parkins 提交于
      gitattributes.txt says, of the crlf attribute:
      
       Set::
          Setting the `crlf` attribute on a path is meant to mark
          the path as a "text" file.  'core.autocrlf' conversion
          takes place without guessing the content type by
          inspection.
      
      That is to say that the crlf attribute does not force the file to have
      CRLF line endings, instead it removes the autocrlf guesswork and forces
      the file to be treated as text.  Then, whatever line ending is defined
      by the autocrlf setting is applied.
      
      However, that is not what convert.c was doing.  The conversion to CRLF
      was being skipped in crlf_to_worktree() when the following condition was
      true:
      
       action == CRLF_GUESS && auto_crlf <= 0
      
      That is to say conversion took place when not in guess mode (crlf attribute
      not specified) or core.autocrlf set to true.  This was wrong.  It meant
      that the crlf attribute being on for a given file _forced_ CRLF
      conversion, when actually it should force the file to be treated as
      text, and converted accordingly.  The real test should simply be
      
       auto_crlf <= 0
      
      That is to say, if core.autocrlf is falsei (or input), conversion from
      LF to CRLF is never done.  When core.autocrlf is true, conversion from
      LF to CRLF is done only when in CRLF_GUESS (and the guess is "text"), or
      CRLF_TEXT mode.
      
      Similarly for crlf_to_worktree(), if core.autocrlf is false, no conversion
      should _ever_ take place.  In reality it was only not taking place if
      core.autocrlf was false _and_ the crlf attribute was unspecified.
      Signed-off-by: NAndy Parkins <andyparkins@gmail.com>
      Signed-off-by: NJunio C Hamano <junkio@cox.net>
      760f0c62
    • R
      git-archive: convert archive entries like checkouts do · 5e6cfc80
      René Scharfe 提交于
      As noted by Johan Herland, git-archive is a kind of checkout and needs
      to apply any checkout filters that might be configured.
      
      This patch adds the convenience function convert_sha1_file which returns
      a buffer containing the object's contents, after converting, if necessary
      (i.e. it's a combination of read_sha1_file and convert_to_working_tree).
      Direct calls to read_sha1_file in git-archive are then replaced by calls
      to convert_sha1_file.
      
      Since convert_sha1_file expects its path argument to be NUL-terminated --
      a convention it inherits from convert_to_working_tree -- the patch also
      changes the path handling in archive-tar.c to always NUL-terminate the
      string.  It used to solely rely on the len field of struct strbuf before.
      
      archive-zip.c already NUL-terminates the path and thus needs no such
      change.
      Signed-off-by: NRene Scharfe <rene.scharfe@lsrfire.ath.cx>
      Signed-off-by: NJunio C Hamano <junkio@cox.net>
      5e6cfc80
  27. 15 5月, 2007 1 次提交
  28. 25 4月, 2007 2 次提交
    • J
      Add 'filter' attribute and external filter driver definition. · aa4ed402
      Junio C Hamano 提交于
      The interface is similar to the custom low-level merge drivers.
      
      First you configure your filter driver by defining 'filter.<name>.*'
      variables in the configuration.
      
      	filter.<name>.clean	filter command to run upon checkin
      	filter.<name>.smudge	filter command to run upon checkout
      
      Then you assign filter attribute to each path, whose name
      matches the custom filter driver's name.
      
      Example:
      
      	(in .gitattributes)
      	*.c	filter=indent
      
      	(in config)
      	[filter "indent"]
      		clean = indent
      		smudge = cat
      Signed-off-by: NJunio C Hamano <junkio@cox.net>
      aa4ed402
    • J
      Add 'ident' conversion. · 3fed15f5
      Junio C Hamano 提交于
      The 'ident' attribute set to path squashes "$ident:<any bytes
      except dollor sign>$" to "$ident$" upon checkin, and expands it
      to "$ident: <blob SHA-1> $" upon checkout.
      
      As we have two conversions that affect checkin/checkout paths,
      clarify how they interact with each other.
      Signed-off-by: NJunio C Hamano <junkio@cox.net>
      3fed15f5
  29. 23 4月, 2007 1 次提交
  30. 22 4月, 2007 1 次提交
  31. 21 4月, 2007 1 次提交
  32. 20 4月, 2007 1 次提交
    • J
      Update 'crlf' attribute semantics. · 163b9591
      Junio C Hamano 提交于
      This updates the semantics of 'crlf' so that .gitattributes file
      can say "this is text, even though it may look funny".
      
      Setting the `crlf` attribute on a path is meant to mark the path
      as a "text" file.  'core.autocrlf' conversion takes place
      without guessing the content type by inspection.
      
      Unsetting the `crlf` attribute on a path is meant to mark the
      path as a "binary" file.  The path never goes through line
      endings conversion upon checkin/checkout.
      
      Unspecified `crlf` attribute tells git to apply the
      `core.autocrlf` conversion when the file content looks like
      text.
      
      Setting the `crlf` attribut to string value "input" is similar
      to setting the attribute to `true`, but also forces git to act
      as if `core.autocrlf` is set to `input` for the path.
      Signed-off-by: NJunio C Hamano <junkio@cox.net>
      163b9591