summaryrefslogtreecommitdiff
path: root/main.go
diff options
context:
space:
mode:
Diffstat (limited to 'main.go')
-rw-r--r--main.go72
1 files changed, 72 insertions, 0 deletions
diff --git a/main.go b/main.go
index 012667e..9027dbb 100644
--- a/main.go
+++ b/main.go
@@ -21,6 +21,8 @@ package main
import (
"fmt"
"os"
+ "path/filepath"
+ "strings"
)
func main() {
@@ -60,4 +62,74 @@ func usageAndExit() {
}
func commandIndex() {
+ oldIndex := ReadIndex()
+ var newIndex Index
+
+ //check if existing index entries are still checked out
+ existingRepos := make(map[string]*Repo)
+ for _, repo := range oldIndex.Repos {
+ gitDirPath := filepath.Join(repo.AbsolutePath(), ".git")
+ fi, err := os.Stat(gitDirPath)
+ if err == nil {
+ if fi.IsDir() {
+ //everything okay with this repo
+ existingRepos[repo.CheckoutPath] = repo
+ newIndex.Repos = append(newIndex.Repos, repo)
+ continue
+ }
+ FatalIfError(fmt.Errorf("%s is not a directory: I'm seriously confused", gitDirPath))
+ }
+ if !os.IsNotExist(err) {
+ FatalIfError(err)
+ }
+
+ //repo has been deleted - ask what to do
+ fmt.Printf("repository %s has been deleted\n", filepath.Join(RootPath, repo.CheckoutPath))
+
+ var remoteURLs []string
+ for _, remote := range repo.Remotes {
+ if remote.Name == "origin" {
+ remoteURLs = []string{remote.URL}
+ break
+ }
+ remoteURLs = append(remoteURLs, remote.URL)
+ }
+
+ var choice string
+ if len(remoteURLs) == 0 {
+ choice = Prompt(
+ "no remote to restore from; (d)elete from index or (s)kip?",
+ []string{"d", "s"},
+ )
+ } else {
+ choice = Prompt(
+ fmt.Sprintf("(r)estore from %s, (d)elete from index, or (s)kip?", strings.Join(remoteURLs, " and ")),
+ []string{"r", "d", "s"},
+ )
+ }
+
+ switch choice {
+ case "r":
+ FatalIfError(repo.Checkout())
+ newIndex.Repos = append(newIndex.Repos, repo)
+ case "d":
+ continue
+ case "s":
+ newIndex.Repos = append(newIndex.Repos, repo)
+ }
+ }
+
+ //index new repos
+ FatalIfError(ForeachPhysicalRepo(func(newRepo Repo) error {
+ repo, exists := existingRepos[newRepo.CheckoutPath]
+ if exists {
+ //update the existing index entry with the new remotes
+ repo.Remotes = newRepo.Remotes
+ } else {
+ newIndex.Repos = append(newIndex.Repos, &newRepo)
+ }
+ return nil
+ }))
+
+ newIndex.Write()
}