* maint-tools/git-wrapper: The new git wrapper for translators.
* README.translators: Document the usage of the git wrapper.
---
 README.translators      |   19 +++++
 maint-tools/git-wrapper |  193 +++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 212 insertions(+), 0 deletions(-)
 create mode 100755 maint-tools/git-wrapper

diff --git a/README.translators b/README.translators
index 7171e00..a6f35b6 100644
--- a/README.translators
+++ b/README.translators
@@ -77,3 +77,22 @@ Updated german translation.
   - msgfmt checks it for validity.
   - msgcat may detect encoding problems.
 
+* If you use git to commit directly your work in the official repo, you
+  should follow the git usage instructions described here:
+  http://wiki.debian.org/Teams/Dpkg/GitUsage
+
+  If those instructions are too complex for you, you can use
+  a git wrapper that offers the same interface as "svn" or "cvs". This
+  wrapper is "maint-tools/git-wrapper". You have only two commands to
+  use. You can only call it from the master branch and at the root of
+  the dpkg repository.
+
+  To update your repository with the latest version:
+  $ maint-tools/git-wrapper update
+
+  To commit the changes that you made:
+  $ maint-tools/git-wrapper commit
+
+  Always follow the step-by-step instructions carefully and you should be
+  fine. The lines starting by "**" are the instructions given by the
+  wrapper. The rest is the usual output of various git commands.
diff --git a/maint-tools/git-wrapper b/maint-tools/git-wrapper
new file mode 100755
index 0000000..0103332
--- /dev/null
+++ b/maint-tools/git-wrapper
@@ -0,0 +1,193 @@
+#!/bin/sh
+
+# Copyright 2007 Raphael Hertzog <[EMAIL PROTECTED]>
+#
+# This program is free software; you may redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This is distributed in the hope that it will be useful, but without
+# any warranty; without even the implied warranty of merchantability or
+# fitness for a particular purpose. See the GNU General Public License
+# for more details.
+#
+# A copy of the GNU General Public License is available as
+# /usr/share/common-licenses/GPL in the Debian GNU/Linux distribution
+# or on the World Wide Web at http://www.gnu.org/copyleft/gpl.html.
+# You can also obtain it by writing to the Free Software Foundation, Inc.,
+# 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+
+# This script is only meant to be used in the master branch of dpkg
+# This branch is created by default by a git clone
+# ssh://git.debian.org/git/dpkg/dpkg.git
+
+# Git 1.5.3 is required (for git-stash)
+
+has_changes_in_index() {
+    # git-diff --quiet returns 1 when there are changes
+    if git diff --quiet --cached; then
+       return 1
+    else
+       return 0
+    fi
+}
+has_changes_in_working_tree() {
+    # git-diff --quiet returns 1 when there are changes
+    if git diff --quiet; then
+       return 1
+    else
+       return 0
+    fi
+}
+is_uptodate() {
+    unmerged=`git rev-list origin/master ^HEAD`
+    if test -z "$unmerged"; then
+       return 0
+    else
+       return 1
+    fi
+}
+has_unpushed_commits() {
+    unpushed=`git rev-list HEAD ^origin/master`
+    if test -n "$unpushed"; then
+       return 0
+    else
+       return 1
+    fi
+}
+
+test -d .git || {
+    echo "This script must be called from the root of dpkg's git repository." 
>&2
+    exit
+}
+branch=`git-name-rev --name-only HEAD`
+[ "$branch" = "master" ] || {
+    echo "This script must be called from dpkg's master branch." >&2
+    echo "Call 'git checkout master'."
+    exit
+}
+
+case $1 in
+    update)
+       git fetch --quiet origin
+
+       if has_unpushed_commits; then
+           echo "** You have local commits that were not pushed to the remote 
repository."
+           if is_uptodate; then
+               echo "** They are still OK to be pushed."
+           else
+               echo "** The remote repository has evolved. Rebasing your work."
+               $0 rebase
+           fi
+       else
+           if ! is_uptodate; then
+               echo "** The remote repository has changed. Trying to update."
+               if has_changes_in_index || has_changes_in_working_tree; then
+                   git merge origin/master
+                   result=$?
+                   if [ $result -eq 0 ]; then
+                       echo "** The repository has been updated."
+                   elif [ $result -eq 1 ]; then
+                       echo "** The repository has been updated but there have 
been conflicts:"
+                       git ls-files --unmerged | awk '{print $4}' | uniq -c
+                   else
+                       echo "** The automatic merge failed. Try another 
stratrgy."
+                       echo "** Pushing local changes aside with git stash"
+                       git stash save "WIP saved by dpkg-vcs"
+                       echo "** Merging remote changes, should result in 
fast-forward"
+                       git merge origin/master
+                       echo "** Reapplying local changes with git stash apply"
+                       git stash apply
+                       result=$?
+                       if [ $result -eq 0 ]; then
+                           echo "** Local changes have been merged"
+                       elif [ $result -eq 1 ]; then
+                           echo "** Local changes have been merged but there 
have been conflicts:"
+                           git ls-files --unmerged | awk '{print $4}' | uniq -c
+                       else
+                           echo "** git stash apply failed badly and returned 
$result."
+                           echo "** You're on your own..."
+                           exit 2
+                       fi
+                   fi
+               fi
+           else
+               echo "** Nothing updated, the remote respository hasn't 
changed."
+           fi
+       fi
+
+    ;;
+    commit)
+       git fetch --quiet origin
+
+       if ! is_uptodate; then
+           echo "** You're not up-to-date, please do '$0 update' first."
+           exit 1
+       fi
+
+       if has_changes_in_index || has_changes_in_working_tree; then
+           echo "** Committing changes locally"
+           git commit -a || {
+               echo "** git commit failed, stopping here."
+               exit 1
+           }
+       fi
+
+       if has_unpushed_commits; then
+           echo "** Pushing your changes to the remote repository"
+           echo "Here's a resume of what you're going to push:"
+           git rev-list --pretty=oneline --abbrev-commit master ^origin/master
+           echo "** Do you confirm that you want to push? [Yn] "
+           read answer
+           if [ "$answer" = "" ] || [ "$answer" = "y" ] || [ "$answer" = "Y" 
]; then
+               echo "** Calling 'git push'"
+               git push
+           fi
+       fi
+
+    ;;
+    rebase)
+       git fetch --quiet origin
+
+       if [ -z "$2" ]; then
+           echo "** Starting a rebase process..."
+           git rebase origin/master
+           result=$?
+       else
+           if [ "$2" = "--continue" ] || [ "$2" = "--skip" ]; then
+               if [ "$2" = "--continue" ]; then
+                   for file in `git ls-files --unmerged | awk '{print $4}' | 
uniq`; do
+                       git add $file
+                   done
+               fi
+               git rebase $2
+               result=$?
+           else
+               echo "Invalid option for '$0 rebase': $2" >&2
+               exit 1
+           fi
+       fi
+
+       if [ $result -eq 0 ]; then
+           echo "** The rebase process is finished. Your repository is 
up-to-date."
+           exit 0
+       elif [ $result -eq 1 ]; then
+           echo "** Rebase process interrupted by conflicts."
+           echo "** Edit the files below and fix all the conflicts,"
+           echo "** then call '$0 rebase --continue':"
+           git ls-files --unmerged | awk '{print $4}' | uniq -c
+           exit 1
+       else
+           echo "** The rebase process miserably failed for an unknown reason."
+           echo "** Aborting it."
+           git rebase --abort
+           exit 2
+       fi
+    ;;
+    *)
+    echo "$0: invalid syntax" >&2
+    echo "$0 update: update the master branch of the repository" >&2
+    echo "$0 commit: commit and push the changes to the master repository" >&2
+    ;;
+esac
-- 
1.5.3.7


-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to