clone: clone from a repository with relative alternates
authorJunio C Hamano <gitster@pobox.com>
Tue, 23 Aug 2011 01:05:16 +0000 (18:05 -0700)
committerJunio C Hamano <gitster@pobox.com>
Tue, 23 Aug 2011 16:56:14 +0000 (09:56 -0700)
commite6baf4a1ae1bb75d59967066ade1290cf105dcd8
treeb003464caf4a0ad3ac48239062bece4249f140e9
parentdbc92b072dd7023f8ba1f682a8060022fc72504a
clone: clone from a repository with relative alternates

Cloning from a local repository blindly copies or hardlinks all the files
under objects/ hierarchy. This results in two issues:

 - If the repository cloned has an "objects/info/alternates" file, and the
   command line of clone specifies --reference, the ones specified on the
   command line get overwritten by the copy from the original repository.

 - An entry in a "objects/info/alternates" file can specify the object
   stores it borrows objects from as a path relative to the "objects/"
   directory. When cloning a repository with such an alternates file, if
   the new repository is not sitting next to the original repository, such
   relative paths needs to be adjusted so that they can be used in the new
   repository.

This updates add_to_alternates_file() to take the path to the alternate
object store, including the "/objects" part at the end (earlier, it was
taking the path to $GIT_DIR and was adding "/objects" itself), as it is
technically possible to specify in objects/info/alternates file the path
of a directory whose name does not end with "/objects".

Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/clone.c
sha1_file.c
t/t5601-clone.sh