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