1. 16 9月, 2014 19 次提交
    • J
      signed push: remove duplicated protocol info · 4adf569d
      Junio C Hamano 提交于
      With the interim protocol, we used to send the update commands even
      though we already send a signed copy of the same information when
      push certificate is in use.  Update the send-pack/receive-pack pair
      not to do so.
      
      The notable thing on the receive-pack side is that it makes sure
      that there is no command sent over the traditional protocol packet
      outside the push certificate.  Otherwise a pusher can claim to be
      pushing one set of ref updates in the signed certificate while
      issuing commands to update unrelated refs, and such an update will
      evade later audits.
      
      Finally, start documenting the protocol.
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      4adf569d
    • J
      send-pack: send feature request on push-cert packet · 20a7558f
      Junio C Hamano 提交于
      We would want to update the interim protocol so that we do not send
      the usual update commands when the push certificate feature is in
      use, as the same information is in the certificate.  Once that
      happens, the push-cert packet may become the only protocol command,
      but then there is no packet to put the feature request behind, like
      we always did.
      
      As we have prepared the receiving end that understands the push-cert
      feature to accept the feature request on the first protocol packet
      (other than "shallow ", which was an unfortunate historical mistake
      that has to come before everything else), we can give the feature
      request on the push-cert packet instead of the first update protocol
      packet, in preparation for the next step to actually update to the
      final protocol.
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      20a7558f
    • J
      receive-pack: GPG-validate push certificates · d05b9618
      Junio C Hamano 提交于
      Reusing the GPG signature check helpers we already have, verify
      the signature in receive-pack and give the results to the hooks
      via GIT_PUSH_CERT_{SIGNER,KEY,STATUS} environment variables.
      
      Policy decisions, such as accepting or rejecting a good signature by
      a key that is not fully trusted, is left to the hook and kept
      outside of the core.
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      d05b9618
    • J
      push: the beginning of "git push --signed" · a85b377d
      Junio C Hamano 提交于
      While signed tags and commits assert that the objects thusly signed
      came from you, who signed these objects, there is not a good way to
      assert that you wanted to have a particular object at the tip of a
      particular branch.  My signing v2.0.1 tag only means I want to call
      the version v2.0.1, and it does not mean I want to push it out to my
      'master' branch---it is likely that I only want it in 'maint', so
      the signature on the object alone is insufficient.
      
      The only assurance to you that 'maint' points at what I wanted to
      place there comes from your trust on the hosting site and my
      authentication with it, which cannot easily audited later.
      
      Introduce a mechanism that allows you to sign a "push certificate"
      (for the lack of better name) every time you push, asserting that
      what object you are pushing to update which ref that used to point
      at what other object.  Think of it as a cryptographic protection for
      ref updates, similar to signed tags/commits but working on an
      orthogonal axis.
      
      The basic flow based on this mechanism goes like this:
      
       1. You push out your work with "git push --signed".
      
       2. The sending side learns where the remote refs are as usual,
          together with what protocol extension the receiving end
          supports.  If the receiving end does not advertise the protocol
          extension "push-cert", an attempt to "git push --signed" fails.
      
          Otherwise, a text file, that looks like the following, is
          prepared in core:
      
      	certificate version 0.1
      	pusher Junio C Hamano <gitster@pobox.com> 1315427886 -0700
      
      	7339ca65... 21580ecb... refs/heads/master
      	3793ac56... 12850bec... refs/heads/next
      
          The file begins with a few header lines, which may grow as we
          gain more experience.  The 'pusher' header records the name of
          the signer (the value of user.signingkey configuration variable,
          falling back to GIT_COMMITTER_{NAME|EMAIL}) and the time of the
          certificate generation.  After the header, a blank line follows,
          followed by a copy of the protocol message lines.
      
          Each line shows the old and the new object name at the tip of
          the ref this push tries to update, in the way identical to how
          the underlying "git push" protocol exchange tells the ref
          updates to the receiving end (by recording the "old" object
          name, the push certificate also protects against replaying).  It
          is expected that new command packet types other than the
          old-new-refname kind will be included in push certificate in the
          same way as would appear in the plain vanilla command packets in
          unsigned pushes.
      
          The user then is asked to sign this push certificate using GPG,
          formatted in a way similar to how signed tag objects are signed,
          and the result is sent to the other side (i.e. receive-pack).
      
          In the protocol exchange, this step comes immediately before the
          sender tells what the result of the push should be, which in
          turn comes before it sends the pack data.
      
       3. When the receiving end sees a push certificate, the certificate
          is written out as a blob.  The pre-receive hook can learn about
          the certificate by checking GIT_PUSH_CERT environment variable,
          which, if present, tells the object name of this blob, and make
          the decision to allow or reject this push.  Additionally, the
          post-receive hook can also look at the certificate, which may be
          a good place to log all the received certificates for later
          audits.
      
      Because a push certificate carry the same information as the usual
      command packets in the protocol exchange, we can omit the latter
      when a push certificate is in use and reduce the protocol overhead.
      This however is not included in this patch to make it easier to
      review (in other words, the series at this step should never be
      released without the remainder of the series, as it implements an
      interim protocol that will be incompatible with the final one).
      As such, the documentation update for the protocol is left out of
      this step.
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      a85b377d
    • J
      pack-protocol doc: typofix for PKT-LINE · e543b3f6
      Junio C Hamano 提交于
      Everywhere else we use PKT-LINE to denote the pkt-line formatted
      data, but "shallow/deepen" messages are described with PKT_LINE().
      
      Fix them.
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      e543b3f6
    • J
      gpg-interface: move parse_signature() to where it should be · d7c67668
      Junio C Hamano 提交于
      Our signed-tag objects set the standard format used by Git to store
      GPG-signed payload (i.e. the payload followed by its detached
      signature) [*1*], and it made sense to have a helper to find the
      boundary between the payload and its signature in tag.c back then.
      
      Newer code added later to parse other kinds of objects that learned
      to use the same format to store GPG-signed payload (e.g. signed
      commits), however, kept using the helper from the same location.
      
      Move it to gpg-interface; the helper is no longer about signed tag,
      but it is how our code and data interact with GPG.
      
      [Reference]
      *1* http://thread.gmane.org/gmane.linux.kernel/297998/focus=1383Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      d7c67668
    • J
      gpg-interface: move parse_gpg_output() to where it should be · a50e7ca3
      Junio C Hamano 提交于
      Earlier, ffb6d7d5 (Move commit GPG signature verification to
      commit.c, 2013-03-31) moved this helper that used to be in pretty.c
      (i.e. the output code path) to commit.c for better reusability.
      
      It was a good first step in the right direction, but still suffers
      from a myopic view that commits will be the only thing we would ever
      want to sign---we would actually want to be able to reuse it even
      wider.
      
      The function interprets what GPG said; gpg-interface is obviously a
      better place.  Move it there.
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      a50e7ca3
    • J
      send-pack: clarify that cmds_sent is a boolean · c67072b9
      Junio C Hamano 提交于
      We use it to make sure that the feature request is sent only once on
      the very first request packet (ignoring the "shallow " line, which
      was an unfortunate mistake we cannot retroactively fix with existing
      receive-pack already deployed in the field) and we set it to "true"
      with cmds_sent++, not because we care about the actual number of
      updates sent but because it is merely an idiomatic way.
      
      Set it explicitly to one to clarify that the code that uses this
      variable only cares about its zero-ness.
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      c67072b9
    • J
      send-pack: refactor inspecting and resetting status and sending commands · b783aa71
      Junio C Hamano 提交于
      The main loop over remote_refs list inspects the ref status
      to see if we need to generate pack data (i.e. a delete-only push
      does not need to send any additional data), resets it to "expecting
      the status report" state, and formats the actual update commands
      to be sent.
      
      Split the former two out of the main loop, as it will become
      conditional in later steps.
      
      Besides, we should have code that does real thing here, before the
      "Finally, tell the other end!" part ;-)
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      b783aa71
    • J
      send-pack: rename "new_refs" to "need_pack_data" · ab2b0c90
      Junio C Hamano 提交于
      The variable counts how many non-deleting command is being sent, but
      is only checked with 0-ness to decide if we need to send the pack
      data.
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      ab2b0c90
    • J
      receive-pack: factor out capability string generation · 52d2ae58
      Junio C Hamano 提交于
      Similar to the previous one for send-pack, make it easier and
      cleaner to add to capability advertisement.
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      52d2ae58
    • J
      send-pack: factor out capability string generation · 887f3533
      Junio C Hamano 提交于
      A run of 'var ? " var" : ""' fed to a long printf string in a deeply
      nested block was hard to read.  Move it outside the loop and format
      it into a strbuf.
      
      As an added bonus, the trick to add "agent=<agent-name>" by using
      two conditionals is replaced by a more readable version.
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      887f3533
    • J
      send-pack: always send capabilities · 64de20a1
      Junio C Hamano 提交于
      We tried to avoid sending one extra byte, NUL and nothing behind it
      to signal there is no protocol capabilities being sent, on the first
      command packet on the wire, but it just made the code look ugly.
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      64de20a1
    • J
      send-pack: refactor decision to send update per ref · e40671a3
      Junio C Hamano 提交于
      A new helper function ref_update_to_be_sent() decides for each ref
      if the update is to be sent based on the status previously set by
      set_ref_status_for_push() and also if this is a mirrored push.
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      e40671a3
    • J
      send-pack: move REF_STATUS_REJECT_NODELETE logic a bit higher · 621b0599
      Junio C Hamano 提交于
      20e8b465 (refactor ref status logic for pushing, 2010-01-08)
      restructured the code to set status for each ref to be pushed, but
      did not quite go far enough.  We inspect the status set earlier by
      set_refs_status_for_push() and then perform yet another update to
      the status of a ref with an otherwise OK status to be deleted to
      mark it with REF_STATUS_REJECT_NODELETE when the protocol tells us
      never to delete.
      
      Split the latter into a separate loop that comes before we enter the
      per-ref loop.  This way we would have one less condition to check in
      the main loop.
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      621b0599
    • J
      receive-pack: factor out queueing of command · 39895c74
      Junio C Hamano 提交于
      Make a helper function to accept a line of a protocol message and
      queue an update command out of the code from read_head_info().
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      39895c74
    • J
      receive-pack: do not reuse old_sha1[] for other things · c09b71cc
      Junio C Hamano 提交于
      This piece of code reads object names of shallow boundaries, not
      old_sha1[], i.e. the current value the ref points at, which is to be
      replaced by what is in new_sha1[].
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      c09b71cc
    • J
      receive-pack: parse feature request a bit earlier · 0e3c339b
      Junio C Hamano 提交于
      Ideally, we should have also allowed the first "shallow" to carry
      the feature request trailer, but that is water under the bridge
      now.  This makes the next step to factor out the queuing of commands
      easier to review.
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      0e3c339b
    • J
      receive-pack: do not overallocate command structure · 3bfcb95f
      Junio C Hamano 提交于
      An "update" command in the protocol exchange consists of 40-hex old
      object name, SP, 40-hex new object name, SP, and a refname, but the
      first instance is further followed by a NUL with feature requests.
      
      The command structure, which has a flex-array member that stores the
      refname at the end, was allocated based on the whole length of the
      update command, without excluding the trailing feature requests.
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      3bfcb95f
  2. 31 7月, 2014 8 次提交
    • J
      Sync with 2.0.4 · aa544bfb
      Junio C Hamano 提交于
      * maint:
        Git 2.0.4
        commit --amend: test specifies authorship but forgets to check
      aa544bfb
    • J
      Update draft release notes to 2.1 · aa0ba07a
      Junio C Hamano 提交于
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      aa0ba07a
    • J
      Merge branch 'jk/more-push-completion' · 0d9cb2d1
      Junio C Hamano 提交于
      * jk/more-push-completion:
        completion: complete `git push --force-with-lease=`
        completion: add some missing options to `git push`
        completion: complete "unstuck" `git push --recurse-submodules`
      0d9cb2d1
    • J
      Merge branch 'sk/mingw-tests-workaround' · c372e7b0
      Junio C Hamano 提交于
      Make tests pass on msysgit by mostly disabling ones that are
      infeasible on that platform.
      
      * sk/mingw-tests-workaround:
        t800[12]: work around MSys limitation
        t9902: mingw-specific fix for gitfile link files
        t4210: skip command-line encoding tests on mingw
        MinGW: disable legacy encoding tests
        t0110/MinGW: skip tests that pass arbitrary bytes on the command line
        MinGW: Skip test redirecting to fd 4
      c372e7b0
    • J
      Merge branch 'sk/mingw-uni-fix-more' · 385e171a
      Junio C Hamano 提交于
      Most of these are battle-tested in msysgit and are needed to
      complete what has been merged to 'master' already.
      
      * sk/mingw-uni-fix-more:
        Win32: enable color output in Windows cmd.exe
        Win32: patch Windows environment on startup
        Win32: keep the environment sorted
        Win32: use low-level memory allocation during initialization
        Win32: reduce environment array reallocations
        Win32: don't copy the environment twice when spawning child processes
        Win32: factor out environment block creation
        Win32: unify environment function names
        Win32: unify environment case-sensitivity
        Win32: fix environment memory leaks
        Win32: Unicode environment (incoming)
        Win32: Unicode environment (outgoing)
        Revert "Windows: teach getenv to do a case-sensitive search"
        tests: do not pass iso8859-1 encoded parameter
      385e171a
    • J
      Merge branch 'ep/avoid-test-a-o' · 4b0c0e35
      Junio C Hamano 提交于
      * ep/avoid-test-a-o:
        t9814: fix misconversion from test $a -o $b to test $a || test $b
      4b0c0e35
    • J
      Git 2.0.4 · 32f56600
      Junio C Hamano 提交于
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      32f56600
    • F
      commit --amend: test specifies authorship but forgets to check · d8b396e1
      Fabian Ruch 提交于
      The test case "--amend option copies authorship" specifies that the
      git-commit option `--amend` uses the authorship of the replaced
      commit for the new commit. Add the omitted check that this property
      actually holds.
      Signed-off-by: NFabian Ruch <bafain@gmail.com>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      d8b396e1
  3. 29 7月, 2014 13 次提交
    • J
      Merge branch 'maint' · 583b61c1
      Junio C Hamano 提交于
      * maint:
        t4013: test diff-tree's --stdin commit formatting
        diff-tree: avoid lookup_unknown_object
        object_as_type: set commit index
        alloc: factor out commit index
        add object_as_type helper for casting objects
        parse_object_buffer: do not set object type
        move setting of object->type to alloc_* functions
        alloc: write out allocator definitions
        alloc.c: remove the alloc_raw_commit_node() function
      583b61c1
    • J
      t4013: test diff-tree's --stdin commit formatting · d299e9e5
      Jeff King 提交于
      Once upon a time, git-log was just "rev-list | diff-tree",
      and we did not bother to test it separately. These days git-log
      is implemented internally, but we want to make sure that the
      rev-list to diff-tree pipeline continues to function. Let's
      add a basic sanity test.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      d299e9e5
    • J
      Merge branch 'jk/misc-fixes-maint' · ad524f83
      Junio C Hamano 提交于
      * jk/misc-fixes-maint:
        apply: avoid possible bogus pointer
        fix memory leak parsing core.commentchar
        transport: fix leaks in refs_from_alternate_cb
        free ref string returned by dwim_ref
        receive-pack: don't copy "dir" parameter
      ad524f83
    • J
      t1402: check for refs ending with a dot · 919eb8ac
      Jeff King 提交于
      This has been illegal since cbdffe40 (check_ref_format(): tighten
      refname rules, 2009-03-21), but we never tested it.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      919eb8ac
    • J
      Revert "Merge branch 'dt/refs-check-refname-component-sse'" · 5e650228
      Junio C Hamano 提交于
      This reverts commit 6f92e5ff, reversing
      changes made to a02ad882.
      5e650228
    • J
      Revert "Merge branch 'dt/refs-check-refname-component-sse-fix'" · dad2e7f4
      Junio C Hamano 提交于
      This reverts commit 779c99fd, reversing
      changes made to df4d7d56.
      dad2e7f4
    • J
      Merge branch 'jk/alloc-commit-id-maint' into maint · 5d7c37a1
      Junio C Hamano 提交于
      * jk/alloc-commit-id-maint:
        diff-tree: avoid lookup_unknown_object
        object_as_type: set commit index
        alloc: factor out commit index
        add object_as_type helper for casting objects
        parse_object_buffer: do not set object type
        move setting of object->type to alloc_* functions
        alloc: write out allocator definitions
        alloc.c: remove the alloc_raw_commit_node() function
      5d7c37a1
    • J
      diff-tree: avoid lookup_unknown_object · b794ebea
      Jeff King 提交于
      We generally want to avoid lookup_unknown_object, because it
      results in allocating more memory for the object than may be
      strictly necessary.
      
      In this case, it is used to check whether we have an
      already-parsed object before calling parse_object, to save
      us from reading the object from disk. Using lookup_object
      would be fine for that purpose, but we can take it a step
      further. Since this code was written, parse_object already
      learned the "check lookup_object" optimization, so we can
      simply call parse_object directly.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      b794ebea
    • J
      object_as_type: set commit index · 34dfe197
      Jeff King 提交于
      The point of the "index" field of struct commit is that
      every allocated commit would have one. It is supposed to be
      an invariant that whenever object->type is set to
      OBJ_COMMIT, we have a unique index.
      
      Commit 969eba63 (commit: push commit_index update into
      alloc_commit_node, 2014-06-10) covered this case for
      newly-allocated commits. However, we may also allocate an
      "unknown" object via lookup_unknown_object, and only later
      convert it to a commit. We must make sure that we set the
      commit index when we switch the type field.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      34dfe197
    • J
      alloc: factor out commit index · 5de7f500
      Jeff King 提交于
      We keep a static counter to set the commit index on newly
      allocated objects. However, since we also need to set the
      index on any_objects which are converted to commits, let's
      make the counter available as a public function.
      
      While we're moving it, let's make sure the counter is
      allocated as an unsigned integer to match the index field in
      "struct commit".
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      5de7f500
    • J
      add object_as_type helper for casting objects · c4ad00f8
      Jeff King 提交于
      When we call lookup_commit, lookup_tree, etc, the logic goes
      something like:
      
        1. Look for an existing object struct. If we don't have
           one, allocate and return a new one.
      
        2. Double check that any object we have is the expected
           type (and complain and return NULL otherwise).
      
        3. Convert an object with type OBJ_NONE (from a prior
           call to lookup_unknown_object) to the expected type.
      
      We can encapsulate steps 2 and 3 in a helper function which
      checks whether we have the expected object type, converts
      OBJ_NONE as appropriate, and returns the object.
      
      Not only does this shorten the code, but it also provides
      one central location for converting OBJ_NONE objects into
      objects of other types. Future patches will use that to
      enforce type-specific invariants.
      
      Since this is a refactoring, we would want it to behave
      exactly as the current code. It takes a little reasoning to
      see that this is the case:
      
        - for lookup_{commit,tree,etc} functions, we are just
          pulling steps 2 and 3 into a function that does the same
          thing.
      
        - for the call in peel_object, we currently only do step 3
          (but we want to consolidate it with the others, as
          mentioned above). However, step 2 is a noop here, as the
          surrounding conditional makes sure we have OBJ_NONE
          (which we want to keep to avoid an extraneous call to
          sha1_object_info).
      
        - for the call in lookup_commit_reference_gently, we are
          currently doing step 2 but not step 3. However, step 3
          is a noop here. The object we got will have just come
          from deref_tag, which must have figured out the type for
          each object in order to know when to stop peeling.
          Therefore the type will never be OBJ_NONE.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      c4ad00f8
    • J
      parse_object_buffer: do not set object type · fe0444b5
      Jeff King 提交于
      The only way that "obj" can be non-NULL is if it came from
      one of the lookup_* functions. These functions always ensure
      that the object has the expected type (and return NULL
      otherwise), so there is no need for us to set the type.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      fe0444b5
    • J
      move setting of object->type to alloc_* functions · fe24d396
      Jeff King 提交于
      The "struct object" type implements basic object
      polymorphism.  Individual instances are allocated as
      concrete types (or as a union type that can store any
      object), and a "struct object *" can be cast into its real
      type after examining its "type" enum.  This means it is
      dangerous to have a type field that does not match the
      allocation (e.g., setting the type field of a "struct blob"
      to "OBJ_COMMIT" would mean that a reader might read past the
      allocated memory).
      
      In most of the current code this is not a problem; the first
      thing we do after allocating an object is usually to set its
      type field by passing it to create_object. However, the
      virtual commits we create in merge-recursive.c do not ever
      get their type set. This does not seem to have caused
      problems in practice, though (presumably because we always
      pass around a "struct commit" pointer and never even look at
      the type).
      
      We can fix this oversight and also make it harder for future
      code to get it wrong by setting the type directly in the
      object allocation functions.
      
      This will also make it easier to fix problems with commit
      index allocation, as we know that any object allocated by
      alloc_commit_node will meet the invariant that an object
      with an OBJ_COMMIT type field will have a unique index
      number.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      fe24d396