* [PATCH] Add a basic support of SHA256 repositories into Gitk
@ 2021-06-14 16:18 Rostislav Krasny via GitGitGadget
2021-06-16 1:28 ` Junio C Hamano
2022-05-02 14:24 ` Rostislav Krasny
0 siblings, 2 replies; 5+ messages in thread
From: Rostislav Krasny via GitGitGadget @ 2021-06-14 16:18 UTC (permalink / raw)
To: git; +Cc: Rostislav Krasny
From: Rostislav Krasny <rosti.bsd@gmail.com>
Signed-off-by: Rostislav Krasny <rosti.bsd@gmail.com>
---
gitk: Add a basic support of SHA256 repositories into Gitk
This PR makes Gitk working on both SHA256 and SHA1 repositories without
errors/crashes. I made it by changing and testing the gitk script of Git
for Windows [https://gitforwindows.org/] version 2.32.0.windows.1 that
is a little bit different than the mainstream 2.32.0 version.
Still not fixed functionality: [1] There is the "Auto-select SHA1
(length)" configuration preference that affects "Copy commit reference"
on both SHA1 and SHA256 repositories.
A new "Auto-select SHA256 (length)" configuration preference should be
added and used on SHA256 repositories instead of the old one. Since I'm
not familiar with Tcl/Tk and this issue isn't critical I didn't
implement it.
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-979%2Frosti-il%2Fgitk-sha256-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-979/rosti-il/gitk-sha256-v1
Pull-Request: https://github.com/gitgitgadget/git/pull/979
gitk-git/gitk | 66 ++++++++++++++++++++++++++++++++++++---------------
1 file changed, 47 insertions(+), 19 deletions(-)
diff --git a/gitk-git/gitk b/gitk-git/gitk
index 23d9dd1fe0d0..2da53604cdc8 100755
--- a/gitk-git/gitk
+++ b/gitk-git/gitk
@@ -290,6 +290,7 @@ proc parseviewargs {n arglist} {
proc parseviewrevs {view revs} {
global vposids vnegids
+ global hashlength
if {$revs eq {}} {
set revs HEAD
@@ -303,7 +304,7 @@ proc parseviewrevs {view revs} {
set badrev {}
for {set l 0} {$l < [llength $errlines]} {incr l} {
set line [lindex $errlines $l]
- if {!([string length $line] == 40 && [string is xdigit $line])} {
+ if {!([string length $line] == $hashlength && [string is xdigit $line])} {
if {[string match "fatal:*" $line]} {
if {[string match "fatal: ambiguous argument*" $line]
&& $badrev ne {}} {
@@ -507,6 +508,7 @@ proc updatecommits {} {
global hasworktree
global varcid vposids vnegids vflags vrevs
global show_notes
+ global hashlength
set hasworktree [hasworktree]
rereadrefs
@@ -540,7 +542,7 @@ proc updatecommits {} {
# take out positive refs that we asked for before or
# that we have already seen
foreach rev $revs {
- if {[string length $rev] == 40} {
+ if {[string length $rev] == $hashlength} {
if {[lsearch -exact $oldpos $rev] < 0
&& ![info exists varcid($view,$rev)]} {
lappend newrevs $rev
@@ -1418,6 +1420,7 @@ proc getcommitlines {fd inst view updating} {
global parents children curview hlview
global idpending ordertok
global varccommits varcid varctok vtokmod vfilelimit vshortids
+ global hashlength
set stuff [read $fd 500000]
# git log doesn't terminate the last commit with a null...
@@ -1500,7 +1503,7 @@ proc getcommitlines {fd inst view updating} {
}
set ok 1
foreach id $ids {
- if {[string length $id] != 40} {
+ if {[string length $id] != $hashlength} {
set ok 0
break
}
@@ -1780,6 +1783,7 @@ proc readrefs {} {
global selecthead selectheadid
global hideremotes
global tclencoding
+ global hashlength
foreach v {tagids idtags headids idheads otherrefids idotherrefs} {
unset -nocomplain $v
@@ -1789,9 +1793,9 @@ proc readrefs {} {
fconfigure $refd -encoding $tclencoding
}
while {[gets $refd line] >= 0} {
- if {[string index $line 40] ne " "} continue
- set id [string range $line 0 39]
- set ref [string range $line 41 end]
+ if {[string index $line $hashlength] ne " "} continue
+ set id [string range $line 0 [expr {$hashlength - 1}]]
+ set ref [string range $line [expr {$hashlength + 1}] end]
if {![string match "refs/*" $ref]} continue
set name [string range $ref 5 end]
if {[string match "remotes/*" $name]} {
@@ -2082,6 +2086,7 @@ proc makewindow {} {
global have_tk85 use_ttk NS
global git_version
global worddiff
+ global hashlength hashalgorithm
# The "mc" arguments here are purely so that xgettext
# sees the following string as needing to be translated
@@ -2203,11 +2208,11 @@ proc makewindow {} {
set sha1entry .tf.bar.sha1
set entries $sha1entry
set sha1but .tf.bar.sha1label
- button $sha1but -text "[mc "SHA1 ID:"] " -state disabled -relief flat \
+ button $sha1but -text "[mc "$hashalgorithm ID:"] " -state disabled -relief flat \
-command gotocommit -width 8
$sha1but conf -disabledforeground [$sha1but cget -foreground]
pack .tf.bar.sha1label -side left
- ${NS}::entry $sha1entry -width 40 -font textfont -textvariable sha1string
+ ${NS}::entry $sha1entry -width $hashlength -font textfont -textvariable sha1string
trace add variable sha1string write sha1change
pack $sha1entry -side left -pady 2
@@ -3926,6 +3931,7 @@ proc stopblaming {} {
proc read_line_source {fd inst} {
global blamestuff curview commfd blameinst nullid nullid2
+ global hashlength
while {[gets $fd line] >= 0} {
lappend blamestuff($inst) $line
@@ -3946,7 +3952,7 @@ proc read_line_source {fd inst} {
set line [split [lindex $blamestuff($inst) 0] " "]
set id [lindex $line 0]
set lnum [lindex $line 1]
- if {[string length $id] == 40 && [string is xdigit $id] &&
+ if {[string length $id] == $hashlength && [string is xdigit $id] &&
[string is digit -strict $lnum]} {
# look for "filename" line
foreach l $blamestuff($inst) {
@@ -5269,13 +5275,14 @@ proc get_viewmainhead {view} {
# git rev-list should give us just 1 line to use as viewmainheadid($view)
proc getviewhead {fd inst view} {
global viewmainheadid commfd curview viewinstances showlocalchanges
+ global hashlength
set id {}
if {[gets $fd line] < 0} {
if {![eof $fd]} {
return 1
}
- } elseif {[string length $line] == 40 && [string is xdigit $line]} {
+ } elseif {[string length $line] == $hashlength && [string is xdigit $line]} {
set id $line
}
set viewmainheadid($view) $id
@@ -7039,10 +7046,11 @@ proc commit_descriptor {p} {
# Also look for URLs of the form "http[s]://..." and make them web links.
proc appendwithlinks {text tags} {
global ctext linknum curview
+ global hashlength
set start [$ctext index "end - 1c"]
$ctext insert end $text $tags
- set links [regexp -indices -all -inline {(?:\m|-g)[0-9a-f]{6,40}\M} $text]
+ set links [regexp -indices -all -inline [string map "@@ $hashlength" {(?:\m|-g)[0-9a-f]{6,@@}\M}] $text]
foreach l $links {
set s [lindex $l 0]
set e [lindex $l 1]
@@ -8716,13 +8724,17 @@ proc incrfont {inc} {
proc clearsha1 {} {
global sha1entry sha1string
- if {[string length $sha1string] == 40} {
+ global hashlength
+
+ if {[string length $sha1string] == $hashlength} {
$sha1entry delete 0 end
}
}
proc sha1change {n1 n2 op} {
global sha1string currentid sha1but
+ global hashalgorithm
+
if {$sha1string == {}
|| ([info exists currentid] && $sha1string == $currentid)} {
set state disabled
@@ -8733,12 +8745,13 @@ proc sha1change {n1 n2 op} {
if {$state == "normal"} {
$sha1but conf -state normal -relief raised -text "[mc "Goto:"] "
} else {
- $sha1but conf -state disabled -relief flat -text "[mc "SHA1 ID:"] "
+ $sha1but conf -state disabled -relief flat -text "[mc "$hashalgorithm ID:"] "
}
}
proc gotocommit {} {
global sha1string tagids headids curview varcid
+ global hashlength hashalgorithm
if {$sha1string == {}
|| ([info exists currentid] && $sha1string == $currentid)} return
@@ -8748,11 +8761,11 @@ proc gotocommit {} {
set id $headids($sha1string)
} else {
set id [string tolower $sha1string]
- if {[regexp {^[0-9a-f]{4,39}$} $id]} {
+ if {[regexp [string map "@@ [expr $hashlength - 1]" {^[0-9a-f]{4,@@}$}] $id]} {
set matches [longid $id]
if {$matches ne {}} {
if {[llength $matches] > 1} {
- error_popup [mc "Short SHA1 id %s is ambiguous" $id]
+ error_popup [mc "Short $hashalgorithm id %s is ambiguous" $id]
return
}
set id [lindex $matches 0]
@@ -8769,7 +8782,7 @@ proc gotocommit {} {
return
}
if {[regexp {^[0-9a-fA-F]{4,}$} $sha1string]} {
- set msg [mc "SHA1 id %s is not known" $sha1string]
+ set msg [mc "$hashalgorithm id %s is not known" $sha1string]
} else {
set msg [mc "Revision %s is not in the current view" $sha1string]
}
@@ -9446,10 +9459,11 @@ proc mktaggo {} {
proc copyreference {} {
global rowmenuid autosellen
+ global hashlength
set format "%h (\"%s\", %ad)"
set cmd [list git show -s --pretty=format:$format --date=short]
- if {$autosellen < 40} {
+ if {$autosellen < $hashlength} {
lappend cmd --abbrev=$autosellen
}
set reference [eval exec $cmd $rowmenuid]
@@ -9460,6 +9474,7 @@ proc copyreference {} {
proc writecommit {} {
global rowmenuid wrcomtop commitinfo wrcomcmd NS
+ global hashlength
set top .writecommit
set wrcomtop $top
@@ -9469,7 +9484,7 @@ proc writecommit {} {
${NS}::label $top.title -text [mc "Write commit to file"]
grid $top.title - -pady 10
${NS}::label $top.id -text [mc "ID:"]
- ${NS}::entry $top.sha1 -width 40
+ ${NS}::entry $top.sha1 -width $hashlength
$top.sha1 insert 0 $rowmenuid
$top.sha1 conf -state readonly
grid $top.id $top.sha1 -sticky w
@@ -9549,6 +9564,7 @@ proc mvbranch {} {
proc branchdia {top valvar uivar} {
global NS commitinfo
+ global hashlength
upvar $valvar val $uivar ui
catch {destroy $top}
@@ -9557,7 +9573,7 @@ proc branchdia {top valvar uivar} {
${NS}::label $top.title -text $ui(title)
grid $top.title - -pady 10
${NS}::label $top.id -text [mc "ID:"]
- ${NS}::entry $top.sha1 -width 40
+ ${NS}::entry $top.sha1 -width $hashlength
$top.sha1 insert 0 $val(id)
$top.sha1 conf -state readonly
grid $top.id $top.sha1 -sticky w
@@ -12320,6 +12336,18 @@ if {$tclencoding == {}} {
puts stderr "Warning: encoding $gitencoding is not supported by Tcl/Tk"
}
+set objformat [exec git rev-parse --show-object-format]
+if {$objformat eq "sha1"} {
+ set hashlength 40
+} elseif {$objformat eq "sha256"} {
+ set hashlength 64
+} else {
+ error_popup "[mc "Not supported hash algorithm:"] {$objformat}"
+ exit 1
+}
+set hashalgorithm [string toupper $objformat]
+unset objformat
+
set gui_encoding [encoding system]
catch {
set enc [exec git config --get gui.encoding]
base-commit: ebf3c04b262aa27fbb97f8a0156c2347fecafafb
--
gitgitgadget
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH] Add a basic support of SHA256 repositories into Gitk
2021-06-14 16:18 [PATCH] Add a basic support of SHA256 repositories into Gitk Rostislav Krasny via GitGitGadget
@ 2021-06-16 1:28 ` Junio C Hamano
2021-06-16 14:19 ` Ævar Arnfjörð Bjarmason
2022-05-02 14:24 ` Rostislav Krasny
1 sibling, 1 reply; 5+ messages in thread
From: Junio C Hamano @ 2021-06-16 1:28 UTC (permalink / raw)
To: Paul Mackerras; +Cc: Rostislav Krasny via GitGitGadget, git, Rostislav Krasny
"Rostislav Krasny via GitGitGadget" <gitgitgadget@gmail.com> writes:
> From: Rostislav Krasny <rosti.bsd@gmail.com>
>
> Signed-off-by: Rostislav Krasny <rosti.bsd@gmail.com>
> ---
> gitk: Add a basic support of SHA256 repositories into Gitk
Looping-in the gitk maintainer.
> This PR makes Gitk working on both SHA256 and SHA1 repositories without
> errors/crashes. I made it by changing and testing the gitk script of Git
> for Windows [https://gitforwindows.org/] version 2.32.0.windows.1 that
> is a little bit different than the mainstream 2.32.0 version.
>
> Still not fixed functionality: [1] There is the "Auto-select SHA1
> (length)" configuration preference that affects "Copy commit reference"
> on both SHA1 and SHA256 repositories.
>
> A new "Auto-select SHA256 (length)" configuration preference should be
> added and used on SHA256 repositories instead of the old one. Since I'm
> not familiar with Tcl/Tk and this issue isn't critical I didn't
> implement it.
Thanks, Rostislav; please follow Documentation/SubmittingPatches
next time you touch gitk (or git-gui), as they have their own
repositories and maintainers.
>
> Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-979%2Frosti-il%2Fgitk-sha256-v1
> Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-979/rosti-il/gitk-sha256-v1
> Pull-Request: https://github.com/gitgitgadget/git/pull/979
>
> gitk-git/gitk | 66 ++++++++++++++++++++++++++++++++++++---------------
> 1 file changed, 47 insertions(+), 19 deletions(-)
>
> diff --git a/gitk-git/gitk b/gitk-git/gitk
> index 23d9dd1fe0d0..2da53604cdc8 100755
> --- a/gitk-git/gitk
> +++ b/gitk-git/gitk
> @@ -290,6 +290,7 @@ proc parseviewargs {n arglist} {
>
> proc parseviewrevs {view revs} {
> global vposids vnegids
> + global hashlength
>
> if {$revs eq {}} {
> set revs HEAD
> @@ -303,7 +304,7 @@ proc parseviewrevs {view revs} {
> set badrev {}
> for {set l 0} {$l < [llength $errlines]} {incr l} {
> set line [lindex $errlines $l]
> - if {!([string length $line] == 40 && [string is xdigit $line])} {
> + if {!([string length $line] == $hashlength && [string is xdigit $line])} {
> if {[string match "fatal:*" $line]} {
> if {[string match "fatal: ambiguous argument*" $line]
> && $badrev ne {}} {
> @@ -507,6 +508,7 @@ proc updatecommits {} {
> global hasworktree
> global varcid vposids vnegids vflags vrevs
> global show_notes
> + global hashlength
>
> set hasworktree [hasworktree]
> rereadrefs
> @@ -540,7 +542,7 @@ proc updatecommits {} {
> # take out positive refs that we asked for before or
> # that we have already seen
> foreach rev $revs {
> - if {[string length $rev] == 40} {
> + if {[string length $rev] == $hashlength} {
> if {[lsearch -exact $oldpos $rev] < 0
> && ![info exists varcid($view,$rev)]} {
> lappend newrevs $rev
> @@ -1418,6 +1420,7 @@ proc getcommitlines {fd inst view updating} {
> global parents children curview hlview
> global idpending ordertok
> global varccommits varcid varctok vtokmod vfilelimit vshortids
> + global hashlength
>
> set stuff [read $fd 500000]
> # git log doesn't terminate the last commit with a null...
> @@ -1500,7 +1503,7 @@ proc getcommitlines {fd inst view updating} {
> }
> set ok 1
> foreach id $ids {
> - if {[string length $id] != 40} {
> + if {[string length $id] != $hashlength} {
> set ok 0
> break
> }
> @@ -1780,6 +1783,7 @@ proc readrefs {} {
> global selecthead selectheadid
> global hideremotes
> global tclencoding
> + global hashlength
>
> foreach v {tagids idtags headids idheads otherrefids idotherrefs} {
> unset -nocomplain $v
> @@ -1789,9 +1793,9 @@ proc readrefs {} {
> fconfigure $refd -encoding $tclencoding
> }
> while {[gets $refd line] >= 0} {
> - if {[string index $line 40] ne " "} continue
> - set id [string range $line 0 39]
> - set ref [string range $line 41 end]
> + if {[string index $line $hashlength] ne " "} continue
> + set id [string range $line 0 [expr {$hashlength - 1}]]
> + set ref [string range $line [expr {$hashlength + 1}] end]
> if {![string match "refs/*" $ref]} continue
> set name [string range $ref 5 end]
> if {[string match "remotes/*" $name]} {
> @@ -2082,6 +2086,7 @@ proc makewindow {} {
> global have_tk85 use_ttk NS
> global git_version
> global worddiff
> + global hashlength hashalgorithm
>
> # The "mc" arguments here are purely so that xgettext
> # sees the following string as needing to be translated
> @@ -2203,11 +2208,11 @@ proc makewindow {} {
> set sha1entry .tf.bar.sha1
> set entries $sha1entry
> set sha1but .tf.bar.sha1label
> - button $sha1but -text "[mc "SHA1 ID:"] " -state disabled -relief flat \
> + button $sha1but -text "[mc "$hashalgorithm ID:"] " -state disabled -relief flat \
> -command gotocommit -width 8
> $sha1but conf -disabledforeground [$sha1but cget -foreground]
> pack .tf.bar.sha1label -side left
> - ${NS}::entry $sha1entry -width 40 -font textfont -textvariable sha1string
> + ${NS}::entry $sha1entry -width $hashlength -font textfont -textvariable sha1string
> trace add variable sha1string write sha1change
> pack $sha1entry -side left -pady 2
>
> @@ -3926,6 +3931,7 @@ proc stopblaming {} {
>
> proc read_line_source {fd inst} {
> global blamestuff curview commfd blameinst nullid nullid2
> + global hashlength
>
> while {[gets $fd line] >= 0} {
> lappend blamestuff($inst) $line
> @@ -3946,7 +3952,7 @@ proc read_line_source {fd inst} {
> set line [split [lindex $blamestuff($inst) 0] " "]
> set id [lindex $line 0]
> set lnum [lindex $line 1]
> - if {[string length $id] == 40 && [string is xdigit $id] &&
> + if {[string length $id] == $hashlength && [string is xdigit $id] &&
> [string is digit -strict $lnum]} {
> # look for "filename" line
> foreach l $blamestuff($inst) {
> @@ -5269,13 +5275,14 @@ proc get_viewmainhead {view} {
> # git rev-list should give us just 1 line to use as viewmainheadid($view)
> proc getviewhead {fd inst view} {
> global viewmainheadid commfd curview viewinstances showlocalchanges
> + global hashlength
>
> set id {}
> if {[gets $fd line] < 0} {
> if {![eof $fd]} {
> return 1
> }
> - } elseif {[string length $line] == 40 && [string is xdigit $line]} {
> + } elseif {[string length $line] == $hashlength && [string is xdigit $line]} {
> set id $line
> }
> set viewmainheadid($view) $id
> @@ -7039,10 +7046,11 @@ proc commit_descriptor {p} {
> # Also look for URLs of the form "http[s]://..." and make them web links.
> proc appendwithlinks {text tags} {
> global ctext linknum curview
> + global hashlength
>
> set start [$ctext index "end - 1c"]
> $ctext insert end $text $tags
> - set links [regexp -indices -all -inline {(?:\m|-g)[0-9a-f]{6,40}\M} $text]
> + set links [regexp -indices -all -inline [string map "@@ $hashlength" {(?:\m|-g)[0-9a-f]{6,@@}\M}] $text]
> foreach l $links {
> set s [lindex $l 0]
> set e [lindex $l 1]
> @@ -8716,13 +8724,17 @@ proc incrfont {inc} {
>
> proc clearsha1 {} {
> global sha1entry sha1string
> - if {[string length $sha1string] == 40} {
> + global hashlength
> +
> + if {[string length $sha1string] == $hashlength} {
> $sha1entry delete 0 end
> }
> }
>
> proc sha1change {n1 n2 op} {
> global sha1string currentid sha1but
> + global hashalgorithm
> +
> if {$sha1string == {}
> || ([info exists currentid] && $sha1string == $currentid)} {
> set state disabled
> @@ -8733,12 +8745,13 @@ proc sha1change {n1 n2 op} {
> if {$state == "normal"} {
> $sha1but conf -state normal -relief raised -text "[mc "Goto:"] "
> } else {
> - $sha1but conf -state disabled -relief flat -text "[mc "SHA1 ID:"] "
> + $sha1but conf -state disabled -relief flat -text "[mc "$hashalgorithm ID:"] "
> }
> }
>
> proc gotocommit {} {
> global sha1string tagids headids curview varcid
> + global hashlength hashalgorithm
>
> if {$sha1string == {}
> || ([info exists currentid] && $sha1string == $currentid)} return
> @@ -8748,11 +8761,11 @@ proc gotocommit {} {
> set id $headids($sha1string)
> } else {
> set id [string tolower $sha1string]
> - if {[regexp {^[0-9a-f]{4,39}$} $id]} {
> + if {[regexp [string map "@@ [expr $hashlength - 1]" {^[0-9a-f]{4,@@}$}] $id]} {
> set matches [longid $id]
> if {$matches ne {}} {
> if {[llength $matches] > 1} {
> - error_popup [mc "Short SHA1 id %s is ambiguous" $id]
> + error_popup [mc "Short $hashalgorithm id %s is ambiguous" $id]
> return
> }
> set id [lindex $matches 0]
> @@ -8769,7 +8782,7 @@ proc gotocommit {} {
> return
> }
> if {[regexp {^[0-9a-fA-F]{4,}$} $sha1string]} {
> - set msg [mc "SHA1 id %s is not known" $sha1string]
> + set msg [mc "$hashalgorithm id %s is not known" $sha1string]
> } else {
> set msg [mc "Revision %s is not in the current view" $sha1string]
> }
> @@ -9446,10 +9459,11 @@ proc mktaggo {} {
>
> proc copyreference {} {
> global rowmenuid autosellen
> + global hashlength
>
> set format "%h (\"%s\", %ad)"
> set cmd [list git show -s --pretty=format:$format --date=short]
> - if {$autosellen < 40} {
> + if {$autosellen < $hashlength} {
> lappend cmd --abbrev=$autosellen
> }
> set reference [eval exec $cmd $rowmenuid]
> @@ -9460,6 +9474,7 @@ proc copyreference {} {
>
> proc writecommit {} {
> global rowmenuid wrcomtop commitinfo wrcomcmd NS
> + global hashlength
>
> set top .writecommit
> set wrcomtop $top
> @@ -9469,7 +9484,7 @@ proc writecommit {} {
> ${NS}::label $top.title -text [mc "Write commit to file"]
> grid $top.title - -pady 10
> ${NS}::label $top.id -text [mc "ID:"]
> - ${NS}::entry $top.sha1 -width 40
> + ${NS}::entry $top.sha1 -width $hashlength
> $top.sha1 insert 0 $rowmenuid
> $top.sha1 conf -state readonly
> grid $top.id $top.sha1 -sticky w
> @@ -9549,6 +9564,7 @@ proc mvbranch {} {
>
> proc branchdia {top valvar uivar} {
> global NS commitinfo
> + global hashlength
> upvar $valvar val $uivar ui
>
> catch {destroy $top}
> @@ -9557,7 +9573,7 @@ proc branchdia {top valvar uivar} {
> ${NS}::label $top.title -text $ui(title)
> grid $top.title - -pady 10
> ${NS}::label $top.id -text [mc "ID:"]
> - ${NS}::entry $top.sha1 -width 40
> + ${NS}::entry $top.sha1 -width $hashlength
> $top.sha1 insert 0 $val(id)
> $top.sha1 conf -state readonly
> grid $top.id $top.sha1 -sticky w
> @@ -12320,6 +12336,18 @@ if {$tclencoding == {}} {
> puts stderr "Warning: encoding $gitencoding is not supported by Tcl/Tk"
> }
>
> +set objformat [exec git rev-parse --show-object-format]
> +if {$objformat eq "sha1"} {
> + set hashlength 40
> +} elseif {$objformat eq "sha256"} {
> + set hashlength 64
> +} else {
> + error_popup "[mc "Not supported hash algorithm:"] {$objformat}"
> + exit 1
> +}
> +set hashalgorithm [string toupper $objformat]
> +unset objformat
> +
> set gui_encoding [encoding system]
> catch {
> set enc [exec git config --get gui.encoding]
>
> base-commit: ebf3c04b262aa27fbb97f8a0156c2347fecafafb
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] Add a basic support of SHA256 repositories into Gitk
2021-06-16 1:28 ` Junio C Hamano
@ 2021-06-16 14:19 ` Ævar Arnfjörð Bjarmason
2021-06-19 0:56 ` Felipe Contreras
0 siblings, 1 reply; 5+ messages in thread
From: Ævar Arnfjörð Bjarmason @ 2021-06-16 14:19 UTC (permalink / raw)
To: Junio C Hamano
Cc: Paul Mackerras, Rostislav Krasny via GitGitGadget, git, Rostislav Krasny
On Wed, Jun 16 2021, Junio C Hamano wrote:
> "Rostislav Krasny via GitGitGadget" <gitgitgadget@gmail.com> writes:
>
>> From: Rostislav Krasny <rosti.bsd@gmail.com>
>>
>> Signed-off-by: Rostislav Krasny <rosti.bsd@gmail.com>
>> ---
>> gitk: Add a basic support of SHA256 repositories into Gitk
>
> Looping-in the gitk maintainer.
>
>> This PR makes Gitk working on both SHA256 and SHA1 repositories without
>> errors/crashes. I made it by changing and testing the gitk script of Git
>> for Windows [https://gitforwindows.org/] version 2.32.0.windows.1 that
>> is a little bit different than the mainstream 2.32.0 version.
>>
>> Still not fixed functionality: [1] There is the "Auto-select SHA1
>> (length)" configuration preference that affects "Copy commit reference"
>> on both SHA1 and SHA256 repositories.
>>
>> A new "Auto-select SHA256 (length)" configuration preference should be
>> added and used on SHA256 repositories instead of the old one. Since I'm
>> not familiar with Tcl/Tk and this issue isn't critical I didn't
>> implement it.
>
> Thanks, Rostislav; please follow Documentation/SubmittingPatches
> next time you touch gitk (or git-gui), as they have their own
> repositories and maintainers.
A comment on the patch at large: I realize that the author isn't
familiar with Tcl, and this is a minimal & immediate fix, so maybe we
should just take it.
But I wonder if this == 40 or == 64 shouldn't just be "accept either" in
this case, these all seem like cases where we disambiguate a hash from
some other name.
Doing so would be nicely forward-compatible in case gitk and others ever
need to deal with viewing a mixed set of hashes, or maybe I'm again
misrecalling the transition plan and that'll never happen (they'll
always be translated?).
Especially stuff like this (grabbing a bit to quote from the patch):
>> - if {[regexp {^[0-9a-f]{4,39}$} $id]} {
>> + if {[regexp [string map "@@ [expr $hashlength - 1]" {^[0-9a-f]{4,@@}$}] $id]} {
Would be simpler as just:
if {[regexp {^[0-9a-f]{4,63}$} $id]} {
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] Add a basic support of SHA256 repositories into Gitk
2021-06-16 14:19 ` Ævar Arnfjörð Bjarmason
@ 2021-06-19 0:56 ` Felipe Contreras
0 siblings, 0 replies; 5+ messages in thread
From: Felipe Contreras @ 2021-06-19 0:56 UTC (permalink / raw)
To: Ævar Arnfjörð Bjarmason, Junio C Hamano
Cc: Paul Mackerras, Rostislav Krasny via GitGitGadget, git, Rostislav Krasny
Ævar Arnfjörð Bjarmason wrote:
>
> On Wed, Jun 16 2021, Junio C Hamano wrote:
>
> > "Rostislav Krasny via GitGitGadget" <gitgitgadget@gmail.com> writes:
> >
> >> From: Rostislav Krasny <rosti.bsd@gmail.com>
> >>
> >> Signed-off-by: Rostislav Krasny <rosti.bsd@gmail.com>
> >> ---
> >> gitk: Add a basic support of SHA256 repositories into Gitk
> >
> > Looping-in the gitk maintainer.
> >
> >> This PR makes Gitk working on both SHA256 and SHA1 repositories without
> >> errors/crashes. I made it by changing and testing the gitk script of Git
> >> for Windows [https://gitforwindows.org/] version 2.32.0.windows.1 that
> >> is a little bit different than the mainstream 2.32.0 version.
> >>
> >> Still not fixed functionality: [1] There is the "Auto-select SHA1
> >> (length)" configuration preference that affects "Copy commit reference"
> >> on both SHA1 and SHA256 repositories.
> >>
> >> A new "Auto-select SHA256 (length)" configuration preference should be
> >> added and used on SHA256 repositories instead of the old one. Since I'm
> >> not familiar with Tcl/Tk and this issue isn't critical I didn't
> >> implement it.
> >
> > Thanks, Rostislav; please follow Documentation/SubmittingPatches
> > next time you touch gitk (or git-gui), as they have their own
> > repositories and maintainers.
>
> A comment on the patch at large: I realize that the author isn't
> familiar with Tcl, and this is a minimal & immediate fix, so maybe we
> should just take it.
Plus it takes a huge while for any patch to be merged. There's 0 commits
in 2021 on the gitk repository, and in 2020 there were only 6.
My last simple patch from May [1] is still waiting for any kind of
feedback.
[1] https://lore.kernel.org/git/20210505211846.1842824-1-felipe.contreras@gmail.com/
--
Felipe Contreras
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] Add a basic support of SHA256 repositories into Gitk
2021-06-14 16:18 [PATCH] Add a basic support of SHA256 repositories into Gitk Rostislav Krasny via GitGitGadget
2021-06-16 1:28 ` Junio C Hamano
@ 2022-05-02 14:24 ` Rostislav Krasny
1 sibling, 0 replies; 5+ messages in thread
From: Rostislav Krasny @ 2022-05-02 14:24 UTC (permalink / raw)
To: Rostislav Krasny via GitGitGadget; +Cc: git
Hello everybody,
I created this PR almost a year ago, is there any general progress
with supporting SHA256 in gitk? Even some other's patch/PR?
On Mon, Jun 14, 2021 at 7:18 PM Rostislav Krasny via GitGitGadget
<gitgitgadget@gmail.com> wrote:
>
> From: Rostislav Krasny <rosti.bsd@gmail.com>
>
> Signed-off-by: Rostislav Krasny <rosti.bsd@gmail.com>
> ---
> gitk: Add a basic support of SHA256 repositories into Gitk
>
> This PR makes Gitk working on both SHA256 and SHA1 repositories without
> errors/crashes. I made it by changing and testing the gitk script of Git
> for Windows [https://gitforwindows.org/] version 2.32.0.windows.1 that
> is a little bit different than the mainstream 2.32.0 version.
>
> Still not fixed functionality: [1] There is the "Auto-select SHA1
> (length)" configuration preference that affects "Copy commit reference"
> on both SHA1 and SHA256 repositories.
>
> A new "Auto-select SHA256 (length)" configuration preference should be
> added and used on SHA256 repositories instead of the old one. Since I'm
> not familiar with Tcl/Tk and this issue isn't critical I didn't
> implement it.
>
> Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-979%2Frosti-il%2Fgitk-sha256-v1
> Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-979/rosti-il/gitk-sha256-v1
> Pull-Request: https://github.com/gitgitgadget/git/pull/979
>
> gitk-git/gitk | 66 ++++++++++++++++++++++++++++++++++++---------------
> 1 file changed, 47 insertions(+), 19 deletions(-)
>
> diff --git a/gitk-git/gitk b/gitk-git/gitk
> index 23d9dd1fe0d0..2da53604cdc8 100755
> --- a/gitk-git/gitk
> +++ b/gitk-git/gitk
> @@ -290,6 +290,7 @@ proc parseviewargs {n arglist} {
>
> proc parseviewrevs {view revs} {
> global vposids vnegids
> + global hashlength
>
> if {$revs eq {}} {
> set revs HEAD
> @@ -303,7 +304,7 @@ proc parseviewrevs {view revs} {
> set badrev {}
> for {set l 0} {$l < [llength $errlines]} {incr l} {
> set line [lindex $errlines $l]
> - if {!([string length $line] == 40 && [string is xdigit $line])} {
> + if {!([string length $line] == $hashlength && [string is xdigit $line])} {
> if {[string match "fatal:*" $line]} {
> if {[string match "fatal: ambiguous argument*" $line]
> && $badrev ne {}} {
> @@ -507,6 +508,7 @@ proc updatecommits {} {
> global hasworktree
> global varcid vposids vnegids vflags vrevs
> global show_notes
> + global hashlength
>
> set hasworktree [hasworktree]
> rereadrefs
> @@ -540,7 +542,7 @@ proc updatecommits {} {
> # take out positive refs that we asked for before or
> # that we have already seen
> foreach rev $revs {
> - if {[string length $rev] == 40} {
> + if {[string length $rev] == $hashlength} {
> if {[lsearch -exact $oldpos $rev] < 0
> && ![info exists varcid($view,$rev)]} {
> lappend newrevs $rev
> @@ -1418,6 +1420,7 @@ proc getcommitlines {fd inst view updating} {
> global parents children curview hlview
> global idpending ordertok
> global varccommits varcid varctok vtokmod vfilelimit vshortids
> + global hashlength
>
> set stuff [read $fd 500000]
> # git log doesn't terminate the last commit with a null...
> @@ -1500,7 +1503,7 @@ proc getcommitlines {fd inst view updating} {
> }
> set ok 1
> foreach id $ids {
> - if {[string length $id] != 40} {
> + if {[string length $id] != $hashlength} {
> set ok 0
> break
> }
> @@ -1780,6 +1783,7 @@ proc readrefs {} {
> global selecthead selectheadid
> global hideremotes
> global tclencoding
> + global hashlength
>
> foreach v {tagids idtags headids idheads otherrefids idotherrefs} {
> unset -nocomplain $v
> @@ -1789,9 +1793,9 @@ proc readrefs {} {
> fconfigure $refd -encoding $tclencoding
> }
> while {[gets $refd line] >= 0} {
> - if {[string index $line 40] ne " "} continue
> - set id [string range $line 0 39]
> - set ref [string range $line 41 end]
> + if {[string index $line $hashlength] ne " "} continue
> + set id [string range $line 0 [expr {$hashlength - 1}]]
> + set ref [string range $line [expr {$hashlength + 1}] end]
> if {![string match "refs/*" $ref]} continue
> set name [string range $ref 5 end]
> if {[string match "remotes/*" $name]} {
> @@ -2082,6 +2086,7 @@ proc makewindow {} {
> global have_tk85 use_ttk NS
> global git_version
> global worddiff
> + global hashlength hashalgorithm
>
> # The "mc" arguments here are purely so that xgettext
> # sees the following string as needing to be translated
> @@ -2203,11 +2208,11 @@ proc makewindow {} {
> set sha1entry .tf.bar.sha1
> set entries $sha1entry
> set sha1but .tf.bar.sha1label
> - button $sha1but -text "[mc "SHA1 ID:"] " -state disabled -relief flat \
> + button $sha1but -text "[mc "$hashalgorithm ID:"] " -state disabled -relief flat \
> -command gotocommit -width 8
> $sha1but conf -disabledforeground [$sha1but cget -foreground]
> pack .tf.bar.sha1label -side left
> - ${NS}::entry $sha1entry -width 40 -font textfont -textvariable sha1string
> + ${NS}::entry $sha1entry -width $hashlength -font textfont -textvariable sha1string
> trace add variable sha1string write sha1change
> pack $sha1entry -side left -pady 2
>
> @@ -3926,6 +3931,7 @@ proc stopblaming {} {
>
> proc read_line_source {fd inst} {
> global blamestuff curview commfd blameinst nullid nullid2
> + global hashlength
>
> while {[gets $fd line] >= 0} {
> lappend blamestuff($inst) $line
> @@ -3946,7 +3952,7 @@ proc read_line_source {fd inst} {
> set line [split [lindex $blamestuff($inst) 0] " "]
> set id [lindex $line 0]
> set lnum [lindex $line 1]
> - if {[string length $id] == 40 && [string is xdigit $id] &&
> + if {[string length $id] == $hashlength && [string is xdigit $id] &&
> [string is digit -strict $lnum]} {
> # look for "filename" line
> foreach l $blamestuff($inst) {
> @@ -5269,13 +5275,14 @@ proc get_viewmainhead {view} {
> # git rev-list should give us just 1 line to use as viewmainheadid($view)
> proc getviewhead {fd inst view} {
> global viewmainheadid commfd curview viewinstances showlocalchanges
> + global hashlength
>
> set id {}
> if {[gets $fd line] < 0} {
> if {![eof $fd]} {
> return 1
> }
> - } elseif {[string length $line] == 40 && [string is xdigit $line]} {
> + } elseif {[string length $line] == $hashlength && [string is xdigit $line]} {
> set id $line
> }
> set viewmainheadid($view) $id
> @@ -7039,10 +7046,11 @@ proc commit_descriptor {p} {
> # Also look for URLs of the form "http[s]://..." and make them web links.
> proc appendwithlinks {text tags} {
> global ctext linknum curview
> + global hashlength
>
> set start [$ctext index "end - 1c"]
> $ctext insert end $text $tags
> - set links [regexp -indices -all -inline {(?:\m|-g)[0-9a-f]{6,40}\M} $text]
> + set links [regexp -indices -all -inline [string map "@@ $hashlength" {(?:\m|-g)[0-9a-f]{6,@@}\M}] $text]
> foreach l $links {
> set s [lindex $l 0]
> set e [lindex $l 1]
> @@ -8716,13 +8724,17 @@ proc incrfont {inc} {
>
> proc clearsha1 {} {
> global sha1entry sha1string
> - if {[string length $sha1string] == 40} {
> + global hashlength
> +
> + if {[string length $sha1string] == $hashlength} {
> $sha1entry delete 0 end
> }
> }
>
> proc sha1change {n1 n2 op} {
> global sha1string currentid sha1but
> + global hashalgorithm
> +
> if {$sha1string == {}
> || ([info exists currentid] && $sha1string == $currentid)} {
> set state disabled
> @@ -8733,12 +8745,13 @@ proc sha1change {n1 n2 op} {
> if {$state == "normal"} {
> $sha1but conf -state normal -relief raised -text "[mc "Goto:"] "
> } else {
> - $sha1but conf -state disabled -relief flat -text "[mc "SHA1 ID:"] "
> + $sha1but conf -state disabled -relief flat -text "[mc "$hashalgorithm ID:"] "
> }
> }
>
> proc gotocommit {} {
> global sha1string tagids headids curview varcid
> + global hashlength hashalgorithm
>
> if {$sha1string == {}
> || ([info exists currentid] && $sha1string == $currentid)} return
> @@ -8748,11 +8761,11 @@ proc gotocommit {} {
> set id $headids($sha1string)
> } else {
> set id [string tolower $sha1string]
> - if {[regexp {^[0-9a-f]{4,39}$} $id]} {
> + if {[regexp [string map "@@ [expr $hashlength - 1]" {^[0-9a-f]{4,@@}$}] $id]} {
> set matches [longid $id]
> if {$matches ne {}} {
> if {[llength $matches] > 1} {
> - error_popup [mc "Short SHA1 id %s is ambiguous" $id]
> + error_popup [mc "Short $hashalgorithm id %s is ambiguous" $id]
> return
> }
> set id [lindex $matches 0]
> @@ -8769,7 +8782,7 @@ proc gotocommit {} {
> return
> }
> if {[regexp {^[0-9a-fA-F]{4,}$} $sha1string]} {
> - set msg [mc "SHA1 id %s is not known" $sha1string]
> + set msg [mc "$hashalgorithm id %s is not known" $sha1string]
> } else {
> set msg [mc "Revision %s is not in the current view" $sha1string]
> }
> @@ -9446,10 +9459,11 @@ proc mktaggo {} {
>
> proc copyreference {} {
> global rowmenuid autosellen
> + global hashlength
>
> set format "%h (\"%s\", %ad)"
> set cmd [list git show -s --pretty=format:$format --date=short]
> - if {$autosellen < 40} {
> + if {$autosellen < $hashlength} {
> lappend cmd --abbrev=$autosellen
> }
> set reference [eval exec $cmd $rowmenuid]
> @@ -9460,6 +9474,7 @@ proc copyreference {} {
>
> proc writecommit {} {
> global rowmenuid wrcomtop commitinfo wrcomcmd NS
> + global hashlength
>
> set top .writecommit
> set wrcomtop $top
> @@ -9469,7 +9484,7 @@ proc writecommit {} {
> ${NS}::label $top.title -text [mc "Write commit to file"]
> grid $top.title - -pady 10
> ${NS}::label $top.id -text [mc "ID:"]
> - ${NS}::entry $top.sha1 -width 40
> + ${NS}::entry $top.sha1 -width $hashlength
> $top.sha1 insert 0 $rowmenuid
> $top.sha1 conf -state readonly
> grid $top.id $top.sha1 -sticky w
> @@ -9549,6 +9564,7 @@ proc mvbranch {} {
>
> proc branchdia {top valvar uivar} {
> global NS commitinfo
> + global hashlength
> upvar $valvar val $uivar ui
>
> catch {destroy $top}
> @@ -9557,7 +9573,7 @@ proc branchdia {top valvar uivar} {
> ${NS}::label $top.title -text $ui(title)
> grid $top.title - -pady 10
> ${NS}::label $top.id -text [mc "ID:"]
> - ${NS}::entry $top.sha1 -width 40
> + ${NS}::entry $top.sha1 -width $hashlength
> $top.sha1 insert 0 $val(id)
> $top.sha1 conf -state readonly
> grid $top.id $top.sha1 -sticky w
> @@ -12320,6 +12336,18 @@ if {$tclencoding == {}} {
> puts stderr "Warning: encoding $gitencoding is not supported by Tcl/Tk"
> }
>
> +set objformat [exec git rev-parse --show-object-format]
> +if {$objformat eq "sha1"} {
> + set hashlength 40
> +} elseif {$objformat eq "sha256"} {
> + set hashlength 64
> +} else {
> + error_popup "[mc "Not supported hash algorithm:"] {$objformat}"
> + exit 1
> +}
> +set hashalgorithm [string toupper $objformat]
> +unset objformat
> +
> set gui_encoding [encoding system]
> catch {
> set enc [exec git config --get gui.encoding]
>
> base-commit: ebf3c04b262aa27fbb97f8a0156c2347fecafafb
> --
> gitgitgadget
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2022-05-02 14:24 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-06-14 16:18 [PATCH] Add a basic support of SHA256 repositories into Gitk Rostislav Krasny via GitGitGadget
2021-06-16 1:28 ` Junio C Hamano
2021-06-16 14:19 ` Ævar Arnfjörð Bjarmason
2021-06-19 0:56 ` Felipe Contreras
2022-05-02 14:24 ` Rostislav Krasny
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 NNTP newsgroup(s).