Skip to content

Commit df532e0

Browse files
scheduler: resolve git references into revisions on submission
Signed-off-by: Charles Baynham <[email protected]>
1 parent 4926767 commit df532e0

File tree

4 files changed

+39
-12
lines changed

4 files changed

+39
-12
lines changed

RELEASE_NOTES.rst

+1
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ Highlights:
4545
* Full Python 3.10 support.
4646
* MSYS2 packaging for Windows, which replaces Conda. Conda packages are still available to
4747
support legacy installations, but may be removed in a future release.
48+
* Experiments can now be submitted with revisions set to a branch / tag name instead of only git hashes.
4849

4950
Breaking changes:
5051

artiq/dashboard/experiments.py

+10-4
Original file line numberDiff line numberDiff line change
@@ -333,9 +333,10 @@ def update_log_level(index):
333333
if "repo_rev" in options:
334334
repo_rev = QtWidgets.QLineEdit()
335335
repo_rev.setPlaceholderText("current")
336-
repo_rev_label = QtWidgets.QLabel("Revision:")
336+
repo_rev_label = QtWidgets.QLabel("Rev / ref:")
337337
repo_rev_label.setToolTip("Experiment repository revision "
338-
"(commit ID) to use")
338+
"(commit ID) or reference (branch "
339+
"or tag) to use")
339340
self.layout.addWidget(repo_rev_label, 3, 2)
340341
self.layout.addWidget(repo_rev, 3, 3)
341342

@@ -719,8 +720,13 @@ def on_dock_closed(self, expurl):
719720
del self.open_experiments[expurl]
720721

721722
async def _submit_task(self, expurl, *args):
722-
rid = await self.schedule_ctl.submit(*args)
723-
logger.info("Submitted '%s', RID is %d", expurl, rid)
723+
try:
724+
rid = await self.schedule_ctl.submit(*args)
725+
except KeyError:
726+
expid = args[1]
727+
logger.error("Submission failed - revision \"%s\" was not found", expid["repo_rev"])
728+
else:
729+
logger.info("Submitted '%s', RID is %d", expurl, rid)
724730

725731
def submit(self, expurl):
726732
file, class_name, _ = self.resolve_expurl(expurl)

artiq/master/experiments.py

+16-4
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ async def scan_repository(self, new_cur_rev=None):
111111
try:
112112
if new_cur_rev is None:
113113
new_cur_rev = self.repo_backend.get_head_rev()
114-
wd, _ = self.repo_backend.request_rev(new_cur_rev)
114+
wd, _, _ = self.repo_backend.request_rev(new_cur_rev)
115115
self.repo_backend.release_rev(self.cur_rev)
116116
self.cur_rev = new_cur_rev
117117
self.status["cur_rev"] = new_cur_rev
@@ -132,7 +132,7 @@ async def examine(self, filename, use_repository=True, revision=None):
132132
if use_repository:
133133
if revision is None:
134134
revision = self.cur_rev
135-
wd, _ = self.repo_backend.request_rev(revision)
135+
wd, _, revision = self.repo_backend.request_rev(revision)
136136
filename = os.path.join(wd, filename)
137137
worker = Worker(self.worker_handlers)
138138
try:
@@ -169,7 +169,7 @@ def get_head_rev(self):
169169
return "N/A"
170170

171171
def request_rev(self, rev):
172-
return self.root, None
172+
return self.root, None, "N/A"
173173

174174
def release_rev(self, rev):
175175
pass
@@ -200,14 +200,26 @@ def __init__(self, root):
200200
def get_head_rev(self):
201201
return str(self.git.head.target)
202202

203+
def _get_pinned_rev(self, rev):
204+
"""
205+
Resolve a git reference (e.g. "HEAD", "master", "abcdef123456...") into
206+
a git hash
207+
"""
208+
commit, _ = self.git.resolve_refish(rev)
209+
210+
logger.debug('Resolved git ref "%s" into "%s"', rev, commit.hex)
211+
212+
return commit.hex
213+
203214
def request_rev(self, rev):
215+
rev = self._get_pinned_rev(rev)
204216
if rev in self.checkouts:
205217
co = self.checkouts[rev]
206218
co.ref_count += 1
207219
else:
208220
co = _GitCheckout(self.git, rev)
209221
self.checkouts[rev] = co
210-
return co.path, co.message
222+
return co.path, co.message, rev
211223

212224
def release_rev(self, rev):
213225
co = self.checkouts[rev]

artiq/master/scheduler.py

+12-4
Original file line numberDiff line numberDiff line change
@@ -132,15 +132,23 @@ def log_submission(self, rid, expid):
132132
writer.writerow([rid, start_time, expid["file"]])
133133

134134
def submit(self, expid, priority, due_date, flush, pipeline_name):
135+
"""
136+
Submits an experiment to be run by this pool
137+
138+
If expid has the attribute `repo_rev`, treat it as a git revision or
139+
reference and resolve into a unique git hash before submission
140+
"""
135141
# mutates expid to insert head repository revision if None and
136142
# replaces relative path with the absolute one.
137143
# called through scheduler.
138144
rid = self.ridc.get()
139145
if "repo_rev" in expid:
140-
if expid["repo_rev"] is None:
141-
expid["repo_rev"] = self.experiment_db.cur_rev
142-
wd, repo_msg = self.experiment_db.repo_backend.request_rev(
143-
expid["repo_rev"])
146+
repo_rev_or_ref = expid["repo_rev"] or self.experiment_db.cur_rev
147+
wd, repo_msg, repo_rev = self.experiment_db.repo_backend.request_rev(repo_rev_or_ref)
148+
149+
# Mutate expid's repo_rev to that returned from request_rev, in case
150+
# a branch was passed instead of a hash
151+
expid["repo_rev"] = repo_rev
144152
else:
145153
if "file" in expid:
146154
expid["file"] = os.path.abspath(expid["file"])

0 commit comments

Comments
 (0)