Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
76 changes: 76 additions & 0 deletions internal/librarian/java/pom.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,13 +59,20 @@ func generatePomsIfMissing(library *config.Library, libraryDir, googleapisDir st
if err != nil {
return err
}
var newModules []string
for _, m := range modules {
if !m.isMissing {
continue
}
if err := writePom(filepath.Join(m.dir, "pom.xml"), m.template, m.data); err != nil {
return fmt.Errorf("failed to generate %s: %w", m.artifactID, err)
}
newModules = append(newModules, m.artifactID)
}
if len(newModules) > 0 {
if err := updateVersionsFile(libraryDir, newModules, library.Version); err != nil {
return fmt.Errorf("failed to update versions.txt: %w", err)
}
}
return nil
}
Expand Down Expand Up @@ -178,3 +185,72 @@ func writePom(pomPath, templateName string, data any) (err error) {
}
return nil
}

// updateVersionsFile adds entries for new modules to versions.txt.
// The format is: module-name:released-version:snapshot-version
// For new modules, released-version is 0.0.0 and snapshot-version is library.Version-SNAPSHOT.
func updateVersionsFile(libraryDir string, newModules []string, version string) error {
// Find the repository root (parent of library directory)
repoRoot := filepath.Dir(libraryDir)
versionsPath := filepath.Join(repoRoot, "versions.txt")

// Read existing content if file exists
existingContent, err := os.ReadFile(versionsPath)
if err != nil && !os.IsNotExist(err) {
return fmt.Errorf("read versions.txt: %w", err)
}

// Parse existing entries to avoid duplicates
existingModules := make(map[string]bool)
if len(existingContent) > 0 {
lines := strings.Split(string(existingContent), "\n")
for _, line := range lines {
line = strings.TrimSpace(line)
if line == "" || strings.HasPrefix(line, "#") {
continue
}
parts := strings.Split(line, ":")
if len(parts) >= 1 {
existingModules[parts[0]] = true
}
}
}

// Prepare new entries
var newEntries []string
snapshotVersion := version + "-SNAPSHOT"
for _, module := range newModules {
if !existingModules[module] {
// Format: module:released-version:snapshot-version
// For new modules, released version is 0.0.0
entry := fmt.Sprintf("%s:0.0.0:%s", module, snapshotVersion)
newEntries = append(newEntries, entry)
}
}

if len(newEntries) == 0 {
return nil // No new entries to add
}

// Append new entries to the file
f, err := os.OpenFile(versionsPath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
return fmt.Errorf("open versions.txt: %w", err)
}
defer f.Close()

// Add a newline before new entries if file doesn't end with one
if len(existingContent) > 0 && !strings.HasSuffix(string(existingContent), "\n") {
if _, err := f.WriteString("\n"); err != nil {
return fmt.Errorf("write newline to versions.txt: %w", err)
}
}

for _, entry := range newEntries {
if _, err := f.WriteString(entry + "\n"); err != nil {
return fmt.Errorf("write entry to versions.txt: %w", err)
}
}

return nil
}
66 changes: 66 additions & 0 deletions internal/librarian/java/pom_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -156,3 +156,69 @@ func TestIsPomMissing_DirMissingError(t *testing.T) {
t.Errorf("isPomMissing(%q) error = %v, want %v", dir, err, os.ErrNotExist)
}
}

func TestUpdateVersionsFile(t *testing.T) {
for _, test := range []struct {
name string
existingContent string
newModules []string
version string
wantContent string
}{
{
name: "create new file with single module",
newModules: []string{"proto-google-cloud-test-v1"},
version: "1.2.3",
wantContent: "proto-google-cloud-test-v1:0.0.0:1.2.3-SNAPSHOT\n",
},
{
name: "append to existing file",
existingContent: "proto-google-cloud-existing-v1:1.0.0:1.1.0-SNAPSHOT\n",
newModules: []string{"proto-google-cloud-test-v2"},
version: "1.2.3",
wantContent: "proto-google-cloud-existing-v1:1.0.0:1.1.0-SNAPSHOT\nproto-google-cloud-test-v2:0.0.0:1.2.3-SNAPSHOT\n",
},
{
name: "skip duplicate modules",
existingContent: "proto-google-cloud-test-v1:1.0.0:1.1.0-SNAPSHOT\n",
newModules: []string{"proto-google-cloud-test-v1", "proto-google-cloud-test-v2"},
version: "1.2.3",
wantContent: "proto-google-cloud-test-v1:1.0.0:1.1.0-SNAPSHOT\nproto-google-cloud-test-v2:0.0.0:1.2.3-SNAPSHOT\n",
},
{
name: "add multiple new modules",
existingContent: "",
newModules: []string{"proto-google-cloud-test-v1", "grpc-google-cloud-test-v1"},
version: "2.0.0",
wantContent: "proto-google-cloud-test-v1:0.0.0:2.0.0-SNAPSHOT\ngrpc-google-cloud-test-v1:0.0.0:2.0.0-SNAPSHOT\n",
},
} {
t.Run(test.name, func(t *testing.T) {
tmpDir := t.TempDir()
libraryDir := filepath.Join(tmpDir, "java-test")
if err := os.MkdirAll(libraryDir, 0755); err != nil {
t.Fatal(err)
}

versionsPath := filepath.Join(tmpDir, "versions.txt")
if test.existingContent != "" {
if err := os.WriteFile(versionsPath, []byte(test.existingContent), 0644); err != nil {
t.Fatal(err)
}
}

if err := updateVersionsFile(libraryDir, test.newModules, test.version); err != nil {
t.Fatalf("updateVersionsFile() error = %v", err)
}

got, err := os.ReadFile(versionsPath)
if err != nil {
t.Fatalf("failed to read versions.txt: %v", err)
}

if diff := cmp.Diff(test.wantContent, string(got)); diff != "" {
t.Errorf("mismatch (-want +got):\n%s", diff)
}
})
}
}
Loading