Show More
@@ -961,6 +961,30 def caps20to10(repo): | |||||
961 | caps.add('bundle2=' + urllib.quote(capsblob)) |
|
961 | caps.add('bundle2=' + urllib.quote(capsblob)) | |
962 | return caps |
|
962 | return caps | |
963 |
|
963 | |||
|
964 | # List of names of steps to perform for a bundle2 for getbundle, order matters. | |||
|
965 | getbundle2partsorder = [] | |||
|
966 | ||||
|
967 | # Mapping between step name and function | |||
|
968 | # | |||
|
969 | # This exists to help extensions wrap steps if necessary | |||
|
970 | getbundle2partsmapping = {} | |||
|
971 | ||||
|
972 | def getbundle2partsgenerator(stepname): | |||
|
973 | """decorator for function generating bundle2 part for getbundle | |||
|
974 | ||||
|
975 | The function is added to the step -> function mapping and appended to the | |||
|
976 | list of steps. Beware that decorated functions will be added in order | |||
|
977 | (this may matter). | |||
|
978 | ||||
|
979 | You can only use this decorator for new steps, if you want to wrap a step | |||
|
980 | from an extension, attack the getbundle2partsmapping dictionary directly.""" | |||
|
981 | def dec(func): | |||
|
982 | assert stepname not in getbundle2partsmapping | |||
|
983 | getbundle2partsmapping[stepname] = func | |||
|
984 | getbundle2partsorder.append(stepname) | |||
|
985 | return func | |||
|
986 | return dec | |||
|
987 | ||||
964 | def getbundle(repo, source, heads=None, common=None, bundlecaps=None, |
|
988 | def getbundle(repo, source, heads=None, common=None, bundlecaps=None, | |
965 | **kwargs): |
|
989 | **kwargs): | |
966 | """return a full bundle (with potentially multiple kind of parts) |
|
990 | """return a full bundle (with potentially multiple kind of parts) | |
@@ -976,40 +1000,57 def getbundle(repo, source, heads=None, | |||||
976 | The implementation is at a very early stage and will get massive rework |
|
1000 | The implementation is at a very early stage and will get massive rework | |
977 | when the API of bundle is refined. |
|
1001 | when the API of bundle is refined. | |
978 | """ |
|
1002 | """ | |
979 | cg = None |
|
1003 | # bundle10 case | |
980 | if kwargs.get('cg', True): |
|
1004 | if bundlecaps is None or 'HG2X' not in bundlecaps: | |
981 | # build changegroup bundle here. |
|
1005 | if bundlecaps and not kwargs.get('cg', True): | |
982 | cg = changegroup.getchangegroup(repo, source, heads=heads, |
|
|||
983 | common=common, bundlecaps=bundlecaps) |
|
|||
984 | elif 'HG2X' not in bundlecaps: |
|
|||
985 | raise ValueError(_('request for bundle10 must include changegroup')) |
|
1006 | raise ValueError(_('request for bundle10 must include changegroup')) | |
986 | if bundlecaps is None or 'HG2X' not in bundlecaps: |
|
1007 | ||
987 | if kwargs: |
|
1008 | if kwargs: | |
988 | raise ValueError(_('unsupported getbundle arguments: %s') |
|
1009 | raise ValueError(_('unsupported getbundle arguments: %s') | |
989 | % ', '.join(sorted(kwargs.keys()))) |
|
1010 | % ', '.join(sorted(kwargs.keys()))) | |
990 | return cg |
|
1011 | return changegroup.getchangegroup(repo, source, heads=heads, | |
991 | # very crude first implementation, |
|
1012 | common=common, bundlecaps=bundlecaps) | |
992 | # the bundle API will change and the generation will be done lazily. |
|
1013 | ||
|
1014 | # bundle20 case | |||
993 | b2caps = {} |
|
1015 | b2caps = {} | |
994 | for bcaps in bundlecaps: |
|
1016 | for bcaps in bundlecaps: | |
995 | if bcaps.startswith('bundle2='): |
|
1017 | if bcaps.startswith('bundle2='): | |
996 | blob = urllib.unquote(bcaps[len('bundle2='):]) |
|
1018 | blob = urllib.unquote(bcaps[len('bundle2='):]) | |
997 | b2caps.update(bundle2.decodecaps(blob)) |
|
1019 | b2caps.update(bundle2.decodecaps(blob)) | |
998 | bundler = bundle2.bundle20(repo.ui, b2caps) |
|
1020 | bundler = bundle2.bundle20(repo.ui, b2caps) | |
|
1021 | ||||
|
1022 | for name in getbundle2partsorder: | |||
|
1023 | func = getbundle2partsmapping[name] | |||
|
1024 | func(bundler, repo, source, heads=heads, common=common, | |||
|
1025 | bundlecaps=bundlecaps, b2caps=b2caps, **kwargs) | |||
|
1026 | ||||
|
1027 | return util.chunkbuffer(bundler.getchunks()) | |||
|
1028 | ||||
|
1029 | @getbundle2partsgenerator('changegroup') | |||
|
1030 | def _getbundlechangegrouppart(bundler, repo, source, heads=None, common=None, | |||
|
1031 | bundlecaps=None, b2caps=None, **kwargs): | |||
|
1032 | """add a changegroup part to the requested bundle""" | |||
|
1033 | cg = None | |||
|
1034 | if kwargs.get('cg', True): | |||
|
1035 | # build changegroup bundle here. | |||
|
1036 | cg = changegroup.getchangegroup(repo, source, heads=heads, | |||
|
1037 | common=common, bundlecaps=bundlecaps) | |||
|
1038 | ||||
999 | if cg: |
|
1039 | if cg: | |
1000 | bundler.newpart('b2x:changegroup', data=cg.getchunks()) |
|
1040 | bundler.newpart('b2x:changegroup', data=cg.getchunks()) | |
|
1041 | ||||
|
1042 | @getbundle2partsgenerator('listkeys') | |||
|
1043 | def _getbundlelistkeysparts(bundler, repo, source, heads=None, common=None, | |||
|
1044 | bundlecaps=None, b2caps=None, **kwargs): | |||
|
1045 | """add parts containing listkeys namespaces to the requested bundle""" | |||
1001 | listkeys = kwargs.get('listkeys', ()) |
|
1046 | listkeys = kwargs.get('listkeys', ()) | |
1002 | for namespace in listkeys: |
|
1047 | for namespace in listkeys: | |
1003 | part = bundler.newpart('b2x:listkeys') |
|
1048 | part = bundler.newpart('b2x:listkeys') | |
1004 | part.addparam('namespace', namespace) |
|
1049 | part.addparam('namespace', namespace) | |
1005 | keys = repo.listkeys(namespace).items() |
|
1050 | keys = repo.listkeys(namespace).items() | |
1006 | part.data = pushkey.encodekeys(keys) |
|
1051 | part.data = pushkey.encodekeys(keys) | |
1007 | _getbundleobsmarkerpart(bundler, repo, source, heads=heads, common=common, |
|
|||
1008 | bundlecaps=bundlecaps, b2caps=b2caps, **kwargs) |
|
|||
1009 | _getbundleextrapart(bundler, repo, source, heads=heads, common=common, |
|
|||
1010 | bundlecaps=bundlecaps, b2caps=b2caps, **kwargs) |
|
|||
1011 | return util.chunkbuffer(bundler.getchunks()) |
|
|||
1012 |
|
1052 | |||
|
1053 | @getbundle2partsgenerator('obsmarkers') | |||
1013 | def _getbundleobsmarkerpart(bundler, repo, source, heads=None, common=None, |
|
1054 | def _getbundleobsmarkerpart(bundler, repo, source, heads=None, common=None, | |
1014 | bundlecaps=None, b2caps=None, **kwargs): |
|
1055 | bundlecaps=None, b2caps=None, **kwargs): | |
1015 | """add an obsolescence markers part to the requested bundle""" |
|
1056 | """add an obsolescence markers part to the requested bundle""" | |
@@ -1020,6 +1061,7 def _getbundleobsmarkerpart(bundler, rep | |||||
1020 | markers = repo.obsstore.relevantmarkers(subset) |
|
1061 | markers = repo.obsstore.relevantmarkers(subset) | |
1021 | buildobsmarkerspart(bundler, markers) |
|
1062 | buildobsmarkerspart(bundler, markers) | |
1022 |
|
1063 | |||
|
1064 | @getbundle2partsgenerator('extra') | |||
1023 | def _getbundleextrapart(bundler, repo, source, heads=None, common=None, |
|
1065 | def _getbundleextrapart(bundler, repo, source, heads=None, common=None, | |
1024 | bundlecaps=None, b2caps=None, **kwargs): |
|
1066 | bundlecaps=None, b2caps=None, **kwargs): | |
1025 | """hook function to let extensions add parts to the requested bundle""" |
|
1067 | """hook function to let extensions add parts to the requested bundle""" |
General Comments 0
You need to be logged in to leave comments.
Login now