Автоматически добавлять макросы для C в git patch

Для кода c/cpp я хочу добавить все недавно добавленные изменения внутри макроса и удалить изменения в остальной части.

например для патча ниже

diff --git a/test.c b/test.c
index a35d23a..5ee498a 100644
--- a/test.c
+++ b/test.c
@@ -1,6 +1,6 @@
 #include <stdio.h>

 int main() {
-    printf("Old line");
+    printf("New line");
     return 0;
 }

изменено на

diff --git a/test.c b/test.c
index a35d23a..668d2e0 100644
--- a/test.c
+++ b/test.c
@@ -1,6 +1,10 @@
 #include <stdio.h>

 int main() {
+#ifdef MODIFIED
+    printf("New line");
+#else
     printf("Old line");
+#endif
     return 0;
 }

Или

diff --git a/test.c b/test.c
index a35d23a..d05f7d1 100644
--- a/test.c
+++ b/test.c
@@ -1,6 +1,11 @@
 #include <stdio.h>

 int main() {
+#ifdef MODIFIED
+    printf("New line");
+#endif
+#ifndef MODIFIED
     printf("Old line");
+#endif
     return 0;
 }

Я попробовал поискать, есть ли какой-нибудь встроенный инструмент для этого. К сожалению, не смог найти ни одного.

Может кто-нибудь, пожалуйста, помогите. ТИА

Похоже, это работа для sed или awk.

Quimby 07.10.2023 16:52

Возможно, вы могли бы использовать и исправить препроцессор GPP в соответствии со своими потребностями.

Basile Starynkevitch 07.10.2023 16:53
sed или gawk не режет сыр. Для этого необходимо проглотить git diff выходные данные, затем извлечь исходный файл и разумно трансмогрифицировать его. Это выходит за рамки возможностей sed и gawk, но это должно быть выполнимо на языке сценариев более высокого порядка, который имеет хорошие функции обработки текста, в частности perl. python тоже должен справиться с этим, но в конечном итоге сценарий окажется в три-четыре раза длиннее, чем сопоставимый perl сценарий (типичный). В той степени, в которой просят подсказки или рекомендации по программному обеспечению: это, конечно, не по теме.
Sam Varshavchik 07.10.2023 17:00

Кстати, создайте свой инструмент для генерации этого на лету из коммита и его первого родителя, не проверяя результаты.

jthill 08.10.2023 02:02
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это встроено в diff, по крайней мере, в Linux и macOS (его нет в спецификации POSIX для diff). Из https://linux.die.net/man/1/diff:

-D NAME--ifdef=NAME

Выходной объединенный файл для отображения различий «#ifdef NAME».

Для POSIX diff без этой функции diff -U 99999999 FileAFileB создаст все содержимое разумных файлов, а затем простой сценарий может вставить #if defined !Name где - начинается в первый столбец, #else где - меняется на +, #if defined Name где + начинается без предшествующего - и #endif, где заканчивается + или -, а также удаляются заголовки и ведущий символ каждой строки (пробел для неизмененных строк). В результате группы строк перевернуты по сравнению с тем, что вы показываете, поэтому сначала появляются старые строки, а затем новые. Если это неприемлемо, вы можете поменять порядок файлов в командной строке diff и изменить смысл - и +.

Другие вопросы по теме