Commit 3eae3087 authored by Junio C Hamano's avatar Junio C Hamano

Merge tag 'gitgui-0.21.0' of git://repo.or.cz/git-gui

git-gui 0.21.0

* tag 'gitgui-0.21.0' of git://repo.or.cz/git-gui: (22 commits)
  git-gui: set version 0.21
  git-gui: Mark 'All' in remote.tcl for translation
  git-gui i18n: Updated Bulgarian translation (565,0f,0u)
  git-gui: avoid persisting modified author identity
  git-gui: handle the encoding of Git's output correctly
  git-gui: unicode file name support on windows
  git-gui: Update Russian translation
  git-gui: maintain backwards compatibility for merge syntax
  git-gui i18n: mark string in lib/error.tcl for translation
  git-gui: fix incorrect use of Tcl append command
  git-gui i18n: mark "usage:" strings for translation
  git-gui i18n: internationalize use of colon punctuation
  git-gui: ensure the file in the diff pane is in the list of selected files
  git-gui: support for $FILENAMES in tool definitions
  git-gui: fix initial git gui message encoding
  git-gui/po/glossary/txt-to-pot.sh: use the $( ... ) construct for command substitution
  git-gui (Windows): use git-gui.exe in `Create Desktop Shortcut`
  git-gui: fix detection of Cygwin
  Amend tab ordering and text widget border and highlighting.
  Allow keyboard control to work in the staging widgets.
  ...
parents 65988948 ccc98512
#!/bin/sh
GVF=GIT-VERSION-FILE
DEF_VER=0.20.GITGUI
DEF_VER=0.21.GITGUI
LF='
'
......
......@@ -259,7 +259,7 @@ lib/tclIndex: $(ALL_LIBFILES) GIT-GUI-VARS
rm -f $@ ; \
echo '# Autogenerated by git-gui Makefile' >$@ && \
echo >>$@ && \
$(foreach p,$(PRELOAD_FILES) $(ALL_LIBFILES),echo '$(subst lib/,,$p)' >>$@ &&) \
$(foreach p,$(PRELOAD_FILES) $(sort $(ALL_LIBFILES)),echo '$(subst lib/,,$p)' >>$@ &&) \
echo >>$@ ; \
fi
......
This diff is collapsed.
......@@ -70,7 +70,7 @@ constructor new {i_commit i_path i_jump} {
set path $i_path
make_toplevel top w
wm title $top [append "[appname] ([reponame]): " [mc "File Viewer"]]
wm title $top [mc "%s (%s): File Viewer" [appname] [reponame]]
set font_w [font measure font_diff "0"]
......
......@@ -13,7 +13,7 @@ constructor dialog {} {
global use_ttk NS
make_dialog top w
wm withdraw $w
wm title $top [append "[appname] ([reponame]): " [mc "Checkout Branch"]]
wm title $top [mc "%s (%s): Checkout Branch" [appname] [reponame]]
if {$top ne {.}} {
wm geometry $top "+[winfo rootx .]+[winfo rooty .]"
}
......
......@@ -20,7 +20,7 @@ constructor dialog {} {
make_dialog top w
wm withdraw $w
wm title $top [append "[appname] ([reponame]): " [mc "Create Branch"]]
wm title $top [mc "%s (%s): Create Branch" [appname] [reponame]]
if {$top ne {.}} {
wm geometry $top "+[winfo rootx .]+[winfo rooty .]"
}
......
......@@ -13,7 +13,7 @@ constructor dialog {} {
make_dialog top w
wm withdraw $w
wm title $top [append "[appname] ([reponame]): " [mc "Delete Branch"]]
wm title $top [mc "%s (%s): Delete Branch" [appname] [reponame]]
if {$top ne {.}} {
wm geometry $top "+[winfo rootx .]+[winfo rooty .]"
}
......@@ -128,7 +128,7 @@ method _delete {} {
set b [lindex $i 0]
set o [lindex $i 1]
if {[catch {git branch -D $b} err]} {
append failed " - $b: $err\n"
append failed [mc " - %s:" $b] " $err\n"
}
}
......
......@@ -12,7 +12,7 @@ constructor dialog {} {
make_dialog top w
wm withdraw $w
wm title $top [append "[appname] ([reponame]): " [mc "Rename Branch"]]
wm title $top [mc "%s (%s): Rename Branch" [appname] [reponame]]
if {$top ne {.}} {
wm geometry $top "+[winfo rootx .]+[winfo rooty .]"
}
......
......@@ -24,7 +24,7 @@ constructor new {commit {path {}}} {
global cursor_ptr M1B use_ttk NS
make_dialog top w
wm withdraw $top
wm title $top [append "[appname] ([reponame]): " [mc "File Browser"]]
wm title $top [mc "%s (%s): File Browser" [appname] [reponame]]
if {$path ne {}} {
if {[string index $path end] ne {/}} {
......@@ -197,7 +197,7 @@ method _ls {tree_id {name {}}} {
$w conf -state disabled
set fd [git_read ls-tree -z $tree_id]
fconfigure $fd -blocking 0 -translation binary -encoding binary
fconfigure $fd -blocking 0 -translation binary -encoding utf-8
fileevent $fd readable [cb _read $fd]
}
......@@ -272,7 +272,7 @@ constructor dialog {} {
global use_ttk NS
make_dialog top w
wm withdraw $top
wm title $top [append "[appname] ([reponame]): " [mc "Browse Branch Files"]]
wm title $top [mc "%s (%s): Browse Branch Files" [appname] [reponame]]
if {$top ne {.}} {
wm geometry $top "+[winfo rootx .]+[winfo rooty .]"
wm transient $top .
......
......@@ -2,7 +2,7 @@
# Copyright (C) 2006, 2007 Shawn Pearce
proc load_last_commit {} {
global HEAD PARENT MERGE_HEAD commit_type ui_comm
global HEAD PARENT MERGE_HEAD commit_type ui_comm commit_author
global repo_config
if {[llength $PARENT] == 0} {
......@@ -34,6 +34,8 @@ You are currently in the middle of a merge that has not been fully completed. Y
lappend parents [string range $line 7 end]
} elseif {[string match {encoding *} $line]} {
set enc [string tolower [string range $line 9 end]]
} elseif {[regexp "author (.*)\\s<(.*)>\\s(\\d.*$)" $line all name email time]} {
set commit_author [list name $name email $email date $time]
}
}
set msg [read $fd]
......@@ -106,9 +108,10 @@ proc do_signoff {} {
}
proc create_new_commit {} {
global commit_type ui_comm
global commit_type ui_comm commit_author
set commit_type normal
unset -nocomplain commit_author
$ui_comm delete 0.0 end
$ui_comm edit reset
$ui_comm edit modified false
......@@ -322,11 +325,12 @@ proc commit_writetree {curHEAD msg_p} {
}
proc commit_committree {fd_wt curHEAD msg_p} {
global HEAD PARENT MERGE_HEAD commit_type
global HEAD PARENT MERGE_HEAD commit_type commit_author
global current_branch
global ui_comm selected_commit_type
global file_states selected_paths rescan_active
global repo_config
global env
gets $fd_wt tree_id
if {[catch {close $fd_wt} err]} {
......@@ -366,6 +370,9 @@ A rescan will be automatically started now.
}
}
if {[info exists commit_author]} {
set old_author [commit_author_ident $commit_author]
}
# -- Create the commit.
#
set cmd [list commit-tree $tree_id]
......@@ -381,8 +388,14 @@ A rescan will be automatically started now.
error_popup [strcat [mc "commit-tree failed:"] "\n\n$err"]
ui_status [mc "Commit failed."]
unlock_index
unset -nocomplain commit_author
commit_author_reset $old_author
return
}
if {[info exists commit_author]} {
unset -nocomplain commit_author
commit_author_reset $old_author
}
# -- Update the HEAD ref.
#
......@@ -509,3 +522,20 @@ proc commit_postcommit_wait {fd_ph cmt_id} {
}
fconfigure $fd_ph -blocking 0
}
proc commit_author_ident {details} {
global env
array set author $details
set old [array get env GIT_AUTHOR_*]
set env(GIT_AUTHOR_NAME) $author(name)
set env(GIT_AUTHOR_EMAIL) $author(email)
set env(GIT_AUTHOR_DATE) $author(date)
return $old
}
proc commit_author_reset {details} {
global env
unset env(GIT_AUTHOR_NAME) env(GIT_AUTHOR_EMAIL) env(GIT_AUTHOR_DATE)
if {$details ne {}} {
array set env $details
}
}
......@@ -54,7 +54,7 @@ proc do_stats {} {
set value "$value[lindex $s 2]"
}
${NS}::label $w.stat.l_$name -text "$label:" -anchor w
${NS}::label $w.stat.l_$name -text [mc "%s:" $label] -anchor w
${NS}::label $w.stat.v_$name -text $value -anchor w
grid $w.stat.l_$name $w.stat.v_$name -sticky we -padx {0 5}
}
......@@ -63,7 +63,7 @@ proc do_stats {} {
bind $w <Visibility> "grab $w; focus $w.buttons.close"
bind $w <Key-Escape> [list destroy $w]
bind $w <Key-Return> [list destroy $w]
wm title $w [append "[appname] ([reponame]): " [mc "Database Statistics"]]
wm title $w [mc "%s (%s): Database Statistics" [appname] [reponame]]
wm deiconify $w
tkwait window $w
}
......
......@@ -127,6 +127,9 @@ proc show_diff {path w {lno {}} {scroll_pos {}} {callback {}}} {
} else {
start_show_diff $cont_info
}
global current_diff_path selected_paths
set selected_paths($current_diff_path) 1
}
proc show_unmerged_diff {cont_info} {
......@@ -220,10 +223,9 @@ proc show_other_diff {path w m cont_info} {
}
$ui_diff conf -state normal
if {$type eq {submodule}} {
$ui_diff insert end [append \
"* " \
[mc "Git Repository (subproject)"] \
"\n"] d_info
$ui_diff insert end \
"* [mc "Git Repository (subproject)"]\n" \
d_info
} elseif {![catch {set type [exec file $path]}]} {
set n [string length $path]
if {[string equal -length $n $path $type]} {
......@@ -608,7 +610,7 @@ proc apply_hunk {x y} {
puts -nonewline $p $current_diff_header
puts -nonewline $p [$ui_diff get $s_lno $e_lno]
close $p} err]} {
error_popup [append $failed_msg "\n\n$err"]
error_popup "$failed_msg\n\n$err"
unlock_index
return
}
......@@ -826,7 +828,7 @@ proc apply_range_or_line {x y} {
puts -nonewline $p $current_diff_header
puts -nonewline $p $wholepatch
close $p} err]} {
error_popup [append $failed_msg "\n\n$err"]
error_popup "$failed_msg\n\n$err"
}
unlock_index
......
......@@ -17,7 +17,7 @@ proc error_popup {msg} {
set cmd [list tk_messageBox \
-icon error \
-type ok \
-title [append "$title: " [mc "error"]] \
-title [mc "%s: error" $title] \
-message $msg]
if {[winfo ismapped [_error_parent]]} {
lappend cmd -parent [_error_parent]
......@@ -33,7 +33,7 @@ proc warn_popup {msg} {
set cmd [list tk_messageBox \
-icon warning \
-type ok \
-title [append "$title: " [mc "warning"]] \
-title [mc "%s: warning" $title] \
-message $msg]
if {[winfo ismapped [_error_parent]]} {
lappend cmd -parent [_error_parent]
......@@ -77,7 +77,7 @@ proc hook_failed_popup {hook msg {is_fatal 1}} {
wm withdraw $w
${NS}::frame $w.m
${NS}::label $w.m.l1 -text "$hook hook failed:" \
${NS}::label $w.m.l1 -text [mc "%s hook failed:" $hook] \
-anchor w \
-justify left \
-font font_uibold
......@@ -113,7 +113,7 @@ proc hook_failed_popup {hook msg {is_fatal 1}} {
bind $w <Visibility> "grab $w; focus $w"
bind $w <Key-Return> "destroy $w"
wm title $w [strcat "[appname] ([reponame]): " [mc "error"]]
wm title $w [mc "%s (%s): error" [appname] [reponame]]
wm deiconify $w
tkwait window $w
}
......@@ -115,7 +115,7 @@ proc write_update_indexinfo {fd pathList totalCnt batch after} {
set info [lindex $s 2]
if {$info eq {}} continue
puts -nonewline $fd "$info\t[encoding convertto $path]\0"
puts -nonewline $fd "$info\t[encoding convertto utf-8 $path]\0"
display_file $path $new
}
......@@ -186,7 +186,7 @@ proc write_update_index {fd pathList totalCnt batch after} {
?M {set new M_}
?? {continue}
}
puts -nonewline $fd "[encoding convertto $path]\0"
puts -nonewline $fd "[encoding convertto utf-8 $path]\0"
display_file $path $new
}
......@@ -247,7 +247,7 @@ proc write_checkout_index {fd pathList totalCnt batch after} {
?M -
?T -
?D {
puts -nonewline $fd "[encoding convertto $path]\0"
puts -nonewline $fd "[encoding convertto utf-8 $path]\0"
display_file $path ?_
}
}
......
......@@ -112,7 +112,16 @@ method _start {} {
close $fh
set _last_merged_branch $branch
set cmd [list git merge --strategy=recursive FETCH_HEAD]
if {[git-version >= "2.5.0"]} {
set cmd [list git merge --strategy=recursive FETCH_HEAD]
} else {
set cmd [list git]
lappend cmd merge
lappend cmd --strategy=recursive
lappend cmd [git fmt-merge-msg <[gitdir FETCH_HEAD]]
lappend cmd HEAD
lappend cmd $name
}
ui_status [mc "Merging %s and %s..." $current_branch $stitle]
set cons [console::new [mc "Merge"] "merge $stitle"]
......@@ -144,7 +153,7 @@ constructor dialog {} {
}
make_dialog top w
wm title $top [append "[appname] ([reponame]): " [mc "Merge"]]
wm title $top [mc "%s (%s): Merge" [appname] [reponame]]
if {$top ne {.}} {
wm geometry $top "+[winfo rootx .]+[winfo rooty .]"
}
......
......@@ -179,7 +179,7 @@ proc do_options {} {
i-* {
regexp -- {-(\d+)\.\.(\d+)$} $type _junk min max
${NS}::frame $w.$f.$optid
${NS}::label $w.$f.$optid.l -text "$text:"
${NS}::label $w.$f.$optid.l -text [mc "%s:" $text]
pack $w.$f.$optid.l -side left -anchor w -fill x
tspinbox $w.$f.$optid.v \
-textvariable ${f}_config_new($name) \
......@@ -194,7 +194,7 @@ proc do_options {} {
c -
t {
${NS}::frame $w.$f.$optid
${NS}::label $w.$f.$optid.l -text "$text:"
${NS}::label $w.$f.$optid.l -text [mc "%s:" $text]
${NS}::entry $w.$f.$optid.v \
-width 20 \
-textvariable ${f}_config_new($name)
......@@ -217,7 +217,7 @@ proc do_options {} {
s {
set opts [eval [lindex $option 3]]
${NS}::frame $w.$f.$optid
${NS}::label $w.$f.$optid.l -text "$text:"
${NS}::label $w.$f.$optid.l -text [mc "%s:" $text]
if {$use_ttk} {
ttk::combobox $w.$f.$optid.v \
-textvariable ${f}_config_new($name) \
......@@ -279,7 +279,7 @@ proc do_options {} {
[font configure $font -size]
${NS}::frame $w.global.$name
${NS}::label $w.global.$name.l -text "$text:"
${NS}::label $w.global.$name.l -text [mc "%s:" $text]
${NS}::button $w.global.$name.b \
-text [mc "Change Font"] \
-command [list \
......
......@@ -246,22 +246,22 @@ proc update_all_remotes_menu_entry {} {
if {$have_remote > 1} {
make_sure_remote_submenues_exist $remote_m
if {[$fetch_m type end] eq "command" \
&& [$fetch_m entrycget end -label] ne "All"} {
&& [$fetch_m entrycget end -label] ne [mc "All"]} {
$fetch_m insert end separator
$fetch_m insert end command \
-label "All" \
-label [mc "All"] \
-command fetch_from_all
$prune_m insert end separator
$prune_m insert end command \
-label "All" \
-label [mc "All"] \
-command prune_from_all
}
} else {
if {[winfo exists $fetch_m]} {
if {[$fetch_m type end] eq "command" \
&& [$fetch_m entrycget end -label] eq "All"} {
&& [$fetch_m entrycget end -label] eq [mc "All"]} {
delete_from_menu $fetch_m end
delete_from_menu $fetch_m end
......
......@@ -17,7 +17,7 @@ constructor dialog {} {
make_dialog top w
wm withdraw $top
wm title $top [append "[appname] ([reponame]): " [mc "Add Remote"]]
wm title $top [mc "%s (%s): Add Remote" [appname] [reponame]]
if {$top ne {.}} {
wm geometry $top "+[winfo rootx .]+[winfo rooty .]"
}
......
......@@ -26,7 +26,7 @@ constructor dialog {} {
global all_remotes M1B use_ttk NS
make_dialog top w
wm title $top [append "[appname] ([reponame]): " [mc "Delete Branch Remotely"]]
wm title $top [mc "%s (%s): Delete Branch Remotely" [appname] [reponame]]
if {$top ne {.}} {
wm geometry $top "+[winfo rootx .]+[winfo rooty .]"
}
......
......@@ -5,17 +5,20 @@ proc do_windows_shortcut {} {
global _gitworktree
set fn [tk_getSaveFile \
-parent . \
-title [append "[appname] ([reponame]): " [mc "Create Desktop Icon"]] \
-title [mc "%s (%s): Create Desktop Icon" [appname] [reponame]] \
-initialfile "Git [reponame].lnk"]
if {$fn != {}} {
if {[file extension $fn] ne {.lnk}} {
set fn ${fn}.lnk
}
# Use git-gui.exe if available (ie: git-for-windows)
set cmdLine [auto_execok git-gui.exe]
if {$cmdLine eq {}} {
set cmdLine [list [info nameofexecutable] \
[file normalize $::argv0]]
}
if {[catch {
win32_create_lnk $fn [list \
[info nameofexecutable] \
[file normalize $::argv0] \
] \
win32_create_lnk $fn $cmdLine \
[file normalize $_gitworktree]
} err]} {
error_popup [strcat [mc "Cannot write shortcut:"] "\n\n$err"]
......@@ -37,7 +40,7 @@ proc do_cygwin_shortcut {} {
}
set fn [tk_getSaveFile \
-parent . \
-title [append "[appname] ([reponame]): " [mc "Create Desktop Icon"]] \
-title [mc "%s (%s): Create Desktop Icon" [appname] [reponame]] \
-initialdir $desktop \
-initialfile "Git [reponame].lnk"]
if {$fn != {}} {
......@@ -69,7 +72,7 @@ proc do_macosx_app {} {
set fn [tk_getSaveFile \
-parent . \
-title [append "[appname] ([reponame]): " [mc "Create Desktop Icon"]] \
-title [mc "%s (%s): Create Desktop Icon" [appname] [reponame]] \
-initialdir [file join $env(HOME) Desktop] \
-initialfile "Git [reponame].app"]
if {$fn != {}} {
......
......@@ -78,6 +78,57 @@ proc InitTheme {} {
}
}
# Define a style used for the surround of text widgets.
proc InitEntryFrame {} {
ttk::style theme settings default {
ttk::style layout EntryFrame {
EntryFrame.field -sticky nswe -border 0 -children {
EntryFrame.fill -sticky nswe -children {
EntryFrame.padding -sticky nswe
}
}
}
ttk::style configure EntryFrame -padding 1 -relief sunken
ttk::style map EntryFrame -background {}
}
ttk::style theme settings classic {
ttk::style configure EntryFrame -padding 2 -relief sunken
ttk::style map EntryFrame -background {}
}
ttk::style theme settings alt {
ttk::style configure EntryFrame -padding 2
ttk::style map EntryFrame -background {}
}
ttk::style theme settings clam {
ttk::style configure EntryFrame -padding 2
ttk::style map EntryFrame -background {}
}
# Ignore errors for missing native themes
catch {
ttk::style theme settings winnative {
ttk::style configure EntryFrame -padding 2
}
ttk::style theme settings xpnative {
ttk::style configure EntryFrame -padding 1
ttk::style element create EntryFrame.field vsapi \
EDIT 1 {disabled 4 focus 3 active 2 {} 1} -padding 1
}
ttk::style theme settings vista {
ttk::style configure EntryFrame -padding 2
ttk::style element create EntryFrame.field vsapi \
EDIT 6 {disabled 4 focus 3 active 2 {} 1} -padding 2
}
}
bind EntryFrame <Enter> {%W instate !disabled {%W state active}}
bind EntryFrame <Leave> {%W state !active}
bind EntryFrame <<ThemeChanged>> {
set pad [ttk::style lookup EntryFrame -padding]
%W configure -padding [expr {$pad eq {} ? 1 : $pad}]
}
}
proc gold_frame {w args} {
global use_ttk
if {$use_ttk} {
......@@ -123,7 +174,7 @@ proc paddedlabel {w args} {
# place a themed frame over the surface.
proc Dialog {w args} {
eval [linsert $args 0 toplevel $w -class Dialog]
catch {wm attributes $w -type dialog}
catch {wm attributes $w -type dialog}
pave_toplevel $w
return $w
}
......@@ -193,6 +244,40 @@ proc tspinbox {w args} {
}
}
# Create a text widget with any theme specific properties.
proc ttext {w args} {
global use_ttk
if {$use_ttk} {
switch -- [ttk::style theme use] {
"vista" - "xpnative" {
lappend args -highlightthickness 0 -borderwidth 0
}
}
}
set w [eval [linsert $args 0 text $w]]
if {$use_ttk} {
if {[winfo class [winfo parent $w]] eq "EntryFrame"} {
bind $w <FocusIn> {[winfo parent %W] state focus}
bind $w <FocusOut> {[winfo parent %W] state !focus}
}
}
return $w
}
# themed frame suitable for surrounding a text field.
proc textframe {w args} {
global use_ttk
if {$use_ttk} {
if {[catch {ttk::style layout EntryFrame}]} {
InitEntryFrame
}
eval [linsert $args 0 ttk::frame $w -class EntryFrame -style EntryFrame]
} else {
eval [linsert $args 0 frame $w]
}
return $w
}
proc tentry {w args} {
global use_ttk
if {$use_ttk} {
......
......@@ -69,6 +69,7 @@ proc tools_populate_one {fullname} {
proc tools_exec {fullname} {
global repo_config env current_diff_path
global current_branch is_detached
global selected_paths
if {[is_config_true "guitool.$fullname.needsfile"]} {
if {$current_diff_path eq {}} {
......@@ -100,6 +101,7 @@ proc tools_exec {fullname} {
set env(GIT_GUITOOL) $fullname
set env(FILENAME) $current_diff_path
set env(FILENAMES) [join [array names selected_paths] \n]
if {$is_detached} {
set env(CUR_BRANCH) ""
} else {
......@@ -121,6 +123,7 @@ proc tools_exec {fullname} {
unset env(GIT_GUITOOL)
unset env(FILENAME)
unset env(FILENAMES)
unset env(CUR_BRANCH)
catch { unset env(ARGS) }
catch { unset env(REVISION) }
......
......@@ -19,7 +19,7 @@ constructor dialog {} {
global repo_config use_ttk NS
make_dialog top w
wm title $top [append "[appname] ([reponame]): " [mc "Add Tool"]]
wm title $top [mc "%s (%s): Add Tool" [appname] [reponame]]
if {$top ne {.}} {
wm geometry $top "+[winfo rootx .]+[winfo rooty .]"
wm transient $top .
......@@ -184,7 +184,7 @@ constructor dialog {} {
load_config 1
make_dialog top w
wm title $top [append "[appname] ([reponame]): " [mc "Remove Tool"]]
wm title $top [mc "%s (%s): Remove Tool" [appname] [reponame]]
if {$top ne {.}} {
wm geometry $top "+[winfo rootx .]+[winfo rooty .]"
wm transient $top .
......@@ -280,7 +280,7 @@ constructor dialog {fullname} {
}
make_dialog top w -autodelete 0
wm title $top [append "[appname] ([reponame]): " $title]
wm title $top "[mc "%s (%s):" [appname] [reponame]] $title"
if {$top ne {.}} {
wm geometry $top "+[winfo rootx .]+[winfo rooty .]"
wm transient $top .
......
......@@ -226,7 +226,7 @@ proc do_push_anywhere {} {
bind $w <Visibility> "grab $w; focus $w.buttons.create"
bind $w <Key-Escape> "destroy $w"
bind $w <Key-Return> [list start_push_anywhere_action $w]
wm title $w [append "[appname] ([reponame]): " [mc "Push"]]
wm title $w [mc "%s (%s): Push" [appname] [reponame]]
wm deiconify $w
tkwait window $w
}
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment