Re: [PATCH/RFC] git-svn: don't create master if another head exists

2012-07-19 Thread Eric Wong
Marcin Owsiany mar...@owsiany.pl wrote:
 On Wed, Jul 18, 2012 at 11:27:22AM +, Eric Wong wrote:
  Marcin Owsiany mar...@owsiany.pl wrote:
   Turns out that command_noisy()
- has a meaningless return value
- throws an exception on command failure
   so the || bit does not work.
   Also, for some reason command_noisy does not check for the command being
   killed by a signal, so I'd prefer to leave the verify_ref there.
  
  Ugh, I always forget the Git.pm API, too.  Perhaps command_noisy should
  be made to respect signals in exit codes (the rest of git-svn is
  compromised by this behavior in command_noisy, too, it turns out... :x)
  
  I'm not sure what else would break if command_noisy were changed,
  git-svn appears to be the only user in git.git.
 
 Other command flavours should probably also be changed to match?

Probably, I'm not sure if it'd break existing uses.  Anyways, that's a
separate issue we can deal with another day.

I've added my Signed-off-by: to your latest patch and pushed
to master of git://bogomips.org/git-svn.git
(commit e3bd4ddaa9a60fa4e70efdb143b434b440d6cec4)

Marcin Owsiany (1):
  git-svn: don't create master if another head exists
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH/RFC] git-svn: don't create master if another head exists

2012-07-19 Thread Junio C Hamano
Eric Wong normalper...@yhbt.net writes:

 Probably, I'm not sure if it'd break existing uses.  Anyways, that's a
 separate issue we can deal with another day.

 I've added my Signed-off-by: to your latest patch and pushed
 to master of git://bogomips.org/git-svn.git
 (commit e3bd4ddaa9a60fa4e70efdb143b434b440d6cec4)

Thanks.
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH/RFC] git-svn: don't create master if another head exists

2012-07-18 Thread Marcin Owsiany
Thanks for the review!

On Wed, Jul 11, 2012 at 03:56:43PM -0700, Junio C Hamano wrote:
 Marcin Owsiany mar...@owsiany.pl writes:
 
  Date: Sun, 24 Jun 2012 22:40:05 +0100
  Subject: [PATCH] git-svn: don't create master if another head exists
 
  git-svn insists on creating the master head (unless it exists) on every
  fetch. It is useful that it gets created initially, when no head exists
  - users expect this git convention of having a master branch on initial
  clone.
 
  However creating it when there already is another head does not provide any
  value - the ref is never updated, so it just gets stale after a while.  
  Also,
  some users find it annoying that it gets recreated, especially when they 
  would
  like the git branch names to follow SVN repository branch names. More
  background in http://thread.gmane.org/gmane.comp.version-control.git/115030
 
  Make git-svn skip the master creation if HEAD points at a valid head. This
  means master does get created on initial clone but does not get 
  recreated
  once a user deletes it.
 
 The above description makes sense to me, but the code updated with
 this patch doesn't quite make sense to me.
 
 This is your patch with a bit wider context.
 
  diff --git a/git-svn.perl b/git-svn.perl
  index 0b074c4..2379a71 100755
  --- a/git-svn.perl
  +++ b/git-svn.perl
  @@ -1599,35 +1599,35 @@ sub rebase_cmd {
   sub post_fetch_checkout {
  return if $_no_checkout;
  my $gs = $Git::SVN::_head or return;
  return if verify_ref('refs/heads/master^0');
 
 Does master matter here?
 
 I am wondering why this is not
 
   return if verify_ref(HEAD^0);
 
 Moreover, since the code will check verify_ref(HEAD^0) anyway in
 the place you updated, is this early return still necessary?

Hm, good point, nothing between these two returns seems to modify
on-disk state.

  # look for trunk ref if it exists
  my $remote = Git::SVN::read_all_remotes()-{$gs-{repo_id}};
  my $fetch = $remote-{fetch};
  if ($fetch) {
  foreach my $p (keys %$fetch) {
  basename($fetch-{$p}) eq 'trunk' or next;
  $gs = Git::SVN-new($fetch-{$p}, $gs-{repo_id}, 
  $p);
  last;
  }
  }
  
  -   my $valid_head = verify_ref('HEAD^0');
  +   return if verify_ref('HEAD^0');
 
 This one matches the description.  When post_fetch_checkout() is
 called, if HEAD is already pointing at a valid commit, we do not
 want to run checkout (or create a ref).
 
  command_noisy(qw(update-ref refs/heads/master), $gs-refname);
  -   return if ($valid_head || !verify_ref('HEAD^0'));
  +   return unless verify_ref('HEAD^0');
 
 I do not understand these three lines.  Why aren't they like this?
 
   command_noisy(qw(update-ref HEAD), $gs-refname) || return;
 
 That is, in a fresh repository whose HEAD points at an unborn
 'master', nothing changes from the current behaviour.  If a fresh
 repository whose HEAD points at some other unborn branch, should the
 code still want to update 'master'?  Wouldn't we rather want to
 update that branch?

I don't know if there can ever be some other unborn branch other than
master, but I guess your proposal makes it more robust.

 If the caller does not handle errors, it could be even clearer to
 write it like
 
   command_noisy(qw(update-ref HEAD), $gs-refname) ||
   die Cannot update HEAD!!!;

Turns out that command_noisy()
 - has a meaningless return value
 - throws an exception on command failure
so the || bit does not work.
Also, for some reason command_noisy does not check for the command being
killed by a signal, so I'd prefer to leave the verify_ref there.

PTAL:

From: Marcin Owsiany mar...@owsiany.pl
Date: Sun, 24 Jun 2012 22:40:05 +0100
Subject: [PATCH] git-svn: don't create master if another head exists

git-svn insists on creating the master head (unless it exists) on every
fetch. It is useful that it gets created initially, when no head exists
- users expect this git convention of having a master branch on initial
clone.

However creating it when there already is another head does not provide any
value - the ref is never updated, so it just gets stale after a while.  Also,
some users find it annoying that it gets recreated, especially when they would
like the git branch names to follow SVN repository branch names. More
background in http://thread.gmane.org/gmane.comp.version-control.git/115030

Make git-svn skip the master creation if HEAD already points at a valid head.
This means master does get created on initial clone but does not get
recreated once a user deletes it.

Also, make post_fetch_checkout work with any head that is pointed to by HEAD,
not just master.

Also, use fatal error handling consistent with the rest of the program for
post_fetch_checkout.

Signed-off-by: Marcin Owsiany mar...@owsiany.pl
---
 git-svn.perl |9 -
 1 files changed, 4 insertions(+), 5 

Re: [PATCH/RFC] git-svn: don't create master if another head exists

2012-07-18 Thread Marcin Owsiany
On Wed, Jul 18, 2012 at 11:27:22AM +, Eric Wong wrote:
 Marcin Owsiany mar...@owsiany.pl wrote:
  On Wed, Jul 11, 2012 at 03:56:43PM -0700, Junio C Hamano wrote:
   If the caller does not handle errors, it could be even clearer to
   write it like
   
 command_noisy(qw(update-ref HEAD), $gs-refname) ||
 die Cannot update HEAD!!!;
  
  Turns out that command_noisy()
   - has a meaningless return value
   - throws an exception on command failure
  so the || bit does not work.
  Also, for some reason command_noisy does not check for the command being
  killed by a signal, so I'd prefer to leave the verify_ref there.
 
 Ugh, I always forget the Git.pm API, too.  Perhaps command_noisy should
 be made to respect signals in exit codes (the rest of git-svn is
 compromised by this behavior in command_noisy, too, it turns out... :x)
 
 I'm not sure what else would break if command_noisy were changed,
 git-svn appears to be the only user in git.git.

Other command flavours should probably also be changed to match?

-- 
Marcin Owsiany mar...@owsiany.pl  http://marcin.owsiany.pl/
GnuPG: 2048R/02F946FC  35E9 1344 9F77 5F43 13DD  6423 DBF4 80C6 02F9 46FC

Every program in development at MIT expands until it can read mail.
  -- Unknown
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH/RFC] git-svn: don't create master if another head exists

2012-07-18 Thread Junio C Hamano
Marcin Owsiany mar...@owsiany.pl writes:

 PTAL:

 From: Marcin Owsiany mar...@owsiany.pl
 Date: Sun, 24 Jun 2012 22:40:05 +0100
 Subject: [PATCH] git-svn: don't create master if another head exists

 git-svn insists on creating the master head (unless it exists) on every
 fetch. It is useful that it gets created initially, when no head exists
 - users expect this git convention of having a master branch on initial
 clone.

 However creating it when there already is another head does not provide any
 value - the ref is never updated, so it just gets stale after a while.  Also,
 some users find it annoying that it gets recreated, especially when they would
 like the git branch names to follow SVN repository branch names. More
 background in http://thread.gmane.org/gmane.comp.version-control.git/115030

 Make git-svn skip the master creation if HEAD already points at a valid 
 head.
 This means master does get created on initial clone but does not get
 recreated once a user deletes it.

 Also, make post_fetch_checkout work with any head that is pointed to by HEAD,
 not just master.

 Also, use fatal error handling consistent with the rest of the program for
 post_fetch_checkout.

 Signed-off-by: Marcin Owsiany mar...@owsiany.pl
 ---
  git-svn.perl |9 -
  1 files changed, 4 insertions(+), 5 deletions(-)

 diff --git a/git-svn.perl b/git-svn.perl
 index 0b074c4..6673d21 100755
 --- a/git-svn.perl
 +++ b/git-svn.perl
 @@ -367,9 +367,9 @@ Git::SVN::init_vars();
  eval {
   Git::SVN::verify_remotes_sanity();
   $cmd{$cmd}-[0]-(@ARGV);
 + post_fetch_checkout();
  };
  fatal $@ if $@;
 -post_fetch_checkout();
  exit 0;
  
  ### primary functions ##
 @@ -1598,8 +1598,8 @@ sub rebase_cmd {
  
  sub post_fetch_checkout {
   return if $_no_checkout;
 + return if verify_ref('HEAD^0');
   my $gs = $Git::SVN::_head or return;
 - return if verify_ref('refs/heads/master^0');
  
   # look for trunk ref if it exists
   my $remote = Git::SVN::read_all_remotes()-{$gs-{repo_id}};
 @@ -1612,9 +1612,8 @@ sub post_fetch_checkout {
   }
   }
  
 - my $valid_head = verify_ref('HEAD^0');
 - command_noisy(qw(update-ref refs/heads/master), $gs-refname);
 - return if ($valid_head || !verify_ref('HEAD^0'));
 + command_noisy(qw(update-ref HEAD), $gs-refname);
 + return unless verify_ref('HEAD^0');
  
   return if $ENV{GIT_DIR} !~ m#^(?:.*/)?\.git$#;
   my $index = $ENV{GIT_INDEX_FILE} || $ENV{GIT_DIR}/index;

I am happy with this version, as long as Eric is happy ;-)

Thanks.
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH/RFC] git-svn: don't create master if another head exists

2012-07-11 Thread Marcin Owsiany
On Wed, Jul 11, 2012 at 01:26:17AM +, Eric Wong wrote:
 Junio C Hamano gits...@pobox.com wrote:
  Marcin Owsiany mar...@owsiany.pl writes:
  
   This makes my idea to do the same to my something else instead of
   master much less attractive. In fact I don't think such behaviour would
   be useful.
   
   I think with the suggested patch git-svn works as I would like it to:
- creates master at initial checkout - consistent with git clone
- using a different tracking-like branch is possible with dcommit
- does not re-create master on fetch - so the annoying part is gone
  
   Any comments?
  
  Not from me.  Even though I'd love to hear Eric's opinion, your I
  don't think such behaviour would be useful. gave me an impression
  that you would justify the change in a different way (i.e. a rewrite
  of proposed log message) or tweak the patch (i.e. a modified
  behaviour), or perhaps both, in your re-roll, the ball was in your
  court, and we were waiting for such a rerolled patch.
 
 Sorry, I keep forgetting this topic.  But yes, I thought you would tweak
 your patch.

Oh, I guess I got used to projects where people pay no attention to
patch comments. How about this:

From: Marcin Owsiany mar...@owsiany.pl
Date: Sun, 24 Jun 2012 22:40:05 +0100
Subject: [PATCH] git-svn: don't create master if another head exists

git-svn insists on creating the master head (unless it exists) on every
fetch. It is useful that it gets created initially, when no head exists
- users expect this git convention of having a master branch on initial
clone.

However creating it when there already is another head does not provide any
value - the ref is never updated, so it just gets stale after a while.  Also,
some users find it annoying that it gets recreated, especially when they would
like the git branch names to follow SVN repository branch names. More
background in http://thread.gmane.org/gmane.comp.version-control.git/115030

Make git-svn skip the master creation if HEAD points at a valid head. This
means master does get created on initial clone but does not get recreated
once a user deletes it.

Signed-off-by: Marcin Owsiany mar...@owsiany.pl
---
 git-svn.perl |4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/git-svn.perl b/git-svn.perl
index 0b074c4..2379a71 100755
--- a/git-svn.perl
+++ b/git-svn.perl
@@ -1612,9 +1612,9 @@ sub post_fetch_checkout {
}
}
 
-   my $valid_head = verify_ref('HEAD^0');
+   return if verify_ref('HEAD^0');
command_noisy(qw(update-ref refs/heads/master), $gs-refname);
-   return if ($valid_head || !verify_ref('HEAD^0'));
+   return unless verify_ref('HEAD^0');
 
return if $ENV{GIT_DIR} !~ m#^(?:.*/)?\.git$#;
my $index = $ENV{GIT_INDEX_FILE} || $ENV{GIT_DIR}/index;
-- 
1.7.7.3


-- 
Marcin Owsiany mar...@owsiany.pl  http://marcin.owsiany.pl/
GnuPG: 2048R/02F946FC  35E9 1344 9F77 5F43 13DD  6423 DBF4 80C6 02F9 46FC

Every program in development at MIT expands until it can read mail.
  -- Unknown
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH/RFC] git-svn: don't create master if another head exists

2012-07-11 Thread Junio C Hamano
Marcin Owsiany mar...@owsiany.pl writes:

 Date: Sun, 24 Jun 2012 22:40:05 +0100
 Subject: [PATCH] git-svn: don't create master if another head exists

 git-svn insists on creating the master head (unless it exists) on every
 fetch. It is useful that it gets created initially, when no head exists
 - users expect this git convention of having a master branch on initial
 clone.

 However creating it when there already is another head does not provide any
 value - the ref is never updated, so it just gets stale after a while.  Also,
 some users find it annoying that it gets recreated, especially when they would
 like the git branch names to follow SVN repository branch names. More
 background in http://thread.gmane.org/gmane.comp.version-control.git/115030

 Make git-svn skip the master creation if HEAD points at a valid head. This
 means master does get created on initial clone but does not get recreated
 once a user deletes it.

The above description makes sense to me, but the code updated with
this patch doesn't quite make sense to me.

This is your patch with a bit wider context.

 diff --git a/git-svn.perl b/git-svn.perl
 index 0b074c4..2379a71 100755
 --- a/git-svn.perl
 +++ b/git-svn.perl
 @@ -1599,35 +1599,35 @@ sub rebase_cmd {
  sub post_fetch_checkout {
 return if $_no_checkout;
 my $gs = $Git::SVN::_head or return;
 return if verify_ref('refs/heads/master^0');

Does master matter here?

I am wondering why this is not

return if verify_ref(HEAD^0);

Moreover, since the code will check verify_ref(HEAD^0) anyway in
the place you updated, is this early return still necessary?

 # look for trunk ref if it exists
 my $remote = Git::SVN::read_all_remotes()-{$gs-{repo_id}};
 my $fetch = $remote-{fetch};
 if ($fetch) {
 foreach my $p (keys %$fetch) {
 basename($fetch-{$p}) eq 'trunk' or next;
 $gs = Git::SVN-new($fetch-{$p}, $gs-{repo_id}, $p);
 last;
 }
 }
 
 - my $valid_head = verify_ref('HEAD^0');
 + return if verify_ref('HEAD^0');

This one matches the description.  When post_fetch_checkout() is
called, if HEAD is already pointing at a valid commit, we do not
want to run checkout (or create a ref).

 command_noisy(qw(update-ref refs/heads/master), $gs-refname);
 - return if ($valid_head || !verify_ref('HEAD^0'));
 + return unless verify_ref('HEAD^0');

I do not understand these three lines.  Why aren't they like this?

command_noisy(qw(update-ref HEAD), $gs-refname) || return;

That is, in a fresh repository whose HEAD points at an unborn
'master', nothing changes from the current behaviour.  If a fresh
repository whose HEAD points at some other unborn branch, should the
code still want to update 'master'?  Wouldn't we rather want to
update that branch?

If the caller does not handle errors, it could be even clearer to
write it like

command_noisy(qw(update-ref HEAD), $gs-refname) ||
die Cannot update HEAD!!!;

 return if $ENV{GIT_DIR} !~ m#^(?:.*/)?\.git$#;
 my $index = $ENV{GIT_INDEX_FILE} || $ENV{GIT_DIR}/index;
 return if -f $index;
 
 return if command_oneline(qw/rev-parse --is-inside-work-tree/) eq 
 'false';
 return if command_oneline(qw/rev-parse --is-inside-git-dir/) eq 
 'true';
 command_noisy(qw/read-tree -m -u -v HEAD HEAD/);
 print STDERR Checked out HEAD:\n  ,
  $gs-full_url,  r, $gs-last_rev, \n;
 if (auto_create_empty_directories($gs)) {
 $gs-mkemptydirs($gs-last_rev);
 }
  }
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH/RFC] git-svn: don't create master if another head exists

2012-07-10 Thread Eric Wong
Junio C Hamano gits...@pobox.com wrote:
 Marcin Owsiany mar...@owsiany.pl writes:
 
  This makes my idea to do the same to my something else instead of
  master much less attractive. In fact I don't think such behaviour would
  be useful.
  
  I think with the suggested patch git-svn works as I would like it to:
   - creates master at initial checkout - consistent with git clone
   - using a different tracking-like branch is possible with dcommit
   - does not re-create master on fetch - so the annoying part is gone
 
  Any comments?
 
 Not from me.  Even though I'd love to hear Eric's opinion, your I
 don't think such behaviour would be useful. gave me an impression
 that you would justify the change in a different way (i.e. a rewrite
 of proposed log message) or tweak the patch (i.e. a modified
 behaviour), or perhaps both, in your re-roll, the ball was in your
 court, and we were waiting for such a rerolled patch.

Sorry, I keep forgetting this topic.  But yes, I thought you would tweak
your patch.
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH/RFC] git-svn: don't create master if another head exists

2012-07-09 Thread Marcin Owsiany
On Tue, Jun 26, 2012 at 11:32:15PM +0100, Marcin Owsiany wrote:
 On Tue, Jun 26, 2012 at 03:03:07PM -0700, Junio C Hamano wrote:
  Marcin Owsiany mar...@owsiany.pl writes:
  
   diff --git a/git-svn.perl b/git-svn.perl
   index 0b074c4..2379a71 100755
   --- a/git-svn.perl
   +++ b/git-svn.perl
   @@ -1612,9 +1612,9 @@ sub post_fetch_checkout {
 }
 }

   - my $valid_head = verify_ref('HEAD^0');
   + return if verify_ref('HEAD^0');
 command_noisy(qw(update-ref refs/heads/master), $gs-refname);
  
  Given that your original motivation was I do not want master, I am
  using something else for my primary branch, I change that still
  shows update-ref refs/heads/master smells like sweeping something
  under the rug
 
 I'm not so sure... With this change, git-svn will only create master on
 the initial clone and I think that's fine. It's consistent with what
 git clone does when cloning a regular git repository.
 
 It seems that I have slightly misinterpreted git-svn's actions in my
 initial post in 2009. I thought it always updated master to the
 most recent upstream commit. In reality it only every _creates_ it at
 the most recent commit. But never fast-forwards it if it pre-exists.
 
 This makes my idea to do the same to my something else instead of
 master much less attractive. In fact I don't think such behaviour would
 be useful.
 
 I think with the suggested patch git-svn works as I would like it to:
  - creates master at initial checkout - consistent with git clone
  - using a different tracking-like branch is possible with dcommit
  - does not re-create master on fetch - so the annoying part is gone

Any comments?

-- 
Marcin Owsiany mar...@owsiany.pl  http://marcin.owsiany.pl/
GnuPG: 2048R/02F946FC  35E9 1344 9F77 5F43 13DD  6423 DBF4 80C6 02F9 46FC

Every program in development at MIT expands until it can read mail.
  -- Unknown
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH/RFC] git-svn: don't create master if another head exists

2012-07-09 Thread Junio C Hamano
Marcin Owsiany mar...@owsiany.pl writes:

 This makes my idea to do the same to my something else instead of
 master much less attractive. In fact I don't think such behaviour would
 be useful.
 
 I think with the suggested patch git-svn works as I would like it to:
  - creates master at initial checkout - consistent with git clone
  - using a different tracking-like branch is possible with dcommit
  - does not re-create master on fetch - so the annoying part is gone

 Any comments?

Not from me.  Even though I'd love to hear Eric's opinion, your I
don't think such behaviour would be useful. gave me an impression
that you would justify the change in a different way (i.e. a rewrite
of proposed log message) or tweak the patch (i.e. a modified
behaviour), or perhaps both, in your re-roll, the ball was in your
court, and we were waiting for such a rerolled patch.
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html