mirror of
https://github.com/sbrow/envr.git
synced 2025-12-29 23:47:39 -05:00
Compare commits
7 Commits
c1a179ffaf
...
v0.1.1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
df5fdeee67 | ||
| 42796ec77b | |||
| 8a349dd760 | |||
| 7a49858a58 | |||
| 9ab72a25fa | |||
| 35519550ed | |||
|
|
7a60c673be |
2
.github/workflows/go.yml
vendored
2
.github/workflows/go.yml
vendored
@@ -19,7 +19,7 @@ jobs:
|
||||
- name: Set up Go
|
||||
uses: actions/setup-go@v4
|
||||
with:
|
||||
go-version: '1.20'
|
||||
go-version: '1.24.6'
|
||||
|
||||
- name: Build
|
||||
run: go build -v ./...
|
||||
|
||||
25
.github/workflows/release-please.yml
vendored
Normal file
25
.github/workflows/release-please.yml
vendored
Normal file
@@ -0,0 +1,25 @@
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
issues: write
|
||||
pull-requests: write
|
||||
|
||||
name: release-please
|
||||
|
||||
jobs:
|
||||
release-please:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: googleapis/release-please-action@v4
|
||||
with:
|
||||
# this assumes that you have created a personal access token
|
||||
# (PAT) and configured it as a GitHub action secret named
|
||||
# `MY_RELEASE_PLEASE_TOKEN` (this secret name is not important).
|
||||
token: ${{ secrets.MY_RELEASE_PLEASE_TOKEN }}
|
||||
# this is a built-in strategy in release-please, see "Action Inputs"
|
||||
# for more options
|
||||
release-type: go
|
||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -5,5 +5,6 @@
|
||||
man
|
||||
|
||||
# build artifacts
|
||||
builds
|
||||
envr
|
||||
result
|
||||
|
||||
13
CHANGELOG.md
Normal file
13
CHANGELOG.md
Normal file
@@ -0,0 +1,13 @@
|
||||
# Changelog
|
||||
|
||||
## [0.1.1](https://github.com/sbrow/envr/compare/v0.1.0...v0.1.1) (2025-11-05)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **sync:** Results are now displayed in a table. ([42796ec](https://github.com/sbrow/envr/commit/42796ec77b1817e1b9f09068d76a7b6e30da246b))
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **sync:** Fixed an issue where deleted folders would be restored. ([9ab72a2](https://github.com/sbrow/envr/commit/9ab72a25faf1af0eedb2f4574166c6ee47450ebb))
|
||||
92
Makefile
Normal file
92
Makefile
Normal file
@@ -0,0 +1,92 @@
|
||||
# Makefile for envr - Environment file manager
|
||||
# Builds release artifacts for GitHub releases
|
||||
|
||||
APP_NAME := envr
|
||||
VERSION := $(shell grep 'version = ' flake.nix | head -1 | sed 's/.*version = "\(.*\)";/\1/')
|
||||
BUILD_DIR := builds
|
||||
LDFLAGS := -X github.com/sbrow/envr/cmd.version=v$(VERSION) -s -w
|
||||
|
||||
# Binary names
|
||||
LINUX_AMD64_BIN := $(BUILD_DIR)/$(APP_NAME)-$(VERSION)-linux-amd64
|
||||
LINUX_ARM64_BIN := $(BUILD_DIR)/$(APP_NAME)-$(VERSION)-linux-arm64
|
||||
DARWIN_ARM64_BIN := $(BUILD_DIR)/$(APP_NAME)-$(VERSION)-darwin-arm64
|
||||
|
||||
.PHONY: all clean cleanall build-linux build-darwin compress release help
|
||||
|
||||
# Default target
|
||||
all: release clean
|
||||
|
||||
# Create build directory
|
||||
$(BUILD_DIR):
|
||||
@mkdir -p $(BUILD_DIR)
|
||||
|
||||
# Build Linux AMD64
|
||||
$(LINUX_AMD64_BIN): $(BUILD_DIR)
|
||||
@echo "Building for Linux AMD64..."
|
||||
GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -ldflags "$(LDFLAGS)" -o $(LINUX_AMD64_BIN) .
|
||||
@echo "Built $(LINUX_AMD64_BIN)"
|
||||
|
||||
# Build Linux ARM64
|
||||
$(LINUX_ARM64_BIN): $(BUILD_DIR)
|
||||
@echo "Building for Linux ARM64..."
|
||||
GOOS=linux GOARCH=arm64 CGO_ENABLED=0 go build -ldflags "$(LDFLAGS)" -o $(LINUX_ARM64_BIN) .
|
||||
@echo "Built $(LINUX_ARM64_BIN)"
|
||||
|
||||
# Build Darwin ARM64 (Mac)
|
||||
$(DARWIN_ARM64_BIN): $(BUILD_DIR)
|
||||
@echo "Building for Darwin ARM64..."
|
||||
GOOS=darwin GOARCH=arm64 CGO_ENABLED=0 go build -ldflags "$(LDFLAGS)" -o $(DARWIN_ARM64_BIN) .
|
||||
@echo "Built $(DARWIN_ARM64_BIN)"
|
||||
|
||||
# Build all binaries
|
||||
build-linux: $(LINUX_AMD64_BIN) $(LINUX_ARM64_BIN)
|
||||
build-darwin: $(DARWIN_ARM64_BIN)
|
||||
|
||||
# Compress Linux artifacts with gzip
|
||||
$(BUILD_DIR)/$(APP_NAME)-$(VERSION)-linux-amd64.tar.gz: $(LINUX_AMD64_BIN)
|
||||
@echo "Compressing Linux AMD64 artifact..."
|
||||
cd $(BUILD_DIR) && tar -czf $(APP_NAME)-$(VERSION)-linux-amd64.tar.gz --transform 's|.*|$(APP_NAME)|' $(shell basename $(LINUX_AMD64_BIN))
|
||||
|
||||
$(BUILD_DIR)/$(APP_NAME)-$(VERSION)-linux-arm64.tar.gz: $(LINUX_ARM64_BIN)
|
||||
@echo "Compressing Linux ARM64 artifact..."
|
||||
cd $(BUILD_DIR) && tar -czf $(APP_NAME)-$(VERSION)-linux-arm64.tar.gz --transform 's|.*|$(APP_NAME)|' $(shell basename $(LINUX_ARM64_BIN))
|
||||
|
||||
# Compress Darwin artifacts with zip
|
||||
$(BUILD_DIR)/$(APP_NAME)-$(VERSION)-darwin-arm64.zip: $(DARWIN_ARM64_BIN)
|
||||
@echo "Compressing Darwin ARM64 artifact..."
|
||||
cd $(BUILD_DIR) && cp $(shell basename $(DARWIN_ARM64_BIN)) $(APP_NAME) && zip $(APP_NAME)-$(VERSION)-darwin-arm64.zip $(APP_NAME) && rm $(APP_NAME)
|
||||
|
||||
# Compress all artifacts
|
||||
compress: $(BUILD_DIR)/$(APP_NAME)-$(VERSION)-linux-amd64.tar.gz \
|
||||
$(BUILD_DIR)/$(APP_NAME)-$(VERSION)-linux-arm64.tar.gz \
|
||||
$(BUILD_DIR)/$(APP_NAME)-$(VERSION)-darwin-arm64.zip
|
||||
|
||||
# Build and compress all release artifacts
|
||||
release: build-linux build-darwin compress
|
||||
@echo "Release artifacts created:"
|
||||
@ls -la $(BUILD_DIR)/*.tar.gz $(BUILD_DIR)/*.zip 2>/dev/null || echo "No compressed artifacts found"
|
||||
|
||||
# Clean binary files only
|
||||
clean:
|
||||
@echo "Cleaning binary files..."
|
||||
@rm -f $(LINUX_AMD64_BIN) $(LINUX_ARM64_BIN) $(DARWIN_ARM64_BIN)
|
||||
|
||||
# Clean everything in build directory
|
||||
cleanall:
|
||||
@echo "Cleaning build directory..."
|
||||
@rm -rf $(BUILD_DIR)
|
||||
|
||||
# Show available targets
|
||||
help:
|
||||
@echo "Available targets:"
|
||||
@echo " all - Build all release artifacts (default)"
|
||||
@echo " release - Build and compress all release artifacts"
|
||||
@echo " build-linux - Build Linux binaries only"
|
||||
@echo " build-darwin - Build Darwin binaries only"
|
||||
@echo " compress - Compress all built binaries"
|
||||
@echo " clean - Remove binary files only"
|
||||
@echo " cleanall - Remove entire build directory"
|
||||
@echo " help - Show this help message"
|
||||
@echo ""
|
||||
@echo "Release artifacts will be created in $(BUILD_DIR)/"
|
||||
@echo "Version: $(VERSION)"
|
||||
@@ -99,8 +99,8 @@ func getGitRemotes(dir string) []string {
|
||||
func (file EnvFile) Restore() error {
|
||||
// TODO: Handle restores more cleanly
|
||||
// Ensure the directory exists
|
||||
if err := os.MkdirAll(filepath.Dir(file.Path), 0755); err != nil {
|
||||
return fmt.Errorf("failed to create directory: %w", err)
|
||||
if _, err := os.Stat(file.Dir); err != nil {
|
||||
return fmt.Errorf("directory missing")
|
||||
}
|
||||
|
||||
// Check if file already exists
|
||||
|
||||
41
cmd/sync.go
41
cmd/sync.go
@@ -1,8 +1,11 @@
|
||||
package cmd
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"encoding/json"
|
||||
"os"
|
||||
|
||||
"github.com/mattn/go-isatty"
|
||||
"github.com/olekukonko/tablewriter"
|
||||
"github.com/sbrow/envr/app"
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
@@ -22,33 +25,53 @@ var syncCmd = &cobra.Command{
|
||||
if err != nil {
|
||||
return err
|
||||
} else {
|
||||
for _, file := range files {
|
||||
fmt.Printf("%s\n", file.Path)
|
||||
type syncResult struct {
|
||||
Path string `json:"path"`
|
||||
Status string `json:"status"`
|
||||
}
|
||||
var results []syncResult
|
||||
|
||||
for _, file := range files {
|
||||
// Syncronize the filesystem with the database.
|
||||
changed, err := file.Sync()
|
||||
|
||||
var status string
|
||||
switch changed {
|
||||
case app.Updated:
|
||||
fmt.Printf("File updated - changes saved\n")
|
||||
status = "Backed Up"
|
||||
if err := db.Insert(file); err != nil {
|
||||
return err
|
||||
}
|
||||
case app.Restored:
|
||||
fmt.Printf("File missing - restored backup\n")
|
||||
status = "Restored"
|
||||
case app.Error:
|
||||
if err == nil {
|
||||
panic("err cannot be nil when Sync returns Error")
|
||||
} else {
|
||||
fmt.Printf("%s\n", err)
|
||||
}
|
||||
status = err.Error()
|
||||
case app.Noop:
|
||||
fmt.Println("Nothing to do")
|
||||
status = "OK"
|
||||
default:
|
||||
panic("Unknown result")
|
||||
}
|
||||
|
||||
fmt.Println("")
|
||||
results = append(results, syncResult{
|
||||
Path: file.Path,
|
||||
Status: status,
|
||||
})
|
||||
}
|
||||
|
||||
if isatty.IsTerminal(os.Stdout.Fd()) {
|
||||
table := tablewriter.NewWriter(os.Stdout)
|
||||
table.Header([]string{"File", "Status"})
|
||||
|
||||
for _, result := range results {
|
||||
table.Append([]string{result.Path, result.Status})
|
||||
}
|
||||
table.Render()
|
||||
} else {
|
||||
encoder := json.NewEncoder(os.Stdout)
|
||||
return encoder.Encode(results)
|
||||
}
|
||||
|
||||
return nil
|
||||
|
||||
10
flake.nix
10
flake.nix
@@ -21,7 +21,12 @@
|
||||
imports = [
|
||||
inputs.treefmt-nix.flakeModule
|
||||
];
|
||||
systems = [ "x86_64-linux" ];
|
||||
systems = [
|
||||
"x86_64-linux"
|
||||
"aarch64-linux"
|
||||
|
||||
"aarch64-darwin"
|
||||
];
|
||||
|
||||
perSystem =
|
||||
{ pkgs, system, inputs', ... }: {
|
||||
@@ -92,6 +97,9 @@
|
||||
gotools
|
||||
cobra-cli
|
||||
|
||||
# Build tools
|
||||
zip
|
||||
|
||||
# IDE
|
||||
unstable.helix
|
||||
typescript-language-server
|
||||
|
||||
Reference in New Issue
Block a user