Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/studio/static/doc/myosa/ch012_add-your-activity-code-to-version-control.xhtml
diff options
context:
space:
mode:
Diffstat (limited to 'studio/static/doc/myosa/ch012_add-your-activity-code-to-version-control.xhtml')
-rw-r--r--studio/static/doc/myosa/ch012_add-your-activity-code-to-version-control.xhtml336
1 files changed, 336 insertions, 0 deletions
diff --git a/studio/static/doc/myosa/ch012_add-your-activity-code-to-version-control.xhtml b/studio/static/doc/myosa/ch012_add-your-activity-code-to-version-control.xhtml
new file mode 100644
index 0000000..0f7af14
--- /dev/null
+++ b/studio/static/doc/myosa/ch012_add-your-activity-code-to-version-control.xhtml
@@ -0,0 +1,336 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"><body><h1>Add Your Activity Code To Version Control
+</h1>
+<h2>What Is Version Control?
+</h2>
+<p> <em>"If I have seen further it is only by standing on the shoulders of giants."</em>
+</p>
+<p>Isaac Newton, in a letter to Robert Hooke.
+</p>
+<p>Writing an Activity is usually not something you do by yourself.&#160; You will usually have collaborators in one form or another.&#160; When I started writing <strong>Read Etexts</strong> I copied much of the code from the <strong>Read</strong> Activity.&#160; When I implemented text to speech I adapted a toolbar from the <strong>Speak</strong> Activity.&#160; When I finally got my copied file sharing code working the author of <strong>Image Viewer</strong> thought it was good enough to copy into that Activity.&#160; Another programmer saw the work I did for text to speech and thought he could do it better.&#160; He was right, and his improvements got merged into my own code.&#160; When I wrote <strong>Get Internet Archive Books</strong> someone else took the user interface I came up with and made a more powerful and versatile Activity called <strong>Get Books</strong>.&#160; Like Newton, everyone benefits from the work others have done before.
+ <br/></p>
+<p>Even if I wanted to write Activities without help I would still need collaborators to translate them into other languages.
+</p>
+<p>To make collaboration possible you need to have a place where everyone can post their code and share it.&#160; This is called a code repository.&#160; It isn't enough to just share the latest version of your code.&#160; What you really want to do is share <em>every</em> version of your code.&#160; Every time you make a significant change to your code you want to have the new version and the previous version available.&#160; Not only do you want to have every version of your code available, you want to be able to compare any two versions your code to see what changed between them.&#160; This is what version control software does.
+</p>
+<p>The three most popular version control tools are <strong>CVS</strong>, <strong>Subversion</strong>, and <strong>Git</strong>.&#160; Git is the newest and is the one used by Sugar Labs.&#160; While not every Activity has its code in the Sugar Labs Git repository (other free code repositories exist) there is no good reason not to do it and significant benefits if you do.&#160; If you want to get your Activity translated into other languages using the Sugar Labs Git repository is a must. &#160;
+</p>
+<div class="objavi-forcebreak">
+</div>
+<h2>Git Along Little Dogies
+</h2>
+<p>Git is a <strong>distributed</strong> version control system.&#160; This means that not only are there copies of every version of your code in a central repository, the same copies exist on every user's computer.&#160; This means you can update your local repository while you are not connected to the Internet, then connect and share everything at one time.
+</p>
+<p> There are two ways you will interact with your Git repository: through Git commands and through the website at <a href="http://git.sugarlabs.org/.">http://git.sugarlabs.org/.</a>&#160;&#160; We'll look at this website first.
+</p>
+<p>Go to <a href="http://git.sugarlabs.org">http://git.sugarlabs.org/</a>&#160; and click on the <strong>Projects</strong> link in the upper right corner:
+</p>
+<p><img alt="git1.jpg" src="static/ActivitiesGuideSugar-git1-en.jpg" width="473" height="194"/></p>
+<p>You will see a list of projects in the repository.&#160; They will be listed from newest to oldest.&#160; You'll also see a <strong>New Project</strong> link but you'll need to create an account to use that and we aren't ready to do that yet.
+ <br/></p>
+<p><img alt="git2.jpg" src="static/ActivitiesGuideSugar-git2-en.jpg" width="535" height="453"/></p>
+<p>If you use the <strong>Search</strong> link in the upper right corner of the page you'll get a search form.&#160; Use it to search for "read etexts".&#160; Click on the link for that project when you find it.&#160; You should see something like this:
+ <br/></p>
+<p><img alt="git3.jpg" src="static/ActivitiesGuideSugar-git3-en.jpg" width="571" height="571"/></p>
+<p>This page lists <em>some</em> of the activity for the project but I don't find it particularly useful.&#160; To get a much better look at your project start by clicking on the repository name on the right side of the page.&#160; In this case the repository is named <strong>mainline</strong>.
+</p>
+<p><img alt="git4.jpg" src="static/ActivitiesGuideSugar-git4-en.jpg" width="399" height="236"/></p>
+<p>You'll see something like this at the top of the page:
+</p>
+<p><img alt="git5.jpg" src="static/ActivitiesGuideSugar-git5-en.jpg" width="574" height="509"/></p>
+<p>This page has some useful information on it.&#160; First, have a look at the <strong>Public clone url</strong> and the <strong>HTTP clone url</strong>.&#160; You need to click on <strong>More info...</strong> to see either one.&#160; If you run either of these commands from the console you will get a copy of the git repository for the project copied to your computer.&#160; This copy will include every version of every piece of code in the project.&#160; You would need to modify it a bit before you could share your changes back to the main repository, but everything would be there.
+</p>
+<p>The list under <strong>Activities</strong> is not that useful, but if you click on the <strong>Source Tree</strong> link you'll see something really good:
+</p>
+<p><img alt="git6.jpg" src="static/ActivitiesGuideSugar-git6-en.jpg" width="571" height="468"/></p>
+<p>Here is a list of every file in the project, the date it was last updated, and a comment on what was modified.&#160; Click on the link for <strong>ReadEtextsActivity.py</strong> and you'll see this:
+</p>
+<p><img alt="git7.jpg" src="static/ActivitiesGuideSugar-git7-en.jpg" width="597" height="642"/></p>
+<p>This is the latest code in that file in pretty print format.&#160; Python keywords are shown in a different color, there are line numbers, etc.&#160; This is a good page for looking at code on the screen, but it doesn't print well and it's not much good for copying snippets of code into Eric windows either.&#160; For either of those things you'll want to click on <strong>raw blob data</strong> at the top of the listing:
+</p>
+<p><img alt="git8.jpg" src="static/ActivitiesGuideSugar-git8-en.jpg" width="549" height="484"/></p>
+<p>We're not done yet.&#160; Use the <strong>Back</strong> button to get back to the pretty print listing and click on the <strong>Commits</strong> link.&#160; This will give us a list of everything that changed each time we committed code into Git:
+</p>
+<p><img alt="git9.jpg" src="static/ActivitiesGuideSugar-git9-en.jpg" width="636" height="540"/></p>
+<p>You may have noticed the odd combination of letters and numbers after the words <strong>James Simmons committed</strong>.&#160; This is a kind of version number.&#160; The usual practice with version control systems is to give each version of code you check in a version number, usually a simple sequence number.&#160; Git is distributed, with many separate copies of the repository being modified independently and then merged.&#160; That makes using just a sequential number to identify versions unworkable.&#160; Instead, Git gives each version a really, really large random number.&#160; The number is expressed in base 16, which uses the symbols 0-9 and a-f.&#160; What you see in green is only a small part of the complete number.&#160; The number is a link, and if you click on it you'll see this:
+</p>
+<p><img alt="git10.jpg" src="static/ActivitiesGuideSugar-git10-en.jpg" width="561" height="607"/></p>
+<p>At the top of the page we see the complete version number used for this commit.&#160; Below the gray box we see the full comment that was used to commit the changes.&#160; Below that is a listing of what files were changed.&#160;&#160; If we look further down the page we see this:
+</p>
+<p><img alt="git11_1.jpg" src="static/ActivitiesGuideSugar-git11_1-en.jpg" width="581" height="530"/></p>
+<p>This is a <em>diff</em> report which shows the lines that have changed between this version and the previous version.&#160; For each change it shows a few lines before and after the change to give you a better idea of what the change does.&#160; Every change shows line numbers too.
+</p>
+<p>A report like this is a wonderful aid to programming.&#160; Sometimes when you're working on an enhancement to your program something that had been working mysteriously stops working.&#160; When that happens you will wonder just what you changed that could have caused the problem.&#160; A diff report can help you find the source of the problem.
+</p>
+<p>By now you must be convinced that you want your project code in Git.&#160; Before we can do that we need to create an account on this website.&#160; That is no more difficult than creating an account on any other website, but it will need an important piece of information from us that we don't have yet.&#160; Getting that information is our next task.
+</p>
+<div class="objavi-forcebreak">
+</div>
+<h2>Setting Up SSH Keys
+</h2>
+<p>To send your code to the <strong>Gitorious</strong> code repository you need an SSH public/private key pair.&#160;&#8286; SSH is a way of sending data over the network in encrypted format.&#160; (In other words, it uses a secret code so nobody but the person getting the data can read it).&#160; Public/private key encryption is a way of encrypting data that provides a way to guarantee that the person who is sending you the data is who he claims to be.
+</p>
+<p>In simple terms it works like this: the SSH software generates two very large numbers that are used to encode and decode the data going over the network.&#160; The first number, called the<strong> private key</strong>, is kept secret and is only used by you to encode the data.&#160; The second number, called the <strong>public key</strong>, is given to anyone who needs to decode your data.&#160; He can decode it using the public key; there is no need for him to know the private key.&#160; He can also use the public key to encode a message to send back to you and you can decode it using your private key.
+</p>
+<p>Git uses SSH like an electronic signature to verify that code changes that are supposed to be coming from you actually are coming from you.&#160; The Git repository is given your public key.&#160; It knows that anything it decodes with that key must have been sent by you because only you have the private key needed to encode it.
+</p>
+<p> We will be using a tool called <strong>OpenSSH</strong> to generate the public and private keys.&#160; This is included with every version of Linux so you just need to verify that it has been installed.&#160; Then use the <strong>ssh-keygen</strong> utility that comes with OpenSSH to generate the keys:
+ <br/></p>
+<pre>[jim@olpc2 ~]$ ssh-keygen
+Generating public/private rsa key pair.
+Enter file in which to save the key (/home/jim/.ssh/id_rsa): </pre>
+<p>By default ssh-keygen generates an <strong>RSA</strong> key, which is the kind we want.&#160; By default it puts the keyfiles in a directory called <strong>/<em>yourhome</em>/.ssh</strong> and we want that too, so DO NOT enter a filename when it asks you to.&#160; Just hit the <strong>Enter</strong> key to continue.
+</p>
+<pre>[jim@olpc2 ~]$ ssh-keygen
+Generating public/private rsa key pair.
+Enter file in which to save the key (/home/jim/.ssh/id_rsa):
+Created directory '/home/jim/.ssh'.
+Enter passphrase (empty for no passphrase):
+</pre>
+<p>Now we DO want a <strong>passphrase</strong> here.&#160; A passphrase is like a password that is used with the public and private keys to do the encrypting.&#160; When you type it in you will not be able to see what you typed.&#160; Because of that it will ask you to type the same thing again, and it will check to see that you typed them in the same way both times.
+</p>
+<pre>[jim@olpc2 ~]$ ssh-keygen
+Generating public/private rsa key pair.
+Enter file in which to save the key (/home/jim/.ssh/id_rsa):
+Created directory '/home/jim/.ssh'.
+Enter passphrase (empty for no passphrase):
+Enter same passphrase again:
+Your identification has been saved in /home/jim/.ssh/id_rsa.
+Your public key has been saved in /home/jim/.ssh/id_rsa.pub.
+The key fingerprint is:
+d0:fe:c0:0c:1e:72:56:7a:19:cd:f3:85:c7:4c:9e:18
+jim@olpc2.simmons
+The key's randomart image is:
++--[ RSA 2048]----+
+| oo E=. |
+| + o+ .+=. |
+| . B + o.oo |
+| = O . |
+| . S |
+| o |
+| . |
+| |
+| |
++-----------------+
+</pre>
+<p> When choosing a passphrase remember that it needs to be something you can type reliably without seeing it and it would be better if it was <em>not</em> a word you can find in the dictionary, because those are easily broken. When I need to make a password I use the tool at <a href="http://www.multicians.org/thvv/gpw.html.">http://www.multicians.org/thvv/gpw.html.</a>&#160; This tool generates a bunch of nonsense words that are pronounceable.&#160; Pick one that appeals to you and use that.
+</p>
+<p>Now have a look inside the .ssh directory.&#160; By convention every file or directory name that begins with a period is considered hidden by Linux, so it won't show up in a GNOME file browser window unless you use the option on the View menu to Show Hidden Files.&#160; When you display the contents of that directory you'll see two files: <strong>id_rsa</strong> and <strong>id_rsa.pub</strong>.&#160; The public key is in id_rsa.pub.&#160; Try opening that file with gedit (Open With Text Editor) and you'll see something like this:
+</p>
+<p><img alt="git12.jpg" src="static/ActivitiesGuideSugar-git12-en.jpg" width="640" height="278"/></p>
+<p>When you create your account on <a href="http://git.sugarlabs.org">git.sugarlabs.org</a> there will be a place where you can add your public SSH key.&#160; To do that use <strong>Select All</strong> from the <strong>Edit</strong> menu in gedit, then <strong>Copy</strong> and <strong>Paste</strong> into the field provided on the web form.
+</p>
+<h2>Create A New Project
+</h2>
+<p>I'm going to create a new Project in Git for the examples for this book.&#160; I need to log in with my new account and click the <strong>New Project</strong> link we saw earlier.&#160; I get this form, which I have started filling in:
+</p>
+<p><img alt="git13.jpg" src="static/ActivitiesGuideSugar-git13-en.jpg" width="398" height="343"/></p>
+<p>The <strong>Title</strong> is used on the website, the <strong>Slug</strong> is a shortened version of the title without spaces used to name the Git repository.&#160; <strong>Categories</strong> are optional.&#160; <strong>License</strong> is GPL v2 for my projects.&#160; You can choose from any of the licenses in the list for your own Projects, and you can change the license entry later if you want to.&#160; You will also need to enter a <strong>Description</strong> for your project.
+</p>
+<p>Once you have this set up you'll be able to click on the mainline entry for the Project (like we did with Read Etexts before) and see something like this:
+</p>
+<p><img alt="git14.jpg" src="static/ActivitiesGuideSugar-git14-en.jpg" width="640" height="454"/></p>
+<p>The next step is to convert our project files into a local Git repository, add the files to it, then push it to the repository on <a href="http://git.sugarlabs.org">git.sugarlabs.org.</a>&#160; We need to do this because you cannot <strong>clone</strong> an empty repository, and our remote repository is currently empty.&#160; To get around that problem we'll push the local repository out to the new remote repository we just created, then clone the remote one and delete our existing project and its Git repository.&#160; From then on we'll do all our work in the cloned repository.
+ <br/></p>
+<p>This process may remind you of the Edward Albee quote, "<span class="body">Sometimes a person has to go a very long distance out of his way to come back a short distance correctly".</span> Fortunately we only need to do it once per project.&#160; Enter the commands shown below in <strong>bold</strong> after making you project directory the current one:
+ <br/></p>
+<pre><strong>git init</strong>
+Initialized empty Git repository in
+/home/jim/olpc/bookexamples/.git/
+<strong>git add *.py</strong>
+<strong>git add activity
+git add MANIFEST</strong>
+<strong>git add .gitignore
+git commit -a -m "Create repository and load"</strong>
+[master (root-commit) 727bfe8] Create repository and load
+ 9 files changed, 922 insertions(+), 0 deletions(-)
+ create mode 100644 .gitignore
+ create mode 100644 MANIFEST
+ create mode 100755 ReadEtexts.py
+ create mode 100644 ReadEtextsActivity.py
+ create mode 100644 ReadEtextsActivity2.py
+ create mode 100644 activity/activity.info
+ create mode 100644 activity/read-etexts.svg
+ create mode 100755 setup.py
+ create mode 100644 toolbar.py
+</pre>
+<p> I have made an empty local Git repository with <strong>git init</strong>, then I've used <strong>git add</strong> to add the important files to it.&#160; (In fact <strong>git add</strong> doesn't actually add anything itself; it just tells Git to add the file on the next <strong>git commit</strong>).&#160; Finally <strong>git commit</strong> with the options shown will actually put the latest version of these files in my new local repository.
+</p>
+<p>To push this local repository to <a href="http://git.sugarlabs.org">git.sugarlabs.org</a>&#160; we use the commands from the web page:
+</p>
+<pre><strong>git remote add origin \
+gitorious@git.sugarlabs.org:\
+myo-sugar-activities-examples/mainline.git
+git push origin master</strong>
+Counting objects: 17, done.
+Compressing objects: 100% (14/14), done.
+Writing objects: 100% (15/15), 7.51 KiB, done.
+Total 15 (delta 3), reused 0 (delta 0)
+To gitorious@git.sugarlabs.org:myo-sugar-activities-examples/
+mainline.git
+ 2cb3a1e..700789d master -&gt; master
+=&gt; Syncing Gitorious...
+Heads up: head of changed to
+700789d3333a7257999d0a69bdcafb840e6adc09 on master
+Notify cia.vc of 727bfe819d5b7b70f4f2b31d02f5562709284ac4 on
+myo-sugar-activities-examples
+Notify cia.vc of 700789d3333a7257999d0a69bdcafb840e6adc09 on
+myo-sugar-activities-examples
+[OK]
+<strong>rm *</strong>
+<strong>rm activity -rf
+rm .git -rf
+cd ~
+rm Activity/ReadEtextsII</strong>
+<strong>mkdir olpc</strong>
+<strong>cd olpc</strong>
+<strong>mkdir bookexamples</strong>
+<strong>cd bookexamples
+git clone \
+git://git.sugarlabs.org/\
+myo-sugar-activities-examples/mainline.git</strong>
+Initialized empty Git repository in
+/home/jim/olpc/bookexamples/mainline/.git/
+remote: Counting objects: 18, done.
+remote: Compressing objects: 100% (16/16), done.
+remote: Total 18 (delta 3), reused 0 (delta 0)
+Receiving objects: 100% (18/18), 8.53 KiB, done.
+Resolving deltas: 100% (3/3), done.
+</pre>
+<p> The lines in <strong>bold</strong> are the commands to enter, and everything else is messages that Git sends to the console.&#160; I've split some of the longer Git commands with the backslash (\) to make them fit better on the printed page, and wrapped some output lines that would normally print on one line for the same reason.&#160; It probably isn't clear what we're doing here and why, so let's take it step by step:
+</p>
+<ul><li>The first command <strong>git remote add origin</strong> tells the remote Git repository that we are going to send it stuff from our local repository.
+ <br/></li>
+ <li>The second command <strong>git push origin master</strong> actually sends your local Git repository to the remote one and its contents will be copied in.&#160; When you enter this command you will be asked to enter the SSH pass phrase you created in the last section.&#160; GNOME will remember this phrase for you and enter it for every Git command afterwards so you don't need to.&#160; It will keep doing this until you log out or turn off the computer.
+ <br/></li>
+ <li>The next step is to delete our existing files and our local Git repository (which is contained in the hidden directory .git).&#160; The <strong>rm .git -rf</strong> means "Delete the directory .git and everything in it".&#160; <strong>rm</strong> is a Unix command, not part of Git.&#160; If you like you can delete your existing files <em>after</em> you create the cloned repository in the next step.&#160; Note the command <strong>rm Activity/ReadEtextsII</strong>, which deletes the symbolic link to our old project that we created by running <strong>./setup.py dev</strong>.&#160; We'll need to go to our new cloned project directory and run that again before we can test our Activity again.
+ <br/></li>
+ <li>Now we do the <strong>git clone</strong> command from the web page.&#160; This takes the remote Git repository we just added our MANIFEST file to and makes a new local repository in directory <strong>/<em>yourhome</em>/olpc/bookexamples/mainline.</strong></li>
+</ul><p>Finally we have a local repository we can use.&#160; Well, not quite.&#160; We can commit our code to it but we cannot push anything back to the remote repository because our local repository isn't configured correctly yet.
+</p>
+<p>What we need to do is edit the file <strong>config</strong> in directory <strong>.git</strong> in <strong>/<em>yourhome</em>/olpc/bookexamples/mainline.&#160; </strong>We can use gedit to do that.&#160; We need to change the <strong>url=</strong> entry to point to the <strong>Push url</strong> shown on the mainline web page.&#160; When we're done our <strong>config</strong> file should look like this:
+</p>
+<pre>[core]
+ repositoryformatversion = 0
+ filemode = true
+ bare = false
+ logallrefupdates = true
+[remote "origin"]
+<strong> url = gitorious@git.sugarlabs.org:
+myo-sugar-activities-examples/mainline.git</strong>
+ fetch = +refs/heads/*:refs/remotes/origin/*
+[branch "master"]
+ remote = origin
+ merge = refs/heads/master
+</pre>
+<p> The line in <strong>bold</strong> is the only one that gets changed.&#160; It is split here to make it fit on the printed page.&#160; In your own files it should all be one line with no spaces between the colon(:) that ends the first line and the beginning of the second line.
+ <br/></p>
+<p>From now on anyone who wants to work on our project can get a local copy of the Git repository by doing this from within the directory where he wants the repository to go:
+</p>
+<p>
+</p>
+<pre><strong>git clone git://git.sugarlabs.org/\
+myo-sugar-activities-examples/mainline.git</strong></pre>
+<p> He'll have to change his <strong>.git/config</strong> file just like we did, then he'll be ready to go.
+</p>
+<h2>Everyday Use Of Git
+</h2>
+<p> While getting the repositories set up to begin with is a chore, daily use is not.&#160; There are only a few commands you'll need to work with.&#160; When we left off we had a repository in <strong>/<em>yourhome</em>/olpc/bookexamples/mainline</strong> with our files in it.&#160; We will need to add any new files we create too.
+ <br/></p>
+<p>We use the <strong>git add</strong> command to tell Git that we want to use Git to store a particular file.&#160; This doesn't actually store anything, it just tells Git our intentions.&#160; The format of the command is simply:
+</p>
+<pre>git add <em>file_or_directory_name</em></pre>
+<p>There are files we <em>don't</em> want to add to Git, to begin with those files that end in <strong>.pyc</strong>.&#160; If we never do a <strong>git add</strong> on them they'll never get added, but Git will constantly ask us why we aren't adding them.&#160; Fortunately there is a way to tell Git that we really, really don't want to add those files.&#160; We need to create a file named <strong>.gitignore</strong> using gedit and put in entries like this:
+</p>
+<pre>*.pyc
+*.e4p
+*.zip
+.eric4project/
+.ropeproject/</pre>
+<p>These entries will also ignore project files used by Eric and zip files containing ebooks,&#160; Once we have this file created in the mainline directory we can add it to the repository:
+</p>
+<pre>git add .gitignore
+git commit -a -m "Add .gitignore file"
+</pre>
+<p>From now on Git will no longer ask us to add .pyc or other unwanted&#160; files that match our patterns. If there are other files we don't want in the repository we can add them to .gitignore either as full file names or directory names or as patterns like *.pyc.
+</p>
+<p>&#160;In addition to adding files to Git we can remove them too:
+</p>
+<pre>git rm <em>filename</em></pre>
+<p>Note that this just tells Git that from now on it will not be keeping track of a given filename, and that will take effect at the next commit.&#160; Old versions of the file are still in the repository.
+</p>
+<p>If you want to see what&#160;changes will be applied at the next commit run this:
+</p>
+<pre><strong>git status</strong>
+# On branch master
+# Changed but not updated:
+# (use "git add &lt;file&gt;..." to update what will
+# be committed)
+#
+# modified: ReadEtextsActivity.py
+#
+no changes added to commit (use "git add" and/or
+"git commit -a")
+</pre>
+<p>Finally, to put your latest changes in the repository use this:
+</p>
+<pre><strong>git commit -a -m "Change use of instance directory to tmp"</strong>
+Created commit a687b27: Change use of instance
+directory to tmp
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+</pre>
+<p>If you leave off the -m an editor will open up and you can type in a comment, then save and exit. Unfortunately by default the editor is <strong>vi</strong>, an old text mode editor that is not friendly like gedit.
+</p>
+<p>When we have all our changes done we can send them to the central repository using <strong>git push</strong>:
+</p>
+<pre><strong>git push</strong>
+Counting objects: 5, done.
+Compressing objects: 100% (3/3), done.
+Writing objects: 100% (3/3), 322 bytes, done.
+Total 3 (delta 2), reused 0 (delta 0)
+To gitorious@git.sugarlabs.org:
+myo-sugar-activities-examples/mainline.git
+ 700789d..a687b27 master -&gt; master
+=&gt; Syncing Gitorious...
+Heads up: head of changed to
+a687b27e2f034e5a17d2ca2fe9f2787c7f633e64 on master
+Notify cia.vc of a687b27e2f034e5a17d2ca2fe9f2787c7f633e64
+on myo-sugar-activities-examples
+[OK]
+
+</pre>
+<p>We can get the latest changes from other developers by doing <strong>git pull</strong>:
+</p>
+<pre><strong>git pull</strong>
+remote: Counting objects: 17, done.
+remote: Compressing objects: 100% (14/14), done.
+remote: Total 15 (delta 3), reused 0 (delta 0)
+Unpacking objects: 100% (15/15), done.
+From gitorious@git.sugarlabs.org:
+myo-sugar-activities-examples/mainline
+ 2cb3a1e..700789d master -&gt; origin/master
+Updating 2cb3a1e..700789d
+Fast forward
+ .gitignore | 6 +
+ MANIFEST | 244 +--------------------------
+---------
+ ReadEtexts.py | 182 +++++++++++++++++++++++++++
+ ReadEtextsActivity.py | 182 +++++++++++++++++++++++++++
+ ReadEtextsActivity2.py | 311 +++++++++++++++++++++++++++
++++++++++++++++++++
+ activity/activity.info | 9 ++
+ activity/read-etexts.svg | 71 +++++++++++
+ setup.py | 21 +++
+ toolbar.py | 136 ++++++++++++++++++++
+ 9 files changed, 921 insertions(+), 241 deletions(-)
+ create mode 100644 .gitignore
+ create mode 100755 ReadEtexts.py
+ create mode 100644 ReadEtextsActivity.py
+ create mode 100644 ReadEtextsActivity2.py
+ create mode 100644 activity/activity.info
+ create mode 100644 activity/read-etexts.svg
+ create mode 100755 setup.py
+ create mode 100644 toolbar.py
+&#160;</pre></body></html> \ No newline at end of file