diff --git a/scm-plugins/scm-hg-plugin/src/main/resources/sonia/scm/hg/ext/fileview.py b/scm-plugins/scm-hg-plugin/src/main/resources/sonia/scm/hg/ext/fileview.py index 51e33349cf..b303b2f3d4 100644 --- a/scm-plugins/scm-hg-plugin/src/main/resources/sonia/scm/hg/ext/fileview.py +++ b/scm-plugins/scm-hg-plugin/src/main/resources/sonia/scm/hg/ext/fileview.py @@ -196,10 +196,17 @@ def collect_sub_repositories(revCtx): return subrepos +class Writer: + def __init__(self, ui): + self.ui = ui + + def write(self, value): + self.ui.write(value) + class File_Printer: - def __init__(self, ui, repo, revCtx, disableLastCommit, transport, limit, offset): - self.ui = ui + def __init__(self, writer, repo, revCtx, disableLastCommit, transport, limit, offset): + self.writer = writer self.repo = repo self.revCtx = revCtx self.disableLastCommit = disableLastCommit @@ -213,7 +220,7 @@ class File_Printer: format = '%s/\n' if self.transport: format = 'd%s/\0' - self.ui.write( format % path) + self.writer.write( format % path) def print_file(self, path): if self.shouldPrintResult(): @@ -227,14 +234,14 @@ class File_Printer: format = '%s %i %s %s\n' if self.transport: format = 'f%s\n%i %s %s\0' - self.ui.write( format % (file.path(), file.size(), date, description) ) + self.writer.write( format % (file.path(), file.size(), date, description) ) def print_sub_repository(self, path, subrepo): if self.shouldPrintResult(): format = '%s/ %s %s\n' if self.transport: format = 's%s/\n%s %s\0' - self.ui.write( format % (path, subrepo.revision, subrepo.url)) + self.writer.write( format % (path, subrepo.revision, subrepo.url)) def visit(self, file): if file.sub_repository: @@ -256,9 +263,9 @@ class File_Printer: def finish(self): if self.isTruncated(): if self.transport: - self.ui.write( "t") + self.writer.write( "t") else: - self.ui.write("truncated") + self.writer.write("truncated") class File_Viewer: def __init__(self, revCtx, visitor): @@ -302,7 +309,8 @@ def fileview(ui, repo, **opts): subrepos = {} if not opts["disableSubRepositoryDetection"]: subrepos = collect_sub_repositories(revCtx) - printer = File_Printer(ui, repo, revCtx, opts["disableLastCommit"], opts["transport"], opts["limit"], opts["offset"]) + writer = Writer(ui) + printer = File_Printer(writer, repo, revCtx, opts["disableLastCommit"], opts["transport"], opts["limit"], opts["offset"]) viewer = File_Viewer(revCtx, printer) viewer.recursive = opts["recursive"] viewer.sub_repositories = subrepos diff --git a/scm-plugins/scm-hg-plugin/src/main/resources/sonia/scm/hg/ext/fileview_test.py b/scm-plugins/scm-hg-plugin/src/main/resources/sonia/scm/hg/ext/fileview_test.py index 4400f70de5..13be49c5a9 100644 --- a/scm-plugins/scm-hg-plugin/src/main/resources/sonia/scm/hg/ext/fileview_test.py +++ b/scm-plugins/scm-hg-plugin/src/main/resources/sonia/scm/hg/ext/fileview_test.py @@ -1,11 +1,24 @@ -from fileview import File_Viewer, SubRepository +from fileview import File_Viewer, File_Printer, SubRepository import unittest +class DummyManifestEntry: + def __init__(self, name): + self.name = name + + def path(self): + return self.name + + def size(self): + return len(self.name) + class DummyRevContext(): def __init__(self, mf): self.mf = mf + def __getitem__(self, path): + return DummyManifestEntry(path) + def manifest(self): return self.mf @@ -31,6 +44,18 @@ class File_Object_Collector(): self.stack.append(file) self.last = file +class CollectingWriter: + def __init__(self): + self.stack = [] + + def __len__(self): + return len(self.stack) + + def __getitem__(self, key): + return self.stack[key] + + def write(self, value): + self.stack.append(value) class Test_File_Viewer(unittest.TestCase): @@ -53,6 +78,45 @@ class Test_File_Viewer(unittest.TestCase): self.assertDirectory(g, "c/g") self.assertChildren(g, ["c/g/h.txt"]) + def test_printer(self): + paths = ["a", "b", "c/d.txt", "c/e.txt", "f.txt", "c/g/h.txt"] + writer = self.view_with_limit_and_offset(paths, 1000, 0) + self.assertPaths(writer, ["/", "c/", "c/g/", "c/g/h.txt", "c/d.txt", "c/e.txt", "a", "b", "f.txt"]) + + def test_printer_with_limit(self): + paths = ["a", "b", "c/d.txt", "c/e.txt", "f.txt", "c/g/h.txt"] + writer = self.view_with_limit_and_offset(paths, 3, 0) + self.assertPaths(writer, ["/", "c/", "c/g/", "c/g/h.txt"]) + + # TODO fix + def x_test_printer_with_offset(self): + paths = ["a", "b", "c/d.txt", "c/e.txt", "f.txt", "c/g/h.txt"] + writer = self.view_with_limit_and_offset(paths, 100, 3) + self.assertPaths(writer, ["/", "c", "c/d.txt", "c/e.txt", "a", "b", "f.txt"]) + + def view_with_limit_and_offset(self, paths, limit, offset): + revCtx = DummyRevContext(paths) + collector = File_Object_Collector() + + writer = CollectingWriter() + printer = File_Printer(writer, None, revCtx, True, False, limit, offset) + + viewer = File_Viewer(revCtx, printer) + viewer.recursive = True + viewer.view("") + return writer + + def assertPath(self, actual, expected): + path = actual[:len(expected)] + self.assertEqual(path, expected) + nextChar = actual[len(expected)] + self.assertTrue(nextChar == " " or nextChar == "\n", expected + " does not match " + actual) + + def assertPaths(self, actual, expected): + for idx,item in enumerate(actual): + self.assertPath(item, expected[idx]) + self.assertEqual(len(actual), len(expected)) + def test_recursive_with_path(self): root = self.collect(["a", "b", "c/d.txt", "c/e.txt", "f.txt", "c/g/h.txt"], "c", True) self.assertDirectory(root, "c")