6297 merge utility should merge entire contents of repos if no arguments are given in106
authorBart Smaalders <Bart.Smaalders@Sun.COM>
Fri, 30 Jan 2009 20:04:41 -0800
changeset 848 048096a95369
parent 847 0c33ffc28a89
child 849 5fd94ce78823
6297 merge utility should merge entire contents of repos if no arguments are given
src/util/publish/Makefile
src/util/publish/merge.py
--- a/src/util/publish/Makefile	Thu Jan 29 14:56:11 2009 -0800
+++ b/src/util/publish/Makefile	Fri Jan 30 20:04:41 2009 -0800
@@ -29,7 +29,7 @@
 SPARC_REPO=http://localhost:10001
 i386_REPO=http://localhost:10002
 EXTRA_ARGS=
-TARGET=entire
+JUST_THESE_PKGS=
 
 $(MERGEDIR):
 	mkdir -p $(MERGEDIR)
@@ -41,7 +41,7 @@
 # and followed by a single publish 
 
 merge:
-	PYTHONPATH=$(PYTHONPATH) ./merge.py $(EXTRA_ARGS) -r -d $(MERGEDIR) -v sparc,$(SPARC_REPO) -v i386,$(i386_REPO) arch $(TARGET)
+	PYTHONPATH=$(PYTHONPATH) ./merge.py $(EXTRA_ARGS) -r -d $(MERGEDIR) -v sparc,$(SPARC_REPO) -v i386,$(i386_REPO) arch $(JUST_THESE_PKGS)
 
 publish: $(MERGEDIR) 
 	for var in `(cd $(MERGEDIR); echo * )` ;\
--- a/src/util/publish/merge.py	Thu Jan 29 14:56:11 2009 -0800
+++ b/src/util/publish/merge.py	Fri Jan 30 20:04:41 2009 -0800
@@ -191,21 +191,23 @@
         return cat, dl_dir
 
 catalog_dict = {}
+def load_catalog(server_url):
+        c = get_catalog(server_url)
+        d = {}
+        for f in c.fmris():
+                if f.pkg_name in d:
+                        d[f.pkg_name].append(f)
+                else:
+                        d[f.pkg_name] = [f]
+                for k in d.keys():
+                        d[k].sort(reverse = True)
+                catalog_dict[server_url] = d        
 
 def expand_fmri(server_url, fmri_string, constraint=version.CONSTRAINT_AUTO):
         """ from specified server, find matching fmri using CONSTRAINT_AUTO
         cache for performance.  Returns None if no matching fmri is found """
         if server_url not in catalog_dict:
-                c = get_catalog(server_url)
-                d = {}
-                for f in c.fmris():
-                        if f.pkg_name in d:
-                                d[f.pkg_name].append(f)
-                        else:
-                                d[f.pkg_name] = [f]
-                for k in d.keys():
-                        d[k].sort(reverse = True)
-                catalog_dict[server_url] = d
+                load_catalog(server_url)
 
         fmri = pkg.fmri.PkgFmri(fmri_string, "5.11")        
 
@@ -214,6 +216,12 @@
                         return f
         return None
 
+def get_all_pkg_names(server_url):
+        """ return all the pkg_names in this catalog """
+        if server_url not in catalog_dict:
+                load_catalog(server_url)
+        return catalog_dict[server_url].keys()
+
 def get_dependencies(server_url, fmri_list):
         s = set()
         for f in fmri_list:
@@ -268,7 +276,21 @@
         if not basedir:
                 basedir = os.getcwd()
 
-        fmri_arguments = pargs[1:]
+        server_list = [
+                v.split(",", 1)[1]
+                for v in varlist
+                ]                
+        
+        if len(pargs) == 1:
+                recursive = False
+                overall_set = set()
+                for s in server_list:
+                        for name in get_all_pkg_names(s):
+                                overall_set.add(name)
+                fmri_arguments = list(overall_set)
+
+        else:
+                fmri_arguments = pargs[1:]
 
         variant = "variant.%s" % pargs[0]
 
@@ -277,11 +299,6 @@
                 for v in varlist
                 ]
 
-        server_list = [
-                v.split(",", 1)[1]
-                for v in varlist
-                ]                
-
         fmri_expansions = []
 
         if recursive:
@@ -392,18 +409,27 @@
 
                 
         if get_files:
-                # generate list of hashes for each server; last is common
+                # generate list of hashes for each server; last is commom
+                already_seen = {}
+                def repeated(a, d):
+                        if a in d:
+                                return True
+                        d[a] = 1
+                        return False
+
                 hash_sets = [
                         set(
                                 [
                                  a.hash
                                  for a in action_list
-                                 if hasattr(a, "hash")
+                                 if hasattr(a, "hash") and not \
+                                 repeated(a.hash, already_seen)
                                 ]
                                 )
                         for action_list in action_lists
                         ]
-
+                # remove duplicate files (save time)
+                
                 for server, hash_set in zip(server_list + [server_list[0]], hash_sets):
                         if len(hash_set) > 0:
                                 fetch_files_byhash(server, hash_set, basedir)