This leaves the index and working tree in the state that merge-recursive
left it, with unmerged files in different stages, and the non-conflicting
changes in the index.
Signed-off-by: David Kågedal <davidk@lysator.liu.se>
Signed-off-by: Karl Hasselström <kha@treskal.com>
# error and we have to abort the merge
raise GitException, err_output
# error and we have to abort the merge
raise GitException, err_output
- # merge the unmerged files
- errors = False
- for path in files:
- # remove additional files that might be generated for some
- # newer versions of GIT
- for suffix in [base, head1, head2]:
- if not suffix:
- continue
- fname = path + '~' + suffix
- if os.path.exists(fname):
- os.remove(fname)
-
- stages = files[path]
- if gitmergeonefile.merge(stages['1'][1], stages['2'][1],
- stages['3'][1], path, stages['1'][0],
- stages['2'][0], stages['3'][0]) != 0:
- errors = True
-
- if errors:
raise GitException, 'GIT index merging failed (possible conflicts)'
def merge(base, head1, head2):
raise GitException, 'GIT index merging failed (possible conflicts)'
def merge(base, head1, head2):
config.remove_section('branch.%s.stgit' % self.get_name())
def refresh_patch(self, files = None, message = None, edit = False,
config.remove_section('branch.%s.stgit' % self.get_name())
def refresh_patch(self, files = None, message = None, edit = False,
show_patch = False,
cache_update = True,
author_name = None, author_email = None,
show_patch = False,
cache_update = True,
author_name = None, author_email = None,
if not bottom:
bottom = patch.get_bottom()
if not bottom:
bottom = patch.get_bottom()
+ if empty:
+ tree_id = git.get_commit(bottom).get_tree()
+ else:
+ tree_id = None
+
commit_id = git.commit(files = files,
message = descr, parents = [bottom],
cache_update = cache_update,
commit_id = git.commit(files = files,
message = descr, parents = [bottom],
cache_update = cache_update,
+ tree_id = tree_id,
+ set_head = True,
allowempty = True,
author_name = author_name,
author_email = author_email,
allowempty = True,
author_name = author_name,
author_email = author_email,
log = 'push'
self.refresh_patch(bottom = head, cache_update = False, log = log)
else:
log = 'push'
self.refresh_patch(bottom = head, cache_update = False, log = log)
else:
- # we store the correctly merged files only for
- # tracking the conflict history. Note that the
- # git.merge() operations should always leave the index
- # in a valid state (i.e. only stage 0 files)
+ # we make the patch empty, with the merged state in the
+ # working tree.
self.refresh_patch(bottom = head, cache_update = False,
self.refresh_patch(bottom = head, cache_update = False,
+ empty = True, log = 'push(c)')
raise StackException, str(ex)
return modified
raise StackException, str(ex)
return modified
'
cat > expected.txt <<EOF
'
cat > expected.txt <<EOF
-? foo/bar.ancestor
-? foo/bar.current
-? foo/bar.patched
-test_expect_success 'Status after conflicting push' '
+test_expect_failure 'Status after conflicting push' '
! stg push &&
stg status > output.txt &&
diff -u expected.txt output.txt
! stg push &&
stg status > output.txt &&
diff -u expected.txt output.txt
cat > expected.txt <<EOF
C foo/bar
EOF
cat > expected.txt <<EOF
C foo/bar
EOF
-test_expect_success 'Status of file' '
+test_expect_failure 'Status of file' '
stg status foo/bar > output.txt &&
diff -u expected.txt output.txt
'
stg status foo/bar > output.txt &&
diff -u expected.txt output.txt
'
cat > expected.txt <<EOF
C foo/bar
EOF
cat > expected.txt <<EOF
C foo/bar
EOF
-test_expect_success 'Status of dir' '
+test_expect_failure 'Status of dir' '
stg status foo > output.txt &&
diff -u expected.txt output.txt
'
cat > expected.txt <<EOF
stg status foo > output.txt &&
diff -u expected.txt output.txt
'
cat > expected.txt <<EOF
EOF
test_expect_success 'Status of other file' '
stg status fie > output.txt &&
EOF
test_expect_success 'Status of other file' '
stg status fie > output.txt &&
'
cat > expected.txt <<EOF
'
cat > expected.txt <<EOF
M foo/bar
EOF
test_expect_success 'Status after resolving the push' '
M foo/bar
EOF
test_expect_success 'Status after resolving the push' '
'
cat > expected.txt <<EOF
'
cat > expected.txt <<EOF
-test_expect_success 'Status after deleting a file' '
+test_expect_failure 'Status after deleting a file' '
rm foo/bar &&
stg status > output.txt &&
diff -u expected.txt output.txt
rm foo/bar &&
stg status > output.txt &&
diff -u expected.txt output.txt
cat > expected.txt <<EOF
D foo/bar
EOF
cat > expected.txt <<EOF
D foo/bar
EOF
-test_expect_success 'Status of disappeared newborn' '
+test_expect_failure 'Status of disappeared newborn' '
stg refresh &&
touch foo/bar &&
stg add foo/bar &&
stg refresh &&
touch foo/bar &&
stg add foo/bar &&
[ "$(echo $(cat foo/y.txt))" = "y0 y1 y2" ]
'
[ "$(echo $(cat foo/y.txt))" = "y0 y1 y2" ]
'
-test_expect_success 'Conflicting push from subdir' '
+test_expect_failure 'Conflicting push from subdir' '
stg pop p1 p2 &&
[ "$(echo $(cat x.txt))" = "x0" ] &&
[ "$(echo $(cat foo/y.txt))" = "y0" ] &&
stg pop p1 p2 &&
[ "$(echo $(cat x.txt))" = "x0" ] &&
[ "$(echo $(cat foo/y.txt))" = "y0" ] &&