95 lines
2.9 KiB
Go
95 lines
2.9 KiB
Go
|
// Copyright 2015 The Go Authors. All rights reserved.
|
||
|
// Use of this source code is governed by a BSD-style
|
||
|
// licence that can be found in the LICENSE file.
|
||
|
|
||
|
// The gomvpkg command moves go packages, updating import declarations.
|
||
|
// See the -help message or Usage constant for details.
|
||
|
package main
|
||
|
|
||
|
import (
|
||
|
"flag"
|
||
|
"fmt"
|
||
|
"go/build"
|
||
|
"os"
|
||
|
|
||
|
"golang.org/x/tools/go/buildutil"
|
||
|
"golang.org/x/tools/refactor/rename"
|
||
|
)
|
||
|
|
||
|
var (
|
||
|
fromFlag = flag.String("from", "", "Import path of package to be moved")
|
||
|
toFlag = flag.String("to", "", "Destination import path for package")
|
||
|
vcsMvCmdFlag = flag.String("vcs_mv_cmd", "", `A template for the version control system's "move directory" command, e.g. "git mv {{.Src}} {{.Dst}}`)
|
||
|
helpFlag = flag.Bool("help", false, "show usage message")
|
||
|
)
|
||
|
|
||
|
func init() {
|
||
|
flag.Var((*buildutil.TagsFlag)(&build.Default.BuildTags), "tags", buildutil.TagsFlagDoc)
|
||
|
}
|
||
|
|
||
|
const Usage = `gomvpkg: moves a package, updating import declarations
|
||
|
|
||
|
Usage:
|
||
|
|
||
|
gomvpkg -from <path> -to <path> [-vcs_mv_cmd <template>]
|
||
|
|
||
|
Flags:
|
||
|
|
||
|
-from specifies the import path of the package to be moved
|
||
|
|
||
|
-to specifies the destination import path
|
||
|
|
||
|
-vcs_mv_cmd specifies a shell command to inform the version control system of a
|
||
|
directory move. The argument is a template using the syntax of the
|
||
|
text/template package. It has two fields: Src and Dst, the absolute
|
||
|
paths of the directories.
|
||
|
|
||
|
For example: "git mv {{.Src}} {{.Dst}}"
|
||
|
|
||
|
gomvpkg determines the set of packages that might be affected, including all
|
||
|
packages importing the 'from' package and any of its subpackages. It will move
|
||
|
the 'from' package and all its subpackages to the destination path and update all
|
||
|
imports of those packages to point to its new import path.
|
||
|
|
||
|
gomvpkg rejects moves in which a package already exists at the destination import
|
||
|
path, or in which a directory already exists at the location the package would be
|
||
|
moved to.
|
||
|
|
||
|
gomvpkg will not always be able to rename imports when a package's name is changed.
|
||
|
Import statements may want further cleanup.
|
||
|
|
||
|
gomvpkg's behavior is not defined if any of the packages to be moved are
|
||
|
imported using dot imports.
|
||
|
|
||
|
Examples:
|
||
|
|
||
|
% gomvpkg -from myproject/foo -to myproject/bar
|
||
|
|
||
|
Move the package with import path "myproject/foo" to the new path
|
||
|
"myproject/bar".
|
||
|
|
||
|
% gomvpkg -from myproject/foo -to myproject/bar -vcs_mv_cmd "git mv {{.Src}} {{.Dst}}"
|
||
|
|
||
|
Move the package with import path "myproject/foo" to the new path
|
||
|
"myproject/bar" using "git mv" to execute the directory move.
|
||
|
`
|
||
|
|
||
|
func main() {
|
||
|
flag.Parse()
|
||
|
|
||
|
if len(flag.Args()) > 0 {
|
||
|
fmt.Fprintln(os.Stderr, "gomvpkg: surplus arguments.")
|
||
|
os.Exit(1)
|
||
|
}
|
||
|
|
||
|
if *helpFlag || *fromFlag == "" || *toFlag == "" {
|
||
|
fmt.Println(Usage)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
if err := rename.Move(&build.Default, *fromFlag, *toFlag, *vcsMvCmdFlag); err != nil {
|
||
|
fmt.Fprintf(os.Stderr, "gomvpkg: %s.\n", err)
|
||
|
os.Exit(1)
|
||
|
}
|
||
|
}
|