appview: state: fix forking across knots #39

closed
opened by anirudh.fi targeting master

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
+14 -8
appview
state
+14 -8
appview/state/repo.go
··· 1698 1699 forkName := fmt.Sprintf("%s", f.RepoName) 1700 1701 - existingRepo, err := db.GetRepo(s.db, f.OwnerDid(), f.RepoName) 1702 - if err == nil && existingRepo != nil { 1703 forkName = fmt.Sprintf("%s-%s", forkName, randomString(3)) 1704 - } else if err != nil { 1705 - log.Println("error fetching existing repo from db", err) 1706 - s.pages.Notice(w, "repo", "Failed to fork this repository. Try again later.") 1707 - return 1708 } 1709 - 1710 secret, err := db.GetRegistrationKey(s.db, knot) 1711 if err != nil { 1712 s.pages.Notice(w, "repo", fmt.Sprintf("No registration key found for knot %s.", knot)) ··· 1725 } else { 1726 uri = "https" 1727 } 1728 - sourceUrl := fmt.Sprintf("%s://%s/%s/%s", uri, existingRepo.Knot, f.OwnerDid(), f.RepoName) 1729 sourceAt := f.RepoAt.String() 1730 1731 rkey := s.TID()
··· 1698 1699 forkName := fmt.Sprintf("%s", f.RepoName) 1700 1701 + // this check is *only* to see if the forked repo name already exists 1702 + // in the user's account. 1703 + existingRepo, err := db.GetRepo(s.db, user.Did, f.RepoName) 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 1714 forkName = fmt.Sprintf("%s-%s", forkName, randomString(3)) 1715 } 1716 secret, err := db.GetRegistrationKey(s.db, knot) 1717 if err != nil { 1718 s.pages.Notice(w, "repo", fmt.Sprintf("No registration key found for knot %s.", knot)) ··· 1731 } else { 1732 uri = "https" 1733 } 1734 + sourceUrl := fmt.Sprintf("%s://%s/%s/%s", uri, f.Knot, f.OwnerDid(), f.RepoName) 1735 sourceAt := f.RepoAt.String() 1736 1737 rkey := s.TID()