add script for benchmarking git-media on a full git repo's working dir

This commit is contained in:
risk danger olson 2013-09-27 16:44:13 -06:00 committed by Rick Olson
parent e44bff996a
commit b8f7cb45b5
2 changed files with 140 additions and 1 deletions

3
.gitignore vendored

@ -1 +1,2 @@
bin/
bin/
benchmark/

138
cmd/benchmark-git-media.git Normal file

@ -0,0 +1,138 @@
package main
import (
"flag"
"fmt"
"io"
"os"
"os/exec"
"path/filepath"
"strings"
"time"
)
var (
ListFiles = flag.Bool("list", false, "List files only")
SourcePath = flag.String("s", "/Users/rick/github/github", "Location of existing Git repository")
DestPath = flag.String("d", "", "Location to setup benchmark repository")
Extensions = flag.String("ext", "", "Extensions to filter through git-media, separated by commas")
WorkingDir string
)
func main() {
flag.Parse()
wd, _ := os.Getwd()
WorkingDir = wd
if *DestPath == "" {
*DestPath = filepath.Join(WorkingDir, "benchmark")
}
os.Chdir(*SourcePath)
if *ListFiles {
list(findfiles())
} else {
bench(findfiles())
}
}
func list(files []string) {
for _, path := range files {
fmt.Println(path)
}
}
func bench(files []string) {
os.MkdirAll(*DestPath, 0777)
os.Chdir(*DestPath)
fmt.Println(safeExec("git", "init"))
if *Extensions != "" {
fmt.Printf("Filtering extensions: %s\n", *Extensions)
gitattr, err := os.Create(filepath.Join(*DestPath, ".gitattributes"))
if err != nil {
fmt.Println("Error opening .gitattributes")
panic(err)
}
for _, ext := range strings.Split(*Extensions, ",") {
gitattr.Write([]byte(fmt.Sprintf("*.%s\tfilter=media\n", ext)))
}
gitattr.Close()
fmt.Println(WorkingDir, filepath.Join(WorkingDir, "bin", "git-media-clean"))
safeExec("git", "config", "filter.media.clean", filepath.Join(WorkingDir, "bin", "git-media-clean"))
safeExec("git", "config", "filter.media.smudge", filepath.Join(WorkingDir, "bin", "git-media-smudge"))
}
fmt.Printf("Copying %d files...\n", len(files))
for _, path := range files {
copyFile(path)
}
fmt.Println("Adding to git...")
started := time.Now()
if _, err := simpleExec("git", "add", "."); err != nil {
fmt.Printf("Error with git add: %s\n", err)
}
cmd, err := simpleExec("git", "commit", "-a", "-m", "benchmark")
dur := time.Since(started)
if err != nil {
fmt.Printf("Error with git add: %s\n", err)
} else {
fmt.Println(cmd)
}
fmt.Printf("Added in %s\n", dur.String())
}
func copyFile(path string) {
sourcepath := filepath.Join(*SourcePath, path)
destpath := filepath.Join(*DestPath, path)
source, err := os.Open(sourcepath)
if err != nil {
return
}
os.MkdirAll(filepath.Dir(destpath), 0777)
dest, err := os.Create(destpath)
if err != nil {
fmt.Printf("Error opening destination: %s\n", destpath)
panic(err)
}
io.Copy(dest, source)
source.Close()
dest.Close()
}
func findfiles() []string {
cmd := safeExec("git", "ls-tree", "HEAD", "-r")
lines := strings.Split(cmd, "\n")
files := make([]string, len(lines)-1)
for i := range files {
pieces := strings.Split(lines[i], "\t")
files[i] = pieces[len(pieces)-1]
}
return files
}
func simpleExec(name string, args ...string) (string, error) {
cmd, err := exec.Command(name, args...).Output()
if err != nil {
return "", err
}
return string(cmd), nil
}
func safeExec(name string, args ...string) string {
str, err := simpleExec(name, args...)
if err != nil {
panic(err)
}
return str
}