def test_conflicts_switch(self): gl.switch('other') utils.write_file(self.OTHER_FILE, contents='uncommitted') gl.switch('master') try: gl.fuse(self.OTHER, e=self.commits[self.OTHER][0]) self.fail() except ErrorReturnCode: pass # Switch gl.switch('other') self.__assert_history(self.__build('other')) st_out = utils.stdout(gl.status()) self.assertTrue('fuse' not in st_out) self.assertTrue('conflict' not in st_out) gl.switch('master') st_out = utils.stdout(gl.status()) self.assertTrue('fuse' in st_out) self.assertTrue('conflict' in st_out) # Check that we are able to complete the fuse after switch gl.resolve(self.OTHER_FILE) gl.commit(m='ci 1 in other') self.__assert_history( self.__build(self.OTHER, range(1, self.COMMITS_NUMBER)) + self.__build('master')) gl.switch('other') self.assertEqual('uncommitted', utils.read_file(self.OTHER_FILE))
def __assert_history(self, expected): out = utils.stdout(gl.history()) cids = list(reversed(re.findall(r'ci (.*) in (\S*)', out, re.UNICODE))) self.assertItemsEqual( cids, expected, 'cids is ' + text(cids) + ' exp ' + text(expected)) st_out = utils.stdout(gl.status()) self.assertFalse('fuse' in st_out)
def __assert_history(self, expected): out = utils.stdout(gl.history(_tty_out=False)) cids = list(reversed(re.findall(r'ci (.*) in (.*)', out, re.UNICODE))) self.assertEqual( cids, expected, 'cids is ' + text(cids) + ' exp ' + text(expected)) st_out = utils.stdout(gl.status()) self.assertFalse('fuse' in st_out)
def test_basic_diff(self): utils.write_file(self.TRACKED_FP, contents='contents') out1 = utils.stdout(gl.diff()) if '+contents' not in out1: self.fail() out2 = utils.stdout(gl.diff(self.TRACKED_FP)) if '+contents' not in out2: self.fail() self.assertEqual(out1, out2)
def test_basic_diff(self): utils.write_file(self.TRACKED_FP, contents='contents') out1 = utils.stdout(gl.diff(_tty_out=False)) if '+contents' not in out1: self.fail() out2 = utils.stdout(gl.diff(o=self.TRACKED_FP, _tty_out=False)) if '+contents' not in out2: self.fail() self.assertEqual(out1, out2)
def test_diff_non_ascii(self): contents = '’◕‿◕’©Ä☺’ಠ_ಠ’' utils.write_file(self.TRACKED_FP, contents=contents) out1 = utils.stdout(gl.diff(_tty_out=False)) if '+' + contents not in out1: self.fail('out is ' + out1) out2 = utils.stdout(gl.diff(o=self.TRACKED_FP, _tty_out=False)) if '+' + contents not in out2: self.fail('out is ' + out2) self.assertEqual(out1, out2)
def create_commits(branch_name, fp): self.commits[branch_name] = [] utils.append_to_file(fp, contents='contents {0}\n'.format(0)) out = utils.stdout(gl.commit(m='ci 0 in {0}'.format(branch_name), inc=fp)) self.commits[branch_name].append( re.search(r'Commit Id: (.*)', out, re.UNICODE).group(1)) for i in range(1, self.COMMITS_NUMBER): utils.append_to_file(fp, contents='contents {0}\n'.format(i)) out = utils.stdout(gl.commit(m='ci {0} in {1}'.format(i, branch_name))) self.commits[branch_name].append( re.search(r'Commit Id: (.*)', out, re.UNICODE).group(1))
def test_diff_non_ascii(self): if sys.platform == 'win32': # Skip this test on Windows until we fix Unicode support return contents = '’◕‿◕’©Ä☺’ಠ_ಠ’' utils.write_file(self.TRACKED_FP, contents=contents) out1 = utils.stdout(gl.diff()) if '+' + contents not in out1: self.fail('out is ' + out1) out2 = utils.stdout(gl.diff(self.TRACKED_FP)) if '+' + contents not in out2: self.fail('out is ' + out2) self.assertEqual(out1, out2)
def test_basic_diff_relative(self): utils.write_file(self.TRACKED_FP, contents='contents_tracked') utils.write_file(self.DIR_TRACKED_FP, contents='contents_dir_tracked') os.chdir(self.DIR) out1 = utils.stdout(gl.diff(_tty_out=False)) if '+contents_tracked' not in out1: self.fail() if '+contents_dir_tracked' not in out1: self.fail() rel_dir_tracked_fp = os.path.relpath(self.DIR_TRACKED_FP, self.DIR) out2 = utils.stdout(gl.diff(o=rel_dir_tracked_fp, _tty_out=False)) if '+contents_dir_tracked' not in out2: self.fail()
def test_basic_diff_relative(self): utils.write_file(self.TRACKED_FP, contents='contents_tracked') utils.write_file(self.DIR_TRACKED_FP, contents='contents_dir_tracked') os.chdir(self.DIR) out1 = utils.stdout(gl.diff()) if '+contents_tracked' not in out1: self.fail() if '+contents_dir_tracked' not in out1: self.fail() rel_dir_tracked_fp = os.path.relpath(self.DIR_TRACKED_FP, self.DIR) out2 = utils.stdout(gl.diff(rel_dir_tracked_fp)) if '+contents_dir_tracked' not in out2: self.fail()
def test_status_relative(self): utils.write_file(self.TRACKED_DIR_FP, contents='some modifications') st = utils.stdout(gl.status(_tty_out=False)) if self.TRACKED_DIR_FP not in st: self.fail() if self.UNTRACKED_DIR_FP not in st: self.fail() os.chdir(self.DIR) st = utils.stdout(gl.status(_tty_out=False)) rel_tracked = os.path.relpath(self.TRACKED_DIR_FP, self.DIR) rel_untracked = os.path.relpath(self.UNTRACKED_DIR_FP, self.DIR) if (self.TRACKED_DIR_FP in st) or (rel_tracked not in st): self.fail() if (self.UNTRACKED_DIR_FP in st) or (rel_untracked not in st): self.fail()
def test_status_relative(self): utils.write_file(self.TRACKED_DIR_FP, contents='some modifications') st = utils.stdout(gl.status()) if self.TRACKED_DIR_FP not in st: self.fail() if self.UNTRACKED_DIR_FP not in st: self.fail() os.chdir(self.DIR) st = utils.stdout(gl.status()) rel_tracked = os.path.relpath(self.TRACKED_DIR_FP, self.DIR) rel_untracked = os.path.relpath(self.UNTRACKED_DIR_FP, self.DIR) if (self.TRACKED_DIR_FP in st) or (rel_tracked not in st): self.fail() if (self.UNTRACKED_DIR_FP in st) or (rel_untracked not in st): self.fail()
def test_remove(self): gl.branch(c=self.BRANCH_1) gl.switch(self.BRANCH_1) self.assertRaises(ErrorReturnCode, gl.branch, d=self.BRANCH_1, _in='y') gl.branch(c=self.BRANCH_2) gl.switch(self.BRANCH_2) gl.branch(d=self.BRANCH_1, _in='n') gl.branch(d=self.BRANCH_1, _in='y') if self.BRANCH_1 in utils.stdout(gl.branch(_tty_out=False)): self.fail()
def __assert_commit(self, *expected_committed): h = utils.stdout(gl.history(v=True, _tty_out=False)) for fp in expected_committed: if fp not in h: self.fail('{0} was apparently not committed!'.format(fp)) expected_not_committed = [ fp for fp in self.FPS if fp not in expected_committed] for fp in expected_not_committed: if fp in h: self.fail('{0} was apparently committed!'.format(fp))
def test_remove(self): gl.branch(c=self.BRANCH_1) gl.switch(self.BRANCH_1) self.assertRaises(ErrorReturnCode, gl.branch, d=self.BRANCH_1, _in='y') gl.branch(c=self.BRANCH_2) gl.switch(self.BRANCH_2) gl.branch(d=self.BRANCH_1, _in='n') gl.branch(d=self.BRANCH_1, _in='y') if self.BRANCH_1 in utils.stdout(gl.branch()): self.fail()
def test_diff_dir(self): fp = 'dir/dir/f' utils.write_file(fp, contents='contents') out = utils.stdout(gl.diff(fp)) if '+contents' not in out: self.fail()
def test_create(self): gl.branch(c=self.BRANCH_1) self.assertRaises(ErrorReturnCode, gl.branch, c=self.BRANCH_1) self.assertRaises(ErrorReturnCode, gl.branch, c='evil*named*branch') if self.BRANCH_1 not in utils.stdout(gl.branch(_tty_out=False)): self.fail()
def test_empty_diff(self): if 'No files to diff' not in utils.stdout(gl.diff()): self.fail()
def test_list(self): gl.tag(c=self.TAG_1) gl.tag(c=self.TAG_2) tag_out = utils.stdout(gl.tag()) self.assertTrue(tag_out.find(self.TAG_1) < tag_out.find(self.TAG_2))
def test_remove(self): gl.tag(c=self.TAG_1) gl.tag(d=self.TAG_1, _in='n') gl.tag(d=self.TAG_1, _in='y') if self.TAG_1 in utils.stdout(gl.tag()): self.fail()
def test_create(self): gl.tag(c=self.TAG_1) self.assertRaises(ErrorReturnCode, gl.tag, c=self.TAG_1) self.assertRaises(ErrorReturnCode, gl.tag, c='evil*named*tag') if self.TAG_1 not in utils.stdout(gl.tag()): self.fail()
def test_list(self): gl.branch(c=self.BRANCH_1) gl.branch(c=self.BRANCH_2) branch_out = utils.stdout(gl.branch()) self.assertTrue( branch_out.find(self.BRANCH_1) < branch_out.find(self.BRANCH_2))
def test_empty_diff(self): if 'No files to diff' not in utils.stdout(gl.diff(_tty_out=False)): self.fail()
def test_diff_dir(self): fp = 'dir/dir/f' utils.write_file(fp, contents='contents') out = utils.stdout(gl.diff(o=fp, _tty_out=False)) if '+contents' not in out: self.fail()
def test_basic_functionality(self): utils.write_file('file1', 'Contents of file1') # Track gl.track('file1') self.assertRaises(ErrorReturnCode, gl.track, 'file1') self.assertRaises(ErrorReturnCode, gl.track, 'non-existent') # Untrack gl.untrack('file1') self.assertRaises(ErrorReturnCode, gl.untrack, 'file1') self.assertRaises(ErrorReturnCode, gl.untrack, 'non-existent') # Commit gl.track('file1') gl.commit(m='file1 commit') self.assertRaises(ErrorReturnCode, gl.commit, m='nothing to commit') # History if 'file1 commit' not in utils.stdout(gl.history(_tty_out=False)): self.fail('Commit didn\'t appear in history') # Branch # Make some changes to file1 and branch out utils.write_file('file1', 'New contents of file1') gl.branch(c='branch1') gl.switch('branch1') if 'New' in utils.read_file('file1'): self.fail('Branch not independent!') # Switch back to master branch, check that contents are the same as before. gl.switch('master') if 'New' not in utils.read_file('file1'): self.fail('Branch not independent!') out = utils.stdout(gl.branch(_tty_out=False)) if '* master' not in out: self.fail('Branch status output wrong: {0}'.format(out)) if 'branch1' not in out: self.fail('Branch status output wrong: {0}'.format(out)) gl.branch(c='branch2') gl.branch(c='branch-conflict1') gl.branch(c='branch-conflict2') gl.commit(m='New contents commit') # Fuse gl.switch('branch1') self.assertRaises(ErrorReturnCode, gl.fuse) # no upstream set try: gl.fuse('master') except ErrorReturnCode as e: self.fail(utils.stderr(e)) out = utils.stdout(gl.history(_tty_out=False)) if 'file1 commit' not in out: self.fail(out) # Merge gl.switch('branch2') self.assertRaises(ErrorReturnCode, gl.merge) # no upstream set gl.merge('master') out = utils.stdout(gl.history(_tty_out=False)) if 'file1 commit' not in out: self.fail(out) # Conflicting fuse gl.switch('branch-conflict1') utils.write_file('file1', 'Conflicting changes to file1') gl.commit(m='changes in branch-conflict1') err = utils.stderr(gl.fuse('master', _tty_out=False, _ok_code=[1])) if 'conflict' not in err: self.fail(err) out = utils.stdout(gl.status(_tty_out=False)) if 'file1 (with conflicts)' not in out: self.fail(out) # Try aborting gl.fuse('--abort') out = utils.stdout(gl.status(_tty_out=False)) if 'file1' in out: self.fail(out) # Ok, now let's fix the conflicts err = utils.stderr(gl.fuse('master', _tty_out=False, _ok_code=[1])) if 'conflict' not in err: self.fail(err) out = utils.stdout(gl.status(_tty_out=False)) if 'file1 (with conflicts)' not in out: self.fail(out) utils.write_file('file1', 'Fixed conflicts!') self.assertRaises(ErrorReturnCode, gl.commit, m='resolve not called') self.assertRaises(ErrorReturnCode, gl.resolve, 'non-existent') gl.resolve('file1') gl.commit(m='fixed conflicts')
def test_list(self): gl.tag(c=self.TAG_1) gl.tag(c=self.TAG_2) tag_out = utils.stdout(gl.tag()) self.assertTrue( tag_out.find(self.TAG_1) < tag_out.find(self.TAG_2))
def test_create(self): gl.branch(c=self.BRANCH_1) self.assertRaises(ErrorReturnCode, gl.branch, c=self.BRANCH_1) self.assertRaises(ErrorReturnCode, gl.branch, c='evil*named*branch') if self.BRANCH_1 not in utils.stdout(gl.branch()): self.fail()
def test_basic_functionality(self): utils.write_file('file1', 'Contents of file1') # Track gl.track('file1') self.assertRaises(ErrorReturnCode, gl.track, 'file1') self.assertRaises(ErrorReturnCode, gl.track, 'non-existent') # Untrack gl.untrack('file1') self.assertRaises(ErrorReturnCode, gl.untrack, 'file1') self.assertRaises(ErrorReturnCode, gl.untrack, 'non-existent') # Commit gl.track('file1') gl.commit(m='file1 commit') self.assertRaises(ErrorReturnCode, gl.commit, m='nothing to commit') # History if 'file1 commit' not in utils.stdout(gl.history()): self.fail('Commit didn\'t appear in history') # Branch # Make some changes to file1 and branch out utils.write_file('file1', 'New contents of file1') gl.branch(c='branch1') gl.switch('branch1') if 'New' in utils.read_file('file1'): self.fail('Branch not independent!') # Switch back to master branch, check that contents are the same as before. gl.switch('master') if 'New' not in utils.read_file('file1'): self.fail('Branch not independent!') out = utils.stdout(gl.branch()) if '* master' not in out: self.fail('Branch status output wrong: {0}'.format(out)) if 'branch1' not in out: self.fail('Branch status output wrong: {0}'.format(out)) gl.branch(c='branch2') gl.branch(c='branch-conflict1') gl.branch(c='branch-conflict2') gl.commit(m='New contents commit') # Fuse gl.switch('branch1') self.assertRaises(ErrorReturnCode, gl.fuse) # no upstream set try: gl.fuse('master') except ErrorReturnCode as e: self.fail(utils.stderr(e)) out = utils.stdout(gl.history()) if 'file1 commit' not in out: self.fail(out) # Merge gl.switch('branch2') self.assertRaises(ErrorReturnCode, gl.merge) # no upstream set gl.merge('master') out = utils.stdout(gl.history()) if 'file1 commit' not in out: self.fail(out) # Conflicting fuse gl.switch('branch-conflict1') utils.write_file('file1', 'Conflicting changes to file1') gl.commit(m='changes in branch-conflict1') err = utils.stderr(gl.fuse('master', _ok_code=[1])) if 'conflict' not in err: self.fail(err) out = utils.stdout(gl.status()) if 'file1 (with conflicts)' not in out: self.fail(out) # Try aborting gl.fuse('--abort') out = utils.stdout(gl.status()) if 'file1' in out: self.fail(out) # Ok, now let's fix the conflicts err = utils.stderr(gl.fuse('master', _ok_code=[1])) if 'conflict' not in err: self.fail(err) out = utils.stdout(gl.status()) if 'file1 (with conflicts)' not in out: self.fail(out) utils.write_file('file1', 'Fixed conflicts!') self.assertRaises(ErrorReturnCode, gl.commit, m='resolve not called') self.assertRaises(ErrorReturnCode, gl.resolve, 'non-existent') gl.resolve('file1') gl.commit(m='fixed conflicts')