วิธีการละเว้นบรรทัดที่ถูกย้ายในส่วนต่าง


11

ฉันกำลังทำงานกับเครื่องมือการสร้างซอร์สโค้ด เพื่อให้แน่ใจว่าการเปลี่ยนแปลงของฉันจะไม่แนะนำข้อบกพร่องใหม่ ๆdiffผลลัพธ์ระหว่างโปรแกรมก่อนและหลังการเปลี่ยนแปลงของฉันในทางทฤษฎีจะเป็นเครื่องมือที่มีค่า

อย่างไรก็ตามสิ่งนี้กลับกลายเป็นว่าหนักกว่าที่คิดเพราะเครื่องมือเอาท์พุทบรรทัดที่คำสั่งนั้นไม่สำคัญ (เช่นimportคำสั่งการประกาศฟังก์ชัน ... ) ในวิธีการเรียงลำดับแบบกึ่งสุ่ม ด้วยเหตุนี้การส่งออกของdiffจะรกด้วยการเปลี่ยนแปลงหลายอย่างที่ในความเป็นจริงเพียงบรรทัดย้ายไปยังตำแหน่งอื่นในไฟล์เดียวกัน

มีวิธีทำให้ diff ไม่สนใจการเคลื่อนไหวเหล่านี้หรือไม่และส่งออกเฉพาะบรรทัดที่เพิ่มหรือลบออกจริง ๆ เท่านั้น


อาจเป็นการง่ายกว่าที่จะเปลี่ยนเครื่องมือของคุณเพื่อสร้างฟังก์ชั่นและการนำเข้าการประกาศตามลำดับที่เฉพาะเจาะจง (เช่นคำย่อหากเป็นไปได้ในภาษาของคุณ)?
Daniel Beck

@Daniel Beck: ดูความคิดเห็นของฉันต่อคำตอบของ Gilles ด้านล่าง
dnadlinger

เรื่องเก่า แต่จะสรุปความเห็นด้านล่างว่าวิธีนี้จะdiffเป็นเครื่องมือที่จะสามารถที่จะแยกการเคลื่อนไหวที่ถูกต้องจากคนที่ไม่ถูกต้องเป็นคำสั่งของคำแนะนำในรหัสไม่เรื่องและกรณีที่ไม่เป็นความจริงจะถูก จำกัด (การนำเข้าการประกาศของฟังก์ชั่นและการเรียน ฯลฯ )
Joël

@ Joël: คำตอบง่ายๆคือฉันรู้ว่าตัวกำเนิดการเปลี่ยนแปลงที่ฉันต้องทดสอบจะไม่แนะนำข้อบกพร่องใด ๆ ที่เกี่ยวข้องกับการเปลี่ยนลำดับของบรรทัด แน่นอนว่าคุณต้องใช้เครื่องมือแยกวิเคราะห์สำหรับภาษาเป้าหมายเพื่อหลีกเลี่ยงการผิดพลาดในกรณีทั่วไป (หรือเพียงแค่ชุดทดสอบที่ครอบคลุมสำหรับเครื่องกำเนิดไฟฟ้าของคุณ) แต่นี่ควรเป็นการตรวจสอบครั้งเดียวอย่างรวดเร็วนอกจากนี้ เพื่อตรวจสอบรหัส
dnadlinger

คำตอบ:


2

คุณสามารถทำ diff แบบง่าย ๆ เก็บผลลัพธ์ไว้ที่ใดที่หนึ่ง (เพื่อหลีกเลี่ยง diff อื่น) วนรอบบรรทัดในเวอร์ชันใดเวอร์ชันหนึ่งจากนั้นลบออกจากอีกด้านหนึ่ง

สิ่งนี้กลับกลายเป็นโครงการแยกต่างหากสำหรับรหัสการทำงาน รหัส.


ฉันไม่แน่ใจว่าสิ่งที่ควรทำอย่างแน่นอน แต่ดูเหมือนจะไม่ได้ผลลัพธ์ที่ต้องการ เมื่อฉันเข้าใจคำถามจากตัวอย่างทั้งสองในโค้ด/tmp/oldและ/tmp/newไม่ต้องการผลลัพธ์ที่ต่างกันเนื่องจากมีเพียงบรรทัดที่ย้ายไปมา อย่างไรก็ตามรหัสนี้ให้ผลลัพธ์
Ilari Kajaste

แก้ไขรหัส
l0b0

ยังไม่ได้ทดสอบคำตอบเมื่อฉันเสร็จสิ้นกระบวนการรวมที่กล่าวถึงข้างต้นเมื่อนานมาแล้ว แต่จากรหัสมองมันดูเหมือนว่ามันจะทำงานได้
dnadlinger

4

คุณอาจลอง sort'em ก่อน สิ่งที่ต้องการ:

sort file-a > s-file-a
sort file-b > s-file-b
diff s-file-a s-file-b

Bash (และ zsh) สามารถทำได้ในหนึ่งบรรทัดด้วยการทดแทนกระบวนการ

diff <(sort file-a) <(sort file-b)

นี่อาจเป็นตัวเลือก แต่ diffs ที่สร้างขึ้นจะไม่เป็นประโยชน์มากนักเพราะฉันจะสูญเสียหมายเลขบรรทัดและข้อมูลบริบททั้งหมด ...
dnadlinger

แม้ว่าฉันจะยังหวังว่าจะได้ทางออกที่ดีกว่า แต่ฉันก็ใช้วิธีนี้เพื่อตรวจสอบชุดการเปลี่ยนแปลงที่ฉันได้ทำไป
dnadlinger

2
ฉันคาดการณ์ได้ว่าสิ่งนี้จะพลาดการเปลี่ยนแปลงบางอย่าง บางครั้งเรื่องการสั่งซื้อบางครั้งก็ไม่ได้ คุณละทิ้งบริบททั้งหมด
Rich Homolka

สำหรับ refactor การสั่งซื้อที่ฉันต้องการให้แน่ใจว่าทุกสิ่งที่มีอยู่ยังคงอยู่นี่คือสิ่งที่ฉันต้องการ
ntrrobng

0

ดูเหมือนว่าคุณสามารถควบคุมเครื่องมือได้ จากนั้นทำผลลัพธ์ที่คาดการณ์ได้: แทนที่จะเปล่งคำประกาศตามลำดับแบบกึ่งสุ่มใช้ (พูด) เรียงตามตัวอักษรเป็นวิธีสุดท้าย สิ่งนี้จะไม่เพียง แต่มีประโยชน์ในการกำจัด cruft ที่ไร้ประโยชน์ออกไปเท่านั้น แต่ยังทำให้การอ่านและตรวจสอบของมนุษย์ง่ายขึ้น


ขออภัยคำตอบนี้ไม่ช่วยฉันเลย - ถ้ามันง่ายมากฉันจะเปลี่ยนมันทันที นอกจากนี้ฉันกำลังรวมการเปลี่ยนแปลงจากโครงการที่กำเนิดถูกแยกจากเดิมดังนั้นการเพิ่มการเปลี่ยนแปลงที่ค่อนข้างไกลจะทำให้กระบวนการนั้นซับซ้อนยิ่งขึ้น ...
dnadlinger

0

หากไฟล์มีโครงสร้างเป็นส่วน ๆ มันเป็นเพียงส่วนที่ไม่เป็นไปตามลำดับและมีนิพจน์ทั่วไปที่คุณสามารถใช้เพื่อรับรู้ส่วนหัวของส่วนคุณสามารถcsplitไฟล์ลงในส่วนของพวกเขาแล้วเปรียบเทียบส่วนตามลำดับ

ตัวอย่างเช่นฉันเพิ่งทำสิ่งนี้ในสอง MySQL ทิ้งเพื่อเปรียบเทียบหลังจากชื่อฐานข้อมูลบางส่วนมีการเปลี่ยนแปลงกรณี (และดังนั้นการถ่ายโอนข้อมูลที่ระบุไว้ในลำดับที่แตกต่างกัน):

csplit all-07sep2015-11:19:12.sql '/Current Database/-1' '{*}'  # split the dump made before the change, creating files xx00, xx01, ...
csplit -f yy all-07sep2015-12:26:12.sql '/Current Database/-1' '{*}' # split the dump made after the change, creating files yy00, yy01, ...
fgrep 'Current Database' xx?? yy?? | perl -lne 'BEGIN{my %foo}; /(^....).*`(.*)`/ and push(@{$foo{lc($2)}}, $1); END {printf("diff -di %s %s\n", @{$_}) for values %foo}' | sh -x | less  # match the pairs and compare them with diff
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.