Merge changes Ieaff757f,I5bdbba8d

* changes:
  pom2mk: Fix unlisted dependency types
  pom2mk: Add a flag to specify a specific version of artifacts
diff --git a/cmd/pom2mk/pom2mk.go b/cmd/pom2mk/pom2mk.go
index e6144a5..ac29a2a 100644
--- a/cmd/pom2mk/pom2mk.go
+++ b/cmd/pom2mk/pom2mk.go
@@ -18,7 +18,6 @@
 	"encoding/xml"
 	"flag"
 	"fmt"
-	"io"
 	"io/ioutil"
 	"os"
 	"path/filepath"
@@ -84,6 +83,8 @@
 
 var extraDeps = make(ExtraDeps)
 
+var useVersion string
+
 type Dependency struct {
 	XMLName xml.Name `xml:"dependency"`
 
@@ -98,6 +99,7 @@
 type Pom struct {
 	XMLName xml.Name `xml:"http://maven.apache.org/POM/4.0.0 project"`
 
+	PomFile      string `xml:"-"`
 	ArtifactFile string `xml:"-"`
 
 	GroupId    string `xml:"groupId"`
@@ -105,7 +107,7 @@
 	Version    string `xml:"version"`
 	Packaging  string `xml:"packaging"`
 
-	Dependencies []Dependency `xml:"dependencies>dependency"`
+	Dependencies []*Dependency `xml:"dependencies>dependency"`
 }
 
 func (p Pom) MkName() string {
@@ -125,6 +127,17 @@
 	return ret
 }
 
+func (p *Pom) FixDepTypes(modules map[string]*Pom) {
+	for _, d := range p.Dependencies {
+		if d.Type != "" {
+			continue
+		}
+		if depPom, ok := modules[d.ArtifactId]; ok {
+			d.Type = depPom.Packaging
+		}
+	}
+}
+
 var mkTemplate = template.Must(template.New("mk").Parse(`
 include $(CLEAR_VARS)
 LOCAL_MODULE := {{.MkName}}
@@ -140,25 +153,30 @@
 include $(BUILD_PREBUILT)
 `))
 
-func convert(filename string, out io.Writer) error {
+func parse(filename string) (*Pom, error) {
 	data, err := ioutil.ReadFile(filename)
 	if err != nil {
-		return err
+		return nil, err
 	}
 
 	var pom Pom
 	err = xml.Unmarshal(data, &pom)
 	if err != nil {
-		return err
+		return nil, err
+	}
+
+	if useVersion != "" && pom.Version != useVersion {
+		return nil, nil
 	}
 
 	if pom.Packaging == "" {
 		pom.Packaging = "jar"
 	}
 
+	pom.PomFile = filename
 	pom.ArtifactFile = strings.TrimSuffix(filename, ".pom") + "." + pom.Packaging
 
-	return mkTemplate.Execute(out, pom)
+	return &pom, nil
 }
 
 func main() {
@@ -178,6 +196,9 @@
      Some Android.mk modules have transitive dependencies that must be specified when they are
      depended upon (like android-support-v7-mediarouter requires android-support-v7-appcompat).
      This may be specified multiple times to declare these dependencies.
+  -use-version <version>
+     If the maven directory contains multiple versions of artifacts and their pom files,
+     -use-version can be used to only write makefiles for a specific version of those artifacts.
   <dir>
      The directory to search for *.pom files under.
 
@@ -187,6 +208,7 @@
 
 	flag.Var(&extraDeps, "extra-deps", "Extra dependencies needed when depending on a module")
 	flag.Var(&rewriteNames, "rewrite", "Regex(es) to rewrite artifact names")
+	flag.StringVar(&useVersion, "use-version", "", "Only read artifacts of a specific version")
 	flag.Parse()
 
 	if flag.NArg() != 1 {
@@ -240,14 +262,39 @@
 
 	sort.Strings(filenames)
 
+	poms := []*Pom{}
+	modules := make(map[string]*Pom)
+	for _, filename := range filenames {
+		pom, err := parse(filename)
+		if err != nil {
+			fmt.Fprintln(os.Stderr, "Error converting", filename, err)
+			os.Exit(1)
+		}
+
+		if pom != nil {
+			poms = append(poms, pom)
+
+			if old, ok := modules[pom.ArtifactId]; ok {
+				fmt.Fprintln(os.Stderr, "Module", pom.ArtifactId, "defined twice:", old.PomFile, pom.PomFile)
+				os.Exit(1)
+			}
+
+			modules[pom.ArtifactId] = pom
+		}
+	}
+
+	for _, pom := range poms {
+		pom.FixDepTypes(modules)
+	}
+
 	fmt.Println("# Automatically generated with:")
 	fmt.Println("# pom2mk", strings.Join(proptools.ShellEscape(os.Args[1:]), " "))
 	fmt.Println("LOCAL_PATH := $(call my-dir)")
 
-	for _, filename := range filenames {
-		err := convert(filename, os.Stdout)
+	for _, pom := range poms {
+		err := mkTemplate.Execute(os.Stdout, pom)
 		if err != nil {
-			fmt.Fprintln(os.Stderr, "Error converting", filename, err)
+			fmt.Fprintln(os.Stderr, "Error writing", pom.PomFile, pom.MkName(), err)
 			os.Exit(1)
 		}
 	}