git-gui: Add support for adding remotes
When a remote is being added, it can also be automatically either fetched or initialized and pushed; this patch adds capability for initializing of local and ssh repositories. This also of course leaves a lot of space for further customization features, like individually turning the initialization phase on/off or tuning attributes of the remote repository; I consider that out of scope of this patch, however. Signed-off-by: Petr Baudis <petr.baudis@novartis.com> Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
This commit is contained in:
parent
8329bd0725
commit
ba6485e05d
@ -2448,6 +2448,10 @@ if {[is_enabled branch]} {
|
|||||||
if {[is_enabled transport]} {
|
if {[is_enabled transport]} {
|
||||||
menu .mbar.remote
|
menu .mbar.remote
|
||||||
|
|
||||||
|
.mbar.remote add command \
|
||||||
|
-label [mc "Add..."] \
|
||||||
|
-command remote_add::dialog \
|
||||||
|
-accelerator $M1T-A
|
||||||
.mbar.remote add command \
|
.mbar.remote add command \
|
||||||
-label [mc "Push..."] \
|
-label [mc "Push..."] \
|
||||||
-command do_push_anywhere \
|
-command do_push_anywhere \
|
||||||
|
@ -221,3 +221,18 @@ proc populate_remotes_menu {} {
|
|||||||
add_push_entry $r
|
add_push_entry $r
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
proc add_single_remote {name location} {
|
||||||
|
global all_remotes repo_config
|
||||||
|
lappend all_remotes $name
|
||||||
|
|
||||||
|
git remote add $name $location
|
||||||
|
|
||||||
|
# XXX: Better re-read the config so that we will never get out
|
||||||
|
# of sync with git remote implementation?
|
||||||
|
set repo_config(remote.$name.url) $location
|
||||||
|
set repo_config(remote.$name.fetch) "+refs/heads/*:refs/remotes/$name/*"
|
||||||
|
|
||||||
|
add_fetch_entry $name
|
||||||
|
add_push_entry $name
|
||||||
|
}
|
||||||
|
190
lib/remote_add.tcl
Normal file
190
lib/remote_add.tcl
Normal file
@ -0,0 +1,190 @@
|
|||||||
|
# git-gui remote adding support
|
||||||
|
# Copyright (C) 2008 Petr Baudis
|
||||||
|
|
||||||
|
class remote_add {
|
||||||
|
|
||||||
|
field w ; # widget path
|
||||||
|
field w_name ; # new remote name widget
|
||||||
|
field w_loc ; # new remote location widget
|
||||||
|
|
||||||
|
field name {}; # name of the remote the user has chosen
|
||||||
|
field location {}; # location of the remote the user has chosen
|
||||||
|
|
||||||
|
field opt_action fetch; # action to do after registering the remote locally
|
||||||
|
|
||||||
|
constructor dialog {} {
|
||||||
|
global repo_config
|
||||||
|
|
||||||
|
make_toplevel top w
|
||||||
|
wm title $top [append "[appname] ([reponame]): " [mc "Add Remote"]]
|
||||||
|
if {$top ne {.}} {
|
||||||
|
wm geometry $top "+[winfo rootx .]+[winfo rooty .]"
|
||||||
|
}
|
||||||
|
|
||||||
|
label $w.header -text [mc "Add New Remote"] -font font_uibold
|
||||||
|
pack $w.header -side top -fill x
|
||||||
|
|
||||||
|
frame $w.buttons
|
||||||
|
button $w.buttons.create -text [mc Add] \
|
||||||
|
-default active \
|
||||||
|
-command [cb _add]
|
||||||
|
pack $w.buttons.create -side right
|
||||||
|
button $w.buttons.cancel -text [mc Cancel] \
|
||||||
|
-command [list destroy $w]
|
||||||
|
pack $w.buttons.cancel -side right -padx 5
|
||||||
|
pack $w.buttons -side bottom -fill x -pady 10 -padx 10
|
||||||
|
|
||||||
|
labelframe $w.desc -text [mc "Remote Details"]
|
||||||
|
|
||||||
|
label $w.desc.name_l -text [mc "Name:"]
|
||||||
|
set w_name $w.desc.name_t
|
||||||
|
entry $w_name \
|
||||||
|
-borderwidth 1 \
|
||||||
|
-relief sunken \
|
||||||
|
-width 40 \
|
||||||
|
-textvariable @name \
|
||||||
|
-validate key \
|
||||||
|
-validatecommand [cb _validate_name %d %S]
|
||||||
|
grid $w.desc.name_l $w_name -sticky we -padx {0 5}
|
||||||
|
|
||||||
|
label $w.desc.loc_l -text [mc "Location:"]
|
||||||
|
set w_loc $w.desc.loc_t
|
||||||
|
entry $w_loc \
|
||||||
|
-borderwidth 1 \
|
||||||
|
-relief sunken \
|
||||||
|
-width 40 \
|
||||||
|
-textvariable @location
|
||||||
|
grid $w.desc.loc_l $w_loc -sticky we -padx {0 5}
|
||||||
|
|
||||||
|
grid columnconfigure $w.desc 1 -weight 1
|
||||||
|
pack $w.desc -anchor nw -fill x -pady 5 -padx 5
|
||||||
|
|
||||||
|
labelframe $w.action -text [mc "Further Action"]
|
||||||
|
|
||||||
|
radiobutton $w.action.fetch \
|
||||||
|
-text [mc "Fetch Immediately"] \
|
||||||
|
-value fetch \
|
||||||
|
-variable @opt_action
|
||||||
|
pack $w.action.fetch -anchor nw
|
||||||
|
|
||||||
|
radiobutton $w.action.push \
|
||||||
|
-text [mc "Initialize Remote Repository and Push"] \
|
||||||
|
-value push \
|
||||||
|
-variable @opt_action
|
||||||
|
pack $w.action.push -anchor nw
|
||||||
|
|
||||||
|
radiobutton $w.action.none \
|
||||||
|
-text [mc "Do Nothing Else Now"] \
|
||||||
|
-value none \
|
||||||
|
-variable @opt_action
|
||||||
|
pack $w.action.none -anchor nw
|
||||||
|
|
||||||
|
grid columnconfigure $w.action 1 -weight 1
|
||||||
|
pack $w.action -anchor nw -fill x -pady 5 -padx 5
|
||||||
|
|
||||||
|
bind $w <Visibility> [cb _visible]
|
||||||
|
bind $w <Key-Escape> [list destroy $w]
|
||||||
|
bind $w <Key-Return> [cb _add]\;break
|
||||||
|
tkwait window $w
|
||||||
|
}
|
||||||
|
|
||||||
|
method _add {} {
|
||||||
|
global repo_config env
|
||||||
|
global M1B
|
||||||
|
|
||||||
|
if {$name eq {}} {
|
||||||
|
tk_messageBox \
|
||||||
|
-icon error \
|
||||||
|
-type ok \
|
||||||
|
-title [wm title $w] \
|
||||||
|
-parent $w \
|
||||||
|
-message [mc "Please supply a remote name."]
|
||||||
|
focus $w_name
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
# XXX: We abuse check-ref-format here, but
|
||||||
|
# that should be ok.
|
||||||
|
if {[catch {git check-ref-format "remotes/$name"}]} {
|
||||||
|
tk_messageBox \
|
||||||
|
-icon error \
|
||||||
|
-type ok \
|
||||||
|
-title [wm title $w] \
|
||||||
|
-parent $w \
|
||||||
|
-message [mc "'%s' is not an acceptable remote name." $name]
|
||||||
|
focus $w_name
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if {[catch {add_single_remote $name $location}]} {
|
||||||
|
tk_messageBox \
|
||||||
|
-icon error \
|
||||||
|
-type ok \
|
||||||
|
-title [wm title $w] \
|
||||||
|
-parent $w \
|
||||||
|
-message [mc "Failed to add remote '%s' of location '%s'." $name $location]
|
||||||
|
focus $w_name
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
switch -- $opt_action {
|
||||||
|
fetch {
|
||||||
|
set c [console::new \
|
||||||
|
[mc "fetch %s" $remote] \
|
||||||
|
[mc "Fetching the %s" $remote]]
|
||||||
|
console::exec $c [list git fetch --all $name]
|
||||||
|
}
|
||||||
|
push {
|
||||||
|
set cmds [list]
|
||||||
|
|
||||||
|
# Parse the location
|
||||||
|
if { [regexp {(?:git\+)?ssh://([^/]+)(/.+)} $location xx host path]
|
||||||
|
|| [regexp {([^:][^:]+):(.+)} $location xx host path]} {
|
||||||
|
set ssh ssh
|
||||||
|
if {[info exists env(GIT_SSH)]} {
|
||||||
|
set ssh $env(GIT_SSH)
|
||||||
|
}
|
||||||
|
lappend cmds [list exec $ssh $host git --git-dir=$path init --bare]
|
||||||
|
} elseif { ! [regexp {://} $location xx] } {
|
||||||
|
lappend cmds [list exec git --git-dir=$location init --bare]
|
||||||
|
} else {
|
||||||
|
tk_messageBox \
|
||||||
|
-icon error \
|
||||||
|
-type ok \
|
||||||
|
-title [wm title $w] \
|
||||||
|
-parent $w \
|
||||||
|
-message [mc "Do not know how to initialize repository at location '%s'." $location]
|
||||||
|
destroy $w
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
set c [console::new \
|
||||||
|
[mc "push %s" $name] \
|
||||||
|
[mc "Setting up the %s (at %s)" $name $location]]
|
||||||
|
|
||||||
|
lappend cmds [list exec git push -v --all $name]
|
||||||
|
console::chain $c $cmds
|
||||||
|
}
|
||||||
|
none {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
destroy $w
|
||||||
|
}
|
||||||
|
|
||||||
|
method _validate_name {d S} {
|
||||||
|
if {$d == 1} {
|
||||||
|
if {[regexp {[~^:?*\[\0- ]} $S]} {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
method _visible {} {
|
||||||
|
grab $w
|
||||||
|
$w_name icursor end
|
||||||
|
focus $w_name
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user