Skip Navigation

Search

Feedback for my first project: reimplement pulp-manifest

Hi 👋

I have tried to learn some go but I am still very much at the beginning, like understanding how to work with variables and functions. My background is mostly in python but I am not a programmer by trade.

```` package main

import ( "crypto/sha256" "fmt" "io" "log" "os" "path/filepath" )

func write_lines_to_file(lines []string, output_file string) { f, err2 := os.Create(output_file) if err2 != nil { log.Fatal(err2) } defer f.Close() for _, line := range lines { _, err := f.WriteString(line + "\n") if err != nil { log.Fatal(err2) } } }

func get_size_and_hash(file_path string) (int, string) { file, err := os.Open(file_path) if err != nil { panic(err) } defer file.Close() hash := sha256.New() if _, err := io.Copy(hash, file); err != nil { panic(err) } sum := fmt.Sprintf("%x", hash.Sum(nil)) file, err2 := os.Open(file_path) if err2 != nil { log.Fatal(err2) } fi, err2 := file.Stat() if err != nil { log.Fatal(err2) } my_size := fi.Size() return int(my_size), string(sum) }

func get_list_of_files(target_directory string) []string { var files []string err := filepath.Walk(target_directory, func(path string, info os.FileInfo, err error) error { if err != nil { fmt.Println(err) return nil } if !info.IsDir() { files = append(files, path) } return nil }) if err != nil { log.Fatal(err) } return files }

func main() { // accept directory as user input target_directory := os.Args[1]

my_files := get_list_of_files(target_directory)

var content []string

for _, file := range my_files { size, hash := get_size_and_hash(file) var str_file string = string(file) str_size := fmt.Sprint(size) var str_hash string = string(hash) // structure: file, checksum, size combined_line := str_file + "," + str_hash + "," + str_size content = append(content, combined_line) }

var output_file string = target_directory + "/PULP_MANIFEST" write_lines_to_file(content, output_file) } ````

I am testing this using the following command: rm -f test_input/PULP_MANIFEST && go fmt pulp_manifest.go && go build pulp_manifest.go && ./pulp_manifest test_input && cat test_input/PULP_MANIFEST on Fedora with go 1.20

Known Limitations

  • My rewrite does not handle files or directories with "," yet.

Untested

  • Files with binary content
  • Paths on macOS or Microsoft Windows
  • Paths with whitespace
  • Symlinks in target_directory
  • target_directory as symlink

I am looking for the following feedback:

  • bugs and limitations
  • a was to add tests: do you have any recommendations for talks or blog posts?
  • style & best practice
  • a way to use static typing?!
  • anything else that you would recommend a novice.

Right now, I believe my rewrite works. Feel free to shatter my assumption. Cheers.

3