2021-08-24 19:47:09 +03:00
//go:build ignore
2017-03-15 15:30:00 +03:00
package main
import (
"archive/tar"
"compress/gzip"
"flag"
"fmt"
"io"
"log"
"net/http"
"os"
"path"
"path/filepath"
"strings"
2020-08-11 23:05:34 +03:00
"code.gitea.io/gitea/modules/util"
2017-03-15 15:30:00 +03:00
)
2017-03-15 18:11:26 +03:00
func main ( ) {
var (
2020-09-04 17:02:37 +03:00
prefix = "gitea-gitignore"
url = "https://api.github.com/repos/github/gitignore/tarball"
githubApiToken = ""
githubUsername = ""
destination = ""
2017-03-15 18:11:26 +03:00
)
2017-03-15 15:30:00 +03:00
flag . StringVar ( & destination , "dest" , "options/gitignore/" , "destination for the gitignores" )
2020-09-04 17:02:37 +03:00
flag . StringVar ( & githubUsername , "username" , "" , "github username" )
flag . StringVar ( & githubApiToken , "token" , "" , "github api token" )
2017-03-15 15:30:00 +03:00
flag . Parse ( )
2021-09-22 08:38:34 +03:00
file , err := os . CreateTemp ( os . TempDir ( ) , prefix )
2017-03-15 15:30:00 +03:00
if err != nil {
log . Fatalf ( "Failed to create temp file. %s" , err )
}
2020-08-11 23:05:34 +03:00
defer util . Remove ( file . Name ( ) )
2017-03-15 15:30:00 +03:00
2020-09-04 17:02:37 +03:00
req , err := http . NewRequest ( "GET" , url , nil )
2017-03-15 15:30:00 +03:00
if err != nil {
log . Fatalf ( "Failed to download archive. %s" , err )
}
2020-09-04 17:02:37 +03:00
if len ( githubApiToken ) > 0 && len ( githubUsername ) > 0 {
req . SetBasicAuth ( githubUsername , githubApiToken )
}
resp , err := http . DefaultClient . Do ( req )
if err != nil {
log . Fatalf ( "Failed to download archive. %s" , err )
}
2017-03-15 15:30:00 +03:00
defer resp . Body . Close ( )
if _ , err := io . Copy ( file , resp . Body ) ; err != nil {
log . Fatalf ( "Failed to copy archive to file. %s" , err )
}
if _ , err := file . Seek ( 0 , 0 ) ; err != nil {
log . Fatalf ( "Failed to reset seek on archive. %s" , err )
}
gz , err := gzip . NewReader ( file )
if err != nil {
log . Fatalf ( "Failed to gunzip the archive. %s" , err )
}
tr := tar . NewReader ( gz )
2018-11-04 01:06:09 +03:00
filesToCopy := make ( map [ string ] string , 0 )
2017-03-15 15:30:00 +03:00
for {
hdr , err := tr . Next ( )
if err == io . EOF {
break
}
if err != nil {
log . Fatalf ( "Failed to iterate archive. %s" , err )
}
if filepath . Ext ( hdr . Name ) != ".gitignore" {
continue
}
2018-11-04 01:06:09 +03:00
if hdr . Typeflag == tar . TypeSymlink {
fmt . Printf ( "Found symlink %s -> %s\n" , hdr . Name , hdr . Linkname )
filesToCopy [ strings . TrimSuffix ( filepath . Base ( hdr . Name ) , ".gitignore" ) ] = strings . TrimSuffix ( filepath . Base ( hdr . Linkname ) , ".gitignore" )
continue
}
2017-03-15 15:30:00 +03:00
out , err := os . Create ( path . Join ( destination , strings . TrimSuffix ( filepath . Base ( hdr . Name ) , ".gitignore" ) ) )
if err != nil {
log . Fatalf ( "Failed to create new file. %s" , err )
}
defer out . Close ( )
if _ , err := io . Copy ( out , tr ) ; err != nil {
log . Fatalf ( "Failed to write new file. %s" , err )
} else {
fmt . Printf ( "Written %s\n" , out . Name ( ) )
}
}
2018-11-04 01:06:09 +03:00
for dst , src := range filesToCopy {
// Read all content of src to data
src = path . Join ( destination , src )
2021-09-22 08:38:34 +03:00
data , err := os . ReadFile ( src )
2018-11-04 01:06:09 +03:00
if err != nil {
log . Fatalf ( "Failed to read src file. %s" , err )
}
// Write data to dst
dst = path . Join ( destination , dst )
2022-01-20 20:46:10 +03:00
err = os . WriteFile ( dst , data , 0 o644 )
2018-11-04 01:06:09 +03:00
if err != nil {
log . Fatalf ( "Failed to write new file. %s" , err )
}
fmt . Printf ( "Written (copy of %s) %s\n" , src , dst )
}
2017-03-15 15:30:00 +03:00
fmt . Println ( "Done" )
}