code: func zipSource() string {
  	cwd := filepath.Join(workDir, "src")
  	check(os.MkdirAll(cwd, 0755))
  	image := goDockerImage
  	args := []string{
  		"run",
  		"--rm",
  		"--volume=" + cwd + ":/OUT",
  		"--volume=" + path.Join(releaseDir, "zip-source.go") + ":" + zipSourceProgram + ":ro",
  	}
  	if isWIP() {
  		args = append(args, "--volume="+localCamliSource()+":/IN:ro",
  			image, goCmd, "run", zipSourceProgram, "--rev=WIP:/IN")
  	} else {
  		args = append(args, image, goCmd, "run", zipSourceProgram, "--rev="+rev())
  	}
  	cmd := exec.Command("docker", args...)
  	cmd.Stdout = os.Stdout
  	cmd.Stderr = os.Stderr
  	if err := cmd.Run(); err != nil {
  		log.Fatalf("Error zipping Perkeep source in go container: %v", err)
  	}
  	archiveName := "perkeep-src.zip"
  	// can't use os.Rename because invalid cross-device link error likely
  	cmd = exec.Command("mv", filepath.Join(cwd, archiveName), releaseDir)
  	cmd.Stdout = os.Stdout
  	cmd.Stderr = os.Stderr
  	if err := cmd.Run(); err != nil {
  		log.Fatalf("Error moving source zip from %v to %v: %v", filepath.Join(cwd, archiveName), releaseDir, err)
  	}
  	fmt.Printf("Perkeep source successfully zipped in %v\n", releaseDir)
  	return archiveName
  }
docs: // zipSource builds the zip archive that contains the source code of Perkeep.