GNU/Linux >> Belajar Linux >  >> Linux

Pengantar diff dan patch

Jika Anda pernah bekerja pada basis kode besar dengan model pengembangan terdistribusi, Anda mungkin pernah mendengar orang mengatakan hal-hal seperti "Sue baru saja mengirim tambalan," atau "Rajiv sedang memeriksa perbedaannya." Mungkin istilah-istilah itu baru bagi Anda dan Anda bertanya-tanya apa artinya. Sumber terbuka memiliki dampak di sini, karena model pengembangan utama proyek besar dari server web Apache ke kernel Linux telah menjadi proyek pengembangan "berbasis patch" sepanjang masa pakainya. Faktanya, tahukah Anda bahwa nama Apache berasal dari kumpulan tambalan yang dikumpulkan dan disusun berdasarkan kode sumber server HTTPd NCSA asli?

Anda mungkin mengira ini adalah cerita rakyat, tetapi tangkapan awal situs web Apache mengklaim bahwa nama itu berasal dari koleksi "tambalan" asli ini; maka APA tCH y server, yang kemudian disederhanakan menjadi Apache.

Tapi cukup trivia sejarah. Apa sebenarnya tambalan ini? dan perbedaan yang dibicarakan pengembang?

Pertama, demi artikel ini, mari kita asumsikan bahwa kedua istilah ini merujuk pada satu hal yang sama. "Diff" adalah kependekan dari "difference;" utilitas Unix dengan nama yang sama mengungkapkan perbedaan antara satu atau lebih file. Kita akan melihat contoh utilitas diff di bawah ini.

Sebuah "tambalan" mengacu pada kumpulan spesifik perbedaan antara file yang dapat diterapkan ke pohon kode sumber menggunakan utilitas diff Unix. Jadi kita dapat membuat diff (atau tambalan) menggunakan alat diff dan menerapkannya ke versi yang tidak ditambal dari kode sumber yang sama menggunakan alat tambalan. Sebagai tambahan (dan melanggar aturan saya tentang tidak ada lagi trivia sejarah), kata "patch" berasal dari penutup fisik lubang punchcard untuk membuat perubahan perangkat lunak pada hari-hari komputasi awal, ketika punchcard mewakili program yang dijalankan oleh prosesor komputer. Gambar di bawah, ditemukan di halaman Wikipedia ini yang menjelaskan tambalan perangkat lunak, menunjukkan konsep "tambalan" asli ini:

Sekarang setelah Anda memiliki pemahaman dasar tentang tambalan dan perbedaan, mari kita jelajahi bagaimana pengembang perangkat lunak menggunakan alat ini. Jika Anda belum pernah menggunakan sistem kontrol kode sumber seperti Git atau Subversion, saya akan mengatur tahapan bagaimana sebagian besar proyek perangkat lunak non-sepele dikembangkan. Jika Anda menganggap kehidupan proyek perangkat lunak sebagai serangkaian tindakan di sepanjang garis waktu, Anda mungkin memvisualisasikan perubahan pada perangkat lunak—seperti menambahkan fitur atau fungsi ke file kode sumber atau memperbaiki bug—muncul di berbagai titik di timeline, dengan setiap titik diskrit mewakili status semua file kode sumber pada saat itu. Kami akan menyebut titik perubahan ini "komit", menggunakan nomenklatur yang sama yang digunakan alat kontrol kode sumber paling populer saat ini, Git. Bila Anda ingin melihat perbedaan antara kode sumber sebelum dan sesudah komit tertentu, atau di antara banyak komit, Anda dapat menggunakan alat untuk menunjukkan kepada kami perbedaan, atau perbedaan.

Jika Anda mengembangkan perangkat lunak menggunakan alat kontrol kode sumber yang sama, Git, Anda mungkin memiliki perubahan di sistem lokal Anda yang ingin Anda berikan kepada orang lain untuk berpotensi ditambahkan sebagai komit ke pohon mereka sendiri. Salah satu cara untuk memberikan perubahan lokal kepada orang lain adalah dengan membuat perbedaan dari perubahan pohon lokal Anda dan mengirimkan "tambalan" ini ke orang lain yang sedang mengerjakan kode sumber yang sama. Ini memungkinkan orang lain menambal pohon mereka dan melihat pohon kode sumber dengan perubahan yang Anda terapkan.

Linux, Git, dan GitHub

Model berbagi file tambalan ini adalah cara komunitas kernel Linux beroperasi terkait perubahan yang diusulkan hari ini. Jika Anda melihat arsip untuk salah satu milis kernel Linux yang populer—LKML adalah yang utama, tetapi yang lainnya termasuk linux-containers, fs-devel, Netdev, dan lain-lain—Anda akan menemukan banyak pengembang memposting patch yang mereka ingin agar orang lain meninjau, menguji, dan mungkin membawa ke pohon Git kernel Linux resmi di beberapa titik. Di luar cakupan artikel ini untuk membahas Git, sistem kontrol kode sumber yang ditulis oleh Linus Torvalds, secara lebih rinci, tetapi perlu dicatat bahwa Git memungkinkan model pengembangan terdistribusi ini, memungkinkan patch untuk hidup terpisah dari repositori utama, mendorong dan menarik ke pohon yang berbeda dan mengikuti alur perkembangan spesifik mereka.

Sebelum melanjutkan, kami tidak dapat mengabaikan layanan paling populer yang relevan dengan patch dan diff:GitHub. Mengingat namanya, Anda mungkin dapat menebak bahwa GitHub didasarkan pada Git, tetapi ia menawarkan alur kerja berbasis web dan API di sekitar alat Git untuk pengembangan proyek sumber terbuka terdistribusi. Salah satu cara utama patch dibagikan di GitHub bukanlah melalui email, seperti kernel Linux, tetapi dengan membuat pull request . Saat Anda melakukan perubahan pada salinan pohon kode sumber Anda sendiri, Anda dapat membagikan perubahan tersebut dengan membuat permintaan tarik terhadap repositori yang biasa dibagikan untuk proyek perangkat lunak tersebut. GitHub digunakan oleh banyak proyek open source aktif dan populer saat ini, seperti Kubernetes, Docker, Container Network Interface (CNI), Istio, dan banyak lainnya. Di dunia GitHub, pengguna cenderung menggunakan antarmuka berbasis web untuk meninjau perbedaan atau tambalan yang terdiri dari permintaan tarik, tetapi Anda masih dapat mengakses file tambalan mentah dan menggunakannya di baris perintah dengan utilitas tambalan.

Memulai bisnis

Sekarang setelah kita membahas patch dan diff serta bagaimana mereka digunakan di komunitas atau alat open source populer, mari kita lihat beberapa contohnya.

Contoh pertama menyertakan dua salinan pohon sumber, dan satu memiliki perubahan yang ingin kita visualisasikan menggunakan utilitas diff. Dalam contoh kita, kita akan melihat perbedaan “terpadu” karena itu adalah tampilan yang diharapkan untuk patch di sebagian besar dunia pengembangan perangkat lunak modern. Periksa halaman manual diff untuk informasi lebih lanjut tentang opsi dan cara menghasilkan perbedaan. Kode sumber asli terletak di sources-orig dan basis kode kedua kami yang dimodifikasi terletak di direktori bernama sources-fixed. Untuk menampilkan perbedaan dalam format diff terpadu di terminal Anda, gunakan perintah berikut:

$ diff -Naur sources-orig/ sources-fixed/

...yang kemudian menampilkan output perintah diff berikut:

diff -Naur sources-orig/officespace/interest.go sources-fixed/officespace/interest.go
--- sources-orig/officespace/interest.go        2018-08-10 16:39:11.000000000 -0400
+++ sources-fixed/officespace/interest.go       2018-08-10 16:39:40.000000000 -0400
@@ -11,15 +11,13 @@
   InterestRate float64
 }

+// compute the rounded interest for a transaction
 func computeInterest(acct *Account, t Transaction) float64 {

   interest := t.Amount * t.InterestRate
   roundedInterest := math.Floor(interest*100) / 100.0
   remainingInterest := interest - roundedInterest

-  // a little extra..
-  remainingInterest *= 1000
-
   // Save the remaining interest into an account we control:
   acct.Balance = acct.Balance + remainingInterest

Beberapa baris pertama dari output perintah diff dapat menggunakan beberapa penjelasan:Tiga --- tanda menunjukkan nama file asli; setiap baris yang ada di file asli tetapi tidak di file baru yang dibandingkan akan diawali dengan satu - untuk dicatat bahwa baris ini "dikurangi" dari sumbernya. +++ tanda menunjukkan sebaliknya:File baru yang dibandingkan dan tambahan yang ditemukan dalam file ini ditandai dengan satu + simbol untuk menunjukkan bahwa mereka ditambahkan dalam versi baru file. Setiap "bongkahan" (itulah bagian yang diawali dengan @@ disebut) dari perbedaan file tambalan memiliki nomor baris kontekstual yang membantu alat tambalan (atau prosesor lain) mengetahui di mana harus menerapkan perubahan ini. Anda dapat melihat dari fungsi referensi film "Ruang Kantor" yang telah kami koreksi (dengan menghapus tiga baris) keserakahan salah satu pengembang perangkat lunak kami, yang menambahkan sedikit ke perhitungan bunga yang dibulatkan bersama dengan komentar pada fungsi kami .

Jika Anda ingin orang lain menguji perubahan dari pohon ini, Anda dapat menyimpan output ini dari diff ke dalam file tambalan:

$ diff -Naur sources-orig/ sources-fixed/ >myfixes.patch

Sekarang Anda memiliki file patch, myfixes.patch, yang dapat dibagikan dengan pengembang lain untuk menerapkan dan menguji rangkaian perubahan ini. Rekan pengembang dapat menerapkan perubahan menggunakan alat tambalan, mengingat direktori kerja mereka saat ini berada di dasar pohon kode sumber:

$ patch -p1 < ../myfixes.patch
patching file officespace/interest.go

Sekarang pohon sumber sesama pengembang Anda telah ditambal dan siap untuk membangun dan menguji perubahan yang diterapkan melalui tambalan. Bagaimana jika pengembang ini telah membuat perubahan pada interest.go secara terpisah? Selama perubahan tidak bertentangan secara langsung—misalnya, mengubah baris yang sama persis—alat tambalan harus dapat memecahkan tempat untuk menggabungkan perubahan. Sebagai contoh, file interest.go dengan beberapa perubahan lain digunakan di berikut contoh run of patch:

$ patch -p1 < ../myfixes.patch
patching file officespace/interest.go
Hunk #1 succeeded at 26 (offset 15 lines).

Dalam hal ini, tambalan memperingatkan bahwa perubahan tidak berlaku di lokasi asli dalam file, tetapi diimbangi oleh 15 baris. Jika Anda memiliki banyak file yang berubah, patch mungkin berhenti mencoba menemukan di mana perubahan itu cocok, tetapi itu memberikan opsi (dengan peringatan yang diperlukan dalam dokumentasi) untuk memunculkan "ketidakjelasan" yang cocok (yang berada di luar cakupan artikel ini) .

Jika Anda menggunakan Git dan/atau GitHub, Anda mungkin tidak akan menggunakan alat diff atau patch sebagai alat yang berdiri sendiri. Git menawarkan banyak fungsi ini sehingga Anda dapat menggunakan kemampuan bawaan untuk bekerja pada pohon sumber bersama dengan menggabungkan dan menarik perubahan pengembang lain. Satu kemampuan serupa adalah menggunakan git diff untuk menyediakan keluaran diff terpadu di pohon lokal Anda atau di antara dua referensi (pengidentifikasi komit, nama tag atau cabang, dan seterusnya). Anda bahkan dapat membuat file tambalan yang mungkin berguna bagi seseorang yang tidak menggunakan Git hanya dengan menyalurkan output git diff ke file, mengingat file tersebut menggunakan format persis perintah diff yang dapat digunakan oleh tambalan. Tentu saja, GitHub menggunakan kemampuan ini ke dalam antarmuka pengguna berbasis web sehingga Anda dapat melihat perubahan file pada permintaan tarik. Dalam tampilan ini, Anda akan melihat bahwa ini adalah tampilan perbedaan terpadu yang efektif di browser web Anda, dan GitHub memungkinkan Anda mengunduh perubahan ini sebagai file tambalan mentah.

Ringkasan

Anda telah mempelajari apa itu diff dan patch, serta alat baris perintah Unix/Linux umum yang berinteraksi dengannya. Kecuali jika Anda adalah pengembang pada proyek yang masih menggunakan metode pengembangan berbasis file patch—seperti kernel Linux—Anda akan menggunakan kemampuan ini terutama melalui sistem kontrol kode sumber seperti Git. Namun, mengetahui latar belakang dan dasar-dasar fitur yang digunakan banyak pengembang setiap hari akan membantu melalui alat tingkat yang lebih tinggi seperti GitHub. Dan siapa tahu—mereka mungkin berguna suatu hari nanti ketika Anda perlu bekerja dengan tambalan dari milis di dunia Linux.


Linux
  1. Kode Sumber Netstat?

  2. Kode untuk malloc dan gratis

  3. Di mana Kode Penjadwal CFS Linux?

  1. Menjalankan Script Dengan “. ” Dan Dengan “sumber”?

  2. MIXXX – Perangkat Lunak DJ yang Cantik, Gratis, dan Open Source

  3. Kompilasi kode C dan paparkan ke Swift di Linux

  1. Dapatkan Kode Sumber untuk Perintah Linux apa pun

  2. Cara Mengkompilasi dan Menginstal Perangkat Lunak dari Kode Sumber di Linux

  3. Cara Memanggil Fungsi C di C++, Fungsi C++ di C (Campuran C dan C++)