git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v2 0/3] test-lib.sh: use GIT_TEST_COLUMNS over COLUMNS

From
Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Date
Aug 2, 2021, 13:46 UTC
Message-ID
<cover-v2-0.3-00000000000-20210802T134610Z-avarab@gmail.com>
In-Reply-To
<patch-1.1-f81f3911d5-20210726T235452Z-avarab@gmail.com>

A v2 which should address the comments on v1, the large search-replace of existing COLUMN uses in the tests is now a separate step.

The below range-diff is rather confusing because the v1 1/1 is now mostly attributed to this new split-out commit, as a result it looks like most of the commit message is being deleted, but it's in fact there mostly in 3/3. I just re-worded the last paragraph a bit.

Ævar Arnfjörð Bjarmason (3):
  test-lib-functions.sh: rename test_must_fail_acceptable()
  test-lib-functions.sh: add a test_with_columns function
  test-lib.sh: use GIT_TEST_COLUMNS over COLUMNS
 pager.c                       |  7 +++++++
 t/t3200-branch.sh             |  8 ++++----
 t/t4052-stat-output.sh        | 22 +++++++++++-----------
 t/t4205-log-pretty-formats.sh |  6 +++---
 t/t7004-tag.sh                |  6 +++---
 t/t7006-pager.sh              |  2 +-
 t/t7508-status.sh             |  4 ++--
 t/t9002-column.sh             | 23 ++++++++++-------------
 t/test-lib-functions.sh       | 21 ++++++++++++++++++---
 t/test-lib.sh                 | 13 +++++++++++--
 10 files changed, 70 insertions(+), 42 deletions(-)
Range-diff against v1:
-:  ----------- > 1:  739457b992f test-lib-functions.sh: rename test_must_fail_acceptable()
1:  f81f3911d52 ! 2:  36c57178c55 test-lib.sh: use GIT_TEST_COLUMNS over COLUMNS
    @@ Metadata
     Author: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
     
      ## Commit message ##
    -    test-lib.sh: use GIT_TEST_COLUMNS over COLUMNS
    +    test-lib-functions.sh: add a test_with_columns function
     
    -    In my c49a177beca (test-lib.sh: set COLUMNS=80 for --verbose
    -    repeatability, 2021-06-29) the test suite started breaking on recent
    -    versions of bash.
    +    Add a helper function to wrap patterns of "COLUMNS=N <command>" as
    +    "test_with_columns N <command>". This will be used and extended in the
    +    next commit.
     
    -    This is because it sets "shopt -s checkwinsize" starting with version
    -    5.0, furthermore it started setting COLUMNS under "shopt -s
    -    checkwinsize" for non-interactive use around version 4.3.
    -
    -    A narrow fix for that issue would be to add this just above our
    -    setting of COLUMNS in test-lib.sh:
    -
    -            shopt -u checkwinsize >/dev/null 2>&1
    -
    -    But we'd then be at the mercy of the next shell or terminal that wants
    -    to be clever about COLUMNS.
    -
    -    Let's instead solve this more thoroughly. We'll now take
    -    GIT_TEST_COLUMNS over COLUMNS, and furthermore intentionally spoil the
    -    COLUMNS variable to break any tests that rely on it being set to a
    -    sane value.
    -
    -    If something breaks because we have a codepath that's not
    -    term_columns() checking COLUMNS we'd like to know about it, the narrow
    -    "shopt -u checkwinsize" fix won't give us that.
    -
    -    The "shopt" fix won't future-poof us against other 3rd party software
    -    changes either. If that third-party software e.g. takes TIOCGWINSZ
    -    over columns on some platforms, our tests would be flaky and break
    -    there even without this change.
    -
    -    This approach does mean that any tests of ours that expected to test
    -    term_columns() behavior by setting COLUMNS will need to explicitly
    -    unset GIT_TEST_COLUMNS, or set it to the empty string. I'm doing the
    -    latter in all the tests changed here.
    -
    -    Reported-by: Fabian Stelzer <fabian.stelzer@campoint.net>
         Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
     
    - ## pager.c ##
    -@@ pager.c: int term_columns(void)
    - 	term_columns_at_startup = 80;
    - 	term_columns_guessed = 1;
    - 
    -+	col_string = getenv("GIT_TEST_COLUMNS");
    -+	if (col_string && (n_cols = atoi(col_string)) > 0) {
    -+		term_columns_at_startup = n_cols;
    -+		term_columns_guessed = 0;
    -+		return term_columns_at_startup;
    -+	}
    -+
    - 	col_string = getenv("COLUMNS");
    - 	if (col_string && (n_cols = atoi(col_string)) > 0) {
    - 		term_columns_at_startup = n_cols;
    -
      ## t/t3200-branch.sh ##
     @@ t/t3200-branch.sh: test_expect_success 'git branch --list -v with --abbrev' '
      '
      
      test_expect_success 'git branch --column' '
     -	COLUMNS=81 git branch --column=column >actual &&
    -+	GIT_TEST_COLUMNS= COLUMNS=81 git branch --column=column >actual &&
    ++	test_with_columns 81 git branch --column=column >actual &&
      	cat >expect <<\EOF &&
        a/b/c   bam     foo     l     * main    n       o/p     r
        abc     bar     j/k     m/m     mb      o/o     q       topic
    @@ t/t3200-branch.sh: test_expect_success 'git branch --column with an extremely lo
      	test_when_finished "git branch -d $long" &&
      	git branch $long &&
     -	COLUMNS=80 git branch --column=column >actual &&
    -+	GIT_TEST_COLUMNS= COLUMNS=80 git branch --column=column >actual &&
    ++	test_with_columns 80 git branch --column=column >actual &&
      	cat >expect <<EOF &&
        a/b/c
        abc
    @@ t/t3200-branch.sh: EOF
      	git config column.ui column &&
      	git config column.branch "dense" &&
     -	COLUMNS=80 git branch >actual &&
    -+	GIT_TEST_COLUMNS= COLUMNS=80 git branch >actual &&
    ++	test_with_columns 80 git branch >actual &&
      	git config --unset column.branch &&
      	git config --unset column.ui &&
      	cat >expect <<\EOF &&
    @@ t/t3200-branch.sh: test_expect_success 'git branch --column -v should fail' '
      test_expect_success 'git branch -v with column.ui ignored' '
      	git config column.ui column &&
     -	COLUMNS=80 git branch -v | cut -c -8 | sed "s/ *$//" >actual &&
    -+	GIT_TEST_COLUMNS= COLUMNS=80 git branch -v | cut -c -8 | sed "s/ *$//" >actual &&
    ++	test_with_columns 80 git branch -v | cut -c -8 | sed "s/ *$//" >actual &&
      	git config --unset column.ui &&
      	cat >expect <<\EOF &&
        a/b/c
    @@ t/t4052-stat-output.sh: cat >expect72 <<'EOF'
      EOF
      test_expect_success "format-patch --cover-letter ignores COLUMNS (big change)" '
     -	COLUMNS=200 git format-patch -1 --stdout --cover-letter >output &&
    -+	GIT_TEST_COLUMNS= COLUMNS=200 git format-patch -1 --stdout --cover-letter >output &&
    ++	test_with_columns 200 git format-patch -1 --stdout --cover-letter >output &&
      	grep " | " output >actual &&
      	test_cmp expect72 actual
      '
    @@ t/t4052-stat-output.sh: EOF
      do
      	test_expect_success "$cmd $verb COLUMNS (big change)" '
     -		COLUMNS=200 git $cmd $args >output &&
    -+		GIT_TEST_COLUMNS= COLUMNS=200 git $cmd $args >output &&
    ++		test_with_columns 200 git $cmd $args >output &&
      		grep " | " output >actual &&
      		test_cmp "$expect" actual
      	'
    @@ t/t4052-stat-output.sh: do
      
      	test_expect_success "$cmd --graph $verb COLUMNS (big change)" '
     -		COLUMNS=200 git $cmd $args --graph >output &&
    -+		GIT_TEST_COLUMNS= COLUMNS=200 git $cmd $args --graph >output &&
    ++		test_with_columns 200 git $cmd $args --graph >output &&
      		grep " | " output >actual &&
      		test_cmp "$expect-graph" actual
      	'
    @@ t/t4052-stat-output.sh: EOF
      do
      	test_expect_success "$cmd $verb not enough COLUMNS (big change)" '
     -		COLUMNS=40 git $cmd $args >output &&
    -+		GIT_TEST_COLUMNS= COLUMNS=40 git $cmd $args >output &&
    ++		test_with_columns 40 git $cmd $args >output &&
      		grep " | " output >actual &&
      		test_cmp "$expect" actual
      	'
    @@ t/t4052-stat-output.sh: do
      
      	test_expect_success "$cmd --graph $verb not enough COLUMNS (big change)" '
     -		COLUMNS=40 git $cmd $args --graph >output &&
    -+		GIT_TEST_COLUMNS= COLUMNS=40 git $cmd $args --graph >output &&
    ++		test_with_columns 40 git $cmd $args --graph >output &&
      		grep " | " output >actual &&
      		test_cmp "$expect-graph" actual
      	'
    @@ t/t4052-stat-output.sh: EOF
      do
      	test_expect_success "$cmd $verb COLUMNS (long filename)" '
     -		COLUMNS=200 git $cmd $args >output &&
    -+		GIT_TEST_COLUMNS= COLUMNS=200 git $cmd $args >output &&
    ++		test_with_columns 200 git $cmd $args >output &&
      		grep " | " output >actual &&
      		test_cmp "$expect" actual
      	'
    @@ t/t4052-stat-output.sh: do
      
      	test_expect_success "$cmd --graph $verb COLUMNS (long filename)" '
     -		COLUMNS=200 git $cmd $args --graph >output &&
    -+		GIT_TEST_COLUMNS= COLUMNS=200 git $cmd $args --graph >output &&
    ++		test_with_columns 200 git $cmd $args --graph >output &&
      		grep " | " output >actual &&
      		test_cmp "$expect-graph" actual
      	'
    @@ t/t4052-stat-output.sh: while read verb expect cmd args
      	test_expect_success COLUMNS_CAN_BE_1 \
      		"$cmd $verb prefix greater than COLUMNS (big change)" '
     -		COLUMNS=1 git $cmd $args >output &&
    -+		GIT_TEST_COLUMNS= COLUMNS=1 git $cmd $args >output &&
    ++		test_with_columns 1 git $cmd $args >output &&
      		grep " | " output >actual &&
      		test_cmp "$expect" actual
      	'
    @@ t/t4052-stat-output.sh: do
      	test_expect_success COLUMNS_CAN_BE_1 \
      		"$cmd --graph $verb prefix greater than COLUMNS (big change)" '
     -		COLUMNS=1 git $cmd $args --graph >output &&
    -+		GIT_TEST_COLUMNS= COLUMNS=1 git $cmd $args --graph >output &&
    ++		test_with_columns 1 git $cmd $args --graph >output &&
      		grep " | " output >actual &&
      		test_cmp "$expect-graph" actual
      	'
    @@ t/t4052-stat-output.sh: cat >expect <<'EOF'
      test_expect_success 'merge --stat respects COLUMNS (big change)' '
      	git checkout -b branch HEAD^^ &&
     -	COLUMNS=100 git merge --stat --no-ff main^ >output &&
    -+	GIT_TEST_COLUMNS= COLUMNS=100 git merge --stat --no-ff main^ >output &&
    ++	test_with_columns 100 git merge --stat --no-ff main^ >output &&
      	grep " | " output >actual &&
      	test_cmp expect actual
      '
    @@ t/t4052-stat-output.sh: cat >expect <<'EOF'
      EOF
      test_expect_success 'merge --stat respects COLUMNS (long filename)' '
     -	COLUMNS=100 git merge --stat --no-ff main >output &&
    -+	GIT_TEST_COLUMNS= COLUMNS=100 git merge --stat --no-ff main >output &&
    ++	test_with_columns 100 git merge --stat --no-ff main >output &&
      	grep " | " output >actual &&
      	test_cmp expect actual
      '
    @@ t/t4205-log-pretty-formats.sh: test_expect_success 'left alignment formatting at
      
      test_expect_success 'left alignment formatting at the nth column' '
     -	COLUMNS=50 git log --pretty="tformat:%h %<|(-10)%s" >actual &&
    -+	GIT_TEST_COLUMNS= COLUMNS=50 git log --pretty="tformat:%h %<|(-10)%s" >actual &&
    ++	test_with_columns 50 git log --pretty="tformat:%h %<|(-10)%s" >actual &&
      	qz_to_tab_space <<-EOF >expected &&
      	$head1 message two                    Z
      	$head2 message one                    Z
    @@ t/t4205-log-pretty-formats.sh: test_expect_success 'right alignment formatting a
      
      test_expect_success 'right alignment formatting at the nth column' '
     -	COLUMNS=50 git log --pretty="tformat:%h %>|(-10)%s" >actual &&
    -+	GIT_TEST_COLUMNS= COLUMNS=50 git log --pretty="tformat:%h %>|(-10)%s" >actual &&
    ++	test_with_columns 50 git log --pretty="tformat:%h %>|(-10)%s" >actual &&
      	qz_to_tab_space <<-EOF >expected &&
      	$head1                      message two
      	$head2                      message one
    @@ t/t4205-log-pretty-formats.sh: test_expect_success 'center alignment formatting
      
      test_expect_success 'center alignment formatting at the nth column' '
     -	COLUMNS=70 git log --pretty="tformat:%h %><|(-30)%s" >actual &&
    -+	GIT_TEST_COLUMNS= COLUMNS=70 git log --pretty="tformat:%h %><|(-30)%s" >actual &&
    ++	test_with_columns 70 git log --pretty="tformat:%h %><|(-30)%s" >actual &&
      	qz_to_tab_space <<-EOF >expected &&
      	$head1           message two          Z
      	$head2           message one          Z
    @@ t/t7004-tag.sh: test_expect_success 'tag -l <pattern> -l <pattern> works, as our
      
      test_expect_success 'listing tags in column' '
     -	COLUMNS=41 git tag -l --column=row >actual &&
    -+	GIT_TEST_COLUMNS= COLUMNS=41 git tag -l --column=row >actual &&
    ++	test_with_columns 41 git tag -l --column=row >actual &&
      	cat >expected <<\EOF &&
      a1      aa1     cba     t210    t211
      v0.2.1  v1.0    v1.0.1  v1.1.3
    @@ t/t7004-tag.sh: EOF
      	test_config column.tag row &&
      	test_config column.ui dense &&
     -	COLUMNS=40 git tag -l >actual &&
    -+	GIT_TEST_COLUMNS= COLUMNS=40 git tag -l >actual &&
    ++	test_with_columns 40 git tag -l >actual &&
      	cat >expected <<\EOF &&
      a1      aa1   cba     t210    t211
      v0.2.1  v1.0  v1.0.1  v1.1.3
    @@ t/t7004-tag.sh: test_expect_success 'listing tag with -n --column should fail' '
      test_expect_success 'listing tags -n in column with column.ui ignored' '
      	test_config column.ui "row dense" &&
     -	COLUMNS=40 git tag -l -n >actual &&
    -+	GIT_TEST_COLUMNS= COLUMNS=40 git tag -l -n >actual &&
    ++	test_with_columns 40 git tag -l -n >actual &&
      	cat >expected <<\EOF &&
      a1              Foo
      aa1             Foo
    @@ t/t7006-pager.sh: test_expect_success TTY 'git tag with auto-columns ' '
      	initial  one      two      three    four     five
      	EOF
     -	test_terminal env PAGER="cat >actual" COLUMNS=80 \
    -+	test_terminal env PAGER="cat >actual" GIT_TEST_COLUMNS= COLUMNS=80 \
    ++	test_with_columns 80 test_terminal env PAGER="cat >actual" \
      		git -c column.ui=auto tag --sort=authordate &&
      	test_cmp expect actual
      '
    @@ t/t7508-status.sh: test_expect_success 'status --column' '
      #
      EOF
     -	COLUMNS=50 git -c status.displayCommentPrefix=true status --column="column dense" >output &&
    -+	GIT_TEST_COLUMNS= COLUMNS=50 git -c status.displayCommentPrefix=true status --column="column dense" >output &&
    ++	test_with_columns 50 git -c status.displayCommentPrefix=true status --column="column dense" >output &&
      	test_cmp expect output
      '
      
      test_expect_success 'status --column status.displayCommentPrefix=false' '
      	strip_comments expect &&
     -	COLUMNS=49 git -c status.displayCommentPrefix=false status --column="column dense" >output &&
    -+	GIT_TEST_COLUMNS= COLUMNS=49 git -c status.displayCommentPrefix=false status --column="column dense" >output &&
    ++	test_with_columns 49 git -c status.displayCommentPrefix=false status --column="column dense" >output &&
      	test_cmp expect output
      '
      
    @@ t/t9002-column.sh: test_expect_success '80 columns' '
      one    two    three  four   five   six    seven  eight  nine   ten    eleven
      EOF
     -	COLUMNS=80 git column --mode=column <lista >actual &&
    -+	GIT_TEST_COLUMNS= COLUMNS=80 git column --mode=column <lista >actual &&
    ++	test_with_columns 80 git column --mode=column <lista >actual &&
      	test_cmp expected actual
      '
      
    @@ t/t9002-column.sh: eleven
      
      test_expect_success COLUMNS_CAN_BE_1 'COLUMNS = 1' '
     -	COLUMNS=1 git column --mode=column <lista >actual &&
    -+	GIT_TEST_COLUMNS= COLUMNS=1 git column --mode=column <lista >actual &&
    ++	test_with_columns 1 git column --mode=column <lista >actual &&
      	test_cmp expected actual
      '
      
    @@ t/t9002-column.sh: four   ten
      six
      EOF
     -	git column --mode=column <lista >actual &&
    -+	GIT_TEST_COLUMNS= COLUMNS=20 git column --mode=column <lista >actual &&
    ++	test_with_columns 20 git column --mode=column <lista >actual &&
      	test_cmp expected actual
      '
      
    @@ t/t9002-column.sh: four   ten
      six
      EOF
     -	git column --mode=column,nodense < lista > actual &&
    -+	GIT_TEST_COLUMNS= COLUMNS=20 git column --mode=column,nodense < lista > actual &&
    ++	test_with_columns 20 git column --mode=column,nodense < lista > actual &&
      	test_cmp expected actual
      '
      
    @@ t/t9002-column.sh: two   six   ten
      four  eight
      EOF
     -	git column --mode=column,dense < lista > actual &&
    -+	GIT_TEST_COLUMNS= COLUMNS=20 git column --mode=column,dense < lista > actual &&
    ++	test_with_columns 20 git column --mode=column,dense < lista > actual &&
      	test_cmp expected actual
      '
      
    @@ t/t9002-column.sh: four    ten
      six
      EOF
     -	git column --mode=column --padding 2 <lista >actual &&
    -+	GIT_TEST_COLUMNS= COLUMNS=20 git column --mode=column --padding 2 <lista >actual &&
    ++	test_with_columns 20 git column --mode=column --padding 2 <lista >actual &&
      	test_cmp expected actual
      '
      
    @@ t/t9002-column.sh: test_expect_success '20 columns, indented' '
        six
      EOF
     -	git column --mode=column --indent="  " <lista >actual &&
    -+	GIT_TEST_COLUMNS= COLUMNS=20 git column --mode=column --indent="  " <lista >actual &&
    ++	test_with_columns 20 git column --mode=column --indent="  " <lista >actual &&
      	test_cmp expected actual
      '
      
    @@ t/t9002-column.sh: seven  eight
      eleven
      EOF
     -	git column --mode=row <lista >actual &&
    -+	GIT_TEST_COLUMNS= COLUMNS=20 git column --mode=row <lista >actual &&
    ++	test_with_columns 20 git column --mode=row <lista >actual &&
      	test_cmp expected actual
      '
      
    @@ t/t9002-column.sh: seven  eight
      eleven
      EOF
     -	git column --mode=row,nodense <lista >actual &&
    -+	GIT_TEST_COLUMNS= COLUMNS=20 git column --mode=row,nodense <lista >actual &&
    ++	test_with_columns 20 git column --mode=row,nodense <lista >actual &&
      	test_cmp expected actual
      '
      
    @@ t/t9002-column.sh: four  five   six
      ten   eleven
      EOF
     -	git column --mode=row,dense <lista >actual &&
    -+	GIT_TEST_COLUMNS= COLUMNS=20 git column --mode=row,dense <lista >actual &&
    ++	test_with_columns 20 git column --mode=row,dense <lista >actual &&
      	test_cmp expected actual
      '
      
     
    - ## t/test-lib.sh ##
    -@@ t/test-lib.sh: LANG=C
    - LC_ALL=C
    - PAGER=cat
    - TZ=UTC
    --COLUMNS=80
    --export LANG LC_ALL PAGER TZ COLUMNS
    -+export LANG LC_ALL PAGER TZ
    - EDITOR=:
    - 
    -+# For repeatability we need to set term_columns()'s idea of
    -+# columns. We do this via GIT_TEST_COLUMNS and not COLUMNS because
    -+# e.g. versions of bash >= 5.0 have "shopt -s checkwinsize" on by
    -+# default. We could do "shopt -u checkwinsize >/dev/null 2>&1" here to
    -+# fix that particular issue, but this is not shell specific, and
    -+# future-proof the tests.
    -+GIT_TEST_COLUMNS=80
    -+COLUMNS=10
    -+export GIT_TEST_COLUMNS COLUMNS
    + ## t/test-lib-functions.sh ##
    +@@ t/test-lib-functions.sh: test_region () {
    + test_readlink () {
    + 	perl -le 'print readlink($_) for @ARGV' "$@"
    + }
    ++
    ++# Test a with a given number of COLUMNS in the environment.
    ++test_with_columns () {
    ++	local columns=$1
    ++	shift
     +
    - # A call to "unset" with no arguments causes at least Solaris 10
    - # /usr/xpg4/bin/sh and /bin/ksh to bail out.  So keep the unsets
    - # deriving from the command substitution clustered with the other
    ++	COLUMNS=$columns "$@"
    ++}
-:  ----------- > 3:  6cbbb955e9a test-lib.sh: use GIT_TEST_COLUMNS over COLUMNS
-- 
2.32.0.1070.gec115ccd780
Previous: Junio C HamanoNext: Ævar Arnfjörð Bjarmason
Message 17 of 26 in “progress test failure on fedora34”
  1. Fabian StelzerJul 14, 2021
  2. Ævar Arnfjörð BjarmasonJul 14, 2021
  3. Alex HenrieJul 14, 2021
  4. Ævar Arnfjörð BjarmasonJul 18, 2021
  5. Jeff KingJul 19, 2021
  6. Alex HenrieJul 19, 2021
  7. Alex HenrieJul 19, 2021
  8. Felipe ContrerasJul 19, 2021
  9. Felipe ContrerasJul 19, 2021
  10. Alex HenrieJul 19, 2021
  11. Felipe ContrerasJul 20, 2021
  12. ZheNing HuJul 21, 2021
  13. Felipe ContrerasJul 21, 2021
  14. test-lib.sh: use GIT_TEST_COLUMNS over COLUMNSÆvar Arnfjörð Bjarmason, Jul 26, 2021
  15. Jeff KingJul 27, 2021
  16. Junio C HamanoJul 28, 2021
  17. 0/3 test-lib.sh: use GIT_TEST_COLUMNS over COLUMNSÆvar Arnfjörð Bjarmason, Aug 2, 2021
  18. 1/3 test-lib-functions.sh: rename test_must_fail_acceptable()Ævar Arnfjörð Bjarmason, Aug 2, 2021
  19. 3/3 test-lib.sh: use GIT_TEST_COLUMNS over COLUMNSÆvar Arnfjörð Bjarmason, Aug 2, 2021
  20. 2/3 test-lib-functions.sh: add a test_with_columns functionÆvar Arnfjörð Bjarmason, Aug 2, 2021
  21. SZEDER GáborAug 2, 2021
  22. Eric SunshineAug 2, 2021
  23. 0/3 test-lib.sh: use GIT_TEST_COLUMNS over COLUMNSÆvar Arnfjörð Bjarmason, Aug 4, 2021
  24. 1/3 test-lib-functions.sh: rename test_must_fail_acceptable()Ævar Arnfjörð Bjarmason, Aug 4, 2021
  25. 3/3 test-lib.sh: use GIT_TEST_COLUMNS over COLUMNSÆvar Arnfjörð Bjarmason, Aug 4, 2021
  26. 2/3 test-lib-functions.sh: add a test_with_columns functionÆvar Arnfjörð Bjarmason, Aug 4, 2021

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.