1 # git-gui remote adding support
2 # Copyright (C) 2008 Petr Baudis
6 field w
; # widget path
7 field w_name
; # new remote name widget
8 field w_loc
; # new remote location widget
10 field name
{}; # name of the remote the user has chosen
11 field location
{}; # location of the remote the user has chosen
13 field opt_action fetch
; # action to do after registering the remote locally
15 constructor dialog
{} {
16 global repo_config use_ttk NS
20 wm title
$top [append "[appname] ([reponame]): " [mc
"Add Remote"]]
22 wm geometry
$top "+[winfo rootx .]+[winfo rooty .]"
25 ${NS
}::label $w.header
-text [mc
"Add New Remote"] \
26 -font font_uibold
-anchor center
27 pack $w.header
-side top
-fill x
29 ${NS
}::frame $w.buttons
30 ${NS
}::button $w.buttons.create
-text [mc Add
] \
33 pack $w.buttons.create
-side right
34 ${NS
}::button $w.buttons.cancel
-text [mc Cancel
] \
35 -command [list destroy $w]
36 pack $w.buttons.cancel
-side right
-padx 5
37 pack $w.buttons
-side bottom
-fill x
-pady 10 -padx 10
39 ${NS
}::labelframe $w.desc
-text [mc
"Remote Details"]
41 ${NS
}::label $w.desc.name_l
-text [mc
"Name:"]
42 set w_name
$w.desc.name_t
43 ${NS
}::entry $w_name \
47 -validatecommand [cb _validate_name
%d
%S
]
48 grid $w.desc.name_l
$w_name -sticky we
-padx {0 5}
50 ${NS
}::label $w.desc.loc_l
-text [mc
"Location:"]
51 set w_loc
$w.desc.loc_t
54 -textvariable @location
55 grid $w.desc.loc_l
$w_loc -sticky we
-padx {0 5}
57 grid columnconfigure
$w.desc
1 -weight 1
58 pack $w.desc
-anchor nw
-fill x
-pady 5 -padx 5
60 ${NS
}::labelframe $w.action
-text [mc
"Further Action"]
62 ${NS
}::radiobutton $w.action.fetch
\
63 -text [mc
"Fetch Immediately"] \
66 pack $w.action.fetch
-anchor nw
68 ${NS
}::radiobutton $w.action.push
\
69 -text [mc
"Initialize Remote Repository and Push"] \
72 pack $w.action.push
-anchor nw
74 ${NS
}::radiobutton $w.action.none
\
75 -text [mc
"Do Nothing Else Now"] \
78 pack $w.action.none
-anchor nw
80 grid columnconfigure
$w.action
1 -weight 1
81 pack $w.action
-anchor nw
-fill x
-pady 5 -padx 5
83 bind $w <Visibility
> [cb _visible
]
84 bind $w <Key-Escape
> [list destroy $w]
85 bind $w <Key-Return
> [cb _add
]\;break
91 global repo_config env
98 -title [wm title
$w] \
100 -message [mc
"Please supply a remote name."]
105 # XXX: We abuse check-ref-format here, but
107 if {[catch {git check-ref-format
"remotes/$name"}]} {
111 -title [wm title
$w] \
113 -message [mc
"'%s' is not an acceptable remote name." $name]
118 if {[catch {add_single_remote
$name $location}]} {
122 -title [wm title
$w] \
124 -message [mc
"Failed to add remote '%s' of location '%s'." $name $location]
129 switch -- $opt_action {
131 set c
[console::new \
132 [mc
"fetch %s" $name] \
133 [mc
"Fetching the %s" $name]]
134 console::exec $c [list git fetch
$name]
140 if { [regexp {(?
:git
\+)?ssh
://([^
/]+)(/.
+)} $location xx host path
]
141 ||
[regexp {([^
:][^
:]+):(.
+)} $location xx host path
]} {
143 if {[info exists env
(GIT_SSH
)]} {
144 set ssh
$env(GIT_SSH
)
146 lappend cmds
[list exec $ssh $host mkdir
-p $location && git
--git-dir
=$path init
--bare]
147 } elseif
{ ! [regexp {://} $location xx
] } {
148 lappend cmds
[list exec mkdir
-p $location]
149 lappend cmds
[list exec git
--git-dir
=$location init
--bare]
154 -title [wm title
$w] \
156 -message [mc
"Do not know how to initialize repository at location '%s'." $location]
161 set c
[console::new \
162 [mc
"push %s" $name] \
163 [mc
"Setting up the %s (at %s)" $name $location]]
165 lappend cmds
[list exec git push
-v --all $name]
166 console::chain $c $cmds
175 method _validate_name
{d S
} {
177 if {[regexp {[~^
:?
*\[\0- ]} $S]} {