@@ -776,7 +776,7 @@ def diff_file(self, path):
776
776
777
777
# Merge related methods
778
778
779
- def merge (self , src ):
779
+ def merge (self , src , op_cb = None ):
780
780
"""Merges the divergent changes of the src branch onto this one."""
781
781
self ._check_is_current ()
782
782
self ._check_op_not_in_progress ()
@@ -787,7 +787,27 @@ def merge(self, src):
787
787
try :
788
788
git .merge (src , '--no-ff' )
789
789
except ErrorReturnCode as e :
790
- raise GlError (stdout (e ) + stderr (e ))
790
+ err = stderr (e )
791
+ if not 'stash' in err :
792
+ raise GlError (stdout (e ) + err )
793
+ if op_cb and op_cb .save :
794
+ op_cb .save ()
795
+ git .stash .save ('--' , _stash_msg_merge )
796
+ try :
797
+ git .merge (src , '--no-ff' )
798
+ except ErrorReturnCode as e :
799
+ raise GlError (stdout (e ) + stderr (e ))
800
+
801
+ restore_fn = op_cb .restore_ok if op_cb else None
802
+ self ._safe_restore (_stash_msg_merge , restore_fn = restore_fn )
803
+ self ._state_cleanup ()
804
+
805
+ def merge_continue (self , op_cb = None ):
806
+ if not self .merge_in_progress :
807
+ raise GlError ('No merge in progress, nothing to continue' )
808
+ restore_fn = op_cb .restore_ok if op_cb else None
809
+ self ._safe_restore (_stash_msg_merge , restore_fn = restore_fn )
810
+ self ._state_cleanup ()
791
811
792
812
@property
793
813
def merge_in_progress (self ):
@@ -825,7 +845,7 @@ def _load_fuse_commits(self):
825
845
yield git_repo [ci_id ]
826
846
os .remove (self ._fuse_commits_fp )
827
847
828
- def fuse (self , src , ip , only = None , exclude = None , fuse_cb = None ):
848
+ def fuse (self , src , ip , only = None , exclude = None , op_cb = None ):
829
849
"""Fuse the given commits onto this branch.
830
850
831
851
Args:
@@ -835,12 +855,12 @@ def fuse(self, src, ip, only=None, exclude=None, fuse_cb=None):
835
855
divergent commits from self or the divergent point.
836
856
only: ids of commits to use only.
837
857
exclude: ids of commtis to exclude.
838
- fuse_cb : see FuseCb .
858
+ op_cb : see OpCb .
839
859
"""
840
860
self ._check_is_current ()
841
861
self ._check_op_not_in_progress ()
842
862
843
- save_fn = fuse_cb .save if fuse_cb else None
863
+ save_fn = op_cb .save if op_cb else None
844
864
repo = self .gl_repo
845
865
mb = repo .merge_base (self , src )
846
866
@@ -872,16 +892,16 @@ def fuse(self, src, ip, only=None, exclude=None, fuse_cb=None):
872
892
fuse_commits = itertools .chain ([fuse_ci ], fuse_commits )
873
893
break
874
894
detach_point = ci .id
875
- if fuse_cb and fuse_cb .apply_ok :
876
- fuse_cb .apply_ok (ci )
895
+ if op_cb and op_cb .apply_ok :
896
+ op_cb .apply_ok (ci )
877
897
878
898
after_commits = self .history (reverse = True )
879
899
after_commits .hide (ip )
880
900
commits = itertools .chain (fuse_commits , after_commits )
881
901
commits , _commits = itertools .tee (commits , 2 )
882
902
if not any (_commits ): # it's a ff
883
903
self ._safe_reset (detach_point , _stash_msg_fuse , save_fn = save_fn )
884
- restore_fn = fuse_cb .restore_ok if fuse_cb else None
904
+ restore_fn = op_cb .restore_ok if op_cb else None
885
905
self ._safe_restore (_stash_msg_fuse , restore_fn = restore_fn )
886
906
return
887
907
@@ -897,29 +917,29 @@ def fuse(self, src, ip, only=None, exclude=None, fuse_cb=None):
897
917
repo .git_repo .set_head (repo .git_repo .head .peel ().id )
898
918
self ._safe_reset (detach_point , _stash_msg_fuse , save_fn = save_fn )
899
919
900
- self ._fuse (commits , fuse_cb = fuse_cb )
920
+ self ._fuse (commits , op_cb = op_cb )
901
921
902
- def fuse_continue (self , fuse_cb = None ):
922
+ def fuse_continue (self , op_cb = None ):
903
923
if not self .fuse_in_progress :
904
924
raise GlError ('No fuse in progress, nothing to continue' )
905
925
commits = self ._load_fuse_commits ()
906
- self ._fuse (commits , fuse_cb = fuse_cb )
926
+ self ._fuse (commits , op_cb = op_cb )
907
927
908
- def _fuse (self , commits , fuse_cb = None ):
928
+ def _fuse (self , commits , op_cb = None ):
909
929
git_repo = self .gl_repo .git_repo
910
930
committer = git_repo .default_signature
911
931
912
932
for ci in commits :
913
933
git_repo .cherrypick (ci .id )
914
934
index = self ._index
915
935
if index .conflicts :
916
- if fuse_cb and fuse_cb .apply_err :
917
- fuse_cb .apply_err (ci )
936
+ if op_cb and op_cb .apply_err :
937
+ op_cb .apply_err (ci )
918
938
self ._save_fuse_commits (commits )
919
939
raise GlError ('There are conflicts you need to resolve' )
920
940
921
- if fuse_cb and fuse_cb .apply_ok :
922
- fuse_cb .apply_ok (ci )
941
+ if op_cb and op_cb .apply_ok :
942
+ op_cb .apply_ok (ci )
923
943
tree_oid = index .write_tree (git_repo )
924
944
git_repo .create_commit (
925
945
'HEAD' , # the name of the reference to update
@@ -931,22 +951,22 @@ def _fuse(self, commits, fuse_cb=None):
931
951
orig_branch_ref .set_target (git_repo .head .target )
932
952
git_repo .set_head (orig_branch_ref .name )
933
953
self ._state_cleanup ()
934
- restore_fn = fuse_cb .restore_ok if fuse_cb else None
954
+ restore_fn = op_cb .restore_ok if op_cb else None
935
955
self ._safe_restore (_stash_msg_fuse , restore_fn = restore_fn )
936
956
937
957
@property
938
958
def fuse_in_progress (self ):
939
959
return self .gl_repo ._ref_exists ('GL_FUSE_ORIG_HEAD' )
940
960
941
- def abort_fuse (self , fuse_cb = None ):
961
+ def abort_fuse (self , op_cb = None ):
942
962
if not self .fuse_in_progress :
943
963
raise GlError ('No fuse in progress, nothing to abort' )
944
964
git_repo = self .gl_repo .git_repo
945
965
git_repo .set_head (git_repo .lookup_reference ('GL_FUSE_ORIG_HEAD' ).target )
946
966
git_repo .reset (git_repo .head .peel ().hex , pygit2 .GIT_RESET_HARD )
947
967
948
968
self ._state_cleanup ()
949
- restore_fn = fuse_cb .restore_ok if fuse_cb else None
969
+ restore_fn = op_cb .restore_ok if op_cb else None
950
970
self ._safe_restore (_stash_msg_fuse , restore_fn = restore_fn )
951
971
952
972
def _state_cleanup (self ):
@@ -1044,9 +1064,6 @@ def update():
1044
1064
msg , get_tree_and_update_index (), # the commit tree
1045
1065
parents )
1046
1066
1047
- if self .merge_in_progress :
1048
- self .gl_repo .git_repo .state_cleanup ()
1049
-
1050
1067
return self .gl_repo .git_repo [ci_oid ]
1051
1068
1052
1069
def publish (self , branch ):
@@ -1109,11 +1126,14 @@ def _stash_msg(name):
1109
1126
def _stash_msg_fuse (name ):
1110
1127
return _stash_msg ('fuse-{0}' .format (name ))
1111
1128
1129
+ def _stash_msg_merge (name ):
1130
+ return _stash_msg ('merge-{0}' .format (name ))
1131
+
1112
1132
1113
1133
# Misc
1114
1134
1115
- FuseCb = collections .namedtuple (
1116
- 'FuseCb ' , ['apply_ok' , 'apply_err' , 'save' , 'restore_ok' ])
1135
+ OpCb = collections .namedtuple (
1136
+ 'OpCb ' , ['apply_ok' , 'apply_err' , 'save' , 'restore_ok' ])
1117
1137
1118
1138
def stdout (p ):
1119
1139
return p .stdout .decode (ENCODING )
0 commit comments