Show More
@@ -961,6 +961,30 def caps20to10(repo): | |||
|
961 | 961 | caps.add('bundle2=' + urllib.quote(capsblob)) |
|
962 | 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 | 988 | def getbundle(repo, source, heads=None, common=None, bundlecaps=None, |
|
965 | 989 | **kwargs): |
|
966 | 990 | """return a full bundle (with potentially multiple kind of parts) |
@@ -976,40 +1000,57 def getbundle(repo, source, heads=None, | |||
|
976 | 1000 | The implementation is at a very early stage and will get massive rework |
|
977 | 1001 | when the API of bundle is refined. |
|
978 | 1002 | """ |
|
979 | cg = None | |
|
980 | if kwargs.get('cg', True): | |
|
981 | # build changegroup bundle here. | |
|
982 | cg = changegroup.getchangegroup(repo, source, heads=heads, | |
|
983 | common=common, bundlecaps=bundlecaps) | |
|
984 | elif 'HG2X' not in bundlecaps: | |
|
1003 | # bundle10 case | |
|
1004 | if bundlecaps is None or 'HG2X' not in bundlecaps: | |
|
1005 | if bundlecaps and not kwargs.get('cg', True): | |
|
985 | 1006 | raise ValueError(_('request for bundle10 must include changegroup')) |
|
986 | if bundlecaps is None or 'HG2X' not in bundlecaps: | |
|
1007 | ||
|
987 | 1008 | if kwargs: |
|
988 | 1009 | raise ValueError(_('unsupported getbundle arguments: %s') |
|
989 | 1010 | % ', '.join(sorted(kwargs.keys()))) |
|
990 | return cg | |
|
991 | # very crude first implementation, | |
|
992 | # the bundle API will change and the generation will be done lazily. | |
|
1011 | return changegroup.getchangegroup(repo, source, heads=heads, | |
|
1012 | common=common, bundlecaps=bundlecaps) | |
|
1013 | ||
|
1014 | # bundle20 case | |
|
993 | 1015 | b2caps = {} |
|
994 | 1016 | for bcaps in bundlecaps: |
|
995 | 1017 | if bcaps.startswith('bundle2='): |
|
996 | 1018 | blob = urllib.unquote(bcaps[len('bundle2='):]) |
|
997 | 1019 | b2caps.update(bundle2.decodecaps(blob)) |
|
998 | 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 | 1039 | if cg: |
|
1000 | 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 | 1046 | listkeys = kwargs.get('listkeys', ()) |
|
1002 | 1047 | for namespace in listkeys: |
|
1003 | 1048 | part = bundler.newpart('b2x:listkeys') |
|
1004 | 1049 | part.addparam('namespace', namespace) |
|
1005 | 1050 | keys = repo.listkeys(namespace).items() |
|
1006 | 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 | 1054 | def _getbundleobsmarkerpart(bundler, repo, source, heads=None, common=None, |
|
1014 | 1055 | bundlecaps=None, b2caps=None, **kwargs): |
|
1015 | 1056 | """add an obsolescence markers part to the requested bundle""" |
@@ -1020,6 +1061,7 def _getbundleobsmarkerpart(bundler, rep | |||
|
1020 | 1061 | markers = repo.obsstore.relevantmarkers(subset) |
|
1021 | 1062 | buildobsmarkerspart(bundler, markers) |
|
1022 | 1063 | |
|
1064 | @getbundle2partsgenerator('extra') | |
|
1023 | 1065 | def _getbundleextrapart(bundler, repo, source, heads=None, common=None, |
|
1024 | 1066 | bundlecaps=None, b2caps=None, **kwargs): |
|
1025 | 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