Monday, January 5, 2015¶
Updated tutorial¶
It took me some time, but I finally understood that it is not contra-productive to explicitly define many-to-many relationships using ManyToManyField. Updated https://www.lino-framework.org/tutorials/lets/index.html accordingly.
Trying git rebase
¶
I am still fiddling on my first pull request to Sphinx. It is theoretically done, the test suites pass on Travis for all environments, but on 04/01/15 20:58, Georg Brandl wrote:
BTW, now with git it’s easier to remove unwanted changesets. Just to a git rebase -i, remove the offending commits, and then push with -f. Github will automatically update the pull request.
Thanks for your hint, Georg. I am still rather new to git and have never used rebase before, but want to learn. So I read the tutorial section about rebase I didn’t understand every detail, but the grand picture seems easy. So I tried:
$ git rebase -i
$ git rebase -i master
This opened my editor on a file named git-rebase-todo
with the
following content:
noop
# Rebase 59422e5..59422e5 onto 59422e5
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
The process did not wait until I finish editing that file (my EDITOR
and VISUAL are 'emacsclient -n'
). The command line said:
Successfully rebased and updated refs/heads/master.
And AFAICS nothing has changed:
$ git push
Everything up-to-date
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
$
Hmm… okay, without help from outside it would be suboptimal to continue. If you followed until here and see a possible explanation, then don’t hesitate to drop me a mail.
Graphically represent a database structure¶
Reading http://www.graphviz.org/pdf/dotguide.pdf
The next step assigns nodes to discrete ranks or levels. In a top-to-bottom drawing, ranks determine Y coordinates.
During rank assignment, the head node of an edge is constrained to be on a higher rank than the tail node. If the edge has constraint=false, however, this requirement is not enforced.
![digraph foo {
# graph [renderer="neato"]
# this is a comment
node [shape=box]
node [style=filled]
node [fontname="times bold", fillcolor=red]
Product;
node [fontname="times" fillcolor=gold]
Offer Demand
node [fontname="times bold", fillcolor=red]
Member
node [fontname="times italic" fillcolor=lightblue]
Place
# edge [constraint=false]
# Product -> Offer[arrowhead="inv"]
Product -> Offer[arrowhead=none, arrowtail="inv"]
# Offer -> Product [constraint=false]
Product -> Member[label="providers", arrowhead=none, style=dotted];
Product -> Member[label="customers", arrowhead=none, style=dotted];
# Product -> Demand[arrowhead="inv"]
Product -> Demand[arrowhead=none, arrowtail="inv"]
# Demand -> Product [constraint=false]
Offer -> Member[taillabel="provider", labelangle="-90", labeldistance="2"];
Demand -> Member[taillabel="customer", labelangle="90", labeldistance="2"];
Member -> Place;
}](../../_images/graphviz-2ae80fe33ba936f89b5999164090373dc6f7601c.png)
![digraph foo {
graph [renderer="neato", rankdir=LR]
node [shape=box]
node [style=filled]
node [fontname="times bold", fillcolor=red]
Product Member
node [fontname="times" fillcolor=gold] Offer Demand
node [fontname="times italic" fillcolor=lightblue] Place
Product -> Offer[arrowhead="inv"]
Product -> Demand[arrowhead="inv"]
Offer -> Member[taillabel="provider"];
Demand -> Member[taillabel="customer"];
Member -> Place;
}](../../_images/graphviz-1319b45d976cef33ee7f38f55ea181e06bf659b5.png)