[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Monotone-commits-diffs] net.venge.monotone: f3af61372df5894c827086e384
From: |
code |
Subject: |
[Monotone-commits-diffs] net.venge.monotone: f3af61372df5894c827086e384e9f835aa75e4d0 |
Date: |
Wed, 9 Mar 2011 17:50:11 +0100 (CET) |
revision: f3af61372df5894c827086e384e9f835aa75e4d0
date: 2011-03-09T16:49:56
author: Richard Levitte <address@hidden>
branch: net.venge.monotone
changelog:
* contrib/asciik.py: Removed, since it's implemented as a mtn command.
(just looking at that source, you see how similar it is to this file)
manifest:
format_version "1"
new_manifest [5fe6044762f4c257621d41a6fab44b9147baeec5]
old_revision [61e96ce2363fe7ee3e7e4b6adfe9fbde874e67bc]
delete "contrib/asciik.py"
============================================================
--- contrib/asciik.py cbd89a231305a1e00895e53403656c77c6337bfe
+++ /dev/null
@@ -1,267 +0,0 @@
-#!/usr/bin/python
-
-# BUGS:
-#
-# 1)
-#
-# | | | | | | |\ \ \ \
-# | | | | | | o | | | | 145c71fb56cff358dd711773586ae6b5219b0cfc
-# | | | | | | |\ \ \ \ \
-#
-# should be
-#
-# | | | | | | |\ \ \ \
-# | | | | | | o \ \ \ \ 145c71fb56cff358dd711773586ae6b5219b0cfc
-# | | | | | | |\ \ \ \ \
-#
-# need some sort "inertia", if we moved sideways before and are moving
-# sideways now...
-#
-# 2)
-#
-# It actually is possible to remove a ghost on the same line as a long
-# rightwards edge -- and it even looks better than not doing it, at least in
-# some cases. Consider:
-#
-# Current:
-#
-# | | | o | | | | | 0f07da5974be8bf91495a34093efc635dcf1f01c
-# | | | |\ \ \ \ \ \
-# | | | | .-o | | | | 20037e09def77cc217679bf2f72baf5fa0415649
-# | | | |/| | | | |
-# | | | o---. | | | | de74b6e2bd612ba40f1afc3eba3f9a3d8f419135
-# | | | | | \| | | |
-# | | | o | | | | | 3fd16665caab9d942e6c5254b477587ff7d3722d
-# | | | | | / / / /
-# | | | o | | | | | 38f3561cc4bf294b99436f98cd97fc707b422bfa
-# | | | | | | | | |
-# | | | | .-o | | | 59017bc836986a59fd1ac6fba4f78fe1045c67e9
-# | | | |/| | | | |
-# | | | o | | | | | 97e8f96bb34774003de428292edbdd562ca6d867
-# | | | | | | | | |
-#
-# Desired:
-#
-# | | | o | | | | | 0f07da5974be8bf91495a34093efc635dcf1f01c
-# | | | |\ \ \ \ \ \
-# | | | | .-o | | | | 20037e09def77cc217679bf2f72baf5fa0415649
-# | | | |/| | | | |
-# | | | o-. | | | | de74b6e2bd612ba40f1afc3eba3f9a3d8f419135
-# | | | | |\ / / / /
-# | | | o | | | | | 3fd16665caab9d942e6c5254b477587ff7d3722d
-# | | | | | | | | |
-# | | | o | | | | | 38f3561cc4bf294b99436f98cd97fc707b422bfa
-# | | | | | | | | |
-# | | | | .-o | | | 59017bc836986a59fd1ac6fba4f78fe1045c67e9
-# | | | |/| | | | |
-# | | | o | | | | | 97e8f96bb34774003de428292edbdd562ca6d867
-# | | | | | | | | |
-#
-# Possibly the no-shift-while-drawing-long-edges code could even be removed,
-# deferring to the no-edge-crossings code.
-
-
-
-
-# How this works:
-# This is completely iterative; we have no lookahead whatsoever. We output
-# each line before even looking at the next. (This means the layout is
-# much less clever than it could be, because there is no global
-# optimization; but it also means we can calculate these things in zero
-# time, incrementally while running log.)
-#
-# Output comes in two-line chunks -- a "line", which contains exactly one
-# node, and then an "interline", which contains edges that will link us to
-# the next line.
-#
-# A design goal of the system is that you can always trivially increase the
-# space between two "lines", by adding another "| | | |"-type interline
-# after the real interline. This allows us to put arbitrarily long
-# annotations in the space to the right of the graph, for each revision --
-# we can just stretch the graph portion to give us more space.
-#
-# Loop:
-# We start knowing, for each logical column, what thing has to go there
-# (because this was determined last time)
-# We use this to first determine what thing has to go in each column next
-# time (though we will not draw them yet).
-# This is somewhat tricky, because we do want to squish things towards the
-# left when possible. However, we have very limited drawing options -- we
-# can slide several things 1 space to the left or right and do no other long
-# sideways edges; or, we can draw 1 or 2 long sideways edges, but then
-# everything else must go straight. So, we try a few different layouts.
-# The options are, remove a "ghost" if one exists, don't remove a ghost, and
-# insert a ghost. (A "ghost" is a blank space left by a line that has
-# terminated or merged back into another line, but we haven't shifted things
-# over sideways yet to fill in the space.)
-#
-# Having found a layout that works, we draw lines connecting things! Yay.
-
-import sys
-from sets import Set as set
-
-# returns a dict {node: (parents,)}
-def parsegraph(f):
- g = {}
- for line in f:
- pieces = line.strip().split()
- g[pieces[0]] = tuple(pieces[1:])
- return g
-
-# returns a list from bottom to top
-def parseorder(f):
- order = []
- for line in f:
- order.append(line.strip())
- order.reverse()
- return order
-
-# takes two files:
-# one is output of 'automate graph'
-# other is output of 'automate select i: | automate toposort address@hidden'
-def main(name, args):
- assert len(args) == 2
- graph = parsegraph(open(args[0]))
- order = parseorder(open(args[1]))
-
- row = []
- for rev in order:
- row = print_row(row, rev, graph[rev])
-
-def print_row(curr_row, curr_rev, parents):
- if curr_rev not in curr_row:
- curr_row.append(curr_rev)
- curr_loc = curr_row.index(curr_rev)
-
- new_revs = []
- for p in parents:
- if p not in curr_row:
- new_revs.append(p)
- next_row = list(curr_row)
- next_row[curr_loc:curr_loc + 1] = new_revs
-
- # now next_row contains exactly the revisions it needs to, except that no
- # ghost handling has been done.
-
- no_ghost = without_a_ghost(next_row)
- if try_draw(curr_row, no_ghost, curr_loc, parents):
- return no_ghost
- if try_draw(curr_row, next_row, curr_loc, parents):
- return next_row
- if not new_revs: # this line has disappeared
- extra_ghost = with_a_ghost_added(next_row, curr_loc)
- if try_draw(curr_row, extra_ghost, curr_loc, parents):
- return extra_ghost
- assert False
-
-def without_a_ghost(next_row):
- wo = list(next_row)
- if None in next_row:
- wo.pop(next_row.index(None))
- return wo
-
-def with_a_ghost_added(next_row, loc):
- w = list(next_row)
- w.insert(loc, None)
- return w
-
-# coordinates of the columns where we draw sideways-moving links
-def links_cross(links):
- crosses = set()
- for i, j in links:
- if i != j:
- for coord in xrange(2 * min(i, j) + 1, 2 * max(i, j)):
- crosses.add(coord)
- return crosses
-
-def try_draw(curr_row, next_row, curr_loc, parents):
- curr_items = len(curr_row)
- next_items = len(next_row)
- curr_ghosts = []
- for i in xrange(curr_items):
- if curr_row[i] is None:
- curr_ghosts.append(i)
- preservation_links = []
- have_shift = False
- for rev in curr_row:
- if rev is not None and rev in next_row:
- i = curr_row.index(rev)
- j = next_row.index(rev)
- if i != j:
- have_shift = True
- if abs(i - j) > 1:
- return False
- preservation_links.append((i, j))
- parent_links = []
- for p in parents:
- i = curr_loc
- j = next_row.index(p)
- if abs(i - j) > 1 and have_shift:
- return False
- parent_links.append((i, j))
-
- preservation_crosses = links_cross(preservation_links)
- parent_crosses = links_cross(parent_links)
- if preservation_crosses.intersection(parent_crosses):
- return False
-
- links = preservation_links + parent_links
- draw(curr_items, next_items, curr_loc, links, curr_ghosts, curr_row[curr_loc])
- return True
-
-def draw(curr_items, next_items, curr_loc, links, curr_ghosts, annotation):
- line = [" "] * (curr_items * 2 - 1)
- interline = [" "] * (max(curr_items, next_items) * 2 - 1)
-
- # first draw the flow-through bars in the line
- for i in xrange(curr_items):
- line[i * 2] = "|"
- # but then erase it for ghosts
- for i in curr_ghosts:
- line[i * 2] = " "
- # then the links
- dots = set()
- for i, j in links:
- if i == j:
- interline[2 * i] = "|"
- else:
- if j < i:
- # | .---o
- # |/| | |
- # 0 1 2 3
- # j i
- # 0123456
- # s e
- start = 2*j + 3
- end = 2*i
- dot = start - 1
- interline[dot - 1] = "/"
- else: # i < j
- # o---.
- # | | |\|
- # 0 1 2 3
- # i j
- # 0123456
- # s e
- start = 2*i + 1
- end = 2*j - 2
- dot = end
- interline[dot + 1] = "\\"
- if end - start >= 1:
- dots.add(dot)
- line[start:end] = "-" * (end - start)
- # add any dots (must do this in a second pass, so that if there are
- # cases like:
- # | .-----.-o
- # |/| | |/|
- # where we want to make sure the second dot overwrites the first --.
- for dot in dots:
- line[dot] = "."
- # and add the main attraction (may overwrite a ".").
- line[curr_loc * 2] = "o"
-
- print "".join(line) + " " + annotation
- print "".join(interline)
-
-if __name__ == "__main__":
- main(sys.argv[0], sys.argv[1:])
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Monotone-commits-diffs] net.venge.monotone: f3af61372df5894c827086e384e9f835aa75e4d0,
code <=