* SIGPIPE in t9300-fast-import
@ 2010-12-12 20:49 Brian Gernhardt
2010-12-12 21:49 ` Jonathan Nieder
0 siblings, 1 reply; 6+ messages in thread
From: Brian Gernhardt @ 2010-12-12 20:49 UTC (permalink / raw)
To: git@vger.kernel.org List; +Cc: David Barr
The new cat-blob test (9300.114) is failing for me on OS X, and has been since it's introduction in "85c6239 fast-import: let importers retrieve blobs":
---- 8< ----
ok 113 - setup: have pipes?
expecting success:
expect_id=$(git hash-object big) &&
expect_len=$(wc -c <big) &&
echo $expect_id blob $expect_len >expect.response &&
rm -f blobs &&
cat >frontend <<-\FRONTEND_END &&
#!/bin/sh
cat <<EOF &&
feature cat-blob
blob
mark :1
data <<BLOB
EOF
cat big
cat <<EOF
BLOB
cat-blob :1
EOF
read blob_id type size <&3 &&
echo "$blob_id $type $size" >response &&
dd of=blob bs=$size count=1 <&3 &&
read newline <&3 &&
cat <<EOF &&
commit refs/heads/copied
committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
data <<COMMIT
copy big file as file3
COMMIT
M 644 inline file3
data <<BLOB
EOF
cat blob &&
cat <<EOF
BLOB
EOF
FRONTEND_END
mkfifo blobs &&
(
export GIT_COMMITTER_NAME GIT_COMMITTER_EMAIL GIT_COMMITTER_DATE &&
sh frontend 3<blobs |
git fast-import --cat-blob-fd=3 3>blobs
) &&
git show copied:file3 >actual &&
test_cmp expect.response response &&
test_cmp big actual
0+1 records in
0+1 records out
8139 bytes transferred in 0.000062 secs (131297847 bytes/sec)
error: git-fast-import died of signal 13
not ok - 114 R: copy using cat-file
---- 8< ----
I don't have the tuits right now to dig into this, but "trash directory.t9300-fast-input" has a good response (`cmp expect.response response` is true), but has no refs/heads/copied. I can run help provide diagnostics, if anyone needs more data.
~~ Brian
PS: Isn't t9300 getting a little crazily long? Is there a good way to split it up by feature or something? It runs quickly, but finding were something is failing is getting a little difficult.
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: SIGPIPE in t9300-fast-import
2010-12-12 20:49 SIGPIPE in t9300-fast-import Brian Gernhardt
@ 2010-12-12 21:49 ` Jonathan Nieder
2010-12-12 22:04 ` Brian Gernhardt
0 siblings, 1 reply; 6+ messages in thread
From: Jonathan Nieder @ 2010-12-12 21:49 UTC (permalink / raw)
To: Brian Gernhardt; +Cc: git@vger.kernel.org List, David Barr
Brian Gernhardt wrote:
> read blob_id type size <&3 &&
> echo "$blob_id $type $size" >response &&
> dd of=blob bs=$size count=1 <&3 &&
[...]
> 0+1 records in
> 0+1 records out
> 8139 bytes transferred in 0.000062 secs (131297847 bytes/sec)
> error: git-fast-import died of signal 13
[...]
> I can run help provide diagnostics, if anyone needs more data.
Hmm. Any idea why dd is ending early? Does using
head -c "$size" >blob <&3 &&
or
dd of=blob bs=1 count=$size <&3 &&
in its place work? What does the Mac OS X equivalent of
strace dd of=blob bs=$size count=1 <&3
(dtrace or ktrace, I guess) tell?
Thanks for noticing.
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: SIGPIPE in t9300-fast-import
2010-12-12 21:49 ` Jonathan Nieder
@ 2010-12-12 22:04 ` Brian Gernhardt
2010-12-13 6:31 ` [PATCH jn/fast-import-blob-access] t9300: avoid short reads from dd Jonathan Nieder
0 siblings, 1 reply; 6+ messages in thread
From: Brian Gernhardt @ 2010-12-12 22:04 UTC (permalink / raw)
To: Jonathan Nieder; +Cc: git@vger.kernel.org List, David Barr
On Dec 12, 2010, at 4:49 PM, Jonathan Nieder wrote:
> Hmm. Any idea why dd is ending early?
No idea.
> Does using
>
> head -c "$size" >blob <&3 &&
Yes.
> dd of=blob bs=1 count=$size <&3 &&
>
> in its place work?
Yes.
> What does the Mac OS X equivalent of
>
> strace dd of=blob bs=$size count=1 <&3
>
> (dtrace or ktrace, I guess) tell?
The moral equivalent seems to be "dtruss" (which I think is a front end to DTrace) in modern OS X.
0+1 records in
0+1 records out
8139 bytes transferred in 0.000205 secs (39694698 bytes/sec)
SYSCALL(args) = return
ioctl(0x6, 0x80086804, 0x7FFF5FBFD0A0) = 0 0
close(0x6) = 0 0
__sysctl(0x7FFF5FBFCF90, 0x2, 0x7FFF5FBFCF80) = 0 0
bsdthread_register(0x7FFF852F43DC, 0x7FFF852D4FF8, 0x2000) = 0 0
thread_selfid(0x7FFF852F43DC, 0x7FFF852D4FF8, 0x0) = 1850088 0
open_nocancel("/dev/urandom\0", 0x0, 0x7FFF70ABABE0) = 6 0
read_nocancel(0x6, "\350>6\026\310R\251_\227\213h\237\304\330&Q-\247\0313\020BnH\277\337z\276c\247\206\017\340/\302} \2644\273\003\252`\363d8\252\247)V2\323\021\320\\\214\001\331\226\020RY\024I\0", 0x40) = 64 0
close_nocancel(0x6) = 0 0
mmap(0x0, 0x3000, 0x3, 0x1002, 0x1000000, 0x7FFF00000001) = 0xD000 0
__sysctl(0x7FFF5FBFCE10, 0x2, 0x7FFF5FBFCDD0) = 0 0
__sysctl(0x7FFF5FBFCDD0, 0x2, 0x7FFF5FBFCE68) = 0 0
getpid(0x7FFF5FBFCD60, 0x7FFFFFE00050, 0x0) = 94596 0
open_nocancel("/dev/urandom\0", 0x0, 0x0) = 6 0
read_nocancel(0x6, "\253\331\354\357A)G\3256\222\024=\242E\261\301\314\351\017K\301;O\256I\270\301\312\263M\307\340+U\217\242\230\335\020\275\356T\323\334\312\313\331*\037\273K\332\a\247\323\324\377m\360\204\375c\026i\345\017x\2070n\026\266\027\021k\340( \245\337\3277H\214\0", 0x6C) = 108 0
close_nocancel(0x6) = 0 0
__sysctl(0x7FFF5FBFCE10, 0x2, 0x7FFF5FBFCE3C) = 0 0
mmap(0x0, 0x17000, 0x3, 0x1002, 0x1000000, 0x7FFF00000001) = 0x10000 0
mmap(0x0, 0x17000, 0x3, 0x1002, 0x1000000, 0x7FFF00000001) = 0x27000 0
mmap(0x0, 0x1000, 0x3, 0x1002, 0x1000000, 0x7FFF00000001) = 0x3E000 0
mmap(0x0, 0x200000, 0x3, 0x1002, 0x7000000, 0x7FFF00000001) = 0x3F000 0
munmap(0x10003F000, 0xC1000) = 0 0
munmap(0x100200000, 0x3F000) = 0 0
__sysctl(0x7FFF5FBFCF70, 0x2, 0x7FFF5FBFCF30) = 0 0
__sysctl(0x7FFF5FBFCF30, 0x2, 0x7FFF70AC7760) = 0 0
__sysctl(0x7FFF5FBFCF70, 0x2, 0x7FFF5FBFCF30) = 0 0
__sysctl(0x7FFF5FBFCF30, 0x2, 0x7FFF70AC7764) = 0 0
__sysctl(0x7FFF5FBFCF70, 0x2, 0x7FFF5FBFCF30) = 0 0
__sysctl(0x7FFF5FBFCF30, 0x2, 0x7FFF70AC7768) = 0 0
mmap(0x0, 0x3000, 0x3, 0x1002, 0x1000000, 0x7FFF00000001) = 0x3F000 0
__sysctl(0x7FFF5FBFCF40, 0x2, 0x7FFF5FBFCF00) = 0 0
__sysctl(0x7FFF5FBFCF00, 0x2, 0x7FFF5FBFCF98) = 0 0
__sysctl(0x7FFF5FBFCF40, 0x2, 0x7FFF5FBFCF6C) = 0 0
mmap(0x0, 0x17000, 0x3, 0x1002, 0x1000000, 0x7FFF00000001) = 0x42000 0
mmap(0x0, 0x17000, 0x3, 0x1002, 0x1000000, 0x7FFF00000001) = 0x59000 0
mmap(0x0, 0x200000, 0x3, 0x1002, 0x7000000, 0x7FFF00000001) = 0x200000 0
munmap(0x100300000, 0x100000) = 0 0
fstat64(0x0, 0x7FFF5FBFF320, 0x17FFF) = 0 0
lseek(0x0, 0x0, 0x1) = -1 Err#29
open("blob\0", 0x602, 0x1B6) = 6 0
fstat64(0x6, 0x7FFF5FBFF320, 0x0) = 0 0
lseek(0x6, 0x0, 0x1) = 0 0
mmap(0x0, 0x58000, 0x3, 0x1002, 0x3000000, 0x7FFF00000000) = 0x70000 0
mmap(0x0, 0x1000, 0x3, 0x1002, 0x3000000, 0x7FFF00000000) = 0xC8000 0
sigaction(0x1D, 0x7FFF5FBFF380, 0x7FFF5FBFF3B0) = 0 0
sigaction(0x2, 0x7FFF5FBFF380, 0x7FFF5FBFF3B0) = 0 0
read(0x0, "the quick brown fox jumps over the lazy dog\nthe quick brown fox jumps over the lazy dog\nthe quick brown fox jumps over the lazy dog\nthe quick brown fox jumps over the lazy dog\nthe quick brown fox jumps over the lazy dog\nthe quick brown fox jumps over the l", 0x2C000) = 8139 0
write(0x6, "the quick brown fox jumps over the lazy dog\nthe quick brown fox jumps over the lazy dog\nthe quick brown fox jumps over the lazy dog\nthe quick brown fox jumps over the lazy dog\nthe quick brown fox jumps over the lazy dog\nthe quick brown fox jumps over the l", 0x1FCB) = 8139 0
write(0x2, "0+1 records in\n0+1 records out\n quick brown fox jumps over the lazy dog\nthe quick brown fox jumps over the lazy dog\nthe quick brown fox jumps over the lazy dog\nthe quick brown fox jumps over the lazy dog\nthe quick brown fox jumps over the lazy dog\nthe quic", 0x1F) = 31 0
write(0x2, "8139 bytes transferred in 0.000205 secs (39694698 bytes/sec)\nuick brown fox jumps over the lazy dog\nthe quick brown fox jumps over the lazy dog\nthe quick brown fox jumps over the lazy dog\nthe quick brown fox jumps over the lazy dog\nthe quick brown fox jump", 0x3D) = 61 0
getpid(0x7FFF5FBFF250, 0x7FFFFFE00050, 0x0) = 94596 0
open_nocancel("/dev/urandom\0", 0x0, 0x0) = 6 0
read_nocancel(0x6, "\232/\226\373ld\353\r+l\236qV\317\370\271.0\353=\316\3464\t\263\262r\022\362w\360H\245LdE\3769\254\3309m\246I\361\374\307\342]6\n\337\303\310\333\332\036\327\313\224(\3443C\327\224\225\376\221\311-\323\272\344\275l\034\353LR<\236\t\202\250\353\202\276AS\363\023@\353\331[\037\bC\036)\336\363WZ\003\0", 0x6C) = 108 0
close_nocancel(0x6) = 0 0
issetugid(0x100000000, 0x7FFF5FBFF5B0, 0x7FFF5FC40530) = 0 0
geteuid(0x100000000, 0x7FFF5FBFF5B0, 0x0) = 0 0
__sysctl(0x7FFF5FBFD140, 0x2, 0x7FFF5FBFD100) = 0 0
__sysctl(0x7FFF5FBFD100, 0x2, 0x7FFF5FBFD19C) = 0 0
shared_region_check_np(0x7FFF5FBFD308, 0x0, 0x7FFF5FC1DC86) = 0 0
stat64("/usr/lib/dtrace/libdtrace_dyld.dylib\0", 0x7FFF5FBFC710, 0x7FFF5FBFCD50 = 0 0
open("/usr/lib/dtrace/libdtrace_dyld.dylib\0", 0x0, 0x0) = 6 0
pread(0x6, "\312\376\272\276\0", 0x1000, 0x0) = 4096 0
pread(0x6, "\317\372\355\376\a\0", 0x1000, 0x1000) = 4096 0
mmap(0x100008000, 0x2000, 0x5, 0x12, 0x6, 0x1FFFFFFFF) = 0x8000 0
mmap(0x10000A000, 0x1000, 0x3, 0x12, 0x6, 0x1FFFFFFFF) = 0xA000 0
mmap(0x10000B000, 0x1F10, 0x1, 0x12, 0x6, 0x1FFFFFFFF) = 0xB000 0
close(0x6) = 0 0
stat64("/usr/lib/libSystem.B.dylib\0", 0x7FFF5FBFC4C0, 0x7FFF5FBFCB00) = 0 0
stat64("/usr/lib/system/libmathCommon.A.dylib\0", 0x7FFF5FBFC370, 0x7FFF5FBFC9B0) = 0 0
madvise(0x7FFF89610000, 0x2000, 0x5) = 0 0
open("/dev/dtracehelper\0", 0x2, 0x7FFF5FC45258) = 6 0
ioctl(0x6, 0x80086804, 0x7FFF5FBFD0A0) = 0 0
close(0x6) = 0 0
stat64("/usr/lib/libstdc++.6.dylib\0", 0x7FFF5FBFC4B0, 0x7FFF5FBFCAF0) = 0 0
open("/dev/dtracehelper\0", 0x2, 0x7FFF5FC45320) = 6 0
error: git-fast-import died of signal 13
---- 8< ----
blob does exist, it just seems to end early:
--- big 2010-12-12 16:56:32.000000000 -0500
+++ blob 2010-12-12 16:56:33.000000000 -0500
@@ -182,3915 +182,4 @@
Followed by many lines of:
-the quick brown fox jumps over the lazy dog
and then:
+the quick brown fox jumps over the lazy dog
\ No newline at end of file
> Thanks for noticing.
I tend to update to latest next, compile, and test about once a day so exactly so I can catch things. :-D
~~ Brian
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH jn/fast-import-blob-access] t9300: avoid short reads from dd
2010-12-12 22:04 ` Brian Gernhardt
@ 2010-12-13 6:31 ` Jonathan Nieder
2010-12-13 7:21 ` Junio C Hamano
0 siblings, 1 reply; 6+ messages in thread
From: Jonathan Nieder @ 2010-12-13 6:31 UTC (permalink / raw)
To: Brian Gernhardt; +Cc: git@vger.kernel.org List, David Barr, Junio C Hamano
dd is a thin wrapper around read(2). As open group Issue 7 explains:
It shall read the input one block at a time, using the specified
input block size; it shall then process the block of data
actually returned, which could be smaller than the requested
block size.
Any short read --- for example from a pipe whose capacity cannot fill
a block --- results in that block being truncated. As a result, the
first cat-blob test (9300.114) fails on Mac OS X, where the pipe
capacity is around 8 KiB.
Fix the test by using a block size of 1. Each read will block until
the next byte of input is available.
It would be even nicer to use head -c which expresses the intention
more clearly. Alas, IRIX "head" does not support the -c option.
Reported-by: Brian Gernhardt <brian@gernhardtsoftware.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
t/t9300-fast-import.sh | 6 +++---
1 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/t/t9300-fast-import.sh b/t/t9300-fast-import.sh
index 055ddc6..ed28d3c 100755
--- a/t/t9300-fast-import.sh
+++ b/t/t9300-fast-import.sh
@@ -1794,7 +1794,7 @@ test_expect_success PIPE 'R: copy using cat-file' '
read blob_id type size <&3 &&
echo "$blob_id $type $size" >response &&
- dd of=blob bs=$size count=1 <&3 &&
+ dd of=blob bs=1 count=$size <&3 &&
read newline <&3 &&
cat <<EOF &&
@@ -1845,7 +1845,7 @@ test_expect_success PIPE 'R: print blob mid-commit' '
EOF
read blob_id type size <&3 &&
- dd of=actual bs=$size count=1 <&3 &&
+ dd of=actual bs=1 count=$size <&3 &&
read newline <&3 &&
echo
@@ -1880,7 +1880,7 @@ test_expect_success PIPE 'R: print staged blob within commit' '
echo "cat-blob $to_get" &&
read blob_id type size <&3 &&
- dd of=actual bs=$size count=1 <&3 &&
+ dd of=actual bs=1 count=$size <&3 &&
read newline <&3 &&
echo deleteall
--
1.7.2.4
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH jn/fast-import-blob-access] t9300: avoid short reads from dd
2010-12-13 6:31 ` [PATCH jn/fast-import-blob-access] t9300: avoid short reads from dd Jonathan Nieder
@ 2010-12-13 7:21 ` Junio C Hamano
2010-12-13 9:28 ` [PATCH jn/fast-import-blob-access] t9300: use perl "head -c" clone in place of "dd bs=1 count=16000" kluge Jonathan Nieder
0 siblings, 1 reply; 6+ messages in thread
From: Junio C Hamano @ 2010-12-13 7:21 UTC (permalink / raw)
To: Jonathan Nieder
Cc: Brian Gernhardt, git@vger.kernel.org List, David Barr,
Junio C Hamano
Jonathan Nieder <jrnieder@gmail.com> writes:
> dd is a thin wrapper around read(2). As open group Issue 7 explains:
>
> It shall read the input one block at a time, using the specified
> input block size; it shall then process the block of data
> actually returned, which could be smaller than the requested
> block size.
>
> Any short read --- for example from a pipe whose capacity cannot fill
> a block --- results in that block being truncated. As a result, the
> first cat-blob test (9300.114) fails on Mac OS X, where the pipe
> capacity is around 8 KiB.
I saw a similar breakage on my FBSD 8 bochs. It is unfortunate and feels
yucky that we have to issue 8k+ read(2) of one byte, but I don't think of
a better way. I thought it might be possible to specify cbs and/or conv
to have the input buffered to a size to defeat the short read issue, but
count specifies in terms of input blocks, so there doesn't seem to be a
way to do so... Oh well...
Thanks.
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH jn/fast-import-blob-access] t9300: use perl "head -c" clone in place of "dd bs=1 count=16000" kluge
2010-12-13 7:21 ` Junio C Hamano
@ 2010-12-13 9:28 ` Jonathan Nieder
0 siblings, 0 replies; 6+ messages in thread
From: Jonathan Nieder @ 2010-12-13 9:28 UTC (permalink / raw)
To: Junio C Hamano; +Cc: Brian Gernhardt, git@vger.kernel.org List, David Barr
It is unfortunate to have to issue thousands of one-byte read calls to
work around dd's refusal to buffer input that would fill a block after
a short read (a3a6f4, 2010-12-13). We could do better by using
"head -c", if it were available on all platforms we cared about.
Replace it with some simple perl.
While doing so, restructure 9300.114 to use a subshell instead of a
script. Subshells can inherit functions (like the new head_c) from
the parent shell while external scripts cannot.
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
Junio C Hamano wrote:
> It is unfortunate and feels
> yucky that we have to issue 8k+ read(2) of one byte
How about this?
t/t9300-fast-import.sh | 84 ++++++++++++++++++++++++++++--------------------
1 files changed, 49 insertions(+), 35 deletions(-)
diff --git a/t/t9300-fast-import.sh b/t/t9300-fast-import.sh
index ed28d3c..924a833 100755
--- a/t/t9300-fast-import.sh
+++ b/t/t9300-fast-import.sh
@@ -7,6 +7,23 @@ test_description='test git fast-import utility'
. ./test-lib.sh
. "$TEST_DIRECTORY"/diff-lib.sh ;# test-lib chdir's into trash
+# Print $1 bytes from stdin to stdout.
+#
+# This could be written as "head -c $1", but IRIX "head" does not
+# support the -c option.
+head_c () {
+ perl -e '
+ my $len = $ARGV[1];
+ while ($len > 0) {
+ my $s;
+ my $nread = sysread(STDIN, $s, $len);
+ die "cannot read: $!" unless defined($nread);
+ print $s;
+ $len -= $nread;
+ }
+ ' - "$1"
+}
+
file2_data='file2
second line of EOF'
@@ -1780,44 +1797,41 @@ test_expect_success PIPE 'R: copy using cat-file' '
rm -f blobs &&
cat >frontend <<-\FRONTEND_END &&
#!/bin/sh
- cat <<EOF &&
- feature cat-blob
- blob
- mark :1
- data <<BLOB
- EOF
- cat big
- cat <<EOF
- BLOB
- cat-blob :1
- EOF
-
- read blob_id type size <&3 &&
- echo "$blob_id $type $size" >response &&
- dd of=blob bs=1 count=$size <&3 &&
- read newline <&3 &&
-
- cat <<EOF &&
- commit refs/heads/copied
- committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
- data <<COMMIT
- copy big file as file3
- COMMIT
- M 644 inline file3
- data <<BLOB
- EOF
- cat blob &&
- cat <<EOF
- BLOB
- EOF
FRONTEND_END
mkfifo blobs &&
(
export GIT_COMMITTER_NAME GIT_COMMITTER_EMAIL GIT_COMMITTER_DATE &&
- sh frontend 3<blobs |
- git fast-import --cat-blob-fd=3 3>blobs
- ) &&
+ cat <<-\EOF &&
+ feature cat-blob
+ blob
+ mark :1
+ data <<BLOB
+ EOF
+ cat big &&
+ cat <<-\EOF &&
+ BLOB
+ cat-blob :1
+ EOF
+
+ read blob_id type size <&3 &&
+ echo "$blob_id $type $size" >response &&
+ head_c $size >blob <&3 &&
+ read newline <&3 &&
+
+ cat <<-EOF &&
+ commit refs/heads/copied
+ committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+ data <<COMMIT
+ copy big file as file3
+ COMMIT
+ M 644 inline file3
+ data <<BLOB
+ EOF
+ cat blob &&
+ echo BLOB
+ ) 3<blobs |
+ git fast-import --cat-blob-fd=3 3>blobs &&
git show copied:file3 >actual &&
test_cmp expect.response response &&
test_cmp big actual
@@ -1845,7 +1859,7 @@ test_expect_success PIPE 'R: print blob mid-commit' '
EOF
read blob_id type size <&3 &&
- dd of=actual bs=1 count=$size <&3 &&
+ head_c $size >actual <&3 &&
read newline <&3 &&
echo
@@ -1880,7 +1894,7 @@ test_expect_success PIPE 'R: print staged blob within commit' '
echo "cat-blob $to_get" &&
read blob_id type size <&3 &&
- dd of=actual bs=1 count=$size <&3 &&
+ head_c $size >actual <&3 &&
read newline <&3 &&
echo deleteall
--
1.7.2.4.568.g3733c.dirty
^ permalink raw reply related [flat|nested] 6+ messages in thread
end of thread, other threads:[~2010-12-13 9:28 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-12-12 20:49 SIGPIPE in t9300-fast-import Brian Gernhardt
2010-12-12 21:49 ` Jonathan Nieder
2010-12-12 22:04 ` Brian Gernhardt
2010-12-13 6:31 ` [PATCH jn/fast-import-blob-access] t9300: avoid short reads from dd Jonathan Nieder
2010-12-13 7:21 ` Junio C Hamano
2010-12-13 9:28 ` [PATCH jn/fast-import-blob-access] t9300: use perl "head -c" clone in place of "dd bs=1 count=16000" kluge Jonathan Nieder
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).