hgbook

changeset 976:713f0f69029a

merge with Italian, and very (few) work on ch03
author Romain PELISSE <belaran@gmail.com>
date Fri Sep 04 16:33:35 2009 +0200 (2009-09-04)
parents 8de6cebc363d
children 719b03ea27c8
files .hgignore .hgtags fr/ch03-tour-merge.xml it/00book.xml it/Makefile it/README it/appA-svn.xml it/appB-mq-ref.xml it/appC-srcinstall.xml it/appD-license.xml it/bibliography.xml it/book-shortcuts.xml it/ch00-preface.xml it/ch01-intro.xml it/ch02-tour-basic.xml it/ch03-tour-merge.xml it/ch04-concepts.xml it/ch05-daily.xml it/ch06-collab.xml it/ch07-filenames.xml it/ch08-branch.xml it/ch09-undo.xml it/ch10-hook.xml it/ch11-template.xml it/ch12-mq.xml it/ch13-mq-collab.xml it/ch14-hgext.xml it/examples/auto-snippets.xml it/examples/backout.init.it it/examples/backout.manual.backout.it it/examples/backout.manual.cat.it it/examples/backout.manual.clone.it it/examples/backout.manual.heads.it it/examples/backout.manual.log.it it/examples/backout.manual.merge.it it/examples/backout.manual.parents.it it/examples/backout.non-tip.backout.it it/examples/backout.non-tip.cat.it it/examples/backout.non-tip.clone.it it/examples/backout.simple.it it/examples/backout.simple.log.it it/examples/bisect.commits.it it/examples/bisect.help.it it/examples/bisect.init.it it/examples/bisect.search.bad-init.it it/examples/bisect.search.good-init.it it/examples/bisect.search.init.it it/examples/bisect.search.mytest.it it/examples/bisect.search.reset.it it/examples/bisect.search.rest.it it/examples/bisect.search.step1.it it/examples/bisect.search.step2.it it/examples/branch-named.branch.it it/examples/branch-named.branches.it it/examples/branch-named.commit.it it/examples/branch-named.create.it it/examples/branch-named.foo-commit.it it/examples/branch-named.merge.it it/examples/branch-named.parents.it it/examples/branch-named.rebranch.it it/examples/branch-named.status.it it/examples/branch-named.update-nothing.it it/examples/branch-named.update-switchy.it it/examples/branch-repo.bugfix.it it/examples/branch-repo.clone.it it/examples/branch-repo.merge.it it/examples/branch-repo.new.it it/examples/branch-repo.pull.it it/examples/branch-repo.tag.it it/examples/branching.clone.it it/examples/branching.init.it it/examples/branching.main.it it/examples/branching.merge.it it/examples/branching.stable.it it/examples/branching.tag.it it/examples/branching.update.it it/examples/ch01-new.add.it it/examples/ch01-new.commit.it it/examples/ch01-new.init.it it/examples/ch01-new.ls.it it/examples/ch01-new.ls2.it it/examples/ch04-diff.chmod.git.it it/examples/ch04-diff.chmod.it it/examples/ch04-diff.rename.basic.it it/examples/ch04-diff.rename.git.it it/examples/ch04-resolve.cifail.it it/examples/ch04-resolve.export.it it/examples/ch04-resolve.heads.it it/examples/ch04-resolve.init.it it/examples/ch04-resolve.left.it it/examples/ch04-resolve.list.it it/examples/ch04-resolve.merge.it it/examples/ch04-resolve.pull.it it/examples/ch04-resolve.right.it it/examples/ch06-apache-config.lst.it it/examples/ch09-check_whitespace.py.lst.it it/examples/ch09-hook.ws.better.it it/examples/ch09-hook.ws.simple.it it/examples/ch10-bugzilla-config.lst.it it/examples/ch10-multiline.go.it it/examples/ch10-notify-config-mail.lst.it it/examples/ch10-notify-config.lst.it it/examples/ch11-qdelete.convert.it it/examples/ch11-qdelete.go.it it/examples/ch11-qdelete.import.it it/examples/daily.copy.after.it it/examples/daily.copy.clone.it it/examples/daily.copy.copy.it it/examples/daily.copy.dir-dest.it it/examples/daily.copy.dir-src-dest.it it/examples/daily.copy.dir-src.it it/examples/daily.copy.init.it it/examples/daily.copy.merge.it it/examples/daily.copy.other.it it/examples/daily.copy.simple.it it/examples/daily.copy.status-copy.it it/examples/daily.copy.status.it it/examples/daily.files.add-dir.it it/examples/daily.files.add.it it/examples/daily.files.addremove.it it/examples/daily.files.commit-addremove.it it/examples/daily.files.hidden.it it/examples/daily.files.missing.it it/examples/daily.files.recover-missing.it it/examples/daily.files.remove-after.it it/examples/daily.files.remove.it it/examples/daily.rename.rename.it it/examples/daily.rename.status-copy.it it/examples/daily.rename.status.it it/examples/daily.revert.add.it it/examples/daily.revert.copy.it it/examples/daily.revert.missing.it it/examples/daily.revert.modify.it it/examples/daily.revert.remove.it it/examples/daily.revert.status.it it/examples/daily.revert.unmodify.it it/examples/extdiff.diff.it it/examples/extdiff.extdiff-ctx.it it/examples/extdiff.extdiff.it it/examples/filenames.dirs.it it/examples/filenames.files.it it/examples/filenames.filter.exclude.it it/examples/filenames.filter.include.it it/examples/filenames.glob.group.it it/examples/filenames.glob.question.it it/examples/filenames.glob.range.it it/examples/filenames.glob.star-starstar.it it/examples/filenames.glob.star.it it/examples/filenames.glob.starstar.it it/examples/filenames.wdir-relname.it it/examples/filenames.wdir-subdir.it it/examples/hook.msglen.go.it it/examples/hook.simple.ext.it it/examples/hook.simple.init.it it/examples/hook.simple.pretxncommit.it it/examples/issue29.go.it it/examples/mq.dodiff.diff.it it/examples/mq.guards.init.it it/examples/mq.guards.qguard.it it/examples/mq.guards.qguard.neg.it it/examples/mq.guards.qguard.pos.it it/examples/mq.guards.qselect.cat.it it/examples/mq.guards.qselect.error.it it/examples/mq.guards.qselect.foo.it it/examples/mq.guards.qselect.foobar.it it/examples/mq.guards.qselect.qpush.it it/examples/mq.guards.qselect.quux.it it/examples/mq.guards.series.it it/examples/mq.id.output.it it/examples/mq.qinit-help.help.it it/examples/mq.tarball.download.it it/examples/mq.tarball.newsource.it it/examples/mq.tarball.qinit.it it/examples/mq.tarball.repush.it it/examples/mq.tools.lsdiff.it it/examples/mq.tools.tools.it it/examples/mq.tutorial.add.it it/examples/mq.tutorial.qinit.it it/examples/mq.tutorial.qnew.it it/examples/mq.tutorial.qnew2.it it/examples/mq.tutorial.qpop.it it/examples/mq.tutorial.qpush-a.it it/examples/mq.tutorial.qrefresh.it it/examples/mq.tutorial.qrefresh2.it it/examples/mq.tutorial.qseries.it it/examples/rename.divergent.clone.it it/examples/rename.divergent.merge.it it/examples/rename.divergent.rename.anne.it it/examples/rename.divergent.rename.bob.it it/examples/rollback.add.it it/examples/rollback.commit.it it/examples/rollback.rollback.it it/examples/rollback.status.it it/examples/rollback.twice.it it/examples/tag.init.it it/examples/tag.log.it it/examples/tag.log.v1.0.it it/examples/tag.remove.it it/examples/tag.replace.it it/examples/tag.tag.it it/examples/tag.tags.it it/examples/tag.tip.it it/examples/template.simple.changelog.it it/examples/template.simple.combine.it it/examples/template.simple.compact.it it/examples/template.simple.datekeyword.it it/examples/template.simple.keywords.it it/examples/template.simple.manyfilters.it it/examples/template.simple.normal.it it/examples/template.simple.rev.it it/examples/template.simple.simplest.it it/examples/template.simple.simplesub.it it/examples/template.svnstyle.id.it it/examples/template.svnstyle.short.it it/examples/template.svnstyle.style.it it/examples/template.svnstyle.syntax.error.it it/examples/template.svnstyle.syntax.input.it it/examples/template.svnstyle.template.it it/examples/tour-merge-conflict.commit.it it/examples/tour-merge-conflict.cousin.it it/examples/tour-merge-conflict.merge.it it/examples/tour-merge-conflict.pull.it it/examples/tour-merge-conflict.son.it it/examples/tour-merge-conflict.wife.it it/examples/tour.cat1.it it/examples/tour.cat2.it it/examples/tour.clone-pull.it it/examples/tour.clone-push.it it/examples/tour.clone.it it/examples/tour.commit.it it/examples/tour.diff.it it/examples/tour.help.it it/examples/tour.incoming.it it/examples/tour.log-r.it it/examples/tour.log-v.it it/examples/tour.log-vp.it it/examples/tour.log.it it/examples/tour.log.range.it it/examples/tour.ls-a.it it/examples/tour.ls.it it/examples/tour.merge.cat1.it it/examples/tour.merge.cat2.it it/examples/tour.merge.clone.it it/examples/tour.merge.commit.it it/examples/tour.merge.heads.it it/examples/tour.merge.merge.it it/examples/tour.merge.parents.it it/examples/tour.merge.pull.it it/examples/tour.merge.tip.it it/examples/tour.merge.update.it it/examples/tour.older.it it/examples/tour.outgoing.it it/examples/tour.outgoing.net.it it/examples/tour.parents.it it/examples/tour.pull.it it/examples/tour.push.it it/examples/tour.push.net.it it/examples/tour.push.nothing.it it/examples/tour.reclone.it it/examples/tour.status.it it/examples/tour.tip.it it/examples/tour.update.it it/examples/tour.version.it it/figs/bad-merge-1.dot it/figs/bad-merge-2.dot it/figs/bad-merge-3.dot it/figs/bad-merge-4.dot it/figs/bad-merge-5.dot it/figs/feature-branches.dot it/figs/filelog.svg it/figs/metadata.svg it/figs/mq-stack.svg it/figs/revlog.svg it/figs/snapshot.svg it/figs/tour-history.svg it/figs/tour-merge-conflict.svg it/figs/tour-merge-merge.svg it/figs/tour-merge-pull.svg it/figs/tour-merge-sep-repos.svg it/figs/undo-manual-merge.dot it/figs/undo-manual.dot it/figs/undo-non-tip.dot it/figs/undo-simple.dot it/figs/wdir-after-commit.svg it/figs/wdir-branch.svg it/figs/wdir-merge.svg it/figs/wdir-pre-branch.svg it/figs/wdir.svg it/web/genindex.py it/web/hgbook.js it/web/index-home.html.in it/web/index-template.html it/web/jquery-min.js
line diff
     1.1 --- a/.hgignore	Tue Sep 01 21:48:21 2009 +0200
     1.2 +++ b/.hgignore	Fri Sep 04 16:33:35 2009 +0200
     1.3 @@ -25,6 +25,8 @@
     1.4  en/examples/results
     1.5  en/html
     1.6  en/svn
     1.7 +it/examples/results
     1.8 +it/html
     1.9  stylesheets/system-xsl
    1.10  tools
    1.11  web/hgbook/.database.sqlite3
     2.1 --- a/.hgtags	Tue Sep 01 21:48:21 2009 +0200
     2.2 +++ b/.hgtags	Fri Sep 04 16:33:35 2009 +0200
     2.3 @@ -1,1 +1,2 @@
     2.4  18131160f7ee3b81bf39ce2c58f762b8d671cef3 submitted
     2.5 +94d2205f02e7c47931db382a3a80553ef01b3913 1st-edition-it
     3.1 --- a/fr/ch03-tour-merge.xml	Tue Sep 01 21:48:21 2009 +0200
     3.2 +++ b/fr/ch03-tour-merge.xml	Fri Sep 04 16:33:35 2009 +0200
     3.3 @@ -1,23 +1,21 @@
     3.4  <!-- vim: set filetype=docbkxml shiftwidth=2 autoindent expandtab tw=77 : -->
     3.5  
     3.6 -<chapter>
     3.7 -<title>Un rapide tour de Mercurial: fusionner les travaux</title>
     3.8 -<para>\label{chap:tour-merge}</para>
     3.9 -
    3.10 -<para>Nous avons maintenant étudié comment cloner un dépôt, effectuer
    3.11 -des changements dedans, et récupérer ou transférer depuis un
    3.12 -autre dépôt. La prochaine étape est donc de <emphasis>fusionner</emphasis> les
    3.13 -modifications de différents dépôts.</para>
    3.14 -
    3.15 -<sect1>
    3.16 -<title>Fusionner différents travaux</title>
    3.17 -<para>				       %%% for 'Merging streams of work' ?
    3.18 -La fusion\footnote{NdT: Je garde fusion mais le jargon professionnel
    3.19 -emploiera généralement le terme \textit{merge}.} est un aspect
    3.20 -fondamental lorsqu'on travaille avec un gestionnaire de source
    3.21 -distribué.</para>
    3.22 -<itemizedlist>
    3.23 -<listitem><para>Alice et Bob ont chacun une copie personnelle du dépôt d'un
    3.24 +<chapter id="chap:tour-merge">
    3.25 +  <?dbhtml filename="a-tour-of-mercurial-merging-work.html"?>
    3.26 +  <title>Un rapide tour de Mercurial: fusionner les travaux</title>
    3.27 +  
    3.28 +  <para id="x_338">Nous avons maintenant étudié comment cloner un dépôt, effectuer
    3.29 +    des changements dedans, et récupérer ou transférer depuis un
    3.30 +    autre dépôt. La prochaine étape est donc de <emphasis>fusionner</emphasis> les
    3.31 +    modifications de différents dépôts.</para>
    3.32 +
    3.33 +  <sect1>
    3.34 +    <title>Fusionner différents travaux</title>
    3.35 +      <para od="x_339">La fusion  est un aspect fondamental lorsqu'on
    3.36 +      travaille iavec un gestionnaire de source distribué.</para>
    3.37 +
    3.38 +      <itemizedlist>
    3.39 +        <listitem><para>Alice et Bob ont chacun une copie personnelle du dépôt d'un
    3.40    projet sur lequel ils collaborent. Alice corrige un \textit{bug}
    3.41    dans son dépôt, et Bob ajoute une nouvelle fonctionnalité dans le
    3.42    sien. Ils veulent un dépôt partagé avec à la fois le correctif du
    3.43 @@ -381,4 +379,4 @@
    3.44  local variables: 
    3.45  sgml-parent-document: ("00book.xml" "book" "chapter")
    3.46  end:
    3.47 --->
    3.48 \ No newline at end of file
    3.49 +-->
     4.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     4.2 +++ b/it/00book.xml	Fri Sep 04 16:33:35 2009 +0200
     4.3 @@ -0,0 +1,123 @@
     4.4 +<?xml version="1.0" encoding="UTF-8"?>
     4.5 +<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
     4.6 + "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd"
     4.7 +[
     4.8 +<!-- Below are references to files in this directory. -->
     4.9 +
    4.10 +<!-- Chapters. -->
    4.11 +
    4.12 +<!ENTITY ch00     SYSTEM "ch00-preface.xml">
    4.13 +<!ENTITY ch01     SYSTEM "ch01-intro.xml">
    4.14 +<!ENTITY ch02     SYSTEM "ch02-tour-basic.xml">
    4.15 +<!ENTITY ch03     SYSTEM "ch03-tour-merge.xml">
    4.16 +<!ENTITY ch04     SYSTEM "ch04-concepts.xml">
    4.17 +<!ENTITY ch05     SYSTEM "ch05-daily.xml">
    4.18 +<!ENTITY ch06     SYSTEM "ch06-collab.xml">
    4.19 +<!ENTITY ch07     SYSTEM "ch07-filenames.xml">
    4.20 +<!ENTITY ch08     SYSTEM "ch08-branch.xml">
    4.21 +<!ENTITY ch09     SYSTEM "ch09-undo.xml">
    4.22 +<!ENTITY ch10     SYSTEM "ch10-hook.xml">
    4.23 +<!ENTITY ch11     SYSTEM "ch11-template.xml">
    4.24 +<!ENTITY ch12     SYSTEM "ch12-mq.xml">
    4.25 +<!ENTITY ch13     SYSTEM "ch13-mq-collab.xml">
    4.26 +<!ENTITY ch14     SYSTEM "ch14-hgext.xml">
    4.27 +<!ENTITY appA     SYSTEM "appA-svn.xml">
    4.28 +<!ENTITY appB     SYSTEM "appB-mq-ref.xml">
    4.29 +<!ENTITY appC     SYSTEM "appC-srcinstall.xml">
    4.30 +<!ENTITY appD     SYSTEM "appD-license.xml">
    4.31 +<!ENTITY bib      SYSTEM "bibliography.xml">
    4.32 +
    4.33 +<!-- Include our standard shortcuts. -->
    4.34 +
    4.35 +<!ENTITY % SHORTCUTS SYSTEM "book-shortcuts.xml">
    4.36 +%SHORTCUTS;
    4.37 +
    4.38 +<!-- Include automatically and manually generated code snippets. -->
    4.39 +
    4.40 +<!ENTITY % AUTOSNIPPETS SYSTEM "examples/auto-snippets.xml">
    4.41 +%AUTOSNIPPETS;
    4.42 +
    4.43 +]>
    4.44 +
    4.45 +<book id="hg">
    4.46 +  <title>Mercurial: la guida definitiva</title>
    4.47 +  
    4.48 +  <!-- hg parents &#x2d;&#x2d;template '{node|short} ({date|shortdate})' 
    4.49 +  <subtitle>Compiled from 8a1d3f1aff17 (2009-03-10)</subtitle>
    4.50 +  -->
    4.51 +  <subtitle>Compiled from $rev_id$</subtitle>
    4.52 +  <bookinfo>
    4.53 +    <edition>1</edition>
    4.54 +    <isbn>9780596800673</isbn>
    4.55 +    <authorgroup>
    4.56 +      <author>
    4.57 +        <firstname>Bryan</firstname>
    4.58 +        <surname>O'Sullivan</surname>
    4.59 +      </author>
    4.60 +    </authorgroup>
    4.61 +
    4.62 +    <editor>
    4.63 +      <firstname>Mike</firstname>
    4.64 +      <surname>Loukides</surname>
    4.65 +    </editor>
    4.66 +
    4.67 +    <copyright>
    4.68 +      <year>2006</year>
    4.69 +      <year>2007</year>
    4.70 +      <year>2008</year>
    4.71 +      <year>2009</year>
    4.72 +      <holder>Bryan O'Sullivan</holder>
    4.73 +    </copyright>
    4.74 +    
    4.75 +    <othercredit class="translator">
    4.76 +      <firstname>Giulio</firstname>
    4.77 +      <surname>Piancastelli</surname>
    4.78 +    </othercredit>
    4.79 +    
    4.80 +    <copyright>
    4.81 +      <year>2009</year>
    4.82 +      <holder>Giulio Piancastelli</holder>
    4.83 +    </copyright>
    4.84 +  </bookinfo>
    4.85 +
    4.86 +  <!-- BEGIN ch00 -->
    4.87 +  &ch00;
    4.88 +  <!-- BEGIN ch01 -->
    4.89 +  &ch01;
    4.90 +  <!-- BEGIN ch02 -->
    4.91 +  &ch02;
    4.92 +  <!-- BEGIN ch03 -->
    4.93 +  &ch03;
    4.94 +  <!-- BEGIN ch04 -->
    4.95 +  &ch04;
    4.96 +  <!-- BEGIN ch05 -->
    4.97 +  &ch05;
    4.98 +  <!-- BEGIN ch06 -->
    4.99 +  &ch06;
   4.100 +  <!-- BEGIN ch07 -->
   4.101 +  &ch07;
   4.102 +  <!-- BEGIN ch08 -->
   4.103 +  &ch08;
   4.104 +  <!-- BEGIN ch09 -->
   4.105 +  &ch09;
   4.106 +  <!-- BEGIN ch10 -->
   4.107 +  &ch10;
   4.108 +  <!-- BEGIN ch11 -->
   4.109 +  &ch11;
   4.110 +  <!-- BEGIN ch12 -->
   4.111 +  &ch12;
   4.112 +  <!-- BEGIN ch13 -->
   4.113 +  &ch13;
   4.114 +  <!-- BEGIN ch14 -->
   4.115 +  &ch14;
   4.116 +  <!-- BEGIN appA -->
   4.117 +  &appA;
   4.118 +  <!-- BEGIN appB -->
   4.119 +  &appB;
   4.120 +  <!-- BEGIN appC -->
   4.121 +  &appC;
   4.122 +  <!-- BEGIN appD -->
   4.123 +  &appD;
   4.124 +  <!-- BEGIN bib -->
   4.125 +  &bib;
   4.126 +</book>
     5.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     5.2 +++ b/it/Makefile	Fri Sep 04 16:33:35 2009 +0200
     5.3 @@ -0,0 +1,92 @@
     5.4 +include Makefile.vars
     5.5 +
     5.6 +# Makefile.vars includes the following system-dependent variables:
     5.7 +#
     5.8 +# dtd-url = the location of the DocBook 4.5 DTD on your filesystem
     5.9 +# system-xsl-dir = the location of DocBook XSLT on your filesystem
    5.10 +# dynamic-link-command = the command to link the DocBook XSLT to our styles 
    5.11 +# python = the location of Python 3.x on your filesystem
    5.12 +
    5.13 +xml-src-files := \
    5.14 +	00book.xml \
    5.15 +	$(wildcard ch*.xml) \
    5.16 +	$(wildcard app*.xml) \
    5.17 +	bibliography.xml
    5.18 +
    5.19 +xsltproc-opts := --nonet --xinclude
    5.20 +xmllint-opts := --noout --nonet --valid --path '$(dtd-url)'
    5.21 +
    5.22 +root-web := html
    5.23 +support-web := $(root-web)/support
    5.24 +obj-web := $(root-web)/read
    5.25 +figs-web-folder := $(obj-web)/figs
    5.26 +script-web := $(obj-web)/javascript
    5.27 +web-global := ../web
    5.28 +web-local := web
    5.29 +
    5.30 +html: $(obj-web)/index.html $(web-local)/index-read.html.in figs
    5.31 +
    5.32 +$(obj-web)/index.html: ../stylesheets/system-xsl .validated-00book.xml
    5.33 +	xsltproc $(xsltproc-opts) -o $(obj-web)/x ../stylesheets/it/web.xsl 00book.xml
    5.34 +	mkdir -p $(support-web)
    5.35 +	cp -f $(web-global)/icons/*.png $(support-web)
    5.36 +	cp $(web-global)/styles.css $(support-web)
    5.37 +	sed -i -e "s|figs/||g" $(support-web)/styles.css
    5.38 +	mkdir -p $(figs-web-folder)
    5.39 +	mkdir -p $(script-web)
    5.40 +	cp -f $(web-local)/*.js $(script-web)
    5.41 +
    5.42 +../stylesheets/system-xsl: $(system-xsl-dir)
    5.43 +	$(dynamic-link-command)
    5.44 +
    5.45 +$(web-local)/index-read.html.in: $(web-local)/genindex.py $(xml-src-files)
    5.46 +	cp $(web-local)/index-template.html $(obj-web)/index.html
    5.47 +	sed -i -e "s|{% block bodycontent %}{% endblock %}|$(shell cat $(web-local)/index-read.html.in)|g" $(obj-web)/index.html
    5.48 +	sed -i -e "s|/support/|../support/|g" $(obj-web)/*.html
    5.49 +	cp $(web-local)/index-template.html $(root-web)/index.html
    5.50 +	sed -i "s|{% block bodycontent %}{% endblock %}|$(shell cat $(web-local)/index-home.html.in)|g" $(root-web)/index.html
    5.51 +	sed -i -e "s|/support/|support/|g" $(root-web)/index.html
    5.52 +
    5.53 +$(web-local)/genindex.py: $(xml-src-files)
    5.54 +	cd $(web-local) && $(python) genindex.py
    5.55 +
    5.56 +valid: .validated-00book.xml
    5.57 +
    5.58 +.validated-00book.xml: $(xml-src-files)
    5.59 +	xmllint $(xmllint-opts) $<
    5.60 +	touch $@
    5.61 +
    5.62 +clean:
    5.63 +	rm -f $(web-local)/index-read.html.in
    5.64 +	rm -f .validated-00book.xml
    5.65 +	rm -rf $(root-web)
    5.66 +
    5.67 +image-folder := figs
    5.68 +# graphs, figures, screenshots
    5.69 +image-files := $(wildcard $(image-folder)/*.dot $(image-folder)/*.svg $(image-folder)/*.png)
    5.70 +# graphs
    5.71 +image-dot := $(filter %.dot, $(image-files))
    5.72 +# figures
    5.73 +image-svg := $(filter %.svg, $(image-files))
    5.74 +# screenshots
    5.75 +image-png := $(filter %.png, $(image-files))
    5.76 +
    5.77 +figs-web := \
    5.78 +	$(image-dot:$(image-folder)/%.dot=$(figs-web-folder)/%.png) \
    5.79 +	$(image-svg:$(image-folder)/%.svg=$(figs-web-folder)/%.png) \
    5.80 +	$(image-png:$(image-folder)/%.png=$(figs-web-folder)/%.png)
    5.81 +
    5.82 +figs: $(figs-web)
    5.83 +
    5.84 +$(figs-web-folder)/%.png: $(image-folder)/%.svg
    5.85 +	inkscape -D -d 120 -e $@ $<
    5.86 +
    5.87 +$(figs-web-folder)/%.png: $(figs-web-folder)/%.svg
    5.88 +	inkscape -D -e $@ $<
    5.89 +	rm $<
    5.90 +
    5.91 +$(figs-web-folder)/%.png: $(image-folder)/%.png
    5.92 +	cp $< $@
    5.93 +
    5.94 +$(figs-web-folder)/%.svg: $(image-folder)/%.dot
    5.95 +	dot -Tsvg -o $@ $<
     6.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     6.2 +++ b/it/README	Fri Sep 04 16:33:35 2009 +0200
     6.3 @@ -0,0 +1,89 @@
     6.4 +This is the Italian translation of "Mercurial: The Definitive Guide". The
     6.5 +original book has been written by Bryan O'Sullivan and published by O'Reilly
     6.6 +Media in 2009. The book has been translated into Italian by Giulio Piancastelli
     6.7 +and currently is available in electronic form only.
     6.8 +
     6.9 +This book is written in DocBook and uses a variety of tools to produce a
    6.10 +bunch of HTML pages to be published on a web site. Transformations towards a
    6.11 +single HTML page or a PDF document are also possible, but are currently not
    6.12 +directly supported.
    6.13 +
    6.14 +The tools needed to build the book are:
    6.15 +
    6.16 + * DocBook XML DTD, version 4.5 (untested with a different version)
    6.17 + * DocBook XSL stylesheets, version >1.75.2 (see later)
    6.18 + * libxml2-utils, containing xmllint (used to validate the XML chapters against
    6.19 +   the DocBook DTD) and xmlproc (used to transform XML to HTML)
    6.20 + * Graphviz, to transform DOT files (textual representations of graphs, yay)
    6.21 +   into SVG images
    6.22 + * Inkscape, to transform SVG images into PNG images
    6.23 + * Python 3 (ah, yes, I'm sorry, see later), to generate a proper TOC
    6.24 +
    6.25 +(Apparently, if you want also to generate a PDF document out of the DocBook
    6.26 +sources, the suggested tools are Java, Saxon, and FOP. You're still on your
    6.27 +own here.)
    6.28 +
    6.29 +Once you have your tools properly installed, just type
    6.30 +
    6.31 +  $ make html
    6.32 +
    6.33 +and you should be set. First, the book is validated; then, XML is transformed
    6.34 +into HTML; using the Mercurial repository, a Python 3 script generates a proper
    6.35 +table of contents for the book; finally, images are transformed, and voilà, you
    6.36 +have your own multi-page HTML version of the book. No other moving parts here.
    6.37 +
    6.38 +Now, let me briefly explain the two esoteric requirements about DocBook XSL and
    6.39 +Python 3. First, the XSL stylesheets. As of today (23th August, 2009) the
    6.40 +latest release of the DocBook XSL stylesheets is 1.75.2. So why I ask you to
    6.41 +grab a release that doesn't even exist yet? Because the latest development
    6.42 +snapshot includes a patch that allows an Italian writer to use complex
    6.43 +prepositions in front of xrefs to sections. Without that patch, you will end up
    6.44 +with text like "come abbiamo visto nella <a href=...>la sezione ...</a>", which
    6.45 +is frankly unreadable. And you do want to read your newly generated version of
    6.46 +the book, don't you? So, grab a DocBook XSL stylesheet development snapshot
    6.47 +while waiting for 1.75.3 to be released, and have a go with it.
    6.48 +
    6.49 +Well, and what about Python 3? I'm sorry. I like it, I just happen to be a fan,
    6.50 +so I'm using it everywhere I can, including this book. You can use it, too.
    6.51 +The only Python script in the build system is it/web/genindex.py; anyway, it
    6.52 +should not be that difficult to edit in order to let it run on Python 2, if you
    6.53 +can't or don't want to use Python 3. Actually, my genindex.py is the result of
    6.54 +converting Bryan's genindex.py to Python 3... but you can't use that script
    6.55 +directly, because it contains some HTML text that I translated into Italian,
    6.56 +and is not capable to make the References appear into the main TOC.
    6.57 +
    6.58 +WINDOWS USERS BEWARE!
    6.59 +
    6.60 +If you are building the book on a Windows system, good luck. I have written
    6.61 +the entire translation on a Windows 2000 box (uh, yes, it's 2009 and they still
    6.62 +exist) so I know how much the process can hurt. Thus, some words of advice
    6.63 +follow.
    6.64 +
    6.65 +First, the silent assumption of the build script is that you are on a Linux (or
    6.66 +probably just Unix-like) system. The build script is a Makefile, and uses
    6.67 +typical *nix tools such as cat and sed. On Windows, you really need to have
    6.68 +Cygwin installed. Look at the Makefile to know exactly which commands are used.
    6.69 +
    6.70 +Then, XSL transformations work on the basis of a symlink. ln -s. Yes. I know.
    6.71 +How the fuck are you supposed to do that on Windows? (Well, at least Windows
    6.72 +2000 and XP... I heard that newer versions should finally have that kind of
    6.73 +feature built-in.) Two words: junction points. Oh, and an acronym: NTFS.
    6.74 +Junction points are the equivalent of *nix symbolic links for directories
    6.75 +under Windows, but they only work on NTFS. If you have a FAT32 file system,
    6.76 +I believe you are screwed.
    6.77 +
    6.78 +More informations on junction points are available here:
    6.79 +
    6.80 +  http://technet.microsoft.com/en-us/sysinternals/bb896768.aspx
    6.81 +
    6.82 +Finally, Inkscape on the Windows command line has some limitations. You might
    6.83 +be forced to pass absolute pathnames to images, use the program from its
    6.84 +installation directory, or perform other esoteric contortions in order to have
    6.85 +it run properly.
    6.86 +
    6.87 +PLEASE SEND FEEDBACK. I'm willing to update build informations and do (or just
    6.88 +merge) some changes to the Makefile in order to improve the build process or
    6.89 +expand it (e.g. to generate also a PDF output). I can be reached by email:
    6.90 +
    6.91 +  Giulio Piancastelli <giulio.piancastelli@gmail.com>
    6.92 +
     7.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     7.2 +++ b/it/appA-svn.xml	Fri Sep 04 16:33:35 2009 +0200
     7.3 @@ -0,0 +1,336 @@
     7.4 +<appendix id="chap:svn">
     7.5 +  <?dbhtml filename="migrare-verso-mercurial.html"?>
     7.6 +<title>Migrare verso Mercurial</title>
     7.7 +
     7.8 +  <para id="x_6e1">Un modo comune di esplorare un nuovo strumento di controllo di revisione è quello di sperimentarlo trasferendo un progetto esistente piuttosto che cominciare un nuovo progetto da zero.</para>
     7.9 +
    7.10 +  <para id="x_6e2">In questa appendice, parleremo di come importare la cronologia di un progetto in Mercurial e di quello a cui dovete essere preparati se siete abituati a un sistema di controllo di revisione differente.</para>
    7.11 +
    7.12 +  <sect1>
    7.13 +    <title>Importare la cronologia da un altro sistema</title>
    7.14 +
    7.15 +    <para id="x_6e3">Mercurial include un&rsquo;estensione chiamata <literal>convert</literal> che può importare la cronologia di un progetto dalla maggior parte dei sistemi di controllo di revisione più popolari. Al momento in cui il libro è stato scritto, l&rsquo;estensione può importare la cronologia dai seguenti sistemi:</para>
    7.16 +    <itemizedlist>
    7.17 +      <listitem>
    7.18 +	<para id="x_6e4">Subversion</para>
    7.19 +      </listitem>
    7.20 +      <listitem>
    7.21 +	<para id="x_6e5">CVS</para>
    7.22 +      </listitem>
    7.23 +      <listitem>
    7.24 +	<para id="x_6e6">git</para>
    7.25 +      </listitem>
    7.26 +      <listitem>
    7.27 +	<para id="x_6e7">Darcs</para>
    7.28 +      </listitem>
    7.29 +      <listitem>
    7.30 +	<para id="x_6e8">Bazaar</para>
    7.31 +      </listitem>
    7.32 +      <listitem>
    7.33 +	<para id="x_6e9">Monotone</para>
    7.34 +      </listitem>
    7.35 +      <listitem>
    7.36 +	<para id="x_6ea">GNU Arch</para>
    7.37 +      </listitem>
    7.38 +      <listitem>
    7.39 +	<para id="x_6eb">Mercurial</para>
    7.40 +      </listitem>
    7.41 +    </itemizedlist>
    7.42 +
    7.43 +    <para id="x_6ec">(Per verificare perché lo stesso Mercurial sia supportato come sorgente da cui importare la cronologia, si veda la <xref linkend="svn.filemap"/>.)</para>
    7.44 +
    7.45 +    <para id="x_6ed">Potete attivare l&rsquo;estensione nel solito modo, modificando il vostro file <filename>~/.hgrc</filename>.</para>
    7.46 +
    7.47 +    <programlisting>[extensions]
    7.48 +convert =</programlisting>
    7.49 +
    7.50 +    <para id="x_6ee">Questo renderà disponibile il comando <command>hg convert</command>. Il comando è facile da usare. Per esempio, l&rsquo;invocazione seguente importerà in Mercurial la cronologia di Subversion per Nose, un framework per il collaudo di unità.</para>
    7.51 +
    7.52 +    <screen><prompt>$</prompt> <userinput>hg convert http://python-nose.googlecode.com/svn/trunk</userinput></screen>
    7.53 +
    7.54 +    <para id="x_6ef">L&rsquo;estensione <literal>convert</literal> opera in maniera incrementale. In altre parole, dopo che avete invocato <command>hg convert</command> una prima volta, invocandolo nuovamente importerete tutte le nuove revisioni che sono state inserite dopo la vostra prima esecuzione del comando. La conversione incrementale funzionerà solo se invocate <command>hg convert</command> nello stesso repository Mercurial che avete usato in origine, perché l&rsquo;estensione <literal>convert</literal> salva alcuni metadati privati all&rsquo;interno del repository in un file chiamato <filename>.hg/shamap</filename> non soggetto al controllo di revisione.</para>
    7.55 +
    7.56 +    <para id="x_707">Quando volete cominciare a effettuare modifiche usando Mercurial, è preferibile clonare l&rsquo;albero in cui state facendo le vostre conversioni e tenere da parte l&rsquo;albero originale per dedicarlo a future conversioni incrementali. Questo è il modo più sicuro per estrarre i futuri commit dal sistema di controllo di revisione sorgente e incorporarli nel progetto Mercurial che avete appena creato.</para>
    7.57 +
    7.58 +    <sect2>
    7.59 +      <title>Convertire molti rami</title>
    7.60 +
    7.61 +      <para id="x_708">Il comando <command>hg convert</command> eseguito in precedenza converte solo la cronologia del <literal>trunk</literal> del repository Subversion. Se invece usiamo l&rsquo;URL <literal>http://python-nose.googlecode.com/svn</literal>, Mercurial individuerà automaticamente le directory <literal>trunk</literal>, <literal>tags</literal> e <literal>branches</literal> che compongono la struttura usata di solito dai progetti Subversion e le importerà come rami separati.</para>
    7.62 +
    7.63 +      <para id="x_709">Per default, a ogni ramo Subversion importato in Mercurial viene assegnato un nome. Dopo che la conversione si è conclusa, potete ottenere una lista dei nomi dei rami attivi nel repository Mercurial usando <command>hg branches -a</command>. Se preferite importare i rami Subversion senza nomi, passate l&rsquo;opzione <option>--config convert.hg.usebranchnames=false</option> al comando <command>hg convert</command>.</para>
    7.64 +
    7.65 +      <para id="x_70a">Una volta che avete convertito il vostro albero, se volete seguire la consuetudine tipica per Mercurial di lavorare in un albero che contiene un singolo ramo, potete clonare quel singolo ramo usando <command>hg clone -r nomedelramo</command>.</para>
    7.66 +    </sect2>
    7.67 +
    7.68 +    <sect2>
    7.69 +      <title>Correlare i nomi utente</title>
    7.70 +
    7.71 +      <para id="x_6f0">Alcuni strumenti di controllo di revisione salvano con ogni inserimento solo nomi utenti brevi che possono essere difficili da interpretare. Con Mercurial, la norma è quella di salvare il nome e l&rsquo;indirizzo email di chi effettua il commit, due informazioni molto più utili se in seguito volessimo contattare quella persona.</para>
    7.72 +
    7.73 +      <para id="x_6f1">Se state convertendo un albero da un sistema di controllo di revisione che usa nomi brevi, potete correlare quei nomi a equivalenti più lunghi passando l&rsquo;opzione <option>--authors</option> al comando <command>hg convert</command>. Questa opzione accetta un nome di file che dovrebbe contenere voci nel seguente formato.</para>
    7.74 +
    7.75 +      <programlisting>arist = Aristotele &lt;aristotele@filo.example.gr&gt;
    7.76 +soc = Socrate &lt;socrate@filo.example.gr&gt;</programlisting>
    7.77 +
    7.78 +      <para id="x_6f2">Ogni volta che <literal>convert</literal> incontra un commit associato al nome utente <literal>arist</literal> nel repository sorgente, userà il nome <literal>Aristotele &lt;aristotele@filo.example.gr&gt;</literal> nella revisione convertita in Mercurial. Se non viene trovata alcuna corrispondenza per un certo nome, quel nome viene usato alla lettera.</para>
    7.79 +    </sect2>
    7.80 +
    7.81 +    <sect2 id="svn.filemap">
    7.82 +      <title>Riordinare l&rsquo;albero</title>
    7.83 +
    7.84 +      <para id="x_6f3">Non tutti i progetti hanno una cronologia pulita. Potrebbe esserci una directory che non avrebbe mai dovuto essere inserita, un file che è troppo grande, o un&rsquo;intera gerarchia che ha bisogno di essere riorganizzata.</para>
    7.85 +
    7.86 +      <para id="x_6f4">L&rsquo;estensione <literal>convert</literal> supporta l&rsquo;idea di una <quote>mappa di file</quote> che può essere impiegata per riorganizzare i file e le directory di un progetto nel momento in cui se ne importa la cronologia. Questo è utile non solo quando si importa la cronologia da altri sistemi di controllo di revisione, ma anche per potare o riorganizzare un albero Mercurial.</para>
    7.87 +
    7.88 +      <para id="x_6f5">Per specificare una mappa di file, usate l&rsquo;opzione <option>--filemap</option> e fornitele un nome di file. Una mappa di file contiene righe nei seguenti formati.</para>
    7.89 +
    7.90 +      <programlisting># Questo è un commento
    7.91 +# Le righe vuote vengono ignorate
    7.92 +
    7.93 +include percorso/del/file
    7.94 +
    7.95 +exclude percorso/del/file
    7.96 +
    7.97 +rename da/qualche/percorso a/qualche/altra/posizione
    7.98 +</programlisting>
    7.99 +
   7.100 +      <para id="x_6f6">La direttiva <literal>include</literal> provoca l&rsquo;inclusione di un file, o di tutti i file contenuti in una directory, nel repository destinazione. Questa direttiva provoca anche l&rsquo;esclusione di tutti gli altri file o directory che non sono state esplicitamente incluse. La direttiva <literal>exclude</literal> provoca l&rsquo;esclusione dei file e delle directory indicate e di tutti quegli altri percorsi che non sono stati esplicitamente menzionati per essere inclusi.</para>
   7.101 +
   7.102 +      <para id="x_6f7">Per spostare un file o una directory da una posizione a un&rsquo;altra, usate la direttiva <literal>rename</literal>. Se dovete spostare un file o una directory da una sottodirectory alla radice del repository, usate <literal>.</literal> come secondo argomento della direttiva <literal>rename</literal>.</para>
   7.103 +    </sect2>
   7.104 +
   7.105 +    <sect2>
   7.106 +      <title>Migliorare le prestazioni della conversione da Subversion</title>
   7.107 +
   7.108 +      <para id="x_70b">Avrete spesso bisogno di fare diversi tentativi prima di trovare la combinazione perfetta tra mappa di utenti, mappa di file e altri parametri di conversione. La conversione di un repository Subversion attraverso un protocollo di accesso come ssh o HTTP può procedere migliaia di volte più lentamente di quanto Mercurial sia capace di operare in realtà, a causa della latenza di rete. Questo può rendere molto complicata la messa a punto di quella ricetta per la conversione perfetta.</para>
   7.109 +
   7.110 +      <para id="x_70c">Il comando <ulink url="http://svn.collab.net/repos/svn/trunk/notes/svnsync.txt"><command>svnsync</command></ulink> può velocizzare notevolmente la conversione di un repository Subversion. Serve per creare un mirror di sola lettura di un repository Subversion. L&rsquo;idea è quella di creare un mirror locale del vostro albero Subversion per poi convertire il mirror in un repository Mercurial.</para>
   7.111 +
   7.112 +      <para id="x_70d">Immaginiamo di voler convertire il repository Subversion che contiene il popolare progetto Memcached in un albero Mercurial. Per prima cosa, creiamo un repository Subversion locale.</para>
   7.113 +
   7.114 +      <screen><prompt>$</prompt> <userinput>svnadmin create memcached-mirror</userinput></screen>
   7.115 +
   7.116 +      <para id="x_70e">Successivamente, impostiamo un hook Subversion di cui <command>svnsync</command> ha bisogno.</para>
   7.117 +
   7.118 +      <screen><prompt>$</prompt> <userinput>echo '#!/bin/sh' > memcached-mirror/hooks/pre-revprop-change</userinput>
   7.119 +<prompt>$</prompt> <userinput>chmod +x memcached-mirror/hooks/pre-revprop-change</userinput></screen>
   7.120 +
   7.121 +      <para id="x_70f">Poi inizializziamo <command>svnsync</command> in questo repository.</para>
   7.122 +
   7.123 +      <screen><prompt>$</prompt> <userinput>svnsync --init file://`pwd`/memcached-mirror \
   7.124 +  http://code.sixapart.com/svn/memcached</userinput></screen>
   7.125 +
   7.126 +      <para id="x_710">Il passo successivo consiste nell&rsquo;avviare il processo di creazione del mirror con il comando <command>svnsync</command>.</para>
   7.127 +
   7.128 +      <screen><prompt>$</prompt> <userinput>svnsync sync file://`pwd`/memcached-mirror</userinput></screen>
   7.129 +
   7.130 +      <para id="x_711">Infine, importiamo la cronologia del nostro mirror locale del repository Subversion in un repository Mercurial.</para>
   7.131 +
   7.132 +      <screen><prompt>$</prompt> <userinput>hg convert memcached-mirror</userinput></screen>
   7.133 +      
   7.134 +      <para id="x_712">Se il repository Subversion è ancora attivo, possiamo usare questo processo in maniera incrementale. Invochiamo <command>svnsync</command> per propagare i nuovi cambiamenti verso il nostro mirror e poi invochiamo <command>hg convert</command> per importarli nel nostro albero Mercurial.</para>
   7.135 +
   7.136 +      <para id="x_713">Un&rsquo;importazione in due stadi realizzata con <command>svnsync</command> ha due vantaggi. Il primo è che <command>svnsync</command> usa una sincronizzazione di rete con Subversion più efficiente rispetto al comando <command>hg convert</command>, quindi trasferisce meno dati attraverso la rete. Il secondo è che l&rsquo;importazione da un albero Subversion locale è così veloce che potete aggiustare ripetutamente le vostre impostazioni di conversione senza aspettare ogni volta la terminazione di un processo di conversione basato su rete e dolorosamente lento.</para>
   7.137 +    </sect2>
   7.138 +  </sect1>
   7.139 +
   7.140 +  <sect1>
   7.141 +    <title>Migrare da Subversion</title>
   7.142 +
   7.143 +    <para id="x_6f8">Attualmente Subversion è il sistema di controllo di revisione open source più popolare. Sebbene ci siano molte differenze tra Mercurial e Subversion, effettuare una transizione da Subversion a Mercurial non è particolarmente difficile. I due sistemi hanno insiemi di comandi simili e interfacce generalmente uniformi.</para>
   7.144 +
   7.145 +    <sect2>
   7.146 +      <title>Differenze filosofiche</title>
   7.147 +
   7.148 +      <para id="x_6f9">Naturalmente, la differenza fondamentale tra Subversion e Mercurial è che Subversion è centralizzato mentre Mercurial è distribuito. Dato che Mercurial memorizza tutta la cronologia di un progetto sul vostro disco locale, ha bisogno di accedere alla rete solo quando volete esplicitamente comunicare con un altro repository. Al contrario, Subversion memorizza localmente un&rsquo;esigua quantità di informazioni, perciò il client deve contattare il proprio server per molte operazioni comuni.</para>
   7.149 +
   7.150 +      <para id="x_6fa">Subversion riesce più o meno a cavarsela senza una nozione di ramo ben definita: qualificare come ramo una porzione dello spazio di nomi sul server è una questione di convenzioni, e il software non impone alcuna costrizione. Mercurial tratta un repository come l&rsquo;unità della gestione dei rami.</para>
   7.151 +
   7.152 +      <sect3>
   7.153 +	<title>L&rsquo;ambito dei comandi</title>
   7.154 +
   7.155 +	<para id="x_6fb">Dato che Subversion non sa quali parti del suo spazio di nomi siano realmente rami, tratta la maggior parte dei comandi come se richiedesse di operare al livello della directory in cui vi trovate e ai livelli sottostanti. Per esempio, se eseguite <command>svn log</command>, otterrete la cronologia di qualunque parte dell&rsquo;albero stiate osservando, non dell&rsquo;intero albero.</para>
   7.156 +
   7.157 +	<para id="x_6fc">Il comportamento predefinito di Mercurial è differente perché i suoi comandi operano sull&rsquo;intero repository. Eseguite <command>hg log</command> e vi mostrerà la cronologia dell&rsquo;intero albero, a prescindere da quale parte della directory di lavoro stiate visitando in quel momento. Se volete solo la cronologia di un file o di una directory particolare, vi basta fornire un nome al comando, e.g. <command>hg log sorgenti</command>.</para>
   7.158 +
   7.159 +	<para id="x_6fd">Secondo la mia esperienza, questa differenza nel comportamento predefinito dei comandi è probabilmente la cosa che può confondervi di più se dovete spostarvi frequentemente avanti e indietro tra i due strumenti.</para>
   7.160 +      </sect3>
   7.161 +
   7.162 +      <sect3>
   7.163 +	<title>Operazioni multi-utente e sicurezza</title>
   7.164 +
   7.165 +	<para id="x_6fe">Con Subversion, è normale (anche se blandamente deprecato) che più persone collaborino su un singolo ramo. Se Alice e Bruno stanno lavorando insieme e Alice inserisce alcune modifiche nel ramo condiviso, Bruno deve aggiornare la vista del ramo del suo client prima di poter effettuare un commit. Dato che in quel momento non esiste alcuna registrazione permanente dei cambiamenti fatti da Bruno, le sue modifiche potrebbero rovinarsi o andare perdute durante e dopo questo aggiornamento.</para>
   7.166 +
   7.167 +	<para id="x_6ff">Mercurial, invece, incoraggia un modello di inserimento-e-unione. Bruno inserisce le sue modifiche nella sua copia locale del repository prima di estrarre o trasmettere i cambiamenti da o verso il server che condivide con Alice. Se Alice trasmette i suoi cambiamenti prima che Bruno provi a trasmettere i propri, Bruno non sarà in grado di trasmettere i suoi cambiamenti prima di aver estratto quelli di Alice, averli incorporati e aver effettuato il commit dei risultati dell&rsquo;unione. Se Bruno commette un errore durante l&rsquo;unione, può sempre ritornare al commit con il quale aveva registrato i suoi cambiamenti.</para>
   7.168 +
   7.169 +	<para id="x_700">Vale la pena sottolineare che questi sono i modi più comuni di lavorare con questi strumenti. Subversion supporta un modello più sicuro per consentirvi di lavorare nel vostro ramo personale, che però in pratica si rivela abbastanza scomodo da non essere particolarmente diffuso. Mercurial può supportare un modello meno sicuro che permette di estrarre e unire i cambiamenti nonostante la presenza di modifiche non ancora registrate, ma questo è considerato estremamente inusuale.</para>
   7.170 +      </sect3>
   7.171 +
   7.172 +      <sect3>
   7.173 +	<title>Cambiamenti locali o pubblici</title>
   7.174 +
   7.175 +	<para id="x_701">Il comando <command>svn commit</command> pubblica immediatamente i cambiamenti su un server dove possono essere visti da chiunque abbia accesso in lettura.</para>
   7.176 +
   7.177 +	<para id="x_702">Con Mercurial, i commit sono sempre locali e devono essere pubblicati successivamente tramite il comando <command>hg push</command>.</para>
   7.178 +
   7.179 +	<para id="x_703">Ogni approccio ha i propri vantaggi e svantaggi. Il modello di Subversion prevede che i cambiamenti siano pubblicati, e quindi revisionabili e utilizzabili, immediatamente. D&rsquo;altra parte, questo significa che un utente deve avere accesso in scrittura a un repository per utilizzare normalmente lo strumento, ma la maggior parte dei progetti open source non concede i permessi di scrittura alla leggera.</para>
   7.180 +
   7.181 +	<para id="x_704">L&rsquo;approccio di Mercurial consente a chiunque possa clonare un repository di inserirvi modifiche senza il bisogno del permesso di qualcun altro e di pubblicare i propri cambiamenti e continuare a partecipare nel modo che preferisce. A causa della distinzione tra le operazioni di inserimento e trasmissione dei cambiamenti, può capitare che qualcuno effettui il commit di alcune modifiche sul proprio computer e si allontani per qualche giorno dimenticandosi di trasmetterli, cosa che in rari casi potrebbe bloccare temporaneamente le attività dei collaboratori.</para>
   7.182 +      </sect3>
   7.183 +    </sect2>
   7.184 +
   7.185 +    <sect2>
   7.186 +      <title>Guida rapida</title>
   7.187 +
   7.188 +      <table>
   7.189 +	<title>Equivalenze tra i comandi Subversion e Mercurial</title>
   7.190 +	<tgroup cols="3">
   7.191 +	  <thead>
   7.192 +	    <row>
   7.193 +	      <entry>Subversion</entry>
   7.194 +	      <entry>Mercurial</entry>
   7.195 +	      <entry>Notes</entry>
   7.196 +	    </row>
   7.197 +	  </thead>
   7.198 +	  <tbody>
   7.199 +	    <row>
   7.200 +	      <entry><command>svn add</command></entry>
   7.201 +	      <entry><command>hg add</command></entry>
   7.202 +	      <entry></entry>
   7.203 +	    </row>
   7.204 +	    <row>
   7.205 +	      <entry><command>svn blame</command></entry>
   7.206 +	      <entry><command>hg annotate</command></entry>
   7.207 +	      <entry></entry>
   7.208 +	    </row>
   7.209 +	    <row>
   7.210 +	      <entry><command>svn cat</command></entry>
   7.211 +	      <entry><command>hg cat</command></entry>
   7.212 +	      <entry></entry>
   7.213 +	    </row>
   7.214 +	    <row>
   7.215 +	      <entry><command>svn checkout</command></entry>
   7.216 +	      <entry><command>hg clone</command></entry>
   7.217 +	      <entry></entry>
   7.218 +	    </row>
   7.219 +	    <row>
   7.220 +	      <entry><command>svn cleanup</command></entry>
   7.221 +	      <entry>n/a</entry>
   7.222 +	      <entry>Nessuna pulizia necessaria</entry>
   7.223 +	    </row>
   7.224 +	    <row>
   7.225 +	      <entry><command>svn commit</command></entry>
   7.226 +	      <entry><command>hg commit</command>; <command>hg
   7.227 +		  push</command></entry>
   7.228 +	      <entry><command>hg push</command> pubblica le modifiche dopo il commit</entry>
   7.229 +	    </row>
   7.230 +	    <row>
   7.231 +	      <entry><command>svn copy</command></entry>
   7.232 +	      <entry><command>hg clone</command></entry>
   7.233 +	      <entry>Per creare un nuovo ramo</entry>
   7.234 +	    </row>
   7.235 +	    <row>
   7.236 +	      <entry><command>svn copy</command></entry>
   7.237 +	      <entry><command>hg copy</command></entry>
   7.238 +	      <entry>Per copiare file o directory</entry>
   7.239 +	    </row>
   7.240 +	    <row>
   7.241 +	      <entry><command>svn delete</command> (<command>svn
   7.242 +		  remove</command>)</entry>
   7.243 +	      <entry><command>hg remove</command></entry>
   7.244 +	      <entry></entry>
   7.245 +	    </row>
   7.246 +	    <row>
   7.247 +	      <entry><command>svn diff</command></entry>
   7.248 +	      <entry><command>hg diff</command></entry>
   7.249 +	      <entry></entry>
   7.250 +	    </row>
   7.251 +	    <row>
   7.252 +	      <entry><command>svn export</command></entry>
   7.253 +	      <entry><command>hg archive</command></entry>
   7.254 +	      <entry></entry>
   7.255 +	    </row>
   7.256 +	    <row>
   7.257 +	      <entry><command>svn help</command></entry>
   7.258 +	      <entry><command>hg help</command></entry>
   7.259 +	      <entry></entry>
   7.260 +	    </row>
   7.261 +	    <row>
   7.262 +	      <entry><command>svn import</command></entry>
   7.263 +	      <entry><command>hg addremove</command>; <command>hg
   7.264 +		  commit</command></entry>
   7.265 +	      <entry></entry>
   7.266 +	    </row>
   7.267 +	    <row>
   7.268 +	      <entry><command>svn info</command></entry>
   7.269 +	      <entry><command>hg parents</command></entry>
   7.270 +	      <entry>Mostra quale revisione è stata estratta</entry>
   7.271 +	    </row>
   7.272 +	    <row>
   7.273 +	      <entry><command>svn info</command></entry>
   7.274 +	      <entry><command>hg showconfig
   7.275 +		  paths.parent</command></entry>
   7.276 +	      <entry>Mostra da quale URL è avvenuta l&rsquo;estrazione</entry>
   7.277 +	    </row>
   7.278 +	    <row>
   7.279 +	      <entry><command>svn list</command></entry>
   7.280 +	      <entry><command>hg manifest</command></entry>
   7.281 +	      <entry></entry>
   7.282 +	    </row>
   7.283 +	    <row>
   7.284 +	      <entry><command>svn log</command></entry>
   7.285 +	      <entry><command>hg log</command></entry>
   7.286 +	      <entry></entry>
   7.287 +	    </row>
   7.288 +	    <row>
   7.289 +	      <entry><command>svn merge</command></entry>
   7.290 +	      <entry><command>hg merge</command></entry>
   7.291 +	      <entry></entry>
   7.292 +	    </row>
   7.293 +	    <row>
   7.294 +	      <entry><command>svn mkdir</command></entry>
   7.295 +	      <entry>n/a</entry>
   7.296 +	      <entry>Mercurial non tiene traccia delle directory</entry>
   7.297 +	    </row>
   7.298 +	    <row>
   7.299 +	      <entry><command>svn move</command> (<command>svn
   7.300 +		  rename</command>)</entry>
   7.301 +	      <entry><command>hg rename</command></entry>
   7.302 +	      <entry></entry>
   7.303 +	    </row>
   7.304 +	    <row>
   7.305 +	      <entry><command>svn resolved</command></entry>
   7.306 +	      <entry><command>hg resolve -m</command></entry>
   7.307 +	      <entry></entry>
   7.308 +	    </row>
   7.309 +	    <row>
   7.310 +	      <entry><command>svn revert</command></entry>
   7.311 +	      <entry><command>hg revert</command></entry>
   7.312 +	      <entry></entry>
   7.313 +	    </row>
   7.314 +	    <row>
   7.315 +	      <entry><command>svn status</command></entry>
   7.316 +	      <entry><command>hg status</command></entry>
   7.317 +	      <entry></entry>
   7.318 +	    </row>
   7.319 +	    <row>
   7.320 +	      <entry><command>svn update</command></entry>
   7.321 +	      <entry><command>hg pull -u</command></entry>
   7.322 +	      <entry></entry>
   7.323 +	    </row>
   7.324 +	  </tbody>
   7.325 +	</tgroup>
   7.326 +      </table>
   7.327 +    </sect2>
   7.328 +  </sect1>
   7.329 +
   7.330 +  <sect1>
   7.331 +    <title>Suggerimenti utili per i principianti</title>
   7.332 +
   7.333 +    <para id="x_705">In alcuni sistemi di controllo di revisione, può diventare complicato stampare le differenze per una singola revisione registrata nel repository. Per esempio, con Subversion, per vedere cos&rsquo;è cambiato nella revisione 104654 dovete digitare <command>svn diff -r104653:104654</command>. Mercurial elimina la necessità di digitare due volte l&rsquo;identificatore di revisione in questo caso comune. Per ottenere solo le differenze, digitate <command>hg export 104654</command>. Per ottenere un messaggio dal registro della cronologia seguito dalle differenze, digitate <command>hg log -r104654 -p</command>.</para>
   7.334 +
   7.335 +    <para id="x_706">Quando eseguite <command>hg status</command> senza argomenti, vi viene mostrato lo stato dell&rsquo;intero albero, con i percorsi relativi alla radice del repository. Questo rende complicato copiare un nome di file dal risultato di <command>hg status</command> alla riga di comando. Se eseguite <command>hg status</command> passandogli il nome di un file o di una directory, il comando stamperà i percorsi relativi alla vostra posizione corrente. Quindi, per ottenere da <command>hg status</command> lo stato di tutto l&rsquo;albero, con i percorsi relativi alla vostra directory corrente invece che alla radice del repository, passate il risultato di <command>hg root</command> al comando <command>hg status</command>. Su un sistema di tipo Unix, potete farlo facilmente nel modo che segue:</para>
   7.336 +
   7.337 +    <screen><prompt>$</prompt> <userinput>hg status `hg root`</userinput></screen>
   7.338 +  </sect1>
   7.339 +</appendix>
     8.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     8.2 +++ b/it/appB-mq-ref.xml	Fri Sep 04 16:33:35 2009 +0200
     8.3 @@ -0,0 +1,278 @@
     8.4 +<appendix id="chap:mqref">
     8.5 +  <?dbhtml filename="guida-di-riferimento-di-mercurial-queues.html"?>
     8.6 +  <title>Guida di riferimento a Mercurial Queues</title>
     8.7 +
     8.8 +  <sect1 id="sec:mqref:cmdref">
     8.9 +    <title>Guida di riferimento ai comandi MQ</title>
    8.10 +
    8.11 +    <para id="x_5e8">Per un&rsquo;introduzione ai comandi forniti da MQ, usate il comando <command role="hg-cmd">hg help mq</command>.</para>
    8.12 +
    8.13 +    <sect2>
    8.14 +      <title><command role="hg-ext-mq">qapplied</command>&emdash;stampa le patch applicate</title>
    8.15 +
    8.16 +      <para id="x_5e9">Il comando <command role="hg-ext-mq">qapplied</command> stampa la pila corrente delle patch applicate. Le patch vengono stampate in ordine dalla più vecchia alla più recente, così l&rsquo;ultima patch nella lista è quella <quote>in cima</quote> alla pila.</para>
    8.17 +
    8.18 +    </sect2>
    8.19 +    <sect2>
    8.20 +      <title><command role="hg-ext-mq">qcommit</command>&emdash;registra i cambiamenti nel repository della coda</title>
    8.21 +
    8.22 +      <para id="x_5ea">Il comando <command role="hg-ext-mq">qcommit</command> registra qualsiasi cambiamento in sospeso nel repository <filename role="special" class="directory">.hg/patches</filename>. Questo comando funziona solo se la directory <filename role="special" class="directory">.hg/patches</filename> è un repository, cioè se avete creato la directory usando <command role="hg-cmd">hg qinit <option role="hg-ext-mq-cmd-qinit-opt">-c</option></command> o avete invocato <command role="hg-cmd">hg init</command> nella directory dopo aver eseguito <command role="hg-ext-mq">qinit</command>.</para>
    8.23 +
    8.24 +      <para id="x_5eb">Questo comando è un&rsquo;abbreviazione di <command role="hg-cmd">hg commit --cwd .hg/patches</command>.</para>
    8.25 +    </sect2>
    8.26 +    <sect2>
    8.27 +	<title><command role="hg-ext-mq">qdelete</command>&emdash;elimina una patch dal file <filename role="special">series</filename></title>
    8.28 +
    8.29 +      <para id="x_5ec">Il comando <command role="hg-ext-mq">qdelete</command> rimuove la voce relativa a una patch dal file <filename role="special">series</filename> nella directory <filename role="special" class="directory">.hg/patches</filename>. Non estrae la patch se la patch è già applicata. Per default, non cancella il file della patch, perciò dovrete usare l&rsquo;opzione <option role="hg-ext-mq-cmd-qdel-opt">-f</option> se volete fare questo.</para>
    8.30 +
    8.31 +      <para id="x_5ed">Opzioni:</para>
    8.32 +      <itemizedlist>
    8.33 +	<listitem><para id="x_5ee"><option role="hg-ext-mq-cmd-qdel-opt">-f</option>: cancella il file della patch.</para>
    8.34 +	</listitem>
    8.35 +      </itemizedlist>
    8.36 +
    8.37 +    </sect2>
    8.38 +    <sect2>
    8.39 +      <title><command role="hg-ext-mq">qdiff</command>&emdash;stampa un diff dell&rsquo;ultima patch applicata</title>
    8.40 +
    8.41 +      <para id="x_5ef">Il comando <command role="hg-ext-mq">qdiff</command> stampa un diff dell&rsquo;ultima patch applicata. &Egrave; equivalente al comando <command role="hg-cmd">hg diff -r-2:-1</command>.</para>
    8.42 +
    8.43 +    </sect2>
    8.44 +    <sect2>
    8.45 +      <title><command role="hg-ext-mq">qfinish</command>&emdash;sposta le patch applicate nella cronologia del repository</title>
    8.46 +
    8.47 +      <para id="x_72d">Il comando <command>hg qfinish</command> converte le patch applicate specificate in modifiche permanenti, spostandole fuori dal controllo di MQ in modo che siano trattate come normale cronologia del repository.</para>
    8.48 +    </sect2>
    8.49 +
    8.50 +    <sect2>
    8.51 +      <title><command role="hg-ext-mq">qfold</command>&emdash;unisce (<quote>include</quote>) diverse patch in una</title>
    8.52 +
    8.53 +      <para id="x_5f0">Il comando <command role="hg-ext-mq">qfold</command> unisce più patch all&rsquo;ultima patch applicata, in modo che l&rsquo;ultima patch applicata rappresenti l&rsquo;unione di tutti i cambiamenti delle patch in questione.</para>
    8.54 +
    8.55 +      <para id="x_5f1">Le patch da includere non devono essere applicate, altrimenti <command role="hg-ext-mq">qfold</command> terminerà segnalando un errore. L&rsquo;ordine in cui le patch vengono incluse è significativo: <command role="hg-cmd">hg qfold a b</command> significa <quote>applica la patch più recente, seguita da <literal>a</literal>, seguita da <literal>b</literal></quote>.</para>
    8.56 +
    8.57 +      <para id="x_5f2">I commenti delle patch incluse vengono aggiunti alla fine dei commenti della patch di destinazione, separando ogni blocco di commenti con tre caratteri di asterisco (<quote><literal>*</literal></quote>). Usate l&rsquo;opzione <option role="hg-ext-mq-cmd-qfold-opt">-e</option> per modificare il messaggio di commit della patch/changeset combinata dopo che l&rsquo;inclusione è stata completata.</para>
    8.58 +
    8.59 +      <para id="x_5f3">Opzioni:</para>
    8.60 +      <itemizedlist>
    8.61 +	<listitem><para id="x_5f4"><option role="hg-ext-mq-cmd-qfold-opt">-e</option>: modifica il messaggio di commit e la descrizione di patch per la nuova patch combinata.</para>
    8.62 +	</listitem>
    8.63 +	<listitem><para id="x_5f5"><option role="hg-ext-mq-cmd-qfold-opt">-l</option>: usa il testo contenuto nel file dato come nuovo messaggio di commit e descrizione di patch per la patch combinata.</para>
    8.64 +	</listitem>
    8.65 +	<listitem><para id="x_5f6"><option role="hg-ext-mq-cmd-qfold-opt">-m</option>: usa il testo dato come nuovo messaggio di commit e descrizione di patch per la patch combinata.</para>
    8.66 +	</listitem>
    8.67 +      </itemizedlist>
    8.68 +
    8.69 +    </sect2>
    8.70 +    <sect2>
    8.71 +      <title><command role="hg-ext-mq">qheader</command>&emdash;mostra l&rsquo;intestazione/descrizione di una patch</title>
    8.72 +
    8.73 +      <para id="x_5f7">Il comando <command role="hg-ext-mq">qheader</command> stampa l&rsquo;intestazione, o descrizione, di una patch. Per default, stampa l&rsquo;intestazione dell&rsquo;ultima patch applicata. Dato un argomento, stampa l&rsquo;intestazione della patch indicata.</para>
    8.74 +
    8.75 +    </sect2>
    8.76 +    <sect2>
    8.77 +      <title><command role="hg-ext-mq">qimport</command>&emdash;importa una patch di terze parti nella coda</title>
    8.78 +
    8.79 +      <para id="x_5f8">Il comando <command role="hg-ext-mq">qimport</command> aggiunge una voce per una patch esterna al file <filename role="special">series</filename> e copia la patch nella directory <filename role="special" class="directory">.hg/patches</filename>. Aggiunge la voce immediatamente dopo l&rsquo;ultima patch applicata, ma non inserisce la patch.</para>
    8.80 +
    8.81 +      <para id="x_5f9">Se la directory <filename role="special" class="directory">.hg/patches</filename> è un repository, <command role="hg-ext-mq">qimport</command> usa <command role="hg-cmd">hg add</command> per aggiungere automaticamente la patch importata.</para>
    8.82 +
    8.83 +    </sect2>
    8.84 +    <sect2>
    8.85 +      <title><command role="hg-ext-mq">qinit</command>&emdash;prepara un repository per lavorare con MQ</title>
    8.86 +
    8.87 +      <para id="x_5fa">Il comando <command role="hg-ext-mq">qinit</command> prepara un repository per lavorare con MQ. Crea una directory chiamata <filename role="special" class="directory">.hg/patches</filename>.</para>
    8.88 +
    8.89 +      <para id="x_5fb">Opzioni:</para>
    8.90 +      <itemizedlist>
    8.91 +	<listitem><para id="x_5fc"><option role="hg-ext-mq-cmd-qinit-opt">-c</option>: crea <filename role="special" class="directory">.hg/patches</filename> sotto forma di repository. Crea anche un file <filename role="special">.hgignore</filename> che ignorerà il file <filename role="special">status</filename>.</para>
    8.92 +	</listitem>
    8.93 +      </itemizedlist>
    8.94 +
    8.95 +      <para id="x_5fd">Quando la directory <filename role="special" class="directory">.hg/patches</filename> è un repository, i comandi <command role="hg-ext-mq">qimport</command> e <command role="hg-ext-mq">qnew</command> useranno automaticamente <command role="hg-cmd">hg add</command> per aggiungere nuove patch.</para>
    8.96 +
    8.97 +    </sect2>
    8.98 +    <sect2>
    8.99 +      <title><command role="hg-ext-mq">qnew</command>&emdash;crea una nuova patch</title>
   8.100 +
   8.101 +      <para id="x_5fe">Il comando <command role="hg-ext-mq">qnew</command> crea una nuova patch. Prende come argomento obbligatorio il nome da usare per il file di patch. La nuova patch viene creata vuota per default, viene aggiunta al file <filename role="special">series</filename> dopo l&rsquo;ultima patch applicata e viene immediatamente inserita sopra quella patch.</para>
   8.102 +
   8.103 +      <para id="x_5ff">Se <command role="hg-ext-mq">qnew</command> trova qualche file modificato nella directory di lavoro, si rifiuterà di creare una nuova patch a meno che non usiate l&rsquo;opzione <option role="hg-ext-mq-cmd-qnew-opt">-f</option> (vedete più avanti). Questo comportamento vi permette di aggiornare l&rsquo;ultima patch applicata tramite <command role="hg-ext-mq">qrefresh</command> prima di applicare una nuova patch.</para>
   8.104 +
   8.105 +      <para id="x_600">Opzioni:</para>
   8.106 +      <itemizedlist>
   8.107 +	<listitem><para id="x_601"><option role="hg-ext-mq-cmd-qnew-opt">-f</option>: crea una nuova patch se il contenuto della directory di lavoro è stato modificato. Ogni cambiamento in sospeso viene aggiunto alla patch appena creata, pertanto al termine dell&rsquo;esecuzione del comando la directory di lavoro non risulterà più modificata.</para>
   8.108 +	</listitem>
   8.109 +	<listitem><para id="x_602"><option role="hg-ext-mq-cmd-qnew-opt">-m</option>: usa il testo dato come messaggio di commit. Il testo verrà memorizzato all&rsquo;inizio del file di patch, prima dei dati di patch.</para>
   8.110 +	</listitem>
   8.111 +      </itemizedlist>
   8.112 +
   8.113 +    </sect2>
   8.114 +    <sect2>
   8.115 +      <title><command role="hg-ext-mq">qnext</command>&emdash;stampa il nome della patch successiva</title>
   8.116 +
   8.117 +      <para id="x_603">Il comando <command role="hg-ext-mq">qnext</command> stampa il nome della patch nel file <filename role="special">series</filename> che segue la patch applicata più recentemente. Questa patch diventerà l&rsquo;ultima patch applicata se invocate <command role="hg-ext-mq">qpush</command>.</para>
   8.118 +
   8.119 +    </sect2>
   8.120 +    <sect2>
   8.121 +      <title><command role="hg-ext-mq">qpop</command>&emdash;estrae le patch dalla pila</title>
   8.122 +
   8.123 +      <para id="x_604">Il comando <command role="hg-ext-mq">qpop</command> rimuove patch applicate dalla cima della pila delle patch applicate. Per default, rimuove solo una patch.</para>
   8.124 +
   8.125 +      <para id="x_605">Questo comando rimuove dal repository i changeset che rappresentano le patch estratte e aggiorna la directory di lavoro per annullare gli effetti delle patch.</para>
   8.126 +
   8.127 +      <para id="x_606">Questo comando accetta un argomento opzionale che viene usato per indicare il nome o l&rsquo;indice numerico della patch da estrarre. Se viene passato un nome, il comando continuerà a estrarre patch fino a quando la patch nominata sarà in cima alla pila delle patch applicate. Se viene passato un numero, <command role="hg-ext-mq">qpop</command> tratterà il numero come un indice d&rsquo;accesso alle voci presenti nel file della serie, partendo da zero (le righe vuote e le righe contenenti solo commenti non vengono contate). Il comando continuerà a estrarre patch fino a quando la patch identificata dall&rsquo;indice dato sarà in cima alla pila delle patch applicate.</para>
   8.128 +
   8.129 +      <para id="x_607">Il comando <command role="hg-ext-mq">qpop</command> non legge e non modifica né le patch né il file <filename role="special">series</filename>. Perciò, potete tranquillamente usare <command role="hg-ext-mq">qpop</command> su una patch che avete rimosso dal file <filename role="special">series</filename>, oppure su una patch che avete rinominato o completamente cancellato. Negli ultimi due casi, usate il nome che la patch aveva quando l&rsquo;avete applicata.</para>
   8.130 +
   8.131 +      <para id="x_608">Per default, il comando <command role="hg-ext-mq">qpop</command> non estrarrà alcuna patch se la directory di lavoro è stata modificata. Potete cambiare questo comportamento usando l&rsquo;opzione <option role="hg-ext-mq-cmd-qpop-opt">-f</option>, che annulla tutte le modifiche nella directory di lavoro.</para>
   8.132 +
   8.133 +      <para id="x_609">Opzioni:</para>
   8.134 +      <itemizedlist>
   8.135 +	<listitem><para id="x_60a"><option role="hg-ext-mq-cmd-qpop-opt">-a</option>: estrae tutte le patch applicate, riportando il repository allo stato in cui era prima che applicaste qualunque patch.</para>
   8.136 +	</listitem>
   8.137 +	<listitem><para id="x_60b"><option role="hg-ext-mq-cmd-qpop-opt">-f</option>: annulla forzatamente qualsiasi modifica alla directory di lavoro al momento dell&rsquo;estrazione.</para>
   8.138 +	</listitem>
   8.139 +	<listitem><para id="x_60c"><option role="hg-ext-mq-cmd-qpop-opt">-n</option>: estrae una patch dalla coda nominata.</para>
   8.140 +	</listitem>
   8.141 +      </itemizedlist>
   8.142 +
   8.143 +      <para id="x_60d">Il comando <command role="hg-ext-mq">qpop</command> rimuove una riga alla fine del file <filename role="special">status</filename> per ogni patch che ha estratto.</para>
   8.144 +
   8.145 +    </sect2>
   8.146 +    <sect2>
   8.147 +      <title><command role="hg-ext-mq">qprev</command>&emdash;stampa il nome della patch precedente</title>
   8.148 +
   8.149 +      <para id="x_60e">Il comando <command role="hg-ext-mq">qprev</command> stampa il nome della patch nel file <filename role="special">series</filename> che precede la patch applicata più recentemente. Questa patch diventerà l&rsquo;ultima patch applicata se invocate <command role="hg-ext-mq">qpop</command>.</para>
   8.150 +
   8.151 +    </sect2>
   8.152 +    <sect2 id="sec:mqref:cmd:qpush">
   8.153 +      <title><command role="hg-ext-mq">qpush</command>&emdash;inserisce le patch in cima alla pila</title>
   8.154 +
   8.155 +      <para id="x_60f">Il comando <command role="hg-ext-mq">qpush</command> aggiunge le patch in cima alla pila delle patch applicate. Per default, aggiunge solo una patch.</para>
   8.156 +
   8.157 +      <para id="x_610">Questo comando crea un nuovo changeset per rappresentare ogni patch applicata e aggiorna la directory di lavoro per applicare gli effetti delle patch.</para>
   8.158 +
   8.159 +      <para id="x_611">I dati predefiniti usati per creare un changeset sono i seguenti.</para>
   8.160 +      <itemizedlist>
   8.161 +	<listitem><para id="x_612">La data e il fuso orario del commit sono la data e il fuso orario corrente. Dato che questi dati vengono usati per computare l&rsquo;identità di un changeset, questo significa che se invocate <command role="hg-ext-mq">qpop</command> su una patch e poi invocate <command role="hg-ext-mq">qpush</command> sulla stessa patch, il changeset che inserite avrà un&rsquo;identità diversa dal changeset che avete estratto.</para>
   8.162 +	</listitem>
   8.163 +	<listitem><para id="x_613">L&rsquo;autore è quello predefinito usato dal comando <command role="hg-cmd">hg commit</command>.</para>
   8.164 +	</listitem>
   8.165 +	<listitem><para id="x_614">Il messaggio di commit è il testo proveniente dal file di patch che precede la prima intestazione del diff. Se questo testo non è presente, viene usato un messaggio di commit predefinito che identifica il nome della patch.</para>
   8.166 +	</listitem>
   8.167 +      </itemizedlist>
   8.168 +      <para id="x_615">Se una patch contiene un&rsquo;intestazione di patch Mercurial, i dati nell&rsquo;intestazione di patch sostituiscono quelli predefiniti.</para>
   8.169 +
   8.170 +      <para id="x_616">Opzioni:</para>
   8.171 +      <itemizedlist>
   8.172 +	<listitem><para id="x_617"><option role="hg-ext-mq-cmd-qpush-opt">-a</option>: inserisce tutte le patch non applicate contenute nel file <filename role="special">series</filename> fino a quando non ne rimane nessuna da inserire.</para>
   8.173 +	</listitem>
   8.174 +	<listitem><para id="x_618"><option role="hg-ext-mq-cmd-qpush-opt">-l</option>: aggiunge il nome della patch alla fine del messaggio di commit.</para>
   8.175 +	</listitem>
   8.176 +	<listitem><para id="x_619"><option role="hg-ext-mq-cmd-qpush-opt">-m</option>: se l&rsquo;applicazione di una patch fallisce, usa la voce relativa alla patch contenuta in un&rsquo;altra coda salvata per computare i parametri di un&rsquo;unione a tre vie, effettuando poi l&rsquo;unione a tre vie attraverso il normale meccanismo di unione di Mercurial. Usa il risultato dell&rsquo;unione come nuovo contenuto della patch.</para>
   8.177 +	</listitem>
   8.178 +	<listitem><para id="x_61a"><option role="hg-ext-mq-cmd-qpush-opt">-n</option>: usa la coda nominata se effettua un&rsquo;unione durante l&rsquo;inserimento.</para>
   8.179 +	</listitem>
   8.180 +      </itemizedlist>
   8.181 +
   8.182 +      <para id="x_61b">Il comando <command role="hg-ext-mq">qpush</command> legge, ma non modifica, il file <filename role="special">series</filename>. Aggiunge una riga alla fine del file <filename role="special">status</filename> per ogni patch inserita.</para>
   8.183 +
   8.184 +    </sect2>
   8.185 +    <sect2>
   8.186 +      <title><command
   8.187 +	  role="hg-ext-mq">qrefresh</command>&emdash;aggiorna l&rsquo;ultima patch applicata</title>
   8.188 +
   8.189 +      <para id="x_61c">Il comando <command role="hg-ext-mq">qrefresh</command> aggiorna l&rsquo;ultima patch applicata. Modifica la patch, rimuove il vecchio changeset che rappresentava la patch e crea un nuovo changeset per rappresentare la patch modificata.</para>
   8.190 +
   8.191 +      <para id="x_61d">Il comando <command role="hg-ext-mq">qrefresh</command> si occupa delle seguenti modifiche.</para>
   8.192 +      <itemizedlist>
   8.193 +	<listitem><para id="x_61e">I cambiamenti al messaggio di commit, cioè al testo che precede la prima intestazione di diff nel file di patch, vengono riflessi nel nuovo changeset che rappresenta la patch.</para>
   8.194 +	</listitem>
   8.195 +	<listitem><para id="x_61f">Le modifiche ai file registrati nella directory di lavoro vengono aggiunte alla patch.</para>
   8.196 +	</listitem>
   8.197 +	<listitem><para id="x_620">Per quanto riguarda le modifiche ai file registrati apportate tramite <command role="hg-cmd">hg add</command>, <command role="hg-cmd">hg copy</command>, <command role="hg-cmd">hg remove</command>, o <command role="hg-cmd">hg rename</command>, i file aggiunti e i file destinazione di copie e cambiamenti di nome vengono aggiunti alla patch, mentre i file rimossi e i file sorgente dei cambiamenti di nome vengono rimossi.</para>
   8.198 +	</listitem>
   8.199 +      </itemizedlist>
   8.200 +
   8.201 +      <para id="x_621">Anche se <command role="hg-ext-mq">qrefresh</command> non trova alcun cambiamento, ricrea comunque il changeset che rappresenta la patch. Questo produce una differenza tra l&rsquo;identità del nuovo changeset e quella del precedente changeset che identificava la patch.</para>
   8.202 +
   8.203 +      <para id="x_622">Opzioni:</para>
   8.204 +      <itemizedlist>
   8.205 +	<listitem><para id="x_623"><option role="hg-ext-mq-cmd-qrefresh-opt">-e</option>: modifica il messaggio di commit e la descrizione della patch, usando l&rsquo;editor di testo preferito.</para>
   8.206 +	</listitem>
   8.207 +	<listitem><para id="x_624"><option role="hg-ext-mq-cmd-qrefresh-opt">-m</option>: modifica il messaggio di commit e la descrizione della patch, usando il testo dato.</para>
   8.208 +	</listitem>
   8.209 +	<listitem><para id="x_625"><option role="hg-ext-mq-cmd-qrefresh-opt">-l</option>: modifica il messaggio di commit e la descrizione della patch, usando il testo contenuto nel file dato.</para>
   8.210 +	</listitem>
   8.211 +      </itemizedlist>
   8.212 +
   8.213 +    </sect2>
   8.214 +    <sect2>
   8.215 +      <title><command role="hg-ext-mq">qrename</command>&emdash;rinomina una patch</title>
   8.216 +
   8.217 +      <para id="x_626">Il comando <command role="hg-ext-mq">qrename</command> rinomina una patch e modifica la voce relativa alla patch nel file <filename role="special">series</filename>.</para>
   8.218 +
   8.219 +      <para id="x_627">Con un singolo argomento, <command role="hg-ext-mq">qrename</command> rinomina l&rsquo;ultima patch applicata. Con due argomenti, cambia il nome del primo argomento al secondo argomento.</para>
   8.220 +
   8.221 +    </sect2>
   8.222 +    <sect2>
   8.223 +      <title><command role="hg-ext-mq">qseries</command>&emdash;stampa l&rsquo;intera serie di patch</title>
   8.224 +
   8.225 +      <para id="x_62a">Il comando <command role="hg-ext-mq">qseries</command> stampa l&rsquo;intera serie di patch contenuta nel file <filename role="special">series</filename>. Stampa solo i nomi delle patch, saltando le righe vuote e i commenti. Stampa le patch in ordine dalla prima patch da applicare all&rsquo;ultima.</para>
   8.226 +
   8.227 +    </sect2>
   8.228 +    <sect2>
   8.229 +      <title><command role="hg-ext-mq">qtop</command>&emdash;stampa il nome della patch corrente</title>
   8.230 +
   8.231 +      <para id="x_62b">Il comando <command role="hg-ext-mq">qtop</command> stampa il nome della patch attualmente in cima alla pila delle patch applicate.</para>
   8.232 +
   8.233 +    </sect2>
   8.234 +    <sect2>
   8.235 +      <title><command
   8.236 +	  role="hg-ext-mq">qunapplied</command>&emdash;stampa le patch non ancora applicate</title>
   8.237 +
   8.238 +      <para id="x_62c">Il comando <command role="hg-ext-mq">qunapplied</command> stampa i nomi delle patch non ancora applicate contenute nel file <filename role="special">series</filename>, nell&rsquo;ordine in cui le patch verrebbero inserite.</para>
   8.239 +
   8.240 +    </sect2>
   8.241 +    <sect2>
   8.242 +      <title><command role="hg-cmd">hg strip</command>&emdash;rimuove una revisione e i suoi discendenti</title>
   8.243 +
   8.244 +      <para id="x_62d">Il comando <command role="hg-cmd">hg strip</command> rimuove una revisione e tutti i suoi discendenti dal repository. Annulla gli effetti delle revisioni rimosse dal repository e aggiorna la directory di lavoro al primo genitore della revisione rimossa.</para>
   8.245 +
   8.246 +      <para id="x_62e">Il comando <command role="hg-cmd">hg strip</command> salva una copia di backup dei changeset rimossi in un bundle, in modo che possano essere riapplicati se sono stati rimossi per errore.</para>
   8.247 +
   8.248 +      <para id="x_62f">Opzioni:</para>
   8.249 +      <itemizedlist>
   8.250 +	<listitem><para id="x_630"><option role="hg-opt-strip">-b</option>: salva i changeset non correlati che sono mescolati ai changeset eliminati nel bundle di backup.</para>
   8.251 +	</listitem>
   8.252 +	<listitem><para id="x_631"><option role="hg-opt-strip">-f</option>: se un ramo ha più teste, rimuove tutte le teste.</para>
   8.253 +	</listitem>
   8.254 +	<listitem><para id="x_632"><option role="hg-opt-strip">-n</option>: evita di salvare il bundle di backup.</para>
   8.255 +	</listitem></itemizedlist>
   8.256 +
   8.257 +    </sect2>
   8.258 +  </sect1>
   8.259 +  <sect1>
   8.260 +    <title>Guida di riferimento ai file di MQ</title>
   8.261 +
   8.262 +    <sect2>
   8.263 +      <title>Il file <filename role="special">series</filename></title>
   8.264 +
   8.265 +      <para id="x_633">Il file <filename role="special">series</filename> contiene una lista dei nomi di tutte le patch che MQ può applicare. Viene rappresentato come una lista di nomi, con un nome salvato per riga. Lo spazio bianco all&rsquo;inizio e alla fine di ogni riga viene ignorato.</para>
   8.266 +
   8.267 +      <para id="x_634">Le righe possono contenere commenti. Un commento comincia con il carattere <quote><literal>#</literal></quote> e si estende fino alla fine della riga. Le righe vuote e le righe che contengono solo commenti vengono ignorate.</para>
   8.268 +
   8.269 +      <para id="x_635">Avrete spesso bisogno di modificare il file <filename role="special">series</filename> a mano, da cui il supporto per i commenti e le righe vuote appena descritto. Per esempio, potete commentare temporaneamente una patch in modo che <command role="hg-ext-mq">qpush</command> la salti quando applica le patch. Potete anche cambiare l&rsquo;ordine in cui le patch vengono applicate riordinando le loro voci nel file <filename role="special">series</filename>.</para>
   8.270 +
   8.271 +      <para id="x_636">Viene anche supportata la possibilità di mettere il file <filename role="special">series</filename> sotto controllo di revisione. &Egrave; una buona idea mettere sotto controllo di revisione anche tutte le patch a cui il file si riferisce. Se create una directory di patch usando l&rsquo;opzione <option role="hg-ext-mq-cmd-qinit-opt">-c</option> del comando <command role="hg-ext-mq">qinit</command>, questo verrà fatto per voi automaticamente.</para>
   8.272 +
   8.273 +    </sect2>
   8.274 +    <sect2>
   8.275 +      <title>Il file <filename role="special">status</filename></title>
   8.276 +
   8.277 +      <para id="x_637">Il flie <filename role="special">status</filename> contiene i nomi e gli hash di changeset per tutte le patch che MQ ha attualmente applicato. A differenza del file <filename role="special">series</filename>, questo file non è destinato a essere modificato. Non dovreste mettere questo file sotto controllo di revisione, né modificarlo in alcun modo. Viene usato da MQ per mantenere traccia di informazioni strettamente private.</para>
   8.278 +
   8.279 +    </sect2>
   8.280 +  </sect1>
   8.281 +</appendix>
     9.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     9.2 +++ b/it/appC-srcinstall.xml	Fri Sep 04 16:33:35 2009 +0200
     9.3 @@ -0,0 +1,33 @@
     9.4 +<appendix id="chap:srcinstall">
     9.5 +  <?dbhtml filename="installare-mercurial-dai-sorgenti.html"?>
     9.6 +  <title>Installare Mercurial dai sorgenti</title>
     9.7 +
     9.8 +  <sect1 id="sec:srcinstall:unixlike">
     9.9 +    <title>Sistemi di tipo Unix</title>
    9.10 +
    9.11 +    <para id="x_5e0">Se state usando un sistema di tipo Unix che include una versione sufficientemente recente di Python (2.3 o superiore), installare Mercurial dai sorgenti è facile.</para>
    9.12 +    <orderedlist>
    9.13 +      <listitem><para id="x_5e1">Scaricate un archivio dei sorgenti recente da <ulink url="http://www.selenic.com/mercurial/download">http://www.selenic.com/mercurial/download</ulink>.</para>
    9.14 +      </listitem>
    9.15 +      <listitem><para id="x_5e2">Estraete i contenuti dell&rsquo;archivio:</para>
    9.16 +	<programlisting>gzip -dc mercurial-VERSIONE.tar.gz | tar xf -</programlisting>
    9.17 +      </listitem>
    9.18 +      <listitem><para id="x_5e3">Posizionatevi nella directory dei sorgenti ed eseguite lo script di installazione che assemblerà Mercurial e lo installerà nella vostra directory personale.</para>
    9.19 +	<programlisting>cd mercurial-VERSIONE
    9.20 +python setup.py install --force --home=$HOME</programlisting>
    9.21 +      </listitem>
    9.22 +    </orderedlist>
    9.23 +    <para id="x_5e4">Una volta che l&rsquo;installazione è terminata, Mercurial si troverà nella sottodirectory <literal>bin</literal> della vostra directory personale. Non dimenticate di assicurarvi che questa directory sia presente nel percorso di ricerca della vostra shell.</para>
    9.24 +
    9.25 +    <para id="x_5e5">Probabilmente avrete bisogno di impostare la variabile d&rsquo;ambiente <envar>PYTHONPATH</envar> in modo che l&rsquo;eseguibile di Mercurial possa trovare il resto dei pacchetti di Mercurial. Per esempio, sul mio portatile, ho impostato il valore di quella variabile a <literal>/home/bos/lib/python</literal>. Il percorso esatto dipende da come Python è stato installato sul vostro sistema, ma dovrebbe essere facile da scoprire. Se non siete sicuri, date un&rsquo;occhiata alle informazioni precedentemente stampate dallo script di installazione e cercate il luogo in cui i contenuti della directory <literal>mercurial</literal> sono stati installati.</para>
    9.26 +
    9.27 +  </sect1>
    9.28 +  <sect1>
    9.29 +    <title>Windows</title>
    9.30 +
    9.31 +    <para id="x_5e6">Assemblare e installare Mercurial sotto Windows richiede una varietà di strumenti, una certa quantità di conoscenze tecniche e una considerevole dose di pazienza. Vi suggerisco vivamente di <emphasis>non</emphasis> seguire questa strada se siete un <quote>utente occasionale</quote>. A meno che non intendiate lavorare su Mercurial, vi raccomando invece di usare un pacchetto di installazione eseguibile.</para>
    9.32 +
    9.33 +    <para id="x_5e7">Se avete intenzione di assemblare Mercurial dai sorgenti su Windows, seguite le direttive <quote>pratiche</quote> sul wiki di Mercurial all&rsquo;indirizzo <ulink url="http://www.selenic.com/mercurial/wiki/index.cgi/WindowsInstall">http://www.selenic.com/mercurial/wiki/index.cgi/WindowsInstall</ulink> e aspettatevi che il processo comporti lo svolgimento di numerose operazioni complicate.</para>
    9.34 +
    9.35 +  </sect1>
    9.36 +</appendix>
    10.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    10.2 +++ b/it/appD-license.xml	Fri Sep 04 16:33:35 2009 +0200
    10.3 @@ -0,0 +1,90 @@
    10.4 +<appendix id="chap:opl">
    10.5 +  <?dbhtml filename="open-publication-license.html"?>
    10.6 +  <title>Open Publication License</title>
    10.7 +
    10.8 +  <para id="x_638">Questo volume è stato rilasciato sotto licenza Open Publication License, il cui testo viene qui di seguito riportato integralmente nella versione in lingua inglese non essendo disponibile, al momento della pubblicazione del libro, una traduzione ufficiale italiana con il corrispondente valore legale. Il testo della licenza fa riferimento alla Open Publication License versione 1.0, datata 8 giugno 1999.</para>
    10.9 +
   10.10 +  <sect1>
   10.11 +    <title>Requirements on both unmodified and modified versions</title>
   10.12 +
   10.13 +    <para id="x_639">The Open Publication works may be reproduced and distributed in whole or in part, in any medium physical or electronic, provided that the terms of this license are adhered to, and that this license or an incorporation of it by reference (with any options elected by the author(s) and/or publisher) is displayed in the reproduction.</para>
   10.14 +
   10.15 +    <para id="x_63a">Proper form for an incorporation by reference is as follows:</para>
   10.16 +
   10.17 +    <blockquote>
   10.18 +    <para id="x_63b">Copyright (c) <emphasis>year</emphasis> by <emphasis>author&rsquo;s name or designee</emphasis>. This material may be distributed only subject to the terms and conditions set forth in the Open Publication License, v<emphasis>x.y</emphasis> or later (the latest version is presently available at <ulink url="http://www.opencontent.org/openpub/">http://www.opencontent.org/openpub/</ulink>).</para>
   10.19 +    </blockquote>
   10.20 +
   10.21 +    <para id="x_63c">The reference must be immediately followed with any options elected by the author(s) and/or publisher of the document (see the section called <quote>License options</quote>).</para>
   10.22 +
   10.23 +    <para id="x_63d">Commercial redistribution of Open Publication-licensed material is permitted.</para>
   10.24 +
   10.25 +    <para id="x_63e">Any publication in standard (paper) book form shall require the citation of the original publisher and author. The publisher and author&rsquo;s names shall appear on all outer surfaces of the book. On all outer surfaces of the book the original publisher&rsquo;s name shall be as large as the title of the work and cited as possessive with respect to the title.</para>
   10.26 +
   10.27 +  </sect1>
   10.28 +  <sect1>
   10.29 +    <title>Copyright</title>
   10.30 +
   10.31 +    <para id="x_63f">The copyright to each Open Publication is owned by its author(s) or designee.</para>
   10.32 +
   10.33 +  </sect1>
   10.34 +  <sect1>
   10.35 +    <title>Scope of license</title>
   10.36 +
   10.37 +    <para id="x_640">The following license terms apply to all Open Publication works, unless otherwise explicitly stated in the document.</para>
   10.38 +
   10.39 +    <para id="x_641">Mere aggregation of Open Publication works or a portion of an Open Publication work with other works or programs on the same media shall not cause this license to apply to those other works. The aggregate work shall contain a notice specifying the inclusion of the Open Publication material and appropriate copyright notice.</para>
   10.40 +
   10.41 +    <para id="x_642"><emphasis role="bold">Severability</emphasis>. If any part of this license is found to be unenforceable in any jurisdiction, the remaining portions of the license remain in force.</para>
   10.42 +
   10.43 +    <para id="x_643"><emphasis role="bold">No warranty</emphasis>. Open Publication works are licensed and provided <quote>as is</quote> without warranty of any kind, express or implied, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose or a warranty of non-infringement.</para>
   10.44 +
   10.45 +  </sect1>
   10.46 +  <sect1>
   10.47 +    <title>Requirements on modified works</title>
   10.48 +
   10.49 +    <para id="x_644">All modified versions of documents covered by this license, including translations, anthologies, compilations and partial documents, must meet the following requirements:</para>
   10.50 +
   10.51 +    <orderedlist>
   10.52 +      <listitem><para id="x_645">The modified version must be labeled as such.</para>
   10.53 +      </listitem>
   10.54 +      <listitem><para id="x_646">The person making the modifications must be identified and the modifications dated.</para>
   10.55 +      </listitem>
   10.56 +      <listitem><para id="x_647">Acknowledgement of the original author and publisher if applicable must be retained according to normal academic citation practices.</para>
   10.57 +      </listitem>
   10.58 +      <listitem><para id="x_648">The location of the original unmodified document must be identified.</para>
   10.59 +      </listitem>
   10.60 +      <listitem><para id="x_649">The original author&rsquo;s (or authors&rsquo;) name(s) may not be used to assert or imply endorsement of the resulting document without the original author&rsquo;s (or authors&rsquo;) permission.</para>
   10.61 +      </listitem></orderedlist>
   10.62 +
   10.63 +  </sect1>
   10.64 +  <sect1>
   10.65 +    <title>Good-practice recommendations</title>
   10.66 +
   10.67 +    <para id="x_64a">In addition to the requirements of this license, it is requested from and strongly recommended of redistributors that:</para>
   10.68 +
   10.69 +    <orderedlist>
   10.70 +      <listitem><para id="x_64b">If you are distributing Open Publication works on hardcopy or CD-ROM, you provide email notification to the authors of your intent to redistribute at least thirty days before your manuscript or media freeze, to give the authors time to provide updated documents. This notification should describe modifications, if any, made to the document.</para>
   10.71 +      </listitem>
   10.72 +      <listitem><para id="x_64c">All substantive modifications (including deletions) be either clearly marked up in the document or else described in an attachment to the document.</para>
   10.73 +      </listitem>
   10.74 +      <listitem><para id="x_64d">Finally, while it is not mandatory under this license, it is considered good form to offer a free copy of any hardcopy and CD-ROM expression of an Open Publication-licensed work to its author(s).</para>
   10.75 +      </listitem></orderedlist>
   10.76 +
   10.77 +  </sect1>
   10.78 +  <sect1>
   10.79 +    <title>License options</title>
   10.80 +
   10.81 +    <para id="x_64e">The author(s) and/or publisher of an Open Publication-licensed document may elect certain options by appending language to the reference to or copy of the license. These options are considered part of the license instance and must be included with the license (or its incorporation by reference) in derived works.</para>
   10.82 +
   10.83 +    <orderedlist numeration="upperalpha">
   10.84 +      <listitem><para id="x_64f">To prohibit distribution of substantively modified versions without the explicit permission of the author(s). <quote>Substantive modification</quote> is defined as a change to the semantic content of the document, and excludes mere changes in format or typographical corrections.</para>
   10.85 +      <para id="x_650">To accomplish this, add the phrase <quote>Distribution of substantively modified versions of this document is prohibited without the explicit permission of the copyright holder.</quote> to the license reference or copy.</para>
   10.86 +      </listitem>
   10.87 +      <listitem><para id="x_651">To prohibit any publication of this work or derivative works in whole or in part in standard (paper) book form for commercial purposes is prohibited unless prior permission is obtained from the copyright holder.</para>
   10.88 +      <para id="x_652">To accomplish this, add the phrase <quote>Distribution of the work or derivative of the work in any standard (paper) book form is prohibited unless prior permission is obtained from the copyright holder.</quote> to the license reference or copy.</para>
   10.89 +      </listitem>
   10.90 +    </orderedlist>
   10.91 +
   10.92 +  </sect1>
   10.93 +</appendix>
    11.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    11.2 +++ b/it/bibliography.xml	Fri Sep 04 16:33:35 2009 +0200
    11.3 @@ -0,0 +1,54 @@
    11.4 +<bibliography id="chap:bib">
    11.5 +<?dbhtml filename="riferimenti.html"?>
    11.6 +<title>Riferimenti</title>
    11.7 +
    11.8 +<biblioentry id="bib:quilt" xreflabel="Quilt">
    11.9 +  <authorgroup>
   11.10 +    <author><firstname>Jean</firstname><surname>Delvare</surname></author>
   11.11 +    <author><firstname>Andreas</firstname><surname>Gruenbacher</surname></author>
   11.12 +    <author><firstname>Martin</firstname><surname>Quinson</surname></author>
   11.13 +  </authorgroup>
   11.14 +  <title>Patchwork quilt</title>
   11.15 +  <bibliomisc><uri>http://savannah.nongnu.org/projects/quilt</uri></bibliomisc>
   11.16 +</biblioentry>
   11.17 +<biblioentry id="bib:diffstat" xreflabel="Dickey">
   11.18 +  <author><firstname>Thomas</firstname><surname>Dickey</surname></author>
   11.19 +  <title><literal>diffstat</literal>&emdash;make a histogram of <literal>diff</literal> output</title>
   11.20 +  <bibliomisc><uri>http://dickey.his.com/diffstat/diffstat.html</uri></bibliomisc>
   11.21 +</biblioentry>
   11.22 +<biblioentry id="bib:mysql" xreflabel="MySQL-Python">
   11.23 +  <author><firstname>Andy</firstname><surname>Dustman</surname></author>
   11.24 +  <title>MySQL for Python</title>
   11.25 +  <bibliomisc><uri>http://sourceforge.net/projects/mysql-python</uri></bibliomisc>
   11.26 +</biblioentry>
   11.27 +<biblioentry id="bib:gru05" xreflabel="Gruenbacher2005">
   11.28 +  <author><firstname>Andreas</firstname><surname>Gruenbacher</surname></author>
   11.29 +  <title>How to survive with many patches (introduction to quilt)</title>
   11.30 +  <bibliomisc><uri>http://www.suse.de/~agruen/quilt.pdf</uri></bibliomisc>
   11.31 +  <date>June 2005</date>
   11.32 +</biblioentry>
   11.33 +<biblioentry id="bib:mpatch" xreflabel="Mason">
   11.34 +  <author><firstname>Chris</firstname><surname>Mason</surname></author>
   11.35 +  <title><literal>mpatch</literal>&emdash;help solve patch rejects</title>
   11.36 +  <bibliomisc><uri>http://oss.oracle.com/~mason/mpatch/</uri></bibliomisc>
   11.37 +</biblioentry>
   11.38 +<biblioentry id="bib:cp" xreflabel="ConfigParser">
   11.39 +  <corpauthor>Python.org</corpauthor>
   11.40 +  <title><literal>ConfigParser</literal>&emdash;configuration file parser</title>
   11.41 +  <bibliomisc><uri>http://docs.python.org/lib/module-ConfigParser.html</uri></bibliomisc>
   11.42 +</biblioentry>
   11.43 +<biblioentry id="bib:gnu" xreflabel="GNU-Standard">
   11.44 +  <authorgroup>
   11.45 +    <author><firstname>Richard</firstname><surname>Stallman</surname></author>
   11.46 +    <corpauthor>GNU Project volunteers</corpauthor>
   11.47 +  </authorgroup>
   11.48 +  <title>Gnu coding standards&emdash;change logs</title>
   11.49 +  <bibliomisc><uri>http://www.gnu.org/prep/standards/html_node/Change-Logs.html</uri></bibliomisc>
   11.50 +</biblioentry>
   11.51 +<biblioentry id="bib:patchutils" xreflabel="Waugh">
   11.52 +  <author><firstname>Tim</firstname><surname>Waugh</surname></author>
   11.53 +  <title><literal>patchutils</literal>&emdash;programs that operate on patch files</title>
   11.54 +  <bibliomisc><uri>http://cyberelk.net/tim/patchutils/</uri></bibliomisc>
   11.55 +</biblioentry>
   11.56 +
   11.57 +</bibliography>
    12.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    12.2 +++ b/it/book-shortcuts.xml	Fri Sep 04 16:33:35 2009 +0200
    12.3 @@ -0,0 +1,6 @@
    12.4 +<!-- Please keep the contents of this file sorted. -->
    12.5 +
    12.6 +<!ENTITY Agrave "&#192;">
    12.7 +<!ENTITY rsquo "&#8217;">
    12.8 +<!ENTITY Egrave "&#200;">
    12.9 +<!ENTITY emdash "&#8212;">
    13.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    13.2 +++ b/it/ch00-preface.xml	Fri Sep 04 16:33:35 2009 +0200
    13.3 @@ -0,0 +1,148 @@
    13.4 +<preface id="chap:preface">
    13.5 +  <?dbhtml filename="prefazione.html"?>
    13.6 +  <title>Prefazione</title>
    13.7 +
    13.8 +  <sect1>
    13.9 +    <title>Raccontare la tecnologia</title>
   13.10 +
   13.11 +    <para id="x_72e">Alcuni anni fa, quando cominciai a sentire il desiderio di spiegare perché credevo che il controllo di revisione distribuito fosse importante, questo campo era talmente nuovo che la letteratura pubblicata da offrire come riferimento alle persone interessate era quasi inesistente.</para>
   13.12 +
   13.13 +    <para id="x_72f">Sebbene a quel tempo fossi abbastanza impegnato a lavorare sui meccanismi interni di Mercurial, mi misi a scrivere questo libro perché sembrava il modo più efficace di aiutare il software a raggiungere il grande pubblico, accompagnandolo con l&rsquo;idea che il controllo di revisione dovesse essere distribuito per natura. Rendo il libro disponibile online secondo i termini di una licenza liberale per la stessa ragione: per diffondere il messaggio.</para>
   13.14 +
   13.15 +    <para id="x_730">Un buon libro di software possiede un ritmo familiare che assomiglia da vicino al racconto di una storia: che cos&rsquo;è questa cosa? Perché è importante? Come mi aiuterà? Come si usa? In questo libro, provo a rispondere a queste domande per il controllo di revisione distribuito in generale e per Mercurial in particolare.</para>
   13.16 +  </sect1>
   13.17 +    
   13.18 +  <sect1>
   13.19 +    <title>Grazie per il vostro sostegno a Mercurial</title>
   13.20 +
   13.21 +    <para id="x_731">Acquistando una copia di questo libro state sostenendo il continuo sviluppo e la libertà ininterrotta di Mercurial in particolare e del software libero e open source in generale. O&rsquo;Reilly Media e io stiamo donando le mie royalty sulle vendite di questo libro alla Software Freedom Conservancy (<ulink
   13.22 +	url="http://www.softwarefreedom.org/">http://www.softwarefreedom.org/</ulink>) che fornisce supporto in termini di personale e di assistenza legale a Mercurial e a un certo numero di altri progetti software open source importanti e meritevoli.</para>
   13.23 +  </sect1>
   13.24 +
   13.25 +  <sect1>
   13.26 +    <title>Ringraziamenti</title>
   13.27 +
   13.28 +    <para id="x_732">Questo libro non esisterebbe se non fosse per gli sforzi di Matt Mackall, l&rsquo;autore e capo progetto di Mercurial. Lo assistono abilmente centinaia di collaboratori volontari sparsi in tutto il mondo.</para>
   13.29 +
   13.30 +    <para id="x_733">I miei figli, Cian e Ruairi, si sono sempre fatti trovare pronti per aiutarmi a rilassarmi con meravigliosi e spericolati giochi da bambini. Vorrei anche ringraziare la mia ex moglie, Shannon, per il suo supporto.</para>
   13.31 +
   13.32 +    <para id="x_734">I miei colleghi e amici hanno fornito aiuto e sostegno in innumerevoli modi. Questa lista di persone non può che essere decisamente incompleta: Stephen Hahn, Karyn Ritter, Bonnie Corwin, James Vasile, Matt Norwood, Eben Moglen, Bradley Kuhn, Robert Walsh, Jeremy Fitzhardinge, Rachel Chalmers.</para>
   13.33 +
   13.34 +    <para id="x_735">Ho sviluppato questo libro pubblicamente, mettendo sul sito web del libro le bozze dei capitoli mano a mano che li completavo. I lettori mi hanno poi mandato le loro opinioni usando un&rsquo;applicazione web da me creata. Al momento in cui ho terminato il libro, più di 100 persone avevano inviato il proprio parere, un numero impressionante considerando che il sistema di commenti è stato attivo solo per circa due mesi verso la fine del processo di scrittura.</para> 
   13.35 +
   13.36 +    <para id="x_736">In particolare, vorrei esprimere la mia riconoscenza alle seguenti persone, che tra loro hanno contribuito più di un terzo del numero totale di commenti. Vorrei ringraziarli per la cura e l&rsquo;impegno che hanno messo nel fornire un giudizio talmente tanto dettagliato.</para> 
   13.37 +
   13.38 +    <para id="x_737">Martin Geisler, Damien Cassou, Alexey Bakhirkin, Till Plewe, Dan Himes, Paul Sargent, Gokberk Hamurcu, Matthijs van der Vleuten, Michael Chermside, John Mulligan, Jordi Fita, Jon Parise.</para>
   13.39 +
   13.40 +    <para id="x_738">Vorrei anche ringraziare le tante persone che mi hanno aiutato notando errori e fornendo utili suggerimenti in ogni parte del libro.</para>
   13.41 +
   13.42 +    <para id="x_739">Jeremy W. Sherman, Brian Mearns, Vincent Furia, Iwan Luijks, Billy Edwards, Andreas Sliwka, Paweł Sołyga, Eric Hanchrow, Steve Nicolai, Michał Masłowski, Kevin Fitch, Johan Holmberg, Hal Wine, Volker Simonis, Thomas P Jakobsen, Ted Stresen-Reuter, Stephen Rasku, Raphael Das Gupta, Ned Batchelder, Lou Keeble, Li Linxiao, Kao Cardoso Félix, Joseph Wecker, Jon Prescot, Jon Maken, John Yeary, Jason Harris, Geoffrey Zheng, Fredrik Jonson, Ed Davies, David Zumbrunnen, David Mercer, David Cabana, Ben Karel, Alan Franzoni, Yousry Abdallah, Whitney Young, Vinay Sajip, Tom Towle, Tim Ottinger, Thomas Schraitle, Tero Saarni, Ted Mielczarek, Svetoslav Agafonkin, Shaun Rowland, Rocco Rutte, Polo-Francois Poli, Philip Jenvey, Petr Tesałék, Peter R. Annema, Paul Bonser, Olivier Scherler, Olivier Fournier, Nick Parker, Nick Fabry, Nicholas Guarracino, Mike Driscoll, Mike Coleman, Mietek Bák, Michael Maloney, László Nagy, Kent Johnson, Julio Nobrega, Jord Fita, Jonathan March, Jonas Nockert, Jim Tittsler, Jeduan Cornejo Legorreta, Jan Larres, James Murphy, Henri Wiechers, Hagen Möbius, Gábor Farkas, Fabien Engels, Evert Rol, Evan Willms, Eduardo Felipe Castegnaro, Dennis Decker Jensen, Deniz Dogan, David Smith, Daed Lee, Christine Slotty, Charles Merriam, Guillaume Catto, Brian Dorsey, Bob Nystrom, Benoit Boissinot, Avi Rosenschein, Andrew Watts, Andrew Donkin, Alexey Rodriguez, Ahmed Chaudhary.</para>
   13.43 +  </sect1>
   13.44 +
   13.45 +  <sect1>
   13.46 +    <title>Convenzioni usate in questo libro</title>
   13.47 +
   13.48 +    <para id="x_73a">Per il testo di questo libro sono state adottate le seguenti convenzioni tipografiche.</para>
   13.49 +
   13.50 +    <variablelist>
   13.51 +      <varlistentry>
   13.52 +        <term><emphasis>Corsivo</emphasis></term>
   13.53 +
   13.54 +        <listitem>
   13.55 +          <para id="x_73b">Indica nuovi termini, URL, indirizzi email, nomi di file ed estensioni di file.</para>
   13.56 +        </listitem>
   13.57 +      </varlistentry>
   13.58 +
   13.59 +      <varlistentry>
   13.60 +        <term><literal>Spaziatura fissa</literal></term>
   13.61 +
   13.62 +        <listitem>
   13.63 +          <para id="x_73c">Usato per i listati dei programmi e all&rsquo;interno di paragrafi che fanno riferimento a elementi di programmazione come variabili o nomi di funzione, database, tipi di dato, variabili d&rsquo;ambiente, istruzioni e parole chiave.</para>
   13.64 +        </listitem>
   13.65 +      </varlistentry>
   13.66 +
   13.67 +      <varlistentry>
   13.68 +        <term><userinput>Spaziatura fissa in grassetto</userinput></term>
   13.69 +
   13.70 +        <listitem>
   13.71 +          <para id="x_73d">Mostra comandi o altro testo che dovrebbe essere digitato letteralmente dall&rsquo;utente.</para>
   13.72 +        </listitem>
   13.73 +      </varlistentry>
   13.74 +
   13.75 +      <varlistentry>
   13.76 +        <term><replaceable>Spaziatura fissa in corsivo</replaceable></term>
   13.77 +
   13.78 +        <listitem>
   13.79 +          <para id="x_73e">Mostra testo che dovrebbe essere sostituito da valori forniti dall&rsquo;utente oppure determinati dal contesto.</para>
   13.80 +        </listitem>
   13.81 +      </varlistentry>
   13.82 +    </variablelist>
   13.83 +
   13.84 +    <tip>
   13.85 +      <para id="x_73f">Questa icona indica un consiglio, suggerimento, o nota generale.</para>
   13.86 +    </tip>
   13.87 +
   13.88 +    <caution>
   13.89 +      <para id="x_740">Questa icona indica un avvertimento.</para>
   13.90 +    </caution>
   13.91 +  </sect1>
   13.92 +
   13.93 +  <sect1>
   13.94 +    <title>Usare gli esempi di codice</title>
   13.95 +
   13.96 +    <para id="x_741">Questo libro ha il compito di aiutarvi a svolgere il vostro lavoro. In generale, potete usare il codice che trovate in questo libro nei vostri programmi e nella vostra documentazione. Non è necessario che ci contattiate per chiedere il permesso, a meno che non stiate riproducendo una porzione significativa del codice. Per esempio, non avete bisogno di un permesso per scrivere un programma che usa diversi frammenti di codice estratti da questo libro, ma dovete richiedere un permesso se desiderate vendere o distribuire un CD-ROM di esempi tratti dai libri pubblicati da O&rsquo;Reilly. Non ci vuole alcun permesso per rispondere a una domanda citando questo libro e riproducendo codice di esempio, ma dovete richiedere un permesso per incorporare nella documentazione di un vostro prodotto una quantità significativa di codice proveniente da questo libro.</para>
   13.97 +
   13.98 +    <para id="x_742">Apprezziamo, ma non richiediamo, l&rsquo;attribuzione del materiale utilizzato. Un&rsquo;attribuzione di solito include il titolo, l&rsquo;autore, l&rsquo;editore e il codice ISBN. Per esempio: “<emphasis>Titolo del libro</emphasis> di Qualche Autore. Copyright 2008 O’Reilly Media, Inc., 978-0-596-xxxx-x.”</para>
   13.99 +
  13.100 +    <para id="x_743">Se credete che il vostro utilizzo del codice di esempio ricada fuori dai confini della correttezza o dei permessi illustrati sopra, sentitevi liberi di contattarci all&rsquo;indirizzo email <email>permissions@oreilly.com</email>.</para>
  13.101 +  </sect1>
  13.102 +
  13.103 +  <sect1>
  13.104 +    <title>Safari® Books Online</title>
  13.105 +
  13.106 +    <note role="safarienabled">
  13.107 +      <para id="x_744">Quando vedete un&rsquo;icona Safari® Books Online sulla copertina del vostro libro tecnico preferito, questo significa che quel libro è disponibile attraverso la libreria Safari di O&rsquo;Reilly Network.</para>
  13.108 +    </note>
  13.109 +
  13.110 +    <para id="x_745">Safari offre una soluzione più vantaggiosa rispetto agli e-book. &Egrave; una libreria virtuale che vi permette di effettuare facilmente ricerche su migliaia di libri tecnici, copiare e incollare gli esempi di codice, scaricare capitoli e trovare risposte veloci quando avete bisogno delle informazioni più accurate e recenti. Provatelo gratis all&rsquo;indirizzo <ulink role="orm:hideurl:ital"
  13.111 +	url="http://my.safaribooksonline.com/?portal=oreilly">http://my.safaribooksonline.com</ulink>.</para>
  13.112 +  </sect1>
  13.113 +
  13.114 +  <sect1>
  13.115 +    <title>Come contattarci</title>
  13.116 +
  13.117 +    <para id="x_746">Per favore spedite commenti e domande riguardanti questo libro all&rsquo;editore:</para>
  13.118 +
  13.119 +    <simplelist type="vert">
  13.120 +      <member>O’Reilly Media, Inc.</member>
  13.121 +
  13.122 +      <member>1005 Gravenstein Highway North</member>
  13.123 +
  13.124 +      <member>Sebastopol, CA 95472</member>
  13.125 +
  13.126 +      <member>800-998-9938 (negli Stati Uniti o in Canada)</member>
  13.127 +
  13.128 +      <member>707-829-0515 (internazionale o locale)</member>
  13.129 +
  13.130 +      <member>707 829-0104 (fax)</member>
  13.131 +    </simplelist>
  13.132 +
  13.133 +    <para id="x_747">Abbiamo predisposto una pagina web dedicata a questo libro, dove elenchiamo errata, esempi e qualsivoglia informazione aggiuntiva. Potete accedere a questa pagina (relativa alla versione inglese del libro) all&rsquo;indirizzo:</para>
  13.134 +
  13.135 +    <simplelist type="vert">
  13.136 +      <member><ulink url="http://www.oreilly.com/catalog/9780596800673"></ulink></member>
  13.137 +    </simplelist>
  13.138 +
  13.139 +    <para id="x_748">Per inviare un commento o porre domande tecniche su questo libro, spedite un&rsquo;email a:</para>
  13.140 +
  13.141 +    <simplelist type="vert">
  13.142 +      <member><email>bookquestions@oreilly.com</email></member>
  13.143 +    </simplelist>
  13.144 +
  13.145 +    <para id="x_749">Per maggiori informazioni sui nostri libri, sulle conferenze, sui Centri di Risorse, e su O&rsquo;Reilly Network, visitate il nostro sito web all&rsquo;indirizzo:</para>
  13.146 +
  13.147 +    <simplelist type="vert">
  13.148 +      <member><ulink url="http://www.oreilly.com"></ulink></member>
  13.149 +    </simplelist>
  13.150 +  </sect1>
  13.151 +</preface>
    14.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    14.2 +++ b/it/ch01-intro.xml	Fri Sep 04 16:33:35 2009 +0200
    14.3 @@ -0,0 +1,267 @@
    14.4 +<chapter id="chap:intro">
    14.5 +  <?dbhtml filename="come-siamo-arrivati-qui.html"?>
    14.6 +  <title>Come siamo arrivati qui?</title>
    14.7 +
    14.8 +  <sect1>
    14.9 +    <title>Perché il controllo di revisione? Perché Mercurial?</title>
   14.10 +
   14.11 +    <para id="x_6d">Il controllo di revisione è il processo tramite il quale si gestiscono molteplici versioni di una qualsiasi unità di informazione. Molte persone eseguono a mano questo processo nella sua forma più semplice, ogni volta che modificano un file e lo salvano con un nuovo nome che contiene un numero più alto del numero della versione precedente.</para>
   14.12 +
   14.13 +    <para id="x_6e">Tuttavia, gestire più versioni anche solo di un singolo file è un&rsquo;operazione soggetta a errori, quindi gli strumenti software per automatizzare questo processo sono stati disponibili per molto tempo. I primi strumenti automatizzati per il controllo di revisione erano deputati ad assistere un singolo utente nella gestione delle revisioni di un singolo file. Nel corso delle ultime decadi, il campo d&rsquo;azione degli strumenti di controllo di revisione si è ampiamente esteso, e ora sono in grado di gestire un grande numero di file e di aiutare più persone a lavorare insieme. I migliori strumenti moderni di controllo di revisione non hanno alcun problema a fronteggiare gruppi di migliaia di persone che lavorano insieme su progetti composti da centinaia di migliaia di file.</para>
   14.14 +
   14.15 +    <para id="x_6f">La comparsa del controllo di revisione distribuito è relativamente recente, e finora questo nuovo campo si è sviluppato grazie alla propensione umana per l&rsquo;esplorazione di territori sconosciuti.</para>
   14.16 +
   14.17 +    <para id="x_70">Sto scrivendo un libro sul controllo di revisione distribuito perché credo che sia una materia importante che merita una guida sul campo. Ho scelto di trattare Mercurial perché è lo strumento più facile con cui saggiare il terreno, e tuttavia è in grado di scalare fino a soddisfare le richieste di ambienti reali e impegnativi dove molti altri strumenti di controllo di revisione si sono dovuti arrendere.</para>
   14.18 +
   14.19 +    <sect2>
   14.20 +      <title>Perché usare il controllo di revisione?</title>
   14.21 +
   14.22 +      <para id="x_71">Esiste un certo numero di ragioni per le quali voi o il vostro gruppo potreste voler usare uno strumento automatico per il controllo di revisione su un progetto.</para>
   14.23 +
   14.24 +      <itemizedlist>
   14.25 +	<listitem><para id="x_72">Lo strumento terrà traccia della storia e dell&rsquo;evoluzione del vostro progetto, così voi non dovete farlo. Per ogni modifica, registrerà informazioni riguardanti <emphasis>chi</emphasis> l&rsquo;ha fatta, <emphasis>perché</emphasis> l&rsquo;ha fatta, <emphasis>quando</emphasis> è stata fatta e <emphasis>cosa</emphasis> è stato modificato.</para></listitem>
   14.26 +	<listitem><para id="x_73">Quando state lavorando con altre persone, il software di controllo di revisione facilita la collaborazione. Per esempio, quando due persone effettuano cambiamenti incompatibili più o meno simultaneamente, il software vi aiuterà a identificare e risolvere questi conflitti.</para></listitem>
   14.27 +	<listitem><para id="x_74">Lo strumento può aiutarvi a rettificare i vostri errori. Se fate una modifica che più tardi si rivela essere un errore, potete ritornare a una versione precedente di uno o più file. In effetti, uno strumento di controllo di revisione <emphasis>davvero</emphasis> buono vi aiuterà a calcolare efficientemente il momento esatto in cui un problema è stato introdotto (si veda la <xref linkend="sec:undo:bisect"/> per i dettagli).</para></listitem>
   14.28 +	<listitem><para id="x_75">Il software vi aiuterà a lavorare simultaneamente su molteplici versioni del vostro progetto e a gestire gli spostamenti tra una versione e l&rsquo;altra.</para></listitem>
   14.29 +      </itemizedlist>
   14.30 +
   14.31 +      <para id="x_76">La maggior parte di queste ragioni sono altrettanto valide&emdash;almeno in teoria&emdash;sia che lavoriate su un progetto da soli sia che collaboriate insieme a un centianio di altre persone.</para>
   14.32 +
   14.33 +      <para id="x_77">Un aspetto chiave della praticità del controllo di revisione a queste due dimensioni di sviluppo differenti (<quote>programmatore solitario</quote> e <quote>gruppo gigantesco</quote>) è il confronto tra i suoi <emphasis>benefici</emphasis> e i suoi <emphasis>costi</emphasis>. Uno strumento di controllo di revisione che sia difficile da capire e usare finirà per imporre un costo piuttosto alto.</para>
   14.34 +
   14.35 +      <para id="x_78">&Egrave; probabile che un progetto di cinquecento persone collassi quasi immediatamente sotto il proprio peso senza un processo e uno strumento di controllo di revisione. In questo caso, il costo di usare il controllo di revisione potrebbe sembrare difficilmente meritevole di considerazione, dato che <emphasis>senza</emphasis> di esso il fallimento del progetto è quasi garantito.</para>
   14.36 +
   14.37 +      <para id="x_79">D&rsquo;altra parte, il <quote>lavoretto veloce</quote> di una singola persona potrebbe sembrare il contesto meno adatto per impiegare uno strumento di controllo di revisione, perché sicuramente il costo di usarne uno deve essere vicino al costo complessivo del progetto. Giusto?</para>
   14.38 +
   14.39 +      <para id="x_7a">Mercurial supporta in maniera unica <emphasis>entrambe</emphasis> queste dimensioni di sviluppo. Potete impararne le basi in pochi minuti appena, e grazie al suo basso costo di gestione potete applicare il controllo di revisione al più piccolo dei progetti con facilità. La sua semplicità vi permetterà di concentrarvi su qualunque cosa stiate <emphasis>davvero</emphasis> cercando di fare senza distrarvi con schiere di concetti astrusi o lunghe sequenze di comandi. Allo stesso tempo, le elevate prestazioni e la natura peer-to-peer di Mercurial vi permetteranno di scalare in maniera indolore per gestire grandi progetti.</para>
   14.40 +
   14.41 +      <para id="x_7b">Nessuno strumento di controllo di revisione può salvare un progetto gestito male, ma la scelta degli strumenti adeguati può fare una notevole differenza nella facilità con cui potete lavorare su un progetto.</para>
   14.42 +
   14.43 +    </sect2>
   14.44 +
   14.45 +    <sect2>
   14.46 +      <title>I molti nomi del controllo di revisione</title>
   14.47 +
   14.48 +      <para id="x_7c">Il controllo di revisione è un campo talmente vario che vi si fa spesso riferimento attraverso diversi nomi e acronimi. Ecco alcune delle variazioni più comuni che incontrerete:</para>
   14.49 +      <itemizedlist>
   14.50 +	<listitem><para id="x_7d">controllo di revisione (RCS);</para></listitem>
   14.51 +	<listitem><para id="x_7e">gestione della configurazione del software (SCM), o gestione della configurazione;</para></listitem>
   14.52 +	<listitem><para id="x_7f">gestione del codice sorgente;</para></listitem>
   14.53 +	<listitem><para id="x_80">controllo del codice sorgente, o controllo dei sorgenti;</para></listitem>
   14.54 +	<listitem><para id="x_81">controllo di versione (VCS).</para></listitem>
   14.55 +      </itemizedlist>
   14.56 +      <para id="x_82">Alcune persone affermano che questi termini in realtà abbiano significati differenti, ma in pratica essi si sovrappongono così tanto che non c&rsquo;è alcun modo concordato o persino utile di distinguerli.</para>
   14.57 +
   14.58 +    </sect2>
   14.59 +  </sect1>
   14.60 +
   14.61 +  <sect1>
   14.62 +    <title>A proposito degli esempi in questo libro</title>
   14.63 +
   14.64 +    <para id="x_84">Questo libro tratta gli esempi di codice in maniera inusuale. Tutti gli esempi sono <quote>vivi</quote>&emdash;ognuno di essi è in effetti il risultato di uno script di shell che esegue i comandi Mercurial che vedete. Ogni volta che un&rsquo;immagine del libro viene assemblata dai suoi sorgenti, tutti gli script di esempio vengono automaticamente eseguiti e i loro risultati correnti vengono confrontati con i loro risultati attesi.</para>
   14.65 +
   14.66 +    <para id="x_85">Il vantaggio di questo approccio è che gli esempi sono sempre accurati, in quanto descrivono <emphasis>esattamente</emphasis> il comportamento della versione di Mercurial menzionata sulla copertina del libro. Se aggiorno la versione di Mercurial che sto documentando e il risultato di qualche comando cambia, il processo di assemblaggio del libro fallisce.</para>
   14.67 +
   14.68 +    <para id="x_86">C&rsquo;è un piccolo svantaggio in questo approccio: le date e gli orari che vedete negli esempi tendono a venire <quote>compressi</quote> insieme in modo anomalo, diversamente da quanto accadrebbe se gli stessi comandi fossero digitati da un essere umano. Laddove un essere umano non può inviare più di un comando ogni pochi secondi, le cui marcature temporali sarebbero analogamente intervallate, i miei script d&rsquo;esempio automatizzati sono in grado di eseguire molti comandi in un secondo.</para>
   14.69 +
   14.70 +    <para id="x_87">Come conseguenza di questo fatto, potrebbe sembrare che molti inserimenti (in inglese, commit) consecutivi vengano eseguiti durante lo stesso secondo. Potete osservare la presenza di questa anomalia nell&rsquo;esempio di <literal role="hg-ext">bisect</literal> nella <xref linkend="sec:undo:bisect"/>, tanto per farvi un&rsquo;idea.</para>
   14.71 +
   14.72 +    <para id="x_88">Quindi, mentre leggete gli esempi, non date troppo peso alle date e agli orari che vedete nei risultati dei comandi, ma fate <emphasis>decisamente</emphasis> affidamento sulla consistenza e riproducibilità del comportamento illustrato.</para>
   14.73 +
   14.74 +  </sect1>
   14.75 +
   14.76 +  <sect1>
   14.77 +    <title>Le tendenze nel campo</title>
   14.78 +
   14.79 +    <para id="x_89">Ci sono state alcune inconfondibili tendenze nello sviluppo e nell&rsquo;utilizzo degli strumenti di controllo di revisione nel corso delle ultime quattro decadi, man mano che le persone acquisivano familiarità con le capacità dei loro strumenti e venivano vincolate dai loro limiti.</para>
   14.80 +
   14.81 +    <para id="x_8a">La prima generazione ha cominciato col gestire singoli file su singoli computer. Sebbene questi strumenti rappresentassero un enorme progresso rispetto al controllo di revisione manuale effettuato ad hoc, il loro modello di bloccaggio (in inglese, locking) e la restrizione a un singolo computer limitarono il loro impiego a piccoli gruppi strettamente uniti.</para>
   14.82 +
   14.83 +    <para id="x_8b">La seconda generazione ha rilassato questi vincoli spostandosi su architetture di rete e gestendo interi progetti alla volta. Con l&rsquo;aumentare delle dimensioni dei progetti, gli strumenti incontrarono nuovi problemi. A causa della frequenza elevata con cui i client avevano bisogno di parlare con i server, la scalabilità dei server divenne un problema per progetti di grandi dimensioni. Una connessione di rete inaffidabile poteva completamente impedire agli utenti remoti di parlare con il server. Man mano che i progetti open source cominciarono a rendere l&rsquo;accesso in sola lettura disponibile a chiunque in forma anonima, persone senza privilegi di inserimento scoprivano di non poter usare gli strumenti per interagire con un progetto in modo naturale, in quanto non erano in grado di registrare le modifiche da loro effettuate.</para>
   14.84 +
   14.85 +    <para id="x_8c">La generazione attuale degli strumenti di controllo di revisione è di natura peer-to-peer. Tutti questi sistemi hanno abbandonato la dipendenza da un singolo server centrale e permettono alle persone di distribuire i propri dati di controllo di revisione laddove sono effettivamente necessari. La collaborazione attraverso Internet non è più vincolata dalla tecnologia, ma è diventata una questione di scelta e consenso. Gli strumenti moderni possono operare offline indefinitamente e autonomamente, utilizzando una connessione di rete solo quando è necessario sincronizzare i cambiamenti con un altro repository.</para>
   14.86 +
   14.87 +  </sect1>
   14.88 +  <sect1>
   14.89 +    <title>Alcuni vantaggi del controllo di revisione distribuito</title>
   14.90 +
   14.91 +    <para id="x_8d">Sebbene per diversi anni gli stumenti per il controllo di revisione distribuito si siano mantenuti robusti e usabili tanto quanto le loro controparti delle generazioni precedenti, questo non vuol dire che le persone che utilizzavano strumenti più vecchi si siano necessariamente accorte dei loro vantaggi. Ci sono diversi modi in cui gli strumenti distribuiti brillano rispetto a quelli centralizzati.</para>
   14.92 +
   14.93 +    <para id="x_8e">Per un singolo sviluppatore, gli strumenti distribuiti sono quasi sempre più veloci di quelli centralizzati. Questo avviene per una semplice ragione: uno strumento centralizzato ha bisogno di utilizzare la rete per molte operazioni comuni, perché la maggior parte dei metadati sono memorizzati in una singola copia sul server centrale. Uno strumento distribuito memorizza tutti i suoi metadati localmente. A parità di altre condizioni, utilizzare la rete aggiunge un costo supplementare a uno strumento centralizzato. Non sottovalutate l&rsquo;importanza di uno strumento veloce e reattivo: vi troverete a passare molto tempo interagendo con il vostro software di controllo di revisione.</para>
   14.94 +
   14.95 +    <para id="x_8f">Gli strumenti distribuiti sono indifferenti alle stravaganze dell&rsquo;infrastruttura dei vostri server, sempre perché replicano i metadati in così tanti luoghi. Se usate un sistema centralizzato e il vostro server si guasta, fareste meglio a sperare che il vostro sistema di backup sia affidabile e che il vostro ultimo backup sia recente ed effettivamente funzionante. Con uno strumento distribuito, avete molti backup disponibili sui computer di ogni singolo collaboratore.</para>
   14.96 +
   14.97 +    <para id="x_90">L&rsquo;affidabilità della vostra rete influenzerà gli strumenti distribuiti in misura molto minore rispetto a quelli centralizzati. Non potete nemmeno usare uno strumento centralizzato senza una connessione di rete, a parte alcuni comandi estremamente limitati. Con uno strumento distribuito, potreste persino non notare se la vostra connessione di rete cade mentre state lavorando. L&rsquo;unica cosa che non sarete in grado di fare è comunicare con i repository su altri computer, qualcosa che è relativamente raro rispetto alle operazioni locali. Questo potrebbe essere significativo solo se avete un gruppo di collaboratori sparpagliati in giro per il mondo.</para>
   14.98 +
   14.99 +    <sect2>
  14.100 +      <title>Vantaggi per i progetti open source</title>
  14.101 +
  14.102 +      <para id="x_91">Se siete affascinati da un progetto open source e decidete che vi piacerebbe cominciare a lavorarci sopra, e quel progetto usa uno strumento distribuito di controllo di revisione, potete immediatamente operare su un piano di parità con il gruppo di persone che si considerano il <quote>cuore</quote> di quel progetto. Se il gruppo pubblica il proprio repository, potete immediatamente copiare la cronologia del progetto, cominciare a effettuare modifiche e registrare il vostro lavoro utilizzando gli stessi strumenti allo stesso modo dei membri del gruppo. Al contrario, con uno strumento centralizzato, siete costretti a usare il software in modalità di <quote>sola lettura</quote> a meno che qualcuno non vi conceda il permesso di inserire i vostri cambiamenti sul server centrale. Fino a quel momento non sarete in grado di registrare i cambiamenti, e le vostre modifiche rischieranno di venire rovinate ogni volta che provate ad aggiornare la vista del repository dal vostro client.</para>
  14.103 +
  14.104 +      <sect3>
  14.105 +	<title>Il falso problema dei fork</title>
  14.106 +
  14.107 +	<para id="x_92">&Egrave; stato suggerito che gli strumenti per il controllo di revisione distribuito espongano i progetti open source a un certo tipo di rischio in quanto rendono estremamente facile <quote>biforcare</quote> (in inglese, fork) lo sviluppo di un progetto. Un fork avviene quando le differenze di opinione o di atteggiamento tra sviluppatori di uno stesso gruppo li portano a decidere di non poter lavorare più a lungo insieme. Ogni parte prende una copia più o meno completa del codice sorgente del progetto e prosegue per la propria strada.</para>
  14.108 +
  14.109 +	<para id="x_93">Talvolta le parti di un fork decidono di riconciliare le loro differenze. Con uno strumento centralizzato di controllo di revisione, il processo <emphasis>tecnico</emphasis> di riconciliazione è doloroso e deve essere in gran parte effettuato a mano. Dovete decidere quale cronologia delle revisioni dovrà <quote>prevalere</quote> e introdurvi in qualche modo i cambiamenti dell&rsquo;altro gruppo. Di solito, questo risulta nella perdita parziale o completa della cronologia delle revisioni di una delle due parti.</para>
  14.110 +
  14.111 +	<para id="x_94">Gli strumenti distribuiti rendono la biforcazione <emphasis>l&rsquo;unico</emphasis> modo per sviluppare un progetto. Ogni singolo cambiamento apportato è un potenziale punto di biforcazione. La grande forza di questo approccio è che uno strumento per il controllo di revisione distribuito deve essere davvero bravo a <emphasis>unire</emphasis> (in inglese, merge) due fork, perché i fork sono assolutamente fondamentali: vengono effettuati in ogni momento.</para>
  14.112 +
  14.113 +	<para id="x_95">Se tutte le attività che ogni sviluppatore svolge in ogni momento vengono concepite in termini di biforcazioni e unioni, allora ciò che il mondo open source chiama <quote>fork</quote> diventa un problema <emphasis>puramente</emphasis> sociale. Gli strumenti distribuiti in realtà non fanno altro che <emphasis>ridurre</emphasis> la probabilità di un vero e proprio fork:</para>
  14.114 +	<itemizedlist>
  14.115 +	  <listitem><para id="x_96">eliminano la distinzione sociale imposta dagli strumenti centralizzati, cioè quella tra le persone all&rsquo;interno del gruppo con i permessi di inserimento e le persone che si trovano all&rsquo;esterno del gruppo e non hanno questi permessi;</para></listitem>
  14.116 +	  <listitem><para id="x_97">rendono più facile riconciliarsi dopo un fork sociale, perché l&rsquo;unica operazione che viene coinvolta dal punto di vista del software di controllo di revisione è semplicemente un&rsquo;altra unione.</para></listitem>
  14.117 +    </itemizedlist>
  14.118 +
  14.119 +	<para id="x_98">Alcune persone oppongono resistenza agli strumenti distribuiti perché vogliono mantenere uno stretto controllo sui propri progetti e credono che gli strumenti centralizzati diano loro questo controllo. Tuttavia, se siete tra quelli che hanno questa convinzione, e il vostro repository CVS o Subversion è disponibile pubblicamente, sappiate che esistono numerosi strumenti in grado di estrarre l&rsquo;intera cronologia del vostro progetto (anche se lentamente) e ricrearla da qualche altra parte al di là del vostro controllo. Quindi non solo il vostro controllo in questo caso è illusorio, ma state anche rinunciando alla possibilità di collaborare facilmente con chiunque si senta in dovere di duplicare la cronologia del vostro progetto.</para>
  14.120 +
  14.121 +      </sect3>
  14.122 +    </sect2>
  14.123 +    <sect2>
  14.124 +      <title>Vantaggi per i progetti commerciali</title>
  14.125 +
  14.126 +      <para id="x_99">Molti progetti commerciali vengono intrapresi da gruppi i cui membri sono sparpagliati attraverso il globo. I collaboratori lontani da un server centrale soffriranno un maggiore lentezza nell&rsquo;esecuzione dei comandi e forse una minore affidabilità. I sistemi commerciali di controllo di revisione tentano di mitigare questi problemi tramite componenti aggiuntivi per la replicazione di siti remoti che sono tipicamente costosi da acquistare e complicati da amministrare. Un sistema distribuito non soffre di questi problemi in prima istanza. Ancora meglio, potete facilmente configurare molteplici server autoritativi, diciamo uno per ogni sito, in modo che non ci siano comunicazioni ridondanti tra i repository durante i costosi collegamenti di rete a grande distanza.</para>
  14.127 +
  14.128 +      <para id="x_9a">I sistemi centralizzati di controllo di revisione tendono ad avere una scalabilità relativamente bassa. Non è inusuale che un costoso sistema centralizzato cada sotto il carico combinato di una sola dozzina di utenti concorrenti. Ancora una volta, la tipica contromisura tende a essere un dispositivo di replicazione costoso e macchinoso. Dato che con uno strumento distribuito il carico su un server centrale&emdash;sempre che ne abbiate uno&emdash;è molto più basso (perché tutti i dati sono replicati ovunque), un singolo server economico può gestire i bisogni di un gruppo di lavoro molto più grande, e la replicazione per il bilancio del carico diventa una semplice questione di programmazione.</para>
  14.129 +
  14.130 +      <para id="x_9b">I vostri impiegati potranno beneficiare del controllo di versione distribuito anche quando si trovano nella sede di un cliente per risolvere un problema in loco. Gli strumenti permetteranno loro di generare versioni personalizzate del software nel repository, provare soluzioni differenti isolandole l&rsquo;una dall&rsquo;altra e cercare in maniera efficiente attraverso la cronologia delle revisioni le sorgenti di bug e regressioni nell&rsquo;ambiente del cliente, il tutto senza aver bisogno di collegarsi alla rete della vostra azienda.</para>
  14.131 +
  14.132 +    </sect2>
  14.133 +  </sect1>
  14.134 +  <sect1>
  14.135 +    <title>Perché scegliere Mercurial?</title>
  14.136 +
  14.137 +    <para id="x_9c">Mercurial possiede un insieme di caratteristiche unico che lo rende una scelta particolarmente valida come sistema di controllo di revisione.</para>
  14.138 +    <itemizedlist>
  14.139 +      <listitem><para id="x_9d">&Egrave; facile da imparare e usare.</para></listitem>
  14.140 +      <listitem><para id="x_9e">&Egrave; leggero.</para></listitem>
  14.141 +      <listitem><para id="x_9f">Scala in maniera eccellente.</para></listitem>
  14.142 +      <listitem><para id="x_a0">&Egrave; facile da personalizzare.</para></listitem>
  14.143 +    </itemizedlist>
  14.144 +
  14.145 +    <para id="x_a1">Se avete una vaga familiarità con i sistemi di controllo di revisione, dovreste essere in grado di cominciare a usare Mercurial in meno di cinque minuti. Anche se non è così, non vi ci vorrà più di qualche altro minuto. L&rsquo;insieme di comandi e caratteristiche di Mercurial è generalmente uniforme e consistente, così potete tenere a mente poche regole generali piuttosto che una nutrita schiera di eccezioni.</para>
  14.146 +
  14.147 +    <para id="x_a2">Potete cominciare a lavorare con Mercurial su un piccolo progetto in pochi minuti, creando nuove modifiche e rami di sviluppo, trasferendo cambiamenti sia localmente che attraverso la rete, sfruttando la velocità di tutte le operazioni di stato e cronologia. Mercurial cerca di essere agile e di non starvi tra i piedi combinando un basso costo cognitivo con operazioni estremamente veloci.</para>
  14.148 +
  14.149 +    <para id="x_a3">L&rsquo;utilità di Mercurial non si limita ai piccoli progetti: è usato da progetti contenenti decine di migliaia di file e centinaia di megabyte di codice sorgente su cui collaborano centinaia di migliaia di sviluppatori.</para>
  14.150 +
  14.151 +    <para id="x_a4">Se le funzioni principali di Mercurial non sono sufficienti per voi, è facile aggiungerne di nuove. Mercurial è particolarmente adatto alla programmazione delle proprie operazioni, e il codice pulito della sua implementazione in Python facilita l&rsquo;aggiunta di funzioni sotto forma di estensioni. Esistono già un certo numero di estensioni utili e popolari, che spaziano dal supporto all&rsquo;identificazione dei bug fino al miglioramento delle prestazioni.</para>
  14.152 +
  14.153 +  </sect1>
  14.154 +  <sect1>
  14.155 +    <title>Un confronto tra Mercurial e altri strumenti</title>
  14.156 +
  14.157 +    <para id="x_a5">Prima di proseguire, vi prego di tenere a mente che questa sezione riflette necessariamente la mia esperienza, i miei interessi e (oserei dire) i miei pregiudizi. Ho usato tutti i sistemi di controllo di revisione qui elencati, in più casi per diversi anni alla volta.</para>
  14.158 +
  14.159 +    <sect2>
  14.160 +      <title>Subversion</title>
  14.161 +
  14.162 +      <para id="x_a6">Subversion è un sistema di controllo di revisione piuttosto popolare, sviluppato per sostituire CVS. Ha un&rsquo;architettura client/server centralizzata.</para>
  14.163 +
  14.164 +      <para id="x_a7">Subversion e Mercurial hanno comandi con nomi simili per effettuare le stesse operazioni, così se avete familiarità con uno dei due è facile imparare a usare l&rsquo;altro. Entrambi gli strumenti sono portabili su tutti i sistemi operativi più popolari.</para>
  14.165 +
  14.166 +      <para id="x_a8">Prima della versione 1.5, Subversion non aveva alcun supporto efficace per le unioni. Al momento della scrittura, la sua funzione per la gestione delle unioni è nuova e nota per essere <ulink
  14.167 +	  url="http://svnbook.red-bean.com/nightly/en/svn.branchmerge.advanced.html#svn.branchmerge.advanced.finalword">complicata e difettosa</ulink>.</para>
  14.168 +
  14.169 +      <para id="x_a9">Mercurial ha un sostanzioso vantaggio in termini di prestazioni rispetto a Subversion per tutte le operazioni di controllo di revisione di cui ho effettuato il benchmark. Il suo vantaggio si misura in un intervallo che va da un fattore due a un fattore sei quando lo si confronta con il modulo <emphasis>ra_local</emphasis> di Subversion 1.4.3, che lavora con repository locali ed è quindi il metodo di accesso più veloce disponibile. In situazioni più realistiche che coinvolgono un accesso al repository attraverso la rete, Subversion sconterà uno svantaggio sostanzialmente più consistente. Dato che molti comandi di Subversion devono comunicare con il server e Subversion non è dotato di meccanismi di replicazione efficaci, la capacità del server e la banda di rete diventano colli di bottiglia già per progetti di dimensioni moderate.</para>
  14.170 +
  14.171 +      <para id="x_aa">In più, Subversion si espone a un sostanziale utilizzo aggiuntivo di spazio su disco per evitare transazioni di rete durante l&rsquo;esecuzione di alcune operazioni comuni, come trovare i file modificati (<literal>status</literal>) e visualizzare le modifiche rispetto alla revisione corrente (<literal>diff</literal>). Come risultato, la copia di lavoro di un repository Subversion è spesso delle stesse dimensioni, se non più grande, di un intero repository Mercurial più la sua directory di lavoro, anche nel caso in cui il repository Mercurial contenga la cronologia completa del progetto.</para>
  14.172 +
  14.173 +      <para id="x_ab">Subversion è ampiamente supportato da strumenti di terze parti. Mercurial è considerevolmente indietro in quest&rsquo;area. Il divario si sta assottigliando, tuttavia, e in effetti alcuni degli strumenti di interfaccia grafica di Mercurial attualmente offuscano i loro equivalenti per Subversion. Come Mercurial, Subversion è dotato di un eccellente manuale d&rsquo;uso.</para>
  14.174 +
  14.175 +      <para id="x_ac">Dato che Subversion non memorizza la cronologia di revisione sul client, è molto adatto a gestire progetti che hanno a che fare con numerosi file binari di grandi dimensioni. Se aggiungete cinquanta revisioni di un file incomprimibile di 10MB a un repository, l&rsquo;utilizzo di spazio sul lato client da parte di Subversion rimarrà costante. Lo spazio usato da qualunque SCM distribuito crescerà rapidamente in proporzione al numero delle revisioni, perché le differenze tra una revisione e l&rsquo;altra sono grandi.</para>
  14.176 +
  14.177 +      <para id="x_ad">In più, è spesso difficile, o più tipicamente impossibile, unire differenti versioni di un file binario. L&rsquo;abilità di Subversion di permettere a un utente di bloccare un file, in modo da ottenere temporaneamente i diritti esclusivi per modificarlo, può essere un vantaggio significativo in progetti dove i file binari vengono largamente utilizzati.</para>
  14.178 +
  14.179 +      <para id="x_ae">Mercurial può importare la cronologia delle revisioni da un repository Subversion. Può anche esportare la propria cronologia delle revisioni verso un repository Subversion. Questa caratteristica vi permette di <quote>sentire l&rsquo;acqua</quote> utilizzando Mercurial e Subverison in parallelo prima di decidere di cambiare. La conversione della cronologia è incrementale, così potete effettuare una conversione iniziale, poi piccole conversioni aggiuntive per introdurre successivamente nuovi cambiamenti.</para>
  14.180 +
  14.181 +    </sect2>
  14.182 +    <sect2>
  14.183 +      <title>Git</title>
  14.184 +
  14.185 +      <para id="x_af">Git è uno strumento per il controllo di revisione distribuito che è stato sviluppato per gestire l&rsquo;albero dei sorgenti del kernel di Linux. Come Mercurial, il suo design iniziale è stato in qualche modo influenzato da Monotone.</para>
  14.186 +
  14.187 +      <para id="x_b0">Git possiede un insieme di comandi piuttosto ampio, con la versione 1.5.0 che fornisce 139 singoli comandi. Si è fatto una certa reputazione di essere difficile da imparare. Rispetto a Git, Mercurial pone una maggiore attenzione alla semplicità.</para>
  14.188 +
  14.189 +      <para id="x_b1">In termini di prestazioni, Git è estremamente veloce. In molti casi, è più veloce di Mercurial, almeno sotto Linux, mentre Mercurial è più prestante per altre operazioni. Tuttavia, sotto Windows, le prestazioni e il livello generale di supporto offerto da Git sono, al momento della scrittura, molto più indietro rispetto a Mercurial.</para>
  14.190 +
  14.191 +      <para id="x_b2">Mentre un repository Mercurial non ha bisogno di alcuna manutenzione, un repository Git richiede frequenti <quote>reimpacchettamenti</quote> manuali dei propri metadati. Senza questi, le prestazioni degradano e l&rsquo;utilizzo di spazio cresce rapidamente. Le prestazioni di un server che contiene molti repository Git che non vengono rigorosamente e frequentemente reimpacchettati diventeranno pesantemente legate all&rsquo;utilizzo del disco durante i backup, risultando in istanze di backup giornalieri che impiegano molto più di 24 ore per terminare. Un repository Git appena impacchettato è leggermente più piccolo di un repository Mercurial, ma un repository non impacchettato ha dimensioni maggiori di diversi ordini di grandezza.</para>
  14.192 +
  14.193 +      <para id="x_b3">Il cuore di Git è scritto in C. Molti comandi di Git sono implementati come script di shell o in linguaggio Perl la cui qualità è notevolmente variabile. Ho incontrato diversi casi in cui gli script proseguivano ciecamente la propria esecuzione in presenza di errori che avrebbero dovuto essere fatali.</para>
  14.194 +
  14.195 +      <para id="x_b4">Mercurial può importare la cronologia di revisione da un repository Git.</para>
  14.196 +
  14.197 +
  14.198 +    </sect2>
  14.199 +    <sect2>
  14.200 +      <title>CVS</title>
  14.201 +
  14.202 +      <para id="x_b5">CVS è probabilmente lo strumento di controllo di revisione più usato nel mondo. A causa della sua età e della sporcizia interna, è stato mantenuto solo superficialmente per diversi anni.</para>
  14.203 +
  14.204 +      <para id="x_b6">Ha un&rsquo;architettura client/server centralizzata. Non raggruppa cambiamenti di file correlati in inserimenti atomici, esponendo gli utenti al rischio di <quote>guastare il software</quote>: una persona può inserire con successo parte di un cambiamento e poi essere bloccata dalla necessità di un&rsquo;unione, vincolando altre persone a vedere solo una porzione del lavoro che intendeva fare. Questo influisce anche sul modo di lavorare con la cronologia del progetto. Se volete vedere tutte le modifiche che qualcuno ha effettuato come parte di un&rsquo;attività, dovrete ispezionare manualmente le descrizioni e le marcature temporali dei cambiamenti fatti a ogni file coinvolto (sempre che sappiate quali fossero quei file).</para>
  14.205 +
  14.206 +      <para id="x_b7">CVS ha una nozione confusa di etichette e rami di lavoro che non cercherò nemmeno di descrivere. Non gestisce per bene il cambiamento dei nomi di file o directory, esponendo il repository al rischio di danneggiamenti. Non ha quasi alcuna funzionalità per il controllo della consistenza interna, quindi tipicamente non è nemmeno possibile dire se un repository è danneggiato. Non raccomanderei CVS per nessun progetto, nuovo o esistente.</para>
  14.207 +
  14.208 +      <para id="x_b8">Mercurial può importare la cronologia di revisione da un repository CVS. Tuttavia, ci sono alcune avvertenze da considerare, valide anche per qualsiasi altro strumento di controllo di revisione che importi dati da CVS. A causa della mancanza di inserimenti atomici in CVS e della mancanza di versioni per la gerarchia dei file, non è possibile ricostruire la cronologia di CVS in maniera completa e accurata, bensì devono essere fatte alcune supposizioni, e le modifiche ai nomi dei file di solito non verranno mostrate. Dato che buona parte dell&rsquo;amministrazione avanzata di CVS deve essere fatta a mano e quindi è soggetta a errori, i programmi che importano dati da CVS incorrono comunemente in molteplici problemi dovuti a repository danneggiati (marcature temporali completamente fasulle per le revisioni e file che sono rimasti bloccati per più di un decennio sono solo due dei problemi meno interessanti che posso ricordare dalla mia esperienza personale).</para>
  14.209 +<!--
  14.210 +      <para id="x_b9">Mercurial può importare la cronologia di revisione da un repository CVS.</para>
  14.211 +-->
  14.212 +    </sect2>
  14.213 +    <sect2>
  14.214 +      <title>Strumenti commerciali</title>
  14.215 +
  14.216 +      <para id="x_ba">Perforce ha un&rsquo;architettura client/server centralizzata in cui nessun dato viene memorizzato sul lato client. A differenza degli strumenti di controllo di revisione moderni, Perforce richiede che l&rsquo;utente esegua un comando per comunicare al server di voler modificare un qualsiasi file.</para>
  14.217 +
  14.218 +      <para id="x_bb">Le prestazioni di Perforce sono piuttosto buone per piccoli gruppi di lavoro, ma decadono rapidamente man mano che il numero di utenti cresce oltre le poche dozzine. Installazioni di Perforce di modeste dimensioni richiedono l&rsquo;utilizzo di proxy per fronteggiare il carico generato dai propri utenti.</para>
  14.219 +
  14.220 +    </sect2>
  14.221 +    <sect2>
  14.222 +      <title>Scegliere uno strumento di controllo di revisione</title>
  14.223 +
  14.224 +      <para id="x_bc">Con l&rsquo;eccezione di CVS, tutti gli strumenti appena elencati hanno qualità uniche che li rendono adatti a particolari stili di lavoro. Non esiste un singolo strumento di controllo di revisione che sia il migliore in tutte le situazioni.</para>
  14.225 +
  14.226 +      <para id="x_bd">Per fare un esempio, Subversion è una buona scelta per chi lavora con file binari frequentemente modificati, a causa della sua natura centralizzata e del supporto per il bloccaggio dei file.</para>
  14.227 +
  14.228 +      <para id="x_be">Personalmente trovo che le caratteristiche di Mercurial, come la semplicità, le prestazioni e un buon supporto per le unioni, siano una combinazione irresistibile che mi ha servito bene per diversi anni.</para>
  14.229 +
  14.230 +    </sect2>
  14.231 +  </sect1>
  14.232 +  <sect1>
  14.233 +    <title>Passare da un altro strumento a Mercurial</title>
  14.234 +
  14.235 +    <para id="x_bf">Mercurial viene distribuito con un&rsquo;estensione chiamata <literal role="hg-ext">convert</literal> che può importare in maniera incrementale la cronologia delle revisioni da diversi altri strumenti di controllo di revisione. Con <quote>incrementale</quote> voglio dire che potete convertire tutta la cronologia di un progetto in un&rsquo;unica seduta, poi rieseguire la conversione più tardi per ottenere i nuovi cambiamenti che sono avvenuti dopo la conversione iniziale.</para>
  14.236 +
  14.237 +    <para id="x_c0">Gli strumenti di controllo di revisione supportati da <literal role="hg-ext">convert</literal> sono i seguenti:</para>
  14.238 +    <itemizedlist>
  14.239 +      <listitem><para id="x_c1">Subversion</para></listitem>
  14.240 +      <listitem><para id="x_c2">CVS</para></listitem>
  14.241 +      <listitem><para id="x_c3">Git</para></listitem>
  14.242 +      <listitem><para id="x_c4">Darcs</para></listitem></itemizedlist>
  14.243 +
  14.244 +    <para id="x_c5">In più, <literal role="hg-ext">convert</literal> può esportare i cambiamenti da Mercurial a Subversion. Questo rende possibile provare Subversion e Mercurial in parallelo senza rischiare di perdere il proprio lavoro prima di impegnarsi nel definitivo passaggio dall&rsquo;uno all&rsquo;altro.</para>
  14.245 +
  14.246 +    <para id="x_c6">Il comando <command role="hg-ext-convert">convert</command> è facile da usare. Vi basta puntarlo al percorso o all&rsquo;URL di un repository sorgente, dandogli opzionalmente il nome di un repository destinazione, e comincerà a lavorare. Dopo la conversione iniziale, sarà sufficiente eseguire ancora lo stesso comando per importare i nuovi cambiamenti.</para>
  14.247 +  </sect1>
  14.248 +
  14.249 +  <sect1>
  14.250 +    <title>Una breve storia del controllo di revisione</title>
  14.251 +
  14.252 +    <para id="x_c7">Il più noto tra i vecchi strumenti per il controllo di revisione è SCCS (acronimo di Source Code Control System, sistema per il controllo del codice sorgente), che Marc Rochkind scrisse mentre lavorava ai laboratori Bell nei primi anni &rsquo;70. SCCS operava su singoli file e obbligava ogni persona che lavorasse su un progetto ad avere accesso a uno spazio di lavoro condiviso su un singolo sistema. Solo una persona alla volta poteva modificare un file e l&rsquo;arbitraggio per l&rsquo;accesso ai file era realizzato attraverso i blocchi (in inglese, lock). Capitava spesso che le persone bloccassero i file e si dimenticassero di sbloccarli più tardi, impedendo a chiunque altro di modificare quei file senza l&rsquo;aiuto di un amministratore.</para>
  14.253 +
  14.254 +    <para id="x_c8">Walter Tichy sviluppò un&rsquo;alternativa libera a SCCS nei primi anni &rsquo;80, chiamando il suo programma RCS (acronimo di Revision Control System, sistema per il controllo di revisione). Come SCCS, RCS obbligava gli sviluppatori a lavorare in un singolo spazio di lavoro condiviso e a bloccare i file per prevenire cambiamenti simultanei da parte di più persone.</para>
  14.255 +
  14.256 +    <para id="x_c9">Più tardi nel corso degli anni &rsquo;80, Dick Grune usò RCS come componente di base per un insieme di script di shell che chiamò inizialmente cmt, ma che poi ribattezzò CVS (acronimo di Concurrent Versions System, sistema di versioni concorrenti). La grande innovazione di CVS fu che permetteva agli sviluppatori di lavorare simultaneamente e in qualche modo indipendentemente nel loro spazio di lavoro personale. Gli spazi di lavoro personali evitavano agli sviluppatori di pestarsi i piedi tutte le volte, come capitava comunemente con SCCS e RCS. Ogni sviluppatore aveva la copia di ogni file contenuto nel progetto e poteva modificare le proprie copie indipendentemente. Era necessario combinare le singole modifiche prima di introdurre i cambiamenti nel repository centrale.</para>
  14.257 +
  14.258 +    <para id="x_ca">Brian Berliner prese gli script originali di Grune e li riscrisse in C, rilasciando nel 1989 il codice che fin da allora è stato sviluppato come la moderna versione di CVS. CVS successivamente acquisì l&rsquo;abilità di operare attraverso una connessione di rete, caratteristica che gli conferì la propria architettura client/server. L&rsquo;architettura di CVS è centralizzata: solo il server ha la copia della cronologia del progetto, mentre gli spazi di lavoro sui client contengono solamente una copia delle versioni recenti dei file del progetto e i metadati che servono per conoscere l&rsquo;ubicazione del server. CVS ha avuto un enorme successo e probabilmente è il sistema di controllo di revisione più diffuso al mondo.</para>
  14.259 +
  14.260 +    <para id="x_cb">All&rsquo;inizio degli anni &rsquo;90, Sun Microsystems sviluppò un primo sistema per il controllo di revisione distribuito chiamato TeamWare. Uno spazio di lavoro in TeamWare contiene una copia completa della cronologia del progetto. TeamWare non possiede alcuna nozione di un repository centrale. (CVS si basava su RCS per la memorizzazione della cronologia, TeamWare usava SCCS.)</para>
  14.261 +
  14.262 +    <para id="x_cc">Durante gli anni &rsquo;90 crebbe la consapevolezza dei numerosi problemi di CVS. CVS registra individualmente cambiamenti simultanei a più di un file, invece di raggrupparli insieme come una singola operazione logicamente atomica, inoltre non gestisce bene la propria gerarchia di file, ed è facile danneggiare un repository cambiando i nomi di file e directory. Le difficoltà di lettura e manutenzione del suo codice sorgente resero proibitiva la <quote>soglia del dolore</quote> da oltrepassare per correggere questi problemi architetturali.</para>
  14.263 +
  14.264 +    <para id="x_cd">Nel 2001, Jim Blandy e Karl Fogel, due sviluppatori che avevano lavorato su CVS, diedero vita a un progetto per sostituirlo con uno strumento che avrebbe avuto un&rsquo;architettura migliore e un codice più pulito. Il risultato, Subversion, non si allontana dal modello client/server centralizzato di CVS, ma aggiunge inserimenti atomici per più file alla volta, una miglior gestione degli spazi di nomi e un certo numero di altre caratteristiche che lo rendono uno strumento generalmente migliore di CVS. Dal suo rilascio iniziale, la sua popolarità è rapidamente cresciuta.</para>
  14.265 +
  14.266 +    <para id="x_ce">Più o meno simultaneamente, Graydon Hoare cominciò a lavorare su un ambizioso sistema distribuito di controllo di revisione che chiamò Monotone. Monotone non si limita a risolvere molti dei problemi di progettazione di CVS e a possedere un&rsquo;architettura peer-to-peer, ma va oltre i primi (e i successivi) strumenti di controllo di revisione in un certo numero di modi innovativi, usando hash crittografici come identificatori e adottando una nozione integrale di <quote>fiducia</quote> per autenticare il codice che proviene da sorgenti differenti.</para>
  14.267 +
  14.268 +    <para id="x_cf">Mercurial nacque nel 2005. Mentre alcuni aspetti della sua progettazione sono stati influenzati da Monotone, Mercurial si concentra su facilità d&rsquo;uso, prestazioni elevate e scalabilità verso progetti molto grandi.</para>
  14.269 +  </sect1>
  14.270 +</chapter>
    15.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    15.2 +++ b/it/ch02-tour-basic.xml	Fri Sep 04 16:33:35 2009 +0200
    15.3 @@ -0,0 +1,509 @@
    15.4 +<chapter id="chap:tour-basic">
    15.5 +  <?dbhtml filename="una-panoramica-di-mercurial-i-concetti-di-base.html"?>
    15.6 +  <title>Una panoramica di Mercurial: i concetti di base</title>
    15.7 +
    15.8 +  <sect1 id="sec:tour:install">
    15.9 +    <title>Installare Mercurial sul vostro sistema</title>
   15.10 +
   15.11 +    <para id="x_1">I pacchetti di installazione precompilati che sono disponibili per tutti i sistemi operativi più popolari vi permettono di cominciare facilmente a usare subito Mercurial sul vostro computer.</para>
   15.12 +
   15.13 +    <sect2>
   15.14 +      <title>Windows</title>
   15.15 +
   15.16 +      <para id="x_c">La miglior versione di Mercurial per Windows è TortoiseHg, che può essere trovata all&rsquo;indirizzo <ulink url="http://bitbucket.org/tortoisehg/stable/wiki/Home">http://bitbucket.org/tortoisehg/stable/wiki/Home</ulink>. Questo pacchetto non ha dipendenze esterne ed è pronto a funzionare non appena viene installato. Fornisce sia un&rsquo;interfaccia a linea di comando sia un&rsquo;interfaccia grafica.</para>
   15.17 +
   15.18 +    </sect2>
   15.19 +
   15.20 +    <sect2>
   15.21 +      <title>Mac OS X</title>
   15.22 +
   15.23 +      <para id="x_a">Lee Cantey fornisce un pacchetto di installazione di Mercurial per Mac OS X all&rsquo;indirizzo <ulink url="http://mercurial.berkwood.com">http://mercurial.berkwood.com</ulink>.</para>
   15.24 +    </sect2>
   15.25 +
   15.26 +    <sect2>
   15.27 +      <title>Linux</title>
   15.28 +
   15.29 +      <para id="x_2">Dato che ogni distribuzione Linux ha i propri stumenti di impacchettamento, le proprie politiche e il proprio ritmo di sviluppo, è difficile dare un insieme completo di istruzioni su come installare i pacchetti eseguibili di Mercurial. La versione di Mercurial che finirete per ottenere può variare a seconda di quanto sia attiva la persona che mantiene il pacchetto di installazione per la vostra distribuzione.</para>
   15.30 +
   15.31 +      <para id="x_3">Per semplificare le cose, mi concentrerò sull&rsquo;installazione di Mercurial dalla linea di comando sulle distribuzioni Linux più popolari. La maggior parte di queste distribuzioni fornisce un gestore grafico per i pacchetti di installazione che vi permetterà di installare Mercurial con un singolo click sulla voce relativa al pacchetto chiamato <literal>mercurial</literal>.</para>
   15.32 +
   15.33 +      <itemizedlist>
   15.34 +	<listitem><para id="x_4">Ubuntu e Debian:</para>
   15.35 +	  <programlisting>apt-get install mercurial</programlisting></listitem>
   15.36 +	<listitem><para id="x_5">Fedora:</para>
   15.37 +	  <programlisting>yum install mercurial</programlisting></listitem>
   15.38 +	<listitem><para id="x_715">OpenSUSE:</para>
   15.39 +	  <programlisting>zypper install mercurial</programlisting></listitem>
   15.40 +	<listitem><para id="x_6">Gentoo:</para>
   15.41 +	  <programlisting>emerge mercurial</programlisting></listitem>
   15.42 +      </itemizedlist>
   15.43 +
   15.44 +    </sect2>
   15.45 +    <sect2>
   15.46 +      <title>Solaris</title>
   15.47 +
   15.48 +      <para id="x_9">SunFreeWare, all&rsquo;indirizzo <ulink url="http://www.sunfreeware.com">http://www.sunfreeware.com</ulink>, allestisce pacchetti precompilati di Mercurial.</para>
   15.49 +
   15.50 +    </sect2>
   15.51 +
   15.52 +  </sect1>
   15.53 +
   15.54 +  <sect1>
   15.55 +    <title>Per cominciare</title>
   15.56 +
   15.57 +    <para id="x_e">Come prima cosa, useremo il comando <command role="hg-cmd">hg version</command> per verificare che Mercurial sia correttamente installato. L&rsquo;effettiva informazione sulla versione stampata dal comando non è così importante, in quanto ci interessa semplicemente che il comando venga eseguito e che stampi qualche cosa.</para>
   15.58 +
   15.59 +    &interaction.tour.version;
   15.60 +
   15.61 +    <sect2>
   15.62 +      <title>Aiuto predefinito</title>
   15.63 +
   15.64 +      <para id="x_f">Mercurial include un sistema di aiuto predefinito che si rivela inestimabile quando vi trovate bloccati cercando di ricordare come si esegue un comando. Se siete completamente bloccati, provate a invocare <command role="hg-cmd">hg help</command> per visualizzare una breve lista di comandi insieme a una descrizione delle funzionalità di ognuno. Se chiedete aiuto per un comando specifico (come nell&rsquo;esempio seguente), verranno stampate informazioni più dettagliate.</para>
   15.65 +
   15.66 +	&interaction.tour.help;
   15.67 +
   15.68 +	<para id="x_10">Per ottenere un livello di dettaglio ancora maggiore (che di solito non vi servirà) eseguite <command role="hg-cmd">hg help <option role="hg-opt-global">-v</option></command>. L&rsquo;opzione <option role="hg-opt-global">-v</option> è l&rsquo;abbreviazione di <option role="hg-opt-global">--verbose</option> e dice a Mercurial di stampare più informazioni di quanto farebbe di solito.</para>
   15.69 +
   15.70 +    </sect2>
   15.71 +  </sect1>
   15.72 +  <sect1>
   15.73 +    <title>Lavorare con un repository</title>
   15.74 +
   15.75 +    <para id="x_11">In Mercurial, tutto accade all&rsquo;interno di un <emphasis>repository</emphasis>. Il repository di un progetto contiene tutti i file che <quote>appartengono</quote> a quel progetto insieme a una registrazione cronologica delle loro modifiche.</para>
   15.76 +
   15.77 +    <para id="x_12">Non c&rsquo;è niente di particolarmente magico in un repository: è semplicemente un albero di directory nel vostro file system che Mercurial tratta in modo speciale. Potete cancellare un repository o modificarne il nome in ogni momento, usando sia la riga di comando sia il vostro programma preferito di gestione dei file.</para>
   15.78 +
   15.79 +    <sect2>
   15.80 +      <title>Fare una copia locale di un repository</title>
   15.81 +
   15.82 +      <para id="x_13"><emphasis>Copiare</emphasis> un repository è in realtà un&rsquo;operazione un po&rsquo; speciale. Pur potendo usare un normale comando di copia dei file per copiare un repository, il modo migliore per farlo è quello di usare un comando predefinito fornito da Mercurial. Questo comando si chiama <command role="hg-cmd">hg clone</command>, perché crea una copia identica di un repository esistente.</para>
   15.83 +
   15.84 +      &interaction.tour.clone;
   15.85 +
   15.86 +      <para id="x_67c">Come possiamo vedere qui sopra, il comando <command role="hg-cmd">hg clone</command> ha il vantaggio di poter clonare un repository attraverso la rete. Un altro vantaggio di questo comando è quello di ricordare da dove abbiamo effettuato la copia, cosa che ci tornerà utile molto presto quando vorremo prelevare nuovi cambiamenti da un altro repository.</para>
   15.87 +
   15.88 +      <para id="x_14">Se la nostra clonazione ha avuto successo, ora dovremmo avere una directory locale chiamata <filename class="directory">hello</filename>. Questa directory contiene alcuni file.</para>
   15.89 +
   15.90 +      &interaction.tour.ls;
   15.91 +
   15.92 +      <para id="x_15">Il contenuto e la cronologia di questi file nel nostro repository sono gli stessi di quelli presenti nel repository che abbiamo clonato.</para>
   15.93 +
   15.94 +      <para id="x_16">Ogni repository Mercurial contiene la propria copia privata dei file e della cronologia di un progetto ed è sempre completo, auto-contenuto e indipendente. Come abbiamo appena detto, il clone di un repository ricorda l&rsquo;ubicazione del repository da cui è stato clonato, ma Mercurial non comunicherà con quel repository, o con qualsiasi altro repository, a meno che non siamo noi a chiederlo.</para>
   15.95 +
   15.96 +      <para id="x_17">Per ora, questo significa che siamo liberi di effettuare esperimenti con il nostro repository, sapendo con sicurezza che è un <quote>ambiente di prova</quote> privato le cui variazioni non avranno effetto su nessun altro.</para>
   15.97 +
   15.98 +    </sect2>
   15.99 +    <sect2>
  15.100 +      <title>Che cosa contiene un repository?</title>
  15.101 +
  15.102 +      <para id="x_18">Se diamo un&rsquo;occhiata più dettagliata all&rsquo;interno di un repository, possiamo vedere che contiene una directory chiamata <filename class="directory">.hg</filename>. Questo è il luogo dove Mercurial tiene tutti i propri metadati sul repository.</para>
  15.103 +
  15.104 +      &interaction.tour.ls-a;
  15.105 +
  15.106 +      <para id="x_19">Il contenuto della directory <filename class="directory">.hg</filename> e delle sue sottodirectory è riservato a Mercurial. Tutti gli altri file e directory nel repository sono vostri e potete farne ciò che volete.</para>
  15.107 +
  15.108 +      <para id="x_1a">Per introdurre un po&rsquo; di terminologia, diciamo che la directory <filename class="directory">.hg</filename> è il repository <quote>reale</quote> e che tutti gli altri file e directory che coesistono con esso si trovano nella <emphasis>directory di lavoro</emphasis>. Potete ricordare facilmente questa distinzione se considerate che il <emphasis>repository</emphasis> contiene la <emphasis>cronologia</emphasis> del progetto, mentre la <emphasis>directory di lavoro</emphasis> contiene una <emphasis>fotografia</emphasis> del vostro progetto in un punto particolare della cronologia.</para>
  15.109 +
  15.110 +    </sect2>
  15.111 +  </sect1>
  15.112 +  <sect1>
  15.113 +    <title>Un viaggio attraverso la cronologia</title>
  15.114 +
  15.115 +    <para id="x_1b">Una delle prime cose che potremmo voler fare con un nuovo repository che non ci è familiare è conoscere la sua storia. Il comando <command role="hg-cmd">hg log</command> ci permette di vedere la cronologia dei cambiamenti nel repository.</para>
  15.116 +
  15.117 +    &interaction.tour.log;
  15.118 +
  15.119 +    <para id="x_1c">Secondo le sue impostazioni predefinite, questo comando stampa un breve paragrafo per ogni cambiamento che è stato registrato nel progetto. Nella terminologia di Mercurial, chiamiamo <emphasis>changeset</emphasis> (letteralmente, insieme di cambiamenti) ognuno di questi eventi registrati perché contiene la registrazione dei cambiamenti a diversi file.</para>
  15.120 +
  15.121 +    <para id="x_1d">I campi di una singola registrazione mostrata da <command role="hg-cmd">hg log</command> sono i seguenti.</para>
  15.122 +
  15.123 +    <itemizedlist>
  15.124 +      <listitem><para id="x_1e"><literal>changeset</literal>: questo campo ha il formato di un numero, seguito dal carattere di due punti, seguito da una stringa esadecimale. Questi sono gli <emphasis>identificatori</emphasis> del changeset. La stringa esadecimale è un identificatore unico: la stessa stringa esadecimale si riferirà sempre allo stesso changeset in ogni copia di questo repository. Il numero è più corto e facile da digitare rispetto alla stringa esadecimale, ma non è unico: lo stesso numero potrebbe identificare changeset differenti in due cloni differenti di uno stesso repository.</para>
  15.125 +      </listitem>
  15.126 +      <listitem><para id="x_1f"><literal>utente</literal> (in inglese, <literal>user</literal>): l&rsquo;identità della persona che ha creato il changeset. Questo è un campo di testo libero, ma il più delle volte contiene il nome e l&rsquo;indirizzo email di una persona.</para></listitem>
  15.127 +      <listitem><para id="x_20"><literal>data</literal> (in inglese, <literal>date</literal>): la data, l&rsquo;orario e il fuso orario in cui il changeset è stato creato. (La data e l&rsquo;orario sono locali per quel fuso orario e mostrano il giorno e l&rsquo;ora per la persona che ha creato il changeset.)</para></listitem>
  15.128 +      <listitem><para id="x_21"><literal>sommario</literal> (in inglese, <literal>summary</literal>): la prima riga del messaggio di testo che il creatore del changeset ha utilizzato per descrivere il changeset.</para></listitem>
  15.129 +      <listitem>
  15.130 +	<para id="x_67d">Alcuni changeset, come il primo della lista mostrata qui sopra, sono contrassegnati da un&rsquo;etichetta contenuta in un campo <literal>etichetta</literal> (in inglese, <literal>tag</literal>). Un&rsquo;etichetta è un altro modo di identificare un changeset, dandogli un nome facile da ricordare. (L&rsquo;etichetta chiamata <literal>tip</literal> è speciale: si riferisce sempre alla modifica più recente nel repository.)</para>
  15.131 +      </listitem>
  15.132 +    </itemizedlist>
  15.133 +
  15.134 +    <para id="x_22">Il testo stampato dall&rsquo;esecuzione predefinita del comando <command role="hg-cmd">hg log</command> è un semplice riepilogo e in quanto tale non contiene molti dettagli.</para>
  15.135 +
  15.136 +    <para id="x_23">La <xref linkend="fig:tour-basic:history"/> mostra una rappresentazione grafica della cronologia del repository <filename class="directory">hello</filename>, in modo che sia un po&rsquo; più facile vedere qual è la direzione in cui la cronologia si sta <quote>sviluppando</quote>. Ritorneremo a questa figura diverse volte in questo capitolo e nei capitoli che seguono.</para>
  15.137 +
  15.138 +    <figure id="fig:tour-basic:history">
  15.139 +      <title>Rappresentazione grafica della cronologia per il repository <filename class="directory">hello</filename></title>
  15.140 +      <mediaobject>
  15.141 +	<imageobject><imagedata fileref="figs/tour-history.png"/></imageobject>
  15.142 +	<textobject><phrase>XXX add text</phrase></textobject>
  15.143 +      </mediaobject>
  15.144 +    </figure>
  15.145 +
  15.146 +    <sect2>
  15.147 +      <title>Parlare di changeset o revisioni con altre persone</title>
  15.148 +
  15.149 +      <para id="x_25">Dato che l&rsquo;inglese è una lingua notoriamente trasandata e che l&rsquo;informatica ha una storia consacrata alla confusione terminologica (perché usare un solo termine quando se ne possono usare quattro?), il controllo di revisione impiega una varietà di termini ed espressioni per indicare la stessa cosa. Se parlate della cronologia di Mercurial con altre persone, scoprirete che il termine <quote>changeset</quote> è spesso abbreviato in <quote>change</quote> (in italiano, cambiamento) o in <quote>cset</quote> (nella sua forma scritta) e che talvolta ci si riferisce a un changeset chiamandolo <quote>revisione</quote> oppure <quote>rev</quote>.</para>
  15.150 +
  15.151 +      <para id="x_26">Mentre non ha importanza quale <emphasis>parola</emphasis> voi usiate per riferirvi al concetto di <quote>un changeset</quote>, l&rsquo;<emphasis>identificatore</emphasis> che usate per riferirvi a <quote>uno <emphasis>specifico</emphasis> changeset</quote> è di grande importanza. Ricordatevi che il campo <literal>changeset</literal> nel riepilogo mostrato da <command role="hg-cmd">hg log</command> identifica un changeset utilizzando sia un numero che una stringa esadecimale.</para>
  15.152 +      <itemizedlist>
  15.153 +	<listitem><para id="x_27">Il numero di revisione è una notazione comoda che è <emphasis>valida solo in quel repository</emphasis>.</para></listitem>
  15.154 +	<listitem><para id="x_28">La stringa esadecimale è l&rsquo;<emphasis>identificatore permanente e non modificabile</emphasis> che individuerà sempre quell&rsquo;esatto changeset in <emphasis>qualsiasi</emphasis> copia del repository.</para></listitem>
  15.155 +      </itemizedlist>
  15.156 +
  15.157 +      <para id="x_29">Questa distinzione è importante. Se spedite un&rsquo;email a qualcuno parlando della <quote>revisione 33</quote>, c&rsquo;è un&rsquo;alta probabilità che la sua revisione 33 <emphasis>non sia la stessa</emphasis> della vostra, perché un numero di revisione dipende dall&rsquo;ordine in cui i cambiamenti sono stati introdotti in un repository e non c&rsquo;è alcuna garanzia che gli stessi cambiamenti siano avvenuti nello stesso ordine in repository differenti. Tre cambiamenti <literal>a,b,c</literal> possono facilmente comparire in un repository come <literal>0,1,2</literal> e in un altro repository come <literal>0,2,1</literal>.</para>
  15.158 +
  15.159 +      <para id="x_2a">Mercurial usa i numeri di revisione soltanto come un&rsquo;abbreviazione di convenienza. Se avete bisogno di discutere un changeset con qualcuno o di indicare un changeset per qualche altra ragione (per esempio, nella segnalazione di un bug), usate l&rsquo;identificatore esadecimale.</para>
  15.160 +
  15.161 +    </sect2>
  15.162 +    <sect2>
  15.163 +      <title>Vedere revisioni specifiche</title>
  15.164 +
  15.165 +      <para id="x_2b">Per ridurre l&rsquo;elenco stampato dal comando <command role="hg-cmd">hg log</command> a una singola revisione, usate l&rsquo;opzione <option role="hg-opt-log">-r</option> (o <option role="hg-opt-log">--rev</option>). Potete usare sia un numero di revisione che un identificatore esadecimale e potete fornire al comando tutte le revisioni che volete.</para>
  15.166 +
  15.167 +      &interaction.tour.log-r;
  15.168 +
  15.169 +      <para id="x_2c">Se volete vedere la cronologia di diverse revisioni senza doverle elencare tutte potete usare la <emphasis>notazione di intervallo</emphasis>, che vi permette di esprimere l&rsquo;idea di operare su <quote>tutte le revisioni tra <literal>abc</literal> e <literal>def</literal> comprese</quote>.</para>
  15.170 +
  15.171 +      &interaction.tour.log.range;
  15.172 +
  15.173 +      <para id="x_2d">Mercurial rispetta anche l&rsquo;ordine in cui specificate le revisioni, quindi il comando <command role="hg-cmd">hg log -r 2:4</command> stamperà le revisioni 2, 3 e 4, mentre il comando <command role="hg-cmd">hg log -r 4:2</command> stamperà le revisioni 4, 3 e 2.</para>
  15.174 +
  15.175 +    </sect2>
  15.176 +    <sect2>
  15.177 +      <title>Informazioni più dettagliate</title>
  15.178 +
  15.179 +      <para id="x_2e">Mentre le informazioni di riepilogo stampate da <command role="hg-cmd">hg log</command> sono utili se sapete già cosa state cercando, potreste aver bisogno di vedere una descrizione completa del cambiamento, o una lista dei file modificati, nel caso stiate tentando di capire se il changeset è quello che volevate. L&rsquo;opzione <option role="hg-opt-global">-v</option> (o <option role="hg-opt-global">--verbose</option>) del comando <command role="hg-cmd">hg log</command> vi fornisce questi dettagli aggiuntivi.</para>
  15.180 +
  15.181 +      &interaction.tour.log-v;
  15.182 +
  15.183 +      <para id="x_2f">Se volete vedere sia la descrizione che il contenuto di un cambiamento, aggiungete l&rsquo;opzione <option role="hg-opt-log">-p</option> (o <option role="hg-opt-log">--patch</option>). In questo modo il contenuto del cambiamento verrà stampato come un <emphasis>diff unificato</emphasis> (se non avete mai visto un diff unificato prima d&rsquo;ora, date un&rsquo;occhiata alla <xref linkend="sec:mq:patch"/> per un&rsquo;introduzione).</para>
  15.184 +
  15.185 +      &interaction.tour.log-vp;
  15.186 +
  15.187 +      <para id="x_67e">L&rsquo;opzione <option role="hg-opt-log">-p</option> è tremendamente utile, quindi merita di essere ricordata.</para>
  15.188 +
  15.189 +    </sect2>
  15.190 +  </sect1>
  15.191 +
  15.192 +  <sect1>
  15.193 +    <title>Tutto quello che dovete sapere sulle opzioni dei comandi</title>
  15.194 +
  15.195 +    <para id="x_30">Facciamo una piccola pausa nella nostra esplorazione dei comandi di Mercurial per discutere lo schema secondo cui quei comandi lavorano, perché potreste trovarlo utile da tenere a mente nel seguito di questa panoramica.</para>
  15.196 +
  15.197 +    <para id="x_31">Mercurial adotta un approccio semplice e consistente per gestire le opzioni che potete passare ai comandi. Segue l&rsquo;insieme di convenzioni per le opzioni comunemente usato nei moderni sistemi Linux e Unix.</para>
  15.198 +
  15.199 +    <itemizedlist>
  15.200 +      <listitem>
  15.201 +	<para id="x_32">Ogni opzione ha un nome lungo. Per esempio, come avete già visto, il comando <command role="hg-cmd">hg log</command> accetta un&rsquo;opzione <option role="hg-opt-log">--rev</option>.</para>
  15.202 +      </listitem>
  15.203 +      <listitem>
  15.204 +	<para id="x_33">La maggior parte delle opzioni ha anche un nome breve. Invece di <option role="hg-opt-log">--rev</option>, possiamo usare <option role="hg-opt-log">-r</option>. (Alcune opzioni non hanno un nome breve perché vengono usate raramente.)</para>
  15.205 +      </listitem>
  15.206 +      <listitem>
  15.207 +	<para id="x_34">Le opzioni lunghe cominciano con due trattini (e.g. <option role="hg-opt-log">--rev</option>), mentre le opzioni brevi cominciano con un solo trattino (e.g. <option role="hg-opt-log">-r</option>).</para>
  15.208 +      </listitem>
  15.209 +      <listitem>
  15.210 +	<para id="x_35">Lo schema di denominazione e di utilizzo delle opzioni è consistente attraverso tutti i comandi. Per esempio, ogni comando che vi permette di specificare un identificatore di changeset o un numero di revisione accetta entrambi gli argomenti <option role="hg-opt-log">-r</option> e <option role="hg-opt-log">--rev</option>.</para>
  15.211 +      </listitem>
  15.212 +      <listitem>
  15.213 +	<para id="x_67f">Se state usando le opzioni brevi, potete risparmiare altri caratteri raggruppandole insieme. Per esempio, il comando <command role="hg-cmd">hg log -v -p -r 2</command> può essere scritto come <command role="hg-cmd">hg log -vpr2</command>.</para>
  15.214 +      </listitem>
  15.215 +    </itemizedlist>
  15.216 +
  15.217 +    <para id="x_36">Negli esempi contenuti in questo libro, di solito uso le opzioni brevi invece di quelle lunghe. Questo riflette semplicemente la mia preferenza, quindi non leggetevi nulla di particolarmente significativo.</para>
  15.218 +
  15.219 +    <para id="x_37">La maggior parte dei comandi che stampano un testo di qualche tipo stamperanno più testo quando gli verrà passata l&rsquo;opzione <option role="hg-opt-global">-v</option> (o <option role="hg-opt-global">--verbose</option>) e meno testo quando gli verrà passata l&rsquo;opzione <option role="hg-opt-global">-q</option> (o <option role="hg-opt-global">--quiet</option>).</para>
  15.220 +
  15.221 +    <note>
  15.222 +      <title>La consistenza nella denominazione delle opzioni</title>
  15.223 +
  15.224 +      <para id="x_680">Quasi sempre, le opzioni dei comandi Mercurial usano nomi consistenti per fare riferimento agli stessi concetti. Per esempio, se un comando ha a che fare con i changeset, questi verranno sempre identificati tramite l&rsquo;opzione <option role="hg-opt-log">--rev</option> o <option role="hg-opt-log">-r</option>. L&rsquo;uso consistente dei nomi delle opzioni rende più facile ricordarsi quali opzioni sono accettate da un particolare comando.</para>
  15.225 +    </note>
  15.226 +
  15.227 +  </sect1>
  15.228 +  <sect1>
  15.229 +    <title>Come effettuare e rivedere i cambiamenti</title>
  15.230 +
  15.231 +    <para id="x_38">Ora che sappiamo come ispezionare la cronologia in Mercurial, diamo un&rsquo;occhiata al modo in cui si apportano e si esaminano i cambiamenti.</para>
  15.232 +
  15.233 +    <para id="x_39">Per cominciare, isoleremo il nostro esperimento in un apposito repository. Usiamo il comando <command role="hg-cmd">hg clone</command>, ma senza clonare il repository remoto, perché sarà sufficiente clonarne la copia locale che già possediamo. Una clonazione locale è molto più veloce rispetto a una clonazione attraverso la rete e, nella maggior parte dei casi, il clone di un repository locale utilizza anche una quantità inferiore di spazio su disco<footnote>
  15.234 +	<para id="x_681">Il risparmio di spazio si ottiene quando i repository sorgente e destinazione sono sullo stesso file system, nel qual caso Mercurial userà collegamenti fisici per effettuare una condivisione copy-on-write dei suoi metadati interni. Se questa spiegazione non significa nulla per voi, non preoccupatevi: ogni cosa avviene in maniera trasparente e automatica, e non avete bisogno di capirla.</para>
  15.235 +	</footnote>.</para>
  15.236 +
  15.237 +    &interaction.tour.reclone;
  15.238 +
  15.239 +    <para id="x_3a">Come nota a margine, è buona pratica tenere da parte una copia <quote>intatta</quote> di un repository remoto, che potete usare per creare cloni temporanei o ambienti di prova per ogni attività che volete svolgere. Questo vi permette di lavorare su molteplici attività in parallelo, ognuna isolata dalle altre fino a quando non è completa e non siete pronti per reintegrarla. Dato che i cloni locali sono così economici, non c&rsquo;è quasi alcuno spreco nel clonare e cancellare repository ogni volta che volete.</para>
  15.240 +
  15.241 +    <para id="x_3b">Nel nostro repository <filename class="directory">mio-hello</filename> abbiamo un file <filename>hello.c</filename> che contiene il classico programma <quote>ciao, mondo</quote>.</para>
  15.242 +
  15.243 +    &interaction.tour.cat1;
  15.244 +
  15.245 +    <para id="x_682">Modifichiamo questo file in modo da fargli stampare una seconda riga.</para>
  15.246 +
  15.247 +    &interaction.tour.cat2;
  15.248 +
  15.249 +    <para id="x_3c">Il comando <command role="hg-cmd">hg status</command> di Mercurial ci dirà quello che Mercurial sa sullo stato dei file nel repository.</para>
  15.250 +
  15.251 +    &interaction.tour.status;
  15.252 +
  15.253 +    <para id="x_3d">Il comando <command role="hg-cmd">hg status</command> non stampa nulla per alcuni file e stampa una riga che comincia con <quote><literal>M</literal></quote> per <filename>hello.c</filename>. A meno che non glielo chiediate, <command role="hg-cmd">hg status</command> non stamperà alcuna informazione per i file che non sono stati modificati.</para>
  15.254 +
  15.255 +    <para id="x_3e">La <quote><literal>M</literal></quote> indica che Mercurial ha notato che abbiamo modificato il file <filename>hello.c</filename>. Non abbiamo avuto bisogno di <emphasis>informare</emphasis> Mercurial che stavamo per modificare il file prima di cominciare o che abbiamo modificato il file dopo aver finito. Mercurial è stato in grado di rendersene conto da solo.</para>
  15.256 +
  15.257 +    <para id="x_3f">In qualche modo, è utile sapere che abbiamo modificato <filename>hello.c</filename>, ma potremmo preferire sapere esattamente <emphasis>quali</emphasis> cambiamenti abbiamo apportato. Per fare questo, utilizziamo il comando <command role="hg-cmd">hg diff</command>.</para>
  15.258 +
  15.259 +    &interaction.tour.diff;
  15.260 +
  15.261 +    <tip>
  15.262 +      <title>Capire le patch</title>
  15.263 +
  15.264 +      <para id="x_683">Ricordate di dare un&rsquo;occhiata alla <xref linkend="sec:mq:patch"/> se non sapete come interpretare il risultato del comando appena eseguito.</para>
  15.265 +    </tip>
  15.266 +  </sect1>
  15.267 +  <sect1>
  15.268 +    <title>Registrare i cambiamenti in un nuovo changeset</title>
  15.269 +
  15.270 +    <para id="x_40">Possiamo modificare i file, compilare e collaudare i nostri cambiamenti, e usare <command role="hg-cmd">hg status</command> e <command
  15.271 +	role="hg-cmd">hg diff</command> per rivedere le nostre modifiche fino a quando non  siamo soddisfatti di quello che abbiamo ottenuto e arriviamo a un naturale punto fermo in cui vogliamo registrare il nostro lavoro in un nuovo changeset.</para>
  15.272 +
  15.273 +    <para id="x_41">Il comando <command role="hg-cmd">hg commit</command> ci permette di creare un nuovo changeset. Faremo riferimento a questa operazione con le espressioni <quote>effettuare un commit</quote> o <quote>eseguire un commit</quote> oppure con il termine inglese <quote>commit</quote> e talvolta con il termine italiano <quote>inserimento</quote>.</para>
  15.274 +
  15.275 +    <sect2>
  15.276 +      <title>Impostare un nome utente</title>
  15.277 +
  15.278 +      <para id="x_42">Quando provate a eseguire <command role="hg-cmd">hg commit</command> per la prima volta, non c&rsquo;è alcuna garanzia che il comando abbia successo. Mercurial registra il vostro nome e indirizzo con ogni cambiamento che inserite, in modo che più tardi voi e gli altri siate in grado di dire chi lo ha effettuato. Mercurial prova a costruire automaticamente un nome utente ragionevole da usare per l&rsquo;inserimento. Proverà ognuno dei seguenti metodi, in questo ordine.</para>
  15.279 +      <orderedlist>
  15.280 +	<listitem><para id="x_43">La precedenza più alta verrà data al nome utente che segue l&rsquo;opzione <option role="hg-opt-commit">-u</option> del comando <command role="hg-cmd">hg commit</command>.</para></listitem>
  15.281 +	<listitem><para id="x_44">Successivamente, verrà controllato il valore della variabile d&rsquo;ambiente <envar>HGUSER</envar>.</para></listitem>
  15.282 +	<listitem><para id="x_45">Quindi, verrà usato l&rsquo;elemento <envar role="rc-item-ui">username</envar> contenuto in un file chiamato <filename role="special">.hgrc</filename> che potreste aver creato nella vostra directory personale. Per vedere come dovrebbero apparire i contenuti di questo file, fate riferimento alla <xref linkend="sec:tour-basic:username"/> più avanti.</para></listitem>
  15.283 +	<listitem><para id="x_46">Successivamente, verrà controllato il valore della variabile d&rsquo;ambiente <envar>EMAIL</envar>.</para></listitem>
  15.284 +	<listitem><para id="x_47">Infine, Mercurial interrogherà il vostro sistema per trovare il vostro nome utente locale e il nome della vostra macchina, utilizzandoli poi per costruire un nome utente. Dato che questo processo risulta spesso in un nome utente che non è molto utile, Mercurial stamperà un messaggio di avvertimento nel caso sia costretto a ricorrere a questa alternativa.</para></listitem>
  15.285 +      </orderedlist>
  15.286 +      <para id="x_48">Se tutti questi meccanismi falliscono, Mercurial si fermerà stampando un messaggio di errore. In questo caso, non vi permetterà di eseguire il commit fino a quando non avrete impostato il vostro nome utente.</para>
  15.287 +      <para id="x_49">Dovreste considerare la variabile d&rsquo;ambiente <envar>HGUSER</envar> e l&rsquo;opzione <option role="hg-opt-commit">-u</option> del comando <command role="hg-cmd">hg commit</command> come modi per rimpiazzare la selezione predefinita del nome utente da parte di Mercurial. Normalmente, il modo più semplice e robusto per impostare il vostro nome utente è quello di creare un file <filename role="special">.hgrc</filename>.</para>
  15.288 +      <sect3 id="sec:tour-basic:username">
  15.289 +	<title>Creare un file di configurazione per Mercurial</title>
  15.290 +
  15.291 +	<para id="x_4a">Per impostare un nome utente, usate il vostro editor preferito e create un file chiamato <filename role="special">.hgrc</filename> nella vostra directory personale. Mercurial userà questo file per cercare le vostre impostazioni di configurazione personalizzate. Il contenuto iniziale del vostro file <filename role="special">.hgrc</filename> dovrebbe somigliare al seguente.</para>
  15.292 +
  15.293 +	<tip>
  15.294 +	  <title>La <quote>directory personale</quote> sotto Windows</title>
  15.295 +
  15.296 +	  <para id="x_716">In una installazione italiana di Windows, la vostra directory personale di solito corrisponde a una cartella chiamata con il vostro nome utente che si trova in <filename>C:\Documents and Settings</filename>. Potete scoprire l&rsquo;esatto nome della vostra directory personale aprendo una finestra del prompt dei comandi e invocando il comando seguente.</para>
  15.297 +
  15.298 +	  <screen><prompt>C:\></prompt> <userinput>echo %UserProfile%</userinput></screen>
  15.299 +	</tip>
  15.300 +
  15.301 +	<programlisting># Questo è un file di configurazione per Mercurial.
  15.302 +[ui]
  15.303 +username = Nome Cognome &lt;indirizzo.email@example.org&gt;</programlisting>
  15.304 +
  15.305 +	<para id="x_4b">La riga <quote><literal>[ui]</literal></quote> comincia una <emphasis>sezione</emphasis> del file di configurazione, così potete leggere la riga <quote><literal>username = ...</literal></quote> con il significato di <quote>imposta il valore dell&rsquo;elemento <literal>username</literal> nella sezione <literal>ui</literal></quote>. Una sezione continua fino a quando ne comincia una nuova o fino alla fine del file. Mercurial ignora le righe vuote e tratta il testo di ogni riga che comincia con il carattere <quote><literal>#</literal></quote> come un commento.</para>
  15.306 +      </sect3>
  15.307 +
  15.308 +      <sect3>
  15.309 +	<title>Scegliere un nome utente</title>
  15.310 +
  15.311 +	<para id="x_4c">Potete usare il testo che preferite come valore dell&rsquo;elemento di configurazione <literal>username</literal>, dato che questa informazione serve per essere letta da altre persone e non verrà interpretata da Mercurial. La convenzione seguita dalla maggior parte delle persone è quella di usare il proprio nome e indirizzo email, come nell&rsquo;esempio precedente.</para>
  15.312 +	<note>
  15.313 +	  <para id="x_4d">Il server web predefinito di Mercurial offusca gli indirizzi email, per rendere la vita difficile agli strumenti che gli spammer usano per raccogliere nuovi indirizzi. Questo riduce la possibilità che cominciate a ricevere una maggior quantità di spazzatura nella vostra casella email se pubblicate un repository Mercurial sul web.</para></note>
  15.314 +      </sect3>
  15.315 +    </sect2>
  15.316 +    <sect2>
  15.317 +      <title>Scrivere un messaggio di commit</title>
  15.318 +
  15.319 +      <para id="x_4e">Quando inseriamo un cambiamento, Mercurial apre un editor di testo per farci scrivere un <emphasis>messaggio di commit</emphasis> allo scopo di descrivere le modifiche che abbiamo effettuato in questo changeset. Il messaggio verrà registrato per i lettori interessati a sapere quello che abbiamo fatto e perché, e verrà stampato dalle invocazioni di <command role="hg-cmd">hg log</command> successive alla terminazione dell&rsquo;inserimento.</para>
  15.320 +
  15.321 +       &interaction.tour.commit;
  15.322 +
  15.323 +      <para id="x_4f">L&rsquo;editor aperto dal comando <command role="hg-cmd">hg commit</command> conterrà una o due righe vuote, seguite da un certo numero di righe che cominciano con <quote><literal>HG:</literal></quote>.</para>
  15.324 +
  15.325 +    <programlisting>
  15.326 +Potete digitare qui il vostro messaggio di commit.
  15.327 +
  15.328 +HG: Inserite un messaggio di commit. Le righe che cominciano con 'HG:' verranno rimosse.
  15.329 +HG: --
  15.330 +HG: utente: Bryan O'Sullivan &lt;bos@serpentine.com&gt;
  15.331 +HG: ramo 'default'
  15.332 +HG: modificato hello.c</programlisting>
  15.333 +
  15.334 +      <para id="x_50">Mercurial ignora le righe che cominciano con <quote><literal>HG:</literal></quote> e le usa solamente per dirci a quali file appartengono i cambiamenti che sta per registrare. Modificare o cancellare quelle righe non ha alcun effetto.</para>
  15.335 +    </sect2>
  15.336 +    <sect2>
  15.337 +      <title>Scrivere un buon messaggio di commit</title>
  15.338 +
  15.339 +      <para id="x_51">Dato che <command role="hg-cmd">hg log</command> stampa per default solo la prima riga del messaggio di commit, è meglio scrivere un messaggio di commit in cui la prima riga stia in piedi da sola. Ecco un esempio reale di un messaggio di commit che <emphasis>non</emphasis> segue questa linea guida e che quindi presenta un riepilogo incomprensibile.</para>
  15.340 +
  15.341 +      <programlisting>
  15.342 +changeset:   73:584af0e231be
  15.343 +utente:      Persona Censurata &lt;persona.censurata@example.org&gt;
  15.344 +data:        Tue Sep 26 21:37:07 2006 -0700
  15.345 +sommario:    incluso buildmeister/commondef. Aggiunti gli export.</programlisting>
  15.346 +
  15.347 +      <para id="x_52">Non ci sono regole ferree da seguire per quanto riguarda il resto del contenuto del messaggio di commit. Lo stesso Mercurial non interpreta né si occupa del contenuto del messaggio, sebbene il vostro progetto possa adottare politiche che vi obbligano a un certo tipo di formattazione.</para>
  15.348 +      <para id="x_53">Personalmente, prediligo messaggi di commit brevi ma informativi che mi dicano qualcosa che non sono in grado di capire attraverso una veloce occhiata al risultato del comando <command role="hg-cmd">hg log --patch</command>.</para>
  15.349 +      <para id="x_55">Se eseguiamo <command role="hg-cmd">hg commit</command> senza argomenti, il comando registra tutti i cambiamenti che abbiamo effettuato, come segnalati dai comandi <command role="hg-cmd">hg status</command> e <command role="hg-cmd">hg diff</command>.</para>
  15.350 +
  15.351 +      <note>
  15.352 +	<title>Una sorpresa per gli utenti Subversion</title>
  15.353 +
  15.354 +	<para id="x_717">Come altri comandi Mercurial, <command role="hg-cmd">hg commit</command> opererà su tutta la directory di lavoro del repository se non forniamo esplicitamente al comando i nomi dei file da inserire. Dovete fare attenzione a questa particolarità se venite dal mondo Subversion o CVS, perché potreste aspettarvi di operare solo nella directory corrente in cui vi trovate e nelle sue sottodirectory.</para>
  15.355 +      </note>
  15.356 +    </sect2>
  15.357 +
  15.358 +    <sect2>
  15.359 +      <title>Abortire un commit</title>
  15.360 +
  15.361 +      <para id="x_54">Se decidete di non voler eseguire l&rsquo;inserimento mentre state scrivendo il messaggio di commit, vi basta uscire dal vostro editor senza salvare il file che contiene il messaggio. Questo eviterà che il repository e la directory di lavoro vengano alterati in alcun modo.</para>
  15.362 +    </sect2>
  15.363 +
  15.364 +    <sect2>
  15.365 +      <title>Ammirare la nostra nuova opera</title>
  15.366 +
  15.367 +      <para id="x_56">Una volta che abbiamo terminato l&rsquo;inserimento, possiamo usare il comando <command role="hg-cmd">hg tip</command> per visualizzare il changeset che abbiamo appena creato. Questo comando produce una stampa identica a quella del comando <command role="hg-cmd">hg log</command>, ma mostra solamente la revisione più recente nel repository.</para>
  15.368 +
  15.369 +      &interaction.tour.tip;
  15.370 +
  15.371 +      <para id="x_57">Ci riferiremo alla revisione più recente nel repository come alla <emphasis>revisione di punta</emphasis>, o semplicemente la <emphasis>punta</emphasis>.</para>
  15.372 +
  15.373 +      <para id="x_684">Notate che il comando <command role="hg-cmd">hg tip</command> accetta molte delle stesse opzioni viste per <command role="hg-cmd">hg log</command>, quindi l&rsquo;opzione <option role="hg-opt-global">-v</option> nell&rsquo;esempio precedente chiede al comando di <quote>essere verboso</quote> e l&rsquo;opzione <option role="hg-opt-tip">-p</option> specifica di <quote>stampare una patch</quote>. L&rsquo;uso di <option role="hg-opt-tip">-p</option> per stampare le patch è un altro esempio della denominazione consistente che avevamo menzionato in precedenza.</para>
  15.374 +    </sect2>
  15.375 +  </sect1>
  15.376 +
  15.377 +  <sect1>
  15.378 +    <title>Condividere i cambiamenti</title>
  15.379 +
  15.380 +    <para id="x_58">Come abbiamo già detto, i repository Mercurial sono auto-contenuti. Questo significa che il cambiamento che abbiamo appena creato esiste solo nel nostro repository <filename class="directory">mio-hello</filename>. Vediamo ora alcuni modi in cui possiamo propagare questa modifica verso altri repository.</para>
  15.381 +
  15.382 +    <sect2 id="sec:tour:pull">
  15.383 +      <title>Estrarre i cambiamenti da altri repository</title>
  15.384 +
  15.385 +      <para id="x_59">Per cominciare, cloniamo il nostro repository <filename class="directory">hello</filename> originale, che non contiene la modifica che abbiamo appena introdotto. Chiameremo <filename class="directory">hello-estrazione</filename> il nostro repository temporaneo.</para>
  15.386 +
  15.387 +      &interaction.tour.clone-pull;
  15.388 +
  15.389 +      <para id="x_5a">Useremo il comando <command role="hg-cmd">hg pull</command> per propagare i cambiamenti dal repository <filename class="directory">mio-hello</filename> al repository <filename class="directory">hello-estrazione</filename>. Tuttavia, estrarre alla cieca cambiamenti sconosciuti da un repository è una prospettiva che può incutere qualche timore. Mercurial fornisce il comando <command role="hg-cmd">hg incoming</command> proprio allo scopo di elencare quali cambiamenti <emphasis>verrebbero</emphasis> estratti dal repository senza effettivamente procedere con l&rsquo;operazione.</para>
  15.390 +
  15.391 +      &interaction.tour.incoming;
  15.392 +
  15.393 +      <para id="x_5c">Propagare i cambiamenti in un repository è semplicemente questione di eseguire il comando <command role="hg-cmd">hg pull</command>, dicendogli opzionalmente da quale repository compiere l&rsquo;estrazione.</para>
  15.394 +
  15.395 +      &interaction.tour.pull;
  15.396 +
  15.397 +      <para id="x_5d">Come potete vedere se confrontate il risultato di <command role="hg-cmd">hg tip</command> prima e dopo, abbiamo propagato con successo i cambiamenti nel nostro repository. Tuttavia, Mercurial separa l&rsquo;operazione di estrazione dei cambiamenti da quella di aggiornamento della directory di lavoro. Rimane ancora un passo da fare prima di poter vedere i cambiamenti appena estratti comparire nella directory di lavoro.</para>
  15.398 +
  15.399 +      <tip>
  15.400 +	<title>Estrarre cambiamenti specifici</title>
  15.401 +
  15.402 +	<para id="x_5b">&Egrave; possibile che, a causa del ritardo tra l&rsquo;esecuzione di <command role="hg-cmd">hg incoming</command> e <command role="hg-cmd">hg pull</command>, non riusciate vedere tutti i changeset che verranno prelevati dall&rsquo;altro repository. Supponete di voler estrarre cambiamenti da un repository che si trovi in rete da qualche parte. Mentre state osservando il risultato di <command role="hg-cmd">hg incoming</command>, ma prima che riusciate a estrarre quei cambiamenti, qualcuno potrebbe aver inserito qualcosa nel repository remoto. Questo significa che è possibile estrarre più cambiamenti di quelil esaminati tramite <command role="hg-cmd">hg incoming</command>.</para>
  15.403 +
  15.404 +	<para id="x_718">Se volete estrarre solamente quei particolari cambiamenti che sono stati elencati da <command role="hg-cmd">hg incoming</command>, o avete qualche altra ragione per estrarre un sottoinsieme dei cambiamenti, è sufficiente utilizzare l&rsquo;identificatore di changeset del cambiamento che volete estrarre, e.g. <command>hg pull -r7e95bb</command>.</para>
  15.405 +      </tip>
  15.406 +    </sect2>
  15.407 +
  15.408 +    <sect2>
  15.409 +      <title>Aggiornare la directory di lavoro</title>
  15.410 +
  15.411 +      <para id="x_5e">Finora abbiamo glissato sulla relazione tra il repository e la sua directory di lavoro. Il comando <command role="hg-cmd">hg pull</command> che abbiamo eseguito nella <xref linkend="sec:tour:pull"/> ha propagato i cambiamenti nel repository ma, se controlliamo, non c&rsquo;è alcuna traccia di quei cambiamenti nella directory di lavoro. Questo accade perché il comportamento predefinito di <command role="hg-cmd">hg pull</command> prevede di non modificare la directory di lavoro. Per fare questo, dobbiamo invece usare il comando <command role="hg-cmd">hg update</command>.</para>
  15.412 +
  15.413 +      &interaction.tour.update;
  15.414 +
  15.415 +      <para id="x_5f">Potrebbe sembrare un po&rsquo; strano che <command role="hg-cmd">hg pull</command> non aggiorni automaticamente la directory di lavoro, ma c&rsquo;è una buona ragione per questo: <command role="hg-cmd">hg update</command> è in grado di aggiornare la directory di lavoro allo stato in cui era in <emphasis>qualsiasi revisione</emphasis> contenuta nella cronologia del repository. Se la vostra directory di lavoro fosse stata aggiornata a una vecchia revisione&emdash;per cercare l&rsquo;origine di un bug, diciamo&emdash;potreste non essere terribilmente contenti di vedere il comando <command role="hg-cmd">hg pull</command> da voi eseguito aggiornare automaticamente la directory di lavoro a una nuova revisione.</para>
  15.416 +
  15.417 +      <para id="x_60">Dato che la sequenza di estrazione e aggiornamento è così comune, Mercurial vi permette di combinare le due operazioni passando l&rsquo;opzione <option role="hg-opt-pull">-u</option> al comando <command role="hg-cmd">hg pull</command>.</para>
  15.418 +
  15.419 +      <para id="x_61">Se tornate indietro alla <xref linkend="sec:tour:pull"/> e osservate il testo visualizzato dal comando <command role="hg-cmd">hg pull</command> eseguito senza l&rsquo;opzione <option role="hg-opt-pull">-u</option>, potete vedere che contiene un promemoria utile a ricordarci che dobbiamo effettuare un passo esplicito per aggiornare la directory di lavoro.</para>
  15.420 +
  15.421 +      <para id="x_62">Per scoprire a quale revisione è aggiornata la directory di lavoro, usate il comando <command role="hg-cmd">hg parents</command>.</para>
  15.422 +
  15.423 +      &interaction.tour.parents;
  15.424 +
  15.425 +      <para id="x_63">Se tornate indietro a guardare la <xref
  15.426 +	  linkend="fig:tour-basic:history"/>, vedrete che ogni changeset è collegato da frecce. Ogni nodo <emphasis>da</emphasis> cui parte una freccia è un genitore e il nodo corrispondente <emphasis>a</emphasis> cui la freccia arriva è suo figlio. Analogamente, anche la directory di lavoro possiede un genitore, che è il changeset contenuto nella directory in quel momento.</para>
  15.427 +
  15.428 +      <para id="x_64">Per aggiornare la directory di lavoro a una particolare revisione, fornite un numero di revisione o un identificatore di changeset al comando <command role="hg-cmd">hg update</command>.</para>
  15.429 +
  15.430 +      &interaction.tour.older;
  15.431 +
  15.432 +      <para id="x_65">Se omettete una revisione esplicita, <command role="hg-cmd">hg update</command> effettuerà l&rsquo;aggiornamento alla revisione più recente (la revisione di punta), come mostrato nella seconda invocazione di <command role="hg-cmd">hg update</command> nell&rsquo;esempio precedente.</para>
  15.433 +    </sect2>
  15.434 +
  15.435 +    <sect2>
  15.436 +      <title>Pubblicare i cambiamenti in un altro repository</title>
  15.437 +
  15.438 +      <para id="x_66">Mercurial ci permette di trasmettere i nostri cambiamenti dal repository in cui ci troviamo verso un altro repository. Come per l&rsquo;esempio del comando <command role="hg-cmd">hg pull</command> appena illustrato, creeremo un repository temporaneo a cui trasmettere i nostri cambiamenti.</para>
  15.439 +
  15.440 +      &interaction.tour.clone-push;
  15.441 +
  15.442 +      <para id="x_67">Il comando <command role="hg-cmd">hg outgoing</command> ci dice quali cambiamenti verrebbero trasmessi verso un altro repository.</para>
  15.443 +
  15.444 +      &interaction.tour.outgoing;
  15.445 +
  15.446 +      <para id="x_68">E il comando <command role="hg-cmd">hg push</command> esegue l&rsquo;effettiva trasmissione.</para>
  15.447 +
  15.448 +      &interaction.tour.push;
  15.449 +
  15.450 +      <para id="x_69">Allo stesso modo di <command role="hg-cmd">hg pull</command>, il comando <command role="hg-cmd">hg push</command> non aggiorna la directory di lavoro nel repository verso il quale sta trasmettendo i cambiamenti. Diversamente da <command role="hg-cmd">hg pull</command>, <command role="hg-cmd">hg push</command> non fornisce un&rsquo;opzione <literal>-u</literal> che aggiorni la directory di lavoro dell&rsquo;altro repository. Questa asimmetria è voluta: il repository verso il quale stiamo trasmettendo potrebbe essere su un server remoto e condiviso da molte persone. Se dovessimo aggiornare la sua directory di lavoro mentre altre persone ci stanno lavorando, il loro lavoro sarebbe rovinato.</para>
  15.451 +
  15.452 +      <para id="x_6a">Cosa succede se proviamo a estrarre o trasmettere cambiamenti che il repository contiene già? Nulla di particolarmente eccitante.</para>
  15.453 +
  15.454 +      &interaction.tour.push.nothing;
  15.455 +    </sect2>
  15.456 +
  15.457 +    <sect2>
  15.458 +      <title>Ubicazioni predefinite</title>
  15.459 +
  15.460 +      <para id="x_719">Quando cloniamo un repository, Mercurial registra l&rsquo;ubicazione del repository che abbiamo clonato nel file <filename>.hg/hgrc</filename> del nuovo repository. I comandi <command>hg pull</command> e <command>hg push</command> useranno quella ubicazione come impostazione predefinita quando vengono invocati senza fornire esplicitamente un percorso. Anche i comandi <command>hg incoming</command> e <command>hg outgoing</command> si comporteranno allo stesso modo.</para>
  15.461 +
  15.462 +      <para id="x_71a">Se aprite il file <filename>.hg/hgrc</filename> di un repository con un editor di testo, vedrete contenuti simili ai seguenti.</para>
  15.463 +
  15.464 +      <programlisting>[paths]
  15.465 +default = http://www.selenic.com/repo/hg</programlisting>
  15.466 +
  15.467 +      <para id="x_71b">&Egrave; possibile&emdash;e spesso utile&emdash;impostare le ubicazioni per <command>hg push</command> e <command>hg outgoing</command> con valori differenti rispetto a quelle per <command>hg pull</command> e <command>hg incoming</command>, aggiungendo un elemento <literal>default-push</literal> alla sezione <literal>[paths]</literal> del file <filename>.hg/hgrc</filename> nel modo seguente.</para>
  15.468 +
  15.469 +      <programlisting>[paths]
  15.470 +default = http://www.selenic.com/repo/hg
  15.471 +default-push = http://hg.example.com/hg</programlisting>
  15.472 +    </sect2>
  15.473 +
  15.474 +    <sect2>
  15.475 +      <title>Condividere i cambiamenti attraverso la rete</title>
  15.476 +
  15.477 +      <para id="x_6b">I comandi che abbiamo trattato nelle precedenti sezioni non si limitano a lavorare con repository locali. Ogni comando funziona esattamente allo stesso modo attraverso una connessione di rete quando gli viene passato un URL invece di un percorso locale.</para>
  15.478 +	
  15.479 +      &interaction.tour.outgoing.net;
  15.480 +
  15.481 +      <para id="x_6c">In questo esempio, possiamo vedere quali cambiamenti potremmo trasmettere al repository remoto, ma il repository è comprensibilmente impostato per evitare che gli utenti anonimi vi pubblichino le proprie modifiche.</para>
  15.482 +
  15.483 +      &interaction.tour.push.net;
  15.484 +    </sect2>
  15.485 +  </sect1>
  15.486 +
  15.487 +  <sect1>
  15.488 +    <title>Cominciare un nuovo progetto</title>
  15.489 +
  15.490 +    <para id="x_71c">Cominciare un nuovo progetto è tanto facile quanto lavorare su un progetto esistente. Il comando <command>hg init</command> crea un nuovo repository Mercurial vuoto.</para>
  15.491 +
  15.492 +    &interaction.ch01-new.init;
  15.493 +
  15.494 +    <para id="x_71d">Questa invocazione non fa altro che creare un repository chiamato <filename>mioprogetto</filename> nella directory corrente.</para>
  15.495 +
  15.496 +    &interaction.ch01-new.ls;
  15.497 +
  15.498 +    <para id="x_71e">Possiamo dire che <filename>mioprogetto</filename> è un repository Mercurial perché contiene una directory <filename>.hg</filename>.</para>
  15.499 +
  15.500 +    &interaction.ch01-new.ls2;
  15.501 +
  15.502 +    <para id="x_71f">Se vogliamo aggiungere alcuni file preesistenti al repository, possiamo copiarveli e utilizzare il comando <command>hg add</command> per dire a Mercurial di cominciare a monitorarli.</para>
  15.503 +
  15.504 +    &interaction.ch01-new.add;
  15.505 +
  15.506 +    <para id="x_720">Una volta che siamo soddisfatti del corretto aspetto del nostro progetto, possiamo effettuare il commit dei nostri cambiamenti.</para>
  15.507 +
  15.508 +    &interaction.ch01-new.commit;
  15.509 +
  15.510 +    <para id="x_721">Ci vogliono solo pochi minuti per cominciare a usare Mercurial su un nuovo progetto, e questo è parte del suo fascino. Il controllo di revisione è diventato facile da impiegare anche sui progetti più piccoli per i quali non lo avremmo preso in considerazione se avessimo dovuto usare uno strumento più complicato.</para>
  15.511 +  </sect1>
  15.512 +</chapter>
    16.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    16.2 +++ b/it/ch03-tour-merge.xml	Fri Sep 04 16:33:35 2009 +0200
    16.3 @@ -0,0 +1,234 @@
    16.4 +<chapter id="chap:tour-merge">
    16.5 +  <?dbhtml filename="una-panoramica-di-mercurial-le-unioni.html"?>
    16.6 +  <title>Una panoramica di Mercurial: le unioni</title>
    16.7 +
    16.8 +  <para id="x_338">Finora abbiamo parlato di come clonare un repository, effettuare modifiche in un repository ed estrarre o trasmettere cambiamenti da un repository all&rsquo;altro. Il nostro prossimo passo sarà quello di <emphasis>unire</emphasis> le modifiche provenienti da repository separati.</para>
    16.9 +
   16.10 +  <sect1>
   16.11 +    <title>Unire flussi di lavoro</title>
   16.12 +
   16.13 +    <para id="x_339">Le unioni giocano un ruolo fondamentale quando si lavora con uno strumento di controllo di revisione distribuito. Ecco alcuni casi in cui può presentarsi il bisogno di unire tra loro due o più flussi di lavoro.</para>
   16.14 +    <itemizedlist>
   16.15 +      <listitem>
   16.16 +	<para id="x_33a">Alice e Bruno hanno entrambi una copia personale di un repository per un progetto su cui stanno collaborando. Mentre Alice corregge un bug nel suo repository, Bruno aggiunge una nuova funzione nel proprio. Entrambi vogliono che il repository condiviso contenga sia la correzione del bug sia la nuova funzione.</para>
   16.17 +      </listitem>
   16.18 +      <listitem>
   16.19 +	<para id="x_33b">Cinzia lavora frequentemente su più attività differenti alla volta per un singolo progetto, ognuna isolata al sicuro nel proprio repository. Lavorando in questo modo, Cinzia ha spesso bisogno di unire una parte del proprio lavoro con un&rsquo;altra.</para>
   16.20 +      </listitem>
   16.21 +    </itemizedlist>
   16.22 +
   16.23 +    <para id="x_33c">Dato che abbiamo spesso bisogno di eseguire unioni, Mercurial ci viene in aiuto agevolando questo processo. Per capire come funzionano le unioni, seguiamone una passo per passo. Cominceremo creando ancora un altro clone del nostro repository (vedete quante volte spuntano fuori?) apportandovi poi alcune modifiche.</para>
   16.24 +
   16.25 +    &interaction.tour.merge.clone;
   16.26 +
   16.27 +    <para id="x_33d">Ora abbiamo due copie di <filename>hello.c</filename> con contenuti differenti e le cronologie dei due repository divergono l&rsquo;una dall&rsquo;altra, come illustrato nella <xref linkend="fig:tour-merge:sep-repos"/>. Ecco la copia del nostro file presente nel primo repository.</para>
   16.28 +
   16.29 +    &interaction.tour.merge.cat1;
   16.30 +
   16.31 +    <para id="x_722">Ed ecco la versione leggermente differente contenuta nell&rsquo;altro repository.</para>
   16.32 +
   16.33 +    &interaction.tour.merge.cat2;
   16.34 +
   16.35 +    <figure id="fig:tour-merge:sep-repos">
   16.36 +      <title>Le cronologie divergenti dei repository <filename class="directory">mio-hello</filename> e <filename class="directory">mio-nuovo-hello</filename></title>
   16.37 +      <mediaobject>
   16.38 +	<imageobject><imagedata fileref="figs/tour-merge-sep-repos.png"/></imageobject>
   16.39 +	<textobject><phrase>XXX add text</phrase></textobject>
   16.40 +      </mediaobject>
   16.41 +    </figure>
   16.42 +
   16.43 +    <para id="x_33f">Sappiamo già che l&rsquo;estrazione dei cambiamenti dal nostro repository <filename class="directory">mio-hello</filename> non avrà alcun effetto sulla directory di lavoro.</para>
   16.44 +
   16.45 +    &interaction.tour.merge.pull;
   16.46 +
   16.47 +    <para id="x_340">Tuttavia, il comando <command role="hg-cmd">hg pull</command> dice qualcosa a proposito di <quote>teste</quote> (in inglese, heads).</para>
   16.48 +
   16.49 +    <sect2>
   16.50 +      <title>Le teste di un repository</title>
   16.51 +
   16.52 +      <para id="x_341">Come ricorderete, Mercurial memorizza l&rsquo;identità del genitore di ogni changeset. Se un cambiamento possiede un genitore, lo chiamiamo figlio o discendente del genitore. Una testa è un changeset che non ha figli. Quindi, la revisione di punta è una testa, perché la revisione più recente in un repository non possiede alcun figlio. Ci sono occasioni in cui un repository può contenere più di una testa.</para>
   16.53 +
   16.54 +      <figure id="fig:tour-merge:pull">
   16.55 +	<title>I contenuti del repository dopo aver propagato i cambiamenti da <filename class="directory">mio-hello</filename> a <filename class="directory">mio-nuovo-hello</filename></title>
   16.56 +	<mediaobject>
   16.57 +	  <imageobject>
   16.58 +	    <imagedata fileref="figs/tour-merge-pull.png"/>
   16.59 +	  </imageobject>
   16.60 +	  <textobject><phrase>XXX add text</phrase></textobject>
   16.61 +	</mediaobject>
   16.62 +      </figure>
   16.63 +
   16.64 +      <para id="x_343">Dalla <xref linkend="fig:tour-merge:pull"/>, potete vedere l&rsquo;effetto della propagazione dei cambiamenti dal repository  <filename class="directory">mio-hello</filename> al repository <filename class="directory">mio-nuovo-hello</filename>. La cronologia già presente in <filename class="directory">mio-nuovo-hello</filename> non viene toccata, ma al repository è stata aggiunta una nuova revisione. Riferendoci alla <xref linkend="fig:tour-merge:sep-repos"/>, possiamo vedere che nel nuovo repository l&rsquo;<emphasis>identificatore di changeset</emphasis> rimane lo stesso, ma il <emphasis>numero di revisione</emphasis> è cambiato. (Questo, incidentalmente, è un buon esempio del perché sia inopportuno usare i numeri di revisione per discutere i changeset.) Possiamo vedere le teste di un repository utilizzando il comando <command role="hg-cmd">hg heads</command>.</para>
   16.65 +
   16.66 +      &interaction.tour.merge.heads;
   16.67 +    </sect2>
   16.68 +
   16.69 +    <sect2>
   16.70 +      <title>Effettuare l&rsquo;unione</title>
   16.71 +
   16.72 +      <para id="x_344">Cosa succede se proviamo a usare normalmente il comando <command role="hg-cmd">hg update</command> per aggiornare la directory di lavoro alla nuova punta?</para>
   16.73 +
   16.74 +      &interaction.tour.merge.update;
   16.75 +
   16.76 +      <para id="x_345">Mercurial ci sta dicendo che <command role="hg-cmd">hg update</command> non è in grado di effettuare un&rsquo;unione. Il comando non aggiornerà la directory di lavoro se pensa che potremmo voler eseguire un&rsquo;unione, a meno che non gli chiediamo esplicitamente di farlo. (Incidentalmente, forzare l&rsquo;aggiornamento tramite <command>hg update -C</command> provocherebbe la perdita di tutte le modifiche contenute nella directory di lavoro e non ancora inserite nel repository.)</para>
   16.77 +
   16.78 +      <para id="x_723">Per avviare un&rsquo;unione tra le due teste, usiamo il comando <command role="hg-cmd">hg merge</command>.</para>
   16.79 +
   16.80 +      &interaction.tour.merge.merge;
   16.81 +
   16.82 +      <para id="x_347">Il contenuto del file <filename>hello.c</filename> viene sistemato. L&rsquo;operazione aggiorna la directory di lavoro in modo che contenga le modifiche provenienti da <emphasis>entrambe</emphasis> le teste, cosa che si riflette sia nell&rsquo;elenco visualizzato dal comando <command role="hg-cmd">hg parents</command> sia nei contenuti del file <filename>hello.c</filename>.</para>
   16.83 +
   16.84 +      &interaction.tour.merge.parents;
   16.85 +    </sect2>
   16.86 +
   16.87 +    <sect2>
   16.88 +      <title>Inserire i risultati dell&rsquo;unione nel repository</title>
   16.89 +
   16.90 +      <para id="x_348">Ogni volta che eseguiamo un&rsquo;unione, il comando <command role="hg-cmd">hg parents</command> mostrerà due genitori fino a quando non invocheremo <command role="hg-cmd">hg commit</command> per inserire i risultati dell&rsquo;unione nel repository.</para>
   16.91 +
   16.92 +      &interaction.tour.merge.commit;
   16.93 +
   16.94 +      <para id="x_349">Ora abbiamo una nuova revisione di punta che, come potete notare, possiede <emphasis>entrambe</emphasis> le nostre vecchie teste come genitori. Queste sono le stesse revisioni che erano state precedentemente mostrate da <command role="hg-cmd">hg parents</command>.</para>
   16.95 +
   16.96 +      &interaction.tour.merge.tip;
   16.97 +
   16.98 +      <para id="x_34a">Nella <xref linkend="fig:tour-merge:merge"/>, potete vedere una rappresentazione di quanto accade alla directory di lavoro durante l&rsquo;unione e di come questo abbia effetto sul repository quando avviene l&rsquo;inserimento. Durante l&rsquo;unione, la directory di lavoro possiede due changeset genitori che poi diventano i genitori del nuovo changeset.</para>
   16.99 +
  16.100 +      <figure id="fig:tour-merge:merge">
  16.101 +	<title>Lo stato della directory di lavoro e del repository durante l&rsquo;unione e dopo l&rsquo;inserimento</title>
  16.102 +	<mediaobject>
  16.103 +	  <imageobject>
  16.104 +	    <imagedata fileref="figs/tour-merge-merge.png"/>
  16.105 +	  </imageobject>
  16.106 +	  <textobject><phrase>XXX add text</phrase></textobject>
  16.107 +	</mediaobject>
  16.108 +      </figure>
  16.109 +
  16.110 +      <para id="x_69c">Talvolta si dice che un&rsquo;unione è composta da due <emphasis>parti</emphasis>: la parte sinistra è costituita dal primo genitore elencato da <command role="hg-cmd">hg parents</command> e la parte destra dal secondo. Se per esempio la directory di lavoro si fosse trovata alla revisione 5 prima che cominciassimo l&rsquo;unione, quella revisione sarebbe diventata la parte sinistra dell&rsquo;unione.</para>
  16.111 +    </sect2>
  16.112 +  </sect1>
  16.113 +
  16.114 +  <sect1>
  16.115 +    <title>Risolvere i conflitti tra cambiamenti</title>
  16.116 +
  16.117 +    <para id="x_34b">La maggior parte delle unioni è semplice, ma a volte vi troverete a unire cambiamenti in cui ognuna delle due parti modifica le stesse porzioni degli stessi file. A meno che entrambe le modifiche siano identiche, questa situazione risulterà in un <emphasis>conflitto</emphasis> che dovrete cercare di riconciliare decidendo come combinare i diversi cambiamenti in un risultato coerente.</para>
  16.118 +
  16.119 +    <figure id="fig:tour-merge:conflict">
  16.120 +      <title>Modifiche in conflitto a un documento</title>
  16.121 +      <mediaobject>
  16.122 +	<imageobject><imagedata fileref="figs/tour-merge-conflict.png"/></imageobject>
  16.123 +	<textobject><phrase>XXX add text</phrase></textobject>
  16.124 +      </mediaobject>
  16.125 +    </figure>
  16.126 +
  16.127 +    <para id="x_34d">La <xref linkend="fig:tour-merge:conflict"/> illustra un esempio di due diversi cambiamenti a uno stesso documento che sono in conflitto tra loro. Siamo partiti da una singola versione del file, a cui poi abbiamo apportato alcune modifiche mentre qualcun altro faceva modifiche differenti allo stesso testo. Nella risoluzione del conflitto tra i cambiamenti, il nostro compito è quello di decidere che cosa dovrebbe contenere il file.</para>
  16.128 +
  16.129 +    <para id="x_34e">Mercurial non è dotato di alcuna funzione predefinita per gestire i conflitti. Invece, richiama un programma esterno, di solito uno che mostra un qualche tipo di interfaccia grafica per la risoluzione dei conflitti, trovato tra i tanti strumenti di unione differenti che è probabile siano installati sul vostro sistema. Come prima cosa, Mercurial prova a cercare alcuni strumenti di unione completamente automatici; poi, se non riesce a trovarli (perché il processo di risoluzione richiede una guida umana) o se non sono presenti, prova a richiamare diversi strumenti grafici di unione.</para>
  16.130 +
  16.131 +    <para id="x_34f">&Egrave; anche possibile far eseguire a Mercurial uno specifico programma, impostando il valore della variable d&rsquo;ambiente <envar>HGMERGE</envar> al nome del vostro programma preferito.</para>
  16.132 +
  16.133 +    <sect2>
  16.134 +      <title>Usare uno strumento grafico di unione</title>
  16.135 +
  16.136 +      <para id="x_350">Il mio strumento grafico preferito per gestire le unioni è <command>kdiff3</command>, che userò per descrivere le caratteristiche comuni a queste applicazioni. Potete vedere <command>kdiff3</command> in azione nella <xref linkend="fig:tour-merge:kdiff3"/>. Il tipo di unione che sta eseguendo si chiama <emphasis>unione a tre vie</emphasis>, perché ci sono tre differenti versioni di un file che ci interessano. La porzione superiore della finestra è divisa in tre pannelli:</para>
  16.137 +      <itemizedlist>
  16.138 +	<listitem><para id="x_351">a sinistra troviamo la versione <emphasis>base</emphasis> del file, cioè la versione più recente da cui discendono le due versioni che stiamo cercando di unire;</para>
  16.139 +	</listitem>
  16.140 +	<listitem><para id="x_352">nel mezzo troviamo la <quote>nostra</quote> versione del file, con i contenuti che abbiamo modificato;</para>
  16.141 +	</listitem>
  16.142 +	<listitem><para id="x_353">a destra troviamo la <quote>loro</quote> versione del file, quella che proviene dal changeset che stiamo cercando di incorporare.</para>
  16.143 +	</listitem></itemizedlist>
  16.144 +      <para id="x_354">Il pannello sottostante contiene il <emphasis>risultato</emphasis> corrente dell&rsquo;unione. Il nostro compito è quello di sostituire tutto il testo in rosso, che indica conflitti irrisolti, con una qualche combinazione ragionevole della <quote>nostra</quote> e della <quote>loro</quote> versione del file.</para>
  16.145 +
  16.146 +      <para id="x_355">Tutti e quattro questi pannelli sono <emphasis>collegati tra loro</emphasis>: se ci spostiamo in verticale o in orizzontale in un pannello qualsiasi, gli altri vengono aggiornati per mostrare le sezioni corrispondenti dei rispettivi file.</para>
  16.147 +
  16.148 +      <figure id="fig:tour-merge:kdiff3">
  16.149 +	<title>Usare <command>kdiff3</command> per unire diverse versioni di un file</title>
  16.150 +	<mediaobject>
  16.151 +	  <imageobject>
  16.152 +	    <imagedata width="100%" fileref="figs/kdiff3.png"/></imageobject>
  16.153 +	  <textobject>
  16.154 +	    <phrase>XXX add text</phrase>
  16.155 +	  </textobject>
  16.156 +	</mediaobject>
  16.157 +      </figure>
  16.158 +
  16.159 +      <para id="x_357">Per ogni porzione conflittuale del file, possiamo scegliere di risolvere il conflitto usando una qualche combinazione di testo dalla versione base, dalla nostra, o dalla loro. Possiamo anche modificare manualmente il file risultante in ogni momento, nel caso avessimo bisogno di effettuare ulteriori cambiamenti.</para>
  16.160 +
  16.161 +      <para id="x_358">Esistono <emphasis>molti</emphasis> strumenti per gestire l&rsquo;unione di file, davvero troppi per elencarli qui. Si differenziano a seconda della piattaforma per cui sono disponibili e delle loro particolari forze e debolezze. La maggior parte è calibrata per unire file contenenti testo semplice, mentre alcuni sono orientati a particolari formati di file (generalmente XML).</para>
  16.162 +    </sect2>
  16.163 +
  16.164 +    <sect2>
  16.165 +      <title>Un esempio risolto</title>
  16.166 +
  16.167 +      <para id="x_359">In questo esempio, riprodurremo la cronologia delle modifiche ai file della <xref linkend="fig:tour-merge:conflict"/> vista in precedenza. Per cominciare, creiamo un repository con una versione base del nostro documento.</para>
  16.168 +
  16.169 +      &interaction.tour-merge-conflict.wife;
  16.170 +
  16.171 +      <para id="x_35a">Cloniamo il repository e apportiamo un cambiamento al file.</para>
  16.172 +
  16.173 +      &interaction.tour-merge-conflict.cousin;
  16.174 +
  16.175 +      <para id="x_35b">E ora aggiungiamo un altro clone, per simulare qualcun altro che effettui un cambiamento al file. (Questo suggerisce l&rsquo;idea che non è affatto inusuale ritrovarsi a unire tra loro i propri repository contenenti attività isolate, risolvendo i conflitti incontrati nel corso di questo processo.)</para>
  16.176 +
  16.177 +      &interaction.tour-merge-conflict.son;
  16.178 +
  16.179 +      <para id="x_35c">Avendo creato due versioni differenti del file, predisponiamo un ambiente adeguato a eseguire la nostra unione.</para>
  16.180 +
  16.181 +      &interaction.tour-merge-conflict.pull;
  16.182 +
  16.183 +      <para id="x_35d">In questo esempio, imposterò la variabile d&rsquo;ambiente <envar>HGMERGE</envar> per dire a Mercurial di usare il comando non interattivo <command>merge</command>. Questo comando è incluso in molti sistemi di tipo Unix. (Se state seguendo questo esempio sul vostro computer, non preoccupatevi di impostare <envar>HGMERGE</envar>. Vi verrà presentata un&rsquo;applicazione grafica da utilizzare per unire i file, che è un&rsquo;alternativa di gran lunga preferibile.)</para>
  16.184 +
  16.185 +      &interaction.tour-merge-conflict.merge;
  16.186 +
  16.187 +      <para id="x_35f">Dato che <command>merge</command> non riesce a risolvere il conflitto tra i cambiamenti, inserisce alcuni <emphasis>marcatori di unione</emphasis> all&rsquo;interno del file che esibisce i conflitti, per indicare quali righe sono in conflitto e se quelle righe provengono dalla nostra versione del file o dalla loro.</para>
  16.188 +
  16.189 +      <para id="x_360">Dal modo in cui <command>merge</command> termina, Mercurial riconosce che non è stato in grado di operare con successo, quindi ci dice quali comandi abbiamo bisogno di eseguire se vogliamo rifare l&rsquo;operazione di unione. Questo potrebbe essere utile se, per esempio, stessimo lavorando con un&rsquo;applicazione grafica per la gestione delle unioni e la chiudessimo perché siamo confusi o realizziamo di aver commesso un errore.</para>
  16.190 +
  16.191 +      <para id="x_361">Nel caso in cui l&rsquo;unione automatica o manuale fallisca, nulla ci impedisce di <quote>correggere</quote> i file interessati per conto nostro, per poi inserire i risultati della nostra unione nel repository:</para>
  16.192 +      
  16.193 +      &interaction.tour-merge-conflict.commit;
  16.194 +
  16.195 +      <note>
  16.196 +	<title>Dov&rsquo;è il comando <command>hg resolve</command>?</title>
  16.197 +
  16.198 +	<para id="x_724">Il comando <command>hg resolve</command> è stato introdotto nella verisone 1.1 di Mercurial rilasciata nel dicembre 2008. Se state usando una versione più vecchia (eseguite <command>hg version</command> per controllare) questo comando non sarà presente. Nel caso la vostra versione di Mercurial sia precedente alla 1.1, vi consiglio vivamente di installare una versione più recente prima di affrontare unioni complicate.</para>
  16.199 +      </note>
  16.200 +    </sect2>
  16.201 +  </sect1>
  16.202 +
  16.203 +  <sect1 id="sec:tour-merge:fetch">
  16.204 +    <title>Semplificare la sequenza di estrazione-unione-inserimento</title>
  16.205 +
  16.206 +    <para id="x_362">Il processo di unione dei cambiamenti appena delineato è molto semplice, ma richiede di eseguire tre comandi in sequenza.</para>
  16.207 +    <programlisting>hg pull -u
  16.208 +hg merge
  16.209 +hg commit -m 'Incorporati i cambiamenti remoti'</programlisting>
  16.210 +    <para id="x_363">Nel caso dell&rsquo;inserimento finale, avete anche bisogno di includere un messaggio di commit, che sarà quasi sempre composto da testo <quote>standard</quote> non particolarmente interessante.</para>
  16.211 +
  16.212 +    <para id="x_364">Se fosse possibile, sarebbe comodo ridurre il numero di passi necessari. In effetti, Mercurial viene distribuito con un&rsquo;estensione chiamata <literal role="hg-ext">fetch</literal> pensata proprio per questo scopo.</para>
  16.213 +
  16.214 +    <para id="x_365">Mercurial fornisce un meccanismo flessibile per consentire ad altre persone di estendere le sue funzionalità, preservando le dimensioni ridotte e la manutenibilità del proprio nucleo. Alcune estensioni aggiungono nuovi comandi che potete usare dalla riga di comando, mentre altre lavorano <quote>dietro le quinte</quote>, per esempio accrescendo la funzionalità della modalità server predefinita di Mercurial.</para>
  16.215 +
  16.216 +    <para id="x_366">L&rsquo;estensione <literal role="hg-ext">fetch</literal> aggiunge un nuovo comando chiamato, naturalmente, <command role="hg-cmd">hg fetch</command>. Questa estensione agisce come una combinazione di <command role="hg-cmd">hg pull -u</command>, <command role="hg-cmd">hg merge</command> e <command role="hg-cmd">hg commit</command>. Comincia propagando verso il repository corrente i cambiamenti estratti da un altro repository. Se si accorge che i cambiamenti hanno aggiunto una nuova testa al repository, aggiorna la directory di lavoro alla nuova testa, poi avvia il processo di unione e infine, se l&rsquo;unione ha successo, ne inserisce il risultato nel repository con un messaggio di commit generato automaticamente. Se non sono state aggiunte nuove teste, il comando si limita ad aggiornare la directory di lavoro alla nuova revisione di punta.</para>
  16.217 +
  16.218 +    <para id="x_367">Abilitare l&rsquo;estensione <literal role="hg-ext">fetch</literal> è facile. Aprite il file <filename role="special">.hgrc</filename> che si trova nella vostra directory personale e andate alla sezione <literal role="rc-extensions">extensions</literal> (oppure createla se non esiste già). Poi aggiungete una riga che contenga semplicemente <quote><literal>fetch=</literal></quote>.</para>
  16.219 +
  16.220 +    <programlisting>[extensions]
  16.221 +fetch =</programlisting>
  16.222 +
  16.223 +    <para id="x_368">(Normalmente, la parte a destra del simbolo <quote><literal>=</literal></quote> indicherebbe dove trovare l&rsquo;estensione, ma dato che l&rsquo;estensione <literal role="hg-ext">fetch</literal> è compresa nella distribuzione standard, Mercurial sa già dove andarla a cercare.)</para>
  16.224 +  </sect1>
  16.225 +
  16.226 +  <sect1>
  16.227 +    <title>Rinominare, copiare e unire</title>
  16.228 +
  16.229 +    <para id="x_729">Durante la vita di un progetto, vorremo spesso cambiare la disposizione dei suoi file e delle sue directory. Queste modifiche possono essere tanto semplici quanto rinominare un singolo file, o tanto complesse quanto ristrutturare l&rsquo;intera gerarchia dei file nell&rsquo;ambito del progetto.</para>
  16.230 +
  16.231 +    <para id="x_72a">Mercurial supporta questi tipi di cambiamenti in maniera fluida, a patto che gli diciamo quello che stiamo facendo. Se vogliamo rinominare un file, dovremmo usare il comando <command>hg rename</command><footnote>
  16.232 +	<para id="x_72b">Se siete utenti Unix, sarete felici di sapere che il comando <command>hg rename</command> si può abbreviare in <command>hg mv</command>.</para>
  16.233 +    </footnote> per cambiare il nome del file, in modo che Mercurial possa comportarsi in maniera appropriata nel caso più tardi effettuassimo un&rsquo;unione.</para>
  16.234 +
  16.235 +    <para id="x_72c">Tratteremo l&rsquo;uso di questi comandi in maniera più estesa nella <xref linkend="chap:daily.copy"/>.</para>
  16.236 +  </sect1>
  16.237 +</chapter>
    17.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    17.2 +++ b/it/ch04-concepts.xml	Fri Sep 04 16:33:35 2009 +0200
    17.3 @@ -0,0 +1,346 @@
    17.4 +<chapter id="chap:concepts">
    17.5 +  <?dbhtml filename="dietro-le-quinte.html"?>
    17.6 +  <title>Dietro le quinte</title>
    17.7 +
    17.8 +  <para id="x_2e8">Diversamente da molti sistemi di controllo di revisione, Mercurial è costruito sulla base di concetti abbastanza semplici da facilitare la comprensione del modo in cui il software funziona realmente. Conoscere questi dettagli non è certamente necessario, per cui potete tranquillamente saltare questo capitolo. Tuttavia, penso che otterrete di più dal software conoscendo il <quote>modello concettuale</quote> del suo funzionamento.</para>
    17.9 +
   17.10 +  <para id="x_2e9">Essere in grado di capire quello che accade dietro le quinte mi dà una certa garanzia che Mercurial sia stato attentamente progettato per essere sia <emphasis>sicuro</emphasis> che <emphasis>efficiente</emphasis>. Analogamente, è importante che per me sia facile avere un&rsquo;idea corretta di quello che il software sta facendo mentre svolgo un&rsquo;attività di controllo di revisione, in modo da abbassare la probabilità di venire sorpreso dal suo comportamento.</para>
   17.11 +
   17.12 +  <para id="x_2ea">Inizieremo questo capitolo parlando dei concetti chiave alla base della progettazione di Mercurial, poi proseguiremo discutendo alcuni dei dettagli più interessanti della sua implementazione.</para>
   17.13 +
   17.14 +  <sect1>
   17.15 +    <title>La registrazione della cronologia di Mercurial</title>
   17.16 +
   17.17 +    <sect2>
   17.18 +      <title>Memorizzare la cronologia di un singolo file</title>
   17.19 +
   17.20 +      <para id="x_2eb">Quando Mercurial tiene traccia delle modifiche a un file, memorizza la cronologia di quel file in un oggetto di metadati chiamato <emphasis>filelog</emphasis> (letteralmente, registro del file). Ogni voce in un filelog contiene informazioni sufficienti a ricostruire una revisione del file di cui tiene traccia. I filelog sono memorizzati come file nella directory <filename role="special" class="directory">.hg/store/data</filename>. Un filelog contiene due tipi di informazione: dati di revisione, più un indice per aiutare Mercurial a trovare una revisione in maniera efficiente.</para>
   17.21 +
   17.22 +      <para id="x_2ec">Il filelog di un file di grandi dimensioni o che abbia una lunga cronologia viene memorizzato in due file separati per i dati (con un suffisso <quote><literal>.d</literal></quote>) e l&rsquo;indice (con un suffisso <quote><literal>.i</literal></quote>). Per file di piccole dimensioni con una cronologia ridotta, i dati di revisione e l&rsquo;indice vengono combinati in un singolo file <quote><literal>.i</literal></quote>. La corrispondenza tra un file nella directory di lavoro e il filelog che tiene traccia della sua cronologia nel repository è illustrata nella <xref
   17.23 +	  linkend="fig:concepts:filelog"/>.</para>
   17.24 +
   17.25 +      <figure id="fig:concepts:filelog">
   17.26 +	<title>Relazioni tra i file nella directory di lavoro e i filelog nel repository</title>
   17.27 +	<mediaobject>
   17.28 +	  <imageobject><imagedata fileref="figs/filelog.png"/></imageobject>
   17.29 +	  <textobject><phrase>XXX add text</phrase></textobject>
   17.30 +	</mediaobject>
   17.31 +      </figure>
   17.32 +
   17.33 +    </sect2>
   17.34 +    <sect2>
   17.35 +      <title>Gestire i file monitorati</title>
   17.36 +
   17.37 +      <para id="x_2ee">Mercurial usa una struttura chiamata <emphasis>manifest</emphasis> (in italiano, manifesto) per collezionare informazioni sui file di cui tiene traccia. Ogni voce nel manifest contiene informazioni sui file presenti in un singolo changeset e registra quali file sono contenuti nel changeset, la revisione di ogni file e alcuni altri metadati sui file.</para>
   17.38 +
   17.39 +    </sect2>
   17.40 +    <sect2>
   17.41 +      <title>Registrare le informazioni di changeset</title>
   17.42 +
   17.43 +      <para id="x_2ef">Il <emphasis>changelog</emphasis> (letteralmente, registro dei cambiamenti) contiene informazioni su tutti i changeset. Ogni revisione memorizza chi ha inserito un cambiamento, il commento del changeset, altre informazioni relative al changeset e la revisione del manifest da usare.</para>
   17.44 +
   17.45 +    </sect2>
   17.46 +    <sect2>
   17.47 +      <title>Relazioni tra le revisioni</title>
   17.48 +
   17.49 +      <para id="x_2f0">Nell&rsquo;ambito di un changelog, di un manifest, o di un filelog, ogni revisione mantiene un puntatore al suo genitore diretto (o ai suoi due genitori, se è una revisione di unione). Come ho già detto, esistono anche relazioni tra revisioni <emphasis>attraverso</emphasis> queste strutture, e tali relazioni sono di natura gerarchica.</para>
   17.50 +
   17.51 +      <para id="x_2f1">Per ogni changeset nel repository, esiste esattamente una revisione memorizzata nel changelog. Ogni revisione del changelog contiene un puntatore a una singola revisione del manifest. Una revisione del manifest include un puntatore a una singola revisione di ogni filelog registrato quando il changeset è stato creato. Queste relazioni sono illustrate nella <xref linkend="fig:concepts:metadata"/>.</para>
   17.52 +
   17.53 +      <figure id="fig:concepts:metadata">
   17.54 +	<title>Relazioni tra i metadati</title>
   17.55 +	<mediaobject>
   17.56 +	  <imageobject><imagedata fileref="figs/metadata.png"/></imageobject>
   17.57 +	  <textobject><phrase>XXX add text</phrase></textobject>
   17.58 +	</mediaobject>
   17.59 +      </figure>
   17.60 +
   17.61 +      <para id="x_2f3">Come mostrato in figura, <emphasis>non</emphasis> c&rsquo;è una relazione <quote>uno a uno</quote> tra le revisioni nel changelog, nel manifest, o nel filelog. Se un file registrato da Mercurial non è cambiato tra due changeset, la voce per quel file nelle due revisioni del manifest punterà alla stessa revisione nel suo filelog<footnote>
   17.62 +	  <para id="x_725">&Egrave; possibile (anche se inusuale) che il manifest rimanga lo stesso tra due changeset, nel qual caso le voci del changelog per quei changeset punteranno alla stessa revisione del manifest.</para>
   17.63 +	</footnote>.</para>
   17.64 +
   17.65 +    </sect2>
   17.66 +  </sect1>
   17.67 +  <sect1>
   17.68 +    <title>Memorizzazione sicura ed efficiente</title>
   17.69 +
   17.70 +    <para id="x_2f4">Il supporto su cui si basano i changelog, i manifest e i filelog viene fornito da una singola struttura chiamata <emphasis>revlog</emphasis> (letteralmente, registro di revisione).</para>
   17.71 +
   17.72 +    <sect2>
   17.73 +      <title>Memorizzazione efficiente</title>
   17.74 +
   17.75 +      <para id="x_2f5">Il revlog permette di memorizzare le revisioni in maniera efficiente usando un meccanismo basato su differenze chiamate <emphasis>delta</emphasis>. Invece di registrare una copia completa di un file per ogni revisione, il revlog memorizza i cambiamenti necessari a trasformare una revisione più vecchia nella nuova revisione. Per molti tipi di file, queste delta sono tipicamente una frazione percentuale della dimensione di un&rsquo;intera copia di un file.</para>
   17.76 +
   17.77 +      <para id="x_2f6">Alcuni sistemi di controllo di revisione obsoleti possono lavorare solo con le delta di file di testo e sono costretti a memorizzare i file binari come copie complete o a codificarli in una rappresentazione testuale, entrambi approcci dispendiosi. Mercurial è in grado di gestire in maniera efficiente le delta di file con contenuti binari arbitrari, per cui non ha bisogno di trattare il testo in maniera speciale.</para>
   17.78 +
   17.79 +    </sect2>
   17.80 +    <sect2 id="sec:concepts:txn">
   17.81 +      <title>Operazioni sicure</title>
   17.82 +
   17.83 +      <para id="x_2f7">Mercurial si limita ad <emphasis>aggiungere</emphasis> dati alla fine di un file di revlog invece di modificarne una sezione dopo averlo memorizzato. Questo approccio è più robusto ed efficiente rispetto a sistemi che hanno bisogno di modificare o riscrivere i dati.</para>
   17.84 +
   17.85 +      <para id="x_2f8">In più, Mercurial tratta ogni scrittura come parte di una <emphasis>transazione</emphasis> che può coinvolgere un qualsiasi numero di file. Una transazione è <emphasis>atomica</emphasis>: o l&rsquo;intera transazione ha successo e i suoi effetti sono visibili in lettura in un unico passo, oppure l&rsquo;operazione viene completamente annullata. Questa garanzia di atomicità significa che se state eseguendo due copie di Mercurial, una che sta leggendo dati e l&rsquo;altra che sta scrivendo, la copia che agisce in lettura non vedrà mai un risultato parzialmente scritto che potrebbe confonderla.</para>
   17.86 +
   17.87 +      <para id="x_2f9">Il fatto che Mercurial operi solo aggiungendo dati alla fine dei file rende più facile fornire questa garanzia transazionale. Più è facile fare cose come queste, più dovreste avere fiducia nel fatto che vengano eseguite correttamente.</para>
   17.88 +
   17.89 +    </sect2>
   17.90 +    <sect2>
   17.91 +      <title>Reperimento veloce</title>
   17.92 +
   17.93 +      <para id="x_2fa">Mercurial evita astutamente un&rsquo;insidia comune a tutti i primi sistemi di controllo di revisione: il problema del <emphasis>reperimento inefficiente</emphasis>. La maggior parte dei sistemi di controllo di revisione memorizza i contenuti di una revisione come una serie incrementale di modifiche rispetto a una <quote>fotografia</quote>. (Alcuni basano la fotografia sulla revisione più vecchia, altri su quella più recente.) Per ricostruire una revisione specifica, dovete leggere prima la fotografia e poi ognuna delle revisioni tra la fotografia e la revisione che volete. Più cronologia accumula un file, più revisioni dovete leggere, quindi più tempo viene impiegato per ricostruire una particolare revisione.</para>
   17.94 +
   17.95 +      <figure id="fig:concepts:snapshot">
   17.96 +	<title>Fotografia di un revlog, con delta incrementali</title>
   17.97 +	<mediaobject>
   17.98 +	  <imageobject><imagedata fileref="figs/snapshot.png"/></imageobject>
   17.99 +	  <textobject><phrase>XXX add text</phrase></textobject>
  17.100 +	</mediaobject>
  17.101 +      </figure>
  17.102 +
  17.103 +      <para id="x_2fc">Il modo innovativo in cui Mercurial risolve questo problema è semplice ma efficace. Una volta che la quantità totale di informazioni di delta memorizzate dall&rsquo;ultima fotografia supera una soglia fissata, Mercurial memorizza una nuova fotografia (compressa, naturalmente) invece di un&rsquo;altra delta. Questo approccio consente di ricostruire velocemente <emphasis>qualsiasi</emphasis> revisione di un file e funziona così bene che in seguito è stato copiato da molti altri sistemi di controllo di revisione.</para>
  17.104 +
  17.105 +      <para id="x_2fd">La <xref linkend="fig:concepts:snapshot"/> illustra l&rsquo;idea. In una voce contenuta nel file indice di un revlog, Mercurial memorizza l&rsquo;intervallo di voci che deve leggere dal file di dati per ricostruire una particolare revisione.</para>
  17.106 +
  17.107 +      <sect3>
  17.108 +	<title>Digressione: l&rsquo;influenza della compressione video</title>
  17.109 +
  17.110 +	<para id="x_2fe">Se avete familiarità con la compressione video o avete mai esaminato un segnale televisivo trasmesso attraverso un cavo digitale o un servizio satellitare, potreste sapere che la maggior parte degli schemi per la compressione video memorizzano ogni frame del video come una delta rispetto al frame precedente.</para>
  17.111 +
  17.112 +	<para id="x_2ff">Mercurial prende in prestito questa idea per fare in modo che sia possibile ricostruire una revisione da una fotografia e da un ridotto numero di delta.</para>
  17.113 +
  17.114 +      </sect3>
  17.115 +    </sect2>
  17.116 +    <sect2>
  17.117 +      <title>Identificazione e integrità forte</title>
  17.118 +
  17.119 +      <para id="x_300">Insieme alle informazioni di delta e di fotografia, una voce di revlog contiene un hash crittografico dei dati che rappresenta. Questo rende difficile contraffare i contenuti di una revisione e facilita la scoperta di corruzioni accidentali dei dati.</para>
  17.120 +
  17.121 +      <para id="x_301">Gli hash forniscono più di un semplice controllo contro la corruzione dei dati, infatti vengono usati come identificatori per le revisioni. Gli hash di identificazione dei changeset che avete visto come utenti finali provengono dalle revisioni del changelog. Sebbene anche i filelog e il manifest facciano uso di hash, in questo caso Mercurial li impiega solo dietro le quinte.</para>
  17.122 +
  17.123 +      <para id="x_302">Mercurial verifica che gli hash siano corretti nel momento in cui reperisce le revisioni dei file o estrae i cambiamenti da un altro repository. Se incontra un problema di integrità, lo segnalerà e bloccherà l&rsquo;operazione che stava eseguendo.</para>
  17.124 +
  17.125 +      <para id="x_303">In aggiunta all&rsquo;effetto che ha sull&rsquo;efficienza del reperimento, l&rsquo;uso di fotografie periodiche da parte di Mercurial rende i repository più robusti nei confronti della corruzione parziale dei dati. Se un revlog viene parzialmente rovinato da un errore hardware o da un bug di sistema, spesso rimane possibile ricostruire alcune o la maggior parte delle revisioni a partire dalle sezioni illese del revlog che si trovano prima e dopo la sezione rovinata. Questo non sarebbe possibile con un modello di memorizzazione basato unicamente sulle delta.</para>
  17.126 +    </sect2>
  17.127 +  </sect1>
  17.128 +
  17.129 +  <sect1>
  17.130 +    <title>Cronologia delle revisioni, ramificazioni e unioni</title>
  17.131 +
  17.132 +    <para id="x_304">Ogni voce in un revlog di Mercurial conosce l&rsquo;identità della propria revisione progenitrice diretta, di solito chiamata <emphasis>genitore</emphasis>. In effetti, una revisione contiene spazio non solo per un genitore, ma per due. Mercurial usa un hash speciale, chiamato <quote>identificatore nullo</quote>, per rappresentare l&rsquo;idea che <quote>non c&rsquo;è alcun genitore qui</quote>. Questo hash è semplicemente una stringa di zeri.</para>
  17.133 +
  17.134 +    <para id="x_305">Nella <xref linkend="fig:concepts:revlog"/>, potete vedere un esempio della struttura concettuale di un revlog. I filelog, i manifest e i changelog hanno tutti questa identica struttura e differiscono solo per il tipo di dati memorizzati in ogni delta e fotografia.</para>
  17.135 +
  17.136 +    <para id="x_306">La prima revisione in un revlog (nella parte inferiore dell&rsquo;immagine) presenta un identificatore nullo in entrambi gli spazi riservati ai genitori. Per una revisione <quote>normale</quote>, lo spazio del primo genitore contiene l&rsquo;identificatore della revisione genitore e lo spazio del secondo contiene l&rsquo;identificatore nullo, indicando che la revisione possiede un solo vero genitore. Due revisioni qualsiasi che possiedano lo stesso genitore si chiamano <emphasis>rami</emphasis>. Una revisione che rappresenta un&rsquo;unione tra rami ha due identificatori di revisione normali negli spazi dedicati ai propri genitori.</para>
  17.137 +
  17.138 +    <figure id="fig:concepts:revlog">
  17.139 +      <title>La struttura concettuale di un revlog</title>
  17.140 +      <mediaobject>
  17.141 +	<imageobject><imagedata fileref="figs/revlog.png"/></imageobject>
  17.142 +	<textobject><phrase>XXX add text</phrase></textobject>
  17.143 +      </mediaobject>
  17.144 +    </figure>
  17.145 +
  17.146 +  </sect1>
  17.147 +  <sect1>
  17.148 +    <title>La directory di lavoro</title>
  17.149 +
  17.150 +    <para id="x_307">Nella directory di lavoro, Mercurial mantiene una fotografia dei file contenuti nel repository scattata su un changeset particolare.</para>
  17.151 +
  17.152 +    <para id="x_308">La directory di lavoro <quote>sa</quote> quale changeset contiene. Quando aggiornate la directory di lavoro per contenere un particolare changeset, Mercurial cerca la revisione appropriata del manifest per trovare quali file aveva registrato nel momento in cui quel changeset è stato inserito e qual era la revisione corrente di ogni file in quel momento. Poi, ricrea una copia di tutti quei file con gli stessi contenuti che avevano quando il changeset è stato inserito.</para>
  17.153 +
  17.154 +    <para id="x_309">Il <emphasis>dirstate</emphasis> (letteralmente, stato della directory) è una struttura speciale che contiene le informazioni possedute da Mercurial sulla directory di lavoro. Viene mantenuto sotto forma di un file chiamato <filename>.hg/dirstate</filename> all&rsquo;interno di un repository. Il dirstate contiene i dettagli del changeset a cui la directory di lavoro è aggiornata e di tutti i file che Mercurial sta monitorando nella directory di lavoro. Il dirstate permette a Mercurial anche di notare velocemente i file modificati, registrando le loro date e dimensioni al momento dell&rsquo;aggiornamento.</para>
  17.155 +
  17.156 +    <para id="x_30a">Il dirstate riserva spazio per due genitori, esattamente come una revisione di un revlog, in modo da poter rappresentare sia una normale revisione (con un genitore) che un&rsquo;unione di due revisioni precedenti. Quando usate il comando <command role="hg-cmd">hg update</command>, il changeset a cui aggiornate la directory di lavoro viene memorizzato nello spazio del <quote>primo genitore</quote> e l&rsquo;identificatore nullo nello spazio del secondo. Quando incorporate un altro changeset tramite <command role="hg-cmd">hg merge</command>, il primo genitore rimane lo stesso e il secondo genitore diventa il changeset che state incorporando. Il comando <command role="hg-cmd">hg parents</command> vi dice quali sono i genitori del dirstate.</para>
  17.157 +
  17.158 +    <sect2>
  17.159 +      <title>Cosa succede quando eseguite un commit</title>
  17.160 +
  17.161 +      <para id="x_30b">Il dirstate mantiene le informazioni sui genitori per altri scopi in aggiunta alla mera contabilità. Mercurial usa i genitori del dirstate come <emphasis>i genitori di un nuovo changeset</emphasis> quando effettuate un commit.</para>
  17.162 +
  17.163 +      <figure id="fig:concepts:wdir">
  17.164 +	<title>La directory di lavoro può avere due genitori</title>
  17.165 +	<mediaobject>
  17.166 +	  <imageobject><imagedata fileref="figs/wdir.png"/></imageobject>
  17.167 +	  <textobject><phrase>XXX add text</phrase></textobject>
  17.168 +	</mediaobject>
  17.169 +      </figure>
  17.170 +
  17.171 +      <para id="x_30d">La <xref linkend="fig:concepts:wdir"/> mostra il normale stato della directory di lavoro, in cui la directory ha un singolo changeset come genitore. Quel changeset è la <emphasis>punta</emphasis>, il changeset più recente senza figli nel repository.</para>
  17.172 +
  17.173 +      <figure id="fig:concepts:wdir-after-commit">
  17.174 +	<title>La directory di lavoro acquisisce nuovi genitori dopo un commit</title>
  17.175 +	<mediaobject>
  17.176 +	  <imageobject><imagedata fileref="figs/wdir-after-commit.png"/></imageobject>
  17.177 +	  <textobject><phrase>XXX add text</phrase></textobject>
  17.178 +	</mediaobject>
  17.179 +      </figure>
  17.180 +
  17.181 +      <para id="x_30f">&Egrave; utile pensare alla directory di lavoro come al <quote>changeset che state per inserire</quote>. Le azioni compiute su qualsiasi file che abbiate detto a Mercurial di aver aggiunto, rimosso, rinominato, o copiato verranno riflesse in quel changeset, così come le modifiche a qualsiasi file che Mercurial aveva già registrato. Il nuovo changeset acquisirà come propri genitori quelli della directory di lavoro.</para>
  17.182 +
  17.183 +      <para id="x_310">Dopo un commit, Mercurial aggiornerà i genitori della directory di lavoro in modo che il primo genitore sia l&rsquo;identificatore del nuovo changeset e il secondo sia l&rsquo;identificatore nullo, come mostrato nella <xref linkend="fig:concepts:wdir-after-commit"/>. Mercurial non tocca alcun file nella directory di lavoro quando eseguite un commit, ma si limita a modificare il dirstate per annotare i nuovi genitori della directory.</para>
  17.184 +
  17.185 +    </sect2>
  17.186 +    <sect2>
  17.187 +      <title>Creare una nuova testa</title>
  17.188 +
  17.189 +      <para id="x_311">&Egrave; perfettamente normale aggiornare la directory di lavoro a un changeset diverso dalla punta corrente. Per esempio, potreste voler sapere come il vostro progetto appariva lo scorso martedì, oppure potreste dover scorrere i changeset per trovare quello che ha introdotto un bug. In questi casi, la cosa naturale da fare è aggiornare la directory di lavoro al changeset che vi interessa e poi esaminare i file direttamente nella directory di lavoro per vedere quali erano i loro contenuti quando avete inserito quel changeset. Gli effetti di questa azione si possono vedere nella <xref linkend="fig:concepts:wdir-pre-branch"/>.</para>
  17.190 +
  17.191 +      <figure id="fig:concepts:wdir-pre-branch">
  17.192 +	<title>La directory di lavoro, aggiornata a un vecchio changeset</title>
  17.193 +	<mediaobject>
  17.194 +	  <imageobject><imagedata fileref="figs/wdir-pre-branch.png"/></imageobject>
  17.195 +	  <textobject><phrase>XXX add text</phrase></textobject>
  17.196 +	</mediaobject>
  17.197 +      </figure>
  17.198 +
  17.199 +      <para id="x_313">Avendo aggiornato la directory di lavoro a un vecchio changeset, cosa succede se apportate alcuni cambiamenti e poi li inserite? Mercurial si comporta nello stesso modo delineato in precedenza. I genitori della directory di lavoro diventano i genitori del nuovo changeset. Questo nuovo changeset non ha figli, quindi diventa la nuova punta. E il repository ora contiene due changeset senza figli che vengono chiamati <emphasis>teste</emphasis>. Potete vedere la struttura creata da questa operazione nella <xref linkend="fig:concepts:wdir-branch"/>.</para>
  17.200 +
  17.201 +      <figure id="fig:concepts:wdir-branch">
  17.202 +	<title>La situazione dopo un commit effettuato su un aggiornamento a un vecchio changeset</title>
  17.203 +	<mediaobject>
  17.204 +	  <imageobject><imagedata fileref="figs/wdir-branch.png"/></imageobject>
  17.205 +	  <textobject><phrase>XXX add text</phrase></textobject>
  17.206 +	</mediaobject>
  17.207 +      </figure>
  17.208 +
  17.209 +      <note>
  17.210 +	<para id="x_315">Se avete appena cominciato a lavorare con Mercurial, dovreste tenere a mente un <quote>errore</quote> comune, che è quello di usare il comando <command role="hg-cmd">hg pull</command> senza alcuna opzione. Per default, il comando <command role="hg-cmd">hg pull</command> <emphasis>non</emphasis> aggiorna la directory di lavoro, ma propagherà i nuovi cambiamenti nel vostro repository lasciandola sincronizzata allo stesso changeset in cui si trovava prima della propagazione. Se ora effettuate alcuni cambiamenti e poi li inserite, creerete una nuova testa, perché la vostra directory di lavoro non è stata sincronizzata alla revisione di punta corrente. Per combinare le operazioni di estrazione e aggiornamento, eseguite <command>hg pull -u</command>.</para>
  17.211 +
  17.212 +	<para id="x_316">Ho messo la parola <quote>errore</quote> tra virgolette perché tutto quello che dovete fare per rettificare la situazione in cui avete creato una nuova testa per sbaglio è eseguire il comando <command role="hg-cmd">hg merge</command> seguito da <command role="hg-cmd">hg commit</command>. In altre parole, questo errore non ha quasi mai conseguenze negative, ma è solo qualcosa che può sorprendere i nuovi utenti. Più avanti, discuterò altri modi per evitare questo comportamento e le ragioni per cui Mercurial si comporta in questo modo inizialmente sorprendente.</para>
  17.213 +      </note>
  17.214 +
  17.215 +    </sect2>
  17.216 +    <sect2>
  17.217 +      <title>Unire i cambiamenti</title>
  17.218 +
  17.219 +      <para id="x_317">Quando eseguite il comando <command role="hg-cmd">hg merge</command>, Mercurial lascia invariato il primo genitore della directory di lavoro e imposta il secondo genitore al cambiamento che state incorporando, come mostrato nella <xref linkend="fig:concepts:wdir-merge"/>.</para>
  17.220 +
  17.221 +      <figure id="fig:concepts:wdir-merge">
  17.222 +	<title>Unire due teste</title>
  17.223 +	<mediaobject>
  17.224 +	  <imageobject>
  17.225 +	    <imagedata fileref="figs/wdir-merge.png"/>
  17.226 +	  </imageobject>
  17.227 +	  <textobject><phrase>XXX add text</phrase></textobject>
  17.228 +	</mediaobject>
  17.229 +      </figure>
  17.230 +
  17.231 +      <para id="x_319">Mercurial deve anche modificare la directory di lavoro per unire i file gestiti dai due changeset. Semplificandolo un po&rsquo;, il processo di unione funziona nel modo seguente, per ogni file contenuto nei manifest di entrambi i changeset.</para>
  17.232 +      <itemizedlist>
  17.233 +	<listitem><para id="x_31a">Se nessuno dei changeset ha modificato il file, non fare nulla con quel file.</para>
  17.234 +	</listitem>
  17.235 +	<listitem><para id="x_31b">Se un changeset ha modificato il file e l&rsquo;altro non lo ha modificato, crea la copia modificata del file nella directory di lavoro.</para>
  17.236 +	</listitem>
  17.237 +	<listitem><para id="x_31c">Se un changeset ha rimosso un file e l&rsquo;altro no (o se anche l&rsquo;altro lo ha cancellato), cancella il file dalla directory di lavoro.</para>
  17.238 +	</listitem>
  17.239 +	<listitem><para id="x_31d">Se un changeset ha cancellato un file ma l&rsquo;altro lo ha modificato, chiedi all&rsquo;utente cosa vuole fare: tenere il file modificato oppure rimuoverlo?</para>
  17.240 +	</listitem>
  17.241 +	<listitem><para id="x_31e">Se entrambi i changeset hanno modificato un file, richiama un programma di unione esterno per scegliere i contenuti del file da unire. Questa operazione potrebbe richiedere un&rsquo;interazione con l&rsquo;utente.</para>
  17.242 +	</listitem>
  17.243 +	<listitem><para id="x_31f">Se un changeset ha modificato un file e l&rsquo;altro lo ha rinominato o copiato, assicurati che i cambiamenti seguano il nuovo nome del file.</para>
  17.244 +	</listitem></itemizedlist>
  17.245 +      <para id="x_320">Ci sono molti altri dettagli&emdash;le unioni sono piene di casi particolari&emdash;ma queste sono le scelte più comuni coinvolte nel processo di unione. Come potete vedere, la maggior parte dei casi è completamente automatizzata e in effetti la maggior parte delle unioni termina automaticamente senza richiedere il vostro intervento per risolvere alcun conflitto.</para>
  17.246 +
  17.247 +      <para id="x_321">Se considerate quello che succede quando effettuate un commit dopo un&rsquo;unione, ancora una volta la directory di lavoro è <quote>il changeset che state per inserire</quote>. Dopo che il comando <command role="hg-cmd">hg merge</command> ha terminato, la directory di lavoro possiede due genitori, che poi diventeranno i genitori del nuovo changeset.</para>
  17.248 +
  17.249 +      <para id="x_322">Mercurial vi permette di effettuare molteplici unioni, ma dovete inserire i risultati di ogni singola unione man mano che procedete, perché Mercurial tiene traccia solamente di due genitori sia per le revisioni che per la directory di lavoro. Anche se unire molteplici changeset alla volta sarebbe tecnicamente possibile, Mercurial evita di farlo per semplicità. Con unioni a più vie, il rischio di disorientare l&rsquo;utente, di incappare in conflitti sgradevoli da risolvere e di fare una terribile confusione durante il processo di unione diventerebbe intollerabile.</para>
  17.250 +
  17.251 +    </sect2>
  17.252 +
  17.253 +    <sect2>
  17.254 +      <title>Le unioni e i cambiamenti di nome</title>
  17.255 +
  17.256 +      <para id="x_69a">Un numero sorprendente di sistemi di controllo di revisione dedica poca o addirittura nessuna attenzione ai cambiamenti del <emphasis>nome</emphasis> di un file. Per esempio, era pratica comune scartare silenziosamente le modifiche a un file contenute in una delle due parti di un&rsquo;unione se quel file fosse stato rinominato nell&rsquo;altra parte.</para>
  17.257 +
  17.258 +      <para id="x_69b">Mercurial registra alcuni metadati quando gli dite di effettuare una cambiamento di nome o una copia e li usa durante le unioni per comportarsi in maniera appropriata. Per esempio, se io cambio il nome di un file che voi modificate senza rinominare, quando uniamo i nostri cambiamenti il file verrà rinominato e gli verranno applicate le vostre modifiche.</para>
  17.259 +    </sect2>
  17.260 +  </sect1>
  17.261 +
  17.262 +  <sect1>
  17.263 +    <title>Altre caratteristiche di progettazione interessanti</title>
  17.264 +
  17.265 +    <para id="x_323">Nelle sezioni precedenti, ho provato a evidenziare alcuni degli aspetti più importanti nella progettazione di Mercurial, per illustrare come sia stata dedicata la dovuta attenzione a prestazioni e affidabilità. Tuttavia, l&rsquo;attenzione ai dettagli non finisce qui. Ci sono un certo numero di altri aspetti nella costruzione di Mercurial che trovo personalmente interessanti. Ne descriverò alcuni in questa sezione, separatamente dagli elementi <quote>di primo piano</quote> analizzati finora, in modo che se siete interessati potete farvi un&rsquo;idea più precisa di quanti ragionamenti ci sono dietro a un sistema ben progettato.</para>
  17.266 +
  17.267 +    <sect2>
  17.268 +      <title>Compressione intelligente</title>
  17.269 +
  17.270 +      <para id="x_324">Quando è appropriato, Mercurial memorizzerà sia la fotografia che le delta in forma compressa, <emphasis>cercando</emphasis> sempre di comprimere una fotografia o una delta, ma memorizzando la versione compressa solo se è più piccola della versione originale.</para>
  17.271 +
  17.272 +      <para id="x_325">Questo significa che Mercurial fa <quote>la cosa giusta</quote> quando memorizza un file il cui formato sia già compresso, come un archivio <literal>zip</literal> o un&rsquo;immagine JPEG. Quando questi tipi di file vengono compressi una seconda volta, il file risultante è tipicamente più grande di quello originale, così Mercurial memorizzerà la versione iniziale del file <literal>zip</literal> o JPEG.</para>
  17.273 +
  17.274 +      <para id="x_326">Di solito, le delta tra le revisioni di un file compresso sono più grandi delle fotografie del file, ma anche in questi casi Mercurial fa <quote>la cosa giusta</quote> ancora una volta. Scopre che quella delta supera la soglia oltre la quale Mercurial dovrebbe registrare una fotografia completa del file e quindi memorizza la fotografia, risparmiando ancora spazio nei confronti di un approccio ingenuo basato solo sulle delta.</para>
  17.275 +
  17.276 +      <sect3>
  17.277 +	<title>Ricompressione di rete</title>
  17.278 +
  17.279 +	<para id="x_327">Nel memorizzare le revisioni su disco, Mercurial usa l&rsquo;algoritmo di compressione <quote>deflate</quote> (lo stesso usato dal popolare formato <literal>zip</literal>), che concilia una buona velocità con un rispettabile rapporto di compressione. Tuttavia, quando trasmette i dati di una revisione attraverso una connessione di rete, Mercurial decomprime i dati di revisione compressi.</para>
  17.280 +
  17.281 +	<para id="x_328">Se la connessione avviene via HTTP, Mercurial ricomprime l&rsquo;intero flusso di dati usando un algoritmo che ha un rapporto di compressione migliore (l&rsquo;algoritmo Burrows-Wheeler del rinomato pacchetto di compressione <literal>bzip2</literal>). Questa combinazione di algoritmo e compressione dell&rsquo;intero flusso (invece di una revisione alla volta) riduce notevolmente il numero di byte da trasferire, producendo prestazioni di trasmissione migliori sulla maggior parte delle reti.</para>
  17.282 +
  17.283 +	<para id="x_329">Se la connessione avviene via <command>ssh</command>, Mercurial <emphasis>non</emphasis> ricomprime il flusso, perché <command>ssh</command> è già in grado di farlo da sé. Potete dire a Mercurial di usare sempre la funzione di compressione di <command>ssh</command> modificando il file <filename>.hgrc</filename> che si trova nella vostra directory personale nel modo seguente.</para>
  17.284 +
  17.285 +	<programlisting>[ui]
  17.286 +ssh = ssh -C</programlisting>
  17.287 +
  17.288 +      </sect3>
  17.289 +    </sect2>
  17.290 +    <sect2>
  17.291 +      <title>Ordinamento e atomicità delle operazioni di lettura e scrittura</title>
  17.292 +
  17.293 +      <para id="x_32a">Quando si cerca di garantire che una lettura non veda scritture parziali, non è sufficiente limitarsi ad aggiungere in coda ai file le nuove informazioni. Se ricordate la <xref linkend="fig:concepts:metadata"/>, le revisioni in un changelog puntano alle revisioni nel manifest e le revisioni nel manifest puntano alle revisioni nei filelog. Questa gerarchia è intenzionale.</para>
  17.294 +
  17.295 +      <para id="x_32b">Un&rsquo;operazione di scrittura avvia una transazione modificando i dati nei filelog e nel manifest, senza modificare alcun dato contenuto nel changelog prima che di aver terminato con quelli. Un&rsquo;operazione di lettura comincia leggendo i dati nel changelog, poi i dati nel manifest seguiti dai dati nei filelog.</para>
  17.296 +
  17.297 +      <para id="x_32c">Dato che la scrittura ha sempre terminato di modificare i dati nei filelog e nel manifest prima di modificare il changelog, una lettura non vedrà mai il changelog puntare verso una revisione parzialmente modificata del manifest e non vedrà mai il manifest puntare verso una revisione parzialmente modificata di un filelog.</para>
  17.298 +
  17.299 +    </sect2>
  17.300 +    <sect2>
  17.301 +      <title>Accesso concorrente</title>
  17.302 +
  17.303 +      <para id="x_32d">Le garanzie sull&rsquo;ordinamento e sull&rsquo;atomicità delle operazioni di lettura significano che Mercurial non avrà mai bisogno di <emphasis>bloccare</emphasis> un repository da cui sta leggendo i dati, anche se il repository viene modificato mentre la lettura è in corso. Questo ha un importante effetto sulla scalabilità: potete avere un numero arbitrario di processi Mercurial che leggono contemporaneamente in sicurezza i dati da un repository, senza preoccuparvi che qualcun altro lo stia modificando oppure no.</para>
  17.304 +
  17.305 +      <para id="x_32e">La mancanza di un blocco durante la lettura significa che, se state condividendo un repository su un sistema multi-utente, non avete bisogno di concedere ad altri utenti locali i permessi di <emphasis>scrittura</emphasis> al vostro repository per consentire loro di clonarlo o estrarne i cambiamenti, ma saranno sufficienti i permessi di <emphasis>lettura</emphasis>. (Questa <emphasis>non</emphasis> è una caratteristica comune tra i sistemi di controllo di revisione, quindi non datela per scontata! La maggior parte dei sistemi richiede che i lettori siano in grado di bloccare un repository per accederlo in sicurezza, cosa che naturalmente provoca ogni tipo di sgradevoli e fastidiosi problemi di sicurezza e amministrazione.)</para>
  17.306 +
  17.307 +      <para id="x_32f">Mercurial usa i blocchi per assicurarsi che un solo processo alla volta possa effettuare modifiche a un repository (il meccanismo di bloccaggio è sicuro persino su file system che sono notoriamente avversi al bloccaggio, come NFS). Se un repository è bloccato, un&rsquo;operazione di scrittura aspetterà per qualche tempo prima di ricontrollare se il repository si è sbloccato, ma se il repository rimane bloccato troppo a lungo, dopo un po&rsquo; il processo che sta tentando di scrivere andrà in timeout. Questo significa, per esempio, che i vostri script automatici non rimarranno bloccati per sempre accumulandosi l&rsquo;uno sull&rsquo;altro se un sistema dovesse inavvertitamente cadere. (Sì, il valore del timeout è configurabile, da zero a infinito.)</para>
  17.308 +
  17.309 +      <sect3>
  17.310 +	<title>Accesso sicuro al dirstate</title>
  17.311 +
  17.312 +	<para id="x_330">Come con i dati di revisione, Mercurial non blocca il file di dirstate per leggerlo, ma acquisisce un blocco solo per modificarlo. Per evitare la possibilità di leggere una copia parzialmente modificata di un file di dirstate, Mercurial scrive su un file con un nome unico nella stessa directory del file di dirstate, poi cambia il nome del file temporaneo a <filename>dirstate</filename> in maniera atomica. In questo modo si garantisce che il file chiamato <filename>dirstate</filename> sia sempre completo e mai parzialmente modificato.</para>
  17.313 +
  17.314 +      </sect3>
  17.315 +    </sect2>
  17.316 +    <sect2>
  17.317 +      <title>Evitare le operazioni di seek</title>
  17.318 +
  17.319 +      <para id="x_331">Un aspetto critico delle prestazioni di Mercurial è quello di evitare le operazioni di seek della testina del disco, dato che ognuna di queste operazioni è molto più dispendiosa persino di un&rsquo;operazione di lettura relativamente grande.</para>
  17.320 +
  17.321 +      <para id="x_332">Questa è la ragione per cui, per esempio, il dirstate è memorizzato in un singolo file. Se ci fosse un file di dirstate per ogni directory registrata da Mercurial, il disco effettuerebbe un&rsquo;operazione di seek per ciascuna directory. Invece, Mercurial legge l&rsquo;intero file di dirstate in un singolo passo.</para>
  17.322 +
  17.323 +      <para id="x_333">Mercurial adotta anche una strategia <quote>copy-on-write</quote> per clonare un repository su disco locale. Invece di copiare ogni file di revlog dal vecchio repository al nuovo, utilizza <quote>collegamenti fisici</quote> per indicare che <quote>due nomi puntano allo stesso file</quote>. Quando Mercurial sta per modificare uno dei file di un revlog, controlla per vedere se il numero di nomi che puntano al file è più grande di uno. Se è così, questo significa che più di un repository sta usando il file, quindi Mercurial ne crea una nuova copia riservata a questo repository.</para>
  17.324 +
  17.325 +      <para id="x_334">Alcuni sviluppatori di sistemi per il controllo di revisione hanno fatto notare che la creazione di una copia privata completa di un file non sfrutta lo spazio su disco in maniera molto efficiente. Sebbene questo sia vero, lo spazio su disco è piuttosto economico, e questo metodo consente di avere le prestazioni migliori rinviando la maggior parte della contabilità al sistema operativo. Molto probabilmente, una strategia alternativa ridurrebbe le prestazioni e aumenterebbe la complessità del software, ma velocità e semplicità sono aspetti chiave per la <quote>facilità</quote> nell&rsquo;uso quotidiano.</para>
  17.326 +
  17.327 +    </sect2>
  17.328 +    <sect2>
  17.329 +      <title>Altre informazioni contenute nel dirstate</title>
  17.330 +
  17.331 +      <para id="x_335">Dato che Mercurial non vi obbliga a dirgli quando state modificando un file, usa il dirstate per memorizzare alcune informazioni aggiuntive in modo da poter determinare in maniera efficiente se avete modificato un file. Per ogni file nella directory di lavoro, Mercurial memorizza la data in cui ha registrato una modifica al file per l&rsquo;ultima volta e la dimensione che il file aveva in quel momento.</para>
  17.332 +
  17.333 +      <para id="x_336">Quando utilizzate esplicitamente <command role="hg-cmd">hg add</command>, <command role="hg-cmd">hg remove</command>, <command role="hg-cmd">hg rename</command>, o <command role="hg-cmd">hg copy</command> su un file, Mercurial aggiorna il dirstate in modo che sappia cosa fare con quel file quando effettuate un commit.</para>
  17.334 +
  17.335 +      <para id="x_337">Il dirstate aiuta Mercurial a controllare in maniera efficiente lo stato dei file in un repository.</para>
  17.336 +
  17.337 +      <itemizedlist>
  17.338 +	<listitem>
  17.339 +	  <para id="x_726">Quando Mercurial controlla lo stato di un file nella directory di lavoro, per prima cosa confronta la data dell&rsquo;ultima modifica del file con la data memorizzata nel dirstate che indica l&rsquo;ultima volta in cui Mercurial ha registrato una modifica per quel file. Se le due date sono le stesse, il file non deve essere stato modificato, quindi Mercurial non ha bisogno di fare ulteriori controlli.</para>
  17.340 +	</listitem>
  17.341 +	<listitem>
  17.342 +	  <para id="x_727">Se la dimensione del file è cambiata, il file deve essere stato modificato. Solo nel caso in cui la data di modifica sia cambiata, ma non la dimensione, Mercurial ha effettivamente bisogno di leggere i contenuti del file per vedere se è stato modificato.</para>
  17.343 +	</listitem>
  17.344 +      </itemizedlist>
  17.345 +
  17.346 +      <para id="x_728">Memorizzare le dimensioni e la data di ultima modifica riduce drammaticamente il numero di operazioni di lettura che Mercurial deve effettuare quando invochiamo comandi come <command>hg status</command>. Da questo stratagemma deriva un notevole miglioramento delle prestazioni.</para>
  17.347 +    </sect2>
  17.348 +  </sect1>
  17.349 +</chapter>
    18.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    18.2 +++ b/it/ch05-daily.xml	Fri Sep 04 16:33:35 2009 +0200
    18.3 @@ -0,0 +1,415 @@
    18.4 +<chapter id="chap:daily">
    18.5 +  <?dbhtml filename="uso-quotidiano-di-mercurial.html"?>
    18.6 +  <title>L&rsquo;uso quotidiano di Mercurial</title>
    18.7 +
    18.8 +  <sect1>
    18.9 +    <title>Aggiungere file a un repository Mercurial</title>
   18.10 +
   18.11 +    <para id="x_1a3">Mercurial lavora solo con i file che gli dite di amministrare nel vostro repository. Il comando <command role="hg-cmd">hg status</command> vi dirà quali sono i file che Mercurial non conosce, usando un <quote><literal>?</literal></quote> per mostrare questi file.</para>
   18.12 +
   18.13 +    <para id="x_1a4">Per dire a Mercurial di tenere traccia di un file, usate il comando <command role="hg-cmd">hg add</command>. Una volta che avete aggiunto un file, la voce per quel file nell&rsquo;elenco visualizzato da <command role="hg-cmd">hg status</command> cambia da <quote><literal>?</literal></quote> ad <quote><literal>A</literal></quote>.</para>
   18.14 +
   18.15 +    &interaction.daily.files.add;
   18.16 +
   18.17 +    <para id="x_1a5">Dopo aver eseguito <command role="hg-cmd">hg commit</command>, i file che avete aggiunto prima dell&rsquo;inserimento non verranno più elencati dal comando <command role="hg-cmd">hg status</command>, perché il comportamento predefinito di <command role="hg-cmd">hg status</command> è quello di segnalarvi solo i file <quote>interessanti</quote> come (per esempio) quelli che avete modificato, rimosso, o rinominato. Se avete un repository che contiene migliaia di file, vorrete raramente sapere qualcosa dei file che Mercurial ha già registrato ma che non sono cambiati. (Potete comunque ottenere questa informazione, come vedremo più avanti.)</para>
   18.18 +
   18.19 +    <para id="x_1a6">Mercurial non agisce immediatamente su un file che avete appena aggiunto, ma scatterà una fotografia dello stato del file la prossima volta che eseguirete un commit. Poi continuerà a tenere traccia dei cambiamenti che apportate al file ogni volta che eseguite un commit, fino a quando non rimuoverete il file.</para>
   18.20 +
   18.21 +    <sect2>
   18.22 +      <title>Designazione esplicita o implicita dei file</title>
   18.23 +
   18.24 +      <para id="x_1a7">Se passate un nome di una directory a un comando, ogni comando Mercurial interpreterà opportunamente questa azione come la richiesta di <quote>operare su ogni file in questa directory e nelle sue sottodirectory</quote>.</para>
   18.25 +
   18.26 +      &interaction.daily.files.add-dir;
   18.27 +
   18.28 +      <para id="x_1a8">Notate che, in questo esempio, Mercurial ha stampato i nomi dei file che ha aggiunto, mentre non lo ha fatto quando abbiamo aggiunto il file <filename>miofile.txt</filename> nell&rsquo;esempio precedente.</para>
   18.29 +
   18.30 +      <para id="x_1a9">Questo accade perché, nel primo esempio, abbiamo esplicitamente nominato il file da aggiungere sulla riga di comando. In questi casi, Mercurial assume che sappiamo ciò che stiamo facendo, per cui non stampa alcuna informazione.</para>
   18.31 +
   18.32 +      <para id="x_1aa">Tuttavia, quando <emphasis>implichiamo</emphasis> i nomi dei file dando il nome di una directory, Mercurial compie il passo aggiuntivo di stampare il nome di ogni file su cui agisce. Questo rende più chiaro ciò che sta succedendo e riduce la probabilità di una sorpresa sgradita e silenziosa. La maggior parte dei comandi Mercurial si comporta in questo modo.</para>
   18.33 +    </sect2>
   18.34 +
   18.35 +    <sect2>
   18.36 +      <title>Mercurial registra i file, non le directory</title>
   18.37 +
   18.38 +      <para id="x_1ab">Mercurial non tiene traccia delle informazioni sulle directory, ma tiene traccia del percorso di un file. Prima di creare un file, crea tutte le directory mancanti che ne compongono il percorso. Dopo che ha cancellato un file, cancella ogni directory vuota che faceva parte del percorso del file cancellato. Questa sembra una distinzione irrilevante, ma ha una conseguenza pratica di secondaria importanza: Mercurial non vi permette di rappresentare una directory completamente vuota.</para>
   18.39 +
   18.40 +      <para id="x_1ac">Le directory vuote sono raramente utili e ci sono soluzioni non invadenti che potete usare per ottenere un effetto appropriato. Quindi, gli sviluppatori di Mercurial hanno deciso che la complessità che sarebbe stata richiesta per gestire le directory vuote non valesse il limitato beneficio che questa caratteristica avrebbe portato.</para>
   18.41 +
   18.42 +      <para id="x_1ad">Se avete bisogno di una directory vuota nel vostro repository, ci sono alcuni modi per ottenerla. Uno dei modi possibili è quello di creare una directory e usare <command role="hg-cmd">hg add</command> per aggiungere un file <quote>nascosto</quote> a quella directory. Sui sistemi di tipo Unix, ogni file il cui nome comincia con un punto (<quote><literal>.</literal></quote>) viene considerato nascosto dalla maggior parte dei comandi e delle applicazioni con interfaccia grafica. Questo approccio è illustrato qui di seguito.</para>
   18.43 +
   18.44 +      &interaction.daily.files.hidden;
   18.45 +
   18.46 +      <para id="x_1ae">Un altro modo per soddisfare il bisogno di una directory vuota è semplicemente quello di farla creare al vostro programma automatico di assemblaggio del progetto nel momento in cui ne avete bisogno.</para>
   18.47 +    </sect2>
   18.48 +  </sect1>
   18.49 +
   18.50 +  <sect1>
   18.51 +    <title>Come rimuovere un file dal repository</title>
   18.52 +
   18.53 +    <para id="x_1af">Una volta che avete deciso che un file non appartiene più al vostro repository, usate il comando <command role="hg-cmd">hg remove</command>. Questo comando cancella il file e dice a Mercurial di non tenerne più traccia (cosa che avverrà nel prossimo commit). Un file rimosso viene rappresentato con una <quote><literal>R</literal></quote> nell&rsquo;elenco prodotto da <command role="hg-cmd">hg status</command>.</para>
   18.54 +
   18.55 +    &interaction.daily.files.remove;
   18.56 +
   18.57 +    <para id="x_1b0">Dopo che avete rimosso un file tramite <command role="hg-cmd">hg remove</command>, Mercurial non terrà più traccia di quel file anche se ricreate un file con lo stesso nome nella vostra directory di lavoro. Se ricreate davvero un file con lo stesso nome e volete che Mercurial amministri il nuovo file, usate semplicemente <command role="hg-cmd">hg add</command>. Mercurial saprà che il nuovo file non è in alcun modo legato al vecchio file con lo stesso nome.</para>
   18.58 +
   18.59 +    <sect2>
   18.60 +      <title>La rimozione di un file non ha effetti sulla sua cronologia.</title>
   18.61 +
   18.62 +      <para id="x_1b1">&Egrave; importante capire che la rimozione di un file ha solo due effetti.</para>
   18.63 +      <itemizedlist>
   18.64 +	<listitem><para id="x_1b2">Cancella la versione corrente del file dalla directory di lavoro.</para>
   18.65 +	</listitem>
   18.66 +	<listitem><para id="x_1b3">Induce Mercurial a smettere di monitorare i cambiamenti del file dal commit successivo in poi.</para>
   18.67 +	</listitem></itemizedlist>
   18.68 +      <para id="x_1b4">La rimozione di un file <emphasis>non</emphasis> altera la <emphasis>cronologia</emphasis> del file in alcun modo.</para>
   18.69 +
   18.70 +      <para id="x_1b5">Se aggiornate la directory di lavoro a un changeset che era stato inserito quando Mercurial stava ancora tenendo traccia del file che più tardi avete rimosso, il file riapparirà nella directory di lavoro con i contenuti che aveva quando avete inserito quel changeset. Se poi aggiornate la directory di lavoro a un changeset successivo in cui il file è stato rimosso, Mercurial cancellerà ancora una volta il file dalla directory di lavoro.</para>
   18.71 +    </sect2>
   18.72 +
   18.73 +    <sect2>
   18.74 +      <title>File mancanti</title>
   18.75 +
   18.76 +      <para id="x_1b6">Mercurial considera <emphasis>mancante</emphasis> un file che avete cancellato senza usare <command role="hg-cmd">hg remove</command>. Un file mancante viene rappresentato con <quote><literal>!</literal></quote> nell&rsquo;elenco mostrato da <command role="hg-cmd">hg status</command>. Di solito, i comandi Mercurial non agiscono mai sui file mancanti.</para>
   18.77 +
   18.78 +      &interaction.daily.files.missing;
   18.79 +
   18.80 +      <para id="x_1b7">Se il vostro repository contiene un file che <command role="hg-cmd">hg status</command> segnala come mancante e volete che il file rimanga assente, potete eseguire <command role="hg-cmd">hg remove <option role="hg-opt-remove">--after</option></command> in qualsiasi momento per dire a Mercurial che volevate effettivamente rimuovere il file.</para>
   18.81 +
   18.82 +      &interaction.daily.files.remove-after;
   18.83 +
   18.84 +      <para id="x_1b8">D&rsquo;altra parte, se avete cancellato il file mancante per errore, passate al comando <command role="hg-cmd">hg revert</command> il nome del file da recuperare e il file riapparirà senza alcun cambiamento.</para>
   18.85 +
   18.86 +      &interaction.daily.files.recover-missing;
   18.87 +    </sect2>
   18.88 +
   18.89 +    <sect2>
   18.90 +      <title>Digressione: perché dire esplicitamente a Mercurial di rimuovere un file?</title>
   18.91 +
   18.92 +      <para id="x_1b9">Potreste chiedervi perché Mercurial vi costringe a dirgli esplicitamente che state cancellando un file. Nelle prime fasi di sviluppo, Mercurial vi permetteva di cancellare un file nel modo che preferivate: avrebbe notato automaticamente l&rsquo;assenza del file durante la successiva esecuzione di <command role="hg-cmd">hg commit</command> e avrebbe smesso di monitorarlo. In pratica, questo modo di operare rendeva troppo facile rimuovere accidentalmente un file senza accorgersene.</para>
   18.93 +    </sect2>
   18.94 +
   18.95 +    <sect2>
   18.96 +      <title>Utile scorciatoia&emdash;aggiungere e rimuovere i file in un unico passo</title>
   18.97 +
   18.98 +      <para id="x_1ba">Mercurial fornisce il comando combinato <command role="hg-cmd">hg addremove</command> per aggiungere i file non ancora registrati e segnare i file mancanti come rimossi.</para>
   18.99 +
  18.100 +      &interaction.daily.files.addremove;
  18.101 +
  18.102 +      <para id="x_1bb">Il comando <command role="hg-cmd">hg commit</command> offre anche un&rsquo;opzione <option role="hg-opt-commit">-A</option> che effettua la stessa operazione di aggiunta-e-rimozione, immediatamente seguita da un commit.</para>
  18.103 +
  18.104 +      &interaction.daily.files.commit-addremove;
  18.105 +    </sect2>
  18.106 +  </sect1>
  18.107 +
  18.108 +  <sect1 id="chap:daily.copy">
  18.109 +    <title>Copiare i file</title>
  18.110 +
  18.111 +    <para id="x_1bc">Mercurial fornisce un comando <command role="hg-cmd">hg copy</command> che vi permette di creare una nuova copia di un file. Quando copiate un file usando questo comando, Mercurial registra il fatto che il nuovo file è una copia del file originale e tratta i file copiati in maniera speciale quando unite il vostro lavoro con quello di qualcun altro.</para>
  18.112 +
  18.113 +    <sect2>
  18.114 +      <title>I risultati di una copia durante un&rsquo;unione</title>
  18.115 +
  18.116 +      <para id="x_1bd">Quello che succede durante un&rsquo;unione è che i cambiamenti <quote>seguono</quote> la copia. Per illustrare al meglio cosa questo significa, creiamo un esempio. Cominceremo con il solito piccolo repository che contiene un singolo file.</para>
  18.117 +
  18.118 +      &interaction.daily.copy.init;
  18.119 +
  18.120 +      <para id="x_1be">Abbiamo bisogno di fare alcune modifiche in parallelo, in modo da avere due cambiamenti da unire tra loro. Quindi cloniamo il nostro repository.</para>
  18.121 +
  18.122 +      &interaction.daily.copy.clone;
  18.123 +
  18.124 +      <para id="x_1bf">Tornando al nostro repository iniziale, usiamo il comando <command role="hg-cmd">hg copy</command> per fare una copia del primo file che abbiamo creato.</para>
  18.125 +
  18.126 +      &interaction.daily.copy.copy;
  18.127 +
  18.128 +      <para id="x_1c0">Se successivamente osserviamo il risultato del comando <command role="hg-cmd">hg status</command>, il file copiato appare come un normale file aggiunto.</para>
  18.129 +
  18.130 +      &interaction.daily.copy.status;
  18.131 +
  18.132 +      <para id="x_1c1">Ma se passiamo l&rsquo;opzione <option role="hg-opt-status">-C</option> al comando <command role="hg-cmd">hg status</command>, otterremo un&rsquo;altra riga nell&rsquo;elenco stampato: questo è il file <emphasis>da cui</emphasis> il nostro file appena aggiunto è stato copiato.</para>
  18.133 +
  18.134 +      &interaction.daily.copy.status-copy;
  18.135 +
  18.136 +      <para id="x_1c2">Ora, tornando al repository che abbiamo clonato, apportiamo un cambiamento in parallelo. Aggiungeremo una riga al contenuto del file originale che abbiamo creato.</para>
  18.137 +
  18.138 +      &interaction.daily.copy.other;
  18.139 +
  18.140 +      <para id="x_1c3">Ora abbiamo un <filename>file</filename> modificato in questo repository. Quando estraiamo i cambiamenti dal primo repository e uniamo le due teste, Mercurial propagherà i cambiamenti che abbiamo apportato localmente a <filename>file</filename> nella sua copia <filename>nuovo-file</filename>.</para>
  18.141 +
  18.142 +      &interaction.daily.copy.merge;
  18.143 +    </sect2>
  18.144 +
  18.145 +    <sect2 id="sec:daily:why-copy">
  18.146 +      <title>Perché i cambiamenti dovrebbero seguire le copie?</title>
  18.147 +
  18.148 +      <para id="x_1c4">Questo comportamento&emdash;dei cambiamenti a un file che si propagano alle copie del file&emdash;potrebbe sembrare esoterico, ma nella maggior parte dei casi è altamente desiderabile.</para>
  18.149 +
  18.150 +      <para id="x_1c5">Prima di tutto, ricordatevi che questa propagazione avviene <emphasis>solamente</emphasis> durante un&rsquo;unione. Quindi se usate <command role="hg-cmd">hg copy</command> su un file e in seguito modificate il file originale nel normale corso del vostro lavoro, non accadrà nulla.</para>
  18.151 +
  18.152 +      <para id="x_1c6">La seconda cosa da sapere è che le modifiche si propagheranno alla copia solo se il changeset da cui state incorporando le modifiche <emphasis>non ha ancora visto</emphasis> la copia.</para>
  18.153 +
  18.154 +      <para id="x_1c7">Il motivo per cui Mercurial si comporta in questo modo è il seguente. Diciamo che io correggo un bug importante in un file sorgente e inserisco i miei cambiamenti nel repository. Nel frattempo, voi avete deciso di eseguire <command role="hg-cmd">hg copy</command> per fare una copia del file nel vostro repository, senza sapere del bug o aver visto la correzione, e avete cominciato a lavorare sulla vostra copia del file.</para>
  18.155 +
  18.156 +      <para id="x_1c8">Se dopo aver estratto e incorporato le mie modifiche Mercurial <emphasis>non</emphasis> avesse propagato i cambiamenti attraverso le copie, il vostro nuovo file sorgente ora conterrebbe il bug e, a meno che voi non sapeste come propagare la correzione a mano, il bug <emphasis>rimarrebbe</emphasis> nella vostra copia del file.</para>
  18.157 +
  18.158 +      <para id="x_1c9">Propagando automaticamente le modifiche che hanno corretto il bug dal file originale alla copia, Mercurial previene questo tipo di problemi. A quanto ne so, Mercurial è <emphasis>l&rsquo;unico</emphasis> sistema di controllo di revisione che propaga i cambiamenti verso le copie in questo modo.</para>
  18.159 +
  18.160 +      <para id="x_1ca">Una volta che la vostra cronologia dei cambiamenti contiene la registrazione che la copia e la successiva unione sono avvenute, di solito non c&rsquo;è più bisogno di propagare cambiamenti dal file originale al file copiato. Questo è il motivo per cui Mercurial propaga i cambiamenti verso le copie solo durante la prima unione ma non successivamente.</para>
  18.161 +    </sect2>
  18.162 +
  18.163 +    <sect2>
  18.164 +      <title>Come <emphasis>evitare</emphasis> che i cambiamenti seguano una copia</title>
  18.165 +
  18.166 +      <para id="x_1cb">Se per qualche ragione decidete che questa faccenda di propagare automaticamente i cambiamenti verso le copie non fa per voi, utilizzate il normale comando per la copia di file fornito dal vostro sistema (<command>cp</command> per i sistemi di tipo Unix) per effettuare la copia di un file, poi aggiungete a mano la nuova copia invocando <command role="hg-cmd">hg add</command>. Prima di farlo, però, rileggete la <xref linkend="sec:daily:why-copy"/> e prendete una decisione informata sulla validità di questo comportamento nel vostro caso specifico.</para>
  18.167 +
  18.168 +    </sect2>
  18.169 +    <sect2>
  18.170 +      <title>Il comportamento del comando <command role="hg-cmd">hg copy</command></title>
  18.171 +
  18.172 +      <para id="x_1cc">Quando usate il comando <command role="hg-cmd">hg copy</command>, Mercurial esegue la copia dei file originali contenuti nella directory di lavoro nello stato in cui si trovano in quel momento. Questo significa che, se fate alcune modifiche a un file e poi lo copiate tramite <command role="hg-cmd">hg copy</command> senza prima aver inserito quelle modifiche nel repository, anche la nuova copia conterrà le modifiche che avete apportato fino a quel momento. (Trovo che questo comportamento sia leggermente controintuitivo ed è per questo che lo menziono qui.)</para>
  18.173 +
  18.174 +      <para id="x_1cd">Il comando <command role="hg-cmd">hg copy</command> agisce in maniera simile al comando Unix <command>cp</command> (potete usare l&rsquo;alias <command role="hg-cmd">hg cp</command> se preferite). Dobbiamo fornirgli due o più argomenti, di cui l&rsquo;ultimo viene trattato come <emphasis>destinazione</emphasis> e tutti gli altri vengono trattati come <emphasis>sorgenti</emphasis>.</para>
  18.175 +
  18.176 +      <para id="x_685">Se invocate <command role="hg-cmd">hg copy</command> con un singolo file come sorgente e la destinazione non esiste, il comando crea un nuovo file con quel nome.</para>
  18.177 +
  18.178 +      &interaction.daily.copy.simple;
  18.179 +      
  18.180 +      <para id="x_1ce">Se la destinazione è una directory, Mercurial copia le sorgenti in quella directory.</para>
  18.181 +
  18.182 +      &interaction.daily.copy.dir-dest;
  18.183 +
  18.184 +      <para id="x_1cf">Copiare una directory è un&rsquo;operazione ricorsiva e preserva la struttura delle directory della sorgente.</para>
  18.185 +
  18.186 +      &interaction.daily.copy.dir-src;
  18.187 +
  18.188 +      <para id="x_1d0">Se la sorgente e la destinazione sono entrambe directory, l&rsquo;albero della sorgente viene ricreato nella directory di destinazione.</para>
  18.189 +
  18.190 +      &interaction.daily.copy.dir-src-dest;
  18.191 +
  18.192 +      <para id="x_1d1">Come con il comando <command role="hg-cmd">hg remove</command>, se copiate un file manualmente e poi volete informare Mercurial di aver copiato il file, usate semplicemente l&rsquo;opzione <option role="hg-opt-copy">--after</option> di <command role="hg-cmd">hg copy</command>.</para>
  18.193 +
  18.194 +      &interaction.daily.copy.after;
  18.195 +    </sect2>
  18.196 +  </sect1>
  18.197 +
  18.198 +  <sect1>
  18.199 +    <title>Rinominare i file</title>
  18.200 +
  18.201 +    <para id="x_1d2">&Egrave; molto più comune aver bisogno di rinominare un file piuttosto che aver bisogno di copiarlo. La ragione per cui ho discusso il comando <command role="hg-cmd">hg copy</command> prima di parlare di come rinominare i file è che Mercurial tratta un cambiamento di nome essenzialmente nello stesso modo di una copia. Perciò, se sapete cosa fa Mercurial quando copiate un file, sapete anche cosa aspettarvi quando rinominate un file.</para>
  18.202 +
  18.203 +    <para id="x_1d3">Quando usate il comando <command role="hg-cmd">hg rename</command>, Mercurial crea una copia del file originale, poi lo cancella e segnala il file come rimosso.</para>
  18.204 +
  18.205 +    &interaction.daily.rename.rename;
  18.206 +
  18.207 +    <para id="x_1d4">Il comando <command role="hg-cmd">hg status</command> mostra la nuova copia del file come aggiunta e il file da cui è stata effettuata la copia come rimosso.</para>
  18.208 +
  18.209 +    &interaction.daily.rename.status;
  18.210 +
  18.211 +    <para id="x_1d5">Come accade per i risultati del comando <command role="hg-cmd">hg copy</command>, dobbiamo usare l&rsquo;opzione <option role="hg-opt-status">-C</option> del comando <command role="hg-cmd">hg status</command> per vedere che Mercurial considera il file aggiunto come una copia del file originale ora rimosso.</para>
  18.212 +
  18.213 +    &interaction.daily.rename.status-copy;
  18.214 +
  18.215 +    <para id="x_1d6">Come con <command role="hg-cmd">hg remove</command> e <command role="hg-cmd">hg copy</command>, potete usare l&rsquo;opzione <option role="hg-opt-rename">--after</option> per informare Mercurial del cambiamento di nome dopo che il fatto è avvenuto. Nella maggior parte degli altri aspetti, il comportamento del comando <command role="hg-cmd">hg rename</command> e le opzioni che accetta sono simili a quelli del comando <command role="hg-cmd">hg copy</command>.</para>
  18.216 +
  18.217 +    <para id="x_686">Se avete familiarità con la riga di comando Unix, sarete felici di sapere che il comando <command role="hg-cmd">hg rename</command> può essere invocato come <command role="hg-cmd">hg mv</command>.</para>
  18.218 +
  18.219 +    <sect2>
  18.220 +      <title>Rinominare i file e unire i cambiamenti</title>
  18.221 +
  18.222 +      <para id="x_1d7">Dato che Mercurial rinomina i file tramite un&rsquo;operazione di copia-e-rimozione, i cambiamenti vengono propagati nello stesso modo quando effettuate un&rsquo;unione sia dopo aver copiato un file che dopo averlo rinominato.</para>
  18.223 +
  18.224 +      <para id="x_1d8">Se io modifico un file e voi lo rinominate e poi uniamo i nostri rispettivi cambiamenti, le mie modifiche al file con il suo nome originale verranno propagate al file con il suo nuovo nome. (Vi potreste aspettare che questo <quote>funzioni e basta</quote> ma in realtà non tutti i sistemi di controllo di revisione lo fanno.)</para>
  18.225 +
  18.226 +      <para id="x_1d9">Sebbene la propagazione dei cambiamenti alle copie sia una funzione che potreste approvare dicendo <quote>sì, questo potrebbe essere utile</quote>, deve essere chiaro che propagare i cambiamenti ai file rinominati è assolutamente importante. Senza questo meccanismo, i cambiamenti a un file si potrebbero perdere con troppa facilità quando il file viene rinominato.</para>
  18.227 +    </sect2>
  18.228 +
  18.229 +    <sect2>
  18.230 +      <title>Cambiamenti di nome divergenti e unioni</title>
  18.231 +
  18.232 +      <para id="x_1da">Il caso dei nomi divergenti si verifica quando due sviluppatori cominciano con un file&emdash;chiamiamolo <filename>foo</filename>&emdash;nei loro rispettivi repository.</para>
  18.233 +
  18.234 +      &interaction.rename.divergent.clone;
  18.235 +
  18.236 +      <para id="x_1db">Anna cambia il nome del file a <filename>bar</filename>.</para>
  18.237 +
  18.238 +      &interaction.rename.divergent.rename.anne;
  18.239 +
  18.240 +      <para id="x_1dc">Nel frattempo, Bruno lo rinomina <filename>quux</filename>. (Ricordatevi che <command role="hg-cmd">hg mv</command> è un alias di <command role="hg-cmd">hg rename</command>.)</para>
  18.241 +
  18.242 +      &interaction.rename.divergent.rename.bob;
  18.243 +
  18.244 +      <para id="x_1dd">Mi piace pensare a questo come a un conflitto perché entrambi gli sviluppatori hanno espresso intenzioni differenti a proposito di come il file dovrebbe essere chiamato.</para>
  18.245 +
  18.246 +      <para id="x_1de">Cosa pensate che dovrebbe accadere quando Anna e Bruno uniscono il loro lavoro? L&rsquo;effettivo comportamento di Mercurial è quello di preservare sempre <emphasis>entrambi</emphasis> i nomi quando unisce changeset che contengono cambiamenti di nome divergenti.</para>
  18.247 +
  18.248 +      &interaction.rename.divergent.merge;
  18.249 +
  18.250 +      <para id="x_1df">Notate che, sebbene Mercurial vi avverta del cambiamento di nome divergente, lascia che siate voi a riconciliare la divergenza dopo l&rsquo;unione.</para>
  18.251 +    </sect2>
  18.252 +
  18.253 +    <sect2>
  18.254 +      <title>Cambiamenti di nome convergenti e unioni</title>
  18.255 +
  18.256 +      <para id="x_1e0">Un altro tipo di conflitto tra i cambiamenti di nome avviene quando due persone rinominano differenti file <emphasis>sorgente</emphasis> alla stessa <emphasis>destinazione</emphasis>. In questo caso, Mercurial esegue l&rsquo;unione normalmente e lascia che siate voi a guidarlo verso una risoluzione ragionevole.</para>
  18.257 +    </sect2>
  18.258 +
  18.259 +    <sect2>
  18.260 +      <title>Altri casi particolari legati ai nomi</title>
  18.261 +
  18.262 +      <para id="x_1e1">Mercurial soffre di un bug noto da tempo che gli impedisce di portare a termine un&rsquo;unione in cui una parte contiene un file con un certo nome mentre l&rsquo;altra contiene una directory con lo stesso nome. Questo è documentato come <ulink role="hg-bug" url="http://www.selenic.com/mercurial/bts/issue29">problema 29</ulink>.</para>
  18.263 +
  18.264 +      &interaction.issue29.go;
  18.265 +
  18.266 +    </sect2>
  18.267 +  </sect1>
  18.268 +
  18.269 +  <sect1>
  18.270 +    <title>Rimediare agli errori</title>
  18.271 +
  18.272 +    <para id="x_1e2">Mercurial possiede alcuni comandi utili che vi aiuteranno a rimediare a diversi errori comuni.</para>
  18.273 +
  18.274 +    <para id="x_1e3">Il comando <command role="hg-cmd">hg revert</command> vi permette di annullare i cambiamenti che avete apportato alla vostra directory di lavoro. Per esempio, se avete aggiunto un file invocando <command role="hg-cmd">hg add</command> per errore, vi basta eseguire <command role="hg-cmd">hg revert</command> con il nome del file che avete aggiunto e il file non verrà toccato in alcun modo né sarà più considerato per essere aggiunto da Mercurial. Potete anche usare <command role="hg-cmd">hg revert</command> per disfarvi di cambiamenti sbagliati apportati a un file.</para>
  18.275 +
  18.276 +    <para id="x_1e4">&Egrave; utile ricordare che il comando <command role="hg-cmd">hg revert</command> serve per i cambiamenti che non avete ancora inserito. Una volta che avete inserito un cambiamento, se decidete che è stato un errore potete ancora fare qualcosa, sebbene le vostre opzioni siano molto più limitate.</para>
  18.277 +
  18.278 +    <para id="x_1e5">Per maggiori informazioni sul comando <command role="hg-cmd">hg revert</command> e dettagli su come trattare i cambiamenti che avete gia inserito, leggete il <xref linkend="chap:undo"/>.</para>
  18.279 +  </sect1>
  18.280 +
  18.281 +  <sect1>
  18.282 +    <title>Affrontare unioni complesse</title>
  18.283 +
  18.284 +    <para id="x_687">In un progetto grande o complicato, può capitare che l&rsquo;unione tra due changeset provochi qualche mal di testa. Supponete che ci sia un file sorgente di grandi dimensioni che è stato ampiamente modificato da entrambe le parti di un&rsquo;unione: quasi inevitabilmente, questo risulterà in conflitti, alcuni dei quali potrebbero avere bisogno di più di un tentativo per venire risolti.</para>
  18.285 +
  18.286 +    <para id="x_688">Costruiamoci un semplice esempio di questa eventualità e vediamo come affrontarlo. Cominceremo con un repository contenente un file e lo cloneremo due volte.</para>
  18.287 +
  18.288 +    &interaction.ch04-resolve.init;
  18.289 +
  18.290 +    <para id="x_689">In uno dei cloni, modificheremo il file in un modo.</para>
  18.291 +
  18.292 +    &interaction.ch04-resolve.left;
  18.293 +
  18.294 +    <para id="x_68a">Nell&rsquo;altro, modificheremo il file in modo differente.</para>
  18.295 +
  18.296 +    &interaction.ch04-resolve.right;
  18.297 +
  18.298 +    <para id="x_68b">Poi, propagheremo entrambi i cambiamenti nel nostro repository originale.</para>
  18.299 +
  18.300 +    &interaction.ch04-resolve.pull;
  18.301 +
  18.302 +    <para id="x_68c">Ora ci aspettiamo che il nostro repository contenga due teste.</para>
  18.303 +
  18.304 +    &interaction.ch04-resolve.heads;
  18.305 +
  18.306 +    <para id="x_68d">Normalmente, se eseguissimo il comando <command role="hg-cmd">hg merge</command> a questo punto, ci verrebbe presentata un&rsquo;applicazione grafica tramite la quale riconciliare manualmente le modifiche in conflitto su <filename>miofile.txt</filename>. Tuttavia, per semplificare le cose ai fini della presentazione, vorremmo invece che l&rsquo;unione fallisse immediatamente. Ecco un modo in cui possiamo farlo.</para>
  18.307 +
  18.308 +    &interaction.ch04-resolve.export;
  18.309 +
  18.310 +    <para id="x_68e">Abbiamo chiesto al meccanismo di unione di Mercurial di eseguire il comando <command>false</command> (che, come desideriamo, fallisce immediatamente) se si accorge di non riuscire a risolvere un&rsquo;unione automaticamente.</para>
  18.311 +
  18.312 +    <para id="x_68f">Se ora lanciamo <command role="hg-cmd">hg merge</command>, il comando dovrebbe fermarsi e riportare un fallimento.</para>
  18.313 +
  18.314 +    &interaction.ch04-resolve.merge;
  18.315 +
  18.316 +    <para id="x_690">Se anche non avessimo notato che l&rsquo;unione è fallita, Mercurial eviterà di farci accidentalmente inserire nel repository i risultati di un&rsquo;unione fallita.</para>
  18.317 +
  18.318 +    &interaction.ch04-resolve.cifail;
  18.319 +
  18.320 +    <para id="x_691">In questo caso, <command role="hg-cmd">hg commit</command> fallisce e ci suggerisce di usare il comando <command role="hg-cmd">hg resolve</command>, che noi ancora non conosciamo. Come al solito, <command role="hg-cmd">hg help resolve</command> stamperà una pratica sinossi.</para>
  18.321 +
  18.322 +    <sect2>
  18.323 +      <title>Gli stati di risoluzione di un file</title>
  18.324 +
  18.325 +      <para id="x_692">Quando avviene un&rsquo;unione, di solito la maggior parte dei file rimarrà tale e quale. Mercurial terrà traccia dello stato di ogni file su cui deve operare.</para>
  18.326 +
  18.327 +      <itemizedlist>
  18.328 +	<listitem>
  18.329 +	  <para id="x_693">Un file <emphasis>risolto</emphasis> è stato unito con successo, o automaticamente da Mercurial o con un intervento umano.</para>
  18.330 +	</listitem>
  18.331 +	<listitem>
  18.332 +	  <para id="x_694">Un file <emphasis>irrisolto</emphasis> non è stato unito con successo e necessita di ulteriori attenzioni.</para>
  18.333 +	</listitem>
  18.334 +      </itemizedlist>
  18.335 +
  18.336 +      <para id="x_695">Se Mercurial vede un <emphasis>qualsiasi</emphasis> file nello stato irrisolto dopo un&rsquo;unione, considera fallita l&rsquo;unione. Fortunatamente, non abbiamo bisogno di ricominciare l&rsquo;intera unione da zero.</para>
  18.337 +
  18.338 +      <para id="x_696">L&rsquo;opzione <option role="hg-opt-resolve">--list</option> o <option role="hg-opt-resolve">-l</option> del comando <command role="hg-cmd">hg resolve</command> mostra lo stato di ogni file coinvolto in un&rsquo;unione.</para>
  18.339 +
  18.340 +      &interaction.ch04-resolve.list;
  18.341 +
  18.342 +      <para id="x_697">Nell&rsquo;elenco stampato da <command role="hg-cmd">hg resolve</command>, un file risolto è contrassegnato con una <literal>R</literal> mentre un file irrisolto è contrassegnato con una <literal>U</literal>.  Se un file qualsiasi viene elencato con una  <literal>U</literal>, sappiamo che un tentativo di inserire i risultati dell&rsquo;unione nel repository andrà incontro al fallimento.</para>
  18.343 +    </sect2>
  18.344 +
  18.345 +    <sect2>
  18.346 +      <title>Risolvere un&rsquo;unione di file</title>
  18.347 +
  18.348 +      <para id="x_698">Abbiamo diverse opzioni per far passare un file dallo stato irrisolto a quello risolto. Quella di gran lunga più comune consiste nell&rsquo;eseguire nuovamente <command role="hg-cmd">hg resolve</command>. Se passiamo i nomi di singoli file o directory, il comando riproverà a unire i file irrisolti presenti in quelle ubicazioni. Possiamo anche passare l&rsquo;opzione <option role="hg-opt-resolve">--all</option> o <option role="hg-opt-resolve">-a</option> per riprovare a unire <emphasis>tutti</emphasis> i file irrisolti.</para>
  18.349 +
  18.350 +      <para id="x_699">Mercurial ci permette anche di modificare direttamente lo stato di risoluzione di un file. Possiamo contrassegnare manualmente un file come risolto usando l&rsquo;opzione <option role="hg-opt-resolve">--mark</option> o come irrisolto usando l&rsquo;opzione <option role="hg-opt-resolve">--unmark</option>. Questo ci consente di ripulire a mano un&rsquo;unione particolarmente disordinata e di tenere traccia dei nostri progressi con ogni file man mano che procediamo.</para>
  18.351 +    </sect2>
  18.352 +  </sect1>
  18.353 +
  18.354 +  <sect1>
  18.355 +    <title>Formati di diff più utili</title>
  18.356 +
  18.357 +    <para id="x_6c7">Il formato predefinito del testo stampato dal comando <command role="hg-cmd">hg diff</command> è compatibile all&rsquo;indietro con il normale comando <command>diff</command>, ma questo presenta alcuni svantaggi.</para>
  18.358 +
  18.359 +    <para id="x_6c8">Considerate il caso in cui si utilizzi <command role="hg-cmd">hg rename</command> per rinominare un file.</para>
  18.360 +
  18.361 +    &interaction.ch04-diff.rename.basic;
  18.362 +
  18.363 +    <para id="x_6c9">Il risultato di <command role="hg-cmd">hg diff</command> mostrato qui sopra offusca il fatto che abbiamo semplicemente rinominato un file. Il comando <command role="hg-cmd">hg diff</command> accetta l&rsquo;opzione <option>--git</option> o <option>-g</option> per usare un formato di diff più nuovo che presenta queste informazioni in una forma più leggibile.</para>
  18.364 +
  18.365 +    &interaction.ch04-diff.rename.git;
  18.366 +
  18.367 +    <para id="x_6ca">Questa opzione ci viene in aiuto anche in un caso che altrimenti risulterebbe confuso: un file che sembra essere stato modificato secondo <command role="hg-cmd">hg status</command>, ma per il quale <command role="hg-cmd">hg diff</command> non stampa nulla. Questa situazione può presentarsi se cambiamo i permessi di esecuzione di un file.</para>
  18.368 +
  18.369 +    &interaction.ch04-diff.chmod;
  18.370 +
  18.371 +    <para id="x_6cb">Il normale comando <command>diff</command> non considera i permessi dei file, perciò la semplice invocazione di <command role="hg-cmd">hg diff</command> non stampa nulla. Se però utilizziamo l&rsquo;opzione <option>-g</option>, il comando ci dice che cos&rsquo;è realmente accaduto.</para>
  18.372 +
  18.373 +    &interaction.ch04-diff.chmod.git;
  18.374 +  </sect1>
  18.375 +
  18.376 +  <sect1>
  18.377 +    <title>Quali file gestire e quali file evitare</title>
  18.378 +
  18.379 +    <para id="x_6cc">Generalmente, i sistemi di controllo di revisione danno il meglio nella gestione dei file di testo scritti da esseri umani, come il codice sorgente, i cui file non cambiano molto da una revisione all&rsquo;altra. Alcuni sistemi centralizzati di controllo di revisione possono anche destreggiarsi abbastanza bene con i file binari, come le immagini bitmap.</para>
  18.380 +
  18.381 +    <para id="x_6cd">Per esempio, gli sviluppatori di un gioco dovranno tipicamente gestire sia il proprio codice sorgente sia le proprie risorse binarie (e.g. dati geometrici, texture, schemi di mappe) attraverso un sistema di controllo di revisione.</para>
  18.382 +
  18.383 +    <para id="x_6ce">Dato che di solito è impossibile unire due modifiche a un file binario in conflitto tra loro, spesso i sistemi centralizzati forniscono un meccanismo di bloccaggio dei file che permette a un utente di dire <quote>sono la sola persona che può modificare questo file</quote>.</para>
  18.384 +
  18.385 +    <para id="x_6cf">Rispetto a un sistema centralizzato, un sistema distribuito di controllo di revisione modifica alcuni dei fattori che guidano le decisioni su quali file gestire e come gestirli.</para>
  18.386 +
  18.387 +    <para id="x_6d0">Per esempio, un sistema distribuito di controllo di revisione non può, per sua natura, offrire un meccanismo di bloccaggio dei file. Quindi non esiste alcun meccanismo predefinito per evitare che due persone apportino cambiamenti in conflitto a un file binario. Se fate parte di un gruppo in cui diverse persone potrebbero modificare frequentemente i file binari, potrebbe non essere una buona idea impiegare Mercurial&emdash;o un qualsiasi altro sistema distribuito di controllo di revisione&emdash;per gestire quei file.</para>
  18.388 +
  18.389 +    <para id="x_6d1">Quando Mercurial memorizza le modifiche a un file, di solito salva solo le differenze tra la versione corrente del file e quella precedente. Per la maggior parte dei file di testo questo approccio si rivela estremamente efficiente. Tuttavia, alcuni file (in particolare i file binari) sono fatti in modo tale che persino una piccola modifica al contenuto logico del file risulta nel cambiamento di molti o della maggior parte dei byte contenuti nel file. Per esempio, i file compressi sono particolarmente sensibili a questo effetto. Se le differenze tra ogni versione di un file e la successiva sono sempre grandi, Mercurial non riuscirà a memorizzare la cronologia del file in maniera molto efficiente. Questo potrebbe avere effetti sia sul bisogno di spazio di memorizzazione locale sia sulla quantità di tempo che viene impiegata per clonare un repository.</para>
  18.390 +
  18.391 +    <para id="x_6d2">Per avere un&rsquo;idea di come questo problema potrebbe riguardarvi nella pratica, supponete di voler usare Mercurial per gestire un documento OpenOffice. OpenOffice memorizza i documenti su disco sotto forma di file ZIP compressi. Modificate anche solo una lettera nel vostro documento in OpenOffice e quasi ogni byte nell&rsquo;intero file cambierà quando lo salverete. Ora supponete che le dimensioni di quel file siano pari a 2MB. Dato che la maggior parte del file cambia ogni volta che lo salvate, Mercurial dovrà memorizzare tutti i 2MB del file ogni volta che eseguite un commit, anche se dal vostro punto di vista forse solo poche parole vengono cambiate ogni volta. Un singolo file modificato frequentemente che non rispetti le assunzioni dei meccanismi di memorizzazione di Mercurial può facilmente avere un effetto fuori misura sulle dimensioni del repository.</para>
  18.392 +
  18.393 +    <para id="x_6d3">Di male in peggio, se due di voi modificano il documento OpenOffice su cui state lavorando, non c&rsquo;è alcun modo utile di effettuare un&rsquo;unione tra le diverse versioni. In effetti, non c&rsquo;è nemmeno un buon modo di capire quali sono le differenze tra i vostri rispettivi cambiamenti.</para>
  18.394 +
  18.395 +    <para id="x_6d4">Quindi, ci sono alcune chiare raccomandazioni da fare sui tipi di file ai quali dovete stare molto attenti.</para>
  18.396 +
  18.397 +    <itemizedlist>
  18.398 +      <listitem>
  18.399 +	<para id="x_6d5">I file che sono molto grandi e incomprimibili, come per esempio le immagini ISO dei CD-ROM, renderanno la clonazione attraverso la rete molto lenta semplicemente a causa delle loro dimensioni.</para>
  18.400 +      </listitem>
  18.401 +      <listitem>
  18.402 +	<para id="x_6d6">I file che cambiano parecchio da una revisione alla successiva potrebbero essere costosi da memorizzare se li modificate frequentemente, e i conflitti causati da modifiche in parallelo a questi file potrebbero essere difficili da risolvere.</para>
  18.403 +      </listitem>
  18.404 +    </itemizedlist>
  18.405 +  </sect1>
  18.406 +
  18.407 +  <sect1>
  18.408 +    <title>Realizzare backup e mirror</title>
  18.409 +
  18.410 +    <para id="x_6d7">Dato che Mercurial mantiene una copia completa della cronologia in ogni clone, chiunque usi Mercurial per collaborare su un progetto può potenzialmente agire come una sorgente di backup nell&rsquo;eventualità di una catastrofe. Se un repository centrale diventa inaccessibile, potete costruire un rimpiazzo semplicemente clonando una copia del repository da un collaboratore ed estraendo dai repository di altre persone qualsiasi cambiamento che quella copia potrebbe non avere visto.</para>
  18.411 +
  18.412 +    <para id="x_6d8">Usare Mercurial per effettuare backup separati e mirror remoti è piuttosto semplice. Impostate un&rsquo;attività periodica (e.g. tramite il comando <command>cron</command>) su un server remoto per estrarre i cambiamenti dai vostri repository principali ogni ora. Questa operazione diventerà complicata solo nell&rsquo;improbabile caso in cui il numero dei repository principali che mantenete cambi frequentemente, eventualità che potrete affrontare utilizzando uno script per programmare l&rsquo;aggiornamento della lista dei repository di cui fare il backup.</para>
  18.413 +
  18.414 +    <para id="x_6d9">Se effettuate un backup tradizionale dei vostri repository principali su nastro o su disco e volete fare il backup di un repository chiamato <filename>miorepo</filename>, usate il comando <command>hg clone -U miorepo miorepo.bak</command> per creare un clone di <filename>miorepo</filename> prima di cominciare a registrare i vostri backup. L&rsquo;opzione <option>-U</option> evita di popolare la directory di lavoro dopo che la clonazione si è conclusa, dato che sarebbe superfluo e renderebbe più lungo il backup.</para>
  18.415 +
  18.416 +    <para id="x_6da">Se poi effettuate il backup di <filename>miorepo.bak</filename> invece di <filename>miorepo</filename>, avrete la garanzia di possedere una fotografia consistente del vostro repository a cui nessuno sviluppatore insonne trasmetterà i propri cambiamenti nel bel mezzo di un&rsquo;operazione di backup.</para>
  18.417 +  </sect1>
  18.418 +</chapter>
    19.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    19.2 +++ b/it/ch06-collab.xml	Fri Sep 04 16:33:35 2009 +0200
    19.3 @@ -0,0 +1,637 @@
    19.4 +<chapter id="chap:collab">
    19.5 +  <?dbhtml filename="collaborare-con-altre-persone.html"?>
    19.6 +  <title>Collaborare con altre persone</title>
    19.7 +
    19.8 +  <para id="x_44a">Essendo uno strumento completamente decentralizzato, Mercurial non impone alcuna politica su come le persone dovrebbero lavorare insieme. Tuttavia, se per voi il controllo di revisione distribuito è una novità, conoscere alcuni strumenti ed esempi può aiutarvi a ragionare sui possibili modelli di workflow (letteralmente, flusso di lavoro) da adottare.</para>
    19.9 +
   19.10 +  <sect1>
   19.11 +    <title>L&rsquo;interfaccia web di Mercurial</title>
   19.12 +
   19.13 +    <para id="x_44b">Mercurial è dotato di una potente interfaccia web che possiede diverse caratteristiche utili.</para>
   19.14 +
   19.15 +    <para id="x_44c">L&rsquo;interfaccia web vi permette di navigare interattivamente un singolo repository o una collezione di repository. Potete vedere la cronologia di un repository, esaminare qualsiasi cambiamento (con i commenti e le differenze) e vedere il contenuto di qualsiasi file o directory. Potete persino ottenere una vista della cronologia che vi fornisce una rappresentazione grafica delle relazioni tra le unioni e i singoli cambiamenti.</para>
   19.16 +
   19.17 +    <para id="x_44d">L&rsquo;interfaccia web offre ai visitatori anche i feed RSS e Atom dei cambiamenti in un repository. Questo vi permette di <quote>abbonarvi</quote> a un repository usando il vostro lettore di feed preferito e di venire automaticamente informati sulle attività in quel repository non appena vengono compiute. Trovo questa possibilità molto più conveniente rispetto al modello di iscrizione a una mailing list a cui sono spedite le notifiche, in quanto non richiede alcuna configurazione aggiuntiva da parte di chiunque stia condividendo il repository.</para>
   19.18 +
   19.19 +    <para id="x_44e">L&rsquo;interfaccia web consente agli utenti remoti anche di clonare un repository, estrarne i cambiamenti e (quando il server è configurato per permetterlo) trasmettervi le proprie modifiche. Mercurial comprime aggressivamente i dati incapsulando il protocollo HTTP in modo da lavorare con grande efficienza persino attraverso connessioni di rete a banda ridotta.</para>
   19.20 +
   19.21 +    <para id="x_44f">Il modo più facile di cominciare a usare l&rsquo;interfaccia web è quello di aprire il vostro browser per visitare un repository esistente, come il repository principale di Mercurial all&rsquo;indirizzo <ulink url="http://www.selenic.com/repo/hg">http://www.selenic.com/repo/hg</ulink>.</para>
   19.22 +
   19.23 +    <para id="x_450">Se siete interessati a fornire un&rsquo;interfaccia web ai vostri repository, esistono diversi buoni modi per farlo.</para>
   19.24 +
   19.25 +    <para id="x_69d">In un ambiente informale, il modo più facile e veloce di cominciare è quello di usare il comando <command role="hg-cmd">hg serve</command>, che è particolarmente adatto per offrire un servizio <quote>leggero</quote> a breve termine. Leggete la <xref linkend="sec:collab:serve"/> più avanti per i dettagli su come usare questo comando.</para>
   19.26 +
   19.27 +    <para id="x_69e">Per repository destinati a progetti di lunga durata che vorreste mantenere disponibili permanentemente, potete rivolgervi ai diversi servizi di hosting pubblici esistenti. Alcuni ospitano gratuitamente i progetti open source, mentre altri offrono un hosting commerciale a pagamento. Una lista aggiornata di questi servizi è disponibile all&rsquo;indirizzo <ulink url="http://www.selenic.com/mercurial/wiki/index.cgi/MercurialHosting">http://www.selenic.com/mercurial/wiki/index.cgi/MercurialHosting</ulink>.</para>
   19.28 +
   19.29 +    <para id="x_6a0">Se invece preferite tenere i repository sui vostri server, Mercurial è dotato di un supporto predefinito per diverse tecnologie di hosting popolari, in particolar modo CGI (acronimo di Common Gateway Interface, interfaccia di gateway comune) e WSGI (acronimo di Web Server Gateway Interface, interfaccia di gateway per server web). Leggete la <xref linkend="sec:collab:cgi"/> per i dettagli sulle configurazioni di CGI e WSGI.</para>
   19.30 +  </sect1>
   19.31 +
   19.32 +  <sect1>
   19.33 +    <title>Modelli di collaborazione</title>
   19.34 +
   19.35 +    <para id="x_451">Con uno strumento adeguatamente flessibile, prendere decisioni sul workflow non è tanto una sfida tecnica quanto una sfida di ingegneria sociale. Mercurial impone poche limitazioni su come potete strutturare il flusso di lavoro in un progetto, quindi sta a voi e al vostro gruppo impostare e procedere con un modello che corrisponda ai vostri particolari bisogni.</para>
   19.36 +
   19.37 +    <sect2>
   19.38 +      <title>Fattori da considerare</title>
   19.39 +
   19.40 +      <para id="x_452">L&rsquo;aspetto più importante che dovete tenere presente per qualsiasi modello è il grado di conformità ai bisogni e alle capacità delle persone che lo useranno. Questo potrebbe sembrare ovvio, ma in ogni caso non potete comunque permettervi di dimenticarvelo nemmeno per un momento.</para>
   19.41 +
   19.42 +      <para id="x_453">Una volta mi capitò di comporre un modello di workflow che a me sembrava perfettamente sensato, ma che provocò una notevole quantità di litigi e parecchia costernazione tra i membri del mio gruppo di sviluppo. Nonostante i miei tentativi di spiegare perché avessimo bisogno di un insieme complesso di ramificazioni e come i cambiamenti dovessero circolare tra i rami, alcuni membri del gruppo si ribellarono. Sebbene fossero persone intelligenti, non volevano fare attenzione ai vincoli sotto i quali stavamo operando, né affrontare le conseguenze di quei vincoli sui dettagli del modello che stavo difendendo.</para>
   19.43 +
   19.44 +      <para id="x_454">Evitate di nascondere sotto il tappeto i prevedibili problemi di tipo tecnico o sociale. Qualunque schema adottiate, dovreste avere un piano per affrontare errori e scenari problematici. Prendete in considerazione l&rsquo;idea di aggiungere meccanismi automatici per prevenire o risolvere velocemente i problemi che siete in grado di anticipare. Per esempio, se intendete avere un ramo con cambiamenti che non desiderate rilasciare al pubblico, fareste meglio a pensare fin dall&rsquo;inizio alla possibilità che qualcuno possa accidentalmente incorporare quei cambiamenti in un ramo di release. Potete evitare questo particolare problema implementando un hook che prevenga l&rsquo;unione di cambiamenti da rami non appropriati.</para>
   19.45 +    </sect2>
   19.46 +
   19.47 +    <sect2>
   19.48 +      <title>Anarchia informale</title>
   19.49 +
   19.50 +      <para id="x_455">Non vorrei suggerire che un approccio in cui <quote>tutto è permesso</quote> sia qualcosa di sostenibile, ma è un modello che è facile da capire e funziona perfettamente in alcune situazioni inusuali.</para>
   19.51 +
   19.52 +      <para id="x_456">Per esempio, molti progetti hanno un gruppo sparpagliato di collaboratori che si incontrano fisicamente solo di rado. Alcuni gruppi preferiscono superare l&rsquo;isolamento del lavoro a distanza organizzando <quote>maratone</quote> occasionali in cui un certo numero di persone si ritrova insieme in un&rsquo;unico luogo (la stanza delle riunioni di un&rsquo;azienda, la sala delle conferenze in un hotel, posti di questo tipo) e passa diversi giorni più o meno chiuso lì, a lavorare intensamente su una manciata di progetti.</para>
   19.53 +
   19.54 +      <para id="x_457">Una maratona o una sessione di programmazione in un locale sono le occasioni perfette per usare il comando <command role="hg-cmd">hg serve</command>, dato che	<command role="hg-cmd">hg serve</command> non richiede alcuna infrastruttura server elaborata. Potete cominciare a usare <command role="hg-cmd">hg serve</command> in pochi minuti, leggendo la <xref linkend="sec:collab:serve"/> più avanti. Poi vi basta comunicare ai vostri vicini l&rsquo;esistenza di un server in esecuzione, fargli sapere l&rsquo;URL a cui devono collegarsi, e avrete un modo rapido da predisporre per lavorare insieme. Gli altri potranno digitare il vostro URL nel proprio browser e revisionare velocemente i vostri cambiamenti, o estrarre la correzione di un bug dal vostro repository e verificarla, o clonare un ramo contenente una nuova funzione e provarla.</para>
   19.55 +
   19.56 +      <para id="x_458">Il fascino, e allo stesso tempo il problema, di fare le cose ad hoc in questo modo è che solo le persone che sanno dell&rsquo;esistenza dei vostri cambiamenti e sanno dove trovarli possono vederli. Un approccio informale di questo tipo non riesce proprio a scalare oltre una manciata di persone, perché ogni individuo ha bisogno di conoscere <emphasis>n</emphasis> diversi repository da cui estrarre modifiche.</para>
   19.57 +    </sect2>
   19.58 +
   19.59 +    <sect2>
   19.60 +      <title>Un singolo repository centrale</title>
   19.61 +
   19.62 +      <para id="x_459">Per progetti di dimensioni ridotte che stanno migrando da uno strumento centralizzato di controllo di revisione, forse il modo più facile per cominciare è far passare i cambiamenti attraverso un singolo repository centrale condiviso. Questo è anche il più comune <quote>mattone da costruzione</quote> per schemi di workflow più ambiziosi.</para>
   19.63 +
   19.64 +      <para id="x_45a">I collaboratori cominciano clonando una copia di questo repository, potendo estrarne i cambiamenti ogni volta che ne hanno bisogno. Alcuni sviluppatori (forse tutti) hanno il permesso di trasmettere le modifiche al repository quando sono pronte per essere viste da altre persone.</para>
   19.65 +
   19.66 +      <para id="x_45b">In questo modello, può ancora avere senso che alcune persone propaghino i cambiamenti direttamente tra loro, senza passare dal repository centrale. Considerate il caso in cui io ho creato una correzione sperimentale di un bug, ma sono preoccupato che, se la pubblicassi sul repository centrale, tutti gli altri possano successivamente danneggiare i propri alberi nel momento in cui la estraggono. Per ridurre il danno potenziale, posso chiedervi di clonare temporaneamente il mio repository in un vostro repository privato e di collaudare la correzione. Questo ci permette di rimandare la pubblicazione di cambiamenti potenzialmente pericolosi fino a quando non hanno subìto una ragionevole verifica.</para>
   19.67 +
   19.68 +      <para id="x_45c">Se un gruppo sta mantenendo il repository sui propri server in questo tipo di scenario, di solito i membri useranno il protocollo <command>ssh</command> per trasmettere in sicurezza i cambiamenti al repository centrale, come documentato nella <xref linkend="sec:collab:ssh"/>. Di solito, viene anche pubblicata una copia del repository in sola lettura via HTTP, come nella <xref linkend="sec:collab:cgi"/>. Pubblicare via HTTP soddisfa le necessità di chi non ha accesso in scrittura e di chi preferisce usare un browser per navigare la cronologia del repository.</para>
   19.69 +    </sect2>
   19.70 +
   19.71 +    <sect2>
   19.72 +      <title>Un repository centrale su un servizio di hosting</title>
   19.73 +
   19.74 +      <para id="x_6a1">Una caratteristica meravigliosa dei servizi di hosting come	<ulink url="http://bitbucket.org/">Bitbucket</ulink> è che non solo si occupano di gestire i dettagli della configurazione del server, come gli account utente, l&rsquo;autenticazione e i protocolli sicuri di rete, ma offrono anche un&rsquo;infrastruttura aggiuntiva per far funzionare al meglio questo modello.</para>
   19.75 +
   19.76 +      <para id="x_6a2">Per esempio, un servizio di hosting ben ingegnerizzato consentirà agli sviluppatori di clonare le proprie copie di un repository con un singolo clic, in modo da farli lavorare in spazi separati e lasciarli condividere i propri cambiamenti quando sono pronti.</para>
   19.77 +
   19.78 +      <para id="x_6a3">In più, un buon servizio di hosting permetterà ai propri utentei di comunicare tra loro, per esempio per segnalare che <quote>questo albero contiene modifiche pronte per la tua revisione</quote>.</para>
   19.79 +    </sect2>
   19.80 +
   19.81 +    <sect2>
   19.82 +      <title>Lavorare con più rami</title>
   19.83 +
   19.84 +      <para id="x_45d">Qualsiasi progetto di dimensioni significative tende a fare progressi su più fronti contemporaneamente. Nel caso del software, un progetto passa comunemente attraverso una serie di release ufficiali periodiche. Una release potrebbe andare in fase di <quote>manutenzione</quote> per un po&rsquo; dopo la sua prima pubblicazione, finendo per contenere solo correzioni di bug, senza che vengano aggiunte nuove funzioni. Una o più release future potrebbero trovarsi in lavorazione in parallelo a queste revisioni di manutenzione. Normalmente le persone usano il termine <quote>ramo</quote> (in inglese, branch) per indicare una di queste direzioni leggermente differenti in cui lo sviluppo sta procedendo.</para>
   19.85 +
   19.86 +      <para id="x_45e">Mercurial è particolarmente adatto a gestire un certo numero di rami paralleli ma non identici. Ogni <quote>direzione di sviluppo</quote> può vivere nel proprio repository centrale e voi potete unire cambiamenti dall&rsquo;uno all&rsquo;altro repository quando ne avete bisogno. Dato che i repository sono tra loro indipendenti, i cambiamenti instabili in un ramo di sviluppo non avranno mai effetto su un ramo stabile a meno che qualcuno incorpori esplicitamente quei cambiamenti nel ramo stabile.</para>
   19.87 +
   19.88 +      <para id="x_45f">Ecco un esempio di come questo processo può funzionare in pratica. Diciamo che avete un <quote>ramo principale</quote> su un server centrale.</para>
   19.89 +
   19.90 +      &interaction.branching.init;
   19.91 +
   19.92 +      <para id="x_460">Altre persone lo clonano, effettuano modifiche locali, le collaudano e le trasmettono indietro.</para>
   19.93 +
   19.94 +      <para id="x_461">Una volta che il ramo principale raggiunge la milestone (letteralmente, pietra miliare) di una release, potete usare il comando <command role="hg-cmd">hg tag</command> per dare un nome permanente alla revisione di milestone.</para>
   19.95 +
   19.96 +      &interaction.branching.tag;
   19.97 +
   19.98 +      <para id="x_462">Diciamo che alcune modifiche esterne vengono effettuate sul ramo principale.</para>
   19.99 +
  19.100 +      &interaction.branching.main;
  19.101 +
  19.102 +      <para id="x_463">Grazie all&rsquo;etichetta registrata sulla milestone, chi clonerà quel repository in futuro potrà usare <command role="hg-cmd">hg update</command> per ottenere una copia della directory di lavoro nello stato esatto in cui si trovava quando quella revisione etichettata è stata inserita.</para>
  19.103 +
  19.104 +      &interaction.branching.update;
  19.105 +
  19.106 +      <para id="x_464">In più, immediatamente dopo che il ramo principale è stato etichettato, possiamo clonare il ramo principale sul server creando un nuovo ramo <quote>stabile</quote>, anche quello sul server.</para>
  19.107 +
  19.108 +      &interaction.branching.clone;
  19.109 +
  19.110 +      <para id="x_465">Se abbiamo bisogno di fare una modifica al ramo stabile, possiamo clonare <emphasis>quel</emphasis> repository, fare i nostri cambiamenti, effettuarne il commit e trasmetterli indietro a quello stesso repository.</para>
  19.111 +
  19.112 +      &interaction.branching.stable;
  19.113 +
  19.114 +      <para id="x_466">Dato che i repository Mercurial sono indipendenti e che Mercurial non sposta automaticamente i cambiamenti da un repository a un altro, il ramo principale e quello stabile sono <emphasis>isolati</emphasis> tra loro. I cambiamenti che abbiamo fatto al ramo principale non <quote>filtreranno</quote> verso il ramo stabile e viceversa.</para>
  19.115 +
  19.116 +      <para id="x_467">Vorremo spesso che tutte le nostre correzioni di bug nel ramo stabile compaiano anche nel ramo principale. Piuttosto che riscrivere una correzione sul ramo principale, possiamo semplicemente estrarre i cambiamenti dal ramo stabile e unirli a quello principale, così sarà Mercurial a introdurre per noi quelle correzioni di bug.</para>
  19.117 +
  19.118 +      &interaction.branching.merge;
  19.119 +
  19.120 +      <para id="x_468">Il ramo principale conterrà ancora cambiamenti che non sono presenti nel ramo stabile, ma conterrà anche tutte le correzioni di bug provenienti dal ramo stabile. Il ramo stabile non viene toccato da quei cambiamenti, dato che le modifiche stanno passando solo dal ramo stabile a quello principale e non nell&rsquo;altra direzione.</para>
  19.121 +    </sect2>
  19.122 +
  19.123 +    <sect2>
  19.124 +      <title>Rami di funzione</title>
  19.125 +
  19.126 +      <para id="x_469">Per progetti di dimensioni più grandi, un modo efficace per gestire i cambiamenti è quello di dividere un gruppo in piccoli sottogruppi. Ogni sottogruppo gestisce un proprio ramo condiviso, clonato da un singolo ramo <quote>principale</quote> usato dall&rsquo;intero progetto. Le persone che lavorano su un singolo ramo sono tipicamente piuttosto isolate dagli sviluppi che avvengono negli altri rami.</para>
  19.127 +
  19.128 +      <figure id="fig:collab:feature-branches">
  19.129 +	<title>Rami di funzione</title>
  19.130 +	<mediaobject>
  19.131 +	  <imageobject><imagedata width="100%" fileref="figs/feature-branches.png"/></imageobject>
  19.132 +	  <textobject><phrase>XXX add text</phrase></textobject>
  19.133 +	</mediaobject>
  19.134 +      </figure>
  19.135 +
  19.136 +      <para id="x_46b">Quando si ritiene che una funzione particolare sia in una forma appropriata, qualche membro del sottogruppo di quella funzione estrae i cambiamenti dal ramo principale e li unisce al ramo della funzione, poi trasmette le modifiche indietro al ramo principale.</para>
  19.137 +    </sect2>
  19.138 +
  19.139 +    <sect2>
  19.140 +      <title>Il treno delle release</title>
  19.141 +
  19.142 +      <para id="x_46c">L&rsquo;organizzazione di alcuni progetti può ricordare quella di un <quote>treno</quote>: le release sono fissate a intervalli di alcuni mesi e includono tutte le funzioni che sono pronte quando il <quote>treno</quote> è pronto a partire.</para>
  19.143 +
  19.144 +      <para id="x_46d">Questo modello assomiglia all&rsquo;impiego dei rami di funzione, tranne per il fatto che quando un ramo di funzione perde un treno, qualche membro del gruppo di quella funzione estrae i cambiamenti che sono partiti con il treno della release e li unisce al ramo della funzione. Così, il gruppo continua a lavorare partendo da quella release, in modo che la funzione di cui è responsabile possa essere inclusa nella release successiva.</para>
  19.145 +    </sect2>
  19.146 +
  19.147 +    <sect2>
  19.148 +      <title>Il modello del kernel di Linux</title>
  19.149 +
  19.150 +      <para id="x_46e">Il modello di sviluppo del kernel di Linux è caratterizzato da una struttura gerarchica poco profonda circondata da una nuvola di caos apparente. Dato che la maggior parte degli sviluppatori Linux usa <command>git</command>, uno strumento distribuito di controllo di revisione con caratteristiche simili a Mercurial, è utile descrivere come si lavora in quell&rsquo;ambiente in modo che, se le idee vi piacciono, possiate tradurre il metodo da uno strumento all&rsquo;altro.</para>
  19.151 +
  19.152 +      <para id="x_46f">Al centro della comunità siede Linus Torvalds, il creatore di Linux. Linus pubblica un singolo repository di sorgenti che è considerato il ramo <quote>autoritativo</quote> corrente dall&rsquo;intera comunità di sviluppo. Chiunque può clonare l&rsquo;albero di Linus, ma Linus è piuttosto selettivo per quanto riguarda gli alberi da cui estrae le modifiche.</para>
  19.153 +
  19.154 +      <para id="x_470">Linus ha un certo numero di <quote>luogotenenti di fiducia</quote>. Come regola generale, estrae qualunque cambiamento gli trasmettano, nella maggior parte dei casi senza nemmeno revisionare quelle modifiche. Alcuni di quei luogotenenti hanno accettato il ruolo di <quote>manutentori</quote> responsabili di specifici sottosistemi del kernel. Se un programmatore qualsiasi vuole che la propria modifica a un sottosistema del kernel finisca nell&rsquo;albero di Linus, deve trovare il manutentore di quel sottosistema e chiedergli di accettarla. Se il manutentore revisiona le modifiche e accetta di prenderle, le passerà a Linus al momento giusto.</para>
  19.155 +
  19.156 +      <para id="x_471">Ogni singolo luogotenente segue il proprio metodo per revisionare, accettare e pubblicare le modifiche, e per decidere quando passarle a Linus. In più, esistono diversi rami ben noti che vengono usati per scopi differenti. Per esempio, alcune persone mantengono repository <quote>stabili</quote> di vecchie versioni del kernel alle quali applicano correzioni critiche quando è necessario. Alcuni manutentori pubblicano molteplici alberi: uno per modifiche sperimentali, uno per cambiamenti che stanno per passare in alto, e così via. Altri pubblicano semplicemente un singolo albero.</para>
  19.157 +
  19.158 +      <para id="x_472">Questo modello ha due caratteristiche importanti. La prima è quella di essere <quote>a sola estrazione</quote>. Dovete chiedere, convincere, o implorare un altro sviluppatore di prendere una modifica da voi, perché non c&rsquo;è quasi nessun albero a cui più di una persona possa trasmettere e non c&rsquo;è modo di trasmettere cambiamenti a un albero controllato da qualcun altro.</para>
  19.159 +
  19.160 +      <para id="x_473">La seconda è quella di essere basato su reputazione e approvazione. Se siete sconosciuti, Linus probabilmente ignorerà le vostre modifiche senza nemmeno rispondervi. Ma il manutentore di un sottosistema probabilmente le revisionerà e sarà disposto ad accettarle se rispettano i suoi criteri di conformità. Più modifiche <quote>buone</quote> presentate a un manutentore, più è probabile che si fidi del vostro giudizio e accetti i vostri cambiamenti. Se siete ben conosciuti e mantenete un ramo di lunga data per qualcosa che Linus non ha ancora accettato, le persone con interessi simili potranno incorporare regolarmente i vostri cambiamenti per rimanere aggiornati sul vostro lavoro.</para>
  19.161 +
  19.162 +      <para id="x_474">Reputazione e approvazione non oltrepassano necessariamente i confini tecnici e sociali di un sottosistema. Se siete un programmatore rispettato ma specializzato nell&rsquo;ambito della memorizzazione dei dati e provate a correggere un bug relativo all&rsquo;infrastruttura di rete, un manutentore del sottosistema esaminerà minuziosamente quel cambiamento come se fosse stato realizzato da un completo sconosciuto.</para>
  19.163 +
  19.164 +      <para id="x_475">Alle persone che provengono da esperienze con progetti più ordinari, il processo di sviluppo relativamente caotico del kernel di Linux sembra spesso completamente folle: subisce i capricci dei singoli, le persone apportano radicali cambiamenti ogni volta che lo ritengono opportuno e la velocità di sviluppo è sorprendente. Nonostante questo, Linux è un software molto apprezzato e di grande successo.</para>
  19.165 +    </sect2>
  19.166 +
  19.167 +    <sect2>
  19.168 +      <title>Collaborazione in sola lettura o in scrittura condivisa</title>
  19.169 +
  19.170 +      <para id="x_476">Nella comunità open source si tenta continuamente di stabilire, attraverso accese discussioni, se un modello di sviluppo in cui le persone non fanno altro che estrarre cambiamenti le une dalle altre sia <quote>meglio</quote> di un modello in cui più persone possono trasmettere modifiche a un repository condiviso.</para>
  19.171 +
  19.172 +      <para id="x_477">Tipicamente, i sostenitori del modello a scrittura condivisa usano strumenti che impongono attivamente questo approccio. Se state usando uno strumento centralizzato di controllo di revisione come Subversion, non c&rsquo;è alcun modo di scegliere il modello che userete: lo strumento vi fornisce un modello a scrittura condivisa e se volete fare qualcos&rsquo;altro dovete strutturare il vostro metodo al di sopra di quel modello (per esempio, applicando una patch a mano).</para>
  19.173 +
  19.174 +      <para id="x_478">Un buon sistema distribuito di controllo di revisione supporterà entrambi i modelli. Voi e i vostri collaboratori potrete quindi organizzare il modo di lavorare insieme sulla base dei vostri bisogni e delle vostre preferenze, non delle acrobazie a cui vi costringono gli strumenti.</para>
  19.175 +    </sect2>
  19.176 +    <sect2>
  19.177 +      <title>Dove la collaborazione incontra la gestione dei rami</title>
  19.178 +
  19.179 +      <para id="x_479">Una volta che voi e il vostro gruppo avete configurato qualche repository condiviso e cominciato a propagare cambiamenti avanti e indietro tra i repository locali e quelli condivisi, comincerete ad affrontare una sfida correlata ma leggermente differente: quella di gestire le diverse direzioni in cui il vostro gruppo potrebbe muoversi contemporaneamente. Anche se questa materia è intimamente legata al modo in cui il vostro gruppo collabora, è abbastanza densa da meritare una trattazione separata, nel <xref linkend="chap:branch"/>.</para>
  19.180 +    </sect2>
  19.181 +  </sect1>
  19.182 +
  19.183 +  <sect1>
  19.184 +    <title>Il lato tecnico della condivisione</title>
  19.185 +
  19.186 +    <para id="x_47a">Il resto di questo capitolo è dedicato alle questioni tecniche relative alla condivisione dei cambiamenti con i vostri collaboratori.</para>
  19.187 +  </sect1>
  19.188 +
  19.189 +  <sect1 id="sec:collab:serve">
  19.190 +    <title>Condivisione informale con <command role="hg-cmd">hg serve</command></title>
  19.191 +
  19.192 +    <para id="x_47b">Il comando <command role="hg-cmd">hg serve</command> di Mercurial è meravigliosamente adatto per situazioni in cui i gruppi di sviluppo sono piccoli, localizzati e veloci. Rappresenta anche un modo fantastico per familiarizzare con l&rsquo;uso dei comandi Mercurial attraverso la rete.</para>
  19.193 +
  19.194 +    <para id="x_47c">Invocate <command role="hg-cmd">hg serve</command> all&rsquo;interno di un repository e in meno di un secondo verrà avviato un server HTTP specializzato che accetterà connessioni da qualunque client e servirà i dati di quel repository fino a quando non lo spegnerete. Chiunque conosca l&rsquo;URL del server che avete appena avviato e sia in grado di accedere al vostro computer attraverso la rete potrà usare un browser web o lo stesso Mercurial per leggere i dati da quel repository. Un URL corrispondente a un&rsquo;istanza di <command role="hg-cmd">hg serve</command> in esecuzione su un computer portatile somiglierà probabilmente a qualcosa come <literal>http://mio-portatile.local:8000/</literal>.</para>
  19.195 +
  19.196 +    <para id="x_47d">Il comando <command role="hg-cmd">hg serve</command> non è un server web di uso generale, ma può fare solo due cose:</para>
  19.197 +    <itemizedlist>
  19.198 +      <listitem><para id="x_47e">consentire alle persone di usare il proprio browser web per navigare la cronologia del repository che sta servendo;</para>
  19.199 +      </listitem>
  19.200 +      <listitem><para id="x_47f">comunicare attraverso il protocollo di rete di Mercurial, in modo che le persone possano usare comandi come <command role="hg-cmd">hg clone</command> o <command role="hg-cmd">hg pull</command> su quel repository.</para>
  19.201 +      </listitem></itemizedlist>
  19.202 +    <para id="x_480">In particolare, <command role="hg-cmd">hg serve</command> non permetterà agli utenti di <emphasis>modificare</emphasis> il vostro repository, perché è stato pensato per un uso in sola lettura.</para>
  19.203 +
  19.204 +    <para id="x_481">Se avete appena cominciato a lavorare con Mercurial, non c&rsquo;è nulla che vi impedisca di usare <command role="hg-cmd">hg serve</command> per servire i dati di un repository sul vostro computer, poi usare comandi come <command role="hg-cmd">hg clone</command>, <command role="hg-cmd">hg incoming</command>, e così via per comunicare con quel server come se il repository fosse situato su una macchina remota. Questo può aiutarvi a familiarizzare velocemente con l&rsquo;utilizzo dei comandi su repository ospitati in rete.</para>
  19.205 +
  19.206 +    <sect2>
  19.207 +      <title>Alcune cose da tenere a mente</title>
  19.208 +
  19.209 +      <para id="x_482">Dato che <command role="hg-cmd">hg serve</command> fornisce un accesso non autenticato in lettura a tutti i client, dovreste usarlo solo in un ambiente in cui non vi interessa, o potete interamente controllare, chi può accedere alla vostra rete ed estrarre dati dal vostro repository.</para>
  19.210 +
  19.211 +      <para id="x_483">Il comando <command role="hg-cmd">hg serve</command> non sa nulla del firewall che potreste avere installato a protezione del vostro sistema o della vostra rete: non è in grado di scoprire se avete un firewall né di controllarlo. Se altre persone non riescono ad accedere a un&rsquo;istanza di <command role="hg-cmd">hg serve</command> in esecuzione, la seconda cosa che dovreste fare (<emphasis>dopo</emphasis> aver verificato che stiano usando l&rsquo;URL corretto) è controllare la configurazione del vostro firewall.</para>
  19.212 +
  19.213 +      <para id="x_484">Per default, <command role="hg-cmd">hg serve</command> accetta connessioni in entrata sulla porta 8000. Se un altro processo sta già occupando la porta che volete usare, potete specificare una porta differente tramite l&rsquo;opzione <option role="hg-opt-serve">-p</option>.</para>
  19.214 +
  19.215 +      <para id="x_485">Normalmente, quando <command role="hg-cmd">hg serve</command> parte, non stampa alcuna informazione, cosa che potrebbe intimidirvi. Se volete avere una conferma che il comando stia eseguendo correttamente, e volete scoprire l&rsquo;esatto URL che dovreste inviare ai vostri collaboratori, lanciate <command role="hg-cmd">hg serve</command> con l&rsquo;opzione <option role="hg-opt-global">-v</option>.</para>
  19.216 +    </sect2>
  19.217 +  </sect1>
  19.218 +
  19.219 +  <sect1 id="sec:collab:ssh">
  19.220 +    <title>Usare il protocollo di Shell Sicura (ssh)</title>
  19.221 +
  19.222 +    <para id="x_486">Potete estrarre e trasmettere cambiamenti in sicurezza attraverso la rete usando il protocollo di Shell Sicura (<literal>ssh</literal>). Per usarlo con successo, potreste dover sistemare la configurazione sia del lato client che del lato server.</para>
  19.223 +
  19.224 +    <para id="x_487">Se non avete familiarità con ssh, sappiate che è il nome di un comando e di un protocollo di rete che vi permette di comunicare in sicurezza con un altro computer. Per usarlo con Mercurial, dovrete impostare uno o più account utente su un server in maniera che gli utenti remoti possano entrare ed eseguire comandi.</para>
  19.225 +
  19.226 +    <para id="x_488">(Se <emphasis>avete</emphasis> familiarità con ssh, probabilmente una parte del materiale che segue vi sembrerà elementare.)</para>
  19.227 +
  19.228 +    <sect2>
  19.229 +      <title>Come leggere e scrivere URL ssh</title>
  19.230 +
  19.231 +      <para id="x_489">Un URL ssh tende ad avere la forma seguente:</para>
  19.232 +      <programlisting>ssh://bos@hg.serpentine.com:22/hg/libro</programlisting>
  19.233 +      <orderedlist>
  19.234 +	<listitem><para id="x_48a">La parte <quote><literal>ssh://</literal></quote> dice a Mercurial di usare il protocollo ssh.</para>
  19.235 +	</listitem>
  19.236 +	<listitem><para id="x_48b">Il componente <quote><literal>bos@</literal></quote> indica qual è il nome utente con cui accedere al server. Potete ometterlo se il nome utente remoto è uguale al vostro nome utente locale.</para>
  19.237 +	</listitem>
  19.238 +	<listitem><para id="x_48c"><quote><literal>hg.serpentine.com</literal></quote> rappresenta il nome del server a cui accedere.</para>
  19.239 +	</listitem>
  19.240 +	<listitem><para id="x_48d"><quote>:22</quote> idenifica il numero di porta del server a cui connettersi. La porta predefinita è la 22, quindi dovete utilizzare il carattere di due punti e il numero di porta solo se <emphasis>non</emphasis> state usando la porta 22.</para>
  19.241 +	</listitem>
  19.242 +	<listitem><para id="x_48e">Il resto dell&rsquo;URL è il percorso locale del repository sul server.</para>
  19.243 +	</listitem></orderedlist>
  19.244 +
  19.245 +      <para id="x_48f">Si rischia facilmente di fare confusione con il percorso locale contenuto negli URL ssh, dato che gli strumenti non hanno un modo standard per interpretarlo. Alcuni programmi si comportano in modo diverso rispetto ad altri quando operano su questi percorsi. Questa non è una situazione ideale, ma è difficile che possa cambiare, quindi leggete il paragrafo seguente con la dovuta attenzione.</para>
  19.246 +
  19.247 +      <para id="x_490">Mercurial tratta il percorso di un repository sul server come se fosse relativo alla directory personale dell&rsquo;utente remoto. Per esempio, se l&rsquo;utente <literal>foo</literal> possiede una directory personale <filename class="directory">/home/foo</filename> sul server, allora un URL ssh che contiene un percorso <filename class="directory">bar</filename> si riferisce <emphasis>in realtà</emphasis> alla directory <filename class="directory">/home/foo/bar</filename>.</para>
  19.248 +
  19.249 +      <para id="x_491">Se volete specificare un percorso relativo alla directory personale di un altro utente, potete usare un percorso che comincia con un carattere di tilde seguito dal nome utente (chiamiamolo <literal>altroutente</literal>) in questo modo.</para>
  19.250 +      <programlisting>ssh://server/~altroutente/hg/repo</programlisting>
  19.251 +
  19.252 +      <para id="x_492">E se proprio volete specificare un percorso <emphasis>assoluto</emphasis> sul server, iniziate il percorso con due caratteri di slash, come in questo esempio.</para>
  19.253 +      <programlisting>ssh://server//percorso/assoluto</programlisting>
  19.254 +    </sect2>
  19.255 +
  19.256 +    <sect2>
  19.257 +      <title>Trovare un client ssh per il vostro sistema</title>
  19.258 +
  19.259 +      <para id="x_493">Quasi tutti i sistemi di tipo Unix includono un&rsquo;installazione di OpenSSH. Se state usando uno di questi sistemi, eseguite <literal>which ssh</literal> per scoprire se il comando <command>ssh</command> è installato (di solito si trova nella directory <filename class="directory">/usr/bin</filename>). Nell&rsquo;improbabile eventualità in cui non sia presente, date un&rsquo;occhiata alla documentazione del vostro sistema per capire come installarlo.</para>
  19.260 +
  19.261 +      <para id="x_494">Su Windows, il pacchetto TortoiseHg comprende una versione dell&rsquo;eccellente comando <command>plink</command>, realizzato da Simon Tatham, che non dovrebbe avere bisogno di ulteriori configurazioni.</para>
  19.262 +    </sect2>
  19.263 +
  19.264 +    <sect2>
  19.265 +      <title>Generare una coppia di chiavi</title>
  19.266 +
  19.267 +      <para id="x_499">Per evitare di dover ripetutamente digitare una password ogni volta che avete bisogno di usare il vostro client ssh, vi suggerisco di generare una coppia di chiavi.</para>
  19.268 +
  19.269 +      <tip>
  19.270 +	<title>Le coppie di chiavi non sono obbligatorie</title>
  19.271 +
  19.272 +	<para id="x_6a4">Mercurial non sa nulla di autenticazione ssh o coppie di chiavi. Se volete, potete tranquillamente ignorare questa sezione e quella che segue fino a quando non vi stancherete di digitare ripetutamente le password ssh.</para>
  19.273 +      </tip>
  19.274 +
  19.275 +      <itemizedlist>
  19.276 +	<listitem>
  19.277 +	  <para id="x_6a5">Su un sistema di tipo Unix, il comando <command>ssh-keygen</command> dovrebbe servire allo scopo.</para>
  19.278 +    </listitem>
  19.279 +    <listitem>
  19.280 +	  <para id="x_6a6">Per generare una coppia di chiavi su Windows, se state usando TortoiseHg potreste dover scaricare il comando <command>puttygen</command> dal <ulink url="http://www.chiark.greenend.org.uk/~sgtatham/putty">sito web di PuTTY</ulink>. Leggete la <ulink url="http://the.earth.li/~sgtatham/putty/0.60/htmldoc/Chapter8.html#pubkey-puttygen">documentazione di <command>puttygen</command></ulink> per i dettagli su come usare il comando.</para>
  19.281 +	</listitem>
  19.282 +      </itemizedlist>
  19.283 +
  19.284 +      <para id="x_49a">Quando generate una coppia di chiavi, di solito è <emphasis>altamente</emphasis> raccomandabile proteggerla con una frase di accesso chiamata passphrase. (L&rsquo;unico caso in cui potreste non volerlo fare è quando state usando il protocollo ssh per attività automatiche su una rete sicura.)</para>
  19.285 +
  19.286 +      <para id="x_49b">In ogni caso, generare semplicemente la coppia di chiavi non basta, ma dovrete aggiungere la chiave pubblica all&rsquo;insieme di chiavi autorizzate che appartiene a qualsiasi utente vogliate utilizzare per accedere al server remoto. Per i server che usano OpenSSH (la grande maggioranza), questo significa aggiungere la chiave pubblica a una lista contenuta in un file chiamato <filename role="special">authorized_keys</filename> nella directory <filename role="special" class="directory">.ssh</filename> dell&rsquo;utente.</para>
  19.287 +
  19.288 +      <para id="x_49c">Su un sistema di tipo Unix, la vostra chiave pubblica avrà una estensione <filename>.pub</filename>. Se state usando <command>puttygen</command> su Windows, potete salvare la chiave pubblica in un file di vostra scelta, o copiarla dalla finestra in cui è visualizzata e incollarla direttamente nel file <filename role="special">authorized_keys</filename>.</para>
  19.289 +    </sect2>
  19.290 +    <sect2>
  19.291 +      <title>Usare un agente di autenticazione</title>
  19.292 +
  19.293 +      <para id="x_49d">Un agente di autenticazione è un demone che tiene le passphrase in memoria (quindi le dimenticherà se uscite dal sistema e poi rientrate). Un client ssh noterà se un agente è in esecuzione e gli richiederà una passphrase. Se non c&rsquo;è alcun agente di autenticazione attivo, o se l&rsquo;agente non ha memorizzato la passphrase necessaria, dovrete digitare la vostra passphrase ogni volta che Mercurial prova a comunicare con il server per vostro conto (per esempio, ogni volta che estraete o trasmettete cambiamenti).</para>
  19.294 +
  19.295 +      <para id="x_49e">Lo svantaggio di memorizzare le passphrase in un agente è che un aggressore ben preparato sarebbe in grado di recuperare il testo in chiaro delle vostre passphrase, a volte anche se il vostro sistema è stato riavviato. Dovreste giudicare da voi se questo è un rischio che potete correre. Di certo, un agente vi permette di risparmiare tempo evitandovi di digitare ripetutamente sempre lo stesso testo.</para>
  19.296 +
  19.297 +      <itemizedlist>
  19.298 +	<listitem>
  19.299 +	  <para id="x_49f">Su sistemi di tipo Unix, l&rsquo;agente è chiamato <command>ssh-agent</command> e spesso viene eseguito automaticamente quando entrate nel sistema. Dovrete usare il comando <command>ssh-add</command> per aggiungere una nuova passphrase alla memoria dell&rsquo;agente.</para>
  19.300 +	</listitem>
  19.301 +	<listitem>
  19.302 +	  <para id="x_6a7">Su Windows, se state usando TortoiseHg, il comando <command>pageant</command> funziona come un agente. Come con <command>puttygen</command>, avrete bisogno di <ulink url="http://www.chiark.greenend.org.uk/%7Esgtatham/putty/download.html">scaricare <command>pageant</command></ulink> dal sito web di PuTTY e di leggere <ulink url="http://the.earth.li/~sgtatham/putty/0.60/htmldoc/Chapter9.html#pageant">la sua documentazione</ulink>. Il comando <command>pageant</command> aggiunge alla vostra area di notifica un&rsquo;icona che vi permetterà di gestire le passphrase memorizzate.</para>
  19.303 +	</listitem>
  19.304 +      </itemizedlist>
  19.305 +    </sect2>
  19.306 +
  19.307 +    <sect2>
  19.308 +      <title>Configurare adeguatamente il server</title>
  19.309 +
  19.310 +      <para id="x_4a0">Dato che ssh può essere complicato da configurare se non siete esperti, un certo numero di cose potrebbero andare storte. Aggiungete Mercurial a tutto questo, e le possibilità di fare confusione aumenteranno ulteriormente. La maggior parte di questi potenziali problemi si presenta sul lato server, non sul lato client. La buona notizia è che, una volta che avete una configurazione funzionante, di solito continuerà a funzionare indefinitamente.</para>
  19.311 +
  19.312 +      <para id="x_4a1">Prima di provare a usare Mercurial per comunicare con un server ssh, è preferibile che vi assicuriate di poter usare i normali comandi <command>ssh</command> o <command>putty</command> per contattare il server. Se incontrate problemi usando direttamente questi comandi, Mercurial sicuramente non funzionerà e in più nasconderà il problema sottostante. Ogni volta che avete un problema relativo a ssh con Mercurial, per cominciare dovreste accertarvi nuovamente che i semplici comandi ssh lato client funzionino <emphasis>prima</emphasis> di preoccuparvi di eventuali problemi con Mercurial.</para>
  19.313 +
  19.314 +      <para id="x_4a2">La prima cosa di cui accertarsi sul lato server è che siate in grado di entrare nel sistema da un&rsquo;altra macchina. Se non potete usare <command>ssh</command> o <command>putty</command> per entrare, il messaggio di errore che vi viene mostrato potrebbe darvi alcuni suggerimenti per capire che cosa non va. I problemi più comuni sono i seguenti.</para>
  19.315 +      <itemizedlist>
  19.316 +	<listitem><para id="x_4a3">Se l&rsquo;errore è di tipo <quote>connection refused</quote> (connessione rifiutata), questo significa che non c&rsquo;è alcun demone ssh in esecuzione sul server, o che il server è inaccessibile a causa della configurazione del firewall.</para>
  19.317 +	</listitem>
  19.318 +	<listitem><para id="x_4a4">Se l&rsquo;errore è di tipo <quote>no route to host</quote> (macchina remota non raggiungibile), questo significa che avete un indirizzo sbagliato per il server o un firewall con impostazioni talmente restrittive da impedirgli di vedere il server.</para>
  19.319 +	</listitem>
  19.320 +	<listitem><para id="x_4a5">Se l&rsquo;errore è di tipo <quote>permission denied</quote> (permesso negato), potreste aver digitato in maniera inesatta il nome utente sul server, o la passphrase della vostra chiave, o la password dell&rsquo;utente remoto.</para>
  19.321 +	</listitem></itemizedlist>
  19.322 +      <para id="x_4a6">Riepilogando, se avete problemi di comunicazione con il demone ssh del server, per prima cosa assicuratevi che ne esista uno in esecuzione. Su molti sistemi sarà installato ma disabilitato per default. Una volta che avete compiuto questo passo, dovreste controllare che il firewall del server sia configurato per consentire connessioni in entrata verso la porta su cui il demone ssh si trova in ascolto (di solito, la 22). Non preoccupatevi di altri errori di configurazione più esotici fino a quando non avete controllato questi due.</para>
  19.323 +
  19.324 +      <para id="x_4a7">Se state usando un agente di autenticazione sul lato client per memorizzare le passphrase per le vostre chiavi, dovreste essere in grado di accedere al server senza che vi vengano chieste una passphrase o una password. Se vi viene comunque richiesta una passphrase, ecco alcune possibili cause.</para>
  19.325 +      <itemizedlist>
  19.326 +	<listitem><para id="x_4a8">Potreste aver dimenticato di usare <command>ssh-add</command> o <command>pageant</command> per memorizzare la passphrase.</para>
  19.327 +	</listitem>
  19.328 +	<listitem><para id="x_4a9">Potreste aver memorizzato la passphrase per la chiave sbagliata.</para>
  19.329 +	</listitem></itemizedlist>
  19.330 +      <para id="x_4aa">Se vi viene richiesta la password per l&rsquo;utente remoto, ecco altri possibili cause.</para>
  19.331 +      <itemizedlist>
  19.332 +	<listitem><para id="x_4ab">La directory personale dell&rsquo;utente o la sua directory <filename role="special" class="directory">.ssh</filename> potrebbero avere permessi eccessivamente liberali. Come risultato, il demone ssh non si fiderà dei contenuti del file <filename role="special">authorized_keys</filename> e quindi non lo leggerà. Per esempio, una directory personale o una directory <filename role="special" class="directory">.ssh</filename> con il permesso di scrittura di gruppo abilitato causerà spesso questo effetto.</para>
  19.333 +	</listitem>
  19.334 +	<listitem><para id="x_4ac">Il file <filename role="special">authorized_keys</filename> dell&rsquo;utente potrebbe avere un problema. Se l&rsquo;utente non è l&rsquo;unico proprietario del file o qualcun altro può scrivere sul file, il demone ssh non si fiderà dei suoi contenuti e quindi non lo leggerà.</para>
  19.335 +	</listitem></itemizedlist>
  19.336 +
  19.337 +      <para id="x_4ad">In un mondo ideale, dovreste essere in grado di eseguire il comando seguente con successo e ottenere come risultato la stampa di una riga contenente la data e l&rsquo;ora correnti.</para>
  19.338 +      <programlisting>ssh mioserver date</programlisting>
  19.339 +
  19.340 +      <para id="x_4ae">Se gli script di accesso sul vostro server stampano messaggi informativi o altri tipi di testo anche quando eseguite comandi non interattivi come questo, dovreste correggerli prima di continuare, in modo che stampino solo se vengono eseguiti interattivamente. Altrimenti, questi messaggi come minimo confonderanno le stampe di Mercurial e nel caso peggiore potrebbero causare problemi durante l&rsquo;esecuzione remota dei comandi Mercurial. Mercurial prova a individuare e ignorare questi messaggi durante le sessioni <command>ssh</command> non interattive, ma non è infallibile. (Se state modificando i vostri script di accesso sul vostro server, potete vedere se uno script di accesso viene eseguito in una shell interattiva controllando il codice restituito dal comando <literal>tty -s</literal>.)</para>
  19.341 +
  19.342 +      <para id="x_4af">Dopo aver verificato che il buon vecchio ssh stia funzionando con il vostro server, il passo successivo è quello di assicurarsi che Mercurial sia in esecuzione sul server. Il comando seguente dovrebbe terminare con successo:</para>
  19.343 +
  19.344 +      <programlisting>ssh mioserver hg version</programlisting>
  19.345 +
  19.346 +      <para id="x_4b0">Se vedete un messaggio di errore invece del normale risultato di <command role="hg-cmd">hg version</command>, di solito questo accade perché non avete installato Mercurial in <filename class="directory">/usr/bin</filename>. Se questo è il caso, non preoccupatevi: non avete bisogno di farlo. Ma dovreste controllare alcuni possibili problemi.</para>
  19.347 +      <itemizedlist>
  19.348 +	<listitem><para id="x_4b1">Mercurial è veramente installato sul server? So che sembra una cosa ovvia, ma vale la pena di controllare!</para>
  19.349 +	</listitem>
  19.350 +	<listitem><para id="x_4b2">Forse il percorso di ricerca della vostra shell (solitamente impostato attraverso la variabile d&rsquo;ambiente <envar>PATH</envar>) è semplicemente configurato male.</para>
  19.351 +	</listitem>
  19.352 +	<listitem><para id="x_4b3">Forse la vostra variabile d&rsquo;ambiente <envar>PATH</envar> è impostata per puntare all&rsquo;ubicazione dell&rsquo;eseguibile <command>hg</command> solo se l&rsquo;accesso avviene tramite una sessione interattiva. Questo può capitare se state impostando il percorso nello script di accesso sbagliato. Leggete la documentazione della vostra shell per i dettagli.</para>
  19.353 +	</listitem>
  19.354 +	<listitem><para id="x_4b4">La variabile d&rsquo;ambiente <envar>PYTHONPATH</envar> potrebbe aver bisogno di contenere il percorso ai moduli Python di Mercurial. Potrebbe non essere per niente impostata, potrebbe essere sbagliata, o potrebbe venire impostata solo se l&rsquo;accesso è interattivo.</para>
  19.355 +	</listitem></itemizedlist>
  19.356 +
  19.357 +      <para id="x_4b5">Se riuscite a eseguire <command role="hg-cmd">hg version</command> attraverso una connessione ssh, ben fatto! Siete riusciti a configurare il client e il server. Ora dovreste essere in grado di usare Mercurial per accedere ai repository ospitati da quel nome utente su quel server. Se a questo punto incontrate qualche problema con Mercurial e ssh, provate a usare l&rsquo;opzione <option role="hg-opt-global">--debug</option> per avere un&rsquo;immagine più chiara di quello che sta succedendo.</para>
  19.358 +    </sect2>
  19.359 +    <sect2>
  19.360 +      <title>Usare la compressione con ssh</title>
  19.361 +
  19.362 +      <para id="x_4b6">Mercurial non comprime i dati quando usa il protocollo ssh, perché il protocollo ssh può comprimere i dati in maniera trasparente. Tuttavia, il comportamento predefinito dei client ssh è quello di <emphasis>non</emphasis> richiedere la compressione.</para>
  19.363 +
  19.364 +      <para id="x_4b7">Su qualsiasi rete diversa da una LAN veloce (persino una rete wireless), è probabile che l&rsquo;uso della compressione velocizzi significativamente le operazioni di rete di Mercurial. Per esempio, qualcuno ha misurato che la compressione riduce il tempo necessario per creare un repository particolarmente grande attraverso una WAN da 51 minuti a 17 minuti.</para>
  19.365 +
  19.366 +      <para id="x_4b8">Sia <command>ssh</command> che <command>plink</command> richiedono l&rsquo;opzione <option role="cmd-opt-ssh">-C</option> per attivare la compressione. Potete facilmente modificare il vostro file <filename role="special">~/.hgrc</filename> in modo da abilitare la compressione per tutti gli utilizzi del protocollo ssh da parte di Mercurial. Per esempio, ecco come fare per l&rsquo;ordinario comando <command>ssh</command> sui sistemi di tipo Unix.</para>
  19.367 +      <programlisting>[ui]
  19.368 +ssh = ssh -C</programlisting>
  19.369 +
  19.370 +      <para id="x_4b9">Se usate <command>ssh</command> su un sistema di tipo Unix, potete configurarlo per usare sempre la compressione quando comunicate con il vostro server. Per fare questo, modificate il vostro file <filename role="special">.ssh/config</filename> (che potrebbe anche non esistere) come segue.</para>
  19.371 +
  19.372 +      <programlisting>Host hg
  19.373 +  Compression yes
  19.374 +  HostName hg.example.com</programlisting>
  19.375 +
  19.376 +      <para id="x_4ba">Questo definisce l&rsquo;alias <literal>hg</literal> per il nome della macchina. Quando usate l&rsquo;alias sulla riga di comando <command>ssh</command> o in un URL ssh di Mercurial, <command>ssh</command> si connetterà a <literal>hg.example.com</literal> e userà la compressione. In questo modo, potete ottenere sia un nome più corto da digitare sia la compressione, che dal canto loro sono entrambe buone cose.</para>
  19.377 +    </sect2>
  19.378 +  </sect1>
  19.379 +
  19.380 +  <sect1 id="sec:collab:cgi">
  19.381 +    <title>Condividere i dati attraverso HTTP usando CGI</title>
  19.382 +
  19.383 +    <para id="x_6a8">Il modo più semplice per condividere uno o più repository in modo permanente è quello di usare un server web e il supporto CGI di Mercurial.</para>
  19.384 +
  19.385 +    <para id="x_4bb">A seconda di quanto siete ambiziosi, configurare l&rsquo;interfaccia CGI di Mercurial può portarvi via da pochi minuti a diverse ore.</para>
  19.386 +
  19.387 +    <para id="x_4bc">Cominceremo con il più semplice degli esempi per poi farci strada verso una configurazione più complessa. Persino nel caso più semplice, quasi certamente finirete per avere bisogno di leggere e modificare la configurazione del vostro server web.</para>
  19.388 +
  19.389 +    <note>
  19.390 +      <title>Si richiede alta sopportazione del dolore</title>
  19.391 +
  19.392 +      <para id="x_4bd">Configurare un server web è un&rsquo;attività complessa, intricata e altamente dipendente dal sistema. Non mi sarebbe possibile darvi istruzioni che coprano tutti i casi che incontrerete. Quindi, usate il vostro discernimento e il vostro giudizio nel leggere le sezioni che seguono. Siate preparati a commettere molti errori e a passare molto tempo a leggere il registro degli errori del vostro server.</para>
  19.393 +
  19.394 +      <para id="x_6a9">Se non avete uno stomaco abbastanza forte da aggiustare continuamente le configurazioni, o un bisogno impellente di gestire i vostri servizi, potreste voler provare uno dei servizi di hosting pubblici che ho menzionato in precedenza.</para>
  19.395 +    </note>
  19.396 +
  19.397 +    <sect2>
  19.398 +      <title>Lista di controllo per la configurazione di un server web</title>
  19.399 +
  19.400 +      <para id="x_4be">Prima di proseguire, prendetevi qualche momento per controllare alcuni aspetti delle impostazioni del vostro sistema.</para>
  19.401 +
  19.402 +      <orderedlist>
  19.403 +	<listitem><para id="x_4bf">Avete un server web installato? Mac OS X e alcune distribuzioni Linux includono Apache, ma molti altri sistemi potrebbero non avere un server web già installato.</para>
  19.404 +	</listitem>
  19.405 +	<listitem><para id="x_4c0">Se avete un server web installato, è davvero in esecuzione? Sulla maggior parte dei sistemi, anche se un server web è presente, sarà disabilitato per default.</para>
  19.406 +	</listitem>
  19.407 +	<listitem><para id="x_4c1">Il vostro server è configurato per consentirvi di eseguire programmi CGI nella directory dove pianificate di farlo? La maggior parte delle impostazioni di partenza dei server disabilitano esplicitamente la possibilità di eseguire programmi CGI.</para>
  19.408 +	</listitem></orderedlist>
  19.409 +
  19.410 +      <para id="x_4c2">Se non avete un server web installato e non avete una considerevole esperienza nel configurare Apache, dovreste considerare l&rsquo;uso del server web <literal>lighttpd</literal> invece di Apache. Le configurazioni di Apache hanno la reputazione ben meritata di essere complicate e di confondere gli utenti. Sebbene Apache sia dotato di un numero maggiore di funzioni rispetto a <literal>lighttpd</literal>, buona parte di queste funzioni non è rilevante per servire repository Mercurial. E <literal>lighttpd</literal> è innegabilmente <emphasis>molto</emphasis> più facile da affrontare di Apache.</para>
  19.411 +    </sect2>
  19.412 +
  19.413 +    <sect2>
  19.414 +      <title>Configurazione CGI di base</title>
  19.415 +
  19.416 +      <para id="x_4c3">Su sistemi di tipo Unix, di solito gli utenti hanno una sottodirectory con un nome simile a <filename class="directory">public_html</filename> nella propria directory personale da cui possono servire pagine web. Un file chiamato <filename>foo</filename> in questa directory sarà accessibile tramite un URL della forma <literal>http://www.example.com/~nomeutente/foo</literal>.</para>
  19.417 +
  19.418 +      <para id="x_4c4">Per cominciare, prendete lo script <filename role="special">hgweb.cgi</filename> che dovrebbe essere presente nella vostra installazione di Mercurial. Se non riuscite a trovarne velocemente una copia sul vostro sistema, scaricatela da uno dei principali repository di Mercurial all&rsquo;indirizzo <ulink url="http://www.selenic.com/repo/hg/raw-file/tip/hgweb.cgi">http://www.selenic.com/repo/hg/raw-file/tip/hgweb.cgi</ulink>.</para>
  19.419 +
  19.420 +      <para id="x_4c5">Dovrete copiare questo script nella vostra directory <filename class="directory">public_html</filename> e assicurarvi che sia eseguibile.</para>
  19.421 +      <programlisting>cp .../hgweb.cgi ~/public_html
  19.422 +chmod 755 ~/public_html/hgweb.cgi</programlisting>
  19.423 +      <para id="x_4c6">L&rsquo;argomento <literal>755</literal> passato a <command>chmod</command> ha un effetto un po&rsquo; più generale rispetto a quello di rendere lo script eseguibile: garantisce che lo script sia eseguibile da chiunque e che i permessi di scrittura per il <quote>gruppo</quote> e gli <quote>altri</quote> <emphasis>non</emphasis> siano concessi. Se lasciaste abilitati quei permessi, probabilmente il sottosistema <literal>suexec</literal> di Apache si rifiuterebbe di eseguire lo script. In effetti, <literal>suexec</literal> insiste sul fatto che anche la <emphasis>directory</emphasis> in cui risiede lo script non sia modificabile da altri.</para>
  19.424 +      <programlisting>chmod 755 ~/public_html</programlisting>
  19.425 +
  19.426 +      <sect3 id="sec:collab:wtf">
  19.427 +	<title>Che cosa <emphasis>potrebbe</emphasis> andare storto?</title>
  19.428 +
  19.429 +	<para id="x_4c7">Una volta che avete copiato lo script CGI al suo posto, aprite un browser web e provate a visitare l&rsquo;URL <literal>http://nomemacchina/~nomeutente/hgweb.cgi</literal>, <emphasis>ma</emphasis> raccogliete le forze per affrontare un fallimento immediato. C&rsquo;è un&rsquo;alta probabilità che la visita a questo URL fallisca e ci sono molte possibili ragioni per questo. In effetti, probabilmente vi imbatterete in quasi tutti i possibili errori descritti più avanti, quindi leggete attentamente. Quelli che seguono sono tutti i problemi che ho incontrato sul sistema operativo Fedora 7, con un&rsquo;installazione vergine di Apache e un account utente creato espressamente per effettuare questo esercizio.</para>
  19.430 +
  19.431 +	<para id="x_4c8">Il vostro server web potrebbe aver disabilitato le directory di pubblicazione per utente. Se state usando Apache, cercate la direttiva <literal>UserDir</literal> nel vostro file di configurazione. Se non è presente, o se è presente ma il suo valore è <literal>disabled</literal>, allora le directory per utente sono disabilitate. Altrimenti, la stringa che segue <literal>UserDir</literal> è il nome della sottodirectory della vostra directory personale che verrà letta da Apache, per esempio <filename class="directory">public_html</filename>.</para>
  19.432 +
  19.433 +	<para id="x_4c9">I vostri permessi di accesso ai file potrebbero essere troppo restrittivi. Il server web deve essere in grado di attraversare la vostra directory personale e le directory contenute nella vostra directory <filename class="directory">public_html</filename>, nonché di leggere i file in essa contenuti. Ecco una ricetta veloce per aiutarvi a rendere i vostri permessi più appropriati.</para>
  19.434 +	<programlisting>chmod 755 ~
  19.435 +find ~/public_html -type d -print0 | xargs -0r chmod 755
  19.436 +find ~/public_html -type f -print0 | xargs -0r chmod 644</programlisting>
  19.437 +
  19.438 +	<para id="x_4ca">L&rsquo;altra possibilità di errore con i permessi è che potreste ottenere una finestra completamente vuota quando provate a caricare lo script. In questo caso, è probabile che i vostri permessi di accesso siano <emphasis>troppo permissivi</emphasis>. Per esempio, il sottosistema <literal>suexec</literal> di Apache non eseguirà uno script che può essere modificato dal gruppo o dagli altri.</para>
  19.439 +
  19.440 +	<para id="x_4cb">Il vostro server web potrebbe essere configurato per disabilitare l&rsquo;esecuzione di programmi CGI nella vostra directory di pubblicazione per utente. Ecco la configurazione per utente predefinita di Apache sul mio sistema Fedora.</para>
  19.441 +
  19.442 +	&ch06-apache-config.lst;
  19.443 +
  19.444 +	<para id="x_4cc">Se trovate un gruppo <literal>Directory</literal> simile a questo nella vostra configurazione di Apache, la direttiva da cercare in questo gruppo si chiama <literal>Options</literal>. Aggiungete <literal>ExecCGI</literal> alla fine di questa lista, se non è già presente, e riavviate il server web.</para>
  19.445 +
  19.446 +	<para id="x_4cd">Se vedete che Apache vi restituisce il testo dello script CGI invece di eseguirlo, potreste dover attivare (se è già presente) o aggiungere una direttiva come questa.</para>
  19.447 +	<programlisting>AddHandler cgi-script .cgi</programlisting>
  19.448 +
  19.449 +	<para id="x_4ce">Può anche capitare che vi venga restituita una traccia colorata dello stack di esecuzione di Python dove l&rsquo;interprete afferma di non poter importare un modulo relativo a <literal>mercurial</literal>. Questo è un concreto passo in avanti! Il server ora è in grado di eseguire il vostro script CGI. Questo errore può accadere soltanto se state eseguendo un&rsquo;installazione privata di Mercurial invece di un&rsquo;installazione di sistema. Ricordate che il server web esegue il programma CGI senza alcuna variabile d&rsquo;ambiente che date per scontata in una sessione interattiva. Se vi capita questo errore, aprite la vostra copia di <filename role="special">hgweb.cgi</filename> e seguite le indicazioni che trovate per impostare correttamente la vostra variabile d&rsquo;ambiente <envar>PYTHONPATH</envar>.</para>
  19.450 +
  19.451 +	<para id="x_4cf">Infine, otterrete <emphasis>sicuramente</emphasis> un&rsquo;altra traccia colorata dello stack di esecuzione di Python: questa volta l&rsquo;interprete si lamenterà di non poter trovare <filename class="directory">/path/to/repository</filename>. Modificate il vostro script <filename role="special">hgweb.cgi</filename> per sostituire la stringa <filename class="directory">/path/to/repository</filename> con il percorso completo del repository che volete condividere.</para>
  19.452 +
  19.453 +	<para id="x_4d0">A questo punto, quando provate a ricaricare la pagina, vi si dovrebbe presentare una gradevole vista HTML della cronologia del vostro repository. Whew!</para>
  19.454 +      </sect3>
  19.455 +
  19.456 +      <sect3>
  19.457 +	<title>Configurare lighttpd</title>
  19.458 +
  19.459 +	<para id="x_4d1">Per completare i miei esperimenti, ho provato a configurare il sempre più popolare server web <literal>lighttpd</literal> per condividere lo stesso repository come appena descritto nel caso di Apache. Avevo già superato tutti i problemi illustrati con Apache, molti dei quali non sono dovuti a uno specifico server. Come risultato, ero piuttosto sicuro che i miei permessi per i file e le directory fossero corretti e che il mio script <filename role="special">hgweb.cgi</filename> fosse adeguatamente modificato.</para>
  19.460 +
  19.461 +	<para id="x_4d2">Una volta messo in esecuzione Apache, riuscire a condividere il repository tramite <literal>lighttpd</literal> è stato un attimo (in altre parole, anche se state provando a usare <literal>lighttpd</literal>, dovreste leggere la sezione su Apache). Per prima cosa ho dovuto modificare la sezione <literal>mod_access</literal> del suo file di configurazione per abilitare <literal>mod_cgi</literal> e <literal>mod_userdir</literal>, che erano entrambi disabilitati per default sul mio sistema. Poi ho aggiunto alcune righe alla fine del file di configurazione per configurare questi moduli.</para>
  19.462 +	<programlisting>userdir.path = "public_html"
  19.463 +cgi.assign = (".cgi" =&gt; "" )</programlisting>
  19.464 +	<para id="x_4d3">Fatto questo, <literal>lighttpd</literal> ha funzionato immediatamente. Se avessi configurato <literal>lighttpd</literal> prima di Apache, mi sarei quasi certamente imbattuto negli stessi problemi di configurazione a livello di sistema incontrati con Apache. Tuttavia, ho trovato <literal>lighttpd</literal> notevolmente più facile da configurare di Apache, anche se ho usato Apache per più di una decade e questa è stata la mia prima esperienza con <literal>lighttpd</literal>.</para>
  19.465 +      </sect3>
  19.466 +    </sect2>
  19.467 +
  19.468 +    <sect2>
  19.469 +      <title>Condividere più repository con un solo script CGI</title>
  19.470 +
  19.471 +      <para id="x_4d4">Lo script <filename role="special">hgweb.cgi</filename> ha una fastidiosa restrizione che vi permette solo di pubblicare un singolo repository. Se volete pubblicarne più di uno senza complicarvi la vita con molteplici copie dello stesso script, ognuna con un nome diverso, la scelta migliore è quella di usare lo script <filename role="special">hgwebdir.cgi</filename>.</para>
  19.472 +
  19.473 +      <para id="x_4d5">La procedura per configurare <filename role="special">hgwebdir.cgi</filename> è solo leggermente più complicata di quella per <filename role="special">hgweb.cgi</filename>. Per prima cosa, dovete ottenere una copia dello script. Se non ne avete una sottomano, potete scaricala dal repository principale di Mercurial all&rsquo;indirizzo <ulink url="http://www.selenic.com/repo/hg/raw-file/tip/hgwebdir.cgi">http://www.selenic.com/repo/hg/raw-file/tip/hgwebdir.cgi</ulink>.</para>
  19.474 +
  19.475 +      <para id="x_4d6">Dovrete copiare questo script nella vostra directory <filename class="directory">public_html</filename> e assicurarvi che sia eseguibile.</para>
  19.476 +
  19.477 +      <programlisting>cp .../hgwebdir.cgi ~/public_html
  19.478 +chmod 755 ~/public_html ~/public_html/hgwebdir.cgi</programlisting>
  19.479 +
  19.480 +      <para id="x_4d7">Una volta effettuata questa configurazione di base, provando a visitare <literal>http://nomemacchina/~nomeutente/hgwebdir.cgi</literal> con il vostro browser, dovreste vedere una lista di repository vuota. Se ottenete una finestra bianca o un messaggio di errore, provate a ripercorrere la lista di possibili problemi già vista nella <xref linkend="sec:collab:wtf"/>.</para>
  19.481 +
  19.482 +      <para id="x_4d8">Lo script <filename role="special">hgwebdir.cgi</filename> si basa su un file di configurazione esterno. Per default, cerca un file chiamato <filename role="special">hgweb.config</filename> nella stessa directory in cui si trova. Dovrete creare questo file e renderlo leggibile agli altri. Il formato di questo file è simile a quello di un file <quote>ini</quote> di Windows, riconoscibile dal modulo <literal>ConfigParser</literal> <citation><xref linkend="bib:cp"/></citation> di Python.</para>
  19.483 +
  19.484 +      <para id="x_4d9">Il modo più facile di configurare <filename role="special">hgwebdir.cgi</filename> è tramite una sezione chiamata <literal>collections</literal> che vi consentirà di pubblicare automaticamente <emphasis>tutti</emphasis> i repository contenuti nelle directory che nominate. La sezione dovrebbe somigliare a questa:</para>
  19.485 +      <programlisting>[collections]
  19.486 +/mia/radice = /mia/radice</programlisting>
  19.487 +      <para id="x_4da">Mercurial la interpreta guardando al nome della directory sul lato <emphasis>destro</emphasis> del segno <quote><literal>=</literal></quote>, individuando i repository nella gerarchia contenuta in quella directory e usando il testo sul lato <emphasis>sinistro</emphasis> per eliminare il testo corrispondente dai nomi che elencherà effettivamente nell&rsquo;interfaccia web. I componenti del percorso che rimangono dopo questa eliminazione formano un <quote>percorso virtuale</quote>.</para>
  19.488 +
  19.489 +      <para id="x_4db">Dato l&rsquo;esempio precedente, se abbiamo un repository il cui percorso locale è <filename class="directory">/mia/radice/questo/repository</filename>, lo script CGI eliminerà la parte <filename class="directory">/mia/radice</filename> iniziale dal nome e pubblicherà il repository con il percorso virtuale <filename class="directory">questo/repository</filename>. Se l&rsquo;URL per il nostro script CGI è <literal>http://nomemacchina/~nomeutente/hgwebdir.cgi</literal>, l&rsquo;URL completo per quel repository sarà <literal>http://nomemacchina/~nomeutente/hgwebdir.cgi/questo/repository</literal>.</para>
  19.490 +
  19.491 +      <para id="x_4dc">Se sostituiamo <filename class="directory">/mia/radice</filename> sul lato sinstro di questo esempio con <filename class="directory">/mia</filename>, allora <filename role="special">hgwebdir.cgi</filename> eliminerà solo <filename class="directory">/mia</filename> dal nome del repository e ci darà il percorso virtuale <filename class="directory">radice/questo/repository</filename> invece di	<filename class="directory">questo/repository</filename>.</para>
  19.492 +
  19.493 +      <para id="x_4dd">Lo script <filename role="special">hgwebdir.cgi</filename> cercherà i repository ricorsivamente in ogni directory elencata nella sezione <literal>collections</literal> del suo file di configurazione, ma <emphasis>non</emphasis> navigherà ricorsivamente nei repository che trova.<footnote><para id="x_ff3">[NdT] A partire dalla versione 1.3, Mercurial supporta i repository innestati.</para></footnote></para>
  19.494 +
  19.495 +      <para id="x_4de">Il meccanismo delle collezioni nella sezione <literal>collections</literal> facilita la pubblicazione di molti repository in modalità <quote>spara e dimentica</quote>. Dovete impostare lo script CGI e il file di configurazione una volta sola, dopodiché potete pubblicare o ritirare un repository in ogni momento semplicemente spostandolo dentro o fuori dalla gerarchia di directory in cui <filename role="special">hgwebdir.cgi</filename> è configurato per guardare.</para>
  19.496 +
  19.497 +      <sect3>
  19.498 +	<title>Specificare esplicitamente quali repository pubblicare</title>
  19.499 +
  19.500 +	<para id="x_4df">In aggiunta al meccanismo basato su <literal>collections</literal>, lo script <filename role="special">hgwebdir.cgi</filename> vi consente di pubblicare una lista specifica di repository. Per fare questo, create una sezione <literal>paths</literal> con un contenuto simile al seguente.</para>
  19.501 +	<programlisting>[paths]
  19.502 +repo1 = /mio/percorso/vero/qualche/repository
  19.503 +repo2 = /qualche/percorso/verso/un/altro</programlisting>
  19.504 +	<para id="x_4e0">In questo caso, il percorso virtuale (il componente che apparirà in un URL) è sul lato sinistro di ogni definizione, mentre il percorso del repository è sulla destra. Notate che non c&rsquo;è bisogno che esista  alcuna relazione tra il percorso virtuale che scegliete e l&rsquo;ubicazione di un repository sul vostro file system.</para>
  19.505 +
  19.506 +	<para id="x_4e1">Se lo desiderate, potete usare entrambe le sezioni	  <literal>collections</literal> e <literal>paths</literal> contemporaneamente in un unico file di configurazione.</para>
  19.507 +
  19.508 +	<note>
  19.509 +	  <title>Fate attenzione ai percorsi virtuali duplicati</title>
  19.510 +
  19.511 +	  <para id="x_4e2">Se diversi repository hanno lo stesso percorso virtuale, <filename role="special">hgwebdir.cgi</filename> non segnalerà un errore, ma si comporterà in maniera imprevedibile.</para>
  19.512 +	</note>
  19.513 +      </sect3>
  19.514 +    </sect2>
  19.515 +
  19.516 +    <sect2>
  19.517 +      <title>Scaricare gli archivi dei sorgenti</title>
  19.518 +
  19.519 +      <para id="x_4e3">L&rsquo;interfaccia web di Mercurial permette agli utenti di scaricare un archivio di qualsiasi revisione. Questo archivio conterrà la fotografia della directory di lavoro scattata su quella revisione, ma non conterrà una copia dei dati del repository.</para>
  19.520 +
  19.521 +      <para id="x_4e4">Per default, questa funzione è disabilitata. Per abilitarla, dovrete aggiungere un elemento <envar role="rc-item-web">allow_archive</envar> alla sezione <literal role="rc-web">web</literal> del vostro file <filename role="special">~/.hgrc</filename> come spiegato in dettaglio nella prossima sezione.</para>
  19.522 +    </sect2>
  19.523 +    <sect2>
  19.524 +      <title>Le opzioni di configurazione web</title>
  19.525 +
  19.526 +      <para id="x_4e5">Le interfacce web di Mercurial (il comando <command role="hg-cmd">hg serve</command> e gli script <filename role="special">hgweb.cgi</filename> e <filename role="special">hgwebdir.cgi</filename>) hanno un certo numero di opzioni di configurazione che potete impostare. Queste opzioni appartengono a una sezione chiamata <literal role="rc-web">web</literal>.</para>
  19.527 +      <itemizedlist>
  19.528 +	<listitem><para id="x_4e6"><envar role="rc-item-web">allow_archive</envar>: Determina qual è (e se c&rsquo;è) il meccanismo di scaricamento che viene supportato da Mercurial. Se abilitate questa funzione, gli utenti dell&rsquo;interfaccia web saranno in grado di scaricare un archivio di qualsiasi revisione stiano visitando nel repository. Per abilitare la funzione di archivio, questo elemento deve prendere la forma di una sequenza di parole scelte dalla lista seguente.</para>
  19.529 +	  <itemizedlist>
  19.530 +	    <listitem><para id="x_4e7"><literal>bz2</literal>: un archivio <command>tar</command>, compresso usando la compressione <literal>bzip2</literal>. Questo formato ha il miglior rapporto di compressione, ma usa più tempo di CPU sul server.</para>
  19.531 +	    </listitem>
  19.532 +	    <listitem><para id="x_4e8"><literal>gz</literal>: un archivio <command>tar</command>, compresso usando la compressione <literal>gzip</literal>.</para>
  19.533 +	    </listitem>
  19.534 +	    <listitem><para id="x_4e9"><literal>zip</literal>: un archivio <command>zip</command>, compresso usando la compressione LZW. Questo formato ha il peggior rapporto di compressione, ma è largamente usato nel mondo Windows.</para>
  19.535 +	    </listitem>
  19.536 +	  </itemizedlist>
  19.537 +	  <para id="x_4ea">Se fornite una lista vuota o se non avete una voce <envar role="rc-item-web">allow_archive</envar>, questa funzione sarà disabilitata. Ecco un esempio di come abilitare tutti e tre i formati supportati.</para>
  19.538 +	  <programlisting>[web]
  19.539 +allow_archive = bz2 gz zip</programlisting>
  19.540 +	</listitem>
  19.541 +	<listitem><para id="x_4eb"><envar role="rc-item-web">allowpull</envar>: booleano. Determina se l&rsquo;interfaccia web permette agli utenti remoti di usare i comandi <command role="hg-cmd">hg pull</command> e <command role="hg-cmd">hg clone</command> su questo repository via HTTP. Se impostato a <literal>no</literal> o a <literal>false</literal>, solo la parte <quote>orientata agli umani</quote> dell&rsquo;interfaccia web sarà disponibile.</para>
  19.542 +	</listitem>
  19.543 +	<listitem><para id="x_4ec"><envar role="rc-item-web">contact</envar>: stringa. Una stringa di testo libero (ma preferibilmente breve) che identifica la persona o il gruppo responsabile del repository. Questa stringa contiene spesso il nome e l&rsquo;indirizzo email di una persona o di una mailing list. Spesso ha senso inserire questa voce nel file <filename role="special">.hg/hgrc</filename> del singolo repository, ma può anche avere senso utilizzarla in un file <filename role="special">~/.hgrc</filename> globale se tutti i repository hanno un singolo manutentore.</para>
  19.544 +	</listitem>
  19.545 +	<listitem><para id="x_4ed"><envar role="rc-item-web">maxchanges</envar>: intero. Il numero massimo predefinito di changeset da visualizzare in una singola pagina web.</para>
  19.546 +	</listitem>
  19.547 +	<listitem><para id="x_4ee"><envar role="rc-item-web">maxfiles</envar>: intero. Il numero massimo predefinito di file modificati da visualizzare in una singola pagina web.</para>
  19.548 +	</listitem>
  19.549 +	<listitem><para id="x_4ef"><envar role="rc-item-web">stripes</envar>: intero. Se l&rsquo;interfaccia web mostra strisce a colori alternati per rendere più facile l&rsquo;allineamento visuale delle righe quando state guardando una tabella, questo numero controlla il numero di righe in ogni striscia.</para>
  19.550 +	</listitem>
  19.551 +	<listitem><para id="x_4f0"><envar role="rc-item-web">style</envar>: controlla il template usato da Mercurial per visualizzare l&rsquo;interfaccia web. Mercurial include diversi template web.</para>
  19.552 +	  <itemizedlist>
  19.553 +	    <listitem>
  19.554 +	      <para id="x_6aa"><literal>coal</literal> è monocromatico.</para>
  19.555 +	    </listitem>
  19.556 +	    <listitem>
  19.557 +	      <para id="x_6ab"><literal>gitweb</literal> emula lo stile visivo dell&rsquo;interfaccia web di git.</para>
  19.558 +	    </listitem>
  19.559 +	    <listitem>
  19.560 +	      <para id="x_6ac"><literal>monoblue</literal> usa blu e grigi uniformi.</para>
  19.561 +	    </listitem>
  19.562 +	    <listitem>
  19.563 +	      <para id="x_6ad"><literal>paper</literal> è il template predefinito.</para>
  19.564 +	    </listitem>
  19.565 +	    <listitem>
  19.566 +	      <para id="x_6ae"><literal>spartan</literal> è stato il template predefinito per lungo tempo.</para>
  19.567 +	    </listitem>
  19.568 +	  </itemizedlist>
  19.569 +	  <para id="x_6af">Potete anche specificare un vostro template personalizzato, come vedrete in dettaglio nel <xref linkend="chap:template"/>. Qui potete vedere come abilitare lo stile <literal>gitweb</literal>.</para>
  19.570 +	  <programlisting>[web]
  19.571 +style = gitweb</programlisting>
  19.572 +	</listitem>
  19.573 +	<listitem><para id="x_4f1"><envar role="rc-item-web">templates</envar>: percorso. La directory in cui cercare i file di template. Per default, Mercurial li cerca nella directory in cui è stato installato.</para>
  19.574 +	</listitem></itemizedlist>
  19.575 +      <para id="x_4f2">Se state usando <filename role="special">hgwebdir.cgi</filename>, potete inserire gli elementi di configurazione <envar role="rc-item-web">motd</envar> e <envar role="rc-item-web">style</envar> nella sezione <literal role="rc-web">web</literal> del file <filename role="special">hgweb.config</filename> invece che nel file <filename role="special">~/.hgrc</filename>, nel caso lo troviate più conveniente.</para>
  19.576 +
  19.577 +      <sect3>
  19.578 +	<title>Opzioni specifiche per un singolo repository</title>
  19.579 +
  19.580 +	<para id="x_4f3">Alcuni elementi di configurazione della sezione <literal role="rc-web">web</literal> dovrebbero essere inseriti nel file <filename role="special">.hg/hgrc</filename> locale di un repository piuttosto che nel file <filename role="special">~/.hgrc</filename> globale o di un utente.</para>
  19.581 +	<itemizedlist>
  19.582 +	  <listitem><para id="x_4f4"><envar role="rc-item-web">description</envar>: stringa. Una stringa di testo libero (ma preferibilmente breve) che descrive i contenuti o lo scopo del repository.</para>
  19.583 +	  </listitem>
  19.584 +	  <listitem><para id="x_4f5"><envar role="rc-item-web">name</envar>: stringa. Il nome da usare per il repository nell&rsquo;interfaccia web. Questo rimpiazza il nome predefinito, che è l&rsquo;ultimo componente del percorso di un repository.</para>
  19.585 +	  </listitem></itemizedlist>
  19.586 +      </sect3>
  19.587 +
  19.588 +      <sect3>
  19.589 +	<title>Opzioni specifiche per il comando <command role="hg-cmd">hg serve</command></title>
  19.590 +
  19.591 +	<para id="x_4f6">Alcuni degli elementi nella sezione <literal role="rc-web">web</literal> di un file <filename role="special">~/.hgrc</filename> possono essere usati solo con il comando <command role="hg-cmd">hg serve</command>.</para>
  19.592 +	<itemizedlist>
  19.593 +	  <listitem><para id="x_4f7"><envar role="rc-item-web">accesslog</envar>: percorso. Il nome di un file in cui tenere un registro degli accessi. Normalmente, il comando <command role="hg-cmd">hg serve</command> scrive queste informazioni sul canale di uscita predefinito, non su un file. Le voci del registro vengono scritte nel formato <quote>combinato</quote> che è uno standard usato da quasi tutti i server web.</para>
  19.594 +	  </listitem>
  19.595 +	  <listitem><para id="x_4f8"><envar role="rc-item-web">address</envar>: stringa. L&rsquo;indirizzo locale su cui il server dovrebbe essere in ascolto per le connessioni in entrata. Per default, il server è in ascolto su tutti gli indirizzi.</para>
  19.596 +	  </listitem>
  19.597 +	  <listitem><para id="x_4f9"><envar role="rc-item-web">errorlog</envar>: percorso. Il nome di un file in cui tenere un registro degli errori. Normalmente, il comando <command role="hg-cmd">hg serve</command> scrive queste informazioni sul canale di uscita predefinito, non su un file.</para>
  19.598 +	  </listitem>
  19.599 +	  <listitem><para id="x_4fa"><envar role="rc-item-web">ipv6</envar>: booleano. Indica se usare il protocollo IPv6. Per default, IPv6 non viene usato.</para>
  19.600 +	  </listitem>
  19.601 +	  <listitem><para id="x_4fb"><envar role="rc-item-web">port</envar>: intero. Il numero di porta TCP su cui il server dovrebbe essere in ascolto. Il numero di porta predefinito è 8000.</para>
  19.602 +	  </listitem></itemizedlist>
  19.603 +      </sect3>
  19.604 +
  19.605 +      <sect3>
  19.606 +	<title>Scegliere il giusto file <filename role="special">~/.hgrc</filename> a cui aggiungere elementi della sezione <literal role="rc-web">web</literal></title>
  19.607 +
  19.608 +	<para id="x_4fc">&Egrave; importante ricordare che un server web come Apache o <literal>lighttpd</literal> sarà in esecuzione sotto l&rsquo;identità di un utente diverso dal vostro. Anche gli script CGI eseguiti dal vostro server, come <filename role="special">hgweb.cgi</filename>, verranno solitamente eseguiti sotto quell&rsquo;identità.</para>
  19.609 +
  19.610 +	<para id="x_4fd">Se aggiungete elementi della sezione <literal role="rc-web">web</literal> al vostro file <filename role="special">~/.hgrc</filename> personale, gli script CGI non potranno leggere quel file <filename role="special">~/.hgrc</filename>. Quelle impostazioni quindi avranno effetto solo sul comportamento del comando <command role="hg-cmd">hg serve</command> quando sarete voi a eseguirlo. Per fare in modo che gli script CGI vedano le vostre impostazioni, create un file <filename role="special">~/.hgrc</filename> nella directory personale dell&rsquo;utente la cui identità viene usata per eseguire il vostro server web, oppure aggiungete quelle impostazioni a un file <filename role="special">hgrc</filename> di sistema.</para>
  19.611 +      </sect3>
  19.612 +    </sect2>
  19.613 +  </sect1>
  19.614 +
  19.615 +  <sect1>
  19.616 +    <title>Configurazione di sistema</title>
  19.617 +
  19.618 +    <para id="x_6b0">Sui sistemi di tipo Unix condivisi da molteplici utenti (come un server su cui le persone pubblicano i propri cambiamenti) ha spesso senso impostare alcuni comportamenti globali predefiniti, come il tema grafico da usare nell&rsquo;interfaccia web.</para>
  19.619 +
  19.620 +    <para id="x_6b1">Se il file <filename>/etc/mercurial/hgrc</filename> esiste, Mercurial lo leggerà all&rsquo;avvio e applicherà ogni impostazione di configurazione trovata in quel file. Cercherà anche i file il cui nome termina con l&rsquo;estensione <literal>.rc</literal> in una directory chiamata <filename>/etc/mercurial/hgrc.d</filename> e applicherà le impostazioni di configurazione trovate in ognuno di quei file.</para>
  19.621 +
  19.622 +    <sect2>
  19.623 +      <title>Rendere Mercurial meno prevenuto</title>
  19.624 +
  19.625 +      <para id="x_6b2">Un file <filename>hgrc</filename> globale può essere utile nella situazione in cui gli utenti stanno estraendo cambiamenti posseduti da altri utenti. Per default, Mercurial non si fida della maggior parte degli elementi di configurazione contenuti nel file <filename>.hg/hgrc</filename> all&rsquo;interno di un repository che è posseduto da un utente differente. Se cloniamo o estraiamo i cambiamenti da un repository di questo tipo, Mercurial stamperà un avvertimento dicendo che non si fida dei dati nel file <filename>.hg/hgrc</filename> di quel repository.</para>
  19.626 +
  19.627 +      <para id="x_6b3">Se tutti i membri di uno specifico gruppo Unix fanno parte dello stesso gruppo di sviluppo e <emphasis>dovrebbero</emphasis> fidarsi l&rsquo;uno delle impostazioni di configurazione dell&rsquo;altro, o se vogliamo fidarci di alcuni utenti particolari, possiamo rimpiazzare il comportamento guardingo predefinito di Mercurial creando un file <filename>hgrc</filename> di sistema come il seguente:</para>
  19.628 +
  19.629 +    <programlisting># Salva questo file con un nome tipo /etc/mercurial/hgrc.d/trust.rc
  19.630 +[trusted]
  19.631 +# Fidati di tutte le voci in qualsiasi file hgrc posseduto
  19.632 +# dai gruppi "editors" o "www-data"
  19.633 +groups = editors, www-data
  19.634 +
  19.635 +# Fidati delle voci nei file hgrc posseduti dai seguenti utenti.
  19.636 +users = apache, bobo
  19.637 +</programlisting>
  19.638 +    </sect2>
  19.639 +  </sect1>
  19.640 +</chapter>
    20.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    20.2 +++ b/it/ch07-filenames.xml	Fri Sep 04 16:33:35 2009 +0200
    20.3 @@ -0,0 +1,215 @@
    20.4 +<chapter id="chap:names">
    20.5 +  <?dbhtml filename="nomi-di-file-e-corrispondenze-di-pattern.html"?>
    20.6 +  <title>Nomi di file e corrispondenze di pattern</title>
    20.7 +
    20.8 +  <para id="x_543">Mercurial fornisce meccanismi che vi permettono di lavorare con i nomi dei file in modo coerente ed espressivo.</para>
    20.9 +
   20.10 +  <sect1>
   20.11 +    <title>Denominazione semplice dei file</title>
   20.12 +
   20.13 +    <para id="x_544">A livello di implementazione, Mercurial usa un unico meccanismo per gestire i nomi dei file. Tutti i comandi si comportano in maniera uniforme rispetto ai nomi dei file e lavorano nel modo seguente.</para>
   20.14 +
   20.15 +    <para id="x_545">Se indicate esplicitamente nomi di file esistenti sulla riga di comando, Mercurial lavora esattamente con quei file, come vi aspettereste.</para>
   20.16 +
   20.17 +    &interaction.filenames.files;
   20.18 +
   20.19 +    <para id="x_546">Quando fornite un nome di directory, Mercurial interpreterà questa azione come la volontà di <quote>operare su tutti i file in questa directory e nelle sue sottodirectory</quote>. Mercurial considera i file e le sottodirectory in una directory secondo l&rsquo;ordine alfabetico. Quando incontra una sottodirectory, attraverserà quella sottodirectory prima di continuare con la directory corrente.</para>
   20.20 +
   20.21 +    &interaction.filenames.dirs;
   20.22 +  </sect1>
   20.23 +
   20.24 +  <sect1>
   20.25 +    <title>Eseguire comandi senza nomi di file</title>
   20.26 +
   20.27 +    <para id="x_547">I comandi Mercurial che lavorano con i nomi di file assumono un utile comportamento predefinito quando li invocate senza passare alcun nome di file o pattern. Il comportamento che dovreste aspettarvi dipende dalla funzione del comando. Ecco alcune regole pratiche che potete usare per predire quello che un comando probabilmente farà se non gli date alcun nome con cui lavorare.</para>
   20.28 +    <itemizedlist>
   20.29 +      <listitem><para id="x_548">La maggior parte dei comandi opererà sull&rsquo;intera directory di lavoro. Per esempio, questo è quello che fa il comando <command role="hg-cmd">hg add</command>.</para>
   20.30 +      </listitem>
   20.31 +      <listitem><para id="x_549">Se gli effetti di un comando sono difficili o impossibili da invertire, sarete obbligati a fornirgli esplicitamente almeno un nome o un pattern (si veda più avanti). Questo vi protegge, per esempio, dalla cancellazione accidentale dei file causata da un&rsquo;esecuzione di <command role="hg-cmd">hg remove</command> senza argomenti.</para>
   20.32 +      </listitem></itemizedlist>
   20.33 +
   20.34 +    <para id="x_54a">Se questi comportamenti predefiniti non vi soddisfano, è facile aggirarli. Se normalmente un comando opera sull&rsquo;intera directory di lavoro, potete passargli il nome <quote><filename class="directory">.</filename></quote> per invocarlo solo sulla directory corrente e sulle sue sottodirectory.</para>
   20.35 +
   20.36 +    &interaction.filenames.wdir-subdir;
   20.37 +
   20.38 +    <para id="x_54b">Sulla stessa falsariga, alcuni comandi normalmente stampano nomi di file relativi alla radice del repository anche quando li invocate da una sottodirectory. Questi comandi stamperanno nomi di file relativi alla vostra sottodirectory se passate loro nomi espliciti. Qui di seguito eseguiremo <command role="hg-cmd">hg status</command> da una sottodirectory e lo faremo agire sull&rsquo;intera directory di lavoro pur stampando nomi di file relativi alla nostra sottodirectory, passandogli il risultato del comando <command role="hg-cmd">hg root</command>.</para>
   20.39 +
   20.40 +      &interaction.filenames.wdir-relname;
   20.41 +  </sect1>
   20.42 +
   20.43 +  <sect1>
   20.44 +    <title>Mercurial vi dice cosa sta succedendo</title>
   20.45 +
   20.46 +    <para id="x_54c">L&rsquo;esempio di <command role="hg-cmd">hg add</command> nella sezione precedente illustra qualcos&rsquo;altro che è utile sapere sui comandi Mercurial. Se un comando opera su un file che non avete nominato esplicitamente sulla riga di comando, di solito stamperà il nome del file in modo che non veniate sorpresi da quello che sta succedendo.</para>
   20.47 +
   20.48 +    <para id="x_54d">In questo caso, Mercurial segue il principio della <emphasis>minima sorpresa</emphasis>. Se avete fornito il nome esatto di un file sulla riga di comando, non ha senso ripetervelo. Se Mercurial sta agendo <emphasis>implicitamente</emphasis> su un file, per esempio perché non avete fornito alcun nome, o su una directory, o su un pattern (si veda più avanti), ritiene sia più sicuro farvi sapere su quali file sta lavorando.</para>
   20.49 +
   20.50 +    <para id="x_54e">Potete ridurre al silenzio i comandi che si comportano in questo modo usando l&rsquo;opzione <option role="hg-opt-global">-q</option>. Potete anche dire loro di stampare il nome di tutti i file, anche quelli che avete nominato esplicitamente, usando l&rsquo;opzione <option role="hg-opt-global">-v</option>.</para>
   20.51 +  </sect1>
   20.52 +
   20.53 +  <sect1>
   20.54 +    <title>Usare i pattern per identificare i file</title>
   20.55 +
   20.56 +    <para id="x_54f">Oltre a lavorare con i nomi di file e directory, Mercurial vi consente di usare i <emphasis>pattern</emphasis> per identificare i file. La gestione dei pattern da parte di Mercurial è espressiva.</para>
   20.57 +
   20.58 +    <para id="x_550">Su sistemi di tipo Unix (Linux, Mac OS X, etc.), di solito è la shell che si occupa di trovare le corrispondenze tra i pattern e i nomi dei file. Su questi sistemi, dovete esplicitamente dire a Mercurial che un nome è un pattern. Su Windows, la shell non si occupa di espandere i pattern, quindi Mercurial identificherà automaticamente i nomi che sono pattern e li espanderà per voi.</para>
   20.59 +
   20.60 +    <para id="x_551">Per fornire un pattern al posto di un nome ordinario sulla riga di comando, il meccanismo è semplice:</para>
   20.61 +    <programlisting>sintassi:corpodelpattern</programlisting>
   20.62 +    <para id="x_552">Quindi, un pattern viene identificato da una breve stringa di testo che indica il tipo del pattern, seguita dai due punti, seguiti dall&rsquo;effettivo pattern.</para>
   20.63 +
   20.64 +    <para id="x_553">Mercurial supporta due tipi di sintassi per i pattern. Quello usato più spesso è chiamato <literal>glob</literal>: è lo stesso tipo di pattern usato dalla shell Unix e dovrebbe essere familiare anche agli utenti del prompt dei comandi di Windows.</para>
   20.65 +
   20.66 +    <para id="x_554">Quando Mercurial effettua la corrispondenza automatica di un pattern su Windows, usa la sintassi <literal>glob</literal>. Quindi, potete omettere il prefisso <quote><literal>glob:</literal></quote> su Windows, ma se volete potete anche usarlo tranquillamente.</para>
   20.67 +
   20.68 +    <para id="x_555">La sintassi <literal>re</literal> è più potente perché vi permette di specificare i pattern usando le espressioni regolari, indicate a volte con il termine regexp.</para>
   20.69 +
   20.70 +    <para id="x_556">Notate che, negli esempi che seguono, farò molta attenzione a racchiudere tutti i miei pattern tra caratteri di apice, in modo che non vengano espansi dalla shell prima che Mercurial li veda.</para>
   20.71 +
   20.72 +    <sect2>
   20.73 +      <title>I pattern <literal>glob</literal> sullo stile della shell</title>
   20.74 +
   20.75 +      <para id="x_557">Questa è un&rsquo;introduzione ai tipi di pattern che potete usare quando state cercando una corrispondenza con un pattern di tipo glob.</para>
   20.76 +
   20.77 +      <para id="x_558">Il carattere <quote><literal>*</literal></quote> corrisponde a qualsiasi stringa all&rsquo;interno di una singola directory.</para>
   20.78 +
   20.79 +      &interaction.filenames.glob.star;
   20.80 +
   20.81 +      <para id="x_559">Il pattern <quote><literal>**</literal></quote> corrisponde a qualsiasi stringa e attraversa i confini delle directory. Non è un simbolo di tipo glob standard su Unix, ma viene accettato da diverse shell Unix popolari ed è molto utile.</para>
   20.82 +
   20.83 +      &interaction.filenames.glob.starstar;
   20.84 +
   20.85 +      <para id="x_55a">Il pattern <quote><literal>?</literal></quote> corrisponde a qualsiasi carattere singolo.</para>
   20.86 +
   20.87 +      &interaction.filenames.glob.question;
   20.88 +
   20.89 +      <para id="x_55b">Il carattere <quote><literal>[</literal></quote> comincia una <emphasis>classe di caratteri</emphasis>. Questo pattern corrisponde a qualsiasi carattere compreso nella classe. La classe viene terminata da un carattere <quote><literal>]</literal></quote>. Una classe può contenere molteplici <emphasis>intervalli</emphasis> della forma <quote><literal>a-f</literal></quote>, che è una abbreviazione per <quote><literal>abcdef</literal></quote>.</para>
   20.90 +
   20.91 +      &interaction.filenames.glob.range;
   20.92 +
   20.93 +      <para id="x_55c">Se il primo carattere dopo <quote><literal>[</literal></quote> in una classe di caratteri è <quote><literal>!</literal></quote>, si ottiene l&rsquo;effetto di <emphasis>negare</emphasis> la classe, facendola corrispondere a qualsiasi carattere non compreso nella classe.</para>
   20.94 +
   20.95 +      <para id="x_55d">Un carattere <quote><literal>{</literal></quote> comincia un gruppo di sottopattern, che trova una corrispondenza se un qualsiasi sottopattern nel gruppo trova una corrispondenza. Il carattere <quote><literal>,</literal></quote> separa i sottopattern e il carattere <quote><literal>}</literal></quote> termina il gruppo.</para>
   20.96 +
   20.97 +      &interaction.filenames.glob.group;
   20.98 +
   20.99 +      <sect3>
  20.100 +	<title>Fate attenzione!</title>
  20.101 +
  20.102 +	<para id="x_55e">Non dimenticate che, se volete trovare corrispondenze a un pattern in qualsiasi directory, non dovreste usare il simbolo <quote><literal>*</literal></quote>, dato che questo troverà corrispondenze solo in una directory, ma dovreste usare il simbolo <quote><literal>**</literal></quote>. Questo piccolo esempio illustra la differenza tra i due.</para>
  20.103 +
  20.104 +	  &interaction.filenames.glob.star-starstar;
  20.105 +      </sect3>
  20.106 +    </sect2>
  20.107 +
  20.108 +    <sect2>
  20.109 +      <title>Corrispondenze di espressioni regolari con i pattern <literal>re</literal></title>
  20.110 +
  20.111 +      <para id="x_55f">Mercurial accetta la stessa sintassi per le espressioni regolari che viene usata dal linugaggio di programmazione Python (usa internamente il motore di regexp di Python). Questa sintassi è basata su quella del linguaggio Perl, che è il dialetto più popolare attualmente in uso (è anche utilizzato in Java, per esempio).</para>
  20.112 +
  20.113 +      <para id="x_560">Non discuterò alcun dettaglio del dialetto di regexp di Mercurial in questo libro, dato che le espressioni regolari non vengono usate molto spesso. Le regexp in stile Perl sono comunque già documentate in maniera esauriente su una moltitudine di siti web e in numerosi libri. Invece, qui mi concentrerò su alcune cose che dovreste sapere se vi trovate ad aver bisogno di usare le espressioni regolari con Mercurial.</para>
  20.114 +
  20.115 +      <para id="x_561">Un&rsquo;espressione regolare cerca una corrispondenza con un intero nome di file, relativo alla radice del repository. In altre parole, anche se siete già nella sottodirectory <filename class="directory">foo</filename>, se volete una corrispondenza con i file in questa directory il vostro pattern dovrà cominciare con <quote><literal>foo/</literal></quote>.</para>
  20.116 +
  20.117 +      <para id="x_562">Una cosa da notare, se avete familiarità con le regexp in stile Perl, è che le espressioni regolari di Mercurial sono <emphasis>vincolate</emphasis>, nel senso che un&rsquo;espressione regolare cerca una corrispondenza partendo sempre dall&rsquo;inizio di una stringa e non da altre posizioni all&rsquo;interno della stringa. Per cercare una corrispondenza in qualsiasi punto della stringa, il vostro pattern deve cominciare con <quote><literal>.*</literal></quote>.</para>
  20.118 +    </sect2>
  20.119 +  </sect1>
  20.120 +
  20.121 +  <sect1>
  20.122 +    <title>Filtrare i file</title>
  20.123 +
  20.124 +    <para id="x_563">Mercurial non vi fornisce solo una varietà di modi per specificare i file, ma vi permette di vagliare ulteriormente quei file usando i <emphasis>filtri</emphasis>. I comandi che lavorano con i nomi dei file accettano due opzioni di filtraggio.</para>
  20.125 +    <itemizedlist>
  20.126 +      <listitem><para id="x_564">L&rsquo;opzione <option role="hg-opt-global">-I</option>, o <option role="hg-opt-global">--include</option>, vi permette di specificare un pattern a cui i nomi dei file devono corrispondere per poter essere elaborati.</para>
  20.127 +      </listitem>
  20.128 +      <listitem><para id="x_565">L&rsquo;opzione <option role="hg-opt-global">-X</option>, o <option role="hg-opt-global">--exclude</option>, vi fornisce un modo per <emphasis>evitare</emphasis> di elaborare i file che corrispondono a questo pattern.</para>
  20.129 +      </listitem></itemizedlist>
  20.130 +    <para id="x_566">Potete passare più opzioni <option role="hg-opt-global">-I</option> e <option role="hg-opt-global">-X</option> sulla riga di comando e alternarle come preferite. Mercurial interpreta i pattern che riceve usando la sintassi glob per default (ma potete usare le espressioni regolari se ne avete bisogno).</para>
  20.131 +
  20.132 +    <para id="x_567">Potete interpretare un filtro <option role="hg-opt-global">-I</option> come una richiesta di <quote>elaborare solo i file che corrispondono a questo filtro</quote>.</para>
  20.133 +
  20.134 +    &interaction.filenames.filter.include;
  20.135 +
  20.136 +    <para id="x_568">L&rsquo;interpretazione migliore del filtro <option role="hg-opt-global">-X</option> è quella di una richiesta di <quote>elaborare solo i file che non corrispondono a questo pattern</quote>.</para>
  20.137 +
  20.138 +    &interaction.filenames.filter.exclude;
  20.139 +  </sect1>
  20.140 +
  20.141 +  <sect1>
  20.142 +    <title>Ignorare permanentemente file e directory indesiderate</title>
  20.143 +
  20.144 +    <para id="x_569">Quando create un nuovo repository, è possibile che nel tempo cresca fino a contenere file che <emphasis>non</emphasis> dovrebbero essere gestiti da Mercurial, ma che non vorreste vedere elencati ogni volta che invocate <command>hg status</command>. Per esempio, i <quote>prodotti di assemblaggio</quote> sono file che vengono creati come parte dell&rsquo;assemblaggio di un progetto ma che non dovrebbero essere gestiti da un sistema di controllo di revisione. I prodotti di assemblaggio più comuni sono i file di elaborazione generati da strumenti software come i compilatori. Un altro esempio sono i file di bloccaggio, i file di lavoro temporanei e i file di backup che gli editor di testo disseminano per le directory e che non ha alcun senso gestire.</para>
  20.145 +
  20.146 +    <para id="x_6b4">Per fare in modo che Mercurial ignori permanentemente quei file, create un file chiamato <filename>.hgignore</filename> alla radice del vostro repository. <emphasis>Dovreste</emphasis> registrare questo file tramite <command>hg add</command> in modo che Mercurial ne tenga traccia insieme al resto dei contenuti del vostro repository, dato che anche i vostri collaboratori potrebbero trovarlo utile.</para>
  20.147 +
  20.148 +    <para id="x_6b5">Mercurial si aspetta che il file <filename>.hgignore</filename> contenga una lista di espressioni regolari, una per riga. Le righe vuote vengono saltate. La maggior parte delle persone preferisce descrivere i file che vuole ignorare utilizzando la sintassi <quote>glob</quote> che abbiamo descritto in precedenza, quindi un tipico file <filename>.hgignore</filename> comincerà con questa direttiva:</para>
  20.149 +
  20.150 +    <programlisting>syntax: glob</programlisting>
  20.151 +
  20.152 +    <para id="x_6b6">Questa riga dice a Mercurial di interpretare le righe che seguono come pattern di tipo glob, non espressioni regolari.</para>
  20.153 +
  20.154 +    <para id="x_6b7">Ecco un esempio di un tipico file <filename>.hgignore</filename>.</para>
  20.155 +
  20.156 +    <programlisting>syntax: glob
  20.157 +# Questa riga è un commento e verrà saltata.
  20.158 +# Anche le righe vuote vengono saltate.
  20.159 +
  20.160 +# File di backup lasciati dall'editor Emacs.
  20.161 +*~
  20.162 +
  20.163 +# File di bloccaggio usati dall'editor Emacs.
  20.164 +# Notate che il carattere "#" è preceduto da un backslash.
  20.165 +# Questo evita che venga interpretato come l'inizio di un commento.
  20.166 +.\#*
  20.167 +
  20.168 +# File temporanei usati dall'editor vim.
  20.169 +.*.swp
  20.170 +
  20.171 +# Un file nascosto creato dal Finder di Mac OS X.
  20.172 +.DS_Store
  20.173 +</programlisting>
  20.174 +  </sect1>
  20.175 +
  20.176 +  <sect1 id="sec:names:case">
  20.177 +    <title>Sensibilità alle maiuscole</title>
  20.178 +
  20.179 +    <para id="x_56a">Se state lavorando in un ambiente di sviluppo misto che contiene sia sistemi Linux (o di tipo Unix) che Mac e Windows, dovreste tenere a mente che questi sistemi trattano le lettere maiuscole (<quote>N</quote> rispetto a <quote>n</quote>) nei nomi dei file in modi incompatibili tra loro. &Egrave; improbabile che questo abbia effetti su di voi ed è facile occuparsene quando succede, ma potrebbe sorprendervi se non lo sapete.</para>
  20.180 +
  20.181 +    <para id="x_56b">I sistemi operativi e i file system differiscono nel modo in cui gestiscono le <emphasis>maiuscole</emphasis> dei caratteri nei nomi di file e directory. Esistono tre modi comuni di gestire le maiuscole nei nomi.</para>
  20.182 +    <itemizedlist>
  20.183 +      <listitem><para id="x_56c">Completa insensibilità alle maiuscole. Le versioni maiuscole e minuscole di una lettera sono trattate come se fossero identiche, sia quando un file viene creato sia durante i successivi accessi. Questo è il funzionamento comune dei vecchi sistemi basati su DOS.</para>
  20.184 +      </listitem>
  20.185 +      <listitem><para id="x_56d">Conservazione delle maiuscole, ma insensibilità a esse. Quando un file o una directory vengono creati, le maiuscole nel loro nome vengono memorizzate e possono essere recuperate e visualizzate dal sistema operativo. Quando un file esistente viene cercato, le maiuscole nel suo nome vengono ignorate. Questa è la situazione standard su Windows e MacOS. I nomi <filename>foo</filename> e <filename>FoO</filename> identificano lo stesso file. Questo trattamento intercambiabile delle lettere maiuscole e minuscole è anche chiamato <emphasis>ripiegamento delle maiuscole</emphasis> (in inglese, case folding).</para>
  20.186 +      </listitem>
  20.187 +      <listitem><para id="x_56e">Sensibilità alle maiuscole. Le lettere maiuscole di un nome sono significative in ogni momento. I nomi <filename>foo</filename> e <filename>FoO</filename> identificano due file differenti. Questo è il modo in cui i sistemi Linux e Unix lavorano normalmente.</para>
  20.188 +      </listitem></itemizedlist>
  20.189 +
  20.190 +    <para id="x_56f">Su sistemi di tipo Unix è possibile avere uno qualsiasi o tutti e tre i modi di gestire le maiuscole in azione allo stesso tempo. Per esempio, se usate Linux per operare su una chiave USB formattata con un file system FAT32, il sistema operativo gestirà i nomi su quel file system in modo da conservare le maiuscole senza essere sensibile a esse.</para>
  20.191 +
  20.192 +    <sect2>
  20.193 +      <title>Memorizzazione del repository sicura e portabile</title>
  20.194 +
  20.195 +      <para id="x_570">Il meccanismo di memorizzazione dei repository Mercurial è <emphasis>sicuro per le maiuscole</emphasis>. Traduce i nomi dei file in modo che possano essere memorizzati senza problemi sia su file system sensibili alle maiuscole sia su quelli insensibili alle maiuscole. Questo significa che, per esempio, potete usare i normali strumenti per la copia di file per trasferire un repository Mercurial su una chiave USB, e spostare la chiave e il repository avanti e indietro tra un Mac, un PC con Windows e una macchina Linux senza problemi.</para>
  20.196 +
  20.197 +    </sect2>
  20.198 +    <sect2>
  20.199 +      <title>Riconoscere i conflitti tra maiuscole e minuscole</title>
  20.200 +
  20.201 +      <para id="x_571">Quando opera sulla directory di lavoro, Mercurial segue la politica di denominazione del file system su cui la directory di lavoro si trova. Se il file system conserva le maiuscole ma è insensibile a esse, Mercurial tratterà i nomi che differiscono solo per le maiuscole come se fossero uguali.</para>
  20.202 +
  20.203 +      <para id="x_572">&Egrave; importante ricordare che questo approccio permette di eseguire su un file system sensibile alle maiuscole (tipicamente Linux o Unix) il commit di un changeset che creerà problemi per gli utenti di file system insensibili alle maiuscole (di solito Windows e MacOS). Se un utente Linux inserisce nel repository le modifiche a due file, uno chiamato <filename>miofile.c</filename> e l&rsquo;altro chiamato <filename>MioFile.c</filename>, questi file verranno memorizzati correttamente. E gli stessi file verranno correttamente rappresentati come due file separati nella directory di lavoro di altri utenti Linux.</para>
  20.204 +
  20.205 +      <para id="x_573">Se un utente Windows o Mac estrae questo changeset, inizialmente non avrà alcun problema, perché il meccanismo di memorizzazione di un repository Mercurial è sicuro per le maiuscole. Tuttavia, appena tenta di aggiornare la directory di lavoro a quel changeset tramite <command role="hg-cmd">hg update</command>, o di unire il proprio lavoro con quel changeset tramite <command role="hg-cmd">hg merge</command>, Mercurial individuerà il conflitto tra i due nomi di file che il file system tratterebbe come lo stesso nome e impedirà all&rsquo;aggiornamento o all&rsquo;unione di avvenire.</para>
  20.206 +    </sect2>
  20.207 +
  20.208 +    <sect2>
  20.209 +      <title>Correggere un conflitto tra maiuscole e minuscole</title>
  20.210 +
  20.211 +      <para id="x_574">Se state usando Windows o Mac in un ambiente misto dove alcuni dei vostri collaboratori usano Linux o Unix, e Mercurial riporta un conflitto di ripiegamento delle maiuscole quando provate a eseguire <command role="hg-cmd">hg update</command> o <command role="hg-cmd">hg merge</command>, la procedura per correggere il problema è semplice.</para>
  20.212 +
  20.213 +      <para id="x_575">Trovate la macchina Linux o Unix più vicina, clonatevi il repository problematico e usate il comando <command role="hg-cmd">hg rename</command> di Mercurial per cambiare i nomi di qualsiasi file o directory che crea complicazioni, in modo da non causare più alcun conflitto di ripiegamento delle maiuscole. Inserite queste modifiche nel repository, eseguite <command role="hg-cmd">hg pull</command> o <command role="hg-cmd">hg push</command> attraverso i vostri sistemi Windows o MacOS e usate <command role="hg-cmd">hg update</command> per aggiornare la directory di lavoro alla revisione che contiene i nomi senza conflitti.</para>
  20.214 +
  20.215 +      <para id="x_576">Il changeset con i nomi in conflitto rimarrà nella cronologia del vostro progetto e non sarete comunque in grado di usare <command role="hg-cmd">hg update</command> per aggiornare la directory di lavoro a quel changeset su un sistema Windows o MacOS, ma potrete continuare a sviluppare senza impedimenti.</para>
  20.216 +    </sect2>
  20.217 +  </sect1>
  20.218 +</chapter>
    21.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    21.2 +++ b/it/ch08-branch.xml	Fri Sep 04 16:33:35 2009 +0200
    21.3 @@ -0,0 +1,240 @@
    21.4 +<chapter id="chap:branch">
    21.5 +  <?dbhtml filename="gestire-le-release-e-lo-sviluppo-con-i-rami.html"?>
    21.6 +  <title>Gestire le release e lo sviluppo con i rami</title>
    21.7 +
    21.8 +  <para id="x_369">Mercurial vi fornisce diversi meccanismi per gestire un progetto che sta facendo progressi su più fronti contemporaneamente. Per comprendere questi meccanismi, come prima cosa daremo una breve occhiata alla struttura di un progetto software abbastanza ordinario.</para>
    21.9 +
   21.10 +  <para id="x_36a">Molti progetti software distribuiscono periodicamente release principali (o <quote>maggiori</quote>) che contengono nuove funzionalità sostanziali. In parallelo, possono distribuire release secondarie (o <quote>minori</quote>) che di solito sono identiche alle release principali su cui sono basate e in più contengono alcune correzioni di bug.</para>
   21.11 +
   21.12 +  <para id="x_36b">In questo capitolo, cominceremo parlando di come mantenere una registrazione delle milestone di progetto come le release, poi continueremo parlando del flusso di lavoro tra fasi differenti di un progetto e di come Mercurial può aiutarvi a isolare e gestire questo lavoro.</para>
   21.13 +
   21.14 +  <sect1>
   21.15 +    <title>Dare un nome persistente a una revisione</title>
   21.16 +
   21.17 +    <para id="x_36c">Una volta che avete deciso che vi piacerebbe chiamare <quote>release</quote> una particolare revisione, è una buona idea registrare l&rsquo;identità di quella revisione. Questo vi permetterà di riprodurre quella release in un momento successivo, qualsiasi sia lo scopo che avete bisogno di raggiungere in quel momento (riprodurre un bug, convertirla verso una nuova piattaforma, etc).</para>
   21.18 +
   21.19 +    &interaction.tag.init;
   21.20 +
   21.21 +    <para id="x_36d">Mercurial vi consente di dare un nome permanente a qualsiasi revisione usando il comando <command role="hg-cmd">hg tag</command>. Ovviamente, questi nomi sono chiamati <quote>etichette</quote> (in inglese, appunto, tag).</para>
   21.22 +
   21.23 +    &interaction.tag.tag;
   21.24 +
   21.25 +    <para id="x_36e">Un&rsquo;etichetta non è altro che un <quote>nome simbolico</quote> per una revisione. Le etichette esistono puramente per la vostra convenienza: vi offrono un modo comodo e permanente per fare riferimento a una revisione. Mercurial non interpreta in alcun modo i nomi delle etichette che usate, né impone alcuna restrizione sul nome di un&rsquo;etichetta a parte le poche che sono necessarie affinché l&rsquo;etichetta possa essere riconosciuta senza ambiguità. Un nome di etichetta non può contenere i seguenti caratteri:</para>
   21.26 +    <itemizedlist>
   21.27 +      <listitem><para id="x_36f">due punti (codice ASCII 58,
   21.28 +	  <quote><literal>:</literal></quote>)</para>
   21.29 +      </listitem>
   21.30 +      <listitem><para id="x_370">ritorno a capo (codice ASCII 13,
   21.31 +	  <quote><literal>\r</literal></quote>)</para>
   21.32 +      </listitem>
   21.33 +      <listitem><para id="x_371">nuova riga (codice ASCII 10,
   21.34 +	  <quote><literal>\n</literal></quote>)</para>
   21.35 +      </listitem></itemizedlist>
   21.36 +
   21.37 +    <para id="x_372">Potete usare il comando <command role="hg-cmd">hg tags</command> per visualizzare le etichette presenti nel vostro repository. Nel risultato del comando, ogni revisione etichettata è identificata prima dal proprio nome, poi dal numero di revisione e infine dall&rsquo;hash unico della revisione.</para>
   21.38 +
   21.39 +    &interaction.tag.tags;
   21.40 +
   21.41 +    <para id="x_373">Notate che <literal>tip</literal> viene inclusa nell&rsquo;elenco mostrato da <command role="hg-cmd">hg tags</command>. L&rsquo;etichetta <literal>tip</literal> è una speciale etichetta <quote>mobile</quote> che identifica sempre la revisione più recente contenuta in un repository.</para>
   21.42 +
   21.43 +    <para id="x_374">Il comando <command role="hg-cmd">hg tags</command> elenca le etichette in ordine inverso secondo il numero di revisione. Di solito questo significa che le etichette recenti vengono elencate prima delle etichette più vecchie. Significa anche che <literal>tip</literal> è sempre la prima etichetta elencata nel risultato di <command role="hg-cmd">hg tags</command>.</para>
   21.44 +
   21.45 +    <para id="x_375">Il comando <command role="hg-cmd">hg log</command> stamperà le etichette associate a ogni revisione visualizzata.</para>
   21.46 +
   21.47 +    &interaction.tag.log;
   21.48 +
   21.49 +    <para id="x_376">I comandi Mercurial a cui dovete passare un identificatore di revisione accetteranno il nome di un&rsquo;etichetta al suo posto. Internamente, Mercurial tradurrà il nome della vostra etichetta nel corrispondente identificatore di revisione e poi userà quest&rsquo;ultimo per operare.</para>
   21.50 +
   21.51 +    &interaction.tag.log.v1.0;
   21.52 +
   21.53 +    <para id="x_377">Non c&rsquo;è alcun limite al numero di etichette che potete avere in un repository, o al numero di etichette che una singola revisione può avere. Nella pratica, non è una grande idea averne <quote>troppe</quote> (un numero che varierà da progetto a progetto), semplicemente perché le etichette sono pensate per aiutarvi a rintracciare le revisioni: se avete molte etichette, la comodità di usarle per identificare le revisioni diminuisce rapidamente.</para>
   21.54 +
   21.55 +    <para id="x_378">Per esempio, se il vostro progetto definisce nuove milestone con una frequenza di alcuni giorni, è perfettamente ragionevole dotare ognuna di un&rsquo;etichetta. Ma se avete un sistema di assemblaggio continuo che si assicura di poter assemblare ogni revisione senza problemi, introdurreste troppo rumore etichettando ogni assemblaggio pulito. Invece, potreste etichettare gli assemblaggi falliti (supponendo che siano rari!) o semplicemente evitare di usare le etichette per tenere traccia degli assemblaggi.</para>
   21.56 +
   21.57 +    <para id="x_379">Se volete rimuovere un&rsquo;etichetta che non volete più, usate <command role="hg-cmd">hg tag --remove</command>.</para>
   21.58 +
   21.59 +    &interaction.tag.remove;
   21.60 +
   21.61 +    <para id="x_37a">Potete anche modificare un&rsquo;etichetta in qualsiasi momento, in modo che identifichi una revisione differente, semplicemente invocando di nuovo il comando <command role="hg-cmd">hg tag</command>. Dovrete usare l&rsquo;opzione <option role="hg-opt-tag">-f</option> per dire a Mercurial che volete <emphasis>davvero</emphasis> aggiornare l&rsquo;etichetta.</para>
   21.62 +
   21.63 +    &interaction.tag.replace;
   21.64 +
   21.65 +    <para id="x_37b">La precedente identità dell&rsquo;etichetta rimarrà permanentemente registrata, ma Mercurial non la userà più. Quindi non c&rsquo;è alcuna penalità da pagare se etichettate la revisione sbagliata, ma tutto quello che dovete fare dopo aver scoperto il vostro errore è tornare sui vostri passi ed etichettare la revisione corretta.</para>
   21.66 +
   21.67 +    <para id="x_37c">Mercurial memorizza le etichette nel vostro repository in un normale file soggetto al controllo di revisione. Troverete le etichette che avete creato in un file chiamato <filename role="special">.hgtags</filename> alla radice del vostro repository. Quando eseguite il comando <command role="hg-cmd">hg tag</command>, Mercurial modifica questo file, poi ne effettua automaticamente il commit registrandone i cambiamenti. Questo significa che ad ogni esecuzione di <command role="hg-cmd">hg tag</command> corrisponderà un changeset nell&rsquo;elenco mostrato da <command role="hg-cmd">hg log</command>.</para>
   21.68 +
   21.69 +    &interaction.tag.tip;
   21.70 +
   21.71 +    <sect2>
   21.72 +      <title>Gestire i conflitti di etichette durante un&rsquo;unione</title>
   21.73 +
   21.74 +      <para id="x_37d">Avrete raramente bisogno di preoccuparvi del file <filename role="special">.hgtags</filename>, ma talvolta la sua presenza si farà sentire durante un&rsquo;unione. Il formato del file è semplice: consiste di una serie di righe, ognuna delle quali comincia con un hash di changeset, seguito da uno spazio, seguito dal nome di un&rsquo;etichetta.</para>
   21.75 +
   21.76 +      <para id="x_37e">Se state risolvendo un conflitto nel file <filename role="special">.hgtags</filename> durante un&rsquo;unione, c&rsquo;è una particolarità da ricordare quando modificate il file <filename role="special">.hgtags</filename>: quando Mercurial sta analizzando le etichette in un repository, non legge <emphasis>mai</emphasis> la copia di lavoro del file <filename role="special">.hgtags</filename>, ma legge la revisione del file <emphasis>registrata più recentemente</emphasis>.</para>
   21.77 +
   21.78 +      <para id="x_37f">Una sfortunata conseguenza di questo comportamento è che non potete verificare la correttezza del file <filename role="special">.hgtags</filename> risultato dall&rsquo;unione se non <emphasis>dopo</emphasis> aver effettuato il commit di un cambiamento. Quindi, se vi trovate a risolvere un conflitto su <filename role="special">.hgtags</filename> durante un&rsquo;unione, assicuratevi di eseguire <command role="hg-cmd">hg tags</command> dopo aver effettuato il commit. Se il comando trova un errore nel file <filename role="special">.hgtags</filename>, vi indicherà la posizione dell&rsquo;errore, che potrete dunque correggere registrando la correzione nel repository. Dovreste poi eseguire ancora <command role="hg-cmd">hg tags</command>, giusto per essere sicuri che la vostra correzione sia valida.</para>
   21.79 +    </sect2>
   21.80 +
   21.81 +    <sect2>
   21.82 +      <title>Etichette e cloni</title>
   21.83 +
   21.84 +      <para id="x_380">Potreste aver notato che il comando <command role="hg-cmd">hg clone</command> offre un&rsquo;opzione <option role="hg-opt-clone">-r</option> per lasciarvi clonare la copia esatta di una particolare revisione di un repository. Il nuovo clone non conterrà alcuna cronologia del progetto registrata dopo la revisione che avete specificato. Questa operazione interagisce con le etichette in un modo che potrebbe sorprendere i più distratti.</para>
   21.85 +
   21.86 +      <para id="x_381">Se ricordate, un&rsquo;etichetta viene memorizzata come una revisione del file <filename role="special">.hgtags</filename>. Quando create un&rsquo;etichetta, il changeset in cui viene registrata si riferisce a un changeset precedente. Quando eseguite <command role="hg-cmd">hg clone -r foo</command> per clonare un repository all&rsquo;etichetta <literal>foo</literal>, il nuovo clone <emphasis>non conterrà alcuna revisione più recente di quella a cui si riferisce l&rsquo;etichetta, compresa la revisione in cui l&rsquo;etichetta è stata creata</emphasis>. Come risultato, otterrete esattamente il sottoinsieme corretto della cronologia del progetto nel nuovo repository, ma <emphasis>non</emphasis> l&rsquo;etichetta che vi sareste potuti aspettare.</para>
   21.87 +    </sect2>
   21.88 +
   21.89 +    <sect2>
   21.90 +      <title>Quando le etichette permanenti sono eccessive</title>
   21.91 +
   21.92 +      <para id="x_382">Dato che le etichette di Mercurial sono soggette a controllo di revisione e fanno parte della cronologia del progetto, chiunque lavori con voi vedrà le etichette che avete creato. Ma i nomi delle revisioni possono essere usati in modi che vanno oltre la semplice annotazione che la revisione <literal>4237e45506ee</literal> è in realtà la <literal>v2.0.2</literal>. Se state provando a rintracciare un bug intricato, poteste volere un&rsquo;etichetta per ricordarvi di qualcosa come <quote>Anna ha visto gli effetti del bug in questa revisione</quote>.</para>
   21.93 +
   21.94 +      <para id="x_383">In casi come questo, quello che potreste voler usare sono le etichette <emphasis>locali</emphasis>. Un&rsquo;etichetta locale viene creata tramite l&rsquo;opzione <option role="hg-opt-tag">-l</option> del comando <command role="hg-cmd">hg tag</command> e viene memorizzata in un file chiamato <filename role="special">.hg/localtags</filename>. Diversamente da <filename role="special">.hgtags</filename>, <filename
   21.95 +	  role="special">.hg/localtags</filename> non è soggetto a controllo di revisione, quindi qualsiasi etichetta creiate usando l&rsquo;opzione <option role="hg-opt-tag">-l</option> rimarrà strettamente locale al repository in cui state attualmente lavorando.</para>
   21.96 +    </sect2>
   21.97 +  </sect1>
   21.98 +
   21.99 +  <sect1>
  21.100 +    <title>Il flusso dei cambiamenti&emdash;la visione d&rsquo;insieme e la visione di dettaglio</title>
  21.101 +
  21.102 +    <para id="x_384">Per ritornare allo schema abbozzato all&rsquo;inizio del capitolo, consideriamo un progetto che contiene molteplici attività di sviluppo parallele in lavorazione contemporaneamente.</para>
  21.103 +
  21.104 +    <para id="x_385">Potrebbero esserci attività dedicate a una nuova release principale, a una nuova release <quote>minore</quote> che corregge alcuni bug trovati nell&rsquo;ultima release principale e a un&rsquo;inattesa <quote>correzione a caldo</quote> di una vecchia release che ora si trova in fase di manutenzione.</para>
  21.105 +
  21.106 +    <para id="x_386">Di solito, ognuna di queste direzioni di sviluppo parallele viene chiamata <quote>ramo</quote> (in inglese, branch). Tuttavia, abbiamo già visto più volte che Mercurial tratta <emphasis>tutta la cronologia</emphasis> come una serie di rami e unioni. In realtà, quello che abbiamo qui sono due idee marginalmente correlate che condividono casualmente lo stesso nome.</para>
  21.107 +    <itemizedlist>
  21.108 +      <listitem><para id="x_387">Nella <quote>visione d&rsquo;insieme</quote> i rami rappresentano il flusso dell&rsquo;evoluzione di un progetto. Ognuno di questi rami ha il proprio nome ed è oggetto di conversazione tra gli sviluppatori.</para>
  21.109 +      </listitem>
  21.110 +      <listitem><para id="x_388">Nella <quote>visione di dettaglio</quote> i rami sono artefatti costruiti durante l&rsquo;attività quotidiana di sviluppo e unione dei cambiamenti. Questi rami narrano la storia di come il codice è stato sviluppato.</para>
  21.111 +      </listitem></itemizedlist>
  21.112 +  </sect1>
  21.113 +
  21.114 +  <sect1>
  21.115 +    <title>Gestire i rami nella visione d&rsquo;insieme</title>
  21.116 +
  21.117 +    <para id="x_389">Nella <quote>visione d&rsquo;insieme</quote>, il modo più facile per isolare un ramo in Mercurial è quello di utilizzare un repository dedicato. Se avete un repository condiviso esistente&emdash;chiamiamolo <literal>mioprogetto</literal>&emdash;che raggiunge una milestone <quote>1.0</quote>, potete cominciare a preparare le future release di manutenzione basate sulla versione 1.0 etichettando la revisione dalla quale avete preparato la release 1.0.</para>
  21.118 +
  21.119 +    &interaction.branch-repo.tag;
  21.120 +
  21.121 +    <para id="x_38a">Potete quindi clonare un nuovo repository condiviso <literal>mioprogetto-1.0.1</literal> a partire da quella etichetta.</para>
  21.122 +
  21.123 +    &interaction.branch-repo.clone;
  21.124 +
  21.125 +    <para id="x_38b">Successivamente, chi ha bisogno di lavorare sulla correzione di un bug che dovrebbe essere contenuta in una prossima release <quote>minore</quote> 1.0.1 potrà clonare il repository <literal>mioprogetto-1.0.1</literal>, fare le proprie modifiche e poi trasmetterle a quel repository.</para>
  21.126 +
  21.127 +    &interaction.branch-repo.bugfix;
  21.128 +
  21.129 +    <para id="x_38c">Nel frattempo, lo sviluppo della prossima release principale può continuare, isolato e ininterrotto, nel repository <literal>mioprogetto</literal>.</para>
  21.130 +
  21.131 +    &interaction.branch-repo.new;
  21.132 +  </sect1>
  21.133 +
  21.134 +  <sect1>
  21.135 +    <title>Non ripetetevi: le unioni tra rami</title>
  21.136 +
  21.137 +    <para id="x_38d">In molti casi, se avete un bug da correggere su un ramo di manutenzione, è probabile che il bug sia presente anche sul ramo principale del progetto (e magari anche su altri rami di manutenzione). &Egrave; raro che uno sviluppatore voglia correggere lo stesso bug più volte, quindi diamo un&rsquo;occhiata ad alcuni modi in cui Mercurial può aiutarvi a gestire queste correzioni senza duplicare il vostro lavoro.</para>
  21.138 +
  21.139 +    <para id="x_38e">Nel caso più semplice, tutto quello che dovete fare è propagare i cambiamenti dal vostro ramo di manutenzione al vostro clone locale del ramo di destinazione.</para>
  21.140 +
  21.141 +    &interaction.branch-repo.pull;
  21.142 +
  21.143 +    <para id="x_38f">Poi dovrete unire le teste dei due rami e trasmettere i cambiamenti al ramo principale.</para>
  21.144 +
  21.145 +    &interaction.branch-repo.merge;
  21.146 +  </sect1>
  21.147 +
  21.148 +  <sect1>
  21.149 +    <title>Denominare i rami in un repository</title>
  21.150 +
  21.151 +    <para id="x_390">Nella maggior parte dei casi, isolare ogni ramo in un proprio repository è l&rsquo;approccio giusto, perché la sua semplicità lo rende facile da capire e quindi è difficile commettere errori. Esiste una relazione uno-a-uno tra i rami in cui state lavorando e le directory sul vostro sistema che vi consente di usare strumenti ordinari (ignari dell&rsquo;esistenza di Mercurial) per lavorare sui file all&rsquo;interno di un ramo/repository.</para>
  21.152 +
  21.153 +    <para id="x_391">Se invece appartenete alla categoria degli <quote>utenti avanzati</quote> (<emphasis>e</emphasis> vi appartengono anche i vostri collaboratori), potete considerare un modo alternativo di gestire i rami. Ho già menzionato la distinzione con cui gli sviluppatori percepiscono i rami nella <quote>visione di dettaglio</quote> e nella <quote>visione d&rsquo;insieme</quote>. Se Mercurial lavora con molteplici rami <quote>di dettaglio</quote> alla volta in un repository (per esempio dopo che avete propagato i cambiamenti, ma prima di incorporarli), può <emphasis>anche</emphasis> lavorare con molteplici rami <quote>d&rsquo;insieme</quote>.</para>
  21.154 +
  21.155 +    <para id="x_392">La chiave per lavorare in questo modo è che Mercurial vi permette di assegnare un <emphasis>nome</emphasis> persistente a un ramo. In ogni repository c&rsquo;è sempre un ramo chiamato <literal>default</literal>. Anche prima che cominciate a creare voi stessi nuovi rami con il proprio nome, potete trovare tracce del ramo <literal>default</literal> se le cercate.</para>
  21.156 +
  21.157 +    <para id="x_393">Per esempio, quando eseguite il comando <command role="hg-cmd">hg commit</command> e vi viene presentato un editor in modo che possiate inserire un messaggio di commit, cercate una riga che contiene il testo <quote><literal>HG: ramo default</literal></quote> verso il fondo. Questo comando vi informa che il vostro commit avverrà sul ramo chiamato <literal>default</literal>.</para>
  21.158 +
  21.159 +    <para id="x_394">Per cominciare a lavorare con i rami con nome, usate il comando <command role="hg-cmd">hg branches</command>. Questo comando elenca i rami con nome già presenti nel vostro repository, dicendovi quale changeset è in cima a ognuno di loro.</para>
  21.160 +
  21.161 +    &interaction.branch-named.branches;
  21.162 +
  21.163 +    <para id="x_395">Dato che non avete ancora creato alcun ramo con nome, l&rsquo;unico ramo esistente è <literal>default</literal>.</para>
  21.164 +
  21.165 +    <para id="x_396">Per trovare qual è il ramo <quote>attuale</quote>, eseguite il comando <command role="hg-cmd">hg branch</command> senza passargli alcun argomento. Otterrete il nome del ramo in cui trova il genitore del changeset corrente.</para>
  21.166 +
  21.167 +    &interaction.branch-named.branch;
  21.168 +
  21.169 +    <para id="x_397">Per creare un nuovo ramo, eseguite ancora il comando <command role="hg-cmd">hg branch</command>. Questa volta, passategli un argomento: il nome del ramo che volete creare.</para>
  21.170 +
  21.171 +    &interaction.branch-named.create;
  21.172 +
  21.173 +    <para id="x_398">Dopo che avete creato un ramo, potreste chiedervi qual è stato l&rsquo;effetto del comando <command role="hg-cmd">hg branch</command>. Che cosa ci dicono i comandi <command role="hg-cmd">hg status</command> e <command role="hg-cmd">hg tip</command>?</para>
  21.174 +
  21.175 +    &interaction.branch-named.status;
  21.176 +
  21.177 +    <para id="x_399">Nulla è cambiato nella directory di lavoro e non è stata creata nuova cronologia. Come queste osservazioni suggeriscono, il comando <command role="hg-cmd">hg branch</command> non ha alcun effetto permanente, ma si limita a dire a Mercurial quale nome di ramo usare la <emphasis>prossima</emphasis> volta che effettuerete il commit di un changeset.</para>
  21.178 +
  21.179 +    <para id="x_39a">Quando inserite un cambiamento nel repository, Mercurial registra il nome del ramo su cui lo avete inserito. Una volta che siete passati dal ramo <literal>default</literal> a un altro e avete eseguito il commit, vedrete apparire il nome del nuovo ramo nel risultato di <command role="hg-cmd">hg log</command>, <command role="hg-cmd">hg tip</command> e altri comandi che mostrano lo stesso tipo di informazioni.</para>
  21.180 +
  21.181 +    &interaction.branch-named.commit;
  21.182 +
  21.183 +    <para id="x_39b">I comandi come <command role="hg-cmd">hg log</command> stamperanno il nome del ramo di ogni changeset che non appartiene al ramo <literal>default</literal>. Come risultato, se non avete mai usato i rami con nome, non vedrete mai questa informazione.</para>
  21.184 +
  21.185 +    <para id="x_39c">Una volta che avete denominato un ramo e inserito un cambiamento in quel ramo, ogni commit successivo che discende da quel cambiamento erediterà lo stesso nome di ramo. Potete cambiare il nome a un ramo in ogni momento, usando il comando <command role="hg-cmd">hg branch</command>.</para>
  21.186 +
  21.187 +    &interaction.branch-named.rebranch;
  21.188 +
  21.189 +    <para id="x_39d">In pratica, questa non è una cosa che farete molto spesso, dato che i nomi di ramo tendono ad avere un tempo di vita piuttosto lungo. (Questa non è una regola, ma solo un&rsquo;osservazione.)</para>
  21.190 +  </sect1>
  21.191 +
  21.192 +  <sect1>
  21.193 +    <title>Gestire molti rami con nome in un repository</title>
  21.194 +
  21.195 +    <para id="x_39e">Se un repository contiene più di un ramo con nome, Mercurial ricorderà il ramo su cui si trova la vostra directory di lavoro quando eseguite un comando come <command role="hg-cmd">hg update</command> o <command role="hg-cmd">hg pull -u</command> e aggiornerà la directory di lavoro alla revisione di punta di quel ramo, a prescindere da quale sia la punta dell&rsquo;intero repository. Per aggiornare la directory di lavoro a una revisione che si trova su un ramo con un nome diverso, potreste dover usare l&rsquo;opzione <option role="hg-opt-update">-C</option> del comando <command role="hg-cmd">hg update</command>.</para>
  21.196 +
  21.197 +    <para id="x_39f">Questo comportamento è leggermente complicato, quindi vediamolo in azione. Per prima cosa, controlliamo su quale ramo ci troviamo al momento e quali sono i rami contenuti nel nostro repository.</para>
  21.198 +
  21.199 +    &interaction.branch-named.parents;
  21.200 +
  21.201 +    <para id="x_3a0">Ci troviamo sul ramo <literal>bar</literal>, ma esiste anche un ramo più vecchio chiamato <literal>foo</literal>.</para>
  21.202 +
  21.203 +    <para id="x_3a1">Possiamo utilizzare <command role="hg-cmd">hg update</command> per spostarci avanti e indietro tra le revisioni di punta dei rami <literal>foo</literal> e <literal>bar</literal> senza aver bisogno di impiegare l&rsquo;opzione <option role="hg-opt-update">-C</option>, perché questi spostamenti avvengono linearmente attraverso la nostra cronologia dei cambiamenti.</para>
  21.204 +
  21.205 +    &interaction.branch-named.update-switchy;
  21.206 +
  21.207 +    <para id="x_3a2">Se torniamo indietro al ramo <literal>foo</literal> e invochiamo <command role="hg-cmd">hg update</command>, il comando ci manterrà su <literal>foo</literal> piuttosto che spostarci alla punta di <literal>bar</literal>.</para>
  21.208 +
  21.209 +    &interaction.branch-named.update-nothing;
  21.210 +
  21.211 +    <para id="x_3a3">Il commit di una nuova modifica sul ramo <literal>foo</literal> introduce una nuova testa.</para>
  21.212 +
  21.213 +    &interaction.branch-named.foo-commit;
  21.214 +  </sect1>
  21.215 +
  21.216 +  <sect1>
  21.217 +    <title>I nomi di ramo e le unioni</title>
  21.218 +
  21.219 +    <para id="x_3a4">Come avete probabilmente notato, le unioni in Mercurial non sono simmetriche. Diciamo che il nostro repository possiede due teste, 17 e 23. Se uso <command role="hg-cmd">hg update</command> per aggiornare alla 17 e poi eseguo <command role="hg-cmd">hg merge</command> per incorporare la 23, Mercurial registra la 17 come primo genitore dell&rsquo;unione e la 23 come secondo. Ma se uso <command role="hg-cmd">hg update</command> per aggiornare alla 23 e poi eseguo <command role="hg-cmd">hg merge</command> per incorporare la 17, Mercurial registra la 23 come primo genitore e la 17 come secondo.</para>
  21.220 +
  21.221 +    <para id="x_3a5">Questo comportamento influenza la scelta del nome di ramo compiuta da Mercurial quando effettuate un&rsquo;unione. Dopo un&rsquo;unione, Mercurial manterrà il nome del ramo del primo genitore quando registrate i risultati dell&rsquo;unione. Se il nome del ramo del primo genitore è <literal>foo</literal> e unite quel ramo con <literal>bar</literal>, dopo l&rsquo;unione il nome del ramo in cui vi troverete sarà ancora <literal>foo</literal>.</para>
  21.222 +
  21.223 +    <para id="x_3a6">Capita spesso che un repository contenga più teste, ognuna con lo stesso nome di ramo. Diciamo che io sto lavorando sul ramo <literal>foo</literal> e così fate anche voi. Eseguiamo il commit di cambiamenti differenti, dopodiché io estraggo i vostri cambiamenti e mi ritrovo con due teste, ognuna che dichiara di appartenere al ramo <literal>foo</literal>. Sperabilmente, il risultato di un&rsquo;unione sarà una singola testa sul ramo <literal>foo</literal>.</para>
  21.224 +
  21.225 +    <para id="x_3a7">Ma se io sto lavorando sul ramo <literal>bar</literal> e incorporo il lavoro dal ramo <literal>foo</literal>, il risultato rimarrà sul ramo <literal>bar</literal>.</para>
  21.226 +
  21.227 +    &interaction.branch-named.merge;
  21.228 +
  21.229 +    <para id="x_3a8">Per farvi un esempio più concreto, se sto lavorando sul ramo <literal>sperimentale</literal> e voglio incorporare le ultime correzioni dal ramo <literal>stabile</literal>, Mercurial sceglierà il nome del ramo <quote>corretto</quote> (<literal>sperimentale</literal>) quando estrarrò e incorporerò i cambiamenti da <literal>stabile</literal>.</para>
  21.230 +  </sect1>
  21.231 +
  21.232 +  <sect1>
  21.233 +    <title>La denominazione dei rami è generalmente utile</title>
  21.234 +
  21.235 +    <para id="x_3a9">Non dovreste pensare che i rami con nome si possano utilizzare solo in situazioni dove avete molteplici rami di lunga data che coabitano in un singolo repository. Sono molto utili anche nel caso in cui utilizziate un singolo ramo per repository.</para>
  21.236 +
  21.237 +    <para id="x_3aa">Nel caso più semplice, dare un nome a ogni ramo vi offre una registrazione permanente dell&rsquo;identità del ramo da cui un changeset ha avuto origine. Questo vi fornisce un contesto più ampio quando state cercando di seguire la cronologia di un progetto ramificato di lunga data.</para>
  21.238 +
  21.239 +    <para id="x_3ab">Se state lavorando con repository condivisi, potete impostare un hook <literal role="hook">pretxnchangegroup</literal> su ogni repository in modo da bloccare i cambiamenti in entrata che appartengono al nome di ramo <quote>sbagliato</quote>. Questo accorgimento vi offre una difesa semplice ma efficace nei confronti di chi trasmette accidentalmente i cambiamenti da un ramo <quote>sperimentale</quote> a un ramo <quote>stabile</quote>. Un hook di questo tipo potrebbe somigliare al seguente, contenuto all&rsquo;interno del file <filename role="special">/.hgrc</filename> del repository condiviso.</para>
  21.240 +    <programlisting>[hooks]
  21.241 +pretxnchangegroup.branch = hg heads --template '{branches} ' | grep mioramo</programlisting>
  21.242 +  </sect1>
  21.243 +</chapter>
    22.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    22.2 +++ b/it/ch09-undo.xml	Fri Sep 04 16:33:35 2009 +0200
    22.3 @@ -0,0 +1,574 @@
    22.4 +<chapter id="chap:undo">
    22.5 +  <?dbhtml filename="trovare-e-correggere-gli-errori.html"?>
    22.6 +  <title>Trovare e correggere gli errori</title>
    22.7 +
    22.8 +  <para id="x_d2">Sbagliare potrebbe essere umano, ma per gestire davvero bene le conseguenze degli errori ci vuole un sistema di controllo di revisione di prima qualità. In questo capitolo, discuteremo alcune tecniche che potete usare quando scoprite che un problema si è insinuato nel vostro progetto. Mercurial è dotato di alcune funzioni particolarmente efficaci che vi aiuteranno a isolare le cause dei problemi e a trattarle in maniera appropriata.</para>
    22.9 +
   22.10 +  <sect1>
   22.11 +    <title>Cancellare la cronologia locale</title>
   22.12 +
   22.13 +    <sect2>
   22.14 +      <title>L&rsquo;inserimento accidentale</title>
   22.15 +
   22.16 +      <para id="x_d3">In maniera occasionale ma persistente mi capita di digitare più velocemente di quanto riesca a pensare, cosa che talvolta provoca come conseguenza l&rsquo;inserimento di un changeset incompleto o completamente sbagliato. Nel mio caso, il classico tipo di changeset incompleto è quello in cui ho creato un nuovo file sorgente ma ho dimenticato di usare <command role="hg-cmd">hg add</command> per aggiungerlo al repository. Un changeset <quote>completamente sbagliato</quote> non è così comune, ma non è meno fastidioso.</para>
   22.17 +
   22.18 +    </sect2>
   22.19 +    <sect2 id="sec:undo:rollback">
   22.20 +      <title>Abortire una transazione</title>
   22.21 +
   22.22 +      <para id="x_d4">Nella <xref linkend="sec:concepts:txn"/>, ho menzionato che Mercurial tratta ogni modifica del repository come una <emphasis>transazione</emphasis>. Ogni volta che inserite un changeset o estraete i cambiamenti da un altro repository, Mercurial ricorda cosa avete fatto. Potete annullare, o <emphasis>abortire</emphasis>, esattamente una di queste azioni usando il comando <command role="hg-cmd">hg rollback</command>. (Leggete la <xref linkend="sec:undo:rollback-after-push"/> per un importante avvertimento su come usare questo comando.)</para>
   22.23 +
   22.24 +      <para id="x_d5">Ecco un errore che mi ritrovo spesso a commettere: inserire un changeset in cui ho creato un nuovo file dimenticandomi di aggiungerlo tramite <command role="hg-cmd">hg add</command>.</para>
   22.25 +
   22.26 +      &interaction.rollback.commit;
   22.27 +
   22.28 +      <para id="x_d6">Un&rsquo;occhiata al risultato di <command role="hg-cmd">hg status</command> dopo l&rsquo;inserimento conferma immediatamente l&rsquo;errore.</para>
   22.29 +
   22.30 +      &interaction.rollback.status;
   22.31 +
   22.32 +      <para id="x_d7">Il commit ha catturato le modifiche al file <filename>a</filename>, ma non il nuovo file <filename>b</filename>. &Egrave; molto probabile che qualcosa in <filename>a</filename> si riferisca a <filename>b</filename>, ma se trasmettessi questo changeset a un repository condiviso, i collaboratori che estrarranno i miei cambiamenti non troverebbero <filename>b</filename> nei loro repository. Di conseguenza, diventerei oggetto di una certa indignazione.</para>
   22.33 +
   22.34 +      <para id="x_d8">Tuttavia, la fortuna è dalla mia parte&emdash;mi sono accorto dell&rsquo;errore prima di trasmettere il changeset. Ora uso il comando <command role="hg-cmd">hg rollback</command> e Mercurial farà sparire quell&rsquo;ultimo changeset.</para>
   22.35 +
   22.36 +      &interaction.rollback.rollback;
   22.37 +
   22.38 +      <para id="x_d9">Notate che il changeset non è più presente nella cronologia del repository e che la directory di lavoro pensa ancora che il file <filename>a</filename> sia stato modificato. Il commit e la sua cancellazione hanno lasciato la directory di lavoro esattamente nello stato in cui si trovava prima dell&rsquo;inserimento: il changeset è stato completamente rimosso. Ora posso tranquillamente usare <command role="hg-cmd">hg add</command> per aggiungere il file <filename>b</filename> e rieseguire il commit.</para>
   22.39 +
   22.40 +      &interaction.rollback.add;
   22.41 +
   22.42 +    </sect2>
   22.43 +    <sect2>
   22.44 +      <title>L&rsquo;estrazione sbagliata</title>
   22.45 +
   22.46 +      <para id="x_da">&Egrave; pratica comune usare Mercurial mantenendo in repository differenti i rami di sviluppo separati di un progetto. Il vostro gruppo di sviluppo potrebbe avere un repository condiviso per la release <quote>0.9</quote> del vostro progetto e un altro, contenente cambiamenti differenti, per la release <quote>1.0</quote>.</para>
   22.47 +
   22.48 +      <para id="x_db">In questa situazione, potete immaginare che pasticcio accadrebbe se aveste un repository <quote>0.9</quote> locale e vi propagaste accidentalmente i cambiamenti dal repository <quote>1.0</quote> condiviso. Nel caso peggiore, potreste non fare abbastanza attenzione e trasmettere quei cambiamenti nell&rsquo;albero <quote>0.9</quote> condiviso, disorientando tutti gli altri sviluppatori (ma non preoccupatevi, ritorneremo a questo orribile scenario più avanti). Tuttavia, è più probabile che notiate immediatamente l&rsquo;errore, perché Mercurial vi mostrerà l&rsquo;URL da cui sta estraendo i cambiamenti, o perché vedrete Mercurial propagare un numero sospettosamente alto di cambiamenti nel repository.</para>
   22.49 +
   22.50 +      <para id="x_dc">Il comando <command role="hg-cmd">hg rollback</command> cancellerà scrupolosamente tutti i changeset che avete appena estratto. Mercurial raggruppa tutti i cambiamenti provenienti da un&rsquo;invocazione di <command role="hg-cmd">hg pull</command> in una singola transazione, quindi un&rsquo;unica invocazione di <command role="hg-cmd">hg rollback</command> è tutto quello che vi serve per annullare questo errore.</para>
   22.51 +
   22.52 +    </sect2>
   22.53 +    <sect2 id="sec:undo:rollback-after-push">
   22.54 +      <title>Abortire una transazione è inutile se avete già trasmesso le modifiche</title>
   22.55 +
   22.56 +      <para id="x_dd">Il valore di <command role="hg-cmd">hg rollback</command> scende a zero una volta che avete trasmesso le vostre modifiche a un altro repository. Abortire un cambiamento lo fa scomparire interamente, ma <emphasis>solo</emphasis> nel repository in cui invocate <command role="hg-cmd">hg rollback</command>. Dato che una cancellazione elimina parte della cronologia, non è possibile che la scomparsa di un cambiamento si propaghi tra i repository.</para>
   22.57 +
   22.58 +      <para id="x_de">Se avete trasmesso un cambiamento a un altro repository&emdash;in particolare se è un repository condiviso&emdash;le modifiche sono essenzialmente <quote>scappate dal recinto</quote> e dovrete rimediare all&rsquo;errore in un altro modo. Se trasmettete un changeset da qualche parte, lo abortite e poi estraete i cambiamenti dal repository verso cui avete effettuato la trasmissione, il changeset di cui credevate di esservi sbarazzati riapparirà semplicemente nel vostro repository.</para>
   22.59 +
   22.60 +      <para id="x_df">Se siete assolutamente sicuri che il cambiamento che volete abortire è quello più recente contenuto nel repository a cui lo avete trasmesso <emphasis>e</emphasis> sapete che nessun altro può averlo estratto da quel repository, potete ritirare il changeset anche là, ma non dovreste aspettarvi che questo funzioni in maniera affidabile. Presto o tardi un cambiamento finirà in un repository su cui non avete un controllo diretto (o vi siete dimenticati di averlo) e vi si ritorcerà contro.</para>
   22.61 +
   22.62 +    </sect2>
   22.63 +    <sect2>
   22.64 +      <title>Potete abortire una sola transazione</title>
   22.65 +
   22.66 +      <para id="x_e0">Mercurial memorizza esattamente una transazione nel suo registro delle transazioni: quella più recente avvenuta nel repository. Questo significa che potete abortire solo una transazione. Se vi aspettate di poter abortire una transazione e poi quella che la precede, questo non è il comportamento che otterrete.</para>
   22.67 +
   22.68 +      &interaction.rollback.twice;
   22.69 +
   22.70 +      <para id="x_e1">Una volta che avete abortito una transazione in un repository, non potete effettuare un&rsquo;altra volta questa operazione in quel repository fino a quando non avete eseguito un nuovo inserimento o una nuova estrazione.</para>
   22.71 +
   22.72 +    </sect2>
   22.73 +  </sect1>
   22.74 +  <sect1>
   22.75 +    <title>Rimediare alle modifiche sbagliate</title>
   22.76 +
   22.77 +    <para id="x_e2">Se fate un cambiamento a un file e poi decidete che in realtà non volevate affatto modificare il file, ma non avete ancora inserito i vostri cambiamenti nel repository, il comando che vi serve è <command role="hg-cmd">hg revert</command>. Questo comando esamina il changeset genitore della directory di lavoro e ripristina il contenuto del file allo stato in cui era in quel changeset. (Questo è un modo prolisso per dire che, nel caso normale, annulla le vostre modifiche.)</para>
   22.78 +
   22.79 +    <para id="x_e3">Vediamo come funziona il comando <command role="hg-cmd">hg revert</command>, ancora con un altro piccolo esempio. Cominceremo modificando un file che Mercurial ha già registrato.</para>
   22.80 +
   22.81 +    &interaction.daily.revert.modify;
   22.82 +
   22.83 +    <para id="x_e4">Se non vogliamo quella modifica, possiamo semplicemente usare <command role="hg-cmd">hg revert</command> sul file.</para>
   22.84 +
   22.85 +    &interaction.daily.revert.unmodify;
   22.86 +
   22.87 +    <para id="x_e5">Il comando <command role="hg-cmd">hg revert</command> ci fornisce un ulteriore grado di protezione salvando il nostro file modificato con un&rsquo;estensione <filename>.orig</filename>.</para>
   22.88 +
   22.89 +    &interaction.daily.revert.status;
   22.90 +
   22.91 +    <tip>
   22.92 +      <title>Fate attenzione ai file <filename>.orig</filename></title>
   22.93 +
   22.94 +      <para id="x_6b8">&Egrave; estremamente improbabile che stiate usando Mercurial per gestire file con estensione <filename>.orig</filename> o persino che siate interessati al contenuto di quei file. Nel caso, comunque, è utile ricordare che <command role="hg-cmd">hg revert</command> sovrascriverà incondizionatamente un file con estensione <filename>.orig</filename> esistente. Per esempio, se avete già un file <filename>foo.orig</filename> quando ritornate alla versione precedente del file <filename>foo</filename>, il contenuto di <filename>foo.orig</filename> verrà cestinato.</para>
   22.95 +    </tip>
   22.96 +
   22.97 +    <para id="x_e6">Ecco un riepilogo dei casi che il comando <command role="hg-cmd">hg revert</command> è in grado di gestire. Li descriveremo in dettaglio nella prossima sezione.</para>
   22.98 +    <itemizedlist>
   22.99 +      <listitem><para id="x_e7">Se modificate un file, il comando lo ripristinerà al suo stato non modificato.</para>
  22.100 +      </listitem>
  22.101 +      <listitem><para id="x_e8">Se usate <command role="hg-cmd">hg add</command> su un file, <command role="hg-cmd">hg revert</command> annullerà lo stato di <quote>aggiunto</quote> del file ma lascerà intatti i contenuti del file.</para>
  22.102 +      </listitem>
  22.103 +      <listitem><para id="x_e9">Se cancellate un file senza dirlo a Mercurial, il comando ripristinerà i contenuti del file.</para>
  22.104 +      </listitem>
  22.105 +      <listitem><para id="x_ea">Se usate il comando <command role="hg-cmd">hg remove</command> per cancellare un file, <command role="hg-cmd">hg revert</command> annullerà lo stato di <quote>rimosso</quote> del file e ne ripristinerà i contenuti.</para>
  22.106 +      </listitem></itemizedlist>
  22.107 +
  22.108 +    <sect2 id="sec:undo:mgmt">
  22.109 +      <title>Errori nella gestione dei file</title>
  22.110 +
  22.111 +      <para id="x_eb">Il comando <command role="hg-cmd">hg revert</command> non è utile solo per i file modificati, ma vi permette di invertire i risultati di tutti i comandi Mercurial di gestione dei file come <command role="hg-cmd">hg add</command>, <command role="hg-cmd">hg remove</command>, e così via.</para>
  22.112 +
  22.113 +      <para id="x_ec">Se usate <command role="hg-cmd">hg add</command> su un file, poi decidete che in effetti non volete che Mercurial ne tenga traccia, potete usare <command role="hg-cmd">hg revert</command> per annullare l&rsquo;operazione di aggiunta. Non preoccupatevi, Mercurial non modificherà il file in alcun modo, ma si limiterà a eliminare il <quote>contrassegno</quote> per quel file.</para>
  22.114 +
  22.115 +      &interaction.daily.revert.add;
  22.116 +
  22.117 +      <para id="x_ed">Similmente, se chiedete a Mercurial di rimuovere un file tramite <command role="hg-cmd">hg remove</command>, potete usare <command role="hg-cmd">hg revert</command> per ripristinarne i contenuti allo stato in cui erano nel genitore della directory di lavoro.</para>
  22.118 +      
  22.119 +      &interaction.daily.revert.remove;
  22.120 +      
  22.121 +      <para id="x_ef">Questo funziona altrettanto bene con un file che avete cancellato a mano senza dirlo a Mercurial (ricordatevi che, nella terminologia di Mercurial, questo file viene detto <quote>mancante</quote>).</para>
  22.122 +
  22.123 +      &interaction.daily.revert.missing;
  22.124 +
  22.125 +      <para id="x_ee">Se invertite l&rsquo;azione del comando <command role="hg-cmd">hg copy</command>, il file copiato rimane nella vostra directory di lavoro senza che Mercurial ne tenga traccia. Dato che l&rsquo;operazione di copia non ha effetti sul file originale, Mercurial non agisce in alcun modo su quel file.</para>
  22.126 +
  22.127 +      &interaction.daily.revert.copy;
  22.128 +    </sect2>
  22.129 +  </sect1>
  22.130 +
  22.131 +  <sect1>
  22.132 +    <title>Gestire i cambiamenti inseriti</title>
  22.133 +
  22.134 +    <para id="x_f5">Considerate il caso in cui avete inserito un cambiamento <emphasis>a</emphasis> e subito dopo un altro cambiamento <emphasis>b</emphasis> basato sul precedente, poi realizzate che il cambiamento <emphasis>a</emphasis> era sbagliato. Mercurial vi consente di <quote>ritirare</quote> sia un intero changeset automaticamente, sia certi <quote>mattoni da costruzione</quote> che vi permettono di invertire a mano parte di un changeset.</para>
  22.135 +
  22.136 +    <para id="x_f6">Prima di leggere questa sezione, c&rsquo;è una cosa che dovete tenere a mente: il comando <command role="hg-cmd">hg backout</command> annulla gli effetti di un cambiamento effettuando un&rsquo;<emphasis>aggiunta</emphasis> alla cronologia del vostro repository invece di modificarla o di eliminarne una parte. &Egrave; lo strumento giusto da usare se state correggendo un bug, ma non se state cercando di annullare qualche cambiamento che potrebbe avere conseguenze catastrofiche. Per trattare con questi ultimi, leggete la <xref linkend="sec:undo:aaaiiieee"/>.</para>
  22.137 +
  22.138 +    <sect2>
  22.139 +      <title>Ritirare un changeset</title>
  22.140 +
  22.141 +      <para id="x_f7">Il comando <command role="hg-cmd">hg backout</command> vi consente di <quote>annullare</quote> gli effetti di un intero changeset in modo automatico. Dato che la cronologia di Mercurial è immutabile, questo comando <emphasis>non</emphasis> si sbarazza del changeset che volete annullare, ma crea un nuovo changeset che <emphasis>inverte</emphasis> l&rsquo;effetto del changeset da annullare.</para>
  22.142 +
  22.143 +      <para id="x_f8">Le operazioni del comando <command role="hg-cmd">hg backout</command> sono un po&rsquo; intricate, quindi le illustreremo con alcuni esempi. Per prima cosa, creiamo un repository con alcuni semplici cambiamenti.</para>
  22.144 +
  22.145 +      &interaction.backout.init;
  22.146 +
  22.147 +      <para id="x_f9">Il comando <command role="hg-cmd">hg backout</command> prende come argomento un singolo identificatore di changeset che indica il changeset da annullare. Normalmente, <command role="hg-cmd">hg backout</command> vi presenterà un editor di testo per farvi scrivere un messaggio di commit, in modo che possiate registrare il motivo per cui state ritirando il cambiamento. In questo esempio, forniremo un messaggio di commit sulla riga di comando usando l&rsquo;opzione <option role="hg-opt-backout">-m</option>.</para>
  22.148 +
  22.149 +    </sect2>
  22.150 +    <sect2>
  22.151 +      <title>Ritirare il changeset di punta </title>
  22.152 +
  22.153 +      <para id="x_fa">Cominceremo ritirando l&rsquo;ultimo changeset che abbiamo inserito.</para>
  22.154 +
  22.155 +      &interaction.backout.simple;
  22.156 +
  22.157 +      <para id="x_fb">Potete vedere che la seconda riga di <filename>miofile</filename> non è più presente. Un&rsquo;occhiata all&rsquo;elenco generato da <command role="hg-cmd">hg log</command> ci dà un&rsquo;idea di quello che il comando <command role="hg-cmd">hg backout</command> ha fatto.</para>
  22.158 +      
  22.159 +      &interaction.backout.simple.log;
  22.160 +      
  22.161 +      <para id="x_fc">Notate che il nuovo changeset creato da <command role="hg-cmd">hg backout</command> è un figlio del changeset che abbiamo ritirato. Questo è più facile da vedere nella <xref linkend="fig:undo:backout"/>, che mostra una rappresentazione grafica della cronologia dei cambiamenti. Come potete vedere, la cronologia è gradevolmente lineare.</para>
  22.162 +
  22.163 +      <figure id="fig:undo:backout">
  22.164 +	<title>Ritirare un cambiamento tramite il comando <command role="hg-cmd">hg backout</command></title>
  22.165 +	<mediaobject>
  22.166 +	  <imageobject><imagedata fileref="figs/undo-simple.png"/></imageobject>
  22.167 +	  <textobject><phrase>XXX add text</phrase></textobject>
  22.168 +	</mediaobject>
  22.169 +      </figure>
  22.170 +
  22.171 +    </sect2>
  22.172 +    <sect2>
  22.173 +      <title>Ritirare un changeset diverso dalla punta</title>
  22.174 +
  22.175 +      <para id="x_fd">Se volete ritirare un cambiamento diverso dall&rsquo;ultimo che avete inserito, passate l&rsquo;opzione <option role="hg-opt-backout">--merge</option> al comando <command role="hg-cmd">hg backout</command>.</para>
  22.176 +
  22.177 +      &interaction.backout.non-tip.clone;
  22.178 +
  22.179 +      <para id="x_fe">Questo rende il ritiro di qualsiasi changeset una <quote>singola</quote> operazione che di solito è semplice e veloce.</para>
  22.180 +
  22.181 +      &interaction.backout.non-tip.backout;
  22.182 +
  22.183 +      <para id="x_ff">Se date un&rsquo;occhiata al contenuto di <filename>miofile</filename> dopo che l&rsquo;operazione di ritiro si è conclusa, vedrete che il primo e il terzo cambiamento sono presenti, ma non il secondo.</para>
  22.184 +
  22.185 +      &interaction.backout.non-tip.cat;
  22.186 +
  22.187 +      <para id="x_100">Come illustrato nella rappresentazione grafica della cronologia nella <xref linkend="fig:undo:backout-non-tip"/>, Mercurial inserisce ancora un cambiamento in questo tipo di situazione (il nodo rettangolare è quello che Mercurial inserisce automaticamente) ma il grafo delle revisioni ora è diverso. Prima di cominciare il processo di ritiro, Mercurial mantiene in memoria l&rsquo;identità del genitore corrente della directory di lavoro. Poi ritira il changeset indicato e inserisce quel genitore come un changeset. Infine, incorpora il genitore precedente della directory di lavoro, ma notate che <emphasis>non esegue il commit</emphasis> dei risultati dell&rsquo;unione. Il repository ora contiene due teste e la directory di lavoro contiene i risultati di un&rsquo;unione.</para>
  22.188 +
  22.189 +      <figure id="fig:undo:backout-non-tip">
  22.190 +	<title>Ritiro automatico di un changeset diverso dalla punta tramite il comando <command role="hg-cmd">hg backout</command></title>
  22.191 +	<mediaobject>
  22.192 +	  <imageobject><imagedata fileref="figs/undo-non-tip.png"/></imageobject>
  22.193 +	  <textobject><phrase>XXX add text</phrase></textobject>
  22.194 +	</mediaobject>
  22.195 +      </figure>
  22.196 +
  22.197 +      <para id="x_103">Il risultato è che siete tornati <quote>indietro a dove eravate</quote>, ma con una parte aggiuntiva di cronologia che annulla gli effetti del changeset che volevate ritirare.</para>
  22.198 +
  22.199 +      <para id="x_6b9">Potreste chiedervi perché Mercurial non effettua il commit dei risultati dell&rsquo;unione che ha eseguito. Il motivo è che Mercurial si comporta in maniera conservativa: di solito un&rsquo;unione ha maggiori probabilità di contenere errori rispetto all&rsquo;annullamento degli effetti del changeset di punta, quindi il vostro lavoro si troverà più al sicuro se prima ispezionate (e verificate!) i risultati dell&rsquo;unione e solo <emphasis>poi</emphasis> li inserite nel repository.</para>
  22.200 +
  22.201 +      <sect3>
  22.202 +	<title>Usate sempre l&rsquo;opzione <option role="hg-opt-backout">--merge</option></title>
  22.203 +
  22.204 +	<para id="x_104">In effetti, dato che l&rsquo;opzione <option role="hg-opt-backout">--merge</option> farà la <quote>cosa giusta</quote> a prescindere dal fatto che il changeset sia quello di punta o meno (cioè non cercherà di eseguire un&rsquo;unione se state ritirando la punta, dato che non ce n&rsquo;è bisogno), dovreste usare <emphasis>sempre</emphasis> questa opzione quando invocate il comando <command role="hg-cmd">hg backout</command>.</para>
  22.205 +
  22.206 +      </sect3>
  22.207 +    </sect2>
  22.208 +    <sect2>
  22.209 +      <title>Controllare meglio il processo di ritiro</title>
  22.210 +
  22.211 +      <para id="x_105">Sebbene vi abbia raccomandato di usare sempre l&rsquo;opzione <option role="hg-opt-backout">--merge</option> quando ritirate un cambiamento, il comando <command role="hg-cmd">hg backout</command> vi permette di decidere come incorporare un changeset ritirato. Avrete raramente bisogno di controllare il processo di ritiro a mano, ma potrebbe essere utile capire quello che il comando <command role="hg-cmd">hg backout</command> fa per voi automaticamente. Per illustrare queste operazioni, cloniamo il nostro primo repository, ma omettiamo il cambiamento ritirato che contiene.</para>
  22.212 +
  22.213 +      &interaction.backout.manual.clone;
  22.214 +
  22.215 +      <para id="x_106">Come nel nostro esempio precedente, inseriremo un terzo changeset, poi ritireremo il suo genitore e vedremo cosa succede.</para>
  22.216 +
  22.217 +      &interaction.backout.manual.backout;
  22.218 +
  22.219 +      <para id="x_107">Il nostro nuovo changeset è ancora un discendente del changeset che abbiamo ritirato e quindi è una nuova testa, <emphasis>non</emphasis> un discendente di quello che era il changeset di punta. Il comando <command role="hg-cmd">hg backout</command> è stato piuttosto esplicito nel farcelo notare.</para>
  22.220 +
  22.221 +      &interaction.backout.manual.log;
  22.222 +
  22.223 +      <para id="x_108">Ancora una volta, è facile vedere quello che è successo osservando il grafo della cronologia delle revisioni nella <xref linkend="fig:undo:backout-manual"/>. Questo grafo chiarifica che quando usiamo <command role="hg-cmd">hg backout</command> per ritirare un cambiamento diverso dalla punta, Mercurial aggiunge una nuova testa al repository (il cambiamento inserito ha la forma di un rettangolo).</para>
  22.224 +
  22.225 +      <figure id="fig:undo:backout-manual">
  22.226 +	<title>Ritirare un cambiamento tramite il comando <command role="hg-cmd">hg backout</command></title>
  22.227 +	<mediaobject>
  22.228 +	  <imageobject><imagedata fileref="figs/undo-manual.png"/></imageobject>
  22.229 +	  <textobject><phrase>XXX add text</phrase></textobject>
  22.230 +	</mediaobject>
  22.231 +      </figure>
  22.232 +
  22.233 +      <para id="x_10a">Dopo che il comando <command role="hg-cmd">hg backout</command> ha terminato, lascia il nuovo changeset <quote>ritirato</quote> come genitore della directory di lavoro.</para>
  22.234 +
  22.235 +      &interaction.backout.manual.parents;
  22.236 +
  22.237 +      <para id="x_10b">Ora abbiamo due insiemi isolati di cambiamenti.</para>
  22.238 +
  22.239 +      &interaction.backout.manual.heads;
  22.240 +
  22.241 +      <!--
  22.242 +      <para id="x_10c">Pensiamo a quello che ora ci aspettiamo di vedere come contenuto di <filename>miofile</filename>. Il primo cambiamento dovrebbe essere presente, perché non lo abbiamo mai ritirato. Il secondo cambiamento non dovrebbe esserci, dato che quello è il cambiamento che abbiamo ritirato. Visto che il grafo della cronologia mostra il terzo cambiamento come una testa separata, <emphasis>non</emphasis> ci aspettiamo di vedere il terzo cambiamento nel contenuto di <filename>miofile</filename>.</para>
  22.243 +      -->
  22.244 +      <para id="x_10c">Come mostrato dal grafo della cronologia, il ritiro del secondo cambiamento è stato introdotto come una testa separata, perciò il contenuto della nostra directory di lavoro non è cambiato rispetto al changeset che ha apportato il terzo cambiamento. Questa situazione viene confermata dal contenuto di <filename>miofile</filename>, che presenta tutte e tre le modifiche effettuate.</para>
  22.245 +
  22.246 +      &interaction.backout.manual.cat;
  22.247 +
  22.248 +      <!--
  22.249 +      <para id="x_10d">Per riottenere il terzo cambiamento nel file, eseguiamo semplicemente una normale unione tra le nostre due teste.</para>
  22.250 +      -->
  22.251 +      <para id="x_10d">Per ottenere solamente il primo e il terzo cambiamento nel file, ci basta eseguire una normale unione tra le nostre due teste.</para>
  22.252 +
  22.253 +      &interaction.backout.manual.merge;
  22.254 +
  22.255 +      <para id="x_10e">Successivamente, la cronologia del nostro repository può essere rappresentata graficamente come nella <xref linkend="fig:undo:backout-manual-merge"/>.</para>
  22.256 +
  22.257 +      <figure id="fig:undo:backout-manual-merge">
  22.258 +	<title>Incorporare manualmente un cambiamento ritirato</title>
  22.259 +	<mediaobject>
  22.260 +	  <imageobject><imagedata fileref="figs/undo-manual-merge.png"/></imageobject>
  22.261 +	  <textobject><phrase>XXX add text</phrase></textobject>
  22.262 +	</mediaobject>
  22.263 +      </figure>
  22.264 +
  22.265 +    </sect2>
  22.266 +    <sect2>
  22.267 +      <title>Perché <command role="hg-cmd">hg backout</command> funziona in questo modo</title>
  22.268 +
  22.269 +      <para id="x_110">Ecco una breve descrizione del funzionamento del comando <command role="hg-cmd">hg backout</command>.</para>
  22.270 +      <orderedlist>
  22.271 +	<listitem><para id="x_111">Si assicura che la directory di lavoro sia <quote>pulita</quote>, cioè che l&rsquo;elenco generato da <command role="hg-cmd">hg status</command> sia vuoto.</para>
  22.272 +	</listitem>
  22.273 +	<listitem><para id="x_112">Memorizza il genitore corrente della directory di lavoro. Chiamiamo <literal>orig</literal> questo changeset.</para>
  22.274 +	</listitem>
  22.275 +	<listitem><para id="x_113">Esegue l&rsquo;equivalente di un&rsquo;invocazione di <command role="hg-cmd">hg update</command> per sincronizzare la directory di lavoro con il changeset che volete ritirare. Chiamiamo <literal>backout</literal> questo changeset.</para>
  22.276 +	</listitem>
  22.277 +	<listitem><para id="x_114">Trova il genitore di quel changeset. Chiamiamo <literal>parent</literal> questo changeset.</para>
  22.278 +	</listitem>
  22.279 +	<listitem><para id="x_115">Per ogni file su cui il changeset <literal>backout</literal> ha avuto effetto, esegue l&rsquo;equivalente del comando <command role="hg-cmd">hg revert -r parent</command> sul file per ripristinare il contenuto che aveva prima che quel changeset venisse inserito.</para>
  22.280 +	</listitem>
  22.281 +	<listitem><para id="x_116">Esegue il commit del risultato come un nuovo changeset che ha <literal>backout</literal> come genitore.</para>
  22.282 +	</listitem>
  22.283 +	<listitem><para id="x_117">Se specificate l&rsquo;opzione <option role="hg-opt-backout">--merge</option> sulla riga di comando, esegue un&rsquo;unione con <literal>orig</literal> ma non inserisce i risultati dell&rsquo;unione nel repository.</para>
  22.284 +	</listitem></orderedlist>
  22.285 +
  22.286 +      <para id="x_118">In alternativa, sarebbe possibile implementare <command role="hg-cmd">hg backout</command> utilizzando <command role="hg-cmd">hg export</command> per esportare il changeset da ritirare sotto forma di diff e poi impiegando l&rsquo;opzione <option role="cmd-opt-patch">--reverse</option> del comando <command>patch</command> per invertire l&rsquo;effetto del cambiamento senza gingillarsi con la directory di lavoro. Questo procedimento sembra molto più semplice, ma non funzionerebbe affatto altrettanto bene.</para>
  22.287 +
  22.288 +      <para id="x_119">Il comando <command role="hg-cmd">hg backout</command> esegue un aggiornamento, un inserimento, un&rsquo;unione e un altro inserimento per dare al meccanismo di unione la possibilità di fare il miglior lavoro possibile nel gestire tutte le modifiche avvenute <emphasis>tra</emphasis> il cambiamento che state ritirando e la revisione di punta corrente.</para>
  22.289 +
  22.290 +      <para id="x_11a">Se state ritirando un cambiamento che si trova 100 revisioni indietro nella cronologia del vostro progetto, le probabilità che il comando <command>patch</command> sia in grado di applicare un diff invertito in maniera pulita non sono molto alte, perché i cambiamenti intercorsi avranno probabilmente <quote>rovinato il contesto</quote> utilizzato da <command>patch</command> per determinare se può applicare una patch (se questo vi sembra incomprensibile, leggete la <xref linkend="sec:mq:patch"/> per una discussione sul comando <command>patch</command>). In più, il meccanismo di unione di Mercurial riesce a gestire i cambiamenti di nome e di permessi per file e directory e le modifiche ai file binari, mentre <command>patch</command> non è in grado di farlo.</para>
  22.291 +
  22.292 +    </sect2>
  22.293 +  </sect1>
  22.294 +  <sect1 id="sec:undo:aaaiiieee">
  22.295 +    <title>Modifiche che non avrebbero mai dovuto essere fatte</title>
  22.296 +
  22.297 +    <para id="x_11b">Quasi sempre, il comando <command role="hg-cmd">hg backout</command> è esattamente quello che vi serve se volete annullare gli effetti di un cambiamento. Il comando lascia una registrazione permanente di quello che avete fatto, sia quando avete inserito il changeset originale che quando avete successivamente rimesso in ordine.</para>
  22.298 +
  22.299 +    <para id="x_11c">In rare occasioni, comunque, potreste scoprire di aver inserito un cambiamento che non dovrebbe essere presente nel repository proprio per niente. Per esempio, sarebbe molto inusuale, e di solito considerato un errore, inserire in un repository i file oggetto di un progetto software insieme ai suoi file sorgente. I file oggetto non hanno praticamente alcun valore intrinseco e sono <emphasis>grandi</emphasis>, quindi aumentano la dimensione del repository e il tempo necessario a clonarlo o a estrarne i cambiamenti.</para>
  22.300 +
  22.301 +    <para id="x_11d">Prima di illustrare le opzioni a vostra disposizione se eseguite il commit di un cambiamento <quote>da sacchetto di carta marrone</quote> (quel tipo di modifiche talmente infelici che vorreste nascondere la testa in un sacchetto di carta marrone), lasciatemi discutere alcuni approcci che probabilmente non funzioneranno.</para>
  22.302 +
  22.303 +    <para id="x_11e">Dato che Mercurial tratta la cronologia in maniera cumulativa&emdash;ogni cambiamento si basa su tutti i cambiamenti che lo precedono&emdash;in genere non è possibile far semplicemente sparire i cambiamenti disastrosi. L&rsquo;unica eccezione capita quando avete appena inserito una modifica che non è ancora stata propagata verso qualche altro repository. In questo caso, potete tranquillamente usare il comando <command role="hg-cmd">hg rollback</command>, come descritto nella <xref linkend="sec:undo:rollback"/>.</para>
  22.304 +
  22.305 +    <para id="x_11f">Dopo che avete trasmesso un cambiamento sbagliato a un altro repository, <emphasis>potreste</emphasis> ancora usare <command role="hg-cmd">hg rollback</command> per far scomparire la vostra copia locale del cambiamento, ma questa azione non avrà le conseguenze che volete. Il cambiamento sarà ancora presente nel repository remoto, quindi riapparirà nel vostro repository locale la prossima volta che effettuerete un&rsquo;estrazione.</para>
  22.306 +
  22.307 +    <para id="x_120">Se vi trovate in una situazione come questa e sapete quali sono i repository verso cui si è propagato il vostro cambiamento sbagliato, potete <emphasis>provare</emphasis> a sbarazzarvi del cambiamento in <emphasis>ognuno</emphasis> di quei repository. Questa, naturalmente, non è una soluzione soddisfacente: se tralasciate anche un singolo repository quando state ripulendo, il cambiamento sarà ancora <quote>là fuori</quote> e potrebbe propagarsi ulteriormente.</para>
  22.308 +
  22.309 +    <para id="x_121">Se avete inserito uno o più cambiamenti <emphasis>dopo</emphasis> il cambiamento che vorreste veder sparire, le vostre opzioni si riducono ulteriormente. Mercurial non offre alcun modo per <quote>fare un buco</quote> nella cronologia lasciando gli altri changeset intatti.</para>
  22.310 +
  22.311 +    <sect2>
  22.312 +      <title>Ritirare un&rsquo;unione</title>
  22.313 +
  22.314 +      <para id="x_6ba">Dato che le unioni sono spesso complicate, si sono sentiti casi di unioni gravemente rovinate, ma i cui risultati sono stati erroneamente inseriti in un repository. Mercurial fornisce un&rsquo;importante protezione contro le unioni sbagliate rifiutandosi di eseguire il commit di file irrisolti, ma l&rsquo;ingenuità umana garantisce che sia ancora possibile mettere sottosopra un&rsquo;unione e registrarne i risultati.</para>
  22.315 +
  22.316 +      <para id="x_6bb">Di solito, il modo migliore per affrontare la registrazione di un&rsquo;unione sbagliata è semplicemente quello di provare a riparare il danno a mano. Un completo disastro che non possa venire corretto a mano dovrebbe essere molto raro, ma il comando <command role="hg-cmd">hg backout</command> può aiutare a rendere la pulizia più semplice attraverso l&rsquo;opzione <option role="hg-opt-backout">--parent</option>, che vi consente di specificare a quale genitore tornare quando state ritirando un&rsquo;unione.</para>
  22.317 +
  22.318 +      <figure id="fig:undo:bad-merge-1">
  22.319 +	<title>Un&rsquo;unione sbagliata</title>
  22.320 +	<mediaobject>
  22.321 +	  <imageobject><imagedata fileref="figs/bad-merge-1.png"/></imageobject>
  22.322 +	  <textobject><phrase>XXX add text</phrase></textobject>
  22.323 +	</mediaobject>
  22.324 +      </figure>
  22.325 +
  22.326 +      <para id="x_6bc">Supponete di avere un grafo delle revisioni simile a quello della <xref linkend="fig:undo:bad-merge-1"/>. Ci piacerebbe <emphasis>rifare</emphasis> l&rsquo;unione tra le revisioni 2 e 3.</para>
  22.327 +
  22.328 +      <para id="x_6bd">Potremmo eseguire questa operazione nel modo seguente.</para>
  22.329 +
  22.330 +      <orderedlist>
  22.331 +	<listitem>
  22.332 +	  <para id="x_6be">Invocare <command role="hg-cmd">hg backout --rev=4 --parent=2</command>. Questo dice al comando <command role="hg-cmd">hg backout</command> di ritirare la revisione 4, che è l&rsquo;unione sbagliata, e di scegliere il genitore 2, uno dei genitori dell&rsquo;unione, al momento di decidere quale revisione preferire. L&rsquo;effetto del comando può essere visto nella <xref linkend="fig:undo:bad-merge-2"/>.</para>
  22.333 +	  <figure id="fig:undo:bad-merge-2">
  22.334 +	    <title>Ritirare l&rsquo;unione favorendo un genitore</title>
  22.335 +	    <mediaobject>
  22.336 +	      <imageobject><imagedata fileref="figs/bad-merge-2.png"/></imageobject>
  22.337 +	      <textobject><phrase>XXX add text</phrase></textobject>
  22.338 +	    </mediaobject>
  22.339 +	  </figure>
  22.340 +	</listitem>
  22.341 +
  22.342 +	<listitem>
  22.343 +	  <para id="x_6bf">Invocare <command role="hg-cmd">hg backout --rev=4 --parent=3</command>. Questo dice al comando <command role="hg-cmd">hg backout</command> di ritirare ancora la revisione 4, ma questa volta scegliendo il genitore 3, l&rsquo;altro genitore dell&rsquo;unione. Il risultato è visibile nella <xref linkend="fig:undo:bad-merge-3"/>, in cui il repository ora contiene tre teste.</para>
  22.344 +	  <figure id="fig:undo:bad-merge-3">
  22.345 +	    <title>Ritirare l&rsquo;unione favorendo l&rsquo;altro genitore</title>
  22.346 +	    <mediaobject>
  22.347 +	      <imageobject><imagedata fileref="figs/bad-merge-3.png"/></imageobject>
  22.348 +	      <textobject><phrase>XXX add text</phrase></textobject>
  22.349 +	    </mediaobject>
  22.350 +	  </figure>
  22.351 +	</listitem>
  22.352 +
  22.353 +	<listitem>
  22.354 +	  <para id="x_6c0">Rifare l&rsquo;unione sbagliata unendo le due teste generate dai ritiri, riducendo quindi a due il numero di teste nel repository, come si può vedere nella <xref linkend="fig:undo:bad-merge-4"/>.</para>
  22.355 +	  <figure id="fig:undo:bad-merge-4">
  22.356 +	    <title>Unire i risultati dei ritiri</title>
  22.357 +	    <mediaobject>
  22.358 +	      <imageobject><imagedata fileref="figs/bad-merge-4.png"/></imageobject>
  22.359 +	      <textobject><phrase>XXX add text</phrase></textobject>
  22.360 +	    </mediaobject>
  22.361 +	  </figure>
  22.362 +	</listitem>
  22.363 +
  22.364 +	<listitem>
  22.365 +	  <para id="x_6c1">Eseguire un&rsquo;unione con il commit che è stato eseguito dopo l&rsquo;unione sbagliata, come mostrato nella <xref linkend="fig:undo:bad-merge-5"/>.</para>
  22.366 +	  <figure id="fig:undo:bad-merge-5">
  22.367 +	    <title>Unire i risultati dei ritiri</title>
  22.368 +	    <mediaobject>
  22.369 +	      <imageobject><imagedata fileref="figs/bad-merge-5.png"/></imageobject>
  22.370 +	      <textobject><phrase>XXX add text</phrase></textobject>
  22.371 +	    </mediaobject>
  22.372 +	  </figure>
  22.373 +	</listitem>
  22.374 +      </orderedlist>
  22.375 +    </sect2>
  22.376 +
  22.377 +    <sect2>
  22.378 +      <title>Proteggervi dai cambiamenti che vi sono <quote>sfuggiti</quote></title>
  22.379 +
  22.380 +      <para id="x_123">Se avete inserito alcuni cambiamenti nel vostro repository locale e li avete propagati da qualche altra parte, questo non è necessariamente un disastro. Potete proteggervi prevenendo la comparsa di alcuni tipi di changeset sbagliati. Questo è particolarmente facile se di solito il vostro gruppo di lavoro estrae i cambiamenti da un repository centrale.</para>
  22.381 +
  22.382 +      <para id="x_124">Configurando alcuni hook su quel repository per convalidare i changeset in entrata (si veda il <xref linkend="chap:hook"/>), potete automaticamente evitare che alcuni tipi di changeset sbagliati compaiano nel repository centrale. Con una tale configurazione, alcuni tipi di changeset sbagliati tenderanno naturalmente a <quote>estinguersi</quote> perché non possono propagarsi verso il repository centrale. Ancora meglio, questo accade senza alcun bisogno di un intervento esplicito.</para>
  22.383 +
  22.384 +      <para id="x_125">Per esempio, un hook sui cambiamenti in entrata programmato per verificare che un changeset si possa effettivamente compilare è in grado di prevenire involontari <quote>guasti</quote> al processo di assemblaggio.</para>
  22.385 +    </sect2>
  22.386 +
  22.387 +    <sect2>
  22.388 +      <title>Cosa fare con i cambiamenti sensibili che sfuggono</title>
  22.389 +
  22.390 +      <para id="x_6c2">Persino un progetto gestito con attenzione può subire eventi sfortunati come il commit di un file che contiene password importanti e la sua incontrollata propagazione.</para>
  22.391 +
  22.392 +      <para id="x_6c3">Se qualcosa del genere dovesse accadervi e le informazioni che vengono accidentalmente propagate fossero davvero sensibili, il vostro primo passo dovrebbe essere quello di mitigare l&rsquo;effetto della perdita senza cercare di controllare la perdita stessa. Se non siete sicuri al 100% di sapere esattamente chi può aver visto i cambiamenti, dovreste immediatamente cambiare le password, cancellare le carte di credito, o trovare qualche altro modo per assicurarvi che le informazioni trapelate non siano più utili. In altre parole, assumete che il cambiamento si sia propagato in lungo e in largo e che non ci sia più niente che potete fare.</para>
  22.393 +
  22.394 +      <para id="x_6c4">Potreste sperare che ci sia qualche meccanismo da usare per scoprire chi ha visto un cambiamento o per cancellare il cambiamento permanentemente e ovunque, ma ci sono buone ragioni per cui queste operazioni non sono possibili.</para>
  22.395 +
  22.396 +      <para id="x_6c5">Mercurial non fornisce una traccia registrata di chi ha estratto i cambiamenti da un repository, perché di solito questa informazione è impossibile da raccogliere o è facile da falsificare. In un ambiente multi-utente o di rete, dovreste quindi dubitare fortemente di voi stessi se pensate di aver identificato ogni luogo in cui un cambiamento sensibile si è propagato. Non dimenticate che le persone possono spedire allegati via email, salvare i propri dati su altri computer tramite il software di backup, trasportare i repository su chiavi USB e trovare altri modi completamente innocenti di confondere i vostri tentativi di rintracciare ogni copia di un cambiamento problematico.</para>
  22.397 +
  22.398 +      <para id="x_6c6">In più, Mercurial non vi fornisce un modo per far completamente sparire un changeset dalla cronologia perché non c&rsquo;è alcun modo di imporre la sua sparizione, dato che qualcuno potrebbe facilmente modificare la propria copia di Mercurial per ignorare quelle direttive. E poi, se anche Mercurial fornisse questa funzione, qualcuno che semplicemente non abbia estratto il changeset che <quote>fa sparire questo file</quote> non ne godrebbe gli effetti, né lo farebbero i programmi di indicizzazione web che visitano un repository al momento sbagliato, i backup del disco, o altri meccanismi. In effetti, nessun sistema distribuito di controllo di revisione può far sparire dati in maniera affidabile. Dare l&rsquo;illusione di un controllo di questo tipo potrebbe facilmente conferirvi un falso senso di sicurezza, peggiorando le cose rispetto a non darvela affatto.</para>
  22.399 +    </sect2>
  22.400 +  </sect1>
  22.401 +
  22.402 +  <sect1 id="sec:undo:bisect">
  22.403 +    <title>Trovare la causa di un bug</title>
  22.404 +
  22.405 +    <para id="x_126">Essere in grado di ritirare un changeset che ha introdotto un bug va benissimo, ma richiede che sappiate quale changeset va ritirato. Mercurial offre un inestimabile comando, chiamato <command role="hg-cmd">hg bisect</command>, che vi aiuta ad automatizzare questo processo e a completarlo in maniera molto efficiente.</para>
  22.406 +
  22.407 +    <para id="x_127">L&rsquo;idea alla base del comando <command role="hg-cmd">hg bisect</command> è che un changeset abbia introdotto una modifica di comportamento che potete identificare con un semplice test binario di successo o fallimento. Non sapete quale porzione di codice ha introdotto il cambiamento, ma sapete come verificare la presenza del bug. Il comando <command role="hg-cmd">hg bisect</command> usa il vostro test per dirigere la propria ricerca del changeset che ha introdotto il codice che ha causato il bug.</para>
  22.408 +
  22.409 +    <para id="x_128">Ecco alcuni scenari di esempio per aiutarvi a capire come potreste applicare questo comando.</para>
  22.410 +    <itemizedlist>
  22.411 +      <listitem><para id="x_129">La versione più recente del vostro software ha un bug che non ricordate fosse presente alcune settimane prima, ma non sapete quando il bug è stato introdotto. Qui, il vostro test binario controlla la presenza di quel bug.</para>
  22.412 +      </listitem>
  22.413 +      <listitem><para id="x_12a">Avete corretto un bug in tutta fretta e ora è il momento di chiudere la relativa voce nel database dei bug del vostro gruppo. Il database dei bug richiede un identificatore di changeset quando chiudete una voce, ma non ricordate in quale changeset avete corretto il bug. Ancora una volta, il vostro test binario controlla la presenza del bug.</para>
  22.414 +      </listitem>
  22.415 +      <listitem><para id="x_12b">Il vostro software funziona correttamente, ma è più lento del 15% rispetto all&rsquo;ultima volta che avete compiuto questa misurazione. Volete sapere quale changeset ha introdotto il calo di prestazioni. In questo caso, il vostro test binario misura le prestazioni del vostro software per vedere se è <quote>veloce</quote> o <quote>lento</quote>.</para>
  22.416 +      </listitem>
  22.417 +      <listitem><para id="x_12c">La dimensione dei componenti del progetto che rilasciate è esplosa di recente e sospettate che qualcosa sia cambiato nel modo in cui assemblate il progetto.</para>
  22.418 +      </listitem></itemizedlist>
  22.419 +
  22.420 +    <para id="x_12d">Da questi esempi, dovrebbe essere chiaro che il comando <command role="hg-cmd">hg bisect</command> non è utile solo per trovare le cause dei bug. Potete usarlo per trovare qualsiasi <quote>proprietà emergente</quote> di un repository (qualsiasi cosa che non potete trovare con una semplice ricerca di testo sui file contenuti nell&rsquo;albero) per la quale sia possibile scrivere un test binario.</para>
  22.421 +
  22.422 +    <para id="x_12e">Ora introdurremo un po&rsquo; di terminologia, giusto per chiarire quali sono le parti del processo di ricerca di cui siete responsabili voi e quali sono quelle di cui è responsabile Mercurial. Un <emphasis>test</emphasis> è qualcosa che <emphasis>voi</emphasis> eseguite quando <command role="hg-cmd">hg bisect</command> sceglie un changeset. Una <emphasis>sonda</emphasis> è ciò che <command role="hg-cmd">hg bisect</command> esegue per dirvi se una revisione è buona. Infine, useremo la parola <quote>bisezione</quote> per intendere la <quote>ricerca tramite il comando <command role="hg-cmd">hg bisect</command></quote>.</para>
  22.423 +
  22.424 +    <para id="x_12f">Un modo semplice per automatizzare il processo di ricerca sarebbe quello di collaudare semplicemente tutti i changeset. Tuttavia, questo approccio è scarsamente scalabile. Se ci volessero dieci minuti per collaudare un singolo changeset e il vostro repository contenesse 10.000 changeset, l&rsquo;approccio completo impiegherebbe una media di 35 <emphasis>giorni</emphasis> per trovare il changeset che ha introdotto un bug. Anche se sapeste che il bug è stato introdotto in uno degli ultimi 500 changeset e limitaste la ricerca a quelli, dovrebbero trascorrere più di 40 ore per trovare il changeset che ha introdotto il vostro bug.</para>
  22.425 +
  22.426 +    <para id="x_130">Il comando <command role="hg-cmd">hg bisect</command> invece usa la propria conoscenza della <quote>forma</quote> della cronologia delle revisioni del vostro progetto per effettuare una ricerca in tempo proporzionale al <emphasis>logaritmo</emphasis> del numero dei changeset da controllare (il tipo di ricerca che esegue viene chiamata ricerca dicotomica). Con questo approccio, la ricerca attraverso 10.000 changeset impiegherà meno di 3 ore, anche a 10 minuti per test (la ricerca richiederà circa 14 test). Limitate la vostra ricerca agli ultimi cento changeset e il tempo impiegato sarà solo circa un&rsquo;ora (approssimativamente sette test).</para>
  22.427 +
  22.428 +    <para id="x_131">Il comando <command role="hg-cmd">hg bisect</command> è consapevole della natura <quote>ramificata</quote> della cronologia delle revisioni di un progetto Mercurial, quindi non ha problemi a trattare con rami, unioni, o molteplici teste in un repository. Opera in maniera così efficiente perché è in grado di potare interi rami di cronologia con una singola sonda.</para>
  22.429 +
  22.430 +    <sect2>
  22.431 +      <title>Usare il comando <command role="hg-cmd">hg bisect</command></title>
  22.432 +
  22.433 +      <para id="x_132">Ecco un esempio di <command role="hg-cmd">hg bisect</command> in azione.</para>
  22.434 +
  22.435 +      <note>
  22.436 +	<para id="x_133">Fino alla versione 0.9.5 di Mercurial compresa, <command role="hg-cmd">hg bisect</command> non era uno dei comandi principali, ma veniva distribuito con Mercurial sotto forma di estensione. Questa sezione descrive il comando predefinito, non la vecchia estensione.</para>
  22.437 +      </note>
  22.438 +
  22.439 +      <para id="x_134">Ora creiamo un nuovo repository in modo che possiate provare il comando <command role="hg-cmd">hg bisect</command> in isolamento.</para>
  22.440 +
  22.441 +      &interaction.bisect.init;
  22.442 +
  22.443 +      <para id="x_135">Simuleremo un progetto con un bug in modo molto semplice: creiamo cambiamenti elementari in un ciclo e designamo uno specifico cambiamento che conterrà il <quote>bug</quote>. Questo ciclo crea 35 changeset, ognuno dei quali aggiunge un singolo file al repository. Rappresenteremo il nostro <quote>bug</quote> con un file che contiene il testo <quote>ho un gub</quote>.</para>
  22.444 +
  22.445 +      &interaction.bisect.commits;
  22.446 +
  22.447 +      <para id="x_136">La prossima cosa che vorremmo fare è capire come usare il comando <command role="hg-cmd">hg bisect</command>. Possiamo usare il normale meccanismo di aiuto predefinito di Mercurial per fare questo.</para>
  22.448 +
  22.449 +      &interaction.bisect.help;
  22.450 +
  22.451 +      <para id="x_137">Il comando <command role="hg-cmd">hg bisect</command> lavora in più passi. Ogni passo procede nella maniera seguente.</para>
  22.452 +      <orderedlist>
  22.453 +	<listitem><para id="x_138">Eseguite il vostro test binario.</para>
  22.454 +	  <itemizedlist>
  22.455 +	    <listitem><para id="x_139">Se il test ha avuto successo, informate <command role="hg-cmd">hg bisect</command> invocando il comando <command role="hg-cmd">hg bisect --good</command>.</para>
  22.456 +	    </listitem>
  22.457 +	    <listitem><para id="x_13a">Se il test è fallito, invocate il comando <command role="hg-cmd">hg bisect --bad</command>.</para>
  22.458 +        </listitem>
  22.459 +      </itemizedlist>
  22.460 +	</listitem>
  22.461 +	<listitem><para id="x_13b">Il comando usa le vostre informazioni per decidere quale changeset collaudare successivamente.</para>
  22.462 +	</listitem>
  22.463 +	<listitem><para id="x_13c">Il comando aggiorna la directory di lavoro a quel changeset e il processo ricomincia da capo.</para>
  22.464 +	</listitem></orderedlist>
  22.465 +      <para id="x_13d">Il processo termina quando <command role="hg-cmd">hg bisect</command> identifica un unico cambiamento che indica il punto in cui il vostro test passa dallo stato di <quote>successo</quote> a quello di <quote>fallimento</quote>.</para>
  22.466 +
  22.467 +      <para id="x_13e">Per cominciare la ricerca, dobbiamo eseguire il comando <command role="hg-cmd">hg bisect --reset</command>.</para>
  22.468 +
  22.469 +      &interaction.bisect.search.init;
  22.470 +
  22.471 +      <para id="x_13f">Nel nostro caso, il test binario che usiamo è semplice: controlliamo il repository per vedere se qualche file contiene la stringa <quote>ho un gub</quote>. Se è così, questo changeset contiene il cambiamento che ha <quote>causato il bug</quote>. Per convenzione, un changeset che ha la proprietà che stiamo cercando è <quote>guasto</quote>, mentre uno che non ce l&rsquo;ha è <quote>funzionante</quote>.</para>
  22.472 +
  22.473 +      <para id="x_140">Quasi sempre, la revisione su cui la directory di lavoro è sincronizzata (di solito, la punta) esibisce già il problema introdotto dal cambiamento malfunzionante, quindi la indicheremo come <quote>guasta</quote>.</para>
  22.474 +
  22.475 +      &interaction.bisect.search.bad-init;
  22.476 +
  22.477 +      <para id="x_141">Il nostro compito successivo consiste nel nominare un changeset che sappiamo <emphasis>non</emphasis> contenere il bug, in modo che il comando <command role="hg-cmd">hg bisect</command> possa <quote>circoscrivere</quote> la ricerca tra il primo changeset funzionante e il primo changeset guasto. Nel nostro caso, sappiamo che la revisione 10 non conteneva il bug. (Spiegherò meglio come scegliere il primo changeset <quote>funzionante</quote> più avanti.)</para>
  22.478 +
  22.479 +      &interaction.bisect.search.good-init;
  22.480 +
  22.481 +      <para id="x_142">Notate che questo comando ha stampato alcune informazioni.</para>
  22.482 +      <itemizedlist>
  22.483 +	<listitem><para id="x_143">Ci ha detto quanti changeset deve considerare prima di poter identificare quello che ha introdotto il bug e quanti test saranno richiesti dal processo.</para>
  22.484 +	</listitem>
  22.485 +	<listitem><para id="x_144">Ha aggiornato la directory di lavoro al prossimo changeset da collaudare e ci ha detto quale changeset sta collaudando.</para>
  22.486 +	</listitem></itemizedlist>
  22.487 +
  22.488 +      <para id="x_145">Ora eseguiamo il nostro test nella directory di lavoro, usando il comando <command>grep</command> per vedere se il nostro file <quote>guasto</quote> è presente. Se c&rsquo;è, questa revisione è guasta, altrimenti è funzionante.</para>
  22.489 +      
  22.490 +      &interaction.bisect.search.step1;
  22.491 +
  22.492 +      <para id="x_146">Questo test sembra un perfetto candidato per l&rsquo;automazione, quindi trasformiamolo in una funzione di shell.</para>
  22.493 +      
  22.494 +      &interaction.bisect.search.mytest;
  22.495 +
  22.496 +      <para id="x_147">Ora possiamo eseguire un intero passo di collaudo con il singolo comando <literal>miotest</literal>.</para>
  22.497 +
  22.498 +      &interaction.bisect.search.step2;
  22.499 +
  22.500 +      <para id="x_148">Ancora qualche altra invocazione del comando che abbiamo preparato per il passo di collaudo e abbiamo finito.</para>
  22.501 +
  22.502 +      &interaction.bisect.search.rest;
  22.503 +
  22.504 +      <para id="x_149">Anche se avevamo 40 changeset attraverso cui cercare, il comando <command role="hg-cmd">hg bisect</command> ci ha permesso di trovare il changeset che ha introdotto il nostro <quote>bug</quote> usando solo cinque test. Dato che il numero di test effettuati dal comando <command role="hg-cmd">hg bisect</command> cresce con il logaritmo del numero dei changeset da analizzare, il vantaggio che ha rispetto a una ricerca che usa la strategia della <quote>forza bruta</quote> aumenta con ogni changeset che aggiungete.</para>
  22.505 +
  22.506 +    </sect2>
  22.507 +    <sect2>
  22.508 +      <title>Riordinare dopo la vostra ricerca</title>
  22.509 +
  22.510 +      <para id="x_14a">Quando avete finito di usare il comando <command role="hg-cmd">hg bisect</command> in un repository, potete invocare il comando <command role="hg-cmd">hg bisect --reset</command> in modo da scartare le informazioni che venivano usate per guidare la vostra ricerca. Il comando non usa molto spazio, quindi non è un problema se vi dimenticate di effettuare questa invocazione. Tuttavia, <command role="hg-cmd">hg bisect</command> non vi permetterà di cominciare una nuova ricerca in quel repository fino a quando non avrete eseguito <command role="hg-cmd">hg bisect --reset</command>.</para>
  22.511 +
  22.512 +      &interaction.bisect.search.reset;
  22.513 +
  22.514 +    </sect2>
  22.515 +  </sect1>
  22.516 +  <sect1>
  22.517 +    <title>Suggerimenti per trovare efficacemente i bug</title>
  22.518 +
  22.519 +    <sect2>
  22.520 +      <title>Fornite informazioni consistenti</title>
  22.521 +
  22.522 +      <para id="x_14b">Il comando <command role="hg-cmd">hg bisect</command> vi richiede di indicare correttamente il risultato di ogni test che eseguite. Se gli dite che un test è fallito quando in realtà ha avuto successo, il comando <emphasis>potrebbe</emphasis> essere in grado di scoprire l&rsquo;inconsistenza. Se riesce a identificare un&rsquo;inconsistenza nei vostri resoconti, vi dirà che un particolare changeset è sia funzionante che guasto. Tuttavia, non è in grado di farlo perfettamente ed è ugualmente probabile che vi restituisca il changeset sbagliato come causa del bug.</para>
  22.523 +
  22.524 +    </sect2>
  22.525 +    <sect2>
  22.526 +      <title>Automatizzate il più possibile</title>
  22.527 +
  22.528 +      <para id="x_14c">Quando ho cominciato a usare il comando <command role="hg-cmd">hg bisect</command>, ho provato a eseguire alcune volte i miei test a mano sulla riga di comando. Questo non è l&rsquo;approccio adatto, almeno per me. Dopo alcune prove, mi sono accorto che stavo facendo abbastanza errori da dover ricominciare le mie ricerche diverse volte prima di riuscire a ottenere i risultati corretti.</para>
  22.529 +
  22.530 +      <para id="x_14d">I miei problemi iniziali nel guidare a mano il comando <command role="hg-cmd">hg bisect</command> si sono verificati anche con ricerche semplici su repository di piccole dimensioni, ma se il problema che state cercando è più sottile, o se il numero di test che <command role="hg-cmd">hg bisect</command> deve eseguire aumenta, la probabilità che un errore umano rovini la ricerca è molto più alta. Una volta che ho cominciato ad automatizzare i miei test, ho ottenuto risultati molto migliori.</para>
  22.531 +
  22.532 +      <para id="x_14e">La chiave del collaudo automatizzato è duplice:</para>
  22.533 +      <itemizedlist>
  22.534 +	<listitem><para id="x_14f">verificate sempre lo stesso sintomo, e</para>
  22.535 +	</listitem>
  22.536 +	<listitem><para id="x_150">fornite sempre informazioni consistenti al comando <command role="hg-cmd">hg bisect</command>.</para>
  22.537 +	</listitem></itemizedlist>
  22.538 +      <para id="x_151">Nel mio esempio precedente, il comando <command>grep</command> verifica il sintomo e l&rsquo;istruzione <literal>if</literal> usa il risultato di questo controllo per assicurarsi di fornire la stessa informazione al comando <command role="hg-cmd">hg bisect</command>. La funzione <literal>miotest</literal> ci permette di riprodurre insieme queste due operazioni, in modo che ogni test sia uniforme e consistente.</para>
  22.539 +
  22.540 +    </sect2>
  22.541 +    <sect2>
  22.542 +      <title>Controllate i vostri risultati</title>
  22.543 +
  22.544 +      <para id="x_152">Dato che il risultato di una ricerca con <command role="hg-cmd">hg bisect</command> è solo tanto buono quanto le informazioni che passate al comando, non prendete il changeset che vi indica come la verità assoluta. Un modo semplice di effettuare un riscontro sul risultato è quello di eseguire manualmente il vostro test su ognuno dei changeset seguenti.</para>
  22.545 +      <itemizedlist>
  22.546 +	<listitem><para id="x_153">Il changeset che il comando riporta come la prima revisione guasta. Il vostro test dovrebbe verificare che la revisione sia effettivamente guasta.</para>
  22.547 +	</listitem>
  22.548 +	<listitem><para id="x_154">Il genitore di quel changeset (entrambi i genitori, se è un&rsquo;unione). Il vostro test dovrebbe verificare che quel changeset sia funzionante.</para>
  22.549 +	</listitem>
  22.550 +	<listitem><para id="x_155">Un figlio di quel changeset. Il vostro test dovrebbe verificare che quel changeset sia guasto.</para>
  22.551 +	</listitem></itemizedlist>
  22.552 +
  22.553 +    </sect2>
  22.554 +    <sect2>
  22.555 +      <title>Fate attenzione alle interferenze tra i bug</title>
  22.556 +
  22.557 +      <para id="x_156">&Egrave; possibile che la vostra ricerca di un bug venga rovinata dalla presenza di un altro bug. Per esempio, diciamo che il vostro software si blocca alla revisione 100 e funziona correttamente alla revisione 50. Senza che voi lo sappiate, qualcun altro ha introdotto un diverso bug bloccante alla revisione 60 e lo ha corretto alla revisione 80. Questo potrebbe distorcere i vostri risultati in vari modi.</para>
  22.558 +
  22.559 +      <para id="x_157">&Egrave; possibile che questo altro bug <quote>mascheri</quote> completamente il vostro, cioè che sia comparso prima che il vostro bug abbia avuto la possibilità di manifestarsi. Se non potete evitare quell&rsquo;altro bug (per esempio, impedisce al vostro progetto di venire assemblato) e quindi non potete dire se il vostro bug è presente in un particolare changeset, il comando <command role="hg-cmd">hg bisect</command> non è in grado di aiutarvi direttamente. Invece, invocando <command role="hg-cmd">hg bisect --skip</command> potete indicare un changeset come non collaudato.</para>
  22.560 +
  22.561 +      <para id="x_158">Potrebbe esserci un problema differente se il vostro test per la presenza di un bug non è abbastanza specifico. Se controllate che <quote>il mio programma si blocca</quote>, allora sia il vostro bug bloccante che il bug bloccante non correlato che lo maschera sembreranno la stessa cosa e fuorvieranno <command role="hg-cmd">hg bisect</command>.</para>
  22.562 +
  22.563 +      <para id="x_159">Un&rsquo;altra situazione utile per sfruttare <command role="hg-cmd">hg bisect --skip</command> è quella in cui non potete collaudare una revisione perché il vostro progetto era guasto e quindi in uno stato non collaudabile in quella revisione, magari perché qualcuno aveva introdotto un cambiamento che impediva al progetto di venire assemblato.</para>
  22.564 +
  22.565 +    </sect2>
  22.566 +    <sect2>
  22.567 +      <title>Circoscrivete la vostra ricerca in maniera approssimativa</title>
  22.568 +
  22.569 +      <para id="x_15a">Scegliere il primo changeset <quote>funzionante</quote> e il primo changeset <quote>guasto</quote> che rappresenteranno i punti estremi della vostra ricerca è spesso facile, ma merita comunque una breve discussione. Dal punto di vista di <command role="hg-cmd">hg bisect</command>, il changeset <quote>più recente</quote> è convenzionalmente <quote>guasto</quote> e il changeset <quote>più vecchio</quote> è <quote>funzionante</quote>.</para>
  22.570 +
  22.571 +      <para id="x_15b">Se avete problemi a ricordare dove trovare un changeset <quote>funzionante</quote> da fornire al comando <command role="hg-cmd">hg bisect</command>, non potreste fare di meglio che collaudare changeset a caso. Ricordatevi di eliminare i contendenti che non possono esibire il bug (magari perché la funzione con il bug non era ancora presente) e quelli in cui un altro problema nasconde il bug (come ho discusso in precedenza).</para>
  22.572 +
  22.573 +      <para id="x_15c">Anche se i vostri tentativi si concludono <quote>in anticipo</quote> di migliaia di changeset o di mesi di cronologia, aggiungerete solo una manciata di test al numero totale che <command role="hg-cmd">hg bisect</command> deve eseguire, grazie al suo comportamento logaritmico.</para>
  22.574 +
  22.575 +    </sect2>
  22.576 +  </sect1>
  22.577 +</chapter>
    23.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    23.2 +++ b/it/ch10-hook.xml	Fri Sep 04 16:33:35 2009 +0200
    23.3 @@ -0,0 +1,794 @@
    23.4 +<chapter id="chap:hook">
    23.5 +  <?dbhtml filename="usare-gli-hook-per-gestire-gli-eventi-nei-repository.html"?>
    23.6 +  <title>Usare gli hook per gestire gli eventi nei repository</title>
    23.7 +
    23.8 +  <para id="x_1e6">Mercurial vi offre un potente meccanismo per effettuare azioni automatiche in risposta agli eventi che accadono in un repository. In alcuni casi, potete persino controllare la risposta di Mercurial a questi eventi.</para>
    23.9 +
   23.10 +  <para id="x_1e7">Il nome che Mercurial usa per indicare una di queste azioni è <emphasis>hook</emphasis> (letteralmente, gancio). In alcuni sistemi di controllo di revisione, gli hook vengono chiamati <quote>trigger</quote> (letteralmente, grilletto), ma i due nomi si riferiscono alla stessa idea.</para>
   23.11 +
   23.12 +  <sect1>
   23.13 +    <title>Un&rsquo;introduzione agli hook di Mercurial</title>
   23.14 +
   23.15 +    <para id="x_1e8">Qui di seguito troverete una breve lista degli hook supportati da Mercurial. Rivisiteremo ognuno di questi hook in maggior dettaglio più avanti, nella <xref linkend="sec:hook:ref"/>.</para>
   23.16 +
   23.17 +    <para id="x_1f6">Ognuno degli hook che viene indicato come <quote>hook di controllo</quote> nella propria descrizione ha l&rsquo;abilità di determinare se un&rsquo;attività può procedere. Se l&rsquo;hook ha successo, l&rsquo;attività può procedere; se fallisce, l&rsquo;attività non viene permessa oppure viene annullata, a seconda dell&rsquo;hook.</para>
   23.18 +
   23.19 +    <itemizedlist>
   23.20 +      <listitem><para id="x_1e9"><literal role="hook">changegroup</literal>: viene eseguito dopo che un gruppo di changeset proveniente da qualche altra parte è stato propagato nel repository.</para>
   23.21 +      </listitem>
   23.22 +      <listitem><para id="x_1ea"><literal role="hook">commit</literal>: viene eseguito dopo la creazione di un nuovo changeset nel repository locale.</para>
   23.23 +      </listitem>
   23.24 +      <listitem><para id="x_1eb"><literal role="hook">incoming</literal>: viene eseguito una volta per ogni nuovo changeset proveniente da qualche altra parte che è stato propagato nel repository. Notate la differenza con <literal role="hook">changegroup</literal>, che viene eseguito una volta per ogni <emphasis>gruppo</emphasis> di changeset propagato nel repository.</para>
   23.25 +      </listitem>
   23.26 +      <listitem><para id="x_1ec"><literal role="hook">outgoing</literal>: viene eseguito dopo che un gruppo di changeset è stato trasmesso da questo repository.</para>
   23.27 +      </listitem>
   23.28 +      <listitem><para id="x_1ed"><literal role="hook">prechangegroup</literal>: viene eseguito prima di cominciare a propagare un gruppo di changeset nel repository.</para>
   23.29 +      </listitem>
   23.30 +      <listitem><para id="x_1ee"><literal role="hook">precommit</literal>:
   23.31 +	  hook di controllo. Viene eseguito prima di cominciare un inserimento.</para>
   23.32 +      </listitem>
   23.33 +      <listitem><para id="x_1ef"><literal role="hook">preoutgoing</literal>: hook di controllo. Viene eseguito prima di cominciare a trasmettere un gruppo di changeset da questo repository.</para>
   23.34 +      </listitem>
   23.35 +      <listitem><para id="x_1f0"><literal role="hook">pretag</literal>: hook di controllo. Viene eseguito prima di creare un&rsquo;etichetta.</para>
   23.36 +      </listitem>
   23.37 +      <listitem><para id="x_1f1"><literal role="hook">pretxnchangegroup</literal>: hook di controllo. Viene eseguito dopo che un gruppo di changeset proveniente da un altro repository è stato propagato nel repository locale, ma prima di completare la transazione che renderebbe permanenti i cambiamenti nel repository.</para>
   23.38 +      </listitem>
   23.39 +      <listitem><para id="x_1f2"><literal role="hook">pretxncommit</literal>: hook di controllo. Viene eseguito dopo la creazione di un nuovo changeset nel repository locale, ma prima di completare la transazione che lo renderebbe permanente.</para>
   23.40 +      </listitem>
   23.41 +      <listitem><para id="x_1f3"><literal role="hook">preupdate</literal>: hook di controllo. Viene eseguito prima di cominciare un aggiornamento o un&rsquo;unione della directory di lavoro.</para>
   23.42 +      </listitem>
   23.43 +      <listitem><para id="x_1f4"><literal role="hook">tag</literal>: viene eseguito dopo la creazione di un&rsquo;etichetta.</para>
   23.44 +      </listitem>
   23.45 +      <listitem><para id="x_1f5"><literal role="hook">update</literal>: viene eseguito dopo che un&rsquo;operazione di aggiornamento o di unione della directory di lavoro è stata completata.</para>
   23.46 +      </listitem></itemizedlist>
   23.47 +
   23.48 +  </sect1>
   23.49 +  <sect1>
   23.50 +    <title>Hook e sicurezza</title>
   23.51 +
   23.52 +    <sect2>
   23.53 +      <title>Gli hook vengono eseguiti con i vostri privilegi</title>
   23.54 +
   23.55 +      <para id="x_1f7">Quando invocate un comando Mercurial in un repository e quel comando causa l&rsquo;esecuzione di un hook, quell&rsquo;hook viene eseguito sul <emphasis>vostro</emphasis> sistema, con il <emphasis>vostro</emphasis> account utente, al <emphasis>vostro</emphasis> livello di privilegio. Dato che gli hook sono frammenti di codice eseguibile, dovreste trattarli in maniera adeguatamente sospettosa. Non installate un hook a meno che non confidiate di sapere chi lo ha creato e che cosa fa.</para>
   23.56 +
   23.57 +      <para id="x_1f8">In alcuni casi, potreste essere esposti a hook che non avete installato voi. Se lavorate con Mercurial su un sistema che non vi è familiare, sappiate che Mercurial eseguirà gli hook definiti nel file <filename role="special">hgrc</filename> globale per quel sistema.</para>
   23.58 +
   23.59 +      <para id="x_1f9">Se state lavorando con un repository posseduto da un altro utente, Mercurial può eseguire gli hook definiti nel repository di quell&rsquo;utente, ma li eseguirà ancora sotto la <quote>vostra identità</quote>. Per esempio, se estraete i cambiamenti da quel repository tramite <command role="hg-cmd">hg pull</command>, e il suo file <filename role="special">.hg/hgrc</filename> definisce un hook <literal role="hook">outgoing</literal> locale, quell&rsquo;hook verrà eseguito con il vostro account utente anche se non siete il proprietario di quel repository.</para>
   23.60 +
   23.61 +      <note>
   23.62 +	<para id="x_1fa">Questo avviene solo se estraete cambiamenti da un repository operando su un file system locale o di rete. Se state effettuando l&rsquo;estrazione via HTTP o ssh, qualsiasi hook <literal role="hook">outgoing</literal> verrà eseguito sul server con l&rsquo;account utente che è stato usato per eseguire il processo server.</para>
   23.63 +      </note>
   23.64 +
   23.65 +      <para id="x_1fb">Per vedere quali hook sono definiti in un repository, usate il comando <command role="hg-cmd">hg showconfig hooks</command>. Se state lavorando in un repository, ma state comunicando con un repository di cui non siete i proprietari (per esempio, usando <command role="hg-cmd">hg pull</command> o <command role="hg-cmd">hg incoming</command>), ricordate che sono gli hook dell&rsquo;altro repository che dovreste controllare, non i vostri.</para>
   23.66 +    </sect2>
   23.67 +
   23.68 +    <sect2>
   23.69 +      <title>Gli hook non si propagano</title>
   23.70 +
   23.71 +      <para id="x_1fc">In Mercurial, gli hook non sono soggetti a controllo di revisione e non si propagano quando clonate un repository o ne estraete i cambiamenti. La ragione è semplice: un hook è un frammento di codice eseguibile completamente arbitrario. Viene eseguito sotto l&rsquo;identità del vostro utente, al vostro livello di privilegio, sulla vostra macchina.</para>
   23.72 +
   23.73 +      <para id="x_1fd">Sarebbe estremamente avventato per qualsiasi sistema distribuito di controllo di revisione implementare hook soggetti al controllo di revisione, dato che questo offrirebbe un modo facilmente sfruttabile per alterare gli account degli utenti del sistema di controllo di revisione.</para>
   23.74 +
   23.75 +      <para id="x_1fe">Dato che Mercurial non propaga gli hook, se state collaborando con altre persone su un progetto comune, non dovreste presumere che gli altri stiano usando gli stessi hook Mercurial che state usando voi, o che i loro siano correttamente configurati. Dovreste documentare quali sono gli hook che vi aspettate siano usati dalle altre persone.</para>
   23.76 +
   23.77 +      <para id="x_1ff">In una intranet aziendale, questo aspetto è in qualche modo più facile da controllare, dato che per esempio potete fornire un&rsquo;installazione <quote>standard</quote> di Mercurial su un file system NFS e usare un file <filename role="special">hgrc</filename> globale per definire hook che verranno visti da tutti gli utenti. Tuttavia, come constateremo nella prossima sezione, anche questo approccio ha dei limiti.</para>
   23.78 +    </sect2>
   23.79 +
   23.80 +    <sect2>
   23.81 +      <title>Gli hook possono essere sostituiti</title>
   23.82 +
   23.83 +      <para id="x_200">Mercurial vi consente di sostituire una definizione di hook attraverso la sua ridefinizione. Potete disabilitare un hook impostando il suo valore alla stringa vuota, o cambiare il suo comportamento come desiderate.</para>
   23.84 +
   23.85 +      <para id="x_201">Se fate ricorso a un file <filename role="special">hgrc</filename> di sistema o globale che definisce alcuni hook, dovreste quindi tenere presente che i vostri utenti sono in grado di disabilitare o sostituire quegli hook.</para>
   23.86 +    </sect2>
   23.87 +
   23.88 +    <sect2>
   23.89 +      <title>Assicurarsi che gli hook critici vengano eseguiti</title>
   23.90 +
   23.91 +      <para id="x_202">Talvolta potreste voler imporre il rispetto di una politica in modo che gli altri non siano in grado di aggirarla. Per esempio, potreste richiedere a ogni changeset di passare una rigorosa serie di test. La definizione di questo requisito attraverso un hook in un file <filename role="special">hgrc</filename> globale non avrà effetto sui computer portatili degli utenti remoti, e naturalmente gli utenti locali potranno alterarla a piacimento ridefinendo quell&rsquo;hook.</para>
   23.92 +
   23.93 +      <para id="x_203">Invece, potete istituire le vostre politiche sull&rsquo;uso di Mercurial in modo che le persone siano tenute a propagare i cambiamenti attraverso un server <quote>ufficiale</quote> ben noto che avete messo in sicurezza e configurato adeguatamente.</para>
   23.94 +
   23.95 +      <para id="x_204">Questo risultato si può ottenere attraverso una combinazione di ingegneria sociale e tecnologia. Se impostate un account con accesso ristretto, gli utenti potranno trasmettere i cambiamenti attraverso la rete ai repository gestiti da questo account, ma non potranno usare l&rsquo;account per entrare sul server ed eseguire i normali comandi di shell. In questo scenario, un utente può effettuare il commit di un changeset che contiene tutte le porcherie che desidera.</para>
   23.96 +
   23.97 +      <para id="x_205">Quando qualcuno trasmette un changeset al server da cui tutti estraggono i cambiamenti, il server verificherà il changeset prima di accettarlo come permanente e lo rifiuterà se non riesce a passare i test. Se le persone si limitano a estrarre i cambiamenti da questo server di filtraggio, questo servirà ad assicurare che tutti i cambiamenti estratti dalle persone siano stati automaticamente controllati.</para>
   23.98 +
   23.99 +    </sect2>
  23.100 +  </sect1>
  23.101 +
  23.102 +  <sect1 id="sec:hook:simple">
  23.103 +    <title>Una breve guida all&rsquo;uso degli hook</title>
  23.104 +
  23.105 +    <para id="x_212">Scrivere un hook Mercurial è facile. Cominciamo con un hook che viene invocato al termine dell&rsquo;esecuzione di <command role="hg-cmd">hg commit</command> e che stampa semplicemente l&rsquo;hash del changeset appena creato. L&rsquo;hook è chiamato <literal role="hook">commit</literal>.
  23.106 +    </para>
  23.107 +
  23.108 +    <para id="x_213">Tutti gli hook seguono lo schema presentato in questo esempio.</para>
  23.109 +
  23.110 +    &interaction.hook.simple.init;
  23.111 +
  23.112 +    <para id="x_214">Aggiungete una voce alla sezione <literal role="rc-hooks">hooks</literal> del vostro file <filename role="special">~/.hgrc</filename>. Sulla sinistra si trova il nome dell&rsquo;evento in risposta al quale attivarsi, sulla destra si trova l&rsquo;azione da intraprendere. Come vedete, è possibile eseguire comandi di shell arbitrari in un hook. Mercurial passa informazioni aggiuntive all&rsquo;hook usando le variabili d&rsquo;ambiente (cercate <envar>HG_NODE</envar> nell&rsquo;esempio).</para>
  23.113 +
  23.114 +    <sect2>
  23.115 +      <title>Effettuare molteplici azioni per evento</title>
  23.116 +
  23.117 +      <para id="x_215">Vi capiterà piuttosto spesso di voler definire più di un hook per un particolare tipo di evento, come mostrato qui sotto.</para>
  23.118 +
  23.119 +      &interaction.hook.simple.ext;
  23.120 +
  23.121 +      <para id="x_216">Mercurial vi permette di fare questo aggiungendo un&rsquo;<emphasis>estensione</emphasis> alla fine del nome di un hook. Il nome di un hook si estende scrivendo il nome dell&rsquo;hook, seguito da un punto (il carattere <quote><literal>.</literal></quote>), seguito da altro testo di vostra scelta. Per esempio, Mercurial eseguirà sia <literal>commit.foo</literal> che <literal>commit.bar</literal> all&rsquo;occorrenza dell&rsquo;evento <literal>commit</literal>.</para>
  23.122 +
  23.123 +      <para id="x_217">Per stabilire un ordine di esecuzione ben definito quando più hook corrispondono allo stesso evento, Mercurial ordina gli hook secondo l&rsquo;estensione ed esegue i comandi di hook in questo ordine. Nell&rsquo;esempio precedente, eseguirà <literal>commit.bar</literal> prima di <literal>commit.foo</literal>, e <literal>commit</literal> prima di entrambi.</para>
  23.124 +
  23.125 +      <para id="x_218">Per aiutarvi a ricordare lo scopo di un hook, è buona norma usare un&rsquo;estensione abbastanza descrittiva quando ne definite uno nuovo. Se l&rsquo;hook fallisce, otterrete un messaggio di errore che contiene il nome dell&rsquo;hook e l&rsquo;estensione, quindi l&rsquo;impiego di un&rsquo;estensione descrittiva potrebbe darvi un suggerimento immediato sul motivo per cui l&rsquo;hook è fallito (si veda la <xref linkend="sec:hook:perm"/> per un esempio).</para>
  23.126 +
  23.127 +    </sect2>
  23.128 +    <sect2 id="sec:hook:perm">
  23.129 +      <title>Controllare se un&rsquo;attività può procedere</title>
  23.130 +
  23.131 +      <para id="x_219">Nei nostri primi esempi, abbiamo usato l&rsquo;hook <literal role="hook">commit</literal>, che viene invocato al termine di un commit ed è uno dei vari hook Mercurial che vengono eseguiti dopo la conclusione di un&rsquo;attività. Questi hook non hanno alcun modo di influenzare l&rsquo;attività stessa.</para>
  23.132 +
  23.133 +      <para id="x_21a">Mercurial definisce un certo numero di eventi che accadono prima che un&rsquo;attività cominci, o dopo che è cominciata ma prima che termini. Gli hook attivati da questi eventi hanno l&rsquo;ulteriore capacità di determinare se l&rsquo;attività può continuare o se verrà abortita.</para>
  23.134 +
  23.135 +      <para id="x_21b">L&rsquo;hook <literal role="hook">pretxncommit</literal> viene invocato dopo che un commit è stato completamente eseguito ma non si è ancora concluso. In altre parole, i metadati che rappresentano il changeset sono stati scritti su disco, ma la transazione non ha ancora avuto il permesso di completarsi. L&rsquo;hook <literal role="hook">pretxncommit</literal> ha la capacità di decidere se la transazione può completarsi oppure se deve essere abortita.</para>
  23.136 +
  23.137 +      <para id="x_21c">Se l&rsquo;hook <literal role="hook">pretxncommit</literal> termina con un codice di stato uguale a zero, la transazione può completare, il commit si conclude e l&rsquo;hook <literal role="hook">commit</literal> viene eseguito. Se l&rsquo;hook <literal role="hook">pretxncommit</literal> termina con un codice di stato diverso da zero, la transazione viene abortita, i metadati che rappresentano il changeset vengono cancellati e l&rsquo;hook <literal role="hook">commit</literal> non viene eseguito.</para>
  23.138 +
  23.139 +      &interaction.hook.simple.pretxncommit;
  23.140 +
  23.141 +      <para id="x_21d">In questo esempio, l&rsquo;hook controlla che il messaggio di commit contenga un identificatore di bug. Se lo contiene, il commit può completare, altrimenti il commit viene abortito.</para>
  23.142 +
  23.143 +    </sect2>
  23.144 +  </sect1>
  23.145 +  <sect1>
  23.146 +    <title>Implementare i vostri hook</title>
  23.147 +
  23.148 +    <para id="x_21e">Quando state scrivendo un hook, potreste trovare utile eseguire Mercurial con l&rsquo;opzione <option role="hg-opt-global">-v</option> oppure con l&rsquo;elemento di configurazione <envar role="rc-item-ui">verbose</envar> impostato a <quote>vero</quote>, in modo che Mercurial stampi un messaggio prima di invocare qualsiasi hook.</para>
  23.149 +
  23.150 +    <sect2 id="sec:hook:lang">
  23.151 +      <title>Scegliere la modalità di esecuzione del vostro hook</title>
  23.152 +
  23.153 +      <para id="x_21f">Potete implementare un hook come un normale programma&emdash;tipicamente uno script di shell&emdash;o come una funzione Python che viene eseguita nell&rsquo;ambito del processo Mercurial.</para>
  23.154 +
  23.155 +      <para id="x_220">Implementare un hook come programma esterno ha il vantaggio di non richiedere alcuna conoscenza del funzionamento interno di Mercurial. Potete invocare i normali comandi Mercurial per ottenere tutte le informazioni aggiuntive di cui avete bisogno. Lo svantaggio è che gli hook esterni sono più lenti rispetto agli hook interni.</para>
  23.156 +
  23.157 +      <para id="x_221">Un hook Python interno ha accesso completo alla API di Mercurial e non deve <quote>pagare</quote> la creazione di un altro processo, quindi è intrinsecamente più veloce rispetto a un hook esterno. Per ottenere la maggior parte delle informazioni richieste da un hook è anche più facile usare la API di Mercurial che eseguire i comandi Mercurial.</para>
  23.158 +
  23.159 +      <para id="x_222">Se siete a vostro agio con Python, o avete bisogno di prestazioni elevate, implementare i vostri hook in Python potrebbe essere una buona scelta. Tuttavia, quando il vostro hook è semplice da scrivere e le prestazioni non vi interessano (cose che probabilmente capitano per la maggior parte degli hook), uno script di shell è perfettamente adeguato.</para>
  23.160 +
  23.161 +    </sect2>
  23.162 +    <sect2 id="sec:hook:param">
  23.163 +      <title>I parametri di hook</title>
  23.164 +
  23.165 +      <para id="x_223">Mercurial invoca ogni hook con un insieme di parametri ben definito. In Python, un parametro viene passato come un argomento con nome alla vostra funzione di hook. Per un programma esterno, un parametro viene passato come una variabile d&rsquo;ambiente.</para>
  23.166 +
  23.167 +      <para id="x_224">I nomi e i valori dei parametri specifici di un hook saranno gli stessi sia per gli hook implementati in Python sia per quelli realizzati come script di shell. Un parametro booleano sarà rappresentato come un valore booleano in Python, ma come una variabile d&rsquo;ambiente con valore numerico 1 (per <quote>vero</quote>) o 0 (per <quote>falso</quote>) per un hook esterno. Se il nome di un parametro di hook è <literal>foo</literal>, anche l&rsquo;argomento con nome per un hook Python sarà chiamato <literal>foo</literal>, mentre la variabile d&rsquo;ambiente per un hook esterno sarà chiamata <literal>HG_FOO</literal>.</para>
  23.168 +    </sect2>
  23.169 +
  23.170 +    <sect2>
  23.171 +      <title>I valori di ritorno degli hook e il controllo delle attività</title>
  23.172 +
  23.173 +      <para id="x_225">Un hook che viene eseguito con successo deve terminare con uno stato uguale a zero se è esterno, o restituire il valore booleano <quote>falso</quote> se è interno. Il fallimento viene indicato con uno stato di terminazione diverso da zero per un hook esterno, o dal valore booleano <quote>vero</quote> per un hook interno. Se un hook interno solleva un&rsquo;eccezione, l&rsquo;hook si considera fallito.</para>
  23.174 +
  23.175 +      <para id="x_226">Per un hook che controlla se un&rsquo;attività può procedere, zero o falso significano <quote>concesso</quote>, mentre un numero diverso da zero, vero, o un&rsquo;eccezione significano <quote>negato</quote>.</para>
  23.176 +    </sect2>
  23.177 +
  23.178 +    <sect2>
  23.179 +      <title>Scrivere un hook esterno</title>
  23.180 +
  23.181 +      <para id="x_227">Quando definite un hook esterno nel vostro file <filename role="special">~/.hgrc</filename> e l&rsquo;hook viene invocato, il suo valore viene passato alla vostra shell, che lo interpreta. Questo significa che potete usare i normali costrutti di shell nel corpo dell&rsquo;hook.</para>
  23.182 +
  23.183 +      <para id="x_228">Un hook eseguibile viene sempre eseguito con la sua directory corrente impostata alla directory radice del repository.</para>
  23.184 +
  23.185 +      <para id="x_229">Ogni parametro di hook viene passato come una variabile d&rsquo;ambiente con il nome in maiuscolo preceduto dalla stringa <quote><literal>HG_</literal></quote>.</para>
  23.186 +
  23.187 +      <para id="x_22a">Con l&rsquo;eccezione dei parametri di hook, Mercurial non imposta o modifica alcuna variabile d&rsquo;ambiente quando esegue un hook. Questo è utile da ricordare se state scrivendo un hook globale che potrebbe venire invocato da un certo numero di utenti differenti con differenti variabili d&rsquo;ambiente impostate. In ambienti multi-utente, non dovreste fare affidamento sul fatto che le variabili d&rsquo;ambiente abbiano i valori che avete impostato nel vostro ambiente di lavoro durante il collaudo dell&rsquo;hook.</para>
  23.188 +    </sect2>
  23.189 +
  23.190 +    <sect2>
  23.191 +      <title>Dire a Mercurial di usare un hook interno</title>
  23.192 +
  23.193 +      <para id="x_22b">La sintassi del file <filename role="special">~/.hgrc</filename> per definire un hook interno è leggermente differente da quella per un hook eseguibile. Il valore dell&rsquo;hook deve cominciare con il testo <quote><literal>python:</literal></quote> e proseguire con il nome completamente qualificato dell&rsquo;oggetto invocabile da usare come valore dell&rsquo;hook.</para>
  23.194 +
  23.195 +      <para id="x_22c">Il modulo in cui si trova l&rsquo;hook viene automaticamente importato quando l&rsquo;hook viene invocato. Purché il nome del modulo e il valore di <envar>PYTHONPATH</envar> siano corretti, l&rsquo;importazione dovrebbe <quote>funzionare e basta</quote>.</para>
  23.196 +
  23.197 +      <para id="x_22d">Il seguente frammento di un file <filename role="special">~/.hgrc</filename> di esempio illustra la sintassi e il significato delle nozioni appena descritte.</para>
  23.198 +      <programlisting>[hooks]
  23.199 +commit.esempio = python:miomodulo.sottomodulo.miohook</programlisting>
  23.200 +      <para id="x_22e">Quando Mercurial esegue l&rsquo;hook <literal>commit.esempio</literal>, importa <literal>miomodulo.sottomodulo</literal>, cerca l&rsquo;oggetto invocabile chiamato <literal>miohook</literal> e lo invoca.</para>
  23.201 +    </sect2>
  23.202 +
  23.203 +    <sect2>
  23.204 +      <title>Implementare un hook interno</title>
  23.205 +
  23.206 +      <para id="x_22f">Il più semplice hook interno non fa nulla, ma illustra la forma base della API degli hook:</para>
  23.207 +      <programlisting>def miohook(ui, repo, **kwargs):
  23.208 +    pass</programlisting>
  23.209 +      <para id="x_230">Il primo argomento di un hook Python è sempre un oggetto <literal role="py-mod-mercurial.ui">mercurial.ui.ui</literal>. Il secondo è un oggetto repository, al momento sempre un&rsquo;istanza di <literal role="py-mod-mercurial.localrepo">mercurial.localrepo.localrepository</literal>. Gli altri argomenti con nome seguono questi due argomenti. Quali argomenti con nome vengono passati dipende dall&rsquo;hook che viene invocato, ma un hook può ignorare gli argomenti di cui non ha bisogno depositandoli in un dizionario di argomenti con nome, come succede con <literal>**kwargs</literal> qui sopra.</para>
  23.210 +
  23.211 +    </sect2>
  23.212 +  </sect1>
  23.213 +  <sect1>
  23.214 +    <title>Alcuni hook di esempio</title>
  23.215 +
  23.216 +    <sect2>
  23.217 +      <title>Scrivere messaggi di commit significativi</title>
  23.218 +
  23.219 +      <para id="x_231">&Egrave; difficile immaginare un messaggio di commit utile che sia anche molto breve. Il semplice hook <literal role="hook">pretxncommit</literal> dell&rsquo;esempio seguente vi impedirà di esguire il commit di un changeset con un messaggio più piccolo di quindici byte.</para>
  23.220 +
  23.221 +      &interaction.hook.msglen.go;
  23.222 +    </sect2>
  23.223 +
  23.224 +    <sect2>
  23.225 +      <title>Controllare lo spazio bianco in coda</title>
  23.226 +
  23.227 +      <para id="x_232">Un uso interessante per un hook relativo ai commit è quello di aiutarvi a scrivere codice più pulito. Un semplice esempio di <quote>codice più pulito</quote> è la regola per cui un cambiamento non dovrebbe aggiungere nessuna nuova riga di testo contenente <quote>spazio bianco in coda</quote>. Lo spazio bianco in coda è composto da una serie di spazi e caratteri di tabulazione alla fine di una riga di testo. Nella maggior parte dei casi, lo spazio bianco in coda non è altro che rumore invisibile e superfluo, ma si rivela occasionalmente problematico e in genere le persone preferiscono sbarazzarsene.</para>
  23.228 +
  23.229 +      <para id="x_233">Potete usare l&rsquo;hook <literal role="hook">precommit</literal> o l&rsquo;hook <literal role="hook">pretxncommit</literal> per scoprire se avete un problema di spazio bianco in coda. Se usate <literal role="hook">precommit</literal>, l&rsquo;hook non saprà quali file state inserendo, quindi dovrà controllare ogni file modificato nel repository alla ricerca di spazio bianco in coda. Se volete inserire un cambiamento al solo file <filename>foo</filename>, ma il flie <filename>bar</filename> contiene spazio bianco in coda, effettuare un controllo tramite l&rsquo;hook <literal role="hook">precommit</literal> vi impedirà di eseguire il commit di <filename>foo</filename> a causa dei problemi con <filename>bar</filename>. Questo comportamento non sembra corretto.</para>
  23.230 +
  23.231 +      <para id="x_234">Se doveste scegliere l&rsquo;hook <literal role="hook">pretxncommit</literal>, il controllo non avverrà fino al momento appena precedente il completamento della transazione di commit. Questo vi consentirà di controllare il problema solo sui file che verranno registrati. Tuttavia, se avete inserito il messaggio di commit interattivamente e l&rsquo;hook fallisce, la transazione verrà abortita e dovrete riscrivere il messaggio di commit dopo aver corretto lo spazio bianco in coda e invocato ancora <command role="hg-cmd">hg commit</command>.</para>
  23.232 +
  23.233 +      &interaction.ch09-hook.ws.simple;
  23.234 +
  23.235 +      <para id="x_235">In questo esempio, abbiamo introdotto un semplice hook <literal role="hook">pretxncommit</literal> che controlla lo spazio bianco in coda. Questo hook è breve, ma non molto utile: termina con uno stato di errore se un changeset aggiunge una riga con spazio bianco in coda a un file qualsiasi, ma non stampa alcuna informazione che potrebbe aiutarci a individuare il file o la riga che contiene il problema. L&rsquo;hook ha anche la piacevole proprietà di non prestare attenzione alle righe non modificate, in quanto solo le righe che introducono nuovo spazio bianco in coda causano problemi.</para>
  23.236 +
  23.237 +      &ch09-check_whitespace.py.lst;
  23.238 +
  23.239 +      <para id="x_236">Questa versione è molto più complessa, ma anche molto più utile. Analizza un diff unificato per vedere se una qualsiasi riga aggiunge spazio bianco in coda e stampa il nome del file e il numero della riga di ogni occorrenza di questo tipo. In più, se il cambiamento aggiunge spazio bianco in coda, questo hook salva il messaggio di commit e stampa il nome del file salvato prima di uscire e dire a Mercurial di abortire la transazione, in modo che, dopo aver corretto il problema, possiate usare l&rsquo;opzione <option role="hg-opt-commit">-l nomefile</option> del comando <command role="hg-cmd">hg commit</command> per riutilizzare il messaggio di commit salvato.</para>
  23.240 +
  23.241 +      &interaction.ch09-hook.ws.better;
  23.242 +
  23.243 +      <para id="x_237">Come ultima nota a margine, osservate in questo esempio l&rsquo;uso della funzione di modifica sul posto di <command>sed</command> per eliminare lo spazio bianco in coda da un file. Questo impiego è sufficientemente conciso e utile che lo riprodurrò qui di seguito (usando <command>perl</command> per sicurezza).</para>
  23.244 +      <programlisting>perl -pi -e 's,[ \t]+$,,' nomefile</programlisting>
  23.245 +
  23.246 +    </sect2>
  23.247 +  </sect1>
  23.248 +  <sect1>
  23.249 +    <title>Hook inclusi</title>
  23.250 +
  23.251 +    <para id="x_238">Mercurial viene distribuito con diversi hook inclusi che potete trovare nella directory <filename class="directory">hgext</filename> dell&rsquo;albero dei sorgenti di Mercurial. Se state usando un pacchetto precompilato di Mercurial, gli hook si trovano nella directory <filename class="directory">hgext</filename> posizionata ovunque il vostro pacchetto abbia installato Mercurial.</para>
  23.252 +
  23.253 +    <sect2>
  23.254 +      <title><literal role="hg-ext">acl</literal>&emdash;controllo di accesso per parti di un repository</title>
  23.255 +
  23.256 +      <para id="x_239">L&rsquo;estensione <literal role="hg-ext">acl</literal> vi permette di controllare quali utenti remoti hanno il permesso di trasmettere changeset verso un server attraverso la rete. Potete proteggere qualsiasi porzione di un repository (compreso l&rsquo;intero repository) in modo che uno specifico utente remoto possa trasmettere solo cambiamenti che non influenzano le parti protette.</para>
  23.257 +
  23.258 +      <para id="x_23a">Questa estensione implementa il controllo di accesso sulla base dell&rsquo;identità dell&rsquo;utente che effettua la trasmissione, <emphasis>non</emphasis> di chi ha eseguito il commit dei changeset che vengono trasferiti. Ha senso usare questo hook solo se avete un ambiente server protetto che autentica gli utenti remoti e volete essere sicuri che solo specifici utenti possano trasmettere cambiamenti a quel server.</para>
  23.259 +
  23.260 +      <sect3>
  23.261 +	<title>Configurare l&rsquo;hook <literal role="hook">acl</literal></title>
  23.262 +
  23.263 +	<para id="x_23b">Per gestire i cambiamenti in entrata, l&rsquo;hook <literal role="hg-ext">acl</literal> deve essere usato come un hook <literal role="hook">pretxnchangegroup</literal>. Questo vi permette di vedere quali file vengono modificati da ogni changeset in entrata e di abortire un gruppo di changeset se modifica qualche file <quote>proibito</quote>. Ecco un esempio di come attivare l&rsquo;hook:</para>
  23.264 +	<programlisting>[hooks]
  23.265 +pretxnchangegroup.acl = python:hgext.acl.hook</programlisting>
  23.266 +
  23.267 +	<para id="x_23c">L&rsquo;estensione <literal role="hg-ext">acl</literal> si configura usando tre sezioni.</para>
  23.268 +
  23.269 +	<para id="x_23d">La sezione <literal role="rc-acl">acl</literal> contiene solo la voce <envar role="rc-item-acl">sources</envar>, che elenca le modalità di provenienza dei cambiamenti in entrata a cui l&rsquo;hook deve fare attenzione. Di solito, non avrete bisogno di configurare questa sezione.</para>
  23.270 +	<itemizedlist>
  23.271 +	  <listitem><para id="x_23e"><envar role="rc-item-acl">serve</envar>: controlla i changeset in entrata che arrivano da un repository remoto via HTTP o ssh. Questo è il valore predefinito di <envar role="rc-item-acl">sources</envar> e di solito è l&rsquo;unica impostazione di cui avrete bisogno per questo elemento di configurazione.</para>
  23.272 +	  </listitem>
  23.273 +	  <listitem><para id="x_23f"><envar role="rc-item-acl">pull</envar>: controlla i changeset in entrata che arrivano attraverso un&rsquo;estrazione da un repository locale.</para>
  23.274 +	  </listitem>
  23.275 +	  <listitem><para id="x_240"><envar role="rc-item-acl">push</envar>: controlla i cambiamenti in entrata che arrivano attraverso una trasmissione da un repository locale.</para>
  23.276 +	  </listitem>
  23.277 +	  <listitem><para id="x_241"><envar role="rc-item-acl">bundle</envar>: controlla i changeset in entrata che arrivano da un altro repository attraverso un bundle.<footnote><para id="x_fff">[NdT] Un bundle contiene dati binari di changeset in forma compressa. Usate il sistema di aiuto di Mercurial invocando <command role="hg-cmd">hg help bundle</command> o <command role="hg-cmd">hg help unbundle</command> per ottenere maggiori informazioni.</para></footnote></para>
  23.278 +	  </listitem></itemizedlist>
  23.279 +
  23.280 +	<para id="x_242">La sezione <literal role="rc-acl.allow">acl.allow</literal> controlla gli utenti a cui è permesso aggiungere changeset al repository. Se questa sezione non è presente, il permesso viene concesso a tutti gli utenti a cui non viene esplicitamente negato. Se questa sezione è presente, il permesso viene negato a tutti gli utenti a cui non viene esplicitamente concesso (quindi una sezione vuota significa che il permesso viene negato a tutti gli utenti).</para>
  23.281 +
  23.282 +	<para id="x_243">La sezione <literal role="rc-acl.deny">acl.deny</literal> determina quali sono gli utenti a cui viene impedito di aggiungere changeset al repository. Se questa sezione non è presente o è vuota, tutti gli utenti hanno il permesso di aggiungere modifiche.</para>
  23.283 +
  23.284 +	<para id="x_244">La sintassi per le sezioni <literal role="rc-acl.allow">acl.allow</literal> e <literal role="rc-acl.deny">acl.deny</literal> è la stessa. Sulla sinistra di ogni voce si trova un pattern di tipo glob che corrisponde a file e directory relativi alla radice del repository, sulla destra si trova un nome utente.</para>
  23.285 +
  23.286 +	<para id="x_245">Nell&rsquo;esempio seguente, l&rsquo;utente <literal>manualista</literal> può trasmettere cambiamenti solo al sottoalbero <filename class="directory">doc</filename> del repository, mentre l&rsquo;utente <literal>stagista</literal> può trasmettere cambiamenti a qualsiasi file o directory tranne <filename class="directory">sorgenti/sensibili</filename>.
  23.287 +	</para>
  23.288 +	<programlisting>[acl.allow]
  23.289 +doc/** = manualista
  23.290 +[acl.deny]
  23.291 +sorgenti/sensibili/** = stagista</programlisting>
  23.292 +
  23.293 +      </sect3>
  23.294 +      <sect3>
  23.295 +	<title>Collaudo e risoluzione dei problemi</title>
  23.296 +
  23.297 +	<para id="x_246">Se volete collaudare l&rsquo;hook <literal role="hg-ext">acl</literal>, eseguitelo abilitando le informazioni di debug di Mercurial. Dato che probabilmente lo eseguirete su un server dove non è conveniente (e talvolta nemmeno possibile) passare l&rsquo;opzione <option role="hg-opt-global">--debug</option>, non dimenticatevi che potete abilitare le informazioni di debug nel vostro file <filename role="special">~/.hgrc</filename>:
  23.298 +	</para>
  23.299 +	<programlisting>[ui]
  23.300 +debug = true</programlisting>
  23.301 +	<para id="x_247">Con questa opzione abilitata, l&rsquo;hook <literal role="hg-ext">acl</literal> stamperà abbastanza informazioni da permettervi di capire perché sta consentendo o vietando le trasmissioni da specifici utenti.</para>
  23.302 +
  23.303 +      </sect3>    
  23.304 +    </sect2>
  23.305 +
  23.306 +    <sect2>
  23.307 +      <title><literal
  23.308 +	  role="hg-ext">bugzilla</literal>&emdash;integrazione con Bugzilla</title>
  23.309 +
  23.310 +      <para id="x_248">L&rsquo;estensione <literal role="hg-ext">bugzilla</literal> aggiunge un commento a un bug su Bugzilla ogni volta che trova un riferimento all&rsquo;identificatore di quel bug in un messaggio di commit. Potete installare questo hook su un server condiviso, in modo che l&rsquo;hook venga eseguito ogni volta che un utente remoto trasmette i cambiamenti a quel server.</para>
  23.311 +
  23.312 +      <para id="x_249">L&rsquo;hook aggiunge al bug un commento che somiglia a questo (potete configurare i contenuti del commento, come vedrete fra un attimo):</para>
  23.313 +      <programlisting>Changeset aad8b264143a, creato da Mario Rossi &lt;mario.rossi@example.com&gt; nel repository vattelapesca,
  23.314 +    fa riferimento a questo bug.
  23.315 +    Per i dettagli completi, si veda
  23.316 +    http://hg.example.com/vattelapesca?cmd=changeset;node=aad8b264143a
  23.317 +    Descrizione del changeset: risolto bug 10483 proteggendo il codice da alcuni puntatori NULL.</programlisting>
  23.318 +      <para id="x_24a">Il valore di questo hook è che automatizza il processo di aggiornamento di un bug ogni volta che un changeset vi fa riferimento. Se lo configurate in maniera adeguata, l&rsquo;hook faciliterà la navigazione diretta da un bug su Bugzilla a un changeset che si riferisce a quel bug.</para>
  23.319 +
  23.320 +      <para id="x_24b">Potete usare il codice di questo hook come un punto di partenza per ricette più esotiche di integrazione con Bugzilla. Ecco alcune possibilità.</para>
  23.321 +      <itemizedlist>
  23.322 +	<listitem><para id="x_24c">Richiedere che ogni changeset trasmesso al server abbia un identificatore di bug valido nel proprio messaggio di commit. In questo caso, vorrete configurare l&rsquo;hook come un hook <literal role="hook">pretxncommit</literal> per consentirgli di rifiutare i cambiamenti che non contengono identificatori di bug.</para>
  23.323 +	</listitem>
  23.324 +	<listitem><para id="x_24d">Permettere ai changeset in entrata di modificare automaticamente lo <emphasis>stato</emphasis> di un bug, come pure di aggiungere semplicemente un commento. Per esempio, l&rsquo;hook potrebbe riconoscere la stringa <quote>risolto bug 31337</quote> come il segnale che indica la necessità di aggiornare lo stato del bug 31337 a <quote>richiede un collaudo</quote>.</para>
  23.325 +	</listitem></itemizedlist>
  23.326 +
  23.327 +      <sect3 id="sec:hook:bugzilla:config">
  23.328 +	<title>Configurare l&rsquo;hook <literal role="hook">bugzilla</literal></title>
  23.329 +
  23.330 +	<para id="x_24e">Dovreste configurare questo hook nel file <filename role="special">hgrc</filename> del vostro server come un hook <literal role="hook">incoming</literal>, per esempio nel modo seguente:</para>
  23.331 +	<programlisting>[hooks]
  23.332 +incoming.bugzilla = python:hgext.bugzilla.hook</programlisting>
  23.333 +
  23.334 +	<para id="x_24f">A causa della natura specializzata dell&rsquo;hook e dato che Bugzilla non è stato implementato con questo tipo di integrazioni in mente, configurare questo hook è un processo piuttosto complicato.</para>
  23.335 +
  23.336 +	<para id="x_250">Prima di cominciare, dovete installare la libreria di interfaccia Python per MySQL sulla macchina (o le macchine) dove intendete eseguire l&rsquo;hook. Se non è disponibile sotto forma di pacchetto precompilato per il vostro sistema, potete scaricarla da <citation><xref linkend="bib:mysql"/></citation>.
  23.337 +	</para>
  23.338 +
  23.339 +	<para id="x_251">Le informazioni di configurazione per questo hook si trovano nella sezione <literal role="rc-bugzilla">bugzilla</literal> del vostro file <filename role="special">hgrc</filename>.
  23.340 +	</para>
  23.341 +	<itemizedlist>
  23.342 +	  <listitem><para id="x_252"><envar role="rc-item-bugzilla">version</envar>: la versione di Bugzilla installata sul server. Lo schema di database usato da Bugzilla cambia occasionalmente, quindi questo hook deve sapere esattamente quale schema usare.</para>
  23.343 +	  </listitem>
  23.344 +	  <listitem><para id="x_253"><envar role="rc-item-bugzilla">host</envar>: il nome della macchina del server MySQL che memorizza i vostri dati per Bugzilla. Il database deve essere configurato per consentire le connessioni da qualunque macchina stia eseguendo l&rsquo;hook <literal role="hook">bugzilla</literal>.
  23.345 +	    </para>
  23.346 +	  </listitem>
  23.347 +	  <listitem><para id="x_254"><envar role="rc-item-bugzilla">user</envar>: il nome utente con il quale connettersi al server MySQL. Il database deve essere configurato per consentire a questo utente di connettersi da qualunque macchina stia eseguendo l&rsquo;hook <literal role="hook">bugzilla</literal>. Questo utente deve essere in grado di modificare le tabelle di Bugzilla. Il valore predefinito di questo elemento è <literal>bugs</literal>, che è il nome standard dell&rsquo;utente Bugzilla in un database MySQL.</para>
  23.348 +	  </listitem>
  23.349 +	  <listitem><para id="x_255"><envar role="rc-item-bugzilla">password</envar>: la password MySQL per l&rsquo;utente che avete configurato alla voce precedente. Il testo della password viene memorizzato in chiaro, quindi dovreste assicurarvi che utenti non autorizzati non possano leggere il file <filename role="special">~/.hgrc</filename> dove avete inserito questa informazione.</para>
  23.350 +	  </listitem>
  23.351 +	  <listitem><para id="x_256"><envar role="rc-item-bugzilla">db</envar>: il nome del database Bugzilla sul server MySQL. Il valore predefinito di questo elemento è <literal>bugs</literal>, che è il nome standard del database MySQL dove Bugzilla memorizza i propri dati.</para>
  23.352 +	  </listitem>
  23.353 +	  <listitem><para id="x_257"><envar role="rc-item-bugzilla">notify</envar>: se volete che Bugzilla spedisca un&rsquo;email di notifica agli interessati dopo che questo hook ha aggiunto un commento a un bug, è necessario che questo hook esegua un comando ogni volta che aggiorna il database. Il comando da eseguire dipende da dove avete installato Bugzilla, ma tipicamente somiglierà al seguente, se avete installato Bugzilla in <filename class="directory">/var/www/html/bugzilla</filename>:</para>
  23.354 +	    <programlisting>cd /var/www/html/bugzilla &amp;&amp;
  23.355 +	      ./processmail %s nessuno@example.com</programlisting>
  23.356 +	  <para id="x_258">Il programma <literal>processmail</literal> di Bugzilla si aspetta che gli vengano passati un identificatore di bug (l&rsquo;hook sostituisce <quote><literal>%s</literal></quote> con l&rsquo;identificatore di bug) e un indirizzo email. Si aspetta anche di essere in grado di scrivere su alcuni file nella directory in cui viene eseguito. Se Bugzilla e questo hook non sono installati sulla stessa macchina, dovrete trovare un modo per eseguire <literal>processmail</literal> sul server dove Bugzilla è installato.</para>
  23.357 +	  </listitem></itemizedlist>
  23.358 +
  23.359 +      </sect3>
  23.360 +      <sect3>
  23.361 +	<title>Correlare i nomi utente Mercurial ai nomi utente Bugzilla</title>
  23.362 +
  23.363 +	<para id="x_259">Per default, l&rsquo;hook <literal role="hg-ext">bugzilla</literal> prova a utilizzare l&rsquo;indirizzo email di chi ha eseguito il commit del changeset come il nome utente Bugzilla con cui aggiornare un bug. Se questa impostazione non vi soddisfa, potete correlare gli indirizzi email degli utenti Mercurial ai nomi utente Bugzilla tramite una sezione <literal role="rc-usermap">usermap</literal>.</para>
  23.364 +
  23.365 +	<para id="x_25a">Ogni elemento nella sezione <literal role="rc-usermap">usermap</literal> contiene un indirizzo email sulla sinistra e un nome utente Bugzilla sulla destra.</para>
  23.366 +	<programlisting>[usermap]
  23.367 +maria.bianchi@example.com = maria</programlisting>
  23.368 +	<para id="x_25b">Potete tenere i dati della sezione <literal role="rc-usermap">usermap</literal> in un normale file <filename role="special">hgrc</filename>, oppure dire all&rsquo;hook <literal role="hg-ext">bugzilla</literal> di leggere le informazioni da un file <filename>usermap</filename> esterno. In quest&rsquo;ultimo caso, potete memorizzare i dati del file <filename>usermap</filename> separatamente in un repository modificabile dall&rsquo;utente, per esempio. Questo vi permette di dare ai vostri utenti la possibilità di mantenere le proprie voci nella sezione <envar role="rc-item-bugzilla">usermap</envar>. Il file <filename role="special">hgrc</filename> principale potrebbe somigliare a questo:</para>
  23.369 +	<programlisting># il normale file hgrc fa riferimento a un file di correlazioni esterno
  23.370 +[bugzilla]
  23.371 +usermap = /home/hg/repos/datiutente/bugzilla-usermap.conf</programlisting>
  23.372 +	<para id="x_25c">Mentre il file <filename>usermap</filename> a cui fa riferimento potrebbe somigliare a questo:</para>
  23.373 +	<programlisting># bugzilla-usermap.conf - all'interno di un repository Mercurial
  23.374 +[usermap]
  23.375 +stefania@example.com = stef</programlisting>
  23.376 +
  23.377 +      </sect3>
  23.378 +      <sect3>
  23.379 +	<title>Configurare il testo che viene aggiunto a un bug</title>
  23.380 +
  23.381 +	<para id="x_25d">Potete configurare il testo che questo hook aggiunge come commento specificandolo sotto forma di template Mercurial. Diverse voci del file <filename role="special">hgrc</filename> (sempre nella sezione <literal role="rc-bugzilla">bugzilla</literal>) controllano questo comportamento.</para>
  23.382 +	<itemizedlist>
  23.383 +	  <listitem><para id="x_25e"><literal>strip</literal>: il numero di parti iniziali da eliminare dal percorso di un repository per costruire un percorso parziale da usare in un URL. Per esempio, se i repository sul vostro server si trovano nella directory <filename class="directory">/home/hg/repos</filename>, e voi avete un repository il cui percorso è <filename class="directory">/home/hg/repos/app/test</filename>, allora impostando <literal>strip</literal> a <literal>4</literal> otterrete il percorso parziale <filename class="directory">app/test</filename>. L&rsquo;hook renderà disponibile questo percorso parziale con il nome <literal>webroot</literal> durante l&rsquo;espansione di un template.</para>
  23.384 +	  </listitem>
  23.385 +	  <listitem><para id="x_25f"><literal>template</literal>: il testo del template da usare. In aggiunta alle solite variabili relative ai changeset, questo template può usare <literal>hgweb</literal> (il valore dell&rsquo;elemento di configurazione <literal>hgweb</literal> menzionato in precedenza) e <literal>webroot</literal> (il percorso costruito usando l&rsquo;elemento <literal>strip</literal> appena descritto).</para>
  23.386 +	  </listitem></itemizedlist>
  23.387 +
  23.388 +	<para id="x_260">In più, potete aggiungere un elemento <envar role="rc-item-web">baseurl</envar> alla sezione <literal role="rc-web">web</literal> del vostro file <filename role="special">hgrc</filename>. L&rsquo;hook <literal role="hg-ext">bugzilla</literal> lo renderà disponibile durante l&rsquo;espansione di un template, come la stringa di base da usare nel costruire un URL che permetterà agli utenti di navigare da un commento Bugzilla verso un changeset correlato. Ecco un esempio di come usare questo elemento:</para>
  23.389 +	<programlisting>[web]
  23.390 +baseurl = http://hg.example.com/</programlisting>
  23.391 +
  23.392 +	<para id="x_261">Ecco un esempio dell&rsquo;insieme di informazioni di configurazione da usare per l&rsquo;hook <literal role="hg-ext">bugzilla</literal>.</para>
  23.393 +
  23.394 +	&ch10-bugzilla-config.lst;
  23.395 +
  23.396 +      </sect3>
  23.397 +      <sect3>
  23.398 +	<title>Collaudo e risoluzione dei problemi</title>
  23.399 +
  23.400 +	<para id="x_262">I problemi più comuni con la configurazione dell&rsquo;hook <literal role="hg-ext">bugzilla</literal> sono relativi all&rsquo;esecuzione dello script <filename>processmail</filename> di Bugzilla e alla correlazione tra nomi utente Mercurial e nomi utente Bugzilla.</para>
  23.401 +
  23.402 +	<para id="x_263">Se ricordate quanto detto nella <xref linkend="sec:hook:bugzilla:config"/>, l&rsquo;utente che esegue il processo Mercurial sul server è anche quello che eseguirà lo script <filename>processmail</filename>. Questo script talvolta chiederà a Bugzilla di modificare i file nella sua directory di configurazione, e di solito i file di configurazione di Bugzilla sono proprietà dell&rsquo;utente che esegue il processo del vostro server web.</para>
  23.403 +
  23.404 +	<para id="x_264">Potete far eseguire <filename>processmail</filename> con un&rsquo;identità utente appropriata tramite il comando <command>sudo</command>. Ecco una voce di esempio da un file <filename>sudoers</filename>.</para>
  23.405 +	<programlisting>hg_user = (httpd_user)
  23.406 +NOPASSWD: /var/www/html/bugzilla/processmail-wrapper %s</programlisting>
  23.407 +	<para id="x_265">Questo consente all&rsquo;utente <literal>hg_user</literal> di eseguire il programma <filename>processmail-wrapper</filename> sotto l&rsquo;identità dell&rsquo;utente <literal>httpd_user</literal>.</para>
  23.408 +
  23.409 +	<para id="x_266">Questa invocazione indiretta attraverso uno script che funge da involucro è necessaria, perché <filename>processmail</filename> si aspetta di venire eseguito con la propria directory corrente impostata al percorso di installazione di Bugzilla, ma non è possibile specificare questo vincolo in un file <filename>sudoers</filename>. Il contenuto dello script involucro è semplice:</para>
  23.410 +	<programlisting>#!/bin/sh
  23.411 +cd `dirname $0` &amp;&amp; ./processmail "$1" nessuno@example.com</programlisting>
  23.412 +	<para id="x_267">Non sembra che l&rsquo;indirizzo email passato a <filename>processmail</filename> abbia importanza.</para>
  23.413 +
  23.414 +	<para id="x_268">Se la vostra sezione <literal role="rc-usermap">usermap</literal> non è impostata correttamente, gli utenti vedranno un messaggio di errore stampato dall&rsquo;hook <literal role="hg-ext">bugzilla</literal> al momento di trasmettere i cambiamenti al server. Il messaggio di errore somiglierà al seguente:</para>
  23.415 +	<programlisting>impossibile trovare un nome utente bugzilla per mario.rossi@example.com</programlisting>
  23.416 +	<para id="x_269">Questo significa che l&rsquo;indirizzo email dell&rsquo;utente Mercurial, <literal>mario.rossi@example.com</literal>, non è un nome utente Bugzilla valido, né possiede una voce nella vostra sezione <literal role="rc-usermap">usermap</literal> che lo metta in relazione con un nome utente Bugzilla valido.</para>
  23.417 +
  23.418 +      </sect3>    
  23.419 +    </sect2>
  23.420 +
  23.421 +    <sect2>
  23.422 +      <title><literal role="hg-ext">notify</literal>&emdash;inviare notifiche via email</title>
  23.423 +
  23.424 +      <para id="x_26a">Sebbene il server web predefinito di Mercurial fornisca i feed RSS dei cambiamenti per ogni repository, molte persone preferiscono ricevere le notifiche dei cambiamenti via email. L&rsquo;hook <literal role="hg-ext">notify</literal> vi permette di inviare notifiche a un insieme di indirizzi email ogni volta che arrivano changeset a cui quelle persone sono interessate.</para>
  23.425 +
  23.426 +      <para id="x_26b">Come l&rsquo;hook <literal role="hg-ext">bugzilla</literal>, anche l&rsquo;hook <literal role="hg-ext">notify</literal> è guidato da un template, in modo che possiate personalizzare il contenuto dei messaggi di notifica inviati.</para>
  23.427 +
  23.428 +      <para id="x_26c">Per default, l&rsquo;hook <literal role="hg-ext">notify</literal> include un diff di ogni changeset che spedisce, ma potete limitare le dimensioni del diff oppure disattivarlo interamente. L&rsquo;inclusione del diff è utile per consentire agli interessati di revisionare i cambiamenti immediatamente piuttosto che obbligarli a cliccare per seguire un URL.</para>
  23.429 +
  23.430 +      <sect3>
  23.431 +	<title>Configurare l&rsquo;hook <literal role="hg-ext">notify</literal></title>
  23.432 +
  23.433 +	<para id="x_26d">Potete impostare l&rsquo;hook <literal role="hg-ext">notify</literal> in modo che spedisca un messaggio email per ogni changeset in entrata, o uno per ogni gruppo di changeset in entrata (tutti quelli che sono arrivati in una singola estrazione o trasmissione).</para>
  23.434 +	<programlisting>[hooks]
  23.435 +# spedisci un'email per gruppo di cambiamenti
  23.436 +changegroup.notify = python:hgext.notify.hook
  23.437 +# spedisci un'email per cambiamento
  23.438 +incoming.notify = python:hgext.notify.hook</programlisting>
  23.439 +
  23.440 +	<para id="x_26e">Le informazioni di configurazione per questo hook si trovano nella sezione <literal role="rc-notify">notify</literal> del file <filename role="special">hgrc</filename>.</para>
  23.441 +	<itemizedlist>
  23.442 +	  <listitem><para id="x_26f"><envar role="rc-item-notify">test</envar>: per default, questo hook non spedisce alcuna email, ma stampa il messaggio che <emphasis>verrebbe</emphasis> inviato. Impostate questo elemento a <literal>false</literal> per consentire la spedizione delle email. La ragione per cui la spedizione delle email è disabilitata per default è che ci vogliono diverse prove per configurare questa estensione esattamente come vorreste, e non starebbe bene infastidire gli interessati con un certo numero di notifiche <quote>sbagliate</quote> mentre correggete la vostra configurazione.</para>
  23.443 +	  </listitem>
  23.444 +	  <listitem><para id="x_270"><envar role="rc-item-notify">config</envar>: il percorso di un file di configurazione che contiene le informazioni di iscrizione. Questo viene tenuto separato dal file <filename role="special">hgrc</filename> principale in modo che possiate mantenerlo in un proprio repository. Le persone possono poi clonare quel repository, aggiornare le proprie iscrizioni e trasmettere i cambiamenti al vostro server.</para>
  23.445 +	  </listitem>
  23.446 +	  <listitem><para id="x_271"><envar role="rc-item-notify">strip</envar>: il numero di parti iniziali da eliminare dal percorso di un repository quando state decidendo se è possibile iscriversi al servizio di notifica per un repository. Per esempio, se i repository sul vostro server si trovano in <filename class="directory">/home/hg/repos</filename>, e <literal role="hg-ext">notify</literal> sta considerando un repository chiamato <filename class="directory">/home/hg/repos/condivisi/test</filename>, impostare <envar role="rc-item-notify">strip</envar> a <literal>4</literal> farà in modo che <literal role="hg-ext">notify</literal> restringa il percorso da considerare a <filename class="directory">condivisi/test</filename> e associ le iscrizioni a questo percorso.</para>
  23.447 +	  </listitem>
  23.448 +	  <listitem><para id="x_272"><envar role="rc-item-notify">template</envar>: il testo del template da usare per inviare i messaggi. Questo specifica i contenuti sia delle intestazioni che del corpo del messaggio.</para>
  23.449 +	  </listitem>
  23.450 +	  <listitem><para id="x_273"><envar role="rc-item-notify">maxdiff</envar>: il massimo numero di righe di dati di diff da aggiungere alla fine di un messaggio. Se un diff è più lungo di questo limite, viene troncato. Per default, questo valore è impostato a 300. Impostate questo valore a <literal>0</literal> per omettere i diff dalle email di notifica.</para>
  23.451 +	  </listitem>
  23.452 +	  <listitem><para id="x_274"><envar role="rc-item-notify">sources</envar>: una lista di modalità di provenienza dei changeset da considerare. Questo vi permette di limitare <literal role="hg-ext">notify</literal> in modo che spedisca email riguardanti solo utenti remoti che hanno trasmesso modifiche a questo repository attraverso un server, per esempio. Leggete la <xref linkend="sec:hook:sources"/> per sapere quali modalità potete specificare qui.</para>
  23.453 +	  </listitem></itemizedlist>
  23.454 +
  23.455 +	<para id="x_275">Se impostate l&rsquo;elemento <envar role="rc-item-web">baseurl</envar> nella sezione <literal role="rc-web">web</literal>, potete usarlo in un template, dove sarà disponibile con il nome <literal>webroot</literal>.</para>
  23.456 +
  23.457 +	<para id="x_276">Ecco un esempio dell&rsquo;insieme di informazioni di configurazione da usare per l&rsquo;hook <literal role="hg-ext">notify</literal>.</para>
  23.458 +
  23.459 +	&ch10-notify-config.lst;
  23.460 +
  23.461 +	<para id="x_277">Questo produrrà un messaggio che somiglierà al seguente:</para>
  23.462 +
  23.463 +	&ch10-notify-config-mail.lst;
  23.464 +
  23.465 +      </sect3>
  23.466 +      <sect3>
  23.467 +	<title>Collaudo e risoluzione dei problemi</title>
  23.468 +
  23.469 +	<para id="x_278">Non dimenticate che il comportamento predefinito dell&rsquo;estensione <literal role="hg-ext">notify</literal> è quello di <emphasis>non spedire alcuna mail</emphasis> fino a quando non lo avete esplicitamente configurato per farlo, impostando <envar role="rc-item-notify">test</envar> a <literal>false</literal>. Fino a quel momento, si limiterà a stampare il messaggio che <emphasis>verrebbe</emphasis> inviato.</para>
  23.470 +
  23.471 +      </sect3>
  23.472 +    </sect2>
  23.473 +  </sect1>
  23.474 +  <sect1 id="sec:hook:ref">
  23.475 +    <title>Informazioni per gli implementatori di hook</title>
  23.476 +
  23.477 +    <sect2>
  23.478 +      <title>Esecuzione degli hook interni</title>
  23.479 +
  23.480 +      <para id="x_279">Un hook interno viene invocato con argomenti della forma seguente:</para>
  23.481 +      <programlisting>def miohook(ui, repo, **kwargs):
  23.482 +    pass</programlisting>
  23.483 +      <para id="x_27a">Il parametro <literal>ui</literal> è un oggetto di tipo <literal role="py-mod-mercurial.ui">mercurial.ui.ui</literal>. Il parametro <literal>repo</literal> è un oggetto di tipo <literal role="py-mod-mercurial.localrepo">mercurial.localrepo.localrepository</literal>. I nomi e i valori dei parametri <literal>**kwargs</literal> dipendono dall&rsquo;hook coinvolto, ma hanno le seguenti caratteristiche comuni:</para>
  23.484 +      <itemizedlist>
  23.485 +	<listitem><para id="x_27b">Se un parametro si chiama <literal>node</literal> o <literal>parentN</literal>, conterrà un identificatore esadecimale di changeset. Per rappresentare l&rsquo;identificatore di changeset <quote>nullo</quote>, viene usata una stringa vuota invece di una stringa di zeri.</para>
  23.486 +	</listitem>
  23.487 +	<listitem><para id="x_27c">Se un parametro si chiama <literal>url</literal>, conterrà l&rsquo;URL di un repository remoto, nel caso possa essere determinato.</para>
  23.488 +	</listitem>
  23.489 +	<listitem><para id="x_27d">I parametri con valore booleano vengono rappresentati come oggetti Python di tipo <literal>bool</literal>.</para>
  23.490 +	</listitem></itemizedlist>
  23.491 +
  23.492 +      <para id="x_27e">Un hook interno viene invocato senza cambiare la directory di lavoro del processo (a differenza degli hook esterni, che vengono eseguiti nella radice del repository). L&rsquo;hook non deve mai cambiare questa directory, altrimenti causerà il fallimento di tutte le proprie invocazioni alla API di Mercurial.</para>
  23.493 +
  23.494 +      <para id="x_27f">Se un hook restituisce il valore booleano <quote>falso</quote>, si considera terminato con successo. Se restituisce il valore booleano <quote>vero</quote> oppure solleva un&rsquo;eccezione, si considera fallito. Un modo utile di pensare a questa convenzione di esecuzione è <quote>dimmi se hai fallito</quote>.</para>
  23.495 +
  23.496 +      <para id="x_280">Notate che gli identificatori di changeset vengono passati agli hook Python sotto forma di stringhe esadecimali, non degli hash binari che la API Mercurial usa normalmente. Per convertire un hash da esadecimale a binario, usate la funzione <literal>mercurial.node.bin</literal>.
  23.497 +      </para>
  23.498 +    </sect2>
  23.499 +
  23.500 +    <sect2>
  23.501 +      <title>Esecuzione degli hook esterni</title>
  23.502 +
  23.503 +      <para id="x_281">Un hook esterno viene passato alla shell dell&rsquo;utente che sta eseguendo Mercurial e può disporre delle funzionalità di quella shell, come la sostituzione delle variabili e la redirezione dei comandi. L&rsquo;hook viene eseguito nella directory radice del repository (a differenza degli hook interni, che vengono eseguiti nella stessa directory in cui è stato eseguito Mercurial).</para>
  23.504 +
  23.505 +      <para id="x_282">I parametri di hook sono passati all&rsquo;hook sotto forma di variabili d&rsquo;ambiente. Il nome di ogni variabile d&rsquo;ambiente viene convertito in maiuscolo e fatto precedere dalla stringa <quote><literal>HG_</literal></quote>. Per esempio, se il nome di un parametro è <quote><literal>node</literal></quote>, il nome della variabile d&rsquo;ambiente che rappresenta quel parametro sarà <quote><literal>HG_NODE</literal></quote>.</para>
  23.506 +
  23.507 +      <para id="x_283">Un parametro booleano è rappresentato come la stringa <quote><literal>1</literal></quote> se è <quote>vero</quote> o <quote><literal>0</literal></quote> se è <quote>falso</quote>. Se una variabile d&rsquo;ambiente è chiamata <envar>HG_NODE</envar>, <envar>HG_PARENT1</envar>, o <envar>HG_PARENT2</envar>, conterrà un identificatore di changeset rappresentato come una stringa esadecimale. Per rappresentare l&rsquo;identificatore di changeset <quote>nullo</quote>, viene usata una stringa vuota invece di una stringa di zeri. Se una variabile d&rsquo;ambiente è chiamata <envar>HG_URL</envar>, conterrà l&rsquo;URL di un repository remoto, nel caso possa essere determinato.</para>
  23.508 +
  23.509 +      <para id="x_284">Se un hook termina con uno stato uguale a zero, si considera terminato con successo. Se termina con uno stato diverso da zero, si considera fallito.</para>
  23.510 +    </sect2>
  23.511 +
  23.512 +    <sect2>
  23.513 +      <title>Scoprire da dove vengono i changeset</title>
  23.514 +
  23.515 +      <para id="x_285">Un hook che coinvolge il trasferimento di changeset tra un repository locale e un altro potrebbe essere in grado di trovare informazioni sul <quote>lato opposto</quote>. Mercurial conosce il <emphasis>modo</emphasis> in cui i cambiamenti vengono trasferiti e in molti casi conosce anche l&rsquo;ubicazione del <emphasis>luogo</emphasis> da cui o verso cui vengono trasferiti.</para>
  23.516 +
  23.517 +      <sect3 id="sec:hook:sources">
  23.518 +	<title>Le fonti dei changeset</title>
  23.519 +
  23.520 +	<para id="x_286">Mercurial dirà a un hook quali sono, o sono stati, i mezzi usati per trasferire i changeset tra repository, fornendo questa informazione in un parametro Python chiamato <literal>source</literal> o in una variabile d&rsquo;ambiente chiamata <envar>HG_SOURCE</envar>.</para>
  23.521 +
  23.522 +	<itemizedlist>
  23.523 +	  <listitem><para id="x_287"><literal>serve</literal>: i changeset sono trasferiti da o verso un repository remoto via HTTP o ssh.</para>
  23.524 +	  </listitem>
  23.525 +	  <listitem><para id="x_288"><literal>pull</literal>: i changeset sono trasferiti attraverso un&rsquo;estrazione da un repository a un altro.</para>
  23.526 +	  </listitem>
  23.527 +	  <listitem><para id="x_289"><literal>push</literal>: i changeset sono trasferiti attraverso una trasmissione da un repository a un altro.</para>
  23.528 +	  </listitem>
  23.529 +	  <listitem><para id="x_28a"><literal>bundle</literal>: i changeset sono trasferiti da o verso un bundle.</para>
  23.530 +	  </listitem></itemizedlist>
  23.531 +      </sect3>
  23.532 +
  23.533 +      <sect3 id="sec:hook:url">
  23.534 +	<title>La destinazione dei cambiamenti&emdash;gli URL dei repository remoti</title>
  23.535 +
  23.536 +	<para id="x_28b">Quando è possibile, Mercurial dirà a un hook l&rsquo;ubicazione del <quote>lato opposto</quote> di un&rsquo;attività che trasferisce i dati dei changeset tra repository, fornendo questa informazione in un parametro Python chiamato <literal>url</literal> o in una variabile d&rsquo;ambiente chiamata <envar>HG_URL</envar>.</para>
  23.537 +
  23.538 +	<para id="x_28c">Questa informazione non è sempre nota. Se un hook viene invocato in un repository condiviso via HTTP o ssh, Mercurial non è in grado di dire dove si trova il repository, ma potrebbe sapere da dove si sta connettendo il client. In questi casi, l&rsquo;URL prenderà una delle seguenti forme:</para>
  23.539 +	<itemizedlist>
  23.540 +	  <listitem><para id="x_28d"><literal>remote:ssh:1.2.3.4</literal>&emdash;client ssh remoto, all&rsquo;indirizzo IP <literal>1.2.3.4</literal>.</para>
  23.541 +	  </listitem>
  23.542 +	  <listitem><para id="x_28e"><literal>remote:http:1.2.3.4</literal>&emdash;client HTTP remoto, all&rsquo;indirizzo IP <literal>1.2.3.4</literal>. Se il client sta usando SSL, questo URL sarà nella forma <literal>remote:https:1.2.3.4</literal>.</para>
  23.543 +	  </listitem>
  23.544 +	  <listitem><para id="x_28f">Vuoto&emdash;Mercurial non è riuscito a scoprire nessuna informazione sul client remoto.</para>
  23.545 +	  </listitem></itemizedlist>
  23.546 +      </sect3>
  23.547 +    </sect2>
  23.548 +  </sect1>
  23.549 +  <sect1>
  23.550 +    <title>Guida di riferimento agli hook</title>
  23.551 +
  23.552 +    <sect2 id="sec:hook:changegroup">
  23.553 +      <title><literal role="hook">changegroup</literal>&emdash;dopo l&rsquo;aggiunta di changeset remoti</title>
  23.554 +
  23.555 +      <para id="x_290">Questo hook viene eseguito dopo che un gruppo di changeset preesistenti è stato aggiunto al repository, per esempio tramite <command role="hg-cmd">hg pull</command> o <command role="hg-cmd">hg unbundle</command>. Questo hook viene eseguito una volta per ogni operazione che aggiunge uno o più changeset, a differenza dell&rsquo;hook <literal role="hook">incoming</literal>, che viene eseguito una volta per ogni changeset a prescindere dal fatto che il changeset sia arrivato in un gruppo.</para>
  23.556 +
  23.557 +      <para id="x_291">Alcuni possibili usi di questo hook includono l&rsquo;avvio di un assemblaggio o di un collaudo automatico dei changeset aggiunti, l&rsquo;aggiornamento di un database di bug, o la notifica che un repository contiene nuovi cambiamenti.</para>
  23.558 +
  23.559 +      <para id="x_292">I parametri di questo hook sono i seguenti.</para>
  23.560 +      <itemizedlist>
  23.561 +	<listitem><para id="x_293"><literal>node</literal>: un identificatore di changeset. L&rsquo;identificatore del primo changeset nel gruppo che è stato aggiunto. Tutti i changeset tra questo e <literal role="tag">tip</literal> compresi sono stati aggiunti da una singola invocazione di <command role="hg-cmd">hg pull</command>, <command role="hg-cmd">hg push</command>, o <command role="hg-cmd">hg unbundle</command>.</para>
  23.562 +	</listitem>
  23.563 +	<listitem><para id="x_294"><literal>source</literal>: una stringa. La fonte di questi cambiamenti. Si veda la <xref linkend="sec:hook:sources"/> per i dettagli.</para>
  23.564 +	</listitem>
  23.565 +	<listitem><para id="x_295"><literal>url</literal>: un URL. L&rsquo;ubicazione del repository remoto, nel caso sia nota. Si veda la <xref linkend="sec:hook:url"/> per maggiori informazioni.</para>
  23.566 +	</listitem></itemizedlist>
  23.567 +
  23.568 +      <para id="x_296">Si vedano anche gli hook <literal role="hook">incoming</literal> (<xref linkend="sec:hook:incoming"/>), <literal role="hook">prechangegroup</literal> (<xref linkend="sec:hook:prechangegroup"/>) e <literal role="hook">pretxnchangegroup</literal> (<xref linkend="sec:hook:pretxnchangegroup"/>).</para>
  23.569 +    </sect2>
  23.570 +
  23.571 +    <sect2 id="sec:hook:commit">
  23.572 +      <title><literal role="hook">commit</literal>&emdash;dopo la creazione di un nuovo changeset</title>
  23.573 +
  23.574 +      <para id="x_297">Questo hook viene eseguito dopo che un nuovo changeset è stato creato.</para>
  23.575 +
  23.576 +      <para id="x_298">I parametri di questo hook sono i seguenti.</para>
  23.577 +      <itemizedlist>
  23.578 +	<listitem><para id="x_299"><literal>node</literal>: un identificatore di changeset. L&rsquo;identificatore del changeset appena inserito.</para>
  23.579 +	</listitem>
  23.580 +	<listitem><para id="x_29a"><literal>parent1</literal>: un identificatore di changeset. L&rsquo;identificatore di changeset del primo genitore del changeset appena inserito.</para>
  23.581 +	</listitem>
  23.582 +	<listitem><para id="x_29b"><literal>parent2</literal>: un identificatore di changeset. L&rsquo;identificatore di changeset del secondo genitore del changeset appena inserito.</para>
  23.583 +	</listitem></itemizedlist>
  23.584 +
  23.585 +      <para id="x_29c">Si vedano anche gli hook <literal role="hook">precommit</literal> (<xref linkend="sec:hook:precommit"/>) e <literal role="hook">pretxncommit</literal> (<xref linkend="sec:hook:pretxncommit"/>).</para>
  23.586 +    </sect2>
  23.587 +
  23.588 +    <sect2 id="sec:hook:incoming">
  23.589 +      <title><literal role="hook">incoming</literal>&emdash;dopo l&rsquo;aggiunta di un changeset remoto</title>
  23.590 +
  23.591 +      <para id="x_29d">Questo hook viene eseguito dopo che un changeset preesistente è stato aggiunto al repository, per esempio attraverso l&rsquo;invocazione di <command role="hg-cmd">hg push</command>. Se un gruppo di changeset è stato aggiunto in una singola operazione, questo hook viene eseguito una volta per ogni changeset aggiunto.</para>
  23.592 +
  23.593 +      <para id="x_29e">Potete usare questo hook per gli stessi scopi dell&rsquo;hook <literal role="hook">changegroup</literal> (<xref linkend="sec:hook:changegroup"/>). A volte è semplicemente più comodo eseguire un hook per ogni gruppo di changeset, mentre altre volte è più conveniente eseguirlo per ogni changeset.</para>
  23.594 +
  23.595 +      <para id="x_29f">I parametri di questo hook sono i seguenti.</para>
  23.596 +      <itemizedlist>
  23.597 +	<listitem><para id="x_2a0"><literal>node</literal>: un identificatore di changeset. L&rsquo;identificatore del changeset appena aggiunto.</para>
  23.598 +	</listitem>
  23.599 +	<listitem><para id="x_2a1"><literal>source</literal>: una stringa. La fonte di questi cambiamenti. Si veda la <xref linkend="sec:hook:sources"/> per i dettagli.</para>
  23.600 +	</listitem>
  23.601 +	<listitem><para id="x_2a2"><literal>url</literal>: un URL. L&rsquo;ubicazione del repository remoto, nel caso sia nota. Si veda la <xref linkend="sec:hook:url"/> per maggiori informazioni.</para>
  23.602 +	</listitem></itemizedlist>
  23.603 +
  23.604 +      <para id="x_2a3">Si vedano anche gli hook <literal role="hook">changegroup</literal> (<xref linkend="sec:hook:changegroup"/>), <literal role="hook">prechangegroup</literal> (<xref linkend="sec:hook:prechangegroup"/>) e <literal role="hook">pretxnchangegroup</literal> (<xref linkend="sec:hook:pretxnchangegroup"/>).</para>
  23.605 +    </sect2>
  23.606 +
  23.607 +    <sect2 id="sec:hook:outgoing">
  23.608 +      <title><literal role="hook">outgoing</literal>&emdash;dopo la propagazione dei changeset</title>
  23.609 +
  23.610 +      <para id="x_2a4">Questo hook viene eseguito dopo che un gruppo di changeset è stato propagato al di fuori di questo repository, per esempio attraverso l&rsquo;invocazione dei comandi <command role="hg-cmd">hg push</command> o <command role="hg-cmd">hg bundle</command>.</para>
  23.611 +
  23.612 +      <para id="x_2a5">Un possibile impiego di questo hook è quello di notificare gli amministratori di un repository che alcuni cambiamenti sono stati estratti.</para>
  23.613 +
  23.614 +      <para id="x_2a6">I parametri di questo hook sono i seguenti.</para>
  23.615 +      <itemizedlist>
  23.616 +	<listitem><para id="x_2a7"><literal>node</literal>: un identificatore di changeset. L&rsquo;identificatore del primo changeset del gruppo che è stato propagato.</para>
  23.617 +	</listitem>
  23.618 +	<listitem><para id="x_2a8"><literal>source</literal>: una stringa. La fonte dell&rsquo;operazione (si veda la <xref linkend="sec:hook:sources"/>). Se un client remoto ha estratto i cambiamenti da questo repository, il valore di <literal>source</literal> sarà <literal>serve</literal>. Se il client che ha ottenuto i cambiamenti di questo repository era locale, il valore di <literal>source</literal> sarà <literal>bundle</literal>, <literal>pull</literal>, o <literal>push</literal>, a seconda dell&rsquo;operazione effettuata dal client.</para>
  23.619 +	</listitem>
  23.620 +	<listitem><para id="x_2a9"><literal>url</literal>: un URL. L&rsquo;ubicazione del repository remoto, nel caso sia nota. Si veda la <xref linkend="sec:hook:url"/> per maggiori informazioni.</para>
  23.621 +	</listitem></itemizedlist>
  23.622 +
  23.623 +      <para id="x_2aa">Si veda anche l&rsquo;hook <literal role="hook">preoutgoing</literal> (<xref linkend="sec:hook:preoutgoing"/>).</para>
  23.624 +    </sect2>
  23.625 +
  23.626 +    <sect2 id="sec:hook:prechangegroup">
  23.627 +      <title><literal role="hook">prechangegroup</literal>&emdash;prima di cominciare ad aggiungere changeset remoti</title>
  23.628 +
  23.629 +      <para id="x_2ab">Questo hook di controllo viene eseguito prima che Mercurial cominci ad aggiungere un gruppo di changeset proveniente da un altro repository.</para>
  23.630 +
  23.631 +      <para id="x_2ac">Questo hook non possiede alcuna informazione sui changeset che verranno aggiunti, perché viene eseguito prima che la trasmissione di quei changeset possa cominciare. Se questo hook fallisce, i changeset non verranno trasmessi.</para>
  23.632 +
  23.633 +      <para id="x_2ad">Un possibile impiego di questo hook è quello di evitare che i cambiamenti vengano aggiunti a un repository. Per esempio, potreste usarlo per <quote>congelare</quote> temporaneamente o permanentemente un ramo ospitato su un server in modo che gli utenti non possano trasmettervi alcuna modifica, consentendo comunque a un amministratore locale di modificare il repository.</para>
  23.634 +
  23.635 +      <para id="x_2ae">I parametri di questo hook sono i seguenti.</para>
  23.636 +      <itemizedlist>
  23.637 +	<listitem><para id="x_2af"><literal>source</literal>: una stringa. La fonte di questi cambiamenti. Si veda la <xref linkend="sec:hook:sources"/> per i dettagli.</para>
  23.638 +	</listitem>
  23.639 +	<listitem><para id="x_2b0"><literal>url</literal>: un URL. L&rsquo;ubicazione del repository remoto, nel caso sia nota. Si veda la <xref linkend="sec:hook:url"/> per maggiori informazioni.</para>
  23.640 +	</listitem></itemizedlist>
  23.641 +
  23.642 +      <para id="x_2b1">Si vedano anche gli hook <literal role="hook">changegroup</literal> (<xref linkend="sec:hook:changegroup"/>), <literal role="hook">incoming</literal> (<xref linkend="sec:hook:incoming"/>) e <literal role="hook">pretxnchangegroup</literal> (<xref linkend="sec:hook:pretxnchangegroup"/>).</para>
  23.643 +    </sect2>
  23.644 +
  23.645 +    <sect2 id="sec:hook:precommit">
  23.646 +      <title><literal role="hook">precommit</literal>&emdash;prima di cominciare l&rsquo;inserimento di un changeset</title>
  23.647 +
  23.648 +      <para id="x_2b2">Questo hook viene eseguito prima che Mercurial cominci l&rsquo;inserimento di un nuovo changeset, quindi prima che Mercurial conosca i metadati dell&rsquo;inserimento come i file da inserire, il messaggio e la data di commit.</para>
  23.649 +
  23.650 +      <para id="x_2b3">Questo hook può essere usato per disabilitare la possibilità di inserire nuovi changeset, pur permettendo la trasmissione di changeset in entrata. Un&rsquo;altra possibilità è quella di eseguire l&rsquo;assemblaggio o il collaudo e consentire l&rsquo;avvio dell&rsquo;inserimento solo se l&rsquo;assemblaggio o il collaudo hanno successo.</para>
  23.651 +
  23.652 +      <para id="x_2b4">I parametri di questo hook sono i seguenti.</para>
  23.653 +      <itemizedlist>
  23.654 +	<listitem><para id="x_2b5"><literal>parent1</literal>: un identificatore di changeset. L&rsquo;identificatore di changeset del primo genitore della directory di lavoro.</para>
  23.655 +	</listitem>
  23.656 +	<listitem><para id="x_2b6"><literal>parent2</literal>: un identificatore di changeset. L&rsquo;identificatore di changeset del secondo genitore della directory di lavoro.</para>
  23.657 +	</listitem></itemizedlist>
  23.658 +      <para id="x_2b7">Se l&rsquo;inserimento procede, i genitori della directory di lavoro diventeranno i genitori del nuovo changeset.</para>
  23.659 +
  23.660 +      <para id="x_2b8">Si vedano anche gli hook <literal role="hook">commit</literal> (<xref linkend="sec:hook:commit"/>) e <literal role="hook">pretxncommit</literal> (<xref linkend="sec:hook:pretxncommit"/>).</para>
  23.661 +    </sect2>
  23.662 +
  23.663 +    <sect2 id="sec:hook:preoutgoing">
  23.664 +      <title><literal role="hook">preoutgoing</literal>&emdash;prima di cominciare la propagazione dei changeset</title>
  23.665 +
  23.666 +      <para id="x_2b9">Questo hook viene invocato prima che Mercurial conosca le identità dei changeset da trasmettere.</para>
  23.667 +
  23.668 +      <para id="x_2ba">Un possibile impiego di questo hook è quello di evitare che i changeset vengano trasmessi a un altro repository.</para>
  23.669 +
  23.670 +      <para id="x_2bb">I parametri di questo hook sono i seguenti.</para>
  23.671 +      <itemizedlist>
  23.672 +	<listitem><para id="x_2bc"><literal>source</literal>: una stringa. La fonte dell&rsquo;operazione che sta tentando di ottenere i cambiamenti da questo repository (si veda la <xref linkend="sec:hook:sources"/>). Leggete la documentazione del parametro <literal>source</literal> dell&rsquo;hook <literal role="hook">outgoing</literal> nella <xref linkend="sec:hook:outgoing"/> per conoscere i possibili valori di questo parametro.</para>
  23.673 +	</listitem>
  23.674 +	<listitem><para id="x_2bd"><literal>url</literal>: un URL. L&rsquo;ubicazione del repository remoto, nel caso sia nota. Si veda la <xref linkend="sec:hook:url"/> per maggiori informazioni.</para>
  23.675 +	</listitem></itemizedlist>
  23.676 +
  23.677 +      <para id="x_2be">Si veda anche l&rsquo;hook <literal role="hook">outgoing</literal> (<xref linkend="sec:hook:outgoing"/>).</para>
  23.678 +    </sect2>
  23.679 +
  23.680 +    <sect2 id="sec:hook:pretag">
  23.681 +      <title><literal role="hook">pretag</literal>&emdash;prima di etichettare un changeset</title>
  23.682 +
  23.683 +      <para id="x_2bf">Questo hook di controllo viene eseguito prima della creazione di un&rsquo;etichetta. Se l&rsquo;hook ha successo, la creazione dell&rsquo;etichetta procede. Se l&rsquo;hook fallisce, l&rsquo;etichetta non viene creata.</para>
  23.684 +
  23.685 +      <para id="x_2c0">I parametri di questo hook sono i seguenti.</para>
  23.686 +      <itemizedlist>
  23.687 +	<listitem><para id="x_2c1"><literal>local</literal>: un booleano. Indica se l&rsquo;etichetta è locale a questa istanza del repository (cioè memorizzata nel file <filename role="special">.hg/localtags</filename>) o se è gestita da Mercurial (memorizzata nel file <filename role="special">.hgtags</filename>).</para>
  23.688 +	</listitem>
  23.689 +	<listitem><para id="x_2c2"><literal>node</literal>: un identificatore di changeset. L&rsquo;identificatore del changeset da etichettare.</para>
  23.690 +	</listitem>
  23.691 +	<listitem><para id="x_2c3"><literal>tag</literal>: una stringa. Il nome dell&rsquo;etichetta da creare.</para>
  23.692 +	</listitem></itemizedlist>
  23.693 +
  23.694 +      <para id="x_2c4">Se l&rsquo;etichetta da creare è soggetta a controllo di revisione, verranno eseguiti anche gli hook <literal role="hook">precommit</literal> e <literal role="hook">pretxncommit</literal> (<xref linkend="sec:hook:commit"/> e <xref linkend="sec:hook:pretxncommit"/>).</para>
  23.695 +
  23.696 +      <para id="x_2c5">Si veda anche l&rsquo;hook <literal role="hook">tag</literal> (<xref linkend="sec:hook:tag"/>).</para>
  23.697 +    </sect2>
  23.698 +
  23.699 +    <sect2 id="sec:hook:pretxnchangegroup">
  23.700 +      <title><literal
  23.701 +	  role="hook">pretxnchangegroup</literal>&emdash;prima di completare l&rsquo;aggiunta di changeset remoti</title>
  23.702 +
  23.703 +      <para id="x_2c6">Questo hook di controllo viene eseguito prima di completare la transazione che gestisce l&rsquo;aggiunta di un gruppo di nuovi changeset provenienti dall&rsquo;esterno del repository. Se l&rsquo;hook ha successo, la transazione viene completata e tutti i changeset diventano permanenti all&rsquo;interno di questo repository. Se l&rsquo;hook fallisce, la transazione viene abortita e i dati relativi ai changeset vengono cancellati.</para>
  23.704 +
  23.705 +      <para id="x_2c7">Questo hook può accedere ai metadati associati ai changeset in procinto di essere aggiunti, ma dovrebbe evitare di modificarli in maniera permanente. L&rsquo;hook deve anche evitare di modificare la directory di lavoro.</para>
  23.706 +
  23.707 +      <para id="x_2c8">Se altri processi Mercurial accedono al repository mentre questo hook è in esecuzione, saranno in grado di vedere i changeset quasi aggiunti come se fossero permanenti. Questo potrebbe portare a condizioni di corsa critica se non eseguite i passi necessari per evitarle.</para>
  23.708 +
  23.709 +      <para id="x_2c9">Questo hook può essere usato per esaminare automaticamente un gruppo di changeset. Se l&rsquo;hook fallisce, tutti i changeset vengono <quote>respinti</quote> quando la transazione viene abortita.</para>
  23.710 +
  23.711 +      <para id="x_2ca">I parametri di questo hook sono i seguenti.</para>
  23.712 +      <itemizedlist>
  23.713 +	<listitem><para id="x_2cb"><literal>node</literal>: un identificatore di changeset. L&rsquo;identificatore del primo changeset nel gruppo che è stato aggiunto. Tutti i changeset tra questo e <literal role="tag">tip</literal> compresi sono stati aggiunti da una singola invocazione di <command role="hg-cmd">hg pull</command>, <command role="hg-cmd">hg push</command>, o <command role="hg-cmd">hg unbundle</command>.</para>
  23.714 +	</listitem>
  23.715 +	<listitem><para id="x_2cc"><literal>source</literal>: una stringa. La fonte di questi cambiamenti. Si veda la <xref linkend="sec:hook:sources"/> per i dettagli.</para>
  23.716 +	</listitem>
  23.717 +	<listitem><para id="x_2cd"><literal>url</literal>: un URL. L&rsquo;ubicazione del repository remoto, nel caso sia nota. Si veda la <xref linkend="sec:hook:url"/> per maggiori informazioni.</para>
  23.718 +	</listitem></itemizedlist>
  23.719 +
  23.720 +      <para id="x_2ce">Si vedano anche gli hook <literal role="hook">changegroup</literal> (<xref linkend="sec:hook:changegroup"/>), <literal role="hook">incoming</literal> (<xref linkend="sec:hook:incoming"/>) e <literal role="hook">prechangegroup</literal> (<xref linkend="sec:hook:prechangegroup"/>).</para>
  23.721 +    </sect2>
  23.722 +
  23.723 +    <sect2 id="sec:hook:pretxncommit">
  23.724 +      <title><literal role="hook">pretxncommit</literal>&emdash;prima di completare l&rsquo;inserimento di un nuovo changeset</title>
  23.725 +
  23.726 +      <para id="x_2cf">Questo hook di controllo viene eseguito prima di completare la transazione che gestisce un nuovo inserimento. Se l&rsquo;hook ha successo, la transazione viene completata e il changeset diventa permanente all&rsquo;interno di questo repository. Se l&rsquo;hook fallisce, la transazione viene abortita e i dati dell&rsquo;inserimento vengono cancellati.</para>
  23.727 +
  23.728 +      <para id="x_2d0">Questo hook può accedere ai metadati associati al changeset in procinto di essere inserito, ma dovrebbe evitare di modificarli in maniera permanente. L&rsquo;hook deve anche evitare di modificare la directory di lavoro.</para>
  23.729 +
  23.730 +      <para id="x_2d1">Se altri processi Mercurial accedono al repository mentre questo hook è in esecuzione, saranno in grado di vedere i changeset quasi aggiunti come se fossero permanenti. Questo potrebbe portare a condizioni di corsa critica se non eseguite i passi necessari per evitarle.</para>
  23.731 +
  23.732 +      <para id="x_2d2">I parametri di questo hook sono i seguenti.</para>
  23.733 +
  23.734 +      <itemizedlist>
  23.735 +    <listitem><para id="x_2d3"><literal>node</literal>: un identificatore di changeset. L&rsquo;identificatore del changeset sul punto di essere inserito.</para>
  23.736 +	</listitem>
  23.737 +	<listitem><para id="x_2d4"><literal>parent1</literal>: un identificatore di changeset. L&rsquo;identificatore di changeset del primo genitore del changeset sul punto di essere inserito.</para>
  23.738 +	</listitem>
  23.739 +	<listitem><para id="x_2d5"><literal>parent2</literal>: un identificatore di changeset. L&rsquo;identificatore di changeset del secondo genitore del changeset sul punto di essere inserito.</para>
  23.740 +	</listitem></itemizedlist>
  23.741 +
  23.742 +      <para id="x_2d6">Si veda anche l&rsquo;hook <literal role="hook">precommit</literal> (<xref linkend="sec:hook:precommit"/>).</para>
  23.743 +    </sect2>
  23.744 +
  23.745 +    <sect2 id="sec:hook:preupdate">
  23.746 +      <title><literal role="hook">preupdate</literal>&emdash;prima di eseguire un aggiornamento o un&rsquo;unione della directory di lavoro</title>
  23.747 +
  23.748 +      <para id="x_2d7">Questo hook viene eseguito prima di cominciare un aggiornamento o un&rsquo;unione della directory di lavoro. Viene eseguito solo se i normali controlli effettuati da Mercurial prima di un aggiornamento determinano che l&rsquo;aggiornamento o l&rsquo;unione possono procedere. Se l&rsquo;hook ha successo, l&rsquo;aggiornamento o l&rsquo;unione possono procedere, ma se fallisce, l&rsquo;aggiornamento o l&rsquo;unione non vengono cominciati.</para>
  23.749 +
  23.750 +      <para id="x_2d8">I parametri di questo hook sono i seguenti.</para>
  23.751 +      <itemizedlist>
  23.752 +	<listitem><para id="x_2d9"><literal>parent1</literal>: un identificatore di changeset. L&rsquo;identificatore del genitore a cui la directory di lavoro sta per essere aggiornata. Se si sta per effettuare un&rsquo;unione, questo genitore non verrà modificato.</para>
  23.753 +	</listitem>
  23.754 +	<listitem><para id="x_2da"><literal>parent2</literal>: un identificatore di changeset. Il suo valore viene impostato solo se si sta eseguendo un&rsquo;unione. Contiene l&rsquo;identificatore della revisione con cui la directory di lavoro viene unita.</para>
  23.755 +	</listitem></itemizedlist>
  23.756 +
  23.757 +      <para id="x_2db">Si veda anche l&rsquo;hook <literal role="hook">update</literal> (<xref linkend="sec:hook:update"/>).</para>
  23.758 +    </sect2>
  23.759 +
  23.760 +    <sect2 id="sec:hook:tag">
  23.761 +      <title><literal role="hook">tag</literal>&emdash;dopo aver etichettato un changeset</title>
  23.762 +
  23.763 +      <para id="x_2dc">Questo hook viene eseguito dopo la creazione di un&rsquo;etichetta.</para>
  23.764 +
  23.765 +      <para id="x_2dd">I parametri di questo hook sono i seguenti.</para>
  23.766 +      <itemizedlist>
  23.767 +    <listitem><para id="x_2de"><literal>local</literal>: un booleano. Indica se l&rsquo;etichetta è locale a questa istanza del repository (cioè memorizzata nel file <filename role="special">.hg/localtags</filename>) o se è gestita da Mercurial (memorizzata nel file <filename role="special">.hgtags</filename>).</para>
  23.768 +	</listitem>
  23.769 +	<listitem><para id="x_2df"><literal>node</literal>: un identificatore di changeset. L&rsquo;identificatore del changeset che è stato etichettato.</para>
  23.770 +	</listitem>
  23.771 +	<listitem><para id="x_2e0"><literal>tag</literal>: una stringa. Il nome dell&rsquo;etichetta creata.</para>
  23.772 +	</listitem></itemizedlist>
  23.773 +
  23.774 +      <para id="x_2e1">Se l&rsquo;etichetta creata è soggetta a controllo di revisione, l&rsquo;hook <literal role="hook">commit</literal> (<xref linkend="sec:hook:commit"/>) verrà eseguito prima di questo hook.</para>
  23.775 +
  23.776 +      <para id="x_2e2">Si veda anche l&rsquo;hook <literal role="hook">pretag</literal> (<xref linkend="sec:hook:pretag"/>).</para>
  23.777 +    </sect2>
  23.778 +
  23.779 +    <sect2 id="sec:hook:update">
  23.780 +      <title><literal role="hook">update</literal>&emdash;dopo aver eseguito un aggiornamento o un&rsquo;unione della directory di lavoro</title>
  23.781 +
  23.782 +      <para id="x_2e3">Questo hook viene eseguito dopo il completamento di un aggiornamento o di un&rsquo;unione della directory di lavoro. Dato che un&rsquo;unione può fallire (nel caso il comando esterno <command>hgmerge</command> non sia in grado di risolvere i conflitti in un file), questo hook comunica se l&rsquo;aggiornamento o l&rsquo;unione sono stati completati in maniera pulita.</para>
  23.783 +
  23.784 +      <para id="x_ffe">I parametri di questo hook sono i seguenti.</para>
  23.785 +      <itemizedlist>
  23.786 +	<listitem><para id="x_2e4"><literal>error</literal>: un booleano. Indica se l&rsquo;aggiornamento o l&rsquo;unione sono stati completati con successo.</para>
  23.787 +	</listitem>
  23.788 +	<listitem><para id="x_2e5"><literal>parent1</literal>: un identificatore di changeset. L&rsquo;identificatore del genitore a cui la directory di lavoro è stata aggiornata. Se è stata effettuata un&rsquo;unione, questo genitore non viene modificato.</para>
  23.789 +	</listitem>
  23.790 +	<listitem><para id="x_2e6"><literal>parent2</literal>: un identificatore di changeset. Il suo valore viene impostato solo se è stata eseguita un&rsquo;unione. Contiene l&rsquo;identificatore della revisione con cui la directory di lavoro è stata unita.</para>
  23.791 +	</listitem></itemizedlist>
  23.792 +
  23.793 +      <para id="x_2e7">Si veda anche l&rsquo;hook <literal role="hook">preupdate</literal> (<xref linkend="sec:hook:preupdate"/>).</para>
  23.794 +
  23.795 +    </sect2>
  23.796 +  </sect1>
  23.797 +</chapter>
    24.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    24.2 +++ b/it/ch11-template.xml	Fri Sep 04 16:33:35 2009 +0200
    24.3 @@ -0,0 +1,338 @@
    24.4 +<chapter id="chap:template">
    24.5 +  <?dbhtml filename="personalizzare-i-messaggi-di-mercurial.html"?>
    24.6 +  <title>Personalizzare i messaggi di Mercurial</title>
    24.7 +
    24.8 +  <para id="x_578">Mercurial vi offre un potente meccanismo basato sui template (letteralmente, modelli) per controllare il modo in cui visualizza le informazioni. Potete usare i template per generare una specifica presentazione dei risultati di un singolo comando, o per personalizzare l&rsquo;intero aspetto dell&rsquo;interfaccia web predefinita.</para>
    24.9 +
   24.10 +  <sect1 id="sec:style">
   24.11 +    <title>Usare gli stili di formattazione già pronti</title>
   24.12 +
   24.13 +    <para id="x_579">Mercurial include alcuni stili di formattazione che potete usare immediatamente. Uno stile è semplicemente un template già pronto che qualcuno ha scritto e installato in una posizione nota a Mercurial.</para>
   24.14 +
   24.15 +    <para id="x_57a">Prima di dare un&rsquo;occhiata agli stili distribuiti con Mercurial, rivediamo il normale risultato di un suo comando.</para>
   24.16 +
   24.17 +    &interaction.template.simple.normal;
   24.18 +
   24.19 +    <para id="x_57b">Questo messaggio ci dà alcune informazioni, ma porta via molto spazio&emdash;cinque righe per ogni changeset. Lo stile <literal>compact</literal> riduce questo spazio a tre righe, presentate in maniera sparsa.</para>
   24.20 +
   24.21 +    &interaction.template.simple.compact;
   24.22 +
   24.23 +    <para id="x_57c">Lo stile <literal>changelog</literal> ci dà un&rsquo;idea di quale sia il potere espressivo del motore di template di Mercurial. Questo stile tenta di seguire le linee guida per la formattazione di un registro dei cambiamenti stabilite dal progetto GNU <citation><xref linkend="bib:gnu"/></citation>.</para>
   24.24 +
   24.25 +    &interaction.template.simple.changelog;
   24.26 +
   24.27 +    <para id="x_57d">Non vi sorprenderà sapere che lo stile di formattazione predefinito di Mercurial è chiamato <literal>default</literal>.</para>
   24.28 +
   24.29 +    <sect2>
   24.30 +      <title>Impostare uno stile predefinito</title>
   24.31 +
   24.32 +      <para id="x_57e">Potete modificare lo stile di formattazione che Mercurial userà per ogni comando aggiungendo al vostro file <filename role="special">~/.hgrc</filename> il nome dello stile che preferireste usare.</para>
   24.33 +
   24.34 +      <programlisting>[ui]
   24.35 +style = compact</programlisting>
   24.36 +
   24.37 +      <para id="x_57f">Se create un vostro stile, potete usarlo inserendo il percorso del vostro file di stile, oppure copiando il vostro file di stile in un luogo dove Mercurial possa trovarlo (tipicamente la sottodirectory <literal>templates</literal> della vostra directory di installazione di Mercurial).</para>
   24.38 +    </sect2>
   24.39 +  </sect1>
   24.40 +
   24.41 +  <sect1>
   24.42 +    <title>Comandi che supportano stili e template</title>
   24.43 +
   24.44 +    <para id="x_580">Tutti i comandi Mercurial di tipo <literal>log</literal> vi permettono di usare stili e template: <command role="hg-cmd">hg incoming</command>, <command role="hg-cmd">hg log</command>, <command role="hg-cmd">hg outgoing</command> e <command role="hg-cmd">hg tip</command>.</para>
   24.45 +
   24.46 +    <para id="x_581">Al momento di scrivere questo manuale, quelli elencati sono i comandi che finora supportano stili e template. Dato che questi sono i comandi più importanti per i quali è necessaria una formattazione personalizzabile, la comunità utenti di Mercurial non ha fatto molta pressione per aggiungere il supporto per stili e template ad altri comandi.</para>
   24.47 +  </sect1>
   24.48 +
   24.49 +  <sect1>
   24.50 +    <title>Nozioni di base sui template</title>
   24.51 +
   24.52 +    <para id="x_582">Nella sua forma più semplice, un template Mercurial è un frammento di testo. Parte del testo non cambia mai, mentre altre parti vengono <emphasis>espanse</emphasis>, cioè sostituite con nuovo testo, quando è necessario.</para>
   24.53 +
   24.54 +    <para id="x_583">Prima di continuare, diamo un&rsquo;altra occhiata al semplice esempio del normale risultato di un comando Mercurial.</para>
   24.55 +
   24.56 +    &interaction.template.simple.normal;
   24.57 +
   24.58 +    <para id="x_584">Ora, eseguiamo lo stesso comando, ma usando un template per cambiare il messaggio visualizzato.</para>
   24.59 +
   24.60 +    &interaction.template.simple.simplest;
   24.61 +
   24.62 +    <para id="x_585">Questo esempio illustra il template più semplice possibile, composto solo da un messaggio di testo statico stampato una volta per ogni changeset. L&rsquo;opzione <option role="hg-opt-log">--template</option> del comando <command role="hg-cmd">hg log</command> dice a Mercurial di usare il testo dato come template per stampare ogni changeset.</para>
   24.63 +
   24.64 +    <para id="x_586">Notate che la stringa di template appena usata termina con il testo <quote><literal>\n</literal></quote>. Questa è una <emphasis>sequenza di escape</emphasis> che dice a Mercurial di stampare una carattere di nuova riga alla fine di ogni elemento di template. Se omettete questa nuova riga, Mercurial mostrerà un messaggio di testo di seguito all&rsquo;altro. Leggete la <xref linkend="sec:template:escape"/> per maggiori dettagli sulle sequenze di escape.</para>
   24.65 +
   24.66 +    <para id="x_587">Un template che stampa una stringa di testo fissa tutte le volte non è molto utile, perciò proviamo qualcosa di un po&rsquo; più complesso.</para>
   24.67 +
   24.68 +    &interaction.template.simple.simplesub;
   24.69 +
   24.70 +    <para id="x_588">Come potete vedere, la stringa <quote><literal>{desc}</literal></quote> nel template è stata sostituita con la descrizione di ogni changeset nel messaggio. Ogni volta che Mercurial trova un testo racchiuso tra parentesi graffe (<quote><literal>{</literal></quote> e <quote><literal>}</literal></quote>), proverà a sostituire le parentesi e il testo con l&rsquo;espansione di qualunque cosa vi sia contenuta. Per stampare una parentesi graffa letterale dovete effettuarne l&rsquo;escape, come descritto nella <xref linkend="sec:template:escape"/>.</para>
   24.71 +  </sect1>
   24.72 +
   24.73 +  <sect1 id="sec:template:keyword">
   24.74 +    <title>Parole chiave comuni nei template</title>
   24.75 +
   24.76 +    <para id="x_589">Potete cominciare immediatamente a scrivere semplici template usando le seguenti parole chiave.</para>
   24.77 +
   24.78 +    <itemizedlist>
   24.79 +      <listitem><para id="x_58a"><literal role="template-keyword">author</literal>: stringa. Il nome non modificato dell&rsquo;autore del changeset.</para>
   24.80 +      </listitem>
   24.81 +      <listitem><para id="x_58b"><literal role="template-keyword">branches</literal>: stringa. Il nome del ramo su cui il changeset è stato inserito. Sarà vuoto se il nome del ramo è <literal>default</literal>.</para>
   24.82 +      </listitem>
   24.83 +      <listitem><para id="x_58c"><literal role="template-keyword">date</literal>: informazioni di data. La data in cui il changeset è stato inserito. Questa informazione <emphasis>non</emphasis> è rappresentata in maniera comprensibile, bensì dovete passarla attraverso un filtro per presentarla in maniera appropriata. Leggete la <xref linkend="sec:template:filter"/> per maggiori informazioni sui filtri. La data viene espressa come una coppia di numeri. Il primo numero è una marcatura temporale che segue l&rsquo;UTC Unix (e indica il numero di secondi trascorsi dal 1° gennaio 1970); il secondo è la differenza tra il fuso orario dell&rsquo;autore del commit e l&rsquo;UTC, espressa in secondi.</para>
   24.84 +      </listitem>
   24.85 +      <listitem><para id="x_58d"><literal role="template-keyword">desc</literal>: stringa. Il testo della descrizione del changeset.</para>
   24.86 +      </listitem>
   24.87 +      <listitem><para id="x_58e"><literal role="template-keyword">files</literal>: lista di stringhe. Tutti i file modificati, aggiunti, o rimossi da questo changeset.</para>
   24.88 +      </listitem>
   24.89 +      <listitem><para id="x_58f"><literal role="template-keyword">file_adds</literal>: lista di stringhe. I file aggiunti da questo changeset.</para>
   24.90 +      </listitem>
   24.91 +      <listitem><para id="x_590"><literal role="template-keyword">file_dels</literal>: lista di stringhe. I file rimossi da questo changeset.</para>
   24.92 +      </listitem>
   24.93 +      <listitem><para id="x_591"><literal role="template-keyword">node</literal>: stringa. L&rsquo;hash di identificazione del changeset, sotto forma di una stringa esadecimale di 40 caratteri.</para>
   24.94 +      </listitem>
   24.95 +      <listitem><para id="x_592"><literal role="template-keyword">parents</literal>: lista di stringhe. I genitori del changeset.</para>
   24.96 +      </listitem>
   24.97 +      <listitem><para id="x_593"><literal role="template-keyword">rev</literal>: intero. Il numero di revisione del changeset locale per il repository.</para>
   24.98 +      </listitem>
   24.99 +      <listitem><para id="x_594"><literal role="template-keyword">tags</literal>: lista di stringhe. Qualsiasi etichetta associata al changeset.</para>
  24.100 +      </listitem>
  24.101 +    </itemizedlist>
  24.102 +
  24.103 +    <para id="x_595">Alcuni semplici esperimenti ci mostreranno cosa aspettarci quando usiamo queste parole chiave. Potete vederne i risultati qui di seguito.</para>
  24.104 +
  24.105 +    &interaction.template.simple.keywords;
  24.106 +
  24.107 +    <para id="x_596">Come abbiamo notato prima, la parola chiave per la data non produce un risultato comprensibile, così dobbiamo trattarla in maniera speciale. Questo implica l&rsquo;uso dei <emphasis>filtri</emphasis>, che verranno trattati in maniera più approfondita nella <xref linkend="sec:template:filter"/>.</para>
  24.108 +
  24.109 +    &interaction.template.simple.datekeyword;
  24.110 +  </sect1>
  24.111 +
  24.112 +  <sect1 id="sec:template:escape">
  24.113 +    <title>Sequenze di escape</title>
  24.114 +
  24.115 +    <para id="x_597">Il motore di template di Mercurial riconosce le sequenze di escape più comunemente usate nelle stringhe. Quando trova un carattere di backslash (<quote><literal>\</literal></quote>), esamina il carattere successivo e rimpiazza i due caratteri con un unico sostituto, come descritto qui di seguito.</para>
  24.116 +
  24.117 +    <itemizedlist>
  24.118 +      <listitem><para id="x_598"><literal>\\</literal>:
  24.119 +	  backslash, <quote><literal>\</literal></quote>, corrispondente al codice ASCII 134.</para>
  24.120 +      </listitem>
  24.121 +      <listitem><para id="x_599"><literal>\n</literal>: nuova riga, codice ASCII 12.</para>
  24.122 +      </listitem>
  24.123 +      <listitem><para id="x_59a"><literal>\r</literal>: ritorno a capo, codice ASCII 15.</para>
  24.124 +      </listitem>
  24.125 +      <listitem><para id="x_59b"><literal>\t</literal>: tabulazione, codice ASCII 11.</para>
  24.126 +      </listitem>
  24.127 +      <listitem><para id="x_59c"><literal>\v</literal>: tabulazione verticale, codice ASCII 13.</para>
  24.128 +      </listitem>
  24.129 +      <listitem><para id="x_59d"><literal>\{</literal>: parentesi graffa aperta, <quote><literal>{</literal></quote>, codice ASCII 173.</para>
  24.130 +      </listitem>
  24.131 +      <listitem><para id="x_59e"><literal>\}</literal>: parentesi graffa chusa, <quote><literal>}</literal></quote>, codice ASCII 175.</para>
  24.132 +      </listitem></itemizedlist>
  24.133 +
  24.134 +    <para id="x_59f">Come appena indicato, se volete che l&rsquo;espansione di un template contenga un carattere <quote><literal>\</literal></quote>, <quote><literal>{</literal></quote>, o <quote><literal>{</literal></quote> letterale, dovete effettuarne l&rsquo;escape.</para>
  24.135 +  </sect1>
  24.136 +
  24.137 +  <sect1 id="sec:template:filter">
  24.138 +    <title>Filtrare le parole chiave per modificarne i risultati</title>
  24.139 +
  24.140 +    <para id="x_5a0">Alcuni dei risultati dell&rsquo;espansione dei template non sono immediatamente facili da usare. Mercurial vi permette di specificare una catena opzionale di <emphasis>filtri</emphasis> per modificare il risultato dell&rsquo;espansione di una parola chiave. Avete già visto in azione un filtro comune, <literal role="template-kw-filt-date">isodate</literal>, usato precedentemente per rendere leggibile una data.</para>
  24.141 +
  24.142 +    <para id="x_5a1">Qui di seguito viene presentata una lista dei filtri più comunemente usati che Mercurial supporta. Mentre alcuni filtri possono essere applicati a qualunque testo, altri possono essere usati solo in circostanze specifiche. Il nome di ogni filtro è seguito prima da un&rsquo;indicazione del contesto in cui può essere usato e poi da una descrizione dei suoi effetti.</para>
  24.143 +
  24.144 +    <itemizedlist>
  24.145 +      <listitem><para id="x_5a2"><literal role="template-filter">addbreaks</literal>: qualunque testo. Aggiunge un elemento XHTML <quote><literal>&lt;br/&gt;</literal></quote> prima della fine di ogni riga tranne l&rsquo;ultima. Per esempio, <quote><literal>foo\nbar</literal></quote> diventa <quote><literal>foo&lt;br/&gt;\nbar</literal></quote>.</para>
  24.146 +      </listitem>
  24.147 +      <listitem><para id="x_5a3"><literal role="template-kw-filt-date">age</literal>: parola chiave <literal role="template-keyword">date</literal>. Rappresenta l&rsquo;età della data, relativa all&rsquo;ora corrente. Produce stringhe come <quote><literal>10 minuti</literal></quote>.</para>
  24.148 +      </listitem>
  24.149 +      <listitem><para id="x_5a4"><literal role="template-filter">basename</literal>: qualunque testo, ma utile soprattutto per la parola chiave <literal role="template-keyword">files</literal> e simili. Tratta il testo come un percorso e restituisce il nome di base. Per esempio, <quote><literal>foo/bar/baz</literal></quote> diventa <quote><literal>baz</literal></quote>.</para>
  24.150 +      </listitem>
  24.151 +      <listitem><para id="x_5a5"><literal role="template-kw-filt-date">date</literal>: parola chiave <literal role="template-keyword">date</literal>. Presenta una data in un formato simile al comando Unix <literal role="template-keyword">date</literal>, ma includendo il fuso orario. Produce stringhe come <quote><literal>Mon Sep 04 15:13:13 2006 -0700</literal></quote>.</para>
  24.152 +      </listitem>
  24.153 +      <listitem><para id="x_5a6"><literal role="template-kw-filt-author">domain</literal>: qualunque testo, ma utile soprattutto per la parola chiave <literal role="template-keyword">author</literal>. Trova la prima stringa che somiglia a un indirizzo email e ne estrae il componente del dominio. Per esempio, <quote><literal>Bryan O'Sullivan &lt;bos@serpentine.com&gt;</literal></quote> diventa <quote><literal>serpentine.com</literal></quote>.</para>
  24.154 +      </listitem>
  24.155 +      <listitem><para id="x_5a7"><literal role="template-kw-filt-author">email</literal>: qualunque testo, ma utile soprattutto per la parola chiave <literal role="template-keyword">author</literal>. Estrae la prima stringa che somiglia a un indirizzo email. Per esempio, <quote><literal>Bryan O'Sullivan &lt;bos@serpentine.com&gt;</literal></quote> diventa <quote><literal>bos@serpentine.com</literal></quote>.</para>
  24.156 +      </listitem>
  24.157 +      <listitem><para id="x_5a8"><literal role="template-filter">escape</literal>: qualunque testo. Sostituisce i caratteri speciali XML/XHTML <quote><literal>&amp;</literal></quote>, <quote><literal>&lt;</literal></quote> e <quote><literal>&gt;</literal></quote> con entità XML.</para>
  24.158 +      </listitem>
  24.159 +      <listitem><para id="x_5a9"><literal role="template-filter">fill68</literal>: qualunque testo. Manda a capo il testo per farlo stare in 68 colonne. Questo filtro è utile da applicare prima di combinarlo con il filtro <literal role="template-filter">tabindent</literal>, se volete che il testo non esca dai bordi di una finestra di 80 colonne con caratteri a spaziatura fissa.</para>
  24.160 +      </listitem>
  24.161 +      <listitem><para id="x_5aa"><literal role="template-filter">fill76</literal>: qualunque testo. Manda a capo il testo per farlo stare in 76 colonne.</para>
  24.162 +      </listitem>
  24.163 +      <listitem><para id="x_5ab"><literal role="template-filter">firstline</literal>: qualunque testo. Produce la prima riga del testo, senza alcun carattere di nuova riga alla fine.</para>
  24.164 +      </listitem>
  24.165 +      <listitem><para id="x_5ac"><literal role="template-kw-filt-date">hgdate</literal>: parola chiave <literal role="template-keyword">date</literal>. Rappresenta la data come una coppia di numeri leggibili. Produce una stringa come <quote><literal>1157407993 25200</literal></quote>.</para>
  24.166 +      </listitem>
  24.167 +      <listitem><para id="x_5ad"><literal role="template-kw-filt-date">isodate</literal>: parola chiave <literal role="template-keyword">date</literal>. Rappresenta una data come stringa di testo in formato ISO 8601. Produce una stringa come <quote><literal>2006-09-04 15:13:13 -0700</literal></quote>.</para>
  24.168 +      </listitem>
  24.169 +      <listitem><para id="x_5ae"><literal role="template-filter">obfuscate</literal>: qualunque testo, ma utile soprattutto per la parola chiave <literal role="template-keyword">author</literal>. Riproduce il testo in ingresso rappresentandolo come una sequenza di entità XML. Questo è utile per impedire ad alcuni programmi particolarmente stupidi utilizzati dagli spammer per raccogliere indirizzi email di copiare i dati destinati a essere visualizzati su schermo.</para>
  24.170 +      </listitem>
  24.171 +      <listitem><para id="x_5af"><literal role="template-kw-filt-author">person</literal>: qualunque testo, ma utile soprattutto per la parola chiave <literal role="template-keyword">author</literal>. Produce il testo che precede un indirizzo email. Per esempio, <quote><literal>Bryan O'Sullivan &lt;bos@serpentine.com&gt;</literal></quote> diventa <quote><literal>Bryan O'Sullivan</literal></quote>.</para>
  24.172 +      </listitem>
  24.173 +      <listitem><para id="x_5b0"><literal role="template-kw-filt-date">rfc822date</literal>: parola chiave <literal role="template-keyword">date</literal>. Rappresenta una data usando lo stesso formato impiegato nelle intestazioni email. Produce una stringa come <quote><literal>Mon, 04 Sep 2006 15:13:13 -0700</literal></quote>.</para>
  24.174 +      </listitem>
  24.175 +      <listitem><para id="x_5b1"><literal role="template-kw-filt-node">short</literal>: hash di changeset. Produce la forma breve di un hash di changeset, cioè una stringa esadecimale di 12 caratteri.</para>
  24.176 +      </listitem>
  24.177 +      <listitem><para id="x_5b2"><literal role="template-kw-filt-date">shortdate</literal>: parola chiave <literal role="template-keyword">date</literal>. Rappresenta l&rsquo;anno, il mese e il giorno della data. Produce una stringa come <quote><literal>2006-09-04</literal></quote>.</para>
  24.178 +      </listitem>
  24.179 +      <listitem><para id="x_5b3"><literal role="template-filter">strip</literal>: qualunque testo. Rimuove lo spazio bianco all&rsquo;inizio e alla fine di una stringa.</para>
  24.180 +      </listitem>
  24.181 +      <listitem><para id="x_5b4"><literal role="template-filter">tabindent</literal>: qualunque testo. Produce il testo, facendo cominciare ogni riga tranne la prima con un carattere di tabulazione.</para>
  24.182 +      </listitem>
  24.183 +      <listitem><para id="x_5b5"><literal role="template-filter">urlescape</literal>: qualunque testo. Effettua l&rsquo;escape di tutti i caratteri che sono considerati <quote>speciali</quote> dai riconoscitori di URL. Per esempio, <literal>foo bar</literal> diventa <literal>foo%20bar</literal>.</para>
  24.184 +      </listitem>
  24.185 +      <listitem><para id="x_5b6"><literal role="template-kw-filt-author">user</literal>: qualunque testo, ma utile soprattutto per la parola chiave <literal role="template-keyword">author</literal>. Restituisce la porzione dell&rsquo;<quote>utente</quote> di un indirizzo email. Per esempio <quote><literal>Bryan O'Sullivan &lt;bos@serpentine.com&gt;</literal></quote> diventa <quote><literal>bos</literal></quote>.</para>
  24.186 +      </listitem>
  24.187 +    </itemizedlist>
  24.188 +
  24.189 +    &interaction.template.simple.manyfilters;
  24.190 +
  24.191 +    <note>
  24.192 +      <para id="x_5b7">Se provate ad applicare un filtro a un frammento di dati che non può elaborare, Mercurial fallirà e stamperà un&rsquo;eccezione Python. Per esempio, non è una buona idea provare a utilizzare il testo risultante dall&rsquo;espansione della parola chiave <literal role="template-keyword">desc</literal> con il filtro <literal role="template-kw-filt-date">isodate</literal>.</para>
  24.193 +    </note>
  24.194 +
  24.195 +    <sect2>
  24.196 +      <title>Combinare i filtri</title>
  24.197 +
  24.198 +      <para id="x_5b8">&Egrave; facile combinare filtri per produrre un testo formattato nel modo che preferite. La seguente catena di filtri ripulisce una descrizione, poi si assicura che stia tranquillamente in 68 colonne, infine la indenta ulteriormente di 8 caratteri (almeno sui sistemi di tipo Unix, dove una tabulazione è convenzionalmente larga 8 caratteri).</para>
  24.199 +
  24.200 +      &interaction.template.simple.combine;
  24.201 +
  24.202 +      <para id="x_5b9">Notate l&rsquo;uso di <quote><literal>\t</literal></quote> (un carattere di tabulazione) nel template per indentare la prima riga, necessario dato che <literal role="template-keyword">tabindent</literal> indenta tutte le righe <emphasis>tranne</emphasis> la prima.</para>
  24.203 +
  24.204 +      <para id="x_5ba">Tenete a mente che l&rsquo;ordine dei filtri in una catena è significativo. Il primo filtro viene applicato al risultato della parola chiave, il secondo al risultato del primo filtro, e così via. Per esempio, usare <literal>fill68|tabindent</literal> dà risultati molto diversi rispetto a <literal>tabindent|fill68</literal>.</para>
  24.205 +    </sect2>
  24.206 +  </sect1>
  24.207 +
  24.208 +  <sect1>
  24.209 +    <title>Dai template agli stili</title>
  24.210 +
  24.211 +    <para id="x_5bb">Un template a riga di comando fornisce un modo semplice e veloce per formattare il risultato di un certo comando. Ma i template possono diventare prolissi, quindi è utile essere in grado di dare un nome a un template. Un file di stile è un template con un nome, memorizzato in un file.</para>
  24.212 +
  24.213 +    <para id="x_5bc">Ma soprattutto, l&rsquo;impiego di un file di stile sfrutta la potenza del motore di template di Mercurial in modi che non sono possibili usando l&rsquo;opzione <option role="hg-opt-log">--template</option> a riga di comando.</para>
  24.214 +
  24.215 +    <sect2>
  24.216 +      <title>Il più semplice dei file di stile</title>
  24.217 +
  24.218 +      <para id="x_5bd">Il nostro semplice file di stile contiene solo una riga:</para>
  24.219 +
  24.220 +      &interaction.template.simple.rev;
  24.221 +
  24.222 +      <para id="x_5be">Questo dice a Mercurial: <quote>se stai stampando un changeset, usa il testo sulla destra come template</quote>.</para>
  24.223 +    </sect2>
  24.224 +
  24.225 +    <sect2>
  24.226 +      <title>La sintassi dei file di stile</title>
  24.227 +
  24.228 +      <para id="x_5bf">Le regole della sintassi per un file di stile sono semplici.</para>
  24.229 +
  24.230 +      <itemizedlist>
  24.231 +	<listitem><para id="x_5c0">Il file viene elaborato una riga alla volta.</para>
  24.232 +	</listitem>
  24.233 +	<listitem><para id="x_5c1">Gli spazi bianchi all&rsquo;inizio e alla fine di una riga vengono ignorati.</para>
  24.234 +	</listitem>
  24.235 +	<listitem><para id="x_5c2">Le righe vuote vengono saltate.</para>
  24.236 +	</listitem>
  24.237 +	<listitem><para id="x_5c3">Se una riga comincia con un carattere <quote><literal>#</literal></quote> o <quote><literal>;</literal></quote>, l&rsquo;intera riga viene trattata come un commento e saltata come se fosse vuota.</para>
  24.238 +	</listitem>
  24.239 +	<listitem><para id="x_5c4">Una riga comincia con una parola chiave, che deve iniziare con un carattere alfabetico o di sottolineatura e successivamente può contenere qualsiasi carattere alfanumerico o di sottolineatura. (Nella notazione per le espressioni regolari, una parola chiave deve corrispondere a <literal>[A-Za-z_][A-Za-z0-9_]*</literal>.)</para>
  24.240 +	</listitem>
  24.241 +	<listitem><para id="x_5c5">L&rsquo;elemento successivo deve essere un carattere <quote><literal>=</literal></quote>, che può essere preceduto o seguito da una quantità arbitraria di spazio bianco.</para>
  24.242 +	</listitem>
  24.243 +	<listitem><para id="x_5c6">Se il resto della riga comincia e finisce con caratteri corrispettivi di apice o di virgolette, viene trattato come il corpo di un template.</para>
  24.244 +	</listitem>
  24.245 +	<listitem><para id="x_5c7">Se il resto della riga <emphasis>non</emphasis> comincia con caratteri di apice o di virgolette, viene trattato come il nome di un file i cui contenuti saranno letti e usati come il corpo di un template.</para>
  24.246 +	</listitem></itemizedlist>
  24.247 +    </sect2>
  24.248 +  </sect1>
  24.249 +
  24.250 +  <sect1>
  24.251 +    <title>Esempi di file di stile</title>
  24.252 +
  24.253 +    <para id="x_5c8">Per illustrare come scrivere un file di stile, ne costruiremo alcuni esempi. Piuttosto che fornire un file di stile completo e ripercorrerlo passo per passo, replicheremo il classico processo di sviluppo di un file di stile cominciando con qualcosa di molto semplice e proseguendo attraverso una serie di esempi successivi più completi.</para>
  24.254 +
  24.255 +    <sect2>
  24.256 +      <title>Identificare errori in un file di stile</title>
  24.257 +
  24.258 +      <para id="x_5c9">Se Mercurial incontra un problema in un file di stile su cui state lavorando, stampa uno stringato messaggio di errore che si rivela in effetti piuttosto utile una volta scoperto cosa significa.</para>
  24.259 +
  24.260 +      &interaction.template.svnstyle.syntax.input;
  24.261 +
  24.262 +      <para id="x_5ca">Notate che <filename>stile.errato</filename> tenta di definire una parola chiave <literal>changeset</literal>, ma dimentica di darle un contenuto qualsiasi. Quando gli si chiede di usare questo file di stile, Mercurial si lamenta prontamente.</para>
  24.263 +
  24.264 +      &interaction.template.svnstyle.syntax.error;
  24.265 +
  24.266 +      <para id="x_5cb">Questo messaggio di errore sembra minaccioso, ma non è troppo difficile da seguire.</para>
  24.267 +
  24.268 +      <itemizedlist>
  24.269 +	<listitem><para id="x_5cc">Il primo componente è semplicemente il modo in cui Mercurial dice <quote>rinuncio</quote>.</para>
  24.270 +	  <programlisting>___fallimento___: stile.errato:1: errore di riconoscimento</programlisting>
  24.271 +	</listitem>
  24.272 +	<listitem><para id="x_5cd">Subito dopo, trovate il nome del file di stile che contiene l&rsquo;errore.</para>
  24.273 +	  <programlisting>fallimento: ___stile.errato___:1: errore di riconoscimento</programlisting>
  24.274 +	</listitem>
  24.275 +	<listitem><para id="x_5ce">Il nome del file è seguito dal numero di riga dove l&rsquo;errore è stato incontrato.</para>
  24.276 +	  <programlisting>fallimento: stile.errato:___1___: errore di riconoscimento</programlisting>
  24.277 +	</listitem>
  24.278 +	<listitem><para id="x_5cf">Infine, viene fornita una descrizione di quello che è andato storto.</para>
  24.279 +	  <programlisting>fallimento: stile.errato:1: ___errore di riconoscimento___</programlisting>
  24.280 +	<para id="x_5d0">La descrizione del problema non è sempre chiara (come in questo caso) ma, anche quando è criptica, è quasi sempre banale trovare la causa dell&rsquo;errore inspezionando visivamente la riga del file di stile che contiene il problema.</para>
  24.281 +	</listitem>
  24.282 +      </itemizedlist>
  24.283 +    </sect2>
  24.284 +
  24.285 +    <sect2>
  24.286 +      <title>Identificare univocamente un repository</title>
  24.287 +
  24.288 +      <para id="x_5d1">Se volete essere in grado di identificare un repository Mercurial in maniera <quote>abbastanza univoca</quote> usando una breve stringa come identificatore, potete usare la prima revisione contenuta nel repository.</para>
  24.289 +
  24.290 +      &interaction.template.svnstyle.id;
  24.291 +
  24.292 +      <para id="x_5d2">&Egrave; molto probabile che questo identificatore sia unico, quindi si rivela utile in molti casi. Ci sono alcune avvertenze.</para>
  24.293 +      <itemizedlist>
  24.294 +	<listitem><para id="x_5d3">Questa tecnica non funzionerà in un repository completamente vuoto, perché un tale repository non possiede la revisione zero.</para>
  24.295 +	</listitem>
  24.296 +	<listitem><para id="x_5d4">Questa tecnica non funzionerà nemmeno nel caso (estremamente raro) in cui un repository sia l&rsquo;unione di due o più repository precedentemente indipendenti e quei repository siano ancora nei paraggi.</para>
  24.297 +	</listitem></itemizedlist>
  24.298 +      <para id="x_5d5">Ecco alcuni usi che potete fare di questo identificatore:</para>
  24.299 +      <itemizedlist>
  24.300 +	<listitem><para id="x_5d6">come chiave nella tabella di un database che gestisce i repository presenti su un server;</para>
  24.301 +	</listitem>
  24.302 +	<listitem><para id="x_5d7">come metà di una tupla {<emphasis>identificatore di repository</emphasis>, <emphasis>identificatore di revisione</emphasis>}. Salvate questa informazione da qualche parte quando eseguite un assemblaggio automatico o un&rsquo;altra attività simile, in modo che possiate <quote>rieseguire</quote> lo stesso assemblaggio in seguito se necessario.</para>
  24.303 +	</listitem>
  24.304 +      </itemizedlist>
  24.305 +    </sect2>
  24.306 +
  24.307 +    <sect2>
  24.308 +      <title>Elencare file su più righe</title>
  24.309 +
  24.310 +      <para id="x_714">Supponete di voler elencare i file modificati da un changeset uno per riga, aggiungendo una piccola indentazione prima di ogni nome di file.</para>
  24.311 +
  24.312 +      &interaction.ch10-multiline.go;
  24.313 +    </sect2>
  24.314 +
  24.315 +    <sect2>
  24.316 +      <title>Imitare i messaggi di Subversion</title>
  24.317 +
  24.318 +      <para id="x_5d8">Proviamo a emulare il formato predefinito usato da un altro strumento di controllo di revisione, Subversion, per mostrare le voci del proprio registro.</para>
  24.319 +
  24.320 +      &interaction.template.svnstyle.short;
  24.321 +
  24.322 +      <para id="x_5d9">Dato che lo stile della rappresentazione di Subversion è abbastanza semplice, è facile copiare e incollare uno dei suoi messaggi in un file e rimpiazzare il testo prodotto da Subversion con i valori di template che vorremmo vedere espansi.</para>
  24.323 +
  24.324 +      &interaction.template.svnstyle.template;
  24.325 +
  24.326 +      <para id="x_5da">Questo template si discosta in alcuni modi dalla presentazione prodotta da Subversion.</para>
  24.327 +      <itemizedlist>
  24.328 +	<listitem><para id="x_5db">Subversion stampa una data <quote>leggibile</quote> (il <quote><literal>Wed, 27 Sep 2006</literal></quote> nel risultato dell&rsquo;esempio precedente) tra parentesi. Il motore di template di Mercurial non fornisce un modo per visualizzare una data in questo formato senza stampare anche l&rsquo;ora e il fuso orario.</para>
  24.329 +	</listitem>
  24.330 +	<listitem><para id="x_5dc">Emuliamo la stampa di righe <quote>separatrici</quote> piene di caratteri <quote><literal>-</literal></quote> da parte di Subversion concludendo il template con una riga di quel tipo. Usiamo la parola chiave <literal role="template-keyword">header</literal> del motore di template per stampare una riga separatrice come prima riga (vedete più avanti), quindi ottenendo un risultato simile a quello di Subversion.</para>
  24.331 +	</listitem>
  24.332 +	<listitem><para id="x_5dd">Il formato di Subversion include nell&rsquo;intestazione il conteggio del numero di righe del messaggio di commit. Non possiamo replicare questa caratteristica in Mercurial, poiché attualmente il motore di template non fornisce un filtro che conti il numero di righe generate dal template.</para>
  24.333 +	</listitem></itemizedlist>
  24.334 +      <para id="x_5de">Non mi ci sono voluti più di uno o due minuti di lavoro per sostituire il testo letterale di un esempio del messaggio di Subversion con alcune parole chiave e alcuni filtri per ottenere il template appena visto. Il file di stile fa semplicemente riferimento al template.</para>
  24.335 +
  24.336 +      &interaction.template.svnstyle.style;
  24.337 +
  24.338 +      <para id="x_5df">Avremmo potuto includere il testo del file di template direttamente nel file di stile, circondandolo con virgolette e rimpiazzando le nuove righe con sequenze <quote><literal>\n</literal></quote>, ma questo avrebbe reso il file di stile troppo difficile da leggere. La leggibilità è un buon criterio da cui farsi guidare per decidere se un certo testo appartiene a un file di stile o a un file di template a cui il file di stile fa riferimento. Nel caso il file di stile vi sembri troppo grande o disordinato se inserite un frammento letterale di testo, allora spostate il testo in un template.</para>
  24.339 +    </sect2>
  24.340 +  </sect1>
  24.341 +</chapter>
    25.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    25.2 +++ b/it/ch12-mq.xml	Fri Sep 04 16:33:35 2009 +0200
    25.3 @@ -0,0 +1,552 @@
    25.4 +<chapter id="chap:mq">
    25.5 +  <?dbhtml filename="gestire-il-cambiamento-con-mercurial-queues.html"?>
    25.6 +  <title>Gestire il cambiamento con Mercurial Queues</title>
    25.7 +
    25.8 +  <sect1 id="sec:mq:patch-mgmt">
    25.9 +    <title>Il problema della gestione delle patch</title>
   25.10 +
   25.11 +    <para id="x_3ac">Ecco uno scenario comune: avete bisogno di installare un pacchetto software dai sorgenti, ma trovate un bug che dovete correggere nei sorgenti prima di poter cominciare a usare il pacchetto. Fate le vostre modifiche, vi dimenticate del pacchetto per un po&rsquo; e alcuni mesi dopo avete bisogno di aggiornare il pacchetto a una nuova versione. Se la versione più nuova del pacchetto contiene ancora il bug, dovete estrarre la vostra correzione dal vecchio albero dei sorgenti e applicarla alla nuova versione. Questa è un&rsquo;attività seccante durante la quale è facile commettere errori.</para>
   25.12 +
   25.13 +    <para id="x_3ad">Questo è un semplice caso del problema di <quote>gestione delle patch</quote>. Avete un albero di sorgenti <quote>a monte</quote> che non potete cambiare, avete bisogno di fare alcune modifiche locali all&rsquo;albero a monte e vi piacerebbe essere in grado di mantenere separate quelle modifiche, in modo da poterle applicare a nuove versioni dei sorgenti a monte.</para>
   25.14 +
   25.15 +    <para id="x_3ae">Il problema di gestione delle patch si presenta in molte situazioni. Probabilmente la più visibile è quella in cui un utente di un progetto software open source fornisce la correzione di un bug o una nuova funzione sotto forma di patch ai manutentori del progetto.</para>
   25.16 +
   25.17 +    <para id="x_3af">Chi distribuisce sistemi operativi che includono software open source ha spesso bisogno di effettuare modifiche ai pacchetti distribuiti in modo da assemblarli correttamente nel proprio ambiente.</para>
   25.18 +
   25.19 +    <para id="x_3b0">Quando dovete mantenere solo alcune modifiche, potete facilmente gestire una singola patch usando i programmi standard <command>diff</command> e <command>patch</command> (si veda la <xref linkend="sec:mq:patch"/> per una discussione di questi strumenti). Una volta che il numero di modifiche cresce, comincia ad avere senso l&rsquo;idea di mantenere le patch come <quote>frammenti di lavoro</quote> distinti in modo che, per esempio, una singola patch contenga solo una correzione di bug (la patch potrebbe modificare diversi file, ma sta facendo <quote>solo una cosa</quote>) e un certo numero di queste patch sia destinato a bug differenti che dovete correggere e a modifiche locali di cui avete bisogno. In questa situazione, se proponete una patch per la correzione di un bug ai manutentori del pacchetto a monte e questi includono la vostra correzione in una release successiva, potete semplicemente scartare quella singola patch quando state aggiornando il pacchetto a una nuova release.</para>
   25.20 +
   25.21 +    <para id="x_3b1">Mantenere una singola patch per un albero a monte è un&rsquo;attività un po&rsquo; noiosa e soggetta a errori, ma non è difficile. Tuttavia, la complessità del problema cresce rapidamente man mano che il numero di patch che dovete mantenere aumenta. Con più di un piccolo numero di patch in mano, il compito di capire quali sono quelle che dovete applicare e di mantenerle passa da sgradevole a opprimente.</para>
   25.22 +
   25.23 +    <para id="x_3b2">Fortunatamente, Mercurial include una potente estensione, chiamata Mercurial Queues (letteralmente, Code di Mercurial) o semplicemente <quote>MQ</quote>, che semplifica notevolmente il problema di gestione delle patch.</para>
   25.24 +
   25.25 +  </sect1>
   25.26 +  <sect1 id="sec:mq:history">
   25.27 +    <title>La preistoria di Mercurial Queues</title>
   25.28 +
   25.29 +    <para id="x_3b3">Verso la fine degli anni &rsquo;90, diversi sviluppatori del kernel di Linux cominciarono a mantenere alcune <quote>serie di patch</quote> che modificavano il comportamento del kernel. Alcune di queste serie si concentravano sulla stabilità, alcune sull&rsquo;inclusione di funzioni e altre erano più sperimentali.</para>
   25.30 +
   25.31 +    <para id="x_3b4">La dimensione di queste serie di patch crebbe rapidamente. Nel 2002, Andrew Morton pubblicò alcuni script di shell che aveva usato per automatizzare la gestione delle proprie code di patch. Andrew era riuscito a usare questi script per gestire centinaia (talvolta migliaia) di patch per il kernel di Linux.</para>
   25.32 +
   25.33 +    <sect2 id="sec:mq:quilt">
   25.34 +      <title>Una <quote>coperta a scacchi</quote></title>
   25.35 +
   25.36 +      <para id="x_3b5">All&rsquo;inizio del 2003, Andreas Gruenbacher e Martin Quinson presero in prestito l&rsquo;approccio degli script di Andrew e pubblicarono uno strumento chiamato <quote>patchwork quilt</quote> (letteralmente, coperta a scacchi) <citation><xref linkend="bib:quilt"/></citation>, o semplicemente <quote>quilt</quote> (si veda <citation><xref linkend="bib:gru05"/></citation> per un articolo che lo descrive). Dato che quilt sostanzialmente automatizzava la gestione delle patch, guadagnò rapidamente un grande seguito tra gli sviluppatori di software open source.</para>
   25.37 +
   25.38 +      <para id="x_3b6">Quilt gestisce una <emphasis>pila di patch</emphasis> per un albero di directory. Per cominciare a usarlo, dite a quilt di gestire un albero di directory e quali file volete che gestisca, in modo che memorizzi i nomi e il contenuto di quei file. Per correggere un bug, create una nuova patch (usando un singolo comando), modificate i file che dovete correggere, poi <quote>aggiornate</quote> la patch.</para>
   25.39 +
   25.40 +      <para id="x_3b7">L&rsquo;operazione di aggiornamento induce quilt a esaminare l&rsquo;albero di directory completando la patch con tutte le modifiche che avete fatto. Sulla base di questa prima patch, potete creare un&rsquo;altra patch che terrà traccia dei cambiamenti richiesti per modificare l&rsquo;albero da <quote>albero con una patch applicata</quote> ad <quote>albero con due patch applicate</quote>.</para>
   25.41 +
   25.42 +      <para id="x_3b8">Potete <emphasis>scegliere</emphasis> quali sono le patch da applicare all&rsquo;albero. Se <quote>estraete</quote> una patch, i cambiamenti effettuati da quella patch spariranno dall&rsquo;albero di directory. Quilt si ricorda quali patch avete estratto, comunque, così potete <quote>inserire</quote> nuovamente una patch estratta e l&rsquo;albero di directory verrà ripristinato per contenere le modifiche di quella patch. La cosa più importante è che potete eseguire il comando di <quote>aggiornamento</quote> in ogni momento e la patch applicata più recentemente verrà aggiornata. Questo significa che, in ogni momento, potete modificare sia l&rsquo;insieme delle patch da applicare sia l&rsquo;insieme dei cambiamenti effettuati da quelle patch.</para>
   25.43 +
   25.44 +      <para id="x_3b9">Quilt non ha nulla a che fare con gli strumenti di controllo di revisione, così funziona altrettanto bene con un gruppo di file estratti da un archivio compresso che con una copia di lavoro di Subversion.</para>
   25.45 +    </sect2>
   25.46 +
   25.47 +    <sect2 id="sec:mq:quilt-mq">
   25.48 +      <title>Da patchwork quilt a Mercurial Queues</title>
   25.49 +
   25.50 +      <para id="x_3ba">A metà del 2005, Chris Mason prese le funzioni di quilt e implementò un&rsquo;estensione chiamata Mercurial Queues, che aggiungeva a Mercurial un comportamento simile a quello di quilt.</para>
   25.51 +
   25.52 +      <para id="x_3bb">La differenza chiave tra quilt e MQ è che quilt non è progettato per interagire con alcun sistema di controllo di revisione, mentre MQ è <emphasis>integrata</emphasis> in Mercurial. Ogni patch che inserite è rappresentata sotto forma di changeset Mercurial. Se estraete una patch, il changeset relativo sparisce.</para>
   25.53 +
   25.54 +      <para id="x_3bc">Dato che quilt non si preoccupa degli strumenti di controllo di revisione, rimane un software tremendamente utile da conoscere per impiegarlo nelle situazioni in cui non potete usare Mercurial e MQ.</para>
   25.55 +
   25.56 +    </sect2>
   25.57 +  </sect1>
   25.58 +  <sect1>
   25.59 +    <title>L&rsquo;enorme vantaggio di MQ</title>
   25.60 +
   25.61 +    <para id="x_3bd">Non posso esagerare il valore dell&rsquo;unificazione tra patch e controllo di revisione offerta da MQ.</para>
   25.62 +
   25.63 +    <para id="x_3be">Una delle ragioni principali per cui le patch sono ancora continuamente usate nel mondo del software libero e open source&emdash;nonostante la disponibilità di strumenti di controllo di revisione sempre più sofisticati&emdash;è l&rsquo;<emphasis>agilità</emphasis> che offrono.</para>
   25.64 +
   25.65 +    <para id="x_3bf">I tradizionali strumenti di controllo di revisione effettuano una registrazione permanente di ogni vostra azione. Da un lato questo ha un grande valore, ma dall&rsquo;altro è anche piuttosto soffocante. Se volete effettuare un esperimento stravagante, dovete stare molto attenti a come procedete, o rischiate di lasciare tracce inutili&emdash;o peggio, ingannevoli e destabilizzanti&emdash;dei vostri passi falsi e dei vostri errori nella registrazione permanente delle revisioni.</para>
   25.66 +
   25.67 +    <para id="x_3c0">Al contrario, il matrimonio tra controllo di revisione distribuito e patch realizzato da MQ rende molto più facile isolare il vostro lavoro. Le vostre patch si basano sulla normale cronologia delle revisioni e potete farle sparire e comparire a piacere. Se non vi piace una patch, potete scartarla. Se una patch non è esattamente come volete che sia, vi basta correggerla&emdash;tutte le volte che ne avete bisogno, fino a quando non l&rsquo;avete ritoccata facendole assumere la forma che desiderate.</para>
   25.68 +
   25.69 +    <para id="x_3c1">Per esempio, l&rsquo;integrazione delle patch con il controllo di revisione facilita <emphasis>enormemente</emphasis> la comprensione delle patch e delle interazioni con il codice su cui si basano, nonché la correzione dei loro effetti. Dato che ogni patch applicata è associata a un changeset, potete invocare <command role="hg-cmd">hg log</command> con un nome di file per vedere quali changeset e quali patch hanno avuto effetto sul file. Potete usare il comando <command role="hg-cmd">hg bisect</command> per condurre una ricerca binaria attraverso tutti i changeset e le patch applicate in modo da scoprire dov&rsquo;è stato introdotto o corretto un bug. Potete usare il comando <command role="hg-cmd">hg annotate</command> per vedere quali changeset o patch hanno modificato una particolare riga di un file sorgente. E così via.</para>
   25.70 +  </sect1>
   25.71 +
   25.72 +  <sect1 id="sec:mq:patch">
   25.73 +    <title>Capire le patch</title>
   25.74 +
   25.75 +    <para id="x_3c2">Dato che MQ non nasconde la sua natura orientata alle patch, vi potrà essere d&rsquo;aiuto capire cosa sono le patch e conoscere un po&rsquo; gli strumenti che lavorano con esse.</para>
   25.76 +
   25.77 +    <para id="x_3c3">Il tradizionale comando Unix <command>diff</command> confronta due file e stampa una lista di differenze tra loro. Il comando <command>patch</command> interpreta queste differenze come <emphasis>modifiche</emphasis> da effettuare a un file. Date un&rsquo;occhiata qui di seguito per vedere un semplice esempio di questi comandi in azione.</para>
   25.78 +
   25.79 +    &interaction.mq.dodiff.diff;
   25.80 +
   25.81 +    <para id="x_3c4">Il tipo di file generato da <command>diff</command> (e che <command>patch</command> prende in ingresso) viene chiamato una <quote>patch</quote> (letteralmente, pezza) o un <quote>diff</quote>. Non c&rsquo;è alcuna differenza tra una patch e un diff, ma noi useremo il termine <quote>patch</quote>, dato che è quello più comunemente usato.</para>
   25.82 +
   25.83 +    <para id="x_3c5">Un file di patch può cominciare con testo arbitrario che il comando <command>patch</command> ignora, ma che MQ usa come messaggio di commit quando crea i changeset. Per trovare l&rsquo;inizio del contenuto della patch, il comando <command>patch</command> cerca la prima riga che comincia con la stringa <quote><literal>diff -</literal></quote>.</para>
   25.84 +
   25.85 +    <para id="x_3c6">MQ lavora con i diff <emphasis>unificati</emphasis> (<command>patch</command> può accettare molti altri formati di diff, ma MQ no). Un diff unificato contiene due tipi di intestazione. L&rsquo;<emphasis>intestazione di file</emphasis> descrive il file che viene modificato e contiene il nome del file da modificare. Quando <command>patch</command> vede una nuova intestazione di file, cerca il file con quel nome per cominciare a modificarlo.</para>
   25.86 +
   25.87 +    <para id="x_3c7">L&rsquo;intestazione di file è seguita da una serie di <emphasis>blocchi</emphasis>. Ogni blocco comincia con un&rsquo;intestazione che identifica l&rsquo;intervallo di numeri di riga del file che il blocco dovrebbe modificare. Dopo l&rsquo;intestazione, un blocco comincia e finisce con alcune (di solito tre) righe di testo proveniente dal file originale che vengono chiamate il <emphasis>contesto</emphasis> del blocco. Se c&rsquo;è solo una quantità ridotta di contesto tra blocchi successivi, <command>diff</command> non stampa una nuova intestazione, ma si limita a unire insieme i blocchi inserendo alcune righe di contesto tra le modifiche.</para>
   25.88 +
   25.89 +    <para id="x_3c8">Ogni riga di contesto comincia con un carattere di spazio. Nell&rsquo;ambito di un blocco, una riga che comincia con <quote><literal>-</literal></quote> significa <quote>rimuovi questa riga</quote>, mentre una riga che comincia con <quote><literal>+</literal></quote> significa <quote>inserisci questa riga</quote>. Per esempio, una riga modificata viene rappresentata da una cancellazione e da un inserimento.</para>
   25.90 +
   25.91 +    <para id="x_3c9">Ritorneremo su alcuni degli aspetti più sottili delle patch più avanti (nella <xref linkend="sec:mq:adv-patch"/>), ma ora dovreste avere abbastanza informazioni per usare MQ.</para>
   25.92 +  </sect1>
   25.93 +
   25.94 +  <sect1 id="sec:mq:start">
   25.95 +    <title>Cominciare a usare Mercurial Queues</title>
   25.96 +
   25.97 +    <para id="x_3ca">Dato che MQ è implementata come un&rsquo;estensione, dovete esplicitamente abilitarla prima di poterla usare. (Non avete bisogno di scaricare nulla, perché MQ è inclusa con la distribuzione standard di Mercurial.) Per abilitare MQ, modificate il vostro file <filename role="home">~/.hgrc</filename> aggiungendo le seguenti righe.</para>
   25.98 +
   25.99 +    <programlisting>[extensions]
  25.100 +hgext.mq =</programlisting>
  25.101 +
  25.102 +    <para id="x_3cb">Una volta che avete abilitato l&rsquo;estensione, vi verranno messi a disposizione alcuni nuovi comandi. Per verificare che l&rsquo;estensione funzioni, potete usare <command role="hg-cmd">hg help</command> per vedere se il comando <command role="hg-ext-mq">qinit</command> viene elencato come disponibile.</para>
  25.103 +
  25.104 +    &interaction.mq.qinit-help.help;
  25.105 +
  25.106 +    <para id="x_3cc">MQ può essere usata con <emphasis>qualsiasi</emphasis> repository Mercurial e i suoi comandi operano solo all&rsquo;interno di quel repository. Per cominciare, preparate semplicemente il repository usando il comando <command role="hg-ext-mq">qinit</command>.</para>
  25.107 +
  25.108 +    &interaction.mq.tutorial.qinit;
  25.109 +
  25.110 +    <para id="x_3cd">Questo comando crea una directory vuota chiamata <filename role="special" class="directory">.hg/patches</filename>, dove MQ terrà i propri metadati. Come accade con molti comandi Mercurial, il comando <command role="hg-ext-mq">qinit</command> non stamperà nulla nel caso termini con successo.</para>
  25.111 +
  25.112 +    <sect2>
  25.113 +      <title>Creare una nuova patch</title>
  25.114 +
  25.115 +      <para id="x_3ce">Per cominciare a lavorare su una nuova patch, usate il comando <command role="hg-ext-mq">qnew</command>. Questo comando prende come argomento il nome della patch da creare.</para>
  25.116 +
  25.117 +      <para id="x_3cf">MQ userà questo nome per memorizzare un file nella directory <filename role="special" class="directory">.hg/patches</filename>, come potete vedere qui sotto.</para>
  25.118 +
  25.119 +      &interaction.mq.tutorial.qnew;
  25.120 +
  25.121 +      <para id="x_3d0">La directory <filename role="special" class="directory">.hg/patches</filename> contiene anche altri due nuovi file, <filename role="special">series</filename> e <filename role="special">status</filename>.  Il file <filename role="special">series</filename> elenca tutte le patch per questo repository di cui MQ è a conoscenza, con una patch per ogni riga. Mercurial usa il file <filename role="special">status</filename> per tenere traccia internamente di tutte le patch che MQ ha <emphasis>applicato</emphasis> a questo repository.</para>
  25.122 +
  25.123 +      <note>
  25.124 +	<para id="x_3d1">A volte potreste voler modificare il file <filename role="special">series</filename> a mano, per esempio per cambiare la sequenza in cui sono applicate alcune patch. Tuttavia, modificare manualmente il file <filename role="special">status</filename> è quasi sempre una cattiva idea, dato che così facendo si rischia facilmente di disorientare MQ.</para>
  25.125 +      </note>
  25.126 +
  25.127 +      <para id="x_3d2">Una volta che avete creato la vostra nuova patch, potete modificare i file nella directory di lavoro come fareste di solito. Tutti i normali comandi Mercurial, come <command role="hg-cmd">hg diff</command> e <command role="hg-cmd">hg annotate</command>, funzionano allo stesso modo in cui funzionavano prima.</para>
  25.128 +    </sect2>
  25.129 +
  25.130 +    <sect2>
  25.131 +      <title>Aggiornare una patch</title>
  25.132 +
  25.133 +      <para id="x_3d3">Quando raggiungete un punto in cui volete salvare il vostro lavoro, usate il comando <command role="hg-ext-mq">qrefresh</command> per aggiornare la patch su cui state lavorando.</para>
  25.134 +
  25.135 +      &interaction.mq.tutorial.qrefresh;
  25.136 +
  25.137 +      <para id="x_3d4">Questo comando include nella vostra patch i cambiamenti che avete fatto nella directory di lavoro e aggiorna il changeset corrispondente alla patch in modo che contenga quei cambiamenti.</para>
  25.138 +
  25.139 +      <para id="x_3d5">Potete invocare <command role="hg-ext-mq">qrefresh</command> tutte le volte che volete, quindi questo comando rappresenta un buon modo per <quote>controllare</quote> il vostro lavoro. Aggiornate la vostra patch al momento opportuno, tentate un esperimento e se l&rsquo;esperimento non funziona usate <command role="hg-cmd">hg revert</command> per ripristinare le vostre modifiche all&rsquo;ultimo aggiornamento che avete compiuto.</para>
  25.140 +
  25.141 +      &interaction.mq.tutorial.qrefresh2;
  25.142 +    </sect2>
  25.143 +
  25.144 +    <sect2>
  25.145 +      <title>Impilare e registrare le patch</title>
  25.146 +
  25.147 +      <para id="x_3d6">Una volta che avete finito di lavorare su una patch, o avete bisogno di lavorare su un&rsquo;altra patch, potete usare di nuovo il comando <command role="hg-ext-mq">qnew</command> per creare una nuova patch. Mercurial applicherà questa patch a partire dalla vostra patch esistente.</para>
  25.148 +
  25.149 +      &interaction.mq.tutorial.qnew2;
  25.150 +
  25.151 +      <para id="x_3d7">Notate che la patch contiene le modifiche della nostra patch precedente come parte del proprio contesto (potete vederlo più chiaramente nel risultato di <command role="hg-cmd">hg annotate</command>).</para>
  25.152 +
  25.153 +      <para id="x_3d8">Finora, con l&rsquo;eccezione di <command role="hg-ext-mq">qnew</command> e <command role="hg-ext-mq">qrefresh</command>, siamo stati attenti a usare solo gli ordinari comandi Mercurial. Tuttavia, MQ fornisce molti comandi che sono più facili da usare quando state pensando in termini di patch, come illustrato di seguito.</para>
  25.154 +
  25.155 +      &interaction.mq.tutorial.qseries;
  25.156 +
  25.157 +      <itemizedlist>
  25.158 +	<listitem><para id="x_3d9">Il comando <command role="hg-ext-mq">qseries</command> elenca tutte le patch per questo repository di cui MQ è a conoscenza, dalla più vecchia alla più recente (più recentemente <emphasis>creata</emphasis>).</para>
  25.159 +	</listitem>
  25.160 +	<listitem><para id="x_3da">Il comando <command role="hg-ext-mq">qapplied</command> elenca tutte le patch che MQ ha <emphasis>applicato</emphasis> a questo repository, sempre dalla più vecchia alla più recente (più recentemente applicata).</para>
  25.161 +	</listitem></itemizedlist>
  25.162 +    </sect2>
  25.163 +
  25.164 +    <sect2>
  25.165 +      <title>Manipolare la pila delle patch</title>
  25.166 +
  25.167 +      <para id="x_3db">La discussione precedente implica che ci deve essere una differenza tra patch <quote>note</quote> e patch <quote>applicate</quote>, e in effetti c&rsquo;è. MQ può gestire una patch senza che sia applicata al repository.</para>
  25.168 +
  25.169 +      <para id="x_3dc">Una patch <emphasis>applicata</emphasis> ha un corrispondente changeset nel repository e gli effetti della patch e del changeset sono visibili nella directory di lavoro. Potete annullare l&rsquo;applicazione di una patch usando il comando <command role="hg-ext-mq">qpop</command>. La patch estratta è ancora <emphasis>nota</emphasis>, cioè gestita da MQ, ma non ha più un corrispondente changeset nel repository, e la directory di lavoro non contiene più le modifiche apportate dalla patch. La <xref linkend="fig:mq:stack"/> illustra la differenza tra patch applicate e registrate.</para>
  25.170 +
  25.171 +      <figure id="fig:mq:stack">
  25.172 +	<title>Patch applicate e non applicate nella pila delle patch di MQ</title>
  25.173 +	<mediaobject>
  25.174 +	  <imageobject><imagedata fileref="figs/mq-stack.png"/></imageobject>
  25.175 +	  <textobject><phrase>XXX add text</phrase></textobject>
  25.176 +	</mediaobject>
  25.177 +      </figure>
  25.178 +
  25.179 +      <para id="x_3de">Potete riapplicare una patch non applicata o estratta usando il comando <command role="hg-ext-mq">qpush</command>. Questo comando crea un nuovo changeset da far corrispondere alla patch, e le modifiche della patch compaiono nuovamente nella directory di lavoro. Di seguito, vengono mostrati esempi di <command role="hg-ext-mq">qpop</command> e <command role="hg-ext-mq">qpush</command> in azione.</para>
  25.180 +
  25.181 +      &interaction.mq.tutorial.qpop;
  25.182 +
  25.183 +      <para id="x_3df">Notate che, dopo aver estratto una patch o due patch, il risultato di <command role="hg-ext-mq">qseries</command> è rimasto lo stesso, mentre quello di <command role="hg-ext-mq">qapplied</command> è cambiato.</para>
  25.184 +
  25.185 +    </sect2>
  25.186 +
  25.187 +    <sect2>
  25.188 +      <title>Inserire ed estrarre molte patch</title>
  25.189 +
  25.190 +      <para id="x_3e0">Sebbene i comandi <command role="hg-ext-mq">qpush</command> e <command role="hg-ext-mq">qpop</command> operino in maniera predefinita su una singola patch alla volta, potete inserire ed estrarre molte patch in un unico passaggio. L&rsquo;opzione <option role="hg-ext-mq-cmd-qpush-opt">-a</option> di <command role="hg-ext-mq">qpush</command> lo induce a inserire tutte le patch non applicate, mentre l&rsquo;opzione <option role="hg-ext-mq-cmd-qpop-opt">-a</option> di <command role="hg-ext-mq">qpop</command> lo induce a estrarre tutte le patch applicate. (Per ulteriori modi di inserire ed estrarre molte patch, si veda la <xref linkend="sec:mq:perf"/> più avanti.)</para>
  25.191 +
  25.192 +      &interaction.mq.tutorial.qpush-a;
  25.193 +    </sect2>
  25.194 +
  25.195 +    <sect2>
  25.196 +      <title>I controlli di sicurezza e come scavalcarli</title>
  25.197 +
  25.198 +      <para id="x_3e1">Diversi comandi MQ esaminano la directory di lavoro prima di fare qualunque cosa e falliscono se trovano una qualsiasi modifica. Si comportano in questo modo per assicurarsi di non farvi perdere i cambiamenti che avete fatto ma che non avete ancora incorporato in una patch. L&rsquo;esempio seguente illustra questo caso: il comando <command role="hg-ext-mq">qnew</command> eviterà di creare una nuova patch se ci sono cambiamenti in sospeso, causati in questo caso dall&rsquo;invocazione di <command role="hg-cmd">hg add</command> su <filename>file3</filename>.</para>
  25.199 +
  25.200 +      &interaction.mq.tutorial.add;
  25.201 +
  25.202 +      <para id="x_3e2">Tutti i comandi che esaminano la directory di lavoro accettano un&rsquo;opzione <quote>so cosa sto facendo</quote> che si chiama sempre <option>-f</option>. L&rsquo;esatto significato di <option>-f</option> dipende dal comando. Per esempio, <command role="hg-cmd">hg qnew -f</command> incorporerà i cambiamenti in sospeso nella nuova patch creata, ma <command role="hg-cmd">hg qpop -f</command> annullerà le modifiche a qualsiasi file coinvolto dalla patch che sta estraendo. Assicuratevi di leggere la documentazione per l&rsquo;opzione <option>-f</option> di un comando prima di usarla!</para>
  25.203 +    </sect2>
  25.204 +
  25.205 +    <sect2>
  25.206 +      <title>Lavorare su diverse patch alla volta</title>
  25.207 +
  25.208 +      <para id="x_3e3">Il comando <command role="hg-ext-mq">qrefresh</command> aggiorna sempre la patch applicata <emphasis>più recentemente</emphasis>. Questo significa che potete sospendere il lavoro su una patch (aggiornandola), operare estrazioni o inserimenti in modo che l&rsquo;ultima patch applicata sia differente e lavorare su <emphasis>questa</emphasis> patch per un po&rsquo;.</para>
  25.209 +
  25.210 +      <para id="x_3e4">Ecco un esempio che illustra come potete sfruttare questa possibilità. Diciamo che state sviluppando una nuova funzione sotto forma di due patch. La prima è una modifica al nucleo del vostro software e la seconda&emdash;basata sulla prima&emdash;modifica l&rsquo;interfaccia utente per usare il codice che avete appena aggiunto al nucleo. Se notate un bug nel nucleo mentre state lavorando sulla patch per l&rsquo;interfaccia utente, per correggerlo vi basta usare <command role="hg-ext-mq">qrefresh</command>, in modo da salvare le modifiche in corso alla vostra patch di interfaccia, e poi usare <command role="hg-ext-mq">qpop</command> per poter operare sulla patch del nucleo. Correggete il bug nel nucleo, aggiornate la patch del nucleo con <command role="hg-ext-mq">qrefresh</command> e inserite la patch di interfaccia tramite <command role="hg-ext-mq">qpush</command> per continuare a lavorare dal punto dove avevate lasciato.</para>
  25.211 +    </sect2>
  25.212 +  </sect1>
  25.213 +
  25.214 +  <sect1 id="sec:mq:adv-patch">
  25.215 +    <title>Ulteriori informazioni sulle patch</title>
  25.216 +
  25.217 +    <para id="x_3e5">MQ usa il comando GNU <command>patch</command> per applicare le patch, quindi vi sarà d&rsquo;aiuto conoscere qualche altro aspetto di dettaglio sul funzionamento di <command>patch</command> e sulle patch stesse.</para>
  25.218 +
  25.219 +    <sect2>
  25.220 +      <title>Il numero di cancellazioni</title>
  25.221 +
  25.222 +      <para id="x_3e6">Se osservate le intestazioni di file in una patch, noterete che i percorsi dei nomi di solito hanno un componente aggiuntivo iniziale che non è presente nel percorso reale. Questo è uno strascico del modo in cui le persone erano abituate a generare le patch (questo modo viene ancora impiegato, ma piuttosto raramente ora che sono disponibili strumenti di controllo di revisione più moderni).</para>
  25.223 +
  25.224 +      <para id="x_3e7">Alice avrebbe estratto un archivio, modificato i file e poi deciso di voler creare una patch. Quindi avrebbe rinominato la directory di lavoro, estratto nuovamente l&rsquo;archivio (da qui nasce il bisogno di modificare il nome) e usato le opzioni <option role="cmd-opt-diff">-r</option> e <option role="cmd-opt-diff">-N</option> del comando <command>diff</command> per generare ricorsivamente una patch tra la directory non modificata e quella modificata. Come risultato, il nome della directory non modificata si sarebbe trovato all&rsquo;inizio del percorso sulla parte sinistra di ogni intestazione di file e il nome della directory modificata si sarebbe trovato all&rsquo;inizio del percorso sulla parte destra.</para>
  25.225 +
  25.226 +      <para id="x_3e8">Dato che chi riceveva una patch dalle Alice della rete probabilmente non avrebbe avuto le due copie, modificata e non, della directory con esattamente gli stessi nomi, il comando <command>patch</command> è stato dotato di un&rsquo;opzione <option role="cmd-opt-patch">-p</option> che indica il numero di elementi iniziali da eliminare dal percorso al momento di applicare una patch. Questo numero viene chiamato il <emphasis>numero di cancellazioni</emphasis>.</para>
  25.227 +
  25.228 +      <para id="x_3e9">Un&rsquo;opzione <quote><literal>-p1</literal></quote> significa <quote>usa un numero di cancellazioni pari a uno</quote>. Se <command>patch</command> vede un nome di file <filename>foo/bar/baz</filename> in un&rsquo;intestazione di file, eliminerà <filename>foo</filename> e proverà ad applicare la patch al file <filename>bar/baz</filename>. Strettamente parlando, il numero di cancellazioni si riferisce al numero di <emphasis>separatori di percorso</emphasis> (e dei relativi elementi) da eliminare. Un numero di cancellazioni pari a uno trasformerà <filename>foo/bar</filename> in <filename>bar</filename>, ma <filename>/foo/bar</filename> (notate lo slash iniziale) in <filename>foo/bar</filename>.</para>
  25.229 +
  25.230 +      <para id="x_3ea">Il numero di cancellazioni <quote>standard</quote> per le patch è pari a uno, in quanto quasi tutte le patch contengono un elemento iniziale da eliminare nel percorso. Il comando <command role="hg-cmd">hg diff</command> di Mercurial genera nomi di percorso in questa forma e sia il comando <command role="hg-cmd">hg import</command> che MQ si aspettano patch con un numero di cancellazioni pari a uno.</para>
  25.231 +
  25.232 +      <para id="x_3eb">Se qualcuno vi invia una patch che volete aggiungere alla vostra coda delle patch e la patch necessita di un numero di cancellazioni diverso da uno, non potete usare semplicemente <command role="hg-ext-mq">qimport</command> con la patch, perché <command role="hg-ext-mq">qimport</command> non è ancora dotato di un&rsquo;opzione <literal>-p</literal> (si veda il <ulink role="hg-bug" url="http://www.selenic.com/mercurial/bts/issue311">problema 311</ulink> per i dettagli). L&rsquo;alternativa migliore che avete è quella di creare una vostra patch con <command role="hg-ext-mq">qnew</command> e poi usare il comando <command>patch -pN</command> per applicare la patch che avete ricevuto, seguito da <command role="hg-cmd">hg addremove</command> per registrare qualsiasi file aggiunto o rimosso dalla patch, seguito da <command role="hg-ext-mq">hg qrefresh</command>. Questa complessità potrebbe diventare inutile una volta che il <ulink role="hg-bug" url="http://www.selenic.com/mercurial/bts/issue311">problema 311</ulink> verrà risolto.
  25.233 +      </para>
  25.234 +    </sect2>
  25.235 +
  25.236 +    <sect2>
  25.237 +      <title>Strategie per applicare una patch</title>
  25.238 +
  25.239 +      <para id="x_3ec">Quando <command>patch</command> applica un blocco, prova a impiegare una serie di strategie successive sempre meno accurate per portare a termine l&rsquo;operazione. Questo impiego di tecniche alternative rende spesso possibile prendere una patch che è stata generata a partire da una vecchia versione di un file e applicarla alla nuova versione di quel file.</para>
  25.240 +
  25.241 +      <para id="x_3ed">Come prima cosa, <command>patch</command> cerca una corrispondenza esatta, dove i numeri di riga, il contesto e il testo da modificare devono applicarsi perfettamente. Se non riesce a trovare una corrispondenza esatta, cerca una corrispondenza esatta per il contesto, senza onorare le informazioni sulla numerazione delle righe. Se questa strategia ha successo, il comando stampa una riga dicendo che il blocco è stato applicato, ma con un certo <emphasis>scostamento</emphasis> rispetto al numero di riga originale.</para>
  25.242 +
  25.243 +      <para id="x_3ee">Se la corrispondenza con il solo contesto fallisce, <command>patch</command> rimuove la prima e l&rsquo;ultima riga del contesto e tenta una corrispondenza con la sola versione <emphasis>ridotta</emphasis> del contesto. Se il blocco con il contesto ridotto ha successo, stampa un messaggio dicendo di aver applicato il blocco con un <emphasis>fattore di incertezza</emphasis> (il numero dopo il fattore di incertezza indica quante righe del contesto sono state escluse da <command>patch</command> prima che la patch si potesse applicare).</para>
  25.244 +
  25.245 +      <para id="x_3ef">Quando nessuna di queste tecniche funziona, <command>patch</command> stampa un messaggio dicendo che il blocco in questione è stato rifiutato. Il comando salva i blocchi rifiutati (anche chiamati semplicemente <quote>rifiuti</quote>) in un file con lo stesso nome e un&rsquo;estensione <filename role="special">.rej</filename> aggiuntiva. Le copie non modificate del file vengono salvate con un&rsquo;estensione <filename role="special">.orig</filename>, mentre la copia del file senza alcuna estensione conterrà le modifiche fatte dai blocchi che sono stati <emphasis>effettivamente</emphasis> applicati. Se avete una patch che modifica il file <filename>foo</filename> con sei blocchi, ma uno di essi non si riesce ad applicare, otterrete una copia <filename>foo.orig</filename> non modificata del file originale, un file <filename>foo.rej</filename> contenente un blocco e il file <filename>foo</filename> contenente le modifiche effettuate dai cinque blocchi applicati con successo.</para>
  25.246 +    </sect2>
  25.247 +
  25.248 +    <sect2>
  25.249 +      <title>Alcune stranezze nella rappresentazione delle patch</title>
  25.250 +
  25.251 +      <para id="x_3f0">Ci sono alcune cose utili da sapere sul modo in cui <command>patch</command> lavora con i file.</para>
  25.252 +      <itemizedlist>
  25.253 +	<listitem><para id="x_3f1">Questo dovrebbe già essere ovvio, ma <command>patch</command> non è in grado di gestire i file binari.</para>
  25.254 +	</listitem>
  25.255 +	<listitem><para id="x_3f2">Il comando non si cura neanche del bit di esecuzione, bensì crea i nuovi file come leggibili, ma non eseguibili.</para>
  25.256 +	</listitem>
  25.257 +	<listitem><para id="x_3f3"><command>patch</command> tratta la rimozione di un file come un diff tra il file da rimuovere e un file vuoto. Quindi la vostra idea di <quote>cancellare un file</quote> viene rappresentata in una patch come <quote>ogni riga di questo file è stata cancellata</quote>.</para>
  25.258 +	</listitem>
  25.259 +	<listitem><para id="x_3f4">Tratta l&rsquo;aggiunta di un file come un diff tra un file vuoto e il file da aggiungere. Quindi la vostra idea di <quote>aggiungere un file</quote> viene rappresentata in una patch come <quote>ogni riga di questo file è stata aggiunta</quote>.</para>
  25.260 +	</listitem>
  25.261 +	<listitem><para id="x_3f5">Tratta un file rinominato come la rimozione del file con il vecchio nome e l&rsquo;aggiunta del file con il nuovo nome. Questo significa che i file rinominati occupano molto spazio in una patch. (Notate anche che Mercurial attualmente non cerca di inferire se i file in una patch sono stati rinominati o copiati.)</para>
  25.262 +	</listitem>
  25.263 +	<listitem><para id="x_3f6"><command>patch</command> non è in grado di rappresentare i file vuoti, quindi non potete usare una patch per rappresentare la nozione di <quote>aggiungere questo file vuoto all&rsquo;albero</quote>.</para>
  25.264 +	</listitem>
  25.265 +      </itemizedlist>
  25.266 +    </sect2>
  25.267 +
  25.268 +    <sect2>
  25.269 +      <title>Fate attenzione all&rsquo;incertezza</title>
  25.270 +
  25.271 +      <para id="x_3f7">Anche se l&rsquo;applicazione di un blocco con un certo scostamento o con un certo fattore di incertezza avrà spesso un successo completo, queste tecniche inesatte lasciano naturalmente aperta la possibilità di rovinare il file modificato. Il caso più comune è tipicamente quello in cui la patch viene applicata due volte o in una posizione sbagliata nel file. Se <command>patch</command> o <command role="hg-ext-mq">qpush</command> dovessero mai menzionare lo scostamento o il fattore di incertezza, dovreste assicurarvi che i file siano stati modificati in maniera corretta.</para>
  25.272 +
  25.273 +      <para id="x_3f8">Spesso è una buona idea aggiornare una patch che è stata applicata con uno scostamento o un fattore di incertezza, perché l&rsquo;aggiornamento della patch genera nuove informazioni di contesto che permetteranno di applicarla in maniera precisa. Dico <quote>spesso</quote>, non <quote>sempre</quote>, perché qualche volta l&rsquo;aggiornamento di una patch ne renderà impossibile l&rsquo;applicazione su una revisione differente dei file coinvolti. In alcuni casi, come quando state mantenendo una patch che deve essere applicabile a molteplici versioni di un albero di sorgenti, è considerato accettabile avere una patch che si applica con qualche incertezza, purché abbiate verificato i risultati del processo di applicazione in casi come questi.</para>
  25.274 +    </sect2>
  25.275 +
  25.276 +    <sect2>
  25.277 +      <title>Gestire il rifiuto</title>
  25.278 +
  25.279 +      <para id="x_3f9">Se <command role="hg-ext-mq">qpush</command> non riesce ad applicare una patch, stamperà un messaggio di errore e terminerà. Se ha lasciato alcuni file <filename role="special">.rej</filename>, normalmente è meglio correggere i blocchi rifiutati prima di inserire altre patch o fare qualsiasi ulteriore modifica.</para>
  25.280 +
  25.281 +      <para id="x_3fa">Se <emphasis>di solito</emphasis> la vostra patch si applicava in maniera pulita e ora non lo fa più perché avete modificato il codice sottostante su cui si basavano le vostre patch, Mercurial Queues può aiutarvi: leggete la <xref linkend="sec:mq:merge"/> per i dettagli.</para>
  25.282 +
  25.283 +      <para id="x_3fb">Sfortunatamente, non esiste alcuna tecnica particolare per gestire i blocchi rifiutati. Molto spesso, dovrete esaminare il file <filename role="special">.rej</filename> e modificare il file di destinazione, applicando a mano i blocchi rifiutati.</para>
  25.284 +
  25.285 +      <para id="x_3fd">Un programmatore del kernel di Linux, Chris Mason (l&rsquo;autore di Mercurial Queues), ha realizzato uno strumento chiamato <command>mpatch</command> <citation><xref linkend="bib:mpatch"/></citation>, che adotta un metodo semplice per automatizzare l&rsquo;applicazione dei blocchi rifiutati da <command>patch</command>. Il comando <command>mpatch</command> può aiutarvi nel caso il blocco sia stato rifiutato per quattro tipiche ragioni:</para>
  25.286 +
  25.287 +      <itemizedlist>
  25.288 +	<listitem><para id="x_3fe">il contesto in mezzo a un blocco è cambiato;</para>
  25.289 +	</listitem>
  25.290 +	<listitem><para id="x_3ff">all&rsquo;inizio o alla fine del blocco manca una certa quantità di contesto;</para>
  25.291 +	</listitem>
  25.292 +	<listitem><para id="x_400">un blocco più ampio potrebbe applicarsi meglio&emdash;interamente o in parte&emdash;se fosse suddiviso in blocchi più piccoli;</para>
  25.293 +	</listitem>
  25.294 +	<listitem><para id="x_401">un blocco rimuove righe con un contesto leggermente differente rispetto a quello attualmente presente nel file.</para>
  25.295 +	</listitem>
  25.296 +      </itemizedlist>
  25.297 +
  25.298 +      <para id="x_402">Se usate il comando <command>mpatch</command>, dovreste stare doppiamente attenti quando controllate i risultati al termine dell&rsquo;esecuzione. In effetti, <command>mpatch</command> impone questo metodo di doppio controllo sul risultato dello strumento, avviando automaticamente un programma di gestione delle unioni quando ha concluso il proprio lavoro, in modo che possiate verificare i risultati e risolvere qualsiasi conflitto rimanente.</para>
  25.299 +    </sect2>
  25.300 +  </sect1>
  25.301 +
  25.302 +  <sect1>
  25.303 +    <title>Ulteriori informazioni sulla gestione delle patch</title>
  25.304 +
  25.305 +    <para id="x_6db">Man mano che acquisite familiarità con MQ, comincerete a voler eseguire altri tipi di operazioni di gestione delle patch.</para>
  25.306 +
  25.307 +    <sect2>
  25.308 +      <title>Cancellare le patch indesiderate</title>
  25.309 +
  25.310 +      <para id="x_6dc">Se volete sbarazzarvi di una patch, usate il comando <command role="hg-ext-mq">hg qdelete</command> per cancellare il file contenente la patch e rimuovere la sua voce dalla serie di patch. Se provate a cancellare una patch che è ancora applicata, <command role="hg-ext-mq">hg qdelete</command> si rifiuterà di operare.</para>
  25.311 +
  25.312 +      &interaction.ch11-qdelete.go;
  25.313 +    </sect2>
  25.314 +
  25.315 +    <sect2>
  25.316 +      <title>Convertire in e da revisioni permanenti</title>
  25.317 +
  25.318 +      <para id="x_6dd">Una volta che avete finito di lavorare con una patch e volete trasformarla in un changeset permanente, usate il comando <command role="hg-ext-mq">hg qfinish</command>. Passate una revisione al comando per identificare la patch che volete trasformare in un normale changeset; questa patch deve essere già stata applicata.</para>
  25.319 +
  25.320 +      &interaction.ch11-qdelete.convert;
  25.321 +
  25.322 +      <para id="x_6e0">Il comando <command role="hg-ext-mq">hg qfinish</command> accetta un&rsquo;opzione <option>--all</option> o <option>-a</option> per trasformare tutte le patch applicate in normali changeset.</para>
  25.323 +
  25.324 +      <para id="x_6de">&Egrave; anche possibile trasformare un changeset esistente in una patch, passando l&rsquo;opzione <option>-r</option> al comando <command role="hg-ext-mq">hg qimport</command>.</para>
  25.325 +
  25.326 +      &interaction.ch11-qdelete.import;
  25.327 +
  25.328 +      <para id="x_6df">Notate che ha senso convertire un changeset in una patch solo se non avete propagato quel changeset in altri repository. L&rsquo;identificatore del changeset importato cambierà ogni volta che aggiornate la patch, cosa che indurrà Mercurial a trattarlo come se non fosse correlato al changeset originale che avete trasmesso da qualche altra parte.</para>
  25.329 +    </sect2>
  25.330 +  </sect1>
  25.331 +
  25.332 +  <sect1 id="sec:mq:perf">
  25.333 +    <title>Ottenere le prestazioni migliori da MQ</title>
  25.334 +
  25.335 +    <para id="x_403">MQ è molto efficiente nel gestire un grande numero di patch. Ho effettuato alcuni esperimenti sulle prestazioni a metà del 2006 per una presentazione che ho tenuto alla conferenza EuroPython 2006 (su macchine più moderne, dovreste aspettarvi risultati migliori di quelli che vedrete nel seguito). Come dati campione ho usato la serie di patch 2.6.17-mm1 per il kernel di Linux, contenente 1.738 patch. Ho applicato queste patch a un repository del kernel di Linux contenente tutte le 27.472 revisioni intercorse tra Linux 2.6.12-rc2 e Linux 2.6.17.</para>
  25.336 +
  25.337 +    <para id="x_404">Sul mio vecchio e lento portatile, sono riuscito a eseguire <command role="hg-cmd">hg qpush -a</command> per tutte le 1.738 patch in 3.5 minuti e a eseguire <command role="hg-cmd">hg qpop -a</command> per tutte le patch in 30 secondi. (Su portatili più recenti, il tempo per estrarre tutte le patch è sceso a due minuti.) Ho potuto aggiornare una delle patch più grandi (che ha effettuato 22.779 righe di cambiamenti a 287 file) eseguendo <command role="hg-ext-mq">qrefresh</command> in 6.6 secondi.</para>
  25.338 +
  25.339 +    <para id="x_405">Chiaramente, MQ è particolarmente adatto per lavorare su alberi di grandi dimensioni, ma ci sono alcuni trucchi che potete usare per ottenere prestazioni ancora migliori.</para>
  25.340 +
  25.341 +    <para id="x_406">Prima di tutto, provate a <quote>raggruppare</quote> insieme le operazioni. Quando eseguite <command role="hg-ext-mq">qpush</command> o <command role="hg-ext-mq">qpop</command>, questi comandi esaminano la directory di lavoro una volta per assicurarsi che non abbiate effettuato alcuna modifica dimenticandovi poi di invocare <command role="hg-ext-mq">qrefresh</command>. Su alberi di piccole dimensioni, il tempo impiegato da questa disamina è insignificante. Tuttavia, su un albero di medie dimensioni (contenente decine di migliaia di file), questa operazione può impiegare anche più di un secondo.</para>
  25.342 +
  25.343 +    <para id="x_407">I comandi <command role="hg-ext-mq">qpush</command> e <command role="hg-ext-mq">qpop</command> vi permettono di estrarre e inserire più patch alla volta. Come prima cosa, identificate la <quote>patch di destinazione</quote> che volete raggiungere. Quando usate <command role="hg-ext-mq">qpush</command> specificando una destinazione, il comando inserirà patch finché quella patch non si troverà in cima alla pila delle patch applicate. Quando usate <command role="hg-ext-mq">qpop</command> con una destinazione, MQ estrarrà patch finché la patch di destinazione non si troverà in cima a quella pila.</para>
  25.344 +
  25.345 +    <para id="x_408">Potete indicare una patch di destinazione usando il nome della patch oppure un numero. Se usate un identificatore numerico, il conteggio delle patch parte da zero: questo significa che la prima patch corrisponde a zero, la seconda a uno, e così via.</para>
  25.346 +  </sect1>
  25.347 +
  25.348 +  <sect1 id="sec:mq:merge">
  25.349 +    <title>Aggiornare le vostre patch quando il codice sottostante cambia</title>
  25.350 +
  25.351 +    <para id="x_409">Capita spesso di mantenere una pila di patch su un repository sottostante che non modificate direttamente. Se state lavorando sui cambiamenti a codice di terze parti, o su una funzione che impiegate più tempo a sviluppare rispetto alla velocità di cambiamento del codice su cui si basa, avrete spesso bisogno di sincronizzarvi con il codice sottostante e di correggere ogni blocco delle vostre patch che non è più applicabile. Questa operazione si chiama <emphasis>rifondare</emphasis> la vostra serie di patch.</para>
  25.352 +
  25.353 +    <para id="x_40a">Il modo più semplice per eseguire questa operazione è quello di usare <command role="hg-cmd">hg qpop -a</command> per estrarre le vostre patch, poi invocare <command role="hg-cmd">hg pull</command> per propagare i cambiamenti nel repository sottostante e infine eseguire <command role="hg-cmd">hg qpush -a</command> per inserire nuovamente le vostre patch. MQ interromperà l&rsquo;inserimento ogni volta che incontra una patch che non riesce ad applicare a causa di qualche conflitto, dandovi la possibilità di risolvere i conflitti, aggiornare la patch interessata tramite <command role="hg-ext-mq">qrefresh</command> e continuare a inserire fino a quando non avrete corretto l&rsquo;intera pila.</para>
  25.354 +
  25.355 +    <para id="x_40b">Questo approccio è semplice e funziona bene se non vi aspettate che le modifiche al codice sottostante influenzino l&rsquo;applicabilità delle vostre patch. Tuttavia, se la vostra pila di patch coinvolge codice che viene modificato in maniera frequente o invasiva nel repository sottostante, correggere a mano i blocchi rifiutati diventa velocemente una seccatura.</para>
  25.356 +
  25.357 +    <para id="x_40c">&Egrave; possibile automatizzare parzialmente il processo di rifondazione. Se le vostre patch si applicano in maniera pulita su una qualche revisione del repository sottostante, MQ può usare questa informazione per aiutarvi a risolvere i conflitti tra le vostre patch e una revisione differente.</para>
  25.358 +
  25.359 +    <para id="x_40d">Il processo è leggermente complicato.</para>
  25.360 +    <orderedlist>
  25.361 +      <listitem><para id="x_40e">Come prima cosa, invocate <command role="hg-cmd">hg qpush -a</command> per inserire tutte le vostre patch sulla revisione su cui sapete che si applicano in maniera pulita.</para>
  25.362 +      </listitem>
  25.363 +      <listitem><para id="x_40f">Salvate una copia di backup della vostra directory delle patch usando <command role="hg-cmd">hg qsave -e -c</command>. Questo comando salva le patch in una directory chiamata <filename role="special" class="directory">.hg/patches.N</filename>, dove <literal>N</literal> è un piccolo intero, e stampa il nome della directory in cui sono state salvate le patch. Il comando inserisce anche un <quote>changeset di salvataggio</quote> dopo quelli corrispondenti alle vostre patch applicate, per registrare internamente gli stati dei file <filename role="special">series</filename> e <filename role="special">status</filename>.</para>
  25.364 +      </listitem>
  25.365 +      <listitem><para id="x_410">Invocate <command role="hg-cmd">hg pull</command> per propagare i nuovi cambiamenti nel repository sottostante. (Non usate <command role="hg-cmd">hg pull -u</command>, perché l&rsquo;aggiornamento dovrà essere fatto in maniera particolare, come vedrete nel prossimo punto.)</para>
  25.366 +      </listitem>
  25.367 +      <listitem><para id="x_411">Aggiornate la directory di lavoro alla nuova revisione di punta, usando <command role="hg-cmd">hg update -C</command> per sovrascrivere le modifiche apportate dalle patch che avete inserito.</para>
  25.368 +      </listitem>
  25.369 +      <listitem><para id="x_412">Unite tutte le patch usando <command>hg qpush -m -a</command>. L&rsquo;opzione <option role="hg-ext-mq-cmd-qpush-opt">-m</option> di <command role="hg-ext-mq">qpush</command> dice a MQ di effettuare un&rsquo;unione a tre vie se l&rsquo;applicazione di una patch fallisce.</para>
  25.370 +      </listitem></orderedlist>
  25.371 +
  25.372 +    <para id="x_413">Durante l&rsquo;esecuzione di <command role="hg-cmd">hg qpush -m</command>, ogni patch nel file <filename role="special">series</filename> viene applicata normalmente. Se una patch viene applicata con un fattore di incertezza o viene rifiutata, MQ esamina la coda che avete salvato tramite <command role="hg-ext-mq">qsave</command> ed effettua un&rsquo;unione a tre vie con il changeset che corrisponde alla patch. Questa operazione sfrutta il normale meccanismo di unione di Mercurial, quindi potrebbe aprire uno strumento grafico di unione in modo da aiutarvi a risolvere i problemi.</para>
  25.373 +
  25.374 +    <para id="x_414">Quando avete finito di risolvere gli effetti di una patch, MQ aggiornerà la vostra patch sulla base dei risultati dell&rsquo;unione.</para>
  25.375 +
  25.376 +    <para id="x_415">Alla fine di questo processo, il vostro repository conterrà una testa aggiuntiva proveniente dalla vecchia coda delle patch e la directory <filename role="special" class="directory">.hg/patches.N</filename> conterrà una copia della vecchia coda delle patch. Potete rimuovere la testa aggiuntiva usando <command role="hg-cmd">hg qpop -a -n patches.N</command> o <command role="hg-cmd">hg strip</command>. Potete cancellare <filename role="special" class="directory">.hg/patches.N</filename> una volta che siete sicuri di non averne più bisogno come backup.</para>
  25.377 +  </sect1>
  25.378 +
  25.379 +  <sect1>
  25.380 +    <title>Identificare le patch</title>
  25.381 +
  25.382 +    <para id="x_416">I comandi MQ che lavorano con le patch vi permettono di fare riferimento a una patch usando il suo nome o un numero. Il riferimento per nome funziona in modo abbastanza ovvio: passate il nome <filename>foo.patch</filename> a <command role="hg-ext-mq">qpush</command>, per esempio, e il comando inserirà patch fino a quando <filename>foo.patch</filename> non verrà applicata.</para>
  25.383 +
  25.384 +    <para id="x_417">Potete abbreviare il riferimento a una patch usando sia un nome che una differenza numerica: <literal>foo.patch-2</literal> significa <quote>due patch prima di <literal>foo.patch</literal></quote>, mentre <literal>bar.patch+4</literal> significa <quote>quattro patch dopo <literal>bar.patch</literal></quote>.</para>
  25.385 +
  25.386 +    <para id="x_418">Il riferimento per indice non è molto diverso. La prima patch visualizzata da <command role="hg-ext-mq">qseries</command> è la patch numero zero (sì, è uno di quei sistemi di conteggio che partono da zero), la seconda è la patch numero uno, e così via.</para>
  25.387 +
  25.388 +    <para id="x_419">MQ rende anche più facile lavorare con le patch usando i normali comandi Mercurial. Tutti i comandi che accettano un identificatore di changeset accettano anche il nome di una patch applicata. MQ aggiunge un&rsquo;etichetta omonima per ogni patch applicata alle etichette normalmente presenti nel repository. In più, le etichette speciali <literal role="tag">qbase</literal> e <literal role="tag">qtip</literal> identificano rispettivamente la prima e l&rsquo;ultima patch applicata.</para>
  25.389 +
  25.390 +    <para id="x_41a">Queste aggiunte alla funzione di etichettatura di Mercurial facilitano ulteriormente l&rsquo;uso delle patch.</para>
  25.391 +    <itemizedlist>
  25.392 +      <listitem><para id="x_41b">Volete bombardare di patch una mailing list con l&rsquo;ultima serie dei vostri cambiamenti?</para>
  25.393 +	<programlisting>hg email qbase:qtip</programlisting>
  25.394 +	<para id="x_41c">(Non sapete cosa sia un <quote>bombardamento di patch</quote>? Leggete la <xref linkend="sec:hgext:patchbomb"/>.)</para>
  25.395 +      </listitem>
  25.396 +      <listitem><para id="x_41d">Avete bisogno di vedere tutte le patch che da <literal>foo.patch</literal> in poi hanno coinvolto i file contenuti in una sottodirectory del vostro albero?</para>
  25.397 +	<programlisting>hg log -r foo.patch:qtip sottodirectory</programlisting>
  25.398 +      </listitem>
  25.399 +    </itemizedlist>
  25.400 +
  25.401 +    <para id="x_41e">Dato che MQ rende disponibili i nomi delle patch alle altre parti di Mercurial tramite il meccanismo interno delle etichette, non avete bisogno di digitare l&rsquo;intero nome di una patch quando volete identificarla per nome.</para>
  25.402 +
  25.403 +    <para id="x_41f">Un&rsquo;altra piacevole conseguenza del rappresentare i nomi di patch come etichette è che il comando <command role="hg-cmd">hg log</command> mostrerà normalmente il nome di una patch come un&rsquo;etichetta nel proprio elenco, rendendo facile distinguere visivamente le patch applicate dalle <quote>normali</quote> revisioni sottostanti. L&rsquo;esempio seguente mostra alcuni comandi Mercurial in azione con le patch applicate.</para>
  25.404 +
  25.405 +    &interaction.mq.id.output;
  25.406 +  </sect1>
  25.407 +
  25.408 +  <sect1>
  25.409 +    <title>Informazioni utili</title>
  25.410 +
  25.411 +    <para id="x_420">Ci sono alcuni aspetti dell&rsquo;uso di MQ che non trovano posto in sezioni dedicate, ma che è bene conoscere. Li presento qui, in un unico posto.</para>
  25.412 +
  25.413 +    <itemizedlist>
  25.414 +      <listitem><para id="x_421">Normalmente, quando estraete una patch tramite <command role="hg-ext-mq">qpop</command> e poi la reinserite tramite <command role="hg-ext-mq">qpush</command>, il changeset che rappresenta la patch dopo l&rsquo;estrazione/inserimento avrà una <emphasis>diversa identità</emphasis> rispetto al changeset che rappresentava l&rsquo;hash in precedenza. Leggete la <xref linkend="sec:mqref:cmd:qpush"/> per sapere perché.</para>
  25.415 +      </listitem>
  25.416 +      <listitem><para id="x_422">Non è una buona idea usare <command role="hg-cmd">hg merge</command> per unire i cambiamenti provenienti da un altro ramo con un changeset corrispondente a una patch, almeno se volete mantenere la <quote>natura di patch</quote> di quel changeset e dei changeset che si trovano sotto a quello nella pila delle patch. Se provate a farlo, sembrerà avere successo, ma l&rsquo;effetto sarà quello di disorientare MQ.</para>
  25.417 +      </listitem>
  25.418 +    </itemizedlist>
  25.419 +  </sect1>
  25.420 +
  25.421 +  <sect1 id="sec:mq:repo">
  25.422 +    <title>Gestire le patch in un repository</title>
  25.423 +
  25.424 +    <para id="x_423">Dato che la directory <filename role="special" class="directory">.hg/patches</filename> di MQ risiede fuori dalla directory di lavoro di un repository Mercurial, il repository Mercurial <quote>sottostante</quote> non sa nulla della gestione o della presenza delle patch.</para>
  25.425 +
  25.426 +    <para id="x_424">Questo presenta l&rsquo;interessante possibilità di gestire i contenuti della directory delle patch come un repository Mercurial indipendente. Questo può essere un modo utile per lavorare. Per esempio, potete lavorare su una patch per un po&rsquo;, aggiornarla tramite <command role="hg-ext-mq">qrefresh</command>, poi usare <command role="hg-cmd">hg commit</command> per registrare lo stato corrente della patch. Questo vi permette di <quote>ritornare</quote> a quella versione della patch più tardi.</para>
  25.427 +
  25.428 +    <para id="x_425">Potete quindi condividere differenti versioni della stessa pila di patch tra molteplici repository sottostanti. Uso questa tecnica quando sto sviluppando una funzione del kernel di Linux. Ho una copia intatta dei miei sorgenti del kernel per ogni diversa architettura di CPU e un repository clonato su ognuna di queste architetture che contiene le patch su cui sto lavorando. Quando voglio collaudare una modifica su un&rsquo;architettura differente, trasmetto le mie patch correnti al repository associato con il kernel di quell&rsquo;architettura, estraggo e inserisco tutte le mie patch, infine assemblo e collaudo quel kernel.</para>
  25.429 +
  25.430 +    <para id="x_426">Gestire le patch in un repository consente a più sviluppatori di lavorare sulla stessa serie di patch senza scontrarsi tra loro e basandosi su sorgenti sottostanti che potrebbero o non potrebbero essere sotto il loro controllo.</para>
  25.431 +
  25.432 +    <sect2>
  25.433 +      <title>Il supporto di MQ per i repository di patch</title>
  25.434 +
  25.435 +      <para id="x_427">MQ vi aiuta a lavorare con la directory <filename role="special" class="directory">.hg/patches</filename> in qualità di repository. Quando preparate un repository per lavorare con le patch usando <command role="hg-ext-mq">qinit</command>, potete passare l&rsquo;opzione <option role="hg-ext-mq-cmd-qinit-opt">-c</option> per creare la directory <filename role="special" class="directory">.hg/patches</filename> sotto forma di repository Mercurial.</para>
  25.436 +
  25.437 +      <note>
  25.438 +	<para id="x_428">Se dimenticate di usare l&rsquo;opzione <option role="hg-ext-mq-cmd-qinit-opt">-c</option>, potete semplicemente posizionarvi nella directory <filename role="special" class="directory">.hg/patches</filename> in qualsiasi momento e invocare <command role="hg-cmd">hg init</command>. Non dimenticate, però, di aggiungere una voce per il file <filename role="special">status</filename> al file <filename role="special">.hgignore</filename> (<command role="hg-cmd">hg qinit -c</command> lo fa automaticamente per voi), perché il file <filename role="special">status</filename> non andrebbe <emphasis>davvero</emphasis> amministrato.</para>
  25.439 +      </note>
  25.440 +
  25.441 +      <para id="x_42a">Per convenienza, se MQ nota che la directory <filename class="directory">.hg/patches</filename> è un repository, userà automaticamente <command role="hg-cmd">hg add</command> per aggiungere ogni patch che create e importate.</para>
  25.442 +
  25.443 +      <para id="x_42b">MQ fornisce il comando abbreviato <command role="hg-ext-mq">qcommit</command> che esegue <command role="hg-cmd">hg commit</command> nella directory <filename role="special" class="directory">.hg/patches</filename>, per risparmiarvi noiose digitazioni.</para>
  25.444 +
  25.445 +      <para id="x_42c">Infine, sui sistemi Unix, potete definire l&rsquo;alias <command>mq</command> come comando di convenienza per gestire la directory delle patch. Per esempio, sui sistemi Linux che usano la shell <command>bash</command>, potete aggiungere la riga seguente al vostro file <filename role="home">~/.bashrc</filename>.</para>
  25.446 +
  25.447 +      <programlisting>alias mq=`hg -R $(hg root)/.hg/patches'</programlisting>
  25.448 +
  25.449 +      <para id="x_42d">Potete poi invocare comandi della forma <command>mq pull</command> dal repository principale.</para>
  25.450 +    </sect2>
  25.451 +
  25.452 +    <sect2>
  25.453 +      <title>Alcune cose a cui fare attenzione</title>
  25.454 +
  25.455 +      <para id="x_42e">Il supporto di MQ per lavorare con un repository pieno di patch è limitato in alcuni aspetti di dettaglio.</para>
  25.456 +
  25.457 +      <para id="x_42f">MQ non può automaticamente scoprire quali modifiche avete fatto alla directory delle patch. Se usate <command role="hg-cmd">hg pull</command>, apportate cambiamenti a mano, o invocate <command role="hg-cmd">hg update</command> per aggiornare le modifiche alle patch o al file <filename role="special">series</filename>, dovrete usare <command role="hg-cmd">hg qpop -a</command> e poi <command role="hg-cmd">hg qpush -a</command> nel repository sottostante per fare in modo che quelle modifiche compaiano anche là. Se dimenticate di fare questo, potreste confondere le idee a MQ in merito a quali patch sono state effettivamente applicate.</para>
  25.458 +
  25.459 +    </sect2>
  25.460 +  </sect1>
  25.461 +  <sect1 id="sec:mq:tools">
  25.462 +    <title>Strumenti di terze parti che lavorano con le patch</title>
  25.463 +
  25.464 +    <para id="x_430">Una volta che avete lavorato con le patch per un po&rsquo;, vi troverete desiderosi di utilizzare strumenti che vi aiutino a capire e manipolare le patch di cui vi state occupando.</para>
  25.465 +
  25.466 +    <para id="x_431">Il comando <command>diffstat</command> <citation><xref linkend="bib:diffstat"/></citation> genera un istogramma delle modifiche effettuate a ogni file in una patch. Fornisce un buon modo per <quote>farsi un&rsquo;idea</quote> di una patch&emdash;quali file coinvolge e quante modifiche introduce a ogni file e nell&rsquo;insieme. (Trovo che sia una buona idea usare regolarmente l&rsquo;opzione <option role="cmd-opt-diffstat">-p</option> di <command>diffstat</command>, poiché altrimenti il comando proverà a manipolare i prefissi dei nomi di file in un modo che almeno io trovo inevitabilmente confuso.)</para>
  25.467 +
  25.468 +    &interaction.mq.tools.tools;
  25.469 +
  25.470 +    <para id="x_432">Il pacchetto <literal role="package">patchutils</literal> <citation><xref linkend="bib:patchutils"/></citation> è inestimabile. Fornisce un insieme di piccole utilità che seguono la <quote>filosofia Unix</quote>: ognuna effettua una singola operazione utile su una patch. Il comando di <literal role="package">patchutils</literal> che uso di più è <command>filterdiff</command>, che estrae sottoinsiemi di un file di patch. Per esempio, data una patch che modifica centinaia di file attraverso dozzine di directory, una singola invocazione di <command>filterdiff</command> può generare una patch più piccola che coinvolge solo i file il cui nome corrisponde a un particolare pattern di tipo glob. Leggete la <xref linkend="mq-collab:tips:interdiff"/> per un altro esempio.</para>
  25.471 +
  25.472 +  </sect1>
  25.473 +  <sect1>
  25.474 +    <title>Strategie valide per lavorare con le patch</title>
  25.475 +
  25.476 +    <para id="x_433">Sia che stiate lavorando su una serie di patch da sottoporre a un progetto software libero od open source, oppure su una serie che intendete trattare come una sequenza di normali changeset una volta che avete finito, potete usare alcune semplici tecniche per mantenere bene organizzato il vostro lavoro.</para>
  25.477 +
  25.478 +    <para id="x_434">Date nomi descrittivi alle vostre patch. Un buon nome per una patch potrebbe essere <filename>riorganizza-allocazione-dispositivi.patch</filename>, perché vi suggerirà immediatamente qual è lo scopo della patch. I nomi lunghi non dovrebbero essere un problema: non digiterete i nomi spesso, ma <emphasis>invocherete</emphasis> comandi come <command role="hg-ext-mq">qapplied</command> e <command role="hg-ext-mq">qtop</command> più e più volte. Una buona denominazione diventa particolarmente importante quando state lavorando con un certo numero di patch, o se vi state destreggiando tra un certo numero di attività differenti e le vostre patch ottengono solo una frazione della vostra attenzione.</para>
  25.479 +
  25.480 +    <para id="x_435">Siate consapevoli della patch su cui state lavorando. Usate frequentemente il comando <command role="hg-ext-mq">qtop</command> e date un&rsquo;occhiata al testo delle vostre patch&emdash;per esempio, usando <command role="hg-cmd">hg tip -p</command>&emdash;per assicurarvi di sapere dove vi trovate. Mi è capitato molte volte di modificare e aggiornare una patch diversa da quella che intendevo, ed è spesso complicato trasferire le modifiche nella patch giusta dopo averle inserite in quella sbagliata.</para>
  25.481 +
  25.482 +    <para id="x_436">Per questo motivo, vale davvero la pena di investire un po&rsquo; di tempo per imparare a usare alcuni degli strumenti di terze parti che ho descritto nella <xref linkend="sec:mq:tools"/>, in particolare <command>diffstat</command> e <command>filterdiff</command>. Il primo vi darà velocemente un&rsquo;idea di quali sono le modifiche effettuate dalla vostra patch, mentre il secondo vi renderà più facile selezionare blocchi particolari di una patch e inserirli in un&rsquo;altra.</para>
  25.483 +
  25.484 +  </sect1>
  25.485 +  <sect1>
  25.486 +    <title>Il ricettario di MQ</title>
  25.487 +
  25.488 +    <sect2>
  25.489 +      <title>Gestire patch <quote>elementari</quote></title>
  25.490 +
  25.491 +      <para id="x_437">Dato che il costo di aggiungere file in un nuovo repository Mercurial è così basso, ha molto senso gestire le patch in questo modo anche se volete semplicemente fare alcune modifiche a un archivo di sorgenti che avete scaricato.</para>
  25.492 +
  25.493 +      <para id="x_438">Cominciate con lo scaricare l&rsquo;archivio dei sorgenti, estraendone i contenuti e trasformandoli in un repository Mercurial.</para>
  25.494 +
  25.495 +      &interaction.mq.tarball.download;
  25.496 +
  25.497 +      <para id="x_439">Continuate creando una pila di patch e facendo le vostre modifiche.</para>
  25.498 +
  25.499 +      &interaction.mq.tarball.qinit;
  25.500 +
  25.501 +      <para id="x_43a">Diciamo che trascorrono alcune settimane o mesi e gli autori di quel pacchetto rilasciano una nuova versione. Prima di tutto, propagate i loro cambiamenti nel repository.</para>
  25.502 +
  25.503 +      &interaction.mq.tarball.newsource;
  25.504 +
  25.505 +      <para id="x_43b">La coppia di comandi che comincia con <command role="hg-cmd">hg locate</command> appena invocata cancella tutti i file dalla directory di lavoro, in modo che l&rsquo;opzione <option role="hg-opt-commit">--addremove</option> di <command role="hg-cmd">hg commit</command> possa effettivamente dirvi quali file sono stati davvero rimossi nella nuova versione dei sorgenti.</para>
  25.506 +
  25.507 +      <para id="x_43c">Infine, potete applicare le vostre patch al nuovo albero.</para>
  25.508 +
  25.509 +      &interaction.mq.tarball.repush;
  25.510 +    </sect2>
  25.511 +
  25.512 +    <sect2 id="sec:mq:combine">
  25.513 +      <title>Combinare intere patch</title>
  25.514 +
  25.515 +      <para id="x_43d">MQ vi fornisce il comando <command role="hg-ext-mq">qfold</command> per consentirvi di combinare intere patch tra loro. Questo comando <quote>include</quote> le patch che nominate, nell&rsquo;ordine in cui le nominate, nell&rsquo;ultima patch applicata e concatena le loro descrizioni aggiungendole alla fine della descrizione di questa patch. Se le patch che includete sono applicate, devono essere estratte prima di poterle includere.</para>
  25.516 +
  25.517 +      <para id="x_43e">L&rsquo;ordine in cui includete le patch è importante. Se la vostra ultima patch applicata è <literal>foo</literal> e voi utilizzate <command role="hg-ext-mq">qfold</command> per includervi <literal>bar</literal> e <literal>quux</literal>, otterrete una patch che opererà come se aveste applicato prima <literal>foo</literal>, poi <literal>bar</literal>, seguita da <literal>quux</literal>.</para>
  25.518 +    </sect2>
  25.519 +
  25.520 +    <sect2>
  25.521 +      <title>Unire parte di una patch a un&rsquo;altra</title>
  25.522 +
  25.523 +      <para id="x_43f">Unire <emphasis>parte</emphasis> di una patch a un&rsquo;altra patch è più difficile che combinare intere patch tra loro.</para>
  25.524 +
  25.525 +      <para id="x_440">Se volete spostare alcune modifiche su interi file, potete usare le opzioni <option role="cmd-opt-filterdiff">-i</option> e <option role="cmd-opt-filterdiff">-x</option> di <command>filterdiff</command> per scegliere le modifiche che desiderate ricavare da una patch, aggiungendo il risultato del comando in coda alla patch a cui unire i cambiamenti. Di solito non avrete bisogno di modificare la patch da cui prelevate le modifiche da unire. Piuttosto, MQ rifiuterà alcune parti della patch quando invocate <command role="hg-ext-mq">qpush</command> su di essa (a causa dei blocchi che avete spostato nell&rsquo;altra patch) e voi potrete semplicemente aggiornare la patch tramite <command role="hg-ext-mq">qrefresh</command> per scartare i blocchi duplicati.</para>
  25.526 +
  25.527 +      <para id="x_441">Se avete una patch con più blocchi che modificano un file e volete spostare solo alcuni di questi blocchi, il lavoro diventa più complicato, ma potete comunque automatizzarlo parzialmente. Usate <command>lsdiff -nvv</command> per stampare alcuni metadati sulla patch.</para>
  25.528 +
  25.529 +      &interaction.mq.tools.lsdiff;
  25.530 +
  25.531 +      <para id="x_442">Questo comando stampa tre tipi diversi di numeri:</para>
  25.532 +      <itemizedlist>
  25.533 +	<listitem><para id="x_443">(nella prima colonna) un <emphasis>numero di file</emphasis> per identificare ogni file modificato dalla patch;</para>
  25.534 +	</listitem>
  25.535 +	<listitem><para id="x_444">(sulla riga seguente, indentato) il numero di riga del file modificato dove comincia il blocco;</para>
  25.536 +	</listitem>
  25.537 +	<listitem><para id="x_445">(sulla stessa riga) un <emphasis>numero di blocco</emphasis> per identificare quel blocco.</para>
  25.538 +	</listitem>
  25.539 +      </itemizedlist>
  25.540 +
  25.541 +      <para id="x_446">Dovrete leggere e ispezionare visivamente la patch per identificare i numeri di file e di blocco che volete, ma poi potrete passarli alle opzioni <option role="cmd-opt-filterdiff">--files</option> e <option role="cmd-opt-filterdiff">--hunks</option> di <command>filterdiff</command> per selezionare esattamente quel file e il blocco che volete estrarre.</para>
  25.542 +
  25.543 +      <para id="x_447">Una volta che avete questo blocco, potete aggiungerlo in coda alla vostra patch di destinazione e continuare con il resto della <xref linkend="sec:mq:combine"/>.</para>
  25.544 +
  25.545 +    </sect2>
  25.546 +  </sect1>
  25.547 +  <sect1>
  25.548 +    <title>Differenze tra quilt e MQ</title>
  25.549 +
  25.550 +    <para id="x_448">Se avete già familiarità con quilt, MQ fornisce un insieme di comandi simile. Ci sono alcune differenze nel modo in cui questi comandi lavorano.</para>
  25.551 +
  25.552 +    <para id="x_449">Avrete già notato che la maggior parte dei comandi di quilt hanno una controparte MQ che comincia semplicemente con una <quote><literal>q</literal></quote>. Le eccezioni sono i comandi <literal>add</literal> e <literal>remove</literal> di quilt, le cui controparti sono i normali comandi Mercurial <command role="hg-cmd">hg add</command> e <command role="hg-cmd">hg remove</command>. Non c&rsquo;è alcun comando MQ equivalente al comando quilt <literal>edit</literal>.</para>
  25.553 +
  25.554 +  </sect1>
  25.555 +</chapter>
    26.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    26.2 +++ b/it/ch13-mq-collab.xml	Fri Sep 04 16:33:35 2009 +0200
    26.3 @@ -0,0 +1,238 @@
    26.4 +<chapter id="chap:mq-collab">
    26.5 +  <?dbhtml filename="usi-avanzati-di-mercurial-queues.html"?>
    26.6 +  <title>Usi avanzati di Mercurial Queues</title>
    26.7 +
    26.8 +  <para id="x_15d">Sebbene sia facile imparare gli usi più semplici di Mercurial Queues, sono un pizzico di disciplina e alcune delle funzioni meno usate di MQ  che rendono possibile lavorare in ambienti di sviluppo complicati.</para>
    26.9 +
   26.10 +  <para id="x_15e">In questo capitolo, userò come esempio una tecnica che ho impiegato per gestire lo sviluppo di un driver del kernel di Linux per un dispositivo Infiniband. Il driver in questione è grande (almeno per le dimensioni dei driver), poiché contiene 25.000 righe di codice distribuite su 35 file sorgente, e viene mantenuto da un piccolo gruppo di sviluppatori.</para>
   26.11 +
   26.12 +  <para id="x_15f">Sebbene la maggior parte del materiale in questo capitolo sia specifica per Linux, gli stessi principi si applicano nel caso in cui dobbiate fare parecchio lavoro su una qualsiasi base di codice di cui non siete i proprietari principali.</para>
   26.13 +
   26.14 +  <sect1>
   26.15 +    <title>Il problema di gestire molti obiettivi</title>
   26.16 +
   26.17 +    <para id="x_160">Il kernel di Linux cambia rapidamente e non è mai stato stabile internamente, in quanto gli sviluppatori effettuano frequentemente modifiche drastiche tra una release e l&rsquo;altra. Questo significa che, di solito, una versione del driver che funziona bene con una particolare versione rilasciata del kernel non potrà nemmeno essere <emphasis>compilata</emphasis> correttamente su qualsiasi altra versione del kernel.</para>
   26.18 +
   26.19 +    <para id="x_161">Per mantenere un driver, dobbiamo considerare un certo numero di versioni di Linux differenti.</para>
   26.20 +    <itemizedlist>
   26.21 +      <listitem><para id="x_162">Un obiettivo è l&rsquo;albero di sviluppo principale del kernel di Linux. In questo caso, le attività di manutenzione del codice sono parzialmente condivise con altri sviluppatori della comunità del kernel, che effettuano modifiche <quote>estemporanee</quote> al driver man mano che sviluppano e rifiniscono i sottosistemi del kernel.</para>
   26.22 +      </listitem>
   26.23 +      <listitem><para id="x_163">Manteniamo anche un certo numero di <quote>backport</quote> (letteralmente, conversioni all&rsquo;indietro) verso vecchie versioni del kernel di Linux, per soddisfare le necessità di clienti che stanno utilizzando distribuzioni di Linux più vecchie che non incorporano i nostri driver. (Effettuare il <emphasis>backport</emphasis> del codice significa modificarlo per farlo funzionare in una versione del suo ambiente di destinazione più vecchia di quella per la quale era stato sviluppato.)</para>
   26.24 +      </listitem>
   26.25 +      <listitem><para id="x_164">Infine, rilasciamo il software seguendo una tabella di marcia che non è necessariamente allineata con quella usata da chi sviluppa il kernel e da chi distribuisce il sistema operativo, in modo da poter consegnare nuove funzioni ai clienti senza obbligarli ad aggiornare il loro kernel o la loro intera distribuzione.</para>
   26.26 +      </listitem>
   26.27 +    </itemizedlist>
   26.28 +
   26.29 +    <sect2>
   26.30 +      <title>Approcci seducenti che non funzionano bene</title>
   26.31 +
   26.32 +      <para id="x_165">Ci sono due modi <quote>standard</quote> per mantenere un software che deve funzionare in molti ambienti diversi.</para>
   26.33 +
   26.34 +      <para id="x_166">Il primo è mantenere un certo numero di rami, ognuno dedicato a un singolo obiettivo. Il problema di questo approccio è che dovete mantenere una ferrea disciplina nel flusso dei cambiamenti tra i repository. Una nuova funzione o correzione di bug deve prendere vita in un repository <quote>intatto</quote>, poi passare a tutti i repository di backport. Le modifiche di backport dovrebbero propagarsi verso un numero di rami più limitato, in quanto l&rsquo;applicazione di una modifica di backport su un ramo a cui non appartiene probabilmente impedirà al driver di essere compilato.</para>
   26.35 +
   26.36 +      <para id="x_167">Il secondo è quello di mantenere un singolo albero di sorgenti pieno di istruzioni condizionali che attivano o disattivano parti di codice a seconda dell&rsquo;ambiente designato. Dato che queste istruzioni <quote>ifdef</quote> non sono permesse nell&rsquo;albero del kernel di Linux, è necessario seguire una procedura manuale o automatica per eliminarle e produrre un albero pulito. Una base di codice mantenuta in questo modo diventa rapidamente un caos di blocchi condizionali che sono difficili da capire e mantenere.</para>
   26.37 +
   26.38 +      <para id="x_168">Nessuno di questi approcci è particolarmente adatto a situazioni in cui non <quote>possedete</quote> la copia ufficiale di un albero di sorgenti. Nel caso di un driver Linux che viene distribuito insieme al kernel standard, l&rsquo;albero di Linus contiene la copia del codice che verrà universalmente considerata ufficiale. La versione a monte del <quote>mio</quote> driver può essere modificata da persone che non conosco, senza che io nemmeno lo scopra fino a quando i cambiamenti non appaiono nell&rsquo;albero di Linus.</para>
   26.39 +
   26.40 +      <para id="x_169">Questi approcci hanno la debolezza aggiuntiva di rendere difficile generare patch ben formate da presentare a monte.</para>
   26.41 +
   26.42 +      <para id="x_16a">In linea di principio, Mercurial Queues sembra un buon candidato per gestire uno scenario di sviluppo come quello qui delineato. Non solo questo è indubbiamente il caso, ma MQ contiene anche alcune funzioni aggiuntive che rendono il lavoro più piacevole.</para>
   26.43 +
   26.44 +    </sect2>
   26.45 +  </sect1>
   26.46 +  <sect1>
   26.47 +    <title>Applicare patch in maniera condizionata con le guardie</title>
   26.48 +
   26.49 +    <para id="x_16b">Forse il miglior modo per non impazzire con così tanti ambienti obiettivo è quello di essere in grado di scegliere patch specifiche da applicare a una data situazione. MQ fornisce una funzione chiamata <quote>guardie</quote> (originata dal comando <literal>guards</literal> di quilt) che fa proprio questo. Per cominciare, creiamo un semplice repository per fare qualche esperimento.</para>
   26.50 +
   26.51 +    &interaction.mq.guards.init;
   26.52 +
   26.53 +    <para id="x_16c">Questo ci fornisce un piccolo repository contenente due patch che non hanno alcuna dipendenza reciproca, perché coinvolgono file differenti.</para>
   26.54 +
   26.55 +    <para id="x_16d">L&rsquo;idea alla base dell&rsquo;applicazione condizionale è la possibilità di <quote>etichettare</quote> una patch con una <emphasis>guardia</emphasis>, che è semplicemente una stringa di testo di vostra scelta, per poi dire a MQ di selezionare le guardie specifiche da usare al momento di applicare le patch. MQ applicherà, o salterà, una patch con guardia a seconda delle guardie che avete selezionato.</para>
   26.56 +
   26.57 +    <para id="x_16e">Una patch può avere un numero arbitrario di guardie, ognuna delle quali è <emphasis>positiva</emphasis> (<quote>applica questa patch se questa guardia è selezionata</quote>) o <emphasis>negativa</emphasis> (<quote>salta questa patch se questa guardia è selezionata</quote>). Una patch senza alcuna guardia viene sempre applicata.</para>
   26.58 +
   26.59 +  </sect1>
   26.60 +  <sect1>
   26.61 +    <title>Controllare le guardie su una patch</title>
   26.62 +
   26.63 +    <para id="x_16f">Il comando <command role="hg-ext-mq">qguard</command> vi permette di determinare quali guardie dovrebbero applicarsi a una patch, o di visualizzare le guardie già attive. Senza alcun argomento, il comando mostra le guardie della patch attualmente in cima alla pila.</para>
   26.64 +
   26.65 +    &interaction.mq.guards.qguard;
   26.66 +
   26.67 +    <para id="x_170">Per impostare una guardia positiva su una patch, fate precedere il nome della guardia da un <quote><literal>+</literal></quote>.</para>
   26.68 +
   26.69 +    &interaction.mq.guards.qguard.pos;
   26.70 +
   26.71 +    <para id="x_171">Per impostare una guardia negativa, fate precedere il nome della guardia da un <quote><literal>-</literal></quote>.</para>
   26.72 +
   26.73 +    &interaction.mq.guards.qguard.neg;
   26.74 +
   26.75 +    <para id="x_74a">Notate che in questo caso gli argomenti del comando <command>hg qguard</command> sono introdotti con il prefisso <literal>--</literal>, così Mercurial eviterà di interpretare il testo <literal>-quux</literal> come un&rsquo;opzione.</para>
   26.76 +
   26.77 +    <note>
   26.78 +      <title>Impostare e modificare</title>
   26.79 +
   26.80 +      <para id="x_172">Il comando <command role="hg-ext-mq">qguard</command> <emphasis>imposta</emphasis> le guardie su una patch, ma non le <emphasis>modifica</emphasis>. Questo significa che se invocate <command role="hg-cmd">hg qguard +a +b</command> su una patch, quindi invocate <command role="hg-cmd">hg qguard +c</command> sulla stessa patch, l&rsquo;<emphasis>unica</emphasis> guardia che risulterà successivamente impostata sarà <literal>+c</literal>.</para>
   26.81 +    </note>
   26.82 +
   26.83 +    <para id="x_173">Mercurial memorizza le guardie nel file <filename role="special">series</filename>, in una forma facile sia da capire che da modificare a mano. (In altre parole, non dovete usare il comando <command role="hg-ext-mq">qguard</command> se non volete, perché potete semplicemente modificare il file <filename role="special">series</filename>.)</para>
   26.84 +
   26.85 +    &interaction.mq.guards.series;
   26.86 +
   26.87 +  </sect1>
   26.88 +  <sect1>
   26.89 +    <title>Selezionare le guardie da usare</title>
   26.90 +
   26.91 +    <para id="x_174">Il comando <command role="hg-ext-mq">qselect</command> determina quali guardie sono attive in un dato momento. Il suo effetto è quello di determinare quali patch verranno applicate da MQ la prossima volta che invocherete <command role="hg-ext-mq">qpush</command>. Non ha alcun altro effetto, in particolare non agisce in alcun modo sulle patch che sono già applicate.</para>
   26.92 +
   26.93 +    <para id="x_175">Invocato senza argomenti, il comando <command role="hg-ext-mq">qselect</command> elenca le guardie attualmente attive, una per ogni riga. Gli argomenti vengono trattati come i nomi delle guardie da applicare.</para>
   26.94 +
   26.95 +    &interaction.mq.guards.qselect.foo;
   26.96 +
   26.97 +    <para id="x_176">Nel caso siate interessati, le guardie attualmente selezionate vengono memorizzate nel file <filename role="special">guards</filename>.</para>
   26.98 +
   26.99 +    &interaction.mq.guards.qselect.cat;
  26.100 +
  26.101 +    <para id="x_177">Possiamo vedere gli effetti delle guardie selezionate quando invochiamo <command role="hg-ext-mq">qpush</command>.</para>
  26.102 +
  26.103 +    &interaction.mq.guards.qselect.qpush;
  26.104 +
  26.105 +    <para id="x_178">Una guardia non può cominciare con un carattere <quote><literal>+</literal></quote> o un carattere <quote><literal>-</literal></quote>. Il nome di una guardia non deve contenere spazio bianco, ma la maggior parte degli altri caratteri sono accettabili. Se provate a usare una guardia con un nome non valido, MQ se ne lamenterà.</para>
  26.106 +
  26.107 +    &interaction.mq.guards.qselect.error;
  26.108 +      
  26.109 +    <para id="x_179">Cambiare le guardie selezionate cambia le patch che vengono applicate.</para>
  26.110 +
  26.111 +    &interaction.mq.guards.qselect.quux;
  26.112 +
  26.113 +    <para id="x_17a">Potete vedere nell&rsquo;esempio seguente che le guardie negative hanno la precedenza sulle guardie positive.</para>
  26.114 +
  26.115 +    &interaction.mq.guards.qselect.foobar;
  26.116 +
  26.117 +  </sect1>
  26.118 +  <sect1>
  26.119 +    <title>Le regole di MQ per applicare le patch</title>
  26.120 +
  26.121 +    <para id="x_17b">Le regole usate da MQ per decidere se applicare una patch sono le seguenti.</para>
  26.122 +    <itemizedlist>
  26.123 +      <listitem><para id="x_17c">Una patch che non ha guardie viene sempre applicata.</para>
  26.124 +      </listitem>
  26.125 +      <listitem><para id="x_17d">Se la patch ha una guardia negativa che corrisponde a una guardia attualmente selezionata, la patch viene saltata.</para>
  26.126 +      </listitem>
  26.127 +      <listitem><para id="x_17e">Se la patch ha una guardia positiva che corrisponde a una guardia attualmente selezionata, la patch viene applicata.</para>
  26.128 +      </listitem>
  26.129 +      <listitem><para id="x_17f">Se la patch ha guardie positive o negative, ma nessuna corrisponde a una guardia attualmente selezionata, la patch viene saltata.</para>
  26.130 +      </listitem>
  26.131 +    </itemizedlist>
  26.132 +
  26.133 +  </sect1>
  26.134 +  <sect1>
  26.135 +    <title>Ridimensionare l&rsquo;ambiente di lavoro</title>
  26.136 +
  26.137 +    <para id="x_180">Lavorando sul driver di dispositivo menzionato in precedenza, non applico le patch a un normale albero del kernel di Linux, ma uso un repository che contiene solo una fotografia dei file sorgente rilevanti per lo sviluppo del dispositivo Infiniband. Lavorare con questo repository è più facile, perché le sue dimensioni sono l&rsquo;1% delle dimensioni di un repository del kernel.</para>
  26.138 +
  26.139 +    <para id="x_181">Poi scelgo una versione <quote>di base</quote> sulla quale le patch vengono applicate. Questa è una fotografia dell&rsquo;albero del kernel di Linux scattata su una revisione di mia scelta. Quando scatto la fotografia, registro l&rsquo;identificatore di changeset proveniente dal repository del kernel nel messaggio di commit. Dato che la fotografia mantiene la <quote>forma</quote> e il contenuto delle parti rilevanti dell&rsquo;albero del kernel, posso applicare le mie patch sul mio repository ridotto o su un normale albero del kernel.</para>
  26.140 +
  26.141 +    <para id="x_182">Normalmente, l&rsquo;albero di base su cui applicare le patch dovrebbe essere una fotografia di un albero a monte molto recente. Questa è la condizione migliore per facilitare lo sviluppo di patch che possono essere presentate a monte con poche o addirittura nessuna modifica.</para>
  26.142 +
  26.143 +  </sect1>
  26.144 +  <sect1>
  26.145 +    <title>Suddividere il file <filename role="special">series</filename></title>
  26.146 +
  26.147 +    <para id="x_183">Categorizzo le patch nel file <filename role="special">series</filename> in un certo numero di gruppi logici. Ogni sezione di patch simili comincia con un blocco di commenti che descrive lo scopo delle patch che seguono.</para>
  26.148 +
  26.149 +    <para id="x_184">La sequenza dei gruppi di patch che mantengo è la seguente. L&rsquo;ordine di questi gruppi è importante per i motivi che verranno descritti dopo aver introdotto i gruppi.</para>
  26.150 +    <itemizedlist>
  26.151 +      <listitem><para id="x_185">Il gruppo delle patch <quote>accettate</quote>. Sono le patch che il gruppo di sviluppo ha proposto al manutentore del sottosistema Infiniband e che sono state accettate, ma che non sono presenti nella fotografia su cui si basa il repository ridotto. Queste sono patch <quote>a sola lettura</quote>, presenti unicamente allo scopo di trasformare l&rsquo;albero in uno stato simile a quello in cui si trova nel repository del manutentore a monte.</para>
  26.152 +      </listitem>
  26.153 +      <listitem><para id="x_186">Il gruppo delle patch da <quote>rielaborare</quote>. Sono le patch che ho proposto ma per le quali il manutentore a monte ha richiesto alcune modifiche prima di poterle accettare.</para>
  26.154 +      </listitem>
  26.155 +      <listitem><para id="x_187">Il gruppo delle patch <quote>in sospeso</quote>. Sono le patch che non ho ancora proposto al manutentore a monte, ma su cui dobbiamo finire di lavorare. Queste patch saranno <quote>a sola lettura</quote> per un po&rsquo;. Se il manutentore a monte le accetta al momento di proporle, le sposterò alla fine del gruppo <quote>accettate</quote>. Se ne richiede la modifica, le sposterò all&rsquo;inizio del gruppo da <quote>rielaborare</quote>.</para>
  26.156 +      </listitem>
  26.157 +      <listitem><para id="x_188">Il gruppo delle patch <quote>in corso</quote>. Sono le patch che vengono attivamente sviluppate e che non dovrebbero essere ancora presentate a nessuno.</para>
  26.158 +      </listitem>
  26.159 +      <listitem><para id="x_189">Il gruppo delle patch di <quote>backport</quote>. Sono le patch che riadattano l&rsquo;albero dei sorgenti a una vecchia versione dell&rsquo;albero del kernel.</para>
  26.160 +      </listitem>
  26.161 +      <listitem><para id="x_18a">Il gruppo delle patch da <quote>non rilasciare</quote>. Sono le patch che per qualche ragione non dovrebbero mai essere presentate a monte. Per esempio, una patch di questo tipo potrebbe modificare le stringhe di identificazione incluse nei driver per rendere più facile distinguere, nel testo del campo, una versione del driver presa dall&rsquo;albero da una versione consegnata a un rivenditore di distribuzioni.</para>
  26.162 +      </listitem>
  26.163 +    </itemizedlist>
  26.164 +
  26.165 +    <para id="x_18b">Tornando alle ragioni per cui i gruppi di patch sono ordinati in questo modo, ci piacerebbe che le patch più in basso nella pila siano il più possibile stabili, in modo da non aver bisogno di rielaborare le patch più in alto a causa di modifiche al loro contesto. Mettere le patch che non verranno mai cambiate all&rsquo;inizio del file <filename role="special">series</filename> serve proprio a questo scopo.</para>
  26.166 +
  26.167 +    <para id="x_18c">Ci piacerebbe anche applicare le patch che sappiamo di aver bisogno di modificare su un albero di sorgenti che somiglia il più possibile all&rsquo;albero a monte. Questo è il motivo per cui teniamo le patch accettate in giro per un po&rsquo;.</para>
  26.168 +
  26.169 +    <para id="x_18d">Le patch di <quote>backport</quote> e da <quote>non rilasciare</quote> si trovano alla fine del file <filename role="special">series</filename>. Le patch di <quote>backport</quote> devono essere applicate su tutte le altre patch, e anche le patch da <quote>non rilasciare</quote> dovrebbero essere messe in un posto sicuro.</para>
  26.170 +
  26.171 +  </sect1>
  26.172 +  <sect1>
  26.173 +    <title>Mantenere le serie di patch</title>
  26.174 +
  26.175 +    <para id="x_18e">Nel mio lavoro, uso un certo numero di guardie per controllare quali patch devono essere applicate.</para>
  26.176 +
  26.177 +    <itemizedlist>
  26.178 +      <listitem><para id="x_18f">Le patch <quote>accettate</quote> sono sorvegliate da <literal>accettate</literal>. Questa guardia è abilitata per la maggior parte del tempo. Quando sto applicando le patch su un albero dove sono già presenti, posso disabilitare questa guardia così le patch che la seguono verranno applicate in maniera pulita.</para>
  26.179 +      </listitem>
  26.180 +      <listitem><para id="x_190">Le patch che sono <quote>terminate</quote>, ma non sono ancora state proposte, non hanno guardie. Se sto applicando la pila delle patch a una copia dell&rsquo;albero a monte, non ho bisogno di abilitare alcuna guardia per ottenere un albero di sorgenti ragionevolmente sicuro.</para>
  26.181 +      </listitem>
  26.182 +      <listitem><para id="x_191">Le patch che hanno bisogno di essere rielaborate prima di venire nuovamente presentate sono sorvegliate da <literal>rielaborare</literal>.</para>
  26.183 +      </listitem>
  26.184 +      <listitem><para id="x_192">Per quelle patch che sono ancora in lavorazione, uso <literal>sviluppo</literal>.</para>
  26.185 +      </listitem>
  26.186 +      <listitem><para id="x_193">Una patch di backport potrebbe avere diverse guardie, una per ogni versione del kernel a cui si applica. Per esempio, una patch che effettua il backport di una parte del codice alla versione 2.6.9 del kernel avrà una guardia <literal>2.6.9</literal>.</para>
  26.187 +      </listitem>
  26.188 +    </itemizedlist>
  26.189 +    <para id="x_194">Questa varietà di guardie mi concede una flessibilità considerevole nel determinare quale tipo di albero dei sorgenti creare. Nella maggior parte delle situazioni, la selezione delle guardie appropriate viene automatizzata durante il processo di assemblaggio, ma posso regolare manualmente le guardie da usare nelle circostanze meno comuni.</para>
  26.190 +
  26.191 +    <sect2>
  26.192 +      <title>L&rsquo;arte di scrivere patch di backport</title>
  26.193 +
  26.194 +      <para id="x_195">Usando MQ, scrivere una patch di backport è un processo semplice. Tutto quello che una patch di questo tipo deve fare è modificare una parte di codice che usa una funzione del kernel non presente in una vecchia versione del kernel, in modo che il driver continui a funzionare correttamente con la vecchia versione.</para>
  26.195 +
  26.196 +      <para id="x_196">Un obiettivo utile da raggiungere nella scrittura di una buona patch di backport è far sembrare che il codice sia stato scritto per la vecchia versione del kernel che state considerando. Meno intrusiva è la patch, più facile sarà da capire e mantenere. Se state scrivendo una collezione di patch di backport per evitare l&rsquo;effetto <quote>caos</quote> causato da molte istruzioni <literal>#ifdef</literal> (contenenti blocchi di codice che vengono usati solo in maniera condizionata) nel vostro codice, evitate di introdurre <literal>#ifdef</literal> dipendenti dalle versioni del kernel nelle patch. Piuttosto, scrivete diverse patch, ognuna delle quali provoca cambiamenti incondizionati, e controllate la loro applicazione usando le guardie.</para>
  26.197 +
  26.198 +      <para id="x_197">Ci sono due ragioni per separare le patch di backport in un gruppo distinto dalle patch <quote>normali</quote> i cui effetti vengono modificati da quelle. Il primo è che mescolarle insieme rende più difficile usare uno strumento come l&rsquo;estensione <literal role="hg-ext">patchbomb</literal> per automatizzare il processo di spedizione delle patch a un manutentore a monte. Il secondo è che le patch di backport potrebbero perturbare il contesto in cui una successiva patch normale viene applicata, rendendo impossibile applicare la patch normale in maniera pulita <emphasis>senza</emphasis> che la patch di backport precedente sia già stata applicata.</para>
  26.199 +
  26.200 +    </sect2>
  26.201 +  </sect1>
  26.202 +  <sect1>
  26.203 +    <title>Suggerimenti utili per sviluppare con MQ</title>
  26.204 +
  26.205 +    <sect2>
  26.206 +      <title>Organizzare le patch in directory</title>
  26.207 +
  26.208 +      <para id="x_198">Se state lavorando su un progetto di dimensioni considerevoli con MQ, non è difficile accumulare un grande numero di patch. Per esempio, mi è capitato di avere un repository di patch contenente più di 250 patch.</para>
  26.209 +
  26.210 +      <para id="x_199">Se riuscite a raggruppare queste patch in categorie logiche separate, potete memorizzarle in directory differenti, in quanto MQ non ha problemi a usare nomi di patch che contengono separatori di percorso.</para>
  26.211 +
  26.212 +    </sect2>
  26.213 +    <sect2 id="mq-collab:tips:interdiff">
  26.214 +      <title>Visualizzare la cronologia di una patch</title>
  26.215 +
  26.216 +      <para id="x_19a">Se sviluppate un insieme di patch per un lungo periodo, è una buona idea mantenerle in un repository, come discusso nella <xref linkend="sec:mq:repo"/>. Se fate in questo modo, scoprirete velocemente che è impraticabile usare il comando <command role="hg-cmd">hg diff</command> per esaminare la cronologia dei cambiamenti di una patch. In parte, questo succede perché state osservando la derivata seconda del codice reale (un diff di un diff), ma anche perché MQ aggiunge rumore al processo modificando le marcature temporali e i nomi di directory quando aggiorna una patch.</para>
  26.217 +
  26.218 +      <para id="x_19b">Tuttavia, potete usare l&rsquo;estensione <literal role="hg-ext">extdiff</literal> inclusa in Mercurial per rendere leggibile il diff di due versioni di una patch. Per fare questo, avrete bisogno di un pacchetto di terze parti chiamato <literal role="package">patchutils</literal> <citation><xref linkend="bib:patchutils"/></citation>. Il pacchetto fornisce un comando chiamato <command>interdiff</command> che mostra le differenze tra due diff come un diff. Usato su due versioni dello stesso diff, genera un diff che rappresenta le differenze tra la prima e la seconda versione.</para>
  26.219 +
  26.220 +      <para id="x_19c">Potete abilitare l&rsquo;estensione <literal role="hg-ext">extdiff</literal> nel solito modo, aggiungendo una riga alla sezione <literal role="rc-extensions">extensions</literal> del vostro file <filename role="special">~/.hgrc</filename>.</para>
  26.221 +      <programlisting>[extensions]
  26.222 +extdiff =</programlisting>
  26.223 +      <para id="x_19d">Il comando <command>interdiff</command> si aspetta che gli vengano passati i nomi di due file, ma l&rsquo;estensione <literal role="hg-ext">extdiff</literal> passa una coppia di directory al programma che invoca, ognuna delle quali può contenere un numero arbitrario di file. Quindi abbiamo bisogno di un piccolo programma che invochi <command>interdiff</command> su ogni coppia di file in quelle due directory. Questo programma è disponibile sotto il nome di <filename role="special">hg-interdiff</filename> nella directory <filename class="directory">contrib</filename> del repository di codice sorgente che accompagna questo libro.<footnote><para id="x_ffa">[NdT] Potete scaricare il programma <filename role="special">hg-interdiff</filename> dal <ulink role="hg-script" url="http://bitbucket.org/bos/hgbook/raw/tip/contrib/hg-interdiff">repository Mercurial del libro</ulink> ospitato su Bitbucket.</para></footnote></para>
  26.224 +
  26.225 +      <para id="x_19e">Dopo aver incluso il programma <filename role="special">hg-interdiff</filename> nel percorso di ricerca della vostra shell, potete eseguirlo come segue, dall&rsquo;interno di una directory di patch gestita da MQ:</para>
  26.226 +      <programlisting>hg extdiff -p hg-interdiff -r A:B mio-cambiamento.patch</programlisting>
  26.227 +      <para id="x_19f">Dato che vorrete usare questo comando prolisso molto spesso, potete fare in modo che <literal role="hg-ext">hgext</literal> lo renda disponibile come un normale comando Mercurial, modificando ancora una volta il vostro file <filename role="special">~/.hgrc</filename>.</para>
  26.228 +      <programlisting>[extdiff]
  26.229 +cmd.interdiff = hg-interdiff</programlisting>
  26.230 +      <para id="x_1a0">Questa riga ordina a <literal role="hg-ext">hgext</literal> di rendere disponibile il comando <literal>interdiff</literal>, in modo che possiate ridurre l&rsquo;invocazione precedente di <command role="hg-ext-extdiff">extdiff</command> a qualcosa di un po&rsquo; più maneggevole.</para>
  26.231 +      <programlisting>hg interdiff -r A:B mio-cambiamento.patch</programlisting>
  26.232 +
  26.233 +      <note>
  26.234 +	<para id="x_1a1">Il comando <command>interdiff</command> funziona bene solo se i file sottostanti dai quali vengono generate le versioni di una patch rimangono gli stessi. Se create una patch, modificate i file sottostanti e poi rigenerate la patch, <command>interdiff</command> potrebbe non produrre alcun risultato utile.</para>
  26.235 +      </note>
  26.236 +
  26.237 +      <para id="x_1a2">L&rsquo;utilità dell&rsquo;estensione <literal role="hg-ext">extdiff</literal> va oltre il semplice miglioramento della presentazione delle patch gestite da MQ. Per avere ulteriori informazioni, leggete la  <xref linkend="sec:hgext:extdiff"/>.</para>
  26.238 +
  26.239 +    </sect2>
  26.240 +  </sect1>
  26.241 +</chapter>
    27.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    27.2 +++ b/it/ch14-hgext.xml	Fri Sep 04 16:33:35 2009 +0200
    27.3 @@ -0,0 +1,209 @@
    27.4 +<chapter id="chap:hgext">
    27.5 +  <?dbhtml filename="aggiungere-funzionalità-con-le-estensioni.html"?>
    27.6 +  <title>Aggiungere funzionalità con le estensioni</title>
    27.7 +
    27.8 +  <para id="x_4fe">Se da una parte il nucleo di Mercurial è piuttosto completo dal punto di vista delle funzionalità, dall&rsquo;altra è deliberatamente privo di caratteristiche ornamentali. Questo approccio orientato a preservare la semplicità mantiene il software facile da maneggiare sia per chi ne cura la manutenzione sia per chi lo usa.</para>
    27.9 +
   27.10 +  <para id="x_4ff">Tuttavia, Mercurial non vi vincola a usare un insieme di comandi immutabile: potete aggiungere nuove funzioni a Mercurial sotto forma di <emphasis>estensioni</emphasis> (talvolta note come <emphasis>plugin</emphasis>). Abbiamo già discusso alcune di queste estensioni nei capitoli precedenti.</para>
   27.11 +  <itemizedlist>
   27.12 +    <listitem><para id="x_500">La <xref linkend="sec:tour-merge:fetch"/> parla dell&rsquo;estensione <literal role="hg-ext">fetch</literal>, che combina l&rsquo;estrazione di nuovi cambiamenti e la loro unione con i cambiamenti locali in un singolo comando, <command role="hg-ext-fetch">fetch</command>.</para>
   27.13 +    </listitem>
   27.14 +    <listitem><para id="x_501">Nel <xref linkend="chap:hook"/>, abbiamo parlato di diverse estensioni le cui funzioni sono utilizzabili sotto forma di hook: <literal role="hg-ext">acl</literal> aggiunge le liste di controllo d&rsquo;accesso, <literal role="hg-ext">bugzilla</literal> aggiunge l&rsquo;integrazione con il sistema Bugzilla per la gestione dei bug e <literal role="hg-ext">notify</literal> invia email di notifica in reazione all&rsquo;inserimento di nuovi cambiamenti.</para>
   27.15 +    </listitem>
   27.16 +    <listitem><para id="x_502">L&rsquo;estensione Mercurial Queues per la gestione delle patch è talmente importante da meritare due capitoli e un&rsquo;appendice interamente dedicati: il <xref linkend="chap:mq"/> copre le nozioni di base, il <xref linkend="chap:mq-collab"/> ne discute gli argomenti avanzati e l&rsquo;<xref linkend="chap:mqref"/> tratta ogni comando nei dettagli.</para>
   27.17 +    </listitem>
   27.18 +  </itemizedlist>
   27.19 +
   27.20 +  <para id="x_503">In questo capitolo, parleremo di alcune delle altre estensioni disponibili per Mercurial e tratteremo brevemente alcuni dei meccanismi che avrete bisogno di conoscere se volete scrivere le vostre estensioni.</para>
   27.21 +  <!--
   27.22 +  <itemizedlist>
   27.23 +    <listitem><para id="x_504">Nella <xref linkend="sec:hgext:inotify"/>, discuteremo la possibilità di <emphasis>enormi</emphasis> miglioramenti delle prestazioni tramite l&rsquo;uso dell&rsquo;estensione <literal role="hg-ext">inotify</literal>.</para>
   27.24 +    </listitem>
   27.25 +  </itemizedlist>
   27.26 +  -->
   27.27 +
   27.28 +  <sect1 id="sec:hgext:inotify">
   27.29 +    <title>Migliorare le prestazioni con l&rsquo;estensione <literal role="hg-ext">inotify</literal></title>
   27.30 +
   27.31 +    <para id="x_505">Siete interessati a ottenere esecuzioni fino a cento volte più veloci per alcune delle più comuni operazioni compiute da Mercurial? Continuate a leggere!</para>
   27.32 +
   27.33 +    <para id="x_506">Le prestazioni di Mercurial sono tipicamente eccellenti. Per esempio, quando invocate il comando <command role="hg-cmd">hg status</command>, Mercurial deve esaminare quasi ogni file e directory nel vostro repository in modo da mostrare lo stato dei file. Molti altri comandi Mercurial devono fare lo stesso lavoro dietro le quinte: per esempio, il comando <command role="hg-cmd">hg diff</command> usa il meccanismo dello stato per evitare costose operazioni di confronto su file che ovviamente non sono stati modificati.</para>
   27.34 +
   27.35 +    <para id="x_507">Dato che ottenere lo stato di un file è un&rsquo;operazione cruciale per raggiungere buone prestazioni, gli autori di Mercurial hanno ottimizzato il più possibile questo codice. Tuttavia, quando invocate <command role="hg-cmd">hg status</command>, Mercurial dovrà necessariamente effettuare almeno una costosa chiamata di sistema per ogni file registrato in modo da determinare se è stato modificato dall&rsquo;ultima volta che Mercurial ha controllato. Per repository di dimensioni sufficientemente grandi, questa operazione può durare molto tempo.</para>
   27.36 +
   27.37 +    <para id="x_508">Per esprimere numericamente la vastità di questo effetto, ho creato un repository contenente 150.000 file registrati e ho cronometrato <command role="hg-cmd">hg status</command> per scoprire che impiega dieci secondi a terminare, anche quando <emphasis>nessuno</emphasis> di quei file è stato modificato.</para>
   27.38 +
   27.39 +    <para id="x_509">Molti sistemi operativi moderni contengono utilità di notifica per i file. Se un programma si registra al servizio appropriato, il sistema operativo lo avvertirà ogni volta che un file di interesse viene creato, modificato, o cancellato. Sui sistemi Linux, il componente del kernel che si occupa di questa funzione si chiama <literal>inotify</literal>.</para>
   27.40 +
   27.41 +    <para id="x_50a">L&rsquo;estensione <literal role="hg-ext">inotify</literal> di Mercurial interagisce con il componente <literal>inotify</literal> per ottimizzare l&rsquo;esecuzione di <command role="hg-cmd">hg status</command>. Questa estensione ha due componenti. Un demone viene eseguito in background e riceve le notifiche dal sottosistema <literal>inotify</literal>, accettando connessioni anche dai normali comandi Mercurial. L&rsquo;estensione modifica il comportamento di Mercurial in modo che, invece di esaminare il file system, interroghi il demone. Dato che il demone possiede informazioni esatte sullo stato del repository, può rispondere istantaneamente con un risultato, senza dover esaminare tutti i file e le directory nel repository.</para>
   27.42 +
   27.43 +    <para id="x_50b">Ricordate i dieci secondi che ho misurato come il tempo impiegato dal solo Mercurial per eseguire <command role="hg-cmd">hg status</command> su un repository di 150.000 file? Con l&rsquo;estensione <literal role="hg-ext">inotify</literal> abilitata, il tempo è sceso a 0.1 secondi, più veloce di un fattore <emphasis>cento</emphasis>.</para>
   27.44 +
   27.45 +    <para id="x_50c">Prima di continuare, vi prego di fare attenzione ad alcuni avvertimenti.</para>
   27.46 +    <itemizedlist>
   27.47 +      <listitem><para id="x_50d">L&rsquo;estensione <literal role="hg-ext">inotify</literal> è specifica per Linux. Dato che si interfaccia direttamente con il sottosistema <literal>inotify</literal> del kernel di Linux, non funziona su altri sistemi operativi.</para>
   27.48 +      </listitem>
   27.49 +      <listitem><para id="x_50e">L&rsquo;estensione dovrebbe funzionare su qualsiasi distribuzione Linux rilasciata dopo i primi mesi del 2005. &Egrave; probabile che le distribuzioni più vecchie includano un kernel a cui manca <literal>inotify</literal>, o una versione di <literal>glibc</literal> senza il necessario supporto di interfaccia.</para>
   27.50 +      </listitem>
   27.51 +      <listitem><para id="x_50f">Non tutti i file system sono adatti per essere usati con l&rsquo;estensione <literal role="hg-ext">inotify</literal>. I file system di rete come NFS sono fuori gioco, per esempio, in particolare se state eseguendo Mercurial su diversi sistemi che montano lo stesso file system di rete. Il sistema <literal>inotify</literal> del kernel non ha alcun modo di sapere quali cambiamenti sono avvenuti su un altro sistema. La maggior parte dei file system locali (e.g. ext3, XFS, ReiserFS) dovrebbe andare bene.</para>
   27.52 +      </listitem></itemizedlist>
   27.53 +
   27.54 +    <para id="x_510">A maggio 2007, l&rsquo;estensione <literal role="hg-ext">inotify</literal> non viene ancora distribuita con Mercurial, quindi è un po&rsquo; più complicata da installare rispetto ad altre estensioni.<footnote><para id="x_ffd">[NdT] A partire da Mercurial 1.0, l&rsquo;estensione <literal role="hg-ext">inotify</literal> è stata inclusa nella distribuzione. L&rsquo;estensione deve comunque ancora considerarsi <ulink url="http://mercurial.selenic.com/wiki/InotifyExtension">assolutamente in fase sperimentale</ulink>.</para></footnote> Ma il miglioramento delle prestazioni ne vale la pena!</para>
   27.55 +
   27.56 +    <para id="x_511">Attualmente, l&rsquo;estensione è divisa in due parti: un insieme di patch al codice sorgente di Mercurial e una libreria di interfaccia Python al sottosistema <literal>inotify</literal>.</para>
   27.57 +    <note>
   27.58 +      <para id="x_512">Esistono <emphasis>due</emphasis> librerie di interfaccia Python per <literal>inotify</literal>. Una è chiamata <literal>pyinotify</literal> ed è inclusa in alcune distribuzioni Linux sotto il nome <literal>python-inotify</literal>. Questa <emphasis>non</emphasis> è quella di cui avete bisogno, dato che è troppo inefficiente e piena di problemi per essere pratica.</para>
   27.59 +    </note>
   27.60 +    <para id="x_513">Per cominciare, è meglio avere già installata una copia funzionante di Mercurial.</para>
   27.61 +    <note>
   27.62 +      <para id="x_514">Se seguite le istruzioni qui sotto, finirete per <emphasis>sostituire</emphasis> e sovrascrivere qualsiasi installazione esistente di Mercurial possiate già avere, usando l&rsquo;ultima versione <quote>sperimentale</quote> di Mercurial. Non dite che non siete stati avvertiti!</para>
   27.63 +    </note>
   27.64 +    <orderedlist>
   27.65 +      <listitem><para id="x_515">Clonate il repository della libreria di interfaccia Python per <literal>inotify</literal>. Assemblate il software e installatelo.</para>
   27.66 +	<programlisting>hg clone http://hg.kublai.com/python/inotify
   27.67 +cd inotify
   27.68 +python setup.py build --force
   27.69 +sudo python setup.py install --skip-build</programlisting>
   27.70 +      </listitem>
   27.71 +      <listitem><para id="x_516">Clonate il repository Mercurial <filename class="directory">crew</filename>. Clonate il repository di patch per <literal role="hg-ext">inotify</literal> in modo che Mercurial Queues sia in grado di applicare le patch alla vostra copia del repository <filename class="directory">crew</filename>.</para>
   27.72 +	<programlisting>hg clone http://hg.intevation.org/mercurial/crew
   27.73 +hg clone crew inotify
   27.74 +hg clone http://hg.kublai.com/mercurial/patches/inotify inotify/.hg/patches</programlisting>
   27.75 +      </listitem>
   27.76 +      <listitem><para id="x_517">Assicuratevi di aver abilitato <literal role="hg-ext">mq</literal>, l&rsquo;estensione Mercurial Queues. Se non avete mai usato MQ, leggete la <xref linkend="sec:mq:start"/> per una rapida introduzione.</para>
   27.77 +      </listitem>
   27.78 +      <listitem><para id="x_518">Posizionatevi nel repository <filename class="directory">inotify</filename> e applicate tutte le patch per l&rsquo;estensione <literal role="hg-ext">inotify</literal> usando l&rsquo;opzione <option role="hg-ext-mq-cmd-qpush-opt">-a</option> del comando <command role="hg-ext-mq">qpush</command>.</para>
   27.79 +	<programlisting>cd inotify
   27.80 +hg qpush -a</programlisting>
   27.81 +      </listitem>
   27.82 +      <listitem><para id="x_519">Se ottenete un messaggio di errore da <command role="hg-ext-mq">qpush</command>, dovreste fermarvi e chiedere aiuto.</para>
   27.83 +      </listitem>
   27.84 +      <listitem><para id="x_51a">Assemblate e installate la versione modificata di Mercurial.</para>
   27.85 +	<programlisting>python setup.py build --force
   27.86 +sudo python setup.py install --skip-build</programlisting>
   27.87 +      </listitem>
   27.88 +    </orderedlist>
   27.89 +    <para id="x_51b">Una volta che avete assemblato una versione adeguatamente modificata di Mercurial, tutto ciò che dovete fare per abilitare l&rsquo;estensione <literal role="hg-ext">inotify</literal> è aggiungere una voce al vostro file <filename role="special">~/.hgrc</filename>.</para>
   27.90 +    <programlisting>[extensions]
   27.91 +inotify =</programlisting>
   27.92 +    <para id="x_51c">Quando l&rsquo;estensione <literal role="hg-ext">inotify</literal> è abilitata, Mercurial avvierà il demone in maniera automatica e trasparente la prima volta che invocherete un comando che ha bisogno di conoscere lo stato dei file nel repository. Mercurial esegue un demone di stato per ogni repository.</para>
   27.93 +
   27.94 +    <para id="x_51d">Il demone di stato viene avviato silenziosamente ed eseguito in background. Se osservate la lista dei processi in esecuzione e invocate alcuni comandi in repository differenti dopo aver abilitato l&rsquo;estensione <literal role="hg-ext">inotify</literal>, vedrete alcuni processi <literal>hg</literal> in attesa di aggiornamenti dal kernel e di richieste da Mercurial.</para>
   27.95 +
   27.96 +    <para id="x_51e">La prima volta che invocate un comando Mercurial in un repository dopo aver abilitato l&rsquo;estensione <literal role="hg-ext">inotify</literal>, il comando verrà eseguito con quasi le stesse prestazioni di un normale comando Mercurial. Questo accade perché il demone di stato deve effettuare una normale scansione di stato in modo da avere un rilevamento di base su cui applicare gli aggiornamenti successivi provenienti dal kernel. Tuttavia, <emphasis>ogni</emphasis> comando successivo che effettua qualunque tipo di controllo sullo stato dovrebbe essere visibilmente più veloce persino su repository di dimensioni abbastanza modeste. Ancora meglio, più grande è il vostro repository, più grande sarà il vantaggio che vedrete sulle prestazioni. Il demone <literal role="hg-ext">inotify</literal> rende le operazioni di stato quasi istantanee su repository di tutte le dimensioni!</para>
   27.97 +
   27.98 +    <para id="x_51f">Se preferite, potete avviare manualmente un demone di stato usando il comando <command role="hg-ext-inotify">inserve</command>, che vi permette di controllare in maniera leggermente più accurata le modalità di esecuzione del demone. Naturalmente, questo comando sarà disponibile solo nel caso in cui l&rsquo;estensione <literal role="hg-ext">inotify</literal> sia abilitata.</para>
   27.99 +
  27.100 +    <para id="x_520">Quando state usando l&rsquo;estensione <literal role="hg-ext">inotify</literal>, non dovreste notare <emphasis>nessuna differenza</emphasis> nel comportamento di Mercurial, con la sola eccezione dei comandi relativi allo stato, che vengono eseguiti molto più velocemente di quanto accadeva di solito. Dovreste espressamente aspettarvi che i comandi non stampino messaggi differenti né restituiscano risultati differenti. Se una di queste situazioni si verifica, vi prego di segnalare il bug.</para>
  27.101 +
  27.102 +  </sect1>
  27.103 +  <sect1 id="sec:hgext:extdiff">
  27.104 +    <title>Supporto flessibile per i diff con l&rsquo;estensione <literal role="hg-ext">extdiff</literal></title>
  27.105 +
  27.106 +    <para id="x_521">Il comando predefinito di Mercurial <command role="hg-cmd">hg diff</command> stampa il testo semplice di diff unificati.</para>
  27.107 +
  27.108 +    &interaction.extdiff.diff;
  27.109 +
  27.110 +    <para id="x_522">Nel caso desideraste usare uno strumento esterno per visualizzare le modifiche, vorrete usare l&rsquo;estensione <literal role="hg-ext">extdiff</literal>, che vi permetterà di impiegare, per esempio, uno strumento di diff grafico.</para>
  27.111 +
  27.112 +    <para id="x_523">L&rsquo;estensione <literal role="hg-ext">extdiff</literal> è inclusa in Mercurial, quindi è facile da installare. Per abilitare l&rsquo;estensione, vi basta aggiungere una voce di una riga nella sezione <literal role="rc-extensions">extensions</literal> del vostro file <filename role="special">~/.hgrc</filename>.</para>
  27.113 +    <programlisting>[extensions]
  27.114 +extdiff =</programlisting>
  27.115 +    <para id="x_524">Questa estensione introduce un comando chiamato <command role="hg-ext-extdiff">extdiff</command>, il cui comportamento predefinito è quello di usare il comando <command>diff</command> del vostro sistema per generare un diff unificato allo stesso modo del comando <command
  27.116 +	role="hg-cmd">hg diff</command> predefinito.</para>
  27.117 +    
  27.118 +    &interaction.extdiff.extdiff;
  27.119 +
  27.120 +    <para id="x_525">I risultati non saranno esattamente gli stessi ottenibili con le diverse versioni del comando predefinito <command role="hg-cmd">hg diff</command>, perché i risultati del comando <command>diff</command> variano da un sistema all&rsquo;altro, persino quando gli vengono passate le stesse opzioni.</para>
  27.121 +
  27.122 +    <para id="x_526"><!--Come indica la riga <quote><literal>making snapshot</literal></quote> stampata qui sopra, -->Il comando <command role="hg-ext-extdiff">extdiff</command> funziona creando due fotografie <!--(in inglese, snapshot)-->del vostro albero sorgente. La prima fotografia è quella della revisione sorgente, la seconda è quella della revisione destinazione o della directory di lavoro. Il comando <command role="hg-ext-extdiff">extdiff</command> genera queste fotografie in una directory temporanea, passa il nome di ogni directory di fotografia a un visualizzatore di diff esterno, poi cancella la directory temporanea. Per lavorare in modo più efficiente, il comando fotografa solo le directory e i file che sono stati modificati tra le due revisioni.</para>
  27.123 +
  27.124 +    <para id="x_527">Il nome delle directory di fotografia è uguale al nome base del vostro repository. Se il percorso del vostro repository è <filename class="directory">/quux/bar/foo</filename>, allora <filename class="directory">foo</filename> sarà il nome di ognuna delle directory di fotografia. Nel caso sia appropriato, ogni nome di directory di fotografia termina con il proprio identificatore di changeset. Se la fotografia è quella della revisione <literal>a631aca1083f</literal>, la directory verrà chiamata <filename class="directory">foo.a631aca1083f</filename>. Una fotografia della directory di lavoro non terminerà con un identificatore di changeset, quindi in questo esempio il suo nome sarebbe semplicemente <filename class="directory">foo</filename>. Per vedere come questo appare in pratica, osservate ancora l&rsquo;esempio di <command role="hg-ext-extdiff">extdiff</command> precedente. Notate che il diff contiene i nomi delle directory di fotografia nella propria intestazione.</para>
  27.125 +
  27.126 +    <para id="x_528">Il comando <command role="hg-ext-extdiff">extdiff</command> accetta due importanti opzioni. L&rsquo;opzione <option role="hg-ext-extdiff-cmd-extdiff-opt">-p</option> vi permette di scegliere un programma diverso da <command>diff</command> con cui visualizzare le differenze. Con l&rsquo;opzione <option role="hg-ext-extdiff-cmd-extdiff-opt">-o</option>, potete cambiare le opzioni che <command role="hg-ext-extdiff">extdiff</command> passa al programma (le opzioni predefinite sono <quote><literal>-Npru</literal></quote>, che hanno senso solo se state invocando <command>diff</command>). Sotto altri aspetti, il comando <command role="hg-ext-extdiff">extdiff</command> agisce in modo simile al comando predefinito <command role="hg-cmd">hg diff</command>: si usano gli stessi nomi di opzione, la stessa sintassi e gli stessi argomenti per specificare le revisioni che volete, i file che volete, e così via.</para>
  27.127 +
  27.128 +    <para id="x_529">Per esempio, ecco come invocare il normale comando <command>diff</command> di sistema per fargli generare diff contestuali (usando l&rsquo;opzione <option role="cmd-opt-diff">-c</option>) invece di diff unificati e per fargli mostrare cinque righe di contesto invece delle tre predefinite (passandogli <literal>5</literal> come argomento per l&rsquo;opzione <option role="cmd-opt-diff">-C</option>).</para>
  27.129 +
  27.130 +    &interaction.extdiff.extdiff-ctx;
  27.131 +
  27.132 +    <para id="x_52a">Lanciare uno strumento di diff visuale è altrettanto facile. Ecco come invocare il visualizzatore <command>kdiff3</command>.</para>
  27.133 +    <programlisting>hg extdiff -p kdiff3 -o</programlisting>
  27.134 +
  27.135 +    <para id="x_52b">Se il comando che usate per visualizzare i diff non gestisce le directory, potete facilmente aggirare questo problema con un minimo di programmazione. Consultate la <xref linkend="mq-collab:tips:interdiff"/> per vedere un esempio di un programma simile in azione con l&rsquo;estensione <literal role="hg-ext">mq</literal> e il comando <command>interdiff</command>.</para>
  27.136 +
  27.137 +    <sect2>
  27.138 +      <title>Definire alias per i comandi</title>
  27.139 +
  27.140 +      <para id="x_52c">Potrebbe essere scomodo ricordare le opzioni sia per il comando <command role="hg-ext-extdiff">extdiff</command> che per il visualizzatore di diff che volete usare, quindi l&rsquo;estensione <literal role="hg-ext">extdiff</literal> vi permette di definire <emphasis>nuovi</emphasis> comandi che invocheranno il vostro visualizzatore di diff con le opzioni giuste.</para>
  27.141 +
  27.142 +      <para id="x_52d">Tutto quello che dovete fare è modificare il vostro file <filename role="special">~/.hgrc</filename> aggiungendo una sezione chiamata <literal role="rc-extdiff">extdiff</literal> dove potete definire vari comandi. Ecco come aggiungere un comando <literal>kdiff3</literal>. Una volta che lo avete definito, potete digitare <quote><literal>hg kdiff3</literal></quote> e l&rsquo;estensione <literal role="hg-ext">extdiff</literal> lancerà <command>kdiff3</command> per voi.</para>
  27.143 +      <programlisting>[extdiff]
  27.144 +cmd.kdiff3 =</programlisting>
  27.145 +      <para id="x_52e">Se lasciate vuota la parte destra della definizione, come qui sopra, l&rsquo;estensione <literal role="hg-ext">extdiff</literal> usa il nome del comando che avete definito come il nome del programma esterno da usare. Ma questi nomi non devono necessariamente essere uguali. Qui di seguito definiamo un comando chiamato <quote><literal>hg pippo</literal></quote> che invoca <command>kdiff3</command>.</para>
  27.146 +      <programlisting>[extdiff]
  27.147 +cmd.pippo = kdiff3</programlisting>
  27.148 +
  27.149 +      <para id="x_52f">Potete anche specificare le opzioni predefinite con cui volete invocare il vostro programma di visualizzazione di diff. Il prefisso da usare è <quote><literal>opts.</literal></quote>, seguito dal nome del comando a cui applicare le opzioni. Questo esempio definisce un comando <quote><literal>hg vimdiff</literal></quote> che esegue l&rsquo;estensione <literal>DirDiff</literal> dell&rsquo;editor <command>vim</command>.</para>
  27.150 +      <programlisting>[extdiff]
  27.151 + cmd.vimdiff = vim
  27.152 +opts.vimdiff = -f '+next' '+execute "DirDiff" argv(0) argv(1)'</programlisting>
  27.153 +
  27.154 +    </sect2>
  27.155 +  </sect1>
  27.156 +  <!--
  27.157 +  <sect1 id="sec:hgext:transplant">
  27.158 +    <title>Cherrypicking changes with the <literal
  27.159 +	role="hg-ext">transplant</literal> extension</title>
  27.160 +
  27.161 +    <para id="x_530">Need to have a long chat with Brendan about this.</para>
  27.162 +
  27.163 +  </sect1>
  27.164 +  -->
  27.165 +  <sect1 id="sec:hgext:patchbomb">
  27.166 +    <title>Inviare cambiamenti via email con l&rsquo;estensione <literal role="hg-ext">patchbomb</literal></title>
  27.167 +
  27.168 +    <para id="x_531">Molti progetti seguono una pratica di <quote>revisione dei cambiamenti</quote> in cui gli sviluppatori inviano le proprie modifiche a una mailing list in modo che altri possano leggerle e commentarle prima che la loro versione finale venga inserita in un repository condiviso. Alcuni progetti assegnano a qualcuno il ruolo del custode che applica le modifiche di altre persone a un repository a cui quelle persone non hanno accesso.</para>
  27.169 +
  27.170 +    <para id="x_532">Grazie alla sua estensione <literal role="hg-ext">patchbomb</literal>, Mercurial facilita l&rsquo;invio di email contenenti modifiche da rivedere o applicare. L&rsquo;estensione è chiamata così perché le modifiche vengono inviate in forma di patch e solitamente viene inviato un singolo changeset per ogni messaggio email. Quindi, inviare una lunga serie di cambiamenti via email è molto simile a <quote>bombardare</quote> la casella del ricevente, da cui il nome <quote>patchbomb</quote>.</para>
  27.171 +
  27.172 +    <para id="x_533">Come al solito, la configurazione di base dell&rsquo;estensione <literal role="hg-ext">patchbomb</literal> occupa solo una o due righe del vostro file <filename role="special">~/.hgrc</filename>.</para>
  27.173 +    <programlisting>[extensions]
  27.174 +patchbomb =</programlisting>
  27.175 +    <para id="x_534">Una volta che avete abilitato l&rsquo;estensione, avrete a disposizione un nuovo comando chiamato <command role="hg-ext-patchbomb">email</command>.</para>
  27.176 +
  27.177 +    <para id="x_535">Il modo migliore e più sicuro di invocare il comando <command role="hg-ext-patchbomb">email</command> è quello di eseguirlo <emphasis>sempre</emphasis> una prima volta con l&rsquo;opzione <option role="hg-ext-patchbomb-cmd-email-opt">-n</option>. Questo vi mostrerà ciò che il comando <emphasis>invierebbe</emphasis>, senza in effetti inviare nulla. Una volta che avete dato una veloce occhiata ai cambiamenti e avete verificato di stare mandando quelli giusti, potete rieseguire lo stesso comando, questa volta senza l&rsquo;opzione <option role="hg-ext-patchbomb-cmd-email-opt">-n</option>.</para>
  27.178 +
  27.179 +    <para id="x_536">Il comando <command role="hg-ext-patchbomb">email</command> accetta lo stesso tipo di sintassi di revisione di tutti gli altri comandi Mercurial. Per esempio, questo comando invierà ogni revisione tra 7 e <literal>tip</literal> comprese.</para>
  27.180 +    <programlisting>hg email -n 7:tip</programlisting>
  27.181 +    <para id="x_537">Potete anche specificare un <emphasis>repository</emphasis> con cui effettuare un confronto. Se fornite un repository senza indicare alcuna revisione, il comando <command role="hg-ext-patchbomb">email</command> invierà tutte le revisioni del repository locale che non sono presenti nel repository remoto. Se in aggiunta specificate revisioni o il nome di un ramo (quest&rsquo;ultimo usando l&rsquo;opzione <option role="hg-ext-patchbomb-cmd-email-opt">-b</option>), questo vincolerà le revisioni inviate.</para>
  27.182 +
  27.183 +    <para id="x_538">&Egrave; assolutamente sicuro invocare il comando <command role="hg-ext-patchbomb">email</command> senza i nomi delle persone a cui volete spedire un messaggio: se fate in questo modo, i destinatari vi verranno chiesti interattivamente. (Se state usando un sistema di tipo Unix o Linux, dovreste avere a disposizione le capacità avanzate di digitazione fornite da <literal>readline</literal> o librerie simili quando immettete quelle intestazioni, cosa che vi si rivelerà utile.)</para>
  27.184 +
  27.185 +    <para id="x_539">Quando state inviando una sola revisione, il comando <command role="hg-ext-patchbomb">email</command> userà la prima riga della descrizione del changeset come oggetto predefinito del singolo messaggio email da spedire.</para>
  27.186 +
  27.187 +    <para id="x_53a">Se inviate revisioni multiple, di solito il comando <command role="hg-ext-patchbomb">email</command> spedirà un messaggio per ogni changeset. Farà precedere la serie da un messaggio introduttivo in cui dovreste descrivere lo scopo della serie di cambiamenti che state inviando.</para>
  27.188 +
  27.189 +    <sect2>
  27.190 +      <title>Modificare il comportamento di <literal role="hg-ext">patchbomb</literal></title>
  27.191 +
  27.192 +      <para id="x_53b">Non tutti i progetti hanno esattamente le stesse convenzioni per spedire cambiamenti via email, così l&rsquo;estensione <literal role="hg-ext">patchbomb</literal> prova a fornire un certo numero di variazioni attraverso le opzioni a riga di comando.</para>
  27.193 +      <itemizedlist>
  27.194 +	<listitem><para id="x_53c">Potete scrivere un oggetto per il messaggio introduttivo sulla riga di comando usando l&rsquo;opzione <option role="hg-ext-patchbomb-cmd-email-opt">-s</option>. Questa opzione accetta come argomento il testo da usare per l&rsquo;oggetto.</para>
  27.195 +	</listitem>
  27.196 +	<listitem><para id="x_53d">Per cambiare l&rsquo;indirizzo email da cui vengono spediti i messaggi usate l&rsquo;opzione <option role="hg-ext-patchbomb-cmd-email-opt">-f</option>. Questa opzione accetta come argomento l&rsquo;indirizzo email da usare.</para>
  27.197 +	</listitem>
  27.198 +	<listitem><para id="x_53e">Il comportamento predefinito è quello di inviare diff unificati (leggete la <xref linkend="sec:mq:patch"/> per una descrizione del formato), uno per ogni messaggio. Potete invece usare l&rsquo;opzione <option role="hg-ext-patchbomb-cmd-email-opt">-b</option> per inviare un bundle eseguibile.</para>
  27.199 +	</listitem>
  27.200 +	<listitem><para id="x_53f">I diff unificati sono normalmente preceduti da un&rsquo;intestazione di metadati. Potete ometterla e inviare diff disadorni con l&rsquo;opzione <option role="hg-ext-patchbomb-cmd-email-opt">--plain</option>.</para>
  27.201 +	</listitem>
  27.202 +	<listitem><para id="x_540">I diff vengono normalmente spediti <quote>in linea</quote>, nella stessa parte del corpo che contiene la descrizione della patch. Questo è il modo più facile per consentire al più ampio numero di lettori di rispondere citando parti di un diff, dato che alcuni client email citeranno soltanto la prima parte MIME del corpo di un messaggio. Se preferite inviare la descrizione e il diff in parti separate del corpo, usate l&rsquo;opzione <option role="hg-ext-patchbomb-cmd-email-opt">-a</option>.</para>
  27.203 +	</listitem>
  27.204 +	<listitem><para id="x_541">Invece di spedire messaggi email, potete salvarli in una cartella email in formato <literal>mbox</literal> usando l&rsquo;opzione <option role="hg-ext-patchbomb-cmd-email-opt">-m</option>. Questa opzione accetta come argomento il nome del file su cui scrivere.</para>
  27.205 +	</listitem>
  27.206 +	<listitem><para id="x_542">Se preferite aggiungere un riepilogo nel formato del comando <command>diffstat</command> a ogni patch e uno al messaggio introduttivo, usate l&rsquo;opzione <option role="hg-ext-patchbomb-cmd-email-opt">-d</option>. Il comando <command>diffstat</command> mostra una tabella contenente il nome di ogni file coinvolto nella patch, il numero di righe modificate e un istogramma che illustra quante modifiche sono state apportate a ogni file. Questo riepilogo offre a chi legge una visione qualitativa della complessità di una patch.</para>
  27.207 +	</listitem>
  27.208 +  </itemizedlist>
  27.209 +
  27.210 +    </sect2>
  27.211 +  </sect1>
  27.212 +</chapter>
    28.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    28.2 +++ b/it/examples/auto-snippets.xml	Fri Sep 04 16:33:35 2009 +0200
    28.3 @@ -0,0 +1,276 @@
    28.4 +<!ENTITY ch06-apache-config.lst SYSTEM "ch06-apache-config.lst.it">
    28.5 +<!ENTITY ch09-check_whitespace.py.lst SYSTEM "ch09-check_whitespace.py.lst.it">
    28.6 +<!ENTITY ch10-bugzilla-config.lst SYSTEM "ch10-bugzilla-config.lst.it">
    28.7 +<!ENTITY ch10-notify-config-mail.lst SYSTEM "ch10-notify-config-mail.lst.it">
    28.8 +<!ENTITY ch10-notify-config.lst SYSTEM "ch10-notify-config.lst.it">
    28.9 +<!ENTITY interaction.backout.init SYSTEM "backout.init.it">
   28.10 +<!ENTITY interaction.backout.manual.backout SYSTEM "backout.manual.backout.it">
   28.11 +<!ENTITY interaction.backout.manual.cat SYSTEM "backout.manual.cat.it">
   28.12 +<!ENTITY interaction.backout.manual.clone SYSTEM "backout.manual.clone.it">
   28.13 +<!ENTITY interaction.backout.manual.heads SYSTEM "backout.manual.heads.it">
   28.14 +<!ENTITY interaction.backout.manual.log SYSTEM "backout.manual.log.it">
   28.15 +<!ENTITY interaction.backout.manual.merge SYSTEM "backout.manual.merge.it">
   28.16 +<!ENTITY interaction.backout.manual.parents SYSTEM "backout.manual.parents.it">
   28.17 +<!ENTITY interaction.backout.non-tip.backout SYSTEM "backout.non-tip.backout.it">
   28.18 +<!ENTITY interaction.backout.non-tip.cat SYSTEM "backout.non-tip.cat.it">
   28.19 +<!ENTITY interaction.backout.non-tip.clone SYSTEM "backout.non-tip.clone.it">
   28.20 +<!ENTITY interaction.backout.simple SYSTEM "backout.simple.it">
   28.21 +<!ENTITY interaction.backout.simple.log SYSTEM "backout.simple.log.it">
   28.22 +<!ENTITY interaction.bisect.commits SYSTEM "bisect.commits.it">
   28.23 +<!ENTITY interaction.bisect.help SYSTEM "bisect.help.it">
   28.24 +<!ENTITY interaction.bisect.init SYSTEM "bisect.init.it">
   28.25 +<!ENTITY interaction.bisect.search.bad-init SYSTEM "bisect.search.bad-init.it">
   28.26 +<!ENTITY interaction.bisect.search.good-init SYSTEM "bisect.search.good-init.it">
   28.27 +<!ENTITY interaction.bisect.search.init SYSTEM "bisect.search.init.it">
   28.28 +<!ENTITY interaction.bisect.search.mytest SYSTEM "bisect.search.mytest.it">
   28.29 +<!ENTITY interaction.bisect.search.reset SYSTEM "bisect.search.reset.it">
   28.30 +<!ENTITY interaction.bisect.search.rest SYSTEM "bisect.search.rest.it">
   28.31 +<!ENTITY interaction.bisect.search.step1 SYSTEM "bisect.search.step1.it">
   28.32 +<!ENTITY interaction.bisect.search.step2 SYSTEM "bisect.search.step2.it">
   28.33 +<!ENTITY interaction.branch-named.branch SYSTEM "branch-named.branch.it">
   28.34 +<!ENTITY interaction.branch-named.branches SYSTEM "branch-named.branches.it">
   28.35 +<!ENTITY interaction.branch-named.commit SYSTEM "branch-named.commit.it">
   28.36 +<!ENTITY interaction.branch-named.create SYSTEM "branch-named.create.it">
   28.37 +<!ENTITY interaction.branch-named.foo-commit SYSTEM "branch-named.foo-commit.it">
   28.38 +<!ENTITY interaction.branch-named.merge SYSTEM "branch-named.merge.it">
   28.39 +<!ENTITY interaction.branch-named.parents SYSTEM "branch-named.parents.it">
   28.40 +<!ENTITY interaction.branch-named.rebranch SYSTEM "branch-named.rebranch.it">
   28.41 +<!ENTITY interaction.branch-named.status SYSTEM "branch-named.status.it">
   28.42 +<!ENTITY interaction.branch-named.update-bar SYSTEM "results/branch-named.update-bar.lxo">
   28.43 +<!ENTITY interaction.branch-named.update-nothing SYSTEM "branch-named.update-nothing.it">
   28.44 +<!ENTITY interaction.branch-named.update-switchy SYSTEM "branch-named.update-switchy.it">
   28.45 +<!ENTITY interaction.branch-repo.bugfix SYSTEM "branch-repo.bugfix.it">
   28.46 +<!ENTITY interaction.branch-repo.clone SYSTEM "branch-repo.clone.it">
   28.47 +<!ENTITY interaction.branch-repo.merge SYSTEM "branch-repo.merge.it">
   28.48 +<!ENTITY interaction.branch-repo.new SYSTEM "branch-repo.new.it">
   28.49 +<!ENTITY interaction.branch-repo.pull SYSTEM "branch-repo.pull.it">
   28.50 +<!ENTITY interaction.branch-repo.tag SYSTEM "branch-repo.tag.it">
   28.51 +<!ENTITY interaction.branching.clone SYSTEM "branching.clone.it">
   28.52 +<!ENTITY interaction.branching.init SYSTEM "branching.init.it">
   28.53 +<!ENTITY interaction.branching.main SYSTEM "branching.main.it">
   28.54 +<!ENTITY interaction.branching.merge SYSTEM "branching.merge.it">
   28.55 +<!ENTITY interaction.branching.stable SYSTEM "branching.stable.it">
   28.56 +<!ENTITY interaction.branching.tag SYSTEM "branching.tag.it">
   28.57 +<!ENTITY interaction.branching.update SYSTEM "branching.update.it">
   28.58 +<!ENTITY interaction.ch01-new.add SYSTEM "ch01-new.add.it">
   28.59 +<!ENTITY interaction.ch01-new.commit SYSTEM "ch01-new.commit.it">
   28.60 +<!ENTITY interaction.ch01-new.init SYSTEM "ch01-new.init.it">
   28.61 +<!ENTITY interaction.ch01-new.ls SYSTEM "ch01-new.ls.it">
   28.62 +<!ENTITY interaction.ch01-new.ls2 SYSTEM "ch01-new.ls2.it">
   28.63 +<!ENTITY interaction.ch02-rename.alice SYSTEM "results/ch02-rename.alice.lxo">
   28.64 +<!ENTITY interaction.ch02-rename.bob SYSTEM "results/ch02-rename.bob.lxo">
   28.65 +<!ENTITY interaction.ch02-rename.clone SYSTEM "results/ch02-rename.clone.lxo">
   28.66 +<!ENTITY interaction.ch02-rename.clone2 SYSTEM "results/ch02-rename.clone2.lxo">
   28.67 +<!ENTITY interaction.ch02-rename.init SYSTEM "results/ch02-rename.init.lxo">
   28.68 +<!ENTITY interaction.ch02-rename.merge SYSTEM "results/ch02-rename.merge.lxo">
   28.69 +<!ENTITY interaction.ch02-rename.merge2 SYSTEM "results/ch02-rename.merge2.lxo">
   28.70 +<!ENTITY interaction.ch02-rename.status SYSTEM "results/ch02-rename.status.lxo">
   28.71 +<!ENTITY interaction.ch02-rename.status2 SYSTEM "results/ch02-rename.status2.lxo">
   28.72 +<!ENTITY interaction.ch04-diff.chmod SYSTEM "ch04-diff.chmod.it">
   28.73 +<!ENTITY interaction.ch04-diff.chmod.git SYSTEM "ch04-diff.chmod.git.it">
   28.74 +<!ENTITY interaction.ch04-diff.rename.basic SYSTEM "ch04-diff.rename.basic.it">
   28.75 +<!ENTITY interaction.ch04-diff.rename.git SYSTEM "ch04-diff.rename.git.it">
   28.76 +<!ENTITY interaction.ch04-rename.basic SYSTEM "ch04-rename.basic.it">
   28.77 +<!ENTITY interaction.ch04-resolve.cifail SYSTEM "ch04-resolve.cifail.it">
   28.78 +<!ENTITY interaction.ch04-resolve.export SYSTEM "ch04-resolve.export.it">
   28.79 +<!ENTITY interaction.ch04-resolve.heads SYSTEM "ch04-resolve.heads.it">
   28.80 +<!ENTITY interaction.ch04-resolve.init SYSTEM "ch04-resolve.init.it">
   28.81 +<!ENTITY interaction.ch04-resolve.left SYSTEM "ch04-resolve.left.it">
   28.82 +<!ENTITY interaction.ch04-resolve.list SYSTEM "ch04-resolve.list.it">
   28.83 +<!ENTITY interaction.ch04-resolve.merge SYSTEM "ch04-resolve.merge.it">
   28.84 +<!ENTITY interaction.ch04-resolve.pull SYSTEM "ch04-resolve.pull.it">
   28.85 +<!ENTITY interaction.ch04-resolve.right SYSTEM "ch04-resolve.right.it">
   28.86 +<!ENTITY interaction.ch09-hook.ws.better SYSTEM "ch09-hook.ws.better.it">
   28.87 +<!ENTITY interaction.ch09-hook.ws.simple SYSTEM "ch09-hook.ws.simple.it">
   28.88 +<!ENTITY interaction.ch10-multiline.go SYSTEM "ch10-multiline.go.it">
   28.89 +<!ENTITY interaction.ch10-multiline.orig.go SYSTEM "results/ch10-multiline.orig.go.lxo">
   28.90 +<!ENTITY interaction.ch11-qdelete.convert SYSTEM "ch11-qdelete.convert.it">
   28.91 +<!ENTITY interaction.ch11-qdelete.go SYSTEM "ch11-qdelete.go.it">
   28.92 +<!ENTITY interaction.ch11-qdelete.import SYSTEM "ch11-qdelete.import.it">
   28.93 +<!ENTITY interaction.cmdref.diff-p SYSTEM "results/cmdref.diff-p.lxo">
   28.94 +<!ENTITY interaction.daily.copy.after SYSTEM "daily.copy.after.it">
   28.95 +<!ENTITY interaction.daily.copy.cat SYSTEM "results/daily.copy.cat.lxo">
   28.96 +<!ENTITY interaction.daily.copy.clone SYSTEM "daily.copy.clone.it">
   28.97 +<!ENTITY interaction.daily.copy.copy SYSTEM "daily.copy.copy.it">
   28.98 +<!ENTITY interaction.daily.copy.dir-dest SYSTEM "daily.copy.dir-dest.it">
   28.99 +<!ENTITY interaction.daily.copy.dir-src SYSTEM "daily.copy.dir-src.it">
  28.100 +<!ENTITY interaction.daily.copy.dir-src-dest SYSTEM "daily.copy.dir-src-dest.it">
  28.101 +<!ENTITY interaction.daily.copy.init SYSTEM "daily.copy.init.it">
  28.102 +<!ENTITY interaction.daily.copy.merge SYSTEM "daily.copy.merge.it">
  28.103 +<!ENTITY interaction.daily.copy.orig.after SYSTEM "results/daily.copy.orig.after.lxo">
  28.104 +<!ENTITY interaction.daily.copy.orig.cat SYSTEM "results/daily.copy.orig.cat.lxo">
  28.105 +<!ENTITY interaction.daily.copy.orig.clone SYSTEM "results/daily.copy.orig.clone.lxo">
  28.106 +<!ENTITY interaction.daily.copy.orig.copy SYSTEM "results/daily.copy.orig.copy.lxo">
  28.107 +<!ENTITY interaction.daily.copy.orig.dir-dest SYSTEM "results/daily.copy.orig.dir-dest.lxo">
  28.108 +<!ENTITY interaction.daily.copy.orig.dir-src SYSTEM "results/daily.copy.orig.dir-src.lxo">
  28.109 +<!ENTITY interaction.daily.copy.orig.dir-src-dest SYSTEM "results/daily.copy.orig.dir-src-dest.lxo">
  28.110 +<!ENTITY interaction.daily.copy.orig.init SYSTEM "results/daily.copy.orig.init.lxo">
  28.111 +<!ENTITY interaction.daily.copy.orig.merge SYSTEM "results/daily.copy.orig.merge.lxo">
  28.112 +<!ENTITY interaction.daily.copy.orig.other SYSTEM "results/daily.copy.orig.other.lxo">
  28.113 +<!ENTITY interaction.daily.copy.orig.simple SYSTEM "results/daily.copy.orig.simple.lxo">
  28.114 +<!ENTITY interaction.daily.copy.orig.status SYSTEM "results/daily.copy.orig.status.lxo">
  28.115 +<!ENTITY interaction.daily.copy.orig.status-copy SYSTEM "results/daily.copy.orig.status-copy.lxo">
  28.116 +<!ENTITY interaction.daily.copy.other SYSTEM "daily.copy.other.it">
  28.117 +<!ENTITY interaction.daily.copy.simple SYSTEM "daily.copy.simple.it">
  28.118 +<!ENTITY interaction.daily.copy.status SYSTEM "daily.copy.status.it">
  28.119 +<!ENTITY interaction.daily.copy.status-copy SYSTEM "daily.copy.status-copy.it">
  28.120 +<!ENTITY interaction.daily.files.add SYSTEM "daily.files.add.it">
  28.121 +<!ENTITY interaction.daily.files.add-dir SYSTEM "daily.files.add-dir.it">
  28.122 +<!ENTITY interaction.daily.files.addremove SYSTEM "daily.files.addremove.it">
  28.123 +<!ENTITY interaction.daily.files.commit-addremove SYSTEM "daily.files.commit-addremove.it">
  28.124 +<!ENTITY interaction.daily.files.hidden SYSTEM "daily.files.hidden.it">
  28.125 +<!ENTITY interaction.daily.files.missing SYSTEM "daily.files.missing.it">
  28.126 +<!ENTITY interaction.daily.files.recover-missing SYSTEM "daily.files.recover-missing.it">
  28.127 +<!ENTITY interaction.daily.files.remove SYSTEM "daily.files.remove.it">
  28.128 +<!ENTITY interaction.daily.files.remove-after SYSTEM "daily.files.remove-after.it">
  28.129 +<!ENTITY interaction.daily.rename.rename SYSTEM "daily.rename.rename.it">
  28.130 +<!ENTITY interaction.daily.rename.status SYSTEM "daily.rename.status.it">
  28.131 +<!ENTITY interaction.daily.rename.status-copy SYSTEM "daily.rename.status-copy.it">
  28.132 +<!ENTITY interaction.daily.revert.add SYSTEM "daily.revert.add.it">
  28.133 +<!ENTITY interaction.daily.revert.copy SYSTEM "daily.revert.copy.it">
  28.134 +<!ENTITY interaction.daily.revert.missing SYSTEM "daily.revert.missing.it">
  28.135 +<!ENTITY interaction.daily.revert.modify SYSTEM "daily.revert.modify.it">
  28.136 +<!ENTITY interaction.daily.revert.remove SYSTEM "daily.revert.remove.it">
  28.137 +<!ENTITY interaction.daily.revert.rename SYSTEM "results/daily.revert.rename.lxo">
  28.138 +<!ENTITY interaction.daily.revert.rename-orig SYSTEM "results/daily.revert.rename-orig.lxo">
  28.139 +<!ENTITY interaction.daily.revert.status SYSTEM "daily.revert.status.it">
  28.140 +<!ENTITY interaction.daily.revert.unmodify SYSTEM "daily.revert.unmodify.it">
  28.141 +<!ENTITY interaction.extdiff.diff SYSTEM "extdiff.diff.it">
  28.142 +<!ENTITY interaction.extdiff.extdiff SYSTEM "extdiff.extdiff.it">
  28.143 +<!ENTITY interaction.extdiff.extdiff-ctx SYSTEM "extdiff.extdiff-ctx.it">
  28.144 +<!ENTITY interaction.filenames.dirs SYSTEM "filenames.dirs.it">
  28.145 +<!ENTITY interaction.filenames.files SYSTEM "filenames.files.it">
  28.146 +<!ENTITY interaction.filenames.filter.exclude SYSTEM "filenames.filter.exclude.it">
  28.147 +<!ENTITY interaction.filenames.filter.include SYSTEM "filenames.filter.include.it">
  28.148 +<!ENTITY interaction.filenames.glob.group SYSTEM "filenames.glob.group.it">
  28.149 +<!ENTITY interaction.filenames.glob.question SYSTEM "filenames.glob.question.it">
  28.150 +<!ENTITY interaction.filenames.glob.range SYSTEM "filenames.glob.range.it">
  28.151 +<!ENTITY interaction.filenames.glob.star SYSTEM "filenames.glob.star.it">
  28.152 +<!ENTITY interaction.filenames.glob.star-starstar SYSTEM "filenames.glob.star-starstar.it">
  28.153 +<!ENTITY interaction.filenames.glob.starstar SYSTEM "filenames.glob.starstar.it">
  28.154 +<!ENTITY interaction.filenames.wdir-relname SYSTEM "filenames.wdir-relname.it">
  28.155 +<!ENTITY interaction.filenames.wdir-subdir SYSTEM "filenames.wdir-subdir.it">
  28.156 +<!ENTITY interaction.hook.msglen.go SYSTEM "hook.msglen.go.it">
  28.157 +<!ENTITY interaction.hook.simple.ext SYSTEM "hook.simple.ext.it">
  28.158 +<!ENTITY interaction.hook.simple.init SYSTEM "hook.simple.init.it">
  28.159 +<!ENTITY interaction.hook.simple.pretxncommit SYSTEM "hook.simple.pretxncommit.it">
  28.160 +<!ENTITY interaction.issue29.go SYSTEM "issue29.go.it">
  28.161 +<!ENTITY interaction.mq.dodiff.diff SYSTEM "mq.dodiff.diff.it">
  28.162 +<!ENTITY interaction.mq.guards.init SYSTEM "mq.guards.init.it">
  28.163 +<!ENTITY interaction.mq.guards.qguard SYSTEM "mq.guards.qguard.it">
  28.164 +<!ENTITY interaction.mq.guards.qguard.neg SYSTEM "mq.guards.qguard.neg.it">
  28.165 +<!ENTITY interaction.mq.guards.qguard.pos SYSTEM "mq.guards.qguard.pos.it">
  28.166 +<!ENTITY interaction.mq.guards.qselect.cat SYSTEM "mq.guards.qselect.cat.it">
  28.167 +<!ENTITY interaction.mq.guards.qselect.error SYSTEM "mq.guards.qselect.error.it">
  28.168 +<!ENTITY interaction.mq.guards.qselect.foo SYSTEM "mq.guards.qselect.foo.it">
  28.169 +<!ENTITY interaction.mq.guards.qselect.foobar SYSTEM "mq.guards.qselect.foobar.it">
  28.170 +<!ENTITY interaction.mq.guards.qselect.qpush SYSTEM "mq.guards.qselect.qpush.it">
  28.171 +<!ENTITY interaction.mq.guards.qselect.quux SYSTEM "mq.guards.qselect.quux.it">
  28.172 +<!ENTITY interaction.mq.guards.series SYSTEM "mq.guards.series.it">
  28.173 +<!ENTITY interaction.mq.id.lxoput SYSTEM "results/mq.id.lxoput.lxo">
  28.174 +<!ENTITY interaction.mq.id.output SYSTEM "mq.id.output.it">
  28.175 +<!ENTITY interaction.mq.qinit-help.help SYSTEM "mq.qinit-help.help.it">
  28.176 +<!ENTITY interaction.mq.tarball.download SYSTEM "mq.tarball.download.it">
  28.177 +<!ENTITY interaction.mq.tarball.newsource SYSTEM "mq.tarball.newsource.it">
  28.178 +<!ENTITY interaction.mq.tarball.qinit SYSTEM "mq.tarball.qinit.it">
  28.179 +<!ENTITY interaction.mq.tarball.repush SYSTEM "mq.tarball.repush.it">
  28.180 +<!ENTITY interaction.mq.tools.lsdiff SYSTEM "mq.tools.lsdiff.it">
  28.181 +<!ENTITY interaction.mq.tools.tools SYSTEM "mq.tools.tools.it">
  28.182 +<!ENTITY interaction.mq.tutorial.add SYSTEM "mq.tutorial.add.it">
  28.183 +<!ENTITY interaction.mq.tutorial.qinit SYSTEM "mq.tutorial.qinit.it">
  28.184 +<!ENTITY interaction.mq.tutorial.qnew SYSTEM "mq.tutorial.qnew.it">
  28.185 +<!ENTITY interaction.mq.tutorial.qnew2 SYSTEM "mq.tutorial.qnew2.it">
  28.186 +<!ENTITY interaction.mq.tutorial.qpop SYSTEM "mq.tutorial.qpop.it">
  28.187 +<!ENTITY interaction.mq.tutorial.qpush-a SYSTEM "mq.tutorial.qpush-a.it">
  28.188 +<!ENTITY interaction.mq.tutorial.qrefresh SYSTEM "mq.tutorial.qrefresh.it">
  28.189 +<!ENTITY interaction.mq.tutorial.qrefresh2 SYSTEM "mq.tutorial.qrefresh2.it">
  28.190 +<!ENTITY interaction.mq.tutorial.qseries SYSTEM "mq.tutorial.qseries.it">
  28.191 +<!ENTITY interaction.rename.divergent.clone SYSTEM "rename.divergent.clone.it">
  28.192 +<!ENTITY interaction.rename.divergent.merge SYSTEM "rename.divergent.merge.it">
  28.193 +<!ENTITY interaction.rename.divergent.rename.anne SYSTEM "rename.divergent.rename.anne.it">
  28.194 +<!ENTITY interaction.rename.divergent.rename.bob SYSTEM "rename.divergent.rename.bob.it">
  28.195 +<!ENTITY interaction.rollback.add SYSTEM "rollback.add.it">
  28.196 +<!ENTITY interaction.rollback.commit SYSTEM "rollback.commit.it">
  28.197 +<!ENTITY interaction.rollback.rollback SYSTEM "rollback.rollback.it">
  28.198 +<!ENTITY interaction.rollback.status SYSTEM "rollback.status.it">
  28.199 +<!ENTITY interaction.rollback.tip SYSTEM "results/rollback.tip.lxo">
  28.200 +<!ENTITY interaction.rollback.twice SYSTEM "rollback.twice.it">
  28.201 +<!ENTITY interaction.tag.init SYSTEM "tag.init.it">
  28.202 +<!ENTITY interaction.tag.log SYSTEM "tag.log.it">
  28.203 +<!ENTITY interaction.tag.log.v1.0 SYSTEM "tag.log.v1.0.it">
  28.204 +<!ENTITY interaction.tag.remove SYSTEM "tag.remove.it">
  28.205 +<!ENTITY interaction.tag.replace SYSTEM "tag.replace.it">
  28.206 +<!ENTITY interaction.tag.tag SYSTEM "tag.tag.it">
  28.207 +<!ENTITY interaction.tag.tags SYSTEM "tag.tags.it">
  28.208 +<!ENTITY interaction.tag.tip SYSTEM "tag.tip.it">
  28.209 +<!ENTITY interaction.template.simple.changelog SYSTEM "template.simple.changelog.it">
  28.210 +<!ENTITY interaction.template.simple.combine SYSTEM "template.simple.combine.it">
  28.211 +<!ENTITY interaction.template.simple.compact SYSTEM "template.simple.compact.it">
  28.212 +<!ENTITY interaction.template.simple.datekeyword SYSTEM "template.simple.datekeyword.it">
  28.213 +<!ENTITY interaction.template.simple.keywords SYSTEM "template.simple.keywords.it">
  28.214 +<!ENTITY interaction.template.simple.manyfilters SYSTEM "template.simple.manyfilters.it">
  28.215 +<!ENTITY interaction.template.simple.normal SYSTEM "template.simple.normal.it">
  28.216 +<!ENTITY interaction.template.simple.rev SYSTEM "template.simple.rev.it">
  28.217 +<!ENTITY interaction.template.simple.simplest SYSTEM "template.simple.simplest.it">
  28.218 +<!ENTITY interaction.template.simple.simplesub SYSTEM "template.simple.simplesub.it">
  28.219 +<!ENTITY interaction.template.svnstyle.id SYSTEM "template.svnstyle.id.it">
  28.220 +<!ENTITY interaction.template.svnstyle.result SYSTEM "results/template.svnstyle.result.lxo">
  28.221 +<!ENTITY interaction.template.svnstyle.short SYSTEM "template.svnstyle.short.it">
  28.222 +<!ENTITY interaction.template.svnstyle.simplest SYSTEM "results/template.svnstyle.simplest.lxo">
  28.223 +<!ENTITY interaction.template.svnstyle.style SYSTEM "template.svnstyle.style.it">
  28.224 +<!ENTITY interaction.template.svnstyle.syntax.error SYSTEM "template.svnstyle.syntax.error.it">
  28.225 +<!ENTITY interaction.template.svnstyle.syntax.input SYSTEM "template.svnstyle.syntax.input.it">
  28.226 +<!ENTITY interaction.template.svnstyle.template SYSTEM "template.svnstyle.template.it">
  28.227 +<!ENTITY interaction.tour-merge-conflict.commit SYSTEM "tour-merge-conflict.commit.it">
  28.228 +<!ENTITY interaction.tour-merge-conflict.cousin SYSTEM "tour-merge-conflict.cousin.it">
  28.229 +<!ENTITY interaction.tour-merge-conflict.merge SYSTEM "tour-merge-conflict.merge.it">
  28.230 +<!ENTITY interaction.tour-merge-conflict.pull SYSTEM "tour-merge-conflict.pull.it">
  28.231 +<!ENTITY interaction.tour-merge-conflict.son SYSTEM "tour-merge-conflict.son.it">
  28.232 +<!ENTITY interaction.tour-merge-conflict.wife SYSTEM "tour-merge-conflict.wife.it">
  28.233 +<!ENTITY interaction.tour.cat1 SYSTEM "tour.cat1.it">
  28.234 +<!ENTITY interaction.tour.cat2 SYSTEM "tour.cat2.it">
  28.235 +<!ENTITY interaction.tour.clone SYSTEM "tour.clone.it">
  28.236 +<!ENTITY interaction.tour.clone-pull SYSTEM "tour.clone-pull.it">
  28.237 +<!ENTITY interaction.tour.clone-push SYSTEM "tour.clone-push.it">
  28.238 +<!ENTITY interaction.tour.commit SYSTEM "tour.commit.it">
  28.239 +<!ENTITY interaction.tour.diff SYSTEM "tour.diff.it">
  28.240 +<!ENTITY interaction.tour.help SYSTEM "tour.help.it">
  28.241 +<!ENTITY interaction.tour.incoming SYSTEM "tour.incoming.it">
  28.242 +<!ENTITY interaction.tour.log SYSTEM "tour.log.it">
  28.243 +<!ENTITY interaction.tour.log-r SYSTEM "tour.log-r.it">
  28.244 +<!ENTITY interaction.tour.log-v SYSTEM "tour.log-v.it">
  28.245 +<!ENTITY interaction.tour.log-vp SYSTEM "tour.log-vp.it">
  28.246 +<!ENTITY interaction.tour.log.range SYSTEM "tour.log.range.it">
  28.247 +<!ENTITY interaction.tour.ls SYSTEM "tour.ls.it">
  28.248 +<!ENTITY interaction.tour.ls-a SYSTEM "tour.ls-a.it">
  28.249 +<!ENTITY interaction.tour.lxogoing SYSTEM "results/tour.lxogoing.lxo">
  28.250 +<!ENTITY interaction.tour.lxogoing.net SYSTEM "results/tour.lxogoing.net.lxo">
  28.251 +<!ENTITY interaction.tour.merge.cat SYSTEM "results/tour.merge.cat.lxo">
  28.252 +<!ENTITY interaction.tour.merge.cat1 SYSTEM "tour.merge.cat1.it">
  28.253 +<!ENTITY interaction.tour.merge.cat2 SYSTEM "tour.merge.cat2.it">
  28.254 +<!ENTITY interaction.tour.merge.clone SYSTEM "tour.merge.clone.it">
  28.255 +<!ENTITY interaction.tour.merge.commit SYSTEM "tour.merge.commit.it">
  28.256 +<!ENTITY interaction.tour.merge.dummy1 SYSTEM "results/tour.merge.dummy1.lxo">
  28.257 +<!ENTITY interaction.tour.merge.dummy2 SYSTEM "results/tour.merge.dummy2.lxo">
  28.258 +<!ENTITY interaction.tour.merge.dummy3 SYSTEM "results/tour.merge.dummy3.lxo">
  28.259 +<!ENTITY interaction.tour.merge.dummy4 SYSTEM "results/tour.merge.dummy4.lxo">
  28.260 +<!ENTITY interaction.tour.merge.heads SYSTEM "tour.merge.heads.it">
  28.261 +<!ENTITY interaction.tour.merge.merge SYSTEM "tour.merge.merge.it">
  28.262 +<!ENTITY interaction.tour.merge.parents SYSTEM "tour.merge.parents.it">
  28.263 +<!ENTITY interaction.tour.merge.pull SYSTEM "tour.merge.pull.it">
  28.264 +<!ENTITY interaction.tour.merge.tip SYSTEM "tour.merge.tip.it">
  28.265 +<!ENTITY interaction.tour.merge.update SYSTEM "tour.merge.update.it">
  28.266 +<!ENTITY interaction.tour.older SYSTEM "tour.older.it">
  28.267 +<!ENTITY interaction.tour.outgoing SYSTEM "tour.outgoing.it">
  28.268 +<!ENTITY interaction.tour.outgoing.net SYSTEM "tour.outgoing.net.it">
  28.269 +<!ENTITY interaction.tour.parents SYSTEM "tour.parents.it">
  28.270 +<!ENTITY interaction.tour.pull SYSTEM "tour.pull.it">
  28.271 +<!ENTITY interaction.tour.push SYSTEM "tour.push.it">
  28.272 +<!ENTITY interaction.tour.push.net SYSTEM "tour.push.net.it">
  28.273 +<!ENTITY interaction.tour.push.nothing SYSTEM "tour.push.nothing.it">
  28.274 +<!ENTITY interaction.tour.reclone SYSTEM "tour.reclone.it">
  28.275 +<!ENTITY interaction.tour.sed SYSTEM "results/tour.sed.lxo">
  28.276 +<!ENTITY interaction.tour.status SYSTEM "tour.status.it">
  28.277 +<!ENTITY interaction.tour.tip SYSTEM "tour.tip.it">
  28.278 +<!ENTITY interaction.tour.update SYSTEM "tour.update.it">
  28.279 +<!ENTITY interaction.tour.version SYSTEM "tour.version.it">
    29.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    29.2 +++ b/it/examples/backout.init.it	Fri Sep 04 16:33:35 2009 +0200
    29.3 @@ -0,0 +1,10 @@
    29.4 +<!-- BEGIN backout.init -->
    29.5 +<screen><prompt>$</prompt> <userinput>hg init miorepo</userinput>
    29.6 +<prompt>$</prompt> <userinput>cd miorepo</userinput>
    29.7 +<prompt>$</prompt> <userinput>echo prima modifica &gt;&gt; miofile</userinput>
    29.8 +<prompt>$</prompt> <userinput>hg add miofile</userinput>
    29.9 +<prompt>$</prompt> <userinput>hg commit -m "Prima modifica."</userinput>
   29.10 +<prompt>$</prompt> <userinput>echo seconda modifica &gt;&gt; miofile</userinput>
   29.11 +<prompt>$</prompt> <userinput>hg commit -m "Seconda modifica."</userinput>
   29.12 +</screen>
   29.13 +<!-- END backout.init -->
    30.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    30.2 +++ b/it/examples/backout.manual.backout.it	Fri Sep 04 16:33:35 2009 +0200
    30.3 @@ -0,0 +1,11 @@
    30.4 +<!-- BEGIN backout.manual.backout -->
    30.5 +<screen><prompt>$</prompt> <userinput>echo terza modifica &gt;&gt; miofile</userinput>
    30.6 +<prompt>$</prompt> <userinput>hg commit -m "Terza modifica."</userinput>
    30.7 +<prompt>$</prompt> <userinput>hg backout -m "Ritira la seconda modifica." 1</userinput>
    30.8 +ripristino miofile
    30.9 +creata una nuova testa
   30.10 +il changeset 3:f3e79edd2b05 ritira il changeset 1:51969da8cdc5
   30.11 +il changeset che ha compiuto il ritiro è una nuova testa - ricordatevi di unire
   30.12 +(usate "backout --merge" se volete unire automaticamente)
   30.13 +</screen>
   30.14 +<!-- END backout.manual.backout -->
    31.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    31.2 +++ b/it/examples/backout.manual.cat.it	Fri Sep 04 16:33:35 2009 +0200
    31.3 @@ -0,0 +1,7 @@
    31.4 +<!-- BEGIN backout.manual.cat -->
    31.5 +<screen><prompt>$</prompt> <userinput>cat miofile</userinput>
    31.6 +prima modifica
    31.7 +seconda modifica
    31.8 +terza modifica
    31.9 +</screen>
   31.10 +<!-- END backout.manual.cat -->
    32.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    32.2 +++ b/it/examples/backout.manual.clone.it	Fri Sep 04 16:33:35 2009 +0200
    32.3 @@ -0,0 +1,13 @@
    32.4 +<!-- BEGIN backout.manual.clone -->
    32.5 +<screen><prompt>$</prompt> <userinput>cd ..</userinput>
    32.6 +<prompt>$</prompt> <userinput>hg clone -r1 miorepo nuovorepo</userinput>
    32.7 +richiedo tutte le modifiche
    32.8 +aggiungo i changeset
    32.9 +aggiungo i manifest
   32.10 +aggiungo i cambiamenti ai file
   32.11 +aggiunti 2 changeset con 2 cambiamenti a 1 file
   32.12 +aggiorno la directory di lavoro
   32.13 +1 file aggiornati, 0 file uniti, 0 file rimossi, 0 file irrisolti
   32.14 +<prompt>$</prompt> <userinput>cd nuovorepo</userinput>
   32.15 +</screen>
   32.16 +<!-- END backout.manual.clone -->
    33.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    33.2 +++ b/it/examples/backout.manual.heads.it	Fri Sep 04 16:33:35 2009 +0200
    33.3 @@ -0,0 +1,16 @@
    33.4 +<!-- BEGIN backout.manual.heads -->
    33.5 +<screen><prompt>$</prompt> <userinput>hg heads</userinput>
    33.6 +changeset:   3:f3e79edd2b05
    33.7 +tag:         tip
    33.8 +parent:      1:51969da8cdc5
    33.9 +user:        Bryan O'Sullivan &lt;bos@serpentine.com&gt;
   33.10 +date:        Fri Jun 05 15:48:47 2009 +0000
   33.11 +summary:     Ritira la seconda modifica.
   33.12 +
   33.13 +changeset:   2:629da9559a9e
   33.14 +user:        Bryan O'Sullivan &lt;bos@serpentine.com&gt;
   33.15 +date:        Fri Jun 05 15:48:46 2009 +0000
   33.16 +summary:     Terza modifica.
   33.17 +
   33.18 +</screen>
   33.19 +<!-- END backout.manual.heads -->
    34.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    34.2 +++ b/it/examples/backout.manual.log.it	Fri Sep 04 16:33:35 2009 +0200
    34.3 @@ -0,0 +1,16 @@
    34.4 +<!-- BEGIN backout.manual.log -->
    34.5 +<screen><prompt>$</prompt> <userinput>hg log --style compact</userinput>
    34.6 +3[tip]:1   f3e79edd2b05   2009-06-05 15:48 +0000   bos
    34.7 +  Ritira la seconda modifica.
    34.8 +
    34.9 +2   629da9559a9e   2009-06-05 15:48 +0000   bos
   34.10 +  Terza modifica.
   34.11 +
   34.12 +1   51969da8cdc5   2009-06-05 15:48 +0000   bos
   34.13 +  Seconda modifica.
   34.14 +
   34.15 +0   efd26e99cc79   2009-06-05 15:48 +0000   bos
   34.16 +  Prima modifica.
   34.17 +
   34.18 +</screen>
   34.19 +<!-- END backout.manual.log -->
    35.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    35.2 +++ b/it/examples/backout.manual.merge.it	Fri Sep 04 16:33:35 2009 +0200
    35.3 @@ -0,0 +1,11 @@
    35.4 +<!-- BEGIN backout.manual.merge -->
    35.5 +<screen><prompt>$</prompt> <userinput>hg merge</userinput>
    35.6 +unisco miofile
    35.7 +0 file aggiornati, 1 file uniti, 0 file rimossi, 0 file irrisolti
    35.8 +(unione tra rami, ricordatevi di eseguire il commit)
    35.9 +<prompt>$</prompt> <userinput>hg commit -m "Unisce il changeset che ha compiuto il ritiro con la punta precedente."</userinput>
   35.10 +<prompt>$</prompt> <userinput>cat miofile</userinput>
   35.11 +prima modifica
   35.12 +terza modifica
   35.13 +</screen>
   35.14 +<!-- END backout.manual.merge -->
    36.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    36.2 +++ b/it/examples/backout.manual.parents.it	Fri Sep 04 16:33:35 2009 +0200
    36.3 @@ -0,0 +1,9 @@
    36.4 +<!-- BEGIN backout.manual.parents -->
    36.5 +<screen><prompt>$</prompt> <userinput>hg parents</userinput>
    36.6 +changeset:   2:629da9559a9e
    36.7 +user:        Bryan O'Sullivan &lt;bos@serpentine.com&gt;
    36.8 +date:        Fri Jun 05 15:48:46 2009 +0000
    36.9 +summary:     Terza modifica.
   36.10 +
   36.11 +</screen>
   36.12 +<!-- END backout.manual.parents -->
    37.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    37.2 +++ b/it/examples/backout.non-tip.backout.it	Fri Sep 04 16:33:35 2009 +0200
    37.3 @@ -0,0 +1,13 @@
    37.4 +<!-- BEGIN backout.non-tip.backout -->
    37.5 +<screen><prompt>$</prompt> <userinput>echo terza modifica &gt;&gt; miofile</userinput>
    37.6 +<prompt>$</prompt> <userinput>hg commit -m "Terza modifica."</userinput>
    37.7 +<prompt>$</prompt> <userinput>hg backout --merge -m "Ritira la seconda modifica." 1</userinput>
    37.8 +ripristino miofile
    37.9 +creata una nuova testa
   37.10 +il changeset 3:af281715005d ritira il changeset 1:51969da8cdc5
   37.11 +unisco con il changeset 3:af281715005d
   37.12 +unisco miofile
   37.13 +0 file aggiornati, 1 file uniti, 0 file rimossi, 0 file irrisolti
   37.14 +(unione tra rami, ricordatevi di eseguire il commit)
   37.15 +</screen>
   37.16 +<!-- END backout.non-tip.backout -->
    38.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    38.2 +++ b/it/examples/backout.non-tip.cat.it	Fri Sep 04 16:33:35 2009 +0200
    38.3 @@ -0,0 +1,6 @@
    38.4 +<!-- BEGIN backout.non-tip.cat -->
    38.5 +<screen><prompt>$</prompt> <userinput>cat miofile</userinput>
    38.6 +prima modifica
    38.7 +terza modifica
    38.8 +</screen>
    38.9 +<!-- END backout.non-tip.cat -->
    39.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    39.2 +++ b/it/examples/backout.non-tip.clone.it	Fri Sep 04 16:33:35 2009 +0200
    39.3 @@ -0,0 +1,13 @@
    39.4 +<!-- BEGIN backout.non-tip.clone -->
    39.5 +<screen><prompt>$</prompt> <userinput>cd ..</userinput>
    39.6 +<prompt>$</prompt> <userinput>hg clone -r1 miorepo repo-non-di-punta</userinput>
    39.7 +richiedo tutte le modifiche
    39.8 +aggiungo i changeset
    39.9 +aggiungo i manifest
   39.10 +aggiungo i cambiamenti ai file
   39.11 +aggiunti 2 changeset con 2 cambiamenti a 1 file
   39.12 +aggiorno la directory di lavoro
   39.13 +1 file aggiornati, 0 file uniti, 0 file rimossi, 0 file irrisolti
   39.14 +<prompt>$</prompt> <userinput>cd repo-non-di-punta</userinput>
   39.15 +</screen>
   39.16 +<!-- END backout.non-tip.clone -->
    40.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    40.2 +++ b/it/examples/backout.simple.it	Fri Sep 04 16:33:35 2009 +0200
    40.3 @@ -0,0 +1,8 @@
    40.4 +<!-- BEGIN backout.simple -->
    40.5 +<screen><prompt>$</prompt> <userinput>hg backout -m "Ritira la seconda modifica." tip</userinput>
    40.6 +ripristino miofile
    40.7 +il changeset 2:a4abdbaa35f1 ritira il changeset 1:51969da8cdc5
    40.8 +<prompt>$</prompt> <userinput>cat miofile</userinput>
    40.9 +prima modifica
   40.10 +</screen>
   40.11 +<!-- END backout.simple -->
    41.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    41.2 +++ b/it/examples/backout.simple.log.it	Fri Sep 04 16:33:35 2009 +0200
    41.3 @@ -0,0 +1,13 @@
    41.4 +<!-- BEGIN backout.simple.log -->
    41.5 +<screen><prompt>$</prompt> <userinput>hg log --style compact</userinput>
    41.6 +2[tip]   a4abdbaa35f1   2009-06-05 15:48 +0000   bos
    41.7 +  Ritira la seconda modifica.
    41.8 +
    41.9 +1   51969da8cdc5   2009-06-05 15:48 +0000   bos
   41.10 +  Seconda modifica.
   41.11 +
   41.12 +0   efd26e99cc79   2009-06-05 15:48 +0000   bos
   41.13 +  Prima modifica.
   41.14 +
   41.15 +</screen>
   41.16 +<!-- END backout.simple.log -->
    42.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    42.2 +++ b/it/examples/bisect.commits.it	Fri Sep 04 16:33:35 2009 +0200
    42.3 @@ -0,0 +1,13 @@
    42.4 +<!-- BEGIN bisect.commits -->
    42.5 +<screen><prompt>$</prompt> <userinput>cambiamento_difettoso=22</userinput>
    42.6 +<prompt>$</prompt> <userinput>for (( i = 0; i &lt; 35; i++ )); do</userinput>
    42.7 +<prompt>></prompt> <userinput>  if [[ $i = $cambiamento_difettoso ]]; then</userinput>
    42.8 +<prompt>></prompt> <userinput>    echo 'ho un gub' &gt; miofile$i</userinput>
    42.9 +<prompt>></prompt> <userinput>    hg commit -q -A -m "Changeset difettoso."</userinput>
   42.10 +<prompt>></prompt> <userinput>  else</userinput>
   42.11 +<prompt>></prompt> <userinput>    echo 'niente da vedere, circolate' &gt; miofile$i</userinput>
   42.12 +<prompt>></prompt> <userinput>    hg commit -q -A -m "Changeset normale."</userinput>
   42.13 +<prompt>></prompt> <userinput>  fi</userinput>
   42.14 +<prompt>></prompt> <userinput>done</userinput>
   42.15 +</screen>
   42.16 +<!-- END bisect.commits -->
    43.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    43.2 +++ b/it/examples/bisect.help.it	Fri Sep 04 16:33:35 2009 +0200
    43.3 @@ -0,0 +1,40 @@
    43.4 +<!-- BEGIN bisect.help -->
    43.5 +<screen><prompt>$</prompt> <userinput>hg help bisect</userinput>
    43.6 +hg bisect [-gbsr] [-c CMD] [REV]
    43.7 +
    43.8 +ricerca di changeset tramite suddivisioni
    43.9 +
   43.10 +    Questo comando vi aiuta a cercare changeset che introducono problemi.
   43.11 +    Per usarlo, contrassegnate il changeset più recente che esibisce il
   43.12 +    problema come guasto, poi contrassegnate l'ultimo changeset libero dal
   43.13 +    problema come funzionante. La bisezione aggiornerà la vostra directory di
   43.14 +    lavoro a una revisione di collaudo (a meno che l'opzione --noupdate sia
   43.15 +    specificata). Una volta che avete effettuato i test, contrassegnate la
   43.16 +    directory di lavoro come guasta o funzionante e bisect la aggiornerà a
   43.17 +    un altro changeset candidato o vi comunicherà di aver trovato la revisione
   43.18 +    guasta.
   43.19 +
   43.20 +    Come scorciatoia, potete anche usare l'argomento revisione per
   43.21 +    contrassegnare una revisione come funzionante o guasta senza prima
   43.22 +    controllarla.
   43.23 +
   43.24 +    Se fornite un comando, verrà usato per operare la bisezione in modo
   43.25 +    automatico. Lo stato di uscita del comando verrà usato come indicatore per
   43.26 +    contrassegnare una revisione come guasta o funzionante. Nel caso lo stato
   43.27 +    di uscita sia 0 la revisione viene contrassegnata come funzionante; 125 -
   43.28 +    viene saltata; 127 (comando non trovato) - la bisezione verrà bloccata;
   43.29 +    qualsiasi altro stato maggiore di zero contrassegnerà la revisione come
   43.30 +    guasta.
   43.31 +
   43.32 +opzioni:
   43.33 +
   43.34 + -r --reset     inizializza lo stato della bisezione
   43.35 + -g --good      contrassegna un changeset come funzionante
   43.36 + -b --bad       contrassegna un changeset come guasto
   43.37 + -s --skip      salta il collaudo del changeset
   43.38 + -c --command   usa un comando per controllare lo stato del changeset
   43.39 + -U --noupdate  non aggiorna alla revisione da collaudare
   43.40 +
   43.41 +usate "hg -v help bisect" per vedere le opzioni globali
   43.42 +</screen>
   43.43 +<!-- END bisect.help -->
    44.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    44.2 +++ b/it/examples/bisect.init.it	Fri Sep 04 16:33:35 2009 +0200
    44.3 @@ -0,0 +1,5 @@
    44.4 +<!-- BEGIN bisect.init -->
    44.5 +<screen><prompt>$</prompt> <userinput>hg init miobug</userinput>
    44.6 +<prompt>$</prompt> <userinput>cd miobug</userinput>
    44.7 +</screen>
    44.8 +<!-- END bisect.init -->
    45.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    45.2 +++ b/it/examples/bisect.search.bad-init.it	Fri Sep 04 16:33:35 2009 +0200
    45.3 @@ -0,0 +1,4 @@
    45.4 +<!-- BEGIN tour.version -->
    45.5 +<screen><prompt>$</prompt> <userinput>hg bisect --bad</userinput>
    45.6 +</screen>
    45.7 +<!-- END tour.version -->
    46.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    46.2 +++ b/it/examples/bisect.search.good-init.it	Fri Sep 04 16:33:35 2009 +0200
    46.3 @@ -0,0 +1,6 @@
    46.4 +<!-- BEGIN bisect.search.good-init -->
    46.5 +<screen><prompt>$</prompt> <userinput>hg bisect --good 10</userinput>
    46.6 +Collaudo il changeset 22:b8789808fc48 (24 changeset rimanenti, ~4 test)
    46.7 +0 file aggiornati, 0 file uniti, 12 file rimossi, 0 file irrisolti
    46.8 +</screen>
    46.9 +<!-- END bisect.search.good-init -->
    47.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    47.2 +++ b/it/examples/bisect.search.init.it	Fri Sep 04 16:33:35 2009 +0200
    47.3 @@ -0,0 +1,4 @@
    47.4 +<!-- BEGIN bisect.search.init -->
    47.5 +<screen><prompt>$</prompt> <userinput>hg bisect --reset</userinput>
    47.6 +</screen>
    47.7 +<!-- END bisect.search.init -->
    48.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    48.2 +++ b/it/examples/bisect.search.mytest.it	Fri Sep 04 16:33:35 2009 +0200
    48.3 @@ -0,0 +1,15 @@
    48.4 +<!-- BEGIN bisect.search.mytest -->
    48.5 +<screen><prompt>$</prompt> <userinput>miotest() {</userinput>
    48.6 +<prompt>$</prompt> <userinput>  if grep -q 'ho un gub' *</userinput>
    48.7 +<prompt>></prompt> <userinput>  then</userinput>
    48.8 +<prompt>></prompt> <userinput>    contrassegno=bad</userinput>
    48.9 +<prompt>></prompt> <userinput>    risultato=guasta</userinput>
   48.10 +<prompt>></prompt> <userinput>  else</userinput>
   48.11 +<prompt>></prompt> <userinput>    contrassegno=good</userinput>
   48.12 +<prompt>></prompt> <userinput>    risultato=funzionante</userinput>
   48.13 +<prompt>></prompt> <userinput>  fi</userinput>
   48.14 +<prompt>></prompt> <userinput>  echo questa revisione è $risultato</userinput>
   48.15 +<prompt>></prompt> <userinput>  hg bisect --$contrassegno</userinput>
   48.16 +<prompt>></prompt> <userinput>}</userinput>
   48.17 +</screen>
   48.18 +<!-- END bisect.search.mytest -->
    49.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    49.2 +++ b/it/examples/bisect.search.reset.it	Fri Sep 04 16:33:35 2009 +0200
    49.3 @@ -0,0 +1,4 @@
    49.4 +<!-- BEGIN bisect.search.reset -->
    49.5 +<screen><prompt>$</prompt> <userinput>hg bisect --reset</userinput>
    49.6 +</screen>
    49.7 +<!-- END bisect.search.reset -->
    50.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    50.2 +++ b/it/examples/bisect.search.rest.it	Fri Sep 04 16:33:35 2009 +0200
    50.3 @@ -0,0 +1,18 @@
    50.4 +<!-- BEGIN bisect.search.rest -->
    50.5 +<screen><prompt>$</prompt> <userinput>miotest</userinput>
    50.6 +questa revisione è funzionante
    50.7 +Collaudo il changeset 20:bf7ea9a054e6 (3 changeset rimanenti, ~1 test)
    50.8 +1 file aggiornati, 0 file uniti, 0 file rimossi, 0 file irrisolti
    50.9 +<prompt>$</prompt> <userinput>miotest</userinput>
   50.10 +questa revisione è funzionante
   50.11 +Collaudo il changeset 21:921391dd45c1 (2 changeset rimanenti, ~1 test)
   50.12 +1 file aggiornati, 0 file uniti, 0 file rimossi, 0 file irrisolti
   50.13 +<prompt>$</prompt> <userinput>miotest</userinput>
   50.14 +questa revisione è funzionante
   50.15 +La prima revisione guasta è:
   50.16 +changeset:   22:b8789808fc48
   50.17 +utente:      Bryan O'Sullivan &lt;bos@serpentine.com&gt;
   50.18 +data:        Tue May 05 06:55:14 2009 +0000
   50.19 +sommario:    Changeset difettoso.
   50.20 +</screen>
   50.21 +<!-- END bisect.search.rest -->
    51.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    51.2 +++ b/it/examples/bisect.search.step1.it	Fri Sep 04 16:33:35 2009 +0200
    51.3 @@ -0,0 +1,14 @@
    51.4 +<!-- BEGIN bisect.search.step1 -->
    51.5 +<screen><prompt>$</prompt> <userinput>if grep -q 'ho un gub' *</userinput>
    51.6 +<prompt>></prompt> <userinput>then</userinput>
    51.7 +<prompt>></prompt> <userinput>  risultato=bad</userinput>
    51.8 +<prompt>></prompt> <userinput>else</userinput>
    51.9 +<prompt>></prompt> <userinput>  risultato=good</userinput>
   51.10 +<prompt>></prompt> <userinput>fi</userinput>
   51.11 +<prompt>$</prompt> <userinput>echo il contrassegno di questa revisione è: $risultato</userinput>
   51.12 +il contrassegno di questa revisione è bad
   51.13 +<prompt>$</prompt> <userinput>hg bisect --$risultato</userinput>
   51.14 +Collaudo il changeset 16:e61fdddff53e (12 changeset rimanenti, ~3 test)
   51.15 +0 file aggiornati, 0 file uniti, 6 file rimossi, 0 file irrisolti
   51.16 +</screen>
   51.17 +<!-- END bisect.search.step1 -->
    52.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    52.2 +++ b/it/examples/bisect.search.step2.it	Fri Sep 04 16:33:35 2009 +0200
    52.3 @@ -0,0 +1,7 @@
    52.4 +<!-- BEGIN bisect.search.step2 -->
    52.5 +<screen><prompt>$</prompt> <userinput>miotest</userinput>
    52.6 +questa revisione è funzionante
    52.7 +Collaudo il changeset 19:706df39b003b (6 changeset rimanenti, ~2 test)
    52.8 +3 file aggiornati, 0 file uniti, 0 file rimossi, 0 file irrisolti
    52.9 +</screen>
   52.10 +<!-- END bisect.search.step2 -->
    53.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    53.2 +++ b/it/examples/branch-named.branch.it	Fri Sep 04 16:33:35 2009 +0200
    53.3 @@ -0,0 +1,5 @@
    53.4 +<!-- BEGIN branch-named.branch -->
    53.5 +<screen><prompt>$</prompt> <userinput>hg branch</userinput>
    53.6 +default
    53.7 +</screen>
    53.8 +<!-- END branch-named.branch -->
    54.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    54.2 +++ b/it/examples/branch-named.branches.it	Fri Sep 04 16:33:35 2009 +0200
    54.3 @@ -0,0 +1,12 @@
    54.4 +<!-- BEGIN branch-named.branches -->
    54.5 +<screen><prompt>$</prompt> <userinput>hg tip</userinput>
    54.6 +changeset:   0:fc8fb1089cc0
    54.7 +etichetta:   tip
    54.8 +utente:      Bryan O'Sullivan &lt;bos@serpentine.com&gt;
    54.9 +data:        Fri Jun 05 15:48:56 2009 +0000
   54.10 +sommario:    Commit iniziale.
   54.11 +
   54.12 +<prompt>$</prompt> <userinput>hg branches</userinput>
   54.13 +default                        0:fc8fb1089cc0
   54.14 +</screen>
   54.15 +<!-- END branch-named.branches -->
    55.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    55.2 +++ b/it/examples/branch-named.commit.it	Fri Sep 04 16:33:35 2009 +0200
    55.3 @@ -0,0 +1,13 @@
    55.4 +<!-- BEGIN branch-named.commit -->
    55.5 +<screen><prompt>$</prompt> <userinput>echo 'ancora ciao' &gt;&gt; miofile</userinput>
    55.6 +<prompt>$</prompt> <userinput>hg commit -m "Secondo commit."</userinput>
    55.7 +<prompt>$</prompt> <userinput>hg tip</userinput>
    55.8 +changeset:   1:b15761055392
    55.9 +ramo:        foo
   55.10 +etichetta:   tip
   55.11 +utente:      Bryan O'Sullivan &lt;bos@serpentine.com&gt;
   55.12 +data:        Fri Jun 05 15:48:59 2009 +0000
   55.13 +sommario:    Secondo commit.
   55.14 +
   55.15 +</screen>
   55.16 +<!-- END branch-named.commit -->
    56.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    56.2 +++ b/it/examples/branch-named.create.it	Fri Sep 04 16:33:35 2009 +0200
    56.3 @@ -0,0 +1,7 @@
    56.4 +<!-- BEGIN branch-named.create -->
    56.5 +<screen><prompt>$</prompt> <userinput>hg branch foo</userinput>
    56.6 +la directory di lavoro è stata contrassegnata come ramo foo
    56.7 +<prompt>$</prompt> <userinput>hg branch</userinput>
    56.8 +foo
    56.9 +</screen>
   56.10 +<!-- END branch-named.create -->
    57.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    57.2 +++ b/it/examples/branch-named.foo-commit.it	Fri Sep 04 16:33:35 2009 +0200
    57.3 @@ -0,0 +1,22 @@
    57.4 +<!-- BEGIN branch-named.foo-commit -->
    57.5 +<screen><prompt>$</prompt> <userinput>echo qualcosa &gt; qualchefile</userinput>
    57.6 +<prompt>$</prompt> <userinput>hg commit -A -m "Nuovo file."</userinput>
    57.7 +aggiungo qualchefile
    57.8 +creata una nuova testa
    57.9 +<prompt>$</prompt> <userinput>hg heads</userinput>
   57.10 +changeset:   3:859c842ea668
   57.11 +ramo:        foo
   57.12 +etichetta:   tip
   57.13 +genitore:    1:b15761055392
   57.14 +utente:      Bryan O'Sullivan &lt;bos@serpentine.com&gt;
   57.15 +data:        Fri Jun 05 15:49:04 2009 +0000
   57.16 +sommario:    Nuovo file.
   57.17 +
   57.18 +changeset:   2:4dce38140953
   57.19 +ramo:        bar
   57.20 +utente:      Bryan O'Sullivan &lt;bos@serpentine.com&gt;
   57.21 +data:        Fri Jun 05 15:49:00 2009 +0000
   57.22 +sommario:    Terzo commit.
   57.23 +
   57.24 +</screen>
   57.25 +<!-- END branch-named.foo-commit -->
    58.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    58.2 +++ b/it/examples/branch-named.merge.it	Fri Sep 04 16:33:35 2009 +0200
    58.3 @@ -0,0 +1,19 @@
    58.4 +<!-- BEGIN branch-named.merge -->
    58.5 +<screen><prompt>$</prompt> <userinput>hg branch</userinput>
    58.6 +bar
    58.7 +<prompt>$</prompt> <userinput>hg merge foo</userinput>
    58.8 +1 file aggiornati, 0 file uniti, 0 file rimossi, 0 file irrisolti
    58.9 +(unione tra rami, ricordatevi di effettuare il commit)
   58.10 +<prompt>$</prompt> <userinput>hg commit -m "Unione."</userinput>
   58.11 +<prompt>$</prompt> <userinput>hg tip</userinput>
   58.12 +changeset:   4:f50f493d0dc0
   58.13 +ramo:        bar
   58.14 +etichetta:   tip
   58.15 +genitore:    2:4dce38140953
   58.16 +genitore:    3:859c842ea668
   58.17 +utente:      Bryan O'Sullivan &lt;bos@serpentine.com&gt;
   58.18 +data:        Fri Jun 05 15:49:06 2009 +0000
   58.19 +sommario:    Unione.
   58.20 +
   58.21 +</screen>
   58.22 +<!-- END branch-named.merge -->
    59.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    59.2 +++ b/it/examples/branch-named.parents.it	Fri Sep 04 16:33:35 2009 +0200
    59.3 @@ -0,0 +1,15 @@
    59.4 +<!-- BEGIN branch-named.parents -->
    59.5 +<screen><prompt>$</prompt> <userinput>hg parents</userinput>
    59.6 +changeset:   2:4dce38140953
    59.7 +ramo:        bar
    59.8 +etichetta:   tip
    59.9 +utente:      Bryan O'Sullivan &lt;bos@serpentine.com&gt;
   59.10 +data:        Fri Jun 05 15:49:00 2009 +0000
   59.11 +sommario:    Terzo commit.
   59.12 +
   59.13 +<prompt>$</prompt> <userinput>hg branches</userinput>
   59.14 +bar                            2:4dce38140953
   59.15 +foo                            1:b15761055392 (inattivo)
   59.16 +default                        0:fc8fb1089cc0 (inattivo)
   59.17 +</screen>
   59.18 +<!-- END branch-named.parents -->
    60.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    60.2 +++ b/it/examples/branch-named.rebranch.it	Fri Sep 04 16:33:35 2009 +0200
    60.3 @@ -0,0 +1,18 @@
    60.4 +<!-- BEGIN branch-named.rebranch -->
    60.5 +<screen><prompt>$</prompt> <userinput>hg branch</userinput>
    60.6 +foo
    60.7 +<prompt>$</prompt> <userinput>hg branch bar</userinput>
    60.8 +la directory di lavoro è stata contrassegnata come ramo bar
    60.9 +<prompt>$</prompt> <userinput>echo nuovo file &gt; nuovofile</userinput>
   60.10 +<prompt>$</prompt> <userinput>hg commit -A -m "Terzo commit."</userinput>
   60.11 +aggiungo nuovofile
   60.12 +<prompt>$</prompt> <userinput>hg tip</userinput>
   60.13 +changeset:   2:4dce38140953
   60.14 +ramo:        bar
   60.15 +etichetta:   tip
   60.16 +utente:      Bryan O'Sullivan &lt;bos@serpentine.com&gt;
   60.17 +data:        Fri Jun 05 15:49:00 2009 +0000
   60.18 +sommario:    Terzo commit.
   60.19 +
   60.20 +</screen>
   60.21 +<!-- END branch-named.rebranch -->
    61.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    61.2 +++ b/it/examples/branch-named.status.it	Fri Sep 04 16:33:35 2009 +0200
    61.3 @@ -0,0 +1,11 @@
    61.4 +<!-- BEGIN branch-named.status -->
    61.5 +<screen><prompt>$</prompt> <userinput>hg status</userinput>
    61.6 +<prompt>$</prompt> <userinput>hg tip</userinput>
    61.7 +changeset:   0:fc8fb1089cc0
    61.8 +etichetta:   tip
    61.9 +utente:      Bryan O'Sullivan &lt;bos@serpentine.com&gt;
   61.10 +data:        Fri Jun 05 15:48:56 2009 +0000
   61.11 +sommario:    Commit iniziale
   61.12 +
   61.13 +</screen>
   61.14 +<!-- END branch-named.status -->
    62.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    62.2 +++ b/it/examples/branch-named.update-nothing.it	Fri Sep 04 16:33:35 2009 +0200
    62.3 @@ -0,0 +1,7 @@
    62.4 +<!-- BEGIN branch-named.update-nothing -->
    62.5 +<screen><prompt>$</prompt> <userinput>hg update foo</userinput>
    62.6 +0 file aggiornati, 0 file uniti, 1 file rimossi, 0 file irrisolti
    62.7 +<prompt>$</prompt> <userinput>hg update</userinput>
    62.8 +0 file aggiornati, 0 file uniti, 0 file rimossi, 0 file irrisolti
    62.9 +</screen>
   62.10 +<!-- END branch-named.update-nothing -->
    63.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    63.2 +++ b/it/examples/branch-named.update-switchy.it	Fri Sep 04 16:33:35 2009 +0200
    63.3 @@ -0,0 +1,22 @@
    63.4 +<!-- BEGIN branch-named.update-switchy -->
    63.5 +<screen><prompt>$</prompt> <userinput>hg update foo</userinput>
    63.6 +0 file aggiornati, 0 file uniti, 1 file rimossi, 0 file irrisolti
    63.7 +<prompt>$</prompt> <userinput>hg parents</userinput>
    63.8 +changeset:   1:b15761055392
    63.9 +ramo:        foo
   63.10 +utente:      Bryan O'Sullivan &lt;bos@serpentine.com&gt;
   63.11 +data:        Fri Jun 05 15:48:59 2009 +0000
   63.12 +sommario:    Secondo commit.
   63.13 +
   63.14 +<prompt>$</prompt> <userinput>hg update bar</userinput>
   63.15 +1 file aggiornati, 0 file uniti, 0 file rimossi, 0 file irrisolti
   63.16 +<prompt>$</prompt> <userinput>hg parents</userinput>
   63.17 +changeset:   2:4dce38140953
   63.18 +ramo:        bar
   63.19 +etichetta:   tip
   63.20 +utente:      Bryan O'Sullivan &lt;bos@serpentine.com&gt;
   63.21 +data:        Fri Jun 05 15:49:00 2009 +0000
   63.22 +sommario:    Terzo commit.
   63.23 +
   63.24 +</screen>
   63.25 +<!-- END branch-named.update-switchy -->
    64.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    64.2 +++ b/it/examples/branch-repo.bugfix.it	Fri Sep 04 16:33:35 2009 +0200
    64.3 @@ -0,0 +1,16 @@
    64.4 +<!-- BEGIN branch-repo.bugfix -->
    64.5 +<screen><prompt>$</prompt> <userinput>hg clone mioprogetto-1.0.1 mia-correzione-1.0.1</userinput>
    64.6 +aggiorno la directory di lavoro
    64.7 +2 file aggiornati, 0 file uniti, 0 file rimossi, 0 file irrisolti
    64.8 +<prompt>$</prompt> <userinput>cd mia-correzione-1.0.1</userinput>
    64.9 +<prompt>$</prompt> <userinput>echo 'Ho corretto un bug usando solo echo!' &gt;&gt; miofile</userinput>
   64.10 +<prompt>$</prompt> <userinput>hg commit -m "Importante correzione per la versione 1.0.1."</userinput>
   64.11 +<prompt>$</prompt> <userinput>hg push</userinput>
   64.12 +trasmetto a /tmp/mioprogetto-1.0.1
   64.13 +cerco i cambiamenti
   64.14 +aggiungo i changeset
   64.15 +aggiungo i manifest
   64.16 +aggiungo i cambiamenti ai file
   64.17 +aggiunti 1 changeset con 1 cambiamenti a 1 file
   64.18 +</screen>
   64.19 +<!-- END branch-repo.bugfix -->
    65.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    65.2 +++ b/it/examples/branch-repo.clone.it	Fri Sep 04 16:33:35 2009 +0200
    65.3 @@ -0,0 +1,7 @@
    65.4 +<!-- BEGIN branch-repo.clone -->
    65.5 +<screen><prompt>$</prompt> <userinput>cd ..</userinput>
    65.6 +<prompt>$</prompt> <userinput>hg clone mioprogetto mioprogetto-1.0.1</userinput>
    65.7 +aggiorno la directory di lavoro
    65.8 +2 file aggiornati, 0 file uniti, 0 file rimossi, 0 file irrisolti
    65.9 +</screen>
   65.10 +<!-- END branch-repo.clone -->
    66.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    66.2 +++ b/it/examples/branch-repo.merge.it	Fri Sep 04 16:33:35 2009 +0200
    66.3 @@ -0,0 +1,14 @@
    66.4 +<!-- BEGIN branch-repo.merge -->
    66.5 +<screen><prompt>$</prompt> <userinput>hg merge</userinput>
    66.6 +1 file aggiornati, 0 file uniti, 0 file rimossi, 0 file irrisolti
    66.7 +(unione tra rami, ricordatevi di eseguire il commit)
    66.8 +<prompt>$</prompt> <userinput>hg commit -m "Incorpora la correzione dal ramo 1.0.1."</userinput>
    66.9 +<prompt>$</prompt> <userinput>hg push</userinput>
   66.10 +trasmetto a /tmp/mioprogetto
   66.11 +cerco i cambiamenti
   66.12 +aggiungo i changeset
   66.13 +aggiungo i manifest
   66.14 +aggiungo i cambiamenti ai file
   66.15 +aggiunti 2 changeset con 1 cambiamenti a 1 file
   66.16 +</screen>
   66.17 +<!-- END branch-repo.merge -->
    67.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    67.2 +++ b/it/examples/branch-repo.new.it	Fri Sep 04 16:33:35 2009 +0200
    67.3 @@ -0,0 +1,18 @@
    67.4 +<!-- BEGIN branch-repo.new -->
    67.5 +<screen><prompt>$</prompt> <userinput>cd ..</userinput>
    67.6 +<prompt>$</prompt> <userinput>hg clone mioprogetto mia-funzione</userinput>
    67.7 +aggiorno la directory di lavoro
    67.8 +2 file aggiornati, 0 file uniti, 0 file rimossi, 0 file irrisolti
    67.9 +<prompt>$</prompt> <userinput>cd mia-funzione</userinput>
   67.10 +<prompt>$</prompt> <userinput>echo 'Questa è sicuramente una nuova ed eccitante funzione!' &gt; mionuovofile</userinput>
   67.11 +<prompt>$</prompt> <userinput>hg commit -A -m "Nuova funzione."</userinput>
   67.12 +aggiungo mionuovofile
   67.13 +<prompt>$</prompt> <userinput>hg push</userinput>
   67.14 +trasmetto a /tmp/mioprogetto
   67.15 +cerco i cambiamenti
   67.16 +aggiungo i changeset
   67.17 +aggiungo i manifest
   67.18 +aggiungo i cambiamenti ai file
   67.19 +aggiunti 1 changeset con 1 cambiamenti a 1 file
   67.20 +</screen>
   67.21 +<!-- END branch-repo.new -->
    68.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    68.2 +++ b/it/examples/branch-repo.pull.it	Fri Sep 04 16:33:35 2009 +0200
    68.3 @@ -0,0 +1,16 @@
    68.4 +<!-- BEGIN branch-repo.pull -->
    68.5 +<screen><prompt>$</prompt> <userinput>cd ..</userinput>
    68.6 +<prompt>$</prompt> <userinput>hg clone mioprogetto mioprogetto-unione</userinput>
    68.7 +aggiorno la directory di lavoro
    68.8 +3 file aggiornati, 0 file uniti, 0 file rimossi, 0 file irrisolti
    68.9 +<prompt>$</prompt> <userinput>cd mioprogetto-unione</userinput>
   68.10 +<prompt>$</prompt> <userinput>hg pull ../mioprogetto-1.0.1</userinput>
   68.11 +estraggo da ../mioprogetto-1.0.1
   68.12 +cerco i cambiamenti
   68.13 +aggiungo i changeset
   68.14 +aggiungo i manifest
   68.15 +aggiungo i cambiamenti ai file
   68.16 +aggiunti 1 changeset con 1 cambiamenti a 1 file (+1 teste)
   68.17 +(eseguite 'hg heads' per vedere le teste, 'hg merge' per unire)
   68.18 +</screen>
   68.19 +<!-- END branch-repo.pull -->
    69.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    69.2 +++ b/it/examples/branch-repo.tag.it	Fri Sep 04 16:33:35 2009 +0200
    69.3 @@ -0,0 +1,5 @@
    69.4 +<!-- BEGIN branch-repo.tag -->
    69.5 +<screen><prompt>$</prompt> <userinput>cd mioprogetto</userinput>
    69.6 +<prompt>$</prompt> <userinput>hg tag v1.0</userinput>
    69.7 +</screen>
    69.8 +<!-- END branch-repo.tag -->
    70.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    70.2 +++ b/it/examples/branching.clone.it	Fri Sep 04 16:33:35 2009 +0200
    70.3 @@ -0,0 +1,12 @@
    70.4 +<!-- BEGIN branching.clone -->
    70.5 +<screen><prompt>$</prompt> <userinput>cd ..</userinput>
    70.6 +<prompt>$</prompt> <userinput>hg clone -rv1.0 principale stabile</userinput>
    70.7 +richiedo tutte le modifiche
    70.8 +aggiungo i changeset
    70.9 +aggiungo i manifest
   70.10 +aggiungo i cambiamenti ai file
   70.11 +aggiunti 1 changeset con 1 cambiamenti a 1 file
   70.12 +aggiorno la directory di lavoro
   70.13 +1 file aggiornati, 0 file uniti, 0 file rimossi, 0 file irrisolti
   70.14 +</screen>
   70.15 +<!-- END branching.clone -->
    71.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    71.2 +++ b/it/examples/branching.init.it	Fri Sep 04 16:33:35 2009 +0200
    71.3 @@ -0,0 +1,8 @@
    71.4 +<!-- BEGIN branching.init -->
    71.5 +<screen><prompt>$</prompt> <userinput>hg init principale</userinput>
    71.6 +<prompt>$</prompt> <userinput>cd principale</userinput>
    71.7 +<prompt>$</prompt> <userinput>echo 'Questa è una funzione noiosa.' &gt; miofile</userinput>
    71.8 +<prompt>$</prompt> <userinput>hg commit -A -m "Abbiamo raggiunto una pietra miliare importante!"</userinput>
    71.9 +aggiungo miofile
   71.10 +</screen>
   71.11 +<!-- END branching.init -->
    72.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    72.2 +++ b/it/examples/branching.main.it	Fri Sep 04 16:33:35 2009 +0200
    72.3 @@ -0,0 +1,9 @@
    72.4 +<!-- BEGIN branching.main -->
    72.5 +<screen><prompt>$</prompt> <userinput>cd ../principale</userinput>
    72.6 +<prompt>$</prompt> <userinput>echo 'Questa è nuova ed eccitante!' &gt;&gt; miofile</userinput>
    72.7 +<prompt>$</prompt> <userinput>hg commit -m "Aggiunge una nuova funzione."</userinput>
    72.8 +<prompt>$</prompt> <userinput>cat miofile</userinput>
    72.9 +Questa è una funzione noiosa.
   72.10 +Questa è nuova ed eccitante!
   72.11 +</screen>
   72.12 +<!-- END branching.main -->
    73.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    73.2 +++ b/it/examples/branching.merge.it	Fri Sep 04 16:33:35 2009 +0200
    73.3 @@ -0,0 +1,20 @@
    73.4 +<!-- BEGIN branching.merge -->
    73.5 +<screen><prompt>$</prompt> <userinput>cd ../principale</userinput>
    73.6 +<prompt>$</prompt> <userinput>hg pull ../stabile</userinput>
    73.7 +estraggo da ../stabile
    73.8 +cerco i cambiamenti
    73.9 +aggiungo i changeset
   73.10 +aggiungo i manifest
   73.11 +aggiungo i cambiamenti ai file
   73.12 +aggiunti 1 changeset con 1 cambiamenti a 1 file (+1 teste)
   73.13 +(eseguite 'hg heads' per vedere le teste, 'hg merge' per unire)
   73.14 +<prompt>$</prompt> <userinput>hg merge</userinput>
   73.15 +unisco miofile
   73.16 +0 file aggiornati, 1 file uniti, 0 file rimossi, 0 file irrisolti
   73.17 +(unione tra rami, ricordatevi di eseguire il commit)
   73.18 +<prompt>$</prompt> <userinput>hg commit -m "Incorpora la correzione del bug dal ramo stabile."</userinput>
   73.19 +<prompt>$</prompt> <userinput>cat miofile</userinput>
   73.20 +Questa è una correzione a una funzione noiosa.
   73.21 +Questa è nuova ed eccitante!
   73.22 +</screen>
   73.23 +<!-- END branching.merge -->
    74.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    74.2 +++ b/it/examples/branching.stable.it	Fri Sep 04 16:33:35 2009 +0200
    74.3 @@ -0,0 +1,16 @@
    74.4 +<!-- BEGIN branching.stable -->
    74.5 +<screen><prompt>$</prompt> <userinput>hg clone stabile stabile-con-correzione</userinput>
    74.6 +aggiorno la directory di lavoro
    74.7 +1 file aggiornati, 0 file uniti, 0 file rimossi, 0 file irrisolti
    74.8 +<prompt>$</prompt> <userinput>cd stabile-con-correzione</userinput>
    74.9 +<prompt>$</prompt> <userinput>echo 'Questa è una correzione a una funzione noiosa.' &gt; miofile</userinput>
   74.10 +<prompt>$</prompt> <userinput>hg commit -m "Corretto un bug."</userinput>
   74.11 +<prompt>$</prompt> <userinput>hg push</userinput>
   74.12 +trasmetto a /tmp/stabile
   74.13 +cerco i cambiamenti
   74.14 +aggiungo i changeset
   74.15 +aggiungo i manifest
   74.16 +aggiungo i cambiamenti ai file
   74.17 +aggiunti 1 changeset con 1 cambiamenti a 1 file
   74.18 +</screen>
   74.19 +<!-- END branching.stable -->
    75.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    75.2 +++ b/it/examples/branching.tag.it	Fri Sep 04 16:33:35 2009 +0200
    75.3 @@ -0,0 +1,14 @@
    75.4 +<!-- BEGIN branching.tag -->
    75.5 +<screen><prompt>$</prompt> <userinput>hg tag v1.0</userinput>
    75.6 +<prompt>$</prompt> <userinput>hg tip</userinput>
    75.7 +changeset:   1:be452d95a1d0
    75.8 +etichetta:   tip
    75.9 +utente:      Bryan O'Sullivan &lt;bos@serpentine.com&gt;
   75.10 +data:        Fri Jun 05 15:49:15 2009 +0000
   75.11 +sommario:    Aggiunta l'etichetta v1.0 per il changeset c93791f54ca9
   75.12 +
   75.13 +<prompt>$</prompt> <userinput>hg tags</userinput>
   75.14 +tip                                1:be452d95a1d0
   75.15 +v1.0                               0:c93791f54ca9
   75.16 +</screen>
   75.17 +<!-- END branching.tag -->
    76.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    76.2 +++ b/it/examples/branching.update.it	Fri Sep 04 16:33:35 2009 +0200
    76.3 @@ -0,0 +1,10 @@
    76.4 +<!-- BEGIN branching.update -->
    76.5 +<screen><prompt>$</prompt> <userinput>cd ..</userinput>
    76.6 +<prompt>$</prompt> <userinput>hg clone -U principale principale-vecchio</userinput>
    76.7 +<prompt>$</prompt> <userinput>cd principale-vecchio</userinput>
    76.8 +<prompt>$</prompt> <userinput>hg update v1.0</userinput>
    76.9 +1 file aggiornati, 0 file uniti, 0 file rimossi, 0 file irrisolti
   76.10 +<prompt>$</prompt> <userinput>cat miofile</userinput>
   76.11 +Questa è una funzione noiosa.
   76.12 +</screen>
   76.13 +<!-- END branching.update -->
    77.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    77.2 +++ b/it/examples/ch01-new.add.it	Fri Sep 04 16:33:35 2009 +0200
    77.3 @@ -0,0 +1,12 @@
    77.4 +<!-- BEGIN ch01/new.add -->
    77.5 +<screen><prompt>$</prompt> <userinput>cd mioprogetto</userinput>
    77.6 +<prompt>$</prompt> <userinput>cp ../hello.c .</userinput>
    77.7 +<prompt>$</prompt> <userinput>cp ../goodbye.c .</userinput>
    77.8 +<prompt>$</prompt> <userinput>hg add</userinput>
    77.9 +aggiungo goodbye.c
   77.10 +aggiungo hello.c
   77.11 +<prompt>$</prompt> <userinput>hg status</userinput>
   77.12 +A goodbye.c
   77.13 +A hello.c
   77.14 +</screen>
   77.15 +<!-- END ch01/new.add -->
    78.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    78.2 +++ b/it/examples/ch01-new.commit.it	Fri Sep 04 16:33:35 2009 +0200
    78.3 @@ -0,0 +1,4 @@
    78.4 +<!-- BEGIN ch01/new.commit -->
    78.5 +<screen><prompt>$</prompt> <userinput>hg commit -m "Inserimento iniziale."</userinput>
    78.6 +</screen>
    78.7 +<!-- END ch01/new.commit -->
    79.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    79.2 +++ b/it/examples/ch01-new.init.it	Fri Sep 04 16:33:35 2009 +0200
    79.3 @@ -0,0 +1,4 @@
    79.4 +<!-- BEGIN ch01/new.init -->
    79.5 +<screen><prompt>$</prompt> <userinput>hg init mioprogetto</userinput>
    79.6 +</screen>
    79.7 +<!-- END ch01/new.init -->
    80.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    80.2 +++ b/it/examples/ch01-new.ls.it	Fri Sep 04 16:33:35 2009 +0200
    80.3 @@ -0,0 +1,8 @@
    80.4 +<!-- BEGIN ch01/new.ls -->
    80.5 +<screen><prompt>$</prompt> <userinput>ls -l</userinput>
    80.6 +total 12
    80.7 +-rw-rw-r-- 1 bos bos   47 May  5 06:55 goodbye.c
    80.8 +-rw-rw-r-- 1 bos bos   45 May  5 06:55 hello.c
    80.9 +drwxrwxr-x 3 bos bos 4096 May  5 06:55 mioprogetto
   80.10 +</screen>
   80.11 +<!-- END ch01/new.ls -->
    81.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    81.2 +++ b/it/examples/ch01-new.ls2.it	Fri Sep 04 16:33:35 2009 +0200
    81.3 @@ -0,0 +1,8 @@
    81.4 +<!-- BEGIN ch01/new.ls2 -->
    81.5 +<screen><prompt>$</prompt> <userinput>ls -al mioprogetto</userinput>
    81.6 +total 12
    81.7 +drwxrwxr-x 3 bos bos 4096 May  5 06:55 .
    81.8 +drwx------ 3 bos bos 4096 May  5 06:55 ..
    81.9 +drwxrwxr-x 3 bos bos 4096 May  5 06:55 .hg
   81.10 +</screen>
   81.11 +<!-- END ch01/new.ls2 -->
    82.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    82.2 +++ b/it/examples/ch04-diff.chmod.git.it	Fri Sep 04 16:33:35 2009 +0200
    82.3 @@ -0,0 +1,7 @@
    82.4 +<!-- BEGIN ch04/diff.chmod.git -->
    82.5 +<screen><prompt>$</prompt> <userinput>hg diff -g</userinput>
    82.6 +diff --git a/a b/a
    82.7 +vecchia modalità 100644
    82.8 +nuova modalità 100755
    82.9 +</screen>
   82.10 +<!-- END ch04/diff.chmod.git -->
    83.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    83.2 +++ b/it/examples/ch04-diff.chmod.it	Fri Sep 04 16:33:35 2009 +0200
    83.3 @@ -0,0 +1,7 @@
    83.4 +<!-- BEGIN ch04/diff.chmod -->
    83.5 +<screen><prompt>$</prompt> <userinput>chmod +x a</userinput>
    83.6 +<prompt>$</prompt> <userinput>hg st</userinput>
    83.7 +M a
    83.8 +<prompt>$</prompt> <userinput>hg diff</userinput>
    83.9 +</screen>
   83.10 +<!-- END ch04/diff.chmod -->
    84.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    84.2 +++ b/it/examples/ch04-diff.rename.basic.it	Fri Sep 04 16:33:35 2009 +0200
    84.3 @@ -0,0 +1,15 @@
    84.4 +<!-- BEGIN ch04/diff.rename.basic -->
    84.5 +<screen><prompt>$</prompt> <userinput>hg rename foo bar</userinput>
    84.6 +<prompt>$</prompt> <userinput>hg diff</userinput>
    84.7 +diff -r b01d46ff402d foo
    84.8 +--- foo/foo	Fri Jun 05 15:49:22 2009 +0000
    84.9 ++++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
   84.10 +@@ -1,1 +0,0 @@
   84.11 +-a
   84.12 +diff -r b01d46ff402d bar
   84.13 +--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   84.14 ++++ bar/bar	Fri Jun 05 15:49:23 2009 +0000
   84.15 +@@ -0,0 +1,1 @@
   84.16 ++a
   84.17 +</screen>
   84.18 +<!-- END ch04/diff.rename.basic -->
    85.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    85.2 +++ b/it/examples/ch04-diff.rename.git.it	Fri Sep 04 16:33:35 2009 +0200
    85.3 @@ -0,0 +1,7 @@
    85.4 +<!-- BEGIN ch04/diff.rename.git -->
    85.5 +<screen><prompt>$</prompt> <userinput>hg diff -g</userinput>
    85.6 +diff --git foo/foo bar/bar
    85.7 +cambiamento di nome da foo
    85.8 +cambiamento di nome a bar
    85.9 +</screen>
   85.10 +<!-- END ch04/diff.rename.git -->
    86.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    86.2 +++ b/it/examples/ch04-resolve.cifail.it	Fri Sep 04 16:33:35 2009 +0200
    86.3 @@ -0,0 +1,5 @@
    86.4 +<!-- BEGIN ch04/resolve.cifail -->
    86.5 +<screen><prompt>$</prompt> <userinput>hg commit -m "Tentativo di inserire i risultati di un'unione fallita."</userinput>
    86.6 +fallimento: conflitti di unione irrisolti (si veda hg resolve)
    86.7 +</screen>
    86.8 +<!-- END ch04/resolve.cifail -->
    87.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    87.2 +++ b/it/examples/ch04-resolve.export.it	Fri Sep 04 16:33:35 2009 +0200
    87.3 @@ -0,0 +1,4 @@
    87.4 +<!-- BEGIN ch04/resolve.export -->
    87.5 +<screen><prompt>$</prompt> <userinput>export HGMERGE=false</userinput>
    87.6 +</screen>
    87.7 +<!-- END ch04/resolve.export -->
    88.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    88.2 +++ b/it/examples/ch04-resolve.heads.it	Fri Sep 04 16:33:35 2009 +0200
    88.3 @@ -0,0 +1,16 @@
    88.4 +<!-- BEGIN ch04/resolve.heads -->
    88.5 +<screen><prompt>$</prompt> <userinput>hg heads</userinput>
    88.6 +changeset:   2:6e8cd0b94b4c
    88.7 +etichetta:   tip
    88.8 +genitore:    0:05f41910a168
    88.9 +utente:      Bryan O'Sullivan &lt;bos@serpentine.com&gt;
   88.10 +data:        Fri Jun 05 15:49:28 2009 +0000
   88.11 +sommario:    destra
   88.12 +
   88.13 +changeset:   1:ab0fbd8c502d
   88.14 +utente:      Bryan O'Sullivan &lt;bos@serpentine.com&gt;
   88.15 +data:        Fri Jun 05 15:49:27 2009 +0000
   88.16 +sommario:    sinistra
   88.17 +
   88.18 +</screen>
   88.19 +<!-- END ch04/resolve.heads -->
    89.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    89.2 +++ b/it/examples/ch04-resolve.init.it	Fri Sep 04 16:33:35 2009 +0200
    89.3 @@ -0,0 +1,15 @@
    89.4 +<!-- BEGIN ch04/resolve.init -->
    89.5 +<screen><prompt>$</prompt> <userinput>hg init conflitto</userinput>
    89.6 +<prompt>$</prompt> <userinput>cd conflitto</userinput>
    89.7 +<prompt>$</prompt> <userinput>echo primo &gt; miofile.txt</userinput>
    89.8 +<prompt>$</prompt> <userinput>hg ci -A -m primo</userinput>
    89.9 +aggiungo miofile.txt
   89.10 +<prompt>$</prompt> <userinput>cd ..</userinput>
   89.11 +<prompt>$</prompt> <userinput>hg clone conflitto sinistra</userinput>
   89.12 +aggiorno la directory di lavoro
   89.13 +1 file aggiornati, 0 file uniti, 0 file rimossi, 0 file irrisolti
   89.14 +<prompt>$</prompt> <userinput>hg clone conflitto destra</userinput>
   89.15 +aggiorno la directory di lavoro
   89.16 +1 file aggiornati, 0 file uniti, 0 file rimossi, 0 file irrisolti
   89.17 +</screen>
   89.18 +<!-- END ch04/resolve.init -->
    90.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    90.2 +++ b/it/examples/ch04-resolve.left.it	Fri Sep 04 16:33:35 2009 +0200
    90.3 @@ -0,0 +1,6 @@
    90.4 +<!-- BEGIN ch04/resolve.left -->
    90.5 +<screen><prompt>$</prompt> <userinput>cd sinistra</userinput>
    90.6 +<prompt>$</prompt> <userinput>echo sinistra &gt;&gt; miofile.txt</userinput>
    90.7 +<prompt>$</prompt> <userinput>hg ci -m sinistra</userinput>
    90.8 +</screen>
    90.9 +<!-- END ch04/resolve.left -->
    91.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    91.2 +++ b/it/examples/ch04-resolve.list.it	Fri Sep 04 16:33:35 2009 +0200
    91.3 @@ -0,0 +1,5 @@
    91.4 +<!-- BEGIN ch04/resolve.list -->
    91.5 +<screen><prompt>$</prompt> <userinput>hg resolve -l</userinput>
    91.6 +U miofile.txt
    91.7 +</screen>
    91.8 +<!-- END ch04/resolve.list -->
    92.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    92.2 +++ b/it/examples/ch04-resolve.merge.it	Fri Sep 04 16:33:35 2009 +0200
    92.3 @@ -0,0 +1,9 @@
    92.4 +<!-- BEGIN ch04/resolve.merge -->
    92.5 +<screen><prompt>$</prompt> <userinput>hg merge</userinput>
    92.6 +unisco miofile.txt
    92.7 +merge: attenzione: conflitti durante l'unione
    92.8 +unione di miofile.txt fallita!
    92.9 +0 file aggiornati, 0 file uniti, 0 file rimossi, 1 file irrisolti
   92.10 +usate 'hg resolve' per riprovare a unire i file irrisolti o 'hg up --clean' per abbandonare
   92.11 +</screen>
   92.12 +<!-- END ch04/resolve.merge -->
    93.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    93.2 +++ b/it/examples/ch04-resolve.pull.it	Fri Sep 04 16:33:35 2009 +0200
    93.3 @@ -0,0 +1,21 @@
    93.4 +<!-- BEGIN ch04/resolve.pull -->
    93.5 +<screen><prompt>$</prompt> <userinput>cd ../conflitto</userinput>
    93.6 +<prompt>$</prompt> <userinput>hg pull -u ../sinistra</userinput>
    93.7 +estraggo da ../sinistra
    93.8 +cerco i cambiamenti
    93.9 +aggiungo i changeset
   93.10 +aggiungo i manifest
   93.11 +aggiungo i cambiamenti ai file
   93.12 +aggiunti 1 changeset con 1 cambiamenti a 1 file
   93.13 +1 file aggiornati, 0 file uniti, 1 file rimossi, 0 file irrisolti
   93.14 +<prompt>$</prompt> <userinput>hg pull -u ../destra</userinput>
   93.15 +estraggo da ../destra
   93.16 +cerco i cambiamenti
   93.17 +aggiungo i changeset
   93.18 +aggiungo i manifest
   93.19 +aggiungo i cambiamenti ai file
   93.20 +aggiunti 1 changeset con 1 cambiamenti a 1 file (+1 teste)
   93.21 +non aggiorno, sono state aggiunte nuove teste
   93.22 +(eseguite 'hg heads' per vedere le teste, 'hg merge' per unire)
   93.23 +</screen>
   93.24 +<!-- END ch04/resolve.pull -->
    94.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    94.2 +++ b/it/examples/ch04-resolve.right.it	Fri Sep 04 16:33:35 2009 +0200
    94.3 @@ -0,0 +1,6 @@
    94.4 +<!-- BEGIN ch04/resolve.right -->
    94.5 +<screen><prompt>$</prompt> <userinput>cd ../destra</userinput>
    94.6 +<prompt>$</prompt> <userinput>echo destra &gt;&gt; miofile.txt</userinput>
    94.7 +<prompt>$</prompt> <userinput>hg ci -m destra</userinput>
    94.8 +</screen>
    94.9 +<!-- END ch04/resolve.right -->
    95.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    95.2 +++ b/it/examples/ch06-apache-config.lst.it	Fri Sep 04 16:33:35 2009 +0200
    95.3 @@ -0,0 +1,13 @@
    95.4 +<!-- BEGIN ch06/apache-config.lst -->
    95.5 +<programlisting>&lt;Directory /home/*/public_html&gt;
    95.6 +  AllowOverride FileInfo AuthConfig Limit
    95.7 +  Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
    95.8 +  &lt;Limit GET POST OPTIONS&gt;
    95.9 +    Order allow,deny
   95.10 +    Allow from all
   95.11 +  &lt;/Limit&gt;
   95.12 +  &lt;LimitExcept GET POST OPTIONS&gt;
   95.13 +    Order deny,allow Deny from all
   95.14 +  &lt;/LimitExcept&gt;
   95.15 +&lt;/Directory&gt;</programlisting>
   95.16 +<!-- END ch06/apache-config.lst -->
    96.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    96.2 +++ b/it/examples/ch09-check_whitespace.py.lst.it	Fri Sep 04 16:33:35 2009 +0200
    96.3 @@ -0,0 +1,49 @@
    96.4 +<!-- BEGIN ch09/check_whitespace.py.lst -->
    96.5 +<programlisting>#!/usr/bin/env python
    96.6 +#
    96.7 +# salvate il file come .hg/controllo_spazio_bianco.py e rendetelo eseguibile
    96.8 +
    96.9 +import re
   96.10 +
   96.11 +def spazio_bianco_in_coda(righe_di_diff):
   96.12 +    # 
   96.13 +    numriga, intestazione = 0, False
   96.14 +
   96.15 +    for riga in righe_di_diff:
   96.16 +        if intestazione:
   96.17 +            # ricorda il nome del file coinvolto in questo diff
   96.18 +            m = re.match(r'(?:---|\+\+\+) ([^\t]+)', riga)
   96.19 +            if m and m.group(1) != '/dev/null':
   96.20 +                nomefile = m.group(1).split('/', 1)[-1]
   96.21 +            if riga.startswith('+++ '):
   96.22 +                intestazione = False
   96.23 +            continue
   96.24 +        if riga.startswith('diff '):
   96.25 +            intestazione = True
   96.26 +            continue
   96.27 +        # intestazione - salva il numero di riga
   96.28 +        m = re.match(r'@@ -\d+,\d+ \+(\d+),', riga)
   96.29 +        if m:
   96.30 +            numriga = int(m.group(1))
   96.31 +            continue
   96.32 +        # corpo - cerca una riga aggiunta con spazio bianco in coda
   96.33 +        m = re.match(r'\+.*[ \t]$', riga)
   96.34 +        if m:
   96.35 +            yield nomefile, numriga
   96.36 +        if riga and riga[0] in ' +':
   96.37 +            numriga += 1
   96.38 +
   96.39 +if __name__ == '__main__':
   96.40 +    import os, sys
   96.41 +    
   96.42 +    aggiunte = 0
   96.43 +    for nomefile, numriga in spazio_bianco_in_coda(os.popen('hg export tip')):
   96.44 +        print &gt;&gt; sys.stderr, ('%s, riga %d: aggiunto spazio bianco in coda' %
   96.45 +                              (nomefile, numriga))
   96.46 +        aggiunte += 1
   96.47 +    if aggiunte:
   96.48 +        # salva il messaggio di commit in modo da non doverlo digitare di nuovo
   96.49 +        os.system('hg tip --template "{desc}" &gt; .hg/commit.save')
   96.50 +        print &gt;&gt; sys.stderr, 'messaggio di commit salvato nel file .hg/commit.save'
   96.51 +        sys.exit(1)</programlisting>
   96.52 +<!-- END ch09/check_whitespace.py.lst -->
    97.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    97.2 +++ b/it/examples/ch09-hook.ws.better.it	Fri Sep 04 16:33:35 2009 +0200
    97.3 @@ -0,0 +1,15 @@
    97.4 +<!-- BEGIN ch09/hook.ws.better -->
    97.5 +<screen><prompt>$</prompt> <userinput>cat .hg/hgrc</userinput>
    97.6 +[hooks]
    97.7 +pretxncommit.spazio_bianco = .hg/controllo_spazio_bianco.py
    97.8 +<prompt>$</prompt> <userinput>echo 'a ' &gt;&gt; a</userinput>
    97.9 +<prompt>$</prompt> <userinput>hg commit -A -m "Aggiunge una nuova riga con spazio bianco in coda."</userinput>
   97.10 +a, riga 1: aggiunto spazio bianco in coda
   97.11 +messaggio di commit salvato nel file .hg/commit.save
   97.12 +transazione abortita!
   97.13 +ripristino completato
   97.14 +fallimento: l'hook pretxncommit.spazio_bianco è terminato con codice di stato 1
   97.15 +<prompt>$</prompt> <userinput>sed -i 's, *$,,' a</userinput>
   97.16 +<prompt>$</prompt> <userinput>hg commit -A -m "Rimosso spazio bianco in coda."</userinput>
   97.17 +</screen>
   97.18 +<!-- END ch09/hook.ws.better -->
    98.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    98.2 +++ b/it/examples/ch09-hook.ws.simple.it	Fri Sep 04 16:33:35 2009 +0200
    98.3 @@ -0,0 +1,14 @@
    98.4 +<!-- BEGIN ch09/hook.ws.simple -->
    98.5 +<screen><prompt>$</prompt> <userinput>cat .hg/hgrc</userinput>
    98.6 +[hooks]
    98.7 +pretxncommit.spazio_bianco = hg export tip | (! egrep -q '^\+.*[ \t]$')
    98.8 +<prompt>$</prompt> <userinput>echo 'a ' &gt; a</userinput>
    98.9 +<prompt>$</prompt> <userinput>hg commit -A -m "Collaudo con spazio bianco in coda."</userinput>
   98.10 +aggiungo a
   98.11 +transazione abortita!
   98.12 +ripristino completato
   98.13 +fallimento: l'hook pretxncommit.spazio_bianco è terminato con codice di stato 1
   98.14 +<prompt>$</prompt> <userinput>echo 'a' &gt; a</userinput>
   98.15 +<prompt>$</prompt> <userinput>hg commit -A -m "Elimina lo spazio bianco in coda e riprova."</userinput>
   98.16 +</screen>
   98.17 +<!-- END ch09/hook.ws.simple -->
    99.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    99.2 +++ b/it/examples/ch10-bugzilla-config.lst.it	Fri Sep 04 16:33:35 2009 +0200
    99.3 @@ -0,0 +1,17 @@
    99.4 +<!-- BEGIN ch10/bugzilla-config.lst -->
    99.5 +<programlisting>[bugzilla]
    99.6 +host = bugzilla.example.com
    99.7 +password = miapassword
    99.8 +version = 2.16
    99.9 +# i repository sul lato server si trovano in /home/hg/repos, quindi devono
   99.10 +# essere eliminati 4 separatori iniziali
   99.11 +strip = 4
   99.12 +hgweb = http://hg.example.com/
   99.13 +usermap = /home/hg/repos/notify/bugzilla.conf
   99.14 +template = Changeset {node|short}, creato da {author} nel repository {webroot}
   99.15 +  fa riferimento a questo bug.\n
   99.16 +  Per i dettagli completi, si veda
   99.17 +  {hgweb}{webroot}?cmd=changeset;node={node|short}\n
   99.18 +  Descrizione del changeset:\n
   99.19 +  \t{desc|tabindent}</programlisting>
   99.20 +<!-- END ch10/bugzilla-config.lst -->
   100.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   100.2 +++ b/it/examples/ch10-multiline.go.it	Fri Sep 04 16:33:35 2009 +0200
   100.3 @@ -0,0 +1,12 @@
   100.4 +<!-- BEGIN ch10/multiline.go -->
   100.5 +<screen><prompt>$</prompt> <userinput>cat &gt; multiriga &lt;&lt; EOF</userinput>
   100.6 +<prompt>></prompt> <userinput>changeset = "Modificati in {node|short}:\n{files}"</userinput>
   100.7 +<prompt>></prompt> <userinput>file = "  {file}\n"</userinput>
   100.8 +<prompt>></prompt> <userinput>EOF</userinput>
   100.9 +<prompt>$</prompt> <userinput>hg log --style multiriga</userinput>
  100.10 +Modificati in 7daf1d1b51e4:
  100.11 +  .bashrc
  100.12 +  .hgrc
  100.13 +  test.c
  100.14 +</screen>
  100.15 +<!-- END ch10/multiline.go -->
   101.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   101.2 +++ b/it/examples/ch10-notify-config-mail.lst.it	Fri Sep 04 16:33:35 2009 +0200
   101.3 @@ -0,0 +1,20 @@
   101.4 +<!-- BEGIN ch10/notify-config-mail.lst -->
   101.5 +<programlisting>X-Hg-Repo: test/slave
   101.6 +Subject: test/slave: Gestisce l'errore nel caso in cui uno slave non ha alcun buffer.
   101.7 +Date: Wed,  2 Aug 2006 15:25:46 -0700 (PDT)
   101.8 +
   101.9 +changeset 3cba9bfe74b5 nel repository /home/hg/repos/test/slave
  101.10 +
  101.11 +details:
  101.12 +http://hg.example.com/test/slave?cmd=changeset;node=3cba9bfe74b5 
  101.13 +
  101.14 +description: Gestisce l'errore nel caso in cui uno slave non ha alcun buffer.
  101.15 +
  101.16 +diffs (54 lines):
  101.17 +diff -r 9d95df7cf2ad -r 3cba9bfe74b5 include/test.h
  101.18 +--- a/include/test.h      Wed Aug 02 15:19:52 2006 -0700
  101.19 ++++ b/include/test.h      Wed Aug 02 15:25:26 2006 -0700
  101.20 +@@ -212,6 +212,15 @@ static __inline__
  101.21 +void test_headers(void *h)
  101.22 +[...omissis...]</programlisting>
  101.23 +<!-- END ch10/notify-config-mail.lst -->
   102.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   102.2 +++ b/it/examples/ch10-notify-config.lst.it	Fri Sep 04 16:33:35 2009 +0200
   102.3 @@ -0,0 +1,21 @@
   102.4 +<!-- BEGIN ch10/notify-config.lst -->
   102.5 +<programlisting>[notify]
   102.6 +# spedisci davvero le email
   102.7 +test = false
   102.8 +# i dati delle sottoscrizioni si trovano nel repository notify
   102.9 +config = /home/hg/repos/notify/notify.conf
  102.10 +# i repository si trovano in /home/hg/repos sul server, quindi
  102.11 +# eliminiamo 4 caratteri "/"
  102.12 +strip = 4
  102.13 +template = X-Hg-Repo: {webroot}\n
  102.14 +  Subject: {webroot}: {desc|firstline|strip}\n
  102.15 +  From: {author}
  102.16 +  \n\n
  102.17 +  changeset {node|short} nel repository {root}
  102.18 +  \n\ndettagli:
  102.19 +  {baseurl}{webroot}?cmd=changeset;node={node|short}
  102.20 +  descrizione: {desc|tabindent|strip}
  102.21 +
  102.22 +[web]
  102.23 +baseurl = http://hg.example.com/</programlisting>
  102.24 +<!-- END ch10/notify-config.lst -->
   103.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   103.2 +++ b/it/examples/ch11-qdelete.convert.it	Fri Sep 04 16:33:35 2009 +0200
   103.3 @@ -0,0 +1,13 @@
   103.4 +<!-- BEGIN ch11/qdelete.convert -->
   103.5 +<screen><prompt>$</prompt> <userinput>hg qnew buona.patch</userinput>
   103.6 +<prompt>$</prompt> <userinput>echo a &gt; a</userinput>
   103.7 +<prompt>$</prompt> <userinput>hg add a</userinput>
   103.8 +<prompt>$</prompt> <userinput>hg qrefresh -m "Buona modifica."</userinput>
   103.9 +<prompt>$</prompt> <userinput>hg qfinish tip</userinput>
  103.10 +<prompt>$</prompt> <userinput>hg qapplied</userinput>
  103.11 +<prompt>$</prompt> <userinput>hg tip --style=compact</userinput>
  103.12 +0[tip]   8eae2605f537   2009-06-05 15:49 +0000   bos
  103.13 +  Buona modifica.
  103.14 +
  103.15 +</screen>
  103.16 +<!-- END ch11/qdelete.convert -->
   104.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   104.2 +++ b/it/examples/ch11-qdelete.go.it	Fri Sep 04 16:33:35 2009 +0200
   104.3 @@ -0,0 +1,15 @@
   104.4 +<!-- BEGIN ch11/qdelete.go -->
   104.5 +<screen><prompt>$</prompt> <userinput>hg init miorepo</userinput>
   104.6 +<prompt>$</prompt> <userinput>cd miorepo</userinput>
   104.7 +<prompt>$</prompt> <userinput>hg qinit</userinput>
   104.8 +<prompt>$</prompt> <userinput>hg qnew cattiva.patch</userinput>
   104.9 +<prompt>$</prompt> <userinput>echo a &gt; a</userinput>
  104.10 +<prompt>$</prompt> <userinput>hg add a</userinput>
  104.11 +<prompt>$</prompt> <userinput>hg qrefresh</userinput>
  104.12 +<prompt>$</prompt> <userinput>hg qdelete cattiva.patch</userinput>
  104.13 +fallimento: non posso cancellare la patch applicata cattiva.patch
  104.14 +<prompt>$</prompt> <userinput>hg qpop</userinput>
  104.15 +la coda delle patch è vuota
  104.16 +<prompt>$</prompt> <userinput>hg qdelete cattiva.patch</userinput>
  104.17 +</screen>
  104.18 +<!-- END ch11/qdelete.go -->
   105.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   105.2 +++ b/it/examples/ch11-qdelete.import.it	Fri Sep 04 16:33:35 2009 +0200
   105.3 @@ -0,0 +1,6 @@
   105.4 +<!-- BEGIN ch11/qdelete.import -->
   105.5 +<screen><prompt>$</prompt> <userinput>hg qimport -r tip</userinput>
   105.6 +<prompt>$</prompt> <userinput>hg qapplied</userinput>
   105.7 +0.diff
   105.8 +</screen>
   105.9 +<!-- END ch11/qdelete.import -->
   106.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   106.2 +++ b/it/examples/daily.copy.after.it	Fri Sep 04 16:33:35 2009 +0200
   106.3 @@ -0,0 +1,5 @@
   106.4 +<!-- BEGIN daily.copy.after -->
   106.5 +<screen><prompt>$</prompt> <userinput>cp a n</userinput>
   106.6 +<prompt>$</prompt> <userinput>hg copy --after a n</userinput>
   106.7 +</screen>
   106.8 +<!-- END daily.copy.after -->
   107.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   107.2 +++ b/it/examples/daily.copy.clone.it	Fri Sep 04 16:33:35 2009 +0200
   107.3 @@ -0,0 +1,7 @@
   107.4 +<!-- BEGIN daily.copy.clone -->
   107.5 +<screen><prompt>$</prompt> <userinput>cd ..</userinput>
   107.6 +<prompt>$</prompt> <userinput>hg clone mia-copia vostra-copia</userinput>
   107.7 +aggiorno la directory di lavoro
   107.8 +1 file aggiornati, 0 file uniti, 0 file rimossi, 0 file irrisolti
   107.9 +</screen>
  107.10 +<!-- END daily.copy.clone -->
   108.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   108.2 +++ b/it/examples/daily.copy.copy.it	Fri Sep 04 16:33:35 2009 +0200
   108.3 @@ -0,0 +1,5 @@
   108.4 +<!-- BEGIN daily.copy.copy -->
   108.5 +<screen><prompt>$</prompt> <userinput>cd mia-copia</userinput>
   108.6 +<prompt>$</prompt> <userinput>hg copy file nuovo-file</userinput>
   108.7 +</screen>
   108.8 +<!-- END daily.copy.copy -->
   109.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   109.2 +++ b/it/examples/daily.copy.dir-dest.it	Fri Sep 04 16:33:35 2009 +0200
   109.3 @@ -0,0 +1,7 @@
   109.4 +<!-- BEGIN daily.copy.dir-dest -->
   109.5 +<screen><prompt>$</prompt> <userinput>mkdir d</userinput>
   109.6 +<prompt>$</prompt> <userinput>hg copy a b d</userinput>
   109.7 +<prompt>$</prompt> <userinput>ls d</userinput>
   109.8 +a  b
   109.9 +</screen>
  109.10 +<!-- END daily.copy.dir-dest -->
   110.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   110.2 +++ b/it/examples/daily.copy.dir-src-dest.it	Fri Sep 04 16:33:35 2009 +0200
   110.3 @@ -0,0 +1,5 @@
   110.4 +<!-- BEGIN daily.copy.dir-src-dest -->
   110.5 +<screen><prompt>$</prompt> <userinput>hg copy z d</userinput>
   110.6 +copio z/a/c in d/z/a/c
   110.7 +</screen>
   110.8 +<!-- END daily.copy.dir-src-dest -->
   111.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   111.2 +++ b/it/examples/daily.copy.dir-src.it	Fri Sep 04 16:33:35 2009 +0200
   111.3 @@ -0,0 +1,5 @@
   111.4 +<!-- BEGIN daily.copy.dir-src -->
   111.5 +<screen><prompt>$</prompt> <userinput>hg copy z e</userinput>
   111.6 +copio z/a/c in e/a/c
   111.7 +</screen>
   111.8 +<!-- END daily.copy.dir-src -->
   112.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   112.2 +++ b/it/examples/daily.copy.init.it	Fri Sep 04 16:33:35 2009 +0200
   112.3 @@ -0,0 +1,8 @@
   112.4 +<!-- BEGIN daily.copy.init -->
   112.5 +<screen><prompt>$</prompt> <userinput>hg init mia-copia</userinput>
   112.6 +<prompt>$</prompt> <userinput>cd mia-copia</userinput>
   112.7 +<prompt>$</prompt> <userinput>echo riga &gt; file</userinput>
   112.8 +<prompt>$</prompt> <userinput>hg add file</userinput>
   112.9 +<prompt>$</prompt> <userinput>hg commit -m "Aggiunto un file."</userinput>
  112.10 +</screen>
  112.11 +<!-- END daily.copy.init -->
   113.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   113.2 +++ b/it/examples/daily.copy.merge.it	Fri Sep 04 16:33:35 2009 +0200
   113.3 @@ -0,0 +1,18 @@
   113.4 +<!-- BEGIN daily.copy.merge -->
   113.5 +<screen><prompt>$</prompt> <userinput>hg pull ../mia-copia</userinput>
   113.6 +estraggo da ../mia-copia
   113.7 +cerco i cambiamenti
   113.8 +aggiungo i changeset
   113.9 +aggiungo i manifest
  113.10 +aggiungo i cambiamenti ai file
  113.11 +aggiunti 1 changeset con 1 cambiamenti a 1 file (+1 teste)
  113.12 +(eseguite 'hg heads' per vedere le teste, 'hg merge' per unire)
  113.13 +<prompt>$</prompt> <userinput>hg merge</userinput>
  113.14 +unisco file e nuovo-file in nuovo-file
  113.15 +0 file aggiornati, 1 file uniti, 0 file rimossi, 0 file irrisolti
  113.16 +(unione tra rami, ricordatevi di eseguire il commit)
  113.17 +<prompt>$</prompt> <userinput>cat nuovo-file</userinput>
  113.18 +riga
  113.19 +nuovi contenuti
  113.20 +</screen>
  113.21 +<!-- END daily.copy.merge -->
   114.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   114.2 +++ b/it/examples/daily.copy.other.it	Fri Sep 04 16:33:35 2009 +0200
   114.3 @@ -0,0 +1,6 @@
   114.4 +<!-- BEGIN daily.copy.other -->
   114.5 +<screen><prompt>$</prompt> <userinput>cd ../vostra-copia</userinput>
   114.6 +<prompt>$</prompt> <userinput>echo 'nuovi contenuti' &gt;&gt; file</userinput>
   114.7 +<prompt>$</prompt> <userinput>hg commit -m "File modificato."</userinput>
   114.8 +</screen>
   114.9 +<!-- END daily.copy.other -->
   115.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   115.2 +++ b/it/examples/daily.copy.simple.it	Fri Sep 04 16:33:35 2009 +0200
   115.3 @@ -0,0 +1,7 @@
   115.4 +<!-- BEGIN daily.copy.simple -->
   115.5 +<screen><prompt>$</prompt> <userinput>mkdir k</userinput>
   115.6 +<prompt>$</prompt> <userinput>hg copy a k</userinput>
   115.7 +<prompt>$</prompt> <userinput>ls k</userinput>
   115.8 +a
   115.9 +</screen>
  115.10 +<!-- END daily.copy.simple -->
   116.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   116.2 +++ b/it/examples/daily.copy.status-copy.it	Fri Sep 04 16:33:35 2009 +0200
   116.3 @@ -0,0 +1,7 @@
   116.4 +<!-- BEGIN daily.copy.status-copy -->
   116.5 +<screen><prompt>$</prompt> <userinput>hg status -C</userinput>
   116.6 +A nuovo-file
   116.7 +  file
   116.8 +<prompt>$</prompt> <userinput>hg commit -m "File copiato."</userinput>
   116.9 +</screen>
  116.10 +<!-- END daily.copy.status-copy -->
   117.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   117.2 +++ b/it/examples/daily.copy.status.it	Fri Sep 04 16:33:35 2009 +0200
   117.3 @@ -0,0 +1,5 @@
   117.4 +<!-- BEGIN daily.copy.status -->
   117.5 +<screen><prompt>$</prompt> <userinput>hg status</userinput>
   117.6 +A nuovo-file
   117.7 +</screen>
   117.8 +<!-- END daily.copy.status -->
   118.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   118.2 +++ b/it/examples/daily.files.add-dir.it	Fri Sep 04 16:33:35 2009 +0200
   118.3 @@ -0,0 +1,13 @@
   118.4 +<!-- BEGIN daily.files.add-dir -->
   118.5 +<screen><prompt>$</prompt> <userinput>mkdir b</userinput>
   118.6 +<prompt>$</prompt> <userinput>echo b &gt; b/qualchefile.txt</userinput>
   118.7 +<prompt>$</prompt> <userinput>echo c &gt; b/sorgente.cpp</userinput>
   118.8 +<prompt>$</prompt> <userinput>mkdir b/d</userinput>
   118.9 +<prompt>$</prompt> <userinput>echo d &gt; b/d/test.h</userinput>
  118.10 +<prompt>$</prompt> <userinput>hg add b</userinput>
  118.11 +aggiungo b/d/test.h
  118.12 +aggiungo b/qualchefile.txt
  118.13 +agginugo b/sorgente.cpp
  118.14 +<prompt>$</prompt> <userinput>hg commit -m "Aggiunti tutti i file nella sottodirectory."</userinput>
  118.15 +</screen>
  118.16 +<!-- END daily.files.add-dir -->
   119.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   119.2 +++ b/it/examples/daily.files.add.it	Fri Sep 04 16:33:35 2009 +0200
   119.3 @@ -0,0 +1,13 @@
   119.4 +<!-- BEGIN daily.files.add -->
   119.5 +<screen><prompt>$</prompt> <userinput>hg init esempio-add</userinput>
   119.6 +<prompt>$</prompt> <userinput>cd esempio-add</userinput>
   119.7 +<prompt>$</prompt> <userinput>echo a &gt; miofile.txt</userinput>
   119.8 +<prompt>$</prompt> <userinput>hg status</userinput>
   119.9 +? miofile.txt
  119.10 +<prompt>$</prompt> <userinput>hg add miofile.txt</userinput>
  119.11 +<prompt>$</prompt> <userinput>hg status</userinput>
  119.12 +A miofile.txt
  119.13 +<prompt>$</prompt> <userinput>hg commit -m "Aggiunto un file."</userinput>
  119.14 +<prompt>$</prompt> <userinput>hg status</userinput>
  119.15 +</screen>
  119.16 +<!-- END daily.files.add -->
   120.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   120.2 +++ b/it/examples/daily.files.addremove.it	Fri Sep 04 16:33:35 2009 +0200
   120.3 @@ -0,0 +1,10 @@
   120.4 +<!-- BEGIN daily.files.addremove -->
   120.5 +<screen><prompt>$</prompt> <userinput>hg init esempio-addremove</userinput>
   120.6 +<prompt>$</prompt> <userinput>cd esempio-addremove</userinput>
   120.7 +<prompt>$</prompt> <userinput>echo a &gt; a</userinput>
   120.8 +<prompt>$</prompt> <userinput>echo b &gt; b</userinput>
   120.9 +<prompt>$</prompt> <userinput>hg addremove</userinput>
  120.10 +aggiungo a
  120.11 +aggiungo b
  120.12 +</screen>
  120.13 +<!-- END daily.files.addremove -->
   121.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   121.2 +++ b/it/examples/daily.files.commit-addremove.it	Fri Sep 04 16:33:35 2009 +0200
   121.3 @@ -0,0 +1,6 @@
   121.4 +<!-- BEGIN daily.files.commit-addremove -->
   121.5 +<screen><prompt>$</prompt> <userinput>echo c &gt; c</userinput>
   121.6 +<prompt>$</prompt> <userinput>hg commit -A -m "Commit con addremove."</userinput>
   121.7 +aggiungo c
   121.8 +</screen>
   121.9 +<!-- END daily.files.commit-addremove -->
   122.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   122.2 +++ b/it/examples/daily.files.hidden.it	Fri Sep 04 16:33:35 2009 +0200
   122.3 @@ -0,0 +1,17 @@
   122.4 +<!-- BEGIN daily.files.hidden -->
   122.5 +<screen><prompt>$</prompt> <userinput>hg init esempio-nascosto</userinput>
   122.6 +<prompt>$</prompt> <userinput>cd esempio-nascosto</userinput>
   122.7 +<prompt>$</prompt> <userinput>mkdir vuota</userinput>
   122.8 +<prompt>$</prompt> <userinput>touch vuota/.nascosto</userinput>
   122.9 +<prompt>$</prompt> <userinput>hg add vuota/.nascosto</userinput>
  122.10 +<prompt>$</prompt> <userinput>hg commit -m "Gestisce una directory che sembra vuota."</userinput>
  122.11 +<prompt>$</prompt> <userinput>ls vuota</userinput>
  122.12 +<prompt>$</prompt> <userinput>cd ..</userinput>
  122.13 +<prompt>$</prompt> <userinput>hg clone esempio-nascosto temp</userinput>
  122.14 +aggiorno la directory di lavoro
  122.15 +1 file aggiornati, 0 file uniti, 0 file rimossi, 0 file irrisolti
  122.16 +<prompt>$</prompt> <userinput>ls temp</userinput>
  122.17 +vuota
  122.18 +<prompt>$</prompt> <userinput>ls temp/vuota</userinput>
  122.19 +</screen>
  122.20 +<!-- END daily.files.hidden -->
   123.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   123.2 +++ b/it/examples/daily.files.missing.it	Fri Sep 04 16:33:35 2009 +0200
   123.3 @@ -0,0 +1,11 @@
   123.4 +<!-- BEGIN daily.files.missing -->
   123.5 +<screen><prompt>$</prompt> <userinput>hg init esempio-mancante</userinput>
   123.6 +<prompt>$</prompt> <userinput>cd esempio-mancante</userinput>
   123.7 +<prompt>$</prompt> <userinput>echo a &gt; a</userinput>
   123.8 +<prompt>$</prompt> <userinput>hg add a</userinput>
   123.9 +<prompt>$</prompt> <userinput>hg commit -m "Il file sta per diventare mancante."</userinput>
  123.10 +<prompt>$</prompt> <userinput>rm a</userinput>
  123.11 +<prompt>$</prompt> <userinput>hg status</userinput>
  123.12 +! a
  123.13 +</screen>
  123.14 +<!-- END daily.files.missing -->
   124.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   124.2 +++ b/it/examples/daily.files.recover-missing.it	Fri Sep 04 16:33:35 2009 +0200
   124.3 @@ -0,0 +1,7 @@
   124.4 +<!-- BEGIN daily.files.recover-missing -->
   124.5 +<screen><prompt>$</prompt> <userinput>hg revert a</userinput>
   124.6 +<prompt>$</prompt> <userinput>cat a</userinput>
   124.7 +a
   124.8 +<prompt>$</prompt> <userinput>hg status</userinput>
   124.9 +</screen>
  124.10 +<!-- END daily.files.recover-missing -->
   125.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   125.2 +++ b/it/examples/daily.files.remove-after.it	Fri Sep 04 16:33:35 2009 +0200
   125.3 @@ -0,0 +1,6 @@
   125.4 +<!-- BEGIN daily.files.remove-after -->
   125.5 +<screen><prompt>$</prompt> <userinput>hg remove --after a</userinput>
   125.6 +<prompt>$</prompt> <userinput>hg status</userinput>
   125.7 +R a
   125.8 +</screen>
   125.9 +<!-- END daily.files.remove-after -->
   126.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   126.2 +++ b/it/examples/daily.files.remove.it	Fri Sep 04 16:33:35 2009 +0200
   126.3 @@ -0,0 +1,16 @@
   126.4 +<!-- BEGIN daily.files.remove -->
   126.5 +<screen><prompt>$</prompt> <userinput>hg init esempio-remove</userinput>
   126.6 +<prompt>$</prompt> <userinput>cd esempio-remove</userinput>
   126.7 +<prompt>$</prompt> <userinput>echo a &gt; a</userinput>
   126.8 +<prompt>$</prompt> <userinput>mkdir b</userinput>
   126.9 +<prompt>$</prompt> <userinput>echo b &gt; b/b</userinput>
  126.10 +<prompt>$</prompt> <userinput>hg add a b</userinput>
  126.11 +aggiungo b/b
  126.12 +<prompt>$</prompt> <userinput>hg commit -m "Piccolo esempio di rimozione di file."</userinput>
  126.13 +<prompt>$</prompt> <userinput>hg remove a</userinput>
  126.14 +<prompt>$</prompt> <userinput>hg status</userinput>
  126.15 +R a
  126.16 +<prompt>$</prompt> <userinput>hg remove b</userinput>
  126.17 +rimuovo b/b
  126.18 +</screen>
  126.19 +<!-- END daily.files.remove -->
   127.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   127.2 +++ b/it/examples/daily.rename.rename.it	Fri Sep 04 16:33:35 2009 +0200
   127.3 @@ -0,0 +1,4 @@
   127.4 +<!-- BEGIN daily.rename.rename -->
   127.5 +<screen><prompt>$</prompt> <userinput>hg rename a b</userinput>
   127.6 +</screen>
   127.7 +<!-- END daily.rename.rename -->
   128.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   128.2 +++ b/it/examples/daily.rename.status-copy.it	Fri Sep 04 16:33:35 2009 +0200
   128.3 @@ -0,0 +1,7 @@
   128.4 +<!-- BEGIN daily.rename.status-copy -->
   128.5 +<screen><prompt>$</prompt> <userinput>hg status -C</userinput>
   128.6 +A b
   128.7 +  a
   128.8 +R a
   128.9 +</screen>
  128.10 +<!-- END daily.rename.status-copy -->
   129.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   129.2 +++ b/it/examples/daily.rename.status.it	Fri Sep 04 16:33:35 2009 +0200
   129.3 @@ -0,0 +1,6 @@
   129.4 +<!-- BEGIN daily.rename.status -->
   129.5 +<screen><prompt>$</prompt> <userinput>hg status</userinput>
   129.6 +A b
   129.7 +R a
   129.8 +</screen>
   129.9 +<!-- END daily.rename.status -->
   130.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   130.2 +++ b/it/examples/daily.revert.add.it	Fri Sep 04 16:33:35 2009 +0200
   130.3 @@ -0,0 +1,10 @@
   130.4 +<!-- BEGIN daily.revert.add -->
   130.5 +<screen><prompt>$</prompt> <userinput>echo oops &gt; oops</userinput>
   130.6 +<prompt>$</prompt> <userinput>hg add oops</userinput>
   130.7 +<prompt>$</prompt> <userinput>hg status oops</userinput>
   130.8 +A oops
   130.9 +<prompt>$</prompt> <userinput>hg revert oops</userinput>
  130.10 +<prompt>$</prompt> <userinput>hg status</userinput>
  130.11 +? oops
  130.12 +</screen>
  130.13 +<!-- END daily.revert.add -->
   131.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   131.2 +++ b/it/examples/daily.revert.copy.it	Fri Sep 04 16:33:35 2009 +0200
   131.3 @@ -0,0 +1,7 @@
   131.4 +<!-- BEGIN daily.revert.copy -->
   131.5 +<screen><prompt>$</prompt> <userinput>hg copy file nuovo-file</userinput>
   131.6 +<prompt>$</prompt> <userinput>hg revert nuovo-file</userinput>
   131.7 +<prompt>$</prompt> <userinput>hg status</userinput>
   131.8 +? nuovo-file
   131.9 +</screen>
  131.10 +<!-- END daily.revert.copy -->
   132.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   132.2 +++ b/it/examples/daily.revert.missing.it	Fri Sep 04 16:33:35 2009 +0200
   132.3 @@ -0,0 +1,9 @@
   132.4 +<!-- BEGIN daily.revert.missing -->
   132.5 +<screen><prompt>$</prompt> <userinput>rm file</userinput>
   132.6 +<prompt>$</prompt> <userinput>hg status</userinput>
   132.7 +! file
   132.8 +<prompt>$</prompt> <userinput>hg revert file</userinput>
   132.9 +<prompt>$</prompt> <userinput>ls file</userinput>
  132.10 +file
  132.11 +</screen>
  132.12 +<!-- END daily.revert.missing -->
   133.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   133.2 +++ b/it/examples/daily.revert.modify.it	Fri Sep 04 16:33:35 2009 +0200
   133.3 @@ -0,0 +1,13 @@
   133.4 +<!-- BEGIN daily.revert.modify -->
   133.5 +<screen><prompt>$</prompt> <userinput>cat file</userinput>
   133.6 +contenuto originale
   133.7 +<prompt>$</prompt> <userinput>echo cambiamento non voluto &gt;&gt; file</userinput>
   133.8 +<prompt>$</prompt> <userinput>hg diff file</userinput>
   133.9 +diff -r d17672b9fe6b file
  133.10 +--- a/file	Fri Jun 05 15:50:07 2009 +0000
  133.11 ++++ b/file	Fri Jun 05 15:50:07 2009 +0000
  133.12 +@@ -1,1 +1,2 @@
  133.13 + contenuto originale
  133.14 ++cambiamento non voluto
  133.15 +</screen>
  133.16 +<!-- END daily.revert.modify -->
   134.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   134.2 +++ b/it/examples/daily.revert.remove.it	Fri Sep 04 16:33:35 2009 +0200
   134.3 @@ -0,0 +1,10 @@
   134.4 +<!-- BEGIN daily.revert.remove -->
   134.5 +<screen><prompt>$</prompt> <userinput>hg remove file</userinput>
   134.6 +<prompt>$</prompt> <userinput>hg status</userinput>
   134.7 +R file
   134.8 +<prompt>$</prompt> <userinput>hg revert file</userinput>
   134.9 +<prompt>$</prompt> <userinput>hg status</userinput>
  134.10 +<prompt>$</prompt> <userinput>ls file</userinput>
  134.11 +file
  134.12 +</screen>
  134.13 +<!-- END daily.revert.remove -->
   135.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   135.2 +++ b/it/examples/daily.revert.status.it	Fri Sep 04 16:33:35 2009 +0200
   135.3 @@ -0,0 +1,8 @@
   135.4 +<!-- BEGIN daily.revert.status -->
   135.5 +<screen><prompt>$</prompt> <userinput>hg status</userinput>
   135.6 +? file.orig
   135.7 +<prompt>$</prompt> <userinput>cat file.orig</userinput>
   135.8 +contenuto originale
   135.9 +cambiamento non voluto
  135.10 +</screen>
  135.11 +<!-- END daily.revert.status -->
   136.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   136.2 +++ b/it/examples/daily.revert.unmodify.it	Fri Sep 04 16:33:35 2009 +0200
   136.3 @@ -0,0 +1,8 @@
   136.4 +<!-- BEGIN daily.revert.unmodify -->
   136.5 +<screen><prompt>$</prompt> <userinput>hg status</userinput>
   136.6 +M file
   136.7 +<prompt>$</prompt> <userinput>hg revert file</userinput>
   136.8 +<prompt>$</prompt> <userinput>cat file</userinput>
   136.9 +contenuto originale
  136.10 +</screen>
  136.11 +<!-- END daily.revert.unmodify -->
   137.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   137.2 +++ b/it/examples/extdiff.diff.it	Fri Sep 04 16:33:35 2009 +0200
   137.3 @@ -0,0 +1,10 @@
   137.4 +<!-- BEGIN extdiff.diff -->
   137.5 +<screen><prompt>$</prompt> <userinput>hg diff</userinput>
   137.6 +diff -r dc7b09ad1097 miofile
   137.7 +--- a/miofile	Fri Jun 05 15:50:16 2009 +0000
   137.8 ++++ b/miofile	Fri Jun 05 15:50:17 2009 +0000
   137.9 +@@ -1,1 +1,2 @@
  137.10 + La prima riga.
  137.11 ++La seconda riga.
  137.12 +</screen>
  137.13 +<!-- END extdiff.diff -->
   138.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   138.2 +++ b/it/examples/extdiff.extdiff-ctx.it	Fri Sep 04 16:33:35 2009 +0200
   138.3 @@ -0,0 +1,11 @@
   138.4 +<!-- BEGIN extdiff.extdiff-ctx -->
   138.5 +<screen><prompt>$</prompt> <userinput>hg extdiff -o -NprcC5</userinput>
   138.6 +*** a.dc7b09ad1097/miofile	Fri Jun  5 15:50:18 2009
   138.7 +--- /tmp/a/miofile	Fri Jun  5 15:50:16 2009
   138.8 +***************
   138.9 +*** 1 ****
  138.10 +--- 1,2 ----
  138.11 +  La prima riga.
  138.12 ++ La seconda riga.
  138.13 +</screen>
  138.14 +<!-- END extdiff.extdiff-ctx -->
   139.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   139.2 +++ b/it/examples/extdiff.extdiff.it	Fri Sep 04 16:33:35 2009 +0200
   139.3 @@ -0,0 +1,9 @@
   139.4 +<!-- BEGIN extdiff.extdiff -->
   139.5 +<screen><prompt>$</prompt> <userinput>hg extdiff</userinput>
   139.6 +--- a.dc7b09ad1097/miofile	2009-06-05 15:50:17.000000000 +0000
   139.7 ++++ /tmp/a/miofile	2009-06-05 15:50:16.000000000 +0000
   139.8 +@@ -1 +1,2 @@
   139.9 + La prima riga.
  139.10 ++La seconda riga.
  139.11 +</screen>
  139.12 +<!-- END extdiff.extdiff -->
   140.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   140.2 +++ b/it/examples/filenames.dirs.it	Fri Sep 04 16:33:35 2009 +0200
   140.3 @@ -0,0 +1,8 @@
   140.4 +<!-- BEGIN filenames.dirs -->
   140.5 +<screen><prompt>$</prompt> <userinput>hg status sorgenti</userinput>
   140.6 +? sorgenti/principale.py
   140.7 +? sorgenti/controllore/_controllore.c
   140.8 +? sorgenti/controllore/controllore.py
   140.9 +? sorgenti/xyzzy.txt
  140.10 +</screen>
  140.11 +<!-- END filenames.dirs -->
   141.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   141.2 +++ b/it/examples/filenames.files.it	Fri Sep 04 16:33:35 2009 +0200
   141.3 @@ -0,0 +1,4 @@
   141.4 +<!-- BEGIN filenames.files -->
   141.5 +<screen><prompt>$</prompt> <userinput>hg add COPIARE LEGGIMI esempi/semplice.py</userinput>
   141.6 +</screen>
   141.7 +<!-- END filenames.files -->
   142.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   142.2 +++ b/it/examples/filenames.filter.exclude.it	Fri Sep 04 16:33:35 2009 +0200
   142.3 @@ -0,0 +1,6 @@
   142.4 +<!-- BEGIN filenames.filter.exclude -->
   142.5 +<screen><prompt>$</prompt> <userinput>hg status -X '**.py' sorgenti</userinput>
   142.6 +? sorgenti/controllore/_controllore.c
   142.7 +? sorgenti/xyzzy.txt
   142.8 +</screen>
   142.9 +<!-- END filenames.filter.exclude -->
   143.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   143.2 +++ b/it/examples/filenames.filter.include.it	Fri Sep 04 16:33:35 2009 +0200
   143.3 @@ -0,0 +1,5 @@
   143.4 +<!-- BEGIN filenames.filter.include -->
   143.5 +<screen><prompt>$</prompt> <userinput>hg status -I '*.in'</userinput>
   143.6 +? MANIFEST.in
   143.7 +</screen>
   143.8 +<!-- END filenames.filter.include -->
   144.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   144.2 +++ b/it/examples/filenames.glob.group.it	Fri Sep 04 16:33:35 2009 +0200
   144.3 @@ -0,0 +1,6 @@
   144.4 +<!-- BEGIN filenames.glob.group -->
   144.5 +<screen><prompt>$</prompt> <userinput>hg status 'glob:*.{in,py}'</userinput>
   144.6 +? MANIFEST.in
   144.7 +? setup.py
   144.8 +</screen>
   144.9 +<!-- END filenames.glob.group -->
   145.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   145.2 +++ b/it/examples/filenames.glob.question.it	Fri Sep 04 16:33:35 2009 +0200
   145.3 @@ -0,0 +1,5 @@
   145.4 +<!-- BEGIN filenames.glob.question -->
   145.5 +<screen><prompt>$</prompt> <userinput>hg status 'glob:**.?'</userinput>
   145.6 +? sorgenti/controllore/_controllore.c
   145.7 +</screen>
   145.8 +<!-- END filenames.glob.question -->
   146.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   146.2 +++ b/it/examples/filenames.glob.range.it	Fri Sep 04 16:33:35 2009 +0200
   146.3 @@ -0,0 +1,6 @@
   146.4 +<!-- BEGIN filenames.glob.range -->
   146.5 +<screen><prompt>$</prompt> <userinput>hg status 'glob:**[nr-t]'</userinput>
   146.6 +? MANIFEST.in
   146.7 +? sorgenti/xyzzy.txt
   146.8 +</screen>
   146.9 +<!-- END filenames.glob.range -->
   147.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   147.2 +++ b/it/examples/filenames.glob.star-starstar.it	Fri Sep 04 16:33:35 2009 +0200
   147.3 @@ -0,0 +1,11 @@
   147.4 +<!-- BEGIN filenames.glob.star-starstar -->
   147.5 +<screen><prompt>$</prompt> <userinput>hg status 'glob:*.py'</userinput>
   147.6 +? setup.py
   147.7 +<prompt>$</prompt> <userinput>hg status 'glob:**.py'</userinput>
   147.8 +A esempi/semplice.py
   147.9 +A sorgenti/principale.py
  147.10 +? esempi/efficiente.py
  147.11 +? setup.py
  147.12 +? sorgenti/controllore/controllore.py
  147.13 +</screen>
  147.14 +<!-- END filenames.glob.star-starstar -->
   148.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   148.2 +++ b/it/examples/filenames.glob.star.it	Fri Sep 04 16:33:35 2009 +0200
   148.3 @@ -0,0 +1,5 @@
   148.4 +<!-- BEGIN filenames.glob.star -->
   148.5 +<screen><prompt>$</prompt> <userinput>hg add 'glob:*.py'</userinput>
   148.6 +aggiungo principale.py
   148.7 +</screen>
   148.8 +<!-- END filenames.glob.star -->
   149.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   149.2 +++ b/it/examples/filenames.glob.starstar.it	Fri Sep 04 16:33:35 2009 +0200
   149.3 @@ -0,0 +1,10 @@
   149.4 +<!-- BEGIN filenames.glob.starstar -->
   149.5 +<screen><prompt>$</prompt> <userinput>cd ..</userinput>
   149.6 +<prompt>$</prompt> <userinput>hg status 'glob:**.py'</userinput>
   149.7 +A esempi/semplice.py
   149.8 +A sorgenti/principale.py
   149.9 +? esempi/efficiente.py
  149.10 +? setup.py
  149.11 +? sorgenti/controllore/controllore.py
  149.12 +</screen>
  149.13 +<!-- END filenames.glob.starstar -->
   150.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   150.2 +++ b/it/examples/filenames.wdir-relname.it	Fri Sep 04 16:33:35 2009 +0200
   150.3 @@ -0,0 +1,25 @@
   150.4 +<!-- BEGIN filenames.wdir-relname -->
   150.5 +<screen><prompt>$</prompt> <userinput>hg status</userinput>
   150.6 +A COPIARE
   150.7 +A LEGGIMI
   150.8 +A esempi/semplice.py
   150.9 +? MANIFEST.in
  150.10 +? esempi/efficiente.py
  150.11 +? setup.py
  150.12 +? sorgenti/principale.py
  150.13 +? sorgenti/controllore/_controllore.c
  150.14 +? sorgenti/controllore/controllore.py
  150.15 +? sorgenti/xyzzy.txt
  150.16 +<prompt>$</prompt> <userinput>hg status `hg root`</userinput>
  150.17 +A ../COPIARE
  150.18 +A ../LEGGIMI
  150.19 +A ../esempi/semplice.py
  150.20 +? ../MANIFEST.in
  150.21 +? ../esempi/performante.py
  150.22 +? ../setup.py
  150.23 +? principale.py
  150.24 +? controllore/_controllore.c
  150.25 +? controllore/controllore.py
  150.26 +? xyzzy.txt
  150.27 +</screen>
  150.28 +<!-- END filenames.wdir-relname -->
   151.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   151.2 +++ b/it/examples/filenames.wdir-subdir.it	Fri Sep 04 16:33:35 2009 +0200
   151.3 @@ -0,0 +1,17 @@
   151.4 +<!-- BEGIN filenames.wdir-subdir -->
   151.5 +<screen><prompt>$</prompt> <userinput>cd sorgenti</userinput>
   151.6 +<prompt>$</prompt> <userinput>hg add -n</userinput>
   151.7 +aggiungo ../MANIFEST.in
   151.8 +aggiungo ../esempi/efficiente.py
   151.9 +aggiungo ../setup.py
  151.10 +aggiungo principale.py
  151.11 +aggiungo controllore/_controllore.c
  151.12 +aggiungo controllore/controllore.py
  151.13 +aggiungo xyzzy.txt
  151.14 +<prompt>$</prompt> <userinput>hg add -n .</userinput>
  151.15 +aggiungo principale.py
  151.16 +aggiungo controllore/_controllore.c
  151.17 +aggiungo controllore/controllore.py
  151.18 +aggiungo xyzzy.txt
  151.19 +</screen>
  151.20 +<!-- END filenames.wdir-subdir -->
   152.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   152.2 +++ b/it/examples/hook.msglen.go.it	Fri Sep 04 16:33:35 2009 +0200
   152.3 @@ -0,0 +1,13 @@
   152.4 +<!-- BEGIN hook.msglen.go -->
   152.5 +<screen><prompt>$</prompt> <userinput>cat .hg/hgrc</userinput>
   152.6 +[hooks]
   152.7 +pretxncommit.lunghezza_messaggio = test `hg tip --template {desc} | wc -c` -ge 15
   152.8 +<prompt>$</prompt> <userinput>echo a &gt; a</userinput>
   152.9 +<prompt>$</prompt> <userinput>hg add a</userinput>
  152.10 +<prompt>$</prompt> <userinput>hg commit -A -m "Troppo breve."</userinput>
  152.11 +transazione abortita!
  152.12 +ripristino completato
  152.13 +fallimento: l'hook pretxncommit.lunghezza_messaggio è terminato con codice di stato 1
  152.14 +<prompt>$</prompt> <userinput>hg commit -A -m "Abbastanza lungo."</userinput>
  152.15 +</screen>
  152.16 +<!-- END hook.msglen.go -->
   153.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   153.2 +++ b/it/examples/hook.simple.ext.it	Fri Sep 04 16:33:35 2009 +0200
   153.3 @@ -0,0 +1,8 @@
   153.4 +<!-- BEGIN hook.simple.ext -->
   153.5 +<screen><prompt>$</prompt> <userinput>echo 'commit.quando = echo -n "data di inserimento: "; date' &gt;&gt; .hg/hgrc</userinput>
   153.6 +<prompt>$</prompt> <userinput>echo a &gt;&gt; a</userinput>
   153.7 +<prompt>$</prompt> <userinput>hg commit -m "Ho due hook."</userinput>
   153.8 +inserito c62525b70eac19cfd72060e1654e8c62eab4ebee
   153.9 +data di inserimento: Fri Jun  5 15:50:28 GMT 2009
  153.10 +</screen>
  153.11 +<!-- END hook.simple.ext -->
   154.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   154.2 +++ b/it/examples/hook.simple.init.it	Fri Sep 04 16:33:35 2009 +0200
   154.3 @@ -0,0 +1,14 @@
   154.4 +<!-- BEGIN hook.simple.init -->
   154.5 +<screen><prompt>$</prompt> <userinput>hg init hook-di-test</userinput>
   154.6 +<prompt>$</prompt> <userinput>cd hook-di-test</userinput>
   154.7 +<prompt>$</prompt> <userinput>echo '[hooks]' &gt;&gt; .hg/hgrc</userinput>
   154.8 +<prompt>$</prompt> <userinput>echo 'commit = echo inserito $HG_NODE' &gt;&gt; .hg/hgrc</userinput>
   154.9 +<prompt>$</prompt> <userinput>cat .hg/hgrc</userinput>
  154.10 +[hooks]
  154.11 +commit = echo inserito $HG_NODE
  154.12 +<prompt>$</prompt> <userinput>echo a &gt; a</userinput>
  154.13 +<prompt>$</prompt> <userinput>hg add a</userinput>
  154.14 +<prompt>$</prompt> <userinput>hg commit -m "Collaudo l'hook di commit."</userinput>
  154.15 +inserito 35ce7b98906996dea87740158ba6c3d7bcfa2448
  154.16 +</screen>
  154.17 +<!-- END hook.simple.init -->
   155.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   155.2 +++ b/it/examples/hook.simple.pretxncommit.it	Fri Sep 04 16:33:35 2009 +0200
   155.3 @@ -0,0 +1,16 @@
   155.4 +<!-- BEGIN hook.simple.pretxncommit -->
   155.5 +<screen><prompt>$</prompt> <userinput>cat controlla_bug_id</userinput>
   155.6 +#!/bin/sh
   155.7 +# controlla che un messaggio di commit contenga un identificatore numerico di bug
   155.8 +hg log -r $1 --template {desc} | grep -q "\&lt;bug *[0-9]"
   155.9 +<prompt>$</prompt> <userinput>echo 'pretxncommit.bug_id_richiesto = ./controlla_bug_id $HG_NODE' &gt;&gt; .hg/hgrc</userinput>
  155.10 +<prompt>$</prompt> <userinput>echo a &gt;&gt; a</userinput>
  155.11 +<prompt>$</prompt> <userinput>hg commit -m "Non ho menzionato alcun identificatore di bug."</userinput>
  155.12 +transazione abortita!
  155.13 +ripristino completato
  155.14 +fallimento: l'hook pretxncommit.bug_id_richiesto è terminato con codice di stato 1
  155.15 +<prompt>$</prompt> <userinput>hg commit -m "Vi rimando al bug 666."</userinput>
  155.16 +inserito f753cb1e1e77ea944429e1a84d8728e96b41446e
  155.17 +data di inserimento: Fri Jun  5 15:50:29 GMT 2009
  155.18 +</screen>
  155.19 +<!-- END hook.simple.pretxncommit -->
   156.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   156.2 +++ b/it/examples/issue29.go.it	Fri Sep 04 16:33:35 2009 +0200
   156.3 @@ -0,0 +1,20 @@
   156.4 +<!-- BEGIN issue29.go -->
   156.5 +<screen><prompt>$</prompt> <userinput>hg init problema29</userinput>
   156.6 +<prompt>$</prompt> <userinput>cd problema29</userinput>
   156.7 +<prompt>$</prompt> <userinput>echo a &gt; a</userinput>
   156.8 +<prompt>$</prompt> <userinput>hg ci -Ama</userinput>
   156.9 +aggiungo a
  156.10 +<prompt>$</prompt> <userinput>echo b &gt; b</userinput>
  156.11 +<prompt>$</prompt> <userinput>hg ci -Amb</userinput>
  156.12 +aggiungo b
  156.13 +<prompt>$</prompt> <userinput>hg up 0</userinput>
  156.14 +0 file aggiornati, 0 file uniti, 1 file rimossi, 0 file irrisolti
  156.15 +<prompt>$</prompt> <userinput>mkdir b</userinput>
  156.16 +<prompt>$</prompt> <userinput>echo b &gt; b/b</userinput>
  156.17 +<prompt>$</prompt> <userinput>hg ci -Amc</userinput>
  156.18 +aggiungo b/b
  156.19 +creata una nuova testa
  156.20 +<prompt>$</prompt> <userinput>hg merge</userinput>
  156.21 +fallimento: è una directory: /tmp/problema29/b
  156.22 +</screen>
  156.23 +<!-- END issue29.go -->
   157.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   157.2 +++ b/it/examples/mq.dodiff.diff.it	Fri Sep 04 16:33:35 2009 +0200
   157.3 @@ -0,0 +1,16 @@
   157.4 +<!-- BEGIN mq.dodiff.diff -->
   157.5 +<screen><prompt>$</prompt> <userinput>echo 'questo è il mio primo pensiero' &gt; vecchiofile</userinput>
   157.6 +<prompt>$</prompt> <userinput>echo 'ho cambiato idea' &gt; nuovofile</userinput>
   157.7 +<prompt>$</prompt> <userinput>diff -u vecchiofile nuovofile &gt; piccola.patch</userinput>
   157.8 +<prompt>$</prompt> <userinput>cat piccola.patch</userinput>
   157.9 +--- vecchiofile	2009-06-05 15:50:32.000000000 +0000
  157.10 ++++ nuovofile	2009-06-05 15:50:32.000000000 +0000
  157.11 +@@ -1 +1 @@
  157.12 +-questo è il mio primo pensiero
  157.13 ++ho cambiato idea
  157.14 +<prompt>$</prompt> <userinput>patch &lt; piccola.patch</userinput>
  157.15 +correggo il file vecchiofile
  157.16 +<prompt>$</prompt> <userinput>cat vecchiofile</userinput>
  157.17 +ho cambiato idea
  157.18 +</screen>
  157.19 +<!-- END mq.dodiff.diff -->
   158.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   158.2 +++ b/it/examples/mq.guards.init.it	Fri Sep 04 16:33:35 2009 +0200
   158.3 @@ -0,0 +1,12 @@
   158.4 +<!-- BEGIN mq.guards.init -->
   158.5 +<screen><prompt>$</prompt> <userinput>hg qinit</userinput>
   158.6 +<prompt>$</prompt> <userinput>hg qnew ciao.patch</userinput>
   158.7 +<prompt>$</prompt> <userinput>echo ciao &gt; ciao</userinput>
   158.8 +<prompt>$</prompt> <userinput>hg add ciao</userinput>
   158.9 +<prompt>$</prompt> <userinput>hg qrefresh</userinput>
  158.10 +<prompt>$</prompt> <userinput>hg qnew arrivederci.patch</userinput>
  158.11 +<prompt>$</prompt> <userinput>echo arrivederci &gt; arrivederci</userinput>
  158.12 +<prompt>$</prompt> <userinput>hg add arrivederci</userinput>
  158.13 +<prompt>$</prompt> <userinput>hg qrefresh</userinput>
  158.14 +</screen>
  158.15 +<!-- END mq.guards.init -->
   159.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   159.2 +++ b/it/examples/mq.guards.qguard.it	Fri Sep 04 16:33:35 2009 +0200
   159.3 @@ -0,0 +1,5 @@
   159.4 +<!-- BEGIN mq.guards.qguard -->
   159.5 +<screen><prompt>$</prompt> <userinput>hg qguard</userinput>
   159.6 +arrivederci.patch: senza guardie
   159.7 +</screen>
   159.8 +<!-- END mq.guards.qguard -->
   160.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   160.2 +++ b/it/examples/mq.guards.qguard.neg.it	Fri Sep 04 16:33:35 2009 +0200
   160.3 @@ -0,0 +1,6 @@
   160.4 +<!-- BEGIN mq.guards.qguard.neg -->
   160.5 +<screen><prompt>$</prompt> <userinput>hg qguard -- ciao.patch -quux</userinput>
   160.6 +<prompt>$</prompt> <userinput>hg qguard ciao.patch</userinput>
   160.7 +ciao.patch: -quux
   160.8 +</screen>
   160.9 +<!-- END mq.guards.qguard.neg -->
   161.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   161.2 +++ b/it/examples/mq.guards.qguard.pos.it	Fri Sep 04 16:33:35 2009 +0200
   161.3 @@ -0,0 +1,6 @@
   161.4 +<!-- BEGIN mq.guards.qguard.pos -->
   161.5 +<screen><prompt>$</prompt> <userinput>hg qguard +foo</userinput>
   161.6 +<prompt>$</prompt> <userinput>hg qguard</userinput>
   161.7 +arrivederci.patch: +foo
   161.8 +</screen>
   161.9 +<!-- END mq.guards.qguard.pos -->
   162.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   162.2 +++ b/it/examples/mq.guards.qselect.cat.it	Fri Sep 04 16:33:35 2009 +0200
   162.3 @@ -0,0 +1,5 @@
   162.4 +<!-- BEGIN mq.guards.qselect.cat -->
   162.5 +<screen><prompt>$</prompt> <userinput>cat .hg/patches/guards</userinput>
   162.6 +foo
   162.7 +</screen>
   162.8 +<!-- END mq.guards.qselect.cat -->
   163.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   163.2 +++ b/it/examples/mq.guards.qselect.error.it	Fri Sep 04 16:33:35 2009 +0200
   163.3 @@ -0,0 +1,5 @@
   163.4 +<!-- BEGIN mq.guards.qselect.error -->
   163.5 +<screen><prompt>$</prompt> <userinput>hg qselect +foo</userinput>
   163.6 +fallimento: la guardia '+foo' comincia con un carattere non valido: '+'
   163.7 +</screen>
   163.8 +<!-- END mq.guards.qselect.error -->
   164.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   164.2 +++ b/it/examples/mq.guards.qselect.foo.it	Fri Sep 04 16:33:35 2009 +0200
   164.3 @@ -0,0 +1,11 @@
   164.4 +<!-- BEGIN mq.guards.qselect.foo -->
   164.5 +<screen><prompt>$</prompt> <userinput>hg qpop -a</userinput>
   164.6 +la coda delle patch è vuota
   164.7 +<prompt>$</prompt> <userinput>hg qselect</userinput>
   164.8 +nessuna guardia attiva
   164.9 +<prompt>$</prompt> <userinput>hg qselect foo</userinput>
  164.10 +il numero di patch non applicate senza guardia è cambiato da 1 a 2
  164.11 +<prompt>$</prompt> <userinput>hg qselect</userinput>
  164.12 +foo
  164.13 +</screen>
  164.14 +<!-- END mq.guards.qselect.foo -->
   165.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   165.2 +++ b/it/examples/mq.guards.qselect.foobar.it	Fri Sep 04 16:33:35 2009 +0200
   165.3 @@ -0,0 +1,11 @@
   165.4 +<!-- BEGIN mq.guards.qselect.foobar -->
   165.5 +<screen><prompt>$</prompt> <userinput>hg qselect foo bar</userinput>
   165.6 +il numero di patch non applicate senza guardia è cambiato da 0 a 2
   165.7 +<prompt>$</prompt> <userinput>hg qpop -a</userinput>
   165.8 +nessuna patch applicata
   165.9 +<prompt>$</prompt> <userinput>hg qpush -a</userinput>
  165.10 +applico ciao.patch
  165.11 +applico arrivederci.patch
  165.12 +ora a: arrivederci.patch
  165.13 +</screen>
  165.14 +<!-- END mq.guards.qselect.foobar -->
   166.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   166.2 +++ b/it/examples/mq.guards.qselect.qpush.it	Fri Sep 04 16:33:35 2009 +0200
   166.3 @@ -0,0 +1,7 @@
   166.4 +<!-- BEGIN mq.guards.qselect.qpush -->
   166.5 +<screen><prompt>$</prompt> <userinput>hg qpush -a</userinput>
   166.6 +applico ciao.patch
   166.7 +applico arrivederci.patch
   166.8 +ora a: arrivederci.patch
   166.9 +</screen>
  166.10 +<!-- END mq.guards.qselect.qpush -->
   167.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   167.2 +++ b/it/examples/mq.guards.qselect.quux.it	Fri Sep 04 16:33:35 2009 +0200
   167.3 @@ -0,0 +1,9 @@
   167.4 +<!-- BEGIN mq.guards.qselect.quux -->
   167.5 +<screen><prompt>$</prompt> <userinput>hg qselect quux</userinput>
   167.6 +il numero di patch applicate con guardia è cambiato da 0 a 2
   167.7 +<prompt>$</prompt> <userinput>hg qpop -a</userinput>
   167.8 +la coda delle patch è vuota
   167.9 +<prompt>$</prompt> <userinput>hg qpush -a</userinput>
  167.10 +la serie di patch è già stata completamente applicata
  167.11 +</screen>
  167.12 +<!-- END mq.guards.qselect.quux -->
   168.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   168.2 +++ b/it/examples/mq.guards.series.it	Fri Sep 04 16:33:35 2009 +0200
   168.3 @@ -0,0 +1,6 @@
   168.4 +<!-- BEGIN mq.guards.series -->
   168.5 +<screen><prompt>$</prompt> <userinput>cat .hg/patches/series</userinput>
   168.6 +ciao.patch #-quux
   168.7 +arrivederci.patch #+foo
   168.8 +</screen>
   168.9 +<!-- END mq.guards.series -->
   169.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   169.2 +++ b/it/examples/mq.id.output.it	Fri Sep 04 16:33:35 2009 +0200
   169.3 @@ -0,0 +1,35 @@
   169.4 +<!-- BEGIN mq.id.output -->
   169.5 +<screen><prompt>$</prompt> <userinput>hg qapplied</userinput>
   169.6 +prima.patch
   169.7 +seconda.patch
   169.8 +<prompt>$</prompt> <userinput>hg log -r qbase:qtip</userinput>
   169.9 +changeset:   1:32b3cae9e753
  169.10 +etichetta:   prima.patch
  169.11 +etichetta:   qbase
  169.12 +utente:      Bryan O'Sullivan &lt;bos@serpentine.com&gt;
  169.13 +data:        Fri Jun 05 15:50:45 2009 +0000
  169.14 +sommario:    [mq]: prima.patch
  169.15 +
  169.16 +changeset:   2:dee839d89dc6
  169.17 +etichetta:   qtip
  169.18 +etichetta:   seconda.patch
  169.19 +etichetta:   tip
  169.20 +utente:      Bryan O'Sullivan &lt;bos@serpentine.com&gt;
  169.21 +data:        Fri Jun 05 15:50:46 2009 +0000
  169.22 +sommario:    [mq]: seconda.patch
  169.23 +
  169.24 +<prompt>$</prompt> <userinput>hg export seconda.patch</userinput>
  169.25 +# HG changeset di patch
  169.26 +# Utente Bryan O'Sullivan &lt;bos@serpentine.com&gt;
  169.27 +# Data 1244217046 0
  169.28 +# ID di nodo dee839d89dc6e420682b02551b31e8375929aa7c
  169.29 +# Genitore 32b3cae9e753537be60bb2fbfefe0de3e19ec4a3
  169.30 +[mq]: seconda.patch
  169.31 +
  169.32 +diff -r 32b3cae9e753 -r dee839d89dc6 altro.c
  169.33 +--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
  169.34 ++++ b/altro.c	Fri Jun 05 15:50:46 2009 +0000
  169.35 +@@ -0,0 +1,1 @@
  169.36 ++double u;
  169.37 +</screen>
  169.38 +<!-- END mq.id.output -->
   170.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   170.2 +++ b/it/examples/mq.qinit-help.help.it	Fri Sep 04 16:33:35 2009 +0200
   170.3 @@ -0,0 +1,20 @@
   170.4 +<!-- BEGIN mq.qinit-help.help -->
   170.5 +<screen><prompt>$</prompt> <userinput>hg help qinit</userinput>
   170.6 +hg qinit [-c]
   170.7 +
   170.8 +inizializza un nuovo repository di coda
   170.9 +
  170.10 +    Per default, il repository di coda non è sotto controllo
  170.11 +    di revisione. Se viene specificato -c, qinit creerà un
  170.12 +    repository annidato separato per le patch (qinit -c può
  170.13 +    anche essere invocato più tardi per convertire un repository
  170.14 +    di patch non gestito in uno gestito). Potete usare qcommit
  170.15 +    per inserire modifiche in questo repository di coda.
  170.16 +
  170.17 +opzioni:
  170.18 +
  170.19 + -c --create-repo  crea il repository di coda
  170.20 +
  170.21 +usate "hg -v help qinit" per vedere le opzioni globali
  170.22 +</screen>
  170.23 +<!-- END mq.qinit-help.help -->
   171.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   171.2 +++ b/it/examples/mq.tarball.download.it	Fri Sep 04 16:33:35 2009 +0200
   171.3 @@ -0,0 +1,12 @@
   171.4 +<!-- BEGIN mq.tarball.download -->
   171.5 +<screen># Scarichiamo netplug-1.2.5.tar.bz2
   171.6 +<prompt>$</prompt> <userinput>tar jxf netplug-1.2.5.tar.bz2</userinput>
   171.7 +<prompt>$</prompt> <userinput>cd netplug-1.2.5</userinput>
   171.8 +<prompt>$</prompt> <userinput>hg init</userinput>
   171.9 +<prompt>$</prompt> <userinput>hg commit -q --addremove --message netplug-1.2.5</userinput>
  171.10 +<prompt>$</prompt> <userinput>cd ..</userinput>
  171.11 +<prompt>$</prompt> <userinput>hg clone netplug-1.2.5 netplug</userinput>
  171.12 +aggiorno la directory di lavoro
  171.13 +18 file aggiornati, 0 file uniti, 0 file rimossi, 0 file irrisolti
  171.14 +</screen>
  171.15 +<!-- END mq.tarball.download -->
   172.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   172.2 +++ b/it/examples/mq.tarball.newsource.it	Fri Sep 04 16:33:35 2009 +0200
   172.3 @@ -0,0 +1,16 @@
   172.4 +<!-- BEGIN mq.tarball.newsource -->
   172.5 +<screen><prompt>$</prompt> <userinput>hg qpop -a</userinput>
   172.6 +la coda delle patch è vuota
   172.7 +<prompt>$</prompt> <userinput>cd ..</userinput>
   172.8 +# Scarichiamo netplug-1.2.8.tar.bz2
   172.9 +<prompt>$</prompt> <userinput>hg clone netplug-1.2.5 netplug-1.2.8</userinput>
  172.10 +aggiorno la directory di lavoro
  172.11 +18 file aggiornati, 0 file uniti, 0 file rimossi, 0 file irrisolti
  172.12 +<prompt>$</prompt> <userinput>cd netplug-1.2.8</userinput>
  172.13 +<prompt>$</prompt> <userinput>hg locate -0 | xargs -0 rm</userinput>
  172.14 +<prompt>$</prompt> <userinput>cd ..</userinput>
  172.15 +<prompt>$</prompt> <userinput>tar jxf netplug-1.2.8.tar.bz2</userinput>
  172.16 +<prompt>$</prompt> <userinput>cd netplug-1.2.8</userinput>
  172.17 +<prompt>$</prompt> <userinput>hg commit --addremove --message netplug-1.2.8</userinput>
  172.18 +</screen>
  172.19 +<!-- END mq.tarball.newsource -->
   173.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   173.2 +++ b/it/examples/mq.tarball.qinit.it	Fri Sep 04 16:33:35 2009 +0200
   173.3 @@ -0,0 +1,31 @@
   173.4 +<!-- BEGIN mq.tarball.qinit -->
   173.5 +<screen><prompt>$</prompt> <userinput>cd netplug</userinput>
   173.6 +<prompt>$</prompt> <userinput>hg qinit</userinput>
   173.7 +<prompt>$</prompt> <userinput>hg qnew -m 'corregge un problema di assemblaggio con gcc 4' correzione-assemblaggio.patch</userinput>
   173.8 +<prompt>$</prompt> <userinput>perl -pi -e 's/int addr_len/socklen_t addr_len/' netlink.c</userinput>
   173.9 +<prompt>$</prompt> <userinput>hg qrefresh</userinput>
  173.10 +<prompt>$</prompt> <userinput>hg tip -p</userinput>
  173.11 +changeset:   1:5227ba4b6a8b
  173.12 +etichetta:   qtip
  173.13 +etichetta:   correzione-assemblaggio.patch
  173.14 +etichetta:   tip
  173.15 +etichetta:   qbase
  173.16 +utente:      Bryan O'Sullivan &lt;bos@serpentine.com&gt;
  173.17 +data:        Fri Jun 05 15:50:51 2009 +0000
  173.18 +sommario:    corregge un problema di assemblaggio con gcc 4
  173.19 +
  173.20 +diff -r e709896f2959 -r 5227ba4b6a8b netlink.c
  173.21 +--- a/netlink.c	Fri Jun 05 15:50:49 2009 +0000
  173.22 ++++ b/netlink.c	Fri Jun 05 15:50:51 2009 +0000
  173.23 +@@ -275,7 +275,7 @@
  173.24 +         exit(1);
  173.25 +     }
  173.26 + 
  173.27 +-    int addr_len = sizeof(addr);
  173.28 ++    socklen_t addr_len = sizeof(addr);
  173.29 + 
  173.30 +     if (getsockname(fd, (struct sockaddr *) &amp;addr, &amp;addr_len) == -1) {
  173.31 +         do_log(LOG_ERR, "Could not get socket details: %m");
  173.32 +
  173.33 +</screen>
  173.34 +<!-- END mq.tarball.qinit -->
   174.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   174.2 +++ b/it/examples/mq.tarball.repush.it	Fri Sep 04 16:33:35 2009 +0200
   174.3 @@ -0,0 +1,16 @@
   174.4 +<!-- BEGIN mq.tarball.repush -->
   174.5 +<screen><prompt>$</prompt> <userinput>cd ../netplug</userinput>
   174.6 +<prompt>$</prompt> <userinput>hg pull ../netplug-1.2.8</userinput>
   174.7 +estraggo da ../netplug-1.2.8
   174.8 +cerco i cambiamenti
   174.9 +aggiungo i changeset
  174.10 +aggiungo i manifest
  174.11 +aggiungo i cambiamenti ai file
  174.12 +aggiunti 1 changeset con 12 cambiamenti a 12 file
  174.13 +(eseguite 'hg update' per ottenere una copia di lavoro)
  174.14 +<prompt>$</prompt> <userinput>hg qpush -a</userinput>
  174.15 +(la directory di lavoro non è alla punta)
  174.16 +applico correzione-assemblaggio.patch
  174.17 +ora a: correzione-assemblaggio.patch
  174.18 +</screen>
  174.19 +<!-- END mq.tarball.repush -->
   175.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   175.2 +++ b/it/examples/mq.tools.lsdiff.it	Fri Sep 04 16:33:35 2009 +0200
   175.3 @@ -0,0 +1,24 @@
   175.4 +<!-- BEGIN mq.tools.lsdiff -->
   175.5 +<screen><prompt>$</prompt> <userinput>lsdiff -nvv rimuove-controlli-ridondati-su-null.patch</userinput>
   175.6 +22	File #1  		a/drivers/char/agp/sgi-agp.c
   175.7 +	24	Blocco #1	static int __devinit agp_sgi_init(void)
   175.8 +37	File #2  		a/drivers/char/hvcs.c
   175.9 +	39	Blocco #1	static struct tty_operations hvcs_ops = 
  175.10 +	53	Blocco #2	static int hvcs_alloc_index_list(int n)
  175.11 +69	File #3  		a/drivers/message/fusion/mptfc.c
  175.12 +	71	Blocco #1	mptfc_GetFcDevPage0(MPT_ADAPTER *ioc, in
  175.13 +85	File #4  		a/drivers/message/fusion/mptsas.c
  175.14 +	87	Blocco #1	mptsas_probe_hba_phys(MPT_ADAPTER *ioc)
  175.15 +98	File #5  		a/drivers/net/fs_enet/fs_enet-mii.c
  175.16 +	100	Blocco #1	static struct fs_enet_mii_bus *create_bu
  175.17 +111	File #6  		a/drivers/net/wireless/ipw2200.c
  175.18 +	113	Blocco #1	static struct ipw_fw_error *ipw_alloc_er
  175.19 +	126	Blocco #2	static ssize_t clear_error(struct device
  175.20 +	140	Blocco #3	static void ipw_irq_tasklet(struct ipw_p
  175.21 +	150	Blocco #4	static void ipw_pci_remove(struct pci_de
  175.22 +164	File #7  		a/drivers/scsi/libata-scsi.c
  175.23 +	166	Blocco #1	int ata_cmd_ioctl(struct scsi_device *sc
  175.24 +178	File #8  		a/drivers/video/au1100fb.c
  175.25 +	180	Blocco #1	void __exit au1100fb_cleanup(void)
  175.26 +</screen>
  175.27 +<!-- END mq.tools.lsdiff -->
   176.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   176.2 +++ b/it/examples/mq.tools.tools.it	Fri Sep 04 16:33:35 2009 +0200
   176.3 @@ -0,0 +1,26 @@
   176.4 +<!-- BEGIN mq.tools.tools -->
   176.5 +<screen><prompt>$</prompt> <userinput>diffstat -p1 rimuove-controlli-ridondati-su-null.patch</userinput>
   176.6 + drivers/char/agp/sgi-agp.c        |    5 ++---
   176.7 + drivers/char/hvcs.c               |   11 +++++------
   176.8 + drivers/message/fusion/mptfc.c    |    6 ++----
   176.9 + drivers/message/fusion/mptsas.c   |    3 +--
  176.10 + drivers/net/fs_enet/fs_enet-mii.c |    3 +--
  176.11 + drivers/net/wireless/ipw2200.c    |   22 ++++++----------------
  176.12 + drivers/scsi/libata-scsi.c        |    4 +---
  176.13 + drivers/video/au1100fb.c          |    3 +--
  176.14 + 8 file modificati, 19 inserimenti(+), 38 cancellazioni(-)
  176.15 +<prompt>$</prompt> <userinput>filterdiff -i '*/video/*' rimuove-controlli-ridondati-su-null.patch</userinput>
  176.16 +--- a/drivers/video/au1100fb.c~rimuove-controlli-ridondanti-su-null-prima-di-free-nei-driver
  176.17 ++++ a/drivers/video/au1100fb.c
  176.18 +@@ -743,8 +743,7 @@ void __exit au1100fb_cleanup(void)
  176.19 + {
  176.20 + 	driver_unregister(&amp;au1100fb_driver);
  176.21 + 
  176.22 +-	if (drv_info.opt_mode)
  176.23 +-		kfree(drv_info.opt_mode);
  176.24 ++	kfree(drv_info.opt_mode);
  176.25 + }
  176.26 + 
  176.27 + module_init(au1100fb_init);
  176.28 +</screen>
  176.29 +<!-- END mq.tools.tools -->
   177.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   177.2 +++ b/it/examples/mq.tutorial.add.it	Fri Sep 04 16:33:35 2009 +0200
   177.3 @@ -0,0 +1,8 @@
   177.4 +<!-- BEGIN mq.tutorial.add -->
   177.5 +<screen><prompt>$</prompt> <userinput>echo 'file 3, riga 1' &gt;&gt; file3</userinput>
   177.6 +<prompt>$</prompt> <userinput>hg add file3</userinput>
   177.7 +<prompt>$</prompt> <userinput>hg qnew aggiunto-file3.patch</userinput>
   177.8 +fallimento: ci sono modifiche locali, aggiornate prima la patch corrente
   177.9 +<prompt>$</prompt> <userinput>hg qnew -f aggiunto-file3.patch</userinput>
  177.10 +</screen>
  177.11 +<!-- END mq.tutorial.add -->
   178.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   178.2 +++ b/it/examples/mq.tutorial.qinit.it	Fri Sep 04 16:33:35 2009 +0200
   178.3 @@ -0,0 +1,10 @@
   178.4 +<!-- BEGIN mq.tutorial.qinit -->
   178.5 +<screen><prompt>$</prompt> <userinput>hg init mq-prova</userinput>
   178.6 +<prompt>$</prompt> <userinput>cd mq-prova</userinput>
   178.7 +<prompt>$</prompt> <userinput>echo 'riga 1' &gt; file1</userinput>
   178.8 +<prompt>$</prompt> <userinput>echo "un'altra riga 1" &gt; file2</userinput>
   178.9 +<prompt>$</prompt> <userinput>hg add file1 file2</userinput>
  178.10 +<prompt>$</prompt> <userinput>hg commit -m "Prima modifica."</userinput>
  178.11 +<prompt>$</prompt> <userinput>hg qinit</userinput>
  178.12 +</screen>
  178.13 +<!-- END mq.tutorial.qinit -->
   179.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   179.2 +++ b/it/examples/mq.tutorial.qnew.it	Fri Sep 04 16:33:35 2009 +0200
   179.3 @@ -0,0 +1,23 @@
   179.4 +<!-- BEGIN mq.tutorial.qnew -->
   179.5 +<screen><prompt>$</prompt> <userinput>hg tip</userinput>
   179.6 +changeset:   0:c6618fa9eed7
   179.7 +etichetta:   tip
   179.8 +utente:      Bryan O'Sullivan &lt;bos@serpentine.com&gt;
   179.9 +data:        Fri Jun 05 15:50:56 2009 +0000
  179.10 +sommario:    Prima modifica.
  179.11 +
  179.12 +<prompt>$</prompt> <userinput>hg qnew prima.patch</userinput>
  179.13 +<prompt>$</prompt> <userinput>hg tip</userinput>
  179.14 +changeset:   1:f32697f1a94e
  179.15 +etichetta:   qtip
  179.16 +etichetta:   prima.patch
  179.17 +etichetta:   tip
  179.18 +etichetta:   qbase
  179.19 +utente:      Bryan O'Sullivan &lt;bos@serpentine.com&gt;
  179.20 +data:        Fri Jun 05 15:50:57 2009 +0000
  179.21 +sommario:    [mq]: prima.patch
  179.22 +
  179.23 +<prompt>$</prompt> <userinput>ls .hg/patches</userinput>
  179.24 +prima.patch  series  status
  179.25 +</screen>
  179.26 +<!-- END mq.tutorial.qnew -->
   180.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   180.2 +++ b/it/examples/mq.tutorial.qnew2.it	Fri Sep 04 16:33:35 2009 +0200
   180.3 @@ -0,0 +1,31 @@
   180.4 +<!-- BEGIN mq.tutorial.qnew2 -->
   180.5 +<screen><prompt>$</prompt> <userinput>hg qnew seconda.patch</userinput>
   180.6 +<prompt>$</prompt> <userinput>hg log --style=compact --limit=2</userinput>
   180.7 +2[qtip,seconda.patch,tip]   2d7ecb80769d   2009-06-05 15:51 +0000   bos
   180.8 +  [mq]: seconda.patch
   180.9 +
  180.10 +1[prima.patch,qbase]   8593307a06ec   2009-06-05 15:51 +0000   bos
  180.11 +  [mq]: prima.patch
  180.12 +
  180.13 +<prompt>$</prompt> <userinput>echo 'riga 4' &gt;&gt; file1</userinput>
  180.14 +<prompt>$</prompt> <userinput>hg qrefresh</userinput>
  180.15 +<prompt>$</prompt> <userinput>hg tip --style=compact --patch</userinput>
  180.16 +2[qtip,seconda.patch,tip]   78d47e79ab59   2009-06-05 15:51 +0000   bos
  180.17 +  [mq]: seconda.patch
  180.18 +
  180.19 +diff -r 8593307a06ec -r 78d47e79ab59 file1
  180.20 +--- a/file1	Fri Jun 05 15:51:00 2009 +0000
  180.21 ++++ b/file1	Fri Jun 05 15:51:02 2009 +0000
  180.22 +@@ -1,3 +1,4 @@
  180.23 + riga 1
  180.24 + riga 2
  180.25 + riga 3
  180.26 ++riga 4
  180.27 +
  180.28 +<prompt>$</prompt> <userinput>hg annotate file1</userinput>
  180.29 +0: riga 1
  180.30 +1: riga 2
  180.31 +1: riga 3
  180.32 +2: riga 4
  180.33 +</screen>
  180.34 +<!-- END mq.tutorial.qnew2 -->
   181.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   181.2 +++ b/it/examples/mq.tutorial.qpop.it	Fri Sep 04 16:33:35 2009 +0200
   181.3 @@ -0,0 +1,17 @@
   181.4 +<!-- BEGIN mq.tutorial.qpop -->
   181.5 +<screen><prompt>$</prompt> <userinput>hg qapplied</userinput>
   181.6 +prima.patch
   181.7 +seconda.patch
   181.8 +<prompt>$</prompt> <userinput>hg qpop</userinput>
   181.9 +ora a: prima.patch
  181.10 +<prompt>$</prompt> <userinput>hg qseries</userinput>
  181.11 +prima.patch
  181.12 +seconda.patch
  181.13 +<prompt>$</prompt> <userinput>hg qapplied</userinput>
  181.14 +prima.patch
  181.15 +<prompt>$</prompt> <userinput>cat file1</userinput>
  181.16 +riga 1
  181.17 +riga 2
  181.18 +riga 3
  181.19 +</screen>
  181.20 +<!-- END mq.tutorial.qpop -->
   182.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   182.2 +++ b/it/examples/mq.tutorial.qpush-a.it	Fri Sep 04 16:33:35 2009 +0200
   182.3 @@ -0,0 +1,11 @@
   182.4 +<!-- BEGIN mq.tutorial.qpush-a -->
   182.5 +<screen><prompt>$</prompt> <userinput>hg qpush -a</userinput>
   182.6 +applico seconda.patch
   182.7 +ora a: seconda.patch
   182.8 +<prompt>$</prompt> <userinput>cat file1</userinput>
   182.9 +riga 1
  182.10 +riga 2
  182.11 +riga 3
  182.12 +riga 4
  182.13 +</screen>
  182.14 +<!-- END mq.tutorial.qpush-a -->
   183.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   183.2 +++ b/it/examples/mq.tutorial.qrefresh.it	Fri Sep 04 16:33:35 2009 +0200
   183.3 @@ -0,0 +1,24 @@
   183.4 +<!-- BEGIN mq.tutorial.qrefresh -->
   183.5 +<screen><prompt>$</prompt> <userinput>echo 'riga 2' &gt;&gt; file1</userinput>
   183.6 +<prompt>$</prompt> <userinput>hg diff</userinput>
   183.7 +diff -r f32697f1a94e file1
   183.8 +--- a/file1	Fri Jun 05 15:50:57 2009 +0000
   183.9 ++++ b/file1	Fri Jun 05 15:50:58 2009 +0000
  183.10 +@@ -1,1 +1,2 @@
  183.11 + riga 1
  183.12 ++riga 2
  183.13 +<prompt>$</prompt> <userinput>hg qrefresh</userinput>
  183.14 +<prompt>$</prompt> <userinput>hg diff</userinput>
  183.15 +<prompt>$</prompt> <userinput>hg tip --style=compact --patch</userinput>
  183.16 +1[qtip,prima.patch,tip,qbase]   18f39bf02ad5   2009-06-05 15:50 +0000   bos
  183.17 +  [mq]: prima.patch
  183.18 +
  183.19 +diff -r c6618fa9eed7 -r 18f39bf02ad5 file1
  183.20 +--- a/file1	Fri Jun 05 15:50:56 2009 +0000
  183.21 ++++ b/file1	Fri Jun 05 15:50:59 2009 +0000
  183.22 +@@ -1,1 +1,2 @@
  183.23 + riga 1
  183.24 ++riga 2
  183.25 +
  183.26 +</screen>
  183.27 +<!-- END mq.tutorial.qrefresh -->
   184.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   184.2 +++ b/it/examples/mq.tutorial.qrefresh2.it	Fri Sep 04 16:33:35 2009 +0200
   184.3 @@ -0,0 +1,19 @@
   184.4 +<!-- BEGIN mq.tutorial.qrefresh2 -->
   184.5 +<screen><prompt>$</prompt> <userinput>echo 'riga 3' &gt;&gt; file1</userinput>
   184.6 +<prompt>$</prompt> <userinput>hg status</userinput>
   184.7 +M file1
   184.8 +<prompt>$</prompt> <userinput>hg qrefresh</userinput>
   184.9 +<prompt>$</prompt> <userinput>hg tip --style=compact --patch</userinput>
  184.10 +1[qtip,prima.patch,tip,qbase]   8593307a06ec   2009-06-05 15:51 +0000   bos
  184.11 +  [mq]: prima.patch
  184.12 +
  184.13 +diff -r c6618fa9eed7 -r 8593307a06ec file1
  184.14 +--- a/file1	Fri Jun 05 15:50:56 2009 +0000
  184.15 ++++ b/file1	Fri Jun 05 15:51:00 2009 +0000
  184.16 +@@ -1,1 +1,3 @@
  184.17 + riga 1
  184.18 ++riga 2
  184.19 ++riga 3
  184.20 +
  184.21 +</screen>
  184.22 +<!-- END mq.tutorial.qrefresh2 -->
   185.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   185.2 +++ b/it/examples/mq.tutorial.qseries.it	Fri Sep 04 16:33:35 2009 +0200
   185.3 @@ -0,0 +1,9 @@
   185.4 +<!-- BEGIN mq.tutorial.qseries -->
   185.5 +<screen><prompt>$</prompt> <userinput>hg qseries</userinput>
   185.6 +prima.patch
   185.7 +seconda.patch
   185.8 +<prompt>$</prompt> <userinput>hg qapplied</userinput>
   185.9 +prima.patch
  185.10 +seconda.patch
  185.11 +</screen>
  185.12 +<!-- END mq.tutorial.qseries -->
   186.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   186.2 +++ b/it/examples/rename.divergent.clone.it	Fri Sep 04 16:33:35 2009 +0200
   186.3 @@ -0,0 +1,9 @@
   186.4 +<!-- BEGIN rename.divergent.clone -->
   186.5 +<screen><prompt>$</prompt> <userinput>hg clone orig anna</userinput>
   186.6 +aggiorno la directory di lavoro
   186.7 +1 file aggiornati, 0 file uniti, 0 file rimossi, 0 file irrisolti
   186.8 +<prompt>$</prompt> <userinput>hg clone orig bruno</userinput>
   186.9 +aggiorno la directory di lavoro
  186.10 +1 file aggiornati, 0 file uniti, 0 file rimossi, 0 file irrisolti
  186.11 +</screen>
  186.12 +<!-- END rename.divergent.clone -->
   187.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   187.2 +++ b/it/examples/rename.divergent.merge.it	Fri Sep 04 16:33:35 2009 +0200
   187.3 @@ -0,0 +1,29 @@
   187.4 +<!-- BEGIN rename.divergent.merge -->
   187.5 +<screen># Si veda http://www.selenic.com/mercurial/bts/issue455
   187.6 +<prompt>$</prompt> <userinput>cd ../orig</userinput>
   187.7 +<prompt>$</prompt> <userinput>hg pull -u ../anna</userinput>
   187.8 +estraggo da ../anna
   187.9 +cerco i cambiamenti
  187.10 +aggiungo i changeset
  187.11 +aggiungo i manifest
  187.12 +aggiungo i cambiamenti ai file
  187.13 +aggiunti 1 changeset con 1 cambiamenti a 1 file
  187.14 +1 file aggiornati, 0 file uniti, 1 file rimossi, 0 file irrisolti
  187.15 +<prompt>$</prompt> <userinput>hg pull ../bruno</userinput>
  187.16 +estraggo da ../bruno
  187.17 +cerco i cambiamenti
  187.18 +aggiungo i changeset
  187.19 +aggiungo i manifest
  187.20 +aggiungo i cambiamenti ai file
  187.21 +aggiunti 1 changeset con 1 cambiamenti a 1 file (+1 teste)
  187.22 +(eseguite 'hg heads' per vedere le teste, 'hg merge' per unire)
  187.23 +<prompt>$</prompt> <userinput>hg merge</userinput>
  187.24 +attenzione: cambiamenti di nome divergenti di foo a:
  187.25 + bar
  187.26 + quux
  187.27 +1 file aggiornati, 0 file uniti, 0 file rimossi, 0 file irrisolti
  187.28 +(unione tra rami, ricordatevi di eseguire il commit)
  187.29 +<prompt>$</prompt> <userinput>ls</userinput>
  187.30 +bar  quux
  187.31 +</screen>
  187.32 +<!-- END rename.divergent.merge -->
   188.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   188.2 +++ b/it/examples/rename.divergent.rename.anne.it	Fri Sep 04 16:33:35 2009 +0200
   188.3 @@ -0,0 +1,6 @@
   188.4 +<!-- BEGIN rename.divergent.rename.anne -->
   188.5 +<screen><prompt>$</prompt> <userinput>cd anna</userinput>
   188.6 +<prompt>$</prompt> <userinput>hg rename foo bar</userinput>
   188.7 +<prompt>$</prompt> <userinput>hg ci -m "Rinominato foo a bar."</userinput>
   188.8 +</screen>
   188.9 +<!-- END rename.divergent.rename.anne -->
   189.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   189.2 +++ b/it/examples/rename.divergent.rename.bob.it	Fri Sep 04 16:33:35 2009 +0200
   189.3 @@ -0,0 +1,6 @@
   189.4 +<!-- BEGIN rename.divergent.rename.bob -->
   189.5 +<screen><prompt>$</prompt> <userinput>cd ../bruno</userinput>
   189.6 +<prompt>$</prompt> <userinput>hg mv foo quux</userinput>
   189.7 +<prompt>$</prompt> <userinput>hg ci -m "Rinominato foo a quux."</userinput>
   189.8 +</screen>
   189.9 +<!-- END rename.divergent.rename.bob -->
   190.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   190.2 +++ b/it/examples/rollback.add.it	Fri Sep 04 16:33:35 2009 +0200
   190.3 @@ -0,0 +1,5 @@
   190.4 +<!-- BEGIN rollback.add -->
   190.5 +<screen><prompt>$</prompt> <userinput>hg add b</userinput>
   190.6 +<prompt>$</prompt> <userinput>hg commit -m "Aggiunge il file b, questa volta per davvero."</userinput>
   190.7 +</screen>
   190.8 +<!-- END rollback.add -->
   191.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   191.2 +++ b/it/examples/rollback.commit.it	Fri Sep 04 16:33:35 2009 +0200
   191.3 @@ -0,0 +1,7 @@
   191.4 +<!-- BEGIN rollback.commit -->
   191.5 +<screen><prompt>$</prompt> <userinput>hg status</userinput>
   191.6 +M a
   191.7 +<prompt>$</prompt> <userinput>echo b &gt; b</userinput>
   191.8 +<prompt>$</prompt> <userinput>hg commit -m "Aggiunge il file b."</userinput>
   191.9 +</screen>
  191.10 +<!-- END rollback.commit -->
   192.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   192.2 +++ b/it/examples/rollback.rollback.it	Fri Sep 04 16:33:35 2009 +0200
   192.3 @@ -0,0 +1,15 @@
   192.4 +<!-- BEGIN rollback.rollback -->
   192.5 +<screen><prompt>$</prompt> <userinput>hg rollback</userinput>
   192.6 +abortisco l'ultima transazione
   192.7 +<prompt>$</prompt> <userinput>hg tip</userinput>
   192.8 +changeset:   0:ce49f5b59f20
   192.9 +etichetta:   tip
  192.10 +utente:      Bryan O'Sullivan &lt;bos@serpentine.com&gt;
  192.11 +data:        Fri Jun 05 15:51:13 2009 +0000
  192.12 +sommario:    Primo commit.
  192.13 +
  192.14 +<prompt>$</prompt> <userinput>hg status</userinput>
  192.15 +M a
  192.16 +? b
  192.17 +</screen>
  192.18 +<!-- END rollback.rollback -->
   193.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   193.2 +++ b/it/examples/rollback.status.it	Fri Sep 04 16:33:35 2009 +0200
   193.3 @@ -0,0 +1,12 @@
   193.4 +<!-- BEGIN rollback.status -->
   193.5 +<screen><prompt>$</prompt> <userinput>hg status</userinput>
   193.6 +? b
   193.7 +<prompt>$</prompt> <userinput>hg tip</userinput>
   193.8 +changeset:   1:249cc777b54f
   193.9 +etichetta:   tip
  193.10 +utente:      Bryan O'Sullivan &lt;bos@serpentine.com&gt;
  193.11 +data:        Fri Jun 05 15:51:13 2009 +0000
  193.12 +sommario:    Aggiunge il file b.
  193.13 +
  193.14 +</screen>
  193.15 +<!-- END rollback.status -->
   194.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   194.2 +++ b/it/examples/rollback.twice.it	Fri Sep 04 16:33:35 2009 +0200
   194.3 @@ -0,0 +1,7 @@
   194.4 +<!-- BEGIN rollback.twice -->
   194.5 +<screen><prompt>$</prompt> <userinput>hg rollback</userinput>
   194.6 +abortisco l'ultima transazione
   194.7 +<prompt>$</prompt> <userinput>hg rollback</userinput>
   194.8 +nessuna informazione disponibile per abortire una transazione
   194.9 +</screen>
  194.10 +<!-- END rollback.twice -->
   195.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   195.2 +++ b/it/examples/tag.init.it	Fri Sep 04 16:33:35 2009 +0200
   195.3 @@ -0,0 +1,8 @@
   195.4 +<!-- BEGIN tag.init -->
   195.5 +<screen><prompt>$</prompt> <userinput>hg init miaetichetta</userinput>
   195.6 +<prompt>$</prompt> <userinput>cd miaetichetta</userinput>
   195.7 +<prompt>$</prompt> <userinput>echo ciao &gt; miofile</userinput>
   195.8 +<prompt>$</prompt> <userinput>hg commit -A -m "Commit iniziale."</userinput>
   195.9 +aggiungo miofile
  195.10 +</screen>
  195.11 +<!-- END tag.init -->
   196.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   196.2 +++ b/it/examples/tag.log.it	Fri Sep 04 16:33:35 2009 +0200
   196.3 @@ -0,0 +1,16 @@
   196.4 +<!-- BEGIN tag.log -->
   196.5 +<screen><prompt>$</prompt> <userinput>hg log</userinput>
   196.6 +changeset:   1:87dee45bf6ec
   196.7 +etichetta:   tip
   196.8 +utente:      Bryan O'Sullivan &lt;bos@serpentine.com&gt;
   196.9 +data:        Fri Jun 05 15:51:18 2009 +0000
  196.10 +sommario:    Aggiunta l'etichetta v1.0 per il changeset 35aa95ccc713.
  196.11 +
  196.12 +changeset:   0:35aa95ccc713
  196.13 +etichetta:   v1.0
  196.14 +utente:      Bryan O'Sullivan &lt;bos@serpentine.com&gt;
  196.15 +data:        Fri Jun 05 15:51:18 2009 +0000
  196.16 +sommario:    Commit iniziale.
  196.17 +
  196.18 +</screen>
  196.19 +<!-- END tag.log -->
   197.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   197.2 +++ b/it/examples/tag.log.v1.0.it	Fri Sep 04 16:33:35 2009 +0200
   197.3 @@ -0,0 +1,13 @@
   197.4 +<!-- BEGIN tag.log.v1.0 -->
   197.5 +<screen><prompt>$</prompt> <userinput>echo arrivederci &gt; miofile2</userinput>
   197.6 +<prompt>$</prompt> <userinput>hg commit -A -m "Secondo commit."</userinput>
   197.7 +aggiungo miofile2
   197.8 +<prompt>$</prompt> <userinput>hg log -r v1.0</userinput>
   197.9 +changeset:   0:35aa95ccc713
  197.10 +etichetta:   v1.0
  197.11 +utente:      Bryan O'Sullivan &lt;bos@serpentine.com&gt;
  197.12 +data:        Fri Jun 05 15:51:18 2009 +0000
  197.13 +sommario:    Commit iniziale.
  197.14 +
  197.15 +</screen>
  197.16 +<!-- END tag.log.v1.0 -->
   198.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   198.2 +++ b/it/examples/tag.remove.it	Fri Sep 04 16:33:35 2009 +0200
   198.3 @@ -0,0 +1,6 @@
   198.4 +<!-- BEGIN tag.remove -->
   198.5 +<screen><prompt>$</prompt> <userinput>hg tag --remove v1.0</userinput>
   198.6 +<prompt>$</prompt> <userinput>hg tags</userinput>
   198.7 +tip                                3:f0420ed65292
   198.8 +</screen>
   198.9 +<!-- END tag.remove -->
   199.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   199.2 +++ b/it/examples/tag.replace.it	Fri Sep 04 16:33:35 2009 +0200
   199.3 @@ -0,0 +1,13 @@
   199.4 +<!-- BEGIN tag.replace -->
   199.5 +<screen><prompt>$</prompt> <userinput>hg tag -r 1 v1.1</userinput>
   199.6 +<prompt>$</prompt> <userinput>hg tags</userinput>
   199.7 +tip                                4:2f0219ae190a
   199.8 +v1.1                               1:87dee45bf6ec
   199.9 +<prompt>$</prompt> <userinput>hg tag -r 2 v1.1</userinput>
  199.10 +fallimento: l'etichetta 'v1.1' esiste già (usate -f per forzare)
  199.11 +<prompt>$</prompt> <userinput>hg tag -f -r 2 v1.1</userinput>
  199.12 +<prompt>$</prompt> <userinput>hg tags</userinput>
  199.13 +tip                                5:9a0bd94354ec
  199.14 +v1.1                               2:35418c351c2b
  199.15 +</screen>
  199.16 +<!-- END tag.replace -->
   200.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   200.2 +++ b/it/examples/tag.tag.it	Fri Sep 04 16:33:35 2009 +0200
   200.3 @@ -0,0 +1,4 @@
   200.4 +<!-- BEGIN tag.tag -->
   200.5 +<screen><prompt>$</prompt> <userinput>hg tag v1.0</userinput>
   200.6 +</screen>
   200.7 +<!-- END tag.tag -->
   201.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   201.2 +++ b/it/examples/tag.tags.it	Fri Sep 04 16:33:35 2009 +0200
   201.3 @@ -0,0 +1,6 @@
   201.4 +<!-- BEGIN tag.tags -->
   201.5 +<screen><prompt>$</prompt> <userinput>hg tags</userinput>
   201.6 +tip                                1:87dee45bf6ec
   201.7 +v1.0                               0:35aa95ccc713
   201.8 +</screen>
   201.9 +<!-- END tag.tags -->
   202.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   202.2 +++ b/it/examples/tag.tip.it	Fri Sep 04 16:33:35 2009 +0200
   202.3 @@ -0,0 +1,10 @@
   202.4 +<!-- BEGIN tag.tip -->
   202.5 +<screen><prompt>$</prompt> <userinput>hg tip</userinput>
   202.6 +changeset:   5:9a0bd94354ec
   202.7 +etichetta:   tip
   202.8 +utente:      Bryan O'Sullivan &lt;bos@serpentine.com&gt;
   202.9 +data:        Fri Jun 05 15:51:22 2009 +0000
  202.10 +sommario:    Aggiunta l'etichetta v1.1 per il changeset 35418c351c2b.
  202.11 +
  202.12 +</screen>
  202.13 +<!-- END tag.tip -->
   203.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   203.2 +++ b/it/examples/template.simple.changelog.it	Fri Sep 04 16:33:35 2009 +0200
   203.3 @@ -0,0 +1,25 @@
   203.4 +<!-- BEGIN template.simple.changelog -->
   203.5 +<screen><prompt>$</prompt> <userinput>hg log --style changelog</userinput>
   203.6 +2009-06-05  Bryan O'Sullivan  &lt;bos@serpentine.com&gt;
   203.7 +
   203.8 +	* .hgtags:
   203.9 +	Aggiunta etichetta v0.1 per il changeset a5ff5617a0be
  203.10 +	[1102dd469cfc] [tip]
  203.11 +
  203.12 +	* .hgtags:
  203.13 +	Aggiunta etichetta miaetichetta per il changeset fb5e3583537a
  203.14 +	[a5ff5617a0be] [v0.1]
  203.15 +
  203.16 +	* goodbye, hello:
  203.17 +	Aggiunta una riga alla fine del file &lt;&lt;hello&gt;&gt;.
  203.18 +
  203.19 +	In più, aggiunto un file con il nome indicativo (almeno spero che qualcuno
  203.20 +	possa considerarlo tale) di goodbye.
  203.21 +	[fb5e3583537a] [miaetichetta]
  203.22 +
  203.23 +	* hello:
  203.24 +	Aggiunto file hello.
  203.25 +	[0afbebcdeafc]
  203.26 +
  203.27 +</screen>
  203.28 +<!-- END template.simple.changelog -->
   204.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   204.2 +++ b/it/examples/template.simple.combine.it	Fri Sep 04 16:33:35 2009 +0200
   204.3 @@ -0,0 +1,9 @@
   204.4 +<!-- BEGIN template.simple.combine -->
   204.5 +<screen><prompt>$</prompt> <userinput>hg log -r1 --template 'descrizione:\n\t{desc|strip|fill68|tabindent}\n'</userinput>
   204.6 +descrizione:
   204.7 +	Aggiunta una riga alla fine del file &lt;&lt;hello&gt;&gt;.
   204.8 +
   204.9 +	In più, aggiunto un file con il nome indicativo (almeno spero che
  204.10 +	qualcuno possa considerarlo tale) di goodbye.
  204.11 +</screen>
  204.12 +<!-- END template.simple.combine -->
   205.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   205.2 +++ b/it/examples/template.simple.compact.it	Fri Sep 04 16:33:35 2009 +0200
   205.3 @@ -0,0 +1,16 @@
   205.4 +<!-- BEGIN template.simple.compact -->
   205.5 +<screen><prompt>$</prompt> <userinput>hg log --style compact</userinput>
   205.6 +3[tip]   1102dd469cfc   2009-06-05 15:51 +0000   bos
   205.7 +  Aggiunta etichetta v0.1 per il changeset a5ff5617a0be
   205.8 +
   205.9 +2[v0.1]   a5ff5617a0be   2009-06-05 15:51 +0000   bos
  205.10 +  Aggiunta etichetta miaetichetta per il changeset fb5e3583537a
  205.11 +
  205.12 +1[miaetichetta]   fb5e3583537a   2009-06-05 15:51 +0000   bos
  205.13 +  Aggiunta una riga alla fine del file &lt;&lt;hello&gt;&gt;.
  205.14 +
  205.15 +0   0afbebcdeafc   2009-06-05 15:51 +0000   bos
  205.16 +  Aggiunto file hello.
  205.17 +
  205.18 +</screen>
  205.19 +<!-- END template.simple.compact -->
   206.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   206.2 +++ b/it/examples/template.simple.datekeyword.it	Fri Sep 04 16:33:35 2009 +0200
   206.3 @@ -0,0 +1,7 @@
   206.4 +<!-- BEGIN template.simple.datekeyword -->
   206.5 +<screen><prompt>$</prompt> <userinput>hg log -r1 --template 'data: {date}\n'</userinput>
   206.6 +data: 1244217084.00
   206.7 +<prompt>$</prompt> <userinput>hg log -r1 --template 'data: {date|isodate}\n'</userinput>
   206.8 +data: 2009-06-05 15:51 +0000
   206.9 +</screen>
  206.10 +<!-- END template.simple.datekeyword -->
   207.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   207.2 +++ b/it/examples/template.simple.keywords.it	Fri Sep 04 16:33:35 2009 +0200
   207.3 @@ -0,0 +1,24 @@
   207.4 +<!-- BEGIN template.simple.keywords -->
   207.5 +<screen><prompt>$</prompt> <userinput>hg log -r1 --template 'autore: {author}\n'</userinput>
   207.6 +autore: Bryan O'Sullivan &lt;bos@serpentine.com&gt;
   207.7 +<prompt>$</prompt> <userinput>hg log -r1 --template 'desc:\n{desc}\n'</userinput>
   207.8 +desc:
   207.9 +Aggiunta una riga alla fine del file &lt;&lt;hello&gt;&gt;.
  207.10 +
  207.11 +In più, aggiunto un file con il nome indicativo (almeno spero che qualcuno possa considerarlo tale) di goodbye.
  207.12 +<prompt>$</prompt> <userinput>hg log -r1 --template 'file: {files}\n'</userinput>
  207.13 +file: goodbye hello
  207.14 +<prompt>$</prompt> <userinput>hg log -r1 --template 'file aggiunti: {file_adds}\n'</userinput>
  207.15 +file aggiunti: goodbye
  207.16 +<prompt>$</prompt> <userinput>hg log -r1 --template 'file rimossi: {file_dels}\n'</userinput>
  207.17 +file rimossi: 
  207.18 +<prompt>$</prompt> <userinput>hg log -r1 --template 'nodo: {node}\n'</userinput>
  207.19 +nodo: fb5e3583537ab9d278f45d18bcb07262af1e7226
  207.20 +<prompt>$</prompt> <userinput>hg log -r1 --template 'genitori: {parents}\n'</userinput>
  207.21 +genitori: 
  207.22 +<prompt>$</prompt> <userinput>hg log -r1 --template 'revisione: {rev}\n'</userinput>
  207.23 +revisione: 1
  207.24 +<prompt>$</prompt> <userinput>hg log -r1 --template 'etichette: {tags}\n'</userinput>
  207.25 +etichette: miaetichetta
  207.26 +</screen>
  207.27 +<!-- END template.simple.keywords -->
   208.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   208.2 +++ b/it/examples/template.simple.manyfilters.it	Fri Sep 04 16:33:35 2009 +0200
   208.3 @@ -0,0 +1,65 @@
   208.4 +<!-- BEGIN template.simple.manyfilters -->
   208.5 +<screen><prompt>$</prompt> <userinput>hg log -r1 --template '{author}\n'</userinput>
   208.6 +Bryan O'Sullivan &lt;bos@serpentine.com&gt;
   208.7 +<prompt>$</prompt> <userinput>hg log -r1 --template '{author|domain}\n'</userinput>
   208.8 +serpentine.com
   208.9 +<prompt>$</prompt> <userinput>hg log -r1 --template '{author|email}\n'</userinput>
  208.10 +bos@serpentine.com
  208.11 +<prompt>$</prompt> <userinput>hg log -r1 --template '{author|obfuscate}\n' | cut -c-76</userinput>
  208.12 +&amp;#66;&amp;#114;&amp;#121;&amp;#97;&amp;#110;&amp;#32;&amp;#79;&amp;#39;&amp;#83;&amp;#117;&amp;#108;&amp;#108;&amp;#105;&amp;#11
  208.13 +<prompt>$</prompt> <userinput>hg log -r1 --template '{author|person}\n'</userinput>
  208.14 +Bryan O'Sullivan
  208.15 +<prompt>$</prompt> <userinput>hg log -r1 --template '{author|user}\n'</userinput>
  208.16 +bos
  208.17 +<prompt>$</prompt> <userinput>hg log -r1 --template 'sembra quasi giusta, ma in realtà è inutilizzabile: {date}\n'</userinput>
  208.18 +sembra quasi giusta, ma in realtà è inutilizzabile: 1244217084.00
  208.19 +<prompt>$</prompt> <userinput>hg log -r1 --template '{date|age}\n'</userinput>
  208.20 +10 secondi
  208.21 +<prompt>$</prompt> <userinput>hg log -r1 --template '{date|date}\n'</userinput>
  208.22 +Fri Jun 05 15:51:24 2009 +0000
  208.23 +<prompt>$</prompt> <userinput>hg log -r1 --template '{date|hgdate}\n'</userinput>
  208.24 +1244217084 0
  208.25 +<prompt>$</prompt> <userinput>hg log -r1 --template '{date|isodate}\n'</userinput>
  208.26 +2009-06-05 15:51 +0000
  208.27 +<prompt>$</prompt> <userinput>hg log -r1 --template '{date|rfc822date}\n'</userinput>
  208.28 +Fri, 05 Jun 2009 15:51:24 +0000
  208.29 +<prompt>$</prompt> <userinput>hg log -r1 --template '{date|shortdate}\n'</userinput>
  208.30 +2009-06-05
  208.31 +<prompt>$</prompt> <userinput>hg log -r1 --template '{desc}\n' | cut -c-76</userinput>
  208.32 +Aggiunta una riga alla fine del file &lt;&lt;hello&gt;&gt;.
  208.33 +
  208.34 +In più, aggiunto un file con il nome indicativo (almeno spero che qualcuno
  208.35 +<prompt>$</prompt> <userinput>hg log -r1 --template '{desc|addbreaks}\n' | cut -c-76</userinput>
  208.36 +Aggiunta una riga alla fine del file &lt;&lt;hello&gt;&gt;.&lt;br/&gt;
  208.37 +&lt;br/&gt;
  208.38 +In più, aggiunto un file con il nome indicativo (almeno spero che qualcuno
  208.39 +<prompt>$</prompt> <userinput>hg log -r1 --template '{desc|escape}\n' | cut -c-76</userinput>
  208.40 +Aggiunta una riga alla fine del file &amp;lt;&amp;lt;hello&amp;gt;&amp;gt;.
  208.41 +
  208.42 +In più, aggiunto un file con il nome indicativo (almeno spero che qualcuno
  208.43 +<prompt>$</prompt> <userinput>hg log -r1 --template '{desc|fill68}\n'</userinput>
  208.44 +Aggiunta una riga alla fine del file &lt;&lt;hello&gt;&gt;.
  208.45 +
  208.46 +In più, aggiunto un file con il nome indicativo (almeno spero che
  208.47 +qualcuno possa considerarlo tale) di goodbye.
  208.48 +<prompt>$</prompt> <userinput>hg log -r1 --template '{desc|fill76}\n'</userinput>
  208.49 +Aggiunta una riga alla fine del file &lt;&lt;hello&gt;&gt;.
  208.50 +
  208.51 +In più, aggiunto un file con il nome indicativo (almeno spero che qualcuno
  208.52 +possa considerarlo tale) di goodbye.
  208.53 +<prompt>$</prompt> <userinput>hg log -r1 --template '{desc|firstline}\n'</userinput>
  208.54 +Aggiunta una riga alla fine del file &lt;&lt;hello&gt;&gt;.
  208.55 +<prompt>$</prompt> <userinput>hg log -r1 --template '{desc|strip}\n' | cut -c-76</userinput>
  208.56 +Aggiunta una riga alla fine del file &lt;&lt;hello&gt;&gt;.
  208.57 +
  208.58 +In più, aggiunto un file con il nome indicativo (almeno spero che qualcuno
  208.59 +<prompt>$</prompt> <userinput>hg log -r1 --template '{desc|tabindent}\n' | expand | cut -c-76</userinput>
  208.60 +Aggiunta una riga alla fine del file &lt;&lt;hello&gt;&gt;.
  208.61 +
  208.62 +	In più, aggiunto un file con il nome indicativo (almeno spero che qu
  208.63 +<prompt>$</prompt> <userinput>hg log -r1 --template '{node}\n'</userinput>
  208.64 +fb5e3583537ab9d278f45d18bcb07262af1e7226
  208.65 +<prompt>$</prompt> <userinput>hg log -r1 --template '{node|short}\n'</userinput>
  208.66 +fb5e3583537a
  208.67 +</screen>
  208.68 +<!-- END template.simple.manyfilters -->
   209.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   209.2 +++ b/it/examples/template.simple.normal.it	Fri Sep 04 16:33:35 2009 +0200
   209.3 @@ -0,0 +1,10 @@
   209.4 +<!-- BEGIN template.simple.normal -->
   209.5 +<screen><prompt>$</prompt> <userinput>hg log -r1</userinput>
   209.6 +changeset:   1:fb5e3583537a
   209.7 +etichetta:   miaetichetta
   209.8 +utente:      Bryan O'Sullivan &lt;bos@serpentine.com&gt;
   209.9 +data:        Fri Jun 05 15:51:24 2009 +0000
  209.10 +sommario:    Aggiunta una riga alla fine del file &lt;&lt;hello&gt;&gt;.
  209.11 +
  209.12 +</screen>
  209.13 +<!-- END template.simple.normal -->
   210.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   210.2 +++ b/it/examples/template.simple.rev.it	Fri Sep 04 16:33:35 2009 +0200
   210.3 @@ -0,0 +1,6 @@
   210.4 +<!-- BEGIN template.simple.rev -->
   210.5 +<screen><prompt>$</prompt> <userinput>echo 'changeset = "revisione: {rev}\n"' &gt; rev</userinput>
   210.6 +<prompt>$</prompt> <userinput>hg log -l1 --style ./rev</userinput>
   210.7 +revisione: 3
   210.8 +</screen>
   210.9 +<!-- END template.simple.rev -->
   211.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   211.2 +++ b/it/examples/template.simple.simplest.it	Fri Sep 04 16:33:35 2009 +0200
   211.3 @@ -0,0 +1,5 @@
   211.4 +<!-- BEGIN template.simple.simplest -->
   211.5 +<screen><prompt>$</prompt> <userinput>hg log -r1 --template 'ho visto un changeset\n'</userinput>
   211.6 +ho visto un changeset
   211.7 +</screen>
   211.8 +<!-- END template.simple.simplest -->
   212.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   212.2 +++ b/it/examples/template.simple.simplesub.it	Fri Sep 04 16:33:35 2009 +0200
   212.3 @@ -0,0 +1,10 @@
   212.4 +<!-- BEGIN template.simple.simplesub -->
   212.5 +<screen><prompt>$</prompt> <userinput>hg log --template 'ho visto un changeset: {desc}\n'</userinput>
   212.6 +ho visto un changeset: Aggiunta etichetta v0.1 per il changeset a5ff5617a0be
   212.7 +ho visto un changeset: Aggiunta etichetta miaetichetta per il changeset fb5e3583537a
   212.8 +ho visto un changeset: Aggiunta una riga alla fine del file &lt;&lt;hello&gt;&gt;.
   212.9 +
  212.10 +In più, aggiunto un file con il nome indicativo (almeno spero che qualcuno possa considerarlo tale) di goodbye.
  212.11 +ho visto un changeset: Aggiunto file hello.
  212.12 +</screen>
  212.13 +<!-- END template.simple.simplesub -->
   213.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   213.2 +++ b/it/examples/template.svnstyle.id.it	Fri Sep 04 16:33:35 2009 +0200
   213.3 @@ -0,0 +1,4 @@
   213.4 +<!-- BEGIN template.svnstyle.id -->
   213.5 +<screen><prompt>$</prompt> <userinput>hg log -r0 --template '{node}'</userinput>
   213.6 +6d6d6f73864f8fc2d56e1f788c751e0445bdb13e</screen>
   213.7 +<!-- END template.svnstyle.id -->
   214.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   214.2 +++ b/it/examples/template.svnstyle.short.it	Fri Sep 04 16:33:35 2009 +0200
   214.3 @@ -0,0 +1,14 @@
   214.4 +<!-- BEGIN template.svnstyle.short -->
   214.5 +<screen><prompt>$</prompt> <userinput>svn log -r9653</userinput>
   214.6 +------------------------------------------------------------------------
   214.7 +r9653 | sean.hefty | 2006-09-27 14:39:55 -0700 (Wed, 27 Sep 2006) | 6 righe
   214.8 +
   214.9 +Indicando un errore di connessione, includi anche il codice di
  214.10 +stato per l'errore, piuttosto che usare un codice di stato pari
  214.11 +a 0 quando è avvenuto un errore.
  214.12 +
  214.13 +Firmato-da: Sean Hefty &lt;sean.hefty@intel.com&gt;
  214.14 +
  214.15 +------------------------------------------------------------------------
  214.16 +</screen>
  214.17 +<!-- END template.svnstyle.short -->
   215.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   215.2 +++ b/it/examples/template.svnstyle.style.it	Fri Sep 04 16:33:35 2009 +0200
   215.3 @@ -0,0 +1,6 @@
   215.4 +<!-- BEGIN template.svnstyle.style -->
   215.5 +<screen><prompt>$</prompt> <userinput>cat svn.stile</userinput>
   215.6 +header = '------------------------------------------------------------------------\n\n'
   215.7 +changeset = svn.template
   215.8 +</screen>
   215.9 +<!-- END template.svnstyle.style -->
   216.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   216.2 +++ b/it/examples/template.svnstyle.syntax.error.it	Fri Sep 04 16:33:35 2009 +0200
   216.3 @@ -0,0 +1,5 @@
   216.4 +<!-- BEGIN template.svnstyle.syntax.error -->
   216.5 +<screen><prompt>$</prompt> <userinput>hg log -r1 --style stile.errato</userinput>
   216.6 +fallimento: stile.errato:1: errore di riconoscimento
   216.7 +</screen>
   216.8 +<!-- END template.svnstyle.syntax.error -->
   217.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   217.2 +++ b/it/examples/template.svnstyle.syntax.input.it	Fri Sep 04 16:33:35 2009 +0200
   217.3 @@ -0,0 +1,5 @@
   217.4 +<!-- BEGIN template.svnstyle.syntax.input -->
   217.5 +<screen><prompt>$</prompt> <userinput>cat stile.errato</userinput>
   217.6 +changeset =
   217.7 +</screen>
   217.8 +<!-- END template.svnstyle.syntax.input -->
   218.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   218.2 +++ b/it/examples/template.svnstyle.template.it	Fri Sep 04 16:33:35 2009 +0200
   218.3 @@ -0,0 +1,9 @@
   218.4 +<!-- BEGIN template.svnstyle.template -->
   218.5 +<screen><prompt>$</prompt> <userinput>cat svn.template</userinput>
   218.6 +r{rev} | {author|user} | {date|isodate} ({date|rfc822date})
   218.7 +
   218.8 +{desc|strip|fill76}
   218.9 +
  218.10 +------------------------------------------------------------------------
  218.11 +</screen>
  218.12 +<!-- END template.svnstyle.template -->
   219.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   219.2 +++ b/it/examples/tour-merge-conflict.commit.it	Fri Sep 04 16:33:35 2009 +0200
   219.3 @@ -0,0 +1,19 @@
   219.4 +<!-- BEGIN tour-merge-conflict.commit -->
   219.5 +<screen><prompt>$</prompt> <userinput>cat &gt; lettera.txt &lt;&lt;EOF</userinput>
   219.6 +<prompt>></prompt> <userinput>Salve!</userinput>
   219.7 +<prompt>></prompt> <userinput>Sono Bryan O'Sullivan, nessuna parentela con l'ex</userinput>
   219.8 +<prompt>></prompt> <userinput>dittatore nigeriano Sani Abacha.</userinput>
   219.9 +<prompt>></prompt> <userinput>EOF</userinput>
  219.10 +<prompt>$</prompt> <userinput>hg resolve -m lettera.txt</userinput>
  219.11 +<prompt>$</prompt> <userinput>hg commit -m 'Mandatemi i vostri soldi'</userinput>
  219.12 +<prompt>$</prompt> <userinput>hg tip</userinput>
  219.13 +changeset:   3:df19ae0ef4d4
  219.14 +etichetta:   tip
  219.15 +genitore:    1:ae14113af250
  219.16 +genitore:    2:11ab3b2b6d1b
  219.17 +utente:      Bryan O'Sullivan &lt;bos@serpentine.com&gt;
  219.18 +data:        Fri Jun 05 15:52:13 2009 +0000
  219.19 +sommario:    Mandatemi i vostri soldi
  219.20 +
  219.21 +</screen>
  219.22 +<!-- END tour-merge-conflict.commit -->
   220.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   220.2 +++ b/it/examples/tour-merge-conflict.cousin.it	Fri Sep 04 16:33:35 2009 +0200
   220.3 @@ -0,0 +1,14 @@
   220.4 +<!-- BEGIN tour-merge-conflict.cousin -->
   220.5 +<screen><prompt>$</prompt> <userinput>cd ..</userinput>
   220.6 +<prompt>$</prompt> <userinput>hg clone truffa truffa-cugino</userinput>
   220.7 +aggiorno la directory di lavoro
   220.8 +1 file aggiornati, 0 file uniti, 0 file rimossi, 0 file irrisolti
   220.9 +<prompt>$</prompt> <userinput>cd truffa-cugino</userinput>
  220.10 +<prompt>$</prompt> <userinput>cat &gt; lettera.txt &lt;&lt;EOF</userinput>
  220.11 +<prompt>></prompt> <userinput>Salve!</userinput>
  220.12 +<prompt>></prompt> <userinput>Sono Shehu Musa Abacha, cugino dell'ex</userinput>
  220.13 +<prompt>></prompt> <userinput>dittatore nigeriano Sani Abacha.</userinput>
  220.14 +<prompt>></prompt> <userinput>EOF</userinput>
  220.15 +<prompt>$</prompt> <userinput>hg commit -m 'truffa 419, con cugino'</userinput>
  220.16 +</screen>
  220.17 +<!-- END tour-merge-conflict.cousin -->
   221.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   221.2 +++ b/it/examples/tour-merge-conflict.merge.it	Fri Sep 04 16:33:35 2009 +0200
   221.3 @@ -0,0 +1,18 @@
   221.4 +<!-- BEGIN tour-merge-conflict.merge -->
   221.5 +<screen><prompt>$</prompt> <userinput>export HGMERGE=merge</userinput>
   221.6 +<prompt>$</prompt> <userinput>hg merge</userinput>
   221.7 +unisco lettera.txt
   221.8 +merge: attenzione: conflitti durante l'unione
   221.9 +unione di lettera.txt fallita!
  221.10 +0 file aggiornati, 0 file uniti, 0 file rimossi, 1 file irrisolti
  221.11 +usate 'hg resolve' per riprovare a unire i file irrisolti o 'hg up --clean' per abbandonare
  221.12 +<prompt>$</prompt> <userinput>cat lettera.txt</userinput>
  221.13 +Salve!
  221.14 +&lt;&lt;&lt;&lt;&lt;&lt;&lt; /tmp/panoramica-unioni-conflitto/truffa-unione/lettera.txt
  221.15 +Sono Shehu Musa Abacha, cugino dell'ex
  221.16 +=======
  221.17 +Sono Alhaji Abba Abacha, figlio dell'ex
  221.18 +&gt;&gt;&gt;&gt;&gt;&gt;&gt; /tmp/lettera.txt~other.01poS4
  221.19 +dittatore nigeriano Sani Abacha.
  221.20 +</screen>
  221.21 +<!-- END tour-merge-conflict.merge -->
   222.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   222.2 +++ b/it/examples/tour-merge-conflict.pull.it	Fri Sep 04 16:33:35 2009 +0200
   222.3 @@ -0,0 +1,17 @@
   222.4 +<!-- BEGIN tour-merge-conflict.pull -->
   222.5 +<screen><prompt>$</prompt> <userinput>cd ..</userinput>
   222.6 +<prompt>$</prompt> <userinput>hg clone truffa-cugino truffa-unione</userinput>
   222.7 +aggiorno la directory di lavoro
   222.8 +1 file aggiornati, 0 file uniti, 0 file rimossi, 0 file irrisolti
   222.9 +<prompt>$</prompt> <userinput>cd truffa-unione</userinput>
  222.10 +<prompt>$</prompt> <userinput>hg pull -u ../truffa-figlio</userinput>
  222.11 +estraggo da ../truffa-figlio
  222.12 +cerco i cambiamenti
  222.13 +aggiungo i changeset
  222.14 +aggiungo i manifest
  222.15 +aggiungo i cambiamenti ai file
  222.16 +aggiunti 1 changeset con 1 cambiamenti a 1 file (+1 teste)
  222.17 +non aggiorno, sono state aggiunte nuove teste
  222.18 +(eseguite 'hg heads' per vedere le teste, 'hg merge' per unire)
  222.19 +</screen>
  222.20 +<!-- END tour-merge-conflict.pull -->
   223.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   223.2 +++ b/it/examples/tour-merge-conflict.son.it	Fri Sep 04 16:33:35 2009 +0200
   223.3 @@ -0,0 +1,14 @@
   223.4 +<!-- BEGIN tour-merge-conflict.son -->
   223.5 +<screen><prompt>$</prompt> <userinput>cd ..</userinput>
   223.6 +<prompt>$</prompt> <userinput>hg clone truffa truffa-figlio</userinput>
   223.7 +aggiorno la directory di lavoro
   223.8 +1 file aggiornati, 0 file uniti, 0 file rimossi, 0 file irrisolti
   223.9 +<prompt>$</prompt> <userinput>cd truffa-figlio</userinput>
  223.10 +<prompt>$</prompt> <userinput>cat &gt; lettera.txt &lt;&lt;EOF</userinput>
  223.11 +<prompt>></prompt> <userinput>Salve!</userinput>
  223.12 +<prompt>></prompt> <userinput>Sono Alhaji Abba Abacha, figlio dell'ex</userinput>
  223.13 +<prompt>></prompt> <userinput>dittatore nigeriano Sani Abacha.</userinput>
  223.14 +<prompt>></prompt> <userinput>EOF</userinput>
  223.15 +<prompt>$</prompt> <userinput>hg commit -m 'truffa 419, con figlio'</userinput>
  223.16 +</screen>
  223.17 +<!-- END tour-merge-conflict.son -->
   224.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   224.2 +++ b/it/examples/tour-merge-conflict.wife.it	Fri Sep 04 16:33:35 2009 +0200
   224.3 @@ -0,0 +1,10 @@
   224.4 +<!-- BEGIN tour-merge-conflict.wife -->
   224.5 +<screen><prompt>$</prompt> <userinput>cat &gt; lettera.txt &lt;&lt;EOF</userinput>
   224.6 +<prompt>></prompt> <userinput>Salve!</userinput>
   224.7 +<prompt>></prompt> <userinput>Sono Mariam Abacha, moglie dell'ex</userinput>
   224.8 +<prompt>></prompt> <userinput>dittatore nigeriano Sani Abacha.</userinput>
   224.9 +<prompt>></prompt> <userinput>EOF</userinput>
  224.10 +<prompt>$</prompt> <userinput>hg add lettera.txt</userinput>
  224.11 +<prompt>$</prompt> <userinput>hg commit -m 'truffa 419, prima bozza'</userinput>
  224.12 +</screen>
  224.13 +<!-- END tour-merge-conflict.wife -->
   225.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   225.2 +++ b/it/examples/tour.cat1.it	Fri Sep 04 16:33:35 2009 +0200
   225.3 @@ -0,0 +1,17 @@
   225.4 +<!-- BEGIN tour.cat1 -->
   225.5 +<screen><prompt>$</prompt> <userinput>cat hello.c</userinput>
   225.6 +/*
   225.7 + * Rilasciato al pubblico dominio da Bryan O'Sullivan. Questo
   225.8 + * programma non è protetto da brevetti negli Stati Uniti o in
   225.9 + * altri paesi.
  225.10 + */
  225.11 +
  225.12 +#include &lt;stdio.h&gt;
  225.13 +
  225.14 +int main(int argc, char **argv)
  225.15 +{
  225.16 +	printf("ciao, mondo!\");
  225.17 +	return 0;
  225.18 +}
  225.19 +</screen>
  225.20 +<!-- END tour.cat1 -->
   226.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   226.2 +++ b/it/examples/tour.cat2.it	Fri Sep 04 16:33:35 2009 +0200
   226.3 @@ -0,0 +1,19 @@
   226.4 +<!-- BEGIN tour.cat2 -->
   226.5 +<screen># ... modifichiamo il file ...
   226.6 +<prompt>$</prompt> <userinput>cat hello.c</userinput>
   226.7 +/*
   226.8 + * Rilasciato al pubblico dominio da Bryan O'Sullivan. Questo
   226.9 + * programma non è protetto da brevetti negli Stati Uniti o in
  226.10 + * altri paesi.
  226.11 + */
  226.12 +
  226.13 +#include &lt;stdio.h&gt;
  226.14 +
  226.15 +int main(int argc, char **argv)
  226.16 +{
  226.17 +	printf("ciao, mondo!\");
  226.18 +	printf("ancora ciao!\n");
  226.19 +	return 0;
  226.20 +}
  226.21 +</screen>
  226.22 +<!-- END tour.cat2 -->
   227.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   227.2 +++ b/it/examples/tour.clone-pull.it	Fri Sep 04 16:33:35 2009 +0200
   227.3 @@ -0,0 +1,7 @@
   227.4 +<!-- BEGIN tour.clone-pull -->
   227.5 +<screen><prompt>$</prompt> <userinput>cd ..</userinput>
   227.6 +<prompt>$</prompt> <userinput>hg clone hello hello-estrazione</userinput>
   227.7 +aggiorno la directory di lavoro
   227.8 +2 file aggiornati, 0 file uniti, 0 file rimossi, 0 file irrisolti
   227.9 +</screen>
  227.10 +<!-- END tour.clone-pull -->
   228.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   228.2 +++ b/it/examples/tour.clone-push.it	Fri Sep 04 16:33:35 2009 +0200
   228.3 @@ -0,0 +1,7 @@
   228.4 +<!-- BEGIN tour.clone-push -->
   228.5 +<screen><prompt>$</prompt> <userinput>cd ..</userinput>
   228.6 +<prompt>$</prompt> <userinput>hg clone hello hello-trasmissione</userinput>
   228.7 +aggiorno la directory di lavoro
   228.8 +2 file aggiornati, 0 file uniti, 0 file rimossi, 0 file irrisolti
   228.9 +</screen>
  228.10 +<!-- END tour.clone-push -->
   229.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   229.2 +++ b/it/examples/tour.clone.it	Fri Sep 04 16:33:35 2009 +0200
   229.3 @@ -0,0 +1,12 @@
   229.4 +<!-- BEGIN tour.clone -->
   229.5 +<screen><prompt>$</prompt> <userinput>hg clone http://hg.serpentine.com/tutorial/hello</userinput>
   229.6 +directory di destinazione: hello
   229.7 +richiedo tutte le modifiche
   229.8 +aggiungo i changeset
   229.9 +aggiungo i manifest
  229.10 +aggiungo i cambiamenti ai file
  229.11 +aggiunti 5 changeset con 5 cambiamenti a 2 file
  229.12 +aggiorno la directory di lavoro
  229.13 +2 file aggiornati, 0 file uniti, 0 file rimossi, 0 file irrisolti
  229.14 +</screen>
  229.15 +<!-- END tour.clone -->
   230.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   230.2 +++ b/it/examples/tour.commit.it	Fri Sep 04 16:33:35 2009 +0200
   230.3 @@ -0,0 +1,4 @@
   230.4 +<!-- BEGIN tour.commit -->
   230.5 +<screen><prompt>$</prompt> <userinput>hg commit</userinput>
   230.6 +</screen>
   230.7 +<!-- END tour.commit -->
   231.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   231.2 +++ b/it/examples/tour.diff.it	Fri Sep 04 16:33:35 2009 +0200
   231.3 @@ -0,0 +1,14 @@
   231.4 +<!-- BEGIN tour.diff -->
   231.5 +<screen><prompt>$</prompt> <userinput>hg diff</userinput>
   231.6 +diff -r 2278160e78d4 hello.c
   231.7 +--- a/hello.c	Sat Aug 16 22:16:53 2008 +0200
   231.8 ++++ b/hello.c	Fri Jun 05 15:51:51 2009 +0000
   231.9 +@@ -8,5 +8,6 @@
  231.10 + int main(int argc, char **argv)
  231.11 + {
  231.12 + 	printf("ciao, mondo!\");
  231.13 ++	printf("ancora ciao!\n");
  231.14 + 	return 0;
  231.15 + }
  231.16 +</screen>
  231.17 +<!-- END tour.diff -->
   232.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   232.2 +++ b/it/examples/tour.help.it	Fri Sep 04 16:33:35 2009 +0200
   232.3 @@ -0,0 +1,23 @@
   232.4 +<!-- BEGIN tour.help -->
   232.5 +<screen><prompt>$</prompt> <userinput>hg help init</userinput>
   232.6 +hg init [-e CMD] [--remotecmd CMD] [DEST]
   232.7 +
   232.8 +crea un nuovo repository nella directory data
   232.9 +
  232.10 +    Inizializza un nuovo repository nella directory data. Se questa
  232.11 +    directory non esiste, viene creata.
  232.12 +
  232.13 +    Se non viene data alcuna directory, il comando usa la directory
  232.14 +    corrente.
  232.15 +
  232.16 +    &Egrave; possibile specificare un URL ssh:// come destinazione.
  232.17 +    Si veda 'hg help urls' per maggiori informazioni.
  232.18 +
  232.19 +opzioni:
  232.20 +
  232.21 + -e --ssh        specifica il comando ssh da usare
  232.22 +    --remotecmd  specifica il comando hg da eseguire in remoto
  232.23 +
  232.24 +usate "hg -v help init" per vedere le opzioni globali
  232.25 +</screen>
  232.26 +<!-- END tour.help -->
   233.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   233.2 +++ b/it/examples/tour.incoming.it	Fri Sep 04 16:33:35 2009 +0200
   233.3 @@ -0,0 +1,13 @@
   233.4 +<!-- BEGIN tour.incoming -->
   233.5 +<screen><prompt>$</prompt> <userinput>cd hello-estrazione</userinput>
   233.6 +<prompt>$</prompt> <userinput>hg incoming ../mio-hello</userinput>
   233.7 +confronto con ../mio-hello
   233.8 +cerco i cambiamenti
   233.9 +changeset:   5:764347e47e75
  233.10 +etichetta:   tip
  233.11 +utente:      Bryan O'Sullivan &lt;bos@serpentine.com&gt;
  233.12 +data:        Fri Jun 05 15:51:52 2009 +0000
  233.13 +sommario:    Inserisce una riga con un messaggio aggiuntivo.
  233.14 +
  233.15 +</screen>
  233.16 +<!-- END tour.incoming -->
   234.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   234.2 +++ b/it/examples/tour.log-r.it	Fri Sep 04 16:33:35 2009 +0200
   234.3 @@ -0,0 +1,27 @@
   234.4 +<!-- BEGIN tour.log-r -->
   234.5 +<screen><prompt>$</prompt> <userinput>hg log -r 3</userinput>
   234.6 +changeset:   3:0272e0d5a517
   234.7 +utente:      Bryan O'Sullivan &lt;bos@serpentine.com&gt;
   234.8 +data:        Sat Aug 16 22:08:02 2008 +0200
   234.9 +sommario:    Induce make a generare l'eseguibile finale dal file .o.
  234.10 +
  234.11 +<prompt>$</prompt> <userinput>hg log -r 0272e0d5a517</userinput>
  234.12 +changeset:   3:0272e0d5a517
  234.13 +utente:      Bryan O'Sullivan &lt;bos@serpentine.com&gt;
  234.14 +data:        Sat Aug 16 22:08:02 2008 +0200
  234.15 +sommario:    Induce make a generare l'eseguibile finale dal file .o.
  234.16 +
  234.17 +<prompt>$</prompt> <userinput>hg log -r 1 -r 4</userinput>
  234.18 +changeset:   1:82e55d328c8c
  234.19 +utente:      mpm@selenic.com
  234.20 +data:        Fri Aug 26 01:21:28 2005 -0700
  234.21 +sommario:    Crea un makefile.
  234.22 +
  234.23 +changeset:   4:2278160e78d4
  234.24 +etichetta:   tip
  234.25 +utente:      Bryan O'Sullivan &lt;bos@serpentine.com&gt;
  234.26 +data:        Sat Aug 16 22:16:53 2008 +0200
  234.27 +sommario:    Aggiusta i commenti.
  234.28 +
  234.29 +</screen>
  234.30 +<!-- END tour.log-r -->
   235.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   235.2 +++ b/it/examples/tour.log-v.it	Fri Sep 04 16:33:35 2009 +0200
   235.3 @@ -0,0 +1,12 @@
   235.4 +<!-- BEGIN tour.log-v -->
   235.5 +<screen><prompt>$</prompt> <userinput>hg log -v -r 3</userinput>
   235.6 +changeset:   3:0272e0d5a517
   235.7 +utente:      Bryan O'Sullivan &lt;bos@serpentine.com&gt;
   235.8 +data:        Sat Aug 16 22:08:02 2008 +0200
   235.9 +file:        Makefile
  235.10 +descrizione:
  235.11 +Induce make a generare l'eseguibile finale dal file .o.
  235.12 +
  235.13 +
  235.14 +</screen>
  235.15 +<!-- END tour.log-v -->
   236.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   236.2 +++ b/it/examples/tour.log-vp.it	Fri Sep 04 16:33:35 2009 +0200
   236.3 @@ -0,0 +1,24 @@
   236.4 +<!-- BEGIN tour.log-vp -->
   236.5 +<screen><prompt>$</prompt> <userinput>hg log -v -p -r 2</userinput>
   236.6 +changeset:   2:fef857204a0c
   236.7 +utente:      Bryan O'Sullivan &lt;bos@serpentine.com&gt;
   236.8 +data:        Sat Aug 16 22:05:04 2008 +0200
   236.9 +file:        hello.c
  236.10 +descrizione:
  236.11 +Introduce un errore in hello.c.
  236.12 +
  236.13 +
  236.14 +diff -r 82e55d328c8c -r fef857204a0c hello.c
  236.15 +--- a/hello.c	Fri Aug 26 01:21:28 2005 -0700
  236.16 ++++ b/hello.c	Sat Aug 16 22:05:04 2008 +0200
  236.17 +@@ -11,6 +11,6 @@
  236.18 + 
  236.19 + int main(int argc, char **argv)
  236.20 + {
  236.21 +-	printf("ciao, mondo!\n");
  236.22 ++	printf("ciao, mondo!\");
  236.23 + 	return 0;
  236.24 + }
  236.25 +
  236.26 +</screen>
  236.27 +<!-- END tour.log-vp -->
   237.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   237.2 +++ b/it/examples/tour.log.it	Fri Sep 04 16:33:35 2009 +0200
   237.3 @@ -0,0 +1,30 @@
   237.4 +<!-- BEGIN tour.log -->
   237.5 +<screen><prompt>$</prompt> <userinput>hg log</userinput>
   237.6 +changeset:   4:2278160e78d4
   237.7 +etichetta:   tip
   237.8 +utente:      Bryan O'Sullivan &lt;bos@serpentine.com&gt;
   237.9 +data:        Sat Aug 16 22:16:53 2008 +0200
  237.10 +sommario:    Aggiusta i commenti.
  237.11 +
  237.12 +changeset:   3:0272e0d5a517
  237.13 +utente:      Bryan O'Sullivan &lt;bos@serpentine.com&gt;
  237.14 +data:        Sat Aug 16 22:08:02 2008 +0200
  237.15 +sommario:    Induce make a generare l'eseguibile finale dal file .o.
  237.16 +
  237.17 +changeset:   2:fef857204a0c
  237.18 +utente:      Bryan O'Sullivan &lt;bos@serpentine.com&gt;
  237.19 +data:        Sat Aug 16 22:05:04 2008 +0200
  237.20 +sommario:    Introduce un errore in hello.c.
  237.21 +
  237.22 +changeset:   1:82e55d328c8c
  237.23 +utente:      mpm@selenic.com
  237.24 +data:        Fri Aug 26 01:21:28 2005 -0700
  237.25 +sommario:    Crea un makefile.
  237.26 +
  237.27 +changeset:   0:0a04b987be5a
  237.28 +utente:      mpm@selenic.com
  237.29 +data:        Fri Aug 26 01:20:50 2005 -0700
  237.30 +sommario:    Crea il classico programma "ciao, mondo".
  237.31 +
  237.32 +</screen>
  237.33 +<!-- END tour.log -->
   238.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   238.2 +++ b/it/examples/tour.log.range.it	Fri Sep 04 16:33:35 2009 +0200
   238.3 @@ -0,0 +1,20 @@
   238.4 +<!-- BEGIN tour.log.range -->
   238.5 +<screen><prompt>$</prompt> <userinput>hg log -r 2:4</userinput>
   238.6 +changeset:   2:fef857204a0c
   238.7 +utente:      Bryan O'Sullivan &lt;bos@serpentine.com&gt;
   238.8 +data:        Sat Aug 16 22:05:04 2008 +0200
   238.9 +sommario:    Introduce un errore in hello.c.
  238.10 +
  238.11 +changeset:   3:0272e0d5a517
  238.12 +utente:      Bryan O'Sullivan &lt;bos@serpentine.com&gt;
  238.13 +data:        Sat Aug 16 22:08:02 2008 +0200
  238.14 +sommario:    Induce make a generare l'eseguibile finale dal file .o.
  238.15 +
  238.16 +changeset:   4:2278160e78d4
  238.17 +etichetta:   tip
  238.18 +utente:      Bryan O'Sullivan &lt;bos@serpentine.com&gt;
  238.19 +data:        Sat Aug 16 22:16:53 2008 +0200
  238.20 +sommario:    Aggiusta i commenti.
  238.21 +
  238.22 +</screen>
  238.23 +<!-- END tour.log.range -->
   239.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   239.2 +++ b/it/examples/tour.ls-a.it	Fri Sep 04 16:33:35 2009 +0200
   239.3 @@ -0,0 +1,6 @@
   239.4 +<!-- BEGIN tour.ls-a -->
   239.5 +<screen><prompt>$</prompt> <userinput>cd hello</userinput>
   239.6 +<prompt>$</prompt> <userinput>ls -a</userinput>
   239.7 +.  ..  .hg  Makefile  hello.c
   239.8 +</screen>
   239.9 +<!-- END tour.ls-a -->
   240.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   240.2 +++ b/it/examples/tour.ls.it	Fri Sep 04 16:33:35 2009 +0200
   240.3 @@ -0,0 +1,8 @@
   240.4 +<!-- BEGIN tour.ls -->
   240.5 +<screen><prompt>$</prompt> <userinput>ls -l</userinput>
   240.6 +total 4
   240.7 +drwxrwxr-x 3 bos bos 4096 May  5 06:55 hello
   240.8 +<prompt>$</prompt> <userinput>ls hello</userinput>
   240.9 +Makefile  hello.c
  240.10 +</screen>
  240.11 +<!-- END tour.ls -->
   241.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   241.2 +++ b/it/examples/tour.merge.cat1.it	Fri Sep 04 16:33:35 2009 +0200
   241.3 @@ -0,0 +1,19 @@
   241.4 +<!-- BEGIN tour.merge.cat1 -->
   241.5 +<screen><prompt>$</prompt> <userinput>cat hello.c</userinput>
   241.6 +/*
   241.7 + * Rilasciato al pubblico dominio da Bryan O'Sullivan. Questo
   241.8 + * programma non è protetto da brevetti negli Stati Uniti o in
   241.9 + * altri paesi.
  241.10 + */
  241.11 +
  241.12 +#include &lt;stdio.h&gt;
  241.13 +
  241.14 +int main(int argc, char **argv)
  241.15 +{
  241.16 +	printf("ancora una volta, ciao.\n");
  241.17 +	printf("ciao, mondo!\");
  241.18 +	printf("ancora ciao!\n");
  241.19 +	return 0;
  241.20 +}
  241.21 +</screen>
  241.22 +<!-- END tour.merge.cat1 -->
   242.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   242.2 +++ b/it/examples/tour.merge.cat2.it	Fri Sep 04 16:33:35 2009 +0200
   242.3 @@ -0,0 +1,18 @@
   242.4 +<!-- BEGIN tour.merge.cat2 -->
   242.5 +<screen><prompt>$</prompt> <userinput>cat ../mio-hello/hello.c</userinput>
   242.6 +/*
   242.7 + * Rilasciato al pubblico dominio da Bryan O'Sullivan. Questo
   242.8 + * programma non è protetto da brevetti negli Stati Uniti o in
   242.9 + * altri paesi.
  242.10 + */
  242.11 +
  242.12 +#include &lt;stdio.h&gt;
  242.13 +
  242.14 +int main(int argc, char **argv)
  242.15 +{
  242.16 +	printf("ciao, mondo!\");
  242.17 +	printf("ancora ciao!\n");
  242.18 +	return 0;
  242.19 +}
  242.20 +</screen>
  242.21 +<!-- END tour.merge.cat2 -->
   243.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   243.2 +++ b/it/examples/tour.merge.clone.it	Fri Sep 04 16:33:35 2009 +0200
   243.3 @@ -0,0 +1,11 @@
   243.4 +<!-- BEGIN tour.merge.clone -->
   243.5 +<screen><prompt>$</prompt> <userinput>cd ..</userinput>
   243.6 +<prompt>$</prompt> <userinput>hg clone hello mio-nuovo-hello</userinput>
   243.7 +aggiorno la directory di lavoro
   243.8 +2 file aggiornati, 0 file uniti, 0 file rimossi, 0 file irrisolti
   243.9 +<prompt>$</prompt> <userinput>cd mio-nuovo-hello</userinput>
  243.10 +# Apportiamo alcune semplici modifiche a hello.c...
  243.11 +<prompt>$</prompt> <userinput>mio-editor-di-testo hello.c</userinput>
  243.12 +<prompt>$</prompt> <userinput>hg commit -m "Un nuovo saluto per un nuovo giorno."</userinput>
  243.13 +</screen>
  243.14 +<!-- END tour.merge.clone -->
   244.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   244.2 +++ b/it/examples/tour.merge.commit.it	Fri Sep 04 16:33:35 2009 +0200
   244.3 @@ -0,0 +1,4 @@
   244.4 +<!-- BEGIN tour.merge.commit -->
   244.5 +<screen><prompt>$</prompt> <userinput>hg commit -m "Unisce i cambiamenti."</userinput>
   244.6 +</screen>
   244.7 +<!-- END tour.merge.commit -->
   245.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   245.2 +++ b/it/examples/tour.merge.heads.it	Fri Sep 04 16:33:35 2009 +0200
   245.3 @@ -0,0 +1,16 @@
   245.4 +<!-- BEGIN tour.merge.heads -->
   245.5 +<screen><prompt>$</prompt> <userinput>hg heads</userinput>
   245.6 +changeset:   6:764347e47e75
   245.7 +etichetta:   tip
   245.8 +genitore:    4:2278160e78d4
   245.9 +utente:      Bryan O'Sullivan &lt;bos@serpentine.com&gt;
  245.10 +data:        Fri Jun 05 15:51:52 2009 +0000
  245.11 +sommario:    Inserisce una riga con un messaggio aggiuntivo.
  245.12 +
  245.13 +changeset:   5:1c343117a2e3
  245.14 +utente:      Bryan O'Sullivan &lt;bos@serpentine.com&gt;
  245.15 +data:        Fri Jun 05 15:52:03 2009 +0000
  245.16 +sommario:    Un nuovo saluto per un nuovo giorno.
  245.17 +
  245.18 +</screen>
  245.19 +<!-- END tour.merge.heads -->
   246.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   246.2 +++ b/it/examples/tour.merge.merge.it	Fri Sep 04 16:33:35 2009 +0200
   246.3 @@ -0,0 +1,7 @@
   246.4 +<!-- BEGIN tour.merge.merge -->
   246.5 +<screen><prompt>$</prompt> <userinput>hg merge</userinput>
   246.6 +unisco hello.c
   246.7 +0 file aggiornati, 1 file uniti, 0 file rimossi, 0 file irrisolti
   246.8 +(unione tra rami, ricordatevi di eseguire il commit)
   246.9 +</screen>
  246.10 +<!-- END tour.merge.merge -->
   247.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   247.2 +++ b/it/examples/tour.merge.parents.it	Fri Sep 04 16:33:35 2009 +0200
   247.3 @@ -0,0 +1,32 @@
   247.4 +<!-- BEGIN tour.merge.parents -->
   247.5 +<screen><prompt>$</prompt> <userinput>hg parents</userinput>
   247.6 +changeset:   5:1c343117a2e3
   247.7 +utente:      Bryan O'Sullivan &lt;bos@serpentine.com&gt;
   247.8 +data:        Fri Jun 05 15:52:03 2009 +0000
   247.9 +sommario:    Un nuovo saluto per un nuovo giorno.
  247.10 +
  247.11 +changeset:   6:764347e47e75
  247.12 +etichetta:   tip
  247.13 +genitore:    4:2278160e78d4
  247.14 +utente:      Bryan O'Sullivan &lt;bos@serpentine.com&gt;
  247.15 +data:        Fri Jun 05 15:51:52 2009 +0000
  247.16 +sommario:    Inserisce una riga con un messaggio aggiuntivo.
  247.17 +
  247.18 +<prompt>$</prompt> <userinput>cat hello.c</userinput>
  247.19 +/*
  247.20 + * Rilasciato al pubblico dominio da Bryan O'Sullivan. Questo
  247.21 + * programma non è protetto da brevetti negli Stati Uniti o in
  247.22 + * altri paesi.
  247.23 + */
  247.24 +
  247.25 +#include &lt;stdio.h&gt;
  247.26 +
  247.27 +int main(int argc, char **argv)
  247.28 +{
  247.29 +	printf("ancora una volta, ciao.\n");
  247.30 +	printf("ciao, mondo!\");
  247.31 +	printf("ancora ciao!\n");
  247.32 +	return 0;
  247.33 +}
  247.34 +</screen>
  247.35 +<!-- END tour.merge.parents -->
   248.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   248.2 +++ b/it/examples/tour.merge.pull.it	Fri Sep 04 16:33:35 2009 +0200
   248.3 @@ -0,0 +1,11 @@
   248.4 +<!-- BEGIN tour.merge.pull -->
   248.5 +<screen><prompt>$</prompt> <userinput>hg pull ../mio-hello</userinput>
   248.6 +estraggo da ../mio-hello
   248.7 +cerco i cambiamenti
   248.8 +aggiungo i changeset
   248.9 +aggiungo i manifest
  248.10 +aggiungo i cambiamenti ai file
  248.11 +aggiunti 1 changeset con 1 cambiamenti a 1 file (+1 teste)
  248.12 +(eseguite 'hg heads' per vedere le teste, 'hg merge' per unire)
  248.13 +</screen>
  248.14 +<!-- END tour.merge.pull -->
   249.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   249.2 +++ b/it/examples/tour.merge.tip.it	Fri Sep 04 16:33:35 2009 +0200
   249.3 @@ -0,0 +1,12 @@
   249.4 +<!-- BEGIN tour.merge.tip -->
   249.5 +<screen><prompt>$</prompt> <userinput>hg tip</userinput>
   249.6 +changeset:   7:e300c3dcceca
   249.7 +etichetta:   tip
   249.8 +genitore:    5:1c343117a2e3
   249.9 +genitore:    6:764347e47e75
  249.10 +utente:      Bryan O'Sullivan &lt;bos@serpentine.com&gt;
  249.11 +data:        Fri Jun 05 15:52:07 2009 +0000
  249.12 +sommario:    Unisce i cambiamenti.
  249.13 +
  249.14 +</screen>
  249.15 +<!-- END tour.merge.tip -->
   250.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   250.2 +++ b/it/examples/tour.merge.update.it	Fri Sep 04 16:33:35 2009 +0200
   250.3 @@ -0,0 +1,5 @@
   250.4 +<!-- BEGIN tour.merge.update -->
   250.5 +<screen><prompt>$</prompt> <userinput>hg update</userinput>
   250.6 +fallimento: attraversa i rami (usate 'hg merge' o 'hg update -C')
   250.7 +</screen>
   250.8 +<!-- END tour.merge.update -->
   251.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   251.2 +++ b/it/examples/tour.older.it	Fri Sep 04 16:33:35 2009 +0200
   251.3 @@ -0,0 +1,20 @@
   251.4 +<!-- BEGIN tour.older -->
   251.5 +<screen><prompt>$</prompt> <userinput>hg update 2</userinput>
   251.6 +2 file aggiornati, 0 file uniti, 0 file rimossi, 0 file irrisolti
   251.7 +<prompt>$</prompt> <userinput>hg parents</userinput>
   251.8 +changeset:   2:fef857204a0c
   251.9 +utente:      Bryan O'Sullivan &lt;bos@serpentine.com&gt;
  251.10 +data:        Sat Aug 16 22:05:04 2008 +0200
  251.11 +sommario:    Introduce un errore in hello.c.
  251.12 +
  251.13 +<prompt>$</prompt> <userinput>hg update</userinput>
  251.14 +2 file aggiornati, 0 file uniti, 0 file rimossi, 0 file irrisolti
  251.15 +<prompt>$</prompt> <userinput>hg parents</userinput>
  251.16 +changeset:   5:764347e47e75
  251.17 +etichetta:   tip
  251.18 +utente:      Bryan O'Sullivan &lt;bos@serpentine.com&gt;
  251.19 +data:        Fri Jun 05 15:51:52 2009 +0000
  251.20 +sommario:    Inserisce una riga con un messaggio aggiuntivo.
  251.21 +
  251.22 +</screen>
  251.23 +<!-- END tour.older -->
   252.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   252.2 +++ b/it/examples/tour.outgoing.it	Fri Sep 04 16:33:35 2009 +0200
   252.3 @@ -0,0 +1,13 @@
   252.4 +<!-- BEGIN tour.outgoing -->
   252.5 +<screen><prompt>$</prompt> <userinput>cd mio-hello</userinput>
   252.6 +<prompt>$</prompt> <userinput>hg outgoing ../hello-trasmissione</userinput>
   252.7 +confronto con ../hello-trasmissione
   252.8 +cerco i cambiamenti
   252.9 +changeset:   5:764347e47e75
  252.10 +etichetta:   tip
  252.11 +utente:      Bryan O'Sullivan &lt;bos@serpentine.com&gt;
  252.12 +data:        Fri Jun 05 15:51:52 2009 +0000
  252.13 +sommario:    Inserisce una riga con un messaggio aggiuntivo.
  252.14 +
  252.15 +</screen>
  252.16 +<!-- END tour.outgoing -->
   253.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   253.2 +++ b/it/examples/tour.outgoing.net.it	Fri Sep 04 16:33:35 2009 +0200
   253.3 @@ -0,0 +1,12 @@
   253.4 +<!-- BEGIN tour.outgoing.net -->
   253.5 +<screen><prompt>$</prompt> <userinput>hg outgoing http://hg.serpentine.com/tutorial/hello</userinput>
   253.6 +confronto con http://hg.serpentine.com/tutorial/hello
   253.7 +cerco i cambiamenti
   253.8 +changeset:   5:764347e47e75
   253.9 +etichetta:   tip
  253.10 +utente:      Bryan O'Sullivan &lt;bos@serpentine.com&gt;
  253.11 +data:        Fri Jun 05 15:51:52 2009 +0000
  253.12 +sommario:    Inserisce una riga con un messaggio aggiuntivo.
  253.13 +
  253.14 +</screen>
  253.15 +<!-- END tour.outgoing.net -->
   254.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   254.2 +++ b/it/examples/tour.parents.it	Fri Sep 04 16:33:35 2009 +0200
   254.3 @@ -0,0 +1,10 @@
   254.4 +<!-- BEGIN tour.parents -->
   254.5 +<screen><prompt>$</prompt> <userinput>hg parents</userinput>
   254.6 +changeset:   5:764347e47e75
   254.7 +etichetta:   tip
   254.8 +utente:      Bryan O'Sullivan &lt;bos@serpentine.com&gt;
   254.9 +data:        Fri Jun 05 15:51:52 2009 +0000
  254.10 +sommario:    Inserisce una riga con un messaggio aggiuntivo.
  254.11 +
  254.12 +</screen>
  254.13 +<!-- END tour.parents -->
   255.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   255.2 +++ b/it/examples/tour.pull.it	Fri Sep 04 16:33:35 2009 +0200
   255.3 @@ -0,0 +1,25 @@
   255.4 +<!-- BEGIN tour.pull -->
   255.5 +<screen><prompt>$</prompt> <userinput>hg tip</userinput>
   255.6 +changeset:   4:2278160e78d4
   255.7 +etichetta:   tip
   255.8 +utente:      Bryan O'Sullivan &lt;bos@serpentine.com&gt;
   255.9 +data:        Sat Aug 16 22:16:53 2008 +0200
  255.10 +sommario:    Aggiusta i commenti.
  255.11 +
  255.12 +<prompt>$</prompt> <userinput>hg pull ../mio-hello</userinput>
  255.13 +estraggo da ../mio-hello
  255.14 +cerco i cambiamenti
  255.15 +aggiungo i changeset
  255.16 +aggiungo i manifest
  255.17 +aggiungo i cambiamenti ai file
  255.18 +aggiunti 1 changeset con 1 cambiamenti a 2 file
  255.19 +(eseguite 'hg update' per ottenere una copia di lavoro)
  255.20 +<prompt>$</prompt> <userinput>hg tip</userinput>
  255.21 +changeset:   5:764347e47e75
  255.22 +etichetta:   tip
  255.23 +utente:      Bryan O'Sullivan &lt;bos@serpentine.com&gt;
  255.24 +data:        Fri Jun 05 15:51:52 2009 +0000
  255.25 +sommario:    Inserisce una riga con un messaggio aggiuntivo.
  255.26 +
  255.27 +</screen>
  255.28 +<!-- END tour.pull -->
   256.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   256.2 +++ b/it/examples/tour.push.it	Fri Sep 04 16:33:35 2009 +0200
   256.3 @@ -0,0 +1,10 @@
   256.4 +<!-- BEGIN tour.push -->
   256.5 +<screen><prompt>$</prompt> <userinput>hg push ../hello-trasmissione</userinput>
   256.6 +trasmetto a ../hello-trasmissione
   256.7 +cerco i cambiamenti
   256.8 +aggiungo i changeset
   256.9 +aggiungo i manifest
  256.10 +aggiungo i cambiamenti ai file
  256.11 +aggiunti 1 changeset con 1 cambiamenti a 2 file
  256.12 +</screen>
  256.13 +<!-- END tour.push -->
   257.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   257.2 +++ b/it/examples/tour.push.net.it	Fri Sep 04 16:33:35 2009 +0200
   257.3 @@ -0,0 +1,7 @@
   257.4 +<!-- BEGIN tour.push.net -->
   257.5 +<screen><prompt>$</prompt> <userinput>hg push http://hg.serpentine.com/tutorial/hello</userinput>
   257.6 +trasmetto a http://hg.serpentine.com/tutorial/hello
   257.7 +cerco i cambiamenti
   257.8 +connessione ssl richiesta
   257.9 +</screen>
  257.10 +<!-- END tour.push.net -->
   258.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   258.2 +++ b/it/examples/tour.push.nothing.it	Fri Sep 04 16:33:35 2009 +0200
   258.3 @@ -0,0 +1,7 @@
   258.4 +<!-- BEGIN tour.push.nothing -->
   258.5 +<screen><prompt>$</prompt> <userinput>hg push ../hello-trasmissione</userinput>
   258.6 +trasmetto a ../hello-trasmissione
   258.7 +cerco i cambiamenti
   258.8 +nessun cambiamento trovato
   258.9 +</screen>
  258.10 +<!-- END tour.push.nothing -->
   259.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   259.2 +++ b/it/examples/tour.reclone.it	Fri Sep 04 16:33:35 2009 +0200
   259.3 @@ -0,0 +1,8 @@
   259.4 +<!-- BEGIN tour.reclone -->
   259.5 +<screen><prompt>$</prompt> <userinput>cd ..</userinput>
   259.6 +<prompt>$</prompt> <userinput>hg clone hello mio-hello</userinput>
   259.7 +aggiorno la directory di lavoro
   259.8 +2 file aggiornati, 0 file uniti, 0 file rimossi, 0 file irrisolti
   259.9 +<prompt>$</prompt> <userinput>cd mio-hello</userinput>
  259.10 +</screen>
  259.11 +<!-- END tour.reclone -->
   260.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   260.2 +++ b/it/examples/tour.status.it	Fri Sep 04 16:33:35 2009 +0200
   260.3 @@ -0,0 +1,7 @@
   260.4 +<!-- BEGIN tour.status -->
   260.5 +<screen><prompt>$</prompt> <userinput>ls</userinput>
   260.6 +Makefile  hello.c
   260.7 +<prompt>$</prompt> <userinput>hg status</userinput>
   260.8 +M hello.c
   260.9 +</screen>
  260.10 +<!-- END tour.status -->
   261.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   261.2 +++ b/it/examples/tour.tip.it	Fri Sep 04 16:33:35 2009 +0200
   261.3 @@ -0,0 +1,24 @@
   261.4 +<!-- BEGIN tour.tip -->
   261.5 +<screen><prompt>$</prompt> <userinput>hg tip -vp</userinput>
   261.6 +changeset:   5:764347e47e75
   261.7 +etichetta:   tip
   261.8 +utente:      Bryan O'Sullivan &lt;bos@serpentine.com&gt;
   261.9 +data:        Fri Jun 05 15:51:52 2009 +0000
  261.10 +file:        hello.c
  261.11 +descrizione:
  261.12 +Inserisce una riga con un messaggio aggiuntivo.
  261.13 +
  261.14 +
  261.15 +diff -r 2278160e78d4 -r 764347e47e75 hello.c
  261.16 +--- a/hello.c	Sat Aug 16 22:16:53 2008 +0200
  261.17 ++++ b/hello.c	Fri Jun 05 15:51:52 2009 +0000
  261.18 +@@ -8,5 +8,6 @@
  261.19 + int main(int argc, char **argv)
  261.20 + {
  261.21 + 	printf("ciao, mondo!\");
  261.22 ++	printf("ancora ciao!\n");
  261.23 + 	return 0;
  261.24 + }
  261.25 +
  261.26 +</screen>
  261.27 +<!-- END tour.tip -->
   262.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   262.2 +++ b/it/examples/tour.update.it	Fri Sep 04 16:33:35 2009 +0200
   262.3 @@ -0,0 +1,10 @@
   262.4 +<!-- BEGIN tour.update -->
   262.5 +<screen><prompt>$</prompt> <userinput>grep printf hello.c</userinput>
   262.6 +	printf("ciao, mondo!\");
   262.7 +<prompt>$</prompt> <userinput>hg update tip</userinput>
   262.8 +1 file aggiornati, 0 file uniti, 0 file rimossi, 0 file irrisolti
   262.9 +<prompt>$</prompt> <userinput>grep printf hello.c</userinput>
  262.10 +	printf("ciao, mondo!\");
  262.11 +	printf("ancora ciao!\n");
  262.12 +</screen>
  262.13 +<!-- END tour.update -->
   263.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   263.2 +++ b/it/examples/tour.version.it	Fri Sep 04 16:33:35 2009 +0200
   263.3 @@ -0,0 +1,10 @@
   263.4 +<!-- BEGIN tour.version -->
   263.5 +<screen><prompt>$</prompt> <userinput>hg version</userinput>
   263.6 +Mercurial SCM distribuito (versione 1.2)
   263.7 +
   263.8 +Copyright (C) 2005-2008 Matt Mackall &lt;mpm@selenic.com&gt; e altri
   263.9 +Questo è software libero, si vedano i sorgenti per le condizioni di
  263.10 +copia. NON c'è alcuna garanzia, neppure di COMMERCIABILIT&Agrave; o IDONEIT&Agrave;
  263.11 +A UNO SCOPO PARTICOLARE.
  263.12 +</screen>
  263.13 +<!-- END tour.version -->
   264.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   264.2 +++ b/it/figs/bad-merge-1.dot	Fri Sep 04 16:33:35 2009 +0200
   264.3 @@ -0,0 +1,13 @@
   264.4 +digraph bad_merge_1 {
   264.5 +	ancestor [label="1: progenitore"];
   264.6 +	left [label="2: mia modifica"];
   264.7 +	right [label="3: vostra modifica"];
   264.8 +	bad [label="4: unione sbagliata"];
   264.9 +	new [label="5: nuova modifica"];
  264.10 +
  264.11 +	ancestor -> left;
  264.12 +	ancestor -> right;
  264.13 +	left -> bad;
  264.14 +	right -> bad;
  264.15 +	bad -> new;
  264.16 +}
   265.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   265.2 +++ b/it/figs/bad-merge-2.dot	Fri Sep 04 16:33:35 2009 +0200
   265.3 @@ -0,0 +1,18 @@
   265.4 +digraph bad_merge_2 {
   265.5 +	ancestor [label="1: progenitore",color=grey,fontcolor=grey];
   265.6 +	left [label="2: mia modifica",color=grey,fontcolor=grey];
   265.7 +	right [label="3: vostra modifica",color=grey,fontcolor=grey];
   265.8 +	bad [label="4: unione sbagliata",color=grey,fontcolor=grey];
   265.9 +	new [label="5: nuova modifica",color=grey,fontcolor=grey];
  265.10 +
  265.11 +	bak_left [label="6: ritiro n°1 della\nunione sbagliata",shape=box];
  265.12 +
  265.13 +	ancestor -> left [color=grey];
  265.14 +	ancestor -> right [color=grey];
  265.15 +	left -> bad [color=grey];
  265.16 +	right -> bad [color=grey];
  265.17 +	bad -> new [color=grey];
  265.18 +
  265.19 +	bad -> bak_left;
  265.20 +	left -> bak_left [style=dotted,label="--parent=2"];
  265.21 +}
   266.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   266.2 +++ b/it/figs/bad-merge-3.dot	Fri Sep 04 16:33:35 2009 +0200
   266.3 @@ -0,0 +1,22 @@
   266.4 +digraph bad_merge_3 {
   266.5 +	ancestor [label="1: progenitore",color="#bbbbbb",fontcolor="#bbbbbb"];
   266.6 +	left [label="2: mia modifica",color="#bbbbbb",fontcolor="#bbbbbb"];
   266.7 +	right [label="3: vostra modifica",color="#bbbbbb",fontcolor="#bbbbbb"];
   266.8 +	bad [label="4: unione sbagliata",color="#bbbbbb",fontcolor="#bbbbbb"];
   266.9 +	new [label="5: nuova modifica",color="#bbbbbb",fontcolor="#bbbbbb"];
  266.10 +
  266.11 +	bak_left [label="6: ritiro n°1 della\nunione sbagliata",color=grey,shape=box];
  266.12 +	bak_right [label="8: ritiro n°2 della\nunione sbagliata",shape=box];
  266.13 +
  266.14 +	ancestor -> left [color="#bbbbbb"];
  266.15 +	ancestor -> right [color="#bbbbbb"];
  266.16 +	left -> bad [color="#bbbbbb"];
  266.17 +	right -> bad [color="#bbbbbb"];
  266.18 +	bad -> new [color="#bbbbbb"];
  266.19 +
  266.20 +	bad -> bak_left [color=grey];
  266.21 +	left -> bak_left [style=dotted,label="--parent=2",color=grey,fontcolor=grey];
  266.22 +
  266.23 +	bad -> bak_right;
  266.24 +	right -> bak_right [style=dotted,label="--parent=3"];
  266.25 +}
   267.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   267.2 +++ b/it/figs/bad-merge-4.dot	Fri Sep 04 16:33:35 2009 +0200
   267.3 @@ -0,0 +1,26 @@
   267.4 +digraph bad_merge_4 {
   267.5 +	ancestor [label="1: progenitore",color="#bbbbbb",fontcolor="#bbbbbb"];
   267.6 +	left [label="2: mia modifica",color="#bbbbbb",fontcolor="#bbbbbb"];
   267.7 +	right [label="3: vostra modifica",color="#bbbbbb",fontcolor="#bbbbbb"];
   267.8 +	bad [label="4: unione sbagliata",color="#bbbbbb",fontcolor="#bbbbbb"];
   267.9 +	new [label="5: nuova modifica",color="#bbbbbb",fontcolor="#bbbbbb"];
  267.10 +
  267.11 +	bak_left [label="6: ritiro n°1 della\nunione sbagliata",color=grey,fontcolor=grey,shape=box];
  267.12 +	bak_right [label="7: ritiro n°2 della\nunione sbagliata",color=grey,fontcolor=grey,shape=box];
  267.13 +	good [label="8: unione\ndei ritiri",shape=box];
  267.14 +
  267.15 +	ancestor -> left [color="#bbbbbb"];
  267.16 +	ancestor -> right [color="#bbbbbb"];
  267.17 +	left -> bad [color="#bbbbbb"];
  267.18 +	right -> bad [color="#bbbbbb"];
  267.19 +	bad -> new [color="#bbbbbb"];
  267.20 +
  267.21 +	bad -> bak_left [color=grey];
  267.22 +	left -> bak_left [style=dotted,label="--parent=2",color=grey,fontcolor=grey];
  267.23 +
  267.24 +	bad -> bak_right [color=grey];
  267.25 +	right -> bak_right [style=dotted,label="--parent=3",color=grey,fontcolor=grey];
  267.26 +
  267.27 +	bak_left -> good;
  267.28 +	bak_right -> good;
  267.29 +}
   268.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   268.2 +++ b/it/figs/bad-merge-5.dot	Fri Sep 04 16:33:35 2009 +0200
   268.3 @@ -0,0 +1,30 @@
   268.4 +digraph bad_merge_5 {
   268.5 +	ancestor [label="1: progenitore",color="#bbbbbb",fontcolor="#bbbbbb"];
   268.6 +	left [label="2: mia modifica",color="#bbbbbb",fontcolor="#bbbbbb"];
   268.7 +	right [label="3: vostra modifica",color="#bbbbbb",fontcolor="#bbbbbb"];
   268.8 +	bad [label="4: unione sbagliata",color="#bbbbbb",fontcolor="#bbbbbb"];
   268.9 +	new [label="5: nuova modifica",color=grey,fontcolor=grey];
  268.10 +
  268.11 +	bak_left [label="6: ritiro n°1 della\nunione sbagliata",color="#bbbbbb",fontcolor="#bbbbbb",shape=box];
  268.12 +	bak_right [label="7: ritiro n°2 della\nunione sbagliata",color="#bbbbbb",fontcolor="#bbbbbb",shape=box];
  268.13 +	good [label="8: unione\ndei ritiri",color=grey,fontcolor=grey,shape=box];
  268.14 +	last [label="9: unione con la\nnuova modifica",shape=box];
  268.15 +
  268.16 +	ancestor -> left [color="#bbbbbb"];
  268.17 +	ancestor -> right [color="#bbbbbb"];
  268.18 +	left -> bad [color="#bbbbbb"];
  268.19 +	right -> bad [color="#bbbbbb"];
  268.20 +	bad -> new [color="#bbbbbb"];
  268.21 +
  268.22 +	bad -> bak_left [color="#bbbbbb"];
  268.23 +	left -> bak_left [style=dotted,label="--parent=2",color="#bbbbbb",fontcolor="#bbbbbb"];
  268.24 +
  268.25 +	bad -> bak_right [color="#bbbbbb"];
  268.26 +	right -> bak_right [style=dotted,label="--parent=3",color="#bbbbbb",fontcolor="#bbbbbb"];
  268.27 +
  268.28 +	bak_left -> good [color=grey];
  268.29 +	bak_right -> good [color=grey];
  268.30 +
  268.31 +	good -> last;
  268.32 +	new -> last;
  268.33 +}
   269.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   269.2 +++ b/it/figs/feature-branches.dot	Fri Sep 04 16:33:35 2009 +0200
   269.3 @@ -0,0 +1,8 @@
   269.4 +digraph feature_branches {
   269.5 +	principale -> cripto;
   269.6 +	principale -> filesystem;
   269.7 +	principale -> ipc;
   269.8 +	principale -> memoria;
   269.9 +	principale -> rete;
  269.10 +	principale -> sicurezza;
  269.11 +}
   270.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   270.2 +++ b/it/figs/filelog.svg	Fri Sep 04 16:33:35 2009 +0200
   270.3 @@ -0,0 +1,381 @@
   270.4 +<?xml version="1.0" encoding="UTF-8" standalone="no"?>
   270.5 +<!-- Created with Inkscape (http://www.inkscape.org/) -->
   270.6 +<svg
   270.7 +   xmlns:dc="http://purl.org/dc/elements/1.1/"
   270.8 +   xmlns:cc="http://creativecommons.org/ns#"
   270.9 +   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  270.10 +   xmlns:svg="http://www.w3.org/2000/svg"
  270.11 +   xmlns="http://www.w3.org/2000/svg"
  270.12 +   xmlns:xlink="http://www.w3.org/1999/xlink"
  270.13 +   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
  270.14 +   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
  270.15 +   width="744.09448819"
  270.16 +   height="1052.3622047"
  270.17 +   id="svg2"
  270.18 +   sodipodi:version="0.32"
  270.19 +   inkscape:version="0.46"
  270.20 +   sodipodi:docname="filelog.svg"
  270.21 +   sodipodi:docbase="/home/arun/hgbook/en"
  270.22 +   inkscape:output_extension="org.inkscape.output.svg.inkscape">
  270.23 +  <defs
  270.24 +     id="defs4">
  270.25 +    <inkscape:perspective
  270.26 +       sodipodi:type="inkscape:persp3d"
  270.27 +       inkscape:vp_x="0 : 526.18109 : 1"
  270.28 +       inkscape:vp_y="0 : 1000 : 0"
  270.29 +       inkscape:vp_z="744.09448 : 526.18109 : 1"
  270.30 +       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
  270.31 +       id="perspective57" />
  270.32 +    <marker
  270.33 +       inkscape:stockid="Arrow1Mend"
  270.34 +       orient="auto"
  270.35 +       refY="0.0"
  270.36 +       refX="0.0"
  270.37 +       id="Arrow1Mend"
  270.38 +       style="overflow:visible;">
  270.39 +      <path
  270.40 +         id="path3128"
  270.41 +         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
  270.42 +         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
  270.43 +         transform="scale(0.4) rotate(180) translate(10,0)" />
  270.44 +    </marker>
  270.45 +    <linearGradient
  270.46 +       id="linearGradient2887">
  270.47 +      <stop
  270.48 +         style="stop-color:#91cfcf;stop-opacity:1;"
  270.49 +         offset="0"
  270.50 +         id="stop2889" />
  270.51 +      <stop
  270.52 +         style="stop-color:aqua;stop-opacity:0;"
  270.53 +         offset="1"
  270.54 +         id="stop2891" />
  270.55 +    </linearGradient>
  270.56 +    <linearGradient
  270.57 +       id="linearGradient2795">
  270.58 +      <stop
  270.59 +         style="stop-color:#ccc;stop-opacity:1;"
  270.60 +         offset="0"
  270.61 +         id="stop2797" />
  270.62 +      <stop
  270.63 +         style="stop-color:#ccc;stop-opacity:0;"
  270.64 +         offset="1"
  270.65 +         id="stop2799" />
  270.66 +    </linearGradient>
  270.67 +    <linearGradient
  270.68 +       inkscape:collect="always"
  270.69 +       xlink:href="#linearGradient2795"
  270.70 +       id="linearGradient3170"
  270.71 +       gradientUnits="userSpaceOnUse"
  270.72 +       gradientTransform="translate(121.2183,94.95434)"
  270.73 +       x1="81.322357"
  270.74 +       y1="404.34424"
  270.75 +       x2="201.52036"
  270.76 +       y2="373.03967" />
  270.77 +    <linearGradient
  270.78 +       inkscape:collect="always"
  270.79 +       xlink:href="#linearGradient2887"
  270.80 +       id="linearGradient3172"
  270.81 +       gradientUnits="userSpaceOnUse"
  270.82 +       gradientTransform="translate(0,12)"
  270.83 +       x1="62.634491"
  270.84 +       y1="503.3392"
  270.85 +       x2="248.49242"
  270.86 +       y2="462.94327" />
  270.87 +    <linearGradient
  270.88 +       inkscape:collect="always"
  270.89 +       xlink:href="#linearGradient2795"
  270.90 +       id="linearGradient3174"
  270.91 +       gradientUnits="userSpaceOnUse"
  270.92 +       gradientTransform="matrix(1.001035,0,0,0.653159,236.7075,153.0415)"
  270.93 +       x1="81.322357"
  270.94 +       y1="404.34424"
  270.95 +       x2="201.52036"
  270.96 +       y2="373.03967" />
  270.97 +    <linearGradient
  270.98 +       inkscape:collect="always"
  270.99 +       xlink:href="#linearGradient2887"
 270.100 +       id="linearGradient3176"
 270.101 +       gradientUnits="userSpaceOnUse"
 270.102 +       gradientTransform="translate(0,12)"
 270.103 +       x1="62.634491"
 270.104 +       y1="503.3392"
 270.105 +       x2="248.49242"
 270.106 +       y2="462.94327" />
 270.107 +    <linearGradient
 270.108 +       inkscape:collect="always"
 270.109 +       xlink:href="#linearGradient2795"
 270.110 +       id="linearGradient3208"
 270.111 +       gradientUnits="userSpaceOnUse"
 270.112 +       gradientTransform="matrix(1.001035,0,0,0.653159,236.7075,153.0415)"
 270.113 +       x1="81.322357"
 270.114 +       y1="404.34424"
 270.115 +       x2="201.52036"
 270.116 +       y2="373.03967" />
 270.117 +    <linearGradient
 270.118 +       inkscape:collect="always"
 270.119 +       xlink:href="#linearGradient2887"
 270.120 +       id="linearGradient3210"
 270.121 +       gradientUnits="userSpaceOnUse"
 270.122 +       gradientTransform="translate(0,12)"
 270.123 +       x1="62.634491"
 270.124 +       y1="503.3392"
 270.125 +       x2="248.49242"
 270.126 +       y2="462.94327" />
 270.127 +    <linearGradient
 270.128 +       inkscape:collect="always"
 270.129 +       xlink:href="#linearGradient2795"
 270.130 +       id="linearGradient3212"
 270.131 +       gradientUnits="userSpaceOnUse"
 270.132 +       gradientTransform="translate(121.2183,94.95434)"
 270.133 +       x1="81.322357"
 270.134 +       y1="404.34424"
 270.135 +       x2="201.52036"
 270.136 +       y2="373.03967" />
 270.137 +    <linearGradient
 270.138 +       inkscape:collect="always"
 270.139 +       xlink:href="#linearGradient2887"
 270.140 +       id="linearGradient3214"
 270.141 +       gradientUnits="userSpaceOnUse"
 270.142 +       gradientTransform="translate(0,12)"
 270.143 +       x1="62.634491"
 270.144 +       y1="503.3392"
 270.145 +       x2="248.49242"
 270.146 +       y2="462.94327" />
 270.147 +    <linearGradient
 270.148 +       inkscape:collect="always"
 270.149 +       xlink:href="#linearGradient2795"
 270.150 +       id="linearGradient3256"
 270.151 +       gradientUnits="userSpaceOnUse"
 270.152 +       gradientTransform="matrix(1.2343775,0,0,0.9981848,103.25588,95.681888)"
 270.153 +       x1="74.301666"
 270.154 +       y1="431.67441"
 270.155 +       x2="260.05884"
 270.156 +       y2="369.95322" />
 270.157 +    <linearGradient
 270.158 +       inkscape:collect="always"
 270.159 +       xlink:href="#linearGradient2887"
 270.160 +       id="linearGradient3258"
 270.161 +       gradientUnits="userSpaceOnUse"
 270.162 +       gradientTransform="matrix(1.228929,0,0,0.9972824,-62.037003,13.312997)"
 270.163 +       x1="62.634491"
 270.164 +       y1="503.3392"
 270.165 +       x2="248.49242"
 270.166 +       y2="462.94327" />
 270.167 +    <linearGradient
 270.168 +       inkscape:collect="always"
 270.169 +       xlink:href="#linearGradient2795"
 270.170 +       id="linearGradient3260"
 270.171 +       gradientUnits="userSpaceOnUse"
 270.172 +       gradientTransform="matrix(1.2300738,0,0,0.6517275,219.97511,153.61527)"
 270.173 +       x1="74.387527"
 270.174 +       y1="431.80576"
 270.175 +       x2="259.97339"
 270.176 +       y2="369.82224" />
 270.177 +    <linearGradient
 270.178 +       inkscape:collect="always"
 270.179 +       xlink:href="#linearGradient2887"
 270.180 +       id="linearGradient3262"
 270.181 +       gradientUnits="userSpaceOnUse"
 270.182 +       gradientTransform="matrix(1.2289272,0,0,0.9972824,-62.036756,13.312985)"
 270.183 +       x1="62.634491"
 270.184 +       y1="503.3392"
 270.185 +       x2="248.49242"
 270.186 +       y2="462.94327" />
 270.187 +  </defs>
 270.188 +  <sodipodi:namedview
 270.189 +     id="base"
 270.190 +     pagecolor="#ffffff"
 270.191 +     bordercolor="#666666"
 270.192 +     borderopacity="1.0"
 270.193 +     gridtolerance="10000"
 270.194 +     guidetolerance="10"
 270.195 +     objecttolerance="10"
 270.196 +     inkscape:pageopacity="0.0"
 270.197 +     inkscape:pageshadow="2"
 270.198 +     inkscape:zoom="1.4"
 270.199 +     inkscape:cx="455.8122"
 270.200 +     inkscape:cy="520"
 270.201 +     inkscape:document-units="px"
 270.202 +     inkscape:current-layer="g2940"
 270.203 +     inkscape:window-width="1680"
 270.204 +     inkscape:window-height="970"
 270.205 +     inkscape:window-x="3"
 270.206 +     inkscape:window-y="46"
 270.207 +     showgrid="false" />
 270.208 +  <metadata
 270.209 +     id="metadata7">
 270.210 +    <rdf:RDF>
 270.211 +      <cc:Work
 270.212 +         rdf:about="">
 270.213 +        <dc:format>image/svg+xml</dc:format>
 270.214 +        <dc:type
 270.215 +           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
 270.216 +      </cc:Work>
 270.217 +    </rdf:RDF>
 270.218 +  </metadata>
 270.219 +  <g
 270.220 +     inkscape:label="Layer 1"
 270.221 +     inkscape:groupmode="layer"
 270.222 +     id="layer1">
 270.223 +    <rect
 270.224 +       style="opacity:1;fill:#abadf8;fill-opacity:1;stroke:#595959;stroke-width:0.93760371;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 270.225 +       id="rect3180"
 270.226 +       width="273.81375"
 270.227 +       height="199.06245"
 270.228 +       x="369.1796"
 270.229 +       y="351.79019" />
 270.230 +    <rect
 270.231 +       style="opacity:1;fill:#a2f69c;fill-opacity:1;stroke:#595959;stroke-width:0.93760341;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 270.232 +       id="rect3178"
 270.233 +       width="273.81339"
 270.234 +       height="199.06233"
 270.235 +       x="72.699799"
 270.236 +       y="351.78983" />
 270.237 +    <g
 270.238 +       id="g3144"
 270.239 +       transform="translate(80.467048,0.71578)">
 270.240 +      <g
 270.241 +         id="g2940">
 270.242 +        <rect
 270.243 +           style="fill:url(#linearGradient3260);fill-opacity:1;stroke:#000000;stroke-width:0.89536202;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 270.244 +           id="rect2914"
 270.245 +           width="227.38896"
 270.246 +           height="39.500999"
 270.247 +           x="311.92496"
 270.248 +           y="395.08627" />
 270.249 +        <text
 270.250 +           xml:space="preserve"
 270.251 +           style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 270.252 +           x="313.72824"
 270.253 +           y="416.7626"
 270.254 +           id="text2918"><tspan
 270.255 +             sodipodi:role="line"
 270.256 +             id="tspan2920"
 270.257 +             x="313.72824"
 270.258 +             y="416.7626"
 270.259 +             style="font-family:Courier">.hg/store/data/_l_e_g_g_i_m_i.i</tspan></text>
 270.260 +      </g>
 270.261 +      <g
 270.262 +         transform="translate(3.79093e-5,-80.1853)"
 270.263 +         id="g2945">
 270.264 +        <g
 270.265 +           id="g2955">
 270.266 +          <rect
 270.267 +             y="475.4968"
 270.268 +             x="15.550935"
 270.269 +             height="39.500999"
 270.270 +             width="227.17694"
 270.271 +             id="rect2947"
 270.272 +             style="fill:url(#linearGradient3262);fill-opacity:1;stroke:#000000;stroke-width:1.10706258;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
 270.273 +          <text
 270.274 +             id="text2949"
 270.275 +             y="498.35123"
 270.276 +             x="31.230644"
 270.277 +             style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 270.278 +             xml:space="preserve"><tspan
 270.279 +               style="font-family:Courier"
 270.280 +               y="498.35123"
 270.281 +               x="31.230644"
 270.282 +               id="tspan2951"
 270.283 +               sodipodi:role="line">LEGGIMI</tspan></text>
 270.284 +        </g>
 270.285 +      </g>
 270.286 +      <path
 270.287 +         inkscape:connector-type="polyline"
 270.288 +         id="path2960"
 270.289 +         d="M 242.94685,414.91115 C 242.94685,414.91115 293.61127,415.26754 310.16269,415.38633"
 270.290 +         style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.02046943px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1"
 270.291 +         sodipodi:nodetypes="cz" />
 270.292 +    </g>
 270.293 +    <g
 270.294 +       id="g3156"
 270.295 +       transform="translate(80.467048,0.71578)">
 270.296 +      <g
 270.297 +         transform="translate(116,0)"
 270.298 +         id="g2831">
 270.299 +        <rect
 270.300 +           style="fill:url(#linearGradient3256);fill-opacity:1;stroke:#000000;stroke-width:1.11001658;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 270.301 +           id="rect1906"
 270.302 +           width="228.18446"
 270.303 +           height="60.499123"
 270.304 +           x="195.52719"
 270.305 +           y="465.51859" />
 270.306 +        <g
 270.307 +           id="g2803"
 270.308 +           transform="translate(-0.893671,1.833581)">
 270.309 +          <text
 270.310 +             id="text1884"
 270.311 +             y="483.92801"
 270.312 +             x="210.95944"
 270.313 +             style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 270.314 +             xml:space="preserve"><tspan
 270.315 +               style="font-family:Courier"
 270.316 +               y="483.92801"
 270.317 +               x="210.95944"
 270.318 +               id="tspan1886"
 270.319 +               sodipodi:role="line">.hg/store/data/src/ciao.c.d</tspan></text>
 270.320 +          <text
 270.321 +             id="text1888"
 270.322 +             y="507.79309"
 270.323 +             x="210.95944"
 270.324 +             style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 270.325 +             xml:space="preserve"><tspan
 270.326 +               style="font-family:Courier"
 270.327 +               y="507.79309"
 270.328 +               x="210.95944"
 270.329 +               id="tspan1890"
 270.330 +               sodipodi:role="line">.hg/store/data/src/ciao.c.i</tspan></text>
 270.331 +        </g>
 270.332 +      </g>
 270.333 +      <g
 270.334 +         id="g2907">
 270.335 +        <rect
 270.336 +           style="fill:url(#linearGradient3258);fill-opacity:1;stroke:#000000;stroke-width:1.10706329;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 270.337 +           id="rect2843"
 270.338 +           width="227.17728"
 270.339 +           height="39.500999"
 270.340 +           x="15.550805"
 270.341 +           y="475.4968" />
 270.342 +        <text
 270.343 +           xml:space="preserve"
 270.344 +           style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 270.345 +           x="31.230644"
 270.346 +           y="498.35123"
 270.347 +           id="text2847"><tspan
 270.348 +             sodipodi:role="line"
 270.349 +             id="tspan2849"
 270.350 +             x="31.230644"
 270.351 +             y="498.35123"
 270.352 +             style="font-family:Courier">src/ciao.c</tspan></text>
 270.353 +      </g>
 270.354 +      <path
 270.355 +         inkscape:connection-end="#g2831"
 270.356 +         inkscape:connection-start="#g2907"
 270.357 +         inkscape:connector-type="polyline"
 270.358 +         id="path2962"
 270.359 +         d="M 242.4315,495.88043 C 242.4315,495.88043 292.8861,495.99942 310.04102,496.03909"
 270.360 +         style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1"
 270.361 +         sodipodi:nodetypes="cs" />
 270.362 +    </g>
 270.363 +    <text
 270.364 +       xml:space="preserve"
 270.365 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 270.366 +       x="98.496666"
 270.367 +       y="373.96353"
 270.368 +       id="text3216"><tspan
 270.369 +         sodipodi:role="line"
 270.370 +         id="tspan3218"
 270.371 +         x="98.496666"
 270.372 +         y="373.96353">Directory di lavoro</tspan></text>
 270.373 +    <text
 270.374 +       xml:space="preserve"
 270.375 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 270.376 +       x="391.39197"
 270.377 +       y="373.96353"
 270.378 +       id="text3228"><tspan
 270.379 +         sodipodi:role="line"
 270.380 +         id="tspan3230"
 270.381 +         x="391.39197"
 270.382 +         y="373.96353">Repository</tspan></text>
 270.383 +  </g>
 270.384 +</svg>
   271.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   271.2 +++ b/it/figs/metadata.svg	Fri Sep 04 16:33:35 2009 +0200
   271.3 @@ -0,0 +1,328 @@
   271.4 +<?xml version="1.0" encoding="UTF-8" standalone="no"?>
   271.5 +<!-- Created with Inkscape (http://www.inkscape.org/) -->
   271.6 +<svg
   271.7 +   xmlns:dc="http://purl.org/dc/elements/1.1/"
   271.8 +   xmlns:cc="http://web.resource.org/cc/"
   271.9 +   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  271.10 +   xmlns:svg="http://www.w3.org/2000/svg"
  271.11 +   xmlns="http://www.w3.org/2000/svg"
  271.12 +   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
  271.13 +   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
  271.14 +   width="744.09448819"
  271.15 +   height="1052.3622047"
  271.16 +   id="svg2"
  271.17 +   sodipodi:version="0.32"
  271.18 +   inkscape:version="0.44.1"
  271.19 +   sodipodi:docname="metadata.svg"
  271.20 +   sodipodi:docbase="/home/bos/hg/hgbook/en">
  271.21 +  <defs
  271.22 +     id="defs4">
  271.23 +    <marker
  271.24 +       inkscape:stockid="Arrow1Mend"
  271.25 +       orient="auto"
  271.26 +       refY="0.0"
  271.27 +       refX="0.0"
  271.28 +       id="Arrow1Mend"
  271.29 +       style="overflow:visible;">
  271.30 +      <path
  271.31 +         id="path2944"
  271.32 +         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
  271.33 +         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
  271.34 +         transform="scale(0.4) rotate(180) translate(10,0)" />
  271.35 +    </marker>
  271.36 +  </defs>
  271.37 +  <sodipodi:namedview
  271.38 +     id="base"
  271.39 +     pagecolor="#ffffff"
  271.40 +     bordercolor="#666666"
  271.41 +     borderopacity="1.0"
  271.42 +     gridtolerance="10000"
  271.43 +     guidetolerance="10"
  271.44 +     objecttolerance="10"
  271.45 +     inkscape:pageopacity="0.0"
  271.46 +     inkscape:pageshadow="2"
  271.47 +     inkscape:zoom="1.4"
  271.48 +     inkscape:cx="232.14286"
  271.49 +     inkscape:cy="490.68696"
  271.50 +     inkscape:document-units="px"
  271.51 +     inkscape:current-layer="layer1"
  271.52 +     inkscape:window-width="906"
  271.53 +     inkscape:window-height="620"
  271.54 +     inkscape:window-x="181"
  271.55 +     inkscape:window-y="58" />
  271.56 +  <metadata
  271.57 +     id="metadata7">
  271.58 +    <rdf:RDF>
  271.59 +      <cc:Work
  271.60 +         rdf:about="">
  271.61 +        <dc:format>image/svg+xml</dc:format>
  271.62 +        <dc:type
  271.63 +           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
  271.64 +      </cc:Work>
  271.65 +    </rdf:RDF>
  271.66 +  </metadata>
  271.67 +  <g
  271.68 +     inkscape:label="Layer 1"
  271.69 +     inkscape:groupmode="layer"
  271.70 +     id="layer1">
  271.71 +    <path
  271.72 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#a7a7a7;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:4.5, 1.5;stroke-dashoffset:0;stroke-opacity:1;display:inline"
  271.73 +       d="M 326.94646,467.18359 L 326.94646,510.98123"
  271.74 +       id="path1910"
  271.75 +       inkscape:connector-type="polyline"
  271.76 +       inkscape:connection-end="#rect2962"
  271.77 +       inkscape:connection-start="#rect2764" />
  271.78 +    <path
  271.79 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#a7a7a7;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:4.5, 1.5;stroke-dashoffset:0;stroke-opacity:1;display:inline"
  271.80 +       d="M 326.94646,531.98123 L 326.94646,591.77887"
  271.81 +       id="path1912"
  271.82 +       inkscape:connector-type="polyline"
  271.83 +       inkscape:connection-start="#rect2962"
  271.84 +       inkscape:connection-end="#rect3000" />
  271.85 +    <path
  271.86 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#a7a7a7;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:4.5, 1.5;stroke-dashoffset:0;stroke-opacity:1;display:inline"
  271.87 +       d="M 316.1622,531.98123 L 192.30212,652.57648"
  271.88 +       id="path1916"
  271.89 +       inkscape:connector-type="polyline"
  271.90 +       inkscape:connection-end="#rect3038"
  271.91 +       inkscape:connection-start="#rect2962" />
  271.92 +    <path
  271.93 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#484848;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:4.5, 1.5;stroke-dashoffset:0;stroke-opacity:1"
  271.94 +       d="M 254.23217,467.18359 L 254.23216,510.98123"
  271.95 +       id="path3088"
  271.96 +       inkscape:connector-type="polyline"
  271.97 +       inkscape:connection-start="#rect1872"
  271.98 +       inkscape:connection-end="#rect2960" />
  271.99 +    <path
 271.100 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#484848;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:4.5, 1.5;stroke-dashoffset:0;stroke-opacity:1"
 271.101 +       d="M 254.23215,531.98123 L 254.23215,591.77887"
 271.102 +       id="path3090"
 271.103 +       inkscape:connector-type="polyline"
 271.104 +       inkscape:connection-start="#rect2960"
 271.105 +       inkscape:connection-end="#rect2998" />
 271.106 +    <path
 271.107 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#484848;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:4.5, 1.5;stroke-dashoffset:0;stroke-opacity:1"
 271.108 +       d="M 248.84002,531.98123 L 186.90999,652.57648"
 271.109 +       id="path3092"
 271.110 +       inkscape:connector-type="polyline"
 271.111 +       inkscape:connection-start="#rect2960"
 271.112 +       inkscape:connection-end="#rect3038" />
 271.113 +    <rect
 271.114 +       style="fill:#7b7df5;fill-opacity:1;stroke:#595959;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 271.115 +       id="rect1872"
 271.116 +       width="51.42857"
 271.117 +       height="20"
 271.118 +       x="228.51788"
 271.119 +       y="446.68359" />
 271.120 +    <rect
 271.121 +       style="fill:#cacbfb;fill-opacity:1;stroke:#595959;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 271.122 +       id="rect2764"
 271.123 +       width="51.42857"
 271.124 +       height="20"
 271.125 +       x="301.23218"
 271.126 +       y="446.68359" />
 271.127 +    <rect
 271.128 +       style="fill:#cacbfb;fill-opacity:1;stroke:#595959;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 271.129 +       id="rect2766"
 271.130 +       width="51.42857"
 271.131 +       height="20"
 271.132 +       x="155.80359"
 271.133 +       y="446.68359" />
 271.134 +    <rect
 271.135 +       style="fill:#cacbfb;fill-opacity:1;stroke:#595959;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 271.136 +       id="rect2768"
 271.137 +       width="51.42857"
 271.138 +       height="20"
 271.139 +       x="83.089294"
 271.140 +       y="446.68359" />
 271.141 +    <path
 271.142 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#747474;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1"
 271.143 +       d="M 135.01786,456.68359 L 155.30359,456.68359"
 271.144 +       id="path2770"
 271.145 +       inkscape:connector-type="polyline"
 271.146 +       inkscape:connection-start="#rect2768"
 271.147 +       inkscape:connection-end="#rect2766" />
 271.148 +    <path
 271.149 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#747474;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1"
 271.150 +       d="M 207.73216,456.68359 L 228.01788,456.68359"
 271.151 +       id="path2772"
 271.152 +       inkscape:connector-type="polyline"
 271.153 +       inkscape:connection-start="#rect2766"
 271.154 +       inkscape:connection-end="#rect1872" />
 271.155 +    <path
 271.156 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#747474;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1"
 271.157 +       d="M 280.44645,456.68359 L 300.73218,456.68359"
 271.158 +       id="path2774"
 271.159 +       inkscape:connector-type="polyline"
 271.160 +       inkscape:connection-start="#rect1872"
 271.161 +       inkscape:connection-end="#rect2764" />
 271.162 +    <path
 271.163 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#747474;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:3, 3;stroke-dashoffset:0;stroke-opacity:1"
 271.164 +       d="M 62.303571,456.68359 L 82.589294,456.68359"
 271.165 +       id="path2778"
 271.166 +       inkscape:connector-type="polyline"
 271.167 +       inkscape:connection-end="#rect2768" />
 271.168 +    <rect
 271.169 +       style="fill:#84f57b;fill-opacity:1;stroke:#595959;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 271.170 +       id="rect2960"
 271.171 +       width="51.42857"
 271.172 +       height="20"
 271.173 +       x="228.51787"
 271.174 +       y="511.48123" />
 271.175 +    <rect
 271.176 +       style="fill:#cefbca;fill-opacity:1;stroke:#595959;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 271.177 +       id="rect2962"
 271.178 +       width="51.42857"
 271.179 +       height="20"
 271.180 +       x="301.23218"
 271.181 +       y="511.48123" />
 271.182 +    <rect
 271.183 +       style="fill:#cefbca;fill-opacity:1;stroke:#595959;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 271.184 +       id="rect2964"
 271.185 +       width="51.42857"
 271.186 +       height="20"
 271.187 +       x="155.80357"
 271.188 +       y="511.48123" />
 271.189 +    <rect
 271.190 +       style="fill:#cefbca;fill-opacity:1;stroke:#595959;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 271.191 +       id="rect2966"
 271.192 +       width="51.42857"
 271.193 +       height="20"
 271.194 +       x="83.089287"
 271.195 +       y="511.48123" />
 271.196 +    <path
 271.197 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#747474;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1"
 271.198 +       d="M 135.01786,521.48121 L 155.30359,521.48121"
 271.199 +       id="path2968"
 271.200 +       inkscape:connector-type="polyline" />
 271.201 +    <path
 271.202 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#747474;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1"
 271.203 +       d="M 207.73216,521.48121 L 228.01788,521.48121"
 271.204 +       id="path2970"
 271.205 +       inkscape:connector-type="polyline" />
 271.206 +    <path
 271.207 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#747474;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1"
 271.208 +       d="M 280.44645,521.48121 L 300.73218,521.48121"
 271.209 +       id="path2972"
 271.210 +       inkscape:connector-type="polyline" />
 271.211 +    <path
 271.212 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#747474;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:3, 3;stroke-dashoffset:0;stroke-opacity:1"
 271.213 +       d="M 62.30358,521.48121 L 82.5893,521.48121"
 271.214 +       id="path2974"
 271.215 +       inkscape:connector-type="polyline" />
 271.216 +    <rect
 271.217 +       style="fill:#f57b8f;fill-opacity:1;stroke:#595959;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 271.218 +       id="rect2998"
 271.219 +       width="51.42857"
 271.220 +       height="20"
 271.221 +       x="228.51787"
 271.222 +       y="592.27887" />
 271.223 +    <rect
 271.224 +       style="fill:#fbcad2;fill-opacity:1;stroke:#595959;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 271.225 +       id="rect3000"
 271.226 +       width="51.42857"
 271.227 +       height="20"
 271.228 +       x="301.23218"
 271.229 +       y="592.27887" />
 271.230 +    <rect
 271.231 +       style="fill:#fbcad2;fill-opacity:1;stroke:#595959;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 271.232 +       id="rect3002"
 271.233 +       width="51.42857"
 271.234 +       height="20"
 271.235 +       x="155.80357"
 271.236 +       y="592.27887" />
 271.237 +    <rect
 271.238 +       style="fill:#fbcad2;fill-opacity:1;stroke:#595959;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 271.239 +       id="rect3004"
 271.240 +       width="51.42857"
 271.241 +       height="20"
 271.242 +       x="83.089287"
 271.243 +       y="592.27887" />
 271.244 +    <path
 271.245 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#747474;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1"
 271.246 +       d="M 135.01786,602.27884 L 155.30359,602.27884"
 271.247 +       id="path3006"
 271.248 +       inkscape:connector-type="polyline" />
 271.249 +    <path
 271.250 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#747474;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1"
 271.251 +       d="M 207.73216,602.27884 L 228.01788,602.27884"
 271.252 +       id="path3008"
 271.253 +       inkscape:connector-type="polyline" />
 271.254 +    <path
 271.255 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#747474;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1"
 271.256 +       d="M 280.44645,602.27884 L 300.73218,602.27884"
 271.257 +       id="path3010"
 271.258 +       inkscape:connector-type="polyline" />
 271.259 +    <path
 271.260 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#747474;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:3, 3;stroke-dashoffset:0;stroke-opacity:1"
 271.261 +       d="M 62.30358,602.27884 L 82.5893,602.27884"
 271.262 +       id="path3012"
 271.263 +       inkscape:connector-type="polyline" />
 271.264 +    <rect
 271.265 +       style="fill:#ffced6;fill-opacity:1;stroke:#595959;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 271.266 +       id="rect3034"
 271.267 +       width="51.42857"
 271.268 +       height="20"
 271.269 +       x="228.51787"
 271.270 +       y="653.07648" />
 271.271 +    <rect
 271.272 +       style="fill:#f57b8f;fill-opacity:1;stroke:#595959;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 271.273 +       id="rect3038"
 271.274 +       width="51.42857"
 271.275 +       height="20"
 271.276 +       x="155.80357"
 271.277 +       y="653.07648" />
 271.278 +    <rect
 271.279 +       style="fill:#fbcad2;fill-opacity:1;stroke:#595959;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 271.280 +       id="rect3040"
 271.281 +       width="51.42857"
 271.282 +       height="20"
 271.283 +       x="83.089287"
 271.284 +       y="653.07648" />
 271.285 +    <path
 271.286 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#747474;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1"
 271.287 +       d="M 135.01786,663.07646 L 155.30359,663.07646"
 271.288 +       id="path3042"
 271.289 +       inkscape:connector-type="polyline" />
 271.290 +    <path
 271.291 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#747474;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1"
 271.292 +       d="M 207.73216,663.07646 L 228.01788,663.07646"
 271.293 +       id="path3044"
 271.294 +       inkscape:connector-type="polyline" />
 271.295 +    <path
 271.296 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#747474;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:3, 3;stroke-dashoffset:0;stroke-opacity:1"
 271.297 +       d="M 62.30358,663.07646 L 82.5893,663.07646"
 271.298 +       id="path3048"
 271.299 +       inkscape:connector-type="polyline" />
 271.300 +    <text
 271.301 +       xml:space="preserve"
 271.302 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 271.303 +       x="82.072548"
 271.304 +       y="432.64789"
 271.305 +       id="text3094"><tspan
 271.306 +         sodipodi:role="line"
 271.307 +         id="tspan3096"
 271.308 +         x="82.072548"
 271.309 +         y="432.64789">Registro dei cambiamenti (changelog)</tspan></text>
 271.310 +    <text
 271.311 +       xml:space="preserve"
 271.312 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 271.313 +       x="82.306923"
 271.314 +       y="498.97327"
 271.315 +       id="text3098"><tspan
 271.316 +         sodipodi:role="line"
 271.317 +         id="tspan3100"
 271.318 +         x="82.306923"
 271.319 +         y="498.97327">Manifesto (manifest)</tspan></text>
 271.320 +    <text
 271.321 +       xml:space="preserve"
 271.322 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 271.323 +       x="82.14286"
 271.324 +       y="580.08569"
 271.325 +       id="text3102"><tspan
 271.326 +         sodipodi:role="line"
 271.327 +         id="tspan3104"
 271.328 +         x="82.14286"
 271.329 +         y="580.08569">Registri dei file (filelog)</tspan></text>
 271.330 +  </g>
 271.331 +</svg>
   272.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   272.2 +++ b/it/figs/mq-stack.svg	Fri Sep 04 16:33:35 2009 +0200
   272.3 @@ -0,0 +1,270 @@
   272.4 +<?xml version="1.0" encoding="UTF-8" standalone="no"?>
   272.5 +<!-- Created with Inkscape (http://www.inkscape.org/) -->
   272.6 +<svg
   272.7 +   xmlns:dc="http://purl.org/dc/elements/1.1/"
   272.8 +   xmlns:cc="http://web.resource.org/cc/"
   272.9 +   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  272.10 +   xmlns:svg="http://www.w3.org/2000/svg"
  272.11 +   xmlns="http://www.w3.org/2000/svg"
  272.12 +   xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd"
  272.13 +   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
  272.14 +   width="744.09448819"
  272.15 +   height="1052.3622047"
  272.16 +   id="svg2"
  272.17 +   sodipodi:version="0.32"
  272.18 +   inkscape:version="0.43"
  272.19 +   sodipodi:docname="mq-stack.svg"
  272.20 +   sodipodi:docbase="/home/bos/hg/hgbook/en">
  272.21 +  <defs
  272.22 +     id="defs4" />
  272.23 +  <sodipodi:namedview
  272.24 +     id="base"
  272.25 +     pagecolor="#ffffff"
  272.26 +     bordercolor="#666666"
  272.27 +     borderopacity="1.0"
  272.28 +     inkscape:pageopacity="0.0"
  272.29 +     inkscape:pageshadow="2"
  272.30 +     inkscape:zoom="1.4142136"
  272.31 +     inkscape:cx="299.33323"
  272.32 +     inkscape:cy="815.646"
  272.33 +     inkscape:document-units="px"
  272.34 +     inkscape:current-layer="layer1"
  272.35 +     inkscape:window-width="1014"
  272.36 +     inkscape:window-height="689"
  272.37 +     inkscape:window-x="0"
  272.38 +     inkscape:window-y="25" />
  272.39 +  <metadata
  272.40 +     id="metadata7">
  272.41 +    <rdf:RDF>
  272.42 +      <cc:Work
  272.43 +         rdf:about="">
  272.44 +        <dc:format>image/svg+xml</dc:format>
  272.45 +        <dc:type
  272.46 +           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
  272.47 +      </cc:Work>
  272.48 +    </rdf:RDF>
  272.49 +  </metadata>
  272.50 +  <g
  272.51 +     inkscape:label="Layer 1"
  272.52 +     inkscape:groupmode="layer"
  272.53 +     id="layer1">
  272.54 +    <rect
  272.55 +       style="fill:#0000ff;fill-opacity:0.75;fill-rule:evenodd;stroke:#3c3c3c;stroke-width:1.05063355px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
  272.56 +       id="rect1307"
  272.57 +       width="225.93683"
  272.58 +       height="24.243662"
  272.59 +       x="230.01944"
  272.60 +       y="221.70146" />
  272.61 +    <text
  272.62 +       xml:space="preserve"
  272.63 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
  272.64 +       x="237.89606"
  272.65 +       y="237.13383"
  272.66 +       id="text1309"><tspan
  272.67 +         sodipodi:role="line"
  272.68 +         id="tspan1311"
  272.69 +         x="237.89606"
  272.70 +         y="237.13383">evita-riordino-compilatore.patch</tspan></text>
  272.71 +    <rect
  272.72 +       style="fill:#7979ff;fill-opacity:0.875;fill-rule:evenodd;stroke:#3c3c3c;stroke-width:1.05063355px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
  272.73 +       id="rect1320"
  272.74 +       width="225.93683"
  272.75 +       height="24.243662"
  272.76 +       x="230.01936"
  272.77 +       y="251.34325" />
  272.78 +    <text
  272.79 +       xml:space="preserve"
  272.80 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
  272.81 +       x="237.89598"
  272.82 +       y="266.77563"
  272.83 +       id="text1322"><tspan
  272.84 +         sodipodi:role="line"
  272.85 +         id="tspan1324"
  272.86 +         x="237.89598"
  272.87 +         y="266.77563">ripulisce-spazi-di-nomi.patch</tspan></text>
  272.88 +    <rect
  272.89 +       style="fill:#7979ff;fill-opacity:0.875;fill-rule:evenodd;stroke:#3c3c3c;stroke-width:1.05063355px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
  272.90 +       id="rect2217"
  272.91 +       width="225.93683"
  272.92 +       height="24.243662"
  272.93 +       x="230.01936"
  272.94 +       y="280.98505" />
  272.95 +    <text
  272.96 +       xml:space="preserve"
  272.97 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
  272.98 +       x="237.89598"
  272.99 +       y="296.41742"
 272.100 +       id="text2219"><tspan
 272.101 +         sodipodi:role="line"
 272.102 +         id="tspan2221"
 272.103 +         x="237.89598"
 272.104 +         y="296.41742">correzioni-per-powerpc.patch</tspan></text>
 272.105 +    <rect
 272.106 +       style="fill:#7979ff;fill-opacity:0.875;fill-rule:evenodd;stroke:#3c3c3c;stroke-width:1.05063355px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
 272.107 +       id="rect3114"
 272.108 +       width="225.93683"
 272.109 +       height="24.243662"
 272.110 +       x="230.01936"
 272.111 +       y="310.6268" />
 272.112 +    <text
 272.113 +       xml:space="preserve"
 272.114 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
 272.115 +       x="237.89598"
 272.116 +       y="326.05917"
 272.117 +       id="text3116"><tspan
 272.118 +         sodipodi:role="line"
 272.119 +         id="tspan3118"
 272.120 +         x="237.89598"
 272.121 +         y="326.05917">riporta-informazioni-corrette.patch</tspan></text>
 272.122 +    <text
 272.123 +       xml:space="preserve"
 272.124 +       style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
 272.125 +       x="200.01021"
 272.126 +       y="191.68094"
 272.127 +       id="text3170"
 272.128 +       sodipodi:linespacing="125%"><tspan
 272.129 +         sodipodi:role="line"
 272.130 +         id="tspan3172"
 272.131 +         x="200.01021"
 272.132 +         y="191.68094"
 272.133 +         style="font-size:48px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Bitstream Vera Sans">{</tspan></text>
 272.134 +    <text
 272.135 +       xml:space="preserve"
 272.136 +       style="font-size:15.25329685px;font-style:normal;font-weight:normal;line-height:125%;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
 272.137 +       x="255.26627"
 272.138 +       y="248.79449"
 272.139 +       id="text3190"
 272.140 +       sodipodi:linespacing="125%"
 272.141 +       transform="scale(0.786716,1.271107)"><tspan
 272.142 +         sodipodi:role="line"
 272.143 +         id="tspan3192"
 272.144 +         x="255.26627"
 272.145 +         y="248.79449"
 272.146 +         style="font-size:61.01318741px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Bitstream Vera Sans">{</tspan></text>
 272.147 +    <text
 272.148 +       xml:space="preserve"
 272.149 +       style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
 272.150 +       x="195.86807"
 272.151 +       y="173.17117"
 272.152 +       id="text4085"
 272.153 +       sodipodi:linespacing="125%"><tspan
 272.154 +         sodipodi:role="line"
 272.155 +         id="tspan4087"
 272.156 +         x="195.86807"
 272.157 +         y="173.17117"
 272.158 +         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:end;line-height:125%;writing-mode:lr-tb;text-anchor:end;font-family:Bitstream Vera Sans">presenti nella serie,</tspan><tspan
 272.159 +         sodipodi:role="line"
 272.160 +         x="195.86807"
 272.161 +         y="188.17117"
 272.162 +         id="tspan4089"
 272.163 +         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:end;line-height:125%;writing-mode:lr-tb;text-anchor:end;font-family:Bitstream Vera Sans">ma non applicate</tspan></text>
 272.164 +    <text
 272.165 +       xml:space="preserve"
 272.166 +       style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
 272.167 +       x="195.0712"
 272.168 +       y="288.91745"
 272.169 +       id="text4091"
 272.170 +       sodipodi:linespacing="125%"><tspan
 272.171 +         sodipodi:role="line"
 272.172 +         id="tspan4093"
 272.173 +         x="195.0712"
 272.174 +         y="288.91745"
 272.175 +         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:end;line-height:125%;writing-mode:lr-tb;text-anchor:end;font-family:Bitstream Vera Sans">patch applicate,</tspan><tspan
 272.176 +         sodipodi:role="line"
 272.177 +         x="195.0712"
 272.178 +         y="303.91745"
 272.179 +         id="tspan4111"
 272.180 +         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:end;line-height:125%;writing-mode:lr-tb;text-anchor:end;font-family:Bitstream Vera Sans">changeset presenti</tspan></text>
 272.181 +    <text
 272.182 +       xml:space="preserve"
 272.183 +       style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
 272.184 +       x="195.0712"
 272.185 +       y="229.28813"
 272.186 +       id="text4095"
 272.187 +       sodipodi:linespacing="125%"><tspan
 272.188 +         sodipodi:role="line"
 272.189 +         id="tspan4097"
 272.190 +         x="195.0712"
 272.191 +         y="229.28813"
 272.192 +         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:end;line-height:125%;writing-mode:lr-tb;text-anchor:end;font-family:Bitstream Vera Sans">patch applicata</tspan><tspan
 272.193 +         sodipodi:role="line"
 272.194 +         x="195.0712"
 272.195 +         y="244.28813"
 272.196 +         id="tspan4109"
 272.197 +         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:end;line-height:125%;writing-mode:lr-tb;text-anchor:end;font-family:Bitstream Vera Sans">più recentemente</tspan></text>
 272.198 +    <text
 272.199 +       xml:space="preserve"
 272.200 +       style="font-size:12px;font-style:normal;font-weight:normal;opacity:1;fill:#666666;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
 272.201 +       x="473.4975"
 272.202 +       y="238.29692"
 272.203 +       id="text4137"><tspan
 272.204 +         sodipodi:role="line"
 272.205 +         id="tspan4139"
 272.206 +         x="473.4975"
 272.207 +         y="238.29692">201ad3209902</tspan></text>
 272.208 +    <text
 272.209 +       xml:space="preserve"
 272.210 +       style="font-size:12px;font-style:normal;font-weight:normal;opacity:1;fill:#989898;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
 272.211 +       x="473.05804"
 272.212 +       y="267.93872"
 272.213 +       id="text4141"><tspan
 272.214 +         sodipodi:role="line"
 272.215 +         id="tspan4143"
 272.216 +         x="473.05804"
 272.217 +         y="267.93872">126b84e593ae</tspan></text>
 272.218 +    <text
 272.219 +       xml:space="preserve"
 272.220 +       style="font-size:12px;font-style:normal;font-weight:normal;opacity:1;fill:#989898;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
 272.221 +       x="473.6557"
 272.222 +       y="297.58051"
 272.223 +       id="text4145"><tspan
 272.224 +         sodipodi:role="line"
 272.225 +         id="tspan4147"
 272.226 +         x="473.6557"
 272.227 +         y="297.58051">a655daf15409</tspan></text>
 272.228 +    <text
 272.229 +       xml:space="preserve"
 272.230 +       style="font-size:12px;font-style:normal;font-weight:normal;opacity:1;fill:#989898;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
 272.231 +       x="473.71429"
 272.232 +       y="327.22226"
 272.233 +       id="text4149"><tspan
 272.234 +         sodipodi:role="line"
 272.235 +         id="tspan4151"
 272.236 +         x="473.71429"
 272.237 +         y="327.22226">e50d59aaea3a</tspan></text>
 272.238 +    <rect
 272.239 +       style="fill:#d7d7ff;fill-opacity:0.875;fill-rule:evenodd;stroke:#a6a6a6;stroke-width:1.05063355px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
 272.240 +       id="rect3106"
 272.241 +       width="225.93683"
 272.242 +       height="24.243662"
 272.243 +       x="230.01936"
 272.244 +       y="150.41792" />
 272.245 +    <text
 272.246 +       xml:space="preserve"
 272.247 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:#808080;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
 272.248 +       x="237.89598"
 272.249 +       y="165.8503"
 272.250 +       id="text3108"><tspan
 272.251 +         sodipodi:role="line"
 272.252 +         id="tspan3110"
 272.253 +         x="237.89598"
 272.254 +         y="165.8503">proibisce-parametri-illegali.patch</tspan></text>
 272.255 +    <rect
 272.256 +       style="fill:#d7d7ff;fill-opacity:0.875;fill-rule:evenodd;stroke:#a6a6a6;stroke-width:1.05063355px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
 272.257 +       id="rect2241"
 272.258 +       width="225.93683"
 272.259 +       height="24.243662"
 272.260 +       x="230.16466"
 272.261 +       y="180.05968" />
 272.262 +    <text
 272.263 +       xml:space="preserve"
 272.264 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:#808080;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
 272.265 +       x="238.04128"
 272.266 +       y="195.49205"
 272.267 +       id="text2243"><tspan
 272.268 +         sodipodi:role="line"
 272.269 +         id="tspan2245"
 272.270 +         x="238.04128"
 272.271 +         y="195.49205">corregge-problemi-memoria.patch</tspan></text>
 272.272 +  </g>
 272.273 +</svg>
   273.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   273.2 +++ b/it/figs/revlog.svg	Fri Sep 04 16:33:35 2009 +0200
   273.3 @@ -0,0 +1,1155 @@
   273.4 +<?xml version="1.0" encoding="UTF-8" standalone="no"?>
   273.5 +<!-- Created with Inkscape (http://www.inkscape.org/) -->
   273.6 +<svg
   273.7 +   xmlns:dc="http://purl.org/dc/elements/1.1/"
   273.8 +   xmlns:cc="http://web.resource.org/cc/"
   273.9 +   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  273.10 +   xmlns:svg="http://www.w3.org/2000/svg"
  273.11 +   xmlns="http://www.w3.org/2000/svg"
  273.12 +   xmlns:xlink="http://www.w3.org/1999/xlink"
  273.13 +   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
  273.14 +   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
  273.15 +   width="744.09448819"
  273.16 +   height="1052.3622047"
  273.17 +   id="svg2"
  273.18 +   sodipodi:version="0.32"
  273.19 +   inkscape:version="0.44.1"
  273.20 +   sodipodi:docbase="/home/bos/hg/hgbook/en"
  273.21 +   sodipodi:docname="revlog.svg">
  273.22 +  <defs
  273.23 +     id="defs4">
  273.24 +    <marker
  273.25 +       inkscape:stockid="Arrow1Mend"
  273.26 +       orient="auto"
  273.27 +       refY="0.0"
  273.28 +       refX="0.0"
  273.29 +       id="Arrow1Mend"
  273.30 +       style="overflow:visible;">
  273.31 +      <path
  273.32 +         id="path4852"
  273.33 +         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
  273.34 +         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
  273.35 +         transform="scale(0.4) rotate(180) translate(10,0)" />
  273.36 +    </marker>
  273.37 +    <linearGradient
  273.38 +       id="linearGradient3092">
  273.39 +      <stop
  273.40 +         style="stop-color:#44436f;stop-opacity:1;"
  273.41 +         offset="0"
  273.42 +         id="stop3094" />
  273.43 +      <stop
  273.44 +         style="stop-color:#abade5;stop-opacity:1;"
  273.45 +         offset="1"
  273.46 +         id="stop3096" />
  273.47 +    </linearGradient>
  273.48 +    <linearGradient
  273.49 +       inkscape:collect="always"
  273.50 +       xlink:href="#linearGradient3092"
  273.51 +       id="linearGradient3118"
  273.52 +       gradientUnits="userSpaceOnUse"
  273.53 +       x1="176.16635"
  273.54 +       y1="405.21934"
  273.55 +       x2="417.11935"
  273.56 +       y2="405.21934" />
  273.57 +    <linearGradient
  273.58 +       inkscape:collect="always"
  273.59 +       xlink:href="#linearGradient3092"
  273.60 +       id="linearGradient3120"
  273.61 +       gradientUnits="userSpaceOnUse"
  273.62 +       x1="176.16635"
  273.63 +       y1="405.21934"
  273.64 +       x2="417.11935"
  273.65 +       y2="405.21934" />
  273.66 +    <linearGradient
  273.67 +       inkscape:collect="always"
  273.68 +       xlink:href="#linearGradient3092"
  273.69 +       id="linearGradient3129"
  273.70 +       gradientUnits="userSpaceOnUse"
  273.71 +       x1="176.16635"
  273.72 +       y1="405.21934"
  273.73 +       x2="417.11935"
  273.74 +       y2="405.21934"
  273.75 +       gradientTransform="translate(-0.928574,-1.428574)" />
  273.76 +    <linearGradient
  273.77 +       inkscape:collect="always"
  273.78 +       xlink:href="#linearGradient3092"
  273.79 +       id="linearGradient3133"
  273.80 +       gradientUnits="userSpaceOnUse"
  273.81 +       x1="176.16635"
  273.82 +       y1="405.21934"
  273.83 +       x2="417.11935"
  273.84 +       y2="405.21934"
  273.85 +       gradientTransform="translate(-0.928574,-1.428574)" />
  273.86 +    <linearGradient
  273.87 +       inkscape:collect="always"
  273.88 +       xlink:href="#linearGradient3092"
  273.89 +       id="linearGradient3708"
  273.90 +       gradientUnits="userSpaceOnUse"
  273.91 +       gradientTransform="matrix(0.423343,0,0,0.423343,138.874,-67.01732)"
  273.92 +       x1="175.23776"
  273.93 +       y1="509.98154"
  273.94 +       x2="416.29077"
  273.95 +       y2="297.49997" />
  273.96 +    <linearGradient
  273.97 +       inkscape:collect="always"
  273.98 +       xlink:href="#linearGradient3092"
  273.99 +       id="linearGradient5164"
 273.100 +       gradientUnits="userSpaceOnUse"
 273.101 +       gradientTransform="matrix(0.423343,0,0,0.423343,198.249,247.4358)"
 273.102 +       x1="175.23776"
 273.103 +       y1="509.98154"
 273.104 +       x2="416.29077"
 273.105 +       y2="297.49997" />
 273.106 +    <linearGradient
 273.107 +       inkscape:collect="always"
 273.108 +       xlink:href="#linearGradient3092"
 273.109 +       id="linearGradient5584"
 273.110 +       gradientUnits="userSpaceOnUse"
 273.111 +       gradientTransform="matrix(0.423343,0,0,0.423343,143.9081,371.2915)"
 273.112 +       x1="175.23776"
 273.113 +       y1="509.98154"
 273.114 +       x2="416.29077"
 273.115 +       y2="297.49997" />
 273.116 +    <linearGradient
 273.117 +       inkscape:collect="always"
 273.118 +       xlink:href="#linearGradient3092"
 273.119 +       id="linearGradient5784"
 273.120 +       gradientUnits="userSpaceOnUse"
 273.121 +       gradientTransform="matrix(0.423343,0,0,0.423343,76.37397,152.137)"
 273.122 +       x1="175.23776"
 273.123 +       y1="509.98154"
 273.124 +       x2="416.29077"
 273.125 +       y2="297.49997" />
 273.126 +    <linearGradient
 273.127 +       inkscape:collect="always"
 273.128 +       xlink:href="#linearGradient3092"
 273.129 +       id="linearGradient5786"
 273.130 +       gradientUnits="userSpaceOnUse"
 273.131 +       gradientTransform="matrix(0.423343,0,0,0.423343,198.249,152.137)"
 273.132 +       x1="175.23776"
 273.133 +       y1="509.98154"
 273.134 +       x2="416.29077"
 273.135 +       y2="297.49997" />
 273.136 +    <linearGradient
 273.137 +       inkscape:collect="always"
 273.138 +       xlink:href="#linearGradient3092"
 273.139 +       id="linearGradient5895"
 273.140 +       gradientUnits="userSpaceOnUse"
 273.141 +       gradientTransform="matrix(0.423343,0,0,0.423343,198.0215,261.7142)"
 273.142 +       x1="175.23776"
 273.143 +       y1="509.98154"
 273.144 +       x2="416.29077"
 273.145 +       y2="297.49997" />
 273.146 +    <linearGradient
 273.147 +       inkscape:collect="always"
 273.148 +       xlink:href="#linearGradient3092"
 273.149 +       id="linearGradient5958"
 273.150 +       gradientUnits="userSpaceOnUse"
 273.151 +       gradientTransform="matrix(0.423343,0,0,0.423343,137.1978,42.55987)"
 273.152 +       x1="175.23776"
 273.153 +       y1="509.98154"
 273.154 +       x2="416.29077"
 273.155 +       y2="297.49997" />
 273.156 +  </defs>
 273.157 +  <sodipodi:namedview
 273.158 +     id="base"
 273.159 +     pagecolor="#ffffff"
 273.160 +     bordercolor="#666666"
 273.161 +     borderopacity="1.0"
 273.162 +     gridtolerance="10000"
 273.163 +     guidetolerance="10"
 273.164 +     objecttolerance="10"
 273.165 +     inkscape:pageopacity="0.0"
 273.166 +     inkscape:pageshadow="2"
 273.167 +     inkscape:zoom="0.64"
 273.168 +     inkscape:cx="566.02368"
 273.169 +     inkscape:cy="688.16826"
 273.170 +     inkscape:document-units="px"
 273.171 +     inkscape:current-layer="layer1"
 273.172 +     inkscape:window-width="906"
 273.173 +     inkscape:window-height="620"
 273.174 +     inkscape:window-x="29"
 273.175 +     inkscape:window-y="79"
 273.176 +     inkscape:connector-spacing="11" />
 273.177 +  <metadata
 273.178 +     id="metadata7">
 273.179 +    <rdf:RDF>
 273.180 +      <cc:Work
 273.181 +         rdf:about="">
 273.182 +        <dc:format>image/svg+xml</dc:format>
 273.183 +        <dc:type
 273.184 +           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
 273.185 +      </cc:Work>
 273.186 +    </rdf:RDF>
 273.187 +  </metadata>
 273.188 +  <g
 273.189 +     inkscape:label="Layer 1"
 273.190 +     inkscape:groupmode="layer"
 273.191 +     id="layer1">
 273.192 +    <rect
 273.193 +       y="168.74846"
 273.194 +       x="211.58516"
 273.195 +       height="89.506805"
 273.196 +       width="101.60232"
 273.197 +       id="rect3068"
 273.198 +       style="fill:url(#linearGradient5958);fill-opacity:1;stroke:black;stroke-width:0.48811448;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
 273.199 +    <g
 273.200 +       id="g3215"
 273.201 +       transform="matrix(0.423343,0,0,0.423343,137.1977,42.55985)">
 273.202 +      <rect
 273.203 +         y="447.71451"
 273.204 +         x="299.67859"
 273.205 +         height="48.571426"
 273.206 +         width="103.14286"
 273.207 +         id="rect2899"
 273.208 +         style="fill:#bbb4ff;fill-opacity:1;stroke:none;stroke-width:0.95291203;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
 273.209 +      <text
 273.210 +         id="text2903"
 273.211 +         y="464.8139"
 273.212 +         x="308.89639"
 273.213 +         style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 273.214 +         xml:space="preserve"><tspan
 273.215 +           y="464.8139"
 273.216 +           x="308.89639"
 273.217 +           sodipodi:role="line"
 273.218 +           id="tspan2905">Secondo genitore</tspan></text>
 273.219 +      <text
 273.220 +         id="text2907"
 273.221 +         y="485.50256"
 273.222 +         x="308.20175"
 273.223 +         style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 273.224 +         xml:space="preserve"><tspan
 273.225 +           style="font-family:Courier"
 273.226 +           y="485.50256"
 273.227 +           x="308.20175"
 273.228 +           id="tspan2909"
 273.229 +           sodipodi:role="line">32bf9a5f22c0</tspan></text>
 273.230 +    </g>
 273.231 +    <g
 273.232 +       id="g3250"
 273.233 +       transform="matrix(0.423343,0,0,0.423343,137.1977,42.55986)">
 273.234 +      <rect
 273.235 +         y="311.28598"
 273.236 +         x="188.6071"
 273.237 +         height="48.571426"
 273.238 +         width="103.14286"
 273.239 +         id="rect2936"
 273.240 +         style="fill:#bbb4ff;fill-opacity:1;stroke:none;stroke-width:0.95291203;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
 273.241 +      <text
 273.242 +         id="text2940"
 273.243 +         y="328.38538"
 273.244 +         x="197.82495"
 273.245 +         style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 273.246 +         xml:space="preserve"><tspan
 273.247 +           y="328.38538"
 273.248 +           x="197.82495"
 273.249 +           sodipodi:role="line"
 273.250 +           id="tspan2942">Hash di revisione</tspan></text>
 273.251 +      <text
 273.252 +         id="text2944"
 273.253 +         y="349.07404"
 273.254 +         x="197.13031"
 273.255 +         style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 273.256 +         xml:space="preserve"><tspan
 273.257 +           style="font-family:Courier"
 273.258 +           y="349.07404"
 273.259 +           x="197.13031"
 273.260 +           id="tspan2946"
 273.261 +           sodipodi:role="line">34b8b7a15ea1</tspan></text>
 273.262 +    </g>
 273.263 +    <g
 273.264 +       id="g3243"
 273.265 +       transform="matrix(0.423343,0,0,0.423343,137.6664,43.91853)">
 273.266 +      <rect
 273.267 +         y="363.07654"
 273.268 +         x="187.5"
 273.269 +         height="75"
 273.270 +         width="213.85715"
 273.271 +         id="rect2950"
 273.272 +         style="fill:#bbb4ff;fill-opacity:1;stroke:none;stroke-width:0.95291203;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
 273.273 +      <text
 273.274 +         id="text2958"
 273.275 +         y="400.86459"
 273.276 +         x="196.02321"
 273.277 +         style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 273.278 +         xml:space="preserve"><tspan
 273.279 +           style="fill:black;fill-opacity:1;font-family:Courier"
 273.280 +           y="400.86459"
 273.281 +           x="196.02321"
 273.282 +           id="tspan2960"
 273.283 +           sodipodi:role="line">...</tspan></text>
 273.284 +      <text
 273.285 +         id="text2954"
 273.286 +         y="380.17593"
 273.287 +         x="196.71785"
 273.288 +         style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 273.289 +         xml:space="preserve"><tspan
 273.290 +           y="380.17593"
 273.291 +           x="196.71785"
 273.292 +           sodipodi:role="line"
 273.293 +           id="tspan2956"
 273.294 +           style="fill:black;fill-opacity:1">Dati di revisione (delta o fotografia)</tspan></text>
 273.295 +    </g>
 273.296 +    <g
 273.297 +       id="g5529"
 273.298 +       transform="translate(-6.710312,-8.165836e-6)">
 273.299 +      <rect
 273.300 +         style="fill:url(#linearGradient5584);fill-opacity:1;stroke:black;stroke-width:0.48811448;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 273.301 +         id="rect3509"
 273.302 +         width="101.60232"
 273.303 +         height="89.506805"
 273.304 +         x="218.29547"
 273.305 +         y="497.4801" />
 273.306 +      <g
 273.307 +         transform="matrix(0.423343,0,0,0.423343,143.908,371.2915)"
 273.308 +         id="g3513">
 273.309 +        <g
 273.310 +           id="g3515">
 273.311 +          <rect
 273.312 +             y="447.72418"
 273.313 +             x="188.6071"
 273.314 +             height="48.571426"
 273.315 +             width="103.14286"
 273.316 +             id="rect3517"
 273.317 +             style="fill:#bbb4ff;fill-opacity:1;stroke:none;stroke-width:0.95291203;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
 273.318 +          <text
 273.319 +             id="text3519"
 273.320 +             y="464.82358"
 273.321 +             x="197.82495"
 273.322 +             style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 273.323 +             xml:space="preserve"><tspan
 273.324 +               y="464.82358"
 273.325 +               x="197.82495"
 273.326 +               sodipodi:role="line"
 273.327 +               id="tspan3521">Primo genitore</tspan></text>
 273.328 +          <text
 273.329 +             id="text3523"
 273.330 +             y="485.51224"
 273.331 +             x="197.13031"
 273.332 +             style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 273.333 +             xml:space="preserve"><tspan
 273.334 +               style="font-family:Courier"
 273.335 +               y="485.51224"
 273.336 +               x="197.13031"
 273.337 +               id="tspan3525"
 273.338 +               sodipodi:role="line">000000000000</tspan></text>
 273.339 +        </g>
 273.340 +        <g
 273.341 +           id="g3527">
 273.342 +          <rect
 273.343 +             y="447.71451"
 273.344 +             x="299.67859"
 273.345 +             height="48.571426"
 273.346 +             width="103.14286"
 273.347 +             id="rect3529"
 273.348 +             style="fill:#bbb4ff;fill-opacity:1;stroke:none;stroke-width:0.95291203;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
 273.349 +          <text
 273.350 +             id="text3531"
 273.351 +             y="464.8139"
 273.352 +             x="308.89639"
 273.353 +             style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 273.354 +             xml:space="preserve"><tspan
 273.355 +               y="464.8139"
 273.356 +               x="308.89639"
 273.357 +               sodipodi:role="line"
 273.358 +               id="tspan3533">Secondo genitore</tspan></text>
 273.359 +          <text
 273.360 +             id="text3535"
 273.361 +             y="485.50256"
 273.362 +             x="308.20175"
 273.363 +             style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 273.364 +             xml:space="preserve"><tspan
 273.365 +               style="font-family:Courier"
 273.366 +               y="485.50256"
 273.367 +               x="308.20175"
 273.368 +               id="tspan3537"
 273.369 +               sodipodi:role="line">000000000000</tspan></text>
 273.370 +        </g>
 273.371 +      </g>
 273.372 +      <g
 273.373 +         transform="matrix(0.423343,0,0,0.423343,143.908,371.2915)"
 273.374 +         id="g3539">
 273.375 +        <rect
 273.376 +           style="fill:#bbb4ff;fill-opacity:1;stroke:none;stroke-width:0.95291203;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 273.377 +           id="rect3541"
 273.378 +           width="103.14286"
 273.379 +           height="48.571426"
 273.380 +           x="188.6071"
 273.381 +           y="311.28598" />
 273.382 +        <text
 273.383 +           xml:space="preserve"
 273.384 +           style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 273.385 +           x="197.82495"
 273.386 +           y="328.38538"
 273.387 +           id="text3543"><tspan
 273.388 +             id="tspan3545"
 273.389 +             sodipodi:role="line"
 273.390 +             x="197.82495"
 273.391 +             y="328.38538">Hash di revisione</tspan></text>
 273.392 +        <text
 273.393 +           xml:space="preserve"
 273.394 +           style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 273.395 +           x="197.13031"
 273.396 +           y="349.07404"
 273.397 +           id="text3547"><tspan
 273.398 +             sodipodi:role="line"
 273.399 +             id="tspan3549"
 273.400 +             x="197.13031"
 273.401 +             y="349.07404"
 273.402 +             style="font-family:Courier">ff9dc8bc2a8b</tspan></text>
 273.403 +      </g>
 273.404 +      <g
 273.405 +         transform="matrix(0.423343,0,0,0.423343,144.3767,372.6502)"
 273.406 +         id="g3551">
 273.407 +        <rect
 273.408 +           style="fill:#bbb4ff;fill-opacity:1;stroke:none;stroke-width:0.95291203;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 273.409 +           id="rect3553"
 273.410 +           width="213.85715"
 273.411 +           height="75"
 273.412 +           x="187.5"
 273.413 +           y="363.07654" />
 273.414 +        <text
 273.415 +           xml:space="preserve"
 273.416 +           style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 273.417 +           x="196.02321"
 273.418 +           y="400.86459"
 273.419 +           id="text3555"><tspan
 273.420 +             sodipodi:role="line"
 273.421 +             id="tspan3557"
 273.422 +             x="196.02321"
 273.423 +             y="400.86459"
 273.424 +             style="fill:black;fill-opacity:1;font-family:Courier">...</tspan></text>
 273.425 +        <text
 273.426 +           xml:space="preserve"
 273.427 +           style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 273.428 +           x="196.71785"
 273.429 +           y="380.17593"
 273.430 +           id="text3559"><tspan
 273.431 +             style="fill:black;fill-opacity:1"
 273.432 +             id="tspan3561"
 273.433 +             sodipodi:role="line"
 273.434 +             x="196.71785"
 273.435 +             y="380.17593">Dati di revisione (delta o fotografia)</tspan></text>
 273.436 +      </g>
 273.437 +    </g>
 273.438 +    <g
 273.439 +       id="g4868"
 273.440 +       transform="translate(-1.676208,-2.342463e-5)">
 273.441 +      <rect
 273.442 +         style="fill:url(#linearGradient3708);fill-opacity:1;stroke:black;stroke-width:0.48811448;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 273.443 +         id="rect3567"
 273.444 +         width="101.60232"
 273.445 +         height="89.506805"
 273.446 +         x="213.26137"
 273.447 +         y="59.171272" />
 273.448 +      <g
 273.449 +         transform="matrix(0.423343,0,0,0.423343,138.8739,-67.01734)"
 273.450 +         id="g3573">
 273.451 +        <rect
 273.452 +           style="fill:#bbb4ff;fill-opacity:1;stroke:none;stroke-width:0.95291203;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 273.453 +           id="rect3575"
 273.454 +           width="103.14286"
 273.455 +           height="48.571426"
 273.456 +           x="188.6071"
 273.457 +           y="447.72418" />
 273.458 +        <text
 273.459 +           xml:space="preserve"
 273.460 +           style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 273.461 +           x="197.82495"
 273.462 +           y="464.82358"
 273.463 +           id="text3577"><tspan
 273.464 +             id="tspan3579"
 273.465 +             sodipodi:role="line"
 273.466 +             x="197.82495"
 273.467 +             y="464.82358">Primo genitore</tspan></text>
 273.468 +        <text
 273.469 +           xml:space="preserve"
 273.470 +           style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 273.471 +           x="197.13031"
 273.472 +           y="485.51224"
 273.473 +           id="text3581"><tspan
 273.474 +             sodipodi:role="line"
 273.475 +             id="tspan3583"
 273.476 +             x="197.13031"
 273.477 +             y="485.51224"
 273.478 +             style="font-family:Courier">34b8b7a15ea1</tspan></text>
 273.479 +      </g>
 273.480 +      <g
 273.481 +         transform="matrix(0.423343,0,0,0.423343,138.8739,-67.01734)"
 273.482 +         id="g3585">
 273.483 +        <rect
 273.484 +           style="fill:#bbb4ff;fill-opacity:1;stroke:none;stroke-width:0.95291203;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 273.485 +           id="rect3587"
 273.486 +           width="103.14286"
 273.487 +           height="48.571426"
 273.488 +           x="299.67859"
 273.489 +           y="447.71451" />
 273.490 +        <text
 273.491 +           xml:space="preserve"
 273.492 +           style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 273.493 +           x="308.89639"
 273.494 +           y="464.8139"
 273.495 +           id="text3589"><tspan
 273.496 +             id="tspan3591"
 273.497 +             sodipodi:role="line"
 273.498 +             x="308.89639"
 273.499 +             y="464.8139">Secondo genitore</tspan></text>
 273.500 +        <text
 273.501 +           xml:space="preserve"
 273.502 +           style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 273.503 +           x="308.20175"
 273.504 +           y="485.50256"
 273.505 +           id="text3593"><tspan
 273.506 +             sodipodi:role="line"
 273.507 +             id="tspan3595"
 273.508 +             x="308.20175"
 273.509 +             y="485.50256"
 273.510 +             style="font-family:Courier">000000000000</tspan></text>
 273.511 +      </g>
 273.512 +      <g
 273.513 +         transform="matrix(0.423343,0,0,0.423343,138.8739,-67.01733)"
 273.514 +         id="g3597">
 273.515 +        <rect
 273.516 +           style="fill:#bbb4ff;fill-opacity:1;stroke:none;stroke-width:0.95291203;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 273.517 +           id="rect3599"
 273.518 +           width="103.14286"
 273.519 +           height="48.571426"
 273.520 +           x="188.6071"
 273.521 +           y="311.28598" />
 273.522 +        <text
 273.523 +           xml:space="preserve"
 273.524 +           style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 273.525 +           x="197.82495"
 273.526 +           y="328.38538"
 273.527 +           id="text3601"><tspan
 273.528 +             id="tspan3603"
 273.529 +             sodipodi:role="line"
 273.530 +             x="197.82495"
 273.531 +             y="328.38538">Hash di revisione</tspan></text>
 273.532 +        <text
 273.533 +           xml:space="preserve"
 273.534 +           style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 273.535 +           x="197.13031"
 273.536 +           y="349.07404"
 273.537 +           id="text3605"><tspan
 273.538 +             sodipodi:role="line"
 273.539 +             id="tspan3607"
 273.540 +             x="197.13031"
 273.541 +             y="349.07404"
 273.542 +             style="font-family:Courier">1b67dc96f27a</tspan></text>
 273.543 +      </g>
 273.544 +      <g
 273.545 +         transform="matrix(0.423343,0,0,0.423343,139.3426,-65.65866)"
 273.546 +         id="g3609">
 273.547 +        <rect
 273.548 +           style="fill:#bbb4ff;fill-opacity:1;stroke:none;stroke-width:0.95291203;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 273.549 +           id="rect3611"
 273.550 +           width="213.85715"
 273.551 +           height="75"
 273.552 +           x="187.5"
 273.553 +           y="363.07654" />
 273.554 +        <text
 273.555 +           xml:space="preserve"
 273.556 +           style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 273.557 +           x="196.02321"
 273.558 +           y="400.86459"
 273.559 +           id="text3613"><tspan
 273.560 +             sodipodi:role="line"
 273.561 +             id="tspan3615"
 273.562 +             x="196.02321"
 273.563 +             y="400.86459"
 273.564 +             style="fill:black;fill-opacity:1;font-family:Courier">...</tspan></text>
 273.565 +        <text
 273.566 +           xml:space="preserve"
 273.567 +           style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 273.568 +           x="196.71785"
 273.569 +           y="380.17593"
 273.570 +           id="text3617"><tspan
 273.571 +             style="fill:black;fill-opacity:1"
 273.572 +             id="tspan3619"
 273.573 +             sodipodi:role="line"
 273.574 +             x="196.71785"
 273.575 +             y="380.17593">Dati di revisione (delta o fotografia)</tspan></text>
 273.576 +      </g>
 273.577 +    </g>
 273.578 +    <path
 273.579 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:none;marker-end:url(#Arrow1Mend)"
 273.580 +       d="M 240.78255,143.08593 L 241.42595,171.75349"
 273.581 +       id="path3801"
 273.582 +       inkscape:connector-type="polyline"
 273.583 +       inkscape:connection-start="#g3573"
 273.584 +       inkscape:connection-end="#g3250" />
 273.585 +    <g
 273.586 +       id="g5677">
 273.587 +      <rect
 273.588 +         style="fill:url(#linearGradient5784);fill-opacity:1;stroke:black;stroke-width:0.48811448;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 273.589 +         id="rect3393"
 273.590 +         width="101.60232"
 273.591 +         height="89.506805"
 273.592 +         x="150.76137"
 273.593 +         y="278.32565" />
 273.594 +      <g
 273.595 +         transform="matrix(0.423343,0,0,0.423343,76.37397,152.137)"
 273.596 +         id="g3399">
 273.597 +        <rect
 273.598 +           style="fill:#bbb4ff;fill-opacity:1;stroke:none;stroke-width:0.95291203;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 273.599 +           id="rect3401"
 273.600 +           width="103.14286"
 273.601 +           height="48.571426"
 273.602 +           x="188.6071"
 273.603 +           y="447.72418" />
 273.604 +        <text
 273.605 +           xml:space="preserve"
 273.606 +           style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 273.607 +           x="197.82495"
 273.608 +           y="464.82358"
 273.609 +           id="text3403"><tspan
 273.610 +             id="tspan3405"
 273.611 +             sodipodi:role="line"
 273.612 +             x="197.82495"
 273.613 +             y="464.82358">Primo genitore</tspan></text>
 273.614 +        <text
 273.615 +           xml:space="preserve"
 273.616 +           style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 273.617 +           x="197.13031"
 273.618 +           y="485.51224"
 273.619 +           id="text3407"><tspan
 273.620 +             sodipodi:role="line"
 273.621 +             id="tspan3409"
 273.622 +             x="197.13031"
 273.623 +             y="485.51224"
 273.624 +             style="font-family:Courier">ff9dc8bc2a8b</tspan></text>
 273.625 +      </g>
 273.626 +      <g
 273.627 +         transform="matrix(0.423343,0,0,0.423343,76.37397,152.137)"
 273.628 +         id="g3411">
 273.629 +        <rect
 273.630 +           style="fill:#bbb4ff;fill-opacity:1;stroke:none;stroke-width:0.95291203;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 273.631 +           id="rect3413"
 273.632 +           width="103.14286"
 273.633 +           height="48.571426"
 273.634 +           x="299.67859"
 273.635 +           y="447.71451" />
 273.636 +        <text
 273.637 +           xml:space="preserve"
 273.638 +           style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 273.639 +           x="308.89639"
 273.640 +           y="464.8139"
 273.641 +           id="text3415"><tspan
 273.642 +             id="tspan3417"
 273.643 +             sodipodi:role="line"
 273.644 +             x="308.89639"
 273.645 +             y="464.8139">Secondo genitore</tspan></text>
 273.646 +        <text
 273.647 +           xml:space="preserve"
 273.648 +           style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 273.649 +           x="308.20175"
 273.650 +           y="485.50256"
 273.651 +           id="text3419"><tspan
 273.652 +             sodipodi:role="line"
 273.653 +             id="tspan3421"
 273.654 +             x="308.20175"
 273.655 +             y="485.50256"
 273.656 +             style="font-family:Courier">000000000000</tspan></text>
 273.657 +      </g>
 273.658 +      <g
 273.659 +         transform="matrix(0.423343,0,0,0.423343,76.37397,152.137)"
 273.660 +         id="g3423">
 273.661 +        <rect
 273.662 +           style="fill:#bbb4ff;fill-opacity:1;stroke:none;stroke-width:0.95291203;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 273.663 +           id="rect3425"
 273.664 +           width="103.14286"
 273.665 +           height="48.571426"
 273.666 +           x="188.6071"
 273.667 +           y="311.28598" />
 273.668 +        <text
 273.669 +           xml:space="preserve"
 273.670 +           style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 273.671 +           x="197.82495"
 273.672 +           y="328.38538"
 273.673 +           id="text3427"><tspan
 273.674 +             id="tspan3429"
 273.675 +             sodipodi:role="line"
 273.676 +             x="197.82495"
 273.677 +             y="328.38538">Hash di revisione</tspan></text>
 273.678 +        <text
 273.679 +           xml:space="preserve"
 273.680 +           style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 273.681 +           x="197.13031"
 273.682 +           y="349.07404"
 273.683 +           id="text3431"><tspan
 273.684 +             sodipodi:role="line"
 273.685 +             id="tspan3433"
 273.686 +             x="197.13031"
 273.687 +             y="349.07404"
 273.688 +             style="font-family:Courier">5b80c922ebdd</tspan></text>
 273.689 +      </g>
 273.690 +      <g
 273.691 +         transform="matrix(0.423343,0,0,0.423343,76.84265,153.4957)"
 273.692 +         id="g3435">
 273.693 +        <rect
 273.694 +           style="fill:#bbb4ff;fill-opacity:1;stroke:none;stroke-width:0.95291203;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 273.695 +           id="rect3437"
 273.696 +           width="213.85715"
 273.697 +           height="75"
 273.698 +           x="187.5"
 273.699 +           y="363.07654" />
 273.700 +        <text
 273.701 +           xml:space="preserve"
 273.702 +           style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 273.703 +           x="196.02321"
 273.704 +           y="400.86459"
 273.705 +           id="text3439"><tspan
 273.706 +             sodipodi:role="line"
 273.707 +             id="tspan3441"
 273.708 +             x="196.02321"
 273.709 +             y="400.86459"
 273.710 +             style="fill:black;fill-opacity:1;font-family:Courier">...</tspan></text>
 273.711 +        <text
 273.712 +           xml:space="preserve"
 273.713 +           style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 273.714 +           x="196.71785"
 273.715 +           y="380.17593"
 273.716 +           id="text3443"><tspan
 273.717 +             style="fill:black;fill-opacity:1"
 273.718 +             id="tspan3445"
 273.719 +             sodipodi:role="line"
 273.720 +             x="196.71785"
 273.721 +             y="380.17593">Dati di revisione (delta o fotografia)</tspan></text>
 273.722 +      </g>
 273.723 +    </g>
 273.724 +    <g
 273.725 +       id="g5646"
 273.726 +       transform="translate(-0.227432,0)">
 273.727 +      <rect
 273.728 +         style="fill:url(#linearGradient5786);fill-opacity:1;stroke:black;stroke-width:0.48811448;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 273.729 +         id="rect3451"
 273.730 +         width="101.60232"
 273.731 +         height="89.506805"
 273.732 +         x="272.63638"
 273.733 +         y="278.32565" />
 273.734 +      <g
 273.735 +         transform="matrix(0.423343,0,0,0.423343,198.2489,152.137)"
 273.736 +         id="g3457">
 273.737 +        <rect
 273.738 +           style="fill:#bbb4ff;fill-opacity:1;stroke:none;stroke-width:0.95291203;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 273.739 +           id="rect3459"
 273.740 +           width="103.14286"
 273.741 +           height="48.571426"
 273.742 +           x="188.6071"
 273.743 +           y="447.72418" />
 273.744 +        <text
 273.745 +           xml:space="preserve"
 273.746 +           style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 273.747 +           x="197.82495"
 273.748 +           y="464.82358"
 273.749 +           id="text3461"><tspan
 273.750 +             id="tspan3463"
 273.751 +             sodipodi:role="line"
 273.752 +             x="197.82495"
 273.753 +             y="464.82358">Primo genitore</tspan></text>
 273.754 +        <text
 273.755 +           xml:space="preserve"
 273.756 +           style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 273.757 +           x="197.13031"
 273.758 +           y="485.51224"
 273.759 +           id="text3465"><tspan
 273.760 +             sodipodi:role="line"
 273.761 +             id="tspan3467"
 273.762 +             x="197.13031"
 273.763 +             y="485.51224"
 273.764 +             style="font-family:Courier">ecacb6b4c9fd</tspan></text>
 273.765 +      </g>
 273.766 +      <g
 273.767 +         transform="matrix(0.423343,0,0,0.423343,198.2489,152.137)"
 273.768 +         id="g3469">
 273.769 +        <rect
 273.770 +           style="fill:#bbb4ff;fill-opacity:1;stroke:none;stroke-width:0.95291203;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 273.771 +           id="rect3471"
 273.772 +           width="103.14286"
 273.773 +           height="48.571426"
 273.774 +           x="299.67859"
 273.775 +           y="447.71451" />
 273.776 +        <text
 273.777 +           xml:space="preserve"
 273.778 +           style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 273.779 +           x="308.89639"
 273.780 +           y="464.8139"
 273.781 +           id="text3473"><tspan
 273.782 +             id="tspan3475"
 273.783 +             sodipodi:role="line"
 273.784 +             x="308.89639"
 273.785 +             y="464.8139">Secondo genitore</tspan></text>
 273.786 +        <text
 273.787 +           xml:space="preserve"
 273.788 +           style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 273.789 +           x="308.20175"
 273.790 +           y="485.50256"
 273.791 +           id="text3477"><tspan
 273.792 +             sodipodi:role="line"
 273.793 +             id="tspan3479"
 273.794 +             x="308.20175"
 273.795 +             y="485.50256"
 273.796 +             style="font-family:Courier">000000000000</tspan></text>
 273.797 +      </g>
 273.798 +      <g
 273.799 +         transform="matrix(0.423343,0,0,0.423343,198.2489,152.137)"
 273.800 +         id="g3481">
 273.801 +        <rect
 273.802 +           style="fill:#bbb4ff;fill-opacity:1;stroke:none;stroke-width:0.95291203;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 273.803 +           id="rect3483"
 273.804 +           width="103.14286"
 273.805 +           height="48.571426"
 273.806 +           x="188.6071"
 273.807 +           y="311.28598" />
 273.808 +        <text
 273.809 +           xml:space="preserve"
 273.810 +           style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 273.811 +           x="197.82495"
 273.812 +           y="328.38538"
 273.813 +           id="text3485"><tspan
 273.814 +             id="tspan3487"
 273.815 +             sodipodi:role="line"
 273.816 +             x="197.82495"
 273.817 +             y="328.38538">Hash di revisione</tspan></text>
 273.818 +        <text
 273.819 +           xml:space="preserve"
 273.820 +           style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 273.821 +           x="197.13031"
 273.822 +           y="349.07404"
 273.823 +           id="text3489"><tspan
 273.824 +             sodipodi:role="line"
 273.825 +             id="tspan3491"
 273.826 +             x="197.13031"
 273.827 +             y="349.07404"
 273.828 +             style="font-family:Courier">32bf9a5f22c0</tspan></text>
 273.829 +      </g>
 273.830 +      <g
 273.831 +         transform="matrix(0.423343,0,0,0.423343,198.7176,153.4957)"
 273.832 +         id="g3493">
 273.833 +        <rect
 273.834 +           style="fill:#bbb4ff;fill-opacity:1;stroke:none;stroke-width:0.95291203;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 273.835 +           id="rect3495"
 273.836 +           width="213.85715"
 273.837 +           height="75"
 273.838 +           x="187.5"
 273.839 +           y="363.07654" />
 273.840 +        <text
 273.841 +           xml:space="preserve"
 273.842 +           style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 273.843 +           x="196.02321"
 273.844 +           y="400.86459"
 273.845 +           id="text3497"><tspan
 273.846 +             sodipodi:role="line"
 273.847 +             id="tspan3499"
 273.848 +             x="196.02321"
 273.849 +             y="400.86459"
 273.850 +             style="fill:black;fill-opacity:1;font-family:Courier">...</tspan></text>
 273.851 +        <text
 273.852 +           xml:space="preserve"
 273.853 +           style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 273.854 +           x="196.71785"
 273.855 +           y="380.17593"
 273.856 +           id="text3501"><tspan
 273.857 +             style="fill:black;fill-opacity:1"
 273.858 +             id="tspan3503"
 273.859 +             sodipodi:role="line"
 273.860 +             x="196.71785"
 273.861 +             y="380.17593">Dati di revisione (delta o fotografia)</tspan></text>
 273.862 +      </g>
 273.863 +    </g>
 273.864 +    <rect
 273.865 +       y="387.90286"
 273.866 +       x="272.40894"
 273.867 +       height="89.506805"
 273.868 +       width="101.60232"
 273.869 +       id="rect5081"
 273.870 +       style="fill:url(#linearGradient5895);fill-opacity:1;stroke:black;stroke-width:0.48811448;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
 273.871 +    <g
 273.872 +       id="g5087"
 273.873 +       transform="matrix(0.423343,0,0,0.423343,198.0214,261.7142)">
 273.874 +      <rect
 273.875 +         y="447.72418"
 273.876 +         x="188.6071"
 273.877 +         height="48.571426"
 273.878 +         width="103.14286"
 273.879 +         id="rect5089"
 273.880 +         style="fill:#bbb4ff;fill-opacity:1;stroke:none;stroke-width:0.95291203;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
 273.881 +      <text
 273.882 +         id="text5091"
 273.883 +         y="464.82358"
 273.884 +         x="197.82495"
 273.885 +         style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 273.886 +         xml:space="preserve"><tspan
 273.887 +           y="464.82358"
 273.888 +           x="197.82495"
 273.889 +           sodipodi:role="line"
 273.890 +           id="tspan5093">Primo genitore</tspan></text>
 273.891 +      <text
 273.892 +         id="text5095"
 273.893 +         y="485.51224"
 273.894 +         x="197.13031"
 273.895 +         style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 273.896 +         xml:space="preserve"><tspan
 273.897 +           style="font-family:Courier"
 273.898 +           y="485.51224"
 273.899 +           x="197.13031"
 273.900 +           id="tspan5097"
 273.901 +           sodipodi:role="line">ff9dc8bc2a8b</tspan></text>
 273.902 +    </g>
 273.903 +    <g
 273.904 +       id="g5099"
 273.905 +       transform="matrix(0.423343,0,0,0.423343,198.0214,261.7142)">
 273.906 +      <rect
 273.907 +         y="447.71451"
 273.908 +         x="299.67859"
 273.909 +         height="48.571426"
 273.910 +         width="103.14286"
 273.911 +         id="rect5101"
 273.912 +         style="fill:#bbb4ff;fill-opacity:1;stroke:none;stroke-width:0.95291203;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
 273.913 +      <text
 273.914 +         id="text5103"
 273.915 +         y="464.8139"
 273.916 +         x="308.89639"
 273.917 +         style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 273.918 +         xml:space="preserve"><tspan
 273.919 +           y="464.8139"
 273.920 +           x="308.89639"
 273.921 +           sodipodi:role="line"
 273.922 +           id="tspan5105">Secondo genitore</tspan></text>
 273.923 +      <text
 273.924 +         id="text5107"
 273.925 +         y="485.50256"
 273.926 +         x="308.20175"
 273.927 +         style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 273.928 +         xml:space="preserve"><tspan
 273.929 +           style="font-family:Courier"
 273.930 +           y="485.50256"
 273.931 +           x="308.20175"
 273.932 +           id="tspan5109"
 273.933 +           sodipodi:role="line">000000000000</tspan></text>
 273.934 +    </g>
 273.935 +    <g
 273.936 +       id="g5111"
 273.937 +       transform="matrix(0.423343,0,0,0.423343,198.0214,261.7142)">
 273.938 +      <rect
 273.939 +         y="311.28598"
 273.940 +         x="188.6071"
 273.941 +         height="48.571426"
 273.942 +         width="103.14286"
 273.943 +         id="rect5113"
 273.944 +         style="fill:#bbb4ff;fill-opacity:1;stroke:none;stroke-width:0.95291203;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
 273.945 +      <text
 273.946 +         id="text5115"
 273.947 +         y="328.38538"
 273.948 +         x="197.82495"
 273.949 +         style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 273.950 +         xml:space="preserve"><tspan
 273.951 +           y="328.38538"
 273.952 +           x="197.82495"
 273.953 +           sodipodi:role="line"
 273.954 +           id="tspan5117">Hash di revisione</tspan></text>
 273.955 +      <text
 273.956 +         id="text5119"
 273.957 +         y="349.07404"
 273.958 +         x="197.13031"
 273.959 +         style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 273.960 +         xml:space="preserve"><tspan
 273.961 +           style="font-family:Courier"
 273.962 +           y="349.07404"
 273.963 +           x="197.13031"
 273.964 +           id="tspan5121"
 273.965 +           sodipodi:role="line">ecacb6b4c9fd</tspan></text>
 273.966 +    </g>
 273.967 +    <g
 273.968 +       id="g5123"
 273.969 +       transform="matrix(0.423343,0,0,0.423343,198.4901,263.0729)">
 273.970 +      <rect
 273.971 +         y="363.07654"
 273.972 +         x="187.5"
 273.973 +         height="75"
 273.974 +         width="213.85715"
 273.975 +         id="rect5125"
 273.976 +         style="fill:#bbb4ff;fill-opacity:1;stroke:none;stroke-width:0.95291203;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
 273.977 +      <text
 273.978 +         id="text5127"
 273.979 +         y="400.86459"
 273.980 +         x="196.02321"
 273.981 +         style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 273.982 +         xml:space="preserve"><tspan
 273.983 +           style="fill:black;fill-opacity:1;font-family:Courier"
 273.984 +           y="400.86459"
 273.985 +           x="196.02321"
 273.986 +           id="tspan5129"
 273.987 +           sodipodi:role="line">...</tspan></text>
 273.988 +      <text
 273.989 +         id="text5131"
 273.990 +         y="380.17593"
 273.991 +         x="196.71785"
 273.992 +         style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 273.993 +         xml:space="preserve"><tspan
 273.994 +           y="380.17593"
 273.995 +           x="196.71785"
 273.996 +           sodipodi:role="line"
 273.997 +           id="tspan5133"
 273.998 +           style="fill:black;fill-opacity:1">Dati di revisione (delta o fotografia)</tspan></text>
 273.999 +    </g>
273.1000 +    <path
273.1001 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1;display:inline"
273.1002 +       d="M 299.69935,362.24027 L 299.69931,393.49494"
273.1003 +       id="path5203"
273.1004 +       inkscape:connector-type="polyline"
273.1005 +       inkscape:connection-start="#g3457"
273.1006 +       inkscape:connection-end="#g5111" />
273.1007 +    <path
273.1008 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1"
273.1009 +       d="M 182.35357,362.22647 L 241.2842,503.07224"
273.1010 +       id="path5271"
273.1011 +       inkscape:connector-type="polyline"
273.1012 +       inkscape:connection-start="#g3399"
273.1013 +       inkscape:connection-end="#g3539" />
273.1014 +    <path
273.1015 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1;display:inline"
273.1016 +       d="M 287.63109,471.81747 L 250.9438,503.07223"
273.1017 +       id="path5285"
273.1018 +       inkscape:connector-type="polyline"
273.1019 +       inkscape:connection-start="#g5087"
273.1020 +       inkscape:connection-end="#g3539" />
273.1021 +    <path
273.1022 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
273.1023 +       d="M 290.80419,250.07192 L 297.80065,283.90394"
273.1024 +       id="path5077"
273.1025 +       inkscape:connector-type="polyline"
273.1026 +       inkscape:connection-start="#g3215"
273.1027 +       inkscape:connection-end="#g3481" />
273.1028 +    <path
273.1029 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
273.1030 +       d="M 229.63373,250.07601 L 190.07484,283.90394"
273.1031 +       id="path5075"
273.1032 +       inkscape:connector-type="polyline"
273.1033 +       inkscape:connection-end="#g3423" />
273.1034 +    <text
273.1035 +       xml:space="preserve"
273.1036 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
273.1037 +       x="131.5625"
273.1038 +       y="100.79968"
273.1039 +       id="text5897"><tspan
273.1040 +         sodipodi:role="line"
273.1041 +         id="tspan5899"
273.1042 +         x="131.5625"
273.1043 +         y="100.79968"
273.1044 +         style="text-align:end;text-anchor:end">Revisione di testa</tspan><tspan
273.1045 +         sodipodi:role="line"
273.1046 +         x="131.5625"
273.1047 +         y="115.79968"
273.1048 +         id="tspan5901"
273.1049 +         style="text-align:end;text-anchor:end">(nessun figlio)</tspan></text>
273.1050 +    <text
273.1051 +       xml:space="preserve"
273.1052 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
273.1053 +       x="131.5625"
273.1054 +       y="207.04968"
273.1055 +       id="text5903"><tspan
273.1056 +         sodipodi:role="line"
273.1057 +         id="tspan5905"
273.1058 +         x="131.5625"
273.1059 +         y="207.04968"
273.1060 +         style="text-align:end;text-anchor:end">Revisione di unione</tspan><tspan
273.1061 +         sodipodi:role="line"
273.1062 +         x="131.5625"
273.1063 +         y="222.04968"
273.1064 +         id="tspan5907"
273.1065 +         style="text-align:end;text-anchor:end">(due genitori)</tspan></text>
273.1066 +    <text
273.1067 +       xml:space="preserve"
273.1068 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
273.1069 +       x="131.92578"
273.1070 +       y="451.58093"
273.1071 +       id="text5909"><tspan
273.1072 +         sodipodi:role="line"
273.1073 +         id="tspan5911"
273.1074 +         x="131.92578"
273.1075 +         y="451.58093"
273.1076 +         style="text-align:end;text-anchor:end">Rami</tspan><tspan
273.1077 +         sodipodi:role="line"
273.1078 +         x="131.92578"
273.1079 +         y="466.58093"
273.1080 +         id="tspan5913"
273.1081 +         style="text-align:end;text-anchor:end">(due revisioni,</tspan><tspan
273.1082 +         sodipodi:role="line"
273.1083 +         x="131.92578"
273.1084 +         y="481.58093"
273.1085 +         id="tspan5915"
273.1086 +         style="text-align:end;text-anchor:end">stesso genitore)</tspan></text>
273.1087 +    <path
273.1088 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:2, 1;stroke-dashoffset:0;stroke-opacity:1;display:inline"
273.1089 +       d="M 111.71875,433.61218 L 154.7268,368.52294"
273.1090 +       id="path5917"
273.1091 +       inkscape:connector-type="polyline" />
273.1092 +    <path
273.1093 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:2, 1;stroke-dashoffset:0;stroke-opacity:1;display:inline"
273.1094 +       d="M 134.375,464.86218 L 277.86691,440.37816"
273.1095 +       id="path5919"
273.1096 +       inkscape:connector-type="polyline"
273.1097 +       inkscape:connection-end="#g5123" />
273.1098 +    <text
273.1099 +       xml:space="preserve"
273.1100 +       style="font-size:12px;font-style:normal;font-weight:normal;text-align:end;text-anchor:end;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
273.1101 +       x="131.5625"
273.1102 +       y="536.73718"
273.1103 +       id="text5927"><tspan
273.1104 +         sodipodi:role="line"
273.1105 +         id="tspan5929"
273.1106 +         x="131.5625"
273.1107 +         y="536.73718">Prima revisione</tspan><tspan
273.1108 +         sodipodi:role="line"
273.1109 +         x="131.5625"
273.1110 +         y="551.73718"
273.1111 +         id="tspan5931">(entrambi i genitori nulli)</tspan></text>
273.1112 +    <rect
273.1113 +       style="fill:#bbb4ff;fill-opacity:1;stroke:none;stroke-width:0.95291203;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
273.1114 +       id="rect2830"
273.1115 +       width="43.664806"
273.1116 +       height="20.562374"
273.1117 +       x="217.0432"
273.1118 +       y="232.10075" />
273.1119 +    <text
273.1120 +       xml:space="preserve"
273.1121 +       style="font-size:5.0801158px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
273.1122 +       x="220.94551"
273.1123 +       y="239.33966"
273.1124 +       id="text2832"><tspan
273.1125 +         id="tspan2836"
273.1126 +         sodipodi:role="line"
273.1127 +         x="220.94551"
273.1128 +         y="239.33966">Primo genitore</tspan></text>
273.1129 +    <text
273.1130 +       xml:space="preserve"
273.1131 +       style="font-size:5.0801158px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
273.1132 +       x="220.65144"
273.1133 +       y="248.09805"
273.1134 +       id="text2879"><tspan
273.1135 +         sodipodi:role="line"
273.1136 +         id="tspan2881"
273.1137 +         x="220.65144"
273.1138 +         y="248.09805"
273.1139 +         style="font-family:Courier">5b80c922ebdd</tspan></text>
273.1140 +    <path
273.1141 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:2, 1;stroke-dashoffset:0;stroke-opacity:1;display:inline"
273.1142 +       d="M 139.84375,107.83093 L 210.15625,107.83093"
273.1143 +       id="path5965"
273.1144 +       inkscape:connector-type="polyline" />
273.1145 +    <path
273.1146 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:2, 1;stroke-dashoffset:0;stroke-opacity:1;display:inline"
273.1147 +       d="M 137.5,213.29968 L 210.49036,214.09055"
273.1148 +       id="path5967"
273.1149 +       inkscape:connector-type="polyline" />
273.1150 +    <path
273.1151 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:2, 1;stroke-dashoffset:0;stroke-opacity:1;display:inline"
273.1152 +       d="M 136.34375,544.54968 L 206.65625,544.54968"
273.1153 +       id="path5969"
273.1154 +       inkscape:connector-type="polyline"
273.1155 +       inkscape:transform-center-y="-171.09375"
273.1156 +       inkscape:transform-center-x="53.90625" />
273.1157 +  </g>
273.1158 +</svg>
   274.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   274.2 +++ b/it/figs/snapshot.svg	Fri Sep 04 16:33:35 2009 +0200
   274.3 @@ -0,0 +1,202 @@
   274.4 +<?xml version="1.0" encoding="UTF-8" standalone="no"?>
   274.5 +<!-- Created with Inkscape (http://www.inkscape.org/) -->
   274.6 +<svg
   274.7 +   xmlns:dc="http://purl.org/dc/elements/1.1/"
   274.8 +   xmlns:cc="http://web.resource.org/cc/"
   274.9 +   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  274.10 +   xmlns:svg="http://www.w3.org/2000/svg"
  274.11 +   xmlns="http://www.w3.org/2000/svg"
  274.12 +   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
  274.13 +   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
  274.14 +   width="744.09448819"
  274.15 +   height="1052.3622047"
  274.16 +   id="svg2807"
  274.17 +   sodipodi:version="0.32"
  274.18 +   inkscape:version="0.44.1"
  274.19 +   sodipodi:docbase="/home/bos/hg/hgbook/en"
  274.20 +   sodipodi:docname="snapshots.svg">
  274.21 +  <defs
  274.22 +     id="defs2809" />
  274.23 +  <sodipodi:namedview
  274.24 +     id="base"
  274.25 +     pagecolor="#ffffff"
  274.26 +     bordercolor="#666666"
  274.27 +     borderopacity="1.0"
  274.28 +     gridtolerance="10000"
  274.29 +     guidetolerance="10"
  274.30 +     objecttolerance="10"
  274.31 +     inkscape:pageopacity="0.0"
  274.32 +     inkscape:pageshadow="2"
  274.33 +     inkscape:zoom="1.4"
  274.34 +     inkscape:cx="252.04111"
  274.35 +     inkscape:cy="605.75448"
  274.36 +     inkscape:document-units="px"
  274.37 +     inkscape:current-layer="layer1"
  274.38 +     inkscape:window-width="906"
  274.39 +     inkscape:window-height="721"
  274.40 +     inkscape:window-x="0"
  274.41 +     inkscape:window-y="25" />
  274.42 +  <metadata
  274.43 +     id="metadata2812">
  274.44 +    <rdf:RDF>
  274.45 +      <cc:Work
  274.46 +         rdf:about="">
  274.47 +        <dc:format>image/svg+xml</dc:format>
  274.48 +        <dc:type
  274.49 +           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
  274.50 +      </cc:Work>
  274.51 +    </rdf:RDF>
  274.52 +  </metadata>
  274.53 +  <g
  274.54 +     inkscape:label="Layer 1"
  274.55 +     inkscape:groupmode="layer"
  274.56 +     id="layer1">
  274.57 +    <rect
  274.58 +       style="opacity:1;fill:#d3ceff;fill-opacity:1;stroke:#a7a7a7;stroke-width:1.88795626;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
  274.59 +       id="rect2817"
  274.60 +       width="118.18347"
  274.61 +       height="245.32632"
  274.62 +       x="243.05112"
  274.63 +       y="315.4133"
  274.64 +       inkscape:transform-center-x="136.84403"
  274.65 +       inkscape:transform-center-y="-66.529183" />
  274.66 +    <rect
  274.67 +       y="315.04153"
  274.68 +       x="46.965065"
  274.69 +       height="97.803009"
  274.70 +       width="108.92702"
  274.71 +       id="rect2815"
  274.72 +       style="fill:#ffced6;fill-opacity:1;stroke:#a7a7a7;stroke-width:1.14441991;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
  274.73 +    <g
  274.74 +       id="g3814">
  274.75 +      <rect
  274.76 +         y="348.94302"
  274.77 +         x="59.285713"
  274.78 +         height="30"
  274.79 +         width="84.285713"
  274.80 +         id="rect2819"
  274.81 +         style="fill:#ff6e86;fill-opacity:1;stroke:#a7a7a7;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
  274.82 +         ry="0" />
  274.83 +      <text
  274.84 +         id="text2821"
  274.85 +         y="368.02701"
  274.86 +         x="71.717636"
  274.87 +         style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
  274.88 +         xml:space="preserve"><tspan
  274.89 +           y="368.02701"
  274.90 +           x="71.717636"
  274.91 +           id="tspan2823"
  274.92 +           sodipodi:role="line">Indice, rev 7</tspan></text>
  274.93 +    </g>
  274.94 +    <text
  274.95 +       id="text3722"
  274.96 +       y="301.29074"
  274.97 +       x="46.187778"
  274.98 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
  274.99 +       xml:space="preserve"><tspan
 274.100 +         y="301.29074"
 274.101 +         x="46.187778"
 274.102 +         id="tspan3724"
 274.103 +         sodipodi:role="line">Indice di revlog (file .i)</tspan></text>
 274.104 +    <text
 274.105 +       id="text3726"
 274.106 +       y="301.29074"
 274.107 +       x="241.90207"
 274.108 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 274.109 +       xml:space="preserve"><tspan
 274.110 +         y="301.29074"
 274.111 +         x="241.90207"
 274.112 +         id="tspan3728"
 274.113 +         sodipodi:role="line">Dati di revlog (file .d)</tspan></text>
 274.114 +    <path
 274.115 +       style="fill:#c695ff;fill-opacity:0.60109288;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
 274.116 +       d="M 143.57143,348.07647 L 255,368.07646 L 255.71429,544.50504 L 142.85714,379.50504 L 143.57143,348.07647 z "
 274.117 +       id="path3839"
 274.118 +       sodipodi:nodetypes="ccccc" />
 274.119 +    <rect
 274.120 +       style="fill:#4733ff;fill-opacity:1;stroke:#a7a7a7;stroke-width:2.35124183;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 274.121 +       id="rect3752"
 274.122 +       width="92.720184"
 274.123 +       height="67.005905"
 274.124 +       x="255.42564"
 274.125 +       y="368.64264" />
 274.126 +    <text
 274.127 +       xml:space="preserve"
 274.128 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 274.129 +       x="261.45859"
 274.130 +       y="387.30099"
 274.131 +       id="text3754"><tspan
 274.132 +         sodipodi:role="line"
 274.133 +         id="tspan3756"
 274.134 +         x="261.45859"
 274.135 +         y="387.30099">Fotografia, rev 4</tspan></text>
 274.136 +    <rect
 274.137 +       style="fill:#7c6eff;fill-opacity:1;stroke:#a7a7a7;stroke-width:1.57776296;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 274.138 +       id="rect3761"
 274.139 +       width="93.49366"
 274.140 +       height="29.922237"
 274.141 +       x="255.03891"
 274.142 +       y="442.04395" />
 274.143 +    <text
 274.144 +       xml:space="preserve"
 274.145 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 274.146 +       x="257.2662"
 274.147 +       y="460.17206"
 274.148 +       id="text3763"><tspan
 274.149 +         sodipodi:role="line"
 274.150 +         id="tspan3765"
 274.151 +         x="257.2662"
 274.152 +         y="460.17206">Delta, da rev 4 a 5</tspan></text>
 274.153 +    <rect
 274.154 +       style="fill:#7c6eff;fill-opacity:1;stroke:#a7a7a7;stroke-width:1.57776296;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 274.155 +       id="rect3774"
 274.156 +       width="93.49366"
 274.157 +       height="29.922237"
 274.158 +       x="255.03891"
 274.159 +       y="477.97485" />
 274.160 +    <text
 274.161 +       xml:space="preserve"
 274.162 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 274.163 +       x="257.2662"
 274.164 +       y="496.10297"
 274.165 +       id="text3776"><tspan
 274.166 +         sodipodi:role="line"
 274.167 +         id="tspan3778"
 274.168 +         x="257.2662"
 274.169 +         y="496.10297">Delta, da rev 5 a 6</tspan></text>
 274.170 +    <rect
 274.171 +       style="fill:#7c6eff;fill-opacity:1;stroke:#a7a7a7;stroke-width:1.57776296;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 274.172 +       id="rect3782"
 274.173 +       width="93.49366"
 274.174 +       height="29.922237"
 274.175 +       x="255.03891"
 274.176 +       y="513.90576" />
 274.177 +    <text
 274.178 +       xml:space="preserve"
 274.179 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 274.180 +       x="257.2662"
 274.181 +       y="532.03387"
 274.182 +       id="text3784"><tspan
 274.183 +         sodipodi:role="line"
 274.184 +         id="tspan3786"
 274.185 +         x="257.2662"
 274.186 +         y="532.03387">Delta, da rev 6 a 7</tspan></text>
 274.187 +    <rect
 274.188 +       style="fill:#7c6eff;fill-opacity:1;stroke:#a7a7a7;stroke-width:1.57776296;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 274.189 +       id="rect3889"
 274.190 +       width="93.49366"
 274.191 +       height="29.922237"
 274.192 +       x="255.03891"
 274.193 +       y="332.32489" />
 274.194 +    <text
 274.195 +       xml:space="preserve"
 274.196 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 274.197 +       x="257.2662"
 274.198 +       y="350.453"
 274.199 +       id="text3891"><tspan
 274.200 +         sodipodi:role="line"
 274.201 +         id="tspan3893"
 274.202 +         x="257.2662"
 274.203 +         y="350.453">Delta, da rev 2 a 3</tspan></text>
 274.204 +  </g>
 274.205 +</svg>
   275.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   275.2 +++ b/it/figs/tour-history.svg	Fri Sep 04 16:33:35 2009 +0200
   275.3 @@ -0,0 +1,289 @@
   275.4 +<?xml version="1.0" encoding="UTF-8" standalone="no"?>
   275.5 +<!-- Created with Inkscape (http://www.inkscape.org/) -->
   275.6 +<svg
   275.7 +   xmlns:dc="http://purl.org/dc/elements/1.1/"
   275.8 +   xmlns:cc="http://web.resource.org/cc/"
   275.9 +   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  275.10 +   xmlns:svg="http://www.w3.org/2000/svg"
  275.11 +   xmlns="http://www.w3.org/2000/svg"
  275.12 +   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
  275.13 +   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
  275.14 +   width="744.09448819"
  275.15 +   height="1052.3622047"
  275.16 +   id="svg2"
  275.17 +   sodipodi:version="0.32"
  275.18 +   inkscape:version="0.44.1"
  275.19 +   sodipodi:docname="tour-history.svg">
  275.20 +  <defs
  275.21 +     id="defs4">
  275.22 +    <marker
  275.23 +       inkscape:stockid="Arrow1Mstart"
  275.24 +       orient="auto"
  275.25 +       refY="0.0"
  275.26 +       refX="0.0"
  275.27 +       id="Arrow1Mstart"
  275.28 +       style="overflow:visible">
  275.29 +      <path
  275.30 +         id="path2973"
  275.31 +         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
  275.32 +         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
  275.33 +         transform="scale(0.4) translate(10,0)" />
  275.34 +    </marker>
  275.35 +    <marker
  275.36 +       inkscape:stockid="Arrow1Mend"
  275.37 +       orient="auto"
  275.38 +       refY="0.0"
  275.39 +       refX="0.0"
  275.40 +       id="Arrow1Mend"
  275.41 +       style="overflow:visible;">
  275.42 +      <path
  275.43 +         id="path3066"
  275.44 +         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
  275.45 +         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
  275.46 +         transform="scale(0.4) rotate(180) translate(10,0)" />
  275.47 +    </marker>
  275.48 +  </defs>
  275.49 +  <sodipodi:namedview
  275.50 +     id="base"
  275.51 +     pagecolor="#ffffff"
  275.52 +     bordercolor="#666666"
  275.53 +     borderopacity="1.0"
  275.54 +     gridtolerance="10000"
  275.55 +     guidetolerance="10"
  275.56 +     objecttolerance="10"
  275.57 +     inkscape:pageopacity="0.0"
  275.58 +     inkscape:pageshadow="2"
  275.59 +     inkscape:zoom="1.4"
  275.60 +     inkscape:cx="232.14286"
  275.61 +     inkscape:cy="672.75296"
  275.62 +     inkscape:document-units="px"
  275.63 +     inkscape:current-layer="layer1"
  275.64 +     inkscape:window-width="906"
  275.65 +     inkscape:window-height="620"
  275.66 +     inkscape:window-x="5"
  275.67 +     inkscape:window-y="49" />
  275.68 +  <metadata
  275.69 +     id="metadata7">
  275.70 +    <rdf:RDF>
  275.71 +      <cc:Work
  275.72 +         rdf:about="">
  275.73 +        <dc:format>image/svg+xml</dc:format>
  275.74 +        <dc:type
  275.75 +           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
  275.76 +      </cc:Work>
  275.77 +    </rdf:RDF>
  275.78 +  </metadata>
  275.79 +  <g
  275.80 +     inkscape:label="Layer 1"
  275.81 +     inkscape:groupmode="layer"
  275.82 +     id="layer1">
  275.83 +    <rect
  275.84 +       style="opacity:1;fill:#a5c3c8;fill-opacity:1;stroke:#6396a0;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
  275.85 +       id="rect1878"
  275.86 +       width="94.285713"
  275.87 +       height="20.714285"
  275.88 +       x="138"
  275.89 +       y="479.50504" />
  275.90 +    <text
  275.91 +       xml:space="preserve"
  275.92 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Courier"
  275.93 +       x="162.09892"
  275.94 +       y="493.12619"
  275.95 +       id="text1872"><tspan
  275.96 +         sodipodi:role="line"
  275.97 +         id="tspan1874"
  275.98 +         x="162.09892"
  275.99 +         y="493.12619"
 275.100 +         style="font-family:Courier"><tspan
 275.101 +   style="font-weight:bold"
 275.102 +   id="tspan1876">0</tspan>: 0a04</tspan></text>
 275.103 +    <rect
 275.104 +       style="opacity:1;fill:#a5c3c8;fill-opacity:1;stroke:#6396a0;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
 275.105 +       id="rect2800"
 275.106 +       width="94.285713"
 275.107 +       height="20.714285"
 275.108 +       x="138"
 275.109 +       y="432.63004" />
 275.110 +    <text
 275.111 +       xml:space="preserve"
 275.112 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Courier"
 275.113 +       x="162.09892"
 275.114 +       y="446.25119"
 275.115 +       id="text2794"><tspan
 275.116 +         sodipodi:role="line"
 275.117 +         id="tspan2796"
 275.118 +         x="162.09892"
 275.119 +         y="446.25119"
 275.120 +         style="font-family:Courier"><tspan
 275.121 +   id="tspan2868"
 275.122 +   style="font-weight:bold">1</tspan>: 82e5</tspan></text>
 275.123 +    <rect
 275.124 +       style="opacity:1;fill:#a5c3c8;fill-opacity:1;stroke:#6396a0;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
 275.125 +       id="rect2810"
 275.126 +       width="94.285713"
 275.127 +       height="20.714285"
 275.128 +       x="138"
 275.129 +       y="385.75504" />
 275.130 +    <text
 275.131 +       xml:space="preserve"
 275.132 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Courier"
 275.133 +       x="162.09892"
 275.134 +       y="399.37619"
 275.135 +       id="text2804"><tspan
 275.136 +         sodipodi:role="line"
 275.137 +         id="tspan2806"
 275.138 +         x="162.09892"
 275.139 +         y="399.37619"
 275.140 +         style="font-family:Courier"><tspan
 275.141 +   style="font-weight:bold"
 275.142 +   id="tspan2866">2</tspan>: fef8</tspan></text>
 275.143 +    <rect
 275.144 +       style="opacity:1;fill:#a5c3c8;fill-opacity:1;stroke:#6396a0;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
 275.145 +       id="rect2820"
 275.146 +       width="94.285713"
 275.147 +       height="20.714285"
 275.148 +       x="138"
 275.149 +       y="338.88007" />
 275.150 +    <text
 275.151 +       xml:space="preserve"
 275.152 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Courier"
 275.153 +       x="162.09892"
 275.154 +       y="352.50122"
 275.155 +       id="text2814"><tspan
 275.156 +         sodipodi:role="line"
 275.157 +         id="tspan2816"
 275.158 +         x="162.09892"
 275.159 +         y="352.50122"
 275.160 +         style="font-family:Courier"><tspan
 275.161 +   style="font-weight:bold"
 275.162 +   id="tspan2864">3</tspan>: 0272</tspan></text>
 275.163 +    <rect
 275.164 +       style="opacity:1;fill:#a5c3c8;fill-opacity:1;stroke:#6396a0;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
 275.165 +       id="rect2830"
 275.166 +       width="94.285713"
 275.167 +       height="20.714285"
 275.168 +       x="138"
 275.169 +       y="292.00504" />
 275.170 +    <text
 275.171 +       xml:space="preserve"
 275.172 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Courier"
 275.173 +       x="162.09892"
 275.174 +       y="305.62619"
 275.175 +       id="text2824"><tspan
 275.176 +         sodipodi:role="line"
 275.177 +         id="tspan2826"
 275.178 +         x="162.09892"
 275.179 +         y="305.62619"
 275.180 +         style="font-family:Courier"><tspan
 275.181 +   style="font-weight:bold"
 275.182 +   id="tspan2862">4</tspan>: 2278</tspan></text>
 275.183 +    <text
 275.184 +       xml:space="preserve"
 275.185 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Courier"
 275.186 +       x="173.57143"
 275.187 +       y="443.79074"
 275.188 +       id="text2832"><tspan
 275.189 +         sodipodi:role="line"
 275.190 +         id="tspan2834"
 275.191 +         x="173.57143"
 275.192 +         y="443.79074" /></text>
 275.193 +    <path
 275.194 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
 275.195 +       d="M 185.14286,478.50504 L 185.14286,454.34432"
 275.196 +       id="path2894"
 275.197 +       inkscape:connector-type="polyline" />
 275.198 +    <path
 275.199 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
 275.200 +       d="M 185.14286,431.63004 L 185.14286,407.46932"
 275.201 +       id="path2896"
 275.202 +       inkscape:connector-type="polyline" />
 275.203 +    <path
 275.204 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
 275.205 +       d="M 185.14286,384.75504 L 185.14286,360.59435"
 275.206 +       id="path2898"
 275.207 +       inkscape:connector-type="polyline" />
 275.208 +    <path
 275.209 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
 275.210 +       d="M 185.14286,337.88007 L 185.14286,313.71932"
 275.211 +       id="path2900"
 275.212 +       inkscape:connector-type="polyline" />
 275.213 +    <text
 275.214 +       xml:space="preserve"
 275.215 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times"
 275.216 +       x="244.60992"
 275.217 +       y="305.245"
 275.218 +       id="text1902"><tspan
 275.219 +         sodipodi:role="line"
 275.220 +         id="tspan1904"
 275.221 +         x="244.60992"
 275.222 +         y="305.245">(più recente)</tspan></text>
 275.223 +    <text
 275.224 +       xml:space="preserve"
 275.225 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times"
 275.226 +       x="244.60992"
 275.227 +       y="492.745"
 275.228 +       id="text1906"><tspan
 275.229 +         sodipodi:role="line"
 275.230 +         id="tspan1908"
 275.231 +         x="244.60992"
 275.232 +         y="492.745">(più vecchia)</tspan></text>
 275.233 +    <rect
 275.234 +       style="opacity:1;fill:#d2e1e4;fill-opacity:1;stroke:#b1cbd0;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
 275.235 +       id="rect1907"
 275.236 +       width="94.285713"
 275.237 +       height="20.714285"
 275.238 +       x="341.28571"
 275.239 +       y="324.86218" />
 275.240 +    <text
 275.241 +       xml:space="preserve"
 275.242 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Courier"
 275.243 +       x="365.38464"
 275.244 +       y="338.48334"
 275.245 +       id="text1909"><tspan
 275.246 +         sodipodi:role="line"
 275.247 +         id="tspan1911"
 275.248 +         x="365.38464"
 275.249 +         y="338.48334"
 275.250 +         style="font-family:Courier"><tspan
 275.251 +   style="font-weight:bold"
 275.252 +   id="tspan1913">4</tspan>: 2278</tspan></text>
 275.253 +    <path
 275.254 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1"
 275.255 +       d="M 364.14286,375.21932 L 367.71429,347.36218"
 275.256 +       id="path2802" />
 275.257 +    <path
 275.258 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1"
 275.259 +       d="M 404.69968,375.21932 L 401.12825,347.36218"
 275.260 +       id="path2986" />
 275.261 +    <text
 275.262 +       xml:space="preserve"
 275.263 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times"
 275.264 +       x="367.14285"
 275.265 +       y="387.21933"
 275.266 +       id="text2988"><tspan
 275.267 +         sodipodi:role="line"
 275.268 +         x="367.14285"
 275.269 +         y="387.21933"
 275.270 +         id="tspan3020"
 275.271 +         style="text-align:end;text-anchor:end">numero di</tspan><tspan
 275.272 +         sodipodi:role="line"
 275.273 +         x="367.14285"
 275.274 +         y="402.21933"
 275.275 +         id="tspan3014"
 275.276 +         style="text-align:end;text-anchor:end">revisione</tspan></text>
 275.277 +    <text
 275.278 +       xml:space="preserve"
 275.279 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times"
 275.280 +       x="400.71429"
 275.281 +       y="387.21933"
 275.282 +       id="text2994"><tspan
 275.283 +         sodipodi:role="line"
 275.284 +         id="tspan2996"
 275.285 +         x="400.71429"
 275.286 +         y="387.21933">identificatore</tspan><tspan
 275.287 +         sodipodi:role="line"
 275.288 +         x="400.71429"
 275.289 +         y="402.21933"
 275.290 +         id="tspan2998">di changeset</tspan></text>
 275.291 +  </g>
 275.292 +</svg>
   276.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   276.2 +++ b/it/figs/tour-merge-conflict.svg	Fri Sep 04 16:33:35 2009 +0200
   276.3 @@ -0,0 +1,210 @@
   276.4 +<?xml version="1.0" encoding="UTF-8" standalone="no"?>
   276.5 +<!-- Created with Inkscape (http://www.inkscape.org/) -->
   276.6 +<svg
   276.7 +   xmlns:dc="http://purl.org/dc/elements/1.1/"
   276.8 +   xmlns:cc="http://web.resource.org/cc/"
   276.9 +   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  276.10 +   xmlns:svg="http://www.w3.org/2000/svg"
  276.11 +   xmlns="http://www.w3.org/2000/svg"
  276.12 +   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
  276.13 +   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
  276.14 +   width="744.09448819"
  276.15 +   height="1052.3622047"
  276.16 +   id="svg2"
  276.17 +   sodipodi:version="0.32"
  276.18 +   inkscape:version="0.44.1"
  276.19 +   sodipodi:docname="tour-merge-conflict.svg">
  276.20 +  <defs
  276.21 +     id="defs4">
  276.22 +    <marker
  276.23 +       inkscape:stockid="Arrow1Mend"
  276.24 +       orient="auto"
  276.25 +       refY="0.0"
  276.26 +       refX="0.0"
  276.27 +       id="Arrow1Mend"
  276.28 +       style="overflow:visible;">
  276.29 +      <path
  276.30 +         id="path3053"
  276.31 +         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
  276.32 +         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
  276.33 +         transform="scale(0.4) rotate(180) translate(10,0)" />
  276.34 +    </marker>
  276.35 +  </defs>
  276.36 +  <sodipodi:namedview
  276.37 +     id="base"
  276.38 +     pagecolor="#ffffff"
  276.39 +     bordercolor="#666666"
  276.40 +     borderopacity="1.0"
  276.41 +     gridtolerance="10000"
  276.42 +     guidetolerance="10"
  276.43 +     objecttolerance="10"
  276.44 +     inkscape:pageopacity="0.0"
  276.45 +     inkscape:pageshadow="2"
  276.46 +     inkscape:zoom="1.4"
  276.47 +     inkscape:cx="164.78349"
  276.48 +     inkscape:cy="590.07679"
  276.49 +     inkscape:document-units="px"
  276.50 +     inkscape:current-layer="layer1"
  276.51 +     inkscape:window-width="906"
  276.52 +     inkscape:window-height="620"
  276.53 +     inkscape:window-x="5"
  276.54 +     inkscape:window-y="49" />
  276.55 +  <metadata
  276.56 +     id="metadata7">
  276.57 +    <rdf:RDF>
  276.58 +      <cc:Work
  276.59 +         rdf:about="">
  276.60 +        <dc:format>image/svg+xml</dc:format>
  276.61 +        <dc:type
  276.62 +           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
  276.63 +      </cc:Work>
  276.64 +    </rdf:RDF>
  276.65 +  </metadata>
  276.66 +  <g
  276.67 +     inkscape:label="Layer 1"
  276.68 +     inkscape:groupmode="layer"
  276.69 +     id="layer1">
  276.70 +    <g
  276.71 +       id="g1988"
  276.72 +       transform="translate(84.85711,0)">
  276.73 +      <g
  276.74 +         id="g1876">
  276.75 +        <path
  276.76 +           style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
  276.77 +           d="M 118.57143,458.21933 L 118.57143,563.79075 L 191.42857,563.79075 L 204.28571,550.93361 L 203.57142,459.6479 L 118.57143,458.21933 z "
  276.78 +           id="path1872"
  276.79 +           sodipodi:nodetypes="cccccc" />
  276.80 +        <path
  276.81 +           style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
  276.82 +           d="M 191.55484,563.36862 L 191.6923,560.98794 L 192.69126,552.44884 L 203.80416,551.31242"
  276.83 +           id="path1874"
  276.84 +           sodipodi:nodetypes="cccc" />
  276.85 +      </g>
  276.86 +      <flowRoot
  276.87 +         style="font-size:8px;font-family:Times New Roman"
  276.88 +         id="flowRoot1898"
  276.89 +         xml:space="preserve"><flowRegion
  276.90 +           id="flowRegion1900"><rect
  276.91 +             style="font-size:8px;font-family:Times New Roman"
  276.92 +             y="464.50504"
  276.93 +             x="122.85714"
  276.94 +             height="93.571426"
  276.95 +             width="76.428574"
  276.96 +             id="rect1902" /></flowRegion><flowPara
  276.97 +           id="flowPara1904">Salve!</flowPara><flowPara
  276.98 +           id="flowPara1906" /><flowPara
  276.99 +           id="flowPara1908">Sono Mariam Abacha, moglie dell'ex dittatore nigeriano Sani Abacha. La sto contattando in via confidenziale e in modo da sviluppare</flowPara></flowRoot>    </g>
 276.100 +    <g
 276.101 +       id="g1966"
 276.102 +       transform="translate(82,0.35715)">
 276.103 +      <g
 276.104 +         transform="translate(-77.85718,-140.0714)"
 276.105 +         id="g1910">
 276.106 +        <path
 276.107 +           style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
 276.108 +           d="M 118.57143,458.21933 L 118.57143,563.79075 L 191.42857,563.79075 L 204.28571,550.93361 L 203.57142,459.6479 L 118.57143,458.21933 z "
 276.109 +           id="path1912"
 276.110 +           sodipodi:nodetypes="cccccc" />
 276.111 +        <path
 276.112 +           style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
 276.113 +           d="M 191.55484,563.36862 L 191.6923,560.98794 L 192.69126,552.44884 L 203.80416,551.31242"
 276.114 +           id="path1914"
 276.115 +           sodipodi:nodetypes="cccc" />
 276.116 +      </g>
 276.117 +      <flowRoot
 276.118 +         transform="translate(-77.85718,-140.0714)"
 276.119 +         style="font-size:8px;font-family:Times New Roman"
 276.120 +         id="flowRoot1916"
 276.121 +         xml:space="preserve"><flowRegion
 276.122 +           id="flowRegion1918"><rect
 276.123 +             style="font-size:8px;font-family:Times New Roman"
 276.124 +             y="464.50504"
 276.125 +             x="122.85714"
 276.126 +             height="93.571426"
 276.127 +             width="76.428574"
 276.128 +             id="rect1920" /></flowRegion><flowPara
 276.129 +           id="flowPara1922">Salve!</flowPara><flowPara
 276.130 +           id="flowPara1924" /><flowPara
 276.131 +           id="flowPara1926">Sono <flowSpan
 276.132 +   style="font-style:italic;fill:red"
 276.133 +   id="flowSpan3094">Shehu Musa Abacha, cugino</flowSpan> dell'ex dittatore nigeriano Sani Abacha. La sto contattando in via confidenziale e in modo da sviluppare</flowPara></flowRoot>    </g>
 276.134 +    <g
 276.135 +       id="g1977"
 276.136 +       transform="translate(81.99999,-0.35715)">
 276.137 +      <g
 276.138 +         transform="translate(83.57141,-139.3571)"
 276.139 +         id="g1932">
 276.140 +        <path
 276.141 +           style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
 276.142 +           d="M 118.57143,458.21933 L 118.57143,563.79075 L 191.42857,563.79075 L 204.28571,550.93361 L 203.57142,459.6479 L 118.57143,458.21933 z "
 276.143 +           id="path1934"
 276.144 +           sodipodi:nodetypes="cccccc" />
 276.145 +        <path
 276.146 +           style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
 276.147 +           d="M 191.55484,563.36862 L 191.6923,560.98794 L 192.69126,552.44884 L 203.80416,551.31242"
 276.148 +           id="path1936"
 276.149 +           sodipodi:nodetypes="cccc" />
 276.150 +      </g>
 276.151 +      <flowRoot
 276.152 +         transform="translate(83.57141,-139.3571)"
 276.153 +         style="font-size:8px;font-family:Times New Roman"
 276.154 +         id="flowRoot1938"
 276.155 +         xml:space="preserve"><flowRegion
 276.156 +           id="flowRegion1940"><rect
 276.157 +             style="font-size:8px;font-family:Times New Roman"
 276.158 +             y="464.50504"
 276.159 +             x="122.85714"
 276.160 +             height="93.571426"
 276.161 +             width="76.428574"
 276.162 +             id="rect1942" /></flowRegion><flowPara
 276.163 +           id="flowPara1944">Salve!</flowPara><flowPara
 276.164 +           id="flowPara1946" /><flowPara
 276.165 +           id="flowPara1948">Sono <flowSpan
 276.166 +   style="font-style:italic;fill:red"
 276.167 +   id="flowSpan3096">Alhaji Abba Abacha, figlio</flowSpan>dell'ex dittatore nigeriano Sani Abacha. La sto contattando in via confidenziale e in modo da sviluppare</flowPara></flowRoot>    </g>
 276.168 +    <path
 276.169 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1"
 276.170 +       d="M 215.502,457.71933 L 196.35507,424.5765"
 276.171 +       id="path1999"
 276.172 +       inkscape:connector-type="polyline"
 276.173 +       inkscape:connection-start="#g1988"
 276.174 +       inkscape:connection-end="#g1966" />
 276.175 +    <path
 276.176 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1"
 276.177 +       d="M 277.06936,457.71933 L 296.21629,424.5765"
 276.178 +       id="path2001"
 276.179 +       inkscape:connector-type="polyline"
 276.180 +       inkscape:connection-start="#g1988"
 276.181 +       inkscape:connection-end="#g1977" />
 276.182 +    <text
 276.183 +       xml:space="preserve"
 276.184 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 276.185 +       x="302.42859"
 276.186 +       y="515.08905"
 276.187 +       id="text1905"><tspan
 276.188 +         sodipodi:role="line"
 276.189 +         id="tspan1907"
 276.190 +         x="302.42859"
 276.191 +         y="515.08905">Versione base</tspan></text>
 276.192 +    <text
 276.193 +       xml:space="preserve"
 276.194 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 276.195 +       x="12.57143"
 276.196 +       y="374.1619"
 276.197 +       id="text1917"><tspan
 276.198 +         sodipodi:role="line"
 276.199 +         id="tspan1919"
 276.200 +         x="12.57143"
 276.201 +         y="374.1619">Le nostre modifiche</tspan></text>
 276.202 +    <text
 276.203 +       xml:space="preserve"
 276.204 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 276.205 +       x="385.71429"
 276.206 +       y="374.1619"
 276.207 +       id="text1921"><tspan
 276.208 +         sodipodi:role="line"
 276.209 +         id="tspan1923"
 276.210 +         x="385.71429"
 276.211 +         y="374.1619">Le loro modifiche</tspan></text>
 276.212 +  </g>
 276.213 +</svg>
   277.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   277.2 +++ b/it/figs/tour-merge-merge.svg	Fri Sep 04 16:33:35 2009 +0200
   277.3 @@ -0,0 +1,380 @@
   277.4 +<?xml version="1.0" encoding="UTF-8" standalone="no"?>
   277.5 +<!-- Created with Inkscape (http://www.inkscape.org/) -->
   277.6 +<svg
   277.7 +   xmlns:dc="http://purl.org/dc/elements/1.1/"
   277.8 +   xmlns:cc="http://web.resource.org/cc/"
   277.9 +   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  277.10 +   xmlns:svg="http://www.w3.org/2000/svg"
  277.11 +   xmlns="http://www.w3.org/2000/svg"
  277.12 +   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
  277.13 +   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
  277.14 +   width="744.09448819"
  277.15 +   height="1052.3622047"
  277.16 +   id="svg2"
  277.17 +   sodipodi:version="0.32"
  277.18 +   inkscape:version="0.44.1"
  277.19 +   sodipodi:docname="tour-merge-merge.svg">
  277.20 +  <defs
  277.21 +     id="defs4">
  277.22 +    <marker
  277.23 +       inkscape:stockid="Arrow1Mstart"
  277.24 +       orient="auto"
  277.25 +       refY="0.0"
  277.26 +       refX="0.0"
  277.27 +       id="Arrow1Mstart"
  277.28 +       style="overflow:visible">
  277.29 +      <path
  277.30 +         id="path2973"
  277.31 +         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
  277.32 +         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
  277.33 +         transform="scale(0.4) translate(10,0)" />
  277.34 +    </marker>
  277.35 +    <marker
  277.36 +       inkscape:stockid="Arrow1Mend"
  277.37 +       orient="auto"
  277.38 +       refY="0.0"
  277.39 +       refX="0.0"
  277.40 +       id="Arrow1Mend"
  277.41 +       style="overflow:visible;">
  277.42 +      <path
  277.43 +         id="path3066"
  277.44 +         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
  277.45 +         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
  277.46 +         transform="scale(0.4) rotate(180) translate(10,0)" />
  277.47 +    </marker>
  277.48 +  </defs>
  277.49 +  <sodipodi:namedview
  277.50 +     id="base"
  277.51 +     pagecolor="#ffffff"
  277.52 +     bordercolor="#666666"
  277.53 +     borderopacity="1.0"
  277.54 +     gridtolerance="10000"
  277.55 +     guidetolerance="10"
  277.56 +     objecttolerance="10"
  277.57 +     inkscape:pageopacity="0.0"
  277.58 +     inkscape:pageshadow="2"
  277.59 +     inkscape:zoom="1.4"
  277.60 +     inkscape:cx="247.53795"
  277.61 +     inkscape:cy="871.05738"
  277.62 +     inkscape:document-units="px"
  277.63 +     inkscape:current-layer="layer1"
  277.64 +     inkscape:window-width="906"
  277.65 +     inkscape:window-height="620"
  277.66 +     inkscape:window-x="38"
  277.67 +     inkscape:window-y="95" />
  277.68 +  <metadata
  277.69 +     id="metadata7">
  277.70 +    <rdf:RDF>
  277.71 +      <cc:Work
  277.72 +         rdf:about="">
  277.73 +        <dc:format>image/svg+xml</dc:format>
  277.74 +        <dc:type
  277.75 +           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
  277.76 +      </cc:Work>
  277.77 +    </rdf:RDF>
  277.78 +  </metadata>
  277.79 +  <g
  277.80 +     inkscape:label="Layer 1"
  277.81 +     inkscape:groupmode="layer"
  277.82 +     id="layer1">
  277.83 +    <rect
  277.84 +       style="fill:#a5c3c8;fill-opacity:1;stroke:#6396a0;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
  277.85 +       id="rect2995"
  277.86 +       width="94.285713"
  277.87 +       height="20.714285"
  277.88 +       x="532.85718"
  277.89 +       y="203.0479" />
  277.90 +    <text
  277.91 +       xml:space="preserve"
  277.92 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Courier"
  277.93 +       x="173.57143"
  277.94 +       y="443.79074"
  277.95 +       id="text2832"><tspan
  277.96 +         sodipodi:role="line"
  277.97 +         id="tspan2834"
  277.98 +         x="173.57143"
  277.99 +         y="443.79074" /></text>
 277.100 +    <rect
 277.101 +       style="fill:#a5c3c8;fill-opacity:1;stroke:#6396a0;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
 277.102 +       id="rect2830"
 277.103 +       width="94.285713"
 277.104 +       height="20.714285"
 277.105 +       x="138"
 277.106 +       y="297.76227" />
 277.107 +    <text
 277.108 +       xml:space="preserve"
 277.109 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Courier"
 277.110 +       x="162.09892"
 277.111 +       y="311.38342"
 277.112 +       id="text2824"><tspan
 277.113 +         sodipodi:role="line"
 277.114 +         id="tspan2826"
 277.115 +         x="162.09892"
 277.116 +         y="311.38342"
 277.117 +         style="font-family:Courier"><tspan
 277.118 +   style="font-weight:bold"
 277.119 +   id="tspan2862">4</tspan>: 2278</tspan></text>
 277.120 +    <path
 277.121 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1"
 277.122 +       d="M 185.14286,343.63731 L 185.14286,319.47656"
 277.123 +       id="path2900"
 277.124 +       inkscape:connector-type="polyline" />
 277.125 +    <rect
 277.126 +       style="fill:#a5c3c8;fill-opacity:1;stroke:#6396a0;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
 277.127 +       id="rect2863"
 277.128 +       width="94.285713"
 277.129 +       height="20.714285"
 277.130 +       x="91.428574"
 277.131 +       y="250.47656" />
 277.132 +    <text
 277.133 +       xml:space="preserve"
 277.134 +       style="font-size:12.00001812px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Courier"
 277.135 +       x="116.09886"
 277.136 +       y="264.56592"
 277.137 +       id="text1965"
 277.138 +       transform="scale(1.000002,0.999998)"><tspan
 277.139 +         sodipodi:role="line"
 277.140 +         id="tspan1967"
 277.141 +         x="116.09886"
 277.142 +         y="264.56592"
 277.143 +         style="font-family:Courier"><tspan
 277.144 +   style="font-weight:bold"
 277.145 +   id="tspan1973">5</tspan>: 1c34</tspan></text>
 277.146 +    <path
 277.147 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1.00000143px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1;display:inline"
 277.148 +       d="M 173.95727,296.76228 L 149.75702,272.19085"
 277.149 +       id="path1971"
 277.150 +       inkscape:connector-type="polyline"
 277.151 +       inkscape:connection-end="#rect2863"
 277.152 +       inkscape:connection-start="#rect2830" />
 277.153 +    <rect
 277.154 +       style="fill:#78a5ad;fill-opacity:1;stroke:#507b84;stroke-width:2.00000286;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
 277.155 +       id="rect2911"
 277.156 +       width="94.285995"
 277.157 +       height="20.714283"
 277.158 +       x="186.71414"
 277.159 +       y="204.40514" />
 277.160 +    <text
 277.161 +       xml:space="preserve"
 277.162 +       style="font-size:12.00001812px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Courier"
 277.163 +       x="210.81311"
 277.164 +       y="218.02673"
 277.165 +       id="text2913"
 277.166 +       transform="scale(1.000002,0.999998)"><tspan
 277.167 +         sodipodi:role="line"
 277.168 +         id="tspan2915"
 277.169 +         x="210.81311"
 277.170 +         y="218.02673"
 277.171 +         style="font-family:Courier"><tspan
 277.172 +   id="tspan1966"
 277.173 +   style="font-weight:bold">6</tspan>: 7643</tspan></text>
 277.174 +    <path
 277.175 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1.00000143px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1;display:inline"
 277.176 +       d="M 191.06908,296.76228 L 227.93092,226.11942"
 277.177 +       id="path2919"
 277.178 +       inkscape:connector-type="polyline"
 277.179 +       inkscape:connection-start="#rect2830" />
 277.180 +    <text
 277.181 +       xml:space="preserve"
 277.182 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 277.183 +       x="295.28571"
 277.184 +       y="217.56711"
 277.185 +       id="text2871"><tspan
 277.186 +         sodipodi:role="line"
 277.187 +         id="tspan2873"
 277.188 +         x="295.28571"
 277.189 +         y="217.56711">punta (e testa)</tspan></text>
 277.190 +    <text
 277.191 +       xml:space="preserve"
 277.192 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 277.193 +       x="76"
 277.194 +       y="264.91769"
 277.195 +       id="text2875"><tspan
 277.196 +         sodipodi:role="line"
 277.197 +         id="tspan2877"
 277.198 +         x="76"
 277.199 +         y="264.91769"
 277.200 +         style="text-align:end;text-anchor:end">testa</tspan></text>
 277.201 +    <rect
 277.202 +       style="fill:#c8aaa5;fill-opacity:1;stroke:#a07163;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:2, 4;stroke-dashoffset:0;stroke-opacity:1"
 277.203 +       id="rect1913"
 277.204 +       width="94.285713"
 277.205 +       height="20.714285"
 277.206 +       x="138"
 277.207 +       y="156.90514" />
 277.208 +    <path
 277.209 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:2, 2;stroke-dashoffset:0;stroke-opacity:1"
 277.210 +       d="M 144.22399,249.47657 L 179.49029,178.61943"
 277.211 +       id="path1915"
 277.212 +       inkscape:connector-type="polyline"
 277.213 +       inkscape:connection-start="#rect2863"
 277.214 +       inkscape:connection-end="#rect1913" />
 277.215 +    <path
 277.216 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:2, 2;stroke-dashoffset:0;stroke-opacity:1"
 277.217 +       d="M 222.20966,203.40514 L 196.79033,178.61943"
 277.218 +       id="path1917"
 277.219 +       inkscape:connector-type="polyline"
 277.220 +       inkscape:connection-start="#rect2911"
 277.221 +       inkscape:connection-end="#rect1913" />
 277.222 +    <text
 277.223 +       xml:space="preserve"
 277.224 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 277.225 +       x="166.16823"
 277.226 +       y="168.52228"
 277.227 +       id="text2806"><tspan
 277.228 +         sodipodi:role="line"
 277.229 +         id="tspan2808"
 277.230 +         x="166.16823"
 277.231 +         y="168.52228"
 277.232 +         style="font-family:Courier">unione</tspan></text>
 277.233 +    <text
 277.234 +       xml:space="preserve"
 277.235 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 277.236 +       x="246"
 277.237 +       y="162.63338"
 277.238 +       id="text2810"><tspan
 277.239 +         sodipodi:role="line"
 277.240 +         id="tspan2812"
 277.241 +         x="246"
 277.242 +         y="162.63338">directory di lavoro</tspan><tspan
 277.243 +         sodipodi:role="line"
 277.244 +         x="246"
 277.245 +         y="177.63338"
 277.246 +         id="tspan2814">durante l'unione</tspan></text>
 277.247 +    <rect
 277.248 +       style="fill:#a5c3c8;fill-opacity:1;stroke:#6396a0;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
 277.249 +       id="rect2816"
 277.250 +       width="94.285713"
 277.251 +       height="20.714285"
 277.252 +       x="483.14636"
 277.253 +       y="297.76227" />
 277.254 +    <text
 277.255 +       xml:space="preserve"
 277.256 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Courier"
 277.257 +       x="507.24527"
 277.258 +       y="311.38342"
 277.259 +       id="text2818"><tspan
 277.260 +         sodipodi:role="line"
 277.261 +         id="tspan2820"
 277.262 +         x="507.24527"
 277.263 +         y="311.38342"
 277.264 +         style="font-family:Courier"><tspan
 277.265 +   style="font-weight:bold"
 277.266 +   id="tspan2822">4</tspan>: 2278</tspan></text>
 277.267 +    <path
 277.268 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1"
 277.269 +       d="M 530.28921,343.6373 L 530.28921,319.47655"
 277.270 +       id="path2824"
 277.271 +       inkscape:connector-type="polyline" />
 277.272 +    <rect
 277.273 +       style="fill:#a5c3c8;fill-opacity:1;stroke:#6396a0;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
 277.274 +       id="rect2826"
 277.275 +       width="94.285713"
 277.276 +       height="20.714285"
 277.277 +       x="436.57492"
 277.278 +       y="250.47656" />
 277.279 +    <text
 277.280 +       xml:space="preserve"
 277.281 +       style="font-size:12.00001812px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Courier"
 277.282 +       x="461.24484"
 277.283 +       y="264.56613"
 277.284 +       id="text2828"
 277.285 +       transform="scale(1.000002,0.999998)"><tspan
 277.286 +         sodipodi:role="line"
 277.287 +         id="tspan2830"
 277.288 +         x="461.24484"
 277.289 +         y="264.56613"
 277.290 +         style="font-family:Courier"><tspan
 277.291 +   style="font-weight:bold"
 277.292 +   id="tspan2832">5</tspan>: 1c34</tspan></text>
 277.293 +    <path
 277.294 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1.00000143px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1;display:inline"
 277.295 +       d="M 519.10362,296.76227 L 494.90337,272.19084"
 277.296 +       id="path2834"
 277.297 +       inkscape:connector-type="polyline" />
 277.298 +    <rect
 277.299 +       style="fill:#78a5ad;fill-opacity:1;stroke:#507b84;stroke-width:2.00000286;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
 277.300 +       id="rect2836"
 277.301 +       width="94.285995"
 277.302 +       height="20.714283"
 277.303 +       x="483.14001"
 277.304 +       y="156.548" />
 277.305 +    <text
 277.306 +       xml:space="preserve"
 277.307 +       style="font-size:12.00001812px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Courier"
 277.308 +       x="555.95911"
 277.309 +       y="218.02698"
 277.310 +       id="text2838"
 277.311 +       transform="scale(1.000002,0.999998)"><tspan
 277.312 +         sodipodi:role="line"
 277.313 +         id="tspan2840"
 277.314 +         x="555.95911"
 277.315 +         y="218.02698"
 277.316 +         style="font-family:Courier"><tspan
 277.317 +   id="tspan2842"
 277.318 +   style="font-weight:bold">6</tspan>: 7643</tspan></text>
 277.319 +    <path
 277.320 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1.00000143px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1;display:inline"
 277.321 +       d="M 536.21543,296.76227 L 574.03453,224.76218"
 277.322 +       id="path2844"
 277.323 +       inkscape:connector-type="polyline" />
 277.324 +    <text
 277.325 +       xml:space="preserve"
 277.326 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 277.327 +       x="594.43207"
 277.328 +       y="169.78796"
 277.329 +       id="text2846"><tspan
 277.330 +         sodipodi:role="line"
 277.331 +         id="tspan2848"
 277.332 +         x="594.43207"
 277.333 +         y="169.78796">punta</tspan></text>
 277.334 +    <path
 277.335 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker-start:none;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:inline"
 277.336 +       d="M 489.37034,249.47656 L 524.65575,178.26229"
 277.337 +       id="path2856"
 277.338 +       inkscape:connector-type="polyline"
 277.339 +       inkscape:connection-end="#rect2836" />
 277.340 +    <path
 277.341 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:inline"
 277.342 +       d="M 567.85714,202.0479 L 542.42591,178.26229"
 277.343 +       id="path2858"
 277.344 +       inkscape:connector-type="polyline"
 277.345 +       inkscape:connection-end="#rect2836"
 277.346 +       inkscape:connection-start="#rect2995" />
 277.347 +    <text
 277.348 +       xml:space="preserve"
 277.349 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 277.350 +       x="504.54507"
 277.351 +       y="170.39714"
 277.352 +       id="text2860"><tspan
 277.353 +         sodipodi:role="line"
 277.354 +         id="tspan2863"
 277.355 +         x="504.54507"
 277.356 +         y="170.39714"
 277.357 +         style="font-family:Courier"><tspan
 277.358 +   style="font-weight:bold"
 277.359 +   id="tspan2997">7</tspan>: e300</tspan></text>
 277.360 +    <text
 277.361 +       xml:space="preserve"
 277.362 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 277.363 +       x="90.323105"
 277.364 +       y="120.21933"
 277.365 +       id="text2929"><tspan
 277.366 +         sodipodi:role="line"
 277.367 +         id="tspan2931"
 277.368 +         x="90.323105"
 277.369 +         y="120.21933"
 277.370 +         style="font-weight:bold">Directory di lavoro durante l'unione</tspan></text>
 277.371 +    <text
 277.372 +       xml:space="preserve"
 277.373 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 277.374 +       x="435.35226"
 277.375 +       y="120.21933"
 277.376 +       id="text2937"><tspan
 277.377 +         sodipodi:role="line"
 277.378 +         id="tspan2939"
 277.379 +         x="435.35226"
 277.380 +         y="120.21933"
 277.381 +         style="font-weight:bold">Repository dopo l'inserimento dell'unione</tspan></text>
 277.382 +  </g>
 277.383 +</svg>
   278.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   278.2 +++ b/it/figs/tour-merge-pull.svg	Fri Sep 04 16:33:35 2009 +0200
   278.3 @@ -0,0 +1,288 @@
   278.4 +<?xml version="1.0" encoding="UTF-8" standalone="no"?>
   278.5 +<!-- Created with Inkscape (http://www.inkscape.org/) -->
   278.6 +<svg
   278.7 +   xmlns:dc="http://purl.org/dc/elements/1.1/"
   278.8 +   xmlns:cc="http://web.resource.org/cc/"
   278.9 +   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  278.10 +   xmlns:svg="http://www.w3.org/2000/svg"
  278.11 +   xmlns="http://www.w3.org/2000/svg"
  278.12 +   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
  278.13 +   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
  278.14 +   width="744.09448819"
  278.15 +   height="1052.3622047"
  278.16 +   id="svg2"
  278.17 +   sodipodi:version="0.32"
  278.18 +   inkscape:version="0.44.1"
  278.19 +   sodipodi:docname="tour-merge-pull.svg"
  278.20 +   sodipodi:docbase="/home/bos/hg/hgbook/en">
  278.21 +  <defs
  278.22 +     id="defs4">
  278.23 +    <marker
  278.24 +       inkscape:stockid="Arrow1Mstart"
  278.25 +       orient="auto"
  278.26 +       refY="0.0"
  278.27 +       refX="0.0"
  278.28 +       id="Arrow1Mstart"
  278.29 +       style="overflow:visible">
  278.30 +      <path
  278.31 +         id="path2973"
  278.32 +         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
  278.33 +         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
  278.34 +         transform="scale(0.4) translate(10,0)" />
  278.35 +    </marker>
  278.36 +    <marker
  278.37 +       inkscape:stockid="Arrow1Mend"
  278.38 +       orient="auto"
  278.39 +       refY="0.0"
  278.40 +       refX="0.0"
  278.41 +       id="Arrow1Mend"
  278.42 +       style="overflow:visible;">
  278.43 +      <path
  278.44 +         id="path3066"
  278.45 +         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
  278.46 +         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
  278.47 +         transform="scale(0.4) rotate(180) translate(10,0)" />
  278.48 +    </marker>
  278.49 +  </defs>
  278.50 +  <sodipodi:namedview
  278.51 +     id="base"
  278.52 +     pagecolor="#ffffff"
  278.53 +     bordercolor="#666666"
  278.54 +     borderopacity="1.0"
  278.55 +     gridtolerance="10000"
  278.56 +     guidetolerance="10"
  278.57 +     objecttolerance="10"
  278.58 +     inkscape:pageopacity="0.0"
  278.59 +     inkscape:pageshadow="2"
  278.60 +     inkscape:zoom="1.4"
  278.61 +     inkscape:cx="233.63208"
  278.62 +     inkscape:cy="832.54381"
  278.63 +     inkscape:document-units="px"
  278.64 +     inkscape:current-layer="layer1"
  278.65 +     inkscape:window-width="906"
  278.66 +     inkscape:window-height="620"
  278.67 +     inkscape:window-x="237"
  278.68 +     inkscape:window-y="103" />
  278.69 +  <metadata
  278.70 +     id="metadata7">
  278.71 +    <rdf:RDF>
  278.72 +      <cc:Work
  278.73 +         rdf:about="">
  278.74 +        <dc:format>image/svg+xml</dc:format>
  278.75 +        <dc:type
  278.76 +           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
  278.77 +      </cc:Work>
  278.78 +    </rdf:RDF>
  278.79 +  </metadata>
  278.80 +  <g
  278.81 +     inkscape:label="Layer 1"
  278.82 +     inkscape:groupmode="layer"
  278.83 +     id="layer1">
  278.84 +    <text
  278.85 +       xml:space="preserve"
  278.86 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Courier"
  278.87 +       x="173.57143"
  278.88 +       y="443.79074"
  278.89 +       id="text2832"><tspan
  278.90 +         sodipodi:role="line"
  278.91 +         id="tspan2834"
  278.92 +         x="173.57143"
  278.93 +         y="443.79074" /></text>
  278.94 +    <rect
  278.95 +       style="fill:#a5c3c8;fill-opacity:1;stroke:#6396a0;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
  278.96 +       id="rect1878"
  278.97 +       width="94.285713"
  278.98 +       height="20.714285"
  278.99 +       x="138"
 278.100 +       y="479.50504" />
 278.101 +    <text
 278.102 +       xml:space="preserve"
 278.103 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Courier"
 278.104 +       x="162.09892"
 278.105 +       y="493.12619"
 278.106 +       id="text1872"><tspan
 278.107 +         sodipodi:role="line"
 278.108 +         id="tspan1874"
 278.109 +         x="162.09892"
 278.110 +         y="493.12619"
 278.111 +         style="font-family:Courier"><tspan
 278.112 +   style="font-weight:bold"
 278.113 +   id="tspan1876">0</tspan>: 0a04</tspan></text>
 278.114 +    <rect
 278.115 +       style="fill:#a5c3c8;fill-opacity:1;stroke:#6396a0;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
 278.116 +       id="rect2800"
 278.117 +       width="94.285713"
 278.118 +       height="20.714285"
 278.119 +       x="138"
 278.120 +       y="432.63004" />
 278.121 +    <text
 278.122 +       xml:space="preserve"
 278.123 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Courier"
 278.124 +       x="162.09892"
 278.125 +       y="446.25119"
 278.126 +       id="text2794"><tspan
 278.127 +         sodipodi:role="line"
 278.128 +         id="tspan2796"
 278.129 +         x="162.09892"
 278.130 +         y="446.25119"
 278.131 +         style="font-family:Courier"><tspan
 278.132 +   id="tspan2868"
 278.133 +   style="font-weight:bold">1</tspan>: 82e5</tspan></text>
 278.134 +    <rect
 278.135 +       style="fill:#a5c3c8;fill-opacity:1;stroke:#6396a0;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
 278.136 +       id="rect2810"
 278.137 +       width="94.285713"
 278.138 +       height="20.714285"
 278.139 +       x="138"
 278.140 +       y="385.75504" />
 278.141 +    <text
 278.142 +       xml:space="preserve"
 278.143 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Courier"
 278.144 +       x="162.09892"
 278.145 +       y="399.37619"
 278.146 +       id="text2804"><tspan
 278.147 +         sodipodi:role="line"
 278.148 +         id="tspan2806"
 278.149 +         x="162.09892"
 278.150 +         y="399.37619"
 278.151 +         style="font-family:Courier"><tspan
 278.152 +   style="font-weight:bold"
 278.153 +   id="tspan2866">2</tspan>: fef8</tspan></text>
 278.154 +    <rect
 278.155 +       style="fill:#a5c3c8;fill-opacity:1;stroke:#6396a0;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
 278.156 +       id="rect2820"
 278.157 +       width="94.285713"
 278.158 +       height="20.714285"
 278.159 +       x="138"
 278.160 +       y="338.88007" />
 278.161 +    <text
 278.162 +       xml:space="preserve"
 278.163 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Courier"
 278.164 +       x="162.09892"
 278.165 +       y="352.50122"
 278.166 +       id="text2814"><tspan
 278.167 +         sodipodi:role="line"
 278.168 +         id="tspan2816"
 278.169 +         x="162.09892"
 278.170 +         y="352.50122"
 278.171 +         style="font-family:Courier"><tspan
 278.172 +   style="font-weight:bold"
 278.173 +   id="tspan2864">3</tspan>: 0272</tspan></text>
 278.174 +    <rect
 278.175 +       style="fill:#a5c3c8;fill-opacity:1;stroke:#6396a0;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
 278.176 +       id="rect2830"
 278.177 +       width="94.285713"
 278.178 +       height="20.714285"
 278.179 +       x="138"
 278.180 +       y="292.00504" />
 278.181 +    <text
 278.182 +       xml:space="preserve"
 278.183 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Courier"
 278.184 +       x="162.09892"
 278.185 +       y="305.62619"
 278.186 +       id="text2824"><tspan
 278.187 +         sodipodi:role="line"
 278.188 +         id="tspan2826"
 278.189 +         x="162.09892"
 278.190 +         y="305.62619"
 278.191 +         style="font-family:Courier"><tspan
 278.192 +   style="font-weight:bold"
 278.193 +   id="tspan2862">4</tspan>: 2278</tspan></text>
 278.194 +    <path
 278.195 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1"
 278.196 +       d="M 185.14286,478.50504 L 185.14286,454.34432"
 278.197 +       id="path2894"
 278.198 +       inkscape:connector-type="polyline" />
 278.199 +    <path
 278.200 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1"
 278.201 +       d="M 185.14286,431.63004 L 185.14286,407.46932"
 278.202 +       id="path2896"
 278.203 +       inkscape:connector-type="polyline" />
 278.204 +    <path
 278.205 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1"
 278.206 +       d="M 185.14286,384.75504 L 185.14286,360.59435"
 278.207 +       id="path2898"
 278.208 +       inkscape:connector-type="polyline" />
 278.209 +    <path
 278.210 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1"
 278.211 +       d="M 185.14286,337.88007 L 185.14286,313.71932"
 278.212 +       id="path2900"
 278.213 +       inkscape:connector-type="polyline" />
 278.214 +    <rect
 278.215 +       style="fill:#a5c3c8;fill-opacity:1;stroke:#6396a0;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
 278.216 +       id="rect2863"
 278.217 +       width="94.285713"
 278.218 +       height="20.714285"
 278.219 +       x="91.428574"
 278.220 +       y="244.71933" />
 278.221 +    <text
 278.222 +       xml:space="preserve"
 278.223 +       style="font-size:12.00001812px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Courier"
 278.224 +       x="116.09886"
 278.225 +       y="258.80865"
 278.226 +       id="text1965"
 278.227 +       transform="scale(1.000002,0.999998)"><tspan
 278.228 +         sodipodi:role="line"
 278.229 +         id="tspan1967"
 278.230 +         x="116.09886"
 278.231 +         y="258.80865"
 278.232 +         style="font-family:Courier"><tspan
 278.233 +   style="font-weight:bold"
 278.234 +   id="tspan1973">5</tspan>: 1c34</tspan></text>
 278.235 +    <path
 278.236 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1.00000143px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1;display:inline"
 278.237 +       d="M 173.95727,291.00504 L 149.75702,266.43361"
 278.238 +       id="path1971"
 278.239 +       inkscape:connector-type="polyline"
 278.240 +       inkscape:connection-end="#rect2863"
 278.241 +       inkscape:connection-start="#rect2830" />
 278.242 +    <rect
 278.243 +       style="fill:#78a5ad;fill-opacity:1;stroke:#507b84;stroke-width:2.00000286;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
 278.244 +       id="rect2911"
 278.245 +       width="94.285995"
 278.246 +       height="20.714283"
 278.247 +       x="186.71414"
 278.248 +       y="198.6479" />
 278.249 +    <text
 278.250 +       xml:space="preserve"
 278.251 +       style="font-size:12.00001812px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Courier"
 278.252 +       x="210.81311"
 278.253 +       y="212.26949"
 278.254 +       id="text2913"
 278.255 +       transform="scale(1.000002,0.999998)"><tspan
 278.256 +         sodipodi:role="line"
 278.257 +         id="tspan2915"
 278.258 +         x="210.81311"
 278.259 +         y="212.26949"
 278.260 +         style="font-family:Courier"><tspan
 278.261 +   id="tspan1966"
 278.262 +   style="font-weight:bold">6</tspan>: 7643</tspan></text>
 278.263 +    <path
 278.264 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1.00000143px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1;display:inline"
 278.265 +       d="M 191.06908,291.00504 L 227.93092,220.36218"
 278.266 +       id="path2919"
 278.267 +       inkscape:connector-type="polyline"
 278.268 +       inkscape:connection-start="#rect2830" />
 278.269 +    <text
 278.270 +       xml:space="preserve"
 278.271 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 278.272 +       x="295.28571"
 278.273 +       y="211.80988"
 278.274 +       id="text2871"><tspan
 278.275 +         sodipodi:role="line"
 278.276 +         id="tspan2873"
 278.277 +         x="295.28571"
 278.278 +         y="211.80988">punta (e testa)</tspan></text>
 278.279 +    <text
 278.280 +       xml:space="preserve"
 278.281 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 278.282 +       x="76"
 278.283 +       y="259.16046"
 278.284 +       id="text2875"><tspan
 278.285 +         sodipodi:role="line"
 278.286 +         id="tspan2877"
 278.287 +         x="76"
 278.288 +         y="259.16046"
 278.289 +         style="text-align:end;text-anchor:end">testa</tspan></text>
 278.290 +  </g>
 278.291 +</svg>
   279.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   279.2 +++ b/it/figs/tour-merge-sep-repos.svg	Fri Sep 04 16:33:35 2009 +0200
   279.3 @@ -0,0 +1,466 @@
   279.4 +<?xml version="1.0" encoding="UTF-8" standalone="no"?>
   279.5 +<!-- Created with Inkscape (http://www.inkscape.org/) -->
   279.6 +<svg
   279.7 +   xmlns:dc="http://purl.org/dc/elements/1.1/"
   279.8 +   xmlns:cc="http://web.resource.org/cc/"
   279.9 +   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  279.10 +   xmlns:svg="http://www.w3.org/2000/svg"
  279.11 +   xmlns="http://www.w3.org/2000/svg"
  279.12 +   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
  279.13 +   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
  279.14 +   width="744.09448819"
  279.15 +   height="1052.3622047"
  279.16 +   id="svg2"
  279.17 +   sodipodi:version="0.32"
  279.18 +   inkscape:version="0.44.1"
  279.19 +   sodipodi:docname="tour-merge-sep-repos.svg">
  279.20 +  <defs
  279.21 +     id="defs4">
  279.22 +    <marker
  279.23 +       inkscape:stockid="Arrow1Mstart"
  279.24 +       orient="auto"
  279.25 +       refY="0.0"
  279.26 +       refX="0.0"
  279.27 +       id="Arrow1Mstart"
  279.28 +       style="overflow:visible">
  279.29 +      <path
  279.30 +         id="path2973"
  279.31 +         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
  279.32 +         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
  279.33 +         transform="scale(0.4) translate(10,0)" />
  279.34 +    </marker>
  279.35 +    <marker
  279.36 +       inkscape:stockid="Arrow1Mend"
  279.37 +       orient="auto"
  279.38 +       refY="0.0"
  279.39 +       refX="0.0"
  279.40 +       id="Arrow1Mend"
  279.41 +       style="overflow:visible;">
  279.42 +      <path
  279.43 +         id="path3066"
  279.44 +         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
  279.45 +         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
  279.46 +         transform="scale(0.4) rotate(180) translate(10,0)" />
  279.47 +    </marker>
  279.48 +  </defs>
  279.49 +  <sodipodi:namedview
  279.50 +     id="base"
  279.51 +     pagecolor="#ffffff"
  279.52 +     bordercolor="#666666"
  279.53 +     borderopacity="1.0"
  279.54 +     gridtolerance="10000"
  279.55 +     guidetolerance="10"
  279.56 +     objecttolerance="10"
  279.57 +     inkscape:pageopacity="0.0"
  279.58 +     inkscape:pageshadow="2"
  279.59 +     inkscape:zoom="1.4"
  279.60 +     inkscape:cx="307.20351"
  279.61 +     inkscape:cy="716.87911"
  279.62 +     inkscape:document-units="px"
  279.63 +     inkscape:current-layer="layer1"
  279.64 +     inkscape:window-width="906"
  279.65 +     inkscape:window-height="620"
  279.66 +     inkscape:window-x="5"
  279.67 +     inkscape:window-y="49" />
  279.68 +  <metadata
  279.69 +     id="metadata7">
  279.70 +    <rdf:RDF>
  279.71 +      <cc:Work
  279.72 +         rdf:about="">
  279.73 +        <dc:format>image/svg+xml</dc:format>
  279.74 +        <dc:type
  279.75 +           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
  279.76 +      </cc:Work>
  279.77 +    </rdf:RDF>
  279.78 +  </metadata>
  279.79 +  <g
  279.80 +     inkscape:label="Layer 1"
  279.81 +     inkscape:groupmode="layer"
  279.82 +     id="layer1">
  279.83 +    <text
  279.84 +       xml:space="preserve"
  279.85 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Courier"
  279.86 +       x="173.57143"
  279.87 +       y="443.79074"
  279.88 +       id="text2832"><tspan
  279.89 +         sodipodi:role="line"
  279.90 +         id="tspan2834"
  279.91 +         x="173.57143"
  279.92 +         y="443.79074" /></text>
  279.93 +    <rect
  279.94 +       style="fill:#a5c3c8;fill-opacity:1;stroke:#6396a0;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
  279.95 +       id="rect1878"
  279.96 +       width="94.285713"
  279.97 +       height="20.714285"
  279.98 +       x="138"
  279.99 +       y="479.50504" />
 279.100 +    <text
 279.101 +       xml:space="preserve"
 279.102 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Courier"
 279.103 +       x="162.09892"
 279.104 +       y="493.12619"
 279.105 +       id="text1872"><tspan
 279.106 +         sodipodi:role="line"
 279.107 +         id="tspan1874"
 279.108 +         x="162.09892"
 279.109 +         y="493.12619"
 279.110 +         style="font-family:Courier"><tspan
 279.111 +   style="font-weight:bold"
 279.112 +   id="tspan1876">0</tspan>: 0a04</tspan></text>
 279.113 +    <rect
 279.114 +       style="fill:#a5c3c8;fill-opacity:1;stroke:#6396a0;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
 279.115 +       id="rect2800"
 279.116 +       width="94.285713"
 279.117 +       height="20.714285"
 279.118 +       x="138"
 279.119 +       y="432.63004" />
 279.120 +    <text
 279.121 +       xml:space="preserve"
 279.122 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Courier"
 279.123 +       x="162.09892"
 279.124 +       y="446.25119"
 279.125 +       id="text2794"><tspan
 279.126 +         sodipodi:role="line"
 279.127 +         id="tspan2796"
 279.128 +         x="162.09892"
 279.129 +         y="446.25119"
 279.130 +         style="font-family:Courier"><tspan
 279.131 +   id="tspan2868"
 279.132 +   style="font-weight:bold">1</tspan>: 82e5</tspan></text>
 279.133 +    <rect
 279.134 +       style="fill:#a5c3c8;fill-opacity:1;stroke:#6396a0;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
 279.135 +       id="rect2810"
 279.136 +       width="94.285713"
 279.137 +       height="20.714285"
 279.138 +       x="138"
 279.139 +       y="385.75504" />
 279.140 +    <text
 279.141 +       xml:space="preserve"
 279.142 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Courier"
 279.143 +       x="162.09892"
 279.144 +       y="399.37619"
 279.145 +       id="text2804"><tspan
 279.146 +         sodipodi:role="line"
 279.147 +         id="tspan2806"
 279.148 +         x="162.09892"
 279.149 +         y="399.37619"
 279.150 +         style="font-family:Courier"><tspan
 279.151 +   style="font-weight:bold"
 279.152 +   id="tspan2866">2</tspan>: fef8</tspan></text>
 279.153 +    <rect
 279.154 +       style="fill:#a5c3c8;fill-opacity:1;stroke:#6396a0;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
 279.155 +       id="rect2820"
 279.156 +       width="94.285713"
 279.157 +       height="20.714285"
 279.158 +       x="138"
 279.159 +       y="338.88007" />
 279.160 +    <text
 279.161 +       xml:space="preserve"
 279.162 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Courier"
 279.163 +       x="162.09892"
 279.164 +       y="352.50122"
 279.165 +       id="text2814"><tspan
 279.166 +         sodipodi:role="line"
 279.167 +         id="tspan2816"
 279.168 +         x="162.09892"
 279.169 +         y="352.50122"
 279.170 +         style="font-family:Courier"><tspan
 279.171 +   style="font-weight:bold"
 279.172 +   id="tspan2864">3</tspan>: 0272</tspan></text>
 279.173 +    <rect
 279.174 +       style="fill:#a5c3c8;fill-opacity:1;stroke:#6396a0;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
 279.175 +       id="rect2830"
 279.176 +       width="94.285713"
 279.177 +       height="20.714285"
 279.178 +       x="138"
 279.179 +       y="292.00504" />
 279.180 +    <text
 279.181 +       xml:space="preserve"
 279.182 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Courier"
 279.183 +       x="162.09892"
 279.184 +       y="305.62619"
 279.185 +       id="text2824"><tspan
 279.186 +         sodipodi:role="line"
 279.187 +         id="tspan2826"
 279.188 +         x="162.09892"
 279.189 +         y="305.62619"
 279.190 +         style="font-family:Courier"><tspan
 279.191 +   style="font-weight:bold"
 279.192 +   id="tspan2862">4</tspan>: 2278</tspan></text>
 279.193 +    <path
 279.194 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1"
 279.195 +       d="M 185.14286,478.50504 L 185.14286,454.34432"
 279.196 +       id="path2894"
 279.197 +       inkscape:connector-type="polyline" />
 279.198 +    <path
 279.199 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1"
 279.200 +       d="M 185.14286,431.63004 L 185.14286,407.46932"
 279.201 +       id="path2896"
 279.202 +       inkscape:connector-type="polyline" />
 279.203 +    <path
 279.204 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1"
 279.205 +       d="M 185.14286,384.75504 L 185.14286,360.59435"
 279.206 +       id="path2898"
 279.207 +       inkscape:connector-type="polyline" />
 279.208 +    <path
 279.209 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1"
 279.210 +       d="M 185.14286,337.88007 L 185.14286,313.71932"
 279.211 +       id="path2900"
 279.212 +       inkscape:connector-type="polyline" />
 279.213 +    <rect
 279.214 +       style="fill:#78a5ad;fill-opacity:1;stroke:#507b84;stroke-width:2.00000286;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
 279.215 +       id="rect1963"
 279.216 +       width="94.285995"
 279.217 +       height="20.714283"
 279.218 +       x="138"
 279.219 +       y="245.18723" />
 279.220 +    <text
 279.221 +       xml:space="preserve"
 279.222 +       style="font-size:12.00001812px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Courier"
 279.223 +       x="162.09877"
 279.224 +       y="258.80865"
 279.225 +       id="text1965"
 279.226 +       transform="scale(1.000002,0.999998)"><tspan
 279.227 +         sodipodi:role="line"
 279.228 +         id="tspan1967"
 279.229 +         x="162.09877"
 279.230 +         y="258.80865"
 279.231 +         style="font-family:Courier"><tspan
 279.232 +   style="font-weight:bold"
 279.233 +   id="tspan1973">5</tspan>: 7643</tspan></text>
 279.234 +    <path
 279.235 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1.00000143px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1"
 279.236 +       d="M 185.143,291.06218 L 185.143,266.90143"
 279.237 +       id="path1971"
 279.238 +       inkscape:connector-type="polyline" />
 279.239 +    <text
 279.240 +       xml:space="preserve"
 279.241 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 279.242 +       x="136.90039"
 279.243 +       y="232.25546"
 279.244 +       id="text2921"><tspan
 279.245 +         sodipodi:role="line"
 279.246 +         id="tspan2923"
 279.247 +         x="136.90039"
 279.248 +         y="232.25546">mio-hello</tspan></text>
 279.249 +    <rect
 279.250 +       style="fill:#a5c3c8;fill-opacity:1;stroke:#6396a0;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
 279.251 +       id="rect2863"
 279.252 +       width="94.285713"
 279.253 +       height="20.714285"
 279.254 +       x="370.71414"
 279.255 +       y="479.49289" />
 279.256 +    <text
 279.257 +       xml:space="preserve"
 279.258 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Courier"
 279.259 +       x="394.81305"
 279.260 +       y="493.11404"
 279.261 +       id="text2865"><tspan
 279.262 +         sodipodi:role="line"
 279.263 +         id="tspan2867"
 279.264 +         x="394.81305"
 279.265 +         y="493.11404"
 279.266 +         style="font-family:Courier"><tspan
 279.267 +   style="font-weight:bold"
 279.268 +   id="tspan2869">0</tspan>: 0a04</tspan></text>
 279.269 +    <rect
 279.270 +       style="fill:#a5c3c8;fill-opacity:1;stroke:#6396a0;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
 279.271 +       id="rect2871"
 279.272 +       width="94.285713"
 279.273 +       height="20.714285"
 279.274 +       x="370.71414"
 279.275 +       y="432.61789" />
 279.276 +    <text
 279.277 +       xml:space="preserve"
 279.278 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Courier"
 279.279 +       x="394.81305"
 279.280 +       y="446.23904"
 279.281 +       id="text2873"><tspan
 279.282 +         sodipodi:role="line"
 279.283 +         id="tspan2875"
 279.284 +         x="394.81305"
 279.285 +         y="446.23904"
 279.286 +         style="font-family:Courier"><tspan
 279.287 +   id="tspan2877"
 279.288 +   style="font-weight:bold">1</tspan>: 82e5</tspan></text>
 279.289 +    <rect
 279.290 +       style="fill:#a5c3c8;fill-opacity:1;stroke:#6396a0;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
 279.291 +       id="rect2879"
 279.292 +       width="94.285713"
 279.293 +       height="20.714285"
 279.294 +       x="370.71414"
 279.295 +       y="385.74289" />
 279.296 +    <text
 279.297 +       xml:space="preserve"
 279.298 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Courier"
 279.299 +       x="394.81305"
 279.300 +       y="399.36404"
 279.301 +       id="text2881"><tspan
 279.302 +         sodipodi:role="line"
 279.303 +         id="tspan2883"
 279.304 +         x="394.81305"
 279.305 +         y="399.36404"
 279.306 +         style="font-family:Courier"><tspan
 279.307 +   style="font-weight:bold"
 279.308 +   id="tspan2885">2</tspan>: fef8</tspan></text>
 279.309 +    <rect
 279.310 +       style="fill:#a5c3c8;fill-opacity:1;stroke:#6396a0;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
 279.311 +       id="rect2887"
 279.312 +       width="94.285713"
 279.313 +       height="20.714285"
 279.314 +       x="370.71414"
 279.315 +       y="338.86792" />
 279.316 +    <text
 279.317 +       xml:space="preserve"
 279.318 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Courier"
 279.319 +       x="394.81305"
 279.320 +       y="352.48907"
 279.321 +       id="text2889"><tspan
 279.322 +         sodipodi:role="line"
 279.323 +         id="tspan2891"
 279.324 +         x="394.81305"
 279.325 +         y="352.48907"
 279.326 +         style="font-family:Courier"><tspan
 279.327 +   style="font-weight:bold"
 279.328 +   id="tspan2893">3</tspan>: 0272</tspan></text>
 279.329 +    <rect
 279.330 +       style="fill:#a5c3c8;fill-opacity:1;stroke:#6396a0;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
 279.331 +       id="rect2895"
 279.332 +       width="94.285713"
 279.333 +       height="20.714285"
 279.334 +       x="370.71414"
 279.335 +       y="291.99289" />
 279.336 +    <text
 279.337 +       xml:space="preserve"
 279.338 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Courier"
 279.339 +       x="394.81305"
 279.340 +       y="305.61404"
 279.341 +       id="text2897"><tspan
 279.342 +         sodipodi:role="line"
 279.343 +         id="tspan2899"
 279.344 +         x="394.81305"
 279.345 +         y="305.61404"
 279.346 +         style="font-family:Courier"><tspan
 279.347 +   style="font-weight:bold"
 279.348 +   id="tspan2901">4</tspan>: 2278</tspan></text>
 279.349 +    <path
 279.350 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1"
 279.351 +       d="M 417.85701,478.4929 L 417.85701,454.33218"
 279.352 +       id="path2903"
 279.353 +       inkscape:connector-type="polyline" />
 279.354 +    <path
 279.355 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1"
 279.356 +       d="M 417.85701,431.6179 L 417.85701,407.45718"
 279.357 +       id="path2905"
 279.358 +       inkscape:connector-type="polyline" />
 279.359 +    <path
 279.360 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1"
 279.361 +       d="M 417.85701,384.7429 L 417.85701,360.58221"
 279.362 +       id="path2907"
 279.363 +       inkscape:connector-type="polyline" />
 279.364 +    <path
 279.365 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1"
 279.366 +       d="M 417.85701,337.86793 L 417.85701,313.70718"
 279.367 +       id="path2909"
 279.368 +       inkscape:connector-type="polyline" />
 279.369 +    <rect
 279.370 +       style="fill:#78a5ad;fill-opacity:1;stroke:#507b84;stroke-width:2.00000286;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
 279.371 +       id="rect2911"
 279.372 +       width="94.285995"
 279.373 +       height="20.714283"
 279.374 +       x="370.71414"
 279.375 +       y="245.17511" />
 279.376 +    <text
 279.377 +       xml:space="preserve"
 279.378 +       style="font-size:12.00001812px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Courier"
 279.379 +       x="394.81274"
 279.380 +       y="258.79678"
 279.381 +       id="text2913"
 279.382 +       transform="scale(1.000002,0.999998)"><tspan
 279.383 +         sodipodi:role="line"
 279.384 +         id="tspan2915"
 279.385 +         x="394.81274"
 279.386 +         y="258.79678"
 279.387 +         style="font-family:Courier"><tspan
 279.388 +   style="font-weight:bold"
 279.389 +   id="tspan2917">5</tspan>: 1c34</tspan></text>
 279.390 +    <path
 279.391 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1.00000143px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1"
 279.392 +       d="M 417.85715,291.05004 L 417.85715,266.88929"
 279.393 +       id="path2919"
 279.394 +       inkscape:connector-type="polyline" />
 279.395 +    <text
 279.396 +       xml:space="preserve"
 279.397 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 279.398 +       x="369.61453"
 279.399 +       y="232.25546"
 279.400 +       id="text2925"><tspan
 279.401 +         sodipodi:role="line"
 279.402 +         id="tspan2927"
 279.403 +         x="369.61453"
 279.404 +         y="232.25546">mio-nuovo-hello</tspan></text>
 279.405 +    <text
 279.406 +       xml:space="preserve"
 279.407 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 279.408 +       x="300.54352"
 279.409 +       y="252.12723"
 279.410 +       id="text2933"><tspan
 279.411 +         sodipodi:role="line"
 279.412 +         id="tspan2935"
 279.413 +         x="300.54352"
 279.414 +         y="252.12723"
 279.415 +         style="text-align:center;text-anchor:middle">i cambiamenti più</tspan><tspan
 279.416 +         sodipodi:role="line"
 279.417 +         x="300.54352"
 279.418 +         y="267.12723"
 279.419 +         style="text-align:center;text-anchor:middle"
 279.420 +         id="tspan3132">recenti differiscono</tspan></text>
 279.421 +    <text
 279.422 +       xml:space="preserve"
 279.423 +       style="font-size:12px;font-style:normal;font-weight:normal;text-align:start;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 279.424 +       x="255.15436"
 279.425 +       y="398.37112"
 279.426 +       id="text2929"><tspan
 279.427 +         sodipodi:role="line"
 279.428 +         x="255.15436"
 279.429 +         y="398.37112"
 279.430 +         id="tspan3013"
 279.431 +         style="text-align:start;text-anchor:start">cronologia comune</tspan></text>
 279.432 +    <g
 279.433 +       id="g3107"
 279.434 +       transform="translate(0,0.855744)">
 279.435 +      <path
 279.436 +         id="path3101"
 279.437 +         d="M 300.35713,381.29075 L 300.35713,304.50504"
 279.438 +         style="fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:4, 4;stroke-dashoffset:0;stroke-opacity:1" />
 279.439 +      <path
 279.440 +         id="path3105"
 279.441 +         d="M 291.07142,301.64789 L 309.28571,301.64789"
 279.442 +         style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#bfbfbf;stroke-width:0.60000002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
 279.443 +    </g>
 279.444 +    <path
 279.445 +       style="fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:4, 4;stroke-dashoffset:0;stroke-opacity:1"
 279.446 +       d="M 300.53571,486.38926 L 300.53571,409.60355"
 279.447 +       id="path3113" />
 279.448 +    <path
 279.449 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#bfbfbf;stroke-width:0.60000002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
 279.450 +       d="M 291.25,488.49641 L 309.46429,488.49641"
 279.451 +       id="path3115" />
 279.452 +    <text
 279.453 +       xml:space="preserve"
 279.454 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 279.455 +       x="480.71429"
 279.456 +       y="250.91507"
 279.457 +       id="text1949"><tspan
 279.458 +         sodipodi:role="line"
 279.459 +         id="tspan1951"
 279.460 +         x="480.71429"
 279.461 +         y="250.91507"
 279.462 +         style="text-align:start;text-anchor:start">revisione di testa</tspan><tspan
 279.463 +         sodipodi:role="line"
 279.464 +         x="480.71429"
 279.465 +         y="265.91507"
 279.466 +         id="tspan1953"
 279.467 +         style="text-align:start;text-anchor:start">(non ha figli)</tspan></text>
 279.468 +  </g>
 279.469 +</svg>
   280.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   280.2 +++ b/it/figs/undo-manual-merge.dot	Fri Sep 04 16:33:35 2009 +0200
   280.3 @@ -0,0 +1,8 @@
   280.4 +digraph undo_manual {
   280.5 +	"prima modifica" -> "seconda modifica";
   280.6 +	"seconda modifica" -> "terza modifica";
   280.7 +	backout [label="ritira la\nseconda modifica", shape=box];
   280.8 +	"seconda modifica" -> backout;
   280.9 +	"terza modifica" -> "unione\nmanuale";
  280.10 +	backout -> "unione\nmanuale";
  280.11 +}
   281.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   281.2 +++ b/it/figs/undo-manual.dot	Fri Sep 04 16:33:35 2009 +0200
   281.3 @@ -0,0 +1,6 @@
   281.4 +digraph undo_manual {
   281.5 +	"prima modifica" -> "seconda modifica";
   281.6 +	"seconda modifica" -> "terza modifica";
   281.7 +	backout [label="ritira la\nseconda modifica", shape=box];
   281.8 +	"seconda modifica" -> backout;
   281.9 +}
   282.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   282.2 +++ b/it/figs/undo-non-tip.dot	Fri Sep 04 16:33:35 2009 +0200
   282.3 @@ -0,0 +1,9 @@
   282.4 +digraph undo_non_tip {
   282.5 +	"prima modifica" -> "seconda modifica";
   282.6 +	"seconda modifica" -> "terza modifica";
   282.7 +	backout [label="ritira la\nseconda modifica", shape=box];
   282.8 +	"seconda modifica" -> backout;
   282.9 +	merge [label="unione\nautomatica", shape=box];
  282.10 +	"terza modifica" -> merge;
  282.11 +	backout -> merge;
  282.12 +}
   283.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   283.2 +++ b/it/figs/undo-simple.dot	Fri Sep 04 16:33:35 2009 +0200
   283.3 @@ -0,0 +1,4 @@
   283.4 +digraph undo_simple {
   283.5 +	"prima modifica" -> "seconda modifica";
   283.6 +	"seconda modifica" -> "ritira la\nseconda modifica";
   283.7 +}
   284.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   284.2 +++ b/it/figs/wdir-after-commit.svg	Fri Sep 04 16:33:35 2009 +0200
   284.3 @@ -0,0 +1,394 @@
   284.4 +<?xml version="1.0" encoding="UTF-8" standalone="no"?>
   284.5 +<!-- Created with Inkscape (http://www.inkscape.org/) -->
   284.6 +<svg
   284.7 +   xmlns:dc="http://purl.org/dc/elements/1.1/"
   284.8 +   xmlns:cc="http://web.resource.org/cc/"
   284.9 +   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  284.10 +   xmlns:svg="http://www.w3.org/2000/svg"
  284.11 +   xmlns="http://www.w3.org/2000/svg"
  284.12 +   xmlns:xlink="http://www.w3.org/1999/xlink"
  284.13 +   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
  284.14 +   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
  284.15 +   width="744.09448819"
  284.16 +   height="1052.3622047"
  284.17 +   id="svg5971"
  284.18 +   sodipodi:version="0.32"
  284.19 +   inkscape:version="0.44.1"
  284.20 +   sodipodi:docbase="/home/bos/hg/hgbook/en"
  284.21 +   sodipodi:docname="wdir-after-commit.svg">
  284.22 +  <defs
  284.23 +     id="defs5973">
  284.24 +    <linearGradient
  284.25 +       inkscape:collect="always"
  284.26 +       xlink:href="#linearGradient6049"
  284.27 +       id="linearGradient6445"
  284.28 +       gradientUnits="userSpaceOnUse"
  284.29 +       gradientTransform="matrix(1.000474,0,0,0.790947,-240.246,50.9948)"
  284.30 +       x1="333.91171"
  284.31 +       y1="488.79077"
  284.32 +       x2="508.94543"
  284.33 +       y2="263.79077" />
  284.34 +    <marker
  284.35 +       inkscape:stockid="Arrow1Mstart"
  284.36 +       orient="auto"
  284.37 +       refY="0.0"
  284.38 +       refX="0.0"
  284.39 +       id="Arrow1Mstart"
  284.40 +       style="overflow:visible">
  284.41 +      <path
  284.42 +         id="path4855"
  284.43 +         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
  284.44 +         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
  284.45 +         transform="scale(0.4) translate(10,0)" />
  284.46 +    </marker>
  284.47 +    <linearGradient
  284.48 +       id="linearGradient6049">
  284.49 +      <stop
  284.50 +         style="stop-color:#686868;stop-opacity:1;"
  284.51 +         offset="0"
  284.52 +         id="stop6051" />
  284.53 +      <stop
  284.54 +         style="stop-color:#f0f0f0;stop-opacity:1;"
  284.55 +         offset="1"
  284.56 +         id="stop6053" />
  284.57 +    </linearGradient>
  284.58 +    <marker
  284.59 +       inkscape:stockid="Arrow1Mend"
  284.60 +       orient="auto"
  284.61 +       refY="0.0"
  284.62 +       refX="0.0"
  284.63 +       id="Arrow1Mend"
  284.64 +       style="overflow:visible;">
  284.65 +      <path
  284.66 +         id="path4852"
  284.67 +         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
  284.68 +         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
  284.69 +         transform="scale(0.4) rotate(180) translate(10,0)" />
  284.70 +    </marker>
  284.71 +    <linearGradient
  284.72 +       inkscape:collect="always"
  284.73 +       xlink:href="#linearGradient6049"
  284.74 +       id="linearGradient6083"
  284.75 +       gradientUnits="userSpaceOnUse"
  284.76 +       gradientTransform="translate(-240.0462,-8.633237e-6)"
  284.77 +       x1="333.91171"
  284.78 +       y1="488.79077"
  284.79 +       x2="508.94543"
  284.80 +       y2="263.79077" />
  284.81 +    <linearGradient
  284.82 +       inkscape:collect="always"
  284.83 +       xlink:href="#linearGradient6049"
  284.84 +       id="linearGradient6142"
  284.85 +       gradientUnits="userSpaceOnUse"
  284.86 +       gradientTransform="translate(-42.00893,-30.49544)"
  284.87 +       x1="333.91171"
  284.88 +       y1="488.79077"
  284.89 +       x2="508.94543"
  284.90 +       y2="263.79077" />
  284.91 +    <linearGradient
  284.92 +       inkscape:collect="always"
  284.93 +       xlink:href="#linearGradient6049"
  284.94 +       id="linearGradient6193"
  284.95 +       gradientUnits="userSpaceOnUse"
  284.96 +       gradientTransform="translate(-240.0462,-8.633237e-6)"
  284.97 +       x1="333.91171"
  284.98 +       y1="488.79077"
  284.99 +       x2="508.94543"
 284.100 +       y2="263.79077" />
 284.101 +    <linearGradient
 284.102 +       inkscape:collect="always"
 284.103 +       xlink:href="#linearGradient6049"
 284.104 +       id="linearGradient6216"
 284.105 +       gradientUnits="userSpaceOnUse"
 284.106 +       gradientTransform="translate(-6.0462,-0.664361)"
 284.107 +       x1="333.91171"
 284.108 +       y1="488.79077"
 284.109 +       x2="508.94543"
 284.110 +       y2="263.79077" />
 284.111 +    <linearGradient
 284.112 +       inkscape:collect="always"
 284.113 +       xlink:href="#linearGradient6049"
 284.114 +       id="linearGradient6232"
 284.115 +       gradientUnits="userSpaceOnUse"
 284.116 +       gradientTransform="matrix(1.000474,0,0,0.790947,222.8399,50.85693)"
 284.117 +       x1="333.91171"
 284.118 +       y1="488.79077"
 284.119 +       x2="508.94543"
 284.120 +       y2="263.79077" />
 284.121 +    <linearGradient
 284.122 +       inkscape:collect="always"
 284.123 +       xlink:href="#linearGradient6049"
 284.124 +       id="linearGradient6772"
 284.125 +       gradientUnits="userSpaceOnUse"
 284.126 +       gradientTransform="matrix(1.000474,0,0,0.790947,222.8399,50.85693)"
 284.127 +       x1="333.91171"
 284.128 +       y1="488.79077"
 284.129 +       x2="508.94543"
 284.130 +       y2="263.79077" />
 284.131 +  </defs>
 284.132 +  <sodipodi:namedview
 284.133 +     id="base"
 284.134 +     pagecolor="#ffffff"
 284.135 +     bordercolor="#666666"
 284.136 +     borderopacity="1.0"
 284.137 +     gridtolerance="10000"
 284.138 +     guidetolerance="10"
 284.139 +     objecttolerance="10"
 284.140 +     inkscape:pageopacity="0.0"
 284.141 +     inkscape:pageshadow="2"
 284.142 +     inkscape:zoom="0.90509668"
 284.143 +     inkscape:cx="390.0539"
 284.144 +     inkscape:cy="690.49342"
 284.145 +     inkscape:document-units="px"
 284.146 +     inkscape:current-layer="layer1"
 284.147 +     showguides="true"
 284.148 +     inkscape:guide-bbox="true"
 284.149 +     inkscape:window-width="906"
 284.150 +     inkscape:window-height="620"
 284.151 +     inkscape:window-x="0"
 284.152 +     inkscape:window-y="25">
 284.153 +    <sodipodi:guide
 284.154 +       orientation="vertical"
 284.155 +       position="-1.4285714"
 284.156 +       id="guide6022" />
 284.157 +  </sodipodi:namedview>
 284.158 +  <metadata
 284.159 +     id="metadata5976">
 284.160 +    <rdf:RDF>
 284.161 +      <cc:Work
 284.162 +         rdf:about="">
 284.163 +        <dc:format>image/svg+xml</dc:format>
 284.164 +        <dc:type
 284.165 +           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
 284.166 +      </cc:Work>
 284.167 +    </rdf:RDF>
 284.168 +  </metadata>
 284.169 +  <g
 284.170 +     inkscape:label="Layer 1"
 284.171 +     inkscape:groupmode="layer"
 284.172 +     id="layer1">
 284.173 +    <rect
 284.174 +       y="245.98355"
 284.175 +       x="328.23956"
 284.176 +       height="258.57144"
 284.177 +       width="174.28572"
 284.178 +       id="rect6047"
 284.179 +       style="fill:url(#linearGradient6216);fill-opacity:1;stroke:#686868;stroke-width:0.74800003;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
 284.180 +    <g
 284.181 +       id="g6261"
 284.182 +       transform="translate(234,0)">
 284.183 +      <rect
 284.184 +         y="258.7149"
 284.185 +         x="114.11369"
 284.186 +         height="44.537449"
 284.187 +         width="134.53746"
 284.188 +         id="rect5983"
 284.189 +         style="fill:#b1b1b1;fill-opacity:1;stroke:black;stroke-width:0.7482574;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1.49651474, 0.74825737;stroke-dashoffset:0;stroke-opacity:1" />
 284.190 +      <text
 284.191 +         id="text5985"
 284.192 +         y="284.47562"
 284.193 +         x="138.7962"
 284.194 +         style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 284.195 +         xml:space="preserve"><tspan
 284.196 +           style="font-family:Courier"
 284.197 +           y="284.47562"
 284.198 +           x="138.7962"
 284.199 +           id="tspan5987"
 284.200 +           sodipodi:role="line">dfbbb33f3fa3</tspan></text>
 284.201 +    </g>
 284.202 +    <rect
 284.203 +       style="fill:#d4d4d4;fill-opacity:1;stroke:black;stroke-width:0.7482574;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1.49651474, 0.74825737;stroke-dashoffset:0;stroke-opacity:1"
 284.204 +       id="rect5996"
 284.205 +       width="134.53746"
 284.206 +       height="44.537449"
 284.207 +       x="348.11371"
 284.208 +       y="320.38159" />
 284.209 +    <text
 284.210 +       xml:space="preserve"
 284.211 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 284.212 +       x="372.7962"
 284.213 +       y="346.1423"
 284.214 +       id="text5998"><tspan
 284.215 +         sodipodi:role="line"
 284.216 +         id="tspan6000"
 284.217 +         x="372.7962"
 284.218 +         y="346.1423"
 284.219 +         style="font-family:Courier">e7639888bb2f</tspan></text>
 284.220 +    <rect
 284.221 +       style="fill:#d4d4d4;fill-opacity:1;stroke:black;stroke-width:0.7482574;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1.49651474, 0.74825737;stroke-dashoffset:0;stroke-opacity:1"
 284.222 +       id="rect6004"
 284.223 +       width="134.53746"
 284.224 +       height="44.537449"
 284.225 +       x="348.11371"
 284.226 +       y="382.04825" />
 284.227 +    <text
 284.228 +       xml:space="preserve"
 284.229 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 284.230 +       x="370.65421"
 284.231 +       y="407.80896"
 284.232 +       id="text6006"><tspan
 284.233 +         sodipodi:role="line"
 284.234 +         id="tspan6008"
 284.235 +         x="370.65421"
 284.236 +         y="407.80896"
 284.237 +         style="font-family:Courier">7b064d8bac5e</tspan></text>
 284.238 +    <path
 284.239 +       inkscape:connector-type="polyline"
 284.240 +       id="path6018"
 284.241 +       d="M 415.38242,303.62646 L 415.38242,320.00744"
 284.242 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1" />
 284.243 +    <path
 284.244 +       inkscape:connection-end="#rect6004"
 284.245 +       inkscape:connector-type="polyline"
 284.246 +       id="path6020"
 284.247 +       d="M 415.38242,365.29315 L 415.38243,381.67412"
 284.248 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1" />
 284.249 +    <rect
 284.250 +       style="fill:#ededed;fill-opacity:1;stroke:#797979;stroke-width:0.74800003;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 284.251 +       id="rect6039"
 284.252 +       width="134.53746"
 284.253 +       height="44.537449"
 284.254 +       x="348.11359"
 284.255 +       y="443.71487" />
 284.256 +    <text
 284.257 +       xml:space="preserve"
 284.258 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:#979797;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 284.259 +       x="372.79706"
 284.260 +       y="469.47556"
 284.261 +       id="text6041"><tspan
 284.262 +         sodipodi:role="line"
 284.263 +         id="tspan6043"
 284.264 +         x="372.79706"
 284.265 +         y="469.47556"
 284.266 +         style="fill:#979797;fill-opacity:1;font-family:Courier">000000000000</tspan></text>
 284.267 +    <path
 284.268 +       inkscape:connection-end="#rect6039"
 284.269 +       inkscape:connector-type="polyline"
 284.270 +       id="path6045"
 284.271 +       d="M 415.38238,426.95981 L 415.38235,443.34087"
 284.272 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#686868;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1" />
 284.273 +    <text
 284.274 +       xml:space="preserve"
 284.275 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 284.276 +       x="327.66046"
 284.277 +       y="231.36218"
 284.278 +       id="text6102"><tspan
 284.279 +         sodipodi:role="line"
 284.280 +         id="tspan6104"
 284.281 +         x="327.66046"
 284.282 +         y="231.36218">Cronologia nel repository</tspan></text>
 284.283 +    <rect
 284.284 +       y="245.94225"
 284.285 +       x="557.28418"
 284.286 +       height="204.51619"
 284.287 +       width="174.36833"
 284.288 +       id="rect6140"
 284.289 +       style="fill:url(#linearGradient6232);fill-opacity:1;stroke:#686868;stroke-width:0.66539276;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
 284.290 +    <g
 284.291 +       id="g6130"
 284.292 +       transform="translate(262.3254,24.38544)">
 284.293 +      <rect
 284.294 +         style="fill:#d4d4d4;fill-opacity:1;stroke:black;stroke-width:0.7482574;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1.49651474, 0.74825737;stroke-dashoffset:0;stroke-opacity:1"
 284.295 +         id="rect6106"
 284.296 +         width="134.53746"
 284.297 +         height="44.537449"
 284.298 +         x="314.87415"
 284.299 +         y="257.95059" />
 284.300 +      <text
 284.301 +         xml:space="preserve"
 284.302 +         style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 284.303 +         x="339.55664"
 284.304 +         y="283.7113"
 284.305 +         id="text6108"><tspan
 284.306 +           sodipodi:role="line"
 284.307 +           id="tspan6110"
 284.308 +           x="339.55664"
 284.309 +           y="283.7113"
 284.310 +           style="font-family:Courier">dfbbb33f3fa3</tspan></text>
 284.311 +    </g>
 284.312 +    <g
 284.313 +       id="g6135"
 284.314 +       transform="translate(263.0396,49.83106)">
 284.315 +      <rect
 284.316 +         inkscape:transform-center-y="102.85714"
 284.317 +         inkscape:transform-center-x="129.28571"
 284.318 +         style="fill:#ededed;fill-opacity:1;stroke:#797979;stroke-width:0.74800003;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 284.319 +         id="rect6112"
 284.320 +         width="134.53746"
 284.321 +         height="44.537449"
 284.322 +         x="314.15985"
 284.323 +         y="326.52203" />
 284.324 +      <text
 284.325 +         inkscape:transform-center-y="102.7311"
 284.326 +         inkscape:transform-center-x="128.69672"
 284.327 +         xml:space="preserve"
 284.328 +         style="font-size:12px;font-style:normal;font-weight:normal;fill:#979797;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 284.329 +         x="338.84335"
 284.330 +         y="352.28271"
 284.331 +         id="text6114"><tspan
 284.332 +           sodipodi:role="line"
 284.333 +           id="tspan6116"
 284.334 +           x="338.84335"
 284.335 +           y="352.28271"
 284.336 +           style="fill:#979797;fill-opacity:1;font-family:Courier">000000000000</tspan></text>
 284.337 +    </g>
 284.338 +    <text
 284.339 +       xml:space="preserve"
 284.340 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 284.341 +       x="576.63208"
 284.342 +       y="270.479"
 284.343 +       id="text6118"><tspan
 284.344 +         sodipodi:role="line"
 284.345 +         id="tspan6120"
 284.346 +         x="576.63208"
 284.347 +         y="270.479">Primo genitore</tspan></text>
 284.348 +    <text
 284.349 +       xml:space="preserve"
 284.350 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 284.351 +       x="576.07544"
 284.352 +       y="364.49615"
 284.353 +       id="text6122"><tspan
 284.354 +         sodipodi:role="line"
 284.355 +         id="tspan6124"
 284.356 +         x="576.07544"
 284.357 +         y="364.49615">Secondo genitore</tspan></text>
 284.358 +    <text
 284.359 +       xml:space="preserve"
 284.360 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 284.361 +       x="556.61743"
 284.362 +       y="231.36218"
 284.363 +       id="text6195"><tspan
 284.364 +         sodipodi:role="line"
 284.365 +         id="tspan6197"
 284.366 +         x="556.61743"
 284.367 +         y="231.36218">Genitori della directory di lavoro</tspan></text>
 284.368 +    <path
 284.369 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
 284.370 +       d="M 576.82542,297.63008 L 483.02528,287.95831"
 284.371 +       id="path6266"
 284.372 +       inkscape:connector-type="polyline"
 284.373 +       inkscape:connection-start="#g6130"
 284.374 +       inkscape:connection-end="#g6261" />
 284.375 +    <path
 284.376 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
 284.377 +       d="M 665.12232,418.17579 L 665.12232,418.17579"
 284.378 +       id="path6270"
 284.379 +       inkscape:connector-type="polyline" />
 284.380 +    <text
 284.381 +       xml:space="preserve"
 284.382 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 284.383 +       x="316.86407"
 284.384 +       y="275.6496"
 284.385 +       id="text6573"><tspan
 284.386 +         sodipodi:role="line"
 284.387 +         id="tspan6575"
 284.388 +         x="316.86407"
 284.389 +         y="275.6496"
 284.390 +         style="text-align:end;text-anchor:end">Nuovo</tspan><tspan
 284.391 +         sodipodi:role="line"
 284.392 +         x="316.86407"
 284.393 +         y="290.6496"
 284.394 +         id="tspan6577"
 284.395 +         style="text-align:end;text-anchor:end">changeset</tspan></text>
 284.396 +  </g>
 284.397 +</svg>
   285.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   285.2 +++ b/it/figs/wdir-branch.svg	Fri Sep 04 16:33:35 2009 +0200
   285.3 @@ -0,0 +1,418 @@
   285.4 +<?xml version="1.0" encoding="UTF-8" standalone="no"?>
   285.5 +<!-- Created with Inkscape (http://www.inkscape.org/) -->
   285.6 +<svg
   285.7 +   xmlns:dc="http://purl.org/dc/elements/1.1/"
   285.8 +   xmlns:cc="http://web.resource.org/cc/"
   285.9 +   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  285.10 +   xmlns:svg="http://www.w3.org/2000/svg"
  285.11 +   xmlns="http://www.w3.org/2000/svg"
  285.12 +   xmlns:xlink="http://www.w3.org/1999/xlink"
  285.13 +   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
  285.14 +   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
  285.15 +   width="744.09448819"
  285.16 +   height="1052.3622047"
  285.17 +   id="svg5971"
  285.18 +   sodipodi:version="0.32"
  285.19 +   inkscape:version="0.44.1"
  285.20 +   sodipodi:docbase="/home/bos/hg/hgbook/en"
  285.21 +   sodipodi:docname="wdir-branch.svg">
  285.22 +  <defs
  285.23 +     id="defs5973">
  285.24 +    <marker
  285.25 +       inkscape:stockid="Arrow1Mstart"
  285.26 +       orient="auto"
  285.27 +       refY="0.0"
  285.28 +       refX="0.0"
  285.29 +       id="Arrow1Mstart"
  285.30 +       style="overflow:visible">
  285.31 +      <path
  285.32 +         id="path4855"
  285.33 +         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
  285.34 +         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
  285.35 +         transform="scale(0.4) translate(10,0)" />
  285.36 +    </marker>
  285.37 +    <linearGradient
  285.38 +       id="linearGradient6049">
  285.39 +      <stop
  285.40 +         style="stop-color:#686868;stop-opacity:1;"
  285.41 +         offset="0"
  285.42 +         id="stop6051" />
  285.43 +      <stop
  285.44 +         style="stop-color:#f0f0f0;stop-opacity:1;"
  285.45 +         offset="1"
  285.46 +         id="stop6053" />
  285.47 +    </linearGradient>
  285.48 +    <marker
  285.49 +       inkscape:stockid="Arrow1Mend"
  285.50 +       orient="auto"
  285.51 +       refY="0.0"
  285.52 +       refX="0.0"
  285.53 +       id="Arrow1Mend"
  285.54 +       style="overflow:visible;">
  285.55 +      <path
  285.56 +         id="path4852"
  285.57 +         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
  285.58 +         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
  285.59 +         transform="scale(0.4) rotate(180) translate(10,0)" />
  285.60 +    </marker>
  285.61 +    <linearGradient
  285.62 +       inkscape:collect="always"
  285.63 +       xlink:href="#linearGradient6049"
  285.64 +       id="linearGradient6083"
  285.65 +       gradientUnits="userSpaceOnUse"
  285.66 +       gradientTransform="translate(-240.0462,-8.633237e-6)"
  285.67 +       x1="333.91171"
  285.68 +       y1="488.79077"
  285.69 +       x2="508.94543"
  285.70 +       y2="263.79077" />
  285.71 +    <linearGradient
  285.72 +       inkscape:collect="always"
  285.73 +       xlink:href="#linearGradient6049"
  285.74 +       id="linearGradient6142"
  285.75 +       gradientUnits="userSpaceOnUse"
  285.76 +       gradientTransform="translate(-42.00893,-30.49544)"
  285.77 +       x1="333.91171"
  285.78 +       y1="488.79077"
  285.79 +       x2="508.94543"
  285.80 +       y2="263.79077" />
  285.81 +    <linearGradient
  285.82 +       inkscape:collect="always"
  285.83 +       xlink:href="#linearGradient6049"
  285.84 +       id="linearGradient6193"
  285.85 +       gradientUnits="userSpaceOnUse"
  285.86 +       gradientTransform="translate(-240.0462,-8.633237e-6)"
  285.87 +       x1="333.91171"
  285.88 +       y1="488.79077"
  285.89 +       x2="508.94543"
  285.90 +       y2="263.79077" />
  285.91 +    <linearGradient
  285.92 +       inkscape:collect="always"
  285.93 +       xlink:href="#linearGradient6049"
  285.94 +       id="linearGradient6216"
  285.95 +       gradientUnits="userSpaceOnUse"
  285.96 +       gradientTransform="matrix(1.000474,0,0,0.790947,-240.246,50.9948)"
  285.97 +       x1="333.91171"
  285.98 +       y1="488.79077"
  285.99 +       x2="508.94543"
 285.100 +       y2="263.79077" />
 285.101 +    <linearGradient
 285.102 +       inkscape:collect="always"
 285.103 +       xlink:href="#linearGradient6049"
 285.104 +       id="linearGradient6232"
 285.105 +       gradientUnits="userSpaceOnUse"
 285.106 +       gradientTransform="matrix(1.000473,0,0,0.790947,-11.16012,50.85693)"
 285.107 +       x1="333.91171"
 285.108 +       y1="488.79077"
 285.109 +       x2="508.94543"
 285.110 +       y2="263.79077" />
 285.111 +    <linearGradient
 285.112 +       inkscape:collect="always"
 285.113 +       xlink:href="#linearGradient6049"
 285.114 +       id="linearGradient6445"
 285.115 +       gradientUnits="userSpaceOnUse"
 285.116 +       gradientTransform="matrix(1.000474,0,0,0.790947,-240.246,50.9948)"
 285.117 +       x1="333.91171"
 285.118 +       y1="488.79077"
 285.119 +       x2="508.94543"
 285.120 +       y2="263.79077" />
 285.121 +    <linearGradient
 285.122 +       inkscape:collect="always"
 285.123 +       xlink:href="#linearGradient6049"
 285.124 +       id="linearGradient6974"
 285.125 +       gradientUnits="userSpaceOnUse"
 285.126 +       gradientTransform="matrix(1.911882,0,0,0.789965,-574.7896,51.22599)"
 285.127 +       x1="333.91171"
 285.128 +       y1="488.79077"
 285.129 +       x2="508.94543"
 285.130 +       y2="263.79077" />
 285.131 +    <linearGradient
 285.132 +       inkscape:collect="always"
 285.133 +       xlink:href="#linearGradient6049"
 285.134 +       id="linearGradient6996"
 285.135 +       gradientUnits="userSpaceOnUse"
 285.136 +       gradientTransform="matrix(1.000473,0,0,0.790947,112.8399,50.85693)"
 285.137 +       x1="333.91171"
 285.138 +       y1="488.79077"
 285.139 +       x2="508.94543"
 285.140 +       y2="263.79077" />
 285.141 +  </defs>
 285.142 +  <sodipodi:namedview
 285.143 +     id="base"
 285.144 +     pagecolor="#ffffff"
 285.145 +     bordercolor="#666666"
 285.146 +     borderopacity="1.0"
 285.147 +     gridtolerance="10000"
 285.148 +     guidetolerance="10"
 285.149 +     objecttolerance="10"
 285.150 +     inkscape:pageopacity="0.0"
 285.151 +     inkscape:pageshadow="2"
 285.152 +     inkscape:zoom="0.90509668"
 285.153 +     inkscape:cx="345.85973"
 285.154 +     inkscape:cy="690.49342"
 285.155 +     inkscape:document-units="px"
 285.156 +     inkscape:current-layer="layer1"
 285.157 +     showguides="true"
 285.158 +     inkscape:guide-bbox="true"
 285.159 +     inkscape:window-width="906"
 285.160 +     inkscape:window-height="620"
 285.161 +     inkscape:window-x="0"
 285.162 +     inkscape:window-y="25">
 285.163 +    <sodipodi:guide
 285.164 +       orientation="vertical"
 285.165 +       position="-1.4285714"
 285.166 +       id="guide6022" />
 285.167 +  </sodipodi:namedview>
 285.168 +  <metadata
 285.169 +     id="metadata5976">
 285.170 +    <rdf:RDF>
 285.171 +      <cc:Work
 285.172 +         rdf:about="">
 285.173 +        <dc:format>image/svg+xml</dc:format>
 285.174 +        <dc:type
 285.175 +           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
 285.176 +      </cc:Work>
 285.177 +    </rdf:RDF>
 285.178 +  </metadata>
 285.179 +  <g
 285.180 +     inkscape:label="Layer 1"
 285.181 +     inkscape:groupmode="layer"
 285.182 +     id="layer1">
 285.183 +    <rect
 285.184 +       y="246.06918"
 285.185 +       x="64.325172"
 285.186 +       height="204.26233"
 285.187 +       width="333.2135"
 285.188 +       id="rect6047"
 285.189 +       style="fill:url(#linearGradient6974);fill-opacity:1;stroke:#686868;stroke-width:0.91925466;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
 285.190 +    <g
 285.191 +       id="g1935">
 285.192 +      <rect
 285.193 +         y="266.24374"
 285.194 +         x="84.113708"
 285.195 +         height="44.537449"
 285.196 +         width="134.53746"
 285.197 +         id="rect5996"
 285.198 +         style="fill:#d4d4d4;fill-opacity:1;stroke:black;stroke-width:0.7482574;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1.49651474, 0.74825737;stroke-dashoffset:0;stroke-opacity:1" />
 285.199 +      <text
 285.200 +         id="text5998"
 285.201 +         y="292.00446"
 285.202 +         x="108.7962"
 285.203 +         style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 285.204 +         xml:space="preserve"><tspan
 285.205 +           style="font-family:Courier"
 285.206 +           y="292.00446"
 285.207 +           x="108.7962"
 285.208 +           id="tspan6000"
 285.209 +           sodipodi:role="line">e7639888bb2f</tspan></text>
 285.210 +    </g>
 285.211 +    <g
 285.212 +       id="g6976"
 285.213 +       transform="translate(70,0)">
 285.214 +      <rect
 285.215 +         y="327.9104"
 285.216 +         x="40.113693"
 285.217 +         height="44.537449"
 285.218 +         width="134.53746"
 285.219 +         id="rect6004"
 285.220 +         style="fill:#d4d4d4;fill-opacity:1;stroke:black;stroke-width:0.7482574;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1.49651474, 0.74825737;stroke-dashoffset:0;stroke-opacity:1" />
 285.221 +      <text
 285.222 +         id="text6006"
 285.223 +         y="353.67111"
 285.224 +         x="62.654205"
 285.225 +         style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 285.226 +         xml:space="preserve"><tspan
 285.227 +           style="font-family:Courier"
 285.228 +           y="353.67111"
 285.229 +           x="62.654205"
 285.230 +           id="tspan6008"
 285.231 +           sodipodi:role="line">7b064d8bac5e</tspan></text>
 285.232 +    </g>
 285.233 +    <path
 285.234 +       inkscape:connector-type="polyline"
 285.235 +       id="path6020"
 285.236 +       d="M 160.92915,311.15532 L 167.83571,327.53627"
 285.237 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1;display:inline"
 285.238 +       inkscape:connection-end="#g6976"
 285.239 +       inkscape:connection-start="#g1935" />
 285.240 +    <rect
 285.241 +       style="fill:#ededed;fill-opacity:1;stroke:#797979;stroke-width:0.74800003;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 285.242 +       id="rect6039"
 285.243 +       width="134.53746"
 285.244 +       height="44.537449"
 285.245 +       x="110.11359"
 285.246 +       y="389.57703" />
 285.247 +    <text
 285.248 +       xml:space="preserve"
 285.249 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:#979797;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 285.250 +       x="134.79706"
 285.251 +       y="415.33771"
 285.252 +       id="text6041"><tspan
 285.253 +         sodipodi:role="line"
 285.254 +         id="tspan6043"
 285.255 +         x="134.79706"
 285.256 +         y="415.33771"
 285.257 +         style="fill:#979797;fill-opacity:1;font-family:Courier">000000000000</tspan></text>
 285.258 +    <path
 285.259 +       inkscape:connection-end="#rect6039"
 285.260 +       inkscape:connector-type="polyline"
 285.261 +       id="path6045"
 285.262 +       d="M 177.38238,372.82195 L 177.38235,389.20303"
 285.263 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#686868;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1" />
 285.264 +    <rect
 285.265 +       y="245.94225"
 285.266 +       x="447.28412"
 285.267 +       height="204.51619"
 285.268 +       width="174.36833"
 285.269 +       id="rect6140"
 285.270 +       style="fill:url(#linearGradient6996);fill-opacity:1;stroke:#686868;stroke-width:0.66539276;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
 285.271 +    <g
 285.272 +       id="g6130"
 285.273 +       transform="translate(152.3254,24.38544)">
 285.274 +      <rect
 285.275 +         style="fill:#d4d4d4;fill-opacity:1;stroke:black;stroke-width:0.7482574;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1.49651474, 0.74825737;stroke-dashoffset:0;stroke-opacity:1"
 285.276 +         id="rect6106"
 285.277 +         width="134.53746"
 285.278 +         height="44.537449"
 285.279 +         x="314.87415"
 285.280 +         y="257.95059" />
 285.281 +      <text
 285.282 +         xml:space="preserve"
 285.283 +         style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 285.284 +         x="339.55664"
 285.285 +         y="283.7113"
 285.286 +         id="text6108"><tspan
 285.287 +           sodipodi:role="line"
 285.288 +           id="tspan6110"
 285.289 +           x="339.55664"
 285.290 +           y="283.7113"
 285.291 +           style="font-family:Courier">ffb20e1701ea</tspan></text>
 285.292 +    </g>
 285.293 +    <g
 285.294 +       id="g6135"
 285.295 +       transform="translate(153.0396,49.83106)">
 285.296 +      <rect
 285.297 +         inkscape:transform-center-y="102.85714"
 285.298 +         inkscape:transform-center-x="129.28571"
 285.299 +         style="fill:#ededed;fill-opacity:1;stroke:#797979;stroke-width:0.74800003;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 285.300 +         id="rect6112"
 285.301 +         width="134.53746"
 285.302 +         height="44.537449"
 285.303 +         x="314.15985"
 285.304 +         y="326.52203" />
 285.305 +      <text
 285.306 +         inkscape:transform-center-y="102.7311"
 285.307 +         inkscape:transform-center-x="128.69672"
 285.308 +         xml:space="preserve"
 285.309 +         style="font-size:12px;font-style:normal;font-weight:normal;fill:#979797;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 285.310 +         x="338.84335"
 285.311 +         y="352.28271"
 285.312 +         id="text6114"><tspan
 285.313 +           sodipodi:role="line"
 285.314 +           id="tspan6116"
 285.315 +           x="338.84335"
 285.316 +           y="352.28271"
 285.317 +           style="fill:#979797;fill-opacity:1;font-family:Courier">000000000000</tspan></text>
 285.318 +    </g>
 285.319 +    <text
 285.320 +       xml:space="preserve"
 285.321 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 285.322 +       x="466.63208"
 285.323 +       y="270.479"
 285.324 +       id="text6118"><tspan
 285.325 +         sodipodi:role="line"
 285.326 +         id="tspan6120"
 285.327 +         x="466.63208"
 285.328 +         y="270.479">Primo genitore</tspan></text>
 285.329 +    <text
 285.330 +       xml:space="preserve"
 285.331 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 285.332 +       x="466.07544"
 285.333 +       y="364.49615"
 285.334 +       id="text6122"><tspan
 285.335 +         sodipodi:role="line"
 285.336 +         id="tspan6124"
 285.337 +         x="466.07544"
 285.338 +         y="364.49615">Secondo genitore</tspan></text>
 285.339 +    <text
 285.340 +       xml:space="preserve"
 285.341 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 285.342 +       x="446.61743"
 285.343 +       y="231.36218"
 285.344 +       id="text6195"><tspan
 285.345 +         sodipodi:role="line"
 285.346 +         id="tspan6197"
 285.347 +         x="446.61743"
 285.348 +         y="231.36218">Genitori della directory di lavoro</tspan></text>
 285.349 +    <path
 285.350 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
 285.351 +       d="M 466.82542,300.21999 L 377.00207,294.39744"
 285.352 +       id="path6266"
 285.353 +       inkscape:connector-type="polyline"
 285.354 +       inkscape:connection-start="#g6130"
 285.355 +       inkscape:connection-end="#rect1925" />
 285.356 +    <path
 285.357 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
 285.358 +       d="M 665.12232,418.17579 L 665.12232,418.17579"
 285.359 +       id="path6270"
 285.360 +       inkscape:connector-type="polyline" />
 285.361 +    <g
 285.362 +       id="g2845">
 285.363 +      <rect
 285.364 +         y="266.24374"
 285.365 +         x="242.09048"
 285.366 +         height="44.537449"
 285.367 +         width="134.53746"
 285.368 +         id="rect1925"
 285.369 +         style="fill:#9f9f9f;fill-opacity:1;stroke:black;stroke-width:0.7482574;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1.49651474, 0.74825737;stroke-dashoffset:0;stroke-opacity:1" />
 285.370 +      <text
 285.371 +         id="text1927"
 285.372 +         y="292.00446"
 285.373 +         x="266.77298"
 285.374 +         style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 285.375 +         xml:space="preserve"><tspan
 285.376 +           style="font-family:Courier"
 285.377 +           y="292.00446"
 285.378 +           x="266.77298"
 285.379 +           id="tspan1929"
 285.380 +           sodipodi:role="line">ffb20e1701ea</tspan></text>
 285.381 +    </g>
 285.382 +    <path
 285.383 +       inkscape:connector-type="polyline"
 285.384 +       id="path1933"
 285.385 +       d="M 260.89978,311.15532 L 225.84185,327.53627"
 285.386 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1;display:inline"
 285.387 +       inkscape:connection-end="#g6976" />
 285.388 +    <text
 285.389 +       xml:space="preserve"
 285.390 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 285.391 +       x="109.45568"
 285.392 +       y="231.4554"
 285.393 +       id="text2837"><tspan
 285.394 +         sodipodi:role="line"
 285.395 +         id="tspan2839"
 285.396 +         x="109.45568"
 285.397 +         y="231.4554">Testa preesistente</tspan></text>
 285.398 +    <text
 285.399 +       xml:space="preserve"
 285.400 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 285.401 +       x="237.54184"
 285.402 +       y="231.4554"
 285.403 +       id="text2841"><tspan
 285.404 +         sodipodi:role="line"
 285.405 +         id="tspan2843"
 285.406 +         x="237.54184"
 285.407 +         y="231.4554">Testa appena creata (e punta)</tspan></text>
 285.408 +    <path
 285.409 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
 285.410 +       d="M 148.05048,235.87482 L 149.94915,265.86962"
 285.411 +       id="path2850"
 285.412 +       inkscape:connector-type="polyline"
 285.413 +       inkscape:connection-end="#g1935" />
 285.414 +    <path
 285.415 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
 285.416 +       d="M 303.83495,238.08453 L 306.87874,265.86962"
 285.417 +       id="path2852"
 285.418 +       inkscape:connector-type="polyline"
 285.419 +       inkscape:connection-end="#g2845" />
 285.420 +  </g>
 285.421 +</svg>
   286.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   286.2 +++ b/it/figs/wdir-merge.svg	Fri Sep 04 16:33:35 2009 +0200
   286.3 @@ -0,0 +1,425 @@
   286.4 +<?xml version="1.0" encoding="UTF-8" standalone="no"?>
   286.5 +<!-- Created with Inkscape (http://www.inkscape.org/) -->
   286.6 +<svg
   286.7 +   xmlns:dc="http://purl.org/dc/elements/1.1/"
   286.8 +   xmlns:cc="http://web.resource.org/cc/"
   286.9 +   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  286.10 +   xmlns:svg="http://www.w3.org/2000/svg"
  286.11 +   xmlns="http://www.w3.org/2000/svg"
  286.12 +   xmlns:xlink="http://www.w3.org/1999/xlink"
  286.13 +   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
  286.14 +   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
  286.15 +   width="744.09448819"
  286.16 +   height="1052.3622047"
  286.17 +   id="svg5971"
  286.18 +   sodipodi:version="0.32"
  286.19 +   inkscape:version="0.44.1"
  286.20 +   sodipodi:docbase="/home/bos/hg/hgbook/en"
  286.21 +   sodipodi:docname="wdir-merge.svg">
  286.22 +  <defs
  286.23 +     id="defs5973">
  286.24 +    <marker
  286.25 +       inkscape:stockid="Arrow1Mstart"
  286.26 +       orient="auto"
  286.27 +       refY="0.0"
  286.28 +       refX="0.0"
  286.29 +       id="Arrow1Mstart"
  286.30 +       style="overflow:visible">
  286.31 +      <path
  286.32 +         id="path4855"
  286.33 +         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
  286.34 +         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
  286.35 +         transform="scale(0.4) translate(10,0)" />
  286.36 +    </marker>
  286.37 +    <linearGradient
  286.38 +       id="linearGradient6049">
  286.39 +      <stop
  286.40 +         style="stop-color:#686868;stop-opacity:1;"
  286.41 +         offset="0"
  286.42 +         id="stop6051" />
  286.43 +      <stop
  286.44 +         style="stop-color:#f0f0f0;stop-opacity:1;"
  286.45 +         offset="1"
  286.46 +         id="stop6053" />
  286.47 +    </linearGradient>
  286.48 +    <marker
  286.49 +       inkscape:stockid="Arrow1Mend"
  286.50 +       orient="auto"
  286.51 +       refY="0.0"
  286.52 +       refX="0.0"
  286.53 +       id="Arrow1Mend"
  286.54 +       style="overflow:visible;">
  286.55 +      <path
  286.56 +         id="path4852"
  286.57 +         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
  286.58 +         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
  286.59 +         transform="scale(0.4) rotate(180) translate(10,0)" />
  286.60 +    </marker>
  286.61 +    <linearGradient
  286.62 +       inkscape:collect="always"
  286.63 +       xlink:href="#linearGradient6049"
  286.64 +       id="linearGradient6083"
  286.65 +       gradientUnits="userSpaceOnUse"
  286.66 +       gradientTransform="translate(-240.0462,-8.633237e-6)"
  286.67 +       x1="333.91171"
  286.68 +       y1="488.79077"
  286.69 +       x2="508.94543"
  286.70 +       y2="263.79077" />
  286.71 +    <linearGradient
  286.72 +       inkscape:collect="always"
  286.73 +       xlink:href="#linearGradient6049"
  286.74 +       id="linearGradient6142"
  286.75 +       gradientUnits="userSpaceOnUse"
  286.76 +       gradientTransform="translate(-42.00893,-30.49544)"
  286.77 +       x1="333.91171"
  286.78 +       y1="488.79077"
  286.79 +       x2="508.94543"
  286.80 +       y2="263.79077" />
  286.81 +    <linearGradient
  286.82 +       inkscape:collect="always"
  286.83 +       xlink:href="#linearGradient6049"
  286.84 +       id="linearGradient6193"
  286.85 +       gradientUnits="userSpaceOnUse"
  286.86 +       gradientTransform="translate(-240.0462,-8.633237e-6)"
  286.87 +       x1="333.91171"
  286.88 +       y1="488.79077"
  286.89 +       x2="508.94543"
  286.90 +       y2="263.79077" />
  286.91 +    <linearGradient
  286.92 +       inkscape:collect="always"
  286.93 +       xlink:href="#linearGradient6049"
  286.94 +       id="linearGradient6216"
  286.95 +       gradientUnits="userSpaceOnUse"
  286.96 +       gradientTransform="matrix(1.000474,0,0,0.790947,-240.246,50.9948)"
  286.97 +       x1="333.91171"
  286.98 +       y1="488.79077"
  286.99 +       x2="508.94543"
 286.100 +       y2="263.79077" />
 286.101 +    <linearGradient
 286.102 +       inkscape:collect="always"
 286.103 +       xlink:href="#linearGradient6049"
 286.104 +       id="linearGradient6232"
 286.105 +       gradientUnits="userSpaceOnUse"
 286.106 +       gradientTransform="matrix(1.000473,0,0,0.790947,-11.16012,50.85693)"
 286.107 +       x1="333.91171"
 286.108 +       y1="488.79077"
 286.109 +       x2="508.94543"
 286.110 +       y2="263.79077" />
 286.111 +    <linearGradient
 286.112 +       inkscape:collect="always"
 286.113 +       xlink:href="#linearGradient6049"
 286.114 +       id="linearGradient6445"
 286.115 +       gradientUnits="userSpaceOnUse"
 286.116 +       gradientTransform="matrix(1.000474,0,0,0.790947,-240.246,50.9948)"
 286.117 +       x1="333.91171"
 286.118 +       y1="488.79077"
 286.119 +       x2="508.94543"
 286.120 +       y2="263.79077" />
 286.121 +    <linearGradient
 286.122 +       inkscape:collect="always"
 286.123 +       xlink:href="#linearGradient6049"
 286.124 +       id="linearGradient6974"
 286.125 +       gradientUnits="userSpaceOnUse"
 286.126 +       gradientTransform="matrix(1.911882,0,0,0.789965,-574.7896,51.22599)"
 286.127 +       x1="333.91171"
 286.128 +       y1="488.79077"
 286.129 +       x2="508.94543"
 286.130 +       y2="263.79077" />
 286.131 +    <linearGradient
 286.132 +       inkscape:collect="always"
 286.133 +       xlink:href="#linearGradient6049"
 286.134 +       id="linearGradient6996"
 286.135 +       gradientUnits="userSpaceOnUse"
 286.136 +       gradientTransform="matrix(1.000473,0,0,0.790947,112.8399,50.85693)"
 286.137 +       x1="333.91171"
 286.138 +       y1="488.79077"
 286.139 +       x2="508.94543"
 286.140 +       y2="263.79077" />
 286.141 +  </defs>
 286.142 +  <sodipodi:namedview
 286.143 +     id="base"
 286.144 +     pagecolor="#ffffff"
 286.145 +     bordercolor="#666666"
 286.146 +     borderopacity="1.0"
 286.147 +     gridtolerance="10000"
 286.148 +     guidetolerance="10"
 286.149 +     objecttolerance="10"
 286.150 +     inkscape:pageopacity="0.0"
 286.151 +     inkscape:pageshadow="2"
 286.152 +     inkscape:zoom="1.28"
 286.153 +     inkscape:cx="345.85973"
 286.154 +     inkscape:cy="690.49342"
 286.155 +     inkscape:document-units="px"
 286.156 +     inkscape:current-layer="layer1"
 286.157 +     showguides="true"
 286.158 +     inkscape:guide-bbox="true"
 286.159 +     inkscape:window-width="906"
 286.160 +     inkscape:window-height="620"
 286.161 +     inkscape:window-x="0"
 286.162 +     inkscape:window-y="25">
 286.163 +    <sodipodi:guide
 286.164 +       orientation="vertical"
 286.165 +       position="-1.4285714"
 286.166 +       id="guide6022" />
 286.167 +  </sodipodi:namedview>
 286.168 +  <metadata
 286.169 +     id="metadata5976">
 286.170 +    <rdf:RDF>
 286.171 +      <cc:Work
 286.172 +         rdf:about="">
 286.173 +        <dc:format>image/svg+xml</dc:format>
 286.174 +        <dc:type
 286.175 +           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
 286.176 +      </cc:Work>
 286.177 +    </rdf:RDF>
 286.178 +  </metadata>
 286.179 +  <g
 286.180 +     inkscape:label="Layer 1"
 286.181 +     inkscape:groupmode="layer"
 286.182 +     id="layer1">
 286.183 +    <rect
 286.184 +       y="246.06918"
 286.185 +       x="64.325172"
 286.186 +       height="204.26233"
 286.187 +       width="333.2135"
 286.188 +       id="rect6047"
 286.189 +       style="fill:url(#linearGradient6974);fill-opacity:1;stroke:#686868;stroke-width:0.91925466;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
 286.190 +    <g
 286.191 +       id="g6976"
 286.192 +       transform="translate(70,0)">
 286.193 +      <rect
 286.194 +         y="327.9104"
 286.195 +         x="40.113693"
 286.196 +         height="44.537449"
 286.197 +         width="134.53746"
 286.198 +         id="rect6004"
 286.199 +         style="fill:#d4d4d4;fill-opacity:1;stroke:black;stroke-width:0.7482574;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1.49651474, 0.74825737;stroke-dashoffset:0;stroke-opacity:1" />
 286.200 +      <text
 286.201 +         id="text6006"
 286.202 +         y="353.67111"
 286.203 +         x="62.654205"
 286.204 +         style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 286.205 +         xml:space="preserve"><tspan
 286.206 +           style="font-family:Courier"
 286.207 +           y="353.67111"
 286.208 +           x="62.654205"
 286.209 +           id="tspan6008"
 286.210 +           sodipodi:role="line">7b064d8bac5e</tspan></text>
 286.211 +    </g>
 286.212 +    <path
 286.213 +       inkscape:connector-type="polyline"
 286.214 +       id="path6020"
 286.215 +       d="M 160.92915,311.15532 L 167.83571,327.53627"
 286.216 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1;display:inline"
 286.217 +       inkscape:connection-end="#g6976"
 286.218 +       inkscape:connection-start="#g1935" />
 286.219 +    <rect
 286.220 +       style="fill:#ededed;fill-opacity:1;stroke:#797979;stroke-width:0.74800003;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 286.221 +       id="rect6039"
 286.222 +       width="134.53746"
 286.223 +       height="44.537449"
 286.224 +       x="110.11359"
 286.225 +       y="389.57703" />
 286.226 +    <text
 286.227 +       xml:space="preserve"
 286.228 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:#979797;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 286.229 +       x="134.79706"
 286.230 +       y="415.33771"
 286.231 +       id="text6041"><tspan
 286.232 +         sodipodi:role="line"
 286.233 +         id="tspan6043"
 286.234 +         x="134.79706"
 286.235 +         y="415.33771"
 286.236 +         style="fill:#979797;fill-opacity:1;font-family:Courier">000000000000</tspan></text>
 286.237 +    <path
 286.238 +       inkscape:connection-end="#rect6039"
 286.239 +       inkscape:connector-type="polyline"
 286.240 +       id="path6045"
 286.241 +       d="M 177.38238,372.82195 L 177.38235,389.20303"
 286.242 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#686868;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1" />
 286.243 +    <rect
 286.244 +       y="245.94225"
 286.245 +       x="447.28412"
 286.246 +       height="204.51619"
 286.247 +       width="174.36833"
 286.248 +       id="rect6140"
 286.249 +       style="fill:url(#linearGradient6996);fill-opacity:1;stroke:#686868;stroke-width:0.66539276;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
 286.250 +    <g
 286.251 +       id="g6130"
 286.252 +       transform="translate(152.3254,24.38544)">
 286.253 +      <rect
 286.254 +         style="fill:#d4d4d4;fill-opacity:1;stroke:black;stroke-width:0.7482574;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1.49651474, 0.74825737;stroke-dashoffset:0;stroke-opacity:1"
 286.255 +         id="rect6106"
 286.256 +         width="134.53746"
 286.257 +         height="44.537449"
 286.258 +         x="314.87415"
 286.259 +         y="257.95059" />
 286.260 +      <text
 286.261 +         xml:space="preserve"
 286.262 +         style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 286.263 +         x="339.55664"
 286.264 +         y="283.7113"
 286.265 +         id="text6108"><tspan
 286.266 +           sodipodi:role="line"
 286.267 +           id="tspan6110"
 286.268 +           x="339.55664"
 286.269 +           y="283.7113"
 286.270 +           style="font-family:Courier">ffb20e1701ea</tspan></text>
 286.271 +    </g>
 286.272 +    <g
 286.273 +       id="g6135"
 286.274 +       transform="translate(153.0396,49.83106)">
 286.275 +      <rect
 286.276 +         inkscape:transform-center-y="102.85714"
 286.277 +         inkscape:transform-center-x="129.28571"
 286.278 +         style="fill:#d4d4d4;fill-opacity:1;stroke:#797979;stroke-width:0.74800003;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 286.279 +         id="rect6112"
 286.280 +         width="134.53746"
 286.281 +         height="44.537449"
 286.282 +         x="314.15985"
 286.283 +         y="326.52203" />
 286.284 +      <text
 286.285 +         inkscape:transform-center-y="102.7311"
 286.286 +         inkscape:transform-center-x="128.69672"
 286.287 +         xml:space="preserve"
 286.288 +         style="font-size:12px;font-style:normal;font-weight:normal;fill:#979797;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 286.289 +         x="338.84335"
 286.290 +         y="352.28271"
 286.291 +         id="text6114"><tspan
 286.292 +           sodipodi:role="line"
 286.293 +           id="tspan6116"
 286.294 +           x="338.84335"
 286.295 +           y="352.28271"
 286.296 +           style="fill:black;fill-opacity:1;font-family:Courier">e7639888bb2f</tspan></text>
 286.297 +    </g>
 286.298 +    <text
 286.299 +       xml:space="preserve"
 286.300 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 286.301 +       x="466.63208"
 286.302 +       y="270.479"
 286.303 +       id="text6118"><tspan
 286.304 +         sodipodi:role="line"
 286.305 +         id="tspan6120"
 286.306 +         x="466.63208"
 286.307 +         y="270.479">Primo genitore (invariato)</tspan></text>
 286.308 +    <text
 286.309 +       xml:space="preserve"
 286.310 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 286.311 +       x="466.07544"
 286.312 +       y="364.49615"
 286.313 +       id="text6122"><tspan
 286.314 +         sodipodi:role="line"
 286.315 +         id="tspan6124"
 286.316 +         x="466.07544"
 286.317 +         y="364.49615">Secondo genitore</tspan></text>
 286.318 +    <text
 286.319 +       xml:space="preserve"
 286.320 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 286.321 +       x="446.61743"
 286.322 +       y="231.36218"
 286.323 +       id="text6195"><tspan
 286.324 +         sodipodi:role="line"
 286.325 +         id="tspan6197"
 286.326 +         x="446.61743"
 286.327 +         y="231.36218">Genitori della directory di lavoro</tspan></text>
 286.328 +    <path
 286.329 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
 286.330 +       d="M 466.82542,300.21999 L 377.00207,294.39744"
 286.331 +       id="path6266"
 286.332 +       inkscape:connector-type="polyline"
 286.333 +       inkscape:connection-start="#g6130"
 286.334 +       inkscape:connection-end="#rect1925" />
 286.335 +    <path
 286.336 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
 286.337 +       d="M 665.12232,418.17579 L 665.12232,418.17579"
 286.338 +       id="path6270"
 286.339 +       inkscape:connector-type="polyline" />
 286.340 +    <g
 286.341 +       id="g2845">
 286.342 +      <rect
 286.343 +         y="266.24374"
 286.344 +         x="242.09048"
 286.345 +         height="44.537449"
 286.346 +         width="134.53746"
 286.347 +         id="rect1925"
 286.348 +         style="fill:#9f9f9f;fill-opacity:1;stroke:black;stroke-width:0.7482574;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1.49651474, 0.74825737;stroke-dashoffset:0;stroke-opacity:1" />
 286.349 +      <text
 286.350 +         id="text1927"
 286.351 +         y="292.00446"
 286.352 +         x="266.77298"
 286.353 +         style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 286.354 +         xml:space="preserve"><tspan
 286.355 +           style="font-family:Courier"
 286.356 +           y="292.00446"
 286.357 +           x="266.77298"
 286.358 +           id="tspan1929"
 286.359 +           sodipodi:role="line">ffb20e1701ea</tspan></text>
 286.360 +    </g>
 286.361 +    <path
 286.362 +       inkscape:connector-type="polyline"
 286.363 +       id="path1933"
 286.364 +       d="M 260.89978,311.15532 L 225.84185,327.53627"
 286.365 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1;display:inline"
 286.366 +       inkscape:connection-end="#g6976" />
 286.367 +    <text
 286.368 +       xml:space="preserve"
 286.369 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 286.370 +       x="109.45568"
 286.371 +       y="231.4554"
 286.372 +       id="text2837"><tspan
 286.373 +         sodipodi:role="line"
 286.374 +         id="tspan2839"
 286.375 +         x="109.45568"
 286.376 +         y="231.4554">Testa preesistente</tspan></text>
 286.377 +    <text
 286.378 +       xml:space="preserve"
 286.379 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 286.380 +       x="237.54184"
 286.381 +       y="231.4554"
 286.382 +       id="text2841"><tspan
 286.383 +         sodipodi:role="line"
 286.384 +         id="tspan2843"
 286.385 +         x="237.54184"
 286.386 +         y="231.4554">Testa appena creata (e punta)</tspan></text>
 286.387 +    <path
 286.388 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
 286.389 +       d="M 148.05048,235.87482 L 149.94915,265.86962"
 286.390 +       id="path2850"
 286.391 +       inkscape:connector-type="polyline"
 286.392 +       inkscape:connection-end="#g1935" />
 286.393 +    <path
 286.394 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
 286.395 +       d="M 303.83495,238.08453 L 306.87874,265.86962"
 286.396 +       id="path2852"
 286.397 +       inkscape:connector-type="polyline"
 286.398 +       inkscape:connection-end="#g2845" />
 286.399 +    <path
 286.400 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
 286.401 +       d="M 466.82545,379.17944 L 219.0253,307.95488"
 286.402 +       id="path3016"
 286.403 +       inkscape:connector-type="polyline"
 286.404 +       inkscape:connection-start="#g6135"
 286.405 +       inkscape:connection-end="#g1935" />
 286.406 +    <g
 286.407 +       id="g1935">
 286.408 +      <rect
 286.409 +         y="266.24374"
 286.410 +         x="84.113708"
 286.411 +         height="44.537449"
 286.412 +         width="134.53746"
 286.413 +         id="rect5996"
 286.414 +         style="fill:#d4d4d4;fill-opacity:1;stroke:black;stroke-width:0.7482574;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1.49651474, 0.74825737;stroke-dashoffset:0;stroke-opacity:1" />
 286.415 +      <text
 286.416 +         id="text5998"
 286.417 +         y="292.00446"
 286.418 +         x="108.7962"
 286.419 +         style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 286.420 +         xml:space="preserve"><tspan
 286.421 +           style="font-family:Courier"
 286.422 +           y="292.00446"
 286.423 +           x="108.7962"
 286.424 +           id="tspan6000"
 286.425 +           sodipodi:role="line">e7639888bb2f</tspan></text>
 286.426 +    </g>
 286.427 +  </g>
 286.428 +</svg>
   287.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   287.2 +++ b/it/figs/wdir-pre-branch.svg	Fri Sep 04 16:33:35 2009 +0200
   287.3 @@ -0,0 +1,364 @@
   287.4 +<?xml version="1.0" encoding="UTF-8" standalone="no"?>
   287.5 +<!-- Created with Inkscape (http://www.inkscape.org/) -->
   287.6 +<svg
   287.7 +   xmlns:dc="http://purl.org/dc/elements/1.1/"
   287.8 +   xmlns:cc="http://web.resource.org/cc/"
   287.9 +   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  287.10 +   xmlns:svg="http://www.w3.org/2000/svg"
  287.11 +   xmlns="http://www.w3.org/2000/svg"
  287.12 +   xmlns:xlink="http://www.w3.org/1999/xlink"
  287.13 +   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
  287.14 +   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
  287.15 +   width="744.09448819"
  287.16 +   height="1052.3622047"
  287.17 +   id="svg5971"
  287.18 +   sodipodi:version="0.32"
  287.19 +   inkscape:version="0.44.1"
  287.20 +   sodipodi:docbase="/home/bos/hg/hgbook/en"
  287.21 +   sodipodi:docname="wdir-branch.svg">
  287.22 +  <defs
  287.23 +     id="defs5973">
  287.24 +    <marker
  287.25 +       inkscape:stockid="Arrow1Mstart"
  287.26 +       orient="auto"
  287.27 +       refY="0.0"
  287.28 +       refX="0.0"
  287.29 +       id="Arrow1Mstart"
  287.30 +       style="overflow:visible">
  287.31 +      <path
  287.32 +         id="path4855"
  287.33 +         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
  287.34 +         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
  287.35 +         transform="scale(0.4) translate(10,0)" />
  287.36 +    </marker>
  287.37 +    <linearGradient
  287.38 +       id="linearGradient6049">
  287.39 +      <stop
  287.40 +         style="stop-color:#686868;stop-opacity:1;"
  287.41 +         offset="0"
  287.42 +         id="stop6051" />
  287.43 +      <stop
  287.44 +         style="stop-color:#f0f0f0;stop-opacity:1;"
  287.45 +         offset="1"
  287.46 +         id="stop6053" />
  287.47 +    </linearGradient>
  287.48 +    <marker
  287.49 +       inkscape:stockid="Arrow1Mend"
  287.50 +       orient="auto"
  287.51 +       refY="0.0"
  287.52 +       refX="0.0"
  287.53 +       id="Arrow1Mend"
  287.54 +       style="overflow:visible;">
  287.55 +      <path
  287.56 +         id="path4852"
  287.57 +         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
  287.58 +         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
  287.59 +         transform="scale(0.4) rotate(180) translate(10,0)" />
  287.60 +    </marker>
  287.61 +    <linearGradient
  287.62 +       inkscape:collect="always"
  287.63 +       xlink:href="#linearGradient6049"
  287.64 +       id="linearGradient6083"
  287.65 +       gradientUnits="userSpaceOnUse"
  287.66 +       gradientTransform="translate(-240.0462,-8.633237e-6)"
  287.67 +       x1="333.91171"
  287.68 +       y1="488.79077"
  287.69 +       x2="508.94543"
  287.70 +       y2="263.79077" />
  287.71 +    <linearGradient
  287.72 +       inkscape:collect="always"
  287.73 +       xlink:href="#linearGradient6049"
  287.74 +       id="linearGradient6142"
  287.75 +       gradientUnits="userSpaceOnUse"
  287.76 +       gradientTransform="translate(-42.00893,-30.49544)"
  287.77 +       x1="333.91171"
  287.78 +       y1="488.79077"
  287.79 +       x2="508.94543"
  287.80 +       y2="263.79077" />
  287.81 +    <linearGradient
  287.82 +       inkscape:collect="always"
  287.83 +       xlink:href="#linearGradient6049"
  287.84 +       id="linearGradient6193"
  287.85 +       gradientUnits="userSpaceOnUse"
  287.86 +       gradientTransform="translate(-240.0462,-8.633237e-6)"
  287.87 +       x1="333.91171"
  287.88 +       y1="488.79077"
  287.89 +       x2="508.94543"
  287.90 +       y2="263.79077" />
  287.91 +    <linearGradient
  287.92 +       inkscape:collect="always"
  287.93 +       xlink:href="#linearGradient6049"
  287.94 +       id="linearGradient6216"
  287.95 +       gradientUnits="userSpaceOnUse"
  287.96 +       gradientTransform="matrix(1.000474,0,0,0.790947,-240.246,50.9948)"
  287.97 +       x1="333.91171"
  287.98 +       y1="488.79077"
  287.99 +       x2="508.94543"
 287.100 +       y2="263.79077" />
 287.101 +    <linearGradient
 287.102 +       inkscape:collect="always"
 287.103 +       xlink:href="#linearGradient6049"
 287.104 +       id="linearGradient6232"
 287.105 +       gradientUnits="userSpaceOnUse"
 287.106 +       gradientTransform="matrix(1.000473,0,0,0.790947,-11.16012,50.85693)"
 287.107 +       x1="333.91171"
 287.108 +       y1="488.79077"
 287.109 +       x2="508.94543"
 287.110 +       y2="263.79077" />
 287.111 +    <linearGradient
 287.112 +       inkscape:collect="always"
 287.113 +       xlink:href="#linearGradient6049"
 287.114 +       id="linearGradient6445"
 287.115 +       gradientUnits="userSpaceOnUse"
 287.116 +       gradientTransform="matrix(1.000474,0,0,0.790947,-240.246,50.9948)"
 287.117 +       x1="333.91171"
 287.118 +       y1="488.79077"
 287.119 +       x2="508.94543"
 287.120 +       y2="263.79077" />
 287.121 +    <linearGradient
 287.122 +       inkscape:collect="always"
 287.123 +       xlink:href="#linearGradient6049"
 287.124 +       id="linearGradient6974"
 287.125 +       gradientUnits="userSpaceOnUse"
 287.126 +       gradientTransform="matrix(1.000474,0,0,0.790947,-314.246,50.85694)"
 287.127 +       x1="333.91171"
 287.128 +       y1="488.79077"
 287.129 +       x2="508.94543"
 287.130 +       y2="263.79077" />
 287.131 +    <linearGradient
 287.132 +       inkscape:collect="always"
 287.133 +       xlink:href="#linearGradient6049"
 287.134 +       id="linearGradient6996"
 287.135 +       gradientUnits="userSpaceOnUse"
 287.136 +       gradientTransform="matrix(1.000473,0,0,0.790947,-85.16012,50.85693)"
 287.137 +       x1="333.91171"
 287.138 +       y1="488.79077"
 287.139 +       x2="508.94543"
 287.140 +       y2="263.79077" />
 287.141 +  </defs>
 287.142 +  <sodipodi:namedview
 287.143 +     id="base"
 287.144 +     pagecolor="#ffffff"
 287.145 +     bordercolor="#666666"
 287.146 +     borderopacity="1.0"
 287.147 +     gridtolerance="10000"
 287.148 +     guidetolerance="10"
 287.149 +     objecttolerance="10"
 287.150 +     inkscape:pageopacity="0.0"
 287.151 +     inkscape:pageshadow="2"
 287.152 +     inkscape:zoom="0.90509668"
 287.153 +     inkscape:cx="390.0539"
 287.154 +     inkscape:cy="690.49342"
 287.155 +     inkscape:document-units="px"
 287.156 +     inkscape:current-layer="layer1"
 287.157 +     showguides="true"
 287.158 +     inkscape:guide-bbox="true"
 287.159 +     inkscape:window-width="906"
 287.160 +     inkscape:window-height="620"
 287.161 +     inkscape:window-x="0"
 287.162 +     inkscape:window-y="25">
 287.163 +    <sodipodi:guide
 287.164 +       orientation="vertical"
 287.165 +       position="-1.4285714"
 287.166 +       id="guide6022" />
 287.167 +  </sodipodi:namedview>
 287.168 +  <metadata
 287.169 +     id="metadata5976">
 287.170 +    <rdf:RDF>
 287.171 +      <cc:Work
 287.172 +         rdf:about="">
 287.173 +        <dc:format>image/svg+xml</dc:format>
 287.174 +        <dc:type
 287.175 +           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
 287.176 +      </cc:Work>
 287.177 +    </rdf:RDF>
 287.178 +  </metadata>
 287.179 +  <g
 287.180 +     inkscape:label="Layer 1"
 287.181 +     inkscape:groupmode="layer"
 287.182 +     id="layer1">
 287.183 +    <rect
 287.184 +       y="245.94225"
 287.185 +       x="20.198257"
 287.186 +       height="204.51619"
 287.187 +       width="174.36833"
 287.188 +       id="rect6047"
 287.189 +       style="fill:url(#linearGradient6974);fill-opacity:1;stroke:#686868;stroke-width:0.66539276;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
 287.190 +    <rect
 287.191 +       style="fill:#d4d4d4;fill-opacity:1;stroke:black;stroke-width:0.7482574;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1.49651474, 0.74825737;stroke-dashoffset:0;stroke-opacity:1"
 287.192 +       id="rect5996"
 287.193 +       width="134.53746"
 287.194 +       height="44.537449"
 287.195 +       x="40.113693"
 287.196 +       y="266.24374" />
 287.197 +    <text
 287.198 +       xml:space="preserve"
 287.199 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 287.200 +       x="64.796204"
 287.201 +       y="292.00446"
 287.202 +       id="text5998"><tspan
 287.203 +         sodipodi:role="line"
 287.204 +         id="tspan6000"
 287.205 +         x="64.796204"
 287.206 +         y="292.00446"
 287.207 +         style="font-family:Courier">e7639888bb2f</tspan></text>
 287.208 +    <g
 287.209 +       id="g6976">
 287.210 +      <rect
 287.211 +         y="327.9104"
 287.212 +         x="40.113693"
 287.213 +         height="44.537449"
 287.214 +         width="134.53746"
 287.215 +         id="rect6004"
 287.216 +         style="fill:#d4d4d4;fill-opacity:1;stroke:black;stroke-width:0.7482574;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1.49651474, 0.74825737;stroke-dashoffset:0;stroke-opacity:1" />
 287.217 +      <text
 287.218 +         id="text6006"
 287.219 +         y="353.67111"
 287.220 +         x="62.654205"
 287.221 +         style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 287.222 +         xml:space="preserve"><tspan
 287.223 +           style="font-family:Courier"
 287.224 +           y="353.67111"
 287.225 +           x="62.654205"
 287.226 +           id="tspan6008"
 287.227 +           sodipodi:role="line">7b064d8bac5e</tspan></text>
 287.228 +    </g>
 287.229 +    <path
 287.230 +       inkscape:connection-end="#rect6004"
 287.231 +       inkscape:connector-type="polyline"
 287.232 +       id="path6020"
 287.233 +       d="M 107.38242,311.15529 L 107.38242,327.53626"
 287.234 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1" />
 287.235 +    <rect
 287.236 +       style="fill:#ededed;fill-opacity:1;stroke:#797979;stroke-width:0.74800003;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 287.237 +       id="rect6039"
 287.238 +       width="134.53746"
 287.239 +       height="44.537449"
 287.240 +       x="40.113571"
 287.241 +       y="389.57703" />
 287.242 +    <text
 287.243 +       xml:space="preserve"
 287.244 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:#979797;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 287.245 +       x="64.797073"
 287.246 +       y="415.33771"
 287.247 +       id="text6041"><tspan
 287.248 +         sodipodi:role="line"
 287.249 +         id="tspan6043"
 287.250 +         x="64.797073"
 287.251 +         y="415.33771"
 287.252 +         style="fill:#979797;fill-opacity:1;font-family:Courier">000000000000</tspan></text>
 287.253 +    <path
 287.254 +       inkscape:connection-end="#rect6039"
 287.255 +       inkscape:connector-type="polyline"
 287.256 +       id="path6045"
 287.257 +       d="M 107.38238,372.82195 L 107.38235,389.20301"
 287.258 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#686868;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1" />
 287.259 +    <text
 287.260 +       xml:space="preserve"
 287.261 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 287.262 +       x="19.660461"
 287.263 +       y="231.36218"
 287.264 +       id="text6102"><tspan
 287.265 +         sodipodi:role="line"
 287.266 +         id="tspan6104"
 287.267 +         x="19.660461"
 287.268 +         y="231.36218">Cronologia nel repository</tspan></text>
 287.269 +    <rect
 287.270 +       y="245.94225"
 287.271 +       x="249.28412"
 287.272 +       height="204.51619"
 287.273 +       width="174.36833"
 287.274 +       id="rect6140"
 287.275 +       style="fill:url(#linearGradient6996);fill-opacity:1;stroke:#686868;stroke-width:0.66539276;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
 287.276 +    <g
 287.277 +       id="g6130"
 287.278 +       transform="translate(-45.67459,24.38544)">
 287.279 +      <rect
 287.280 +         style="fill:#d4d4d4;fill-opacity:1;stroke:black;stroke-width:0.7482574;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1.49651474, 0.74825737;stroke-dashoffset:0;stroke-opacity:1"
 287.281 +         id="rect6106"
 287.282 +         width="134.53746"
 287.283 +         height="44.537449"
 287.284 +         x="314.87415"
 287.285 +         y="257.95059" />
 287.286 +      <text
 287.287 +         xml:space="preserve"
 287.288 +         style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 287.289 +         x="339.55664"
 287.290 +         y="283.7113"
 287.291 +         id="text6108"><tspan
 287.292 +           sodipodi:role="line"
 287.293 +           id="tspan6110"
 287.294 +           x="339.55664"
 287.295 +           y="283.7113"
 287.296 +           style="font-family:Courier">7b064d8bac5e</tspan></text>
 287.297 +    </g>
 287.298 +    <g
 287.299 +       id="g6135"
 287.300 +       transform="translate(-44.96042,49.83106)">
 287.301 +      <rect
 287.302 +         inkscape:transform-center-y="102.85714"
 287.303 +         inkscape:transform-center-x="129.28571"
 287.304 +         style="fill:#ededed;fill-opacity:1;stroke:#797979;stroke-width:0.74800003;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 287.305 +         id="rect6112"
 287.306 +         width="134.53746"
 287.307 +         height="44.537449"
 287.308 +         x="314.15985"
 287.309 +         y="326.52203" />
 287.310 +      <text
 287.311 +         inkscape:transform-center-y="102.7311"
 287.312 +         inkscape:transform-center-x="128.69672"
 287.313 +         xml:space="preserve"
 287.314 +         style="font-size:12px;font-style:normal;font-weight:normal;fill:#979797;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 287.315 +         x="338.84335"
 287.316 +         y="352.28271"
 287.317 +         id="text6114"><tspan
 287.318 +           sodipodi:role="line"
 287.319 +           id="tspan6116"
 287.320 +           x="338.84335"
 287.321 +           y="352.28271"
 287.322 +           style="fill:#979797;fill-opacity:1;font-family:Courier">000000000000</tspan></text>
 287.323 +    </g>
 287.324 +    <text
 287.325 +       xml:space="preserve"
 287.326 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 287.327 +       x="268.63208"
 287.328 +       y="270.479"
 287.329 +       id="text6118"><tspan
 287.330 +         sodipodi:role="line"
 287.331 +         id="tspan6120"
 287.332 +         x="268.63208"
 287.333 +         y="270.479">Primo genitore</tspan></text>
 287.334 +    <text
 287.335 +       xml:space="preserve"
 287.336 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 287.337 +       x="268.07544"
 287.338 +       y="364.49615"
 287.339 +       id="text6122"><tspan
 287.340 +         sodipodi:role="line"
 287.341 +         id="tspan6124"
 287.342 +         x="268.07544"
 287.343 +         y="364.49615">Secondo genitore</tspan></text>
 287.344 +    <text
 287.345 +       xml:space="preserve"
 287.346 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 287.347 +       x="248.61746"
 287.348 +       y="231.36218"
 287.349 +       id="text6195"><tspan
 287.350 +         sodipodi:role="line"
 287.351 +         id="tspan6197"
 287.352 +         x="248.61746"
 287.353 +         y="231.36218">Genitori della directory di lavoro</tspan></text>
 287.354 +    <path
 287.355 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
 287.356 +       d="M 268.82543,318.06163 L 175.02528,336.72225"
 287.357 +       id="path6266"
 287.358 +       inkscape:connector-type="polyline"
 287.359 +       inkscape:connection-end="#g6976"
 287.360 +       inkscape:connection-start="#g6130" />
 287.361 +    <path
 287.362 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
 287.363 +       d="M 665.12232,418.17579 L 665.12232,418.17579"
 287.364 +       id="path6270"
 287.365 +       inkscape:connector-type="polyline" />
 287.366 +  </g>
 287.367 +</svg>
   288.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   288.2 +++ b/it/figs/wdir.svg	Fri Sep 04 16:33:35 2009 +0200
   288.3 @@ -0,0 +1,348 @@
   288.4 +<?xml version="1.0" encoding="UTF-8" standalone="no"?>
   288.5 +<!-- Created with Inkscape (http://www.inkscape.org/) -->
   288.6 +<svg
   288.7 +   xmlns:dc="http://purl.org/dc/elements/1.1/"
   288.8 +   xmlns:cc="http://web.resource.org/cc/"
   288.9 +   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  288.10 +   xmlns:svg="http://www.w3.org/2000/svg"
  288.11 +   xmlns="http://www.w3.org/2000/svg"
  288.12 +   xmlns:xlink="http://www.w3.org/1999/xlink"
  288.13 +   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
  288.14 +   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
  288.15 +   width="744.09448819"
  288.16 +   height="1052.3622047"
  288.17 +   id="svg5971"
  288.18 +   sodipodi:version="0.32"
  288.19 +   inkscape:version="0.44.1"
  288.20 +   sodipodi:docbase="/home/bos/hg/hgbook/en"
  288.21 +   sodipodi:docname="wdir.svg">
  288.22 +  <defs
  288.23 +     id="defs5973">
  288.24 +    <marker
  288.25 +       inkscape:stockid="Arrow1Mstart"
  288.26 +       orient="auto"
  288.27 +       refY="0.0"
  288.28 +       refX="0.0"
  288.29 +       id="Arrow1Mstart"
  288.30 +       style="overflow:visible">
  288.31 +      <path
  288.32 +         id="path4855"
  288.33 +         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
  288.34 +         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
  288.35 +         transform="scale(0.4) translate(10,0)" />
  288.36 +    </marker>
  288.37 +    <linearGradient
  288.38 +       id="linearGradient6049">
  288.39 +      <stop
  288.40 +         style="stop-color:#686868;stop-opacity:1;"
  288.41 +         offset="0"
  288.42 +         id="stop6051" />
  288.43 +      <stop
  288.44 +         style="stop-color:#f0f0f0;stop-opacity:1;"
  288.45 +         offset="1"
  288.46 +         id="stop6053" />
  288.47 +    </linearGradient>
  288.48 +    <marker
  288.49 +       inkscape:stockid="Arrow1Mend"
  288.50 +       orient="auto"
  288.51 +       refY="0.0"
  288.52 +       refX="0.0"
  288.53 +       id="Arrow1Mend"
  288.54 +       style="overflow:visible;">
  288.55 +      <path
  288.56 +         id="path4852"
  288.57 +         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
  288.58 +         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
  288.59 +         transform="scale(0.4) rotate(180) translate(10,0)" />
  288.60 +    </marker>
  288.61 +    <linearGradient
  288.62 +       inkscape:collect="always"
  288.63 +       xlink:href="#linearGradient6049"
  288.64 +       id="linearGradient6083"
  288.65 +       gradientUnits="userSpaceOnUse"
  288.66 +       gradientTransform="translate(-240.0462,-8.633237e-6)"
  288.67 +       x1="333.91171"
  288.68 +       y1="488.79077"
  288.69 +       x2="508.94543"
  288.70 +       y2="263.79077" />
  288.71 +    <linearGradient
  288.72 +       inkscape:collect="always"
  288.73 +       xlink:href="#linearGradient6049"
  288.74 +       id="linearGradient6142"
  288.75 +       gradientUnits="userSpaceOnUse"
  288.76 +       gradientTransform="translate(-42.00893,-30.49544)"
  288.77 +       x1="333.91171"
  288.78 +       y1="488.79077"
  288.79 +       x2="508.94543"
  288.80 +       y2="263.79077" />
  288.81 +    <linearGradient
  288.82 +       inkscape:collect="always"
  288.83 +       xlink:href="#linearGradient6049"
  288.84 +       id="linearGradient6193"
  288.85 +       gradientUnits="userSpaceOnUse"
  288.86 +       gradientTransform="translate(-240.0462,-8.633237e-6)"
  288.87 +       x1="333.91171"
  288.88 +       y1="488.79077"
  288.89 +       x2="508.94543"
  288.90 +       y2="263.79077" />
  288.91 +    <linearGradient
  288.92 +       inkscape:collect="always"
  288.93 +       xlink:href="#linearGradient6049"
  288.94 +       id="linearGradient6216"
  288.95 +       gradientUnits="userSpaceOnUse"
  288.96 +       gradientTransform="matrix(1.000474,0,0,0.790947,-240.246,50.9948)"
  288.97 +       x1="333.91171"
  288.98 +       y1="488.79077"
  288.99 +       x2="508.94543"
 288.100 +       y2="263.79077" />
 288.101 +    <linearGradient
 288.102 +       inkscape:collect="always"
 288.103 +       xlink:href="#linearGradient6049"
 288.104 +       id="linearGradient6232"
 288.105 +       gradientUnits="userSpaceOnUse"
 288.106 +       gradientTransform="matrix(1.000473,0,0,0.790947,-11.16012,50.85693)"
 288.107 +       x1="333.91171"
 288.108 +       y1="488.79077"
 288.109 +       x2="508.94543"
 288.110 +       y2="263.79077" />
 288.111 +    <linearGradient
 288.112 +       inkscape:collect="always"
 288.113 +       xlink:href="#linearGradient6049"
 288.114 +       id="linearGradient6445"
 288.115 +       gradientUnits="userSpaceOnUse"
 288.116 +       gradientTransform="matrix(1.000474,0,0,0.790947,-240.246,50.9948)"
 288.117 +       x1="333.91171"
 288.118 +       y1="488.79077"
 288.119 +       x2="508.94543"
 288.120 +       y2="263.79077" />
 288.121 +  </defs>
 288.122 +  <sodipodi:namedview
 288.123 +     id="base"
 288.124 +     pagecolor="#ffffff"
 288.125 +     bordercolor="#666666"
 288.126 +     borderopacity="1.0"
 288.127 +     gridtolerance="10000"
 288.128 +     guidetolerance="10"
 288.129 +     objecttolerance="10"
 288.130 +     inkscape:pageopacity="0.0"
 288.131 +     inkscape:pageshadow="2"
 288.132 +     inkscape:zoom="0.90509668"
 288.133 +     inkscape:cx="390.0539"
 288.134 +     inkscape:cy="690.49342"
 288.135 +     inkscape:document-units="px"
 288.136 +     inkscape:current-layer="layer1"
 288.137 +     showguides="true"
 288.138 +     inkscape:guide-bbox="true"
 288.139 +     inkscape:window-width="906"
 288.140 +     inkscape:window-height="620"
 288.141 +     inkscape:window-x="0"
 288.142 +     inkscape:window-y="25">
 288.143 +    <sodipodi:guide
 288.144 +       orientation="vertical"
 288.145 +       position="-1.4285714"
 288.146 +       id="guide6022" />
 288.147 +  </sodipodi:namedview>
 288.148 +  <metadata
 288.149 +     id="metadata5976">
 288.150 +    <rdf:RDF>
 288.151 +      <cc:Work
 288.152 +         rdf:about="">
 288.153 +        <dc:format>image/svg+xml</dc:format>
 288.154 +        <dc:type
 288.155 +           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
 288.156 +      </cc:Work>
 288.157 +    </rdf:RDF>
 288.158 +  </metadata>
 288.159 +  <g
 288.160 +     inkscape:label="Layer 1"
 288.161 +     inkscape:groupmode="layer"
 288.162 +     id="layer1">
 288.163 +    <g
 288.164 +       id="g6431"
 288.165 +       transform="translate(0,-0.137863)">
 288.166 +      <rect
 288.167 +         style="fill:url(#linearGradient6445);fill-opacity:1;stroke:#686868;stroke-width:0.66539276;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 288.168 +         id="rect6047"
 288.169 +         width="174.36833"
 288.170 +         height="204.51619"
 288.171 +         x="94.198257"
 288.172 +         y="246.08011" />
 288.173 +      <rect
 288.174 +         y="266.38159"
 288.175 +         x="114.11369"
 288.176 +         height="44.537449"
 288.177 +         width="134.53746"
 288.178 +         id="rect5996"
 288.179 +         style="fill:#d4d4d4;fill-opacity:1;stroke:black;stroke-width:0.7482574;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1.49651474, 0.74825737;stroke-dashoffset:0;stroke-opacity:1" />
 288.180 +      <text
 288.181 +         id="text5998"
 288.182 +         y="292.1423"
 288.183 +         x="138.7962"
 288.184 +         style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 288.185 +         xml:space="preserve"><tspan
 288.186 +           style="font-family:Courier"
 288.187 +           y="292.1423"
 288.188 +           x="138.7962"
 288.189 +           id="tspan6000"
 288.190 +           sodipodi:role="line">e7639888bb2f</tspan></text>
 288.191 +      <rect
 288.192 +         y="328.04825"
 288.193 +         x="114.11369"
 288.194 +         height="44.537449"
 288.195 +         width="134.53746"
 288.196 +         id="rect6004"
 288.197 +         style="fill:#d4d4d4;fill-opacity:1;stroke:black;stroke-width:0.7482574;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1.49651474, 0.74825737;stroke-dashoffset:0;stroke-opacity:1" />
 288.198 +      <text
 288.199 +         id="text6006"
 288.200 +         y="353.80896"
 288.201 +         x="136.65421"
 288.202 +         style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 288.203 +         xml:space="preserve"><tspan
 288.204 +           style="font-family:Courier"
 288.205 +           y="353.80896"
 288.206 +           x="136.65421"
 288.207 +           id="tspan6008"
 288.208 +           sodipodi:role="line">7b064d8bac5e</tspan></text>
 288.209 +      <path
 288.210 +         style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1"
 288.211 +         d="M 181.38242,311.29315 L 181.38242,327.67412"
 288.212 +         id="path6020"
 288.213 +         inkscape:connector-type="polyline"
 288.214 +         inkscape:connection-end="#rect6004" />
 288.215 +      <rect
 288.216 +         y="389.71487"
 288.217 +         x="114.11357"
 288.218 +         height="44.537449"
 288.219 +         width="134.53746"
 288.220 +         id="rect6039"
 288.221 +         style="fill:#ededed;fill-opacity:1;stroke:#797979;stroke-width:0.74800003;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
 288.222 +      <text
 288.223 +         id="text6041"
 288.224 +         y="415.47556"
 288.225 +         x="138.79707"
 288.226 +         style="font-size:12px;font-style:normal;font-weight:normal;fill:#979797;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 288.227 +         xml:space="preserve"><tspan
 288.228 +           style="fill:#979797;fill-opacity:1;font-family:Courier"
 288.229 +           y="415.47556"
 288.230 +           x="138.79707"
 288.231 +           id="tspan6043"
 288.232 +           sodipodi:role="line">000000000000</tspan></text>
 288.233 +      <path
 288.234 +         style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#686868;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1"
 288.235 +         d="M 181.38238,372.95981 L 181.38235,389.34087"
 288.236 +         id="path6045"
 288.237 +         inkscape:connector-type="polyline"
 288.238 +         inkscape:connection-end="#rect6039" />
 288.239 +    </g>
 288.240 +    <text
 288.241 +       xml:space="preserve"
 288.242 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 288.243 +       x="93.660484"
 288.244 +       y="231.36218"
 288.245 +       id="text6102"><tspan
 288.246 +         sodipodi:role="line"
 288.247 +         id="tspan6104"
 288.248 +         x="93.660484"
 288.249 +         y="231.36218">Cronologia nel repository</tspan></text>
 288.250 +    <g
 288.251 +       id="g6416">
 288.252 +      <rect
 288.253 +         style="fill:url(#linearGradient6232);fill-opacity:1;stroke:#686868;stroke-width:0.66539276;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 288.254 +         id="rect6140"
 288.255 +         width="174.36833"
 288.256 +         height="204.51619"
 288.257 +         x="323.28412"
 288.258 +         y="245.94225" />
 288.259 +      <g
 288.260 +         transform="translate(28.32541,24.38544)"
 288.261 +         id="g6130">
 288.262 +        <rect
 288.263 +           y="257.95059"
 288.264 +           x="314.87415"
 288.265 +           height="44.537449"
 288.266 +           width="134.53746"
 288.267 +           id="rect6106"
 288.268 +           style="fill:#d4d4d4;fill-opacity:1;stroke:black;stroke-width:0.7482574;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1.49651474, 0.74825737;stroke-dashoffset:0;stroke-opacity:1" />
 288.269 +        <text
 288.270 +           id="text6108"
 288.271 +           y="283.7113"
 288.272 +           x="339.55664"
 288.273 +           style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 288.274 +           xml:space="preserve"><tspan
 288.275 +             style="font-family:Courier"
 288.276 +             y="283.7113"
 288.277 +             x="339.55664"
 288.278 +             id="tspan6110"
 288.279 +             sodipodi:role="line">e7639888bb2f</tspan></text>
 288.280 +      </g>
 288.281 +      <g
 288.282 +         transform="translate(29.03958,49.83106)"
 288.283 +         id="g6135">
 288.284 +        <rect
 288.285 +           y="326.52203"
 288.286 +           x="314.15985"
 288.287 +           height="44.537449"
 288.288 +           width="134.53746"
 288.289 +           id="rect6112"
 288.290 +           style="fill:#ededed;fill-opacity:1;stroke:#797979;stroke-width:0.74800003;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 288.291 +           inkscape:transform-center-x="129.28571"
 288.292 +           inkscape:transform-center-y="102.85714" />
 288.293 +        <text
 288.294 +           id="text6114"
 288.295 +           y="352.28271"
 288.296 +           x="338.84335"
 288.297 +           style="font-size:12px;font-style:normal;font-weight:normal;fill:#979797;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 288.298 +           xml:space="preserve"
 288.299 +           inkscape:transform-center-x="128.69672"
 288.300 +           inkscape:transform-center-y="102.7311"><tspan
 288.301 +             style="fill:#979797;fill-opacity:1;font-family:Courier"
 288.302 +             y="352.28271"
 288.303 +             x="338.84335"
 288.304 +             id="tspan6116"
 288.305 +             sodipodi:role="line">000000000000</tspan></text>
 288.306 +      </g>
 288.307 +      <text
 288.308 +         id="text6118"
 288.309 +         y="270.479"
 288.310 +         x="342.63208"
 288.311 +         style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 288.312 +         xml:space="preserve"><tspan
 288.313 +           y="270.479"
 288.314 +           x="342.63208"
 288.315 +           id="tspan6120"
 288.316 +           sodipodi:role="line">Primo genitore</tspan></text>
 288.317 +      <text
 288.318 +         id="text6122"
 288.319 +         y="364.49615"
 288.320 +         x="342.07544"
 288.321 +         style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 288.322 +         xml:space="preserve"><tspan
 288.323 +           y="364.49615"
 288.324 +           x="342.07544"
 288.325 +           id="tspan6124"
 288.326 +           sodipodi:role="line">Secondo genitore</tspan></text>
 288.327 +    </g>
 288.328 +    <text
 288.329 +       xml:space="preserve"
 288.330 +       style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman"
 288.331 +       x="322.61746"
 288.332 +       y="231.36218"
 288.333 +       id="text6195"><tspan
 288.334 +         sodipodi:role="line"
 288.335 +         id="tspan6197"
 288.336 +         x="322.61746"
 288.337 +         y="231.36218">Genitori della directory di lavoro</tspan></text>
 288.338 +    <path
 288.339 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
 288.340 +       d="M 342.82543,299.89384 L 249.02528,293.36123"
 288.341 +       id="path6266"
 288.342 +       inkscape:connector-type="polyline"
 288.343 +       inkscape:connection-start="#g6130"
 288.344 +       inkscape:connection-end="#rect5996" />
 288.345 +    <path
 288.346 +       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
 288.347 +       d="M 665.12232,418.17579 L 665.12232,418.17579"
 288.348 +       id="path6270"
 288.349 +       inkscape:connector-type="polyline" />
 288.350 +  </g>
 288.351 +</svg>
   289.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   289.2 +++ b/it/web/genindex.py	Fri Sep 04 16:33:35 2009 +0200
   289.3 @@ -0,0 +1,63 @@
   289.4 +# This script works with Python 3.0 or above
   289.5 +
   289.6 +import glob, os, re
   289.7 +
   289.8 +chapter_re = re.compile(r'<(chapter|appendix|preface|bibliography)\s+id="([^"]+)">')
   289.9 +filename_re = re.compile(r'<\?dbhtml filename="([^"]+)"\?>')
  289.10 +title_re = re.compile(r'<title>(.*)</title>')
  289.11 +
  289.12 +chapters = (sorted(glob.glob('../ch*.xml')) +
  289.13 +            sorted(glob.glob('../app*.xml')) +
  289.14 +            sorted(glob.glob('../biblio*.xml')))
  289.15 +
  289.16 +fp = open('index-read.html.in', 'w', encoding='utf-8')
  289.17 +
  289.18 +print('''
  289.19 +<div class="navheader"><h1 class="booktitle">Mercurial: la guida definitiva<div class="authors">di Bryan O\&#8217;Sullivan</div></h1></div>
  289.20 +<div class="book"><ul class="booktoc">''', file=fp)
  289.21 +
  289.22 +ch = 0
  289.23 +app = 0
  289.24 +ab = 0
  289.25 +for c in chapters:
  289.26 +    filename = None
  289.27 +    title = None
  289.28 +    chapid = None
  289.29 +    chaptype = None
  289.30 +    for line in open(c, encoding='utf-8'):
  289.31 +        m = chapter_re.search(line)
  289.32 +        if m:
  289.33 +            chaptype, chapid = m.groups()
  289.34 +        m = filename_re.search(line)
  289.35 +        if m:
  289.36 +            filename = m.group(1)
  289.37 +        m = title_re.search(line)
  289.38 +        if m:
  289.39 +            title = m.group(1)
  289.40 +        if filename and title and chapid:
  289.41 +            if chaptype == 'bibliography':
  289.42 +                num = ''
  289.43 +            elif chaptype == 'appendix':
  289.44 +                num = str(chr(ord('A') + app)) + '. '
  289.45 +                app += 1
  289.46 +            else:
  289.47 +                num = str(ch) + '. '
  289.48 +                ch += 1
  289.49 +            if '&' in title:
  289.50 +                title = title.replace('&', '\&')
  289.51 +            ab += 1
  289.52 +            date = os.popen('hg log -l1 --template "{date|isodate}" ' + c).read().split(None, 1)[0]
  289.53 +            args = {
  289.54 +                'ab': "ab"[ab % 2],
  289.55 +                'date': date,
  289.56 +                # 'chapid': chapid,
  289.57 +                'num': num,
  289.58 +                'filename': filename,
  289.59 +                'title': title,
  289.60 +                }
  289.61 +            print('<li class="zebra_%(ab)s"><span class="chapinfo">%(date)s</span>%(num)s<a href="%(filename)s">%(title)s</a></li>' % args, file=fp)
  289.62 +            break
  289.63 +
  289.64 +print('</ul></div>', file=fp)
  289.65 +
  289.66 +fp.close()
   290.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   290.2 +++ b/it/web/hgbook.js	Fri Sep 04 16:33:35 2009 +0200
   290.3 @@ -0,0 +1,7 @@
   290.4 +$(document).ready(function() {
   290.5 +  $("div.toc>p")
   290.6 +    .toggle(function() { $(this).nextAll().show("normal"); },
   290.7 +	    function() { $(this).nextAll().hide("normal"); })
   290.8 +    .hover(function() { $(this).fadeTo("normal", 0.8); },
   290.9 +	   function() { $(this).fadeTo("normal", 0.35); });
  290.10 +});
   291.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   291.2 +++ b/it/web/index-home.html.in	Fri Sep 04 16:33:35 2009 +0200
   291.3 @@ -0,0 +1,36 @@
   291.4 +<div class="navheader"><h1 class="booktitle">Mercurial: la guida definitiva<div class="authors">di Bryan O\&#8217;Sullivan</div></h1></div>
   291.5 +
   291.6 +<div class="book">
   291.7 +  <h2>Benvenuti a Mercurial: la guida definitiva</h2>
   291.8 +
   291.9 +  <p>Questo è il sito web del libro \&#8220;Mercurial: la guida definitiva\&#8221;, traduzione italiana del libro inglese \&#8220;<a href="http://hgbook.red-bean.com">Mercurial: The Definitive Guide</a>\&#8221; scritto da Bryan O\&#8217;Sullivan e pubblicato da O\&#8217;Reilly Media nel 2009.</p>
  291.10 +
  291.11 +  <p>Il contenuto della traduzione italiana è <a href="read/">liberamente disponibile online</a>. Attualmente, la traduzione italiana non è pubblicata da nessun editore, perciò se il libro vi piace e volete sostenere l\&#8217;autore (e la causa del software libero) potete acquistare una copia del libro in inglese.</p>
  291.12 +<!--
  291.13 +  <p>For news updates, please visit <a href="http://www.serpentine.com/blog/">my blog</a>.</p>
  291.14 +-->
  291.15 +  <h2>Potete contribuire anche voi!</h2>
  291.16 +
  291.17 +  <p>Il codice sorgente della traduzione italiana del libro è disponibile attraverso un <a href="http://bitbucket.org/gpiancastelli/hgbook-it">repository Mercurial</a> ospitato da Bitbucket. Sentitevi liberi di clonarlo, fare le vostre modifiche e spedire i cambiamenti al traduttore. Se avete Mercurial installato, ottenere una copia dei sorgenti non vi costerà più di qualche secondo del vostro tempo:</p>
  291.18 +
  291.19 +  <pre class="screen">hg clone http://bitbucket.org/gpiancastelli/hgbook-it</pre>
  291.20 +  
  291.21 +  <p>Se siete utenti Bitbucket, il servizio offre la possibilità di clonare repository attraverso l\&#8217;interfaccia web, nonché di richiedere che le modifiche di un clone vengano estratte e propagate al repository originale.</p>
  291.22 +
  291.23 +  <p>A differenza della versione inglese, le pagine web della versione italiana del libro non includono un sistema di commenti. Il modo migliore per segnalare problemi, errori, o sviste e comunicare suggerimenti è quello di usare l\&#8217;<a href="http://bitbucket.org/gpiancastelli/hgbook-it/issues">apposito strumento</a> messo a disposizione da Bitbucket. In alternativa, potete inviare un\&#8217;email all\&#8217;indirizzo <a href="mailto:giulio.piancastelli@gmail.com">giulio.piancastelli@gmail.com</a> per contattare direttamente Giulio Piancastelli, l\&#8217;autore della traduzione italiana.</p>
  291.24 +
  291.25 +  <h2>Che cos\&#8217;è Mercurial?</h2>
  291.26 +
  291.27 +  <p><a href="http://www.selenic.com/mercurial">Mercurial</a> è un sistema per il controllo di revisione veloce e leggero, progettato per gestire progetti distribuiti di grandi dimensioni in maniera semplice ed efficiente.</p>
  291.28 +
  291.29 +  <h2>Come aiutare Mercurial e il software libero</h2>
  291.30 +
  291.31 +  <p>Mercurial è un progetto membro della <a href="http://conservancy.softwarefreedom.org/">Software Freedom Conservancy</a> (SFC), una meravigliosa organizzazione no-profit che offre ai progetti membro un supporto legale e amministrativo.</p>
  291.32 +
  291.33 +  <p>Bryan O\&#8217;Sullivan, ha deciso di donare le proprie royalty sulle vendite di questo libro alla Software Freedom Conservancy e incoraggia anche i lettori a supportare il lavoro di questa organizzazione.</p>
  291.34 +
  291.35 +  <p>La SFC può <a href="http://conservancy.softwarefreedom.org/?donate">accettare donazioni</a> (esenti dalle tasse secondo la disposizione IRS 501(c)(3), all\&#8217;interno degli Stati Uniti) per conto dei suoi progetti membro. Se volete supportare Mercurial direttamente, considerate la possibilità di fare una donazione alla SFC per destinarla al progetto.</p>
  291.36 +
  291.37 +  <p>Se volete aiutare gli sviluppatori di software libero a fornire il proprio importante servizio pubblico senza essere ostacolati da problemi legali, considerate la possibilità di fare una donazione al <a href="http://www.softwarefreedom.org/">Software Freedom Law Center</a>, un centro legale che costituisce un\&#8217;organizzazione gemella della SFC.</p>
  291.38 +</div>
  291.39 +
   292.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   292.2 +++ b/it/web/index-template.html	Fri Sep 04 16:33:35 2009 +0200
   292.3 @@ -0,0 +1,35 @@
   292.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
   292.5 +<html>
   292.6 +  <head>
   292.7 +    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
   292.8 +    <title>Mercurial: la guida definitiva</title>
   292.9 +    <link rel="stylesheet" href="/support/styles.css" type="text/css"/>
  292.10 +    <!--
  292.11 +    <link rel="alternate" type="application/atom+xml" title="Comments"
  292.12 +      href="/feeds/comments/"/>
  292.13 +    -->
  292.14 +    <link rel="shortcut icon" type="image/png" href="/support/favicon.png"/>
  292.15 +    <!-- No comment system for italian translation
  292.16 +    <script type="text/javascript" src="/support/jquery.js"></script>
  292.17 +      <script type="text/javascript" src="/support/form.js"></script>
  292.18 +    <script type="text/javascript" src="/support/hsbook.js"></script>
  292.19 +    -->
  292.20 +  </head>
  292.21 +
  292.22 +  <body>
  292.23 +    {% block bodycontent %}{% endblock %}
  292.24 +
  292.25 +    <div class="hgbookfooter"> <p><img src="/support/rss.png"> Volete rimanere aggiornati? Abbonatevi al feed del <a class="feed" href="http://bitbucket.org/gpiancastelli/hgbook-it/atom">libro italiano</a>.</p> <p>Copyright 2006, 2007, 2008, 2009 Bryan O&#8217;Sullivan. Icone realizzate da <a href="mailto:mattahan@gmail.com">Paul Davey</a> alias <a href="http://mattahan.deviantart.com/">Mattahan</a>.</p> <p>Copyright 2009 <a href="mailto:giulio.piancastelli@gmail.com">Giulio Piancastelli</a> per la traduzione italiana.</p>
  292.26 +    </div>
  292.27 +
  292.28 +    <script type="text/javascript">
  292.29 +    var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
  292.30 +    document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
  292.31 +    </script>
  292.32 +    <script type="text/javascript">
  292.33 +    try {
  292.34 +    var pageTracker = _gat._getTracker("UA-10482652-1");
  292.35 +    pageTracker._trackPageview();
  292.36 +    } catch(err) {}</script>
  292.37 +  </body>
  292.38 +</html>
   293.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   293.2 +++ b/it/web/jquery-min.js	Fri Sep 04 16:33:35 2009 +0200
   293.3 @@ -0,0 +1,31 @@
   293.4 +/*
   293.5 + * jQuery 1.2.1 - New Wave Javascript
   293.6 + *
   293.7 + * Copyright (c) 2007 John Resig (jquery.com)
   293.8 + * Dual licensed under the MIT (MIT-LICENSE.txt)
   293.9 + * and GPL (GPL-LICENSE.txt) licenses.
  293.10 + *
  293.11 + * $Date: 2007-09-16 23:42:06 -0400 (Sun, 16 Sep 2007) $
  293.12 + * $Rev: 3353 $
  293.13 + */
  293.14 +(function(){if(typeof jQuery!="undefined")var _jQuery=jQuery;var jQuery=window.jQuery=function(selector,context){return this instanceof jQuery?this.init(selector,context):new jQuery(selector,context);};if(typeof $!="undefined")var _$=$;window.$=jQuery;var quickExpr=/^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/;jQuery.fn=jQuery.prototype={init:function(selector,context){selector=selector||document;if(typeof selector=="string"){var m=quickExpr.exec(selector);if(m&&(m[1]||!context)){if(m[1])selector=jQuery.clean([m[1]],context);else{var tmp=document.getElementById(m[3]);if(tmp)if(tmp.id!=m[3])return jQuery().find(selector);else{this[0]=tmp;this.length=1;return this;}else
  293.15 +selector=[];}}else
  293.16 +return new jQuery(context).find(selector);}else if(jQuery.isFunction(selector))return new jQuery(document)[jQuery.fn.ready?"ready":"load"](selector);return this.setArray(selector.constructor==Array&&selector||(selector.jquery||selector.length&&selector!=window&&!selector.nodeType&&selector[0]!=undefined&&selector[0].nodeType)&&jQuery.makeArray(selector)||[selector]);},jquery:"1.2.1",size:function(){return this.length;},length:0,get:function(num){return num==undefined?jQuery.makeArray(this):this[num];},pushStack:function(a){var ret=jQuery(a);ret.prevObject=this;return ret;},setArray:function(a){this.length=0;Array.prototype.push.apply(this,a);return this;},each:function(fn,args){return jQuery.each(this,fn,args);},index:function(obj){var pos=-1;this.each(function(i){if(this==obj)pos=i;});return pos;},attr:function(key,value,type){var obj=key;if(key.constructor==String)if(value==undefined)return this.length&&jQuery[type||"attr"](this[0],key)||undefined;else{obj={};obj[key]=value;}return this.each(function(index){for(var prop in obj)jQuery.attr(type?this.style:this,prop,jQuery.prop(this,obj[prop],type,index,prop));});},css:function(key,value){return this.attr(key,value,"curCSS");},text:function(e){if(typeof e!="object"&&e!=null)return this.empty().append(document.createTextNode(e));var t="";jQuery.each(e||this,function(){jQuery.each(this.childNodes,function(){if(this.nodeType!=8)t+=this.nodeType!=1?this.nodeValue:jQuery.fn.text([this]);});});return t;},wrapAll:function(html){if(this[0])jQuery(html,this[0].ownerDocument).clone().insertBefore(this[0]).map(function(){var elem=this;while(elem.firstChild)elem=elem.firstChild;return elem;}).append(this);return this;},wrapInner:function(html){return this.each(function(){jQuery(this).contents().wrapAll(html);});},wrap:function(html){return this.each(function(){jQuery(this).wrapAll(html);});},append:function(){return this.domManip(arguments,true,1,function(a){this.appendChild(a);});},prepend:function(){return this.domManip(arguments,true,-1,function(a){this.insertBefore(a,this.firstChild);});},before:function(){return this.domManip(arguments,false,1,function(a){this.parentNode.insertBefore(a,this);});},after:function(){return this.domManip(arguments,false,-1,function(a){this.parentNode.insertBefore(a,this.nextSibling);});},end:function(){return this.prevObject||jQuery([]);},find:function(t){var data=jQuery.map(this,function(a){return jQuery.find(t,a);});return this.pushStack(/[^+>] [^+>]/.test(t)||t.indexOf("..")>-1?jQuery.unique(data):data);},clone:function(events){var ret=this.map(function(){return this.outerHTML?jQuery(this.outerHTML)[0]:this.cloneNode(true);});var clone=ret.find("*").andSelf().each(function(){if(this[expando]!=undefined)this[expando]=null;});if(events===true)this.find("*").andSelf().each(function(i){var events=jQuery.data(this,"events");for(var type in events)for(var handler in events[type])jQuery.event.add(clone[i],type,events[type][handler],events[type][handler].data);});return ret;},filter:function(t){return this.pushStack(jQuery.isFunction(t)&&jQuery.grep(this,function(el,index){return t.apply(el,[index]);})||jQuery.multiFilter(t,this));},not:function(t){return this.pushStack(t.constructor==String&&jQuery.multiFilter(t,this,true)||jQuery.grep(this,function(a){return(t.constructor==Array||t.jquery)?jQuery.inArray(a,t)<0:a!=t;}));},add:function(t){return this.pushStack(jQuery.merge(this.get(),t.constructor==String?jQuery(t).get():t.length!=undefined&&(!t.nodeName||jQuery.nodeName(t,"form"))?t:[t]));},is:function(expr){return expr?jQuery.multiFilter(expr,this).length>0:false;},hasClass:function(expr){return this.is("."+expr);},val:function(val){if(val==undefined){if(this.length){var elem=this[0];if(jQuery.nodeName(elem,"select")){var index=elem.selectedIndex,a=[],options=elem.options,one=elem.type=="select-one";if(index<0)return null;for(var i=one?index:0,max=one?index+1:options.length;i<max;i++){var option=options[i];if(option.selected){var val=jQuery.browser.msie&&!option.attributes["value"].specified?option.text:option.value;if(one)return val;a.push(val);}}return a;}else
  293.17 +return this[0].value.replace(/\r/g,"");}}else
  293.18 +return this.each(function(){if(val.constructor==Array&&/radio|checkbox/.test(this.type))this.checked=(jQuery.inArray(this.value,val)>=0||jQuery.inArray(this.name,val)>=0);else if(jQuery.nodeName(this,"select")){var tmp=val.constructor==Array?val:[val];jQuery("option",this).each(function(){this.selected=(jQuery.inArray(this.value,tmp)>=0||jQuery.inArray(this.text,tmp)>=0);});if(!tmp.length)this.selectedIndex=-1;}else
  293.19 +this.value=val;});},html:function(val){return val==undefined?(this.length?this[0].innerHTML:null):this.empty().append(val);},replaceWith:function(val){return this.after(val).remove();},eq:function(i){return this.slice(i,i+1);},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments));},map:function(fn){return this.pushStack(jQuery.map(this,function(elem,i){return fn.call(elem,i,elem);}));},andSelf:function(){return this.add(this.prevObject);},domManip:function(args,table,dir,fn){var clone=this.length>1,a;return this.each(function(){if(!a){a=jQuery.clean(args,this.ownerDocument);if(dir<0)a.reverse();}var obj=this;if(table&&jQuery.nodeName(this,"table")&&jQuery.nodeName(a[0],"tr"))obj=this.getElementsByTagName("tbody")[0]||this.appendChild(document.createElement("tbody"));jQuery.each(a,function(){var elem=clone?this.cloneNode(true):this;if(!evalScript(0,elem))fn.call(obj,elem);});});}};function evalScript(i,elem){var script=jQuery.nodeName(elem,"script");if(script){if(elem.src)jQuery.ajax({url:elem.src,async:false,dataType:"script"});else
  293.20 +jQuery.globalEval(elem.text||elem.textContent||elem.innerHTML||"");if(elem.parentNode)elem.parentNode.removeChild(elem);}else if(elem.nodeType==1)jQuery("script",elem).each(evalScript);return script;}jQuery.extend=jQuery.fn.extend=function(){var target=arguments[0]||{},a=1,al=arguments.length,deep=false;if(target.constructor==Boolean){deep=target;target=arguments[1]||{};}if(al==1){target=this;a=0;}var prop;for(;a<al;a++)if((prop=arguments[a])!=null)for(var i in prop){if(target==prop[i])continue;if(deep&&typeof prop[i]=='object'&&target[i])jQuery.extend(target[i],prop[i]);else if(prop[i]!=undefined)target[i]=prop[i];}return target;};var expando="jQuery"+(new Date()).getTime(),uuid=0,win={};jQuery.extend({noConflict:function(deep){window.$=_$;if(deep)window.jQuery=_jQuery;return jQuery;},isFunction:function(fn){return!!fn&&typeof fn!="string"&&!fn.nodeName&&fn.constructor!=Array&&/function/i.test(fn+"");},isXMLDoc:function(elem){return elem.documentElement&&!elem.body||elem.tagName&&elem.ownerDocument&&!elem.ownerDocument.body;},globalEval:function(data){data=jQuery.trim(data);if(data){if(window.execScript)window.execScript(data);else if(jQuery.browser.safari)window.setTimeout(data,0);else
  293.21 +eval.call(window,data);}},nodeName:function(elem,name){return elem.nodeName&&elem.nodeName.toUpperCase()==name.toUpperCase();},cache:{},data:function(elem,name,data){elem=elem==window?win:elem;var id=elem[expando];if(!id)id=elem[expando]=++uuid;if(name&&!jQuery.cache[id])jQuery.cache[id]={};if(data!=undefined)jQuery.cache[id][name]=data;return name?jQuery.cache[id][name]:id;},removeData:function(elem,name){elem=elem==window?win:elem;var id=elem[expando];if(name){if(jQuery.cache[id]){delete jQuery.cache[id][name];name="";for(name in jQuery.cache[id])break;if(!name)jQuery.removeData(elem);}}else{try{delete elem[expando];}catch(e){if(elem.removeAttribute)elem.removeAttribute(expando);}delete jQuery.cache[id];}},each:function(obj,fn,args){if(args){if(obj.length==undefined)for(var i in obj)fn.apply(obj[i],args);else
  293.22 +for(var i=0,ol=obj.length;i<ol;i++)if(fn.apply(obj[i],args)===false)break;}else{if(obj.length==undefined)for(var i in obj)fn.call(obj[i],i,obj[i]);else
  293.23 +for(var i=0,ol=obj.length,val=obj[0];i<ol&&fn.call(val,i,val)!==false;val=obj[++i]){}}return obj;},prop:function(elem,value,type,index,prop){if(jQuery.isFunction(value))value=value.call(elem,[index]);var exclude=/z-?index|font-?weight|opacity|zoom|line-?height/i;return value&&value.constructor==Number&&type=="curCSS"&&!exclude.test(prop)?value+"px":value;},className:{add:function(elem,c){jQuery.each((c||"").split(/\s+/),function(i,cur){if(!jQuery.className.has(elem.className,cur))elem.className+=(elem.className?" ":"")+cur;});},remove:function(elem,c){elem.className=c!=undefined?jQuery.grep(elem.className.split(/\s+/),function(cur){return!jQuery.className.has(c,cur);}).join(" "):"";},has:function(t,c){return jQuery.inArray(c,(t.className||t).toString().split(/\s+/))>-1;}},swap:function(e,o,f){for(var i in o){e.style["old"+i]=e.style[i];e.style[i]=o[i];}f.apply(e,[]);for(var i in o)e.style[i]=e.style["old"+i];},css:function(e,p){if(p=="height"||p=="width"){var old={},oHeight,oWidth,d=["Top","Bottom","Right","Left"];jQuery.each(d,function(){old["padding"+this]=0;old["border"+this+"Width"]=0;});jQuery.swap(e,old,function(){if(jQuery(e).is(':visible')){oHeight=e.offsetHeight;oWidth=e.offsetWidth;}else{e=jQuery(e.cloneNode(true)).find(":radio").removeAttr("checked").end().css({visibility:"hidden",position:"absolute",display:"block",right:"0",left:"0"}).appendTo(e.parentNode)[0];var parPos=jQuery.css(e.parentNode,"position")||"static";if(parPos=="static")e.parentNode.style.position="relative";oHeight=e.clientHeight;oWidth=e.clientWidth;if(parPos=="static")e.parentNode.style.position="static";e.parentNode.removeChild(e);}});return p=="height"?oHeight:oWidth;}return jQuery.curCSS(e,p);},curCSS:function(elem,prop,force){var ret,stack=[],swap=[];function color(a){if(!jQuery.browser.safari)return false;var ret=document.defaultView.getComputedStyle(a,null);return!ret||ret.getPropertyValue("color")=="";}if(prop=="opacity"&&jQuery.browser.msie){ret=jQuery.attr(elem.style,"opacity");return ret==""?"1":ret;}if(prop.match(/float/i))prop=styleFloat;if(!force&&elem.style[prop])ret=elem.style[prop];else if(document.defaultView&&document.defaultView.getComputedStyle){if(prop.match(/float/i))prop="float";prop=prop.replace(/([A-Z])/g,"-$1").toLowerCase();var cur=document.defaultView.getComputedStyle(elem,null);if(cur&&!color(elem))ret=cur.getPropertyValue(prop);else{for(var a=elem;a&&color(a);a=a.parentNode)stack.unshift(a);for(a=0;a<stack.length;a++)if(color(stack[a])){swap[a]=stack[a].style.display;stack[a].style.display="block";}ret=prop=="display"&&swap[stack.length-1]!=null?"none":document.defaultView.getComputedStyle(elem,null).getPropertyValue(prop)||"";for(a=0;a<swap.length;a++)if(swap[a]!=null)stack[a].style.display=swap[a];}if(prop=="opacity"&&ret=="")ret="1";}else if(elem.currentStyle){var newProp=prop.replace(/\-(\w)/g,function(m,c){return c.toUpperCase();});ret=elem.currentStyle[prop]||elem.currentStyle[newProp];if(!/^\d+(px)?$/i.test(ret)&&/^\d/.test(ret)){var style=elem.style.left;var runtimeStyle=elem.runtimeStyle.left;elem.runtimeStyle.left=elem.currentStyle.left;elem.style.left=ret||0;ret=elem.style.pixelLeft+"px";elem.style.left=style;elem.runtimeStyle.left=runtimeStyle;}}return ret;},clean:function(a,doc){var r=[];doc=doc||document;jQuery.each(a,function(i,arg){if(!arg)return;if(arg.constructor==Number)arg=arg.toString();if(typeof arg=="string"){arg=arg.replace(/(<(\w+)[^>]*?)\/>/g,function(m,all,tag){return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area)$/i)?m:all+"></"+tag+">";});var s=jQuery.trim(arg).toLowerCase(),div=doc.createElement("div"),tb=[];var wrap=!s.indexOf("<opt")&&[1,"<select>","</select>"]||!s.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||s.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!s.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!s.indexOf("<td")||!s.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!s.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||jQuery.browser.msie&&[1,"div<div>","</div>"]||[0,"",""];div.innerHTML=wrap[1]+arg+wrap[2];while(wrap[0]--)div=div.lastChild;if(jQuery.browser.msie){if(!s.indexOf("<table")&&s.indexOf("<tbody")<0)tb=div.firstChild&&div.firstChild.childNodes;else if(wrap[1]=="<table>"&&s.indexOf("<tbody")<0)tb=div.childNodes;for(var n=tb.length-1;n>=0;--n)if(jQuery.nodeName(tb[n],"tbody")&&!tb[n].childNodes.length)tb[n].parentNode.removeChild(tb[n]);if(/^\s/.test(arg))div.insertBefore(doc.createTextNode(arg.match(/^\s*/)[0]),div.firstChild);}arg=jQuery.makeArray(div.childNodes);}if(0===arg.length&&(!jQuery.nodeName(arg,"form")&&!jQuery.nodeName(arg,"select")))return;if(arg[0]==undefined||jQuery.nodeName(arg,"form")||arg.options)r.push(arg);else
  293.24 +r=jQuery.merge(r,arg);});return r;},attr:function(elem,name,value){var fix=jQuery.isXMLDoc(elem)?{}:jQuery.props;if(name=="selected"&&jQuery.browser.safari)elem.parentNode.selectedIndex;if(fix[name]){if(value!=undefined)elem[fix[name]]=value;return elem[fix[name]];}else if(jQuery.browser.msie&&name=="style")return jQuery.attr(elem.style,"cssText",value);else if(value==undefined&&jQuery.browser.msie&&jQuery.nodeName(elem,"form")&&(name=="action"||name=="method"))return elem.getAttributeNode(name).nodeValue;else if(elem.tagName){if(value!=undefined){if(name=="type"&&jQuery.nodeName(elem,"input")&&elem.parentNode)throw"type property can't be changed";elem.setAttribute(name,value);}if(jQuery.browser.msie&&/href|src/.test(name)&&!jQuery.isXMLDoc(elem))return elem.getAttribute(name,2);return elem.getAttribute(name);}else{if(name=="opacity"&&jQuery.browser.msie){if(value!=undefined){elem.zoom=1;elem.filter=(elem.filter||"").replace(/alpha\([^)]*\)/,"")+(parseFloat(value).toString()=="NaN"?"":"alpha(opacity="+value*100+")");}return elem.filter?(parseFloat(elem.filter.match(/opacity=([^)]*)/)[1])/100).toString():"";}name=name.replace(/-([a-z])/ig,function(z,b){return b.toUpperCase();});if(value!=undefined)elem[name]=value;return elem[name];}},trim:function(t){return(t||"").replace(/^\s+|\s+$/g,"");},makeArray:function(a){var r=[];if(typeof a!="array")for(var i=0,al=a.length;i<al;i++)r.push(a[i]);else
  293.25 +r=a.slice(0);return r;},inArray:function(b,a){for(var i=0,al=a.length;i<al;i++)if(a[i]==b)return i;return-1;},merge:function(first,second){if(jQuery.browser.msie){for(var i=0;second[i];i++)if(second[i].nodeType!=8)first.push(second[i]);}else
  293.26 +for(var i=0;second[i];i++)first.push(second[i]);return first;},unique:function(first){var r=[],done={};try{for(var i=0,fl=first.length;i<fl;i++){var id=jQuery.data(first[i]);if(!done[id]){done[id]=true;r.push(first[i]);}}}catch(e){r=first;}return r;},grep:function(elems,fn,inv){if(typeof fn=="string")fn=eval("false||function(a,i){return "+fn+"}");var result=[];for(var i=0,el=elems.length;i<el;i++)if(!inv&&fn(elems[i],i)||inv&&!fn(elems[i],i))result.push(elems[i]);return result;},map:function(elems,fn){if(typeof fn=="string")fn=eval("false||function(a){return "+fn+"}");var result=[];for(var i=0,el=elems.length;i<el;i++){var val=fn(elems[i],i);if(val!==null&&val!=undefined){if(val.constructor!=Array)val=[val];result=result.concat(val);}}return result;}});var userAgent=navigator.userAgent.toLowerCase();jQuery.browser={version:(userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[])[1],safari:/webkit/.test(userAgent),opera:/opera/.test(userAgent),msie:/msie/.test(userAgent)&&!/opera/.test(userAgent),mozilla:/mozilla/.test(userAgent)&&!/(compatible|webkit)/.test(userAgent)};var styleFloat=jQuery.browser.msie?"styleFloat":"cssFloat";jQuery.extend({boxModel:!jQuery.browser.msie||document.compatMode=="CSS1Compat",styleFloat:jQuery.browser.msie?"styleFloat":"cssFloat",props:{"for":"htmlFor","class":"className","float":styleFloat,cssFloat:styleFloat,styleFloat:styleFloat,innerHTML:"innerHTML",className:"className",value:"value",disabled:"disabled",checked:"checked",readonly:"readOnly",selected:"selected",maxlength:"maxLength"}});jQuery.each({parent:"a.parentNode",parents:"jQuery.dir(a,'parentNode')",next:"jQuery.nth(a,2,'nextSibling')",prev:"jQuery.nth(a,2,'previousSibling')",nextAll:"jQuery.dir(a,'nextSibling')",prevAll:"jQuery.dir(a,'previousSibling')",siblings:"jQuery.sibling(a.parentNode.firstChild,a)",children:"jQuery.sibling(a.firstChild)",contents:"jQuery.nodeName(a,'iframe')?a.contentDocument||a.contentWindow.document:jQuery.makeArray(a.childNodes)"},function(i,n){jQuery.fn[i]=function(a){var ret=jQuery.map(this,n);if(a&&typeof a=="string")ret=jQuery.multiFilter(a,ret);return this.pushStack(jQuery.unique(ret));};});jQuery.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(i,n){jQuery.fn[i]=function(){var a=arguments;return this.each(function(){for(var j=0,al=a.length;j<al;j++)jQuery(a[j])[n](this);});};});jQuery.each({removeAttr:function(key){jQuery.attr(this,key,"");this.removeAttribute(key);},addClass:function(c){jQuery.className.add(this,c);},removeClass:function(c){jQuery.className.remove(this,c);},toggleClass:function(c){jQuery.className[jQuery.className.has(this,c)?"remove":"add"](this,c);},remove:function(a){if(!a||jQuery.filter(a,[this]).r.length){jQuery.removeData(this);this.parentNode.removeChild(this);}},empty:function(){jQuery("*",this).each(function(){jQuery.removeData(this);});while(this.firstChild)this.removeChild(this.firstChild);}},function(i,n){jQuery.fn[i]=function(){return this.each(n,arguments);};});jQuery.each(["Height","Width"],function(i,name){var n=name.toLowerCase();jQuery.fn[n]=function(h){return this[0]==window?jQuery.browser.safari&&self["inner"+name]||jQuery.boxModel&&Math.max(document.documentElement["client"+name],document.body["client"+name])||document.body["client"+name]:this[0]==document?Math.max(document.body["scroll"+name],document.body["offset"+name]):h==undefined?(this.length?jQuery.css(this[0],n):null):this.css(n,h.constructor==String?h:h+"px");};});var chars=jQuery.browser.safari&&parseInt(jQuery.browser.version)<417?"(?:[\\w*_-]|\\\\.)":"(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",quickChild=new RegExp("^>\\s*("+chars+"+)"),quickID=new RegExp("^("+chars+"+)(#)("+chars+"+)"),quickClass=new RegExp("^([#.]?)("+chars+"*)");jQuery.extend({expr:{"":"m[2]=='*'||jQuery.nodeName(a,m[2])","#":"a.getAttribute('id')==m[2]",":":{lt:"i<m[3]-0",gt:"i>m[3]-0",nth:"m[3]-0==i",eq:"m[3]-0==i",first:"i==0",last:"i==r.length-1",even:"i%2==0",odd:"i%2","first-child":"a.parentNode.getElementsByTagName('*')[0]==a","last-child":"jQuery.nth(a.parentNode.lastChild,1,'previousSibling')==a","only-child":"!jQuery.nth(a.parentNode.lastChild,2,'previousSibling')",parent:"a.firstChild",empty:"!a.firstChild",contains:"(a.textContent||a.innerText||jQuery(a).text()||'').indexOf(m[3])>=0",visible:'"hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden"',hidden:'"hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden"',enabled:"!a.disabled",disabled:"a.disabled",checked:"a.checked",selected:"a.selected||jQuery.attr(a,'selected')",text:"'text'==a.type",radio:"'radio'==a.type",checkbox:"'checkbox'==a.type",file:"'file'==a.type",password:"'password'==a.type",submit:"'submit'==a.type",image:"'image'==a.type",reset:"'reset'==a.type",button:'"button"==a.type||jQuery.nodeName(a,"button")',input:"/input|select|textarea|button/i.test(a.nodeName)",has:"jQuery.find(m[3],a).length",header:"/h\\d/i.test(a.nodeName)",animated:"jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length"}},parse:[/^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,new RegExp("^([:.#]*)("+chars+"+)")],multiFilter:function(expr,elems,not){var old,cur=[];while(expr&&expr!=old){old=expr;var f=jQuery.filter(expr,elems,not);expr=f.t.replace(/^\s*,\s*/,"");cur=not?elems=f.r:jQuery.merge(cur,f.r);}return cur;},find:function(t,context){if(typeof t!="string")return[t];if(context&&!context.nodeType)context=null;context=context||document;var ret=[context],done=[],last;while(t&&last!=t){var r=[];last=t;t=jQuery.trim(t);var foundToken=false;var re=quickChild;var m=re.exec(t);if(m){var nodeName=m[1].toUpperCase();for(var i=0;ret[i];i++)for(var c=ret[i].firstChild;c;c=c.nextSibling)if(c.nodeType==1&&(nodeName=="*"||c.nodeName.toUpperCase()==nodeName.toUpperCase()))r.push(c);ret=r;t=t.replace(re,"");if(t.indexOf(" ")==0)continue;foundToken=true;}else{re=/^([>+~])\s*(\w*)/i;if((m=re.exec(t))!=null){r=[];var nodeName=m[2],merge={};m=m[1];for(var j=0,rl=ret.length;j<rl;j++){var n=m=="~"||m=="+"?ret[j].nextSibling:ret[j].firstChild;for(;n;n=n.nextSibling)if(n.nodeType==1){var id=jQuery.data(n);if(m=="~"&&merge[id])break;if(!nodeName||n.nodeName.toUpperCase()==nodeName.toUpperCase()){if(m=="~")merge[id]=true;r.push(n);}if(m=="+")break;}}ret=r;t=jQuery.trim(t.replace(re,""));foundToken=true;}}if(t&&!foundToken){if(!t.indexOf(",")){if(context==ret[0])ret.shift();done=jQuery.merge(done,ret);r=ret=[context];t=" "+t.substr(1,t.length);}else{var re2=quickID;var m=re2.exec(t);if(m){m=[0,m[2],m[3],m[1]];}else{re2=quickClass;m=re2.exec(t);}m[2]=m[2].replace(/\\/g,"");var elem=ret[ret.length-1];if(m[1]=="#"&&elem&&elem.getElementById&&!jQuery.isXMLDoc(elem)){var oid=elem.getElementById(m[2]);if((jQuery.browser.msie||jQuery.browser.opera)&&oid&&typeof oid.id=="string"&&oid.id!=m[2])oid=jQuery('[@id="'+m[2]+'"]',elem)[0];ret=r=oid&&(!m[3]||jQuery.nodeName(oid,m[3]))?[oid]:[];}else{for(var i=0;ret[i];i++){var tag=m[1]=="#"&&m[3]?m[3]:m[1]!=""||m[0]==""?"*":m[2];if(tag=="*"&&ret[i].nodeName.toLowerCase()=="object")tag="param";r=jQuery.merge(r,ret[i].getElementsByTagName(tag));}if(m[1]==".")r=jQuery.classFilter(r,m[2]);if(m[1]=="#"){var tmp=[];for(var i=0;r[i];i++)if(r[i].getAttribute("id")==m[2]){tmp=[r[i]];break;}r=tmp;}ret=r;}t=t.replace(re2,"");}}if(t){var val=jQuery.filter(t,r);ret=r=val.r;t=jQuery.trim(val.t);}}if(t)ret=[];if(ret&&context==ret[0])ret.shift();done=jQuery.merge(done,ret);return done;},classFilter:function(r,m,not){m=" "+m+" ";var tmp=[];for(var i=0;r[i];i++){var pass=(" "+r[i].className+" ").indexOf(m)>=0;if(!not&&pass||not&&!pass)tmp.push(r[i]);}return tmp;},filter:function(t,r,not){var last;while(t&&t!=last){last=t;var p=jQuery.parse,m;for(var i=0;p[i];i++){m=p[i].exec(t);if(m){t=t.substring(m[0].length);m[2]=m[2].replace(/\\/g,"");break;}}if(!m)break;if(m[1]==":"&&m[2]=="not")r=jQuery.filter(m[3],r,true).r;else if(m[1]==".")r=jQuery.classFilter(r,m[2],not);else if(m[1]=="["){var tmp=[],type=m[3];for(var i=0,rl=r.length;i<rl;i++){var a=r[i],z=a[jQuery.props[m[2]]||m[2]];if(z==null||/href|src|selected/.test(m[2]))z=jQuery.attr(a,m[2])||'';if((type==""&&!!z||type=="="&&z==m[5]||type=="!="&&z!=m[5]||type=="^="&&z&&!z.indexOf(m[5])||type=="$="&&z.substr(z.length-m[5].length)==m[5]||(type=="*="||type=="~=")&&z.indexOf(m[5])>=0)^not)tmp.push(a);}r=tmp;}else if(m[1]==":"&&m[2]=="nth-child"){var merge={},tmp=[],test=/(\d*)n\+?(\d*)/.exec(m[3]=="even"&&"2n"||m[3]=="odd"&&"2n+1"||!/\D/.test(m[3])&&"n+"+m[3]||m[3]),first=(test[1]||1)-0,last=test[2]-0;for(var i=0,rl=r.length;i<rl;i++){var node=r[i],parentNode=node.parentNode,id=jQuery.data(parentNode);if(!merge[id]){var c=1;for(var n=parentNode.firstChild;n;n=n.nextSibling)if(n.nodeType==1)n.nodeIndex=c++;merge[id]=true;}var add=false;if(first==1){if(last==0||node.nodeIndex==last)add=true;}else if((node.nodeIndex+last)%first==0)add=true;if(add^not)tmp.push(node);}r=tmp;}else{var f=jQuery.expr[m[1]];if(typeof f!="string")f=jQuery.expr[m[1]][m[2]];f=eval("false||function(a,i){return "+f+"}");r=jQuery.grep(r,f,not);}}return{r:r,t:t};},dir:function(elem,dir){var matched=[];var cur=elem[dir];while(cur&&cur!=document){if(cur.nodeType==1)matched.push(cur);cur=cur[dir];}return matched;},nth:function(cur,result,dir,elem){result=result||1;var num=0;for(;cur;cur=cur[dir])if(cur.nodeType==1&&++num==result)break;return cur;},sibling:function(n,elem){var r=[];for(;n;n=n.nextSibling){if(n.nodeType==1&&(!elem||n!=elem))r.push(n);}return r;}});jQuery.event={add:function(element,type,handler,data){if(jQuery.browser.msie&&element.setInterval!=undefined)element=window;if(!handler.guid)handler.guid=this.guid++;if(data!=undefined){var fn=handler;handler=function(){return fn.apply(this,arguments);};handler.data=data;handler.guid=fn.guid;}var parts=type.split(".");type=parts[0];handler.type=parts[1];var events=jQuery.data(element,"events")||jQuery.data(element,"events",{});var handle=jQuery.data(element,"handle",function(){var val;if(typeof jQuery=="undefined"||jQuery.event.triggered)return val;val=jQuery.event.handle.apply(element,arguments);return val;});var handlers=events[type];if(!handlers){handlers=events[type]={};if(element.addEventListener)element.addEventListener(type,handle,false);else
  293.27 +element.attachEvent("on"+type,handle);}handlers[handler.guid]=handler;this.global[type]=true;},guid:1,global:{},remove:function(element,type,handler){var events=jQuery.data(element,"events"),ret,index;if(typeof type=="string"){var parts=type.split(".");type=parts[0];}if(events){if(type&&type.type){handler=type.handler;type=type.type;}if(!type){for(type in events)this.remove(element,type);}else if(events[type]){if(handler)delete events[type][handler.guid];else
  293.28 +for(handler in events[type])if(!parts[1]||events[type][handler].type==parts[1])delete events[type][handler];for(ret in events[type])break;if(!ret){if(element.removeEventListener)element.removeEventListener(type,jQuery.data(element,"handle"),false);else
  293.29 +element.detachEvent("on"+type,jQuery.data(element,"handle"));ret=null;delete events[type];}}for(ret in events)break;if(!ret){jQuery.removeData(element,"events");jQuery.removeData(element,"handle");}}},trigger:function(type,data,element,donative,extra){data=jQuery.makeArray(data||[]);if(!element){if(this.global[type])jQuery("*").add([window,document]).trigger(type,data);}else{var val,ret,fn=jQuery.isFunction(element[type]||null),evt=!data[0]||!data[0].preventDefault;if(evt)data.unshift(this.fix({type:type,target:element}));data[0].type=type;if(jQuery.isFunction(jQuery.data(element,"handle")))val=jQuery.data(element,"handle").apply(element,data);if(!fn&&element["on"+type]&&element["on"+type].apply(element,data)===false)val=false;if(evt)data.shift();if(extra&&extra.apply(element,data)===false)val=false;if(fn&&donative!==false&&val!==false&&!(jQuery.nodeName(element,'a')&&type=="click")){this.triggered=true;element[type]();}this.triggered=false;}return val;},handle:function(event){var val;event=jQuery.event.fix(event||window.event||{});var parts=event.type.split(".");event.type=parts[0];var c=jQuery.data(this,"events")&&jQuery.data(this,"events")[event.type],args=Array.prototype.slice.call(arguments,1);args.unshift(event);for(var j in c){args[0].handler=c[j];args[0].data=c[j].data;if(!parts[1]||c[j].type==parts[1]){var tmp=c[j].apply(this,args);if(val!==false)val=tmp;if(tmp===false){event.preventDefault();event.stopPropagation();}}}if(jQuery.browser.msie)event.target=event.preventDefault=event.stopPropagation=event.handler=event.data=null;return val;},fix:function(event){var originalEvent=event;event=jQuery.extend({},originalEvent);event.preventDefault=function(){if(originalEvent.preventDefault)originalEvent.preventDefault();originalEvent.returnValue=false;};event.stopPropagation=function(){if(originalEvent.stopPropagation)originalEvent.stopPropagation();originalEvent.cancelBubble=true;};if(!event.target&&event.srcElement)event.target=event.srcElement;if(jQuery.browser.safari&&event.target.nodeType==3)event.target=originalEvent.target.parentNode;if(!event.relatedTarget&&event.fromElement)event.relatedTarget=event.fromElement==event.target?event.toElement:event.fromElement;if(event.pageX==null&&event.clientX!=null){var e=document.documentElement,b=document.body;event.pageX=event.clientX+(e&&e.scrollLeft||b.scrollLeft||0);event.pageY=event.clientY+(e&&e.scrollTop||b.scrollTop||0);}if(!event.which&&(event.charCode||event.keyCode))event.which=event.charCode||event.keyCode;if(!event.metaKey&&event.ctrlKey)event.metaKey=event.ctrlKey;if(!event.which&&event.button)event.which=(event.button&1?1:(event.button&2?3:(event.button&4?2:0)));return event;}};jQuery.fn.extend({bind:function(type,data,fn){return type=="unload"?this.one(type,data,fn):this.each(function(){jQuery.event.add(this,type,fn||data,fn&&data);});},one:function(type,data,fn){return this.each(function(){jQuery.event.add(this,type,function(event){jQuery(this).unbind(event);return(fn||data).apply(this,arguments);},fn&&data);});},unbind:function(type,fn){return this.each(function(){jQuery.event.remove(this,type,fn);});},trigger:function(type,data,fn){return this.each(function(){jQuery.event.trigger(type,data,this,true,fn);});},triggerHandler:function(type,data,fn){if(this[0])return jQuery.event.trigger(type,data,this[0],false,fn);},toggle:function(){var a=arguments;return this.click(function(e){this.lastToggle=0==this.lastToggle?1:0;e.preventDefault();return a[this.lastToggle].apply(this,[e])||false;});},hover:function(f,g){function handleHover(e){var p=e.relatedTarget;while(p&&p!=this)try{p=p.parentNode;}catch(e){p=this;};if(p==this)return false;return(e.type=="mouseover"?f:g).apply(this,[e]);}return this.mouseover(handleHover).mouseout(handleHover);},ready:function(f){bindReady();if(jQuery.isReady)f.apply(document,[jQuery]);else
  293.30 +jQuery.readyList.push(function(){return f.apply(this,[jQuery]);});return this;}});jQuery.extend({isReady:false,readyList:[],ready:function(){if(!jQuery.isReady){jQuery.isReady=true;if(jQuery.readyList){jQuery.each(jQuery.readyList,function(){this.apply(document);});jQuery.readyList=null;}if(jQuery.browser.mozilla||jQuery.browser.opera)document.removeEventListener("DOMContentLoaded",jQuery.ready,false);if(!window.frames.length)jQuery(window).load(function(){jQuery("#__ie_init").remove();});}}});jQuery.each(("blur,focus,load,resize,scroll,unload,click,dblclick,"+"mousedown,mouseup,mousemove,mouseover,mouseout,change,select,"+"submit,keydown,keypress,keyup,error").split(","),function(i,o){jQuery.fn[o]=function(f){return f?this.bind(o,f):this.trigger(o);};});var readyBound=false;function bindReady(){if(readyBound)return;readyBound=true;if(jQuery.browser.mozilla||jQuery.browser.opera)document.addEventListener("DOMContentLoaded",jQuery.ready,false);else if(jQuery.browser.msie){document.write("<scr"+"ipt id=__ie_init defer=true "+"src=//:><\/script>");var script=document.getElementById("__ie_init");if(script)script.onreadystatechange=function(){if(this.readyState!="complete")return;jQuery.ready();};script=null;}else if(jQuery.browser.safari)jQuery.safariTimer=setInterval(function(){if(document.readyState=="loaded"||document.readyState=="complete"){clearInterval(jQuery.safariTimer);jQuery.safariTimer=null;jQuery.ready();}},10);jQuery.event.add(window,"load",jQuery.ready);}jQuery.fn.extend({load:function(url,params,callback){if(jQuery.isFunction(url))return this.bind("load",url);var off=url.indexOf(" ");if(off>=0){var selector=url.slice(off,url.length);url=url.slice(0,off);}callback=callback||function(){};var type="GET";if(params)if(jQuery.isFunction(params)){callback=params;params=null;}else{params=jQuery.param(params);type="POST";}var self=this;jQuery.ajax({url:url,type:type,data:params,complete:function(res,status){if(status=="success"||status=="notmodified")self.html(selector?jQuery("<div/>").append(res.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(selector):res.responseText);setTimeout(function(){self.each(callback,[res.responseText,status,res]);},13);}});return this;},serialize:function(){return jQuery.param(this.serializeArray());},serializeArray:function(){return this.map(function(){return jQuery.nodeName(this,"form")?jQuery.makeArray(this.elements):this;}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password/i.test(this.type));}).map(function(i,elem){var val=jQuery(this).val();return val==null?null:val.constructor==Array?jQuery.map(val,function(val,i){return{name:elem.name,value:val};}):{name:elem.name,value:val};}).get();}});jQuery.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(i,o){jQuery.fn[o]=function(f){return this.bind(o,f);};});var jsc=(new Date).getTime();jQuery.extend({get:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data=null;}return jQuery.ajax({type:"GET",url:url,data:data,success:callback,dataType:type});},getScript:function(url,callback){return jQuery.get(url,null,callback,"script");},getJSON:function(url,data,callback){return jQuery.get(url,data,callback,"json");},post:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data={};}return jQuery.ajax({type:"POST",url:url,data:data,success:callback,dataType:type});},ajaxSetup:function(settings){jQuery.extend(jQuery.ajaxSettings,settings);},ajaxSettings:{global:true,type:"GET",timeout:0,contentType:"application/x-www-form-urlencoded",processData:true,async:true,data:null},lastModified:{},ajax:function(s){var jsonp,jsre=/=(\?|%3F)/g,status,data;s=jQuery.extend(true,s,jQuery.extend(true,{},jQuery.ajaxSettings,s));if(s.data&&s.processData&&typeof s.data!="string")s.data=jQuery.param(s.data);if(s.dataType=="jsonp"){if(s.type.toLowerCase()=="get"){if(!s.url.match(jsre))s.url+=(s.url.match(/\?/)?"&":"?")+(s.jsonp||"callback")+"=?";}else if(!s.data||!s.data.match(jsre))s.data=(s.data?s.data+"&":"")+(s.jsonp||"callback")+"=?";s.dataType="json";}if(s.dataType=="json"&&(s.data&&s.data.match(jsre)||s.url.match(jsre))){jsonp="jsonp"+jsc++;if(s.data)s.data=s.data.replace(jsre,"="+jsonp);s.url=s.url.replace(jsre,"="+jsonp);s.dataType="script";window[jsonp]=function(tmp){data=tmp;success();complete();window[jsonp]=undefined;try{delete window[jsonp];}catch(e){}};}if(s.dataType=="script"&&s.cache==null)s.cache=false;if(s.cache===false&&s.type.toLowerCase()=="get")s.url+=(s.url.match(/\?/)?"&":"?")+"_="+(new Date()).getTime();if(s.data&&s.type.toLowerCase()=="get"){s.url+=(s.url.match(/\?/)?"&":"?")+s.data;s.data=null;}if(s.global&&!jQuery.active++)jQuery.event.trigger("ajaxStart");if(!s.url.indexOf("http")&&s.dataType=="script"){var head=document.getElementsByTagName("head")[0];var script=document.createElement("script");script.src=s.url;if(!jsonp&&(s.success||s.complete)){var done=false;script.onload=script.onreadystatechange=function(){if(!done&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){done=true;success();complete();head.removeChild(script);}};}head.appendChild(script);return;}var requestDone=false;var xml=window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest();xml.open(s.type,s.url,s.async);if(s.data)xml.setRequestHeader("Content-Type",s.contentType);if(s.ifModified)xml.setRequestHeader("If-Modified-Since",jQuery.lastModified[s.url]||"Thu, 01 Jan 1970 00:00:00 GMT");xml.setRequestHeader("X-Requested-With","XMLHttpRequest");if(s.beforeSend)s.beforeSend(xml);if(s.global)jQuery.event.trigger("ajaxSend",[xml,s]);var onreadystatechange=function(isTimeout){if(!requestDone&&xml&&(xml.readyState==4||isTimeout=="timeout")){requestDone=true;if(ival){clearInterval(ival);ival=null;}status=isTimeout=="timeout"&&"timeout"||!jQuery.httpSuccess(xml)&&"error"||s.ifModified&&jQuery.httpNotModified(xml,s.url)&&"notmodified"||"success";if(status=="success"){try{data=jQuery.httpData(xml,s.dataType);}catch(e){status="parsererror";}}if(status=="success"){var modRes;try{modRes=xml.getResponseHeader("Last-Modified");}catch(e){}if(s.ifModified&&modRes)jQuery.lastModified[s.url]=modRes;if(!jsonp)success();}else
  293.31 +jQuery.handleError(s,xml,status);complete();if(s.async)xml=null;}};if(s.async){var ival=setInterval(onreadystatechange,13);if(s.timeout>0)setTimeout(function(){if(xml){xml.abort();if(!requestDone)onreadystatechange("timeout");}},s.timeout);}try{xml.send(s.data);}catch(e){jQuery.handleError(s,xml,null,e);}if(!s.async)onreadystatechange();return xml;function success(){if(s.success)s.success(data,status);if(s.global)jQuery.event.trigger("ajaxSuccess",[xml,s]);}function complete(){if(s.complete)s.complete(xml,status);if(s.global)jQuery.event.trigger("ajaxComplete",[xml,s]);if(s.global&&!--jQuery.active)jQuery.event.trigger("ajaxStop");}},handleError:function(s,xml,status,e){if(s.error)s.error(xml,status,e);if(s.global)jQuery.event.trigger("ajaxError",[xml,s,e]);},active:0,httpSuccess:function(r){try{return!r.status&&location.protocol=="file:"||(r.status>=200&&r.status<300)||r.status==304||jQuery.browser.safari&&r.status==undefined;}catch(e){}return false;},httpNotModified:function(xml,url){try{var xmlRes=xml.getResponseHeader("Last-Modified");return xml.status==304||xmlRes==jQuery.lastModified[url]||jQuery.browser.safari&&xml.status==undefined;}catch(e){}return false;},httpData:function(r,type){var ct=r.getResponseHeader("content-type");var xml=type=="xml"||!type&&ct&&ct.indexOf("xml")>=0;var data=xml?r.responseXML:r.responseText;if(xml&&data.documentElement.tagName=="parsererror")throw"parsererror";if(type=="script")jQuery.globalEval(data);if(type=="json")data=eval("("+data+")");return data;},param:function(a){var s=[];if(a.constructor==Array||a.jquery)jQuery.each(a,function(){s.push(encodeURIComponent(this.name)+"="+encodeURIComponent(this.value));});else
  293.32 +for(var j in a)if(a[j]&&a[j].constructor==Array)jQuery.each(a[j],function(){s.push(encodeURIComponent(j)+"="+encodeURIComponent(this));});else
  293.33 +s.push(encodeURIComponent(j)+"="+encodeURIComponent(a[j]));return s.join("&").replace(/%20/g,"+");}});jQuery.fn.extend({show:function(speed,callback){return speed?this.animate({height:"show",width:"show",opacity:"show"},speed,callback):this.filter(":hidden").each(function(){this.style.display=this.oldblock?this.oldblock:"";if(jQuery.css(this,"display")=="none")this.style.display="block";}).end();},hide:function(speed,callback){return speed?this.animate({height:"hide",width:"hide",opacity:"hide"},speed,callback):this.filter(":visible").each(function(){this.oldblock=this.oldblock||jQuery.css(this,"display");if(this.oldblock=="none")this.oldblock="block";this.style.display="none";}).end();},_toggle:jQuery.fn.toggle,toggle:function(fn,fn2){return jQuery.isFunction(fn)&&jQuery.isFunction(fn2)?this._toggle(fn,fn2):fn?this.animate({height:"toggle",width:"toggle",opacity:"toggle"},fn,fn2):this.each(function(){jQuery(this)[jQuery(this).is(":hidden")?"show":"hide"]();});},slideDown:function(speed,callback){return this.animate({height:"show"},speed,callback);},slideUp:function(speed,callback){return this.animate({height:"hide"},speed,callback);},slideToggle:function(speed,callback){return this.animate({height:"toggle"},speed,callback);},fadeIn:function(speed,callback){return this.animate({opacity:"show"},speed,callback);},fadeOut:function(speed,callback){return this.animate({opacity:"hide"},speed,callback);},fadeTo:function(speed,to,callback){return this.animate({opacity:to},speed,callback);},animate:function(prop,speed,easing,callback){var opt=jQuery.speed(speed,easing,callback);return this[opt.queue===false?"each":"queue"](function(){opt=jQuery.extend({},opt);var hidden=jQuery(this).is(":hidden"),self=this;for(var p in prop){if(prop[p]=="hide"&&hidden||prop[p]=="show"&&!hidden)return jQuery.isFunction(opt.complete)&&opt.complete.apply(this);if(p=="height"||p=="width"){opt.display=jQuery.css(this,"display");opt.overflow=this.style.overflow;}}if(opt.overflow!=null)this.style.overflow="hidden";opt.curAnim=jQuery.extend({},prop);jQuery.each(prop,function(name,val){var e=new jQuery.fx(self,opt,name);if(/toggle|show|hide/.test(val))e[val=="toggle"?hidden?"show":"hide":val](prop);else{var parts=val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),start=e.cur(true)||0;if(parts){var end=parseFloat(parts[2]),unit=parts[3]||"px";if(unit!="px"){self.style[name]=(end||1)+unit;start=((end||1)/e.cur(true))*start;self.style[name]=start+unit;}if(parts[1])end=((parts[1]=="-="?-1:1)*end)+start;e.custom(start,end,unit);}else
  293.34 +e.custom(start,val,"");}});return true;});},queue:function(type,fn){if(jQuery.isFunction(type)){fn=type;type="fx";}if(!type||(typeof type=="string"&&!fn))return queue(this[0],type);return this.each(function(){if(fn.constructor==Array)queue(this,type,fn);else{queue(this,type).push(fn);if(queue(this,type).length==1)fn.apply(this);}});},stop:function(){var timers=jQuery.timers;return this.each(function(){for(var i=0;i<timers.length;i++)if(timers[i].elem==this)timers.splice(i--,1);}).dequeue();}});var queue=function(elem,type,array){if(!elem)return;var q=jQuery.data(elem,type+"queue");if(!q||array)q=jQuery.data(elem,type+"queue",array?jQuery.makeArray(array):[]);return q;};jQuery.fn.dequeue=function(type){type=type||"fx";return this.each(function(){var q=queue(this,type);q.shift();if(q.length)q[0].apply(this);});};jQuery.extend({speed:function(speed,easing,fn){var opt=speed&&speed.constructor==Object?speed:{complete:fn||!fn&&easing||jQuery.isFunction(speed)&&speed,duration:speed,easing:fn&&easing||easing&&easing.constructor!=Function&&easing};opt.duration=(opt.duration&&opt.duration.constructor==Number?opt.duration:{slow:600,fast:200}[opt.duration])||400;opt.old=opt.complete;opt.complete=function(){jQuery(this).dequeue();if(jQuery.isFunction(opt.old))opt.old.apply(this);};return opt;},easing:{linear:function(p,n,firstNum,diff){return firstNum+diff*p;},swing:function(p,n,firstNum,diff){return((-Math.cos(p*Math.PI)/2)+0.5)*diff+firstNum;}},timers:[],fx:function(elem,options,prop){this.options=options;this.elem=elem;this.prop=prop;if(!options.orig)options.orig={};}});jQuery.fx.prototype={update:function(){if(this.options.step)this.options.step.apply(this.elem,[this.now,this]);(jQuery.fx.step[this.prop]||jQuery.fx.step._default)(this);if(this.prop=="height"||this.prop=="width")this.elem.style.display="block";},cur:function(force){if(this.elem[this.prop]!=null&&this.elem.style[this.prop]==null)return this.elem[this.prop];var r=parseFloat(jQuery.curCSS(this.elem,this.prop,force));return r&&r>-10000?r:parseFloat(jQuery.css(this.elem,this.prop))||0;},custom:function(from,to,unit){this.startTime=(new Date()).getTime();this.start=from;this.end=to;this.unit=unit||this.unit||"px";this.now=this.start;this.pos=this.state=0;this.update();var self=this;function t(){return self.step();}t.elem=this.elem;jQuery.timers.push(t);if(jQuery.timers.length==1){var timer=setInterval(function(){var timers=jQuery.timers;for(var i=0;i<timers.length;i++)if(!timers[i]())timers.splice(i--,1);if(!timers.length)clearInterval(timer);},13);}},show:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.show=true;this.custom(0,this.cur());if(this.prop=="width"||this.prop=="height")this.elem.style[this.prop]="1px";jQuery(this.elem).show();},hide:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0);},step:function(){var t=(new Date()).getTime();if(t>this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var done=true;for(var i in this.options.curAnim)if(this.options.curAnim[i]!==true)done=false;if(done){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(jQuery.css(this.elem,"display")=="none")this.elem.style.display="block";}if(this.options.hide)this.elem.style.display="none";if(this.options.hide||this.options.show)for(var p in this.options.curAnim)jQuery.attr(this.elem.style,p,this.options.orig[p]);}if(done&&jQuery.isFunction(this.options.complete))this.options.complete.apply(this.elem);return false;}else{var n=t-this.startTime;this.state=n/this.options.duration;this.pos=jQuery.easing[this.options.easing||(jQuery.easing.swing?"swing":"linear")](this.state,n,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update();}return true;}};jQuery.fx.step={scrollLeft:function(fx){fx.elem.scrollLeft=fx.now;},scrollTop:function(fx){fx.elem.scrollTop=fx.now;},opacity:function(fx){jQuery.attr(fx.elem.style,"opacity",fx.now);},_default:function(fx){fx.elem.style[fx.prop]=fx.now+fx.unit;}};jQuery.fn.offset=function(){var left=0,top=0,elem=this[0],results;if(elem)with(jQuery.browser){var absolute=jQuery.css(elem,"position")=="absolute",parent=elem.parentNode,offsetParent=elem.offsetParent,doc=elem.ownerDocument,safari2=safari&&parseInt(version)<522;if(elem.getBoundingClientRect){box=elem.getBoundingClientRect();add(box.left+Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),box.top+Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));if(msie){var border=jQuery("html").css("borderWidth");border=(border=="medium"||jQuery.boxModel&&parseInt(version)>=7)&&2||border;add(-border,-border);}}else{add(elem.offsetLeft,elem.offsetTop);while(offsetParent){add(offsetParent.offsetLeft,offsetParent.offsetTop);if(mozilla&&/^t[d|h]$/i.test(parent.tagName)||!safari2)border(offsetParent);if(safari2&&!absolute&&jQuery.css(offsetParent,"position")=="absolute")absolute=true;offsetParent=offsetParent.offsetParent;}while(parent.tagName&&!/^body|html$/i.test(parent.tagName)){if(!/^inline|table-row.*$/i.test(jQuery.css(parent,"display")))add(-parent.scrollLeft,-parent.scrollTop);if(mozilla&&jQuery.css(parent,"overflow")!="visible")border(parent);parent=parent.parentNode;}if(safari2&&absolute)add(-doc.body.offsetLeft,-doc.body.offsetTop);}results={top:top,left:left};}return results;function border(elem){add(jQuery.css(elem,"borderLeftWidth"),jQuery.css(elem,"borderTopWidth"));}function add(l,t){left+=parseInt(l)||0;top+=parseInt(t)||0;}};})();
  293.35 \ No newline at end of file