diff --git a/git.go b/git.go index 4c0fcb0..251f8d0 100644 --- a/git.go +++ b/git.go @@ -665,121 +665,6 @@ var gitFetch = &cli.Command{ }, } -var gitAnnounce = &cli.Command{ - Name: "announce", - Usage: "announce repository to Nostr", - Flags: defaultKeyFlags, - Action: func(ctx context.Context, c *cli.Command) error { - // check if current directory is a git repository - cmd := exec.Command("git", "rev-parse", "--git-dir") - if err := cmd.Run(); err != nil { - return fmt.Errorf("current directory is not a git repository") - } - - // read nip34.json configuration - localConfig, err := readNip34ConfigFile("") - if err != nil { - return err - } - - // parse owner - owner, err := parsePubKey(localConfig.Owner) - if err != nil { - return fmt.Errorf("invalid owner public key: %w", err) - } - - // setup signer - kr, _, err := gatherKeyerFromArguments(ctx, c) - if err != nil { - return fmt.Errorf("failed to gather keyer: %w", err) - } - currentPk, _ := kr.GetPublicKey(ctx) - - // current signer must match owner otherwise we can't announce - if currentPk != owner { - return fmt.Errorf("current user is not the owner of this repository, can't announce") - } - - // convert local config to nip34.Repository - localRepo := nip34.Repository{ - ID: localConfig.Identifier, - Name: localConfig.Name, - Description: localConfig.Description, - Web: localConfig.Web, - EarliestUniqueCommitID: localConfig.EarliestUniqueCommit, - Maintainers: []nostr.PubKey{}, - } - for _, server := range localConfig.GraspServers { - graspRelayURL := nostr.NormalizeURL(server) - url := fmt.Sprintf("http%s/%s/%s.git", - graspRelayURL[2:], nip19.EncodeNpub(owner), localConfig.Identifier) - localRepo.Clone = append(localRepo.Clone, url) - localRepo.Relays = append(localRepo.Relays, graspRelayURL) - } - for _, maintainer := range localConfig.Maintainers { - if pk, err := parsePubKey(maintainer); err == nil { - localRepo.Maintainers = append(localRepo.Maintainers, pk) - } else { - log(color.YellowString("invalid maintainer pubkey '%s': %v\n", maintainer, err)) - } - } - - // these are the relays where we'll publish the announcement to - relays := append(sys.FetchOutboxRelays(ctx, owner, 3), localConfig.GraspServers...) - for i := range relays { - relays[i] = nostr.NormalizeURL(relays[i]) - } - - // fetch repository announcement (30617) events - oks := make([]bool, len(relays)) - var repo nip34.Repository - results := sys.Pool.FetchMany(ctx, relays, nostr.Filter{ - Kinds: []nostr.Kind{30617}, - Tags: nostr.TagMap{ - "d": []string{localConfig.Identifier}, - }, - Limit: 1, - }, nostr.SubscriptionOptions{ - Label: "nak-git-announce", - CheckDuplicate: func(id nostr.ID, relay string) bool { return false }, // get the same event from multiple relays - }) - for ie := range results { - repo = nip34.ParseRepository(ie.Event) - - // check if this is ok or the announcement in this relay needs to be updated - if repo.Equals(localRepo) { - relayIdx := slices.Index(relays, ie.Relay.URL) - oks[relayIdx] = true - } - } - - // publish repository announcement if needed - if slices.Contains(oks, false) { - announcementEvent := localRepo.ToEvent() - if err := kr.SignEvent(ctx, &announcementEvent); err != nil { - return fmt.Errorf("failed to sign announcement event: %w", err) - } - - targets := make([]string, 0, len(oks)) - for i, ok := range oks { - if !ok { - targets = append(targets, relays[i]) - } - } - log("- publishing repository announcement to " + color.CyanString("%v", targets) + "\n") - for res := range sys.Pool.PublishMany(ctx, targets, announcementEvent) { - if res.Error != nil { - log("! error publishing announcement to relay %s: %v\n", color.YellowString(res.RelayURL), res.Error) - } else { - log("> published announcement to relay %s\n", color.GreenString(res.RelayURL)) - } - } - } - - return nil - }, -} - var gitSync = &cli.Command{ Name: "sync", Usage: "sync repository with relays",