From 5bdcd5171b4e79ca92cdf4a51096944702313c19 Mon Sep 17 00:00:00 2001
From: dirkmueller <>
Date: Mar 28 2025 09:27:36 +0000
Subject: Update git to version 2.49.0 / rev 322 via SR 1256190


https://build.opensuse.org/request/show/1256190
by user dirkmueller + anag+factory

---

diff --git a/.files b/.files
index 4804b29..1999cb3 100644
Binary files a/.files and b/.files differ
diff --git a/.rev b/.rev
index a4e3cb3..c754cb8 100644
--- a/.rev
+++ b/.rev
@@ -2893,4 +2893,12 @@ git 2.48.0</comment>
 - docs switched to asciidoc</comment>
     <requestid>1253269</requestid>
   </revision>
+  <revision rev="322" vrev="2">
+    <srcmd5>7be1a0bf6ee69f562d0b9ec937627d97</srcmd5>
+    <version>2.49.0</version>
+    <time>1743150977</time>
+    <user>anag+factory</user>
+    <comment></comment>
+    <requestid>1256190</requestid>
+  </revision>
 </revisionlist>
diff --git a/0001-gitk-Add-a-basic-support-of-SHA256-repositories-into.patch b/0001-gitk-Add-a-basic-support-of-SHA256-repositories-into.patch
new file mode 100644
index 0000000..53d9203
--- /dev/null
+++ b/0001-gitk-Add-a-basic-support-of-SHA256-repositories-into.patch
@@ -0,0 +1,282 @@
+From bf31d29be1c753d1f6c73c3477fb6040ef4341ce Mon Sep 17 00:00:00 2001
+From: Rostislav Krasny <rosti.bsd@gmail.com>
+Date: Mon, 14 Jun 2021 16:18:39 +0000
+Subject: [PATCH 1/2] 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.
+
+[ Changes from the original patch:
+  * Discard the changes for generic words (e.g. "Commit ID"), so that
+    translations can be still applied after this patch
+  * Simplify the regexp check in gotocommit as suggested in the
+    previous review
+  -- tiwai ]
+
+Signed-off-by: Rostislav Krasny <rosti.bsd@gmail.com>
+Link: https://patchwork.kernel.org/project/git/patch/pull.979.git.1623687519832.gitgitgadget@gmail.com
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+---
+ gitk-git/gitk | 59 +++++++++++++++++++++++++++++++++++++--------------
+ 1 file changed, 43 insertions(+), 16 deletions(-)
+
+diff --git a/gitk-git/gitk b/gitk-git/gitk
+index bc9efa18566f..1e85cfef2ee3 100755
+--- a/gitk-git/gitk
++++ b/gitk-git/gitk
+@@ -425,6 +425,7 @@ proc parseviewargs {n arglist} {
+ 
+ proc parseviewrevs {view revs} {
+     global vposids vnegids
++    global hashlength
+ 
+     if {$revs eq {}} {
+         set revs HEAD
+@@ -438,7 +439,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 {}} {
+@@ -655,6 +656,7 @@ proc updatecommits {} {
+     global hasworktree
+     global varcid vposids vnegids vflags vrevs
+     global show_notes
++    global hashlength
+ 
+     set hasworktree [hasworktree]
+     rereadrefs
+@@ -688,7 +690,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
+@@ -1573,6 +1575,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...
+@@ -1655,7 +1658,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
+                 }
+@@ -1935,6 +1938,7 @@ proc readrefs {} {
+     global selecthead selectheadid
+     global hideremotes
+     global tclencoding
++    global hashlength
+ 
+     foreach v {tagids idtags headids idheads otherrefids idotherrefs} {
+         unset -nocomplain $v
+@@ -1944,9 +1948,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]} {
+@@ -2241,6 +2245,7 @@ proc makewindow {} {
+     global have_tk85 have_tk86 use_ttk NS
+     global git_version
+     global worddiff
++    global hashlength
+ 
+     # The "mc" arguments here are purely so that xgettext
+     # sees the following string as needing to be translated
+@@ -2366,7 +2371,7 @@ proc makewindow {} {
+         -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
+ 
+@@ -4093,6 +4098,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
+@@ -4113,7 +4119,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) {
+@@ -5436,13 +5442,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
+@@ -7206,10 +7213,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]
+@@ -8888,13 +8896,16 @@ 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
++
+     if {$sha1string == {}
+         || ([info exists currentid] && $sha1string == $currentid)} {
+         set state disabled
+@@ -8911,6 +8922,7 @@ proc sha1change {n1 n2 op} {
+ 
+ proc gotocommit {} {
+     global sha1string tagids headids curview varcid
++    global hashlength
+ 
+     if {$sha1string == {}
+         || ([info exists currentid] && $sha1string == $currentid)} return
+@@ -8920,11 +8932,11 @@ proc gotocommit {} {
+         set id $headids($sha1string)
+     } else {
+         set id [string tolower $sha1string]
+-        if {[regexp {^[0-9a-f]{4,39}$} $id]} {
++	if {[regexp {^[0-9a-f]{4,63}$} $id]} {
+             set matches [longid $id]
+             if {$matches ne {}} {
+                 if {[llength $matches] > 1} {
+-                    error_popup [mc "Short commit ID %s is ambiguous" $id]
++                    error_popup [mc "Short commit id %s is ambiguous" $id]
+                     return
+                 }
+                 set id [lindex $matches 0]
+@@ -9618,10 +9630,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]
+@@ -9632,6 +9645,7 @@ proc copyreference {} {
+ 
+ proc writecommit {} {
+     global rowmenuid wrcomtop commitinfo wrcomcmd NS
++    global hashlength
+ 
+     set top .writecommit
+     set wrcomtop $top
+@@ -9641,7 +9655,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
+@@ -9721,6 +9735,7 @@ proc mvbranch {} {
+ 
+ proc branchdia {top valvar uivar} {
+     global NS commitinfo
++    global hashlength
+     upvar $valvar val $uivar ui
+ 
+     catch {destroy $top}
+@@ -9729,7 +9744,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
+@@ -12524,6 +12539,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]
+-- 
+2.49.0
+
diff --git a/0002-gitk-Add-auto-select-length-preference-for-SHA256.patch b/0002-gitk-Add-auto-select-length-preference-for-SHA256.patch
new file mode 100644
index 0000000..d4bcb57
--- /dev/null
+++ b/0002-gitk-Add-auto-select-length-preference-for-SHA256.patch
@@ -0,0 +1,134 @@
+From 0c251d64abf2eb7b275554b3fc6784e87f07cfbe Mon Sep 17 00:00:00 2001
+From: Takashi Iwai <tiwai@suse.de>
+Date: Wed, 19 Mar 2025 11:18:21 +0100
+Subject: [PATCH 2/2] gitk: Add auto-select length preference for SHA256
+
+This implements the missing preference setup of the auto select length
+for SHA256. The variable set via the preference menu is switched
+depending on the hash algorithm.
+
+The default auto-select length is set to 64 for SHA256, and
+saved/restored as "autosellensha256" in the config.
+
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+---
+ gitk-git/gitk | 39 +++++++++++++++++++++++++++++----------
+ 1 file changed, 29 insertions(+), 10 deletions(-)
+
+diff --git a/gitk-git/gitk b/gitk-git/gitk
+index 1e85cfef2ee3..b364d9e7dc93 100755
+--- a/gitk-git/gitk
++++ b/gitk-git/gitk
+@@ -7488,6 +7488,16 @@ proc make_idmark {id} {
+     $canv raise $t
+ }
+ 
++proc get_autosellen {} {
++    global hashalgorithm autosellen autosellensha256
++
++    if {$hashalgorithm == "SHA256"} {
++        return $autosellensha256
++    } else {
++        return $autosellen
++    }
++}
++
+ proc selectline {l isnew {desired_loc {}} {switch_to_patch 0}} {
+     global canv ctext commitinfo selectedline
+     global canvy0 linespc parents children curview
+@@ -7496,7 +7506,7 @@ proc selectline {l isnew {desired_loc {}} {switch_to_patch 0}} {
+     global mergemax numcommits pending_select
+     global cmitmode showneartags allcommits
+     global targetrow targetid lastscrollrows
+-    global autocopy autoselect autosellen jump_to_here
++    global autocopy autoselect jump_to_here
+     global vinlinediff
+ 
+     unset -nocomplain pending_select
+@@ -7563,11 +7573,11 @@ proc selectline {l isnew {desired_loc {}} {switch_to_patch 0}} {
+     $sha1entry delete 0 end
+     $sha1entry insert 0 $id
+     if {$autoselect && [haveselectionclipboard]} {
+-        $sha1entry selection range 0 $autosellen
++        $sha1entry selection range 0 [get_autosellen]
+     }
+     if {$autocopy} {
+         clipboard clear
+-        clipboard append [string range $id 0 [expr $autosellen - 1]]
++        clipboard append [string range $id 0 [expr [get_autosellen] - 1]]
+     }
+     rhighlight_sel $id
+ 
+@@ -9629,13 +9639,14 @@ proc mktaggo {} {
+ }
+ 
+ proc copyreference {} {
+-    global rowmenuid autosellen
++    global rowmenuid
+     global hashlength
+ 
+     set format "%h (\"%s\", %ad)"
+     set cmd [list git show -s --pretty=format:$format --date=short]
+-    if {$autosellen < $hashlength} {
+-        lappend cmd --abbrev=$autosellen
++    set alen [get_autosellen]
++    if {$alen < $hashlength} {
++        lappend cmd --abbrev=$alen
+     }
+     set reference [eval exec $cmd $rowmenuid]
+ 
+@@ -11741,8 +11752,9 @@ proc create_prefs_page {w} {
+ proc prefspage_general {notebook} {
+     global NS maxwidth maxgraphpct showneartags showlocalchanges
+     global tabstop wrapcomment wrapdefault limitdiffs
+-    global autocopy autoselect autosellen extdifftool perfile_attrs
++    global autocopy autoselect extdifftool perfile_attrs
+     global hideremotes want_ttk have_ttk maxrefs web_browser
++    global hashalgorithm hashlength
+ 
+     set page [create_prefs_page $notebook.general]
+ 
+@@ -11771,7 +11783,13 @@ proc prefspage_general {notebook} {
+             -variable autoselect
+         grid x $page.autoselect -sticky w
+     }
+-    spinbox $page.autosellen -from 1 -to 40 -width 4 -textvariable autosellen
++
++    if {$hashalgorithm == "SHA256"} {
++        set autolenvar "autosellensha256"
++    } else {
++        set autolenvar "autosellen"
++    }
++    spinbox $page.autosellen -from 1 -to $hashlength -width 4 -textvariable $autolenvar
+     ${NS}::label $page.autosellenl -text [mc "Length of commit ID to copy"]
+     grid x $page.autosellenl $page.autosellen -sticky w
+ 
+@@ -11908,7 +11926,7 @@ proc doprefs {} {
+     global maxwidth maxgraphpct use_ttk NS
+     global oldprefs prefstop showneartags showlocalchanges
+     global uicolor bgcolor fgcolor ctext diffcolors selectbgcolor markbgcolor
+-    global tabstop limitdiffs autoselect autosellen extdifftool perfile_attrs
++    global tabstop limitdiffs autoselect extdifftool perfile_attrs
+     global hideremotes want_ttk have_ttk wrapcomment wrapdefault
+ 
+     set top .gitkprefs
+@@ -12606,6 +12624,7 @@ set datetimeformat "%Y-%m-%d %H:%M:%S"
+ set autocopy 0
+ set autoselect 1
+ set autosellen 40
++set autosellensha256 64
+ set perfile_attrs 0
+ set want_ttk 1
+ 
+@@ -12702,7 +12721,7 @@ config_check_tmp_exists 50
+ set config_variables {
+     mainfont textfont uifont tabstop findmergefiles maxgraphpct maxwidth
+     cmitmode wrapcomment wrapdefault autocopy autoselect autosellen
+-    showneartags maxrefs visiblerefs
++    autosellensha256 showneartags maxrefs visiblerefs
+     hideremotes showlocalchanges datetimeformat limitdiffs uicolor want_ttk
+     bgcolor fgcolor uifgcolor uifgdisabledcolor colors diffcolors mergecolors
+     markbgcolor diffcontext selectbgcolor foundbgcolor currentsearchhitbgcolor
+-- 
+2.49.0
+
diff --git a/git.changes b/git.changes
index e74ab45..febafe8 100644
--- a/git.changes
+++ b/git.changes
@@ -1,4 +1,11 @@
 -------------------------------------------------------------------
+Mon Mar 24 14:04:56 UTC 2025 - Takashi Iwai <tiwai@suse.com>
+
+- Add support of SHA256 git repo for gitk (bsc#1239989):
+  0001-gitk-Add-a-basic-support-of-SHA256-repositories-into.patch
+  0002-gitk-Add-auto-select-length-preference-for-SHA256.patch
+
+-------------------------------------------------------------------
 Fri Mar 14 23:43:43 UTC 2025 - Marcus Rueckert <mrueckert@suse.de>
 
 - update to 2.49.0
diff --git a/git.spec b/git.spec
index eb2e383..0717fc4 100644
--- a/git.spec
+++ b/git.spec
@@ -70,6 +70,9 @@ Patch8:         git-asciidoc.patch
 Patch10:        setup-don-t-fail-if-commondir-reference-is-deleted.patch
 # PATCH-FIX-OPENSUSE CVE-2024-24577.patch boo#1219660 antonio.teixeira@suse.com
 Patch11:        CVE-2024-24577.patch
+# Add SHA256 support for gitk (bsc#1239989)
+Patch20:        0001-gitk-Add-a-basic-support-of-SHA256-repositories-into.patch
+Patch21:        0002-gitk-Add-auto-select-length-preference-for-SHA256.patch
 BuildRequires:  fdupes
 BuildRequires:  gpg2
 BuildRequires:  libcurl-devel