1. 30 12月, 2015 1 次提交
    • J
      create_symref: use existing ref-lock code · 370e5ad6
      Jeff King 提交于
      The create_symref() function predates the existence of
      "struct lock_file", let alone the more recent "struct
      ref_lock". Instead, it just does its own manual dot-locking.
      Besides being more code, this has a few downsides:
      
       - if git is interrupted while holding the lock, we don't
         clean up the lockfile
      
       - we don't do the usual directory/filename conflict check.
         So you can sometimes create a symref "refs/heads/foo/bar",
         even if "refs/heads/foo" exists (namely, if the refs are
         packed and we do not hit the d/f conflict in the
         filesystem).
      
      This patch refactors create_symref() to use the "struct
      ref_lock" interface, which handles both of these things.
      There are a few bonus cleanups that come along with it:
      
       - we leaked ref_path in some error cases
      
       - the symref contents were stored in a fixed-size buffer,
         putting an artificial (albeit large) limitation on the
         length of the refname. We now write through fprintf, and
         handle refnames of any size.
      
       - we called adjust_shared_perm only after the file was
         renamed into place, creating a potential race with
         readers in a shared repository. The lockfile code now
         handles this when creating the lockfile, making it
         atomic.
      
       - the legacy prefer_symlink_refs path did not do any
         locking at all. Admittedly, it is not atomic from a
         reader's perspective (as it unlinks and re-creates the
         symlink to overwrite), but at least it cannot conflict
         with other writers now.
      
       - the result of this patch is hopefully more readable. It
         eliminates three goto labels. Two were for error checking
         that is now simplified, and the third was to reach shared
         code that has been pulled into its own function.
      Signed-off-by: NJeff King <peff@peff.net>
      Reviewed-by: NMichael Haggerty <mhagger@alum.mit.edu>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      370e5ad6
  2. 22 12月, 2015 2 次提交
  3. 26 9月, 2015 1 次提交
    • J
      resolve_ref: use strbufs for internal buffers · 495127db
      Jeff King 提交于
      resolve_ref already uses a strbuf internally when generating
      pathnames, but it uses fixed-size buffers for storing the
      refname and symbolic refs. This means that you cannot
      actually point HEAD to a ref that is larger than 256 bytes.
      
      We can lift this limit by using strbufs here, too. Like
      sb_path, we pass the the buffers into our helper function,
      so that we can easily clean up all output paths. We can also
      drop the "unsafe" name from our helper function, as it no
      longer uses a single static buffer (but of course
      resolve_ref_unsafe is still unsafe, because the static
      buffers moved there).
      
      As a bonus, we also get to drop some strcpy calls between
      the two fixed buffers (that cannot currently overflow
      because the two buffers are sized identically).
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      495127db
  4. 22 10月, 2012 1 次提交
    • J
      git symbolic-ref --delete $symref · 9ab55daa
      Johan Herland 提交于
      Teach symbolic-ref to delete symrefs by adding the -d/--delete option to
      git-symbolic-ref. Both proper and dangling symrefs are deleted by this
      option, but other refs - or anything else that is not a symref - is not.
      
      The symref deletion is performed by first verifying that we are given a
      proper symref, and then invoking delete_ref() on it with the REF_NODEREF
      flag.
      Signed-off-by: NJohan Herland <johan@herland.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      9ab55daa
  5. 10 11月, 2010 1 次提交
  6. 14 2月, 2009 1 次提交
    • J
      symbolic-ref: allow refs/<whatever> in HEAD · e9cc02f0
      Jeff King 提交于
      Commit afe5d3d5 introduced a safety valve to symbolic-ref to
      disallow installing an invalid HEAD. It was accompanied by
      b229d18a, which changed validate_headref to require that
      HEAD contain a pointer to refs/heads/ instead of just refs/.
      Therefore, the safety valve also checked for refs/heads/.
      
      As it turns out, topgit is using refs/top-bases/ in HEAD,
      leading us to re-loosen (at least temporarily) the
      validate_headref check made in b229d18a. This patch does the
      corresponding loosening for the symbolic-ref safety valve,
      so that the two are in agreement once more.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      e9cc02f0
  7. 29 1月, 2009 1 次提交
    • J
      symbolic ref: refuse non-ref targets in HEAD · afe5d3d5
      Jeff King 提交于
      When calling "git symbolic-ref" it is easy to forget that
      the target must be a fully qualified ref. E.g., you might
      accidentally do:
      
        $ git symbolic-ref HEAD master
      
      Unfortunately, this is very difficult to recover from,
      because the bogus contents of HEAD make git believe we are
      no longer in a git repository (as is_git_dir explicitly
      checks for "^refs/heads/" in the HEAD target). So
      immediately trying to fix the situation doesn't work:
      
        $ git symbolic-ref HEAD refs/heads/master
        fatal: Not a git repository
      
      and one is left editing the .git/HEAD file manually.
      
      Furthermore, one might be tempted to use symbolic-ref to set
      up a detached HEAD:
      
        $ git symbolic-ref HEAD `git rev-parse HEAD`
      
      which sets up an even more bogus HEAD:
      
        $ cat .git/HEAD
        ref: 1a9ace4f2ad4176148e61b5a85cd63d5604aac6d
      
      This patch introduces a small safety valve to prevent the
      specific case of anything not starting with refs/heads/ to
      go into HEAD. The scope of the safety valve is intentionally
      very limited, to make sure that we are not preventing any
      behavior that would otherwise be valid (like pointing a
      different symref than HEAD outside of refs/heads/).
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      afe5d3d5