git-gui: Copy objects/info/alternates during standard clone

If the source repository is using an objects/info/alternates file
we need to copy the file to our new repository so that it can access
any objects that won't be copied/hardlinked as they are stored in the
alternate location.

We explicitly resolve all paths in the objects/info/alternates as
relative to the source repository but then convert them into an
absolute path for the new clone.  This allows the new clone to
access the exact same locaton as the source repository, even if
relative paths had been used before.

Under Cygwin we assume that Git is Cygwin based and that the paths
in objects/info/alternates must be valid Cygwin UNIX paths, so we
need to run `cygpath --unix` on each line in the alternate list.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
This commit is contained in:
Shawn O. Pearce 2007-09-24 08:50:58 -04:00
Родитель 81d4d3dddc
Коммит 85f77eadcc
1 изменённых файлов: 26 добавлений и 0 удалений

Просмотреть файл

@ -470,6 +470,32 @@ method _do_clone2 {} {
[mc "buckets"]
update
if {[file exists [file join $objdir info alternates]]} {
set pwd [pwd]
if {[catch {
file mkdir [gitdir objects info]
set f_in [open [file join $objdir info alternates] r]
set f_cp [open [gitdir objects info alternates] w]
fconfigure $f_in -translation binary -encoding binary
fconfigure $f_cp -translation binary -encoding binary
cd $objdir
while {[gets $f_in line] >= 0} {
if {[is_Cygwin]} {
puts $f_cp [exec cygpath --unix --absolute $line]
} else {
puts $f_cp [file normalize $line]
}
}
close $f_in
close $f_cp
cd $pwd
} err]} {
catch {cd $pwd}
_clone_failed $this [mc "Unable to copy objects/info/alternates: %s" $err]
return
}
}
set tolink [list]
set buckets [glob \
-tails \