git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Peter Baumann <waste.manager@gmx.de>
To: "Frédéric Heitzmann" <frederic.heitzmann@gmail.com>
Cc: Eric Wong <normalperson@yhbt.net>,
	git@vger.kernel.org, Junio C Hamano <gitster@pobox.com>
Subject: Re: [PATCH v2] git svn : hook before 'git svn dcommit'
Date: Thu, 18 Aug 2011 11:12:28 +0200	[thread overview]
Message-ID: <20110818091228.GB16549@m62s10.vlinux.de> (raw)
In-Reply-To: <CALeToSUidWgiJ+PxuphnBZOQGNStNOO9==EswfLDpFr2GYy=nA@mail.gmail.com>

On Wed, Aug 17, 2011 at 04:35:03PM +0200, Frédéric Heitzmann wrote:
> Hi all.
> 
> Maybe I should give some more context to explain why a hook could be a
> potential improvement.
> 
> Let's consider the following workflow :
> 1) git svn clone from the SVN server, then git checkout -b topic
> 2) git commit some "reference data", before starting some optimization
> or code refactoring.
> ** These reference data are not supposed to find their way to the SVN server **
> Committing such "reference data" is just a convenience because git
> does a great job to show how these data may or may not change during
> the development process.
> 3) hack, test, commit ...
> 3 bis) it may happen that reference data change for some very good
> reason (for instance some protocol change)
> New reference data are then commited.
> 
> back to 3 ...
> 
> 4) Before merging back to master and commitng to SVN, it is necessary
> to remove commits with reference data (git rebase -i --onto master
> master topic ...)
> 5) merge topic branch with master and git svn dcommit
> 
> -- end --
> 
> It is very easy to forget step 4, and svn commit lots of useless data.
> 
> Proposal 1)
> * commit reference data with some specific mark in the commit message
> (e.g. "NO_SVN")
> * use pre-svn-dcommit hook to detect such commits
> 
> Proposal 2) (not fully feasable for what I know)
> * git svn clone to a bare repo
> * clone a working repo from the the bare repo.
> * steps 2, 3, maybe 3bis, ... then 4
> * push commits to the bare repo, while using pre-receive or update
> hook to look for wrong commits, and abort if so.
> * use post-receive hook to trigger git svn dcommit
> 
> Main drawback for proposal 2 (appart from needing 2 repo instead of
> one) is that each time you want to update your working  repo, you have
> to git svn rebase the bare repo, then git pull.
> 
> Proposal 2bis)
> * add a pre-send hook on the bare repo, and trigger some git svn
> rebase with this hook.
> I am not sure to see all the potential consequences of such a hook though.
> 
> All things begin equal, proposal 1 seems to be the easier path, but it
> is highly debatable.
> 

I have written a local script for exactly the problem you described after looking
for a git svn dcommit hook I could use (as you did).
I attached it, so feel free to use it. Simply add it to your bin and run it
with   git dcommit    instead of  git svn dcommit

Pls read the comment for further explanation how this script is used.


#!/bin/bash
# Copyright © Peter Baumann, 2011
#
# Wrapper script around git svn dcommit, which adds some useful functionality
#
# This script will prevent accidentally commiting some commits not yet ready
# into SVN. Commits starting with (case insensitive) debug, wip, fixup are
# considered not appropriate for putting them into SVN. The main reason for
# this functionality is the specific workflow I use. I always have some 
# internal debug commits (e.g. enhanced debug logging) or simply work in progress
# commits which should never be put into SVN. 
#
# To avoid putting those into SVN, I rebase all commits so that my WIP/DEBUG commits 
# are on top of the commits ment for SVN.
# Calling this script via "git dcommit" after the rebase makes sure only commits
# beneath the WIP commits are considered for SVN. 
# Furthermore, a shortlog of commits ment for SVN is shown and the user has
# to confirm before actually putting them into SVN.
#
# If this script is called via a specific commit (e.g. via its SHA1) as parameter,
# then only commits beneath and including the commit itself are committet to SVN.


SUBDIRECTORY_OK=Yes

. git-sh-setup
require_work_tree
cd_to_toplevel || die "foo"

# Upstream ref
upstream=remotes/trunk

# Stop at this commit
last=
if [ ! -z $1 ]; then
	$(git rev-parse $1^{commit})
	echo $last
fi

# The latest git commit we want to commit SVN
commit=

# Remembers the original head
orig_head=
if branch=$(git symbolic-ref -q HEAD)
then
	orig_head=${branch#refs/heads/}
else
	orig_head='(detached head)'
fi


function run()
{
	#echo "DEBUG: $@"
	$@
}	

IFS='
'
for c in $(git log --reverse --pretty="%H %s" HEAD --not "${upstream}"); do
	# Split the log output into its fields
	sha1="${c:0:40}"
	msg="${c:41}"

	# Check if the commit subject matches (case insenstive) to one of the
	# following patterns. Leading whitespace is fine
	# 	debug
	#	wip
	#	fixup!
	if echo "$msg"|egrep -i -q '^\s*(debug|wip|fixup)'; then
		break
	fi
	commit=${sha1}

	if [ "x${commit}" = "x${last}" ]; then
		break
	fi
done


if [ "x${commit}" == "x" ]; then
	die "Nothing to commit - Perhaps you have only stuff not ready for SVN?"
fi

echo ">>>> Committing the folling GIT commits to SVN <<<<"
git --no-pager log --pretty=oneline ${commit} --not "${upstream}"
echo

# Show the latest commit we are going to submit to SVN
#git show ${commit}

echo
echo "Commiting to SVN (y/N)?"
read yesno || die "Aborting"

if [ "x${yesno}" == "xy" ] || [ "x$yesno" == "xY" ]; then
	run git checkout -q "${commit}" || die "Checkout failed"
	run git svn dcommit || "Aborting - git svn dcommit failed!"

	if [ "${orig_head}" != "(detached head)" ]; then
		echo "DO THIS:"
		run git checkout "${orig_head}" && run git rebase "${upstream}"
	else
		echo "You have started this script being on a detached HEAD."
		echo "Please rebase manually!"
	fi
fi

  parent reply	other threads:[~2011-08-18  9:12 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-08-15 20:04 [PATCH v2] git svn : hook before 'git svn dcommit' Frédéric Heitzmann
2011-08-15 21:14 ` Junio C Hamano
2011-08-17  0:30   ` Eric Wong
     [not found]     ` <CALeToSWJNK=q4iPwxNvgGin0T61oLKJd=b9F3cSSo0vVebrhhQ@mail.gmail.com>
2011-08-17 14:35       ` Frédéric Heitzmann
2011-08-17 20:37         ` Eric Wong
2011-08-18 13:43           ` Frédéric Heitzmann
2011-08-20 18:41             ` Eric Wong
2011-08-18  9:12         ` Peter Baumann [this message]
2011-09-01 16:58           ` Paul Young
  -- strict thread matches above, loose matches on Subject: below --
2011-07-04  5:54 [PATCH] " Frédéric Heitzmann
2011-07-05 20:44 ` [PATCH v2] " Frédéric Heitzmann
2011-07-09 12:18   ` Frédéric Heitzmann

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20110818091228.GB16549@m62s10.vlinux.de \
    --to=waste.manager@gmx.de \
    --cc=frederic.heitzmann@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=normalperson@yhbt.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).