Merge branch 'ds/doc' into jc/fmt-patch
* ds/doc: Update documentation for git-format-patch sha1_file: avoid re-preparing duplicate packs handle concurrent pruning of packed objects http: prevent segfault during curl handle reuse Remove possible segfault in http-fetch. gitk: show_error fix [PATCH] gitk: start-up bugfix [PATCH] gitk: Replace "git-" commands with "git " [PATCH] gitk: Display commit messages with word wrap gitk: Fix bug where page-up/down wouldn't always work properly gitk: Fix display of "(...)" for parents/children we haven't drawn send-email: only 'require' instead of 'use' Net::SMTP Allow multiple -m options to git-commit.
This commit is contained in:
@ -9,37 +9,46 @@ git-format-patch - Prepare patches for e-mail submission
|
|||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
--------
|
--------
|
||||||
[verse]
|
[verse]
|
||||||
'git-format-patch' [-n | -k] [-o <dir> | --stdout] [--attach] [-s] [-c]
|
'git-format-patch' [-n | -k] [-o <dir> | --stdout] [--attach]
|
||||||
[--diff-options] <his> [<mine>]
|
[-s | --signoff] [--diff-options] [--start-number <n>]
|
||||||
|
<since>[..<until>]
|
||||||
|
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
-----------
|
-----------
|
||||||
Prepare each commit with its patch since <mine> head forked from
|
|
||||||
<his> head, one file per patch formatted to resemble UNIX mailbox
|
Prepare each commit between <since> and <until> with its patch in
|
||||||
format, for e-mail submission or use with gitlink:git-am[1].
|
one file per commit, formatted to resemble UNIX mailbox format.
|
||||||
|
If ..<until> is not specified, the head of the current working
|
||||||
|
tree is implied.
|
||||||
|
|
||||||
|
The output of this command is convenient for e-mail submission or
|
||||||
|
for use with gitlink:git-am[1].
|
||||||
|
|
||||||
Each output file is numbered sequentially from 1, and uses the
|
Each output file is numbered sequentially from 1, and uses the
|
||||||
first line of the commit message (massaged for pathname safety)
|
first line of the commit message (massaged for pathname safety) as
|
||||||
as the filename.
|
the filename. The names of the output files are printed to standard
|
||||||
|
output, unless the --stdout option is specified.
|
||||||
|
|
||||||
When -o is specified, output files are created in <dir>; otherwise
|
If -o is specified, output files are created in <dir>. Otherwise
|
||||||
they are created in the current working directory. This option
|
they are created in the current working directory.
|
||||||
is ignored if --stdout is specified.
|
|
||||||
|
|
||||||
When -n is specified, instead of "[PATCH] Subject", the first
|
If -n is specified, instead of "[PATCH] Subject", the first line
|
||||||
line is formatted as "[PATCH N/M] Subject", unless you have only
|
is formatted as "[PATCH n/m] Subject".
|
||||||
one patch.
|
|
||||||
|
|
||||||
|
|
||||||
OPTIONS
|
OPTIONS
|
||||||
-------
|
-------
|
||||||
-o|--output-directory <dir>::
|
-o|--output-directory <dir>::
|
||||||
Use <dir> to store the resulting files, instead of the
|
Use <dir> to store the resulting files, instead of the
|
||||||
current working directory.
|
current working directory. This option is ignored if
|
||||||
|
--stdout is specified.
|
||||||
|
|
||||||
-n|--numbered::
|
-n|--numbered::
|
||||||
Name output in '[PATCH n/m]' format.
|
Name output in '[PATCH n/m]' format.
|
||||||
|
|
||||||
|
--start-number <n>::
|
||||||
|
Start numbering the patches at <n> instead of 1.
|
||||||
|
|
||||||
-k|--keep-subject::
|
-k|--keep-subject::
|
||||||
Do not strip/add '[PATCH]' from the first line of the
|
Do not strip/add '[PATCH]' from the first line of the
|
||||||
commit log message.
|
commit log message.
|
||||||
@ -48,17 +57,9 @@ OPTIONS
|
|||||||
Add `Signed-off-by:` line to the commit message, using
|
Add `Signed-off-by:` line to the commit message, using
|
||||||
the committer identity of yourself.
|
the committer identity of yourself.
|
||||||
|
|
||||||
-c|--check::
|
|
||||||
Display suspicious lines in the patch. The definition
|
|
||||||
of 'suspicious lines' is currently the lines that has
|
|
||||||
trailing whitespaces, and the lines whose indentation
|
|
||||||
has a SP character immediately followed by a TAB
|
|
||||||
character.
|
|
||||||
|
|
||||||
--stdout::
|
--stdout::
|
||||||
This flag generates the mbox formatted output to the
|
Print all commits to the standard output in mbox format,
|
||||||
standard output, instead of saving them into a file per
|
instead of creating a file for each one.
|
||||||
patch and implies --mbox.
|
|
||||||
|
|
||||||
--attach::
|
--attach::
|
||||||
Create attachments instead of inlining patches.
|
Create attachments instead of inlining patches.
|
||||||
@ -82,18 +83,18 @@ git-format-patch -k --stdout R1..R2 | git-am -3 -k::
|
|||||||
cherry-pick them.
|
cherry-pick them.
|
||||||
|
|
||||||
git-format-patch origin::
|
git-format-patch origin::
|
||||||
Extract commits the current branch accumulated since it
|
Extract all commits which are in the current branch but
|
||||||
pulled from origin the last time in a patch form for
|
not in the origin branch. For each commit a separate file
|
||||||
e-mail submission.
|
is created in the current directory.
|
||||||
|
|
||||||
git-format-patch -M -B origin::
|
git-format-patch -M -B origin::
|
||||||
The same as the previous one, except detect and handle
|
The same as the previous one. Additionally, it detects
|
||||||
renames and complete rewrites intelligently to produce
|
and handles renames and complete rewrites intelligently to
|
||||||
renaming patch. A renaming patch reduces the amount of
|
produce a renaming patch. A renaming patch reduces the
|
||||||
text output, and generally makes it easier to review
|
amount of text output, and generally makes it easier to
|
||||||
it. Note that the "patch" program does not understand
|
review it. Note that the "patch" program does not
|
||||||
renaming patch well, so use it only when you know the
|
understand renaming patches, so use it only when you know
|
||||||
recipient uses git to apply your patch.
|
the recipient uses git to apply your patch.
|
||||||
|
|
||||||
|
|
||||||
See Also
|
See Also
|
||||||
|
@ -260,20 +260,41 @@ do
|
|||||||
-m|--m|--me|--mes|--mess|--messa|--messag|--message)
|
-m|--m|--me|--mes|--mess|--messa|--messag|--message)
|
||||||
case "$#" in 1) usage ;; esac
|
case "$#" in 1) usage ;; esac
|
||||||
shift
|
shift
|
||||||
log_given=t$log_given
|
log_given=m$log_given
|
||||||
log_message="$1"
|
if test "$log_message" = ''
|
||||||
|
then
|
||||||
|
log_message="$1"
|
||||||
|
else
|
||||||
|
log_message="$log_message
|
||||||
|
|
||||||
|
$1"
|
||||||
|
fi
|
||||||
no_edit=t
|
no_edit=t
|
||||||
shift
|
shift
|
||||||
;;
|
;;
|
||||||
-m*)
|
-m*)
|
||||||
log_given=t$log_given
|
log_given=m$log_given
|
||||||
log_message=`expr "$1" : '-m\(.*\)'`
|
if test "$log_message" = ''
|
||||||
|
then
|
||||||
|
log_message=`expr "$1" : '-m\(.*\)'`
|
||||||
|
else
|
||||||
|
log_message="$log_message
|
||||||
|
|
||||||
|
`expr "$1" : '-m\(.*\)'`"
|
||||||
|
fi
|
||||||
no_edit=t
|
no_edit=t
|
||||||
shift
|
shift
|
||||||
;;
|
;;
|
||||||
--m=*|--me=*|--mes=*|--mess=*|--messa=*|--messag=*|--message=*)
|
--m=*|--me=*|--mes=*|--mess=*|--messa=*|--messag=*|--message=*)
|
||||||
log_given=t$log_given
|
log_given=m$log_given
|
||||||
log_message=`expr "$1" : '-[^=]*=\(.*\)'`
|
if test "$log_message" = ''
|
||||||
|
then
|
||||||
|
log_message=`expr "$1" : '-[^=]*=\(.*\)'`
|
||||||
|
else
|
||||||
|
log_message="$log_message
|
||||||
|
|
||||||
|
`expr "$1" : '-[^=]*=\(.*\)'`"
|
||||||
|
fi
|
||||||
no_edit=t
|
no_edit=t
|
||||||
shift
|
shift
|
||||||
;;
|
;;
|
||||||
@ -378,7 +399,9 @@ esac
|
|||||||
|
|
||||||
case "$log_given" in
|
case "$log_given" in
|
||||||
tt*)
|
tt*)
|
||||||
die "Only one of -c/-C/-F/-m can be used." ;;
|
die "Only one of -c/-C/-F can be used." ;;
|
||||||
|
*tm*|*mt*)
|
||||||
|
die "Option -m cannot be combined with -c/-C/-F." ;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
case "$#,$also,$only,$amend" in
|
case "$#,$also,$only,$amend" in
|
||||||
|
@ -21,7 +21,6 @@ use warnings;
|
|||||||
use Term::ReadLine;
|
use Term::ReadLine;
|
||||||
use Getopt::Long;
|
use Getopt::Long;
|
||||||
use Data::Dumper;
|
use Data::Dumper;
|
||||||
use Net::SMTP;
|
|
||||||
|
|
||||||
# most mail servers generate the Date: header, but not all...
|
# most mail servers generate the Date: header, but not all...
|
||||||
$ENV{LC_ALL} = 'C';
|
$ENV{LC_ALL} = 'C';
|
||||||
@ -394,6 +393,7 @@ X-Mailer: git-send-email $gitversion
|
|||||||
print $sm "$header\n$message";
|
print $sm "$header\n$message";
|
||||||
close $sm or die $?;
|
close $sm or die $?;
|
||||||
} else {
|
} else {
|
||||||
|
require Net::SMTP;
|
||||||
$smtp ||= Net::SMTP->new( $smtp_server );
|
$smtp ||= Net::SMTP->new( $smtp_server );
|
||||||
$smtp->mail( $from ) or die $smtp->message;
|
$smtp->mail( $from ) or die $smtp->message;
|
||||||
$smtp->to( @recipients ) or die $smtp->message;
|
$smtp->to( @recipients ) or die $smtp->message;
|
||||||
|
102
gitk
102
gitk
@ -34,10 +34,10 @@ proc start_rev_list {view} {
|
|||||||
set order "--date-order"
|
set order "--date-order"
|
||||||
}
|
}
|
||||||
if {[catch {
|
if {[catch {
|
||||||
set fd [open [concat | git-rev-list --header $order \
|
set fd [open [concat | git rev-list --header $order \
|
||||||
--parents --boundary --default HEAD $args] r]
|
--parents --boundary --default HEAD $args] r]
|
||||||
} err]} {
|
} err]} {
|
||||||
puts stderr "Error executing git-rev-list: $err"
|
puts stderr "Error executing git rev-list: $err"
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
set commfd($view) $fd
|
set commfd($view) $fd
|
||||||
@ -94,10 +94,10 @@ proc getcommitlines {fd view} {
|
|||||||
}
|
}
|
||||||
if {[string range $err 0 4] == "usage"} {
|
if {[string range $err 0 4] == "usage"} {
|
||||||
set err "Gitk: error reading commits$fv:\
|
set err "Gitk: error reading commits$fv:\
|
||||||
bad arguments to git-rev-list."
|
bad arguments to git rev-list."
|
||||||
if {$viewname($view) eq "Command line"} {
|
if {$viewname($view) eq "Command line"} {
|
||||||
append err \
|
append err \
|
||||||
" (Note: arguments to gitk are passed to git-rev-list\
|
" (Note: arguments to gitk are passed to git rev-list\
|
||||||
to allow selection of commits to be displayed.)"
|
to allow selection of commits to be displayed.)"
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -148,7 +148,7 @@ proc getcommitlines {fd view} {
|
|||||||
if {[string length $shortcmit] > 80} {
|
if {[string length $shortcmit] > 80} {
|
||||||
set shortcmit "[string range $shortcmit 0 80]..."
|
set shortcmit "[string range $shortcmit 0 80]..."
|
||||||
}
|
}
|
||||||
error_popup "Can't parse git-rev-list output: {$shortcmit}"
|
error_popup "Can't parse git rev-list output: {$shortcmit}"
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
set id [lindex $ids 0]
|
set id [lindex $ids 0]
|
||||||
@ -217,7 +217,7 @@ proc doupdate {} {
|
|||||||
}
|
}
|
||||||
|
|
||||||
proc readcommit {id} {
|
proc readcommit {id} {
|
||||||
if {[catch {set contents [exec git-cat-file commit $id]}]} return
|
if {[catch {set contents [exec git cat-file commit $id]}]} return
|
||||||
parsecommit $id $contents 0
|
parsecommit $id $contents 0
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -276,8 +276,8 @@ proc parsecommit {id contents listed} {
|
|||||||
set headline $comment
|
set headline $comment
|
||||||
}
|
}
|
||||||
if {!$listed} {
|
if {!$listed} {
|
||||||
# git-rev-list indents the comment by 4 spaces;
|
# git rev-list indents the comment by 4 spaces;
|
||||||
# if we got this via git-cat-file, add the indentation
|
# if we got this via git cat-file, add the indentation
|
||||||
set newcomment {}
|
set newcomment {}
|
||||||
foreach line [split $comment "\n"] {
|
foreach line [split $comment "\n"] {
|
||||||
append newcomment " "
|
append newcomment " "
|
||||||
@ -337,14 +337,14 @@ proc readrefs {} {
|
|||||||
set type {}
|
set type {}
|
||||||
set tag {}
|
set tag {}
|
||||||
catch {
|
catch {
|
||||||
set commit [exec git-rev-parse "$id^0"]
|
set commit [exec git rev-parse "$id^0"]
|
||||||
if {"$commit" != "$id"} {
|
if {"$commit" != "$id"} {
|
||||||
set tagids($name) $commit
|
set tagids($name) $commit
|
||||||
lappend idtags($commit) $name
|
lappend idtags($commit) $name
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch {
|
catch {
|
||||||
set tagcontents($name) [exec git-cat-file tag "$id"]
|
set tagcontents($name) [exec git cat-file tag "$id"]
|
||||||
}
|
}
|
||||||
} elseif { $type == "heads" } {
|
} elseif { $type == "heads" } {
|
||||||
set headids($name) $id
|
set headids($name) $id
|
||||||
@ -357,21 +357,21 @@ proc readrefs {} {
|
|||||||
close $refd
|
close $refd
|
||||||
}
|
}
|
||||||
|
|
||||||
proc show_error {w msg} {
|
proc show_error {w top msg} {
|
||||||
message $w.m -text $msg -justify center -aspect 400
|
message $w.m -text $msg -justify center -aspect 400
|
||||||
pack $w.m -side top -fill x -padx 20 -pady 20
|
pack $w.m -side top -fill x -padx 20 -pady 20
|
||||||
button $w.ok -text OK -command "destroy $w"
|
button $w.ok -text OK -command "destroy $top"
|
||||||
pack $w.ok -side bottom -fill x
|
pack $w.ok -side bottom -fill x
|
||||||
bind $w <Visibility> "grab $w; focus $w"
|
bind $top <Visibility> "grab $top; focus $top"
|
||||||
bind $w <Key-Return> "destroy $w"
|
bind $top <Key-Return> "destroy $top"
|
||||||
tkwait window $w
|
tkwait window $top
|
||||||
}
|
}
|
||||||
|
|
||||||
proc error_popup msg {
|
proc error_popup msg {
|
||||||
set w .error
|
set w .error
|
||||||
toplevel $w
|
toplevel $w
|
||||||
wm transient $w .
|
wm transient $w .
|
||||||
show_error $w $msg
|
show_error $w $w $msg
|
||||||
}
|
}
|
||||||
|
|
||||||
proc makewindow {} {
|
proc makewindow {} {
|
||||||
@ -380,7 +380,7 @@ proc makewindow {} {
|
|||||||
global findtype findtypemenu findloc findstring fstring geometry
|
global findtype findtypemenu findloc findstring fstring geometry
|
||||||
global entries sha1entry sha1string sha1but
|
global entries sha1entry sha1string sha1but
|
||||||
global maincursor textcursor curtextcursor
|
global maincursor textcursor curtextcursor
|
||||||
global rowctxmenu mergemax
|
global rowctxmenu mergemax wrapcomment
|
||||||
|
|
||||||
menu .bar
|
menu .bar
|
||||||
.bar add cascade -label "File" -menu .bar.file
|
.bar add cascade -label "File" -menu .bar.file
|
||||||
@ -527,6 +527,7 @@ proc makewindow {} {
|
|||||||
pack $ctext -side left -fill both -expand 1
|
pack $ctext -side left -fill both -expand 1
|
||||||
.ctop.cdet add .ctop.cdet.left
|
.ctop.cdet add .ctop.cdet.left
|
||||||
|
|
||||||
|
$ctext tag conf comment -wrap $wrapcomment
|
||||||
$ctext tag conf filesep -font [concat $textfont bold] -back "#aaaaaa"
|
$ctext tag conf filesep -font [concat $textfont bold] -back "#aaaaaa"
|
||||||
$ctext tag conf hunksep -fore blue
|
$ctext tag conf hunksep -fore blue
|
||||||
$ctext tag conf d0 -fore red
|
$ctext tag conf d0 -fore red
|
||||||
@ -696,7 +697,7 @@ proc savestuff {w} {
|
|||||||
global stuffsaved findmergefiles maxgraphpct
|
global stuffsaved findmergefiles maxgraphpct
|
||||||
global maxwidth
|
global maxwidth
|
||||||
global viewname viewfiles viewargs viewperm nextviewnum
|
global viewname viewfiles viewargs viewperm nextviewnum
|
||||||
global cmitmode
|
global cmitmode wrapcomment
|
||||||
|
|
||||||
if {$stuffsaved} return
|
if {$stuffsaved} return
|
||||||
if {![winfo viewable .]} return
|
if {![winfo viewable .]} return
|
||||||
@ -709,6 +710,7 @@ proc savestuff {w} {
|
|||||||
puts $f [list set maxgraphpct $maxgraphpct]
|
puts $f [list set maxgraphpct $maxgraphpct]
|
||||||
puts $f [list set maxwidth $maxwidth]
|
puts $f [list set maxwidth $maxwidth]
|
||||||
puts $f [list set cmitmode $cmitmode]
|
puts $f [list set cmitmode $cmitmode]
|
||||||
|
puts $f [list set wrapcomment $wrapcomment]
|
||||||
puts $f "set geometry(width) [winfo width .ctop]"
|
puts $f "set geometry(width) [winfo width .ctop]"
|
||||||
puts $f "set geometry(height) [winfo height .ctop]"
|
puts $f "set geometry(height) [winfo height .ctop]"
|
||||||
puts $f "set geometry(canv1) [expr {[winfo width $canv]-2}]"
|
puts $f "set geometry(canv1) [expr {[winfo width $canv]-2}]"
|
||||||
@ -1285,7 +1287,7 @@ proc vieweditor {top n title} {
|
|||||||
checkbutton $top.perm -text "Remember this view" -variable newviewperm($n)
|
checkbutton $top.perm -text "Remember this view" -variable newviewperm($n)
|
||||||
grid $top.perm - -pady 5 -sticky w
|
grid $top.perm - -pady 5 -sticky w
|
||||||
message $top.al -aspect 1000 -font $uifont \
|
message $top.al -aspect 1000 -font $uifont \
|
||||||
-text "Commits to include (arguments to git-rev-list):"
|
-text "Commits to include (arguments to git rev-list):"
|
||||||
grid $top.al - -sticky w -pady 5
|
grid $top.al - -sticky w -pady 5
|
||||||
entry $top.args -width 50 -textvariable newviewargs($n) \
|
entry $top.args -width 50 -textvariable newviewargs($n) \
|
||||||
-background white
|
-background white
|
||||||
@ -2939,7 +2941,7 @@ proc findpatches {} {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if {[catch {
|
if {[catch {
|
||||||
set f [open [list | git-diff-tree --stdin -s -r -S$findstring \
|
set f [open [list | git diff-tree --stdin -s -r -S$findstring \
|
||||||
<< $inputids] r]
|
<< $inputids] r]
|
||||||
} err]} {
|
} err]} {
|
||||||
error_popup "Error starting search process: $err"
|
error_popup "Error starting search process: $err"
|
||||||
@ -2971,7 +2973,7 @@ proc readfindproc {} {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
if {![regexp {^[0-9a-f]{40}} $line id]} {
|
if {![regexp {^[0-9a-f]{40}} $line id]} {
|
||||||
error_popup "Can't parse git-diff-tree output: $line"
|
error_popup "Can't parse git diff-tree output: $line"
|
||||||
stopfindproc
|
stopfindproc
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -3036,10 +3038,10 @@ proc findfiles {} {
|
|||||||
if {$l == $findstartline} break
|
if {$l == $findstartline} break
|
||||||
}
|
}
|
||||||
|
|
||||||
# start off a git-diff-tree process if needed
|
# start off a git diff-tree process if needed
|
||||||
if {$diffsneeded ne {}} {
|
if {$diffsneeded ne {}} {
|
||||||
if {[catch {
|
if {[catch {
|
||||||
set df [open [list | git-diff-tree -r --stdin << $diffsneeded] r]
|
set df [open [list | git diff-tree -r --stdin << $diffsneeded] r]
|
||||||
} err ]} {
|
} err ]} {
|
||||||
error_popup "Error starting search process: $err"
|
error_popup "Error starting search process: $err"
|
||||||
return
|
return
|
||||||
@ -3069,7 +3071,7 @@ proc readfilediffs {df} {
|
|||||||
if {[catch {close $df} err]} {
|
if {[catch {close $df} err]} {
|
||||||
stopfindproc
|
stopfindproc
|
||||||
bell
|
bell
|
||||||
error_popup "Error in git-diff-tree: $err"
|
error_popup "Error in git diff-tree: $err"
|
||||||
} elseif {[info exists findid]} {
|
} elseif {[info exists findid]} {
|
||||||
set id $findid
|
set id $findid
|
||||||
stopfindproc
|
stopfindproc
|
||||||
@ -3096,7 +3098,7 @@ proc donefilediff {} {
|
|||||||
if {[info exists fdiffid]} {
|
if {[info exists fdiffid]} {
|
||||||
while {[lindex $fdiffsneeded $fdiffpos] ne $fdiffid
|
while {[lindex $fdiffsneeded $fdiffpos] ne $fdiffid
|
||||||
&& $fdiffpos < [llength $fdiffsneeded]} {
|
&& $fdiffpos < [llength $fdiffsneeded]} {
|
||||||
# git-diff-tree doesn't output anything for a commit
|
# git diff-tree doesn't output anything for a commit
|
||||||
# which doesn't change anything
|
# which doesn't change anything
|
||||||
set nullid [lindex $fdiffsneeded $fdiffpos]
|
set nullid [lindex $fdiffsneeded $fdiffpos]
|
||||||
set treediffs($nullid) {}
|
set treediffs($nullid) {}
|
||||||
@ -3213,8 +3215,11 @@ proc selcanvline {w x y} {
|
|||||||
|
|
||||||
proc commit_descriptor {p} {
|
proc commit_descriptor {p} {
|
||||||
global commitinfo
|
global commitinfo
|
||||||
|
if {![info exists commitinfo($p)]} {
|
||||||
|
getcommit $p
|
||||||
|
}
|
||||||
set l "..."
|
set l "..."
|
||||||
if {[info exists commitinfo($p)]} {
|
if {[llength $commitinfo($p)] > 1} {
|
||||||
set l [lindex $commitinfo($p) 0]
|
set l [lindex $commitinfo($p) 0]
|
||||||
}
|
}
|
||||||
return "$p ($l)"
|
return "$p ($l)"
|
||||||
@ -3222,11 +3227,11 @@ proc commit_descriptor {p} {
|
|||||||
|
|
||||||
# append some text to the ctext widget, and make any SHA1 ID
|
# append some text to the ctext widget, and make any SHA1 ID
|
||||||
# that we know about be a clickable link.
|
# that we know about be a clickable link.
|
||||||
proc appendwithlinks {text} {
|
proc appendwithlinks {text tags} {
|
||||||
global ctext commitrow linknum curview
|
global ctext commitrow linknum curview
|
||||||
|
|
||||||
set start [$ctext index "end - 1c"]
|
set start [$ctext index "end - 1c"]
|
||||||
$ctext insert end $text
|
$ctext insert end $text $tags
|
||||||
$ctext insert end "\n"
|
$ctext insert end "\n"
|
||||||
set links [regexp -indices -all -inline {[0-9a-f]{40}} $text]
|
set links [regexp -indices -all -inline {[0-9a-f]{40}} $text]
|
||||||
foreach l $links {
|
foreach l $links {
|
||||||
@ -3354,7 +3359,7 @@ proc selectline {l isnew} {
|
|||||||
$ctext insert end "\n"
|
$ctext insert end "\n"
|
||||||
}
|
}
|
||||||
|
|
||||||
set comment {}
|
set headers {}
|
||||||
set olds [lindex $parentlist $l]
|
set olds [lindex $parentlist $l]
|
||||||
if {[llength $olds] > 1} {
|
if {[llength $olds] > 1} {
|
||||||
set np 0
|
set np 0
|
||||||
@ -3365,23 +3370,22 @@ proc selectline {l isnew} {
|
|||||||
set tag m$np
|
set tag m$np
|
||||||
}
|
}
|
||||||
$ctext insert end "Parent: " $tag
|
$ctext insert end "Parent: " $tag
|
||||||
appendwithlinks [commit_descriptor $p]
|
appendwithlinks [commit_descriptor $p] {}
|
||||||
incr np
|
incr np
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
foreach p $olds {
|
foreach p $olds {
|
||||||
append comment "Parent: [commit_descriptor $p]\n"
|
append headers "Parent: [commit_descriptor $p]\n"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach c [lindex $childlist $l] {
|
foreach c [lindex $childlist $l] {
|
||||||
append comment "Child: [commit_descriptor $c]\n"
|
append headers "Child: [commit_descriptor $c]\n"
|
||||||
}
|
}
|
||||||
append comment "\n"
|
|
||||||
append comment [lindex $info 5]
|
|
||||||
|
|
||||||
# make anything that looks like a SHA1 ID be a clickable link
|
# make anything that looks like a SHA1 ID be a clickable link
|
||||||
appendwithlinks $comment
|
appendwithlinks $headers {}
|
||||||
|
appendwithlinks [lindex $info 5] {comment}
|
||||||
|
|
||||||
$ctext tag delete Comments
|
$ctext tag delete Comments
|
||||||
$ctext tag remove found 1.0 end
|
$ctext tag remove found 1.0 end
|
||||||
@ -3426,6 +3430,7 @@ proc selnextpage {dir} {
|
|||||||
set lpp 1
|
set lpp 1
|
||||||
}
|
}
|
||||||
allcanvs yview scroll [expr {$dir * $lpp}] units
|
allcanvs yview scroll [expr {$dir * $lpp}] units
|
||||||
|
drawvisible
|
||||||
if {![info exists selectedline]} return
|
if {![info exists selectedline]} return
|
||||||
set l [expr {$selectedline + $dir * $lpp}]
|
set l [expr {$selectedline + $dir * $lpp}]
|
||||||
if {$l < 0} {
|
if {$l < 0} {
|
||||||
@ -3521,7 +3526,7 @@ proc gettree {id} {
|
|||||||
catch {unset diffmergeid}
|
catch {unset diffmergeid}
|
||||||
if {![info exists treefilelist($id)]} {
|
if {![info exists treefilelist($id)]} {
|
||||||
if {![info exists treepending]} {
|
if {![info exists treepending]} {
|
||||||
if {[catch {set gtf [open [concat | git-ls-tree -r $id] r]}]} {
|
if {[catch {set gtf [open [concat | git ls-tree -r $id] r]}]} {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
set treepending $id
|
set treepending $id
|
||||||
@ -3569,7 +3574,7 @@ proc showfile {f} {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
set blob [lindex $treeidlist($diffids) $i]
|
set blob [lindex $treeidlist($diffids) $i]
|
||||||
if {[catch {set bf [open [concat | git-cat-file blob $blob] r]} err]} {
|
if {[catch {set bf [open [concat | git cat-file blob $blob] r]} err]} {
|
||||||
puts "oops, error reading blob $blob: $err"
|
puts "oops, error reading blob $blob: $err"
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -3611,7 +3616,7 @@ proc mergediff {id l} {
|
|||||||
set diffids $id
|
set diffids $id
|
||||||
# this doesn't seem to actually affect anything...
|
# this doesn't seem to actually affect anything...
|
||||||
set env(GIT_DIFF_OPTS) $diffopts
|
set env(GIT_DIFF_OPTS) $diffopts
|
||||||
set cmd [concat | git-diff-tree --no-commit-id --cc $id]
|
set cmd [concat | git diff-tree --no-commit-id --cc $id]
|
||||||
if {[catch {set mdf [open $cmd r]} err]} {
|
if {[catch {set mdf [open $cmd r]} err]} {
|
||||||
error_popup "Error getting merge diffs: $err"
|
error_popup "Error getting merge diffs: $err"
|
||||||
return
|
return
|
||||||
@ -3723,7 +3728,7 @@ proc gettreediffs {ids} {
|
|||||||
set treepending $ids
|
set treepending $ids
|
||||||
set treediff {}
|
set treediff {}
|
||||||
if {[catch \
|
if {[catch \
|
||||||
{set gdtf [open [concat | git-diff-tree --no-commit-id -r $ids] r]} \
|
{set gdtf [open [concat | git diff-tree --no-commit-id -r $ids] r]} \
|
||||||
]} return
|
]} return
|
||||||
fconfigure $gdtf -blocking 0
|
fconfigure $gdtf -blocking 0
|
||||||
fileevent $gdtf readable [list gettreediffline $gdtf $ids]
|
fileevent $gdtf readable [list gettreediffline $gdtf $ids]
|
||||||
@ -3759,7 +3764,7 @@ proc getblobdiffs {ids} {
|
|||||||
global nextupdate diffinhdr treediffs
|
global nextupdate diffinhdr treediffs
|
||||||
|
|
||||||
set env(GIT_DIFF_OPTS) $diffopts
|
set env(GIT_DIFF_OPTS) $diffopts
|
||||||
set cmd [concat | git-diff-tree --no-commit-id -r -p -C $ids]
|
set cmd [concat | git diff-tree --no-commit-id -r -p -C $ids]
|
||||||
if {[catch {set bdf [open $cmd r]} err]} {
|
if {[catch {set bdf [open $cmd r]} err]} {
|
||||||
puts "error getting diffs: $err"
|
puts "error getting diffs: $err"
|
||||||
return
|
return
|
||||||
@ -4296,7 +4301,7 @@ proc mkpatchgo {} {
|
|||||||
set oldid [$patchtop.fromsha1 get]
|
set oldid [$patchtop.fromsha1 get]
|
||||||
set newid [$patchtop.tosha1 get]
|
set newid [$patchtop.tosha1 get]
|
||||||
set fname [$patchtop.fname get]
|
set fname [$patchtop.fname get]
|
||||||
if {[catch {exec git-diff-tree -p $oldid $newid >$fname &} err]} {
|
if {[catch {exec git diff-tree -p $oldid $newid >$fname &} err]} {
|
||||||
error_popup "Error creating patch: $err"
|
error_popup "Error creating patch: $err"
|
||||||
}
|
}
|
||||||
catch {destroy $patchtop}
|
catch {destroy $patchtop}
|
||||||
@ -4504,7 +4509,7 @@ proc showtag {tag isnew} {
|
|||||||
} else {
|
} else {
|
||||||
set text "Tag: $tag\nId: $tagids($tag)"
|
set text "Tag: $tag\nId: $tagids($tag)"
|
||||||
}
|
}
|
||||||
appendwithlinks $text
|
appendwithlinks $text {}
|
||||||
$ctext conf -state disabled
|
$ctext conf -state disabled
|
||||||
init_flist {}
|
init_flist {}
|
||||||
}
|
}
|
||||||
@ -4863,11 +4868,11 @@ proc tcl_encoding {enc} {
|
|||||||
# defaults...
|
# defaults...
|
||||||
set datemode 0
|
set datemode 0
|
||||||
set diffopts "-U 5 -p"
|
set diffopts "-U 5 -p"
|
||||||
set wrcomcmd "git-diff-tree --stdin -p --pretty"
|
set wrcomcmd "git diff-tree --stdin -p --pretty"
|
||||||
|
|
||||||
set gitencoding {}
|
set gitencoding {}
|
||||||
catch {
|
catch {
|
||||||
set gitencoding [exec git-repo-config --get i18n.commitencoding]
|
set gitencoding [exec git repo-config --get i18n.commitencoding]
|
||||||
}
|
}
|
||||||
if {$gitencoding == ""} {
|
if {$gitencoding == ""} {
|
||||||
set gitencoding "utf-8"
|
set gitencoding "utf-8"
|
||||||
@ -4890,6 +4895,7 @@ set downarrowlen 7
|
|||||||
set mingaplen 30
|
set mingaplen 30
|
||||||
set flistmode "flat"
|
set flistmode "flat"
|
||||||
set cmitmode "patch"
|
set cmitmode "patch"
|
||||||
|
set wrapcomment "none"
|
||||||
|
|
||||||
set colors {green red blue magenta darkgrey brown orange}
|
set colors {green red blue magenta darkgrey brown orange}
|
||||||
|
|
||||||
@ -4911,7 +4917,7 @@ foreach arg $argv {
|
|||||||
# check that we can find a .git directory somewhere...
|
# check that we can find a .git directory somewhere...
|
||||||
set gitdir [gitdir]
|
set gitdir [gitdir]
|
||||||
if {![file isdirectory $gitdir]} {
|
if {![file isdirectory $gitdir]} {
|
||||||
show_error . "Cannot find the git directory \"$gitdir\"."
|
show_error {} . "Cannot find the git directory \"$gitdir\"."
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4922,7 +4928,7 @@ if {$i >= 0} {
|
|||||||
set revtreeargs [lrange $revtreeargs 0 [expr {$i - 1}]]
|
set revtreeargs [lrange $revtreeargs 0 [expr {$i - 1}]]
|
||||||
} elseif {$revtreeargs ne {}} {
|
} elseif {$revtreeargs ne {}} {
|
||||||
if {[catch {
|
if {[catch {
|
||||||
set f [eval exec git-rev-parse --no-revs --no-flags $revtreeargs]
|
set f [eval exec git rev-parse --no-revs --no-flags $revtreeargs]
|
||||||
set cmdline_files [split $f "\n"]
|
set cmdline_files [split $f "\n"]
|
||||||
set n [llength $cmdline_files]
|
set n [llength $cmdline_files]
|
||||||
set revtreeargs [lrange $revtreeargs 0 end-$n]
|
set revtreeargs [lrange $revtreeargs 0 end-$n]
|
||||||
@ -4931,9 +4937,9 @@ if {$i >= 0} {
|
|||||||
# so look for "fatal:".
|
# so look for "fatal:".
|
||||||
set i [string first "fatal:" $err]
|
set i [string first "fatal:" $err]
|
||||||
if {$i > 0} {
|
if {$i > 0} {
|
||||||
set err [string range [expr {$i + 6}] end]
|
set err [string range $err [expr {$i + 6}] end]
|
||||||
}
|
}
|
||||||
show_error . "Bad arguments to gitk:\n$err"
|
show_error {} . "Bad arguments to gitk:\n$err"
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1269,10 +1269,10 @@ int main(int argc, char **argv)
|
|||||||
if (pull(commit_id))
|
if (pull(commit_id))
|
||||||
rc = 1;
|
rc = 1;
|
||||||
|
|
||||||
curl_slist_free_all(no_pragma_header);
|
|
||||||
|
|
||||||
http_cleanup();
|
http_cleanup();
|
||||||
|
|
||||||
|
curl_slist_free_all(no_pragma_header);
|
||||||
|
|
||||||
if (corrupt_object_found) {
|
if (corrupt_object_found) {
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"Some loose object were found to be corrupt, but they might be just\n"
|
"Some loose object were found to be corrupt, but they might be just\n"
|
||||||
|
9
http.c
9
http.c
@ -25,7 +25,6 @@ long curl_low_speed_limit = -1;
|
|||||||
long curl_low_speed_time = -1;
|
long curl_low_speed_time = -1;
|
||||||
|
|
||||||
struct curl_slist *pragma_header;
|
struct curl_slist *pragma_header;
|
||||||
struct curl_slist *no_range_header;
|
|
||||||
|
|
||||||
struct active_request_slot *active_queue_head = NULL;
|
struct active_request_slot *active_queue_head = NULL;
|
||||||
|
|
||||||
@ -208,7 +207,6 @@ void http_init(void)
|
|||||||
curl_global_init(CURL_GLOBAL_ALL);
|
curl_global_init(CURL_GLOBAL_ALL);
|
||||||
|
|
||||||
pragma_header = curl_slist_append(pragma_header, "Pragma: no-cache");
|
pragma_header = curl_slist_append(pragma_header, "Pragma: no-cache");
|
||||||
no_range_header = curl_slist_append(no_range_header, "Range:");
|
|
||||||
|
|
||||||
#ifdef USE_CURL_MULTI
|
#ifdef USE_CURL_MULTI
|
||||||
{
|
{
|
||||||
@ -344,9 +342,14 @@ struct active_request_slot *get_active_slot(void)
|
|||||||
slot->finished = NULL;
|
slot->finished = NULL;
|
||||||
slot->callback_data = NULL;
|
slot->callback_data = NULL;
|
||||||
slot->callback_func = NULL;
|
slot->callback_func = NULL;
|
||||||
|
curl_easy_setopt(slot->curl, CURLOPT_HTTPHEADER, NULL);
|
||||||
curl_easy_setopt(slot->curl, CURLOPT_HTTPHEADER, pragma_header);
|
curl_easy_setopt(slot->curl, CURLOPT_HTTPHEADER, pragma_header);
|
||||||
curl_easy_setopt(slot->curl, CURLOPT_HTTPHEADER, no_range_header);
|
|
||||||
curl_easy_setopt(slot->curl, CURLOPT_ERRORBUFFER, curl_errorstr);
|
curl_easy_setopt(slot->curl, CURLOPT_ERRORBUFFER, curl_errorstr);
|
||||||
|
curl_easy_setopt(slot->curl, CURLOPT_CUSTOMREQUEST, NULL);
|
||||||
|
curl_easy_setopt(slot->curl, CURLOPT_READFUNCTION, NULL);
|
||||||
|
curl_easy_setopt(slot->curl, CURLOPT_WRITEFUNCTION, NULL);
|
||||||
|
curl_easy_setopt(slot->curl, CURLOPT_UPLOAD, 0);
|
||||||
|
curl_easy_setopt(slot->curl, CURLOPT_HTTPGET, 1);
|
||||||
|
|
||||||
return slot;
|
return slot;
|
||||||
}
|
}
|
||||||
|
30
sha1_file.c
30
sha1_file.c
@ -617,6 +617,12 @@ static void prepare_packed_git_one(char *objdir, int local)
|
|||||||
|
|
||||||
/* we have .idx. Is it a file we can map? */
|
/* we have .idx. Is it a file we can map? */
|
||||||
strcpy(path + len, de->d_name);
|
strcpy(path + len, de->d_name);
|
||||||
|
for (p = packed_git; p; p = p->next) {
|
||||||
|
if (!memcmp(path, p->pack_name, len + namelen - 4))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (p)
|
||||||
|
continue;
|
||||||
p = add_packed_git(path, len + namelen, local);
|
p = add_packed_git(path, len + namelen, local);
|
||||||
if (!p)
|
if (!p)
|
||||||
continue;
|
continue;
|
||||||
@ -626,12 +632,12 @@ static void prepare_packed_git_one(char *objdir, int local)
|
|||||||
closedir(dir);
|
closedir(dir);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int prepare_packed_git_run_once = 0;
|
||||||
void prepare_packed_git(void)
|
void prepare_packed_git(void)
|
||||||
{
|
{
|
||||||
static int run_once = 0;
|
|
||||||
struct alternate_object_database *alt;
|
struct alternate_object_database *alt;
|
||||||
|
|
||||||
if (run_once)
|
if (prepare_packed_git_run_once)
|
||||||
return;
|
return;
|
||||||
prepare_packed_git_one(get_object_directory(), 1);
|
prepare_packed_git_one(get_object_directory(), 1);
|
||||||
prepare_alt_odb();
|
prepare_alt_odb();
|
||||||
@ -640,7 +646,13 @@ void prepare_packed_git(void)
|
|||||||
prepare_packed_git_one(alt->base, 0);
|
prepare_packed_git_one(alt->base, 0);
|
||||||
alt->name[-1] = '/';
|
alt->name[-1] = '/';
|
||||||
}
|
}
|
||||||
run_once = 1;
|
prepare_packed_git_run_once = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void reprepare_packed_git(void)
|
||||||
|
{
|
||||||
|
prepare_packed_git_run_once = 0;
|
||||||
|
prepare_packed_git();
|
||||||
}
|
}
|
||||||
|
|
||||||
int check_sha1_signature(const unsigned char *sha1, void *map, unsigned long size, const char *type)
|
int check_sha1_signature(const unsigned char *sha1, void *map, unsigned long size, const char *type)
|
||||||
@ -1212,9 +1224,12 @@ int sha1_object_info(const unsigned char *sha1, char *type, unsigned long *sizep
|
|||||||
if (!map) {
|
if (!map) {
|
||||||
struct pack_entry e;
|
struct pack_entry e;
|
||||||
|
|
||||||
if (!find_pack_entry(sha1, &e))
|
if (find_pack_entry(sha1, &e))
|
||||||
return error("unable to find %s", sha1_to_hex(sha1));
|
return packed_object_info(&e, type, sizep);
|
||||||
return packed_object_info(&e, type, sizep);
|
reprepare_packed_git();
|
||||||
|
if (find_pack_entry(sha1, &e))
|
||||||
|
return packed_object_info(&e, type, sizep);
|
||||||
|
return error("unable to find %s", sha1_to_hex(sha1));
|
||||||
}
|
}
|
||||||
if (unpack_sha1_header(&stream, map, mapsize, hdr, sizeof(hdr)) < 0)
|
if (unpack_sha1_header(&stream, map, mapsize, hdr, sizeof(hdr)) < 0)
|
||||||
status = error("unable to unpack %s header",
|
status = error("unable to unpack %s header",
|
||||||
@ -1256,6 +1271,9 @@ void * read_sha1_file(const unsigned char *sha1, char *type, unsigned long *size
|
|||||||
munmap(map, mapsize);
|
munmap(map, mapsize);
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
reprepare_packed_git();
|
||||||
|
if (find_pack_entry(sha1, &e))
|
||||||
|
return read_packed_sha1(sha1, type, size);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user