SVN - Ramificación

La operación de sucursales crea otra línea de desarrollo. Es útil cuando alguien quiere que el proceso de desarrollo se bifurque en dos direcciones diferentes. Supongamos que ha lanzado un producto de la versión 1.0, es posible que desee crear una nueva rama para que el desarrollo de 2.0 pueda mantenerse separado de las correcciones de errores de 1.0.

En esta sección, veremos cómo crear, atravesar y fusionar ramas. Jerry no está contento por el conflicto, por lo que decide crear una nueva sucursal privada.

[[email protected] project_repo]$ ls
branches  tags  trunk

[[email protected] project_repo]$ svn copy trunk branches/jerry_branch
A         branches/jerry_branch

[[email protected] project_repo]$ svn status
A  +    branches/jerry_branch

[[email protected] project_repo]$ svn commit -m "Jerry's private branch"
Adding         branches/jerry_branch
Adding         branches/jerry_branch/README

Committed revision 9.
[[email protected] project_repo]$

Ahora Jerry trabaja en su sucursal privada. Agrega la operación de clasificación para la matriz. El código modificado de Jerry se ve así.

[[email protected] project_repo]$ cd branches/jerry_branch/

[[email protected] jerry_branch]$ cat array.c

El comando anterior producirá el siguiente resultado.

#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 compila y prueba su código y está listo para realizar sus cambios.

[[email protected] jerry_branch]$ make array
cc     array.c   -o array

[[email protected] jerry_branch]$ ./array

El comando anterior producirá el siguiente resultado.

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| 

[[email protected] jerry_branch]$ svn status
?       array
M       array.c

[[email protected] jerry_branch]$ svn commit -m "Added sort operation"
Sending        jerry_branch/array.c
Transmitting file data .
Committed revision 10.

Mientras tanto, en el maletero, Tom decide implementar la operación de búsqueda. Tom agrega código para la operación de búsqueda y su código se ve así.

[[email protected] trunk]$ svn diff

El comando anterior producirá el siguiente resultado.

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;
 }

Después de revisar, confirma sus cambios.

[[email protected] trunk]$ svn status
?       array
M       array.c

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

Pero Tom siente curiosidad por saber qué ha estado haciendo Jerry en su sucursal privada.

[[email protected] trunk]$ cd ../branches/
[[email protected] branches]$ svn up
A    jerry_branch
A    jerry_branch/array.c
A    jerry_branch/README

[[email protected] branches]$ svn log
------------------------------------------------------------------------
r9 | jerry | 2013-08-27 21:56:51 +0530 (Tue, 27 Aug 2013) | 1 line

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

Al ver el mensaje de registro de Subversion, Tom descubrió que Jerry implementó la operación de 'ordenar'. Tom implementó la operación de búsqueda usando un algoritmo de búsqueda binaria, siempre espera datos en orden ordenado. Pero, ¿y si el usuario proporciona datos en un orden no clasificado? En esa situación, la operación de búsqueda binaria fallará. Entonces decide tomar el código de Jerry para ordenar los datos antes de la operación de búsqueda. Entonces le pide a Subversion que fusione el código de la rama de Jerry en el tronco.

[[email protected] trunk]$ pwd
/home/tom/project_repo/trunk

[[email protected] trunk]$ svn merge ../branches/jerry_branch/
--- Merging r9 through r11 into '.':
U    array.c

Después de fusionar, array.c se verá así.

[[email protected] trunk]$ cat array.c

El comando anterior producirá el siguiente resultado.

#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;
}

Después de la compilación y la prueba, Tom confirma sus cambios en el repositorio.

[[email protected] trunk]$ make array
cc     array.c   -o array

[[email protected] 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

[[email protected] trunk]$ svn commit -m "Merge changes from Jerry's code"
Sending        trunk
Sending        trunk/array.c
Transmitting file data .
Committed revision 12.

[[email protected] trunk]$