\documentclass[hyperref={colorlinks=true}]{beamer}
\usepackage[spanish]{babel}
\usepackage{graphicx}
\parskip 10.9pt

\usetheme{CambridgeUS}
\title{Sistemas de Control de Versiones}
\author[rmayorga]{Ren\'e Mayorga \\ \texttt{rmayorga@debian.org}}
\institute{Comunidad de usuarios Debian de El Salvador}


\begin{document}

\begin{frame}
	\titlepage
\end{frame}

\begin{frame}{Esquema}
	\tableofcontents
\end{frame}

\section{Introducci\'on}
\begin{frame}[fragile]
\frametitle{?`Qu\'e es un sistema de control de versiones?}
	\centering
	?`Ideas?

	\pause
	\centering
	?`Quien usa sistemas de control de versiones aqui?

	\pause
	\centering
	?`Cuales?

	\pause
	\centering
\end{frame}


\section{Conceptos}
\begin{frame}
\frametitle{Un par de conceptos}
	\centering
	\begin{itemize}
		\pause
		\item \alert{CVS}, o Control Versions System es el concepto
			detras de todo el tema.
			Un Control de Versiones es una manera ordenada de mantener
			un rastro de modificaciones y almacenar versiones y revisiones
			especificas.
		\pause
		\item \alert{Repositorio}, Es el lugar donde se almacena el c\'odigo fuente
			por lo general este es accesible a todos los usuarios que colaboran
			o que siguen el desarrollo.
		\pause
		\item \alert{CheckOut}, es la acción de desbloquear una copia de trabajo
			por lo general, esta copia se almacena en el equipo local.
	\end{itemize}
\end{frame}
\begin{frame}
\frametitle{Un par de conceptos}
	\centering
	\begin{itemize}
		\item \alert{Tag}, es una copia exacta de una versi\'on especifica, es decir,
			esta versi\'on esta \alert{liberada} y no sufrira m\'as cambios.
		\pause
		\item \alert{trunk/master}, esta es la rama principal de desarrollo
			por lo general todo el desarrollo de un proyecto se lleva a cabo
			sobre esta rama.
		\pause
		\item \alert{branch}, o ramas, son bifurcaciones del proyecto, estan puden
			llevar un nuevo feature, o caracterisitcas totalmente inestables
			destinadas a pruebas de concepto, o un desarrollo especifico con
		  	fines especificos.
		\pause
		\item \alert{commit}, o push, es la acci\'on de enviar cambios locales al
			servidor.
	\end{itemize}
\end{frame}

\begin{frame}
\frametitle{Distribuidos y centralizados}
	\centering
	\begin{itemize}
		\item \alert{Centralizados}, son aquellos sistemas de control de versiones
		donde la informaci\'on es administrada y mantenida en un repositorio
		central haciendo imperatia la necesidad de tener siempre un enlace disponible
		para tareas como la creaci\'on de tags o brances.
		
		\pause

		\item \alert{Distribuidos}, con este esquema el servidor b\'asicamente
		solo mantiene una copia del repositorio, pero cada equipo se convierte en 
		un \alert{repositorio}, permitiendo f\'acilmente la bifurcaci\'on en ramas
		y el manejo del repositorio de una manera m\'as flexible.
	\end{itemize}
\end{frame}

\section{SVN}
\begin{frame}
\frametitle{vamos al grano, SVN}
	\centering
	\alert{SVN} es conocido as\'i por ser el nombre del cliente, el software
	en si es llamado \alert{subversion}.

	\pause
	\centering
	Este es un sistema de control de versiones centralizado, fue dise\~nado como
	reemplazo de CVS,
	\pause

	\centering
	?`Alguien uso CVS?

	\pause
	\centering
	?`Alguien uso SVN?
\end{frame}

\begin{frame}
\frametitle{SVN}
	
	\centering
	Veamos un par de comandos
\end{frame}

\begin{frame}[fragile]
\frametitle{creando el repositorio}
	\centering
	Necesitamos instalar un par de paquetes
	
	\pause
	\begin{verbatim}
		apt-get install subversion
	\end{verbatim}

	\centering 
	esto instalara el cliente de subversion y las herramientas
	necesarias.
	Luego podemos crear un repositorio local.

	\pause
	\begin{verbatim}
		@tepitzin:/tmp/svn $ svnadmin create repositorio
	\end{verbatim}
	\pause
	\centering
	Si somos curioso y examinamos el contenido del directorio podremos
	notar que son ciertos archivos y directorios que contendran el
	repositorio.
\end{frame}

\begin{frame}[fragile]
\frametitle{SVN}
	\centering
	Ahora necesitamos hacer un \alert{checkout} de nuestro repositorio
	\pause
	\centering
	\begin{verbatim}
		@tepitzin:~/temp $ svn co file:///tmp/svn/repositorio repo
		Revisión obtenida: 0
	\end{verbatim}

	\pause

	\centering
	Con esto tenemos nuestro rep sincronizado en el directorio \alert{repo}
\end{frame}

\begin{frame}
\frametitle{SVN}
	\centering
	Veamos que paso aqu\'i
	\pause
	\begin{itemize}
		\item \alert{revisi\'on}, si observamos, nuestro cliente \alert{svn}
		nos devolvio un mensaje, comentandonos que se obtuvo la revisi\'on 
		\alert{0}.
		SVN usa estos n\'umeros de revisiones para llevar el control de los cambios
		estos n\'umeros son enteros secuenciales, y una revisi\'on aplica
		a \alert{todos} los ficheros y directorios de nuestro repositorio.
		\pause
		\item \alert{El directorio esta vacio!}, y es que no existe una infraestructura
		de desarrollo todav\'ia, nosotros necesitamos crearla, b\'asicamente crear los directorios.
	\end{itemize}
\end{frame}

\begin{frame}
\frametitle{SVN y la estructura de directorios}
	\centering
	Bueno, vamos con los directorios.
	por lo general, necesitarmos un \alert{trunk}, un directorio
	para nuestros \alert{tags} y posiblemente un directorio para
	los \alert{branches}
\end{frame}

\begin{frame}[fragile]
\frametitle{SVN}
	\centering
	Los directorios una vez hagamos el \alert{checkout} simplemente
	necesitamos crearlos, con un simple vulgar y silvestre \alert{mkdir}.
	es f\'acil
	
	\pause


	\begin{verbatim}
		 mkdir trunk tags branches
	\end{verbatim}


	\pause
	
	Ya explicamos que era eso de branches, trunk y tags
	
	\pause
       
       ?`Alguien se acuerda?
\end{frame}

\begin{frame}[fragile]
\frametitle{SVN}
	\centering
	Hora de hacer nuestro primer commit
	\pause
	
	Para comenzar a llevar \alert{tracking} 
	de los archivos, necesitamos agregarlos
	para usamos \alert{svn add}

	\begin{verbatim}
		@tepitzin:~/temp/repo $ svn add branches tags trunk
		A         branches
		A         tags
		A         trunk
		@tepitzin:~/temp/repo $ 
	\end{verbatim}
\end{frame}

\begin{frame}[fragile]
\frametitle{SVN}
	\centering
	Ahora hacemos el primer commit al repositorio
	\begin{verbatim}
		@tepitzin:~/temp/repo $ svn ci -m "creando la estructura" 
		Añadiendo      branches
		Añadiendo      tags
		Añadiendo      trunk

		Commit de la revisión 1.
	\end{verbatim}
	\pause
	\centering
	Si notamos la revisi\'on cambio, ahora es \alert{1}
\end{frame}

\begin{frame}
\frametitle{SVN}
	\centering
	Ok, olvidemos un segundo de los slides y vamos a hacerlo practico
	\pause

	recordemos, es un taller :)
\end{frame}

\section{recapitulemos SVN}
\begin{frame}
\frametitle{SVN - terminando}
	\centering
	\begin{itemize}
		\item \alert{svn co}
		\pause
		\item \alert{svn up}
		\pause
		\item \alert {svn add/rm/mv/mkdir}
		\pause
		\item \alert {svn ci}
		\pause
		\item \alert {svn status}
		\pause
		\item \alert {svn diff}
		\pause
		\item \alert {svn log}
		\pause
		\item \alert {svn blame}
	\end{itemize}
\end{frame}

\section{Git}
\begin{frame}
\frametitle{Git}
	\centering
	\alert{git} es un sistema de control de versiones distribuido
	escrito originalmente por Linus Torvalds, actualmente es uno
	de los sistemas de control de versiones m\'as populares que existen
\end{frame}

\begin{frame}[fragile]
\frametitle{git}
	\centering
	Ok, creamos un repo, pero primero, le decimos a git
	\alert{quien soy}

	\pause
	\begin{verbatim}
		[~]$ git config --global user.name "Rene Mayorga"
		[~]$ git config --global user.email rmayorga@debian.org
	\end{verbatim}
\end{frame}

\begin{frame}[fragile]
	\centering
	Ahora si, a crear el repo
	\pause
	\begin{verbatim}
		@tepitzin:/tmp/repo $ git init 
		Initialized empty Git repository in /tmp/repo/.git/
	\end{verbatim}
	\pause

	\centering
	Con esto estamos listos, podemos agregar archivos
	con \alert{git add}, y luego a hacer commits con
	\alert{git commit}
\end{frame}


\begin{frame}
\frametitle{git}
	\centering
	dejemonos de slides y pasemos a jugar con git
\end{frame}

\begin{frame}
\frametitle{recapitulando git}
	\centering
	\begin{itemize}
		\item \alert{git init}
		\pause
		\item \alert{git branch}
		\pause
		\item \alert{git log}
		\pause
		\item \alert{git merge}
		\pause
		\item \alert{git status}
		\pause
		\item \alert{git commit}
		\pause
		\item \alert{git pull}
		\pause
		\item \alert{git push}
		\pause
		\item \alert{git checkout}
		\pause
		\item \alert{git add/rm/mv}
	\end{itemize}
\end{frame}
\end{document}
