Monorepo for Tangled tangled.org

appview: state: fix forking across knots

Turns out we were accidentally using the destination knot as the
sourceUrl, and git was understandably annoyed. This also improves the
error checking when fetching the existingRepo from the database to
verify the forkName won't clash.

Changed files
+16 -6
appview
state
+16 -6
appview/state/repo.go
··· 453 453 breadcrumbs = append(breadcrumbs, []string{elem, fmt.Sprintf("%s/%s", breadcrumbs[idx][1], elem)}) 454 454 } 455 455 } 456 - 456 + 457 457 showRendered := false 458 458 renderToggle := false 459 459 ··· 461 461 renderToggle = true 462 462 showRendered = r.URL.Query().Get("code") != "true" 463 463 } 464 - 464 + 465 465 user := s.auth.GetUser(r) 466 466 s.pages.RepoBlob(w, pages.RepoBlobParams{ 467 467 LoggedInUser: user, ··· 1698 1698 1699 1699 forkName := fmt.Sprintf("%s", f.RepoName) 1700 1700 1701 + // this check is *only* to see if the forked repo name already exists 1702 + // in the user's account. 1701 1703 existingRepo, err := db.GetRepo(s.db, user.Did, f.RepoName) 1702 - if err == nil && existingRepo != nil { 1704 + if err != nil { 1705 + if errors.Is(err, sql.ErrNoRows) { 1706 + // no existing repo with this name found, we can use the name as is 1707 + } else { 1708 + log.Println("error fetching existing repo from db", err) 1709 + s.pages.Notice(w, "repo", "Failed to fork this repository. Try again later.") 1710 + return 1711 + } 1712 + } else if existingRepo != nil { 1713 + // repo with this name already exists, append random string 1703 1714 forkName = fmt.Sprintf("%s-%s", forkName, randomString(3)) 1704 1715 } 1705 - 1706 1716 secret, err := db.GetRegistrationKey(s.db, knot) 1707 1717 if err != nil { 1708 1718 s.pages.Notice(w, "repo", fmt.Sprintf("No registration key found for knot %s.", knot)) ··· 1711 1721 1712 1722 client, err := NewSignedClient(knot, secret, s.config.Dev) 1713 1723 if err != nil { 1714 - s.pages.Notice(w, "repo", "Failed to connect to knot server.") 1724 + s.pages.Notice(w, "repo", "Failed to reach knot server.") 1715 1725 return 1716 1726 } 1717 1727 ··· 1721 1731 } else { 1722 1732 uri = "https" 1723 1733 } 1724 - sourceUrl := fmt.Sprintf("%s://%s/%s/%s", uri, knot, f.OwnerDid(), f.RepoName) 1734 + sourceUrl := fmt.Sprintf("%s://%s/%s/%s", uri, f.Knot, f.OwnerDid(), f.RepoName) 1725 1735 sourceAt := f.RepoAt.String() 1726 1736 1727 1737 rkey := s.TID()