How to upgrade a customized extension using patches

In this tutorial, I will teach you how to upgrade Magento 1 extensions from AheadWorks when these ones were customized for your purposes and you don’t want to lose this customizations simply copying a new version of the extension over the previous one. To do this we will use patches.

Note: although this tutorial is directed to aheadWorks’ extensions you can skip a few steps or adapt them to any other extension.

Before we get started, we need the files from the previous version of the extension — the same version currently installed in our Magento store source tree, i.e, those ones we have customized with our code — and we need the files from the newer version of the extension. So we will create a diff file from these two versions.

For sake of simplicity, I will use the Follow Up Email extension to exemplify the steps necessary.

Also, I use Linux (Ubuntu 16.04) to do these upgrades. So if you use another OS (Operating System.).. well it’s time to you considering to change for a great OS. 😉

Preparing the files before creating the diff file

In a temporary folder, uncompress the previous version of the extensions:

mkdir -p ~/tmp/aw_followupemail-3.6.4
cd ~/tmp/aw_followupemail-3.6.4
unzip ~/Downloads/aw_followupemail-3.6.4.community_edition.zip

Remove  unnecessary files and merge the folders step1 and step2 into current folder:

rm LICENSE.txt readme.html
mv step1/* .
cp -r step2/* .
rm -rf step1 step2

Remove the module AW_All and related files. This module came with all extensions from AheadWorks and sometimes an older release can overwrite a newer release. AheadWorks recommends you use the newest release of this module:

rm -rf app/code/local/AW/All app/etc/modules/AW_All.xml app/design/adminhtml/default/default/layout/aw_all.xml app/design/adminhtml/default/default/template/aw_all/ js/aw_all/ skin/adminhtml/default/default/aw_all/

Repeat the steps above for the newer version of the extension:

mkdir -p ~/tmp/aw_followupemail-3.7.0
cd ~/tmp/aw_followupemail-3.7.0
unzip ~/Downloads/aw_followupemail-3.7.0.community_edition.zip
rm LICENSE.txt readme.html
mv step1/* .
cp -r step2/* .
rm -rf step1 step2
rm -rf app/code/local/AW/All app/etc/modules/AW_All.xml app/design/adminhtml/default/default/layout/aw_all.xml app/design/adminhtml/default/default/template/aw_all/ js/aw_all/ skin/adminhtml/default/default/aw_all/

Creating the diff file

Now we will create a diff file with the differences between the files from the two versions.

cd ~/tmp
diff -uNr aw_followupemail-3.6.4 aw_followupemail-3.7.0 > aw_followupemail-3.6.4_3.7.0.diff

Applying the patch to the customized extension

Now that we created the diff file we can apply this file to the store source code, using the patch command:

cd /magento
patch -N -p1 < ~/tmp/aw_followupemail-3.6.4_3.7.0.diff

Resolving the conflicts

I don’t like to arrive at this point but sometimes the patch command found conflicts that it can’t solve by itself. In this case, you must solve these conflicts.

If there any conflicts between your current code and the patch — certainly because you customized the extension –,  the patch command should have output messages like Hunk #x FAILED at xxx. Also, the file which the patch failed was saved with the file extensions .rej and .orig

There are some methods to solve theses conflicts, but I prefer to use to do a 3-way merge using the meld tool.

For each file with conflicts, execute the meld with three parâmeters: the previous version file; the file in your Magento source tree; and, the newer version file.  Ex:

meld ~/tmp/aw_followupemail-3.6.4/app/code/local/AW/Followupemail/Helper/Image.php app/code/local/AW/Followupemail/Helper/Image.php ~/tmp/aw_followupemail-3.7.0/app/code/local/AW/Followupemail/Helper/Image.php

Looking at the picture below you see three panels with the files opened (from the left to right): the previous version (before your customization); the file in your source tree (customized by you); and the new version (without any customization).

You must compare the previous version (left panel) with the new version (right panel) and apply the modifications to the file with the version customized by you (middle panel). After that, save the file (control+S) and close the meld.

A screenshot of the meld tool comparing the previous version, the new version and the customized file from the extension.
Sample of 3-way merge using the Meld tool

After all, you can remove the files with .rej and .orig files extensions. The following commands find and remove theses files:

find ./ -name "*.orig" -exec rm {} \;
find ./ -name "*.rej" -exec rm {} \;

That’s all folks! I hope it helped you. Please leave comments below.

Como fazer o git esquecer de arquivos que agora devem ser ignorados

O problema de hoje é o seguinte: enviei (commit) alguns arquivos para o repositório e depois (de um bom tempo, ou seja, vários commit) descobri que estes arquivos não eram necessários estar no meu controle de versão Git… e agora, como eu removo eles do repositório?

A primeira coisa é criar e/ou editar o arquivo .gitignore,  colocando nele a lista de pastas e arquivos que eu quero que o git ignore, em outras palavras, arquivos que eu não quero. Porém, isto só resolve para arquivos que ainda não foram enviados para o repositório!

Então, como eu faço para remover os arquivos que já foram enviados para o repositório?

Se fosse no último commit  e eu ainda não tivesse enviado para um repositório remoto, eu poderia fazer um –amend no commit. Porém, e quando já fiz vários commits; enviei para o repositório; outros desenvolvedores já pegaram (checkout) o meu commit; etc?

Achei uma dica no Stack Overflow que resolve este problema facilmente. Segue os comandos:

git ls-files --ignored --exclude-standard |xargs git rm --cached
git commit -am "Remove os arquivos ignorados."

Problema de email apagado e a Lixeira no Thunderbird

Algumas vezes, a Lixeira no Thunderbird insiste em não querer funcionar corretamente: o leitor de emails simplesmente não move as mensagens apagadas para a pasta da lixeira que foi configurada e desaparece com o email… até hoje não encontrei para onde eles foram movidos. 🙂

Este problema ocorreu comigo, com uma conta IMAP que eu tinha certeza que as configurações da conta estavam corretas (Ao excluir uma mensagem -> Mover para esta pasta [pasta que você selecionou]). Mesmo assim, o Thunderbird não movia a mensagens para a pasta da Lixeira.

Depois de mais de 6 horas se matando para encontrar uma solução para o problema — e olha que tinha acesso ao servidor de emails e realizei várias tentativas sem sucesso –, encontrei uma bem simples…

Como resolver o problema da lixeira no Thunderbird

Para resolver o problema você deverá instalar um complemento para o Mozilla Thunderbird: o FolderFlags.

Primeiro vamos a instalação do complemento. Execute os seguintes passos:

  • abra a opção Complementos (normalmente fica no menu Ferramentas, mas, como existem variações nas versões do Thunderbird você talvez terá que dar uma procurada no menu);
  • clique na aba Adicionar e, em seguida digite FolderFlags no campo de busca e clique no botão para pesquisar (ícone em formato de lupa);
  • quando mostrar o complemento encontrado, clique no botão Instalar.

Seleção_688

  • finalmente, clique em Reiniciar agora — o Thunderbird precisará reiniciar para que o complemento passe a funcionar.

Seleção_689

Depois que o Thunderbird reiniciar, você irá marcar ou sinalizar em qual pasta você que seja a sua Lixeira. Então, faça o seguinte:

  • dê um clique direito na pasta a qual você deseja que seja a sua Lixeira;
  • clique na aba Atributos da pasta (Flags);
  • marque apenas a opção Lixeira;
  • e, finalmente, pressione o botão Ok. 

Seleção_687

Feito os passos acima, deverá funcionar… bom, pelo menos, para mim funcionou.

Como ativar o XDMCP no Ubuntu 14.10

Este pequeno tutorial ensina rapidamente a ativar o protocolo XDMP no Ubuntu 14.10 para que você consiga se conectar remotamente a um desktop Linux.

Configurando o servidor

Para ativar o protocolo XDMCP no servidor é necessário habilitar ele nas configurações do lightdm.

Na minha instalação do Ubuntu 14.10 o arquivo /etc/lightdm/lightdm.conf não existia, então eu criei o arquivo. Mas, se na sua instalação já possuir o arquivo, basta você editar ele e acrescentar ou modificar o conteúdo abaixo:

[XDMCPServer]
enabled=true

Feito a configuração é necessário reiniciar o serviço lightdm para que o protocolo seja habilitado:

sudo restart lightdm

Configurando o cliente

Eu utilizei outro PC com o Ubuntu 14.10 para se conectar ao meu servidor. Então, vou explicar aqui como instalar o Remmina para se conectar ao servidor. Mas, você poderá encontrar na Internet outros clientes do protocolo XDMCP para Windows, Mac OS X, etc.

Instale os pacotes do remmina e o plugin dele para XDMCP:

sudo apt-get install remmina remmina-plugin-xdmcp

Inicie a aplicação Remmina Remote Desktop Client e crie uma conexão conforme a imagem a seguir:

Selection_071

Agora é só se conectar e trabalhar em seu servidor como se estivesse acessando localmente.

 

Resolvendo o problema de exibição no Grid do MySQL Workbench no Ubuntu 14.10

Quem atualizou para o Ubuntu 14.10 e utiliza o MySQL Workbench vai ter uma surpresa (ou já teve hehehe… já que está lendo este post): as consultas não estão aparecendo no Grid do Workbench 🙁

kxNFx

Felizmente, eu já descobri como resolver (na verdade foram outros caras).

Aqui eu vou ensinar como resolver o problema de exibição no Grid do MySQL Workbench no Ubuntu. Segue como resolver:

Primeiro, desinstale o pacote do Ubuntu que está com a versão com problema:

sudo apt-get remove mysql-workbench

Depois, faça o download da versão 6.2.3 do código fonte do MySQL Workbench.

Com o código fonte feito o download, execute os seguintes comandos no terminal:

tar xvf mysql-workbench-community-6.2.3-src.tar.gz

cd mysql-workbench-community-6.2.3-src

wget -O patch-glib.diff http://bugs.mysql.com/file.php?id=21874&bug_id=74147

patch -p0 < patch-glib.diff

sudo apt-get build-dep mysql-workbench

sudo apt-get install libgdal-dev

cd build

cmake .. -DBUILD_CONFIG=mysql_release

make

sudo make install

Feito este passos, agora é só abrir o Workbench que as consultas estarão aparecendo no Grid novamente.

PHP 5.3 + PHP5-FPM + NGINX no Ubuntu 14.04

Na versão 14.04 do Ubuntu, o PHP foi atualizado para a versão 5.5. Isso criou um problema para quem precisa da versão 5.3 do PHP para trabalhar com projetos que ainda não executam corretamente nas versões mais novas do PHP (no meu caso, o Magento 1.7.0.2).

Neste tutorial vou explicar como compilar e instalar a versão 5.3.28 do PHP com suporte ao PHP-FPM (FastCGI Process Manager) para funcionar no Ubuntu 14.04. Também vou ensinar como instalar e configurar o NGINX para funcionar com PHP-FPM.

1. Preparação do Sistema

Antes de tudo, execute o comando abaixo, pois todos os comandos aqui deverão ser executados como o superusuário root:

sudo -s

Edite o arquivo /etc/apt/sources.list e descomente as linhas iniciadas com deb-src ou acrescente as seguintes linhas, caso não existam no arquivo:

deb-src http://archive.ubuntu.com/ubuntu trusty main universe multiverse restricted
deb-src http://archive.ubuntu.com/ubuntu trusty-updates main universe multiverse restricted
deb-src http://archive.ubuntu.com/ubuntu trusty-security main universe multiverse restricted
deb-src http://archive.ubuntu.com/ubuntu trusty-backports restricted main universe multiverse

Execute os seguintes comandos para instalar os pacotes necessários para a compilação do PHP:

apt-get update
apt-get build-dep php5
apt-get install libt1-dev

Caso o Apache esteja instalado remova-o, porque vamos utilizar o NGINX como nosso servidor HTTP:

apt-get remove apache2
apt-get autoremove

Também remova os pacotes padrões do PHP 5.5, porque vamos compilar a versão 5.3:

apt-get remove php5 php5-cli php5-common
apt-get autoremove

2. Compilando o PHP

Execute os comandos abaixo para compilar e instalar a versão 5.3.28 do PHP. (Ajuste os parâmetros do ./configure conforme a sua necessidade.)

cd /usr/local/src
wget http://in1.php.net/distributions/php-5.3.28.tar.bz2
tar -xvf php-5.3.28.tar.bz2
cd php-5.3.28
./configure --enable-fpm --with-fpm-user=www-data --with-fpm-group=www-data --with-mysqli=mysqlnd --with-mysql=mysqlnd --with-pdo-mysql --with-gd --with-libdir=lib/i386-linux-gnu --enable-gd-native-ttf --enable-gd-jis-conv --with-gettext --enable-mbstring --with-mcrypt --with-mhash --enable-wddx --with-xmlrpc --with-xsl --enable-zip  --with-curl --with-curlwrappers --with-xpm-dir --with-jpeg-dir --with-png-dir --with-t1lib  --enable-soap
make
make install

cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
chmod a+x /etc/init.d/php-fpm
cp /usr/local/etc/php-fpm.conf.default /usr/local/etc/php-fpm.conf

update-rc.d php-fpm defaults

3. Instalando e configurando NGINX

A instalação do Nginx é simples: vamos utilizar o pacote existente no Ubuntu. Execute o comando abaixo para realizar a instalação:

apt-get install nginx

Crie o arquivo /etc/nginx/conf.d/upstream.conf com o seguinte conteúdo:

upstream fpm_backend {
 server 127.0.0.1:9000;
}

4. Configurando um servidor virtual no NGINX com PHP5-FPM

Para facilitar a compreensão dos passos a seguir, vamos configurar o domínio meuprojeto.localhost  apontando para a nossa própria máquina (localhost). Edite o arquivo /etc/hosts e acrescente a seguinte linha:

127.0.0.1 meuprojeto.localhost

Agora crie o arquivo /etc/nginx/sites-available/meuprojeto.localhost com o seguinte conteúdo:

server {
 listen 80;
 server_name meuprojeto.localhost; # like ServerName in Apache
 root /home/meuusuario/meuprojeto; # document root, path to directory with files
 index index.html index.php;
 autoindex off; # we don't want users to see files in directories

 location / {
 # First attempt to serve request as file, then
 # as directory, then fall back to displaying a 404.
 try_files $uri $uri/ =404;
 }

 location ~ \.php$ {

 try_files $uri =404; # if reference to php executable is invalid return 404
 expires off; # no need to cache php executable files
 fastcgi_read_timeout 600;
 fastcgi_pass fpm_backend; # proxy all requests for dynamic content to backend configured in upstream.conf
 fastcgi_keep_conn on; # use persistent connects to backend
 include fastcgi_params;
 fastcgi_param SCRIPT_FILENAME $document_root${fastcgi_script_name};
 }
}

Habilite o servidor virtual digitando o seguinte comando:

ln -sf /etc/nginx/sites-available/meuprojeto.localhost /etc/nginx/sites-enabled/meuprojeto.localhost

Inicie os daemons do PHP-FPM e NGINX, por meio dos seguintes comandos:

service php-fpm start
service nginx start

Para testar se tudo funcionou corretamente, crie um arquivo chamado phpinfo.php, dentro da pasta do seu projeto, com o seguinte conteúdo (no caso do exemplo acima, o arquivo será criado dentro da pasta /home/meuusuario/meuprojeto):

<?php
echo phpinfo();
?>

Agora, abra o seu navegador e acesse o endereço http://meuprojeto.localhost/phpinfo.php. Se, ao invés de fazer o download do arquivo phpinfo.php, apresentar as informações do PHP, sua configuração está funcionando corretamente!

Bem… é isso! Espero que tenha ajudado.

 

Instalando o PHP 5.3 no Ubuntu 14.04

Edição 1: Escrevi outro tutorial, utilizando PHP5-FPM e Nginx. Vale a pena dar uma olhada.

Se você utilizava o seu PC com Ubuntu para testar os seus projetos em PHP que somente funcionam corretamente  com a versão 5.3 (como é o caso do Magento 1.7/1.8),  e depois que atualizou o Ubuntu para a  versão 14.04 LTS descobriu que ele vem o PHP 5.5, este artigo é para você; pois, eu tive o mesmo problema.

Googlando sobre o problema, eu descobri algumas  dicas como o projeto PHPBrew e PuPHPet. Mas, nenhuma deu certo para mim. Então, eu tive que apelar para a compilação do código fonte do PHP 5.3.28…

Segue os comandos para preparar o sistema com os pacotes necessários para compilar o código fonte do PHP:

sudo -s
apt-get build-dep php5
apt-get install -y autoconf automake curl build-essential libxslt1-dev re2c libxml2 libxml2-dev php5-cli bison libbz2-dev libreadline-dev
apt-get install -y libfreetype6 libfreetype6-dev libpng12-0 libpng12-dev libjpeg-dev libjpeg8-dev libjpeg8 libgd-dev libgd3 libxpm4
apt-get install -y libssl-dev openssl
apt-get install -y gettext libgettextpo-dev libgettextpo0
apt-get install -y libicu48 libicu-dev
apt-get install -y libmhash-dev libmhash2
apt-get install -y libmcrypt-dev libmcrypt4
apt-get install mysql-server mysql-client libmysqlclient-dev libmysqld-dev
apt-get install -y apache2-dev

Agora vamos aos comandos para baixar o código fonte, compilá-lo e instalá-lo:

wget http://in1.php.net/distributions/php-5.3.28.tar.bz2
tar xfj php-5.3.28.tar.bz2
cd php-5.3.28
export dst=/usr/local
./configure --prefix=${dst} --with-config-file-path=${dst} --with-config-file-scan-dir=${dst}/conf.d --without-t1lib --disable-short-tags --with-apxs2=/usr/bin/apxs2 --enable-pcntl --with-tsrm-pthreads --with-mysqli=mysqlnd --with-mysql=mysqlnd --with-pdo-mysql --with-openssl --with-zlib --enable-sysvmsg --enable-sysvsem --enable-sysvshm --enable-bcmath --with-bz2 --enable-calendar --enable-exif --enable-ftp --with-gd --with-jpeg-dir=${dst}/usr/lib --with-png-dir=${dst}/usr/lib --with-xpm-dir=${dst}/usr/lib --enable-gd-native-ttf --enable-gd-jis-conv --with-iconv-dir --with-gettext --enable-mbstring --with-mcrypt --with-mhash --with-pspell --with-readline --with-snmp --enable-soap --enable-sockets --with-sqlite --enable-sqlite-utf8 --enable-wddx --with-xmlrpc --with-xsl --enable-zip  --with-curl --with-curlwrappers --with-libdir=lib/i386-linux-gnu --with-xpm-dir=/usr
make install

Se tudo deu certo até aqui, basta reiniciar o apache que o PHP já estará funcionando:

service apache2 restart