1. 20 4月, 2007 2 次提交
    • 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
    • J
      4392da4d
  2. 19 4月, 2007 5 次提交
  3. 18 4月, 2007 4 次提交
    • J
      Allow the default low-level merge driver to be configured. · be89cb23
      Junio C Hamano 提交于
      When no 'merge' attribute is given to a path, merge-recursive
      uses the built-in xdl-merge as the low-level merge driver.
      
      A new configuration item 'merge.default' can name a low-level
      merge driver of user's choice to be used instead.
      Signed-off-by: NJunio C Hamano <junkio@cox.net>
      be89cb23
    • J
      Custom low-level merge driver support. · f3ef6b6b
      Junio C Hamano 提交于
      This allows users to specify custom low-level merge driver per
      path, using the attributes mechanism.  Just like you can specify
      one of built-in "text", "binary", "union" low-level merge
      drivers by saying:
      
      	*		merge=text
      	.gitignore	merge=union
      	*.jpg		merge=binary
      
      pick a name of your favorite merge driver, and assign it as the
      value of the 'merge' attribute.
      
      A custom low-level merge driver is defined via the config
      mechanism.  This patch introduces 'merge.driver', a multi-valued
      configuration.  Its value is the name (i.e. the one you use as
      the value of 'merge' attribute) followed by a command line
      specification.  The command line can contain %O, %A, and %B to
      be interpolated with the names of temporary files that hold the
      common ancestor version, the version from your branch, and the
      version from the other branch, and the resulting command is
      spawned.
      
      The low-level merge driver is expected to update the temporary
      file for your branch (i.e. %A) with the result and exit with
      status 0 for a clean merge, and non-zero status for a conflicted
      merge.
      
      A new test in t6026 demonstrates a sample usage.
      Signed-off-by: NJunio C Hamano <junkio@cox.net>
      f3ef6b6b
    • J
      Add a demonstration/test of customized merge. · 47579efc
      Junio C Hamano 提交于
      This demonstrates how the new low-level per-path merge backends,
      union and ours, work, and shows how they are controlled by the
      gitattribute mechanism.
      Signed-off-by: NJunio C Hamano <junkio@cox.net>
      47579efc
    • J
      Allow specifying specialized merge-backend per path. · a129d96f
      Junio C Hamano 提交于
      This allows 'merge' attribute to control how the file-level
      three-way merge is done per path.
      
       - If you set 'merge' to true, leave it unspecified, or set it
         to "text", we use the built-in 3-way xdl-merge.
      
       - If you set 'merge' to false, or set it to "binary, the
         "binary" merge is done.  The merge result is the blob from
         'our' tree, but this still leaves the path conflicted, so
         that the mess can be sorted out by the user.  This is
         obviously meant to be useful for binary files.
      
       - 'merge=union' (this is the first example of a string valued
         attribute, introduced in the previous one) uses the "union"
         merge.  The "union" merge takes lines in conflicted hunks
         from both sides, which is useful for line-oriented files such
         as .gitignore.
      
      Instead fo setting merge to 'true' or 'false' by using 'merge'
      or '-merge', setting it explicitly to "text" or "binary" will
      become useful once we start allowing custom per-path backends to
      be added, and allow them to be activated for the default
      (i.e. 'merge' attribute specified to 'true' or 'false') case,
      using some other mechanisms.  Setting merge attribute to "text"
      or "binary" will be a way to explicitly request to override such
      a custom default for selected paths.
      
      Currently there is no way to specify random programs but it
      should be trivial for motivated contributors to add later.
      
      There is one caveat, though.  ll_merge() is called for both
      internal ancestor merge and the outer "final" merge.  I think an
      interactive custom per-path merge backend should refrain from
      going interactive when performing an internal merge (you can
      tell it by checking call_depth) and instead just call either
      ll_xdl_merge() if the content is text, or call ll_binary_merge()
      otherwise.
      Signed-off-by: NJunio C Hamano <junkio@cox.net>
      a129d96f
  4. 17 4月, 2007 2 次提交
    • J
      merge-recursive: separate out xdl_merge() interface. · 3e5261a2
      Junio C Hamano 提交于
      This just moves code around to make the actual call to
      xdl_merge() into a separate function.
      Signed-off-by: NJunio C Hamano <junkio@cox.net>
      3e5261a2
    • J
      Allow more than true/false to attributes. · 515106fa
      Junio C Hamano 提交于
      This allows you to define three values (and possibly more) to
      each attribute: true, false, and unset.
      
      Typically the handlers that notice and act on attribute values
      treat "unset" attribute to mean "do your default thing"
      (e.g. crlf that is unset would trigger "guess from contents"),
      so being able to override a setting to an unset state is
      actually useful.
      
       - If you want to set the attribute value to true, have an entry
         in .gitattributes file that mentions the attribute name; e.g.
      
      	*.o	binary
      
       - If you want to set the attribute value explicitly to false,
         use '-'; e.g.
      
      	*.a	-diff
      
       - If you want to make the attribute value _unset_, perhaps to
         override an earlier entry, use '!'; e.g.
      
      	*.a	-diff
      	c.i.a	!diff
      
      This also allows string values to attributes, with the natural
      syntax:
      
      	attrname=attrvalue
      
      but you cannot use it, as nobody takes notice and acts on
      it yet.
      Signed-off-by: NJunio C Hamano <junkio@cox.net>
      515106fa
  5. 16 4月, 2007 7 次提交
    • J
      Document git-check-attr · b568a503
      James Bowes 提交于
      Signed-off-by: NJames Bowes <jbowes@dangerouslyinc.com>
      Signed-off-by: NJunio C Hamano <junkio@cox.net>
      b568a503
    • J
      Change attribute negation marker from '!' to '-'. · e4aee10a
      Junio C Hamano 提交于
      At the same time, we do not want to allow arbitrary strings for
      attribute names, as we are likely to want to extend the syntax
      later.  Allow only alnum, dash, underscore and dot for now.
      Signed-off-by: NJunio C Hamano <junkio@cox.net>
      e4aee10a
    • J
      Define a built-in attribute macro "binary". · fc2d07b0
      Junio C Hamano 提交于
      For binary files we would want to disable textual diff
      generation and automatic crlf conversion.
      Signed-off-by: NJunio C Hamano <junkio@cox.net>
      fc2d07b0
    • J
      attribute macro support · f48fd688
      Junio C Hamano 提交于
      This adds "attribute macros" (for lack of better name).  So far,
      we have low-level attributes such as crlf and diff, which are
      defined in operational terms --- setting or unsetting them on a
      particular path directly affects what is done to the path.  For
      example, in order to decline diffs or crlf conversions on a
      binary blob, no diffs on PostScript files, and treat all other
      files normally, you would have something like these:
      
      	*		diff crlf
      	*.ps		!diff
      	proprietary.o	!diff !crlf
      
      That is fine as the operation goes, but gets unwieldy rather
      rapidly, when we start adding more low-level attributes that are
      defined in operational terms.  A near-term example of such an
      attribute would be 'merge-3way' which would control if git
      should attempt the usual 3-way file-level merge internally, or
      leave merging to a specialized external program of user's
      choice.  When it is added, we do _not_ want to force the users
      to update the above to:
      
      	*		diff crlf merge-3way
      	*.ps		!diff
      	proprietary.o	!diff !crlf !merge-3way
      
      The way this patch solves this issue is to realize that the
      attributes the user is assigning to paths are not defined in
      terms of operations but in terms of what they are.
      
      All of the three low-level attributes usually make sense for
      most of the files that sane SCM users have git operate on (these
      files are typically called "text').  Only a few cases, such as
      binary blob, need exception to decline the "usual treatment
      given to text files" -- and people mark them as "binary".
      
      So this allows the $GIT_DIR/info/alternates and .gitattributes
      at the toplevel of the project to also specify attributes that
      assigns other attributes.  The syntax is '[attr]' followed by an
      attribute name followed by a list of attribute names:
      
      	[attr] binary	!diff !crlf !merge-3way
      
      When "binary" attribute is set to a path, if the path has not
      got diff/crlf/merge-3way attribute set or unset by other rules,
      this rule unsets the three low-level attributes.
      
      It is expected that the user level .gitattributes will be
      expressed mostly in terms of attributes based on what the files
      are, and the above sample would become like this:
      
      	(built-in attribute configuration)
      	[attr] binary	!diff !crlf !merge-3way
      	*		diff crlf merge-3way
      
      	(project specific .gitattributes)
      	proprietary.o	binary
      
      	(user preference $GIT_DIR/info/attributes)
      	*.ps		!diff
      
      There are a few caveats.
      
       * As described above, you can define these macros only in
         $GIT_DIR/info/attributes and toplevel .gitattributes.
      
       * There is no attempt to detect circular definition of macro
         attributes, and definitions are evaluated from bottom to top
         as usual to fill in other attributes that have not yet got
         values.  The following would work as expected:
      
      	[attr] text	diff crlf
      	[attr] ps	text !diff
      	*.ps	ps
      
         while this would most likely not (I haven't tried):
      
      	[attr] ps	text !diff
      	[attr] text	diff crlf
      	*.ps	ps
      
       * When a macro says "[attr] A B !C", saying that a path does
         not have attribute A does not let you tell anything about
         attributes B or C.  That is, given this:
      
      	[attr] text	diff crlf
      	[attr] ps	text !diff
      	*.txt !ps
      
        path hello.txt, which would match "*.txt" pattern, would have
        "ps" attribute set to zero, but that does not make text
        attribute of hello.txt set to false (nor diff attribute set to
        true).
      Signed-off-by: NJunio C Hamano <junkio@cox.net>
      f48fd688
    • J
      Makefile: add patch-ids.h back in. · 6d4da3de
      Junio C Hamano 提交于
      I lost it by mistake while shuffling the gitattributes series which
      originally was on top of the subproject topic onto the master branch.
      Signed-off-by: NJunio C Hamano <junkio@cox.net>
      6d4da3de
    • J
      Fix 'diff' attribute semantics. · 40250af4
      Junio C Hamano 提交于
      This is in the same spirit as the previous one.  Earlier 'diff'
      meant 'do the built-in binary heuristics and disable patch text
      generation based on it' while '!diff' meant 'do not guess, do
      not generate patch text'.  There was no way to say 'do generate
      patch text even when the heuristics says it has NUL in it'.
      Signed-off-by: NJunio C Hamano <junkio@cox.net>
      40250af4
    • J
      Fix 'crlf' attribute semantics. · 201ac8ef
      Junio C Hamano 提交于
      Earlier we said 'crlf lets the path go through core.autocrlf
      process while !crlf disables it altogether'.  This fixes the
      semantics to:
      
       - Lack of 'crlf' attribute makes core.autocrlf to apply
         (i.e. we guess based on the contents and if platform
         expresses its desire to have CRLF line endings via
         core.autocrlf, we do so).
      
       - Setting 'crlf' attribute to true forces CRLF line endings in
         working tree files, even if blob does not look like text
         (e.g. contains NUL or other bytes we consider binary).
      
       - Setting 'crlf' attribute to false disables conversion.
      Signed-off-by: NJunio C Hamano <junkio@cox.net>
      201ac8ef
  6. 14 4月, 2007 11 次提交
  7. 13 4月, 2007 5 次提交
  8. 12 4月, 2007 4 次提交