aboutsummaryrefslogtreecommitdiff
path: root/cmd/import.go
blob: 482361b6b472e44ea79416c5e624343763e45d6c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
// Copyright 2016 The Gogs Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.

package cmd

import (
	"fmt"
	"os"
	"path/filepath"
	"time"

	"github.com/Unknwon/com"
	"github.com/urfave/cli"

	"github.com/gogits/gogs/modules/setting"
)

var (
	CmdImport = cli.Command{
		Name:  "import",
		Usage: "Import portable data as local Gogs data",
		Description: `Allow user import data from other Gogs installations to local instance
without manually hacking the data files`,
		Subcommands: []cli.Command{
			subcmdImportLocale,
		},
	}

	subcmdImportLocale = cli.Command{
		Name:   "locale",
		Usage:  "Import locale files to local repository",
		Action: runImportLocale,
		Flags: []cli.Flag{
			stringFlag("source", "", "Source directory that stores new locale files"),
			stringFlag("target", "", "Target directory that stores old locale files"),
			stringFlag("config, c", "custom/conf/app.ini", "Custom configuration file path"),
		},
	}
)

func runImportLocale(c *cli.Context) error {
	if !c.IsSet("source") {
		return fmt.Errorf("Source directory is not specified")
	} else if !c.IsSet("target") {
		return fmt.Errorf("Target directory is not specified")
	}
	if !com.IsDir(c.String("source")) {
		return fmt.Errorf("Source directory does not exist or is not a directory")
	} else if !com.IsDir(c.String("target")) {
		return fmt.Errorf("Target directory does not exist or is not a directory")
	}

	if c.IsSet("config") {
		setting.CustomConf = c.String("config")
	}

	setting.NewContext()

	now := time.Now()

	// Cut out en-US.
	for _, lang := range setting.Langs[1:] {
		name := fmt.Sprintf("locale_%s.ini", lang)
		source := filepath.Join(c.String("source"), name)
		target := filepath.Join(c.String("target"), name)
		if !com.IsFile(source) {
			continue
		}

		if err := com.Copy(source, target); err != nil {
			return fmt.Errorf("Copy file: %v", err)
		}

		// Modification time of files from Crowdin often ahead of current,
		// so we need to set back to current.
		os.Chtimes(target, now, now)
	}

	fmt.Println("Locale files has been successfully imported!")
	return nil
}