X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;f=lib%2Fchoose_repository.tcl;h=0adcf9d958b76b5a52386effe6afbca95f0abaf9;hb=0c87a951c2970ec5fe204c3743b467819ee42a64;hp=eb4a6d2851c8b08f9ac41236997185ab54ebba65;hpb=28e86952dd0802315d79f57f666fa2c283d0fbe8;p=git.git diff --git a/lib/choose_repository.tcl b/lib/choose_repository.tcl index eb4a6d285..0adcf9d95 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 @@ -30,14 +31,11 @@ constructor pick {} { menu $w.mbar -tearoff 0 $top configure -menu $w.mbar + set m_repo $w.mbar.repository $w.mbar add cascade \ -label [mc Repository] \ - -menu $w.mbar.repository - menu $w.mbar.repository - $w.mbar.repository add command \ - -label [mc Quit] \ - -command exit \ - -accelerator $M1T-Q + -menu $m_repo + menu $m_repo if {[is_MacOSX]} { $w.mbar add cascade -label [mc Apple] -menu .mbar.apple @@ -60,6 +58,7 @@ constructor pick {} { } else { wm geometry $top "+[winfo rootx .]+[winfo rooty .]" bind $top [list destroy $top] + set m_repo {} } pack [git_logo $w.git_logo] -side left -fill y -padx 10 -pady 10 @@ -81,19 +80,52 @@ constructor pick {} { $opts tag bind link_new <1> [cb _next new] $opts insert end [mc "Create New Repository"] link_new $opts insert end "\n" + if {$m_repo ne {}} { + $m_repo add command \ + -command [cb _next new] \ + -accelerator $M1T-N \ + -label [mc "New..."] + bind $top <$M1B-n> [cb _next new] + bind $top <$M1B-N> [cb _next new] + } $opts tag conf link_clone -foreground blue -underline 1 $opts tag bind link_clone <1> [cb _next clone] $opts insert end [mc "Clone Existing Repository"] link_clone $opts insert end "\n" + if {$m_repo ne {}} { + $m_repo add command \ + -command [cb _next clone] \ + -accelerator $M1T-C \ + -label [mc "Clone..."] + bind $top <$M1B-c> [cb _next clone] + bind $top <$M1B-C> [cb _next clone] + } $opts tag conf link_open -foreground blue -underline 1 $opts tag bind link_open <1> [cb _next open] $opts insert end [mc "Open Existing Repository"] link_open $opts insert end "\n" + if {$m_repo ne {}} { + $m_repo add command \ + -command [cb _next open] \ + -accelerator $M1T-O \ + -label [mc "Open..."] + bind $top <$M1B-o> [cb _next open] + bind $top <$M1B-O> [cb _next open] + } + + $opts conf -state disabled set sorted_recent [_get_recentrepos] if {[llength $sorted_recent] > 0} { + if {$m_repo ne {}} { + $m_repo add separator + $m_repo add command \ + -state disabled \ + -label [mc "Recent Repositories"] + } + label $w_body.space label $w_body.recentlabel \ -anchor w \ @@ -109,15 +141,26 @@ 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 $w_recentlist insert end "\n" + + if {$m_repo ne {}} { + $m_repo add command \ + -command [cb _open_recent_path $path] \ + -label " $p" + } } $w_recentlist conf -state disabled $w_recentlist tag bind link <1> [cb _open_recent %x,%y] @@ -136,6 +179,14 @@ constructor pick {} { pack $w_quit -side right -padx 5 pack $w.buttons -side bottom -fill x -padx 10 -pady 10 + if {$m_repo ne {}} { + $m_repo add separator + $m_repo add command \ + -label [mc Quit] \ + -command exit \ + -accelerator $M1T-Q + } + bind $top [cb _invoke_next] bind $top " [cb _center] @@ -217,6 +268,11 @@ method _open_recent {xy} { _do_open2 $this } +method _open_recent_path {p} { + set local_path $p + _do_open2 $this +} + method _next {action} { destroy $w_body if {![winfo exists $w_next]} { @@ -235,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] \ @@ -273,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 @@ -302,6 +386,7 @@ 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 @@ -309,6 +394,7 @@ method _do_new {} { pack $w_body.where -fill x trace add variable @local_path write [cb _write_local_path] + bind $w_body.h [list trace remove variable @local_path write [cb _write_local_path]] update focus $w_body.where.t } @@ -328,41 +414,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 @@ -403,6 +484,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 @@ -434,6 +516,10 @@ method _do_clone {} { trace add variable @local_path write [cb _update_clone] trace add variable @origin_url write [cb _update_clone] + bind $w_body.h " + [list trace remove variable @local_path write [cb _update_clone]] + [list trace remove variable @origin_url write [cb _update_clone]] + " update focus $args.origin_t } @@ -499,13 +585,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 } } @@ -517,6 +600,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] @@ -905,6 +993,7 @@ method _do_open {} { pack $w_body.where -fill x trace add variable @local_path write [cb _write_local_path] + bind $w_body.h [list trace remove variable @local_path write [cb _write_local_path]] update focus $w_body.where.t }