SVN - Panduan Cepat

Apa itu Sistem Kontrol Versi?

Version Control System (VCS) adalah perangkat lunak yang membantu pengembang perangkat lunak untuk bekerja sama dan memelihara riwayat lengkap pekerjaan mereka.

Following are the goals of a Version Control System.

  • Izinkan pengembang untuk bekerja secara bersamaan.
  • Jangan menimpa perubahan satu sama lain.
  • Menjaga sejarah setiap versi dari segalanya.

A VCS is divided into two categories.

  • Sistem Kontrol Versi Terpusat (CVCS), dan
  • Sistem Kontrol Versi Terdistribusi / Terdesentralisasi (DVCS).

Dalam tutorial ini, kita hanya akan berkonsentrasi pada Sistem Kontrol Versi Terpusat dan terutama Subversion. Subversion berada di bawah sistem kontrol versi terpusat, artinya menggunakan server pusat untuk menyimpan semua file dan memungkinkan kolaborasi tim.

Terminologi Kontrol Versi

Mari kita mulai dengan membahas beberapa istilah yang akan kita gunakan dalam tutorial ini.

  • Repository:Repositori adalah jantung dari sistem kontrol versi apa pun. Ini adalah tempat utama di mana pengembang menyimpan semua pekerjaan mereka. Repositori tidak hanya menyimpan file tetapi juga sejarah. Repositori diakses melalui jaringan, bertindak sebagai server dan alat kontrol versi yang bertindak sebagai klien. Klien dapat terhubung ke repositori, dan kemudian mereka dapat menyimpan / mengambil perubahan mereka ke / dari repositori. Dengan menyimpan perubahan, klien membuat perubahan ini tersedia untuk orang lain dan dengan mengambil perubahan, klien mengambil perubahan orang lain sebagai salinan pekerjaan.

  • Trunk: Trunk adalah direktori tempat semua pengembangan utama terjadi dan biasanya diperiksa oleh pengembang untuk mengerjakan proyek.

  • Tags: Direktori tags digunakan untuk menyimpan snapshot proyek yang bernama. Operasi tag memungkinkan untuk memberikan nama yang deskriptif dan mudah diingat ke versi tertentu dalam repositori.

    Misalnya, LAST_STABLE_CODE_BEFORE_EMAIL_SUPPORT lebih berkesan daripada

    Repositori UUID: 7ceef8cb-3799-40dd-a067-c216ec2e5247 dan

    Revisi: 13

  • Branches:Operasi cabang digunakan untuk membuat jalur pengembangan lain. Ini berguna saat Anda ingin proses pengembangan Anda terbagi menjadi dua arah yang berbeda. Misalnya, saat Anda merilis versi 5.0, Anda mungkin ingin membuat cabang sehingga pengembangan fitur 6.0 dapat dipisahkan dari perbaikan bug 5.0.

  • Working copy:Copy pekerjaan adalah snapshot dari repositori. Repositori digunakan bersama oleh semua tim, tetapi orang-orang tidak mengubahnya secara langsung. Sebagai gantinya, setiap pengembang memeriksa copy pekerjaan. Salinan pekerjaan adalah tempat kerja pribadi di mana pengembang dapat melakukan pekerjaan mereka dengan tetap terisolasi dari anggota tim lainnya.

  • Commit changes:Commit adalah proses menyimpan perubahan dari tempat kerja pribadi ke server pusat. Setelah komit, perubahan tersedia untuk semua tim. Pengembang lain dapat mengambil perubahan ini dengan memperbarui copy pekerjaan mereka. Komit adalah operasi atom. Seluruh komit berhasil atau dibatalkan. Pengguna tidak pernah melihat komit setengah jadi.

Instalasi SVN

Subversion adalah alat kontrol versi sumber terbuka yang populer. Ini open-source dan tersedia secara gratis melalui internet. Itu datang secara default dengan sebagian besar distribusi GNU / Linux, jadi mungkin sudah diinstal pada sistem Anda. Untuk memeriksa apakah sudah diinstal atau tidak gunakan perintah berikut.

[jerry@CentOS ~]$ svn --version

Jika klien Subversion tidak diinstal, maka perintah akan melaporkan kesalahan, jika tidak maka akan menampilkan versi perangkat lunak yang diinstal.

[jerry@CentOS ~]$ svn --version
-bash: svn: command not found

Jika Anda menggunakan GNU / Linux berbasis RPM, gunakan yumperintah untuk instalasi. Setelah instalasi berhasil, jalankansvn --version perintah.

[jerry@CentOS ~]$ su - Password: [root@CentOS ~]# yum install subversion [jerry@CentOS ~]$ svn --version
svn, version 1.6.11 (r934486)
compiled Jun 23 2012, 00:44:03

Dan jika Anda menggunakan GNU / Linux berbasis Debian, gunakan apt perintah untuk instalasi.

[jerry@Ubuntu]$ sudo apt-get update [sudo] password for jerry: [jerry@Ubuntu]$ sudo apt-get install subversion

[jerry@Ubuntu]$ svn --version
svn, version 1.7.5 (r1336830)
compiled Jun 21 2013, 22:11:49

Pengaturan Apache

Kami telah melihat bagaimana menginstal klien Subversion di GNU / Linux. Mari kita lihat cara membuat repositori baru dan mengizinkan akses ke pengguna.

Di server kita harus menginstal Apache httpd modul dan svnadmin alat.

[jerry@CentOS ~]$ su -
Password: 
[root@CentOS ~]# yum install mod_dav_svn subversion

Itu mod_dav_svn paket memungkinkan akses ke repositori menggunakan HTTP, melalui server httpd Apache dan subversion paket menginstal alat svnadmin.

Subversi membaca konfigurasinya dari /etc/httpd/conf.d/subversion.confmengajukan. Setelah menambahkan konfigurasi,subversion.conf File terlihat sebagai berikut:

LoadModule dav_svn_module     modules/mod_dav_svn.so
LoadModule authz_svn_module   modules/mod_authz_svn.so

<Location /svn>
   DAV svn
   SVNParentPath /var/www/svn
   AuthType Basic
   AuthName "Authorization Realm"
   AuthUserFile /etc/svn-users
   Require valid-user
</Location>

Mari kita buat pengguna Subversion dan beri mereka akses ke repositori. htpasswd perintah digunakan untuk membuat dan memperbarui file teks biasa yang digunakan untuk menyimpan nama pengguna dan kata sandi untuk otentikasi dasar pengguna HTTP. Opsi '-c' membuat file kata sandi , jika file kata sandi sudah ada, itu akan ditimpa. Itulah mengapa gunakan opsi '-c' hanya untuk pertama kalinya. Opsi '-m' mengaktifkan enkripsi MD5 untuk kata sandi.

Pengaturan Pengguna

Mari kita buat pengguna tom.

[root@CentOS ~]# htpasswd -cm /etc/svn-users tom
New password: 
Re-type new password: 
Adding password for user tom

Mari kita buat pengguna jerry

[root@CentOS ~]# htpasswd -m /etc/svn-users jerry
New password: 
Re-type new password: 
Adding password for user jerry
[root@CentOS ~]#

Buat direktori induk Subversion untuk menyimpan semua pekerjaan (lihat /etc/httpd/conf.d/subversion.conf ).

[root@CentOS ~]# mkdir /var/www/svn
[root@CentOS ~]# cd /var/www/svn/

Penyiapan Repositori

Buat repositori proyek bernama project_repo . Perintah svnadmin akan membuat repositori baru dan beberapa direktori lain di dalamnya untuk menyimpan metadata.

[root@CentOS svn]# svnadmin create project_repo

[root@CentOS svn]# ls -l project_repo
total 24
drwxr-xr-x. 2 root root 4096 Aug  4 22:30 conf
drwxr-sr-x. 6 root root 4096 Aug  4 22:30 db
-r--r--r--. 1 root root    2 Aug  4 22:30 format
drwxr-xr-x. 2 root root 4096 Aug  4 22:30 hooks
drwxr-xr-x. 2 root root 4096 Aug  4 22:30 locks
-rw-r--r--. 1 root root  229 Aug  4 22:30 README.txt

Mari kita ubah kepemilikan pengguna dan grup dari repositori.

[root@CentOS svn]# chown -R apache.apache project_repo/

Periksa apakah SELinux diaktifkan atau tidak menggunakan alat status SELinux.

[root@CentOS svn]# sestatus
SELinux status:                 enabled
SELinuxfs mount:                /selinux
Current mode:                   enforcing
Mode from config file:          enforcing
Policy version:                 24
Policy from config file:        targeted

Untuk server kami, SELinux diaktifkan, jadi kami harus mengubah konteks keamanan SELinux.

[root@CentOS svn]# chcon -R -t httpd_sys_content_t /var/www/svn/project_repo/

Untuk mengizinkan komit melalui HTTP, jalankan perintah berikut.

[root@CentOS svn]# chcon -R -t httpd_sys_rw_content_t /var/www/svn/project_repo/

Restart server Apache dan kita selesai dengan konfigurasi server Apache.

[root@CentOS svn]# service httpd restart
Stopping httpd:                                            [FAILED]
Starting httpd: httpd: apr_sockaddr_info_get() failed for CentOS
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
                                                           [  OK  ]
[root@CentOS svn]# service httpd status
httpd (pid  1372) is running...
[root@CentOS svn]#

Kami telah berhasil mengkonfigurasi server Apache, sekarang kami akan mengkonfigurasi repositori. Untuk menyediakan akses repositori hanya untuk pengguna asli dan untuk menggunakan file otorisasi default; tambahkan baris berikut ke file project_repo / conf / svnserve.conf .

anon-access = none
authz-db = authz

Secara konvensional, setiap proyek Subversion punya trunk, tags, dan branches direktori langsung di bawah direktori root proyek.

The trunk adalah direktori di mana semua perkembangan utama yang terjadi dan biasanya diperiksa oleh pengembang untuk bekerja pada proyek tersebut.

Direktori tag digunakan untuk menyimpan snapshot proyek yang bernama. Saat membuat rilis produksi, tim akan menandai kode yang masuk ke rilis tersebut.

Direktori cabang digunakan ketika Anda ingin mengejar jalur pengembangan yang berbeda.

Mari kita buat struktur direktori trunk, tags, dan branch di bawah repositori proyek.

[root@CentOS svn]# mkdir /tmp/svn-template
[root@CentOS svn]# mkdir /tmp/svn-template/trunk
[root@CentOS svn]# mkdir /tmp/svn-template/branches
[root@CentOS svn]# mkdir /tmp/svn-template/tags

Sekarang impor direktori dari /tmp/svn-template ke repositori.

[root@CentOS svn]# svn import -m 'Create trunk, branches, tags directory structure' /tmp/svn-template/ 
Adding         /tmp/svn-template/trunk
Adding         /tmp/svn-template/branches
Adding         /tmp/svn-template/tags
Committed revision 1.
[root@CentOS svn]#

Selesai! Kami telah berhasil membuat repositori dan mengizinkan akses keTom dan Jerry. Mulai sekarang, mereka dapat melakukan semua operasi yang didukung ke repositori.

Siklus hidup Sistem Kontrol Versi dibahas dalam bab ini. Di bab selanjutnya, kita akan melihat perintah Subversion untuk setiap operasi.

Buat Repositori:

Repositori adalah tempat sentral tempat pengembang menyimpan semua pekerjaan mereka. Repositori tidak hanya menyimpan file, tetapi juga sejarah tentang perubahan. Artinya, ia menyimpan riwayat perubahan yang dibuat dalam file.

Operasi 'buat' digunakan untuk membuat repositori baru. Seringkali operasi ini dilakukan hanya sekali. Saat Anda membuat repositori baru, VCS Anda akan mengharapkan Anda mengatakan sesuatu untuk mengidentifikasinya, seperti di mana Anda ingin membuatnya, atau nama apa yang harus diberikan ke repositori tersebut.

Periksa

Operasi 'Checkout' digunakan untuk membuat copy pekerjaan dari repositori. Copy pekerjaan adalah tempat kerja pribadi tempat pengembang melakukan perubahan mereka, dan kemudian, mengirimkan perubahan ini ke repositori.

Memperbarui

Seperti namanya, operasi 'perbarui' digunakan untuk memperbarui copy pekerjaan. Operasi ini menyinkronkan copy pekerjaan dengan repositori. Karena repositori dibagikan oleh semua tim, pengembang lain dapat melakukan perubahan mereka dan copy pekerjaan Anda menjadi lebih lama.

Misalkan Tom and Jerry adalah dua pengembang yang mengerjakan sebuah proyek. Keduanya memeriksa versi terbaru dari repositori dan mulai bekerja. Pada titik ini, copy pekerjaan mereka tersinkronisasi sepenuhnya dengan repositori. Jerry menyelesaikan pekerjaannya dengan sangat efisien dan melakukan perubahannya pada repositori.

Sekarang copy pekerjaan Tom sudah kedaluwarsa. Operasi pembaruan akan menarik perubahan terbaru Jerry dari repositori dan akan memperbarui copy pekerjaan Tom .

Lakukan Perubahan

Setelah checkout, seseorang dapat melakukan berbagai operasi untuk melakukan perubahan. Edit adalah operasi yang paling umum. Seseorang dapat mengedit file yang ada untuk menambah / menghapus konten dari file.

Seseorang dapat menambahkan file / direktori. Tetapi segera file / direktori ini tidak menjadi bagian dari repositori, melainkan ditambahkan ke daftar perubahan yang tertunda dan menjadi bagian dari repositori setelah operasi komit.

Demikian pula seseorang dapat menghapus file / direktori. Operasi penghapusan segera menghapus file dari copy pekerjaan, tetapi penghapusan file yang sebenarnya ditambahkan ke daftar perubahan yang tertunda dan perubahan dibuat ke repositori setelah operasi komit.

Operasi 'Rename' mengubah nama file / direktori. Operasi 'Pindah' ​​digunakan untuk memindahkan file / direktori dari satu tempat ke tempat lain dalam pohon repositori.

Tinjau Perubahan

Ketika Anda memeriksa copy pekerjaan atau memperbarui copy pekerjaan, maka copy pekerjaan Anda sepenuhnya tersinkronisasi dengan repositori. Tapi saat Anda melakukan perubahan pada copy pekerjaan Anda, itu menjadi lebih baru dari repositori. Dan merupakan praktik yang baik untuk meninjau perubahan Anda sebelum operasi 'komit'.

Operasi 'Status' mendaftar modifikasi yang telah dibuat pada copy pekerjaan. Seperti yang telah kami sebutkan sebelumnya, setiap kali Anda melakukan perubahan pada copy pekerjaan, semua perubahan ini menjadi bagian dari daftar perubahan yang tertunda. Dan operasi 'status' digunakan untuk melihat daftar perubahan yang tertunda.

Operasi 'Status' hanya memberikan daftar perubahan tetapi tidak detailnya. Seseorang dapat menggunakan operasi diff untuk melihat detil dari modifikasi yang telah dibuat pada copy pekerjaan.

Perbaiki Kesalahan

Misalkan seseorang telah membuat perubahan pada copy pekerjaannya, tetapi sekarang, dia ingin membuang perubahan ini. Dalam situasi ini, operasi 'kembalikan' akan membantu.

Operasi pengembalian mengembalikan modifikasi yang telah dibuat ke copy pekerjaan. Dimungkinkan untuk mengembalikan satu atau lebih file / direktori. Juga dimungkinkan untuk mengembalikan seluruh copy pekerjaan. Dalam kasus ini, operasi 'kembalikan' akan menghancurkan daftar perubahan yang tertunda dan akan mengembalikan copy pekerjaan ke keadaan semula.

Selesaikan Konflik:

Konflik dapat terjadi pada saat penggabungan. Operasi 'Gabung' secara otomatis menangani semua hal yang dapat dilakukan dengan aman. Segala sesuatu yang lain dianggap sebagai konflik. Misalnya, file "hello.c" diubah di cabang dan dihapus di cabang lain. Situasi seperti itu menuntut seseorang untuk mengambil keputusan. Operasi 'menyelesaikan' digunakan untuk membantu pengguna mengetahui berbagai hal dan untuk menginformasikan VCS tentang cara menangani konflik.

Lakukan Perubahan

Operasi 'Komit' digunakan untuk menerapkan perubahan dari copy pekerjaan ke repositori. Operasi ini mengubah repositori dan pengembang lain bisa melihat perubahan ini dengan memperbarui copy pekerjaan mereka.

Sebelum komit, seseorang harus menambahkan file / direktori ke daftar perubahan yang tertunda. Ini adalah tempat di mana perubahan menunggu untuk dilakukan. Dengan komit, kami biasanya memberikan pesan log untuk menjelaskan mengapa seseorang melakukan perubahan. Pesan log ini menjadi bagian dari sejarah repositori. Komit adalah operasi atomik, yang berarti seluruh komit berhasil atau dibatalkan. Pengguna tidak pernah melihat komit setengah jadi.

Subversion menyediakan perintah checkout untuk memeriksa copy pekerjaan dari repositori. Perintah di bawah ini akan membuat direktori baru di direktori kerja saat ini dengan nama project_repo . Jangan repot-repot dengan URL repositori, karena sebagian besar waktu, ini sudah disediakan oleh administrator subversi dengan akses yang sesuai.

[tom@CentOS ~]$ svn checkout http://svn.server.com/svn/project_repo --username=tom

Perintah di atas akan menghasilkan hasil sebagai berikut.

A    project_repo/trunk
A    project_repo/branches
A    project_repo/tags
Checked out revision 1.

Setelah setiap operasi pembayaran berhasil, nomor revisi akan dicetak. Jika Anda ingin melihat informasi lebih lanjut tentang repositori, jalankan perintah info .

[tom@CentOS trunk]$ pwd
/home/tom/project_repo/trunk

[tom@CentOS trunk]$ svn info

Perintah di atas akan menghasilkan hasil sebagai berikut.

Path: .
URL: http://svn.server.com/svn/project_repo/trunk
Repository Root: http://svn.server.com/svn/project_repo
Repository UUID: 7ceef8cb-3799-40dd-a067-c216ec2e5247
Revision: 1
Node Kind: directory
Schedule: normal
Last Changed Author: jerry
Last Changed Rev: 0
Last Changed Date: 2013-08-24 18:15:52 +0530 (Sat, 24 Aug 2013)

[tom@CentOS trunk]$

Jerry memeriksa versi terbaru dari repositori dan mulai mengerjakan sebuah proyek. Dia membuat file array.c di dalam direktori trunk.

[jerry@CentOS ~]$ cd project_repo/trunk/ [jerry@CentOS trunk]$ cat array.c

Perintah di atas akan menghasilkan hasil sebagai berikut.

#include <stdio.h>
#define MAX 16

int main(void) {
   int i, n, arr[MAX];
   printf("Enter the total number of elements: ");
   scanf("%d", &n);

   printf("Enter the elements\n");

   for (i = 0; i < n; ++i) scanf("%d", &arr[i]);
   printf("Array has following elements\n");
   for (i = 0; i < n; ++i) printf("|%d| ", arr[i]);
   
   printf("\n");
   return 0;
}

Dia ingin menguji kodenya sebelum berkomitmen.

[jerry@CentOS trunk]$ make array cc array.c -o array [jerry@CentOS trunk]$ ./array 
Enter the total number of elements: 5
Enter the elements
1
2
3
4
5
Array has following elements
|1| |2| |3| |4| |5|

Dia menyusun dan menguji kodenya dan semuanya bekerja seperti yang diharapkan, sekarang saatnya untuk melakukan perubahan.

[jerry@CentOS trunk]$ svn status
?       array.c
?       array

Subversion menampilkan '?' di depan nama file karena tidak tahu apa yang harus dilakukan dengan file ini.

Sebelum melakukan, Jerry perlu menambahkan file ini ke daftar perubahan yang tertunda.

[jerry@CentOS trunk]$ svn add array.c 
A         array.c

Mari kita periksa dengan operasi 'status'. Subversi menunjukkanAbefore array.c , artinya, file tersebut berhasil ditambahkan ke daftar perubahan yang tertunda.

[jerry@CentOS trunk]$ svn status
?       array
A       array.c

Untuk menyimpan file array.c ke repositori, gunakan perintah komit dengan opsi -m diikuti dengan pesan komit. Jika Anda menghilangkan opsi -m, Subversion akan menampilkan editor teks di mana Anda dapat mengetik pesan multi-baris.

[jerry@CentOS trunk]$ svn commit -m "Initial commit"
Adding         trunk/array.c
Transmitting file data .
Committed revision 2.

Sekarang file array.c berhasil ditambahkan ke repositori, dan nomor revisi bertambah satu.

Jerry sudah menambahkan file array.c ke repositori. Tom juga memeriksa kode terbaru dan mulai bekerja.

[tom@CentOS ~]$ svn co http://svn.server.com/svn/project_repo --username=tom

Perintah di atas akan menghasilkan hasil sebagai berikut.

A    project_repo/trunk
A    project_repo/trunk/array.c
A    project_repo/branches
A    project_repo/tags
Checked out revision 2.

Namun, dia menemukan bahwa seseorang telah menambahkan kode tersebut. Jadi dia penasaran siapa yang melakukan itu dan dia memeriksa pesan log untuk melihat lebih jelasnya menggunakan perintah berikut:

[tom@CentOS trunk]$ svn log

Perintah di atas akan menghasilkan hasil sebagai berikut.

------------------------------------------------------------------------
r2 | jerry | 2013-08-17 20:40:43 +0530 (Sat, 17 Aug 2013) | 1 line

Initial commit
------------------------------------------------------------------------
r1 | jerry | 2013-08-04 23:43:08 +0530 (Sun, 04 Aug 2013) | 1 line

Create trunk, branches, tags directory structure
------------------------------------------------------------------------

Ketika Tom mengamati kode Jerry , dia segera melihat adanya bug di dalamnya. Jerry tidak memeriksa luapan larik, yang dapat menyebabkan masalah serius. Jadi Tom memutuskan untuk memperbaiki masalah ini. Setelah modifikasi, array.c akan terlihat seperti ini.

#include <stdio.h>

#define MAX 16

int main(void)
{
   int i, n, arr[MAX];

   printf("Enter the total number of elements: ");
   scanf("%d", &n);

   /* handle array overflow condition */
   if (n > MAX) {
      fprintf(stderr, "Number of elements must be less than %d\n", MAX);
      return 1;
   }

   printf("Enter the elements\n");

   for (i = 0; i < n; ++i)
      scanf("%d", &arr[i]);

   printf("Array has following elements\n");
   for (i = 0; i < n; ++i)
      printf("|%d| ", arr[i]);
      printf("\n");

   return 0;
}

Tom ingin menggunakan operasi status untuk melihat daftar perubahan yang tertunda.

[tom@CentOS trunk]$ svn status
M       array.c

file array.c diubah, itulah sebabnya Subversion munculMhuruf sebelum nama file. Selanjutnya Tom mengkompilasi dan menguji kodenya dan itu berfungsi dengan baik. Sebelum melakukan perubahan, dia ingin memeriksanya kembali dengan meninjau perubahan yang dia buat.

[tom@CentOS trunk]$ svn diff
Index: array.c
===================================================================
--- array.c   (revision 2)
+++ array.c   (working copy)
@@ -9,6 +9,11 @@
    printf("Enter the total number of elements: ");
    scanf("%d", &n);
 
+   if (n > MAX) {
+      fprintf(stderr, "Number of elements must be less than %d\n", MAX);
+      return 1;
+   }
+
    printf("Enter the elements\n");
 
    for (i = 0; i < n; ++i)

Tom telah menambahkan beberapa baris di file array.c , itulah mengapa Subversion muncul + tanda tangani sebelum baris baru. Sekarang dia siap untuk melakukan perubahannya.

[tom@CentOS trunk]$ svn commit -m "Fix array overflow problem"

Perintah di atas akan menghasilkan hasil sebagai berikut.

Sending        trunk/array.c
Transmitting file data .
Committed revision 3.

Perubahan Tom berhasil dilakukan ke repositori.

Jerry telah melakukan versi pertama kode tersebut. Tetapi dia berpikir bahwa dia harus menulis dua fungsi untuk menerima input dan untuk menampilkan isi array. Setelah modifikasi, array.c terlihat seperti berikut.

#include <stdio.h>
#define MAX 16

void accept_input(int *arr, int n) {
   int i;
   for (i = 0; i < n; ++i) 
   scanf("%d", &arr[i]);
}

void display(int *arr, int n) {
   int i;
   for (i = 0; i < n; ++i) 
   printf("|%d| ", arr[i]);
   
   printf("\n");
}

int main(void) {
   int i, n, arr[MAX];

   printf("Enter the total number of elements: ");
   scanf("%d", &n);

   printf("Enter the elements\n");
   accept_input(arr, n);

   printf("Array has following elements\n");
   display(arr, n);

   return 0;
}

Jerry menyusun dan menguji kodenya dan siap untuk melakukan perubahan. Sebelumnya, dia ingin mereview perubahan tersebut menggunakan perintah berikut.

[jerry@CentOS trunk]$ svn diff

Perintah di atas akan menghasilkan hasil sebagai berikut.

Index: array.c
===================================================================
--- array.c   (revision 2)
+++ array.c   (working copy)
@@ -2,6 +2,24 @@
 
 #define MAX 16
 
+void accept_input(int *arr, int n)
+{
+   int i;
+
+   for (i = 0; i & n; ++i)
+      scanf("%d", &arr[i]);
+}
+
+void display(int *arr, int n)
+{
+   int i;
+
+   for (i = 0; i < n; ++i)
+      printf("|%d| ", arr[i]);
+   
+   printf("\n");
+}
+
 int main(void)
 {
    int i, n, arr[MAX];
@@ -10,15 +28,10 @@
    scanf("%d", &n);
 
    printf("Enter the elements\n");
+   accept_input(arr, n);
 
-   for (i = 0; i < n; ++i)
-      scanf("%d", &arr[i]);
-
    printf("Array has following elements\n");
-   for (i = 0; i < n; ++i)
-      printf("|%d| ", arr[i]);
-   
-   printf("\n");
+   display(arr, n);
 
    return 0;
 }

Untuk baris baru yang ditambahkan, Subversion menunjukkan + tanda tangan sebelum baris dan untuk menghapus baris itu menunjukkan -tanda. Sekarang, Jerry mencoba untuk melakukan perubahan menggunakan perintah berikut:

[jerry@CentOS trunk]$ svn commit -m "Add function to accept input and to display array contents"

Perintah di atas akan menghasilkan hasil sebagai berikut.

Sending        trunk/array.c
svn: Commit failed (details follow):
svn: File or directory 'array.c' is out of date; try updating
svn: resource out of date; try updating

Subversion tidak mengizinkan untuk melakukan perubahan Jerry , karena Tom telah memodifikasi repositori dan copy pekerjaan Jerry kedaluwarsa. Untuk menghindari menimpa perubahan satu sama lain, Subversion gagal dalam operasi ini. Jerry harus memperbarui copy pekerjaan sebelum melakukan perubahannya. Jadi dia menggunakan perintah pembaruan seperti yang ditunjukkan di bawah ini.

[jerry@CentOS trunk]$ svn update
G    array.c
Updated to revision 3.

Subversion menunjukkan surat itu G sebelum nama file, yang berarti file ini telah digabungkan.

[jerry@CentOS trunk]$ svn diff

Perintah di atas akan menghasilkan hasil sebagai berikut.

Index: array.c
===================================================================
--- array.c   (revision 3)
+++ array.c   (working copy)
@@ -2,6 +2,24 @@
 
 #define MAX 16
 
+void accept_input(int *arr, int n)
+{
+   int i;
+
+   for (i = 0; i < n; ++i)
+      scanf("%d", &arr[i]);
+}
+
+void display(int *arr, int n)
+{
+   int i;
+
+   for (i = 0; i < n; ++i)
+      printf("|%d| ", arr[i]);
+   
+   printf("\n");
+}

+
 int main(void)
 {
    int i, n, arr[MAX];
@@ -15,15 +33,10 @@
    }
 
    printf("Enter the elements\n");
+   accept_input(arr, n);
 
-   for (i = 0; i < n; ++i)
-      scanf("%d", &arr[i]);
-
    printf("Array has following elements\n");
-   for (i = 0; i < n; ++i)
-      printf("|%d| ", arr[i]);
-   
-   printf("\n");
+   display(arr, n);
 
    return 0;
 }

Subversion hanya menampilkan perubahan Jerry , tetapi file array.c digabungkan. Jika diperhatikan dengan seksama, Subversion sekarang menampilkan revisi nomor 3. Pada keluaran sebelumnya terlihat revisi nomor 2. Tinjau saja siapa yang melakukan perubahan pada file tersebut dan untuk tujuan apa.

jerry@CentOS trunk]$ svn log
------------------------------------------------------------------------
r3 | tom   | 2013-08-18 20:21:50 +0530 (Sun, 18 Aug 2013)   | 1 line

Fix array overflow problem
------------------------------------------------------------------------
r2 | jerry | 2013-08-17 20:40:43 +0530 (Sat, 17 Aug 2013) | 1 line

Initial commit
------------------------------------------------------------------------
r1 | jerry | 2013-08-04 23:43:08 +0530 (Sun, 04 Aug 2013) | 1 line

Create trunk, branches, tags directory structure
------------------------------------------------------------------------

Sekarang copy pekerjaan Jerry disinkronkan dengan repositori dan dia dapat dengan aman mengkomit perubahannya.

[jerry@CentOS trunk]$ svn commit -m "Add function to accept input and to display array contents"
Sending        trunk/array.c
Transmitting file data .
Committed revision 4.

Misalkan Jerry tidak sengaja mengubah file array.c dan dia mendapatkan kesalahan kompilasi. Sekarang dia ingin membuang perubahan. Dalam situasi ini, operasi 'kembalikan' akan membantu. Operasi pengembalian akan membatalkan perubahan lokal apa pun ke file atau direktori dan menyelesaikan semua status konflik.

[jerry@CentOS trunk]$ svn status

Perintah di atas akan menghasilkan hasil sebagai berikut.

M       array.c

Mari kita coba membuat array sebagai berikut:

[jerry@CentOS trunk]$ make array

Perintah di atas akan menghasilkan hasil sebagai berikut.

cc     array.c   -o array
array.c: In function ‘main’:
array.c:26: error: ‘n’ undeclared (first use in this function)
array.c:26: error: (Each undeclared identifier is reported only once
array.c:26: error: for each function it appears in.)
array.c:34: error: ‘arr’ undeclared (first use in this function)
make: *** [array] Error 1

Jerry melakukan operasi 'mengembalikan' pada file array.c .

[jerry@CentOS trunk]$ svn revert array.c 
Reverted 'array.c'

[jerry@CentOS trunk]$ svn status [jerry@CentOS trunk]$

Sekarang kompilasi kodenya.

[jerry@CentOS trunk]$ make array
cc     array.c   -o array

Setelah operasi pengembalian, copy pekerjaannya kembali ke keadaan semula. Operasi pengembalian dapat mengembalikan satu file serta direktori lengkap. Untuk mengembalikan direktori, gunakan opsi -R seperti yang ditunjukkan di bawah ini.

[jerry@CentOS project_repo]$ pwd
/home/jerry/project_repo

[jerry@CentOS project_repo]$ svn revert -R trunk

Sampai sekarang, kami telah melihat bagaimana mengembalikan perubahan, yang telah dibuat ke copy pekerjaan. Tetapi bagaimana jika Anda ingin mengembalikan revisi berkomitmen! Alat Sistem Kontrol Versi tidak mengizinkan untuk menghapus riwayat dari repositori. Kami hanya dapat menambahkan sejarah. Ini akan terjadi bahkan jika Anda menghapus file dari repositori. Untuk membatalkan revisi lama, kita harus membalikkan perubahan apa pun yang dibuat dalam revisi lama dan kemudian melakukan revisi baru. Ini disebut penggabungan terbalik.

Misalkan Jerry menambahkan kode untuk operasi pencarian linier. Setelah verifikasi dia melakukan perubahannya.

[jerry@CentOS trunk]$ svn diff
Index: array.c
===================================================================
--- array.c   (revision 21)
+++ array.c   (working copy)
@@ -2,6 +2,16 @@
 
 #define MAX 16
 
+int linear_search(int *arr, int n, int key)
+{
+   int i;
+
+   for (i = 0; i < n; ++i)
+      if (arr[i] == key)
+         return i;
+   return -1;
+}
+
 void bubble_sort(int *arr, int n)
 {
    int i, j, temp, flag = 1;

[jerry@CentOS trunk]$ svn status ? array M array.c [jerry@CentOS trunk]$ svn commit -m "Added code for linear search"
Sending        trunk/array.c
Transmitting file data .
Committed revision 22.

Jerry penasaran dengan apa yang dilakukan Tom. Jadi dia memeriksa pesan log Subversion.

[jerry@CentOS trunk]$ svn log

Perintah di atas akan menghasilkan hasil sebagai berikut.

------------------------------------------------------------------------
r5 | tom   | 2013-08-24 17:15:28 +0530 (Sat, 24 Aug 2013) | 1 line

Add binary search operation
------------------------------------------------------------------------
r4 | jerry | 2013-08-18 20:43:25 +0530 (Sun, 18 Aug 2013) | 1 line

Add function to accept input and to display array contents

Setelah melihat pesan log, Jerry menyadari bahwa dia melakukan kesalahan serius. Karena Tom sudah menerapkan operasi pencarian biner, yang lebih baik daripada pencarian linier; kodenya berlebihan, dan sekarang Jerry harus mengembalikan perubahannya ke revisi sebelumnya. Jadi, pertama-tama temukan revisi repositori saat ini. Saat ini, repositori ada di revisi 22 dan kita harus mengembalikannya ke revisi sebelumnya, yaitu revisi 21.

[jerry@CentOS trunk]$ svn up 
At revision 22.

[jerry@CentOS trunk]$ svn merge -r 22:21 array.c --- Reverse-merging r22 into 'array.c': U array.c [jerry@CentOS trunk]$ svn commit -m "Reverted to revision 21"
Sending        trunk/array.c
Transmitting file data .
Committed revision 23.

Tom memutuskan untuk menambahkan file README untuk proyek mereka. Jadi dia membuat file README dan menambahkan daftar TODO ke dalamnya. Setelah menambahkan ini, repositori file ada di revisi 6.

[tom@CentOS trunk]$ cat README /* TODO: Add contents in README file */ [tom@CentOS trunk]$ svn status
?       README

[tom@CentOS trunk]$ svn add README A README [tom@CentOS trunk]$ svn commit -m "Added README file. Will update it's content in future."
Adding         trunk/README
Transmitting file data .
Committed revision 6.

Jerry memeriksa kode terbaru yang ada di revisi 6. Dan segera dia mulai bekerja. Setelah beberapa jam, Tom memperbarui file README dan melakukan perubahannya. README yang telah dimodifikasi akan terlihat seperti ini.

[tom@CentOS trunk]$ cat README * Supported operations: 1) Accept input 2) Display array elements [tom@CentOS trunk]$ svn status
M       README

[tom@CentOS trunk]$ svn commit -m "Added supported operation in README"
Sending        trunk/README
Transmitting file data .
Committed revision 7.

Sekarang, repositori ada di revisi 7 dan copy pekerjaan Jerry kedaluwarsa. Jerry juga memperbarui file README dan mencoba melakukan perubahannya.

File README Jerry terlihat seperti ini.

[jerry@CentOS trunk]$ cat README 
* File list

1) array.c	Implementation of array operation.
2) README	Instructions for user.

[jerry@CentOS trunk]$ svn status M README [jerry@CentOS trunk]$ svn commit -m "Updated README"
Sending        trunk/README
svn: Commit failed (details follow):
svn: File or directory 'README' is out of date; try updating
svn: resource out of date; try updating

Langkah 1: Lihat Konflik

Subversion mendeteksi bahwa file README telah berubah sejak terakhir diperbarui. Jadi, Jerry harus memperbarui copy pekerjaannya.

[jerry@CentOS trunk]$ svn up
Conflict discovered in 'README'.
Select: (p) postpone, (df) diff-full, (e) edit,
        (mc) mine-conflict, (tc) theirs-conflict,
        (s) show all options:

Subversion mengeluh bahwa ada konflik dengan file README, dan Subversion tidak tahu bagaimana menyelesaikannya. Jadi Jerry memilih opsi df untuk meninjau konflik tersebut.

[jerry@CentOS trunk]$ svn up
Conflict discovered in 'README'.
Select: (p) postpone, (df) diff-full, (e) edit,
        (mc) mine-conflict, (tc) theirs-conflict,
        (s) show all options: df
--- .svn/text-base/README.svn-base	Sat Aug 24 18:07:13 2013
+++ .svn/tmp/README.tmp	Sat Aug 24 18:13:03 2013
@@ -1 +1,11 @@
-/* TODO: Add contents in README file */
+<<<<<<< .mine
+* File list
+
+1) array.c	Implementation of array operation.
+2) README	Instructions for user.
+=======
+* Supported operations:
+
+1) Accept input
+2) Display array elements
+>>>>>>> .r7
Select: (p) postpone, (df) diff-full, (e) edit, (r) resolved,
        (mc) mine-conflict, (tc) theirs-conflict,
        (s) show all options:

Langkah 2: Tunda Konflik

Selanjutnya Jerry memilih opsi tunda (p) , sehingga dia dapat menyelesaikan konflik tersebut.

Select: (p) postpone, (df) diff-full, (e) edit, (r) resolved,
        (mc) mine-conflict, (tc) theirs-conflict,
        (s) show all options: p
C    README
Updated to revision 7.
Summary of conflicts:
  Text conflicts: 1

Setelah membuka README di editor teks, dia menyadari bahwa Subversion telah memasukkan kode Tom dan kodenya dengan penanda konflik.

[jerry@CentOS trunk]$ cat README
<<<<<<< .min
* File list

1) array.c	Implementation of array operation.
2) README	Instructions for user.
=======
* Supported operations:

1) Accept input
2) Display array elements
>>>>>>> .r7

Jerry ingin perubahan Tom dan juga miliknya, jadi dia hanya menghapus baris yang mengandung penanda konflik.

Jadi, README yang dimodifikasi akan terlihat seperti ini.

[jerry@CentOS trunk]$ cat README
* File list

1) array.c	Implementation of array operation.
2) README	Instructions for user.

* Supported operations:

1) Accept input
2) Display array elements

Jerry menyelesaikan konflik dan dia mencoba lagi.

[jerry@CentOS trunk]$ svn commit -m "Updated README" svn: Commit failed (details follow): svn: Aborting commit: '/home/jerry/project_repo/trunk/README' remains in conflict [jerry@CentOS trunk]$ svn status
?       README.r6
?       README.r7
?       README.mine
C       README

Langkah 3: Selesaikan Konflik

Di komit di atas, surat itu Cmenunjukkan bahwa ada konflik dalam file README. Jerry menyelesaikan konflik tersebut tetapi tidak memberi tahu Subversion bahwa dia telah menyelesaikan konflik tersebut. Dia menggunakan perintah tekad untuk menginformasikan Subversion tentang resolusi konflik.

[jerry@CentOS trunk]$ svn resolve --accept=working README Resolved conflicted state of 'README' [jerry@CentOS trunk]$ svn status
M       README

[jerry@CentOS trunk]$ svn commit -m "Updated README"
Sending        trunk/README
Transmitting file data .
Committed revision 8.

Sistem Kontrol Versi mendukung operasi tag dengan menggunakan konsep yang dapat memberikan nama yang bermakna ke versi kode tertentu. Tag memungkinkan untuk memberikan nama yang deskriptif dan mudah diingat ke versi kode tertentu. Sebagai contohBASIC_ARRAY_OPERATIONS lebih berkesan dari revision 4.

Mari kita lihat operasi tag dengan sebuah contoh. Tom memutuskan untuk membuat tag sehingga dia dapat mengakses kode dengan lebih mudah.

[tom@CentOS project_repo]$ svn copy --revision=4 trunk/ tags/basic_array_operations

Perintah di atas akan menghasilkan hasil sebagai berikut.

A    tags/basic_array_operations/array.c
Updated to revision 4.
A         tags/basic_array_operations

Setelah berhasil diselesaikan, direktori baru akan dibuat di dalam direktori tag .

[tom@CentOS project_repo]$ ls -l tags/
total 4
drwxrwxr-x. 3 tom tom 4096 Aug 24 18:18 basic_array_operations

Tom ingin memeriksanya kembali sebelum berkomitmen. Operasi status menunjukkan bahwa operasi tag berhasil, sehingga dia dapat melakukan perubahannya dengan aman.

[tom@CentOS project_repo]$ svn status
A  +    tags/basic_array_operations

[tom@CentOS project_repo]$ svn commit -m "Created tag for basic array operations"
Adding         tags/basic_array_operations

Committed revision 5.

Operasi cabang menciptakan jalur pengembangan lain. Ini berguna ketika seseorang ingin proses pengembangan terbagi menjadi dua arah yang berbeda. Misalkan Anda telah merilis produk versi 1.0, Anda mungkin ingin membuat cabang baru sehingga pengembangan 2.0 dapat disimpan terpisah dari perbaikan bug 1.0.

Pada bagian ini, kita akan melihat cara membuat, melintasi dan menggabungkan cabang. Jerry tidak senang karena konflik tersebut, jadi dia memutuskan untuk membuat cabang pribadi baru.

[jerry@CentOS project_repo]$ ls
branches  tags  trunk

[jerry@CentOS project_repo]$ svn copy trunk branches/jerry_branch A branches/jerry_branch [jerry@CentOS project_repo]$ svn status
A  +    branches/jerry_branch

[jerry@CentOS project_repo]$ svn commit -m "Jerry's private branch" Adding branches/jerry_branch Adding branches/jerry_branch/README Committed revision 9. [jerry@CentOS project_repo]$

Sekarang Jerry bekerja di cabang pribadinya. Dia menambahkan operasi pengurutan untuk array. Kode modifikasi Jerry terlihat seperti ini.

[jerry@CentOS project_repo]$ cd branches/jerry_branch/ [jerry@CentOS jerry_branch]$ cat array.c

Perintah di atas akan menghasilkan hasil sebagai berikut.

#include <stdio.h>
#define MAX 16

void bubble_sort(int *arr, int n)
{
   int i, j, temp, flag = 1;
   for (i = 1; i < n && flag == 1; ++i) {
      flag = 0;
      for (j = 0; j < n - i; ++j) {
         if (arr[j] > arr[j + 1]) {
            flag = 1;
            temp = arr[j];
            arr[j] = arr[j + 1];
            arr[j + 1] = temp;
         }
      }
   }
}

void accept_input(int *arr, int n)
{
   int i;

   for (i = 0; i < n; ++i) 
   scanf("%d", &arr[i]);
}

void display(int *arr, int n)
{
   int i;

   for (i = 0; i < n; ++i)
   printf("|%d| ", arr[i]);

   printf("\n");
}

int main(void)
{
   int i, n, key, ret, arr[MAX];

   printf("Enter the total number of elements: ");
   scanf("%d", &n);

   /* Error handling for array overflow */
   if (n >MAX) {
      fprintf(stderr, "Number of elements must be less than %d\n", MAX);
      return 1;
   }

   printf("Enter the elements\n");
   accept_input(arr, n);

   printf("Array has following elements\n");
   display(arr, n);

   printf("Sorted data is\n");
   bubble_sort(arr, n);
   display(arr, n);

   return 0;
}

Jerry menyusun dan menguji kodenya dan siap untuk melakukan perubahannya.

[jerry@CentOS jerry_branch]$ make array cc array.c -o array [jerry@CentOS jerry_branch]$ ./array

Perintah di atas akan menghasilkan hasil sebagai berikut.

Enter the total number of elements: 5
Enter the elements
10
-4
2
7 
9
Array has following elements
|10| |-4| |2| |7| |9| 
Sorted data is
|-4| |2| |7| |9| |10| 

[jerry@CentOS jerry_branch]$ svn status ? array M array.c [jerry@CentOS jerry_branch]$ svn commit -m "Added sort operation"
Sending        jerry_branch/array.c
Transmitting file data .
Committed revision 10.

Sementara itu, di bagasi, Tom memutuskan untuk menerapkan operasi pencarian. Tom menambahkan kode untuk operasi pencarian dan kodenya terlihat seperti ini.

[tom@CentOS trunk]$ svn diff

Perintah di atas akan menghasilkan hasil sebagai berikut.

Index: array.c
===================================================================
--- array.c   (revision 10)
+++ array.c   (working copy)
@@ -2,6 +2,27 @@
 
 #define MAX 16
 
+int bin_search(int *arr, int n, int key)
+{
+   int low, high, mid;
+
+   low   = 0;
+   high   = n - 1;
+   mid   = low + (high - low) / 2;
+
+   while (low <= high) {
+      if (arr[mid] == key)
+         return mid;
+      if (arr[mid] > key)
+         high = mid - 1;
+      else
+         low = mid + 1;
+      mid = low + (high - low) / 2;
+   }
+
+   return -1;
+}
+
 void accept_input(int *arr, int n)
 {
    int i;
@@ -22,7 +43,7 @@
 
 int main(void)
 {
-   int i, n, arr[MAX];
+   int i, n, ret, key, arr[MAX];
 
    printf("Enter the total number of elements: ");
    scanf("%d", &n);
@@ -39,5 +60,16 @@
    printf("Array has following elements\n");
    display(arr, n);
 
+   printf("Enter the element to be searched: ");
+   scanf("%d", &key);
+
+   ret = bin_search(arr, n, key);
+   if (ret < 0) {
+      fprintf(stderr, "%d element not present in array\n", key);
+      return 1;
+   }
+
+   printf("%d element found at location %d\n", key, ret + 1);
+
    return 0;
 }

Setelah meninjau, dia melakukan perubahannya.

[tom@CentOS trunk]$ svn status
?       array
M       array.c

[tom@CentOS trunk]$ svn commit -m "Added search operation"
Sending        trunk/array.c
Transmitting file data .
Committed revision 11.

Tapi Tom penasaran dengan apa yang telah dilakukan Jerry di cabang pribadinya.

[tom@CentOS trunk]$ cd ../branches/
[tom@CentOS branches]$ svn up A jerry_branch A jerry_branch/array.c A jerry_branch/README [tom@CentOS branches]$ svn log
------------------------------------------------------------------------
r9 | jerry | 2013-08-27 21:56:51 +0530 (Tue, 27 Aug 2013) | 1 line

Added sort operation
------------------------------------------------------------------------

Dengan melihat pesan log Subversion, Tom menemukan bahwa Jerry menerapkan operasi 'sort'. Tom mengimplementasikan operasi pencarian menggunakan algoritma pencarian biner, ia selalu mengharapkan data dalam urutan yang diurutkan. Tetapi bagaimana jika pengguna memberikan data dalam urutan yang tidak diurutkan? Dalam situasi tersebut, operasi pencarian biner akan gagal. Jadi dia memutuskan untuk mengambil kode Jerry untuk mengurutkan data sebelum operasi pencarian. Jadi dia meminta Subversion untuk menggabungkan kode dari cabang Jerry ke dalam trunk.

[tom@CentOS trunk]$ pwd /home/tom/project_repo/trunk [tom@CentOS trunk]$ svn merge ../branches/jerry_branch/
--- Merging r9 through r11 into '.':
U    array.c

Setelah penggabungan, array.c akan terlihat seperti ini.

[tom@CentOS trunk]$ cat array.c

Perintah di atas akan menghasilkan hasil sebagai berikut.

#include <stdio.h>
#define MAX 16

void bubble_sort(int *arr, int n)
{
   int i, j, temp, flag = 1;

   for (i = 1; i < n && flag == 1; ++i) {
      flag = 0;
      for (j = 0; j < n - i; ++j) {
         if (arr[j] > arr[j + 1]) {
            flag      	= 1;
            temp      	= arr[j];
            arr[j]      = arr[j + 1];
            arr[j + 1]	= temp;
         }
      }
   }
}

int bin_search(int *arr, int n, int key)
{
   int low, high, mid;

   low   = 0;
   high  = n - 1;
   mid   = low + (high - low) / 2;

   while (low <= high) {
      if (arr[mid] == key)
         return mid;
      if (arr[mid] > key)
         high = mid - 1;
      else
         low = mid + 1;
      mid = low + (high - low) / 2;
   }
   return -1;
}

void accept_input(int *arr, int n)
{
   int i;

   for (i = 0; i < n; ++i)
      scanf("%d", &arr[i]);
}

void display(int *arr, int n)
{
   int i;
   for (i = 0; i < n; ++i)
      printf("|%d| ", arr[i]);
   printf("\n");
}

int main(void)
{
   int i, n, ret, key, arr[MAX];

   printf("Enter the total number of elements: ");
   scanf("%d", &n);

   /* Error handling for array overflow */
   if (n > MAX) {
      fprintf(stderr, "Number of elements must be less than %d\n", MAX);
      return 1;
   }

   printf("Enter the elements\n");
   accept_input(arr, n);

   printf("Array has following elements\n");
   display(arr, n);

   printf("Sorted data is\n");
   bubble_sort(arr, n);
   display(arr, n);

   printf("Enter the element to be searched: ");
   scanf("%d", &key);

   ret = bin_search(arr, n, key);
   if (ret < 0) {
      fprintf(stderr, "%d element not present in array\n", key);
      return 1;
   }

   printf("%d element found at location %d\n", key, ret + 1);

   return 0;
}

Setelah kompilasi dan pengujian, Tom melakukan perubahannya ke repositori.

[tom@CentOS trunk]$ make array
cc     array.c   -o array

[tom@CentOS trunk]$ ./array Enter the total number of elements: 5 Enter the elements 10 -2 8 15 3 Array has following elements |10| |-2| |8| |15| |3| Sorted data is |-2| |3| |8| |10| |15| Enter the element to be searched: -2 -2 element found at location 1 [tom@CentOS trunk]$ svn commit -m "Merge changes from Jerry's code"
Sending        trunk
Sending        trunk/array.c
Transmitting file data .
Committed revision 12.

[tom@CentOS trunk]$