Для кода 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;
}
Я попробовал поискать, есть ли какой-нибудь встроенный инструмент для этого. К сожалению, не смог найти ни одного.
Может кто-нибудь, пожалуйста, помогите. ТИА
Возможно, вы могли бы использовать и исправить препроцессор GPP в соответствии со своими потребностями.
sed или gawk не режет сыр. Для этого необходимо проглотить git diff выходные данные, затем извлечь исходный файл и разумно трансмогрифицировать его. Это выходит за рамки возможностей sed и gawk, но это должно быть выполнимо на языке сценариев более высокого порядка, который имеет хорошие функции обработки текста, в частности perl. python тоже должен справиться с этим, но в конечном итоге сценарий окажется в три-четыре раза длиннее, чем сопоставимый perl сценарий (типичный). В той степени, в которой просят подсказки или рекомендации по программному обеспечению: это, конечно, не по теме.
Кстати, создайте свой инструмент для генерации этого на лету из коммита и его первого родителя, не проверяя результаты.





Это встроено в 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 и изменить смысл - и +.
Похоже, это работа для
sedилиawk.