Skip to content

Commit

Permalink
dirhash: forward to golang.org/x/mod/sumdb/dirhash
Browse files Browse the repository at this point in the history
It seems like x/mod/sumdb/dirhash appeared way back in 2019,
and we had not noticed until now.
  • Loading branch information
mvdan committed Sep 19, 2024
1 parent 496b1e7 commit 463d1a4
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 218 deletions.
96 changes: 12 additions & 84 deletions dirhash/hash.go
Original file line number Diff line number Diff line change
@@ -1,103 +1,31 @@
// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// Package dirhash defines hashes over directory trees.
// Package dirhash is a thin forwarding layer on top of
// [golang.org/x/mod/sumdb/dirhash]. See that package for documentation.
//
// Deprecated: use [golang.org/x/mod/sumdb/dirhash] instead.
package dirhash

import (
"archive/zip"
"crypto/sha256"
"encoding/base64"
"errors"
"fmt"
"io"
"os"
"path/filepath"
"sort"
"strings"

"golang.org/x/mod/sumdb/dirhash"
)

var DefaultHash = Hash1
var DefaultHash = dirhash.Hash1

type Hash func(files []string, open func(string) (io.ReadCloser, error)) (string, error)
type Hash = dirhash.Hash

func Hash1(files []string, open func(string) (io.ReadCloser, error)) (string, error) {
h := sha256.New()
files = append([]string(nil), files...)
sort.Strings(files)
for _, file := range files {
if strings.Contains(file, "\n") {
return "", errors.New("filenames with newlines are not supported")
}
r, err := open(file)
if err != nil {
return "", err
}
hf := sha256.New()
_, err = io.Copy(hf, r)
r.Close()
if err != nil {
return "", err
}
fmt.Fprintf(h, "%x %s\n", hf.Sum(nil), file)
}
return "h1:" + base64.StdEncoding.EncodeToString(h.Sum(nil)), nil
return dirhash.Hash1(files, open)
}

func HashDir(dir, prefix string, hash Hash) (string, error) {
files, err := DirFiles(dir, prefix)
if err != nil {
return "", err
}
osOpen := func(name string) (io.ReadCloser, error) {
return os.Open(filepath.Join(dir, strings.TrimPrefix(name, prefix)))
}
return hash(files, osOpen)
return dirhash.HashDir(dir, prefix, hash)
}

func DirFiles(dir, prefix string) ([]string, error) {
var files []string
dir = filepath.Clean(dir)
err := filepath.Walk(dir, func(file string, info os.FileInfo, err error) error {
if err != nil {
return err
}
if info.IsDir() {
return nil
}
rel := file
if dir != "." {
rel = file[len(dir)+1:]
}
f := filepath.Join(prefix, rel)
files = append(files, filepath.ToSlash(f))
return nil
})
if err != nil {
return nil, err
}
return files, nil
return dirhash.DirFiles(dir, prefix)
}

func HashZip(zipfile string, hash Hash) (string, error) {
z, err := zip.OpenReader(zipfile)
if err != nil {
return "", err
}
defer z.Close()
var files []string
zfiles := make(map[string]*zip.File)
for _, file := range z.File {
files = append(files, file.Name)
zfiles[file.Name] = file
}
zipOpen := func(name string) (io.ReadCloser, error) {
f := zfiles[name]
if f == nil {
return nil, fmt.Errorf("file %q not found in zip", name) // should never happen
}
return f.Open()
}
return hash(files, zipOpen)
return dirhash.HashZip(zipfile, hash)
}
134 changes: 0 additions & 134 deletions dirhash/hash_test.go

This file was deleted.

0 comments on commit 463d1a4

Please sign in to comment.