git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] Let git-svnimport clean up SVK commit messages.
@ 2007-06-21  2:14 Dave O'Neill
  2007-06-21  3:19 ` Steven Grimm
                   ` (2 more replies)
  0 siblings, 3 replies; 8+ messages in thread
From: Dave O'Neill @ 2007-06-21  2:14 UTC (permalink / raw)
  To: git; +Cc: Dave O'Neill

SVK likes to begin all commit messages with a line of the format:
   r12345@hostname: user | YYYY-MM-DD HH:MM:SS -ZZZZ
which makes the import desperately ugly in git.  This adds a -k option to move
this extra SVK commit line to the end of the commit message, rather than
keeping it at the beginning.
---
 Documentation/git-svnimport.txt |    6 +++++-
 git-svnimport.perl              |   18 +++++++++++++++---
 2 files changed, 20 insertions(+), 4 deletions(-)

diff --git a/Documentation/git-svnimport.txt b/Documentation/git-svnimport.txt
index e97d15e..23a54b0 100644
--- a/Documentation/git-svnimport.txt
+++ b/Documentation/git-svnimport.txt
@@ -11,7 +11,7 @@ SYNOPSIS
 --------
 [verse]
 'git-svnimport' [ -o <branch-for-HEAD> ] [ -h ] [ -v ] [ -d | -D ]
-		[ -C <GIT_repository> ] [ -i ] [ -u ] [-l limit_rev]
+		[ -C <GIT_repository> ] [ -i ] [ -k ] [ -u ] [-l limit_rev]
 		[ -b branch_subdir ] [ -T trunk_subdir ] [ -t tag_subdir ]
 		[ -s start_chg ] [ -m ] [ -r ] [ -M regex ]
 		[ -I <ignorefile_name> ] [ -A <author_file> ]
@@ -68,6 +68,10 @@ When importing incrementally, you might need to edit the .git/svn2git file.
 	Prepend 'rX: ' to commit messages, where X is the imported
 	subversion revision.
 
+-k::
+	Remove SVK-style revision/commiter info from the top of commit
+	messages and move it to the bottom.
+
 -I <ignorefile_name>::
 	Import the svn:ignore directory property to files with this
 	name in each directory. (The Subversion and GIT ignore
diff --git a/git-svnimport.perl b/git-svnimport.perl
index f459762..7076f41 100755
--- a/git-svnimport.perl
+++ b/git-svnimport.perl
@@ -32,20 +32,20 @@ $ENV{'TZ'}="UTC";
 
 our($opt_h,$opt_o,$opt_v,$opt_u,$opt_C,$opt_i,$opt_m,$opt_M,$opt_t,$opt_T,
     $opt_b,$opt_r,$opt_I,$opt_A,$opt_s,$opt_l,$opt_d,$opt_D,$opt_S,$opt_F,
-    $opt_P,$opt_R);
+    $opt_P,$opt_R,$opt_k);
 
 sub usage() {
 	print STDERR <<END;
 Usage: ${\basename $0}     # fetch/update GIT from SVN
        [-o branch-for-HEAD] [-h] [-v] [-l max_rev] [-R repack_each_revs]
        [-C GIT_repository] [-t tagname] [-T trunkname] [-b branchname]
-       [-d|-D] [-i] [-u] [-r] [-I ignorefilename] [-s start_chg]
+       [-d|-D] [-i] [-k] [-u] [-r] [-I ignorefilename] [-s start_chg]
        [-m] [-M regex] [-A author_file] [-S] [-F] [-P project_name] [SVN_URL]
 END
 	exit(1);
 }
 
-getopts("A:b:C:dDFhiI:l:mM:o:rs:t:T:SP:R:uv") or usage();
+getopts("A:b:C:dDFhiI:kl:mM:o:rs:t:T:SP:R:uv") or usage();
 usage if $opt_h;
 
 my $tag_name = $opt_t || "tags";
@@ -835,7 +835,19 @@ sub commit {
 		$pw->writer();
 		$pr->reader();
 
+
+		if ( $opt_k ) {
+			# Remove SVK cruft in commit message
+			my ($svk_info) = $message =~ s{(r\d+\@[^:]+:\s+\S+\s+\|\s+\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2}\s[\+-]\d{4})\s*}{};
+			if( $svk_info ) {
+				# and stick it on the end so we don't lose it
+				$message .= "\n$svk_info"
+			}
+		}
+
+
 		$message =~ s/[\s\n]+\z//;
+
 		$message = "r$revision: $message" if $opt_r;
 
 		print $pw "$message\n"
-- 
1.5.2.2.239.g89630

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH] Let git-svnimport clean up SVK commit messages.
  2007-06-21  2:14 [PATCH] Let git-svnimport clean up SVK commit messages Dave O'Neill
@ 2007-06-21  3:19 ` Steven Grimm
  2007-06-21 14:14   ` Dave O'Neill
  2007-06-21  6:01 ` Sam Vilain
  2007-06-21 20:51 ` [PATCH] Let git-svnimport and git-svn " Dave O'Neill
  2 siblings, 1 reply; 8+ messages in thread
From: Steven Grimm @ 2007-06-21  3:19 UTC (permalink / raw)
  To: Dave O'Neill; +Cc: git

Dave O'Neill wrote:
> SVK likes to begin all commit messages with a line of the format:
>    r12345@hostname: user | YYYY-MM-DD HH:MM:SS -ZZZZ
> which makes the import desperately ugly in git.  This adds a -k option to move
> this extra SVK commit line to the end of the commit message, rather than
> keeping it at the beginning.
>   

Any chance of applying this to git-svn instead? There has been talk of 
deprecating git-svnimport since git-svn now does everything 
git-svnimport does, and more. (If you believe that's not the case, 
please describe what you're doing with git-svnimport that you can't do 
with git-svn.)

-Steve

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] Let git-svnimport clean up SVK commit messages.
  2007-06-21  2:14 [PATCH] Let git-svnimport clean up SVK commit messages Dave O'Neill
  2007-06-21  3:19 ` Steven Grimm
@ 2007-06-21  6:01 ` Sam Vilain
  2007-06-21 14:22   ` Dave O'Neill
  2007-06-21 20:51 ` [PATCH] Let git-svnimport and git-svn " Dave O'Neill
  2 siblings, 1 reply; 8+ messages in thread
From: Sam Vilain @ 2007-06-21  6:01 UTC (permalink / raw)
  To: Dave O'Neill; +Cc: git

Dave O'Neill wrote:
> SVK likes to begin all commit messages with a line of the format:
>    r12345@hostname: user | YYYY-MM-DD HH:MM:SS -ZZZZ
> which makes the import desperately ugly in git.  This adds a -k option to move
> this extra SVK commit line to the end of the commit message, rather than
> keeping it at the beginning.

This is a good idea, of course if somebody didn't specify the magic -I
switch to their 'svk sm' incantation then there will be multiple changes
listed in a single revision

some examples

http://dev.catalystframework.org/svnweb/Catalyst/revision/?rev=6477
svn log -r 7190:7190 http://svn.pugscode.org/pugs

There was also a pretty nasty bug in SVK which pushed huge commitlogs
with no changes

see for example

http://utsl.gen.nz/gitweb/?p=pugs;a=commit;h=817b73f
(or:
svn log -r 14734:14734 http://svn.pugscode.org/pugs
svn diff -r 14733:14734 http://svn.pugscode.org/pugs
)

That occurred often enough that it might even be worth detecting and
dealing with specially.  ie, if multiple SVK changesets are seen in a
commit with no changes, mark it as likely bogus.

Yeah, I'm not sure what to say about all this other than "lolsvn".

Sam.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] Let git-svnimport clean up SVK commit messages.
  2007-06-21  3:19 ` Steven Grimm
@ 2007-06-21 14:14   ` Dave O'Neill
  2007-06-21 15:00     ` Jeffrey C. Ollie
  0 siblings, 1 reply; 8+ messages in thread
From: Dave O'Neill @ 2007-06-21 14:14 UTC (permalink / raw)
  To: Steven Grimm; +Cc: git

On Wed, Jun 20, 2007 at 08:19:33PM -0700, Steven Grimm wrote:

> Any chance of applying this to git-svn instead? There has been talk of 
> deprecating git-svnimport since git-svn now does everything 
> git-svnimport does, and more. (If you believe that's not the case, 
> please describe what you're doing with git-svnimport that you can't do 
> with git-svn.)

Sure, I can probably apply it to git-svn as well, but based on the
testing I've done, git-svnimport still works better for what I'm doing.
I'm trying to do a straight conversion from SVN to git, so we can do
away with our Subversion repositories, so I won't need the bidirectional
support of git-svn.  

If git-svn had a --one-way option that could 
  - know that I'm converting, and import my SVN tags and branches to
    local tags and heads rather than remotes
  - turn off the git-svn-id: tags in the commit
  - avoid preserving a .git/svn/ directory (a git-svn conversion was 50%
    larger than one from git-svnimport because of this)
  - convert svn:ignore attrs to .gitignore (like the -I option of
    git-svnignore)

then I wouldn't need git-svnimport.  Alternatively, if there's some way
to postprocess my clone to do all of the above, that would probably be
good enough.

Cheers,
Dave

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] Let git-svnimport clean up SVK commit messages.
  2007-06-21  6:01 ` Sam Vilain
@ 2007-06-21 14:22   ` Dave O'Neill
  0 siblings, 0 replies; 8+ messages in thread
From: Dave O'Neill @ 2007-06-21 14:22 UTC (permalink / raw)
  To: Sam Vilain; +Cc: git

On Thu, Jun 21, 2007 at 06:01:01PM +1200, Sam Vilain wrote:
> This is a good idea, of course if somebody didn't specify the magic -I
> switch to their 'svk sm' incantation then there will be multiple changes
> listed in a single revision

Yeah, I don't think there's much hope of fully cleaning up those
messages.  My goal was just to make 'git log --pretty=oneline' show
something meaningful from the commit message, rather than:

edfbf48adabb68f9b3973f5950570c355f3ee811  r6211@oxygen:  dmo | 2007-04-17 17:28:23 -0400
d5b3268e815ce9e88dd617a5b62df80da263f396  r6210@oxygen:  dmo | 2007-04-17 15:54:04 -0400

Cheers,
Dave

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] Let git-svnimport clean up SVK commit messages.
  2007-06-21 14:14   ` Dave O'Neill
@ 2007-06-21 15:00     ` Jeffrey C. Ollie
  2007-06-21 21:58       ` Dave O'Neill
  0 siblings, 1 reply; 8+ messages in thread
From: Jeffrey C. Ollie @ 2007-06-21 15:00 UTC (permalink / raw)
  To: Dave O'Neill; +Cc: Steven Grimm, git

[-- Attachment #1: Type: text/plain, Size: 1847 bytes --]

On Thu, 2007-06-21 at 10:14 -0400, Dave O'Neill wrote:
> On Wed, Jun 20, 2007 at 08:19:33PM -0700, Steven Grimm wrote:
> 
> > Any chance of applying this to git-svn instead? There has been talk of 
> > deprecating git-svnimport since git-svn now does everything 
> > git-svnimport does, and more. (If you believe that's not the case, 
> > please describe what you're doing with git-svnimport that you can't do 
> > with git-svn.)
> 
> Sure, I can probably apply it to git-svn as well, but based on the
> testing I've done, git-svnimport still works better for what I'm doing.
> I'm trying to do a straight conversion from SVN to git, so we can do
> away with our Subversion repositories, so I won't need the bidirectional
> support of git-svn.  
> 
> If git-svn had a --one-way option that could 
>   - know that I'm converting, and import my SVN tags and branches to
>     local tags and heads rather than remotes

This quickie Python script should convert the "tag branches" to regular
Git tags:

        import os
        refs = os.popen('git-for-each-ref --format="%(objectname)%00%(refname)%00" refs/remotes/tags')
        for line in refs:
            [sha, ref] = line.split('\0')[:2]
            os.system('git tag %s %s' % (ref[18:], sha))


>   - turn off the git-svn-id: tags in the commit

git svn fetch --no-metadata

>   - avoid preserving a .git/svn/ directory (a git-svn conversion was 50%
>     larger than one from git-svnimport because of this)

Once you are done importing, you can delete that directory.

>   - convert svn:ignore attrs to .gitignore (like the -I option of
>     git-svnignore)

git svn show-ignore

> then I wouldn't need git-svnimport.  Alternatively, if there's some way
> to postprocess my clone to do all of the above, that would probably be
> good enough.


[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 189 bytes --]

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH] Let git-svnimport and git-svn clean up SVK commit messages
  2007-06-21  2:14 [PATCH] Let git-svnimport clean up SVK commit messages Dave O'Neill
  2007-06-21  3:19 ` Steven Grimm
  2007-06-21  6:01 ` Sam Vilain
@ 2007-06-21 20:51 ` Dave O'Neill
  2 siblings, 0 replies; 8+ messages in thread
From: Dave O'Neill @ 2007-06-21 20:51 UTC (permalink / raw)
  To: git; +Cc: Dave O'Neill

SVN repositories that have been committed to with SVK will have commits that
contain SVK metadata on the first line of the message:

   r12345@hostname: user | YYYY-MM-DD HH:MM:SS -ZZZZ

After importing, git will then pick up this first as the commit title, which
isn't terribly informative in 'git log --pretty=oneline' or gitk.

This patch adds a -k option to git-svnimport and a --fix-svk-message option
(and fixSvkMessage config option) to git-svn.  Enabling this option allows
git-svn to try and move that metadata to the end of the commit message,
possibly giving us a more meaningful first line.
---
 Documentation/git-svn.txt       |   13 +++++++++++++
 Documentation/git-svnimport.txt |    6 +++++-
 git-svn.perl                    |   23 ++++++++++++++++++++---
 git-svnimport.perl              |   15 ++++++++++++---
 4 files changed, 50 insertions(+), 7 deletions(-)

diff --git a/Documentation/git-svn.txt b/Documentation/git-svn.txt
index c0d7d95..5cd89f9 100644
--- a/Documentation/git-svn.txt
+++ b/Documentation/git-svn.txt
@@ -54,6 +54,8 @@ COMMANDS
 	Set the 'useSvmProps' option in the [svn-remote] config.
 --use-svnsync-props;;
 	Set the 'useSvnsyncProps' option in the [svn-remote] config.
+--fix-svk-message;;
+	Set the 'fixSvkMessage' option in the [svn-remote] config.
 --rewrite-root=<URL>;;
 	Set the 'rewriteRoot' option in the [svn-remote] config.
 --username=<USER>;;
@@ -385,6 +387,14 @@ svn-remote.<name>.rewriteRoot::
 	the repository with a public http:// or svn:// URL in the
 	metadata so users of it will see the public URL.
 
+svn-remote.<name>.fixSvkMessage::
+	SVN repositories that have been committed to with SVK will have
+	commits that contain SVK metadata on the first line of the
+	message, which git will then pick up as the commit title.  Enabling
+	this option allows git-svn to try and move that metadata to the end
+	of the commit message, possibly giving us a more meaningful first
+	line.
+
 Since the noMetadata, rewriteRoot, useSvnsyncProps and useSvmProps
 options all affect the metadata generated and used by git-svn; they
 *must* be set in the configuration file before any history is imported
@@ -393,6 +403,9 @@ and these settings should never be changed once they are set.
 Additionally, only one of these four options can be used per-svn-remote
 section because they affect the 'git-svn-id:' metadata line.
 
+The fixSvkMessage option may be set in combination with any of these, and
+can be set after import if desired.
+
 --
 
 BASIC EXAMPLES
diff --git a/Documentation/git-svnimport.txt b/Documentation/git-svnimport.txt
index e97d15e..23a54b0 100644
--- a/Documentation/git-svnimport.txt
+++ b/Documentation/git-svnimport.txt
@@ -11,7 +11,7 @@ SYNOPSIS
 --------
 [verse]
 'git-svnimport' [ -o <branch-for-HEAD> ] [ -h ] [ -v ] [ -d | -D ]
-		[ -C <GIT_repository> ] [ -i ] [ -u ] [-l limit_rev]
+		[ -C <GIT_repository> ] [ -i ] [ -k ] [ -u ] [-l limit_rev]
 		[ -b branch_subdir ] [ -T trunk_subdir ] [ -t tag_subdir ]
 		[ -s start_chg ] [ -m ] [ -r ] [ -M regex ]
 		[ -I <ignorefile_name> ] [ -A <author_file> ]
@@ -68,6 +68,10 @@ When importing incrementally, you might need to edit the .git/svn2git file.
 	Prepend 'rX: ' to commit messages, where X is the imported
 	subversion revision.
 
+-k::
+	Remove SVK-style revision/commiter info from the top of commit
+	messages and move it to the bottom.
+
 -I <ignorefile_name>::
 	Import the svn:ignore directory property to files with this
 	name in each directory. (The Subversion and GIT ignore
diff --git a/git-svn.perl b/git-svn.perl
index 50128d7..1451f0d 100755
--- a/git-svn.perl
+++ b/git-svn.perl
@@ -83,6 +83,7 @@ my %init_opts = ( 'template=s' => \$_template, 'shared:s' => \$_shared,
                   'trunk|T=s' => \$_trunk, 'tags|t=s' => \$_tags,
                   'branches|b=s' => \$_branches, 'prefix=s' => \$_prefix,
                   'minimize-url|m' => \$Git::SVN::_minimize_url,
+		  'fix-svk-message' => \$Git::SVN::_fix_svk_message,
 		  'no-metadata' => sub { $icv{noMetadata} = 1 },
 		  'use-svm-props' => sub { $icv{useSvmProps} = 1 },
 		  'use-svnsync-props' => sub { $icv{useSvnsyncProps} = 1 },
@@ -280,6 +281,11 @@ sub do_git_init_db {
 		command_noisy('config', "$pfx.$i", $icv{$i});
 		$set = $i;
 	}
+
+	if( defined $Git::SVN::_fix_svk_message ) {
+		command_noisy('config', "$pfx.fixSvkMessage", $Git::SVN::_fix_svk_message);
+	}
+
 }
 
 sub init_subdir {
@@ -826,7 +832,7 @@ sub working_head_info {
 package Git::SVN;
 use strict;
 use warnings;
-use vars qw/$default_repo_id $default_ref_id $_no_metadata $_follow_parent
+use vars qw/$default_repo_id $default_ref_id $_no_metadata $_follow_parent $_fix_svk_message
             $_repack $_repack_flags $_use_svm_props $_head
             $_use_svnsync_props $no_reuse_existing $_minimize_url/;
 use Carp qw/croak/;
@@ -849,7 +855,7 @@ BEGIN {
 	# per [svn-remote "..."] section.  Command-line options will *NOT*
 	# override options set in an [svn-remote "..."] section
 	no strict 'refs';
-	for my $option (qw/follow_parent no_metadata use_svm_props
+	for my $option (qw/follow_parent no_metadata use_svm_props fix_svk_message
 			   use_svnsync_props/) {
 		my $key = $option;
 		$key =~ tr/_//d;
@@ -1613,7 +1619,18 @@ sub do_git_commit {
 	}
 	defined(my $pid = open3(my $msg_fh, my $out_fh, '>&STDERR', @exec))
 	                                                           or croak $!;
-	print $msg_fh $log_entry->{log} or croak $!;
+	my $log_msg = $log_entry->{log};
+
+	if( $self->fix_svk_message ) {
+		# Remove SVK cruft in commit message
+		$log_msg =~ s{(r\d+\@[^:]+:\s+\S+\s+\|\s+\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2}\s[\+-]\d{4})\s*}{};
+		if( $1 ) {
+			# and stick it on the end so we don't lose it
+			$log_msg .= "\n$1"
+		}
+	}
+
+	print $msg_fh $log_msg or croak $!;
 	unless ($self->no_metadata) {
 		print $msg_fh "\ngit-svn-id: $log_entry->{metadata}\n"
 		              or croak $!;
diff --git a/git-svnimport.perl b/git-svnimport.perl
index f459762..89afdd8 100755
--- a/git-svnimport.perl
+++ b/git-svnimport.perl
@@ -32,20 +32,20 @@ $ENV{'TZ'}="UTC";
 
 our($opt_h,$opt_o,$opt_v,$opt_u,$opt_C,$opt_i,$opt_m,$opt_M,$opt_t,$opt_T,
     $opt_b,$opt_r,$opt_I,$opt_A,$opt_s,$opt_l,$opt_d,$opt_D,$opt_S,$opt_F,
-    $opt_P,$opt_R);
+    $opt_P,$opt_R,$opt_k);
 
 sub usage() {
 	print STDERR <<END;
 Usage: ${\basename $0}     # fetch/update GIT from SVN
        [-o branch-for-HEAD] [-h] [-v] [-l max_rev] [-R repack_each_revs]
        [-C GIT_repository] [-t tagname] [-T trunkname] [-b branchname]
-       [-d|-D] [-i] [-u] [-r] [-I ignorefilename] [-s start_chg]
+       [-d|-D] [-i] [-k] [-u] [-r] [-I ignorefilename] [-s start_chg]
        [-m] [-M regex] [-A author_file] [-S] [-F] [-P project_name] [SVN_URL]
 END
 	exit(1);
 }
 
-getopts("A:b:C:dDFhiI:l:mM:o:rs:t:T:SP:R:uv") or usage();
+getopts("A:b:C:dDFhiI:kl:mM:o:rs:t:T:SP:R:uv") or usage();
 usage if $opt_h;
 
 my $tag_name = $opt_t || "tags";
@@ -835,6 +835,15 @@ sub commit {
 		$pw->writer();
 		$pr->reader();
 
+		if ( $opt_k ) {
+			# Remove SVK cruft in commit message
+			$message =~ s{(r\d+\@[^:]+:\s+\S+\s+\|\s+\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2}\s[\+-]\d{4})\s*}{};
+			if( $1 ) {
+				# and stick it on the end so we don't lose it
+				$message .= "\n$1"
+			}
+		}
+
 		$message =~ s/[\s\n]+\z//;
 		$message = "r$revision: $message" if $opt_r;
 
-- 
1.5.2.2.239.g89630

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH] Let git-svnimport clean up SVK commit messages.
  2007-06-21 15:00     ` Jeffrey C. Ollie
@ 2007-06-21 21:58       ` Dave O'Neill
  0 siblings, 0 replies; 8+ messages in thread
From: Dave O'Neill @ 2007-06-21 21:58 UTC (permalink / raw)
  To: git

On Thu, Jun 21, 2007 at 10:00:00AM -0500, Jeffrey C. Ollie wrote:
> This quickie Python script should convert the "tag branches" to regular
> Git tags:
> 
>         import os
>         refs = os.popen('git-for-each-ref --format="%(objectname)%00%(refname)%00" refs/remotes/tags')
>         for line in refs:
>             [sha, ref] = line.split('\0')[:2]
>             os.system('git tag %s %s' % (ref[18:], sha))

Thanks!  I'll give that a try.  It would be nice if this sort of cleanup
were part of git-svn in some way, though.  I doubt I'll be the last
person wanting an easy conversion from SVN.

Cheers,
Dave

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2007-06-21 21:58 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-06-21  2:14 [PATCH] Let git-svnimport clean up SVK commit messages Dave O'Neill
2007-06-21  3:19 ` Steven Grimm
2007-06-21 14:14   ` Dave O'Neill
2007-06-21 15:00     ` Jeffrey C. Ollie
2007-06-21 21:58       ` Dave O'Neill
2007-06-21  6:01 ` Sam Vilain
2007-06-21 14:22   ` Dave O'Neill
2007-06-21 20:51 ` [PATCH] Let git-svnimport and git-svn " Dave O'Neill

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 NNTP newsgroup(s).