Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: m-labs/artiq
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: be55487d2da3
Choose a base ref
...
head repository: m-labs/artiq
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: c80f0fa07a40
Choose a head ref
  • 4 commits
  • 6 files changed
  • 1 contributor

Commits on Aug 8, 2015

  1. Copy the full SHA
    54d85ef View commit details
  2. Copy the full SHA
    585bb23 View commit details
  3. Copy the full SHA
    42010fc View commit details
  4. Copy the full SHA
    c80f0fa View commit details
Showing with 90 additions and 43 deletions.
  1. +8 −2 artiq/frontend/artiq_master.py
  2. +30 −19 artiq/gui/explorer.py
  3. +7 −2 artiq/gui/schedule.py
  4. +27 −10 artiq/gui/tools.py
  5. +10 −4 artiq/master/repository.py
  6. +8 −6 artiq/master/scheduler.py
10 changes: 8 additions & 2 deletions artiq/frontend/artiq_master.py
Original file line number Diff line number Diff line change
@@ -26,6 +26,11 @@ def get_argparser():
group.add_argument(
"--port-control", default=3251, type=int,
help="TCP port to listen to for control (default: %(default)d)")
group = parser.add_argument_group("databases")
group.add_argument("-d", "--ddb", default="ddb.pyon",
help="device database file")
group.add_argument("-p", "--pdb", default="pdb.pyon",
help="parameter database file")
group = parser.add_argument_group("repository")
group.add_argument(
"-g", "--git", default=False, action="store_true",
@@ -59,8 +64,8 @@ def main():
loop = asyncio.get_event_loop()
atexit.register(lambda: loop.close())

ddb = FlatFileDB("ddb.pyon")
pdb = FlatFileDB("pdb.pyon")
ddb = FlatFileDB(args.ddb)
pdb = FlatFileDB(args.pdb)
rtr = Notifier(dict())
log = Log(1000)

@@ -69,6 +74,7 @@ def main():
else:
repo_backend = FilesystemBackend(args.repository)
repository = Repository(repo_backend, log.log)
atexit.register(repository.close)
repository.scan_async()

worker_handlers = {
49 changes: 30 additions & 19 deletions artiq/gui/explorer.py
Original file line number Diff line number Diff line change
@@ -12,7 +12,8 @@


class _ExplistModel(DictSyncModel):
def __init__(self, parent, init):
def __init__(self, explorer, parent, init):
self.explorer = explorer
DictSyncModel.__init__(self,
["Experiment"],
parent, init)
@@ -23,6 +24,11 @@ def sort_key(self, k, v):
def convert(self, k, v, column):
return k

def __setitem__(self, k, v):
DictSyncModel.__setitem__(self, k, v)
if k == self.explorer.selected_key:
self.explorer.update_selection(k, k)


class _FreeValueEntry(QtGui.QLineEdit):
def __init__(self, procdesc):
@@ -166,7 +172,8 @@ def __init__(self, dialog_parent, status_bar, schedule_ctl):
self.splitter.addWidget(grid)

self.el = QtGui.QListView()
self.el.selectionChanged = self.update_argsetter
self.el.selectionChanged = self._selection_changed
self.selected_key = None
grid.addWidget(self.el, 0, 0, colspan=4)

self.datetime = QtGui.QDateTimeEdit()
@@ -200,28 +207,35 @@ def __init__(self, dialog_parent, status_bar, schedule_ctl):
self.splitter.setSizes([grid.minimumSizeHint().width(), 1000])
self.state = dict()

def update_argsetter(self, selected, deselected):
deselected = deselected.indexes()
def update_selection(self, selected, deselected):
if deselected:
row = deselected[0].row()
key = self.explist_model.row_to_key[row]
self.state[key] = self.argsetter.get_argument_values(False)
self.state[deselected] = self.argsetter.get_argument_values(False)

selected = selected.indexes()
if selected:
row = selected[0].row()
key = self.explist_model.row_to_key[row]
expinfo = self.explist_model.backing_store[key]
expinfo = self.explist_model.backing_store[selected]
arguments = expinfo["arguments"]
sizes = self.splitter.sizes()
self.argsetter.deleteLater()
self.argsetter = _ArgumentSetter(self.dialog_parent, arguments)
if key in self.state:
arguments = self.state[key]
if selected in self.state:
arguments = self.state[selected]
if arguments is not None:
self.argsetter.set_argument_values(arguments, True)
self.splitter.insertWidget(1, self.argsetter)
self.splitter.setSizes(sizes)
self.selected_key = selected

def _sel_to_key(self, selection):
selection = selection.indexes()
if selection:
row = selection[0].row()
return self.explist_model.row_to_key[row]
else:
return None

def _selection_changed(self, selected, deselected):
self.update_selection(self._sel_to_key(selected),
self._sel_to_key(deselected))

def save_state(self):
idx = self.el.selectedIndexes()
@@ -248,7 +262,7 @@ def sub_close(self):
yield from self.explist_subscriber.close()

def init_explist_model(self, init):
self.explist_model = _ExplistModel(self.el, init)
self.explist_model = _ExplistModel(self, self.el, init)
self.el.setModel(self.explist_model)
return self.explist_model

@@ -266,11 +280,8 @@ def submit(self, pipeline_name, file, class_name, arguments,
self.status_bar.showMessage("Submitted RID {}".format(rid))

def submit_clicked(self):
idx = self.el.selectedIndexes()
if idx:
row = idx[0].row()
key = self.explist_model.row_to_key[row]
expinfo = self.explist_model.backing_store[key]
if self.selected_key is not None:
expinfo = self.explist_model.backing_store[self.selected_key]
if self.datetime_en.isChecked():
due_date = self.datetime.dateTime().toMSecsSinceEpoch()/1000
else:
9 changes: 7 additions & 2 deletions artiq/gui/schedule.py
Original file line number Diff line number Diff line change
@@ -5,7 +5,7 @@
from pyqtgraph import dockarea

from artiq.protocols.sync_struct import Subscriber
from artiq.gui.tools import DictSyncModel
from artiq.gui.tools import elide, DictSyncModel


class _ScheduleModel(DictSyncModel):
@@ -37,7 +37,10 @@ def convert(self, k, v, column):
elif column == 5:
expid = v["expid"]
if "repo_rev" in expid:
return expid["repo_rev"]
r = expid["repo_rev"]
if v["repo_msg"]:
r += "\n" + elide(v["repo_msg"], 40)
return r
else:
return "Outside repo."
elif column == 6:
@@ -63,6 +66,8 @@ def __init__(self, status_bar, schedule_ctl):
self.table.setSelectionMode(QtGui.QAbstractItemView.SingleSelection)
self.table.horizontalHeader().setResizeMode(
QtGui.QHeaderView.ResizeToContents)
self.table.verticalHeader().setResizeMode(
QtGui.QHeaderView.ResizeToContents)
self.addWidget(self.table)

self.table.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu)
37 changes: 27 additions & 10 deletions artiq/gui/tools.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,24 @@
from quamash import QtCore


def force_spinbox_value(spinbox, value):
if spinbox.minimum() > value:
spinbox.setMinimum(value)
if spinbox.maximum() < value:
spinbox.setMaximum(value)
spinbox.setValue(value)
def elide(s, maxlen):
elided = False
if len(s) > maxlen:
s = s[:maxlen]
elided = True
try:
idx = s.index("\n")
except ValueError:
pass
else:
s = s[:idx]
elided = True
if elided:
maxlen -= 3
if len(s) > maxlen:
s = s[:maxlen]
s += "..."
return s


def short_format(v):
@@ -16,17 +28,22 @@ def short_format(v):
if t is int or t is float:
return str(v)
elif t is str:
if len(v) < 15:
return "\"" + v + "\""
else:
return "\"" + v[:12] + "\"..."
return "\"" + elide(v, 15) + "\""
else:
r = t.__name__
if t is list or t is dict or t is set:
r += " ({})".format(len(v))
return r


def force_spinbox_value(spinbox, value):
if spinbox.minimum() > value:
spinbox.setMinimum(value)
if spinbox.maximum() < value:
spinbox.setMaximum(value)
spinbox.setValue(value)


class _SyncSubstruct:
def __init__(self, update_cb, ref):
self.update_cb = update_cb
14 changes: 10 additions & 4 deletions artiq/master/repository.py
Original file line number Diff line number Diff line change
@@ -63,14 +63,18 @@ def __init__(self, backend, log_fn):

self._scanning = False

def close(self):
# The object cannot be used anymore after calling this method.
self.backend.release_rev(self.head_rev)

@asyncio.coroutine
def scan(self):
if self._scanning:
return
self._scanning = True

new_head_rev = self.backend.get_head_rev()
wd = self.backend.request_rev(new_head_rev)
wd, _ = self.backend.request_rev(new_head_rev)
self.backend.release_rev(self.head_rev)
self.head_rev = new_head_rev
new_explist = yield from _scan_experiments(wd, self.log_fn)
@@ -90,7 +94,7 @@ def get_head_rev(self):
return "N/A"

def request_rev(self, rev):
return self.root
return self.root, None

def release_rev(self, rev):
pass
@@ -99,7 +103,9 @@ def release_rev(self, rev):
class _GitCheckout:
def __init__(self, git, rev):
self.path = tempfile.mkdtemp()
git.checkout_tree(git.get(rev), directory=self.path)
commit = git.get(rev)
git.checkout_tree(commit, directory=self.path)
self.message = commit.message.strip()
self.ref_count = 1
logger.info("checked out revision %s into %s", rev, self.path)

@@ -126,7 +132,7 @@ def request_rev(self, rev):
else:
co = _GitCheckout(self.git, rev)
self.checkouts[rev] = co
return co.path
return co.path, co.message

def release_rev(self, rev):
co = self.checkouts[rev]
14 changes: 8 additions & 6 deletions artiq/master/scheduler.py
Original file line number Diff line number Diff line change
@@ -48,7 +48,7 @@ def worker_method(self, *args, **kwargs):
class Run:
def __init__(self, rid, pipeline_name,
wd, expid, priority, due_date, flush,
worker_handlers, notifier):
worker_handlers, notifier, **kwargs):
# called through pool
self.rid = rid
self.pipeline_name = pipeline_name
@@ -62,15 +62,17 @@ def __init__(self, rid, pipeline_name,

self._status = RunStatus.pending

self._notifier = notifier
self._notifier[self.rid] = {
notification = {
"pipeline": self.pipeline_name,
"expid": self.expid,
"priority": self.priority,
"due_date": self.due_date,
"flush": self.flush,
"status": self._status.name
}
notification.update(kwargs)
self._notifier = notifier
self._notifier[self.rid] = notification

@property
def status(self):
@@ -142,11 +144,11 @@ def submit(self, expid, priority, due_date, flush, pipeline_name):
if "repo_rev" in expid:
if expid["repo_rev"] is None:
expid["repo_rev"] = self._repo_backend.get_head_rev()
wd = self._repo_backend.request_rev(expid["repo_rev"])
wd, repo_msg = self._repo_backend.request_rev(expid["repo_rev"])
else:
wd = None
wd, repo_msg = None, None
run = Run(rid, pipeline_name, wd, expid, priority, due_date, flush,
self._worker_handlers, self._notifier)
self._worker_handlers, self._notifier, repo_msg=repo_msg)
self.runs[rid] = run
if self.submitted_cb is not None:
self.submitted_cb()