mirror of
https://github.com/facebook/sapling.git
synced 2024-10-09 08:18:15 +03:00
98d9269874
Summary: Create a fork of the Mercurial code that we can use to build server rpms. The hg servers will continue to exist for a few more months while we move the darkstorm and ediscovery use cases off them. In the mean time, we want to start making breaking changes to the client, so let's create a stable copy of the hg code to produce rpms for the hg servers. The fork is based off c7770c78d, the latest hg release. This copies the files as is, then adds some minor tweaks to get it to build: - Disables some lint checks that appear to be bypassed by path - sed replace eden/scm with eden/hg-server - Removed a dependency on scm/telemetry from the edenfs-client tests since scm/telemetry pulls in the original eden/scm/lib/configparser which conflicts with the hg-server conflict parser. allow-large-files Reviewed By: quark-zju Differential Revision: D27632557 fbshipit-source-id: b2f442f4ec000ea08e4d62de068750832198e1f4
226 lines
7.2 KiB
Python
226 lines
7.2 KiB
Python
from __future__ import absolute_import
|
|
|
|
import unittest
|
|
|
|
from edenscm.mercurial import error, mdiff
|
|
from hghave import require
|
|
|
|
|
|
require(["py2"])
|
|
|
|
|
|
# for readability, line numbers are 0-origin
|
|
text1 = """
|
|
00 at OLD
|
|
01 at OLD
|
|
02 at OLD
|
|
02 at NEW, 03 at OLD
|
|
03 at NEW, 04 at OLD
|
|
04 at NEW, 05 at OLD
|
|
05 at NEW, 06 at OLD
|
|
07 at OLD
|
|
08 at OLD
|
|
09 at OLD
|
|
10 at OLD
|
|
11 at OLD
|
|
"""[
|
|
1:
|
|
] # strip initial LF
|
|
|
|
text2 = """
|
|
00 at NEW
|
|
01 at NEW
|
|
02 at NEW, 03 at OLD
|
|
03 at NEW, 04 at OLD
|
|
04 at NEW, 05 at OLD
|
|
05 at NEW, 06 at OLD
|
|
06 at NEW
|
|
07 at NEW
|
|
08 at NEW
|
|
09 at NEW
|
|
10 at NEW
|
|
11 at NEW
|
|
"""[
|
|
1:
|
|
] # strip initial LF
|
|
|
|
|
|
def filteredblocks(blocks, rangeb):
|
|
"""return `rangea` extracted from `blocks` coming from
|
|
`mdiff.blocksinrange` along with the mask of blocks within rangeb.
|
|
"""
|
|
filtered, rangea = mdiff.blocksinrange(blocks, rangeb)
|
|
skipped = [b not in filtered for b in blocks]
|
|
return rangea, skipped
|
|
|
|
|
|
class blocksinrangetests(unittest.TestCase):
|
|
def setUp(self):
|
|
self.blocks = list(mdiff.allblocks(text1, text2))
|
|
assert self.blocks == [
|
|
([0, 3, 0, 2], "!"),
|
|
((3, 7, 2, 6), "="),
|
|
([7, 12, 6, 12], "!"),
|
|
((12, 12, 12, 12), "="),
|
|
], self.blocks
|
|
|
|
def testWithinEqual(self):
|
|
"""linerange within an "=" block"""
|
|
# IDX 0 1
|
|
# 012345678901
|
|
# SRC NNOOOONNNNNN (New/Old)
|
|
# ^^
|
|
linerange2 = (3, 5)
|
|
linerange1, skipped = filteredblocks(self.blocks, linerange2)
|
|
self.assertEqual(linerange1, (4, 6))
|
|
self.assertEqual(skipped, [True, False, True, True])
|
|
|
|
def testWithinEqualStrictly(self):
|
|
"""linerange matching exactly an "=" block"""
|
|
# IDX 0 1
|
|
# 012345678901
|
|
# SRC NNOOOONNNNNN (New/Old)
|
|
# ^^^^
|
|
linerange2 = (2, 6)
|
|
linerange1, skipped = filteredblocks(self.blocks, linerange2)
|
|
self.assertEqual(linerange1, (3, 7))
|
|
self.assertEqual(skipped, [True, False, True, True])
|
|
|
|
def testWithinEqualLowerbound(self):
|
|
"""linerange at beginning of an "=" block"""
|
|
# IDX 0 1
|
|
# 012345678901
|
|
# SRC NNOOOONNNNNN (New/Old)
|
|
# ^^
|
|
linerange2 = (2, 4)
|
|
linerange1, skipped = filteredblocks(self.blocks, linerange2)
|
|
self.assertEqual(linerange1, (3, 5))
|
|
self.assertEqual(skipped, [True, False, True, True])
|
|
|
|
def testWithinEqualLowerboundOneline(self):
|
|
"""oneline-linerange at beginning of an "=" block"""
|
|
# IDX 0 1
|
|
# 012345678901
|
|
# SRC NNOOOONNNNNN (New/Old)
|
|
# ^
|
|
linerange2 = (2, 3)
|
|
linerange1, skipped = filteredblocks(self.blocks, linerange2)
|
|
self.assertEqual(linerange1, (3, 4))
|
|
self.assertEqual(skipped, [True, False, True, True])
|
|
|
|
def testWithinEqualUpperbound(self):
|
|
"""linerange at end of an "=" block"""
|
|
# IDX 0 1
|
|
# 012345678901
|
|
# SRC NNOOOONNNNNN (New/Old)
|
|
# ^^^
|
|
linerange2 = (3, 6)
|
|
linerange1, skipped = filteredblocks(self.blocks, linerange2)
|
|
self.assertEqual(linerange1, (4, 7))
|
|
self.assertEqual(skipped, [True, False, True, True])
|
|
|
|
def testWithinEqualUpperboundOneLine(self):
|
|
"""oneline-linerange at end of an "=" block"""
|
|
# IDX 0 1
|
|
# 012345678901
|
|
# SRC NNOOOONNNNNN (New/Old)
|
|
# ^
|
|
linerange2 = (5, 6)
|
|
linerange1, skipped = filteredblocks(self.blocks, linerange2)
|
|
self.assertEqual(linerange1, (6, 7))
|
|
self.assertEqual(skipped, [True, False, True, True])
|
|
|
|
def testWithinFirstBlockNeq(self):
|
|
"""linerange within the first "!" block"""
|
|
# IDX 0 1
|
|
# 012345678901
|
|
# SRC NNOOOONNNNNN (New/Old)
|
|
# ^
|
|
# | (empty)
|
|
# ^
|
|
# ^^
|
|
for linerange2 in [(0, 1), (1, 1), (1, 2), (0, 2)]:
|
|
linerange1, skipped = filteredblocks(self.blocks, linerange2)
|
|
self.assertEqual(linerange1, (0, 3))
|
|
self.assertEqual(skipped, [False, True, True, True])
|
|
|
|
def testWithinLastBlockNeq(self):
|
|
"""linerange within the last "!" block"""
|
|
# IDX 0 1
|
|
# 012345678901
|
|
# SRC NNOOOONNNNNN (New/Old)
|
|
# ^
|
|
# ^
|
|
# | (empty)
|
|
# ^^^^^^
|
|
# ^
|
|
for linerange2 in [(6, 7), (7, 8), (7, 7), (6, 12), (11, 12)]:
|
|
linerange1, skipped = filteredblocks(self.blocks, linerange2)
|
|
self.assertEqual(linerange1, (7, 12))
|
|
self.assertEqual(skipped, [True, True, False, True])
|
|
|
|
def testAccrossTwoBlocks(self):
|
|
"""linerange accross two blocks"""
|
|
# IDX 0 1
|
|
# 012345678901
|
|
# SRC NNOOOONNNNNN (New/Old)
|
|
# ^^^^
|
|
linerange2 = (1, 5)
|
|
linerange1, skipped = filteredblocks(self.blocks, linerange2)
|
|
self.assertEqual(linerange1, (0, 6))
|
|
self.assertEqual(skipped, [False, False, True, True])
|
|
|
|
def testCrossingSeveralBlocks(self):
|
|
"""linerange accross three blocks"""
|
|
# IDX 0 1
|
|
# 012345678901
|
|
# SRC NNOOOONNNNNN (New/Old)
|
|
# ^^^^^^^
|
|
linerange2 = (1, 8)
|
|
linerange1, skipped = filteredblocks(self.blocks, linerange2)
|
|
self.assertEqual(linerange1, (0, 12))
|
|
self.assertEqual(skipped, [False, False, False, True])
|
|
|
|
def testStartInEqBlock(self):
|
|
"""linerange starting in an "=" block"""
|
|
# IDX 0 1
|
|
# 012345678901
|
|
# SRC NNOOOONNNNNN (New/Old)
|
|
# ^^^^
|
|
# ^^^^^^^
|
|
for linerange2, expectedlinerange1 in [((5, 9), (6, 12)), ((4, 11), (5, 12))]:
|
|
linerange1, skipped = filteredblocks(self.blocks, linerange2)
|
|
self.assertEqual(linerange1, expectedlinerange1)
|
|
self.assertEqual(skipped, [True, False, False, True])
|
|
|
|
def testEndInEqBlock(self):
|
|
"""linerange ending in an "=" block"""
|
|
# IDX 0 1
|
|
# 012345678901
|
|
# SRC NNOOOONNNNNN (New/Old)
|
|
# ^^
|
|
# ^^^^^
|
|
for linerange2, expectedlinerange1 in [((1, 3), (0, 4)), ((0, 4), (0, 5))]:
|
|
linerange1, skipped = filteredblocks(self.blocks, linerange2)
|
|
self.assertEqual(linerange1, expectedlinerange1)
|
|
self.assertEqual(skipped, [False, False, True, True])
|
|
|
|
def testOutOfRange(self):
|
|
"""linerange exceeding file size"""
|
|
exctype = error.Abort
|
|
for linerange2 in [(0, 34), (15, 12)]:
|
|
# Could be `with self.assertRaises(error.Abort)` but python2.6
|
|
# does not have assertRaises context manager.
|
|
try:
|
|
mdiff.blocksinrange(self.blocks, linerange2)
|
|
except exctype as exc:
|
|
self.assertTrue("line range exceeds file size" in str(exc))
|
|
else:
|
|
self.fail("%s not raised" % exctype.__name__)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
import silenttestrunner
|
|
|
|
silenttestrunner.main(__name__)
|