git diff hunk 标头中的摘录来自哪里?

2023-12-08

当我使用git diff在 C# 文件中,我看到类似这样的内容:

diff --git a/foo.cs b/foo.cs
index ff61664..dd8a3e3 100644
--- a/foo.cs
+++ b/foo.cs
@@ -15,6 +15,7 @@ static void Main(string[] args)
                    string name = Console.ReadLine();
             }
             Console.WriteLine("Hello {0}!", name);
+            Console.WriteLine("Goodbye");
         }
     }
 }

hunk 标题行包含当前方法的第一行(static void Main(string[] args)),这太棒了。然而它似乎不是很可靠......我看到很多情况下它不起作用。

所以我想知道,这段摘录是从哪里来的?做git diff以某种方式识别语言语法?有办法定制吗?


有办法定制吗?

配置定义在.gitattributes,“定义自定义块头”部分:

首先,在.gitattributes,您将分配diff路径的属性。

*.tex diff=tex

然后,您将定义一个“diff.tex.xfuncname“配置指定与您希望显示为块标头的行相匹配的正则表达式”TEXT“。将一个部分添加到您的$GIT_DIR/config文件(或$HOME/.gitconfig文件)像这样:

[diff "tex"]
   xfuncname = "^(\\\\(sub)*section\\{.*)$"

笔记。单级反斜杠会被配置文件解析器吃掉,因此您需要将反斜杠加倍;上面的模式选择以反斜杠开头的行,以及零次或多次出现的 sub,后跟节,后跟左大括号,直到行尾。

有一些内置模式可以使这变得更容易,并且tex是其中之一,因此您不必在配置文件中编写上述内容(您仍然需要使用属性机制来启用它,通过.gitattributes).

('csharp' 是当前内置模式的一部分)




这段摘录来自哪里?
Does git diff以某种方式识别语言语法?

最初,该算法对于函数名称检测来说相当粗糙:
See 提交 acb7257(Git 1.3.0,2006 年 4 月,作者:Mark Wooding)

xdiff:在块头中显示函数名称。

内置 diff 生成器的速度很好;但函数名称 显示者diff -p are really好的。我讨厌必须做出选择。
所以,我们破解xdiff查找函数名称并打印它们。

函数名称是由一个特别愚蠢的算法解析的 时刻:它只是尝试在“旧”文件中查找之前的行 猛男的开始,他的第一个角色看起来很合理。尽管如此,它还是 绝对是一个开始。


它被精炼为获取函数线(),本身来自提交 f258475(Git 1.5.3,2007 年 9 月,作者:Junio C Hamano(gitster))

你可以在提交测试中看到t/t4018-diff-funcname.sh,测试自定义 diff 函数名称模式。

基于每路径属性的块标头选择。

这使得 ”diff -p“可通过以下方式自定义大块标题gitattributes机制。
它基于 Johannes 的早期补丁,允许定义单个 正则表达式可用于一切。

到达用于定义 hunk header 的正则表达式的机制 与其他用途相同gitattributes.
您分配一个属性,funcname(因为 ”diff -p“通常使用补丁所涉及的函数名称作为块头),一个简单的字符串值。
这可以是内置模式的名称之一(目前,java" 已定义)或自定义模式名称,可从配置文件中查找。

 (in .gitattributes)
 *.java   funcname=java
 *.perl   funcname=perl

 (in .git/config)
 [funcname]
   java = ... # ugly and complicated regexp to override the built-in one.
   perl = ... # another ugly and complicated regexp to define a new one.

目前的xfuncname语法被引入提交 45d9414,Git 1.6.0.3,2008 年 10 月,作者:Brandon Casey

diff.*.xfuncname它使用“扩展”正则表达式来选择大块标头

目前,由 ' 生成的大块标头diff -p' 可通过以下方式定制 设置diff.*.funcname配置文件中的选项。这 'funcname' 选项采用基本正则表达式。此功能是使用 GNU 正则表达式库设计的,默认情况下,即使在基本正则表达式模式下,该库也允许使用某些扩展正则表达式运算符的反斜杠版本。例如,以下字符,当使用反斜杠时,将根据扩展正则表达式规则进行解释:?, +, and |.
因此,内置funcname模式是使用一些扩展创建的 正则表达式运算符。

其他更严格遵守 POSIX 规范的平台则不这样做 解释基本正则表达式中的反斜杠扩展 RE 运算符 模式。这会导致内置 funcname 模式的模式匹配 在这些平台上失败。

引入一个新选项'xfuncname' 使用扩展正则表达式,并对其进行广告instead of funcname.
由于大多数用户都在 GNU 平台上,因此大多数funcname模式是在那里创建和测试的。
仅做广告xfuncname应该有助于避免创建适用于 GNU 正则表达式但不适用于其他地方的不可移植模式。

此外,扩展的正则表达式可能不那么难看,并且 与基本 RE 相比,它很复杂,因为许多常见的特殊运算符不需要反斜杠。

例如,GNU Basic RE:

^[    ]*\\(\\(public\\|static\\).*\\)$

变为以下扩展 RE:

^[    ]*((public|static).*)$

最后,它被扩展为提交 14937c2,适用于 git 1.7.8(2011 年 12 月),作者为 René Scharfe。

diff:添加选项以将整个函数显示为上下文

添加选项-W/--function-context to git diff.
它类似于相同的选项git grep并扩展了变化块的上下文,以便显示整个周围的功能。
这种“自然”的背景可以让人们更好地理解变化。


它仍在 Git 2.15(2017 年第 4 季度)中进行调整

用于检测 HTML 的“函数标头”的内置模式确实如此 不匹配<H1>..<H6>没有任何属性的元素,其中有 已修复。

2.15之前,匹配失败<h1>...</h1>, while <h1 class="smth">...</h1>火柴。

See commit 9c03cac (23 Sep 2017) by Ilya Kantor (iliakan).
(Merged by Junio C Hamano -- gitster -- in commit 376a1da, 28 Sep 2017)


检测函数边界的模式称为xfuncref.

See commit a807200 (08 Nov 2019) by Łukasz Niemier (hauleth).
(Merged by Junio C Hamano -- gitster -- in commit 376e730, 01 Dec 2019), for Git 2.25 (Q1 2020)

userdiff: 将 Elixir 添加到支持的 userdiff 语言

Signed-off-by: Łukasz Niemier
Acked-by: Johannes Sixt

添加了对以下内容的支持xfuncref in Elixir语言是一种类似 Ruby 的语言,运行在Erlang虚拟机 (BEAM)。

And:

See commit d1b1384 (13 Dec 2019) by Ed Maste (emaste).
(Merged by Junio C Hamano -- gitster -- in commit ba6b662, 25 Dec 2019)

userdiff:从中删除空子表达式elixir regex

Signed-off-by: Ed Maste
Reviewed-by: Jeff King
Helped-by: Johannes Sixt

正则表达式无法在 FreeBSD 上编译。

还添加/* -- */标记以分隔给定的两个正则表达式条目PATTERNS()宏,使其与其他内容类型的模式一致。


Git 2.27(2020 年第 2 季度)添加了 Markdown 文档的 userdiff 模式。

See commit 09dad92 (02 May 2020) by Ash Holland (sersorrel).
(Merged by Junio C Hamano -- gitster -- in commit dc4c393, 08 May 2020)

userdiff:支持Markdown

Signed-off-by: Ash Holland
Acked-by: Johannes Sixt

通常在源代码旁边查找 Markdown 文档,并且为文档更改提供更好的上下文非常有用;也可以看看提交 69f9c87d4 ("userdiff: 添加对 Fountain 文档的支持", 2015-07-21, Git v2.6.0-rc0 --merge列于batch #1).

该模式基于CommonMark 规范 0.29,第 4.2 节 https://spec.commonmark.org/但不匹配空标题,因为在大标题中看到它们不太可能有用。

仅支持 ATX 标题,因为检测 setext 标题需要在模式匹配或匹配多行模式之前打印行。 word-diff 模式与 HTML 的模式相同,因为许多 Markdown 解析器接受内联 HTML。


在 Git 2.30(2021 年第一季度)中,userdiff 模式学会了识别 POSIX shell 中的函数定义和bash.

See commit 2ff6c34 (22 Oct 2020) by Victor Engmark (l0b0).
(Merged by Junio C Hamano -- gitster -- in commit 292e53f, 02 Nov 2020)

userdiff:支持重击

Signed-off-by: Victor Engmark
Acked-by: Johannes Sixt

支持 POSIX、bashism 和混合函数声明、所有四种复合命令类型、尾随注释和混合空格。

尽管 Bash 允许函数名称中与区域设置相关的字符,仅检测包含以下允许的字符的函数名称POSIX.1-2017为了简单起见。
这应该涵盖绝大多数用例,并产生与系统无关的结果。

由于必须指定单词模式,但没有简单的方法来知道默认的单词模式,因此使用默认的单词模式IFS初学者的角色。稍后的补丁可以改善这一点。

gitattributes现在包含在其man page:

  • bash适用于 Bourne-Again SHell 语言的源代码。
    涵盖 POSIX shell 函数定义的超集。

在 Git 2.32(2021 年第 2 季度)中,用户差异模式为“Scheme”已添加。

See commit a437390 (08 Apr 2021) by Atharva Raykar (tfidfwastaken).
(Merged by Junio C Hamano -- gitster -- in commit 6d7a62d, 20 Apr 2021)

userdiff:添加对Scheme的支持

Signed-off-by: Atharva Raykar

为类计划语言添加不同的驱动程序,以识别顶级和本地define形式,无论是函数定义、绑定、语法定义还是用户定义define-xyzzy form.

还支持R6RSlibrary forms, module形式以及 Racket 中使用的类和结构声明(PLT 方案)。

还支持替代的“def”语法,例如 Gerbil Scheme 中的语法,例如 defstruct、defsyntax 等。

挑选的理由definehunk headers 的形式是因为它通常是定义程序结​​构的唯一重要形式,并且它是策划者使用本地函数定义来隐藏其可见性的常见模式,因此它不仅是顶层define是您感兴趣的。
策划者还使用宏扩展语言以提供他们自己的定义形式(例如,类似define-test-suite)这也被捕获在 hunk header 中。

由于使用类似形式的变体扩展语法是常见的做法module+, class*等等,这些也得到了支持。

正则表达式这个词是尽最大努力去符合R7RS(第 2.1 节)有效的标识符、符号和数字。

gitattributes现在包含在其man page:

  • scheme适合Scheme语言的源代码。

在 Git 2.33(2021 年第 3 季度)中,C# 的 userdiff 模式学习了令牌“record".

See commit c4e3178 (02 Mar 2021) by Julian Verdurmen (304NotModified).
(Merged by Junio C Hamano -- gitster -- in commit f741069, 08 Jul 2021)

userdiff: 添加对 C# 记录类型的支持

Signed-off-by: Julian Verdurmen
Reviewed-by: Johannes Schindelin

C# 9 中添加记录

代码示例:

public record Person(string FirstName, string LastName);

有关更多信息,请参阅https://learn.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-9


在 Git 2.34(2021 年第 4 季度)中,“java”语言的 userdiff 模式已更新。

See commit a8cbc89 (11 Aug 2021) by Tassilo Horn (tsdh).
(Merged by Junio C Hamano -- gitster -- in commit a896086, 30 Aug 2021)

userdiff: 改进 java hunk header 正则表达式

Signed-off-by: Tassilo Horn

Currently, the git diff(man) hunk headers show the wrong method signature if the method has a qualified return type, an array return type, or a generic return type because the regex doesn't allow dots (.), [], or < and > in the return type.
Also, type parameter declarations couldn't be matched.

添加几个 t4018 测试,断言不同情况下的正确块标头:

  • 枚举不断变化
  • 具有有界类型参数的泛型方法的更改
  • 使用通配符更改通用方法
  • 嵌套类中的字段更改

而且,在 Git 2.34(2021 年第 4 季度)中,C++ 语言的 userdiff 模式已更新。

See commit 386076e (24 Oct 2021), commit c4fdba3, commit 637b80c, commit bfaaf19 (10 Oct 2021), and commit 350b87c, commit 3e063de, commit 1cf9384 (08 Oct 2021) by Johannes Sixt (j6t).
(Merged by Junio C Hamano -- gitster -- in commit f3f157f, 25 Oct 2021)

例如:

userdiff-cpp:允许在数字中使用数字分隔单引号

Signed-off-by: Johannes Sixt

从 C++17 开始,单引号可以用作数字分隔符:

3.141'592'654
1'000'000
0xdead'beaf

使其为 cpp 驱动程序的单词正则表达式所知,以便数字不会在单引号处拆分为单独的标记。


使用 Git 2.40(2023 年第一季度),userdiff包括 Java 语言的正则表达式更新。

See commit 93d52ed, commit 575e6fc, commit 39226a8 (08 Feb 2023) by Andrei Rybak (rybak).
(Merged by Junio C Hamano -- gitster -- in commit 4a6e6b0, 15 Feb 2023)

userdiff:支持Java密封类

Signed-off-by: Andrei Rybak
Reviewed-by: Johannes Sixt

Java 17 中添加了一种新的类——密封类(请参阅"JEP 409:密封课程"").1
此功能包括几个可能出现在类声明中的新关键字。
类名之前的新修饰符:“sealed”和“non-sealed”,以及类名后面由关键字“permits”标记的子句。

当前的正则表达式集userdiff.c已经允许修饰符“sealed”和“permits”子句,但不是修饰符“non-sealed”,这是Java中第一个连字符的关键字(参见“JEP 草案:Java 语言的关键字管理").
允许类型名称前面的单词中的连字符与“匹配”non-sealed” 修饰符。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

git diff hunk 标头中的摘录来自哪里? 的相关文章

  • 竹子 - 构建我的拉取请求

    当拉取请求进入 git 时 我试图触发竹子中的构建 我可以将 webhook 信息发送到竹子 但它不是构建适当的 sha 标记的签入 而是构建 主 分支 这是否需要对竹子进行一些自定义 git 设置 到目前为止我还没有看到任何简单的事情 在
  • 如何在“git-pull”自动合并后更改提交消息?

    有时 当结果生成自动合并时 我的协作者会 惊慌 git pull 然后接受默认的提交消息 在推送此提交之前 我想确保该消息得到修复 但是 amend似乎不起作用 修复这种情况下生成的消息的最佳方法是什么 我能为他们提供的最佳指示是 git
  • git 如何在不同分支中保持不同的配置文件?

    请允许我先表达一下我的尝试 假设我有两个分支 Alice1 和 Alice2 Alice1 有自己的服务器 Alice2 也有自己的服务器 我希望能够签出 Alice1 编写我的代码 然后通过使用保存在 URL 配置文件中的 URL 直接推
  • 如何使用最近的标签来装饰 git 日志?

    git log decorate将相关引用的信息添加到日志输出中 commit 9e895ace5d82df8929b16f58e9f515f6d54ab82d tag v3 10 rc7 Author Linus Torvalds lt
  • Some() 在变量赋值的左侧做什么?

    我正在阅读一些 Rust 代码 并且遇到了这一行 if let Some path env args nth 1 这个函数内部 fn main if let Some path env args nth 1 Try reading the
  • 如何对私有 jelastic 环境进行版本控制

    为了跟踪 Jelastic 托管环境的配置 我想在 git 存储库中对其进行版本控制 该存储库应该是私有的 并包含多个具有不同版本的不同分支 例如master abc123 v1 1 我的第一次尝试是创建一个私有 github 存储库 其中
  • 删除 git Branch -a 列出的分支

    命令git branch a列出了一堆不在存储库上且不在本地分支上的分支 这些怎样才能删除呢 develop master remotes origin cloner 例如 remotes origin cloner曾经存在于存储库中 但它
  • 读取 git 的最后一次提交和提交号

    在使用Git源代码的maven项目中 每当我使用maven编译构建时 是否可以读取git的最后一次提交和提交号 我想使用该提交编号来找到最后一次提交 这是假设您想要读取该信息 然后将其存储在属性文件中 基于https github com
  • “无法同时更新路径和切换到分支”

    我有时会使用checkout b创建新分支的选项 同时将其签出并在一个命令中设置跟踪 在新环境中 我收到此错误 git checkout b test track origin master fatal Cannot update path
  • GIT LFS 跟踪旧数据

    我对 GIT LFS 有一个问题 我的项目达到了我正在跟踪 1 5GB 的 LFS 数据的程度 这比我拥有的数据要多得多 没有 LFS 的所有跟踪内容将为 108MB 我开始调查这个问题 看起来自从我开始重构并移动我的文件以来 git lf
  • 是否有任何 git merge-strategies 可以忽略提交上的子模块更新或分支合并到目标分支?

    我的用例是 我有一个包含子模块的存储库的两个分支 我想设置这两个分支的自动集成 但是 只要两个分支上都有子模块更新 我的自动集成脚本就会因子模块冲突而失败 有没有办法让 git 在合并过程中忽略子模块指针的变化 或者提供类似的东西merge
  • 是否有一个 Git 命令可以在推送到 master 之前添加通知/警告

    我有一个用例 其他人依赖我在从 master 下拉时没有启用标志 但我需要在本地处理存储库时启用它 我希望 希望 Git 有一种方法可以添加通知或警告 当请求推送到 master 时会触发 作为某种 提醒 所以也许我的工作流程可能是这样的
  • 压缩 git log --graph 输出?

    有没有办法压缩输出git log graph那么它会在视觉上压缩遵循线性历史的提交吗 基本上 我只想查看图中某些分支分歧 合并的点 以获得我的分支结构的顶层 概述 举个例子 如果我有这个 A Z H B G C F D E 我希望它显示类似
  • 编辑 git patch 给出“您编辑的块不适用”

    我正在交互地添加一个文件 git add template panels panel reports php p diff git a template panels panel reports php b template panels
  • Google App Engine 和 Git 最佳实践

    我正在 Google App Engine 上开发一个小型宠物项目 我想使用以下命令将源代码置于源代码控制之下github http www github com 这将允许我的朋友检查和修改源代码 我只有一个PetProject包含所有源的
  • 从 git 中提取特定的提交/文件

    我在 git 存储库中进行了两次提交 并将它们推送到我的 git 服务器 两个提交是 在第一次提交中文件 A 被提交 在第二次提交中 文件 B 被提交 现在在另一台开发服务器上 我只想从 git 服务器中提取第一个提交或文件 A 这个怎么做
  • 为什么我必须使用“git commit -a”而不仅仅是“git commit”?

    我正在尝试了解 Git 的复杂性 我使用 git clone url here 从 GitHub 上下载了一个存储库 我做了一些更改 尝试使用 git commit 来提交它们 这似乎没有将更改推送到我的本地存储库 在本地目录 git 中
  • 如何在 Mac OS X 10.9 上安装和使用最新的 Git?

    我从 sourceforge 下载了 Git 2 4 3http git scm com download mac http git scm com download mac对于我的 Macbook Pro OS X 10 9 5 然后安装
  • 将远程存储库导入为具有完整历史记录的子目录

    我想将远程存储库作为具有完整历史记录的子目录进行合并和解耦 有多种方法和问题可以实现这一点 我的第一次尝试是使用subtree但它似乎没有重写文件的历史记录 所以我无法查看合并存储库的历史记录 接下来的尝试是手动合并它 就像 Seth Ro
  • 是什么让 DVCS 中的合并变得如此简单?

    我读于乔尔谈软件 http www joelonsoftware com items 2010 03 17 html 通过分布式版本控制 分布式部分实际上不是 最有趣的部分 有趣的是 这些 系统根据变化来思考 而不是 就版本而言 and a

随机推荐

  • 如何链接多个 Promise?

    我不太确定 也许我错过了一些明显的东西 但我不知道如何链接两个承诺 我的基于回调的代码看起来像这样 async series function cb Create the directory if the nodir switch isn
  • 为什么 Erlang 中阶乘不会溢出堆栈?

    module demo export factorial 1 factorial 0 gt 1 factorial N gt N factorial N 1 阶乘不是尾递归 但为什么它不会溢出堆栈 我能够在没有堆栈溢出的情况下获得 100
  • 将未定义的类设为友元,然后再定义它

    交一个不认识的朋友 template
  • 一次性更改多个文件的 EOL

    Notepad 或者甚至使用其他工具 有什么方法可以自动更改行结尾一次性处理多个文件 即转换 Windows EOL 的混合 CRLF 和 UNIX EOL LF 文件全部为 Windows EOL CRLF The Replace对话框可
  • 将 printf 重定向到两个流

    我正在扩展一个现有的 C 项目 将所有信息打印到stdout with printf 我希望将此信息打印到标准输出和日志文件 如果我是原始项目的贡献者 我会替换所有printf使用我的自定义日志函数进行调用 唉 我不是 所以这是我的问题 是
  • SQL 包含问题

    谁可以给我解释一下这个 我有两个查询及其结果如下 query select from tbl where contains name he AND ca 结果集 赫兹租车 海明威的小酒馆 query select from tbl wher
  • Unity 3D/球体中的翻转法线

    我已经为我的游戏编写了这段代码 我想要的是统一翻转纹理上的法线 我有一个模型和一个纹理 希望纹理位于球体模型内部而不是外部 我想通过在翻转纹理顶部的球体内部的图像周围移动相机来创建 360 度全景效果 现在 当我第一次按下播放按钮时 它运行
  • PHP domDocument 删除子节点的子节点

    如何删除子节点的父节点 但保留所有子节点 XML 文件是这样的
  • 插入一行并避免竞争条件 (PHP/MySQL)

    我正在开发一款多人游戏 该游戏有一个类似大厅的区域 玩家可以选择要进入的 区域 大厅网关由 PHP 提供支持 而实际的游戏玩法则由一台或多台 Java 服务器处理 数据存储是MySQL 幸福之路 玩家选择一个区域并告诉大厅他想进入 大厅检查
  • 如何使用 PowerShell 导出特定的 Excel 列?

    我有一个包含多列的 Excel 我想将一些特定列导出到 xlsx文件 但它导出 Excel 的前 3 列 而不是具有特定标题的列 Host CPU usage Memory usage SourceFileDirectory C TEMP
  • 使用方法为案例类生成伴随对象(字段 = 方法)

    使用 scala macros 为案例类生成伴随对象 我尝试过的一些代码示例 它有效 我可以获取元组列表 名称 gt 类型 但如何在同一范围内生成对象 import c universe val tpe weakTypeOf T val f
  • 从 R 中的函数写入全局环境

    我是 R 新手 在理解如何处理本地和全局环境方面遇到一些困难 我检查了Post关于局部和全局变量 但无法弄清楚 例如 如果我想使用一个函数绘制几张图并像这样保存它们 PlottingFunction lt function type typ
  • 嵌套 CSS 网格布局在 Chrome 和 Firefox 中的不同行为

    我正在尝试使用 CSS 网格布局来模拟一些响应行为 特别是 grid template columns repeat auto fill minmax 250px 1fr 我的例子https codepen io elgs pen goNx
  • 删除评论标签但不满足于 BeautifulSoup

    我正在使用 BeautifulSoup 练习一些网页抓取 特别是我正在查看 NFL 比赛数据 更具体地说是本页上的 球队统计 表 https www pro football reference com boxscores 20180906
  • 如何将 IceFaces 组件映射到 java.util.Calendar 字段?

    有谁知道如何组件
  • HttpURLConnection c = URL.openConnection(); c.setRequestProperty() 不起作用

    这里的代码是一个普通的Java应用程序 而不是Android应用程序 它旨在将C2DM消息发送到具有YOUR REGISTRATION STRING的设备 作为具有auth key的开发人员 问题如下所述 import java io Bu
  • 为什么 mov 不能设置代码段寄存器 CS,尽管它可以设置其他寄存器?

    我需要知道使用 mov 指令直接加载代码段寄存器是否有任何限制 在从实模式切换到保护模式时 这一点让我印象深刻 我发现为了将正确的值放入代码段中 使用 跳转 指令来设置正确的段 那么跳转指令的这种使用是否是由于任何这样的限制 为什么我们不能
  • (无法修复)程序集存在于 SQL Server 2014 上,但它声称没有它

    Update 这个问题无法修复 https connect microsoft com SQLServer Feedback Details 809697 我正在尝试使用 net 4 5 创建 SQL CLR 程序集 但它告诉我它丢失了sy
  • 从日历周获取月份 (SQL Server)

    我有以下问题 在 Microsoft 的 SQL Server 中 我有一个表 其中存储了一年和日历周 从星期一开始 现在 我想编写一个函数 返回该日历周开始的月份 即 如果星期一是 7 月 31 日 它应该返回 7 我还没有找到一个内置函
  • git diff hunk 标头中的摘录来自哪里?

    当我使用git diff在 C 文件中 我看到类似这样的内容 diff git a foo cs b foo cs index ff61664 dd8a3e3 100644 a foo cs b foo cs 15 6 15 7 stati