git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Pratyush Yadav <me@yadavpratyush.com>
To: Paul Mackerras <paulus@ozlabs.org>
Cc: git@vger.kernel.org
Subject: Re: [PATCH] gitk: Make web links clickable
Date: Wed, 28 Aug 2019 03:28:32 +0530	[thread overview]
Message-ID: <20190827215832.ela2e6cuanuk6rvp@yadavpratyush.com> (raw)
In-Reply-To: <20190826221444.GB7402@blackberry>

On 27/08/19 08:14AM, Paul Mackerras wrote:
> This makes gitk look for lines in the commit message which start with
> "Link:" or "BugLink:" followed by a http or https URL, and make the
> URL clickable.  Clicking on it will invoke an external web browser with
> the URL.
 
Why just lines starting with "Link:" or "BugLink:"? Why not do it for 
all links?

> The web browser command is by default "xdg-open" on Linux, "open" on
> MacOS, and "cmd /c start" on Windows.  The command can be changed in
> the preferences window, and it can include parameters as well as the
> command name.  If it is set to the empty string then URLs will no
> longer be made clickable.
> 
> Signed-off-by: Paul Mackerras <paulus@ozlabs.org>
> ---
>  gitk | 51 ++++++++++++++++++++++++++++++++++++++++++++++++++-
>  1 file changed, 50 insertions(+), 1 deletion(-)
> 
> diff --git a/gitk b/gitk
> index a14d7a1..4577150 100755
> --- a/gitk
> +++ b/gitk
> @@ -7016,6 +7016,7 @@ proc commit_descriptor {p} {
>  
>  # append some text to the ctext widget, and make any SHA1 ID
>  # that we know about be a clickable link.
> +# Also look for lines of the form "Link: http..." and make them web links.
>  proc appendwithlinks {text tags} {
>      global ctext linknum curview
>  
> @@ -7032,6 +7033,18 @@ proc appendwithlinks {text tags} {
>  	setlink $linkid link$linknum
>  	incr linknum
>      }
> +    set wlinks [regexp -indices -all -inline -line \
> +		    {^ *(Bug|)Link: (https?://.*)$} $text]

Will it be a better idea to stop at the first whitespace character, 
instead of stopping at the end of the line?

> +    foreach {l sub1 sub2} $wlinks {
> +	set s2 [lindex $sub2 0]
> +	set e2 [lindex $sub2 1]
> +	set url [string range $text $s2 $e2]
> +	incr e2
> +	$ctext tag delete link$linknum
> +	$ctext tag add link$linknum "$start + $s2 c" "$start + $e2 c"
> +	setwlink $url link$linknum
> +	incr linknum
> +    }
>  }
>  
>  proc setlink {id lk} {
> @@ -7064,6 +7077,18 @@ proc setlink {id lk} {
>      }
>  }
>  
> +proc setwlink {url lk} {
> +    global ctext
> +    global linkfgcolor
> +    global web_browser
> +
> +    if {$web_browser eq {}} return
> +    $ctext tag conf $lk -foreground $linkfgcolor -underline 1
> +    $ctext tag bind $lk <1> [list browseweb $url]
> +    $ctext tag bind $lk <Enter> {linkcursor %W 1}
> +    $ctext tag bind $lk <Leave> {linkcursor %W -1}
> +}
> +
>  proc appendshortlink {id {pre {}} {post {}}} {
>      global ctext linknum
>  
> @@ -7098,6 +7123,16 @@ proc linkcursor {w inc} {
>      }
>  }
>  
> +proc browseweb {url} {
> +    global web_browser
> +
> +    if {$web_browser eq {}} return
> +    # Use eval here in case $web_browser is a command plus some arguments
> +    if {[catch {eval exec $web_browser [list $url] &} err]} {
> +	error_popup "[mc "Error starting web browser:"] $err"
> +    }
> +}
> +
>  proc viewnextline {dir} {
>      global canv linespc
>  
> @@ -11488,7 +11523,7 @@ proc create_prefs_page {w} {
>  proc prefspage_general {notebook} {
>      global NS maxwidth maxgraphpct showneartags showlocalchanges
>      global tabstop limitdiffs autoselect autosellen extdifftool perfile_attrs
> -    global hideremotes want_ttk have_ttk maxrefs
> +    global hideremotes want_ttk have_ttk maxrefs web_browser
>  
>      set page [create_prefs_page $notebook.general]
>  
> @@ -11539,6 +11574,13 @@ proc prefspage_general {notebook} {
>      pack configure $page.extdifff.l -padx 10
>      grid x $page.extdifff $page.extdifft -sticky ew
>  
> +    ${NS}::entry $page.webbrowser -textvariable web_browser
> +    ${NS}::frame $page.webbrowserf
> +    ${NS}::label $page.webbrowserf.l -text [mc "Web browser" ]
> +    pack $page.webbrowserf.l -side left
> +    pack configure $page.webbrowserf.l -padx 10
> +    grid x $page.webbrowserf $page.webbrowser -sticky ew
> +
>      ${NS}::label $page.lgen -text [mc "General options"]
>      grid $page.lgen - -sticky w -pady 10
>      ${NS}::checkbutton $page.want_ttk -variable want_ttk \
> @@ -12310,6 +12352,7 @@ if {[tk windowingsystem] eq "win32"} {
>      set bgcolor SystemWindow
>      set fgcolor SystemWindowText
>      set selectbgcolor SystemHighlight
> +    set web_browser "cmd /c start"
>  } else {
>      set uicolor grey85
>      set uifgcolor black
> @@ -12317,6 +12360,11 @@ if {[tk windowingsystem] eq "win32"} {
>      set bgcolor white
>      set fgcolor black
>      set selectbgcolor gray85
> +    if {[tk windowingsystem] eq "aqua"} {
> +	set web_browser "open"
> +    } else {
> +	set web_browser "xdg-open"
> +    }
>  }
>  set diffcolors {red "#00a000" blue}
>  set diffcontext 3
> @@ -12390,6 +12438,7 @@ set config_variables {
>      filesepbgcolor filesepfgcolor linehoverbgcolor linehoverfgcolor
>      linehoveroutlinecolor mainheadcirclecolor workingfilescirclecolor
>      indexcirclecolor circlecolors linkfgcolor circleoutlinecolor
> +    web_browser
>  }
>  foreach var $config_variables {
>      config_init_trace $var
> -- 
> 2.7.4
> 

-- 
Regards,
Pratyush Yadav

  parent reply	other threads:[~2019-08-27 21:58 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-08-26 22:14 [PATCH] gitk: Make web links clickable Paul Mackerras
2019-08-27 15:33 ` Barret Rhoden
2019-08-27 20:32 ` Junio C Hamano
2019-08-29  0:50   ` Paul Mackerras
2019-08-29  3:46     ` Junio C Hamano
2019-08-27 21:58 ` Pratyush Yadav [this message]
2019-08-29  1:27 ` [PATCH v2] " Paul Mackerras
2019-08-29 18:32   ` Pratyush Yadav
2019-09-13 23:33     ` Paul Mackerras
2019-09-14 14:30       ` Pratyush Yadav

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190827215832.ela2e6cuanuk6rvp@yadavpratyush.com \
    --to=me@yadavpratyush.com \
    --cc=git@vger.kernel.org \
    --cc=paulus@ozlabs.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).