From 1fc6be28f46b3237635441c2ab3e2fbc616485ff Mon Sep 17 00:00:00 2001
From: Zooko O'Whielacronx <zooko@zooko.com>
Date: Sun, 6 Jun 2010 22:16:18 -0700
Subject: [PATCH] setup: organize misc/ scripts and tools and remove obsolete
 ones This is for ticket #1068.

---
 Makefile                                      |  30 ++-
 docs/logging.txt                              |   2 +-
 docs/stats.txt                                |   2 +-
 mac/Makefile                                  |   1 +
 misc/{ => awesome_weird_stuff}/boodlegrid.tac |   0
 misc/{ => build_helpers}/build-deb.py         |   0
 misc/{ => build_helpers}/check-build.py       |   0
 misc/{ => build_helpers}/get-version.py       |   0
 misc/{ => build_helpers}/pyver.py             |   0
 .../run-with-pythonpath.py                    |   0
 misc/{ => build_helpers}/run_trial.py         |   0
 .../{ => build_helpers}/show-tool-versions.py |   1 +
 misc/{ => build_helpers}/sub-ver.py           |   0
 .../test-darcs-boringfile.py                  |   0
 .../{ => build_helpers}/test_mac_diskimage.py |   0
 misc/{ => coding_tools}/coverage.el           |   0
 misc/{ => coding_tools}/coverage2el.py        |   0
 .../find-trailing-spaces.py                   |   0
 misc/{ => coding_tools}/fixshebangs.py        |   0
 misc/{ => coding_tools}/make-canary-files.py  |   0
 misc/{ => coding_tools}/make_umid             |   0
 misc/coverage2text.py                         | 116 ----------
 misc/debian/rules.sid                         |   2 +-
 .../etch/debian/changelog                     |   0
 misc/{ => debian_helpers}/etch/debian/compat  |   0
 misc/{ => debian_helpers}/etch/debian/control |   0
 .../etch/debian/copyright                     |   0
 .../{ => debian_helpers}/etch/debian/pycompat |   0
 .../{sid => debian_helpers/etch}/debian/rules |   4 +-
 .../lenny/debian/changelog                    |   0
 misc/{ => debian_helpers}/lenny/debian/compat |   0
 .../{ => debian_helpers}/lenny/debian/control |   0
 .../lenny/debian/copyright                    |   0
 .../lenny/debian/pycompat                     |   0
 .../lenny}/debian/rules                       |   4 +-
 .../{ => debian_helpers}/sid/debian/changelog |   0
 misc/{ => debian_helpers}/sid/debian/compat   |   0
 misc/{ => debian_helpers}/sid/debian/control  |   0
 .../{ => debian_helpers}/sid/debian/copyright |   0
 misc/{ => debian_helpers}/sid/debian/pycompat |   0
 .../sid}/debian/rules                         |   4 +-
 misc/delete-old-helper.sh                     |   4 -
 misc/figleaf.excludes                         |   5 -
 misc/figleaf2el.py                            |  87 --------
 misc/find_trial.py                            |  37 ----
 misc/logtool.py                               | 201 ------------------
 .../cpu-watcher-poll.py                       |   0
 .../cpu-watcher-subscribe.py                  |   0
 misc/{ => operations_helpers}/cpu-watcher.tac |   0
 .../find-share-anomalies.py                   |   0
 misc/{ => operations_helpers}/getmem.py       |   0
 .../{ => operations_helpers}/munin/tahoe-conf |   0
 .../munin/tahoe-stats.plugin-conf             |   0
 .../munin/tahoe_cpu_watcher                   |   0
 .../munin/tahoe_diskleft                      |   2 +-
 .../munin/tahoe_disktotal                     |   2 +-
 .../munin/tahoe_diskusage                     |   2 +-
 .../munin/tahoe_diskused                      |   2 +-
 .../munin/tahoe_doomsday                      |   2 +-
 .../munin/tahoe_estimate_files                |   0
 .../munin/tahoe_files                         |   0
 .../munin/tahoe_helperstats_active            |   0
 .../munin/tahoe_helperstats_fetched           |   0
 .../munin/tahoe_introstats                    |   0
 .../munin/tahoe_nodememory                    |   0
 .../munin/tahoe_overhead                      |   2 +-
 .../munin/tahoe_rootdir_space                 |   0
 .../munin/tahoe_server_latency_               |   0
 .../munin/tahoe_server_operations_            |   0
 .../munin/tahoe_spacetime                     |   0
 .../munin/tahoe_stats                         |   0
 .../munin/tahoe_storagespace                  |   0
 .../spacetime/diskwatcher.py                  |   0
 .../spacetime/diskwatcher.tac                 |   0
 misc/{ => simulators}/count_dirs.py           |   0
 misc/{ => simulators}/ringsim.py              |   0
 misc/{ => simulators}/simulate_load.py        |   0
 misc/{ => simulators}/simulator.py            |   0
 misc/{ => simulators}/sizes.py                |   0
 misc/{ => simulators}/storage-overhead.py     |   0
 misc/xfer-client.py                           |  66 ------
 setup.py                                      |   2 +-
 82 files changed, 30 insertions(+), 550 deletions(-)
 rename misc/{ => awesome_weird_stuff}/boodlegrid.tac (100%)
 rename misc/{ => build_helpers}/build-deb.py (100%)
 rename misc/{ => build_helpers}/check-build.py (100%)
 rename misc/{ => build_helpers}/get-version.py (100%)
 rename misc/{ => build_helpers}/pyver.py (100%)
 rename misc/{ => build_helpers}/run-with-pythonpath.py (100%)
 rename misc/{ => build_helpers}/run_trial.py (100%)
 rename misc/{ => build_helpers}/show-tool-versions.py (99%)
 rename misc/{ => build_helpers}/sub-ver.py (100%)
 rename misc/{ => build_helpers}/test-darcs-boringfile.py (100%)
 rename misc/{ => build_helpers}/test_mac_diskimage.py (100%)
 rename misc/{ => coding_tools}/coverage.el (100%)
 rename misc/{ => coding_tools}/coverage2el.py (100%)
 rename misc/{ => coding_tools}/find-trailing-spaces.py (100%)
 rename misc/{ => coding_tools}/fixshebangs.py (100%)
 rename misc/{ => coding_tools}/make-canary-files.py (100%)
 rename misc/{ => coding_tools}/make_umid (100%)
 delete mode 100644 misc/coverage2text.py
 rename misc/{ => debian_helpers}/etch/debian/changelog (100%)
 rename misc/{ => debian_helpers}/etch/debian/compat (100%)
 rename misc/{ => debian_helpers}/etch/debian/control (100%)
 rename misc/{ => debian_helpers}/etch/debian/copyright (100%)
 rename misc/{ => debian_helpers}/etch/debian/pycompat (100%)
 rename misc/{sid => debian_helpers/etch}/debian/rules (90%)
 rename misc/{ => debian_helpers}/lenny/debian/changelog (100%)
 rename misc/{ => debian_helpers}/lenny/debian/compat (100%)
 rename misc/{ => debian_helpers}/lenny/debian/control (100%)
 rename misc/{ => debian_helpers}/lenny/debian/copyright (100%)
 rename misc/{ => debian_helpers}/lenny/debian/pycompat (100%)
 rename misc/{etch => debian_helpers/lenny}/debian/rules (90%)
 rename misc/{ => debian_helpers}/sid/debian/changelog (100%)
 rename misc/{ => debian_helpers}/sid/debian/compat (100%)
 rename misc/{ => debian_helpers}/sid/debian/control (100%)
 rename misc/{ => debian_helpers}/sid/debian/copyright (100%)
 rename misc/{ => debian_helpers}/sid/debian/pycompat (100%)
 rename misc/{lenny => debian_helpers/sid}/debian/rules (90%)
 delete mode 100644 misc/delete-old-helper.sh
 delete mode 100644 misc/figleaf.excludes
 delete mode 100644 misc/figleaf2el.py
 delete mode 100644 misc/find_trial.py
 delete mode 100644 misc/logtool.py
 rename misc/{ => operations_helpers}/cpu-watcher-poll.py (100%)
 rename misc/{ => operations_helpers}/cpu-watcher-subscribe.py (100%)
 rename misc/{ => operations_helpers}/cpu-watcher.tac (100%)
 rename misc/{ => operations_helpers}/find-share-anomalies.py (100%)
 rename misc/{ => operations_helpers}/getmem.py (100%)
 rename misc/{ => operations_helpers}/munin/tahoe-conf (100%)
 rename misc/{ => operations_helpers}/munin/tahoe-stats.plugin-conf (100%)
 rename misc/{ => operations_helpers}/munin/tahoe_cpu_watcher (100%)
 rename misc/{ => operations_helpers}/munin/tahoe_diskleft (87%)
 rename misc/{ => operations_helpers}/munin/tahoe_disktotal (89%)
 rename misc/{ => operations_helpers}/munin/tahoe_diskusage (92%)
 rename misc/{ => operations_helpers}/munin/tahoe_diskused (87%)
 rename misc/{ => operations_helpers}/munin/tahoe_doomsday (93%)
 rename misc/{ => operations_helpers}/munin/tahoe_estimate_files (100%)
 rename misc/{ => operations_helpers}/munin/tahoe_files (100%)
 rename misc/{ => operations_helpers}/munin/tahoe_helperstats_active (100%)
 rename misc/{ => operations_helpers}/munin/tahoe_helperstats_fetched (100%)
 rename misc/{ => operations_helpers}/munin/tahoe_introstats (100%)
 rename misc/{ => operations_helpers}/munin/tahoe_nodememory (100%)
 rename misc/{ => operations_helpers}/munin/tahoe_overhead (96%)
 rename misc/{ => operations_helpers}/munin/tahoe_rootdir_space (100%)
 rename misc/{ => operations_helpers}/munin/tahoe_server_latency_ (100%)
 rename misc/{ => operations_helpers}/munin/tahoe_server_operations_ (100%)
 rename misc/{ => operations_helpers}/munin/tahoe_spacetime (100%)
 rename misc/{ => operations_helpers}/munin/tahoe_stats (100%)
 rename misc/{ => operations_helpers}/munin/tahoe_storagespace (100%)
 rename misc/{ => operations_helpers}/spacetime/diskwatcher.py (100%)
 rename misc/{ => operations_helpers}/spacetime/diskwatcher.tac (100%)
 rename misc/{ => simulators}/count_dirs.py (100%)
 rename misc/{ => simulators}/ringsim.py (100%)
 rename misc/{ => simulators}/simulate_load.py (100%)
 rename misc/{ => simulators}/simulator.py (100%)
 rename misc/{ => simulators}/sizes.py (100%)
 rename misc/{ => simulators}/storage-overhead.py (100%)
 delete mode 100644 misc/xfer-client.py

diff --git a/Makefile b/Makefile
index edfd8681..0bd474b7 100644
--- a/Makefile
+++ b/Makefile
@@ -119,28 +119,22 @@ test-coverage: build src/allmydata/_version.py
 	$(PYTHON) setup.py trial --reporter=bwverbose-coverage -s $(TEST)
 
 quicktest:
-	$(PYTHON) misc/run-with-pythonpath.py trial $(TRIALARGS) $(TEST)
+	$(PYTHON) misc/build_helpers/run-with-pythonpath.py trial $(TRIALARGS) $(TEST)
 
 # code-coverage: install the "coverage" package from PyPI, do "make
 # quicktest-coverage" to do a unit test run with coverage-gathering enabled,
 # then use "make coverate-output-text" for a brief report, or "make
 # coverage-output" for a pretty HTML report. Also see "make .coverage.el" and
-# misc/coverage.el for emacs integration.
+# misc/coding_helpers/coverage.el for emacs integration.
 
 quicktest-coverage:
 	rm -f .coverage
-	$(PYTHON) misc/run-with-pythonpath.py trial --reporter=bwverbose-coverage $(TEST)
+	$(PYTHON) misc/build_helpers/run-with-pythonpath.py trial --reporter=bwverbose-coverage $(TEST)
 # on my laptop, "quicktest" takes 239s, "quicktest-coverage" takes 304s
 
-COVERAGE_OMIT = --omit /System,/Library,/usr/lib,src/allmydata/test,support
-
-# this is like 'coverage report', but includes lines-uncovered
-coverage-output-text:
-	$(PYTHON) misc/coverage2text.py
-
 coverage-output:
 	rm -rf coverage-html
-	coverage html -d coverage-html $(COVERAGE_OMIT)
+	coverage html -d coverage-html
 	cp .coverage coverage-html/coverage.data
 	@echo "now point your browser at coverage-html/index.html"
 
@@ -160,7 +154,7 @@ coverage-output:
 .PHONY: repl test-darcs-boringfile test-clean clean find-trailing-spaces
 
 .coverage.el: .coverage
-	$(PYTHON) misc/coverage2el.py
+	$(PYTHON) misc/coding_helpers/coverage2el.py
 
 # 'upload-coverage' is meant to be run with an UPLOAD_TARGET=host:/dir setting
 ifdef UPLOAD_TARGET
@@ -244,7 +238,7 @@ repl:
 
 test-darcs-boringfile:
 	$(MAKE)
-	$(PYTHON) misc/test-darcs-boringfile.py
+	$(PYTHON) misc/build_helpers/test-darcs-boringfile.py
 
 test-clean:
 	find . |grep -vEe "_darcs|allfiles.tmp|src/allmydata/_(version|auto_deps|appname).py" |sort >allfiles.tmp.old
@@ -265,7 +259,7 @@ clean:
 	rm -f bin/tahoe bin/tahoe-script.py
 
 find-trailing-spaces:
-	$(PYTHON) misc/find-trailing-spaces.py -r src
+	$(PYTHON) misc/coding_tools/find-trailing-spaces.py -r src
 
 # The test-desert-island target grabs the tahoe-deps tarball, unpacks it,
 # does a build, then asserts that the build did not try to download anything
@@ -280,7 +274,7 @@ fetch-and-unpack-deps:
 test-desert-island:
 	$(MAKE) fetch-and-unpack-deps
 	$(MAKE) 2>&1 | tee make.out
-	$(PYTHON) misc/check-build.py make.out no-downloads
+	$(PYTHON) misc/build_helpers/check-build.py make.out no-downloads
 
 
 # TARBALL GENERATION
@@ -297,7 +291,7 @@ upload-tarballs:
 
 # DEBIAN PACKAGING
 
-VER=$(shell $(PYTHON) misc/get-version.py)
+VER=$(shell $(PYTHON) misc/build_helpers/get-version.py)
 DEBCOMMENTS="'make deb' build"
 
 show-version:
@@ -309,7 +303,7 @@ show-pp:
 .PHONY: deb-etch deb-lenny deb-sid
 .PHONY: deb-edgy deb-feisty deb-gutsy deb-hardy deb-intrepid deb-jaunty
 
-# we use misc/$TAHOE_ARCH/debian
+# we use misc/debian_helpers/$TAHOE_ARCH/debian
 
 deb-etch:      # py2.4
 	$(MAKE) deb-ARCH ARCH=etch TAHOE_ARCH=etch
@@ -352,7 +346,7 @@ endif
 
 setup-deb: is-known-debian-arch
 	rm -f debian
-	ln -s misc/$(TAHOE_ARCH)/debian debian
+	ln -s misc/debian_helpers/$(TAHOE_ARCH)/debian debian
 	chmod +x debian/rules
 
 # etch (current debian stable) has python-simplejson-1.3, which doesn't
@@ -419,7 +413,7 @@ deb-jaunty-head:
 # new experimental debian-packaging-building target
 .PHONY: EXPERIMENTAL-deb
 EXPERIMENTAL-deb: is-known-debian-arch
-	$(PYTHON) misc/build-deb.py $(ARCH)
+	$(PYTHON) misc/build_helpers/build-deb.py $(ARCH)
 
 
 # These targets provide for windows native builds
diff --git a/docs/logging.txt b/docs/logging.txt
index d249d1e5..eb3190ef 100644
--- a/docs/logging.txt
+++ b/docs/logging.txt
@@ -198,7 +198,7 @@ but a few notes are worth stating here:
 
  * assign each severe (log.WEIRD or higher) event a unique message
    identifier, as the umid= argument to the log.msg() call. The
-   misc/make_umid script may be useful for this purpose. This will make it
+   misc/coding_tools/make_umid script may be useful for this purpose. This will make it
    easier to write a classification function for these messages.
 
  * use the parent= argument whenever the event is causally/temporally
diff --git a/docs/stats.txt b/docs/stats.txt
index 437313ad..8cb8dfb4 100644
--- a/docs/stats.txt
+++ b/docs/stats.txt
@@ -254,7 +254,7 @@ Other tools can be built to examine these stats and render them into
 something useful. For example, a tool could sum the
 "storage_server.disk_avail' values from all servers to compute a
 total-disk-available number for the entire grid (however, the "disk watcher"
-daemon, in misc/spacetime/, is better suited for this specific task).
+daemon, in misc/operations_helpers/spacetime/, is better suited for this specific task).
 
 == Using Munin To Graph Stats Values ==
 
diff --git a/mac/Makefile b/mac/Makefile
index c15da210..47855fc7 100644
--- a/mac/Makefile
+++ b/mac/Makefile
@@ -21,6 +21,7 @@ diskimage:
 ifdef UPLOAD_DEST_FURLFILE
 # N.B.: xfer-client.py requires foolscap, so we hack up PYTHONPATH to improve
 # the chances of finding it (using the one that we just built)
+# broken. To fix this just use flappclient. --Zooko 2010-06-06
 upload:
 	chmod a+r Allmydata-$(VERSION).dmg
 	PYTHONPATH=$(PYTHONPATH):../support/lib/python2.5/site-packages \
diff --git a/misc/boodlegrid.tac b/misc/awesome_weird_stuff/boodlegrid.tac
similarity index 100%
rename from misc/boodlegrid.tac
rename to misc/awesome_weird_stuff/boodlegrid.tac
diff --git a/misc/build-deb.py b/misc/build_helpers/build-deb.py
similarity index 100%
rename from misc/build-deb.py
rename to misc/build_helpers/build-deb.py
diff --git a/misc/check-build.py b/misc/build_helpers/check-build.py
similarity index 100%
rename from misc/check-build.py
rename to misc/build_helpers/check-build.py
diff --git a/misc/get-version.py b/misc/build_helpers/get-version.py
similarity index 100%
rename from misc/get-version.py
rename to misc/build_helpers/get-version.py
diff --git a/misc/pyver.py b/misc/build_helpers/pyver.py
similarity index 100%
rename from misc/pyver.py
rename to misc/build_helpers/pyver.py
diff --git a/misc/run-with-pythonpath.py b/misc/build_helpers/run-with-pythonpath.py
similarity index 100%
rename from misc/run-with-pythonpath.py
rename to misc/build_helpers/run-with-pythonpath.py
diff --git a/misc/run_trial.py b/misc/build_helpers/run_trial.py
similarity index 100%
rename from misc/run_trial.py
rename to misc/build_helpers/run_trial.py
diff --git a/misc/show-tool-versions.py b/misc/build_helpers/show-tool-versions.py
similarity index 99%
rename from misc/show-tool-versions.py
rename to misc/build_helpers/show-tool-versions.py
index d1c98b26..bec7e698 100644
--- a/misc/show-tool-versions.py
+++ b/misc/build_helpers/show-tool-versions.py
@@ -93,3 +93,4 @@ print_setuptools_ver()
 print_py_pkg_ver('coverage')
 print_py_pkg_ver('trialcoverage')
 print_py_pkg_ver('setuptools_trial')
+print_py_pkg_ver('pyflakes')
diff --git a/misc/sub-ver.py b/misc/build_helpers/sub-ver.py
similarity index 100%
rename from misc/sub-ver.py
rename to misc/build_helpers/sub-ver.py
diff --git a/misc/test-darcs-boringfile.py b/misc/build_helpers/test-darcs-boringfile.py
similarity index 100%
rename from misc/test-darcs-boringfile.py
rename to misc/build_helpers/test-darcs-boringfile.py
diff --git a/misc/test_mac_diskimage.py b/misc/build_helpers/test_mac_diskimage.py
similarity index 100%
rename from misc/test_mac_diskimage.py
rename to misc/build_helpers/test_mac_diskimage.py
diff --git a/misc/coverage.el b/misc/coding_tools/coverage.el
similarity index 100%
rename from misc/coverage.el
rename to misc/coding_tools/coverage.el
diff --git a/misc/coverage2el.py b/misc/coding_tools/coverage2el.py
similarity index 100%
rename from misc/coverage2el.py
rename to misc/coding_tools/coverage2el.py
diff --git a/misc/find-trailing-spaces.py b/misc/coding_tools/find-trailing-spaces.py
similarity index 100%
rename from misc/find-trailing-spaces.py
rename to misc/coding_tools/find-trailing-spaces.py
diff --git a/misc/fixshebangs.py b/misc/coding_tools/fixshebangs.py
similarity index 100%
rename from misc/fixshebangs.py
rename to misc/coding_tools/fixshebangs.py
diff --git a/misc/make-canary-files.py b/misc/coding_tools/make-canary-files.py
similarity index 100%
rename from misc/make-canary-files.py
rename to misc/coding_tools/make-canary-files.py
diff --git a/misc/make_umid b/misc/coding_tools/make_umid
similarity index 100%
rename from misc/make_umid
rename to misc/coding_tools/make_umid
diff --git a/misc/coverage2text.py b/misc/coverage2text.py
deleted file mode 100644
index f91e25b5..00000000
--- a/misc/coverage2text.py
+++ /dev/null
@@ -1,116 +0,0 @@
-
-import sys
-from coverage import coverage
-from coverage.results import Numbers
-from coverage.summary import SummaryReporter
-from twisted.python import usage
-
-# this is an adaptation of the code behind "coverage report", modified to
-# display+sortby "lines uncovered", which (IMHO) is more important of a
-# metric than lines covered or percentage covered. Concentrating on the files
-# with the most uncovered lines encourages getting the tree and test suite
-# into a state that provides full line-coverage on all files.
-
-# much of this code was adapted from coverage/summary.py in the 'coverage'
-# distribution, and is used under their BSD license.
-
-class Options(usage.Options):
-    optParameters = [
-        ("sortby", "s", "uncovered", "how to sort: uncovered, covered, name"),
-        ]
-
-class MyReporter(SummaryReporter):
-    def report(self, outfile=None, sortby="uncovered"):
-        self.find_code_units(None, ["/System", "/Library", "/usr/lib",
-                                    "support/lib", "src/allmydata/test"])
-
-        # Prepare the formatting strings
-        max_name = max([len(cu.name) for cu in self.code_units] + [5])
-        fmt_name = "%%- %ds  " % max_name
-        fmt_err = "%s   %s: %s\n"
-        header1 = (fmt_name % ""    ) + "     Statements    "
-        header2 = (fmt_name % "Name") + " Uncovered  Covered"
-        fmt_coverage = fmt_name + "%9d  %7d "
-        if self.branches:
-            header1 += "   Branches   "
-            header2 += " Found  Excutd"
-            fmt_coverage += " %6d %6d"
-        header1 += "  Percent"
-        header2 += "  Covered"
-        fmt_coverage += " %7d%%"
-        if self.show_missing:
-            header1 += "          "
-            header2 += "   Missing"
-            fmt_coverage += "   %s"
-        rule = "-" * len(header1) + "\n"
-        header1 += "\n"
-        header2 += "\n"
-        fmt_coverage += "\n"
-
-        if not outfile:
-            outfile = sys.stdout
-
-        # Write the header
-        outfile.write(header1)
-        outfile.write(header2)
-        outfile.write(rule)
-
-        total = Numbers()
-        total_uncovered = 0
-
-        lines = []
-        for cu in self.code_units:
-            try:
-                analysis = self.coverage._analyze(cu)
-                nums = analysis.numbers
-                uncovered = nums.n_statements - nums.n_executed
-                total_uncovered += uncovered
-                args = (cu.name, uncovered, nums.n_executed)
-                if self.branches:
-                    args += (nums.n_branches, nums.n_executed_branches)
-                args += (nums.pc_covered,)
-                if self.show_missing:
-                    args += (analysis.missing_formatted(),)
-                if sortby == "covered":
-                    sortkey = nums.pc_covered
-                elif sortby == "uncovered":
-                    sortkey = uncovered
-                else:
-                    sortkey = cu.name
-                lines.append((sortkey, fmt_coverage % args))
-                total += nums
-            except KeyboardInterrupt:                       # pragma: no cover
-                raise
-            except:
-                if not self.ignore_errors:
-                    typ, msg = sys.exc_info()[:2]
-                    outfile.write(fmt_err % (cu.name, typ.__name__, msg))
-        lines.sort()
-        if sortby in ("uncovered", "covered"):
-            lines.reverse()
-        for sortkey,line in lines:
-            outfile.write(line)
-
-        if total.n_files > 1:
-            outfile.write(rule)
-            args = ("TOTAL", total_uncovered, total.n_executed)
-            if self.branches:
-                args += (total.n_branches, total.n_executed_branches)
-            args += (total.pc_covered,)
-            if self.show_missing:
-                args += ("",)
-            outfile.write(fmt_coverage % args)
-
-def report(o):
-    c = coverage()
-    c.load()
-    r = MyReporter(c, show_missing=False, ignore_errors=False)
-    r.report(sortby=o['sortby'])
-
-if __name__ == '__main__':
-    o = Options()
-    o.parseOptions()
-    report(o)
-
-
-
diff --git a/misc/debian/rules.sid b/misc/debian/rules.sid
index 3b7bf2be..6c65b746 100644
--- a/misc/debian/rules.sid
+++ b/misc/debian/rules.sid
@@ -15,7 +15,7 @@ DEBNAME := $(firstword $(DEB_PACKAGES))
 STAGING_DIR := $(CURDIR)/debian/$(DEBNAME)
 
 DEB_INSTALL_DOCS_ALL := COPYING.TGPPL.html CREDITS NEWS README.txt relnotes.txt \
- docs misc/spacetime misc/cpu-watcher.tac
+ docs misc/operations_helpers/spacetime misc/operations_helpers/cpu-watcher.tac
 DEB_COMPRESS_EXCLUDE := .tac
 
 install/$(DEBNAME)::
diff --git a/misc/etch/debian/changelog b/misc/debian_helpers/etch/debian/changelog
similarity index 100%
rename from misc/etch/debian/changelog
rename to misc/debian_helpers/etch/debian/changelog
diff --git a/misc/etch/debian/compat b/misc/debian_helpers/etch/debian/compat
similarity index 100%
rename from misc/etch/debian/compat
rename to misc/debian_helpers/etch/debian/compat
diff --git a/misc/etch/debian/control b/misc/debian_helpers/etch/debian/control
similarity index 100%
rename from misc/etch/debian/control
rename to misc/debian_helpers/etch/debian/control
diff --git a/misc/etch/debian/copyright b/misc/debian_helpers/etch/debian/copyright
similarity index 100%
rename from misc/etch/debian/copyright
rename to misc/debian_helpers/etch/debian/copyright
diff --git a/misc/etch/debian/pycompat b/misc/debian_helpers/etch/debian/pycompat
similarity index 100%
rename from misc/etch/debian/pycompat
rename to misc/debian_helpers/etch/debian/pycompat
diff --git a/misc/sid/debian/rules b/misc/debian_helpers/etch/debian/rules
similarity index 90%
rename from misc/sid/debian/rules
rename to misc/debian_helpers/etch/debian/rules
index 58f7bf29..9c07c564 100644
--- a/misc/sid/debian/rules
+++ b/misc/debian_helpers/etch/debian/rules
@@ -15,7 +15,7 @@ DEBNAME := $(firstword $(DEB_PACKAGES))
 STAGING_DIR := $(CURDIR)/debian/$(DEBNAME)
 
 DEB_INSTALL_DOCS_ALL := COPYING.GPL COPYING.TGPPL.html CREDITS \
- NEWS README.txt relnotes.txt docs misc/spacetime misc/cpu-watcher.tac
+ NEWS README.txt relnotes.txt docs misc/operations_helpers/spacetime misc/operations_helpers/cpu-watcher.tac
 DEB_COMPRESS_EXCLUDE := .tac
 
 
@@ -39,7 +39,7 @@ install/$(DEBNAME)::
 	chmod +x $(STAGING_DIR)/usr/bin/tahoe.new
 	mv $(STAGING_DIR)/usr/bin/tahoe.new $(STAGING_DIR)/usr/bin/tahoe
 
-	dh_install misc/munin/* usr/share/$(DEBNAME)/munin
+	dh_install misc/operations_helpers/munin/* usr/share/$(DEBNAME)/munin
 	chmod +x $(STAGING_DIR)/usr/share/$(DEBNAME)/munin/*
 
 	dh_pycentral
diff --git a/misc/lenny/debian/changelog b/misc/debian_helpers/lenny/debian/changelog
similarity index 100%
rename from misc/lenny/debian/changelog
rename to misc/debian_helpers/lenny/debian/changelog
diff --git a/misc/lenny/debian/compat b/misc/debian_helpers/lenny/debian/compat
similarity index 100%
rename from misc/lenny/debian/compat
rename to misc/debian_helpers/lenny/debian/compat
diff --git a/misc/lenny/debian/control b/misc/debian_helpers/lenny/debian/control
similarity index 100%
rename from misc/lenny/debian/control
rename to misc/debian_helpers/lenny/debian/control
diff --git a/misc/lenny/debian/copyright b/misc/debian_helpers/lenny/debian/copyright
similarity index 100%
rename from misc/lenny/debian/copyright
rename to misc/debian_helpers/lenny/debian/copyright
diff --git a/misc/lenny/debian/pycompat b/misc/debian_helpers/lenny/debian/pycompat
similarity index 100%
rename from misc/lenny/debian/pycompat
rename to misc/debian_helpers/lenny/debian/pycompat
diff --git a/misc/etch/debian/rules b/misc/debian_helpers/lenny/debian/rules
similarity index 90%
rename from misc/etch/debian/rules
rename to misc/debian_helpers/lenny/debian/rules
index 58f7bf29..9c07c564 100644
--- a/misc/etch/debian/rules
+++ b/misc/debian_helpers/lenny/debian/rules
@@ -15,7 +15,7 @@ DEBNAME := $(firstword $(DEB_PACKAGES))
 STAGING_DIR := $(CURDIR)/debian/$(DEBNAME)
 
 DEB_INSTALL_DOCS_ALL := COPYING.GPL COPYING.TGPPL.html CREDITS \
- NEWS README.txt relnotes.txt docs misc/spacetime misc/cpu-watcher.tac
+ NEWS README.txt relnotes.txt docs misc/operations_helpers/spacetime misc/operations_helpers/cpu-watcher.tac
 DEB_COMPRESS_EXCLUDE := .tac
 
 
@@ -39,7 +39,7 @@ install/$(DEBNAME)::
 	chmod +x $(STAGING_DIR)/usr/bin/tahoe.new
 	mv $(STAGING_DIR)/usr/bin/tahoe.new $(STAGING_DIR)/usr/bin/tahoe
 
-	dh_install misc/munin/* usr/share/$(DEBNAME)/munin
+	dh_install misc/operations_helpers/munin/* usr/share/$(DEBNAME)/munin
 	chmod +x $(STAGING_DIR)/usr/share/$(DEBNAME)/munin/*
 
 	dh_pycentral
diff --git a/misc/sid/debian/changelog b/misc/debian_helpers/sid/debian/changelog
similarity index 100%
rename from misc/sid/debian/changelog
rename to misc/debian_helpers/sid/debian/changelog
diff --git a/misc/sid/debian/compat b/misc/debian_helpers/sid/debian/compat
similarity index 100%
rename from misc/sid/debian/compat
rename to misc/debian_helpers/sid/debian/compat
diff --git a/misc/sid/debian/control b/misc/debian_helpers/sid/debian/control
similarity index 100%
rename from misc/sid/debian/control
rename to misc/debian_helpers/sid/debian/control
diff --git a/misc/sid/debian/copyright b/misc/debian_helpers/sid/debian/copyright
similarity index 100%
rename from misc/sid/debian/copyright
rename to misc/debian_helpers/sid/debian/copyright
diff --git a/misc/sid/debian/pycompat b/misc/debian_helpers/sid/debian/pycompat
similarity index 100%
rename from misc/sid/debian/pycompat
rename to misc/debian_helpers/sid/debian/pycompat
diff --git a/misc/lenny/debian/rules b/misc/debian_helpers/sid/debian/rules
similarity index 90%
rename from misc/lenny/debian/rules
rename to misc/debian_helpers/sid/debian/rules
index 58f7bf29..9c07c564 100644
--- a/misc/lenny/debian/rules
+++ b/misc/debian_helpers/sid/debian/rules
@@ -15,7 +15,7 @@ DEBNAME := $(firstword $(DEB_PACKAGES))
 STAGING_DIR := $(CURDIR)/debian/$(DEBNAME)
 
 DEB_INSTALL_DOCS_ALL := COPYING.GPL COPYING.TGPPL.html CREDITS \
- NEWS README.txt relnotes.txt docs misc/spacetime misc/cpu-watcher.tac
+ NEWS README.txt relnotes.txt docs misc/operations_helpers/spacetime misc/operations_helpers/cpu-watcher.tac
 DEB_COMPRESS_EXCLUDE := .tac
 
 
@@ -39,7 +39,7 @@ install/$(DEBNAME)::
 	chmod +x $(STAGING_DIR)/usr/bin/tahoe.new
 	mv $(STAGING_DIR)/usr/bin/tahoe.new $(STAGING_DIR)/usr/bin/tahoe
 
-	dh_install misc/munin/* usr/share/$(DEBNAME)/munin
+	dh_install misc/operations_helpers/munin/* usr/share/$(DEBNAME)/munin
 	chmod +x $(STAGING_DIR)/usr/share/$(DEBNAME)/munin/*
 
 	dh_pycentral
diff --git a/misc/delete-old-helper.sh b/misc/delete-old-helper.sh
deleted file mode 100644
index 1a85fcdd..00000000
--- a/misc/delete-old-helper.sh
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/bin/sh
-
-find helper/CHK_encoding -mtime +7 -print0 |xargs -0 rm
-find helper/CHK_incoming -mtime +14 -print0 |xargs -0 rm
diff --git a/misc/figleaf.excludes b/misc/figleaf.excludes
deleted file mode 100644
index 0eacb7a0..00000000
--- a/misc/figleaf.excludes
+++ /dev/null
@@ -1,5 +0,0 @@
-/test/
-/foolscap/
-/zfec/
-/allmydata/Crypto/
-/simplejson/
diff --git a/misc/figleaf2el.py b/misc/figleaf2el.py
deleted file mode 100644
index 0e7e051b..00000000
--- a/misc/figleaf2el.py
+++ /dev/null
@@ -1,87 +0,0 @@
-#! /usr/bin/env python
-
-import os, sys, pickle
-
-def longest_common_prefix(elements):
-    if not elements:
-        return ""
-    prefix = elements[0]
-    for e in elements:
-        prefix = longest_common_prefix_2(prefix, e)
-    return prefix
-def longest_common_prefix_2(a, b):
-    maxlen = min(len(a), len(b))
-    for i in range(maxlen, 0, -1):
-        if a[:i] == b[:i]:
-            return a[:i]
-    return ""
-
-## def write_el(r2):
-##     filenames = sorted(r2.keys())
-##     out = open(".figleaf.el", "w")
-##     out.write("(setq figleaf-results '(\n")
-##     for f in filenames:
-##         linenumbers = r2[f]
-##         out.write(' ("%s" (%s))\n' % (f, " ".join([str(ln)
-##                                                    for ln in linenumbers])))
-##     out.write(" ))\n")
-##     out.close()
-
-def write_el(r2, source):
-    filenames = sorted(r2.keys())
-    out = open(".figleaf.el", "w")
-    out.write("""
-;; This is an elisp-readable form of the figleaf coverage data. It defines a
-;; single top-level hash table in which the load-path-relative filename (like
-;; allmydata/download.py) is the key, and the value is a three-element list.
-;; The first element of this list is a list of line numbers that represent
-;; actual code. The second is a list of line numbers for lines which got used
-;; during the unit test. The third is a list of line numbers for code lines
-;; that were not covered (since 'code' and 'covered' start as sets, this last
-;; list is equal to 'code - covered').
-
-""")
-    out.write("(let ((results (make-hash-table :test 'equal)))\n")
-    for f in filenames:
-        covered_linenumbers = r2[f]
-        code_linenumbers = source[f]
-        uncovered_code = code_linenumbers - covered_linenumbers
-        out.write(" (puthash \"%s\" '((%s) (%s) (%s)) results)\n"
-                  % (f,
-                     " ".join([str(ln) for ln in sorted(code_linenumbers)]),
-                     " ".join([str(ln) for ln in sorted(covered_linenumbers)]),
-                     " ".join([str(ln) for ln in sorted(uncovered_code)]),
-                     ))
-    out.write(" results)\n")
-    out.close()
-
-import figleaf
-
-def examine_source(filename):
-    f = open(filename, "r")
-    lines = figleaf.get_lines(f)
-    f.close()
-    return lines
-
-def main():
-    results = pickle.load(open(sys.argv[1], "rb"))
-    import_prefix = os.path.abspath(sys.argv[2])
-    if not import_prefix.endswith("/"):
-        import_prefix = import_prefix + "/"
-    plen = len(import_prefix)
-
-    r2 = {}
-    source = {}
-    filenames = sorted(results.keys())
-    here = os.getcwd()
-    for f in filenames:
-        if f.startswith(import_prefix):
-            short = f[plen:]
-            r2[short] = results[f]
-            source[short] = examine_source(f)
-    write_el(r2, source)
-
-if __name__ == '__main__':
-    main()
-
-
diff --git a/misc/find_trial.py b/misc/find_trial.py
deleted file mode 100644
index 39c1553f..00000000
--- a/misc/find_trial.py
+++ /dev/null
@@ -1,37 +0,0 @@
-import sys
-
-import os, sys
-from twisted.python.procutils import which
-
-def find_exe(exename):
-    """
-    Look for something named exename or exename + ".py".
-
-    This is a kludge.
-
-    @return: a list containing one element which is the quoted path to the
-        exename (if it is thought to be executable), or else the first element
-        being quoted sys.executable and the second element being the quoted path
-        to the exename + ".py", or else return False if one can't be found
-    """
-    exes = which(exename)
-    exe = exes and exes[0]
-    if not exe:
-        exe = os.path.join(sys.prefix, 'scripts', exename + '.py')
-    if os.path.exists(exe):
-        path, ext = os.path.splitext(exe)
-        if ext.lower() in [".exe", ".bat",]:
-            cmd = ['"' + exe + '"',]
-        else:
-            cmd = ['"' + sys.executable + '"', '"' + exe + '"',]
-        return cmd
-    else:
-        return False
-
-
-if __name__ == "__main__":
-    cmd = find_exe("trial")
-    if cmd:
-        print " ".join(cmd).replace("\\", "/")
-    else:
-        sys.exit(1)
diff --git a/misc/logtool.py b/misc/logtool.py
deleted file mode 100644
index 9f0beeb5..00000000
--- a/misc/logtool.py
+++ /dev/null
@@ -1,201 +0,0 @@
-#!/usr/bin/env python
-
-import os.path, time, pickle
-import foolscap
-from foolscap import RemoteInterface
-from foolscap.eventual import fireEventually
-from foolscap.schema import DictOf, Any
-from twisted.internet import reactor, defer
-from zope.interface import implements
-from twisted.python import usage
-#from twisted.python import log
-#import sys
-#log.startLogging(sys.stderr)
-
-class Options(usage.Options):
-    longdesc = """
-    logtool tail FURL : follow logs of the target node
-    logtool gather : run as a daemon, record all logs to the current directory
-    logtool dump FILE : dump the logs recorded by 'logtool gather'
-    """
-
-    def parseArgs(self, mode, *args):
-        self.mode = mode
-        if mode == "tail":
-            target = args[0]
-            if target.startswith("pb:"):
-                self.target_furl = target
-            elif os.path.isfile(target):
-                self.target_furl = open(target, "r").read().strip()
-            elif os.path.isdir(target):
-                fn = os.path.join(target, "logport.furl")
-                self.target_furl = open(fn, "r").read().strip()
-            else:
-                raise ValueError("Can't use tail target: %s" % target)
-        elif mode == "dump":
-            self.dumpfile = args[0]
-
-
-class RILogObserver(RemoteInterface):
-    def msg(logmsg=DictOf(str, Any())):
-        return None
-class RISubscription(RemoteInterface):
-    pass
-
-class RILogPublisher(RemoteInterface):
-    def get_versions():
-        return DictOf(str, str)
-    def subscribe_to_all(observer=RILogObserver):
-        return RISubscription
-    def unsubscribe(subscription=Any()):
-        # I don't know how to get the constraint right: unsubscribe() should
-        # accept return value of subscribe_to_all()
-        return None
-
-class RILogGatherer(RemoteInterface):
-    def logport(nodeid=str, logport=RILogPublisher):
-        return None
-
-class LogPrinter(foolscap.Referenceable):
-    implements(RILogObserver)
-
-    def remote_msg(self, d):
-        print d
-
-class LogTail:
-
-    def start(self, target_furl):
-        print "Connecting.."
-        d = defer.maybeDeferred(self.setup_tub)
-        d.addCallback(self._tub_ready, target_furl)
-        return d
-
-    def setup_tub(self):
-        self._tub = foolscap.Tub()
-        self._tub.startService()
-
-    def _tub_ready(self, res, target_furl):
-        d = self._tub.getReference(target_furl)
-        d.addCallback(self._got_logpublisher)
-        return d
-
-    def _got_logpublisher(self, publisher):
-        print "Connected"
-        lp = LogPrinter()
-        d = publisher.callRemote("subscribe_to_all", lp)
-        return d
-
-    def remote_msg(self, d):
-        print d
-
-class LogSaver(foolscap.Referenceable):
-    implements(RILogObserver)
-    def __init__(self, nodeid, savefile):
-        self.nodeid = nodeid
-        self.f = savefile
-
-    def remote_msg(self, d):
-        e = {"from": self.nodeid,
-             "rx_time": time.time(),
-             "d": d,
-             }
-        pickle.dump(e, self.f)
-
-    def disconnected(self):
-        del self.f
-        from allmydata.util.idlib import shortnodeid_b2a
-        print "LOGPORT CLOSED", shortnodeid_b2a(self.nodeid)
-
-class LogGatherer(foolscap.Referenceable):
-    implements(RILogGatherer)
-
-    def start(self, res):
-        self._savefile = open("logs.pickle", "ab", 0)
-        d = self.setup_tub()
-        d.addCallback(self._tub_ready)
-        return d
-
-    def setup_tub(self):
-        from allmydata.util import iputil
-        self._tub = foolscap.Tub(certFile="gatherer.pem")
-        self._tub.startService()
-        portnumfile = "portnum"
-        try:
-            portnum = int(open(portnumfile, "r").read())
-        except (EnvironmentError, ValueError):
-            portnum = 0
-        self._tub.listenOn("tcp:%d" % portnum)
-        d = defer.maybeDeferred(iputil.get_local_addresses_async)
-        d.addCallback(self._set_location)
-        return d
-
-    def _set_location(self, local_addresses):
-        l = self._tub.getListeners()[0]
-        portnum = l.getPortnum()
-        portnumfile = "portnum"
-        open(portnumfile, "w").write("%d\n" % portnum)
-        local_addresses = [ "%s:%d" % (addr, portnum,)
-                            for addr in local_addresses ]
-        location = ",".join(local_addresses)
-        self._tub.setLocation(location)
-
-    def _tub_ready(self, res):
-        me = self._tub.registerReference(self, furlFile="log_gatherer.furl")
-        print "Gatherer waiting at:", me
-
-    def remote_logport(self, nodeid, publisher):
-        from allmydata.util.idlib import shortnodeid_b2a
-        short = shortnodeid_b2a(nodeid)
-        print "GOT LOGPORT", short
-        ls = LogSaver(nodeid, self._savefile)
-        publisher.callRemote("subscribe_to_all", ls)
-        publisher.notifyOnDisconnect(ls.disconnected)
-
-class LogDumper:
-    def start(self, options):
-        from allmydata.util.idlib import shortnodeid_b2a
-        fn = options.dumpfile
-        f = open(fn, "rb")
-        while True:
-            try:
-                e = pickle.load(f)
-                short = shortnodeid_b2a(e['from'])
-                when = e['rx_time']
-                print "%s %r: %r" % (short, when, e['d'])
-            except EOFError:
-                break
-
-class LogTool:
-
-    def run(self, options):
-        mode = options.mode
-        if mode == "tail":
-            lt = LogTail()
-            d = fireEventually(options.target_furl)
-            d.addCallback(lt.start)
-            d.addErrback(self._error)
-            print "starting.."
-            reactor.run()
-        elif mode == "gather":
-            lg = LogGatherer()
-            d = fireEventually()
-            d.addCallback(lg.start)
-            d.addErrback(self._error)
-            print "starting.."
-            reactor.run()
-        elif mode == "dump":
-            ld = LogDumper()
-            ld.start(options)
-        else:
-            print "unknown mode '%s'" % mode
-            raise NotImplementedError
-
-    def _error(self, f):
-        print "ERROR", f
-        reactor.stop()
-
-if __name__ == '__main__':
-    o = Options()
-    o.parseOptions()
-    lt = LogTool()
-    lt.run(o)
diff --git a/misc/cpu-watcher-poll.py b/misc/operations_helpers/cpu-watcher-poll.py
similarity index 100%
rename from misc/cpu-watcher-poll.py
rename to misc/operations_helpers/cpu-watcher-poll.py
diff --git a/misc/cpu-watcher-subscribe.py b/misc/operations_helpers/cpu-watcher-subscribe.py
similarity index 100%
rename from misc/cpu-watcher-subscribe.py
rename to misc/operations_helpers/cpu-watcher-subscribe.py
diff --git a/misc/cpu-watcher.tac b/misc/operations_helpers/cpu-watcher.tac
similarity index 100%
rename from misc/cpu-watcher.tac
rename to misc/operations_helpers/cpu-watcher.tac
diff --git a/misc/find-share-anomalies.py b/misc/operations_helpers/find-share-anomalies.py
similarity index 100%
rename from misc/find-share-anomalies.py
rename to misc/operations_helpers/find-share-anomalies.py
diff --git a/misc/getmem.py b/misc/operations_helpers/getmem.py
similarity index 100%
rename from misc/getmem.py
rename to misc/operations_helpers/getmem.py
diff --git a/misc/munin/tahoe-conf b/misc/operations_helpers/munin/tahoe-conf
similarity index 100%
rename from misc/munin/tahoe-conf
rename to misc/operations_helpers/munin/tahoe-conf
diff --git a/misc/munin/tahoe-stats.plugin-conf b/misc/operations_helpers/munin/tahoe-stats.plugin-conf
similarity index 100%
rename from misc/munin/tahoe-stats.plugin-conf
rename to misc/operations_helpers/munin/tahoe-stats.plugin-conf
diff --git a/misc/munin/tahoe_cpu_watcher b/misc/operations_helpers/munin/tahoe_cpu_watcher
similarity index 100%
rename from misc/munin/tahoe_cpu_watcher
rename to misc/operations_helpers/munin/tahoe_cpu_watcher
diff --git a/misc/munin/tahoe_diskleft b/misc/operations_helpers/munin/tahoe_diskleft
similarity index 87%
rename from misc/munin/tahoe_diskleft
rename to misc/operations_helpers/munin/tahoe_diskleft
index fc568bbe..913fa792 100644
--- a/misc/munin/tahoe_diskleft
+++ b/misc/operations_helpers/munin/tahoe_diskleft
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 # This is a munin plugin which pulls data from the server in
-# misc/spacetime/diskwatcher.tac . It produces a graph of how much free space
+# misc/operations_helpers/spacetime/diskwatcher.tac . It produces a graph of how much free space
 # is left on all disks across the grid. The plugin should be configured with
 # env_url= pointing at the diskwatcher.tac webport.
 
diff --git a/misc/munin/tahoe_disktotal b/misc/operations_helpers/munin/tahoe_disktotal
similarity index 89%
rename from misc/munin/tahoe_disktotal
rename to misc/operations_helpers/munin/tahoe_disktotal
index a9fb04e5..354ccc8c 100644
--- a/misc/munin/tahoe_disktotal
+++ b/misc/operations_helpers/munin/tahoe_disktotal
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 # This is a munin plugin which pulls data from the server in
-# misc/spacetime/diskwatcher.tac . It produces a graph of how much space is
+# misc/operations_helpers/spacetime/diskwatcher.tac . It produces a graph of how much space is
 # present on all disks across the grid, and how much space is actually being
 # used. The plugin should be configured with env_url= pointing at the
 # diskwatcher.tac webport.
diff --git a/misc/munin/tahoe_diskusage b/misc/operations_helpers/munin/tahoe_diskusage
similarity index 92%
rename from misc/munin/tahoe_diskusage
rename to misc/operations_helpers/munin/tahoe_diskusage
index 9810220f..d54ae375 100644
--- a/misc/munin/tahoe_diskusage
+++ b/misc/operations_helpers/munin/tahoe_diskusage
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 # This is a munin plugin which pulls data from the server in
-# misc/spacetime/diskwatcher.tac . It produces a graph of how much disk space
+# misc/operations_helpers/spacetime/diskwatcher.tac . It produces a graph of how much disk space
 # is being used per unit time. The plugin should be configured with env_url=
 # pointing at the diskwatcher.tac webport.
 
diff --git a/misc/munin/tahoe_diskused b/misc/operations_helpers/munin/tahoe_diskused
similarity index 87%
rename from misc/munin/tahoe_diskused
rename to misc/operations_helpers/munin/tahoe_diskused
index 50de687e..41c0b24a 100644
--- a/misc/munin/tahoe_diskused
+++ b/misc/operations_helpers/munin/tahoe_diskused
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 # This is a munin plugin which pulls data from the server in
-# misc/spacetime/diskwatcher.tac . It produces a graph of how much space is
+# misc/operations_helpers/spacetime/diskwatcher.tac . It produces a graph of how much space is
 # used on all disks across the grid. The plugin should be configured with
 # env_url= pointing at the diskwatcher.tac webport.
 
diff --git a/misc/munin/tahoe_doomsday b/misc/operations_helpers/munin/tahoe_doomsday
similarity index 93%
rename from misc/munin/tahoe_doomsday
rename to misc/operations_helpers/munin/tahoe_doomsday
index c8ab1c0a..63513a13 100644
--- a/misc/munin/tahoe_doomsday
+++ b/misc/operations_helpers/munin/tahoe_doomsday
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 # This is a munin plugin which pulls data from the server in
-# misc/spacetime/diskwatcher.tac . It produces a graph of how much time is
+# misc/operations_helpers/spacetime/diskwatcher.tac . It produces a graph of how much time is
 # left before the grid fills up. The plugin should be configured with
 # env_url= pointing at the diskwatcher.tac webport.
 
diff --git a/misc/munin/tahoe_estimate_files b/misc/operations_helpers/munin/tahoe_estimate_files
similarity index 100%
rename from misc/munin/tahoe_estimate_files
rename to misc/operations_helpers/munin/tahoe_estimate_files
diff --git a/misc/munin/tahoe_files b/misc/operations_helpers/munin/tahoe_files
similarity index 100%
rename from misc/munin/tahoe_files
rename to misc/operations_helpers/munin/tahoe_files
diff --git a/misc/munin/tahoe_helperstats_active b/misc/operations_helpers/munin/tahoe_helperstats_active
similarity index 100%
rename from misc/munin/tahoe_helperstats_active
rename to misc/operations_helpers/munin/tahoe_helperstats_active
diff --git a/misc/munin/tahoe_helperstats_fetched b/misc/operations_helpers/munin/tahoe_helperstats_fetched
similarity index 100%
rename from misc/munin/tahoe_helperstats_fetched
rename to misc/operations_helpers/munin/tahoe_helperstats_fetched
diff --git a/misc/munin/tahoe_introstats b/misc/operations_helpers/munin/tahoe_introstats
similarity index 100%
rename from misc/munin/tahoe_introstats
rename to misc/operations_helpers/munin/tahoe_introstats
diff --git a/misc/munin/tahoe_nodememory b/misc/operations_helpers/munin/tahoe_nodememory
similarity index 100%
rename from misc/munin/tahoe_nodememory
rename to misc/operations_helpers/munin/tahoe_nodememory
diff --git a/misc/munin/tahoe_overhead b/misc/operations_helpers/munin/tahoe_overhead
similarity index 96%
rename from misc/munin/tahoe_overhead
rename to misc/operations_helpers/munin/tahoe_overhead
index 266fe939..d8225f1f 100644
--- a/misc/munin/tahoe_overhead
+++ b/misc/operations_helpers/munin/tahoe_overhead
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 # This is a munin plugin which pulls total-used data from the server in
-# misc/spacetime/diskwatcher.tac, and a total-deep-size number from custom
+# misc/operations_helpers/spacetime/diskwatcher.tac, and a total-deep-size number from custom
 # PHP database-querying scripts on a different server. It produces a graph of
 # how much garbage/overhead is present in the grid: the ratio of total-used
 # over (total-deep-size*N/k), expressed as a percentage. No overhead would be
diff --git a/misc/munin/tahoe_rootdir_space b/misc/operations_helpers/munin/tahoe_rootdir_space
similarity index 100%
rename from misc/munin/tahoe_rootdir_space
rename to misc/operations_helpers/munin/tahoe_rootdir_space
diff --git a/misc/munin/tahoe_server_latency_ b/misc/operations_helpers/munin/tahoe_server_latency_
similarity index 100%
rename from misc/munin/tahoe_server_latency_
rename to misc/operations_helpers/munin/tahoe_server_latency_
diff --git a/misc/munin/tahoe_server_operations_ b/misc/operations_helpers/munin/tahoe_server_operations_
similarity index 100%
rename from misc/munin/tahoe_server_operations_
rename to misc/operations_helpers/munin/tahoe_server_operations_
diff --git a/misc/munin/tahoe_spacetime b/misc/operations_helpers/munin/tahoe_spacetime
similarity index 100%
rename from misc/munin/tahoe_spacetime
rename to misc/operations_helpers/munin/tahoe_spacetime
diff --git a/misc/munin/tahoe_stats b/misc/operations_helpers/munin/tahoe_stats
similarity index 100%
rename from misc/munin/tahoe_stats
rename to misc/operations_helpers/munin/tahoe_stats
diff --git a/misc/munin/tahoe_storagespace b/misc/operations_helpers/munin/tahoe_storagespace
similarity index 100%
rename from misc/munin/tahoe_storagespace
rename to misc/operations_helpers/munin/tahoe_storagespace
diff --git a/misc/spacetime/diskwatcher.py b/misc/operations_helpers/spacetime/diskwatcher.py
similarity index 100%
rename from misc/spacetime/diskwatcher.py
rename to misc/operations_helpers/spacetime/diskwatcher.py
diff --git a/misc/spacetime/diskwatcher.tac b/misc/operations_helpers/spacetime/diskwatcher.tac
similarity index 100%
rename from misc/spacetime/diskwatcher.tac
rename to misc/operations_helpers/spacetime/diskwatcher.tac
diff --git a/misc/count_dirs.py b/misc/simulators/count_dirs.py
similarity index 100%
rename from misc/count_dirs.py
rename to misc/simulators/count_dirs.py
diff --git a/misc/ringsim.py b/misc/simulators/ringsim.py
similarity index 100%
rename from misc/ringsim.py
rename to misc/simulators/ringsim.py
diff --git a/misc/simulate_load.py b/misc/simulators/simulate_load.py
similarity index 100%
rename from misc/simulate_load.py
rename to misc/simulators/simulate_load.py
diff --git a/misc/simulator.py b/misc/simulators/simulator.py
similarity index 100%
rename from misc/simulator.py
rename to misc/simulators/simulator.py
diff --git a/misc/sizes.py b/misc/simulators/sizes.py
similarity index 100%
rename from misc/sizes.py
rename to misc/simulators/sizes.py
diff --git a/misc/storage-overhead.py b/misc/simulators/storage-overhead.py
similarity index 100%
rename from misc/storage-overhead.py
rename to misc/simulators/storage-overhead.py
diff --git a/misc/xfer-client.py b/misc/xfer-client.py
deleted file mode 100644
index e7af4803..00000000
--- a/misc/xfer-client.py
+++ /dev/null
@@ -1,66 +0,0 @@
-#!/usr/bin/env python
-
-"""This program is a client that sends files to xfer-server.py. You give it
-the server's FURL, and it can put files into the server's targetdir (and
-nowhere else). When you want an unattended process on one machine to be able
-to place files in a remote directory, you could give its parent process an
-ssh account on the target, with an empty passphrase, but that provides too
-much power. This program is a least-privilege replacement for the ssh/scp
-approach.
-
-Give the client a FURL, or a file where the FURL is stored. You also give it
-the name of the local file to be transferred. The last component of the local
-pathname will be used as the remote filename.
-"""
-
-import os.path
-from twisted.internet import reactor
-from foolscap import UnauthenticatedTub
-from twisted.python import usage
-
-class Options(usage.Options):
-    synopsis = "xfer-client.py (--furl FURL | --furlfile furlfile) LOCALFILE"
-    optParameters = [
-        ["furl", "f", None,
-         "The server FURL. You must either provide --furl or --furlfile."],
-        ["furlfile", "l", None,
-         "A file containing the server FURL."],
-        ]
-    optFlags = [
-        ["quiet", "q", "Do not announce success."],
-        ]
-
-    def parseArgs(self, localfile):
-        self['localfile'] = localfile
-
-    def postOptions(self):
-        if not self["furl"] and not self["furlfile"]:
-            raise usage.UsageError("you must either provide --furl or --furlfile")
-        if not os.path.exists(self["localfile"]):
-            raise usage.UsageError("local file '%s' doesn't exist" % self["localfile"])
-
-opts = Options()
-opts.parseOptions()
-tub = UnauthenticatedTub()
-tub.startService()
-if opts["furl"]:
-    furl = opts["furl"]
-else:
-    furl = open(os.path.expanduser(opts["furlfile"]), "r").read().strip()
-remotename = os.path.basename(opts["localfile"])
-d = tub.getReference(furl)
-def _push(rref):
-    data = open(os.path.expanduser(opts["localfile"]), "r").read()
-    return rref.callRemote("putfile", remotename, data)
-d.addCallback(_push)
-def _success(res):
-    reactor.stop()
-    if not opts["quiet"]:
-        print "file transferred to %s" % remotename
-def _failure(f):
-    reactor.stop()
-    print "error while transferring file:"
-    print f
-d.addCallbacks(_success, _failure)
-
-reactor.run()
diff --git a/setup.py b/setup.py
index d1481564..bdbbbbd0 100644
--- a/setup.py
+++ b/setup.py
@@ -205,7 +205,7 @@ class TestMacDiskImage(Command):
         pass
     def run(self):
         import sys
-        sys.path.append('misc')
+        sys.path.append(os.path.join('misc', 'build_helpers'))
         import test_mac_diskimage
         return test_mac_diskimage.test_mac_diskimage('Allmydata', version=self.distribution.metadata.version)
 
-- 
2.45.2