X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;f=lib%2Fchoose_repository.tcl;h=318078615862adab052d0d0f637f82176a0a785a;hb=7cce5b2cbc12a73eca3f62a885e9dbad17b250a5;hp=e66df85964cc68bb19c9e12763027d590817b4e3;hpb=914c4d4dcd96218d33f5fefc9c175ea785972f06;p=git.git diff --git a/lib/choose_repository.tcl b/lib/choose_repository.tcl index e66df8596..318078615 100644 --- a/lib/choose_repository.tcl +++ b/lib/choose_repository.tcl @@ -11,6 +11,7 @@ field w_quit ; # Quit button field o_cons ; # Console object (if active) field w_types ; # List of type buttons in clone field w_recentlist ; # Listbox containing recent repositories +field w_localpath ; # Entry widget bound to local_path field done 0 ; # Finished picking the repository? field local_path {} ; # Where this repository is locally @@ -37,7 +38,7 @@ constructor pick {} { menu $m_repo if {[is_MacOSX]} { - $w.mbar add cascade -label [mc Apple] -menu .mbar.apple + $w.mbar add cascade -label Apple -menu .mbar.apple menu $w.mbar.apple $w.mbar.apple add command \ -label [mc "About %s" [appname]] \ @@ -140,12 +141,16 @@ constructor pick {} { $w_recentlist tag conf link \ -foreground blue \ -underline 1 - set home "[file normalize $::env(HOME)][file separator]" + set home $::env(HOME) + if {[is_Cygwin]} { + set home [exec cygpath --windows --absolute $home] + } + set home "[file normalize $home]/" set hlen [string length $home] foreach p $sorted_recent { set path $p if {[string equal -length $hlen $home $p]} { - set p "~[file separator][string range $p $hlen end]" + set p "~/[string range $p $hlen end]" } regsub -all "\n" $p "\\n" p $w_recentlist insert end $p link @@ -286,11 +291,6 @@ method _write_local_path {args} { } method _git_init {} { - if {[file exists $local_path]} { - error_popup [mc "Location %s already exists." $local_path] - return 0 - } - if {[catch {file mkdir $local_path} err]} { error_popup [strcat \ [mc "Failed to create repository %s:" $local_path] \ @@ -324,9 +324,42 @@ proc _is_git {path} { && [file exists [file join $path config]]} { return 1 } + if {[is_Cygwin]} { + if {[file exists [file join $path HEAD]] + && [file exists [file join $path objects.lnk]] + && [file exists [file join $path config.lnk]]} { + return 1 + } + } return 0 } +proc _objdir {path} { + set objdir [file join $path .git objects] + if {[file isdirectory $objdir]} { + return $objdir + } + + set objdir [file join $path objects] + if {[file isdirectory $objdir]} { + return $objdir + } + + if {[is_Cygwin]} { + set objdir [file join $path .git objects.lnk] + if {[file isfile $objdir]} { + return [win32_read_lnk $objdir] + } + + set objdir [file join $path objects.lnk] + if {[file isfile $objdir]} { + return [win32_read_lnk $objdir] + } + } + + return {} +} + ###################################################################### ## ## Create New Repository @@ -353,10 +386,9 @@ method _do_new {} { button $w_body.where.b \ -text [mc "Browse"] \ -command [cb _new_local_path] + set w_localpath $w_body.where.t - pack $w_body.where.b -side right - pack $w_body.where.l -side left - pack $w_body.where.t -fill x + grid $w_body.where.l $w_body.where.t $w_body.where.b -sticky ew pack $w_body.where -fill x trace add variable @local_path write [cb _write_local_path] @@ -380,41 +412,36 @@ method _new_local_path {} { if {$p eq {}} return set p [file normalize $p] - if {[file isdirectory $p]} { - foreach i [glob \ - -directory $p \ - -tails \ - -nocomplain \ - * .*] { - switch -- $i { - . continue - .. continue - default { - error_popup [mc "Directory %s already exists." $p] - return - } - } - } - if {[catch {file delete $p} err]} { - error_popup [strcat \ - [mc "Directory %s already exists." $p] \ - "\n\n$err"] - return - } - } elseif {[file exists $p]} { - error_popup [mc "File %s already exists." $p] + if {![_new_ok $p]} { return } set local_path $p + $w_localpath icursor end } method _do_new2 {} { + if {![_new_ok $local_path]} { + return + } if {![_git_init $this]} { return } set done 1 } +proc _new_ok {p} { + if {[file isdirectory $p]} { + if {[_is_git [file join $p .git]]} { + error_popup [mc "Directory %s already exists." $p] + return 0 + } + } elseif {[file exists $p]} { + error_popup [mc "File %s already exists." $p] + return 0 + } + return 1 +} + ###################################################################### ## ## Clone Existing Repository @@ -455,6 +482,7 @@ method _do_clone {} { -text [mc "Browse"] \ -command [cb _new_local_path] grid $args.where_l $args.where_t $args.where_b -sticky ew + set w_localpath $args.where_t label $args.type_l -text [mc "Clone Type:"] frame $args.type_f @@ -555,13 +583,10 @@ method _do_clone2 {} { } if {$clone_type eq {hardlink} || $clone_type eq {shared}} { - set objdir [file join $origin_url .git objects] - if {![file isdirectory $objdir]} { - set objdir [file join $origin_url objects] - if {![file isdirectory $objdir]} { - error_popup [mc "Not a Git repository: %s" [file tail $origin_url]] - return - } + set objdir [_objdir $origin_url] + if {$objdir eq {}} { + error_popup [mc "Not a Git repository: %s" [file tail $origin_url]] + return } } @@ -573,6 +598,11 @@ method _do_clone2 {} { } } + if {[file exists $local_path]} { + error_popup [mc "Location %s already exists." $local_path] + return + } + if {![_git_init $this]} return set local_path [pwd] @@ -955,9 +985,7 @@ method _do_open {} { -text [mc "Browse"] \ -command [cb _open_local_path] - pack $w_body.where.b -side right - pack $w_body.where.l -side left - pack $w_body.where.t -fill x + grid $w_body.where.l $w_body.where.t $w_body.where.b -sticky ew pack $w_body.where -fill x trace add variable @local_path write [cb _write_local_path]