diff options
21 files changed, 1956 insertions, 0 deletions
diff --git a/src/corsi/2012-seminari.txt b/src/corsi/2012-seminari.txt index 004963c..5fffe19 100644 --- a/src/corsi/2012-seminari.txt +++ b/src/corsi/2012-seminari.txt @@ -101,6 +101,14 @@ grandi software da milioni di righe di codice. Nel corso della serata si presenteranno la struttura di git e i workflow tipici del suo utilizzo. +Le slide in HTML/S5 sono `consultabili online +<2012-seminari/introduzione_a_git-2012-11-19/introduzione_a_git.html>`_ o +`scaricabili come tarball +<2012-seminari/introduzione_a_git-2012-11-19.tar.bz2>`_; +i sorgenti in reStructuredText sono disponibili in un `apposito +repository git +<http://git.home.trueelena.org/gitweb/?p=docs/introduzione_a_git.git>`_. + Ulteriori argomenti ------------------- diff --git a/src/corsi/2012-seminari/index.txt b/src/corsi/2012-seminari/index.txt index 2a5d58b..ea42818 100644 --- a/src/corsi/2012-seminari/index.txt +++ b/src/corsi/2012-seminari/index.txt @@ -4,6 +4,7 @@ file: rest_per_esempi-20120416.tar.bz2 file: rest_per_esempi-bin-20120416.tar.bz2 file: introduzione_Android_lifo_2.0.tgz + file: introduzione_a_git-2012-11-19.tar.bz2 file: generators-20120618.tar.bz2 file: volantino_seminari_autunno_2012.ps file: volantino_seminari_autunno_2012.svg diff --git a/src/corsi/2012-seminari/introduzione_a_git-2012-11-19.tar.bz2 b/src/corsi/2012-seminari/introduzione_a_git-2012-11-19.tar.bz2 Binary files differnew file mode 100644 index 0000000..f803aa3 --- /dev/null +++ b/src/corsi/2012-seminari/introduzione_a_git-2012-11-19.tar.bz2 diff --git a/src/corsi/2012-seminari/introduzione_a_git-2012-11-19/images/gitk01.png b/src/corsi/2012-seminari/introduzione_a_git-2012-11-19/images/gitk01.png Binary files differnew file mode 100644 index 0000000..7feedf9 --- /dev/null +++ b/src/corsi/2012-seminari/introduzione_a_git-2012-11-19/images/gitk01.png diff --git a/src/corsi/2012-seminari/introduzione_a_git-2012-11-19/images/gitk02.png b/src/corsi/2012-seminari/introduzione_a_git-2012-11-19/images/gitk02.png Binary files differnew file mode 100644 index 0000000..a33befd --- /dev/null +++ b/src/corsi/2012-seminari/introduzione_a_git-2012-11-19/images/gitk02.png diff --git a/src/corsi/2012-seminari/introduzione_a_git-2012-11-19/images/gitk03.png b/src/corsi/2012-seminari/introduzione_a_git-2012-11-19/images/gitk03.png Binary files differnew file mode 100644 index 0000000..c2ae4b3 --- /dev/null +++ b/src/corsi/2012-seminari/introduzione_a_git-2012-11-19/images/gitk03.png diff --git a/src/corsi/2012-seminari/introduzione_a_git-2012-11-19/images/gitk04.png b/src/corsi/2012-seminari/introduzione_a_git-2012-11-19/images/gitk04.png Binary files differnew file mode 100644 index 0000000..22ecfd1 --- /dev/null +++ b/src/corsi/2012-seminari/introduzione_a_git-2012-11-19/images/gitk04.png diff --git a/src/corsi/2012-seminari/introduzione_a_git-2012-11-19/images/index.txt b/src/corsi/2012-seminari/introduzione_a_git-2012-11-19/images/index.txt new file mode 100644 index 0000000..c2fb9c8 --- /dev/null +++ b/src/corsi/2012-seminari/introduzione_a_git-2012-11-19/images/index.txt @@ -0,0 +1,18 @@ +.. + restindex + include: no + file: gitk01.png + file: gitk02.png + file: gitk03.png + file: gitk04.png + /restindex + + uservalues + created: 2010-10-10T10:10:10Z + updated: 2010-10-10T10:10:10Z + /uservalues + + +.. + vim: set filetype=rst sw=3: + diff --git a/src/corsi/2012-seminari/introduzione_a_git-2012-11-19/index.txt b/src/corsi/2012-seminari/introduzione_a_git-2012-11-19/index.txt new file mode 100644 index 0000000..0ffbc3a --- /dev/null +++ b/src/corsi/2012-seminari/introduzione_a_git-2012-11-19/index.txt @@ -0,0 +1,15 @@ +.. + restindex + include: no + file: introduzione_a_git.html + /restindex + + uservalues + created: 2010-10-10T10:10:10Z + updated: 2010-10-10T10:10:10Z + /uservalues + + +.. + vim: set filetype=rst sw=3: + diff --git a/src/corsi/2012-seminari/introduzione_a_git-2012-11-19/introduzione_a_git.html b/src/corsi/2012-seminari/introduzione_a_git-2012-11-19/introduzione_a_git.html new file mode 100644 index 0000000..6d2fc7e --- /dev/null +++ b/src/corsi/2012-seminari/introduzione_a_git-2012-11-19/introduzione_a_git.html @@ -0,0 +1,1076 @@ +<?xml version="1.0" encoding="utf-8" ?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<meta name="generator" content="Docutils 0.8.1: http://docutils.sourceforge.net/" /> +<meta name="version" content="S5 1.1" /> +<title>Introduzione a GIT</title> +<style type="text/css"> + +/* +:Author: David Goodger (goodger@python.org) +:Id: $Id: html4css1.css 7056 2011-06-17 10:50:48Z milde $ +:Copyright: This stylesheet has been placed in the public domain. + +Default cascading style sheet for the HTML output of Docutils. + +See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to +customize this style sheet. +*/ + +/* used to remove borders from tables and images */ +.borderless, table.borderless td, table.borderless th { + border: 0 } + +table.borderless td, table.borderless th { + /* Override padding for "table.docutils td" with "! important". + The right padding separates the table cells. */ + padding: 0 0.5em 0 0 ! important } + +.first { + /* Override more specific margin styles with "! important". */ + margin-top: 0 ! important } + +.last, .with-subtitle { + margin-bottom: 0 ! important } + +.hidden { + display: none } + +a.toc-backref { + text-decoration: none ; + color: black } + +blockquote.epigraph { + margin: 2em 5em ; } + +dl.docutils dd { + margin-bottom: 0.5em } + +object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] { + overflow: hidden; +} + +/* Uncomment (and remove this text!) to get bold-faced definition list terms +dl.docutils dt { + font-weight: bold } +*/ + +div.abstract { + margin: 2em 5em } + +div.abstract p.topic-title { + font-weight: bold ; + text-align: center } + +div.admonition, div.attention, div.caution, div.danger, div.error, +div.hint, div.important, div.note, div.tip, div.warning { + margin: 2em ; + border: medium outset ; + padding: 1em } + +div.admonition p.admonition-title, div.hint p.admonition-title, +div.important p.admonition-title, div.note p.admonition-title, +div.tip p.admonition-title { + font-weight: bold ; + font-family: sans-serif } + +div.attention p.admonition-title, div.caution p.admonition-title, +div.danger p.admonition-title, div.error p.admonition-title, +div.warning p.admonition-title { + color: red ; + font-weight: bold ; + font-family: sans-serif } + +/* Uncomment (and remove this text!) to get reduced vertical space in + compound paragraphs. +div.compound .compound-first, div.compound .compound-middle { + margin-bottom: 0.5em } + +div.compound .compound-last, div.compound .compound-middle { + margin-top: 0.5em } +*/ + +div.dedication { + margin: 2em 5em ; + text-align: center ; + font-style: italic } + +div.dedication p.topic-title { + font-weight: bold ; + font-style: normal } + +div.figure { + margin-left: 2em ; + margin-right: 2em } + +div.footer, div.header { + clear: both; + font-size: smaller } + +div.line-block { + display: block ; + margin-top: 1em ; + margin-bottom: 1em } + +div.line-block div.line-block { + margin-top: 0 ; + margin-bottom: 0 ; + margin-left: 1.5em } + +div.sidebar { + margin: 0 0 0.5em 1em ; + border: medium outset ; + padding: 1em ; + background-color: #ffffee ; + width: 40% ; + float: right ; + clear: right } + +div.sidebar p.rubric { + font-family: sans-serif ; + font-size: medium } + +div.system-messages { + margin: 5em } + +div.system-messages h1 { + color: red } + +div.system-message { + border: medium outset ; + padding: 1em } + +div.system-message p.system-message-title { + color: red ; + font-weight: bold } + +div.topic { + margin: 2em } + +h1.section-subtitle, h2.section-subtitle, h3.section-subtitle, +h4.section-subtitle, h5.section-subtitle, h6.section-subtitle { + margin-top: 0.4em } + +h1.title { + text-align: center } + +h2.subtitle { + text-align: center } + +hr.docutils { + width: 75% } + +img.align-left, .figure.align-left, object.align-left { + clear: left ; + float: left ; + margin-right: 1em } + +img.align-right, .figure.align-right, object.align-right { + clear: right ; + float: right ; + margin-left: 1em } + +img.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left } + +.align-center { + clear: both ; + text-align: center } + +.align-right { + text-align: right } + +/* reset inner alignment in figures */ +div.align-right { + text-align: inherit } + +/* div.align-center * { */ +/* text-align: left } */ + +ol.simple, ul.simple { + margin-bottom: 1em } + +ol.arabic { + list-style: decimal } + +ol.loweralpha { + list-style: lower-alpha } + +ol.upperalpha { + list-style: upper-alpha } + +ol.lowerroman { + list-style: lower-roman } + +ol.upperroman { + list-style: upper-roman } + +p.attribution { + text-align: right ; + margin-left: 50% } + +p.caption { + font-style: italic } + +p.credits { + font-style: italic ; + font-size: smaller } + +p.label { + white-space: nowrap } + +p.rubric { + font-weight: bold ; + font-size: larger ; + color: maroon ; + text-align: center } + +p.sidebar-title { + font-family: sans-serif ; + font-weight: bold ; + font-size: larger } + +p.sidebar-subtitle { + font-family: sans-serif ; + font-weight: bold } + +p.topic-title { + font-weight: bold } + +pre.address { + margin-bottom: 0 ; + margin-top: 0 ; + font: inherit } + +pre.literal-block, pre.doctest-block, pre.math { + margin-left: 2em ; + margin-right: 2em } + +span.classifier { + font-family: sans-serif ; + font-style: oblique } + +span.classifier-delimiter { + font-family: sans-serif ; + font-weight: bold } + +span.interpreted { + font-family: sans-serif } + +span.option { + white-space: nowrap } + +span.pre { + white-space: pre } + +span.problematic { + color: red } + +span.section-subtitle { + /* font-size relative to parent (h1..h6 element) */ + font-size: 80% } + +table.citation { + border-left: solid 1px gray; + margin-left: 1px } + +table.docinfo { + margin: 2em 4em } + +table.docutils { + margin-top: 0.5em ; + margin-bottom: 0.5em } + +table.footnote { + border-left: solid 1px black; + margin-left: 1px } + +table.docutils td, table.docutils th, +table.docinfo td, table.docinfo th { + padding-left: 0.5em ; + padding-right: 0.5em ; + vertical-align: top } + +table.docutils th.field-name, table.docinfo th.docinfo-name { + font-weight: bold ; + text-align: left ; + white-space: nowrap ; + padding-left: 0 } + +h1 tt.docutils, h2 tt.docutils, h3 tt.docutils, +h4 tt.docutils, h5 tt.docutils, h6 tt.docutils { + font-size: 100% } + +ul.auto-toc { + list-style-type: none } + +</style> +<!-- configuration parameters --> +<meta name="defaultView" content="slideshow" /> +<meta name="controlVis" content="hidden" /> +<!-- style sheet links --> +<script src="ui/default/slides.js" type="text/javascript"></script> +<link rel="stylesheet" href="ui/default/slides.css" + type="text/css" media="projection" id="slideProj" /> +<link rel="stylesheet" href="ui/default/outline.css" + type="text/css" media="screen" id="outlineStyle" /> +<link rel="stylesheet" href="ui/default/print.css" + type="text/css" media="print" id="slidePrint" /> +<link rel="stylesheet" href="ui/default/opera.css" + type="text/css" media="projection" id="operaFix" /> + +<style type="text/css"> +#currentSlide {display: none;} +</style> +</head> +<body> +<div class="layout"> +<div id="controls"></div> +<div id="currentSlide"></div> +<div id="header"> + +</div> +<div id="footer"> +<h1>Introduzione a GIT</h1> + +</div> +</div> +<div class="presentation"> +<div class="slide" id="slide0"> +<h1 class="title">Introduzione a GIT</h1> + +<div class="contents handout topic" id="contents"> +<p class="topic-title first">Contents</p> +<ul class="simple"> +<li><a class="reference internal" href="#un-nuovo-progetto" id="id2">Un nuovo progetto</a></li> +<li><a class="reference internal" href="#qualche-file" id="id3">Qualche file</a></li> +<li><a class="reference internal" href="#git" id="id4">GIT</a></li> +<li><a class="reference internal" href="#in-staging" id="id5">In staging</a></li> +<li><a class="reference internal" href="#altre-mod" id="id6">Altre mod</a></li> +<li><a class="reference internal" href="#ultimi-preparativi" id="id7">Ultimi preparativi</a></li> +<li><a class="reference internal" href="#commit" id="id8">Commit</a></li> +<li><a class="reference internal" href="#commit-2" id="id9">Commit (2)</a></li> +<li><a class="reference internal" href="#log" id="id10">log</a></li> +<li><a class="reference internal" href="#show" id="id11">Show</a></li> +<li><a class="reference internal" href="#iniziamo-a-lavorarci-1" id="id12">Iniziamo a lavorarci (1)</a></li> +<li><a class="reference internal" href="#iniziamo-a-lavorarci-2" id="id13">Iniziamo a lavorarci (2)</a></li> +<li><a class="reference internal" href="#diamo-in-pasto-a-git" id="id14">Diamo in pasto a git</a></li> +<li><a class="reference internal" href="#amend" id="id15">amend</a></li> +<li><a class="reference internal" href="#gitignore" id="id16">gitignore</a></li> +<li><a class="reference internal" href="#aggiungere-funzionalita" id="id17">Aggiungere funzionalità</a></li> +<li><a class="reference internal" href="#che-bel-sole-la-fuori" id="id18">Che bel sole là fuori!</a></li> +<li><a class="reference internal" href="#aggiunte-successive-1" id="id19">Aggiunte successive (1)</a></li> +<li><a class="reference internal" href="#id1" id="id20">Aggiunte successive (1)</a></li> +<li><a class="reference internal" href="#ora-di-rientrare-1" id="id21">Ora di rientrare (1)</a></li> +<li><a class="reference internal" href="#ora-di-rientrare-2" id="id22">Ora di rientrare (2)</a></li> +<li><a class="reference internal" href="#bugfixing-della-versione-stabile" id="id23">Bugfixing della versione stabile</a></li> +<li><a class="reference internal" href="#reintegriamo-in-master-1" id="id24">Reintegriamo in master (1)</a></li> +<li><a class="reference internal" href="#reintegriamo-in-master-2" id="id25">Reintegriamo in master (2)</a></li> +<li><a class="reference internal" href="#reintegriamo-in-master-3" id="id26">Reintegriamo in master (3)</a></li> +<li><a class="reference internal" href="#reintegriamo-in-master-3a" id="id27">Reintegriamo in master (3a)</a></li> +<li><a class="reference internal" href="#reintegriamo-in-master-3b" id="id28">Reintegriamo in master (3b)</a></li> +<li><a class="reference internal" href="#reintegriamo-in-master-4" id="id29">Reintegriamo in master (4)</a></li> +<li><a class="reference internal" href="#reintegriamo-in-master-5" id="id30">Reintegriamo in master (5)</a></li> +<li><a class="reference internal" href="#un-bel-backup" id="id31">Un bel backup</a></li> +<li><a class="reference internal" href="#finalmente-pubblichiamo" id="id32">Finalmente pubblichiamo</a></li> +<li><a class="reference internal" href="#non-github" id="id33">Non github?</a></li> +<li><a class="reference internal" href="#domande" id="id34">Domande?</a></li> +</ul> +</div> + +</div> +<div class="slide" id="un-nuovo-progetto"> +<h1>Un nuovo progetto</h1> +<p class="handout">Iniziamo un nuovo progetto che vogliamo salvare sotto git: non serve +preoccuparsi di avere un server, e neanche un nome pubblicabile +per il progetto, basta creare una directory (che potremo rinominare +in futuro), dire a git di crearci un repository e poi si può inizare +subito a lavorare.</p> +<pre class="literal-block"> +$ mkdir greeter +$ cd greeter/ +$ git init +Initialized empty Git repository in /home/[...]/greeter/.git/ +</pre> +</div> +<div class="slide" id="qualche-file"> +<h1>Qualche file</h1> +<p class="handout">Creiamo i nostri file, in questo caso un programma in python +che saluterà le persone.</p> +<pre class="literal-block"> +$ mkdir greeter +$ touch greeter/__init__.py +$ cat > greeter/greeter.py +class Greeter: + """ """ +$ cat > greeter.py +#!/usr/bin/env python + +def main(): + pass + +if __name__ == '__main__': main() +$ chmod 755 greeter.py +</pre> +</div> +<div class="slide" id="git"> +<h1>GIT</h1> +<p class="handout">Con <tt class="docutils literal">git status</tt> possiamo vedere che git si è accorto dell'esistenza +di alcuni file, ma sono <em>untracked</em>, ovvero non considerati +dal controllo delle revisioni.</p> +<pre class="literal-block"> +$ git status +# On branch master +# +# Initial commit +# +# Untracked files: +# (use "git add <file>..." to include in what will be committed) +# +# greeter.py +# greeter/ +nothing added to commit but untracked files present (use "git add" to track) +</pre> +</div> +<div class="slide" id="in-staging"> +<h1>In staging</h1> +<p class="handout">Aggiungiamo quel che abbiamo fatto alla <em>staging area</em>, ovvero +diciamo a git di prendere in considerazione quella versione +del file perché venga successivamente salvata.</p> +<pre class="literal-block"> +$ git add greeter.py greeter/ +$ git status +# On branch master +# +# Initial commit +# +# Changes to be committed: +# (use "git rm --cached <file>..." to unstage) +# +# new file: greeter.py +# new file: greeter/__init__.py +# new file: greeter/greeter.py +# +</pre> +</div> +<div class="slide" id="altre-mod"> +<h1>Altre mod</h1> +<p class="handout">Facendo altre modifiche e riguardando <tt class="docutils literal">git status</tt> ci possiamo +accorgere di come git non salvi automaticamente tutti i cambiamenti +presenti nei file di cui tiene traccia, ma solo quelli che gli +vengono indicati esplicitamente da salvare.</p> +<pre class="literal-block"> +$ cat > greeter/__init__.py +from greeter import Greeter +$ git status +# On branch master +# +# Initial commit +# +# Changes to be committed: +# (use "git rm --cached <file>..." to unstage) +# +# new file: greeter.py +# new file: greeter/__init__.py +# new file: greeter/greeter.py +# +# Changes not staged for commit: +# (use "git add <file>..." to update what will be committed) +# (use "git checkout -- <file>..." to discard changes in working directory) +# +# modified: greeter/__init__.py +# +</pre> +</div> +<div class="slide" id="ultimi-preparativi"> +<h1>Ultimi preparativi</h1> +<p class="handout">A questo punto possiamo aggiungere anche le ultime modifiche:</p> +<pre class="literal-block"> +$ git add greeter/__init__.py +$ git commit +</pre> +<p class="handout">Se è la prima volta che usiamo git su questo computer salviamo qualche +informazione su di noi, nel mio caso:</p> +<pre class="literal-block"> +$ git config --global user.name "Elena ``of Valhalla'' Grandi" +$ git config --global user.email valhalla@trueelena.org +</pre> +</div> +<div class="slide" id="commit"> +<h1>Commit</h1> +<p class="handout">E finalmente possiamo creare il nostro primo commit, un insieme +di file in una loro determinata versione al quale vengono associati +alcuni metadati (autore, data, ...) e soprattutto un identificativo +che è un hash crittografico dei contenuti.</p> +<p class="handout">Il comando <tt class="docutils literal">git commit</tt> apre un editor con il quale scrivere +un commento da associare al commit. Di solito si scrive una descrizione +breve da una riga (una 60ina di caratteri), e poi eventualmente +altre informazioni più approfondite.</p> +<pre class="literal-block"> +Skeleton for the new project. +# Please enter the commit message for your changes. Lines starting +# with '#' will be ignored, and an empty message aborts the commit. +# On branch master +# +# Initial commit +# +# Changes to be committed: +# (use "git rm --cached <file>..." to unstage) +# +# new file: greeter.py +# new file: greeter/__init__.py +# new file: greeter/greeter.py +# +</pre> +</div> +<div class="slide" id="commit-2"> +<h1>Commit (2)</h1> +<pre class="literal-block"> +".git/COMMIT_EDITMSG" 14L, 377C written +[master (root-commit) b54e94f] Skeleton for the new project. + 3 files changed, 9 insertions(+) + create mode 100755 greeter.py + create mode 100644 greeter/__init__.py + create mode 100644 greeter/greeter.py +</pre> +</div> +<div class="slide" id="log"> +<h1>log</h1> +<p class="handout">Con il comando <tt class="docutils literal">git log</tt> possiamo vedere l'identificativo +completo del commit appena fatto, e qualche metadato.</p> +<pre class="literal-block"> +$ git log +commit b54e94fde972281ca31a56ef0d36204addd4906b +Author: Elena ``of Valhalla'' Grandi <valhalla@trueelena.org> +Date: Thu Nov 15 19:05:42 2012 +0100 + + Skeleton for the new project. +</pre> +</div> +<div class="slide" id="show"> +<h1>Show</h1> +<p class="handout">E con <tt class="docutils literal">git show</tt> possiamo vedere i dettagli del commit, con +tutte le modifiche che sono state introdotte (sotto forma +di diff dalla versione precedente).</p> +<p class="handout">Possiamo vedere come non serva scrivere tutto l'identificativo +del commit, ma bastino i primi caratteri sufficienti ad +identificarlo univocamente nel repository.</p> +<pre class="literal-block"> +$ git show b54e +commit b54e94fde972281ca31a56ef0d36204addd4906b +Author: Elena ``of Valhalla'' Grandi <valhalla@trueelena.org> +Date: Thu Nov 15 19:05:42 2012 +0100 + + Skeleton for the new project. + +diff --git a/greeter.py b/greeter.py +new file mode 100755 +index 0000000..b96deee +--- /dev/null ++++ b/greeter.py +@@ -0,0 +1,6 @@ ++#!/usr/bin/env python ++ +[...] +</pre> +</div> +<div class="slide" id="iniziamo-a-lavorarci-1"> +<h1>Iniziamo a lavorarci (1)</h1> +<p class="handout">Iniziamo a lavorare al progetto, riempiendo qualche file.</p> +<p><tt class="docutils literal">greeter/greeter.py</tt>:</p> +<pre class="literal-block"> +class Greeter: + """ """ + + def greet(self): + print "Hello World!" +</pre> +</div> +<div class="slide" id="iniziamo-a-lavorarci-2"> +<h1>Iniziamo a lavorarci (2)</h1> +<p><tt class="docutils literal">greeter.py</tt>:</p> +<pre class="literal-block"> +#!/usr/bin/env python + +import greeter + +def main(): + grt = greeter.Greeter() + grt.greet() + +if __name__ == '__main__': main() +</pre> +</div> +<div class="slide" id="diamo-in-pasto-a-git"> +<h1>Diamo in pasto a git</h1> +<p class="handout">E vediamo di nuovo il workflow quotidiano: aggiungiamo le modifiche +fatte alla staging area con <tt class="docutils literal">git add</tt> per poi darle in pasto +a <tt class="docutils literal">git commit</tt>.</p> +<p class="handout">In questo caso anziché usare un editor per descrivere il commit +ci accontentiamo di una descrizione breve, passata per comodità +con l'opzione <tt class="docutils literal"><span class="pre">-m</span></tt>.</p> +<pre class="literal-block"> +$ git add greeter.py greeter/greeter.py +$ git commit -m 'Generic greetings' +[master adfbc73] Generic greetings + 2 files changed, 8 insertions(+), 1 deletion(-) +$ git status +# On branch master +nothing to commit (working directory clean) +$ git log +commit adfbc7340ac1af8b1dc80ebb1526c7b2b9ad4d1f +Author: Elena ``of Valhalla'' Grandi <valhalla@trueelena.org> +Date: Thu Nov 15 19:08:29 2012 +0100 + + Generic greetings + +commit b54e94fde972281ca31a56ef0d36204addd4906b +Author: Elena ``of Valhalla'' Grandi <valhalla@trueelena.org> +Date: Thu Nov 15 19:05:42 2012 +0100 + + Skeleton for the new project. +</pre> +</div> +<div class="slide" id="amend"> +<h1>amend</h1> +<p class="handout">Se ci si è accorti di aver sbagliato qualcosa nella descrizione +del commit lo si può cambiare con <tt class="docutils literal">git commit <span class="pre">--amend</span></tt>.</p> +<pre class="literal-block"> +$ git commit --amend +</pre> +<pre class="literal-block"> +Generic greetings. + +# Please enter the commit message for your changes. Lines starting +# with '#' will be ignored, and an empty message aborts the commit. +# On branch master +# Changes to be committed: +# (use "git reset HEAD^1 <file>..." to unstage) +# +# modified: greeter.py +# modified: greeter/greeter.py +</pre> +<pre class="literal-block"> +[master 8cdccd9] Generic greetings. + 2 files changed, 8 insertions(+), 1 deletion(-) +</pre> +<p class="handout">Notare come l'identificativo del commit sia cambiato: di fatto +<tt class="docutils literal">git commit <span class="pre">--amend</span></tt> cancella l'ultimo commit e ne crea +uno nuovo.</p> +<p class="handout">Questo significa che questo comando non si può usare nel caso +in cui si sia già distribuito in qualche modo il commit in questione, +dato che la cosa può causare problemi negli altri repository.</p> +</div> +<div class="slide" id="gitignore"> +<h1>gitignore</h1> +<p class="handout">Lavorando al progetto capita che si generino file che si vogliono +ignorare, ad esempio i risultati di compilazione: basta aggiungerli +al file <tt class="docutils literal">.gitignore</tt> perché non vengano considerati.</p> +<pre class="literal-block"> +$ ./greeter.py +Hello World! +$ git status +# On branch master +# Untracked files: +# (use "git add <file>..." to include in what will be committed) +# +# greeter/__init__.pyc +# greeter/greeter.pyc +nothing added to commit but untracked files present (use "git add" to track) +$ echo "*.pyc" >> .gitignore +$ git status +# On branch master +# Untracked files: +# (use "git add <file>..." to include in what will be committed) +# +# .gitignore +nothing added to commit but untracked files present (use "git add" to track) +$ git add .gitignore +$ git commit -m '.gitignore: ignore .pyc files.' +</pre> +</div> +<div class="slide" id="aggiungere-funzionalita"> +<h1>Aggiungere funzionalità</h1> +<p class="handout">Vogliamo aggiungere al nostro progetto la capacità di salutare +persone diverse; dato che dobbiamo fare un po' di modifiche, +perché non creare un nuovo <em>feature branch</em>?</p> +<p class="handout">Questo è il workflow naturale per git: ogni nuova funzionalità +viene sviluppata a parte in un branch apposito, e poi +integrata nel branch principale, che in questo modo rimane +sempre funzionante.</p> +<pre class="literal-block"> +$ git checkout -b people +</pre> +<p><tt class="docutils literal">greeter/greeter.py</tt>:</p> +<pre class="literal-block"> +class Greeter: + """ """ + + def greet(self,greetee="World"): + print "Hello %s!"%gretee +</pre> +<pre class="literal-block"> +$ git add greeter/greeter.py +</pre> +</div> +<div class="slide" id="che-bel-sole-la-fuori"> +<h1>Che bel sole là fuori!</h1> +<p class="handout">Anche se non abbiamo finito di implementare la nuova feature, +ci accorgiamo che c'è un bel sole e vogliamo andare a lavorarci +al parco (o dobbiamo correre a prendere il treno), e vogliamo +spostarci a lavorare sul portatile.</p> +<p class="handout">Niente di più semplice: committiamo quel che abbiam fatto fin'ora, +cloniamo il repository su una chiavetta usb, e possiamo lavorare +dal portatile senza problemi.</p> +<pre class="literal-block"> +$ git commit -m 'greeter/greeter.py: support for multiple greetees.' +$ cd $USB_KEY +$ git clone /home/[...]/greeter +Cloning into 'greeter'... +done. +$ cd greeter +$ git branch +* people +$ git branch -a +* people + remotes/origin/HEAD -> origin/people + remotes/origin/master + remotes/origin/people +</pre> +<p class="handout">Con il comando <tt class="docutils literal">git branch</tt> scopriamo che il clone ha già preso +come branch corrente quello che stavamo usando sul primo repository, +e con l'opzione <tt class="docutils literal"><span class="pre">-a</span></tt> possiamo vedere tutti i branch che abbiamo +a disposizione.</p> +<p class="handout">Con git ogni copia comprende tutta la storia di tutti i branch +disponibili nel repository che si è copiato, e quindi è possibile +continuare a lavorare anche se ci si dovesse trovare senza connessione +ad internet. Inoltre ogni clone del repository è un backup completo, +utile nel caso in cui succeda qualcosa ad un hard disk.</p> +</div> +<div class="slide" id="aggiunte-successive-1"> +<h1>Aggiunte successive (1)</h1> +<p class="handout">Finiamo le modifiche di cui ci stavamo occupando, committiamo.</p> +<p><tt class="docutils literal">greeter.py</tt>:</p> +<pre class="literal-block"> +#!/usr/bin/env python + +import sys + +import greeter + +def main(): + grt = greeter.Greeter() + try: + grt.greet(sys.argv[1]) + except IndexError: + grt.greet() + +if __name__ == '__main__': main() +</pre> +</div> +<div class="slide" id="id1"> +<h1>Aggiunte successive (1)</h1> +<pre class="literal-block"> +$ git add greeter.py +$ git commit -m 'greeter.py: support for a custom greetee.' +[people 59b9d39] greeter.py: support for a custom greetee. + 1 file changed. 6 insertions(+). 1 deletion(-) +</pre> +</div> +<div class="slide" id="ora-di-rientrare-1"> +<h1>Ora di rientrare (1)</h1> +<p class="handout">Riattacchiamo la chiavetta al PC, cerchiamo di riportare le modifiche +dal repository su chiavetta al repository su hard disk con +il comando <tt class="docutils literal">git push</tt>.</p> +<pre class="literal-block"> +$ git push +Counting objects: 5, done. +Delta compression using up to 2 threads. +Compressing objects: 100% (3/3), done. +Writing objects: 100% (3/3), 487 bytes, done. +Total 3 (delta 0), reused 0 (delta 0) +Unpacking objects: 100% (3/3), done. +remote: error: refusing to update checked out branch: refs/heads/people +remote: error: By default, updating the current branch in a non-bare repository +remote: error: is denied, because it will make the index and work tree inconsistent +remote: error: with what you pushed, and will require 'git reset --hard' to match +remote: error: the work tree to HEAD. +remote: error: +remote: error: You can set 'receive.denyCurrentBranch' configuration variable t +remote: error: 'ignore' or 'warn' in the remote repository to allow pushing int +remote: error: its current branch; however, this is not recommended unless you +remote: error: arranged to update its work tree to match what you pushed in som +remote: error: other way. +remote: error: +remote: error: To squelch this message and still keep the default behaviour, se +remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'. +To /home/[...]/greeter/ + ! [remote rejected] people -> people (branch is currently checked out) +error: failed to push some refs to '/home/[...]/greeter/' +</pre> +</div> +<div class="slide" id="ora-di-rientrare-2"> +<h1>Ora di rientrare (2)</h1> +<p class="handout">C'è un problema: git non permette di fare push che dovrebbero modificare +ciò che c'è nella <em>working copy</em> dell'altro repository; una soluzione +sarebbe richiedere l'aggiornamento con il comando <tt class="docutils literal">git pull</tt> +dal repository sul PC, ma richiede un po' di configurazione. +Per ora usiamo una soluzione veloce:</p> +<pre class="literal-block"> +$ cd /home/[...]/greeter/ +$ git checkout master +$ cd - +$USB_KEY/greeter +$ git push +Counting objects: 5, done. +Delta compression using up to 2 threads. +Compressing objects: 100% (3/3), done. +Writing objects: 100% (3/3), 487 bytes, done. +Total 3 (delta 0), reused 0 (delta 0) +Unpacking objects: 100% (3/3), done. +To /home/[...]/greeter/ + d78d340..59b9d39 people -> people +$ git log +commit 59b9d3971db8cb872c798b215365b22fb20aa5a7 +[...] +$ cd /home/[...]/greeter/ +$ git checkout people +Switched to branch 'people' +$ git log +commit 59b9d3971db8cb872c798b215365b22fb20aa5a7 +</pre> +</div> +<div class="slide" id="bugfixing-della-versione-stabile"> +<h1>Bugfixing della versione stabile</h1> +<p class="handout">Qualcuno ci fa notare che nella versione "stabile" del nostro programma +c'è un errore: una riga di documentazione vuota. Rimediamo subito!</p> +<pre class="literal-block"> +$ git checkout master +Switched to branch 'master' +</pre> +<p><tt class="docutils literal">greeter/greeter.py</tt>:</p> +<pre class="literal-block"> +class Greeter: + """This class greets people.""" + + def greet(self): + print "Hello World!" +</pre> +<pre class="literal-block"> +$ git add greeter/greeter.py +$ git commit -m 'greeter/greeter.py: docstring for the class' +[master cdef61b] greeter/greeter.py: docstring for the class + 1 file changed, 1 insertion(+), 1 deletion(-) +</pre> +</div> +<div class="slide" id="reintegriamo-in-master-1"> +<h1>Reintegriamo in master (1)</h1> +<p class="handout">Adesso che la funzionalità è completa possiamo reintegrarla nel branch +master: con <tt class="docutils literal">gitk <span class="pre">-a</span></tt> possiamo vedere la situazione attuale.</p> +<pre class="literal-block"> +$ git checkout people +Switched to branch 'people' +$ gitk -a +</pre> +<div class="figure"> +<img alt="images/gitk01.png" src="images/gitk01.png" /> +</div> +<p class="handout">Notiamo che al momento il branch people parte da un commit di master +che non è l'ultimo: questo non è un problema per riportarlo in master, +ma causa un commit fittizio con il quale si descrive il merge.</p> +<p class="handout">Dato che il branch people non è stato pubblicato da nessuna parte, +possiamo invece barare e portarlo a nascere dall'ultimo commit di master.</p> +<pre class="literal-block"> +$ git log +commit 59b9d3971db8cb872c798b215365b22fb20aa5a7 +[...] +commit d78d34010156781d20ef194a62f00d4eb9edb26b +</pre> +</div> +<div class="slide" id="reintegriamo-in-master-2"> +<h1>Reintegriamo in master (2)</h1> +<pre class="literal-block"> +$ git rebase master +First, rewinding head to replay your work on top of it... +Applying: greeter/greeter.py: support for multiple greetees +Using index info to reconstruct a base tree... +Falling back to patching base and 3-way merge... +Auto-merging greeter/greeter.py +Applying: greeter.py: support for a custom greetee. +$ git log +commit 5a23f44b8492f41f6a4834b959111b924efa905c +[...] +commit 2229a1833b2dd00922978140d5b7e16688408ee1 +$ gitk -a +</pre> +<div class="figure"> +<img alt="images/gitk02.png" src="images/gitk02.png" /> +</div> +<p class="handout">I commit hanno cambiato identificativo, non sono più gli stessi di prima, +ma almeno possiamo vedere che il nostro branch è la prosecuzione +naturale di master.</p> +</div> +<div class="slide" id="reintegriamo-in-master-3"> +<h1>Reintegriamo in master (3)</h1> +<p class="handout">Già che ci siamo, però, possiamo decidere che i due commit riguardano +la stessa modifica, per cui possiamo unirli in un commit solo.</p> +<pre class="literal-block"> +$ git rebase -i master +</pre> +<pre class="literal-block"> +pick 2229a18 greeter/greeter.py: support for multiple greetees +squash 5a23f44 greeter.py: support for a custom greetee. + +# Rebase cdef61b..5a23f44 onto cdef61b +# +# Commands: +# p, pick = use commit +# r, reword = use commit, but edit the commit message +# e, edit = use commit, but stop for amending +# s, squash = use commit, but meld into previous commit +# f, fixup = like "squash", but discard this commit's log message +# x, exec = run command (the rest of the line) using shell +# +# These lines can be re-ordered; they are executed from top to bottom. +# +# If you remove a line here THAT COMMIT WILL BE LOST. +# However, if you remove everything, the rebase will be aborted. +# +</pre> +</div> +<div class="slide" id="reintegriamo-in-master-3a"> +<h1>Reintegriamo in master (3a)</h1> +<pre class="literal-block"> +Support for a custom greetee. +# This is a combination of 2 commits. +# The first commit's message is: + +# This is the 2nd commit message: + +# Please enter the commit message for your changes. Lines starting +# with '#' will be ignored, and an empty message aborts the commit. +# +# Author: Elena of Valhalla'' Grandi <valhalla@trueelena.org> +# +# Not currently on any branch. +# Changes to be committed: +# (use "git reset HEAD <file>..." to unstage) +# +# modified: greeter.py +# modified: greeter/greeter.py +# +</pre> +</div> +<div class="slide" id="reintegriamo-in-master-3b"> +<h1>Reintegriamo in master (3b)</h1> +<pre class="literal-block"> +".git/COMMIT_EDITMSG" 18L, 509C written +[detached HEAD ca91dc9] Support for a custom greetee. + Author: Elena of Valhalla'' Grandi <valhalla@trueelena.org> + 2 files changed, 8 insertions(+), 3 deletions(-) +Successfully rebased and updated refs/heads/people. +</pre> +</div> +<div class="slide" id="reintegriamo-in-master-4"> +<h1>Reintegriamo in master (4)</h1> +<p class="handout">A questo punto il nostro branch è pronto per essere reinserito in +master.</p> +<pre class="literal-block"> +$ git log +commit ca91dc9944e003ff47ec58464f3ebbb2ffdb8cfa +[...] +$ gitk -a +</pre> +<div class="figure"> +<img alt="images/gitk03.png" src="images/gitk03.png" /> +</div> +</div> +<div class="slide" id="reintegriamo-in-master-5"> +<h1>Reintegriamo in master (5)</h1> +<pre class="literal-block"> +$ git checkout master +Switched to branch 'master' +$ git merge people +Updating cdef61b..ca91dc9 +Fast-forward + greeter.py | 7 ++++++- + greeter/greeter.py | 4 ++-- + 2 files changed, 8 insertions(+), 3 deletions(-) +$ git branch -d people +Deleted branch people (was ca91dc9). +$ gitk -a +</pre> +<div class="figure"> +<img alt="images/gitk04.png" src="images/gitk04.png" /> +</div> +</div> +<div class="slide" id="un-bel-backup"> +<h1>Un bel backup</h1> +<p class="handout">Se abbiamo in casa un computer, magari sempre acceso, al quale possiamo +accedere via ssh, possiamo usarlo come server su cui mettere +un nostro repository "centrale" da usare per gestire il lavoro da +più server diversi, ma anche come ulteriore copia di backup.</p> +<pre class="literal-block"> +$ ssh $SERVER +$ mkdir -p git/greeter.git +$ cd git/greeter.git +$ git init --bare +Initialized empty Git repository in /home/[...]/git/greeter.git/ +</pre> +<pre class="literal-block"> +$ git remote add backup $SERVER:git/greeter.git +$ git push backup master +Counting objects: 23, done. +Delta compression using up to 2 threads. +Compressing objects: 100% (20/20), done. +Writing objects: 100% (23/23), 2.24 KiB, done. +Total 23 (delta 2), reused 0 (delta 0) +Unpacking objects: 100% (23/23), done. +To $SERVER:git/greeter.git/ + * [new branch] master -> master +</pre> +</div> +<div class="slide" id="finalmente-pubblichiamo"> +<h1>Finalmente pubblichiamo</h1> +<pre class="handout literal-block"> +$ $BROWSER http://gitorious.org +[...] +</pre> +<pre class="literal-block"> +$ git remote add origin git@gitorious.org:greeter/greeter.git +$ git push -u origin master +Counting objects: 23, done. +Delta compression using up to 2 threads. +Compressing objects: 100% (20/20), done. +Writing objects: 100% (23/23), 2.24 KiB, done. +Total 23 (delta 2), reused 0 (delta 0) +Unpacking objects: 100% (23/23), done. +To git@gitorious.org:greeter/greeter.git + * [new branch] master -> master + Branch master set up to track remote branch master from origin. +</pre> +</div> +<div class="slide" id="non-github"> +<h1>Non github?</h1> +<p class="handout">Alternative:</p> +<ul class="simple"> +<li><a class="reference external" href="http://repo.or.cz/">http://repo.or.cz/</a></li> +<li><a class="reference internal" href="#gitolite">gitolite</a> + <a class="reference internal" href="#gitweb">gitweb</a> self-hosted</li> +<li>...</li> +</ul> +</div> +<div class="slide" id="domande"> +<span id="gitweb"></span><span id="gitolite"></span><h1>Domande?</h1> +<!-- vim: set filetype=rst: --> +</div> +</div> +</body> +</html> diff --git a/src/corsi/2012-seminari/introduzione_a_git-2012-11-19/ui/default/blank.gif b/src/corsi/2012-seminari/introduzione_a_git-2012-11-19/ui/default/blank.gif Binary files differnew file mode 100644 index 0000000..75b945d --- /dev/null +++ b/src/corsi/2012-seminari/introduzione_a_git-2012-11-19/ui/default/blank.gif diff --git a/src/corsi/2012-seminari/introduzione_a_git-2012-11-19/ui/default/framing.css b/src/corsi/2012-seminari/introduzione_a_git-2012-11-19/ui/default/framing.css new file mode 100644 index 0000000..c4727f3 --- /dev/null +++ b/src/corsi/2012-seminari/introduzione_a_git-2012-11-19/ui/default/framing.css @@ -0,0 +1,25 @@ +/* This file has been placed in the public domain. */ +/* The following styles size, place, and layer the slide components. + Edit these if you want to change the overall slide layout. + The commented lines can be uncommented (and modified, if necessary) + to help you with the rearrangement process. */ + +/* target = 1024x768 */ + +div#header, div#footer, .slide {width: 100%; top: 0; left: 0;} +div#header {position: fixed; top: 0; height: 3em; z-index: 1;} +div#footer {top: auto; bottom: 0; height: 2.5em; z-index: 5;} +.slide {top: 0; width: 92%; padding: 2.5em 4% 4%; z-index: 2;} +div#controls {left: 50%; bottom: 0; width: 50%; z-index: 100;} +div#controls form {position: absolute; bottom: 0; right: 0; width: 100%; + margin: 0;} +#currentSlide {position: absolute; width: 10%; left: 45%; bottom: 1em; + z-index: 10;} +html>body #currentSlide {position: fixed;} + +/* +div#header {background: #FCC;} +div#footer {background: #CCF;} +div#controls {background: #BBD;} +div#currentSlide {background: #FFC;} +*/ diff --git a/src/corsi/2012-seminari/introduzione_a_git-2012-11-19/ui/default/iepngfix.htc b/src/corsi/2012-seminari/introduzione_a_git-2012-11-19/ui/default/iepngfix.htc new file mode 100644 index 0000000..701260e --- /dev/null +++ b/src/corsi/2012-seminari/introduzione_a_git-2012-11-19/ui/default/iepngfix.htc @@ -0,0 +1,42 @@ +<public:component> +<public:attach event="onpropertychange" onevent="doFix()" /> + +<script> + +// IE5.5+ PNG Alpha Fix v1.0 by Angus Turnbull http://www.twinhelix.com +// This is licensed under the GNU LGPL, version 2.1 or later. + +// This must be a path to a blank image. That's all the configuration you need here. +var blankImg = 'ui/default/blank.gif'; + +var f = 'DXImageTransform.Microsoft.AlphaImageLoader'; + +function filt(s, m) { + if (filters[f]) { + filters[f].enabled = s ? true : false; + if (s) with (filters[f]) { src = s; sizingMethod = m } + } else if (s) style.filter = 'progid:'+f+'(src="'+s+'",sizingMethod="'+m+'")'; +} + +function doFix() { + if ((parseFloat(navigator.userAgent.match(/MSIE (\S+)/)[1]) < 5.5) || + (event && !/(background|src)/.test(event.propertyName))) return; + + if (tagName == 'IMG') { + if ((/\.png$/i).test(src)) { + filt(src, 'image'); // was 'scale' + src = blankImg; + } else if (src.indexOf(blankImg) < 0) filt(); + } else if (style.backgroundImage) { + if (style.backgroundImage.match(/^url[("']+(.*\.png)[)"']+$/i)) { + var s = RegExp.$1; + style.backgroundImage = ''; + filt(s, 'crop'); + } else filt(); + } +} + +doFix(); + +</script> +</public:component>
\ No newline at end of file diff --git a/src/corsi/2012-seminari/introduzione_a_git-2012-11-19/ui/default/index.txt b/src/corsi/2012-seminari/introduzione_a_git-2012-11-19/ui/default/index.txt new file mode 100644 index 0000000..afd8764 --- /dev/null +++ b/src/corsi/2012-seminari/introduzione_a_git-2012-11-19/ui/default/index.txt @@ -0,0 +1,24 @@ +.. + restindex + include: no + file: blank.gif + file: framing.css + file: iepngfix.htc + file: opera.css + file: outline.css + file: pretty.css + file: print.css + file: s5-core.css + file: slides.css + file: slides.js + /restindex + + uservalues + created: 2010-10-10T10:10:10Z + updated: 2010-10-10T10:10:10Z + /uservalues + + +.. + vim: set filetype=rst sw=3: + diff --git a/src/corsi/2012-seminari/introduzione_a_git-2012-11-19/ui/default/opera.css b/src/corsi/2012-seminari/introduzione_a_git-2012-11-19/ui/default/opera.css new file mode 100644 index 0000000..c9d1148 --- /dev/null +++ b/src/corsi/2012-seminari/introduzione_a_git-2012-11-19/ui/default/opera.css @@ -0,0 +1,8 @@ +/* This file has been placed in the public domain. */ +/* DO NOT CHANGE THESE unless you really want to break Opera Show */ +.slide { + visibility: visible !important; + position: static !important; + page-break-before: always; +} +#slide0 {page-break-before: avoid;} diff --git a/src/corsi/2012-seminari/introduzione_a_git-2012-11-19/ui/default/outline.css b/src/corsi/2012-seminari/introduzione_a_git-2012-11-19/ui/default/outline.css new file mode 100644 index 0000000..fa767e2 --- /dev/null +++ b/src/corsi/2012-seminari/introduzione_a_git-2012-11-19/ui/default/outline.css @@ -0,0 +1,16 @@ +/* This file has been placed in the public domain. */ +/* Don't change this unless you want the layout stuff to show up in the + outline view! */ + +.layout div, #footer *, #controlForm * {display: none;} +#footer, #controls, #controlForm, #navLinks, #toggle { + display: block; visibility: visible; margin: 0; padding: 0;} +#toggle {float: right; padding: 0.5em;} +html>body #toggle {position: fixed; top: 0; right: 0;} + +/* making the outline look pretty-ish */ + +#slide0 h1, #slide0 h2, #slide0 h3, #slide0 h4 {border: none; margin: 0;} +#toggle {border: 1px solid; border-width: 0 0 1px 1px; background: #FFF;} + +.outline {display: inline ! important;} diff --git a/src/corsi/2012-seminari/introduzione_a_git-2012-11-19/ui/default/pretty.css b/src/corsi/2012-seminari/introduzione_a_git-2012-11-19/ui/default/pretty.css new file mode 100644 index 0000000..094b34f --- /dev/null +++ b/src/corsi/2012-seminari/introduzione_a_git-2012-11-19/ui/default/pretty.css @@ -0,0 +1,120 @@ +/* This file has been placed in the public domain. */ +/* Following are the presentation styles -- edit away! */ + +html, body {margin: 0; padding: 0;} +body {background: white; color: black;} +/* Replace the background style above with the style below (and again for + div#header) for a graphic: */ +/* background: white url(bodybg.gif) -16px 0 no-repeat; */ +:link, :visited {text-decoration: none; color: #00C;} +#controls :active {color: #88A !important;} +#controls :focus {outline: 1px dotted #227;} +h1, h2, h3, h4 {font-size: 100%; margin: 0; padding: 0; font-weight: inherit;} + +blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em;} +blockquote p {margin: 0;} + +kbd {font-weight: bold; font-size: 1em;} +sup {font-size: smaller; line-height: 1px;} + +.slide pre {padding: 0; margin-left: 0; margin-right: 0; font-size: 56%;} +.slide ul ul li {list-style: square;} +.slide img.leader {display: block; margin: 0 auto;} +.slide tt {font-size: 90%;} + +div#header, div#footer {background: #005; color: #AAB; font-family: sans-serif;} +/* background: #005 url(bodybg.gif) -16px 0 no-repeat; */ +div#footer {font-size: 0.5em; font-weight: bold; padding: 1em 0;} +#footer h1 {display: block; padding: 0 1em;} +#footer h2 {display: block; padding: 0.8em 1em 0;} + +.slide {font-size: 1.2em;} +.slide h1 {position: absolute; top: 0.45em; z-index: 1; + margin: 0; padding-left: 0.7em; white-space: nowrap; + font: bold 150% sans-serif; color: #DDE; background: #005;} +.slide h2 {font: bold 120%/1em sans-serif; padding-top: 0.5em;} +.slide h3 {font: bold 100% sans-serif; padding-top: 0.5em;} +h1 abbr {font-variant: small-caps;} + +div#controls {position: absolute; left: 50%; bottom: 0; + width: 50%; text-align: right; font: bold 0.9em sans-serif;} +html>body div#controls {position: fixed; padding: 0 0 1em 0; top: auto;} +div#controls form {position: absolute; bottom: 0; right: 0; width: 100%; + margin: 0; padding: 0;} +#controls #navLinks a {padding: 0; margin: 0 0.5em; + background: #005; border: none; color: #779; cursor: pointer;} +#controls #navList {height: 1em;} +#controls #navList #jumplist {position: absolute; bottom: 0; right: 0; + background: #DDD; color: #227;} + +#currentSlide {text-align: center; font-size: 0.5em; color: #449; + font-family: sans-serif; font-weight: bold;} + +#slide0 {padding-top: 1.5em} +#slide0 h1 {position: static; margin: 1em 0 0; padding: 0; color: #000; + font: bold 2em sans-serif; white-space: normal; background: transparent;} +#slide0 h2 {font: bold italic 1em sans-serif; margin: 0.25em;} +#slide0 h3 {margin-top: 1.5em; font-size: 1.5em;} +#slide0 h4 {margin-top: 0; font-size: 1em;} + +ul.urls {list-style: none; display: inline; margin: 0;} +.urls li {display: inline; margin: 0;} +.external {border-bottom: 1px dotted gray;} +html>body .external {border-bottom: none;} +.external:after {content: " \274F"; font-size: smaller; color: #77B;} + +.incremental, .incremental *, .incremental *:after {visibility: visible; + color: white; border: 0;} +img.incremental {visibility: hidden;} +.slide .current {color: green;} + +.slide-display {display: inline ! important;} + +.huge {font-family: sans-serif; font-weight: bold; font-size: 150%;} +.big {font-family: sans-serif; font-weight: bold; font-size: 120%;} +.small {font-size: 75%;} +.tiny {font-size: 50%;} +.huge tt, .big tt, .small tt, .tiny tt {font-size: 115%;} +.huge pre, .big pre, .small pre, .tiny pre {font-size: 115%;} + +.maroon {color: maroon;} +.red {color: red;} +.magenta {color: magenta;} +.fuchsia {color: fuchsia;} +.pink {color: #FAA;} +.orange {color: orange;} +.yellow {color: yellow;} +.lime {color: lime;} +.green {color: green;} +.olive {color: olive;} +.teal {color: teal;} +.cyan {color: cyan;} +.aqua {color: aqua;} +.blue {color: blue;} +.navy {color: navy;} +.purple {color: purple;} +.black {color: black;} +.gray {color: gray;} +.silver {color: silver;} +.white {color: white;} + +.left {text-align: left ! important;} +.center {text-align: center ! important;} +.right {text-align: right ! important;} + +.animation {position: relative; margin: 1em 0; padding: 0;} +.animation img {position: absolute;} + +/* Docutils-specific overrides */ + +.slide table.docinfo {margin: 1em 0 0.5em 2em;} + +pre.literal-block, pre.doctest-block {background-color: white;} + +tt.docutils {background-color: white;} + +/* diagnostics */ +/* +li:after {content: " [" attr(class) "]"; color: #F88;} +div:before {content: "[" attr(class) "]"; color: #F88;} +*/ diff --git a/src/corsi/2012-seminari/introduzione_a_git-2012-11-19/ui/default/print.css b/src/corsi/2012-seminari/introduzione_a_git-2012-11-19/ui/default/print.css new file mode 100644 index 0000000..9d057cc --- /dev/null +++ b/src/corsi/2012-seminari/introduzione_a_git-2012-11-19/ui/default/print.css @@ -0,0 +1,24 @@ +/* This file has been placed in the public domain. */ +/* The following rule is necessary to have all slides appear in print! + DO NOT REMOVE IT! */ +.slide, ul {page-break-inside: avoid; visibility: visible !important;} +h1 {page-break-after: avoid;} + +body {font-size: 12pt; background: white;} +* {color: black;} + +#slide0 h1 {font-size: 200%; border: none; margin: 0.5em 0 0.25em;} +#slide0 h3 {margin: 0; padding: 0;} +#slide0 h4 {margin: 0 0 0.5em; padding: 0;} +#slide0 {margin-bottom: 3em;} + +#header {display: none;} +#footer h1 {margin: 0; border-bottom: 1px solid; color: gray; + font-style: italic;} +#footer h2, #controls {display: none;} + +.print {display: inline ! important;} + +/* The following rule keeps the layout stuff out of print. + Remove at your own risk! */ +.layout, .layout * {display: none !important;} diff --git a/src/corsi/2012-seminari/introduzione_a_git-2012-11-19/ui/default/s5-core.css b/src/corsi/2012-seminari/introduzione_a_git-2012-11-19/ui/default/s5-core.css new file mode 100644 index 0000000..6965f5e --- /dev/null +++ b/src/corsi/2012-seminari/introduzione_a_git-2012-11-19/ui/default/s5-core.css @@ -0,0 +1,11 @@ +/* This file has been placed in the public domain. */ +/* Do not edit or override these styles! + The system will likely break if you do. */ + +div#header, div#footer, div#controls, .slide {position: absolute;} +html>body div#header, html>body div#footer, + html>body div#controls, html>body .slide {position: fixed;} +.handout {display: none;} +.layout {display: block;} +.slide, .hideme, .incremental {visibility: hidden;} +#slide0 {visibility: visible;} diff --git a/src/corsi/2012-seminari/introduzione_a_git-2012-11-19/ui/default/slides.css b/src/corsi/2012-seminari/introduzione_a_git-2012-11-19/ui/default/slides.css new file mode 100644 index 0000000..82bdc0e --- /dev/null +++ b/src/corsi/2012-seminari/introduzione_a_git-2012-11-19/ui/default/slides.css @@ -0,0 +1,10 @@ +/* This file has been placed in the public domain. */ + +/* required to make the slide show run at all */ +@import url(s5-core.css); + +/* sets basic placement and size of slide components */ +@import url(framing.css); + +/* styles that make the slides look good */ +@import url(pretty.css); diff --git a/src/corsi/2012-seminari/introduzione_a_git-2012-11-19/ui/default/slides.js b/src/corsi/2012-seminari/introduzione_a_git-2012-11-19/ui/default/slides.js new file mode 100644 index 0000000..81e04e5 --- /dev/null +++ b/src/corsi/2012-seminari/introduzione_a_git-2012-11-19/ui/default/slides.js @@ -0,0 +1,558 @@ +// S5 v1.1 slides.js -- released into the Public Domain +// Modified for Docutils (http://docutils.sf.net) by David Goodger +// +// Please see http://www.meyerweb.com/eric/tools/s5/credits.html for +// information about all the wonderful and talented contributors to this code! + +var undef; +var slideCSS = ''; +var snum = 0; +var smax = 1; +var slideIDs = new Array(); +var incpos = 0; +var number = undef; +var s5mode = true; +var defaultView = 'slideshow'; +var controlVis = 'visible'; + +var isIE = navigator.appName == 'Microsoft Internet Explorer' ? 1 : 0; +var isOp = navigator.userAgent.indexOf('Opera') > -1 ? 1 : 0; +var isGe = navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('Safari') < 1 ? 1 : 0; + +function hasClass(object, className) { + if (!object.className) return false; + return (object.className.search('(^|\\s)' + className + '(\\s|$)') != -1); +} + +function hasValue(object, value) { + if (!object) return false; + return (object.search('(^|\\s)' + value + '(\\s|$)') != -1); +} + +function removeClass(object,className) { + if (!object) return; + object.className = object.className.replace(new RegExp('(^|\\s)'+className+'(\\s|$)'), RegExp.$1+RegExp.$2); +} + +function addClass(object,className) { + if (!object || hasClass(object, className)) return; + if (object.className) { + object.className += ' '+className; + } else { + object.className = className; + } +} + +function GetElementsWithClassName(elementName,className) { + var allElements = document.getElementsByTagName(elementName); + var elemColl = new Array(); + for (var i = 0; i< allElements.length; i++) { + if (hasClass(allElements[i], className)) { + elemColl[elemColl.length] = allElements[i]; + } + } + return elemColl; +} + +function isParentOrSelf(element, id) { + if (element == null || element.nodeName=='BODY') return false; + else if (element.id == id) return true; + else return isParentOrSelf(element.parentNode, id); +} + +function nodeValue(node) { + var result = ""; + if (node.nodeType == 1) { + var children = node.childNodes; + for (var i = 0; i < children.length; ++i) { + result += nodeValue(children[i]); + } + } + else if (node.nodeType == 3) { + result = node.nodeValue; + } + return(result); +} + +function slideLabel() { + var slideColl = GetElementsWithClassName('*','slide'); + var list = document.getElementById('jumplist'); + smax = slideColl.length; + for (var n = 0; n < smax; n++) { + var obj = slideColl[n]; + + var did = 'slide' + n.toString(); + if (obj.getAttribute('id')) { + slideIDs[n] = obj.getAttribute('id'); + } + else { + obj.setAttribute('id',did); + slideIDs[n] = did; + } + if (isOp) continue; + + var otext = ''; + var menu = obj.firstChild; + if (!menu) continue; // to cope with empty slides + while (menu && menu.nodeType == 3) { + menu = menu.nextSibling; + } + if (!menu) continue; // to cope with slides with only text nodes + + var menunodes = menu.childNodes; + for (var o = 0; o < menunodes.length; o++) { + otext += nodeValue(menunodes[o]); + } + list.options[list.length] = new Option(n + ' : ' + otext, n); + } +} + +function currentSlide() { + var cs; + var footer_nodes; + var vis = 'visible'; + if (document.getElementById) { + cs = document.getElementById('currentSlide'); + footer_nodes = document.getElementById('footer').childNodes; + } else { + cs = document.currentSlide; + footer = document.footer.childNodes; + } + cs.innerHTML = '<span id="csHere">' + snum + '<\/span> ' + + '<span id="csSep">\/<\/span> ' + + '<span id="csTotal">' + (smax-1) + '<\/span>'; + if (snum == 0) { + vis = 'hidden'; + } + cs.style.visibility = vis; + for (var i = 0; i < footer_nodes.length; i++) { + if (footer_nodes[i].nodeType == 1) { + footer_nodes[i].style.visibility = vis; + } + } +} + +function go(step) { + if (document.getElementById('slideProj').disabled || step == 0) return; + var jl = document.getElementById('jumplist'); + var cid = slideIDs[snum]; + var ce = document.getElementById(cid); + if (incrementals[snum].length > 0) { + for (var i = 0; i < incrementals[snum].length; i++) { + removeClass(incrementals[snum][i], 'current'); + removeClass(incrementals[snum][i], 'incremental'); + } + } + if (step != 'j') { + snum += step; + lmax = smax - 1; + if (snum > lmax) snum = lmax; + if (snum < 0) snum = 0; + } else + snum = parseInt(jl.value); + var nid = slideIDs[snum]; + var ne = document.getElementById(nid); + if (!ne) { + ne = document.getElementById(slideIDs[0]); + snum = 0; + } + if (step < 0) {incpos = incrementals[snum].length} else {incpos = 0;} + if (incrementals[snum].length > 0 && incpos == 0) { + for (var i = 0; i < incrementals[snum].length; i++) { + if (hasClass(incrementals[snum][i], 'current')) + incpos = i + 1; + else + addClass(incrementals[snum][i], 'incremental'); + } + } + if (incrementals[snum].length > 0 && incpos > 0) + addClass(incrementals[snum][incpos - 1], 'current'); + ce.style.visibility = 'hidden'; + ne.style.visibility = 'visible'; + jl.selectedIndex = snum; + currentSlide(); + number = 0; +} + +function goTo(target) { + if (target >= smax || target == snum) return; + go(target - snum); +} + +function subgo(step) { + if (step > 0) { + removeClass(incrementals[snum][incpos - 1],'current'); + removeClass(incrementals[snum][incpos], 'incremental'); + addClass(incrementals[snum][incpos],'current'); + incpos++; + } else { + incpos--; + removeClass(incrementals[snum][incpos],'current'); + addClass(incrementals[snum][incpos], 'incremental'); + addClass(incrementals[snum][incpos - 1],'current'); + } +} + +function toggle() { + var slideColl = GetElementsWithClassName('*','slide'); + var slides = document.getElementById('slideProj'); + var outline = document.getElementById('outlineStyle'); + if (!slides.disabled) { + slides.disabled = true; + outline.disabled = false; + s5mode = false; + fontSize('1em'); + for (var n = 0; n < smax; n++) { + var slide = slideColl[n]; + slide.style.visibility = 'visible'; + } + } else { + slides.disabled = false; + outline.disabled = true; + s5mode = true; + fontScale(); + for (var n = 0; n < smax; n++) { + var slide = slideColl[n]; + slide.style.visibility = 'hidden'; + } + slideColl[snum].style.visibility = 'visible'; + } +} + +function showHide(action) { + var obj = GetElementsWithClassName('*','hideme')[0]; + switch (action) { + case 's': obj.style.visibility = 'visible'; break; + case 'h': obj.style.visibility = 'hidden'; break; + case 'k': + if (obj.style.visibility != 'visible') { + obj.style.visibility = 'visible'; + } else { + obj.style.visibility = 'hidden'; + } + break; + } +} + +// 'keys' code adapted from MozPoint (http://mozpoint.mozdev.org/) +function keys(key) { + if (!key) { + key = event; + key.which = key.keyCode; + } + if (key.which == 84) { + toggle(); + return; + } + if (s5mode) { + switch (key.which) { + case 10: // return + case 13: // enter + if (window.event && isParentOrSelf(window.event.srcElement, 'controls')) return; + if (key.target && isParentOrSelf(key.target, 'controls')) return; + if(number != undef) { + goTo(number); + break; + } + case 32: // spacebar + case 34: // page down + case 39: // rightkey + case 40: // downkey + if(number != undef) { + go(number); + } else if (!incrementals[snum] || incpos >= incrementals[snum].length) { + go(1); + } else { + subgo(1); + } + break; + case 33: // page up + case 37: // leftkey + case 38: // upkey + if(number != undef) { + go(-1 * number); + } else if (!incrementals[snum] || incpos <= 0) { + go(-1); + } else { + subgo(-1); + } + break; + case 36: // home + goTo(0); + break; + case 35: // end + goTo(smax-1); + break; + case 67: // c + showHide('k'); + break; + } + if (key.which < 48 || key.which > 57) { + number = undef; + } else { + if (window.event && isParentOrSelf(window.event.srcElement, 'controls')) return; + if (key.target && isParentOrSelf(key.target, 'controls')) return; + number = (((number != undef) ? number : 0) * 10) + (key.which - 48); + } + } + return false; +} + +function clicker(e) { + number = undef; + var target; + if (window.event) { + target = window.event.srcElement; + e = window.event; + } else target = e.target; + if (target.href != null || hasValue(target.rel, 'external') || isParentOrSelf(target, 'controls') || isParentOrSelf(target,'embed') || isParentOrSelf(target, 'object')) return true; + if (!e.which || e.which == 1) { + if (!incrementals[snum] || incpos >= incrementals[snum].length) { + go(1); + } else { + subgo(1); + } + } +} + +function findSlide(hash) { + var target = document.getElementById(hash); + if (target) { + for (var i = 0; i < slideIDs.length; i++) { + if (target.id == slideIDs[i]) return i; + } + } + return null; +} + +function slideJump() { + if (window.location.hash == null || window.location.hash == '') { + currentSlide(); + return; + } + if (window.location.hash == null) return; + var dest = null; + dest = findSlide(window.location.hash.slice(1)); + if (dest == null) { + dest = 0; + } + go(dest - snum); +} + +function fixLinks() { + var thisUri = window.location.href; + thisUri = thisUri.slice(0, thisUri.length - window.location.hash.length); + var aelements = document.getElementsByTagName('A'); + for (var i = 0; i < aelements.length; i++) { + var a = aelements[i].href; + var slideID = a.match('\#.+'); + if ((slideID) && (slideID[0].slice(0,1) == '#')) { + var dest = findSlide(slideID[0].slice(1)); + if (dest != null) { + if (aelements[i].addEventListener) { + aelements[i].addEventListener("click", new Function("e", + "if (document.getElementById('slideProj').disabled) return;" + + "go("+dest+" - snum); " + + "if (e.preventDefault) e.preventDefault();"), true); + } else if (aelements[i].attachEvent) { + aelements[i].attachEvent("onclick", new Function("", + "if (document.getElementById('slideProj').disabled) return;" + + "go("+dest+" - snum); " + + "event.returnValue = false;")); + } + } + } + } +} + +function externalLinks() { + if (!document.getElementsByTagName) return; + var anchors = document.getElementsByTagName('a'); + for (var i=0; i<anchors.length; i++) { + var anchor = anchors[i]; + if (anchor.getAttribute('href') && hasValue(anchor.rel, 'external')) { + anchor.target = '_blank'; + addClass(anchor,'external'); + } + } +} + +function createControls() { + var controlsDiv = document.getElementById("controls"); + if (!controlsDiv) return; + var hider = ' onmouseover="showHide(\'s\');" onmouseout="showHide(\'h\');"'; + var hideDiv, hideList = ''; + if (controlVis == 'hidden') { + hideDiv = hider; + } else { + hideList = hider; + } + controlsDiv.innerHTML = '<form action="#" id="controlForm"' + hideDiv + '>' + + '<div id="navLinks">' + + '<a accesskey="t" id="toggle" href="javascript:toggle();">Ø<\/a>' + + '<a accesskey="z" id="prev" href="javascript:go(-1);">«<\/a>' + + '<a accesskey="x" id="next" href="javascript:go(1);">»<\/a>' + + '<div id="navList"' + hideList + '><select id="jumplist" onchange="go(\'j\');"><\/select><\/div>' + + '<\/div><\/form>'; + if (controlVis == 'hidden') { + var hidden = document.getElementById('navLinks'); + } else { + var hidden = document.getElementById('jumplist'); + } + addClass(hidden,'hideme'); +} + +function fontScale() { // causes layout problems in FireFox that get fixed if browser's Reload is used; same may be true of other Gecko-based browsers + if (!s5mode) return false; + var vScale = 22; // both yield 32 (after rounding) at 1024x768 + var hScale = 32; // perhaps should auto-calculate based on theme's declared value? + if (window.innerHeight) { + var vSize = window.innerHeight; + var hSize = window.innerWidth; + } else if (document.documentElement.clientHeight) { + var vSize = document.documentElement.clientHeight; + var hSize = document.documentElement.clientWidth; + } else if (document.body.clientHeight) { + var vSize = document.body.clientHeight; + var hSize = document.body.clientWidth; + } else { + var vSize = 700; // assuming 1024x768, minus chrome and such + var hSize = 1024; // these do not account for kiosk mode or Opera Show + } + var newSize = Math.min(Math.round(vSize/vScale),Math.round(hSize/hScale)); + fontSize(newSize + 'px'); + if (isGe) { // hack to counter incremental reflow bugs + var obj = document.getElementsByTagName('body')[0]; + obj.style.display = 'none'; + obj.style.display = 'block'; + } +} + +function fontSize(value) { + if (!(s5ss = document.getElementById('s5ss'))) { + if (!isIE) { + document.getElementsByTagName('head')[0].appendChild(s5ss = document.createElement('style')); + s5ss.setAttribute('media','screen, projection'); + s5ss.setAttribute('id','s5ss'); + } else { + document.createStyleSheet(); + document.s5ss = document.styleSheets[document.styleSheets.length - 1]; + } + } + if (!isIE) { + while (s5ss.lastChild) s5ss.removeChild(s5ss.lastChild); + s5ss.appendChild(document.createTextNode('body {font-size: ' + value + ' !important;}')); + } else { + document.s5ss.addRule('body','font-size: ' + value + ' !important;'); + } +} + +function notOperaFix() { + slideCSS = document.getElementById('slideProj').href; + var slides = document.getElementById('slideProj'); + var outline = document.getElementById('outlineStyle'); + slides.setAttribute('media','screen'); + outline.disabled = true; + if (isGe) { + slides.setAttribute('href','null'); // Gecko fix + slides.setAttribute('href',slideCSS); // Gecko fix + } + if (isIE && document.styleSheets && document.styleSheets[0]) { + document.styleSheets[0].addRule('img', 'behavior: url(ui/default/iepngfix.htc)'); + document.styleSheets[0].addRule('div', 'behavior: url(ui/default/iepngfix.htc)'); + document.styleSheets[0].addRule('.slide', 'behavior: url(ui/default/iepngfix.htc)'); + } +} + +function getIncrementals(obj) { + var incrementals = new Array(); + if (!obj) + return incrementals; + var children = obj.childNodes; + for (var i = 0; i < children.length; i++) { + var child = children[i]; + if (hasClass(child, 'incremental')) { + if (child.nodeName == 'OL' || child.nodeName == 'UL') { + removeClass(child, 'incremental'); + for (var j = 0; j < child.childNodes.length; j++) { + if (child.childNodes[j].nodeType == 1) { + addClass(child.childNodes[j], 'incremental'); + } + } + } else { + incrementals[incrementals.length] = child; + removeClass(child,'incremental'); + } + } + if (hasClass(child, 'show-first')) { + if (child.nodeName == 'OL' || child.nodeName == 'UL') { + removeClass(child, 'show-first'); + if (child.childNodes[isGe].nodeType == 1) { + removeClass(child.childNodes[isGe], 'incremental'); + } + } else { + incrementals[incrementals.length] = child; + } + } + incrementals = incrementals.concat(getIncrementals(child)); + } + return incrementals; +} + +function createIncrementals() { + var incrementals = new Array(); + for (var i = 0; i < smax; i++) { + incrementals[i] = getIncrementals(document.getElementById(slideIDs[i])); + } + return incrementals; +} + +function defaultCheck() { + var allMetas = document.getElementsByTagName('meta'); + for (var i = 0; i< allMetas.length; i++) { + if (allMetas[i].name == 'defaultView') { + defaultView = allMetas[i].content; + } + if (allMetas[i].name == 'controlVis') { + controlVis = allMetas[i].content; + } + } +} + +// Key trap fix, new function body for trap() +function trap(e) { + if (!e) { + e = event; + e.which = e.keyCode; + } + try { + modifierKey = e.ctrlKey || e.altKey || e.metaKey; + } + catch(e) { + modifierKey = false; + } + return modifierKey || e.which == 0; +} + +function startup() { + defaultCheck(); + if (!isOp) createControls(); + slideLabel(); + fixLinks(); + externalLinks(); + fontScale(); + if (!isOp) { + notOperaFix(); + incrementals = createIncrementals(); + slideJump(); + if (defaultView == 'outline') { + toggle(); + } + document.onkeyup = keys; + document.onkeypress = trap; + document.onclick = clicker; + } +} + +window.onload = startup; +window.onresize = function(){setTimeout('fontScale()', 50);} |