mirror of
https://github.com/RayLabsHQ/gitea-mirror.git
synced 2025-12-08 12:36:44 +03:00
Updated Layout
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
import React, { useEffect, useState } from "react";
|
import React, { useState } from "react";
|
||||||
import { Button } from "@/components/ui/button";
|
import { Button } from "@/components/ui/button";
|
||||||
import {
|
import {
|
||||||
Card,
|
Card,
|
||||||
@@ -10,14 +10,16 @@ import {
|
|||||||
import { githubApi } from "@/lib/api";
|
import { githubApi } from "@/lib/api";
|
||||||
import type { GitHubConfig, MirrorOptions, AdvancedOptions } from "@/types/config";
|
import type { GitHubConfig, MirrorOptions, AdvancedOptions } from "@/types/config";
|
||||||
import { Input } from "../ui/input";
|
import { Input } from "../ui/input";
|
||||||
import { Checkbox } from "../ui/checkbox";
|
|
||||||
import { toast } from "sonner";
|
import { toast } from "sonner";
|
||||||
import { AlertTriangle } from "lucide-react";
|
import { AlertTriangle, Info } from "lucide-react";
|
||||||
import { Alert, AlertDescription } from "../ui/alert";
|
import { Alert, AlertDescription } from "../ui/alert";
|
||||||
import { Info } from "lucide-react";
|
|
||||||
import { Tooltip, TooltipContent, TooltipTrigger } from "../ui/tooltip";
|
|
||||||
import { GitHubMirrorSettings } from "./GitHubMirrorSettings";
|
import { GitHubMirrorSettings } from "./GitHubMirrorSettings";
|
||||||
import { Separator } from "../ui/separator";
|
import { Separator } from "../ui/separator";
|
||||||
|
import {
|
||||||
|
Popover,
|
||||||
|
PopoverContent,
|
||||||
|
PopoverTrigger,
|
||||||
|
} from "@/components/ui/popover";
|
||||||
|
|
||||||
interface GitHubConfigFormProps {
|
interface GitHubConfigFormProps {
|
||||||
config: GitHubConfig;
|
config: GitHubConfig;
|
||||||
@@ -123,12 +125,52 @@ export function GitHubConfigForm({
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<label
|
<div className="flex items-center gap-2 mb-1.5">
|
||||||
htmlFor="github-token"
|
<label
|
||||||
className="block text-sm font-medium mb-1.5"
|
htmlFor="github-token"
|
||||||
>
|
className="block text-sm font-medium"
|
||||||
GitHub Token
|
>
|
||||||
</label>
|
GitHub Token
|
||||||
|
</label>
|
||||||
|
<Popover>
|
||||||
|
<PopoverTrigger asChild>
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
className="p-0.5 hover:bg-muted rounded-sm transition-colors"
|
||||||
|
>
|
||||||
|
<Info className="h-3.5 w-3.5 text-muted-foreground" />
|
||||||
|
</button>
|
||||||
|
</PopoverTrigger>
|
||||||
|
<PopoverContent side="right" align="start" className="w-80">
|
||||||
|
<div className="space-y-2">
|
||||||
|
<h4 className="font-medium text-sm">GitHub Token Requirements</h4>
|
||||||
|
<div className="text-sm space-y-2">
|
||||||
|
<p>
|
||||||
|
You need to create a <span className="font-medium">Classic GitHub PAT Token</span> with the following scopes:
|
||||||
|
</p>
|
||||||
|
<ul className="ml-4 space-y-1 list-disc">
|
||||||
|
<li><code className="text-xs bg-muted px-1 py-0.5 rounded">repo</code></li>
|
||||||
|
<li><code className="text-xs bg-muted px-1 py-0.5 rounded">admin:org</code></li>
|
||||||
|
</ul>
|
||||||
|
<p className="text-muted-foreground">
|
||||||
|
The organization access is required for mirroring organization repositories.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Generate tokens at{" "}
|
||||||
|
<a
|
||||||
|
href="https://github.com/settings/tokens"
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
className="text-primary hover:underline font-medium"
|
||||||
|
>
|
||||||
|
github.com/settings/tokens
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</PopoverContent>
|
||||||
|
</Popover>
|
||||||
|
</div>
|
||||||
<Input
|
<Input
|
||||||
id="github-token"
|
id="github-token"
|
||||||
name="token"
|
name="token"
|
||||||
@@ -136,7 +178,7 @@ export function GitHubConfigForm({
|
|||||||
value={config.token}
|
value={config.token}
|
||||||
onChange={handleChange}
|
onChange={handleChange}
|
||||||
className="bg-background"
|
className="bg-background"
|
||||||
placeholder="Your GitHub personal access token"
|
placeholder="Your GitHub token (classic) with repo and admin:org scopes"
|
||||||
/>
|
/>
|
||||||
<p className="text-xs text-muted-foreground mt-1">
|
<p className="text-xs text-muted-foreground mt-1">
|
||||||
Required for private repositories, organizations, and starred
|
Required for private repositories, organizations, and starred
|
||||||
@@ -163,45 +205,8 @@ export function GitHubConfigForm({
|
|||||||
if (onAdvancedOptionsAutoSave) onAdvancedOptionsAutoSave(newOptions);
|
if (onAdvancedOptionsAutoSave) onAdvancedOptionsAutoSave(newOptions);
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</CardContent>
|
</CardContent>
|
||||||
|
|
||||||
<CardFooter className="flex-col items-start">
|
|
||||||
<Alert variant="note" className="w-full">
|
|
||||||
<AlertTriangle className="h-4 w-4 text-blue-600 dark:text-blue-400 mr-2" />
|
|
||||||
<AlertDescription className="text-sm">
|
|
||||||
<div className="font-semibold mb-1">Note:</div>
|
|
||||||
<div className="mb-1">
|
|
||||||
You need to create a{" "}
|
|
||||||
<span className="font-semibold">Classic GitHub PAT Token</span>{" "}
|
|
||||||
with following scopes:
|
|
||||||
</div>
|
|
||||||
<ul className="ml-4 mb-1 list-disc">
|
|
||||||
<li>
|
|
||||||
<code>repo</code>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<code>admin:org</code>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
<div className="mb-1">
|
|
||||||
The organization access is required for mirroring organization
|
|
||||||
repositories.
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
You can generate tokens at{" "}
|
|
||||||
<a
|
|
||||||
href="https://github.com/settings/tokens"
|
|
||||||
target="_blank"
|
|
||||||
rel="noopener noreferrer"
|
|
||||||
className="underline font-medium hover:text-blue-900 dark:hover:text-blue-200"
|
|
||||||
>
|
|
||||||
github.com/settings/tokens
|
|
||||||
</a>
|
|
||||||
.
|
|
||||||
</div>
|
|
||||||
</AlertDescription>
|
|
||||||
</Alert>
|
|
||||||
</CardFooter>
|
|
||||||
</Card>
|
</Card>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -210,12 +210,13 @@ export function GiteaConfigForm({ config, setConfig, onAutoSave, isAutoSaving, g
|
|||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<Separator className="my-2" />
|
<Separator />
|
||||||
|
|
||||||
<OrganizationStrategy
|
<OrganizationStrategy
|
||||||
strategy={mirrorStrategy}
|
strategy={mirrorStrategy}
|
||||||
destinationOrg={config.organization}
|
destinationOrg={config.organization}
|
||||||
starredReposOrg={config.starredReposOrg}
|
starredReposOrg={config.starredReposOrg}
|
||||||
|
visibility={config.visibility}
|
||||||
onStrategyChange={setMirrorStrategy}
|
onStrategyChange={setMirrorStrategy}
|
||||||
onDestinationOrgChange={(org) => {
|
onDestinationOrgChange={(org) => {
|
||||||
const newConfig = { ...config, organization: org };
|
const newConfig = { ...config, organization: org };
|
||||||
@@ -227,54 +228,15 @@ export function GiteaConfigForm({ config, setConfig, onAutoSave, isAutoSaving, g
|
|||||||
setConfig(newConfig);
|
setConfig(newConfig);
|
||||||
if (onAutoSave) onAutoSave(newConfig);
|
if (onAutoSave) onAutoSave(newConfig);
|
||||||
}}
|
}}
|
||||||
|
onVisibilityChange={(visibility) => {
|
||||||
|
const newConfig = { ...config, visibility };
|
||||||
|
setConfig(newConfig);
|
||||||
|
if (onAutoSave) onAutoSave(newConfig);
|
||||||
|
}}
|
||||||
githubUsername={githubUsername}
|
githubUsername={githubUsername}
|
||||||
giteaUsername={config.username}
|
giteaUsername={config.username}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<Separator className="my-2" />
|
|
||||||
|
|
||||||
<div>
|
|
||||||
<label
|
|
||||||
htmlFor="visibility"
|
|
||||||
className="block text-sm font-medium mb-1.5"
|
|
||||||
>
|
|
||||||
Organization Visibility
|
|
||||||
</label>
|
|
||||||
<Select
|
|
||||||
name="visibility"
|
|
||||||
value={config.visibility}
|
|
||||||
onValueChange={(value) =>
|
|
||||||
handleChange({
|
|
||||||
target: { name: "visibility", value },
|
|
||||||
} as React.ChangeEvent<HTMLInputElement>)
|
|
||||||
}
|
|
||||||
>
|
|
||||||
<SelectTrigger className="w-full border border-input dark:bg-background dark:hover:bg-background">
|
|
||||||
<SelectValue placeholder="Select visibility" />
|
|
||||||
</SelectTrigger>
|
|
||||||
<SelectContent className="bg-background text-foreground border border-input shadow-sm">
|
|
||||||
{(["public", "private", "limited"] as GiteaOrgVisibility[]).map(
|
|
||||||
(option) => (
|
|
||||||
<SelectItem
|
|
||||||
key={option}
|
|
||||||
value={option}
|
|
||||||
className="cursor-pointer text-sm px-3 py-2 hover:bg-accent focus:bg-accent focus:text-accent-foreground"
|
|
||||||
>
|
|
||||||
{option.charAt(0).toUpperCase() + option.slice(1)}
|
|
||||||
</SelectItem>
|
|
||||||
)
|
|
||||||
)}
|
|
||||||
</SelectContent>
|
|
||||||
</Select>
|
|
||||||
<p className="text-xs text-muted-foreground mt-1">
|
|
||||||
Visibility for newly created organizations
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</CardContent>
|
</CardContent>
|
||||||
|
|
||||||
<CardFooter className="">
|
|
||||||
{/* Footer content can be added here if needed */}
|
|
||||||
</CardFooter>
|
|
||||||
</Card>
|
</Card>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,8 @@ import { Input } from "@/components/ui/input";
|
|||||||
import { Label } from "@/components/ui/label";
|
import { Label } from "@/components/ui/label";
|
||||||
import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group";
|
import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group";
|
||||||
import { Badge } from "@/components/ui/badge";
|
import { Badge } from "@/components/ui/badge";
|
||||||
import { Info, GitBranch, FolderTree, Package, Star, Building2, User, ChevronDown, ChevronUp } from "lucide-react";
|
import { Info, GitBranch, FolderTree, Package, Star, Building2, User, ChevronDown, ChevronUp, Globe, Lock, Shield } from "lucide-react";
|
||||||
|
import { Separator } from "@/components/ui/separator";
|
||||||
import {
|
import {
|
||||||
Tooltip,
|
Tooltip,
|
||||||
TooltipContent,
|
TooltipContent,
|
||||||
@@ -22,6 +23,7 @@ import {
|
|||||||
CollapsibleContent,
|
CollapsibleContent,
|
||||||
CollapsibleTrigger,
|
CollapsibleTrigger,
|
||||||
} from "@/components/ui/collapsible";
|
} from "@/components/ui/collapsible";
|
||||||
|
import type { GiteaOrgVisibility } from "@/types/config";
|
||||||
|
|
||||||
export type MirrorStrategy = "preserve" | "single-org" | "flat-user";
|
export type MirrorStrategy = "preserve" | "single-org" | "flat-user";
|
||||||
|
|
||||||
@@ -29,9 +31,11 @@ interface OrganizationStrategyProps {
|
|||||||
strategy: MirrorStrategy;
|
strategy: MirrorStrategy;
|
||||||
destinationOrg?: string;
|
destinationOrg?: string;
|
||||||
starredReposOrg?: string;
|
starredReposOrg?: string;
|
||||||
|
visibility: GiteaOrgVisibility;
|
||||||
onStrategyChange: (strategy: MirrorStrategy) => void;
|
onStrategyChange: (strategy: MirrorStrategy) => void;
|
||||||
onDestinationOrgChange: (org: string) => void;
|
onDestinationOrgChange: (org: string) => void;
|
||||||
onStarredReposOrgChange: (org: string) => void;
|
onStarredReposOrgChange: (org: string) => void;
|
||||||
|
onVisibilityChange: (visibility: GiteaOrgVisibility) => void;
|
||||||
githubUsername?: string;
|
githubUsername?: string;
|
||||||
giteaUsername?: string;
|
giteaUsername?: string;
|
||||||
}
|
}
|
||||||
@@ -223,7 +227,7 @@ const StrategyVisualizer: React.FC<{
|
|||||||
);
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="mt-4">
|
<div className="mt-3">
|
||||||
<Collapsible open={isOpen} onOpenChange={setIsOpen}>
|
<Collapsible open={isOpen} onOpenChange={setIsOpen}>
|
||||||
<Card className="overflow-hidden">
|
<Card className="overflow-hidden">
|
||||||
<CollapsibleTrigger className="w-full">
|
<CollapsibleTrigger className="w-full">
|
||||||
@@ -256,17 +260,24 @@ export const OrganizationStrategy: React.FC<OrganizationStrategyProps> = ({
|
|||||||
strategy,
|
strategy,
|
||||||
destinationOrg,
|
destinationOrg,
|
||||||
starredReposOrg,
|
starredReposOrg,
|
||||||
|
visibility,
|
||||||
onStrategyChange,
|
onStrategyChange,
|
||||||
onDestinationOrgChange,
|
onDestinationOrgChange,
|
||||||
onStarredReposOrgChange,
|
onStarredReposOrgChange,
|
||||||
|
onVisibilityChange,
|
||||||
githubUsername,
|
githubUsername,
|
||||||
giteaUsername,
|
giteaUsername,
|
||||||
}) => {
|
}) => {
|
||||||
|
const visibilityOptions = [
|
||||||
|
{ value: "public" as GiteaOrgVisibility, label: "Public", icon: Globe, description: "Visible to everyone" },
|
||||||
|
{ value: "private" as GiteaOrgVisibility, label: "Private", icon: Lock, description: "Visible to members only" },
|
||||||
|
{ value: "limited" as GiteaOrgVisibility, label: "Limited", icon: Shield, description: "Visible to logged-in users" },
|
||||||
|
];
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="space-y-6">
|
<div className="space-y-4">
|
||||||
<div>
|
<div>
|
||||||
<h3 className="text-lg font-semibold mb-1">Organization Strategy</h3>
|
<h3 className="text-base font-semibold mb-1">Organization Strategy</h3>
|
||||||
<p className="text-sm text-muted-foreground">
|
<p className="text-sm text-muted-foreground">
|
||||||
Choose how your repositories will be organized in Gitea
|
Choose how your repositories will be organized in Gitea
|
||||||
</p>
|
</p>
|
||||||
@@ -354,67 +365,112 @@ export const OrganizationStrategy: React.FC<OrganizationStrategyProps> = ({
|
|||||||
</div>
|
</div>
|
||||||
</RadioGroup>
|
</RadioGroup>
|
||||||
|
|
||||||
{strategy === "single-org" && (
|
<Separator className="my-4" />
|
||||||
<div className="space-y-4">
|
|
||||||
<Card className="p-4 border-purple-200 dark:border-purple-900 bg-purple-50/50 dark:bg-purple-950/20">
|
|
||||||
<div className="space-y-3">
|
|
||||||
<div>
|
|
||||||
<Label htmlFor="destinationOrg" className="flex items-center gap-2">
|
|
||||||
Destination Organization
|
|
||||||
<TooltipProvider>
|
|
||||||
<Tooltip>
|
|
||||||
<TooltipTrigger>
|
|
||||||
<Info className="h-3.5 w-3.5 text-muted-foreground" />
|
|
||||||
</TooltipTrigger>
|
|
||||||
<TooltipContent>
|
|
||||||
<p>All repositories will be mirrored to this organization</p>
|
|
||||||
</TooltipContent>
|
|
||||||
</Tooltip>
|
|
||||||
</TooltipProvider>
|
|
||||||
</Label>
|
|
||||||
<Input
|
|
||||||
id="destinationOrg"
|
|
||||||
value={destinationOrg || ""}
|
|
||||||
onChange={(e) => onDestinationOrgChange(e.target.value)}
|
|
||||||
placeholder="github-mirrors"
|
|
||||||
className="mt-1.5"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</Card>
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
|
|
||||||
<Card className="p-4 border-orange-200 dark:border-orange-900 bg-orange-50/50 dark:bg-orange-950/20">
|
<div className="space-y-4">
|
||||||
<div className="space-y-3">
|
<div>
|
||||||
<div>
|
<h4 className="text-sm font-medium mb-3 flex items-center gap-2">
|
||||||
<Label htmlFor="starredReposOrg" className="flex items-center gap-2">
|
<Building2 className="h-4 w-4" />
|
||||||
<Star className="h-4 w-4 text-orange-600 dark:text-orange-400" />
|
Organization Configuration
|
||||||
Starred Repositories Organization
|
</h4>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{strategy === "single-org" && (
|
||||||
|
<div className="space-y-1">
|
||||||
|
<Label htmlFor="destinationOrg" className="text-sm font-normal flex items-center gap-2">
|
||||||
|
Destination Organization
|
||||||
<TooltipProvider>
|
<TooltipProvider>
|
||||||
<Tooltip>
|
<Tooltip>
|
||||||
<TooltipTrigger>
|
<TooltipTrigger>
|
||||||
<Info className="h-3.5 w-3.5 text-muted-foreground" />
|
<Info className="h-3.5 w-3.5 text-muted-foreground" />
|
||||||
</TooltipTrigger>
|
</TooltipTrigger>
|
||||||
<TooltipContent>
|
<TooltipContent>
|
||||||
<p>Starred repositories will be organized separately in this organization</p>
|
<p>All repositories will be mirrored to this organization</p>
|
||||||
</TooltipContent>
|
</TooltipContent>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
</TooltipProvider>
|
</TooltipProvider>
|
||||||
</Label>
|
</Label>
|
||||||
<Input
|
<Input
|
||||||
id="starredReposOrg"
|
id="destinationOrg"
|
||||||
value={starredReposOrg || ""}
|
value={destinationOrg || ""}
|
||||||
onChange={(e) => onStarredReposOrgChange(e.target.value)}
|
onChange={(e) => onDestinationOrgChange(e.target.value)}
|
||||||
placeholder="starred"
|
placeholder="github-mirrors"
|
||||||
className="mt-1.5"
|
className=""
|
||||||
/>
|
/>
|
||||||
<p className="text-xs text-muted-foreground dark:text-muted-foreground/70 mt-1">
|
<p className="text-xs text-muted-foreground mt-1">
|
||||||
Keep starred repos organized separately from your own repositories
|
Organization for consolidated repositories
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
)}
|
||||||
|
|
||||||
|
<div className="space-y-1">
|
||||||
|
<Label htmlFor="starredReposOrg" className="text-sm font-normal flex items-center gap-2">
|
||||||
|
<Star className="h-3.5 w-3.5" />
|
||||||
|
Starred Repositories Organization
|
||||||
|
<TooltipProvider>
|
||||||
|
<Tooltip>
|
||||||
|
<TooltipTrigger>
|
||||||
|
<Info className="h-3.5 w-3.5 text-muted-foreground" />
|
||||||
|
</TooltipTrigger>
|
||||||
|
<TooltipContent>
|
||||||
|
<p>Starred repositories will be organized separately in this organization</p>
|
||||||
|
</TooltipContent>
|
||||||
|
</Tooltip>
|
||||||
|
</TooltipProvider>
|
||||||
|
</Label>
|
||||||
|
<Input
|
||||||
|
id="starredReposOrg"
|
||||||
|
value={starredReposOrg || ""}
|
||||||
|
onChange={(e) => onStarredReposOrgChange(e.target.value)}
|
||||||
|
placeholder="starred"
|
||||||
|
className=""
|
||||||
|
/>
|
||||||
|
<p className="text-xs text-muted-foreground mt-1">
|
||||||
|
Keep starred repos organized separately from your own repositories
|
||||||
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</Card>
|
|
||||||
|
<div className="space-y-2">
|
||||||
|
<Label className="text-sm font-normal flex items-center gap-2">
|
||||||
|
Organization Visibility
|
||||||
|
<TooltipProvider>
|
||||||
|
<Tooltip>
|
||||||
|
<TooltipTrigger>
|
||||||
|
<Info className="h-3.5 w-3.5 text-muted-foreground" />
|
||||||
|
</TooltipTrigger>
|
||||||
|
<TooltipContent>
|
||||||
|
<p>Visibility for newly created organizations</p>
|
||||||
|
</TooltipContent>
|
||||||
|
</Tooltip>
|
||||||
|
</TooltipProvider>
|
||||||
|
</Label>
|
||||||
|
<div className="flex gap-2">
|
||||||
|
{visibilityOptions.map((option) => {
|
||||||
|
const Icon = option.icon;
|
||||||
|
const isSelected = visibility === option.value;
|
||||||
|
return (
|
||||||
|
<button
|
||||||
|
key={option.value}
|
||||||
|
type="button"
|
||||||
|
onClick={() => onVisibilityChange(option.value)}
|
||||||
|
className={cn(
|
||||||
|
"flex items-center gap-1.5 px-3 py-1.5 rounded-md text-sm transition-all",
|
||||||
|
"border",
|
||||||
|
isSelected
|
||||||
|
? "bg-accent border-accent-foreground/20"
|
||||||
|
: "bg-background hover:bg-accent/50 border-input"
|
||||||
|
)}
|
||||||
|
>
|
||||||
|
<Icon className="h-3.5 w-3.5" />
|
||||||
|
<span>{option.label}</span>
|
||||||
|
</button>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<Separator className="my-4" />
|
||||||
|
|
||||||
<StrategyVisualizer
|
<StrategyVisualizer
|
||||||
strategy={strategy}
|
strategy={strategy}
|
||||||
|
|||||||
@@ -416,7 +416,7 @@ export async function getOrCreateGiteaOrg({
|
|||||||
username: orgName,
|
username: orgName,
|
||||||
full_name: `${orgName} Org`,
|
full_name: `${orgName} Org`,
|
||||||
description: `Mirrored organization from GitHub ${orgName}`,
|
description: `Mirrored organization from GitHub ${orgName}`,
|
||||||
visibility: "public",
|
visibility: config.giteaConfig?.visibility || "public",
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user