Mercurial - Hg

Instal·lar Mercurial

sudo apt-get install python-pip

A Ubuntu

sudo apt-get install python-software-properties
sudo add-apt-repository ppa:mercurial-ppa/releases
sudo apt-get update
sudo apt-get install mercurial

A Debian

Haurem de fer ús dels Blackports Debian per instal·lar la versió 1.8 o superior (a 1 de gener, versió 2.0.1)

Afegeix aquesta línia a /etc/apt/sources.list

deb http://backports.debian.org/debian-backports squeeze-backports main

I a continuació executa:

aptitude update
aptitude -t squeeze-backports install mercurial

Dades de l'usuari

Editem .hgrc

[ui]
username = nomusuari <usuari@domini.com>

Mercurial en 10 segons

Servidor

  hg init
  hg commit -m "[ADD] New repository"

  hg clone repositorimaster repositorinou

  hg branch nombranca
  hg commit -m "Iniciem la branca

  hg branch

hg checkout default <- ens canviem a la branca default
hg branch <- ens assegurem a quina branca estem
hg pull <- actualitzem
hg update <- actualitzem
hg checkout nombranca <- canviem a la branca projecte
hg merge default <- fem la fusió

Per fer la fusió (merge) cal que al projecte estigui al corrent i no hi hagi cap commit a fer.

Local

  hg clone ssh://resteve@domain.com//home/tryton

  hg pull
  hg update

  hg status
  hg commit -m "Missatge"
  hg push

  vi .hg/hgrc
  default-push = ssh://resteve@domini.com//home/django/projecte

Per poder fer push a diferents repositoris sense haver de modificar el fitxer de configuració cada cop, edita el fitxer hgrc de cada mòdul:

  gedit .hg/hgrc

i introdueix una línia per a cada repositori que vulguis tenir:

[paths]
default = http://home.zikzakmedia.com/tryton/csv_import_send_mail
bitbucket = https://bitbucket.org/zikzakmedia/trytond-csv_import_send_mail
pedraforca = ssh://jmartin@home.zikzakmedia.com//home/tryton/master/modules/csv_import_send_mail

Un cop fet, només has d'indicar a quin repositori vols fer el push en cada moment:

hg push bitbucket

Baixar-nos un repositori

Ho fem amb la comanda clone, per exemple:

  hg clone http://domini/tryton-client/
  hg clone ssh://resteve@domain.com//home/tryton

Actualitzar-nos el nostre repositori

Primer amb pull enviem els canvis del repositori remot al repositori local i desprès amb update actualitzem els fitxers/carpetes de la còpia local:

  hg pull
  hg update

Enviar canvis en el repositori

Primer fem un commit al repositori local i després amb push ho enviem al repositori remot:

  hg commit -m "Anotem comentaris"
  hg push

Si es vol obtenir un patch dels canvis fets (patch), desprès de fer el commit i abans de fer el push els podem exportar:

  hg export tip -o module.patch

Per que no ens faci un push intern, si no el repositori que ens hem baixat, haurem cada cop que fem un push especificar-li a on el fa:

  hg push ssh://usuari@domini//home/tryton/master/tryton-client/

Per evitar d'escriure cada vegada les opcions del push, a cada repositori que ens hem descarregat tenim el fitxer .hg/hgrc on podem personalitzar les opcions de Mercurial en aquest projecte:

  default-push = ssh://usuari@domini//home/tryton/master/tryton-client/

Afegint aquesta línia, sempre que fem un hg push ens ho farà en aquest repositori.

Branques

Crear

hg branch nombranca
hg commit -m "Iniciem la branca

Ús

hg branches -> Per saber totes les branques que disposem
hg branch -> Per saber en quina branca treballo. Per defecte, default
hg checkout nombranca -> Per canviar de branca

Unificar branques

Unirem branques amb l'opció merge. Cal que la branca que volem unificar no tingui canvis pendents per fer el commit; si no, no ens deixarà.

hg checkout default
hg pull
hg update
hg checkout nomdelabranca
hg merge default

Descartar conflictes del merge

 hg resolve -m settings.py

Descartar certs directoris del merge

Abans de fer el merge, si alguns directoris no volem que ens els fusioni, els haurem d'eliminar, que no estigui com a repositori de versions.

hg forget nomdirecotori
hg commit -m "Eliminem el directori"
hg merge default

Aplicar canvis d'una branca a una altra

Per exemple estic a la branca 3.4, faig canvis i faig el commit:

hg ci -m "Missatge commit"

Miro el número de revisió d'aq commit i me'l apunto, per ex el 35:

hg log|more

Canvio de branca:

hg checkout default

Aplico el canvi de la revisió 35 a aquesta branca:

hg graft -r 35
grafting 35:2edd2d112559 "Missatge commit" (tip)
merging product.py

Ja m'ha fet el merge i el commit a la nova branca. Ara ja puc fer el push i em puja els dos commits:

hg push

Podria ser que el merge no el pogués fer si el canvi toca codi que entre v 3.4 i default hagués canviat molt, llavors ja t'avisa i et deix un fitxer amb els conflictes (canvis d'una banda i l'altra) perquè ho facis a mà. I un cop arrgleat es marca com a resolt i es continua el procés amb les comandes:

hg resolve --mark
hg graft --continue

Revertir commit

Desfer un commit concret:

hg backout -merge 72799dbce5c9

Heads

Unir dos heads d'una mateixa branca:

$ hg heads
changeset:   26:b609a0688607
tag:         tip
parent:      23:2b943b3b5d0a
user:        resteve <resteve@zikzakmedia.com>
date:        Tue Apr 23 13:39:55 2013 +0200
summary:     DOC es

changeset:   25:2ab95013c622
user:        Sergi Almacellas Abellana <sergi@koolpi.com>
date:        Mon Apr 22 14:28:10 2013 +0200
summary:     Only validate non draft invoices.

$ hg up -C -r 26
0 files updated, 0 files merged, 0 files removed, 0 files unresolved

$ hg merge -r 25
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)

$ hg status
M invoice.py
M setup.py

$ hg ci -m "merged multiple heads"
$ hg push

Trust

Si accedim en diferent usuaris, es normal que ens aparegui el missatge:

Not trusting file ..../.hg/hgrc from untrusted user usuari, group zikzakmedia

Not trusting file .hg/hgrc from untrusted user root, group dev

Una opció és:

Add in /etc/mercurial/hgrc.d/trust.rc

[trusted]
groups = yourgroup
users = youruser

.hgignore

Per descartar fitxers en el status o add, podem crear a l'arrel del projecte el fitxer .hgignore. Podem escriure manualment els fitxers/directoris a excloure o expressions regulars

# use glob syntax.
syntax: glob

.hgignore
*.pyc
*~

# use glob syntax.
syntax: glob

.hgignore
*~
*.py{c,o}
dist/
build/
_build/
*.egg-info/
.eggs/
.coverage
*,cover
node_modules/
bower_components/
.tox/
.git/
*.orig
*.jasper
.review.cfg

Podem crear aquest fitxer i deixar-ho al nostre home. Després a la nostra configuració global de .hgrc podem incloure a on es troba aquests ignore

$ vi ~/.hgrc 

[ui]
ignore = ~/.hgignore.ini

Recuperar canvis

Per recuperar una versió anterior ho podem fer amb revert

hg revert --all -r . -> revisió actual. Podem ometre el -r .
hg revert --all -r 23 -> Retorna a la revisió 23
hg revert --all -r 20:21 -> De la revisió 20 a la 21

En el cas de tirar una revisió anterior, caldrà de nou fer un commit amb la nova revisió.

Historial

svn log

changeset:   27:9a3a984c6c50
branch:      raimon
tag:         tip
date:        Thu Dec 15 23:32:17 2011 +0100
summary:     test

Per extreure logs en format XML: hg log --style=xml

Comandes

 add        add the specified files on the next commit
 annotate   show changeset information by line for each file
 clone      make a copy of an existing repository
 commit     commit the specified files or all outstanding changes
 diff       diff repository (or selected files)
 export     dump the header and diffs for one or more changesets
 forget     forget the specified files on the next commit
 init       create a new repository in the given directory
 log        show revision history of entire repository or files
 merge      merge working directory with another revision
 nclone     make a copy of an existing repository and all nested repositories
 ndiff      diff nested repositories (or selected files)
 npush      push changes to the specified destination and all nested
            repositories
 nstatus    show changed files in the working directory and all nested
            repositories
 nupdate    update working directory and all nested repositories
 pull       pull changes from the specified source
 push       push changes to the specified destination
 remove     remove the specified files on the next commit
 serve      start stand-alone webserver
 status     show changed files in the working directory
 summary    summarize working directory state
 update     update working directory (or switch revisions)
 backout    desfer el últim push i crea un nou commit

Graph de graft

[alias]                                                                        
# Tree view for mercurial log (like git lg)                                    
lg = log -G --template '{rev}[{tags} {branches}]\t{node|short}\t{date|isodate}\t{author|person}\n  {desc|firstline}\n\n'

Bitbucket

Per treballar amb Bitbucket afegim la clau pública a les preferències de l'usuari.

    hg clone https://bitbucket.org/zikzakmedia/tryton-product_m2mcategories

    hg push

    hg pull --update

Exemple:

hg clone ssh://hg@bitbucket.org/zikzakmedia/tryton-product_m2mcategories
hg add NOMDIRECTORY
hg commit -m "[ADD] Product MultyCategory"
hg push

Subrepos

Aquesta opció ens crearà un "repositori de repositoris". Subrepository

Ens pots servir per:

A continuació, una guia breu de creació del repositori de repositoris:

hgtest2 = /home/resteve/hgtest2
hgtest3 = /home/resteve/hgtest3
django-pagination = [git]git://github.com/zikzakmedia/django-pagination.git
openerp-magento = [git]git://github.com/zikzakmedia/openerp-magento.git

Per utilitzar repositoris git haurem de disposar de la versió 1.8 o superior.

hg Nested

Instal·larem una extenció de mercurial per descarregar la branca de Tryton “de cop”: Hg Nested

sudo pip install hgnested
echo -e "[extensions]\nhgnested=" >> ~/.hgrc

Si treballem amb hg 2.3, millor ens descarreguem hgnested de https://bitbucket.org/zikzakmedia/hgnested/ ja que conté uns path per hg 2.3

hg Review

Instal·larem una extenció de mercurial per la creació de revisions: Hg Review

pip install hgreview

Editarem el fitxer ~/.hgrc i afegirem la nova extenció:

[extensions]
hgreview =

[review]
username = nom@domini.com
server = http://codereview.tryton.org/
send_email = True

Ús del Review:

hg review -m "module_name: Description"

Ara ja podem accedir a http://codereview.tryton.org/ per veure els issues que ens ha creat.

hg review
hg review --fetch -i 1

Code Review Tryton Wiki

Si esteu amb hg 2.3 i hgreview 0.2, copies es deprecated. Cal al fer el canvi al fitxer init.py de hgreview/init.py

134     #copymove_info = copies.copies(repo, base_rev, current_rev, null_rev)[0]
135     copymove_info = copies.mergecopies(repo, base_rev, current_rev, null_rev)[0]

Accés Client Web

Per habilitar l'accés client web o la descarga via http del projecte, hem de configurar un wsgi amb Apache.

hgweb.config

[paths]
tryton = /tryton/master/tryton
trytond = /tryton/master/trytond
sao = /tryton/master/sao
proteus = /tryton/master/proteus
/ = /tryton/master/modules/*

Apache2

<VirtualHost *:80>
        ServerName hg.zzsaas.com

        ServerAdmin zikzak@zikzakmedia.com

        <Directory />
                Options Indexes FollowSymLinks
                AllowOverride None
                Require all granted
        </Directory>


        WSGIScriptAlias / /dir/tryton/hgweb.wsgi

        # LogLevel info error alert warn notice debug
        LogLevel info
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Autentificació Apache per l'accés

Podem fer-ho amb autentificació Apache:

<location /tryton-client>
    AuthType Basic
    AuthName "Tryton client"
    AuthUserFile /var/hg/hgusers
    Require valid-user
</Location>

Permetre push sense autentificació

En el fitxer hgweb.config podem afegir els paràmetres següents. Ens permetrà descarregar un projecte via hg clone http i fer un push anonimament.

[web]
push_ssl = false
allow_push = *

Repositori hg des d'un repositori git

Podem descarregar-nos un projecte en git i es cregui com a repositori a hg. Haurem d'instal·lar l'extensió hg-git

pip install hg-git

A les nostres preferencies del hg ~/.hgrc afegirem l'extensió.

[extensions]
hggit=

Per descarregar-nos un projecte de git (només permet el mode lectura el projecte git) farem un hg clone

hg clone git://github.com/zikzakmedia/openerp-magento.git

Since 0.9.1, ObjectStore.add_pack() returns a 3-tuple. The attached patch fixes the issue. https://bitbucket.org/durin42/hg-git/issue/79/hg-git-crashes-with-newer-versions-of

-        f, commit = self.git.object_store.add_pack()
+        f, commit = self.git.object_store.add_pack()[:2]

Hg (last edited 2018-02-13 17:53:47 by resteve)

Contenidos creados por el equipo de Zikzakmedia. Creative Commons By-NC-SA

PythonZikzakmedia