วิธีที่จะทำให้แพทช์ไม่สนใจ hunks ที่ใช้ไปแล้ว


14

ฉันมีไฟล์ตัวแก้ไขที่มีขนาดใหญ่มากซึ่งฉันพยายามจะนำไปใช้กับรหัสของฉัน ปัญหาคือการเปลี่ยนแปลงบางอย่างในโปรแกรมแก้ไขของฉันมีอยู่แล้วในรหัส มีวิธีในการทำให้โปรแกรมปะแก้ละเว้นการเปลี่ยนแปลงที่มีการใช้งานไปแล้วอย่างสง่างามหรือไม่?

-Nตัวเลือกที่ไม่ได้ทำสิ่งที่ฉันต้องการ หากพบก้อนใหญ่ที่ใช้ไปแล้วมันจะสร้างไฟล์ที่ปฏิเสธและจะไม่ใช้ hunks ใด ๆ เพิ่มเติมกับไฟล์นั้น ฉันต้องการที่จะไม่สนใจก้อนใหญ่นั้นและใช้ส่วนที่เหลือของแพทช์ต่อไป ครั้งเดียวที่ฉันต้องการให้มันสร้างไฟล์. rej คือถ้าไม่สามารถใช้ก้อนใหญ่และดูเหมือนจะไม่ได้ถูกนำไปใช้แล้ว

มีวิธีทำเช่นนี้หรือไม่?

คำตอบ:


7

คุณจะต้องติดตั้ง patchutils สำหรับสิ่งนี้

สคริปต์นี้จะแบ่งแพทช์ใหญ่ออกเป็นแพชแยกเล็กแต่ละอันประกอบด้วยหนึ่งก้อนใหญ่สำหรับหนึ่งไฟล์ patch --forwardจากนั้นคุณสามารถใช้แพทช์เหล่านี้ด้วย

#!/bin/sh -eu

PATCH=$1
OUTDIR=$2

test -f "$PATCH" && test -d "$OUTDIR"

TDIR=$(mktemp -d)
trap 'rm -rf $TDIR' 0

INDEX=0
TEMPHUNK=$TDIR/current_hunk

lsdiff $1 | while read FNAME
do
    HUNK=1
    while :
    do
        filterdiff --annotate --hunks=$HUNK -i "$FNAME" "$PATCH" > "$TEMPHUNK"
        HUNK=$((HUNK+1))
        test -s "$TEMPHUNK" && \
            {
                mv "$TEMPHUNK" "$OUTDIR/$INDEX.diff"
                INDEX=$((INDEX+1))
            } || break
    done
done

แก้ไข : บันทึกสคริปต์ไปยังhunks.shและเรียกมันว่า:

./hunks.sh path/to/big.diff path/to/output/directory

2

ในที่สุดฉันก็แก้ปัญหานี้โดยใช้วิธีการคล้ายกับอาร์ตี้

ขั้นตอนที่ 1:ระเบิดแพตช์เป็นแพทช์แยกจำนวนมากหนึ่งสำหรับแต่ละก้อน

ฉันใช้สคริปต์นี้เพื่อทำสิ่งนี้:

#!/usr/bin/python2

import sys

header = []
writing_header = False
patchnum = 0

patch = open(sys.argv[1], "r")
out = open("/dev/null", "w")

for line in patch.readlines():
    if line.startswith("diff"):
        header = []
        writing_header = True
    if line.startswith("@@"):
        out.close()
        out = open(str(patchnum) + ".diff", "w")
        patchnum += 1
        writing_header = False
        out.writelines(header)
    if writing_header:
        header.append(line)
    else:
        out.write(line)

out.close()

ตัวอย่างการใช้งาน:

$ cd directory_containing_patch
$ mkdir foo
$ cd foo
$ explode.py ../huge_patch.diff

นี้จะเติมไดเรกทอรีปัจจุบันด้วยไฟล์ที่เรียกว่า 0.diff 1.diff และ cetera

ขั้นตอนที่ 2:ใช้แต่ละโปรแกรมแก้ไขโดยยกเลิกโปรแกรมปรับปรุงที่นำไปใช้แล้ว

ฉันใช้สคริปต์นี้เพื่อทำสิ่งนี้:

#!/bin/bash

if [[ $# -ne 1 || ! -d "${1}/" ]]; then
    echo "Usage: $0 dirname"
    exit 1
fi

find "$1" -name \*.diff | while read f; do
    OUTPUT=$(patch -s -p1 -r- -i"$f")
    if [ $? -eq 0 ]; then
        rm "$f"
    else
        if echo "$OUTPUT" | grep -q "Reversed (or previously applied) patch detected!"; then
            rm "$f"
        fi
    fi
done

ตัวอย่างการใช้งาน:

$ cd directory_containing_code
$ apply_patches.bash directory_containing_patch/foo

การดำเนินการนี้จะลบแพทช์ใด ๆ ที่สร้างขึ้นก่อนหน้านี้ซึ่งใช้อย่างหมดจดหรือถูกใช้ไปแล้ว แพทช์ใด ๆ ที่เหลืออยู่fooจะถูกปฏิเสธที่จะต้องทำการตรวจสอบและผสานด้วยตนเอง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.