[PATCH v5 12/10] remote-bzr: support the new 'force' option

2013-11-10 Thread Richard Hansen
Signed-off-by: Richard Hansen 
---
 contrib/remote-helpers/git-remote-bzr | 34 +-
 contrib/remote-helpers/test-bzr.sh| 22 +-
 2 files changed, 54 insertions(+), 2 deletions(-)

diff --git a/contrib/remote-helpers/git-remote-bzr 
b/contrib/remote-helpers/git-remote-bzr
index 7e34532..ba693d1 100755
--- a/contrib/remote-helpers/git-remote-bzr
+++ b/contrib/remote-helpers/git-remote-bzr
@@ -42,6 +42,7 @@ import json
 import re
 import StringIO
 import atexit, shutil, hashlib, urlparse, subprocess
+import types
 
 NAME_RE = re.compile('^([^<>]+)')
 AUTHOR_RE = re.compile('^([^<>]+?)? ?[<>]([^<>]*)(?:$|>)')
@@ -684,7 +685,8 @@ def do_export(parser):
 peer = bzrlib.branch.Branch.open(peers[name],
  
possible_transports=transports)
 try:
-peer.bzrdir.push_branch(branch, revision_id=revid)
+peer.bzrdir.push_branch(branch, revision_id=revid,
+overwrite=force)
 except bzrlib.errors.DivergedBranches:
 print "error %s non-fast forward" % ref
 continue
@@ -718,8 +720,34 @@ def do_capabilities(parser):
 print "*import-marks %s" % path
 print "*export-marks %s" % path
 
+print "option"
 print
 
+class InvalidOptionValue(Exception):
+pass
+
+def do_option(parser):
+(opt, val) = parser[1:3]
+handler = globals().get('do_option_' + opt)
+if handler and type(handler) == types.FunctionType:
+try:
+handler(val)
+except InvalidOptionValue:
+print "error '%s' is not a valid value for option '%s'" % (val, 
opt)
+else:
+print "unsupported"
+
+def do_bool_option(val):
+if val == 'true': ret = True
+elif val == 'false': ret = False
+else: raise InvalidOptionValue()
+print "ok"
+return ret
+
+def do_option_force(val):
+global force
+force = do_bool_option(val)
+
 def ref_is_valid(name):
 return not True in [c in name for c in '~^: \\']
 
@@ -882,6 +910,7 @@ def main(args):
 global is_tmp
 global branches, peers
 global transports
+global force
 
 alias = args[1]
 url = args[2]
@@ -895,6 +924,7 @@ def main(args):
 branches = {}
 peers = {}
 transports = []
+force = False
 
 if alias[5:] == url:
 is_tmp = True
@@ -930,6 +960,8 @@ def main(args):
 do_import(parser)
 elif parser.check('export'):
 do_export(parser)
+elif parser.check('option'):
+do_option(parser)
 else:
 die('unhandled command: %s' % line)
 sys.stdout.flush()
diff --git a/contrib/remote-helpers/test-bzr.sh 
b/contrib/remote-helpers/test-bzr.sh
index ea597b0..7d7778f 100755
--- a/contrib/remote-helpers/test-bzr.sh
+++ b/contrib/remote-helpers/test-bzr.sh
@@ -69,13 +69,33 @@ test_expect_success 'pushing' '
test_cmp expected actual
 '
 
+test_expect_success 'forced pushing' '
+   (
+   cd gitrepo &&
+   echo three-new >content &&
+   git commit -a --amend -m three-new &&
+   git push -f
+   ) &&
+
+   (
+   cd bzrrepo &&
+   # the forced update overwrites the bzr branch but not the bzr
+   # working directory (it tries to merge instead)
+   bzr revert
+   ) &&
+
+   echo three-new >expected &&
+   cat bzrrepo/content >actual &&
+   test_cmp expected actual
+'
+
 test_expect_success 'roundtrip' '
(
cd gitrepo &&
git pull &&
git log --format="%s" -1 origin/master >actual
) &&
-   echo three >expected &&
+   echo three-new >expected &&
test_cmp expected actual &&
 
(cd gitrepo && git push && git pull) &&
-- 
1.8.5.rc1.207.gc17dd22

--
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 v5 12/10] remote-bzr: support the new 'force' option

2013-11-11 Thread Felipe Contreras
Richard Hansen wrote:
> Signed-off-by: Richard Hansen 
> ---
>  contrib/remote-helpers/git-remote-bzr | 34 +-
>  contrib/remote-helpers/test-bzr.sh| 22 +-
>  2 files changed, 54 insertions(+), 2 deletions(-)
> 
> diff --git a/contrib/remote-helpers/git-remote-bzr 
> b/contrib/remote-helpers/git-remote-bzr
> index 7e34532..ba693d1 100755
> --- a/contrib/remote-helpers/git-remote-bzr
> +++ b/contrib/remote-helpers/git-remote-bzr
> @@ -42,6 +42,7 @@ import json
>  import re
>  import StringIO
>  import atexit, shutil, hashlib, urlparse, subprocess
> +import types
>  
>  NAME_RE = re.compile('^([^<>]+)')
>  AUTHOR_RE = re.compile('^([^<>]+?)? ?[<>]([^<>]*)(?:$|>)')
> @@ -684,7 +685,8 @@ def do_export(parser):
>  peer = bzrlib.branch.Branch.open(peers[name],
>   
> possible_transports=transports)
>  try:
> -peer.bzrdir.push_branch(branch, revision_id=revid)
> +peer.bzrdir.push_branch(branch, revision_id=revid,
> +overwrite=force)
>  except bzrlib.errors.DivergedBranches:
>  print "error %s non-fast forward" % ref
>  continue
> @@ -718,8 +720,34 @@ def do_capabilities(parser):
>  print "*import-marks %s" % path
>  print "*export-marks %s" % path
>  
> +print "option"
>  print
>  
> +class InvalidOptionValue(Exception):
> +pass
> +
> +def do_option(parser):
> +(opt, val) = parser[1:3]
> +handler = globals().get('do_option_' + opt)
> +if handler and type(handler) == types.FunctionType:
> +try:
> +handler(val)
> +except InvalidOptionValue:
> +print "error '%s' is not a valid value for option '%s'" % (val, 
> opt)
> +else:
> +print "unsupported"
> +
> +def do_bool_option(val):
> +if val == 'true': ret = True
> +elif val == 'false': ret = False
> +else: raise InvalidOptionValue()
> +print "ok"
> +return ret
> +
> +def do_option_force(val):
> +global force
> +force = do_bool_option(val)
> +

While this organization has merit, I think it's overkill for a single option,
or just a couple of them. If in the future we add more, we might revisit this,
for the moment something like this would suffice:

class InvalidOptionValue(Exception):
pass

def get_bool_option(val):
if val == 'true':
return True
elif val == 'false':
return False
else:
raise InvalidOptionValue()

def do_option(parser):
global force
_, key, value = parser.line.split(' ')
try:
if key == 'force':
force = get_bool_option(value)
print 'ok'
else:
print 'unsupported'
except InvalidOptionValue:
print "error '%s' is not a valid value for option '%s'" % (value, 
key)

Cheers.

-- 
Felipe Contreras
--
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 v5 12/10] remote-bzr: support the new 'force' option

2013-11-11 Thread Richard Hansen
On 2013-11-11 06:51, Felipe Contreras wrote:
> Richard Hansen wrote:
>> Signed-off-by: Richard Hansen 
>> ---
>>  contrib/remote-helpers/git-remote-bzr | 34 
>> +-
>>  contrib/remote-helpers/test-bzr.sh| 22 +-
>>  2 files changed, 54 insertions(+), 2 deletions(-)
>>
>> diff --git a/contrib/remote-helpers/git-remote-bzr 
>> b/contrib/remote-helpers/git-remote-bzr
>> index 7e34532..ba693d1 100755
>> --- a/contrib/remote-helpers/git-remote-bzr
>> +++ b/contrib/remote-helpers/git-remote-bzr
>> @@ -42,6 +42,7 @@ import json
>>  import re
>>  import StringIO
>>  import atexit, shutil, hashlib, urlparse, subprocess
>> +import types
>>  
>>  NAME_RE = re.compile('^([^<>]+)')
>>  AUTHOR_RE = re.compile('^([^<>]+?)? ?[<>]([^<>]*)(?:$|>)')
>> @@ -684,7 +685,8 @@ def do_export(parser):
>>  peer = bzrlib.branch.Branch.open(peers[name],
>>   
>> possible_transports=transports)
>>  try:
>> -peer.bzrdir.push_branch(branch, revision_id=revid)
>> +peer.bzrdir.push_branch(branch, revision_id=revid,
>> +overwrite=force)
>>  except bzrlib.errors.DivergedBranches:
>>  print "error %s non-fast forward" % ref
>>  continue
>> @@ -718,8 +720,34 @@ def do_capabilities(parser):
>>  print "*import-marks %s" % path
>>  print "*export-marks %s" % path
>>  
>> +print "option"
>>  print
>>  
>> +class InvalidOptionValue(Exception):
>> +pass
>> +
>> +def do_option(parser):
>> +(opt, val) = parser[1:3]
>> +handler = globals().get('do_option_' + opt)
>> +if handler and type(handler) == types.FunctionType:
>> +try:
>> +handler(val)
>> +except InvalidOptionValue:
>> +print "error '%s' is not a valid value for option '%s'" % (val, 
>> opt)
>> +else:
>> +print "unsupported"
>> +
>> +def do_bool_option(val):
>> +if val == 'true': ret = True
>> +elif val == 'false': ret = False
>> +else: raise InvalidOptionValue()
>> +print "ok"
>> +return ret
>> +
>> +def do_option_force(val):
>> +global force
>> +force = do_bool_option(val)
>> +
> 
> While this organization has merit, I think it's overkill for a single option,
> or just a couple of them. If in the future we add more, we might revisit this,
> for the moment something like this would suffice:

OK, I'll reroll.

> 
> class InvalidOptionValue(Exception):
>   pass
> 
> def get_bool_option(val):
>   if val == 'true':
>   return True
>   elif val == 'false':
>   return False
>   else:
>   raise InvalidOptionValue()
> 
> def do_option(parser):
>   global force
>   _, key, value = parser.line.split(' ')

I'm surprised you prefer this over 'key, val = parser[1:3]' or even
'_, key, val = parser[:]'.  Are you intending to eventually remove
Parser.__getitem__()?

Thanks,
Richard


>   try:
>   if key == 'force':
>   force = get_bool_option(value)
>   print 'ok'
>   else:
>   print 'unsupported'
>   except InvalidOptionValue:
>   print "error '%s' is not a valid value for option '%s'" % (value, 
> key)
> 
> Cheers.

--
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 v5 12/10] remote-bzr: support the new 'force' option

2013-11-11 Thread Felipe Contreras
On Mon, Nov 11, 2013 at 12:12 PM, Richard Hansen  wrote:
> On 2013-11-11 06:51, Felipe Contreras wrote:

>> def do_option(parser):
>>   global force
>>   _, key, value = parser.line.split(' ')
>
> I'm surprised you prefer this over 'key, val = parser[1:3]' or even
> '_, key, val = parser[:]'.  Are you intending to eventually remove
> Parser.__getitem__()?

I don't, actually. I'm fine with either way.

Cheers.

-- 
Felipe Contreras
--
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