jueves, 13 de noviembre de 2014

Java: Hibernate 4 - Session Filter with Spring MVC

Configuracion de Filtro de Session de Hibernate en Spring


Cuando configuramos Hibernate en Spring (Configuring OpenSessionInViewFilter with Hibernate 4 and Spring 4 -Spring MVC-.) necesitamos configurar un filtro de SessionFactory para no encontrarnos con el problema de LazyInitializationException.


Problema:


Error reading org.hibernate.LazyInitializationException: could not initialize proxy - no Session
Estado HTTP 500 - javax.el.ELException: Error reading 'atributoField' en el tipo MY.CLASS.OBJECT_INSTANCE_$$_jvst41b_2
type Informe de Excepción
mensaje javax.el.ELException: Error reading 'atributoField' en el tipo MY.CLASS.OBJECT_INSTANCE_$$_jvst41b_2
descripción El servidor encontró un error interno que hizo que no pudiera rellenar este requerimiento.
excepción
org.apache.jasper.JasperException: javax.el.ELException: Error reading 'atributoField' en el tipo MY.CLASS.OBJECT_INSTANCE_$$_jvst41b_2
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:549)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:470)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:395)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:339)
javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:209)
org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:267)
org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1217)
org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1005)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:952)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)
javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
causa raíz

javax.el.ELException: Error reading 'atributoField' en el tipo MY.CLASS.OBJECT_INSTANCE_$$_jvst41b_2
javax.el.BeanELResolver.getValue(BeanELResolver.java:110)
org.apache.jasper.el.JasperELResolver.getValue(JasperELResolver.java:104)
org.apache.el.parser.AstValue.getValue(AstValue.java:183)
org.apache.el.parser.AstEmpty.getValue(AstEmpty.java:46)
org.apache.el.parser.AstNot.getValue(AstNot.java:43)
org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:184)
org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:967)
org.apache.jsp.WEB_002dINF.view.person_jsp._jspx_meth_c_005fif_005f0(person_jsp.java:256)
org.apache.jsp.WEB_002dINF.view.person_jsp._jspx_meth_form_005fform_005f0(person_jsp.java:184)
org.apache.jsp.WEB_002dINF.view.person_jsp._jspService(person_jsp.java:114)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:395)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:339)
javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:209)
org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:267)
org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1217)
org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1005)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:952)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)
javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
causa raíz

org.hibernate.LazyInitializationException: could not initialize proxy - no Session
org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:165)
org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:286)
org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:185)
MY.CLASS.OBJECT_INSTANCE_$$_jvst41b_2.getatributoField(Person_$$_jvst41b_2.java)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:606)
javax.el.BeanELResolver.getValue(BeanELResolver.java:99)
org.apache.jasper.el.JasperELResolver.getValue(JasperELResolver.java:104)
org.apache.el.parser.AstValue.getValue(AstValue.java:183)
org.apache.el.parser.AstEmpty.getValue(AstEmpty.java:46)
org.apache.el.parser.AstNot.getValue(AstNot.java:43)
org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:184)
org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:967)
org.apache.jsp.WEB_002dINF.view.person_jsp._jspx_meth_c_005fif_005f0(person_jsp.java:256)
org.apache.jsp.WEB_002dINF.view.person_jsp._jspx_meth_form_005fform_005f0(person_jsp.java:184)
org.apache.jsp.WEB_002dINF.view.person_jsp._jspService(person_jsp.java:114)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:395)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:339)
javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:209)
org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:267)
org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1217)
org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1005)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:952)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)
javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
nota La traza completa de la causa de este error se encuentra en los archivos de diario de Apache Tomcat/7.0.56.


Solución:

La solución es agregar una definición de un filtro en el archivo de configuración web.xml como sigue:


<!-- Spring Open Session In View Pattern filter -->
<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
<init-param>
<param-name>singleSession</param-name>
<param-value>true</param-value>
</init-param>
                <!-- Hibernate 4 SessionFactory Bean (reference) -->
<init-param>
<param-name>sessionFactoryBeanName</param-name>
<param-value>hibernate4AnnotatedSessionFactory</param-value>
</init-param>
</filter>

<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

 Y tener configurado una definición de Hibernate 4 SessionFactory Bean en el archivo de configuración application-config.xml (o applicationContext.xml) como sigue:

<!-- Hibernate 4 SessionFactory Bean (definition) -->
<beans:bean id="hibernate4AnnotatedSessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<beans:property name="dataSource" ref="dataSource" />
<beans:property name="annotatedClasses">
<beans:list>
<beans:value>com.daro.rental.housing.model.PersonTable</beans:value>
<beans:value>com.daro.rental.housing.model.HouseTable</beans:value>
</beans:list>
</beans:property>
<beans:property name="hibernateProperties">
<beans:props>
<beans:prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect
</beans:prop>
<beans:prop key="hibernate.show_sql">true</beans:prop>
</beans:props>
</beans:property>
</beans:bean>


Referencias:

-Configurar el filtro de SessionFactory: http://cchweblog.wordpress.com/2009/10/10/using-opensessioninviewfilter-in-spring-web-application/
-Crear mi propio filtro de SessionFactory: http://programacionspring.blogspot.com.ar/2012/01/configuracion-hibernate-en-spring.html





miércoles, 12 de noviembre de 2014

Java: Install Maven on Ubuntu 12



sudo apt-get install maven
mvn -version
Apache Maven 3.0.4
Maven home: /usr/share/maven
Java version: 1.7.0_71, vendor: Oracle Corporation
Java home: /usr/lib/jvm/jdk1.7.0_71/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.2.0-69-generic", arch: "amd64", family: "unix"

Probar en eclipse:

Crear un Maven Project.
Si al crear un proyecto Maven en eclipse nos sale este error: "Could not resolve archetype org.apache.maven.archetypes:maven-archetype-quickstart:RELEASE from any of the configured repositories"

Podemos ir a Windows-Preference-Maven-UserSettings y agregar el el archivo setting.xml: /etc/maven/settings.xml

Tambien podemos editar el proxy (colocando la informacion necesaria) si fuera necesario editando /etc/maven/settings.xml:
     <proxy>
      <id>optional</id>
      <active>true</active>
      <protocol>http</protocol>
      <username>dario</username>
      <password>pass</password>
      <host>proxy.corp.daro.com</host>
      <port>1232</port>
      <nonProxyHosts>local.net|some.host.com</nonProxyHosts>
    </proxy>

Y agregar:

<mirror>
  <id>ibiblio.org</id>
  <url>http://mirrors.ibiblio.org/maven2</url>
  <mirrorOf>central</mirrorOf>
</mirror>


To Remove:

sudo apt-get remove maven
sudo apt-get purge maven

martes, 11 de noviembre de 2014

Java: How to Install Tomcat 7 on Ubuntu 12.10 - Guide

Instalar Tomcat 7 sobre Ubuntu 12

Download and install:


Download from zip: http://tomcat.apache.org/download-70.cgi

tar xvzf apache-tomcat-7.0.8.tar.gz
sudo mv apache-tomcat-7.0.8/ /usr/share/tomcat7
#sudo geany /etc/environment
#sudo nano /etc/environment
sudo vim /etc/environment
JAVA_HOME="/usr/lib/jvm/jdk1.7.0_71"
JRE_HOME="/usr/lib/jvm/jdk1.7.0_71/jre"

sudo vim /usr/share/tomcat7/bin/catalina.sh
#insert the JAVA_HOME and JRE_HOME after the first line
JAVA_HOME="/usr/lib/jvm/jdk1.7.0_71"
JRE_HOME="/usr/lib/jvm/jdk1.7.0_71/jre"

Configure Users:

sudo geany /usr/share/tomcat7/conf/tomcat-users.xml
#Add user into file tomcat-users.xml
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="manager"/>
<role rolename="admin-gui"/>
<role rolename="admin-script"/>
<role rolename="admin"/>
<user username="usuario" password="contrasena" roles="manager-gui,admin-gui,manager,admin,manager-script,admin-script"/>

Configure Bash:

#Add in .bashrc :
export CATALINA_HOME=/usr/share/tomcat7
export WEBAPPS_HOME=/usr/share/tomcat7/webapps
alias tomcat_start='sudo /usr/share/tomcat7/bin/startup.sh'
alias tomcat_stop='sudo /usr/share/tomcat7/bin/shutdown.sh'

Start and stop:


#Start server:
#sudo /usr/share/tomcat7/bin/startup.sh
tomcat_start

#Web Test:
http://127.0.0.1:8080/

#Stop server:
#sudo /usr/share/tomcat7/bin/shutdown.sh
tomcat_stop

See the version:

$CATALINA_HOME/bin/version.sh

Using CATALINA_BASE:   /usr/share/tomcat7
Using CATALINA_HOME:   /usr/share/tomcat7
Using CATALINA_TMPDIR: /usr/share/tomcat7/temp
Using JRE_HOME:        /usr/lib/jvm/jdk1.7.0_71/jre
Using CLASSPATH:       /usr/share/tomcat7/bin/bootstrap.jar:/usr/share/tomcat7/bin/tomcat-juli.jar
Server version: Apache Tomcat/7.0.56
Server built:   Sep 26 2014 12:08:24
Server number:  7.0.56.0
OS Name:        Linux
OS Version:     3.2.0-69-generic
Architecture:   amd64
JVM Version:    1.7.0_71-b14
JVM Vendor:     Oracle Corporation

View Status:


ps -A | grep java
3453 pts/0    00:00:04 java
(Nota: para matar el proceso podemos usar: kill -9 3453)

ps -ax | grep tomcat7
Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html
3936 pts/0    Sl     0:04 /usr/lib/jvm/jdk1.7.0_71/jre/bin/java -Djava.util.logging.config.file=/usr/share/tomcat7/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -server -Xms1024m -Xmx1024m -XX:MaxPermSize=1024m -XX:MaxNewSize=128m -XX:NewSize=128m -XX:SurvivorRatio=128 -XX:MaxTenuringThreshold=0 -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:+CMSIncrementalPacing -XX:+CMSClassUnloadingEnabled -XX:+DisableExplicitGC -XX:+UseParNewGC -XX:+UseTLAB -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv4Addresses -Dgrails.env=prod -Dspring.profiles.active=prod -Dport-offset=0 -Djboss.socket.binding.port-offset=0 -Dajp.port=8009 -Djboss.http.port=8080 -Dhttp.maxthreads=1000 -Dshutdown.port=8005 -Dcom.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true -Djava.endorsed.dirs=/usr/share/tomcat7/endorsed -classpath /usr/share/tomcat7/bin/bootstrap.jar:/usr/share/tomcat7/bin/tomcat-juli.jar -Dcatalina.base=/usr/share/tomcat7 -Dcatalina.home=/usr/share/tomcat7 -Djava.io.tmpdir=/usr/share/tomcat7/temp org.apache.catalina.startup.Bootstrap start
3979 pts/0    S+     0:00 grep --color=auto tomcat7

sudo netstat -tapen | grep ":8080 "
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      0          30018       3565/java

Web Admin:


(Nota: put the user and pass located into tomcat-users.xml)


References:
http://diegobenna.blogspot.com.ar/2011/01/install-tomcat-7-in-ubuntu-1010.html
http://www.liquidweb.com/kb/how-to-install-apache-tomcat-7-on-ubuntu-12-04/

lunes, 10 de noviembre de 2014

Java: Install JDK 7 on Ubuntu


Installing java-7-oracle apt-get 


sudo apt-get install python-software-properties
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java7-installer
sudo apt-get install oracle-java7-set-default

sudo vim /etc/environment
Agregar: JAVA_HOME="/usr/lib/jvm/java-7-oracle"
O hacer:
export JAVA_HOME=/usr/lib/jvm/java-7-oracle

Installing jdk1.7.0_71 from tar.gz


wget http://download.oracle.com/otn-pub/java/jdk/7u71-b14/jdk-7u71-linux-x64.tar.gz
#Download from: http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html
sudo mv jdk-7u71-linux-x64.tar.gz /usr/lib/jvm/
cd /usr/lib/jvm/
sudo tar zxvf jdk-7u71-linux-x64.tar.gz
sudo rm jdk-7u71-linux-x64.tar.gz
#Now enable Java (by running individually):
sudo update-alternatives --config java
There are 2 choices for the alternative java (providing /usr/bin/java).

  Selection    Path                                     Priority   Status
------------------------------------------------------------
  0            /usr/lib/jvm/java-7-oracle/jre/bin/java   2         auto mode
* 1            /usr/lib/jvm/java-7-oracle/jre/bin/java   2         manual mode
  2            /usr/lib/jvm/jdk1.7.0_71/bin/java         1         manual mode

Press enter to keep the current choice[*], or type selection number: 2

sudo update-alternatives --config javac
There are 2 choices for the alternative javac (providing /usr/bin/javac).

  Selection    Path                                  Priority   Status
------------------------------------------------------------
  0            /usr/lib/jvm/java-7-oracle/bin/javac   2         auto mode
* 1            /usr/lib/jvm/java-7-oracle/bin/javac   2         manual mode
  2            /usr/lib/jvm/jdk1.7.0_71/bin/javac     2         manual mode

Press enter to keep the current choice[*], or type selection number: 2
sudo update-alternatives --config javaws
There are 2 choices for the alternative javaws (providing /usr/bin/javaws).

  Selection    Path                                       Priority   Status
------------------------------------------------------------
  0            /usr/lib/jvm/java-7-oracle/jre/bin/javaws   2         auto mode
* 1            /usr/lib/jvm/java-7-oracle/jre/bin/javaws   2         manual mode
  2            /usr/lib/jvm/jdk1.7.0_71/bin/javaws         2         manual mode

Press enter to keep the current choice[*], or type selection number: 2


#sudo update-alternatives --install "/usr/bin/java" "java" "/usr/lib/jvm/jdk1.7.0_71/bin/java" 2
#sudo update-alternatives --install "/usr/bin/javac" "javac" "/usr/lib/jvm/jdk1.7.0_71/bin/javac" 2
#sudo update-alternatives --install "/usr/bin/javaws" "javaws" "/usr/lib/jvm/jdk1.7.0_71/bin/javaws" 2

sudo vim /etc/environment
Agregar: JAVA_HOME="/usr/lib/jvm/jdk1.7.0_71"

O agregar en el .bashrc:
export JAVA_HOME=/usr/lib/jvm/jdk1.7.0_71


Close all browsers.

Create a Mozilla plugins folder in your home directory:

user@host:~$ mkdir ~/.mozilla/plugins/

Create a symbolic link to your Mozilla plugins folder. For 64-bit systems, replace ‘i386’ with ‘amd64’:

user@host:~$ ln -s /usr/lib/jvm/jdk1.7.0_71/jre/lib/i386/libnpjp2.so ~/.mozilla/plugins/

Testing:

user@host:~$ java -version

Output:
java version "1.7.0_72"
Java(TM) SE Runtime Environment (build 1.7.0_72-b14)
Java HotSpot(TM) 64-Bit Server VM (build 24.72-b04, mixed mode)

javac -version
javac 1.7.0_72

Verify JRE at http://java.com/en/download/installed.jsp.


References:
http://askubuntu.com/questions/56104/how-can-i-install-sun-oracles-proprietary-java-jdk-6-7-8-or-jre


jueves, 6 de noviembre de 2014

SVN: PROPDEL SVN:MERGEINFO

svn propdel svn:mergeinfo


Subversion controla los "merges" haciendo seguimiento mediante la propiedad "svn:mergeinfo".
A veces es necesario borrar esa propiedad de algún archivo para solucionar algún problema. Para ello usamos:
              svn propdel svn:mergeinfo


Caso de ejemplo


Problema al querer hacer un reintegrate despues de haber hecho el revert de un reintegrate:

Cuando se hace un reintegrate de una rama al tronco no conviene seguir haciendo reintegrates subsiguientes. Pero en ocaciones es necesario revertir el reintegrate para hacerlo nuevamente y ello puede traer problemas, como es el siguiente ejemplo:

Se hizo un reintegrate y commit al trunk (Committed revision 531227).
Luego se hizo un revert del commite (svn merge -c -531227 ^/trunk) dando revision 531235 (Revert Committed revision 531235).
Luego, al intentar hacer un reintegrate nuevamente del trunk para commitear surgió un problema.
Esto se puede solucionar con "svn propdel svn:mergeinfo".

...
At revision 531236.
[USER@HOME trunk]$ svn merge ^/branches/MY_BRANCH  --reintegrate
svn: E195016: Reintegrate can only be used if revisions 527399 through 531236 were previously merged from https://repositorio/trunk to the reintegrate source, but this is not the case:
  branches/MY_BRANCH/
DIR/FILE_WITH_PROBLEM.TXT
    Missing ranges: /trunk/DIR/FILE_WITH_PROBLEM.TXT:530809
  branches/MY_BRANCH/MY_DIR/FILE_WITH_PROBLEM_2.TXT.t
    Missing ranges: /trunk/MY_DIR/FILE_WITH_PROBLEM_2.TXT.t:530809

Solución en el Branch:


...
[USER@HOME trunk]$ cd $HOME/svn_workingcopy/BranchWorkingCopy
[USER@HOME BranchWorkingCopy]$ svn st
[USER@HOME BranchWorkingCopy]$ svn propdel svn:mergeinfo MY_DIR/FILE_WITH_PROBLEM_2.TXT.t
property 'svn:mergeinfo' deleted from 'MY_DIR/FILE_WITH_PROBLEM_2.TXT.t'.
[USER@HOME BranchWorkingCopy]$ svn propdel svn:mergeinfo DIR/FILE_WITH_PROBLEM.TXT
property 'svn:mergeinfo' deleted from 'DIR/FILE_WITH_PROBLEM.TXT'.
[USER@HOME BranchWorkingCopy]$ svn st
 M      DIR/FILE_WITH_PROBLEM.TXT
 M      MY_DIR/FILE_WITH_PROBLEM_2.TXT.t

[USER@HOME BranchWorkingCopy]$ svn diff -N > $HOME/merge_propdel.txt
[USER@HOME BranchWorkingCopy]$ svn commit -F $HOME/merge_propdel.txt
Sending        DIR/FILE_WITH_PROBLEM.TXT
Sending        MY_DIR/FILE_WITH_PROBLEM_2.TXT.t

Committed revision 531254.
[USER@HOME BranchWorkingCopy]$ svn up --ignore-externals
Updating '.':
At revision 531254.
[USER@HOME BranchWorkingCopy]$ svn merge --record-only -c 531227 ^/trunk
--- Merging r531227 into '.':
 G   .
--- Recording mergeinfo for merge of r531227 into '.':
 U   .
[USER@HOME BranchWorkingCopy]$ svn commit -F $HOME/merge_propdel_post.txt
svn: E000002: Can't open file '/home/USER/merge_propdel_post.txt': No such file or directory
[USER@HOME BranchWorkingCopy]$ svn diff -N > $HOME/merge_propdel_post.txt
[USER@HOME BranchWorkingCopy]$ svn commit -F $HOME/merge_propdel_post.txt


Solución en el trunk:


...
cd $HOME/svn_workingcopy/trunk
[USER@HOME trunk]$ svn st
[USER@HOME trunk]$ svn up --ignore-externals
Updating '.':
 U   .
Updated to revision 531254.
[USER@HOME trunk]$ svn merge ^/branches/MY_BRANCH  --reintegrate
--- Merging differences between repository URLs into '.':
R    MY_DIR/FILE_WITH_PROBLEM_2.TXT.t
R    DIR/FILE_WITH_PROBLEM.TXT
 G   .
--- Recording mergeinfo for merge between repository URLs into '.':
 U   .
[USER@HOME trunk]$

Despues de esto se puede hacer el commit apropiadamente.



Referencias:
http://stackoverflow.com/questions/4737605/reintegrate-can-only-be-used-if-revisions-x-through-y-were-previously-merged-fro
http://svnbook.red-bean.com/en/1.7/index.html


martes, 4 de noviembre de 2014

SVN: Reintegrate a Branch to Trunk

SVN: Reintegrar una rama al tronco

¿Cómo reintegrar un branch al trunk?

La idea es que cuando trabajamos con un branch, que es una rama del trunk, despues de un tiempo, cuando hayamos finalizado de trabajar con esta rama habrá que reintegrarla en el trunk haciendo un merge al mismo. El proceso a seguir puede ser el siguiente:

1) Primero traemos los cambios del trunk al branch


svn co https://REPO/branches/BRANCH --ignore-externals
cd BRANCH
#BRANCH]$ svn up --ignore-externals
BRANCH]$ svn merge ^/trunk
BRANCH]$ svn diff -N > merge_log.txt
#BRANCH]$ svn commit -m "Leyenda del Merge"
BRANCH]$ svn commit -F merge_log.txt

Esto se puede hacer previamente cada vez que se hace el reintegrate. Luego de que nuestro branch tiene todos los cambios actualizados del trunk podemos mezclarlos con los del trunk en el trunk (o sea comitear al trunk).

2) Despues llevamos los cambios del branch al trunk


svn co https://REPO/trunk trunk_workingcopy --ignore-externals
cd trunk_workingcopy
#trunk_workingcopy ]$ svn up --ignore-externals
trunk_workingcopy ]$ svn merge --reintegrate ^/branches/BRANCH
#Revisar los cambios
trunk_workingcopy ]$ $svn st
trunk_workingcopy ]$ svn diff -N > reintegrate_branch_to_trunk.log
#Ejecutar el comando para eliminar los comentarios de merge info:
#trunk_workingcopy ]$ svn st *|grep '^.M'|sed -re 's/^ *[A-Z]+ +//'|xargs -r svn pd svn:mergeinfo
#Commitear con leyenda:
#trunk_workingcopy ]$ svn commit -m "Reintegrate X"
Committed revision 392.

3) Después borramos el branch 

Después que el branch fue reintegrado y que se sabe que no se va a trabajar mas en ese branch se puede borrar.

$ svn delete https://REPO/branches/BRANCH \
             -m "Remove my branch, reintegrated with trunk in r392"
Committed revision 393.

4) Observación del reintegrate


Una vez que se hizo reintegrate no se debe volver a usar el branch ni a hacer otra vez reintegrate. ¿Por qué? Luego de hacer el reintegrate y subir los cambios: a) El trunk queda con los cambios que están en el branch; b) Cuando se vuelva a hacer merge del trunk en el branch para reutilizarlo, es posible que salten conflictos. O sea que no se debería usar mas el branch y el branch conviene ser borrado. Pero en caso de que se quiera hacer la excepción se puede hacer lo siguiente:

Lo que se puede hacer, para que no salten conflictos despes de hacer un reintegrate o revertir un reintegrate, es puentear el merge (que viene después del commit, pongamosle que actualiza el branch a la version  222)
Ejemplo:
podemos puentear el merge (que viene después del commit)
[branch]$   svn merge --record-only -c 222 ^/trunk

Con esto evitamos que haga el merge con los cambios que ya fueron comiteados en la version 222.


O sea que, no es aconsejable reutilizar un branch despues de un reintegrate, pero es más que nada por una cuestión de conflictos. Que de requerirse se puede reutilizar usando svn merge --record-only -c  <version> luego del commit.


SVN: Branch of Branch (Copy of Branch)

¿Cómo hacer una rama de una rama en una revisión dada?


(How to Copy a Branch within a Folder in the Repository: Explain how to copy a given branch with a given version within another folder in the repository)

Para hacer un branch del branch en la revision 9999.

svn mkdir https://repos/repo/branches/BRANCH_copy -m 'Crete folder to new branch'

svn cp https://repos/repo/branches/BRANCH_01@9999 https://repos/repo/branches/BRANCH_copy -m 'Copy of BRANCH_01'

svn co https://repos/repo/branches/BRANCH_copy/BRANCH_01 WorkingCopy_BRANCH_copy --ignore-externals


Nota:
Para remover el branch hacemos:

svn rm https://repos/repo/branches/BRANCH_copy/BRANCH_01 -m 'Remove Copy of BRANCH_01'