Copyright (C) 2009 The Android Open Source Project

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.


Subject: How to get the android source code using Cygwin and Git
Date:    2009/04/27
Updated: 2009/05/21
Updated: 2010/03/30


Table of content:
  1- Goals and Requirements
  2- Getting the code, the simple way
  3- SSH issues
  4- Advanced Tricks


-------------------------
1- Goals and Requirements
-------------------------

This document explains how to checkout the Android source from the git
repositories under Windows.

As stated in development/docs/howto_build_SDK.txt, one can't build the whole
Android source code under Windows. You can only build the SDK tools for
Windows.

There are a number of caveats in checking out the code from Git under Windows. 
This document tries to explain them.

First you will need to meet the following requirements:
- You must have Cygwin installed. But wait! You CANNOT use the latest Cygwin 1.7.
  Instead you MUST use the "legacy Cygwin 1.5" that you can find at this page:

    http://cygwin.org/win-9x.html

  Don't mind the page title, just grab setup-legacy.exe and it will works just fine
  under XP or Vista.

- You must install Cyginw using the "Unix / Binary" mode.
  If you don't do that, git will fail to properly compute some SHA1 keys.

- You need the "git" and "curl" packages to checkout the code.
  If you plan to contribute, you might want to get "gitk" also.

  Note: if you want to build the SDK, check the howto_build_SDK.txt file
  for a list of extra required packages.
  The short summary is that you need at least these:
    autoconf, bison, curl, flex, gcc, g++, git, gnupg, make, mingw-zlib, python, unzip, zip
  and you must avoid the "readline" package.


-----------------------------------
2- Getting the code, the simple way
-----------------------------------

Out of the box, "repo" and "git" will work just fine under Cygwin:

  $ repo init -u git://android.git.kernel.org/platform/manifest.git
  $ repo sync

And you're done. You can build as explained in howto_build_SDK.txt and ignore
the rest of this document.


-------------
3- SSH issues
-------------

If you maintain your own private repository using an SSH server, you might get
some "mux/ssh" errors. In this case try this:

  $ repo init -u ssh://my.private.ssh.repo/platform/manifest.git
  $ export GIT_SSH=ssh
  $ repo sync


------------------
4- Advanced Tricks
------------------

There is one remaining issue with the default repo/git options:

If you plan on contributing, you will notice that even after a fresh "repo
sync" some projects are marked as having modified files. This happens on the
"bionic" and the "external/iptables" project. The issue is that they have files
which have the same name yet differ only by their case-sensitivity. Since the
Windows filesystem is not case-sensitive, this confuses Git.

Solution: we can simply ignore these projects as they are not needed to build
the Windows SDK.

To do this you just need to create a file .repo/local_manifest.xml that
provides a list of projects to ignore:

<?xml version="1.0" encoding="UTF-8"?>
<manifest>
  <remove-project name="platform/external/iptables" />
</manifest>

The other thing we can do is tell git not to track the files that cause
problems:

  cd bionic
  git update-index --assume-unchanged \
    libc/kernel/common/linux/netfilter/xt_CONNMARK.h \
    libc/kernel/common/linux/netfilter/xt_MARK.h \
    libc/kernel/common/linux/netfilter_ipv6/ip6t_HL.h

  cd external/tcpdump;
  git update-index --assume-unchanged \
    tests/print-X.new \
    tests/print-XX.new


Here's a script that takes care of all these details. It performs the repo
init, creates the appropriate local_manifest.xml, does a repo sync as
needed and tell git to ignore the offending files:

------------
#!/bin/bash

set -e  # fail on errors

URL=ssh://android-git.corp.google.com:29418/platform/manifest.git
BRANCH=donut
if [ "$1" == "-b" ]; then shift; BRANCH=$1; shift; fi

# repo init if there's no .repo directory
if [[ ! -d .repo ]]; then
    repo init -u $URL -b $BRANCH
fi

# create a local_manifest to exclude projects that cause problems under Windows
# due to the case-insenstivines of the file system.
L=.repo/local_manifest.xml
if [[ ! -f $L ]]; then

    cat > $L <<EOF
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remove-project name="platform/external/iptables" />
</manifest>
EOF
fi

# sync using the native ssh client if necessary
[[ $URL != ${URL/ssh/} ]] && export GIT_SSH=ssh
repo sync $@


# These files cause trouble too, we need to ignore them
(cd bionic;
git update-index --assume-unchanged \
    libc/kernel/common/linux/netfilter/xt_CONNMARK.h \
    libc/kernel/common/linux/netfilter/xt_MARK.h \
    libc/kernel/common/linux/netfilter_ipv6/ip6t_HL.h
)
(cd external/tcpdump;
git update-index --assume-unchanged \
    tests/print-X.new \
    tests/print-XX.new
)
------------

Simply extract this to a "my_sync.sh" file and try the following:
  $ mkdir android_src
  $ cd android_src
  $ chmod +x mysync.sh
  $ ./mysync.sh


-end-




